From fc9b9ec42729bb668df97cb24ec040a46af04ca9 Mon Sep 17 00:00:00 2001 From: david Date: Thu, 20 Oct 2011 18:57:44 +0000 Subject: [PATCH] =?UTF-8?q?Importaci=C3=B3n=20inicial?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: https://192.168.0.254/svn/Proyectos.Afetec_Web/trunk@1 828b2857-b6d9-ce4d-95e2-bbc4707c23a3 --- db/afetec.sql | 509 + .../WordPress/wordpress-3.2.1-es_ES.zip | Bin 0 -> 4346064 bytes src/index.php | 18 + src/licencia.txt | 322 + src/license.txt | 281 + src/wp-activate.php | 102 + src/wp-admin/admin-ajax.php | 1555 ++ src/wp-admin/admin-footer.php | 51 + src/wp-admin/admin-functions.php | 16 + src/wp-admin/admin-header.php | 219 + src/wp-admin/admin-post.php | 33 + src/wp-admin/admin.php | 238 + src/wp-admin/async-upload.php | 70 + src/wp-admin/comment.php | 289 + src/wp-admin/credits.php | 176 + src/wp-admin/css/colors-classic-rtl.css | 1 + src/wp-admin/css/colors-classic-rtl.dev.css | 98 + src/wp-admin/css/colors-classic.css | 1 + src/wp-admin/css/colors-classic.dev.css | 2087 +++ src/wp-admin/css/colors-fresh-rtl.css | 1 + src/wp-admin/css/colors-fresh-rtl.dev.css | 98 + src/wp-admin/css/colors-fresh.css | 1 + src/wp-admin/css/colors-fresh.dev.css | 2091 +++ src/wp-admin/css/dashboard-rtl.css | 1 + src/wp-admin/css/dashboard-rtl.dev.css | 110 + src/wp-admin/css/dashboard.css | 1 + src/wp-admin/css/dashboard.dev.css | 486 + src/wp-admin/css/farbtastic-rtl.css | 7 + src/wp-admin/css/farbtastic.css | 32 + src/wp-admin/css/global-rtl.css | 1 + src/wp-admin/css/global-rtl.dev.css | 181 + src/wp-admin/css/global.css | 1 + src/wp-admin/css/global.dev.css | 607 + src/wp-admin/css/ie-rtl.css | 1 + src/wp-admin/css/ie-rtl.dev.css | 156 + src/wp-admin/css/ie.css | 1 + src/wp-admin/css/ie.dev.css | 494 + src/wp-admin/css/install-rtl.css | 1 + src/wp-admin/css/install-rtl.dev.css | 23 + src/wp-admin/css/install.css | 1 + src/wp-admin/css/install.dev.css | 213 + src/wp-admin/css/login-rtl.css | 1 + src/wp-admin/css/login-rtl.dev.css | 29 + src/wp-admin/css/login.css | 1 + src/wp-admin/css/login.dev.css | 144 + src/wp-admin/css/media-rtl.css | 1 + src/wp-admin/css/media-rtl.dev.css | 92 + src/wp-admin/css/media.css | 1 + src/wp-admin/css/media.dev.css | 382 + src/wp-admin/css/ms.css | 1 + src/wp-admin/css/ms.dev.css | 38 + src/wp-admin/css/nav-menu-rtl.css | 1 + src/wp-admin/css/nav-menu-rtl.dev.css | 210 + src/wp-admin/css/nav-menu.css | 1 + src/wp-admin/css/nav-menu.dev.css | 705 + src/wp-admin/css/plugin-install-rtl.css | 1 + src/wp-admin/css/plugin-install-rtl.dev.css | 43 + src/wp-admin/css/plugin-install.css | 1 + src/wp-admin/css/plugin-install.dev.css | 150 + src/wp-admin/css/press-this-rtl.css | 1 + src/wp-admin/css/press-this-rtl.dev.css | 140 + src/wp-admin/css/press-this.css | 1 + src/wp-admin/css/press-this.dev.css | 678 + src/wp-admin/css/theme-editor-rtl.css | 1 + src/wp-admin/css/theme-editor-rtl.dev.css | 3 + src/wp-admin/css/theme-editor.css | 1 + src/wp-admin/css/theme-editor.dev.css | 82 + src/wp-admin/css/theme-install-rtl.css | 1 + src/wp-admin/css/theme-install-rtl.dev.css | 41 + src/wp-admin/css/theme-install.css | 1 + src/wp-admin/css/theme-install.dev.css | 155 + src/wp-admin/css/widgets-rtl.css | 1 + src/wp-admin/css/widgets-rtl.dev.css | 47 + src/wp-admin/css/widgets.css | 1 + src/wp-admin/css/widgets.dev.css | 382 + src/wp-admin/css/wp-admin-rtl.css | 1 + src/wp-admin/css/wp-admin-rtl.dev.css | 1336 ++ src/wp-admin/css/wp-admin.css | 1 + src/wp-admin/css/wp-admin.dev.css | 4709 +++++ src/wp-admin/custom-background.php | 361 + src/wp-admin/custom-header.php | 791 + src/wp-admin/edit-comments.php | 242 + src/wp-admin/edit-form-advanced.php | 315 + src/wp-admin/edit-form-comment.php | 147 + src/wp-admin/edit-link-form.php | 129 + src/wp-admin/edit-tag-form.php | 93 + src/wp-admin/edit-tags.php | 394 + src/wp-admin/edit.php | 263 + src/wp-admin/export.php | 206 + src/wp-admin/freedoms.php | 42 + src/wp-admin/gears-manifest.php | 51 + src/wp-admin/images/align-center.png | Bin 0 -> 571 bytes src/wp-admin/images/align-left.png | Bin 0 -> 587 bytes src/wp-admin/images/align-none.png | Bin 0 -> 453 bytes src/wp-admin/images/align-right.png | Bin 0 -> 556 bytes src/wp-admin/images/archive-link.png | Bin 0 -> 133 bytes src/wp-admin/images/arrows-dark-vs.png | Bin 0 -> 1376 bytes src/wp-admin/images/arrows-dark.png | Bin 0 -> 495 bytes src/wp-admin/images/arrows-vs.png | Bin 0 -> 1378 bytes src/wp-admin/images/arrows.png | Bin 0 -> 494 bytes src/wp-admin/images/blue-grad.png | Bin 0 -> 337 bytes src/wp-admin/images/bubble_bg-rtl.gif | Bin 0 -> 400 bytes src/wp-admin/images/bubble_bg.gif | Bin 0 -> 395 bytes src/wp-admin/images/button-grad-active.png | Bin 0 -> 284 bytes src/wp-admin/images/button-grad.png | Bin 0 -> 243 bytes src/wp-admin/images/comment-grey-bubble.png | Bin 0 -> 158 bytes src/wp-admin/images/date-button.gif | Bin 0 -> 111 bytes src/wp-admin/images/ed-bg-vs.gif | Bin 0 -> 444 bytes src/wp-admin/images/ed-bg.gif | Bin 0 -> 190 bytes src/wp-admin/images/fade-butt.png | Bin 0 -> 785 bytes src/wp-admin/images/fav-arrow-rtl.gif | Bin 0 -> 243 bytes src/wp-admin/images/fav-arrow.gif | Bin 0 -> 241 bytes src/wp-admin/images/fav-vs.png | Bin 0 -> 142 bytes src/wp-admin/images/fav.png | Bin 0 -> 214 bytes src/wp-admin/images/generic.png | Bin 0 -> 3580 bytes src/wp-admin/images/gray-grad.png | Bin 0 -> 213 bytes src/wp-admin/images/gray-star.png | Bin 0 -> 625 bytes src/wp-admin/images/icons32-vs.png | Bin 0 -> 14927 bytes src/wp-admin/images/icons32.png | Bin 0 -> 14649 bytes src/wp-admin/images/imgedit-icons.png | Bin 0 -> 9607 bytes src/wp-admin/images/list.png | Bin 0 -> 1104 bytes src/wp-admin/images/loading-publish.gif | Bin 0 -> 1849 bytes src/wp-admin/images/loading.gif | Bin 0 -> 2530 bytes src/wp-admin/images/logo-ghost.png | Bin 0 -> 559 bytes src/wp-admin/images/logo-login.png | Bin 0 -> 8891 bytes src/wp-admin/images/logo.gif | Bin 0 -> 1289 bytes src/wp-admin/images/marker.png | Bin 0 -> 652 bytes src/wp-admin/images/mask.png | Bin 0 -> 2020 bytes src/wp-admin/images/media-button-image.gif | Bin 0 -> 206 bytes src/wp-admin/images/media-button-music.gif | Bin 0 -> 205 bytes src/wp-admin/images/media-button-other.gif | Bin 0 -> 245 bytes src/wp-admin/images/media-button-video.gif | Bin 0 -> 139 bytes src/wp-admin/images/menu-arrow-frame-rtl.png | Bin 0 -> 1391 bytes src/wp-admin/images/menu-arrow-frame.png | Bin 0 -> 564 bytes src/wp-admin/images/menu-arrows.gif | Bin 0 -> 330 bytes src/wp-admin/images/menu-bits-rtl-vs.gif | Bin 0 -> 1555 bytes src/wp-admin/images/menu-bits-rtl.gif | Bin 0 -> 1267 bytes src/wp-admin/images/menu-bits-vs.gif | Bin 0 -> 1448 bytes src/wp-admin/images/menu-bits.gif | Bin 0 -> 1139 bytes src/wp-admin/images/menu-dark-rtl-vs.gif | Bin 0 -> 245 bytes src/wp-admin/images/menu-dark-rtl.gif | Bin 0 -> 950 bytes src/wp-admin/images/menu-dark-vs.gif | Bin 0 -> 245 bytes src/wp-admin/images/menu-dark.gif | Bin 0 -> 245 bytes src/wp-admin/images/menu-shadow-rtl.png | Bin 0 -> 891 bytes src/wp-admin/images/menu-shadow.png | Bin 0 -> 131 bytes src/wp-admin/images/menu-vs.png | Bin 0 -> 12231 bytes src/wp-admin/images/menu.png | Bin 0 -> 12527 bytes src/wp-admin/images/no.png | Bin 0 -> 792 bytes src/wp-admin/images/press-this.png | Bin 0 -> 818 bytes src/wp-admin/images/required.gif | Bin 0 -> 62 bytes src/wp-admin/images/resize-rtl.gif | Bin 0 -> 1418 bytes src/wp-admin/images/resize.gif | Bin 0 -> 71 bytes .../images/screen-options-toggle-vs.gif | Bin 0 -> 152 bytes src/wp-admin/images/screen-options-toggle.gif | Bin 0 -> 205 bytes src/wp-admin/images/se.png | Bin 0 -> 127 bytes src/wp-admin/images/sort.gif | Bin 0 -> 54 bytes src/wp-admin/images/star.png | Bin 0 -> 611 bytes src/wp-admin/images/toggle-arrow-rtl.gif | Bin 0 -> 72 bytes src/wp-admin/images/toggle-arrow.gif | Bin 0 -> 71 bytes src/wp-admin/images/upload-classic.png | Bin 0 -> 1631 bytes src/wp-admin/images/upload-fresh.png | Bin 0 -> 1051 bytes src/wp-admin/images/wheel.png | Bin 0 -> 11733 bytes src/wp-admin/images/white-grad-active.png | Bin 0 -> 223 bytes src/wp-admin/images/white-grad.png | Bin 0 -> 210 bytes src/wp-admin/images/widgets-arrow-vs.gif | Bin 0 -> 213 bytes src/wp-admin/images/widgets-arrow.gif | Bin 0 -> 334 bytes src/wp-admin/images/wordpress-logo.png | Bin 0 -> 2334 bytes src/wp-admin/images/wp-logo-vs.png | Bin 0 -> 958 bytes src/wp-admin/images/wp-logo.png | Bin 0 -> 849 bytes src/wp-admin/images/wpspin_dark.gif | Bin 0 -> 2547 bytes src/wp-admin/images/wpspin_light.gif | Bin 0 -> 2193 bytes src/wp-admin/images/xit.gif | Bin 0 -> 181 bytes src/wp-admin/images/yes.png | Bin 0 -> 612 bytes src/wp-admin/import.php | 147 + src/wp-admin/includes/admin.php | 64 + src/wp-admin/includes/bookmark.php | 269 + src/wp-admin/includes/class-ftp-pure.php | 190 + src/wp-admin/includes/class-ftp-sockets.php | 250 + src/wp-admin/includes/class-ftp.php | 906 + src/wp-admin/includes/class-pclzip.php | 5687 ++++++ .../includes/class-wp-comments-list-table.php | 559 + .../includes/class-wp-filesystem-base.php | 332 + .../includes/class-wp-filesystem-direct.php | 364 + .../includes/class-wp-filesystem-ftpext.php | 387 + .../class-wp-filesystem-ftpsockets.php | 327 + .../includes/class-wp-filesystem-ssh2.php | 383 + src/wp-admin/includes/class-wp-importer.php | 307 + .../includes/class-wp-links-list-table.php | 186 + src/wp-admin/includes/class-wp-list-table.php | 908 + .../includes/class-wp-media-list-table.php | 374 + .../includes/class-wp-ms-sites-list-table.php | 340 + .../class-wp-ms-themes-list-table.php | 361 + .../includes/class-wp-ms-users-list-table.php | 277 + .../class-wp-plugin-install-list-table.php | 244 + .../includes/class-wp-plugins-list-table.php | 458 + .../includes/class-wp-posts-list-table.php | 1021 ++ .../includes/class-wp-terms-list-table.php | 380 + .../class-wp-theme-install-list-table.php | 185 + .../includes/class-wp-themes-list-table.php | 240 + src/wp-admin/includes/class-wp-upgrader.php | 1457 ++ .../includes/class-wp-users-list-table.php | 320 + src/wp-admin/includes/comment.php | 159 + src/wp-admin/includes/continents-cities.php | 493 + src/wp-admin/includes/dashboard.php | 1262 ++ src/wp-admin/includes/deprecated.php | 703 + src/wp-admin/includes/export.php | 425 + src/wp-admin/includes/file.php | 1059 ++ src/wp-admin/includes/image-edit.php | 668 + src/wp-admin/includes/image.php | 341 + src/wp-admin/includes/import.php | 97 + src/wp-admin/includes/internal-linking.php | 124 + src/wp-admin/includes/list-table.php | 104 + src/wp-admin/includes/manifest.php | 203 + src/wp-admin/includes/media.php | 2350 +++ src/wp-admin/includes/menu.php | 230 + src/wp-admin/includes/meta-boxes.php | 914 + src/wp-admin/includes/misc.php | 588 + src/wp-admin/includes/ms-deprecated.php | 68 + src/wp-admin/includes/ms.php | 778 + src/wp-admin/includes/nav-menu.php | 1171 ++ src/wp-admin/includes/plugin-install.php | 369 + src/wp-admin/includes/plugin.php | 1726 ++ src/wp-admin/includes/post.php | 1864 ++ src/wp-admin/includes/schema.php | 783 + src/wp-admin/includes/taxonomy.php | 252 + src/wp-admin/includes/template.php | 2228 +++ src/wp-admin/includes/theme-install.php | 323 + src/wp-admin/includes/theme.php | 413 + src/wp-admin/includes/update-core.php | 522 + src/wp-admin/includes/update.php | 313 + src/wp-admin/includes/upgrade.php | 2001 +++ src/wp-admin/includes/user.php | 383 + src/wp-admin/includes/widgets.php | 225 + src/wp-admin/index-extra.php | 40 + src/wp-admin/index.php | 70 + src/wp-admin/install-helper.php | 217 + src/wp-admin/install.php | 264 + src/wp-admin/js/cat.dev.js | 5 + src/wp-admin/js/cat.js | 1 + src/wp-admin/js/categories.dev.js | 34 + src/wp-admin/js/categories.js | 1 + src/wp-admin/js/comment.dev.js | 47 + src/wp-admin/js/comment.js | 1 + src/wp-admin/js/common.dev.js | 370 + src/wp-admin/js/common.js | 1 + src/wp-admin/js/custom-background.dev.js | 55 + src/wp-admin/js/custom-background.js | 1 + src/wp-admin/js/custom-fields.dev.js | 34 + src/wp-admin/js/custom-fields.js | 1 + src/wp-admin/js/dashboard.dev.js | 67 + src/wp-admin/js/dashboard.js | 1 + src/wp-admin/js/edit-comments.dev.js | 596 + src/wp-admin/js/edit-comments.js | 1 + src/wp-admin/js/editor.dev.js | 207 + src/wp-admin/js/editor.js | 1 + src/wp-admin/js/farbtastic.js | 276 + src/wp-admin/js/gallery.dev.js | 197 + src/wp-admin/js/gallery.js | 1 + src/wp-admin/js/image-edit.dev.js | 569 + src/wp-admin/js/image-edit.js | 1 + src/wp-admin/js/inline-edit-post.dev.js | 290 + src/wp-admin/js/inline-edit-post.js | 1 + src/wp-admin/js/inline-edit-tax.dev.js | 118 + src/wp-admin/js/inline-edit-tax.js | 1 + src/wp-admin/js/link.dev.js | 67 + src/wp-admin/js/link.js | 1 + src/wp-admin/js/media-upload.dev.js | 72 + src/wp-admin/js/media-upload.js | 1 + src/wp-admin/js/media.dev.js | 97 + src/wp-admin/js/media.js | 1 + src/wp-admin/js/nav-menu.dev.js | 959 + src/wp-admin/js/nav-menu.js | 1 + .../js/password-strength-meter.dev.js | 36 + src/wp-admin/js/password-strength-meter.js | 1 + src/wp-admin/js/plugin-install.dev.js | 53 + src/wp-admin/js/plugin-install.js | 1 + src/wp-admin/js/post.dev.js | 646 + src/wp-admin/js/post.js | 1 + src/wp-admin/js/postbox.dev.js | 153 + src/wp-admin/js/postbox.js | 1 + src/wp-admin/js/revisions-js.php | 39 + src/wp-admin/js/set-post-thumbnail.dev.js | 21 + src/wp-admin/js/set-post-thumbnail.js | 1 + src/wp-admin/js/tags.dev.js | 68 + src/wp-admin/js/tags.js | 1 + src/wp-admin/js/theme-preview.dev.js | 64 + src/wp-admin/js/theme-preview.js | 1 + src/wp-admin/js/theme.dev.js | 55 + src/wp-admin/js/theme.js | 1 + src/wp-admin/js/user-profile.dev.js | 67 + src/wp-admin/js/user-profile.js | 1 + src/wp-admin/js/utils.dev.js | 144 + src/wp-admin/js/utils.js | 1 + src/wp-admin/js/widgets.dev.js | 282 + src/wp-admin/js/widgets.js | 1 + src/wp-admin/js/word-count.dev.js | 37 + src/wp-admin/js/word-count.js | 1 + src/wp-admin/js/wp-fullscreen.dev.js | 694 + src/wp-admin/js/wp-fullscreen.js | 1 + src/wp-admin/js/xfn.dev.js | 16 + src/wp-admin/js/xfn.js | 1 + src/wp-admin/link-add.php | 30 + src/wp-admin/link-manager.php | 89 + src/wp-admin/link-parse-opml.php | 97 + src/wp-admin/link.php | 118 + src/wp-admin/load-scripts.php | 147 + src/wp-admin/load-styles.php | 147 + src/wp-admin/maint/repair.php | 92 + src/wp-admin/media-new.php | 14 + src/wp-admin/media-upload.php | 125 + src/wp-admin/media.php | 143 + src/wp-admin/menu-header.php | 191 + src/wp-admin/menu.php | 264 + src/wp-admin/moderation.php | 13 + src/wp-admin/ms-admin.php | 14 + src/wp-admin/ms-delete-site.php | 83 + src/wp-admin/ms-edit.php | 14 + src/wp-admin/ms-options.php | 12 + src/wp-admin/ms-sites.php | 15 + src/wp-admin/ms-themes.php | 14 + src/wp-admin/ms-upgrade-network.php | 15 + src/wp-admin/ms-users.php | 14 + src/wp-admin/my-sites.php | 110 + src/wp-admin/nav-menus.php | 611 + src/wp-admin/network.php | 548 + src/wp-admin/network/admin.php | 25 + src/wp-admin/network/edit.php | 482 + src/wp-admin/network/index-extra.php | 13 + src/wp-admin/network/index.php | 62 + src/wp-admin/network/menu.php | 86 + src/wp-admin/network/plugin-editor.php | 16 + src/wp-admin/network/plugin-install.php | 19 + src/wp-admin/network/plugins.php | 16 + src/wp-admin/network/profile.php | 16 + src/wp-admin/network/settings.php | 277 + src/wp-admin/network/setup.php | 16 + src/wp-admin/network/site-info.php | 169 + src/wp-admin/network/site-new.php | 145 + src/wp-admin/network/site-settings.php | 153 + src/wp-admin/network/site-themes.php | 182 + src/wp-admin/network/site-users.php | 311 + src/wp-admin/network/sites.php | 118 + src/wp-admin/network/theme-editor.php | 16 + src/wp-admin/network/theme-install.php | 19 + src/wp-admin/network/themes.php | 235 + src/wp-admin/network/update-core.php | 16 + src/wp-admin/network/update.php | 19 + src/wp-admin/network/upgrade.php | 86 + src/wp-admin/network/user-edit.php | 16 + src/wp-admin/network/user-new.php | 103 + src/wp-admin/network/users.php | 96 + src/wp-admin/options-discussion.php | 248 + src/wp-admin/options-general.php | 318 + src/wp-admin/options-head.php | 21 + src/wp-admin/options-media.php | 141 + src/wp-admin/options-permalink.php | 260 + src/wp-admin/options-privacy.php | 58 + src/wp-admin/options-reading.php | 131 + src/wp-admin/options-writing.php | 176 + src/wp-admin/options.php | 227 + src/wp-admin/plugin-editor.php | 264 + src/wp-admin/plugin-install.php | 62 + src/wp-admin/plugins.php | 407 + src/wp-admin/post-new.php | 43 + src/wp-admin/post.php | 279 + src/wp-admin/press-this.php | 652 + src/wp-admin/profile.php | 19 + src/wp-admin/revision.php | 223 + src/wp-admin/setup-config.php | 275 + src/wp-admin/theme-editor.php | 271 + src/wp-admin/theme-install.php | 71 + src/wp-admin/themes.php | 239 + src/wp-admin/tools.php | 63 + src/wp-admin/update-core.php | 505 + src/wp-admin/update.php | 250 + src/wp-admin/upgrade-functions.php | 13 + src/wp-admin/upgrade.php | 110 + src/wp-admin/upload.php | 222 + src/wp-admin/user-edit.php | 427 + src/wp-admin/user-new.php | 350 + src/wp-admin/user/admin.php | 27 + src/wp-admin/user/index-extra.php | 12 + src/wp-admin/user/index.php | 12 + src/wp-admin/user/menu.php | 24 + src/wp-admin/user/profile.php | 12 + src/wp-admin/user/user-edit.php | 12 + src/wp-admin/users.php | 388 + src/wp-admin/widgets.php | 413 + src/wp-app.php | 1611 ++ src/wp-atom.php | 12 + src/wp-blog-header.php | 20 + src/wp-comments-post.php | 105 + src/wp-commentsrss2.php | 12 + src/wp-config-sample.php | 89 + src/wp-config.php | 89 + src/wp-content/index.php | 3 + src/wp-content/languages/es_ES.mo | Bin 0 -> 404844 bytes src/wp-content/languages/es_ES.po | 14470 +++++++++++++++ src/wp-content/languages/ms-es_ES.mo | Bin 0 -> 82624 bytes src/wp-content/languages/ms-es_ES.po | 2262 +++ src/wp-content/plugins/akismet/admin.php | 750 + src/wp-content/plugins/akismet/akismet.css | 7 + src/wp-content/plugins/akismet/akismet.gif | Bin 0 -> 2777 bytes src/wp-content/plugins/akismet/akismet.js | 10 + src/wp-content/plugins/akismet/akismet.php | 512 + src/wp-content/plugins/akismet/legacy.php | 396 + src/wp-content/plugins/akismet/readme.txt | 130 + src/wp-content/plugins/akismet/widget.php | 90 + src/wp-content/plugins/hello.php | 82 + src/wp-content/plugins/index.php | 3 + src/wp-content/themes/index.php | 3 + src/wp-content/themes/twentyeleven/404.php | 48 + .../themes/twentyeleven/archive.php | 72 + src/wp-content/themes/twentyeleven/author.php | 89 + .../themes/twentyeleven/category.php | 65 + .../themes/twentyeleven/colors/dark.css | 618 + .../themes/twentyeleven/comments.php | 77 + .../themes/twentyeleven/content-aside.php | 46 + .../themes/twentyeleven/content-featured.php | 47 + .../themes/twentyeleven/content-gallery.php | 92 + .../themes/twentyeleven/content-image.php | 70 + .../themes/twentyeleven/content-intro.php | 21 + .../themes/twentyeleven/content-link.php | 46 + .../themes/twentyeleven/content-page.php | 23 + .../themes/twentyeleven/content-quote.php | 74 + .../themes/twentyeleven/content-single.php | 71 + .../themes/twentyeleven/content-status.php | 47 + .../themes/twentyeleven/content.php | 82 + .../themes/twentyeleven/editor-style-rtl.css | 24 + .../themes/twentyeleven/editor-style.css | 311 + src/wp-content/themes/twentyeleven/footer.php | 34 + .../themes/twentyeleven/functions.php | 593 + src/wp-content/themes/twentyeleven/header.php | 123 + src/wp-content/themes/twentyeleven/image.php | 101 + .../comment-arrow-bypostauthor-dark-rtl.png | Bin 0 -> 255 bytes .../comment-arrow-bypostauthor-dark.png | Bin 0 -> 237 bytes .../images/comment-arrow-bypostauthor-rtl.png | Bin 0 -> 257 bytes .../images/comment-arrow-bypostauthor.png | Bin 0 -> 239 bytes .../images/comment-arrow-dark-rtl.png | Bin 0 -> 272 bytes .../images/comment-arrow-dark.png | Bin 0 -> 348 bytes .../twentyeleven/images/comment-arrow-rtl.png | Bin 0 -> 271 bytes .../twentyeleven/images/comment-arrow.png | Bin 0 -> 250 bytes .../images/comment-bubble-dark-rtl.png | Bin 0 -> 1868 bytes .../images/comment-bubble-dark.png | Bin 0 -> 965 bytes .../images/comment-bubble-rtl.png | Bin 0 -> 1782 bytes .../twentyeleven/images/comment-bubble.png | Bin 0 -> 925 bytes .../images/headers/chessboard-thumbnail.jpg | Bin 0 -> 6420 bytes .../images/headers/chessboard.jpg | Bin 0 -> 53906 bytes .../images/headers/hanoi-thumbnail.jpg | Bin 0 -> 4584 bytes .../twentyeleven/images/headers/hanoi.jpg | Bin 0 -> 40965 bytes .../images/headers/lanterns-thumbnail.jpg | Bin 0 -> 8370 bytes .../twentyeleven/images/headers/lanterns.jpg | Bin 0 -> 95061 bytes .../images/headers/pine-cone-thumbnail.jpg | Bin 0 -> 3770 bytes .../twentyeleven/images/headers/pine-cone.jpg | Bin 0 -> 39112 bytes .../images/headers/shore-thumbnail.jpg | Bin 0 -> 6035 bytes .../twentyeleven/images/headers/shore.jpg | Bin 0 -> 79509 bytes .../images/headers/trolley-thumbnail.jpg | Bin 0 -> 6385 bytes .../twentyeleven/images/headers/trolley.jpg | Bin 0 -> 62979 bytes .../images/headers/wheel-thumbnail.jpg | Bin 0 -> 6460 bytes .../twentyeleven/images/headers/wheel.jpg | Bin 0 -> 60901 bytes .../images/headers/willow-thumbnail.jpg | Bin 0 -> 4297 bytes .../twentyeleven/images/headers/willow.jpg | Bin 0 -> 68450 bytes .../themes/twentyeleven/images/search.png | Bin 0 -> 441 bytes .../themes/twentyeleven/images/wordpress.png | Bin 0 -> 794 bytes .../inc/images/content-sidebar.png | Bin 0 -> 273 bytes .../twentyeleven/inc/images/content.png | Bin 0 -> 3682 bytes .../themes/twentyeleven/inc/images/dark.png | Bin 0 -> 6884 bytes .../themes/twentyeleven/inc/images/light.png | Bin 0 -> 7052 bytes .../inc/images/sidebar-content.png | Bin 0 -> 272 bytes .../themes/twentyeleven/inc/theme-options.css | 35 + .../themes/twentyeleven/inc/theme-options.js | 52 + .../themes/twentyeleven/inc/theme-options.php | 408 + .../themes/twentyeleven/inc/widgets.php | 166 + src/wp-content/themes/twentyeleven/index.php | 52 + .../themes/twentyeleven/js/html5.js | 3 + .../themes/twentyeleven/js/showcase.js | 17 + .../themes/twentyeleven/languages/es_ES.mo | Bin 0 -> 16378 bytes .../themes/twentyeleven/languages/es_ES.po | 566 + .../twentyeleven/languages/twentyeleven.pot | 654 + .../themes/twentyeleven/license.txt | 281 + src/wp-content/themes/twentyeleven/page.php | 29 + src/wp-content/themes/twentyeleven/readme.txt | 5 + src/wp-content/themes/twentyeleven/rtl.css | 582 + .../themes/twentyeleven/screenshot.png | Bin 0 -> 62878 bytes src/wp-content/themes/twentyeleven/search.php | 57 + .../themes/twentyeleven/searchform.php | 14 + .../themes/twentyeleven/showcase.php | 220 + .../themes/twentyeleven/sidebar-footer.php | 42 + .../themes/twentyeleven/sidebar-page.php | 26 + .../themes/twentyeleven/sidebar.php | 36 + src/wp-content/themes/twentyeleven/single.php | 32 + src/wp-content/themes/twentyeleven/style.css | 2670 +++ src/wp-content/themes/twentyeleven/tag.php | 65 + src/wp-content/themes/twentyten/404.php | 30 + src/wp-content/themes/twentyten/archive.php | 61 + .../themes/twentyten/attachment.php | 26 + src/wp-content/themes/twentyten/author.php | 60 + src/wp-content/themes/twentyten/category.php | 34 + src/wp-content/themes/twentyten/comments.php | 79 + .../themes/twentyten/editor-style-rtl.css | 56 + .../themes/twentyten/editor-style.css | 292 + src/wp-content/themes/twentyten/footer.php | 50 + src/wp-content/themes/twentyten/functions.php | 508 + src/wp-content/themes/twentyten/header.php | 90 + .../images/headers/berries-thumbnail.jpg | Bin 0 -> 5727 bytes .../twentyten/images/headers/berries.jpg | Bin 0 -> 60696 bytes .../headers/cherryblossoms-thumbnail.jpg | Bin 0 -> 6542 bytes .../images/headers/cherryblossoms.jpg | Bin 0 -> 82037 bytes .../images/headers/concave-thumbnail.jpg | Bin 0 -> 5767 bytes .../twentyten/images/headers/concave.jpg | Bin 0 -> 38532 bytes .../images/headers/fern-thumbnail.jpg | Bin 0 -> 5530 bytes .../themes/twentyten/images/headers/fern.jpg | Bin 0 -> 25294 bytes .../images/headers/forestfloor-thumbnail.jpg | Bin 0 -> 6719 bytes .../twentyten/images/headers/forestfloor.jpg | Bin 0 -> 64870 bytes .../images/headers/inkwell-thumbnail.jpg | Bin 0 -> 4063 bytes .../twentyten/images/headers/inkwell.jpg | Bin 0 -> 39300 bytes .../images/headers/path-thumbnail.jpg | Bin 0 -> 4560 bytes .../themes/twentyten/images/headers/path.jpg | Bin 0 -> 51727 bytes .../images/headers/sunset-thumbnail.jpg | Bin 0 -> 2209 bytes .../twentyten/images/headers/sunset.jpg | Bin 0 -> 22830 bytes .../themes/twentyten/images/wordpress.png | Bin 0 -> 849 bytes src/wp-content/themes/twentyten/index.php | 32 + .../themes/twentyten/languages/es_ES.mo | Bin 0 -> 8888 bytes .../themes/twentyten/languages/es_ES.po | 364 + .../themes/twentyten/languages/twentyten.pot | 408 + src/wp-content/themes/twentyten/license.txt | 281 + .../themes/twentyten/loop-attachment.php | 117 + src/wp-content/themes/twentyten/loop-page.php | 36 + .../themes/twentyten/loop-single.php | 67 + src/wp-content/themes/twentyten/loop.php | 181 + .../themes/twentyten/onecolumn-page.php | 31 + src/wp-content/themes/twentyten/page.php | 32 + src/wp-content/themes/twentyten/rtl.css | 285 + .../themes/twentyten/screenshot.png | Bin 0 -> 34923 bytes src/wp-content/themes/twentyten/search.php | 37 + .../themes/twentyten/sidebar-footer.php | 60 + src/wp-content/themes/twentyten/sidebar.php | 56 + src/wp-content/themes/twentyten/single.php | 27 + src/wp-content/themes/twentyten/style.css | 1357 ++ src/wp-content/themes/twentyten/tag.php | 30 + src/wp-cron.php | 60 + src/wp-feed.php | 12 + src/wp-includes/Text/Diff.php | 450 + src/wp-includes/Text/Diff/Engine/native.php | 436 + src/wp-includes/Text/Diff/Engine/shell.php | 162 + src/wp-includes/Text/Diff/Engine/string.php | 248 + src/wp-includes/Text/Diff/Engine/xdiff.php | 64 + src/wp-includes/Text/Diff/Renderer.php | 235 + src/wp-includes/Text/Diff/Renderer/inline.php | 206 + src/wp-includes/admin-bar.php | 450 + src/wp-includes/atomlib.php | 354 + src/wp-includes/author-template.php | 401 + src/wp-includes/bookmark-template.php | 256 + src/wp-includes/bookmark.php | 380 + src/wp-includes/cache.php | 486 + src/wp-includes/canonical.php | 433 + src/wp-includes/capabilities.php | 1226 ++ src/wp-includes/category-template.php | 1215 ++ src/wp-includes/category.php | 359 + src/wp-includes/class-IXR.php | 1065 ++ src/wp-includes/class-feed.php | 94 + src/wp-includes/class-http.php | 1725 ++ src/wp-includes/class-json.php | 863 + src/wp-includes/class-oembed.php | 295 + src/wp-includes/class-phpass.php | 260 + src/wp-includes/class-phpmailer.php | 2320 +++ src/wp-includes/class-pop3.php | 652 + src/wp-includes/class-simplepie.php | 15002 ++++++++++++++++ src/wp-includes/class-smtp.php | 814 + src/wp-includes/class-snoopy.php | 1256 ++ src/wp-includes/class-wp-admin-bar.php | 237 + src/wp-includes/class-wp-ajax-response.php | 138 + src/wp-includes/class-wp-error.php | 212 + src/wp-includes/class-wp-http-ixr-client.php | 93 + src/wp-includes/class-wp-walker.php | 399 + src/wp-includes/class-wp-xmlrpc-server.php | 3615 ++++ src/wp-includes/class-wp.php | 599 + src/wp-includes/class.wp-dependencies.php | 236 + src/wp-includes/class.wp-scripts.php | 205 + src/wp-includes/class.wp-styles.php | 126 + src/wp-includes/comment-template.php | 1590 ++ src/wp-includes/comment.php | 2017 +++ src/wp-includes/compat.php | 96 + src/wp-includes/cron.php | 407 + src/wp-includes/css/admin-bar-rtl.css | 1 + src/wp-includes/css/admin-bar-rtl.dev.css | 103 + src/wp-includes/css/admin-bar.css | 1 + src/wp-includes/css/admin-bar.dev.css | 312 + src/wp-includes/css/jquery-ui-dialog.css | 1 + src/wp-includes/css/jquery-ui-dialog.dev.css | 143 + src/wp-includes/default-constants.php | 301 + src/wp-includes/default-filters.php | 287 + src/wp-includes/default-widgets.php | 1158 ++ src/wp-includes/deprecated.php | 2617 +++ src/wp-includes/feed-atom-comments.php | 87 + src/wp-includes/feed-atom.php | 55 + src/wp-includes/feed-rdf.php | 54 + src/wp-includes/feed-rss.php | 31 + src/wp-includes/feed-rss2-comments.php | 66 + src/wp-includes/feed-rss2.php | 60 + src/wp-includes/feed.php | 546 + src/wp-includes/formatting.php | 2926 +++ src/wp-includes/functions.php | 4552 +++++ src/wp-includes/functions.wp-scripts.php | 147 + src/wp-includes/functions.wp-styles.php | 145 + src/wp-includes/general-template.php | 2327 +++ src/wp-includes/http.php | 224 + .../images/admin-bar-sprite-rtl.png | Bin 0 -> 732 bytes src/wp-includes/images/admin-bar-sprite.png | Bin 0 -> 737 bytes src/wp-includes/images/blank.gif | Bin 0 -> 43 bytes src/wp-includes/images/crystal/archive.png | Bin 0 -> 3066 bytes src/wp-includes/images/crystal/audio.png | Bin 0 -> 2647 bytes src/wp-includes/images/crystal/code.png | Bin 0 -> 2133 bytes src/wp-includes/images/crystal/default.png | Bin 0 -> 638 bytes src/wp-includes/images/crystal/document.png | Bin 0 -> 2305 bytes .../images/crystal/interactive.png | Bin 0 -> 2808 bytes src/wp-includes/images/crystal/license.txt | 9 + .../images/crystal/spreadsheet.png | Bin 0 -> 2725 bytes src/wp-includes/images/crystal/text.png | Bin 0 -> 999 bytes src/wp-includes/images/crystal/video.png | Bin 0 -> 2372 bytes src/wp-includes/images/rss.png | Bin 0 -> 3341 bytes src/wp-includes/images/smilies/icon_arrow.gif | Bin 0 -> 170 bytes .../images/smilies/icon_biggrin.gif | Bin 0 -> 172 bytes .../images/smilies/icon_confused.gif | Bin 0 -> 171 bytes src/wp-includes/images/smilies/icon_cool.gif | Bin 0 -> 172 bytes src/wp-includes/images/smilies/icon_cry.gif | Bin 0 -> 498 bytes src/wp-includes/images/smilies/icon_eek.gif | Bin 0 -> 170 bytes src/wp-includes/images/smilies/icon_evil.gif | Bin 0 -> 236 bytes .../images/smilies/icon_exclaim.gif | Bin 0 -> 236 bytes src/wp-includes/images/smilies/icon_idea.gif | Bin 0 -> 176 bytes src/wp-includes/images/smilies/icon_lol.gif | Bin 0 -> 336 bytes src/wp-includes/images/smilies/icon_mad.gif | Bin 0 -> 174 bytes .../images/smilies/icon_mrgreen.gif | Bin 0 -> 349 bytes .../images/smilies/icon_neutral.gif | Bin 0 -> 171 bytes .../images/smilies/icon_question.gif | Bin 0 -> 248 bytes src/wp-includes/images/smilies/icon_razz.gif | Bin 0 -> 176 bytes .../images/smilies/icon_redface.gif | Bin 0 -> 650 bytes .../images/smilies/icon_rolleyes.gif | Bin 0 -> 485 bytes src/wp-includes/images/smilies/icon_sad.gif | Bin 0 -> 171 bytes src/wp-includes/images/smilies/icon_smile.gif | Bin 0 -> 174 bytes .../images/smilies/icon_surprised.gif | Bin 0 -> 174 bytes .../images/smilies/icon_twisted.gif | Bin 0 -> 238 bytes src/wp-includes/images/smilies/icon_wink.gif | Bin 0 -> 170 bytes src/wp-includes/images/upload.png | Bin 0 -> 814 bytes src/wp-includes/images/wlw/wp-comments.png | Bin 0 -> 1442 bytes src/wp-includes/images/wlw/wp-icon.png | Bin 0 -> 779 bytes src/wp-includes/images/wlw/wp-watermark.png | Bin 0 -> 8280 bytes src/wp-includes/images/wpmini-blue.png | Bin 0 -> 958 bytes src/wp-includes/js/admin-bar.dev.js | 140 + src/wp-includes/js/admin-bar.js | 1 + src/wp-includes/js/autosave.dev.js | 306 + src/wp-includes/js/autosave.js | 1 + src/wp-includes/js/colorpicker.dev.js | 707 + src/wp-includes/js/colorpicker.js | 1 + src/wp-includes/js/comment-reply.dev.js | 48 + src/wp-includes/js/comment-reply.js | 1 + src/wp-includes/js/crop/cropper.css | 165 + src/wp-includes/js/crop/cropper.js | 516 + src/wp-includes/js/crop/marqueeHoriz.gif | Bin 0 -> 1125 bytes src/wp-includes/js/crop/marqueeVert.gif | Bin 0 -> 1141 bytes src/wp-includes/js/hoverIntent.dev.js | 128 + src/wp-includes/js/hoverIntent.js | 1 + .../js/imgareaselect/border-anim-h.gif | Bin 0 -> 219 bytes .../js/imgareaselect/border-anim-v.gif | Bin 0 -> 219 bytes .../js/imgareaselect/imgareaselect.css | 41 + .../imgareaselect/jquery.imgareaselect.dev.js | 722 + .../js/imgareaselect/jquery.imgareaselect.js | 1 + src/wp-includes/js/jcrop/Jcrop.gif | Bin 0 -> 329 bytes src/wp-includes/js/jcrop/jquery.Jcrop.css | 35 + src/wp-includes/js/jcrop/jquery.Jcrop.dev.js | 1197 ++ src/wp-includes/js/jcrop/jquery.Jcrop.js | 1 + src/wp-includes/js/jquery/jquery.color.dev.js | 128 + src/wp-includes/js/jquery/jquery.color.js | 1 + src/wp-includes/js/jquery/jquery.form.dev.js | 826 + src/wp-includes/js/jquery/jquery.form.js | 11 + .../js/jquery/jquery.hotkeys.dev.js | 128 + src/wp-includes/js/jquery/jquery.hotkeys.js | 1 + src/wp-includes/js/jquery/jquery.js | 18 + src/wp-includes/js/jquery/jquery.query.js | 11 + src/wp-includes/js/jquery/jquery.schedule.js | 36 + .../js/jquery/jquery.serialize-object.js | 31 + .../js/jquery/jquery.table-hotkeys.dev.js | 99 + .../js/jquery/jquery.table-hotkeys.js | 1 + src/wp-includes/js/jquery/suggest.dev.js | 330 + src/wp-includes/js/jquery/suggest.js | 1 + src/wp-includes/js/jquery/ui.button.js | 25 + src/wp-includes/js/jquery/ui.core.js | 17 + src/wp-includes/js/jquery/ui.dialog.js | 40 + src/wp-includes/js/jquery/ui.draggable.js | 50 + src/wp-includes/js/jquery/ui.droppable.js | 26 + src/wp-includes/js/jquery/ui.mouse.js | 17 + src/wp-includes/js/jquery/ui.position.js | 16 + src/wp-includes/js/jquery/ui.resizable.js | 47 + src/wp-includes/js/jquery/ui.selectable.js | 22 + src/wp-includes/js/jquery/ui.sortable.js | 60 + src/wp-includes/js/jquery/ui.tabs.js | 35 + src/wp-includes/js/jquery/ui.widget.js | 15 + src/wp-includes/js/json2.dev.js | 480 + src/wp-includes/js/json2.js | 1 + src/wp-includes/js/l10n.dev.js | 23 + src/wp-includes/js/l10n.js | 1 + src/wp-includes/js/prototype.js | 4874 +++++ src/wp-includes/js/quicktags.dev.js | 582 + src/wp-includes/js/quicktags.js | 1 + src/wp-includes/js/scriptaculous/MIT-LICENSE | 20 + src/wp-includes/js/scriptaculous/builder.js | 136 + src/wp-includes/js/scriptaculous/controls.js | 965 + src/wp-includes/js/scriptaculous/dragdrop.js | 974 + src/wp-includes/js/scriptaculous/effects.js | 1123 ++ .../js/scriptaculous/scriptaculous.js | 68 + src/wp-includes/js/scriptaculous/slider.js | 275 + src/wp-includes/js/scriptaculous/sound.js | 59 + src/wp-includes/js/scriptaculous/unittest.js | 568 + .../js/scriptaculous/wp-scriptaculous.js | 73 + src/wp-includes/js/swfobject.js | 4 + src/wp-includes/js/swfupload/handlers.dev.js | 370 + src/wp-includes/js/swfupload/handlers.js | 1 + src/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 + src/wp-includes/js/swfupload/swfupload-all.js | 8 + src/wp-includes/js/swfupload/swfupload.js | 980 + src/wp-includes/js/swfupload/swfupload.swf | Bin 0 -> 12787 bytes .../js/thickbox/loadingAnimation.gif | Bin 0 -> 5886 bytes src/wp-includes/js/thickbox/macFFBgHack.png | Bin 0 -> 207 bytes src/wp-includes/js/thickbox/tb-close.png | Bin 0 -> 506 bytes src/wp-includes/js/thickbox/thickbox.css | 162 + src/wp-includes/js/thickbox/thickbox.js | 324 + .../js/tinymce/langs/wp-langs-en.js | 502 + src/wp-includes/js/tinymce/langs/wp-langs.php | 515 + src/wp-includes/js/tinymce/license.txt | 504 + .../plugins/directionality/editor_plugin.js | 1 + .../plugins/fullscreen/editor_plugin.js | 1 + .../tinymce/plugins/fullscreen/fullscreen.htm | 109 + .../plugins/inlinepopups/editor_plugin.js | 1 + .../skins/clearlooks2/img/alert.gif | Bin 0 -> 818 bytes .../skins/clearlooks2/img/button.gif | Bin 0 -> 280 bytes .../skins/clearlooks2/img/buttons.gif | Bin 0 -> 989 bytes .../skins/clearlooks2/img/confirm.gif | Bin 0 -> 915 bytes .../skins/clearlooks2/img/corners.gif | Bin 0 -> 911 bytes .../skins/clearlooks2/img/drag.gif | Bin 0 -> 57 bytes .../skins/clearlooks2/img/horizontal.gif | Bin 0 -> 769 bytes .../skins/clearlooks2/img/vertical.gif | Bin 0 -> 92 bytes .../inlinepopups/skins/clearlooks2/window.css | 136 + .../tinymce/plugins/inlinepopups/template.htm | 387 + .../js/tinymce/plugins/media/css/media.css | 17 + .../js/tinymce/plugins/media/editor_plugin.js | 1 + .../js/tinymce/plugins/media/js/embed.js | 73 + .../js/tinymce/plugins/media/js/media.js | 354 + .../js/tinymce/plugins/media/media.htm | 812 + .../js/tinymce/plugins/media/moxieplayer.swf | Bin 0 -> 33931 bytes .../js/tinymce/plugins/paste/blank.htm | 21 + .../js/tinymce/plugins/paste/editor_plugin.js | 1 + .../js/tinymce/plugins/paste/js/pastetext.js | 36 + .../js/tinymce/plugins/paste/js/pasteword.js | 51 + .../js/tinymce/plugins/paste/pastetext.htm | 32 + .../js/tinymce/plugins/paste/pasteword.htm | 26 + .../plugins/spellchecker/changelog.txt | 28 + .../spellchecker/classes/EnchantSpell.php | 67 + .../spellchecker/classes/GoogleSpell.php | 159 + .../plugins/spellchecker/classes/PSpell.php | 82 + .../spellchecker/classes/PSpellShell.php | 113 + .../spellchecker/classes/SpellChecker.php | 62 + .../spellchecker/classes/utils/JSON.php | 595 + .../spellchecker/classes/utils/Logger.php | 268 + .../tinymce/plugins/spellchecker/config.php | 27 + .../plugins/spellchecker/css/content.css | 1 + .../plugins/spellchecker/editor_plugin.js | 1 + .../plugins/spellchecker/img/wline.gif | Bin 0 -> 46 bytes .../plugins/spellchecker/includes/general.php | 98 + .../js/tinymce/plugins/spellchecker/rpc.php | 112 + .../tinymce/plugins/tabfocus/editor_plugin.js | 1 + .../tinymce/plugins/wordpress/css/content.css | 29 + .../plugins/wordpress/editor_plugin.dev.js | 423 + .../plugins/wordpress/editor_plugin.js | 1 + .../tinymce/plugins/wordpress/img/audio.gif | Bin 0 -> 146 bytes .../plugins/wordpress/img/embedded.png | Bin 0 -> 28741 bytes .../tinymce/plugins/wordpress/img/image.gif | Bin 0 -> 101 bytes .../tinymce/plugins/wordpress/img/media.gif | Bin 0 -> 149 bytes .../plugins/wordpress/img/more_bug.gif | Bin 0 -> 146 bytes .../js/tinymce/plugins/wordpress/img/page.gif | Bin 0 -> 108 bytes .../plugins/wordpress/img/page_bug.gif | Bin 0 -> 180 bytes .../tinymce/plugins/wordpress/img/trans.gif | Bin 0 -> 43 bytes .../tinymce/plugins/wordpress/img/video.gif | Bin 0 -> 99 bytes .../plugins/wpdialogs/editor_plugin.dev.js | 80 + .../plugins/wpdialogs/editor_plugin.js | 1 + .../tinymce/plugins/wpdialogs/js/popup.dev.js | 432 + .../js/tinymce/plugins/wpdialogs/js/popup.js | 1 + .../plugins/wpdialogs/js/wpdialog.dev.js | 28 + .../tinymce/plugins/wpdialogs/js/wpdialog.js | 1 + .../plugins/wpeditimage/css/editimage-rtl.css | 68 + .../plugins/wpeditimage/css/editimage.css | 358 + .../plugins/wpeditimage/editimage.html | 275 + .../plugins/wpeditimage/editor_plugin.dev.js | 219 + .../plugins/wpeditimage/editor_plugin.js | 1 + .../plugins/wpeditimage/img/delete.png | Bin 0 -> 1638 bytes .../tinymce/plugins/wpeditimage/img/image.png | Bin 0 -> 3701 bytes .../plugins/wpeditimage/js/editimage.dev.js | 613 + .../plugins/wpeditimage/js/editimage.js | 1 + .../wpfullscreen/css/wp-fullscreen.css | 11 + .../plugins/wpfullscreen/editor_plugin.dev.js | 178 + .../plugins/wpfullscreen/editor_plugin.js | 1 + .../plugins/wpgallery/editor_plugin.dev.js | 119 + .../plugins/wpgallery/editor_plugin.js | 1 + .../tinymce/plugins/wpgallery/img/delete.png | Bin 0 -> 1638 bytes .../js/tinymce/plugins/wpgallery/img/edit.png | Bin 0 -> 1799 bytes .../tinymce/plugins/wpgallery/img/gallery.png | Bin 0 -> 27676 bytes .../js/tinymce/plugins/wpgallery/img/t.gif | Bin 0 -> 43 bytes .../tinymce/plugins/wplink/css/wplink-rtl.css | 1 + .../plugins/wplink/css/wplink-rtl.dev.css | 54 + .../js/tinymce/plugins/wplink/css/wplink.css | 1 + .../tinymce/plugins/wplink/css/wplink.dev.css | 163 + .../plugins/wplink/editor_plugin.dev.js | 60 + .../tinymce/plugins/wplink/editor_plugin.js | 1 + .../plugins/wplink/img/toggle-arrow.png | Bin 0 -> 3226 bytes .../tinymce/plugins/wplink/js/wplink.dev.js | 585 + .../js/tinymce/plugins/wplink/js/wplink.js | 1 + .../js/tinymce/themes/advanced/about.htm | 52 + .../js/tinymce/themes/advanced/anchor.htm | 31 + .../js/tinymce/themes/advanced/charmap.htm | 51 + .../tinymce/themes/advanced/color_picker.htm | 76 + .../themes/advanced/editor_template.js | 1 + .../js/tinymce/themes/advanced/image.htm | 89 + .../themes/advanced/img/colorpicker.jpg | Bin 0 -> 3189 bytes .../js/tinymce/themes/advanced/img/flash.gif | Bin 0 -> 241 bytes .../tinymce/themes/advanced/img/gotmoxie.png | Bin 0 -> 983 bytes .../js/tinymce/themes/advanced/img/icons.gif | Bin 0 -> 11794 bytes .../js/tinymce/themes/advanced/img/iframe.gif | Bin 0 -> 600 bytes .../tinymce/themes/advanced/img/pagebreak.gif | Bin 0 -> 325 bytes .../tinymce/themes/advanced/img/quicktime.gif | Bin 0 -> 303 bytes .../tinymce/themes/advanced/img/realmedia.gif | Bin 0 -> 439 bytes .../tinymce/themes/advanced/img/shockwave.gif | Bin 0 -> 387 bytes .../js/tinymce/themes/advanced/img/trans.gif | Bin 0 -> 43 bytes .../js/tinymce/themes/advanced/img/video.gif | Bin 0 -> 597 bytes .../themes/advanced/img/windowsmedia.gif | Bin 0 -> 415 bytes .../tinymce/themes/advanced/img/wpicons.png | Bin 0 -> 21059 bytes .../js/tinymce/themes/advanced/js/about.js | 73 + .../js/tinymce/themes/advanced/js/anchor.js | 42 + .../js/tinymce/themes/advanced/js/charmap.js | 355 + .../themes/advanced/js/color_picker.js | 329 + .../js/tinymce/themes/advanced/js/image.js | 255 + .../js/tinymce/themes/advanced/js/link.js | 153 + .../themes/advanced/js/source_editor.js | 56 + .../js/tinymce/themes/advanced/link.htm | 62 + .../js/tinymce/themes/advanced/shortcuts.htm | 47 + .../themes/advanced/skins/default/content.css | 47 + .../themes/advanced/skins/default/dialog.css | 117 + .../advanced/skins/default/img/buttons.png | Bin 0 -> 3274 bytes .../advanced/skins/default/img/items.gif | Bin 0 -> 70 bytes .../advanced/skins/default/img/menu_arrow.gif | Bin 0 -> 68 bytes .../advanced/skins/default/img/menu_check.gif | Bin 0 -> 70 bytes .../advanced/skins/default/img/progress.gif | Bin 0 -> 1787 bytes .../advanced/skins/default/img/tabs.gif | Bin 0 -> 1326 bytes .../themes/advanced/skins/default/ui.css | 213 + .../advanced/skins/highcontrast/content.css | 23 + .../advanced/skins/highcontrast/dialog.css | 105 + .../themes/advanced/skins/highcontrast/ui.css | 101 + .../themes/advanced/skins/o2k7/content.css | 46 + .../themes/advanced/skins/o2k7/dialog.css | 117 + .../advanced/skins/o2k7/img/button_bg.png | Bin 0 -> 5859 bytes .../skins/o2k7/img/button_bg_black.png | Bin 0 -> 3736 bytes .../skins/o2k7/img/button_bg_silver.png | Bin 0 -> 5358 bytes .../tinymce/themes/advanced/skins/o2k7/ui.css | 216 + .../themes/advanced/skins/o2k7/ui_black.css | 8 + .../themes/advanced/skins/o2k7/ui_silver.css | 5 + .../advanced/skins/wp_theme/content.css | 96 + .../themes/advanced/skins/wp_theme/dialog.css | 117 + .../advanced/skins/wp_theme/img/butt2.png | Bin 0 -> 212 bytes .../advanced/skins/wp_theme/img/button_bg.png | Bin 0 -> 5859 bytes .../skins/wp_theme/img/down_arrow.gif | Bin 0 -> 60 bytes .../advanced/skins/wp_theme/img/fade-butt.png | Bin 0 -> 785 bytes .../advanced/skins/wp_theme/img/separator.gif | Bin 0 -> 57 bytes .../advanced/skins/wp_theme/img/tabs.gif | Bin 0 -> 1326 bytes .../themes/advanced/skins/wp_theme/ui.css | 560 + .../tinymce/themes/advanced/source_editor.htm | 30 + src/wp-includes/js/tinymce/tiny_mce.js | 1 + src/wp-includes/js/tinymce/tiny_mce_popup.js | 5 + .../js/tinymce/utils/editable_selects.js | 70 + .../js/tinymce/utils/form_utils.js | 210 + src/wp-includes/js/tinymce/utils/mctabs.js | 162 + src/wp-includes/js/tinymce/utils/validate.js | 252 + src/wp-includes/js/tinymce/wp-mce-help.php | 289 + src/wp-includes/js/tinymce/wp-tinymce.js.gz | Bin 0 -> 93408 bytes src/wp-includes/js/tinymce/wp-tinymce.php | 37 + src/wp-includes/js/tw-sack.dev.js | 193 + src/wp-includes/js/tw-sack.js | 1 + src/wp-includes/js/wp-ajax-response.dev.js | 64 + src/wp-includes/js/wp-ajax-response.js | 1 + src/wp-includes/js/wp-list-revisions.dev.js | 24 + src/wp-includes/js/wp-list-revisions.js | 1 + src/wp-includes/js/wp-lists.dev.js | 464 + src/wp-includes/js/wp-lists.js | 1 + src/wp-includes/kses.php | 1415 ++ src/wp-includes/l10n.php | 535 + src/wp-includes/link-template.php | 2478 +++ src/wp-includes/load.php | 654 + src/wp-includes/locale.php | 351 + src/wp-includes/media.php | 1441 ++ src/wp-includes/meta.php | 610 + src/wp-includes/ms-blogs.php | 681 + src/wp-includes/ms-default-constants.php | 140 + src/wp-includes/ms-default-filters.php | 66 + src/wp-includes/ms-deprecated.php | 203 + src/wp-includes/ms-files.php | 83 + src/wp-includes/ms-functions.php | 2074 +++ src/wp-includes/ms-load.php | 250 + src/wp-includes/ms-settings.php | 136 + src/wp-includes/nav-menu-template.php | 489 + src/wp-includes/nav-menu.php | 784 + src/wp-includes/pluggable-deprecated.php | 136 + src/wp-includes/pluggable.php | 1811 ++ src/wp-includes/plugin.php | 788 + src/wp-includes/pomo/entry.php | 69 + src/wp-includes/pomo/mo.php | 231 + src/wp-includes/pomo/po.php | 363 + src/wp-includes/pomo/streams.php | 209 + src/wp-includes/pomo/translations.php | 253 + src/wp-includes/post-template.php | 1440 ++ src/wp-includes/post-thumbnail-template.php | 105 + src/wp-includes/post.php | 5298 ++++++ src/wp-includes/query.php | 3575 ++++ src/wp-includes/registration-functions.php | 8 + src/wp-includes/registration.php | 8 + src/wp-includes/rewrite.php | 1991 ++ src/wp-includes/rss-functions.php | 10 + src/wp-includes/rss.php | 939 + src/wp-includes/script-loader.php | 801 + src/wp-includes/shortcodes.php | 298 + src/wp-includes/taxonomy.php | 3190 ++++ src/wp-includes/template-loader.php | 47 + .../theme-compat/comments-popup.php | 129 + src/wp-includes/theme-compat/comments.php | 102 + src/wp-includes/theme-compat/footer.php | 30 + src/wp-includes/theme-compat/header.php | 50 + src/wp-includes/theme-compat/sidebar.php | 84 + src/wp-includes/theme.php | 1985 ++ src/wp-includes/update.php | 366 + src/wp-includes/user.php | 1621 ++ src/wp-includes/vars.php | 97 + src/wp-includes/version.php | 44 + src/wp-includes/widgets.php | 1217 ++ src/wp-includes/wlwmanifest.xml | 44 + src/wp-includes/wp-db.php | 1554 ++ src/wp-includes/wp-diff.php | 477 + src/wp-links-opml.php | 59 + src/wp-load.php | 60 + src/wp-login.php | 698 + src/wp-mail.php | 236 + src/wp-pass.php | 20 + src/wp-rdf.php | 12 + src/wp-register.php | 15 + src/wp-rss.php | 12 + src/wp-rss2.php | 12 + src/wp-settings.php | 324 + src/wp-signup.php | 455 + src/wp-trackback.php | 111 + src/xmlrpc.php | 110 + 959 files changed, 251739 insertions(+) create mode 100644 db/afetec.sql create mode 100644 referencia/WordPress/wordpress-3.2.1-es_ES.zip create mode 100644 src/index.php create mode 100644 src/licencia.txt create mode 100644 src/license.txt create mode 100644 src/wp-activate.php create mode 100644 src/wp-admin/admin-ajax.php create mode 100644 src/wp-admin/admin-footer.php create mode 100644 src/wp-admin/admin-functions.php create mode 100644 src/wp-admin/admin-header.php create mode 100644 src/wp-admin/admin-post.php create mode 100644 src/wp-admin/admin.php create mode 100644 src/wp-admin/async-upload.php create mode 100644 src/wp-admin/comment.php create mode 100644 src/wp-admin/credits.php create mode 100644 src/wp-admin/css/colors-classic-rtl.css create mode 100644 src/wp-admin/css/colors-classic-rtl.dev.css create mode 100644 src/wp-admin/css/colors-classic.css create mode 100644 src/wp-admin/css/colors-classic.dev.css create mode 100644 src/wp-admin/css/colors-fresh-rtl.css create mode 100644 src/wp-admin/css/colors-fresh-rtl.dev.css create mode 100644 src/wp-admin/css/colors-fresh.css create mode 100644 src/wp-admin/css/colors-fresh.dev.css create mode 100644 src/wp-admin/css/dashboard-rtl.css create mode 100644 src/wp-admin/css/dashboard-rtl.dev.css create mode 100644 src/wp-admin/css/dashboard.css create mode 100644 src/wp-admin/css/dashboard.dev.css create mode 100644 src/wp-admin/css/farbtastic-rtl.css create mode 100644 src/wp-admin/css/farbtastic.css create mode 100644 src/wp-admin/css/global-rtl.css create mode 100644 src/wp-admin/css/global-rtl.dev.css create mode 100644 src/wp-admin/css/global.css create mode 100644 src/wp-admin/css/global.dev.css create mode 100644 src/wp-admin/css/ie-rtl.css create mode 100644 src/wp-admin/css/ie-rtl.dev.css create mode 100644 src/wp-admin/css/ie.css create mode 100644 src/wp-admin/css/ie.dev.css create mode 100644 src/wp-admin/css/install-rtl.css create mode 100644 src/wp-admin/css/install-rtl.dev.css create mode 100644 src/wp-admin/css/install.css create mode 100644 src/wp-admin/css/install.dev.css create mode 100644 src/wp-admin/css/login-rtl.css create mode 100644 src/wp-admin/css/login-rtl.dev.css create mode 100644 src/wp-admin/css/login.css create mode 100644 src/wp-admin/css/login.dev.css create mode 100644 src/wp-admin/css/media-rtl.css create mode 100644 src/wp-admin/css/media-rtl.dev.css create mode 100644 src/wp-admin/css/media.css create mode 100644 src/wp-admin/css/media.dev.css create mode 100644 src/wp-admin/css/ms.css create mode 100644 src/wp-admin/css/ms.dev.css create mode 100644 src/wp-admin/css/nav-menu-rtl.css create mode 100644 src/wp-admin/css/nav-menu-rtl.dev.css create mode 100644 src/wp-admin/css/nav-menu.css create mode 100644 src/wp-admin/css/nav-menu.dev.css create mode 100644 src/wp-admin/css/plugin-install-rtl.css create mode 100644 src/wp-admin/css/plugin-install-rtl.dev.css create mode 100644 src/wp-admin/css/plugin-install.css create mode 100644 src/wp-admin/css/plugin-install.dev.css create mode 100644 src/wp-admin/css/press-this-rtl.css create mode 100644 src/wp-admin/css/press-this-rtl.dev.css create mode 100644 src/wp-admin/css/press-this.css create mode 100644 src/wp-admin/css/press-this.dev.css create mode 100644 src/wp-admin/css/theme-editor-rtl.css create mode 100644 src/wp-admin/css/theme-editor-rtl.dev.css create mode 100644 src/wp-admin/css/theme-editor.css create mode 100644 src/wp-admin/css/theme-editor.dev.css create mode 100644 src/wp-admin/css/theme-install-rtl.css create mode 100644 src/wp-admin/css/theme-install-rtl.dev.css create mode 100644 src/wp-admin/css/theme-install.css create mode 100644 src/wp-admin/css/theme-install.dev.css create mode 100644 src/wp-admin/css/widgets-rtl.css create mode 100644 src/wp-admin/css/widgets-rtl.dev.css create mode 100644 src/wp-admin/css/widgets.css create mode 100644 src/wp-admin/css/widgets.dev.css create mode 100644 src/wp-admin/css/wp-admin-rtl.css create mode 100644 src/wp-admin/css/wp-admin-rtl.dev.css create mode 100644 src/wp-admin/css/wp-admin.css create mode 100644 src/wp-admin/css/wp-admin.dev.css create mode 100644 src/wp-admin/custom-background.php create mode 100644 src/wp-admin/custom-header.php create mode 100644 src/wp-admin/edit-comments.php create mode 100644 src/wp-admin/edit-form-advanced.php create mode 100644 src/wp-admin/edit-form-comment.php create mode 100644 src/wp-admin/edit-link-form.php create mode 100644 src/wp-admin/edit-tag-form.php create mode 100644 src/wp-admin/edit-tags.php create mode 100644 src/wp-admin/edit.php create mode 100644 src/wp-admin/export.php create mode 100644 src/wp-admin/freedoms.php create mode 100644 src/wp-admin/gears-manifest.php create mode 100644 src/wp-admin/images/align-center.png create mode 100644 src/wp-admin/images/align-left.png create mode 100644 src/wp-admin/images/align-none.png create mode 100644 src/wp-admin/images/align-right.png create mode 100644 src/wp-admin/images/archive-link.png create mode 100644 src/wp-admin/images/arrows-dark-vs.png create mode 100644 src/wp-admin/images/arrows-dark.png create mode 100644 src/wp-admin/images/arrows-vs.png create mode 100644 src/wp-admin/images/arrows.png create mode 100644 src/wp-admin/images/blue-grad.png create mode 100644 src/wp-admin/images/bubble_bg-rtl.gif create mode 100644 src/wp-admin/images/bubble_bg.gif create mode 100644 src/wp-admin/images/button-grad-active.png create mode 100644 src/wp-admin/images/button-grad.png create mode 100644 src/wp-admin/images/comment-grey-bubble.png create mode 100644 src/wp-admin/images/date-button.gif create mode 100644 src/wp-admin/images/ed-bg-vs.gif create mode 100644 src/wp-admin/images/ed-bg.gif create mode 100644 src/wp-admin/images/fade-butt.png create mode 100644 src/wp-admin/images/fav-arrow-rtl.gif create mode 100644 src/wp-admin/images/fav-arrow.gif create mode 100644 src/wp-admin/images/fav-vs.png create mode 100644 src/wp-admin/images/fav.png create mode 100644 src/wp-admin/images/generic.png create mode 100644 src/wp-admin/images/gray-grad.png create mode 100644 src/wp-admin/images/gray-star.png create mode 100644 src/wp-admin/images/icons32-vs.png create mode 100644 src/wp-admin/images/icons32.png create mode 100644 src/wp-admin/images/imgedit-icons.png create mode 100644 src/wp-admin/images/list.png create mode 100644 src/wp-admin/images/loading-publish.gif create mode 100644 src/wp-admin/images/loading.gif create mode 100644 src/wp-admin/images/logo-ghost.png create mode 100644 src/wp-admin/images/logo-login.png create mode 100644 src/wp-admin/images/logo.gif create mode 100644 src/wp-admin/images/marker.png create mode 100644 src/wp-admin/images/mask.png create mode 100644 src/wp-admin/images/media-button-image.gif create mode 100644 src/wp-admin/images/media-button-music.gif create mode 100644 src/wp-admin/images/media-button-other.gif create mode 100644 src/wp-admin/images/media-button-video.gif create mode 100644 src/wp-admin/images/menu-arrow-frame-rtl.png create mode 100644 src/wp-admin/images/menu-arrow-frame.png create mode 100644 src/wp-admin/images/menu-arrows.gif create mode 100644 src/wp-admin/images/menu-bits-rtl-vs.gif create mode 100644 src/wp-admin/images/menu-bits-rtl.gif create mode 100644 src/wp-admin/images/menu-bits-vs.gif create mode 100644 src/wp-admin/images/menu-bits.gif create mode 100644 src/wp-admin/images/menu-dark-rtl-vs.gif create mode 100644 src/wp-admin/images/menu-dark-rtl.gif create mode 100644 src/wp-admin/images/menu-dark-vs.gif create mode 100644 src/wp-admin/images/menu-dark.gif create mode 100644 src/wp-admin/images/menu-shadow-rtl.png create mode 100644 src/wp-admin/images/menu-shadow.png create mode 100644 src/wp-admin/images/menu-vs.png create mode 100644 src/wp-admin/images/menu.png create mode 100644 src/wp-admin/images/no.png create mode 100644 src/wp-admin/images/press-this.png create mode 100644 src/wp-admin/images/required.gif create mode 100644 src/wp-admin/images/resize-rtl.gif create mode 100644 src/wp-admin/images/resize.gif create mode 100644 src/wp-admin/images/screen-options-toggle-vs.gif create mode 100644 src/wp-admin/images/screen-options-toggle.gif create mode 100644 src/wp-admin/images/se.png create mode 100644 src/wp-admin/images/sort.gif create mode 100644 src/wp-admin/images/star.png create mode 100644 src/wp-admin/images/toggle-arrow-rtl.gif create mode 100644 src/wp-admin/images/toggle-arrow.gif create mode 100644 src/wp-admin/images/upload-classic.png create mode 100644 src/wp-admin/images/upload-fresh.png create mode 100644 src/wp-admin/images/wheel.png create mode 100644 src/wp-admin/images/white-grad-active.png create mode 100644 src/wp-admin/images/white-grad.png create mode 100644 src/wp-admin/images/widgets-arrow-vs.gif create mode 100644 src/wp-admin/images/widgets-arrow.gif create mode 100644 src/wp-admin/images/wordpress-logo.png create mode 100644 src/wp-admin/images/wp-logo-vs.png create mode 100644 src/wp-admin/images/wp-logo.png create mode 100644 src/wp-admin/images/wpspin_dark.gif create mode 100644 src/wp-admin/images/wpspin_light.gif create mode 100644 src/wp-admin/images/xit.gif create mode 100644 src/wp-admin/images/yes.png create mode 100644 src/wp-admin/import.php create mode 100644 src/wp-admin/includes/admin.php create mode 100644 src/wp-admin/includes/bookmark.php create mode 100644 src/wp-admin/includes/class-ftp-pure.php create mode 100644 src/wp-admin/includes/class-ftp-sockets.php create mode 100644 src/wp-admin/includes/class-ftp.php create mode 100644 src/wp-admin/includes/class-pclzip.php create mode 100644 src/wp-admin/includes/class-wp-comments-list-table.php create mode 100644 src/wp-admin/includes/class-wp-filesystem-base.php create mode 100644 src/wp-admin/includes/class-wp-filesystem-direct.php create mode 100644 src/wp-admin/includes/class-wp-filesystem-ftpext.php create mode 100644 src/wp-admin/includes/class-wp-filesystem-ftpsockets.php create mode 100644 src/wp-admin/includes/class-wp-filesystem-ssh2.php create mode 100644 src/wp-admin/includes/class-wp-importer.php create mode 100644 src/wp-admin/includes/class-wp-links-list-table.php create mode 100644 src/wp-admin/includes/class-wp-list-table.php create mode 100644 src/wp-admin/includes/class-wp-media-list-table.php create mode 100644 src/wp-admin/includes/class-wp-ms-sites-list-table.php create mode 100644 src/wp-admin/includes/class-wp-ms-themes-list-table.php create mode 100644 src/wp-admin/includes/class-wp-ms-users-list-table.php create mode 100644 src/wp-admin/includes/class-wp-plugin-install-list-table.php create mode 100644 src/wp-admin/includes/class-wp-plugins-list-table.php create mode 100644 src/wp-admin/includes/class-wp-posts-list-table.php create mode 100644 src/wp-admin/includes/class-wp-terms-list-table.php create mode 100644 src/wp-admin/includes/class-wp-theme-install-list-table.php create mode 100644 src/wp-admin/includes/class-wp-themes-list-table.php create mode 100644 src/wp-admin/includes/class-wp-upgrader.php create mode 100644 src/wp-admin/includes/class-wp-users-list-table.php create mode 100644 src/wp-admin/includes/comment.php create mode 100644 src/wp-admin/includes/continents-cities.php create mode 100644 src/wp-admin/includes/dashboard.php create mode 100644 src/wp-admin/includes/deprecated.php create mode 100644 src/wp-admin/includes/export.php create mode 100644 src/wp-admin/includes/file.php create mode 100644 src/wp-admin/includes/image-edit.php create mode 100644 src/wp-admin/includes/image.php create mode 100644 src/wp-admin/includes/import.php create mode 100644 src/wp-admin/includes/internal-linking.php create mode 100644 src/wp-admin/includes/list-table.php create mode 100644 src/wp-admin/includes/manifest.php create mode 100644 src/wp-admin/includes/media.php create mode 100644 src/wp-admin/includes/menu.php create mode 100644 src/wp-admin/includes/meta-boxes.php create mode 100644 src/wp-admin/includes/misc.php create mode 100644 src/wp-admin/includes/ms-deprecated.php create mode 100644 src/wp-admin/includes/ms.php create mode 100644 src/wp-admin/includes/nav-menu.php create mode 100644 src/wp-admin/includes/plugin-install.php create mode 100644 src/wp-admin/includes/plugin.php create mode 100644 src/wp-admin/includes/post.php create mode 100644 src/wp-admin/includes/schema.php create mode 100644 src/wp-admin/includes/taxonomy.php create mode 100644 src/wp-admin/includes/template.php create mode 100644 src/wp-admin/includes/theme-install.php create mode 100644 src/wp-admin/includes/theme.php create mode 100644 src/wp-admin/includes/update-core.php create mode 100644 src/wp-admin/includes/update.php create mode 100644 src/wp-admin/includes/upgrade.php create mode 100644 src/wp-admin/includes/user.php create mode 100644 src/wp-admin/includes/widgets.php create mode 100644 src/wp-admin/index-extra.php create mode 100644 src/wp-admin/index.php create mode 100644 src/wp-admin/install-helper.php create mode 100644 src/wp-admin/install.php create mode 100644 src/wp-admin/js/cat.dev.js create mode 100644 src/wp-admin/js/cat.js create mode 100644 src/wp-admin/js/categories.dev.js create mode 100644 src/wp-admin/js/categories.js create mode 100644 src/wp-admin/js/comment.dev.js create mode 100644 src/wp-admin/js/comment.js create mode 100644 src/wp-admin/js/common.dev.js create mode 100644 src/wp-admin/js/common.js create mode 100644 src/wp-admin/js/custom-background.dev.js create mode 100644 src/wp-admin/js/custom-background.js create mode 100644 src/wp-admin/js/custom-fields.dev.js create mode 100644 src/wp-admin/js/custom-fields.js create mode 100644 src/wp-admin/js/dashboard.dev.js create mode 100644 src/wp-admin/js/dashboard.js create mode 100644 src/wp-admin/js/edit-comments.dev.js create mode 100644 src/wp-admin/js/edit-comments.js create mode 100644 src/wp-admin/js/editor.dev.js create mode 100644 src/wp-admin/js/editor.js create mode 100644 src/wp-admin/js/farbtastic.js create mode 100644 src/wp-admin/js/gallery.dev.js create mode 100644 src/wp-admin/js/gallery.js create mode 100644 src/wp-admin/js/image-edit.dev.js create mode 100644 src/wp-admin/js/image-edit.js create mode 100644 src/wp-admin/js/inline-edit-post.dev.js create mode 100644 src/wp-admin/js/inline-edit-post.js create mode 100644 src/wp-admin/js/inline-edit-tax.dev.js create mode 100644 src/wp-admin/js/inline-edit-tax.js create mode 100644 src/wp-admin/js/link.dev.js create mode 100644 src/wp-admin/js/link.js create mode 100644 src/wp-admin/js/media-upload.dev.js create mode 100644 src/wp-admin/js/media-upload.js create mode 100644 src/wp-admin/js/media.dev.js create mode 100644 src/wp-admin/js/media.js create mode 100644 src/wp-admin/js/nav-menu.dev.js create mode 100644 src/wp-admin/js/nav-menu.js create mode 100644 src/wp-admin/js/password-strength-meter.dev.js create mode 100644 src/wp-admin/js/password-strength-meter.js create mode 100644 src/wp-admin/js/plugin-install.dev.js create mode 100644 src/wp-admin/js/plugin-install.js create mode 100644 src/wp-admin/js/post.dev.js create mode 100644 src/wp-admin/js/post.js create mode 100644 src/wp-admin/js/postbox.dev.js create mode 100644 src/wp-admin/js/postbox.js create mode 100644 src/wp-admin/js/revisions-js.php create mode 100644 src/wp-admin/js/set-post-thumbnail.dev.js create mode 100644 src/wp-admin/js/set-post-thumbnail.js create mode 100644 src/wp-admin/js/tags.dev.js create mode 100644 src/wp-admin/js/tags.js create mode 100644 src/wp-admin/js/theme-preview.dev.js create mode 100644 src/wp-admin/js/theme-preview.js create mode 100644 src/wp-admin/js/theme.dev.js create mode 100644 src/wp-admin/js/theme.js create mode 100644 src/wp-admin/js/user-profile.dev.js create mode 100644 src/wp-admin/js/user-profile.js create mode 100644 src/wp-admin/js/utils.dev.js create mode 100644 src/wp-admin/js/utils.js create mode 100644 src/wp-admin/js/widgets.dev.js create mode 100644 src/wp-admin/js/widgets.js create mode 100644 src/wp-admin/js/word-count.dev.js create mode 100644 src/wp-admin/js/word-count.js create mode 100644 src/wp-admin/js/wp-fullscreen.dev.js create mode 100644 src/wp-admin/js/wp-fullscreen.js create mode 100644 src/wp-admin/js/xfn.dev.js create mode 100644 src/wp-admin/js/xfn.js create mode 100644 src/wp-admin/link-add.php create mode 100644 src/wp-admin/link-manager.php create mode 100644 src/wp-admin/link-parse-opml.php create mode 100644 src/wp-admin/link.php create mode 100644 src/wp-admin/load-scripts.php create mode 100644 src/wp-admin/load-styles.php create mode 100644 src/wp-admin/maint/repair.php create mode 100644 src/wp-admin/media-new.php create mode 100644 src/wp-admin/media-upload.php create mode 100644 src/wp-admin/media.php create mode 100644 src/wp-admin/menu-header.php create mode 100644 src/wp-admin/menu.php create mode 100644 src/wp-admin/moderation.php create mode 100644 src/wp-admin/ms-admin.php create mode 100644 src/wp-admin/ms-delete-site.php create mode 100644 src/wp-admin/ms-edit.php create mode 100644 src/wp-admin/ms-options.php create mode 100644 src/wp-admin/ms-sites.php create mode 100644 src/wp-admin/ms-themes.php create mode 100644 src/wp-admin/ms-upgrade-network.php create mode 100644 src/wp-admin/ms-users.php create mode 100644 src/wp-admin/my-sites.php create mode 100644 src/wp-admin/nav-menus.php create mode 100644 src/wp-admin/network.php create mode 100644 src/wp-admin/network/admin.php create mode 100644 src/wp-admin/network/edit.php create mode 100644 src/wp-admin/network/index-extra.php create mode 100644 src/wp-admin/network/index.php create mode 100644 src/wp-admin/network/menu.php create mode 100644 src/wp-admin/network/plugin-editor.php create mode 100644 src/wp-admin/network/plugin-install.php create mode 100644 src/wp-admin/network/plugins.php create mode 100644 src/wp-admin/network/profile.php create mode 100644 src/wp-admin/network/settings.php create mode 100644 src/wp-admin/network/setup.php create mode 100644 src/wp-admin/network/site-info.php create mode 100644 src/wp-admin/network/site-new.php create mode 100644 src/wp-admin/network/site-settings.php create mode 100644 src/wp-admin/network/site-themes.php create mode 100644 src/wp-admin/network/site-users.php create mode 100644 src/wp-admin/network/sites.php create mode 100644 src/wp-admin/network/theme-editor.php create mode 100644 src/wp-admin/network/theme-install.php create mode 100644 src/wp-admin/network/themes.php create mode 100644 src/wp-admin/network/update-core.php create mode 100644 src/wp-admin/network/update.php create mode 100644 src/wp-admin/network/upgrade.php create mode 100644 src/wp-admin/network/user-edit.php create mode 100644 src/wp-admin/network/user-new.php create mode 100644 src/wp-admin/network/users.php create mode 100644 src/wp-admin/options-discussion.php create mode 100644 src/wp-admin/options-general.php create mode 100644 src/wp-admin/options-head.php create mode 100644 src/wp-admin/options-media.php create mode 100644 src/wp-admin/options-permalink.php create mode 100644 src/wp-admin/options-privacy.php create mode 100644 src/wp-admin/options-reading.php create mode 100644 src/wp-admin/options-writing.php create mode 100644 src/wp-admin/options.php create mode 100644 src/wp-admin/plugin-editor.php create mode 100644 src/wp-admin/plugin-install.php create mode 100644 src/wp-admin/plugins.php create mode 100644 src/wp-admin/post-new.php create mode 100644 src/wp-admin/post.php create mode 100644 src/wp-admin/press-this.php create mode 100644 src/wp-admin/profile.php create mode 100644 src/wp-admin/revision.php create mode 100644 src/wp-admin/setup-config.php create mode 100644 src/wp-admin/theme-editor.php create mode 100644 src/wp-admin/theme-install.php create mode 100644 src/wp-admin/themes.php create mode 100644 src/wp-admin/tools.php create mode 100644 src/wp-admin/update-core.php create mode 100644 src/wp-admin/update.php create mode 100644 src/wp-admin/upgrade-functions.php create mode 100644 src/wp-admin/upgrade.php create mode 100644 src/wp-admin/upload.php create mode 100644 src/wp-admin/user-edit.php create mode 100644 src/wp-admin/user-new.php create mode 100644 src/wp-admin/user/admin.php create mode 100644 src/wp-admin/user/index-extra.php create mode 100644 src/wp-admin/user/index.php create mode 100644 src/wp-admin/user/menu.php create mode 100644 src/wp-admin/user/profile.php create mode 100644 src/wp-admin/user/user-edit.php create mode 100644 src/wp-admin/users.php create mode 100644 src/wp-admin/widgets.php create mode 100644 src/wp-app.php create mode 100644 src/wp-atom.php create mode 100644 src/wp-blog-header.php create mode 100644 src/wp-comments-post.php create mode 100644 src/wp-commentsrss2.php create mode 100644 src/wp-config-sample.php create mode 100644 src/wp-config.php create mode 100644 src/wp-content/index.php create mode 100644 src/wp-content/languages/es_ES.mo create mode 100644 src/wp-content/languages/es_ES.po create mode 100644 src/wp-content/languages/ms-es_ES.mo create mode 100644 src/wp-content/languages/ms-es_ES.po create mode 100644 src/wp-content/plugins/akismet/admin.php create mode 100644 src/wp-content/plugins/akismet/akismet.css create mode 100644 src/wp-content/plugins/akismet/akismet.gif create mode 100644 src/wp-content/plugins/akismet/akismet.js create mode 100644 src/wp-content/plugins/akismet/akismet.php create mode 100644 src/wp-content/plugins/akismet/legacy.php create mode 100644 src/wp-content/plugins/akismet/readme.txt create mode 100644 src/wp-content/plugins/akismet/widget.php create mode 100644 src/wp-content/plugins/hello.php create mode 100644 src/wp-content/plugins/index.php create mode 100644 src/wp-content/themes/index.php create mode 100644 src/wp-content/themes/twentyeleven/404.php create mode 100644 src/wp-content/themes/twentyeleven/archive.php create mode 100644 src/wp-content/themes/twentyeleven/author.php create mode 100644 src/wp-content/themes/twentyeleven/category.php create mode 100644 src/wp-content/themes/twentyeleven/colors/dark.css create mode 100644 src/wp-content/themes/twentyeleven/comments.php create mode 100644 src/wp-content/themes/twentyeleven/content-aside.php create mode 100644 src/wp-content/themes/twentyeleven/content-featured.php create mode 100644 src/wp-content/themes/twentyeleven/content-gallery.php create mode 100644 src/wp-content/themes/twentyeleven/content-image.php create mode 100644 src/wp-content/themes/twentyeleven/content-intro.php create mode 100644 src/wp-content/themes/twentyeleven/content-link.php create mode 100644 src/wp-content/themes/twentyeleven/content-page.php create mode 100644 src/wp-content/themes/twentyeleven/content-quote.php create mode 100644 src/wp-content/themes/twentyeleven/content-single.php create mode 100644 src/wp-content/themes/twentyeleven/content-status.php create mode 100644 src/wp-content/themes/twentyeleven/content.php create mode 100644 src/wp-content/themes/twentyeleven/editor-style-rtl.css create mode 100644 src/wp-content/themes/twentyeleven/editor-style.css create mode 100644 src/wp-content/themes/twentyeleven/footer.php create mode 100644 src/wp-content/themes/twentyeleven/functions.php create mode 100644 src/wp-content/themes/twentyeleven/header.php create mode 100644 src/wp-content/themes/twentyeleven/image.php create mode 100644 src/wp-content/themes/twentyeleven/images/comment-arrow-bypostauthor-dark-rtl.png create mode 100644 src/wp-content/themes/twentyeleven/images/comment-arrow-bypostauthor-dark.png create mode 100644 src/wp-content/themes/twentyeleven/images/comment-arrow-bypostauthor-rtl.png create mode 100644 src/wp-content/themes/twentyeleven/images/comment-arrow-bypostauthor.png create mode 100644 src/wp-content/themes/twentyeleven/images/comment-arrow-dark-rtl.png create mode 100644 src/wp-content/themes/twentyeleven/images/comment-arrow-dark.png create mode 100644 src/wp-content/themes/twentyeleven/images/comment-arrow-rtl.png create mode 100644 src/wp-content/themes/twentyeleven/images/comment-arrow.png create mode 100644 src/wp-content/themes/twentyeleven/images/comment-bubble-dark-rtl.png create mode 100644 src/wp-content/themes/twentyeleven/images/comment-bubble-dark.png create mode 100644 src/wp-content/themes/twentyeleven/images/comment-bubble-rtl.png create mode 100644 src/wp-content/themes/twentyeleven/images/comment-bubble.png create mode 100644 src/wp-content/themes/twentyeleven/images/headers/chessboard-thumbnail.jpg create mode 100644 src/wp-content/themes/twentyeleven/images/headers/chessboard.jpg create mode 100644 src/wp-content/themes/twentyeleven/images/headers/hanoi-thumbnail.jpg create mode 100644 src/wp-content/themes/twentyeleven/images/headers/hanoi.jpg create mode 100644 src/wp-content/themes/twentyeleven/images/headers/lanterns-thumbnail.jpg create mode 100644 src/wp-content/themes/twentyeleven/images/headers/lanterns.jpg create mode 100644 src/wp-content/themes/twentyeleven/images/headers/pine-cone-thumbnail.jpg create mode 100644 src/wp-content/themes/twentyeleven/images/headers/pine-cone.jpg create mode 100644 src/wp-content/themes/twentyeleven/images/headers/shore-thumbnail.jpg create mode 100644 src/wp-content/themes/twentyeleven/images/headers/shore.jpg create mode 100644 src/wp-content/themes/twentyeleven/images/headers/trolley-thumbnail.jpg create mode 100644 src/wp-content/themes/twentyeleven/images/headers/trolley.jpg create mode 100644 src/wp-content/themes/twentyeleven/images/headers/wheel-thumbnail.jpg create mode 100644 src/wp-content/themes/twentyeleven/images/headers/wheel.jpg create mode 100644 src/wp-content/themes/twentyeleven/images/headers/willow-thumbnail.jpg create mode 100644 src/wp-content/themes/twentyeleven/images/headers/willow.jpg create mode 100644 src/wp-content/themes/twentyeleven/images/search.png create mode 100644 src/wp-content/themes/twentyeleven/images/wordpress.png create mode 100644 src/wp-content/themes/twentyeleven/inc/images/content-sidebar.png create mode 100644 src/wp-content/themes/twentyeleven/inc/images/content.png create mode 100644 src/wp-content/themes/twentyeleven/inc/images/dark.png create mode 100644 src/wp-content/themes/twentyeleven/inc/images/light.png create mode 100644 src/wp-content/themes/twentyeleven/inc/images/sidebar-content.png create mode 100644 src/wp-content/themes/twentyeleven/inc/theme-options.css create mode 100644 src/wp-content/themes/twentyeleven/inc/theme-options.js create mode 100644 src/wp-content/themes/twentyeleven/inc/theme-options.php create mode 100644 src/wp-content/themes/twentyeleven/inc/widgets.php create mode 100644 src/wp-content/themes/twentyeleven/index.php create mode 100644 src/wp-content/themes/twentyeleven/js/html5.js create mode 100644 src/wp-content/themes/twentyeleven/js/showcase.js create mode 100644 src/wp-content/themes/twentyeleven/languages/es_ES.mo create mode 100644 src/wp-content/themes/twentyeleven/languages/es_ES.po create mode 100644 src/wp-content/themes/twentyeleven/languages/twentyeleven.pot create mode 100644 src/wp-content/themes/twentyeleven/license.txt create mode 100644 src/wp-content/themes/twentyeleven/page.php create mode 100644 src/wp-content/themes/twentyeleven/readme.txt create mode 100644 src/wp-content/themes/twentyeleven/rtl.css create mode 100644 src/wp-content/themes/twentyeleven/screenshot.png create mode 100644 src/wp-content/themes/twentyeleven/search.php create mode 100644 src/wp-content/themes/twentyeleven/searchform.php create mode 100644 src/wp-content/themes/twentyeleven/showcase.php create mode 100644 src/wp-content/themes/twentyeleven/sidebar-footer.php create mode 100644 src/wp-content/themes/twentyeleven/sidebar-page.php create mode 100644 src/wp-content/themes/twentyeleven/sidebar.php create mode 100644 src/wp-content/themes/twentyeleven/single.php create mode 100644 src/wp-content/themes/twentyeleven/style.css create mode 100644 src/wp-content/themes/twentyeleven/tag.php create mode 100644 src/wp-content/themes/twentyten/404.php create mode 100644 src/wp-content/themes/twentyten/archive.php create mode 100644 src/wp-content/themes/twentyten/attachment.php create mode 100644 src/wp-content/themes/twentyten/author.php create mode 100644 src/wp-content/themes/twentyten/category.php create mode 100644 src/wp-content/themes/twentyten/comments.php create mode 100644 src/wp-content/themes/twentyten/editor-style-rtl.css create mode 100644 src/wp-content/themes/twentyten/editor-style.css create mode 100644 src/wp-content/themes/twentyten/footer.php create mode 100644 src/wp-content/themes/twentyten/functions.php create mode 100644 src/wp-content/themes/twentyten/header.php create mode 100644 src/wp-content/themes/twentyten/images/headers/berries-thumbnail.jpg create mode 100644 src/wp-content/themes/twentyten/images/headers/berries.jpg create mode 100644 src/wp-content/themes/twentyten/images/headers/cherryblossoms-thumbnail.jpg create mode 100644 src/wp-content/themes/twentyten/images/headers/cherryblossoms.jpg create mode 100644 src/wp-content/themes/twentyten/images/headers/concave-thumbnail.jpg create mode 100644 src/wp-content/themes/twentyten/images/headers/concave.jpg create mode 100644 src/wp-content/themes/twentyten/images/headers/fern-thumbnail.jpg create mode 100644 src/wp-content/themes/twentyten/images/headers/fern.jpg create mode 100644 src/wp-content/themes/twentyten/images/headers/forestfloor-thumbnail.jpg create mode 100644 src/wp-content/themes/twentyten/images/headers/forestfloor.jpg create mode 100644 src/wp-content/themes/twentyten/images/headers/inkwell-thumbnail.jpg create mode 100644 src/wp-content/themes/twentyten/images/headers/inkwell.jpg create mode 100644 src/wp-content/themes/twentyten/images/headers/path-thumbnail.jpg create mode 100644 src/wp-content/themes/twentyten/images/headers/path.jpg create mode 100644 src/wp-content/themes/twentyten/images/headers/sunset-thumbnail.jpg create mode 100644 src/wp-content/themes/twentyten/images/headers/sunset.jpg create mode 100644 src/wp-content/themes/twentyten/images/wordpress.png create mode 100644 src/wp-content/themes/twentyten/index.php create mode 100644 src/wp-content/themes/twentyten/languages/es_ES.mo create mode 100644 src/wp-content/themes/twentyten/languages/es_ES.po create mode 100644 src/wp-content/themes/twentyten/languages/twentyten.pot create mode 100644 src/wp-content/themes/twentyten/license.txt create mode 100644 src/wp-content/themes/twentyten/loop-attachment.php create mode 100644 src/wp-content/themes/twentyten/loop-page.php create mode 100644 src/wp-content/themes/twentyten/loop-single.php create mode 100644 src/wp-content/themes/twentyten/loop.php create mode 100644 src/wp-content/themes/twentyten/onecolumn-page.php create mode 100644 src/wp-content/themes/twentyten/page.php create mode 100644 src/wp-content/themes/twentyten/rtl.css create mode 100644 src/wp-content/themes/twentyten/screenshot.png create mode 100644 src/wp-content/themes/twentyten/search.php create mode 100644 src/wp-content/themes/twentyten/sidebar-footer.php create mode 100644 src/wp-content/themes/twentyten/sidebar.php create mode 100644 src/wp-content/themes/twentyten/single.php create mode 100644 src/wp-content/themes/twentyten/style.css create mode 100644 src/wp-content/themes/twentyten/tag.php create mode 100644 src/wp-cron.php create mode 100644 src/wp-feed.php create mode 100644 src/wp-includes/Text/Diff.php create mode 100644 src/wp-includes/Text/Diff/Engine/native.php create mode 100644 src/wp-includes/Text/Diff/Engine/shell.php create mode 100644 src/wp-includes/Text/Diff/Engine/string.php create mode 100644 src/wp-includes/Text/Diff/Engine/xdiff.php create mode 100644 src/wp-includes/Text/Diff/Renderer.php create mode 100644 src/wp-includes/Text/Diff/Renderer/inline.php create mode 100644 src/wp-includes/admin-bar.php create mode 100644 src/wp-includes/atomlib.php create mode 100644 src/wp-includes/author-template.php create mode 100644 src/wp-includes/bookmark-template.php create mode 100644 src/wp-includes/bookmark.php create mode 100644 src/wp-includes/cache.php create mode 100644 src/wp-includes/canonical.php create mode 100644 src/wp-includes/capabilities.php create mode 100644 src/wp-includes/category-template.php create mode 100644 src/wp-includes/category.php create mode 100644 src/wp-includes/class-IXR.php create mode 100644 src/wp-includes/class-feed.php create mode 100644 src/wp-includes/class-http.php create mode 100644 src/wp-includes/class-json.php create mode 100644 src/wp-includes/class-oembed.php create mode 100644 src/wp-includes/class-phpass.php create mode 100644 src/wp-includes/class-phpmailer.php create mode 100644 src/wp-includes/class-pop3.php create mode 100644 src/wp-includes/class-simplepie.php create mode 100644 src/wp-includes/class-smtp.php create mode 100644 src/wp-includes/class-snoopy.php create mode 100644 src/wp-includes/class-wp-admin-bar.php create mode 100644 src/wp-includes/class-wp-ajax-response.php create mode 100644 src/wp-includes/class-wp-error.php create mode 100644 src/wp-includes/class-wp-http-ixr-client.php create mode 100644 src/wp-includes/class-wp-walker.php create mode 100644 src/wp-includes/class-wp-xmlrpc-server.php create mode 100644 src/wp-includes/class-wp.php create mode 100644 src/wp-includes/class.wp-dependencies.php create mode 100644 src/wp-includes/class.wp-scripts.php create mode 100644 src/wp-includes/class.wp-styles.php create mode 100644 src/wp-includes/comment-template.php create mode 100644 src/wp-includes/comment.php create mode 100644 src/wp-includes/compat.php create mode 100644 src/wp-includes/cron.php create mode 100644 src/wp-includes/css/admin-bar-rtl.css create mode 100644 src/wp-includes/css/admin-bar-rtl.dev.css create mode 100644 src/wp-includes/css/admin-bar.css create mode 100644 src/wp-includes/css/admin-bar.dev.css create mode 100644 src/wp-includes/css/jquery-ui-dialog.css create mode 100644 src/wp-includes/css/jquery-ui-dialog.dev.css create mode 100644 src/wp-includes/default-constants.php create mode 100644 src/wp-includes/default-filters.php create mode 100644 src/wp-includes/default-widgets.php create mode 100644 src/wp-includes/deprecated.php create mode 100644 src/wp-includes/feed-atom-comments.php create mode 100644 src/wp-includes/feed-atom.php create mode 100644 src/wp-includes/feed-rdf.php create mode 100644 src/wp-includes/feed-rss.php create mode 100644 src/wp-includes/feed-rss2-comments.php create mode 100644 src/wp-includes/feed-rss2.php create mode 100644 src/wp-includes/feed.php create mode 100644 src/wp-includes/formatting.php create mode 100644 src/wp-includes/functions.php create mode 100644 src/wp-includes/functions.wp-scripts.php create mode 100644 src/wp-includes/functions.wp-styles.php create mode 100644 src/wp-includes/general-template.php create mode 100644 src/wp-includes/http.php create mode 100644 src/wp-includes/images/admin-bar-sprite-rtl.png create mode 100644 src/wp-includes/images/admin-bar-sprite.png create mode 100644 src/wp-includes/images/blank.gif create mode 100644 src/wp-includes/images/crystal/archive.png create mode 100644 src/wp-includes/images/crystal/audio.png create mode 100644 src/wp-includes/images/crystal/code.png create mode 100644 src/wp-includes/images/crystal/default.png create mode 100644 src/wp-includes/images/crystal/document.png create mode 100644 src/wp-includes/images/crystal/interactive.png create mode 100644 src/wp-includes/images/crystal/license.txt create mode 100644 src/wp-includes/images/crystal/spreadsheet.png create mode 100644 src/wp-includes/images/crystal/text.png create mode 100644 src/wp-includes/images/crystal/video.png create mode 100644 src/wp-includes/images/rss.png create mode 100644 src/wp-includes/images/smilies/icon_arrow.gif create mode 100644 src/wp-includes/images/smilies/icon_biggrin.gif create mode 100644 src/wp-includes/images/smilies/icon_confused.gif create mode 100644 src/wp-includes/images/smilies/icon_cool.gif create mode 100644 src/wp-includes/images/smilies/icon_cry.gif create mode 100644 src/wp-includes/images/smilies/icon_eek.gif create mode 100644 src/wp-includes/images/smilies/icon_evil.gif create mode 100644 src/wp-includes/images/smilies/icon_exclaim.gif create mode 100644 src/wp-includes/images/smilies/icon_idea.gif create mode 100644 src/wp-includes/images/smilies/icon_lol.gif create mode 100644 src/wp-includes/images/smilies/icon_mad.gif create mode 100644 src/wp-includes/images/smilies/icon_mrgreen.gif create mode 100644 src/wp-includes/images/smilies/icon_neutral.gif create mode 100644 src/wp-includes/images/smilies/icon_question.gif create mode 100644 src/wp-includes/images/smilies/icon_razz.gif create mode 100644 src/wp-includes/images/smilies/icon_redface.gif create mode 100644 src/wp-includes/images/smilies/icon_rolleyes.gif create mode 100644 src/wp-includes/images/smilies/icon_sad.gif create mode 100644 src/wp-includes/images/smilies/icon_smile.gif create mode 100644 src/wp-includes/images/smilies/icon_surprised.gif create mode 100644 src/wp-includes/images/smilies/icon_twisted.gif create mode 100644 src/wp-includes/images/smilies/icon_wink.gif create mode 100644 src/wp-includes/images/upload.png create mode 100644 src/wp-includes/images/wlw/wp-comments.png create mode 100644 src/wp-includes/images/wlw/wp-icon.png create mode 100644 src/wp-includes/images/wlw/wp-watermark.png create mode 100644 src/wp-includes/images/wpmini-blue.png create mode 100644 src/wp-includes/js/admin-bar.dev.js create mode 100644 src/wp-includes/js/admin-bar.js create mode 100644 src/wp-includes/js/autosave.dev.js create mode 100644 src/wp-includes/js/autosave.js create mode 100644 src/wp-includes/js/colorpicker.dev.js create mode 100644 src/wp-includes/js/colorpicker.js create mode 100644 src/wp-includes/js/comment-reply.dev.js create mode 100644 src/wp-includes/js/comment-reply.js create mode 100644 src/wp-includes/js/crop/cropper.css create mode 100644 src/wp-includes/js/crop/cropper.js create mode 100644 src/wp-includes/js/crop/marqueeHoriz.gif create mode 100644 src/wp-includes/js/crop/marqueeVert.gif create mode 100644 src/wp-includes/js/hoverIntent.dev.js create mode 100644 src/wp-includes/js/hoverIntent.js create mode 100644 src/wp-includes/js/imgareaselect/border-anim-h.gif create mode 100644 src/wp-includes/js/imgareaselect/border-anim-v.gif create mode 100644 src/wp-includes/js/imgareaselect/imgareaselect.css create mode 100644 src/wp-includes/js/imgareaselect/jquery.imgareaselect.dev.js create mode 100644 src/wp-includes/js/imgareaselect/jquery.imgareaselect.js create mode 100644 src/wp-includes/js/jcrop/Jcrop.gif create mode 100644 src/wp-includes/js/jcrop/jquery.Jcrop.css create mode 100644 src/wp-includes/js/jcrop/jquery.Jcrop.dev.js create mode 100644 src/wp-includes/js/jcrop/jquery.Jcrop.js create mode 100644 src/wp-includes/js/jquery/jquery.color.dev.js create mode 100644 src/wp-includes/js/jquery/jquery.color.js create mode 100644 src/wp-includes/js/jquery/jquery.form.dev.js create mode 100644 src/wp-includes/js/jquery/jquery.form.js create mode 100644 src/wp-includes/js/jquery/jquery.hotkeys.dev.js create mode 100644 src/wp-includes/js/jquery/jquery.hotkeys.js create mode 100644 src/wp-includes/js/jquery/jquery.js create mode 100644 src/wp-includes/js/jquery/jquery.query.js create mode 100644 src/wp-includes/js/jquery/jquery.schedule.js create mode 100644 src/wp-includes/js/jquery/jquery.serialize-object.js create mode 100644 src/wp-includes/js/jquery/jquery.table-hotkeys.dev.js create mode 100644 src/wp-includes/js/jquery/jquery.table-hotkeys.js create mode 100644 src/wp-includes/js/jquery/suggest.dev.js create mode 100644 src/wp-includes/js/jquery/suggest.js create mode 100644 src/wp-includes/js/jquery/ui.button.js create mode 100644 src/wp-includes/js/jquery/ui.core.js create mode 100644 src/wp-includes/js/jquery/ui.dialog.js create mode 100644 src/wp-includes/js/jquery/ui.draggable.js create mode 100644 src/wp-includes/js/jquery/ui.droppable.js create mode 100644 src/wp-includes/js/jquery/ui.mouse.js create mode 100644 src/wp-includes/js/jquery/ui.position.js create mode 100644 src/wp-includes/js/jquery/ui.resizable.js create mode 100644 src/wp-includes/js/jquery/ui.selectable.js create mode 100644 src/wp-includes/js/jquery/ui.sortable.js create mode 100644 src/wp-includes/js/jquery/ui.tabs.js create mode 100644 src/wp-includes/js/jquery/ui.widget.js create mode 100644 src/wp-includes/js/json2.dev.js create mode 100644 src/wp-includes/js/json2.js create mode 100644 src/wp-includes/js/l10n.dev.js create mode 100644 src/wp-includes/js/l10n.js create mode 100644 src/wp-includes/js/prototype.js create mode 100644 src/wp-includes/js/quicktags.dev.js create mode 100644 src/wp-includes/js/quicktags.js create mode 100644 src/wp-includes/js/scriptaculous/MIT-LICENSE create mode 100644 src/wp-includes/js/scriptaculous/builder.js create mode 100644 src/wp-includes/js/scriptaculous/controls.js create mode 100644 src/wp-includes/js/scriptaculous/dragdrop.js create mode 100644 src/wp-includes/js/scriptaculous/effects.js create mode 100644 src/wp-includes/js/scriptaculous/scriptaculous.js create mode 100644 src/wp-includes/js/scriptaculous/slider.js create mode 100644 src/wp-includes/js/scriptaculous/sound.js create mode 100644 src/wp-includes/js/scriptaculous/unittest.js create mode 100644 src/wp-includes/js/scriptaculous/wp-scriptaculous.js create mode 100644 src/wp-includes/js/swfobject.js create mode 100644 src/wp-includes/js/swfupload/handlers.dev.js create mode 100644 src/wp-includes/js/swfupload/handlers.js create mode 100644 src/wp-includes/js/swfupload/license.txt create mode 100644 src/wp-includes/js/swfupload/plugins/swfupload.cookies.js create mode 100644 src/wp-includes/js/swfupload/plugins/swfupload.queue.js create mode 100644 src/wp-includes/js/swfupload/plugins/swfupload.speed.js create mode 100644 src/wp-includes/js/swfupload/plugins/swfupload.swfobject.js create mode 100644 src/wp-includes/js/swfupload/swfupload-all.js create mode 100644 src/wp-includes/js/swfupload/swfupload.js create mode 100644 src/wp-includes/js/swfupload/swfupload.swf create mode 100644 src/wp-includes/js/thickbox/loadingAnimation.gif create mode 100644 src/wp-includes/js/thickbox/macFFBgHack.png create mode 100644 src/wp-includes/js/thickbox/tb-close.png create mode 100644 src/wp-includes/js/thickbox/thickbox.css create mode 100644 src/wp-includes/js/thickbox/thickbox.js create mode 100644 src/wp-includes/js/tinymce/langs/wp-langs-en.js create mode 100644 src/wp-includes/js/tinymce/langs/wp-langs.php create mode 100644 src/wp-includes/js/tinymce/license.txt create mode 100644 src/wp-includes/js/tinymce/plugins/directionality/editor_plugin.js create mode 100644 src/wp-includes/js/tinymce/plugins/fullscreen/editor_plugin.js create mode 100644 src/wp-includes/js/tinymce/plugins/fullscreen/fullscreen.htm create mode 100644 src/wp-includes/js/tinymce/plugins/inlinepopups/editor_plugin.js create mode 100644 src/wp-includes/js/tinymce/plugins/inlinepopups/skins/clearlooks2/img/alert.gif create mode 100644 src/wp-includes/js/tinymce/plugins/inlinepopups/skins/clearlooks2/img/button.gif create mode 100644 src/wp-includes/js/tinymce/plugins/inlinepopups/skins/clearlooks2/img/buttons.gif create mode 100644 src/wp-includes/js/tinymce/plugins/inlinepopups/skins/clearlooks2/img/confirm.gif create mode 100644 src/wp-includes/js/tinymce/plugins/inlinepopups/skins/clearlooks2/img/corners.gif create mode 100644 src/wp-includes/js/tinymce/plugins/inlinepopups/skins/clearlooks2/img/drag.gif create mode 100644 src/wp-includes/js/tinymce/plugins/inlinepopups/skins/clearlooks2/img/horizontal.gif create mode 100644 src/wp-includes/js/tinymce/plugins/inlinepopups/skins/clearlooks2/img/vertical.gif create mode 100644 src/wp-includes/js/tinymce/plugins/inlinepopups/skins/clearlooks2/window.css create mode 100644 src/wp-includes/js/tinymce/plugins/inlinepopups/template.htm create mode 100644 src/wp-includes/js/tinymce/plugins/media/css/media.css create mode 100644 src/wp-includes/js/tinymce/plugins/media/editor_plugin.js create mode 100644 src/wp-includes/js/tinymce/plugins/media/js/embed.js create mode 100644 src/wp-includes/js/tinymce/plugins/media/js/media.js create mode 100644 src/wp-includes/js/tinymce/plugins/media/media.htm create mode 100644 src/wp-includes/js/tinymce/plugins/media/moxieplayer.swf create mode 100644 src/wp-includes/js/tinymce/plugins/paste/blank.htm create mode 100644 src/wp-includes/js/tinymce/plugins/paste/editor_plugin.js create mode 100644 src/wp-includes/js/tinymce/plugins/paste/js/pastetext.js create mode 100644 src/wp-includes/js/tinymce/plugins/paste/js/pasteword.js create mode 100644 src/wp-includes/js/tinymce/plugins/paste/pastetext.htm create mode 100644 src/wp-includes/js/tinymce/plugins/paste/pasteword.htm create mode 100644 src/wp-includes/js/tinymce/plugins/spellchecker/changelog.txt create mode 100644 src/wp-includes/js/tinymce/plugins/spellchecker/classes/EnchantSpell.php create mode 100644 src/wp-includes/js/tinymce/plugins/spellchecker/classes/GoogleSpell.php create mode 100644 src/wp-includes/js/tinymce/plugins/spellchecker/classes/PSpell.php create mode 100644 src/wp-includes/js/tinymce/plugins/spellchecker/classes/PSpellShell.php create mode 100644 src/wp-includes/js/tinymce/plugins/spellchecker/classes/SpellChecker.php create mode 100644 src/wp-includes/js/tinymce/plugins/spellchecker/classes/utils/JSON.php create mode 100644 src/wp-includes/js/tinymce/plugins/spellchecker/classes/utils/Logger.php create mode 100644 src/wp-includes/js/tinymce/plugins/spellchecker/config.php create mode 100644 src/wp-includes/js/tinymce/plugins/spellchecker/css/content.css create mode 100644 src/wp-includes/js/tinymce/plugins/spellchecker/editor_plugin.js create mode 100644 src/wp-includes/js/tinymce/plugins/spellchecker/img/wline.gif create mode 100644 src/wp-includes/js/tinymce/plugins/spellchecker/includes/general.php create mode 100644 src/wp-includes/js/tinymce/plugins/spellchecker/rpc.php create mode 100644 src/wp-includes/js/tinymce/plugins/tabfocus/editor_plugin.js create mode 100644 src/wp-includes/js/tinymce/plugins/wordpress/css/content.css create mode 100644 src/wp-includes/js/tinymce/plugins/wordpress/editor_plugin.dev.js create mode 100644 src/wp-includes/js/tinymce/plugins/wordpress/editor_plugin.js create mode 100644 src/wp-includes/js/tinymce/plugins/wordpress/img/audio.gif create mode 100644 src/wp-includes/js/tinymce/plugins/wordpress/img/embedded.png create mode 100644 src/wp-includes/js/tinymce/plugins/wordpress/img/image.gif create mode 100644 src/wp-includes/js/tinymce/plugins/wordpress/img/media.gif create mode 100644 src/wp-includes/js/tinymce/plugins/wordpress/img/more_bug.gif create mode 100644 src/wp-includes/js/tinymce/plugins/wordpress/img/page.gif create mode 100644 src/wp-includes/js/tinymce/plugins/wordpress/img/page_bug.gif create mode 100644 src/wp-includes/js/tinymce/plugins/wordpress/img/trans.gif create mode 100644 src/wp-includes/js/tinymce/plugins/wordpress/img/video.gif create mode 100644 src/wp-includes/js/tinymce/plugins/wpdialogs/editor_plugin.dev.js create mode 100644 src/wp-includes/js/tinymce/plugins/wpdialogs/editor_plugin.js create mode 100644 src/wp-includes/js/tinymce/plugins/wpdialogs/js/popup.dev.js create mode 100644 src/wp-includes/js/tinymce/plugins/wpdialogs/js/popup.js create mode 100644 src/wp-includes/js/tinymce/plugins/wpdialogs/js/wpdialog.dev.js create mode 100644 src/wp-includes/js/tinymce/plugins/wpdialogs/js/wpdialog.js create mode 100644 src/wp-includes/js/tinymce/plugins/wpeditimage/css/editimage-rtl.css create mode 100644 src/wp-includes/js/tinymce/plugins/wpeditimage/css/editimage.css create mode 100644 src/wp-includes/js/tinymce/plugins/wpeditimage/editimage.html create mode 100644 src/wp-includes/js/tinymce/plugins/wpeditimage/editor_plugin.dev.js create mode 100644 src/wp-includes/js/tinymce/plugins/wpeditimage/editor_plugin.js create mode 100644 src/wp-includes/js/tinymce/plugins/wpeditimage/img/delete.png create mode 100644 src/wp-includes/js/tinymce/plugins/wpeditimage/img/image.png create mode 100644 src/wp-includes/js/tinymce/plugins/wpeditimage/js/editimage.dev.js create mode 100644 src/wp-includes/js/tinymce/plugins/wpeditimage/js/editimage.js create mode 100644 src/wp-includes/js/tinymce/plugins/wpfullscreen/css/wp-fullscreen.css create mode 100644 src/wp-includes/js/tinymce/plugins/wpfullscreen/editor_plugin.dev.js create mode 100644 src/wp-includes/js/tinymce/plugins/wpfullscreen/editor_plugin.js create mode 100644 src/wp-includes/js/tinymce/plugins/wpgallery/editor_plugin.dev.js create mode 100644 src/wp-includes/js/tinymce/plugins/wpgallery/editor_plugin.js create mode 100644 src/wp-includes/js/tinymce/plugins/wpgallery/img/delete.png create mode 100644 src/wp-includes/js/tinymce/plugins/wpgallery/img/edit.png create mode 100644 src/wp-includes/js/tinymce/plugins/wpgallery/img/gallery.png create mode 100644 src/wp-includes/js/tinymce/plugins/wpgallery/img/t.gif create mode 100644 src/wp-includes/js/tinymce/plugins/wplink/css/wplink-rtl.css create mode 100644 src/wp-includes/js/tinymce/plugins/wplink/css/wplink-rtl.dev.css create mode 100644 src/wp-includes/js/tinymce/plugins/wplink/css/wplink.css create mode 100644 src/wp-includes/js/tinymce/plugins/wplink/css/wplink.dev.css create mode 100644 src/wp-includes/js/tinymce/plugins/wplink/editor_plugin.dev.js create mode 100644 src/wp-includes/js/tinymce/plugins/wplink/editor_plugin.js create mode 100644 src/wp-includes/js/tinymce/plugins/wplink/img/toggle-arrow.png create mode 100644 src/wp-includes/js/tinymce/plugins/wplink/js/wplink.dev.js create mode 100644 src/wp-includes/js/tinymce/plugins/wplink/js/wplink.js create mode 100644 src/wp-includes/js/tinymce/themes/advanced/about.htm create mode 100644 src/wp-includes/js/tinymce/themes/advanced/anchor.htm create mode 100644 src/wp-includes/js/tinymce/themes/advanced/charmap.htm create mode 100644 src/wp-includes/js/tinymce/themes/advanced/color_picker.htm create mode 100644 src/wp-includes/js/tinymce/themes/advanced/editor_template.js create mode 100644 src/wp-includes/js/tinymce/themes/advanced/image.htm create mode 100644 src/wp-includes/js/tinymce/themes/advanced/img/colorpicker.jpg create mode 100644 src/wp-includes/js/tinymce/themes/advanced/img/flash.gif create mode 100644 src/wp-includes/js/tinymce/themes/advanced/img/gotmoxie.png create mode 100644 src/wp-includes/js/tinymce/themes/advanced/img/icons.gif create mode 100644 src/wp-includes/js/tinymce/themes/advanced/img/iframe.gif create mode 100644 src/wp-includes/js/tinymce/themes/advanced/img/pagebreak.gif create mode 100644 src/wp-includes/js/tinymce/themes/advanced/img/quicktime.gif create mode 100644 src/wp-includes/js/tinymce/themes/advanced/img/realmedia.gif create mode 100644 src/wp-includes/js/tinymce/themes/advanced/img/shockwave.gif create mode 100644 src/wp-includes/js/tinymce/themes/advanced/img/trans.gif create mode 100644 src/wp-includes/js/tinymce/themes/advanced/img/video.gif create mode 100644 src/wp-includes/js/tinymce/themes/advanced/img/windowsmedia.gif create mode 100644 src/wp-includes/js/tinymce/themes/advanced/img/wpicons.png create mode 100644 src/wp-includes/js/tinymce/themes/advanced/js/about.js create mode 100644 src/wp-includes/js/tinymce/themes/advanced/js/anchor.js create mode 100644 src/wp-includes/js/tinymce/themes/advanced/js/charmap.js create mode 100644 src/wp-includes/js/tinymce/themes/advanced/js/color_picker.js create mode 100644 src/wp-includes/js/tinymce/themes/advanced/js/image.js create mode 100644 src/wp-includes/js/tinymce/themes/advanced/js/link.js create mode 100644 src/wp-includes/js/tinymce/themes/advanced/js/source_editor.js create mode 100644 src/wp-includes/js/tinymce/themes/advanced/link.htm create mode 100644 src/wp-includes/js/tinymce/themes/advanced/shortcuts.htm create mode 100644 src/wp-includes/js/tinymce/themes/advanced/skins/default/content.css create mode 100644 src/wp-includes/js/tinymce/themes/advanced/skins/default/dialog.css create mode 100644 src/wp-includes/js/tinymce/themes/advanced/skins/default/img/buttons.png create mode 100644 src/wp-includes/js/tinymce/themes/advanced/skins/default/img/items.gif create mode 100644 src/wp-includes/js/tinymce/themes/advanced/skins/default/img/menu_arrow.gif create mode 100644 src/wp-includes/js/tinymce/themes/advanced/skins/default/img/menu_check.gif create mode 100644 src/wp-includes/js/tinymce/themes/advanced/skins/default/img/progress.gif create mode 100644 src/wp-includes/js/tinymce/themes/advanced/skins/default/img/tabs.gif create mode 100644 src/wp-includes/js/tinymce/themes/advanced/skins/default/ui.css create mode 100644 src/wp-includes/js/tinymce/themes/advanced/skins/highcontrast/content.css create mode 100644 src/wp-includes/js/tinymce/themes/advanced/skins/highcontrast/dialog.css create mode 100644 src/wp-includes/js/tinymce/themes/advanced/skins/highcontrast/ui.css create mode 100644 src/wp-includes/js/tinymce/themes/advanced/skins/o2k7/content.css create mode 100644 src/wp-includes/js/tinymce/themes/advanced/skins/o2k7/dialog.css create mode 100644 src/wp-includes/js/tinymce/themes/advanced/skins/o2k7/img/button_bg.png create mode 100644 src/wp-includes/js/tinymce/themes/advanced/skins/o2k7/img/button_bg_black.png create mode 100644 src/wp-includes/js/tinymce/themes/advanced/skins/o2k7/img/button_bg_silver.png create mode 100644 src/wp-includes/js/tinymce/themes/advanced/skins/o2k7/ui.css create mode 100644 src/wp-includes/js/tinymce/themes/advanced/skins/o2k7/ui_black.css create mode 100644 src/wp-includes/js/tinymce/themes/advanced/skins/o2k7/ui_silver.css create mode 100644 src/wp-includes/js/tinymce/themes/advanced/skins/wp_theme/content.css create mode 100644 src/wp-includes/js/tinymce/themes/advanced/skins/wp_theme/dialog.css create mode 100644 src/wp-includes/js/tinymce/themes/advanced/skins/wp_theme/img/butt2.png create mode 100644 src/wp-includes/js/tinymce/themes/advanced/skins/wp_theme/img/button_bg.png create mode 100644 src/wp-includes/js/tinymce/themes/advanced/skins/wp_theme/img/down_arrow.gif create mode 100644 src/wp-includes/js/tinymce/themes/advanced/skins/wp_theme/img/fade-butt.png create mode 100644 src/wp-includes/js/tinymce/themes/advanced/skins/wp_theme/img/separator.gif create mode 100644 src/wp-includes/js/tinymce/themes/advanced/skins/wp_theme/img/tabs.gif create mode 100644 src/wp-includes/js/tinymce/themes/advanced/skins/wp_theme/ui.css create mode 100644 src/wp-includes/js/tinymce/themes/advanced/source_editor.htm create mode 100644 src/wp-includes/js/tinymce/tiny_mce.js create mode 100644 src/wp-includes/js/tinymce/tiny_mce_popup.js create mode 100644 src/wp-includes/js/tinymce/utils/editable_selects.js create mode 100644 src/wp-includes/js/tinymce/utils/form_utils.js create mode 100644 src/wp-includes/js/tinymce/utils/mctabs.js create mode 100644 src/wp-includes/js/tinymce/utils/validate.js create mode 100644 src/wp-includes/js/tinymce/wp-mce-help.php create mode 100644 src/wp-includes/js/tinymce/wp-tinymce.js.gz create mode 100644 src/wp-includes/js/tinymce/wp-tinymce.php create mode 100644 src/wp-includes/js/tw-sack.dev.js create mode 100644 src/wp-includes/js/tw-sack.js create mode 100644 src/wp-includes/js/wp-ajax-response.dev.js create mode 100644 src/wp-includes/js/wp-ajax-response.js create mode 100644 src/wp-includes/js/wp-list-revisions.dev.js create mode 100644 src/wp-includes/js/wp-list-revisions.js create mode 100644 src/wp-includes/js/wp-lists.dev.js create mode 100644 src/wp-includes/js/wp-lists.js create mode 100644 src/wp-includes/kses.php create mode 100644 src/wp-includes/l10n.php create mode 100644 src/wp-includes/link-template.php create mode 100644 src/wp-includes/load.php create mode 100644 src/wp-includes/locale.php create mode 100644 src/wp-includes/media.php create mode 100644 src/wp-includes/meta.php create mode 100644 src/wp-includes/ms-blogs.php create mode 100644 src/wp-includes/ms-default-constants.php create mode 100644 src/wp-includes/ms-default-filters.php create mode 100644 src/wp-includes/ms-deprecated.php create mode 100644 src/wp-includes/ms-files.php create mode 100644 src/wp-includes/ms-functions.php create mode 100644 src/wp-includes/ms-load.php create mode 100644 src/wp-includes/ms-settings.php create mode 100644 src/wp-includes/nav-menu-template.php create mode 100644 src/wp-includes/nav-menu.php create mode 100644 src/wp-includes/pluggable-deprecated.php create mode 100644 src/wp-includes/pluggable.php create mode 100644 src/wp-includes/plugin.php create mode 100644 src/wp-includes/pomo/entry.php create mode 100644 src/wp-includes/pomo/mo.php create mode 100644 src/wp-includes/pomo/po.php create mode 100644 src/wp-includes/pomo/streams.php create mode 100644 src/wp-includes/pomo/translations.php create mode 100644 src/wp-includes/post-template.php create mode 100644 src/wp-includes/post-thumbnail-template.php create mode 100644 src/wp-includes/post.php create mode 100644 src/wp-includes/query.php create mode 100644 src/wp-includes/registration-functions.php create mode 100644 src/wp-includes/registration.php create mode 100644 src/wp-includes/rewrite.php create mode 100644 src/wp-includes/rss-functions.php create mode 100644 src/wp-includes/rss.php create mode 100644 src/wp-includes/script-loader.php create mode 100644 src/wp-includes/shortcodes.php create mode 100644 src/wp-includes/taxonomy.php create mode 100644 src/wp-includes/template-loader.php create mode 100644 src/wp-includes/theme-compat/comments-popup.php create mode 100644 src/wp-includes/theme-compat/comments.php create mode 100644 src/wp-includes/theme-compat/footer.php create mode 100644 src/wp-includes/theme-compat/header.php create mode 100644 src/wp-includes/theme-compat/sidebar.php create mode 100644 src/wp-includes/theme.php create mode 100644 src/wp-includes/update.php create mode 100644 src/wp-includes/user.php create mode 100644 src/wp-includes/vars.php create mode 100644 src/wp-includes/version.php create mode 100644 src/wp-includes/widgets.php create mode 100644 src/wp-includes/wlwmanifest.xml create mode 100644 src/wp-includes/wp-db.php create mode 100644 src/wp-includes/wp-diff.php create mode 100644 src/wp-links-opml.php create mode 100644 src/wp-load.php create mode 100644 src/wp-login.php create mode 100644 src/wp-mail.php create mode 100644 src/wp-pass.php create mode 100644 src/wp-rdf.php create mode 100644 src/wp-register.php create mode 100644 src/wp-rss.php create mode 100644 src/wp-rss2.php create mode 100644 src/wp-settings.php create mode 100644 src/wp-signup.php create mode 100644 src/wp-trackback.php create mode 100644 src/xmlrpc.php diff --git a/db/afetec.sql b/db/afetec.sql new file mode 100644 index 0000000..7dc2179 --- /dev/null +++ b/db/afetec.sql @@ -0,0 +1,509 @@ +-- phpMyAdmin SQL Dump +-- version 3.4.5 +-- http://www.phpmyadmin.net +-- +-- Servidor: localhost +-- Tiempo de generación: 20-10-2011 a las 18:54:03 +-- Versión del servidor: 5.5.16 +-- Versión de PHP: 5.3.8 + +SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO"; +SET time_zone = "+00:00"; + + +/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; +/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; +/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; +/*!40101 SET NAMES utf8 */; + +-- +-- Base de datos: `afetec` +-- + +-- -------------------------------------------------------- + +-- +-- Estructura de tabla para la tabla `wpr3ss_commentmeta` +-- + +CREATE TABLE IF NOT EXISTS `wpr3ss_commentmeta` ( + `meta_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, + `comment_id` bigint(20) unsigned NOT NULL DEFAULT '0', + `meta_key` varchar(255) DEFAULT NULL, + `meta_value` longtext, + PRIMARY KEY (`meta_id`), + KEY `comment_id` (`comment_id`), + KEY `meta_key` (`meta_key`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Estructura de tabla para la tabla `wpr3ss_comments` +-- + +CREATE TABLE IF NOT EXISTS `wpr3ss_comments` ( + `comment_ID` bigint(20) unsigned NOT NULL AUTO_INCREMENT, + `comment_post_ID` bigint(20) unsigned NOT NULL DEFAULT '0', + `comment_author` tinytext NOT NULL, + `comment_author_email` varchar(100) NOT NULL DEFAULT '', + `comment_author_url` varchar(200) NOT NULL DEFAULT '', + `comment_author_IP` varchar(100) NOT NULL DEFAULT '', + `comment_date` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', + `comment_date_gmt` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', + `comment_content` text NOT NULL, + `comment_karma` int(11) NOT NULL DEFAULT '0', + `comment_approved` varchar(20) NOT NULL DEFAULT '1', + `comment_agent` varchar(255) NOT NULL DEFAULT '', + `comment_type` varchar(20) NOT NULL DEFAULT '', + `comment_parent` bigint(20) unsigned NOT NULL DEFAULT '0', + `user_id` bigint(20) unsigned NOT NULL DEFAULT '0', + PRIMARY KEY (`comment_ID`), + KEY `comment_approved` (`comment_approved`), + KEY `comment_post_ID` (`comment_post_ID`), + KEY `comment_approved_date_gmt` (`comment_approved`,`comment_date_gmt`), + KEY `comment_date_gmt` (`comment_date_gmt`), + KEY `comment_parent` (`comment_parent`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=2 ; + +-- +-- Volcado de datos para la tabla `wpr3ss_comments` +-- + +INSERT INTO `wpr3ss_comments` (`comment_ID`, `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`) VALUES +(1, 1, 'Sr WordPress', '', 'http://wordpress.org/', '', '2011-10-20 18:53:37', '2011-10-20 18:53:37', 'Hola, esto es un comentario.
Para borrar un comentario sólo tienes que entrar y ver los comentarios de la entrada. Entonces tendrás la opción de editar o borrar.', 0, '1', '', '', 0, 0); + +-- -------------------------------------------------------- + +-- +-- Estructura de tabla para la tabla `wpr3ss_links` +-- + +CREATE TABLE IF NOT EXISTS `wpr3ss_links` ( + `link_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, + `link_url` varchar(255) NOT NULL DEFAULT '', + `link_name` varchar(255) NOT NULL DEFAULT '', + `link_image` varchar(255) NOT NULL DEFAULT '', + `link_target` varchar(25) NOT NULL DEFAULT '', + `link_description` varchar(255) NOT NULL DEFAULT '', + `link_visible` varchar(20) NOT NULL DEFAULT 'Y', + `link_owner` bigint(20) unsigned NOT NULL DEFAULT '1', + `link_rating` int(11) NOT NULL DEFAULT '0', + `link_updated` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', + `link_rel` varchar(255) NOT NULL DEFAULT '', + `link_notes` mediumtext NOT NULL, + `link_rss` varchar(255) NOT NULL DEFAULT '', + PRIMARY KEY (`link_id`), + KEY `link_visible` (`link_visible`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=8 ; + +-- +-- Volcado de datos para la tabla `wpr3ss_links` +-- + +INSERT INTO `wpr3ss_links` (`link_id`, `link_url`, `link_name`, `link_image`, `link_target`, `link_description`, `link_visible`, `link_owner`, `link_rating`, `link_updated`, `link_rel`, `link_notes`, `link_rss`) VALUES +(1, 'http://codex.wordpress.org/', 'Documentation', '', '', '', 'Y', 1, 0, '0000-00-00 00:00:00', '', '', ''), +(2, 'http://wordpress.org/news/', 'WordPress Blog', '', '', '', 'Y', 1, 0, '0000-00-00 00:00:00', '', '', 'http://wordpress.org/news/feed/'), +(3, 'http://wordpress.org/extend/ideas/', 'Suggest Ideas', '', '', '', 'Y', 1, 0, '0000-00-00 00:00:00', '', '', ''), +(4, 'http://wordpress.org/support/', 'Support Forum', '', '', '', 'Y', 1, 0, '0000-00-00 00:00:00', '', '', ''), +(5, 'http://wordpress.org/extend/plugins/', 'Plugins', '', '', '', 'Y', 1, 0, '0000-00-00 00:00:00', '', '', ''), +(6, 'http://wordpress.org/extend/themes/', 'Themes', '', '', '', 'Y', 1, 0, '0000-00-00 00:00:00', '', '', ''), +(7, 'http://planet.wordpress.org/', 'WordPress Planet', '', '', '', 'Y', 1, 0, '0000-00-00 00:00:00', '', '', ''); + +-- -------------------------------------------------------- + +-- +-- Estructura de tabla para la tabla `wpr3ss_options` +-- + +CREATE TABLE IF NOT EXISTS `wpr3ss_options` ( + `option_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, + `blog_id` int(11) NOT NULL DEFAULT '0', + `option_name` varchar(64) NOT NULL DEFAULT '', + `option_value` longtext NOT NULL, + `autoload` varchar(20) NOT NULL DEFAULT 'yes', + PRIMARY KEY (`option_id`), + UNIQUE KEY `option_name` (`option_name`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=155 ; + +-- +-- Volcado de datos para la tabla `wpr3ss_options` +-- + +INSERT INTO `wpr3ss_options` (`option_id`, `blog_id`, `option_name`, `option_value`, `autoload`) VALUES +(1, 0, 'siteurl', 'http://localhost/afetec', 'yes'), +(2, 0, 'blogname', 'Afetec', 'yes'), +(3, 0, 'blogdescription', 'Otro sitio realizado con WordPress', 'yes'), +(4, 0, 'users_can_register', '0', 'yes'), +(5, 0, 'admin_email', 'darranz@rodax-software.com', 'yes'), +(6, 0, 'start_of_week', '1', 'yes'), +(7, 0, 'use_balanceTags', '0', 'yes'), +(8, 0, 'use_smilies', '1', 'yes'), +(9, 0, 'require_name_email', '1', 'yes'), +(10, 0, 'comments_notify', '1', 'yes'), +(11, 0, 'posts_per_rss', '10', 'yes'), +(12, 0, 'rss_use_excerpt', '0', 'yes'), +(13, 0, 'mailserver_url', 'mail.example.com', 'yes'), +(14, 0, 'mailserver_login', 'login@example.com', 'yes'), +(15, 0, 'mailserver_pass', 'password', 'yes'), +(16, 0, 'mailserver_port', '110', 'yes'), +(17, 0, 'default_category', '1', 'yes'), +(18, 0, 'default_comment_status', 'open', 'yes'), +(19, 0, 'default_ping_status', 'open', 'yes'), +(20, 0, 'default_pingback_flag', '1', 'yes'), +(21, 0, 'default_post_edit_rows', '20', 'yes'), +(22, 0, 'posts_per_page', '10', 'yes'), +(23, 0, 'date_format', 'j F, Y', 'yes'), +(24, 0, 'time_format', 'G:i', 'yes'), +(25, 0, 'links_updated_date_format', 'j F, Y G:i', 'yes'), +(26, 0, 'links_recently_updated_prepend', '', 'yes'), +(27, 0, 'links_recently_updated_append', '', 'yes'), +(28, 0, 'links_recently_updated_time', '120', 'yes'), +(29, 0, 'comment_moderation', '0', 'yes'), +(30, 0, 'moderation_notify', '1', 'yes'), +(31, 0, 'permalink_structure', '', 'yes'), +(32, 0, 'gzipcompression', '0', 'yes'), +(33, 0, 'hack_file', '0', 'yes'), +(34, 0, 'blog_charset', 'UTF-8', 'yes'), +(35, 0, 'moderation_keys', '', 'no'), +(36, 0, 'active_plugins', 'a:0:{}', 'yes'), +(37, 0, 'home', 'http://localhost/afetec', 'yes'), +(38, 0, 'category_base', '', 'yes'), +(39, 0, 'ping_sites', 'http://rpc.pingomatic.com/', 'yes'), +(40, 0, 'advanced_edit', '0', 'yes'), +(41, 0, 'comment_max_links', '2', 'yes'), +(42, 0, 'gmt_offset', '0', 'yes'), +(43, 0, 'default_email_category', '1', 'yes'), +(44, 0, 'recently_edited', '', 'no'), +(45, 0, 'template', 'twentyeleven', 'yes'), +(46, 0, 'stylesheet', 'twentyeleven', 'yes'), +(47, 0, 'comment_whitelist', '1', 'yes'), +(48, 0, 'blacklist_keys', '', 'no'), +(49, 0, 'comment_registration', '0', 'yes'), +(50, 0, 'rss_language', 'en', 'yes'), +(51, 0, 'html_type', 'text/html', 'yes'), +(52, 0, 'use_trackback', '0', 'yes'), +(53, 0, 'default_role', 'subscriber', 'yes'), +(54, 0, 'db_version', '18226', 'yes'), +(55, 0, 'uploads_use_yearmonth_folders', '1', 'yes'), +(56, 0, 'upload_path', '', 'yes'), +(57, 0, 'blog_public', '1', 'yes'), +(58, 0, 'default_link_category', '2', 'yes'), +(59, 0, 'show_on_front', 'posts', 'yes'), +(60, 0, 'tag_base', '', 'yes'), +(61, 0, 'show_avatars', '1', 'yes'), +(62, 0, 'avatar_rating', 'G', 'yes'), +(63, 0, 'upload_url_path', '', 'yes'), +(64, 0, 'thumbnail_size_w', '150', 'yes'), +(65, 0, 'thumbnail_size_h', '150', 'yes'), +(66, 0, 'thumbnail_crop', '1', 'yes'), +(67, 0, 'medium_size_w', '300', 'yes'), +(68, 0, 'medium_size_h', '300', 'yes'), +(69, 0, 'avatar_default', 'mystery', 'yes'), +(70, 0, 'enable_app', '0', 'yes'), +(71, 0, 'enable_xmlrpc', '0', 'yes'), +(72, 0, 'large_size_w', '1024', 'yes'), +(73, 0, 'large_size_h', '1024', 'yes'), +(74, 0, 'image_default_link_type', 'file', 'yes'), +(75, 0, 'image_default_size', '', 'yes'), +(76, 0, 'image_default_align', '', 'yes'), +(77, 0, 'close_comments_for_old_posts', '0', 'yes'), +(78, 0, 'close_comments_days_old', '14', 'yes'), +(79, 0, 'thread_comments', '1', 'yes'), +(80, 0, 'thread_comments_depth', '5', 'yes'), +(81, 0, 'page_comments', '0', 'yes'), +(82, 0, 'comments_per_page', '50', 'yes'), +(83, 0, 'default_comments_page', 'newest', 'yes'), +(84, 0, 'comment_order', 'asc', 'yes'), +(85, 0, 'sticky_posts', 'a:0:{}', 'yes'), +(86, 0, 'widget_categories', 'a:2:{i:2;a:4:{s:5:"title";s:0:"";s:5:"count";i:0;s:12:"hierarchical";i:0;s:8:"dropdown";i:0;}s:12:"_multiwidget";i:1;}', 'yes'), +(87, 0, 'widget_text', 'a:2:{i:2;a:0:{}s:12:"_multiwidget";i:1;}', 'yes'), +(88, 0, 'widget_rss', 'a:2:{i:2;a:0:{}s:12:"_multiwidget";i:1;}', 'yes'), +(89, 0, 'timezone_string', '', 'yes'), +(90, 0, 'embed_autourls', '1', 'yes'), +(91, 0, 'embed_size_w', '', 'yes'), +(92, 0, 'embed_size_h', '600', 'yes'), +(93, 0, 'page_for_posts', '0', 'yes'), +(94, 0, 'page_on_front', '0', 'yes'), +(95, 0, 'default_post_format', '0', 'yes'), +(96, 0, 'wpr3ss_user_roles', 'a:5:{s:13:"administrator";a:2:{s:4:"name";s:13:"Administrator";s:12:"capabilities";a:62:{s:13:"switch_themes";b:1;s:11:"edit_themes";b:1;s:16:"activate_plugins";b:1;s:12:"edit_plugins";b:1;s:10:"edit_users";b:1;s:10:"edit_files";b:1;s:14:"manage_options";b:1;s:17:"moderate_comments";b:1;s:17:"manage_categories";b:1;s:12:"manage_links";b:1;s:12:"upload_files";b:1;s:6:"import";b:1;s:15:"unfiltered_html";b:1;s:10:"edit_posts";b:1;s:17:"edit_others_posts";b:1;s:20:"edit_published_posts";b:1;s:13:"publish_posts";b:1;s:10:"edit_pages";b:1;s:4:"read";b:1;s:8:"level_10";b:1;s:7:"level_9";b:1;s:7:"level_8";b:1;s:7:"level_7";b:1;s:7:"level_6";b:1;s:7:"level_5";b:1;s:7:"level_4";b:1;s:7:"level_3";b:1;s:7:"level_2";b:1;s:7:"level_1";b:1;s:7:"level_0";b:1;s:17:"edit_others_pages";b:1;s:20:"edit_published_pages";b:1;s:13:"publish_pages";b:1;s:12:"delete_pages";b:1;s:19:"delete_others_pages";b:1;s:22:"delete_published_pages";b:1;s:12:"delete_posts";b:1;s:19:"delete_others_posts";b:1;s:22:"delete_published_posts";b:1;s:20:"delete_private_posts";b:1;s:18:"edit_private_posts";b:1;s:18:"read_private_posts";b:1;s:20:"delete_private_pages";b:1;s:18:"edit_private_pages";b:1;s:18:"read_private_pages";b:1;s:12:"delete_users";b:1;s:12:"create_users";b:1;s:17:"unfiltered_upload";b:1;s:14:"edit_dashboard";b:1;s:14:"update_plugins";b:1;s:14:"delete_plugins";b:1;s:15:"install_plugins";b:1;s:13:"update_themes";b:1;s:14:"install_themes";b:1;s:11:"update_core";b:1;s:10:"list_users";b:1;s:12:"remove_users";b:1;s:9:"add_users";b:1;s:13:"promote_users";b:1;s:18:"edit_theme_options";b:1;s:13:"delete_themes";b:1;s:6:"export";b:1;}}s:6:"editor";a:2:{s:4:"name";s:6:"Editor";s:12:"capabilities";a:34:{s:17:"moderate_comments";b:1;s:17:"manage_categories";b:1;s:12:"manage_links";b:1;s:12:"upload_files";b:1;s:15:"unfiltered_html";b:1;s:10:"edit_posts";b:1;s:17:"edit_others_posts";b:1;s:20:"edit_published_posts";b:1;s:13:"publish_posts";b:1;s:10:"edit_pages";b:1;s:4:"read";b:1;s:7:"level_7";b:1;s:7:"level_6";b:1;s:7:"level_5";b:1;s:7:"level_4";b:1;s:7:"level_3";b:1;s:7:"level_2";b:1;s:7:"level_1";b:1;s:7:"level_0";b:1;s:17:"edit_others_pages";b:1;s:20:"edit_published_pages";b:1;s:13:"publish_pages";b:1;s:12:"delete_pages";b:1;s:19:"delete_others_pages";b:1;s:22:"delete_published_pages";b:1;s:12:"delete_posts";b:1;s:19:"delete_others_posts";b:1;s:22:"delete_published_posts";b:1;s:20:"delete_private_posts";b:1;s:18:"edit_private_posts";b:1;s:18:"read_private_posts";b:1;s:20:"delete_private_pages";b:1;s:18:"edit_private_pages";b:1;s:18:"read_private_pages";b:1;}}s:6:"author";a:2:{s:4:"name";s:6:"Author";s:12:"capabilities";a:10:{s:12:"upload_files";b:1;s:10:"edit_posts";b:1;s:20:"edit_published_posts";b:1;s:13:"publish_posts";b:1;s:4:"read";b:1;s:7:"level_2";b:1;s:7:"level_1";b:1;s:7:"level_0";b:1;s:12:"delete_posts";b:1;s:22:"delete_published_posts";b:1;}}s:11:"contributor";a:2:{s:4:"name";s:11:"Contributor";s:12:"capabilities";a:5:{s:10:"edit_posts";b:1;s:4:"read";b:1;s:7:"level_1";b:1;s:7:"level_0";b:1;s:12:"delete_posts";b:1;}}s:10:"subscriber";a:2:{s:4:"name";s:10:"Subscriber";s:12:"capabilities";a:2:{s:4:"read";b:1;s:7:"level_0";b:1;}}}', 'yes'), +(97, 0, 'widget_search', 'a:2:{i:2;a:1:{s:5:"title";s:0:"";}s:12:"_multiwidget";i:1;}', 'yes'), +(98, 0, 'widget_recent-posts', 'a:2:{i:2;a:2:{s:5:"title";s:0:"";s:6:"number";i:5;}s:12:"_multiwidget";i:1;}', 'yes'), +(99, 0, 'widget_recent-comments', 'a:2:{i:2;a:2:{s:5:"title";s:0:"";s:6:"number";i:5;}s:12:"_multiwidget";i:1;}', 'yes'), +(100, 0, 'widget_archives', 'a:2:{i:2;a:3:{s:5:"title";s:0:"";s:5:"count";i:0;s:8:"dropdown";i:0;}s:12:"_multiwidget";i:1;}', 'yes'), +(101, 0, 'widget_meta', 'a:2:{i:2;a:1:{s:5:"title";s:0:"";}s:12:"_multiwidget";i:1;}', 'yes'), +(102, 0, 'sidebars_widgets', 'a:8:{s:19:"wp_inactive_widgets";a:0:{}s:19:"primary-widget-area";a:6:{i:0;s:8:"search-2";i:1;s:14:"recent-posts-2";i:2;s:17:"recent-comments-2";i:3;s:10:"archives-2";i:4;s:12:"categories-2";i:5;s:6:"meta-2";}s:21:"secondary-widget-area";a:0:{}s:24:"first-footer-widget-area";a:0:{}s:25:"second-footer-widget-area";a:0:{}s:24:"third-footer-widget-area";a:0:{}s:25:"fourth-footer-widget-area";a:0:{}s:13:"array_version";i:3;}', 'yes'), +(103, 0, 'cron', 'a:3:{i:1319136827;a:1:{s:19:"wp_scheduled_delete";a:1:{s:32:"40cd750bba9870f18aada2478b24840a";a:3:{s:8:"schedule";s:5:"daily";s:4:"args";a:0:{}s:8:"interval";i:86400;}}}i:1319180020;a:3:{s:16:"wp_version_check";a:1:{s:32:"40cd750bba9870f18aada2478b24840a";a:3:{s:8:"schedule";s:10:"twicedaily";s:4:"args";a:0:{}s:8:"interval";i:43200;}}s:17:"wp_update_plugins";a:1:{s:32:"40cd750bba9870f18aada2478b24840a";a:3:{s:8:"schedule";s:10:"twicedaily";s:4:"args";a:0:{}s:8:"interval";i:43200;}}s:16:"wp_update_themes";a:1:{s:32:"40cd750bba9870f18aada2478b24840a";a:3:{s:8:"schedule";s:10:"twicedaily";s:4:"args";a:0:{}s:8:"interval";i:43200;}}}s:7:"version";i:2;}', 'yes'), +(104, 0, '_transient_doing_cron', '1319136823', 'yes'), +(105, 0, '_site_transient_update_core', 'O:8:"stdClass":3:{s:7:"updates";a:2:{i:0;O:8:"stdClass":9:{s:8:"response";s:6:"latest";s:8:"download";s:49:"http://es.wordpress.org/wordpress-3.2.1-es_ES.zip";s:6:"locale";s:5:"es_ES";s:8:"packages";O:8:"stdClass":4:{s:4:"full";s:49:"http://es.wordpress.org/wordpress-3.2.1-es_ES.zip";s:10:"no_content";b:0;s:11:"new_bundled";b:0;s:7:"partial";b:0;}s:7:"current";s:5:"3.2.1";s:11:"php_version";s:5:"5.2.4";s:13:"mysql_version";s:3:"5.0";s:11:"new_bundled";s:3:"3.2";s:15:"partial_version";s:0:"";}i:1;O:8:"stdClass":9:{s:8:"response";s:6:"latest";s:8:"download";s:40:"http://wordpress.org/wordpress-3.2.1.zip";s:6:"locale";s:5:"en_US";s:8:"packages";O:8:"stdClass":4:{s:4:"full";s:40:"http://wordpress.org/wordpress-3.2.1.zip";s:10:"no_content";s:51:"http://wordpress.org/wordpress-3.2.1-no-content.zip";s:11:"new_bundled";s:52:"http://wordpress.org/wordpress-3.2.1-new-bundled.zip";s:7:"partial";b:0;}s:7:"current";s:5:"3.2.1";s:11:"php_version";s:5:"5.2.4";s:13:"mysql_version";s:3:"5.0";s:11:"new_bundled";s:3:"3.2";s:15:"partial_version";s:0:"";}}s:12:"last_checked";i:1319136824;s:15:"version_checked";s:5:"3.2.1";}', 'yes'), +(106, 0, '_site_transient_update_plugins', 'O:8:"stdClass":3:{s:12:"last_checked";i:1319136824;s:7:"checked";a:2:{s:19:"akismet/akismet.php";s:5:"2.5.3";s:9:"hello.php";s:3:"1.6";}s:8:"response";a:0:{}}', 'yes'), +(107, 0, 'widget_pages', 'a:2:{i:2;a:0:{}s:12:"_multiwidget";i:1;}', 'yes'), +(108, 0, 'widget_calendar', 'a:2:{i:2;a:0:{}s:12:"_multiwidget";i:1;}', 'yes'), +(109, 0, 'widget_links', 'a:2:{i:2;a:0:{}s:12:"_multiwidget";i:1;}', 'yes'), +(110, 0, 'widget_tag_cloud', 'a:2:{i:2;a:0:{}s:12:"_multiwidget";i:1;}', 'yes'), +(111, 0, 'widget_nav_menu', 'a:2:{i:2;a:0:{}s:12:"_multiwidget";i:1;}', 'yes'), +(112, 0, 'widget_widget_twentyeleven_ephemera', 'a:2:{i:2;a:0:{}s:12:"_multiwidget";i:1;}', 'yes'), +(113, 0, '_site_transient_timeout_theme_roots', '1319144025', 'yes'), +(114, 0, '_site_transient_theme_roots', 'a:2:{s:12:"twentyeleven";s:7:"/themes";s:9:"twentyten";s:7:"/themes";}', 'yes'), +(115, 0, '_site_transient_update_themes', 'O:8:"stdClass":3:{s:12:"last_checked";i:1319136826;s:7:"checked";a:2:{s:12:"twentyeleven";s:3:"1.2";s:9:"twentyten";s:3:"1.2";}s:8:"response";a:0:{}}', 'yes'), +(116, 0, '_site_transient_timeout_browser_1d20bd6665726e17a497435a4952284d', '1319741626', 'yes'), +(117, 0, '_site_transient_browser_1d20bd6665726e17a497435a4952284d', 'a:9:{s:8:"platform";s:7:"Windows";s:4:"name";s:7:"Firefox";s:7:"version";s:5:"7.0.1";s:10:"update_url";s:23:"http://www.firefox.com/";s:7:"img_src";s:50:"http://s.wordpress.org/images/browsers/firefox.png";s:11:"img_src_ssl";s:49:"https://wordpress.org/images/browsers/firefox.png";s:15:"current_version";s:1:"6";s:7:"upgrade";b:0;s:8:"insecure";b:0;}', 'yes'), +(118, 0, 'dashboard_widget_options', 'a:4:{s:25:"dashboard_recent_comments";a:1:{s:5:"items";i:5;}s:24:"dashboard_incoming_links";a:5:{s:4:"home";s:23:"http://localhost/afetec";s:4:"link";s:99:"http://blogsearch.google.com/blogsearch?scoring=d&partner=wordpress&q=link:http://localhost/afetec/";s:3:"url";s:132:"http://blogsearch.google.com/blogsearch_feeds?scoring=d&ie=utf-8&num=10&output=rss&partner=wordpress&q=link:http://localhost/afetec/";s:5:"items";i:10;s:9:"show_date";b:0;}s:17:"dashboard_primary";a:7:{s:4:"link";s:26:"http://wordpress.org/news/";s:3:"url";s:31:"http://wordpress.org/news/feed/";s:5:"title";s:22:"Blog oficial WordPress";s:5:"items";i:2;s:12:"show_summary";i:1;s:11:"show_author";i:0;s:9:"show_date";i:1;}s:19:"dashboard_secondary";a:7:{s:4:"link";s:28:"http://planet.wordpress.org/";s:3:"url";s:33:"http://planet.wordpress.org/feed/";s:5:"title";s:30:"Otras noticias sobre WordPress";s:5:"items";i:5;s:12:"show_summary";i:0;s:11:"show_author";i:0;s:9:"show_date";i:0;}}', 'yes'), +(119, 0, 'current_theme', 'Twenty Eleven', 'yes'), +(120, 0, 'can_compress_scripts', '1', 'yes'), +(121, 0, '_transient_timeout_feed_17b4621cc308bf021dbb467ab991abcf', '1319180029', 'no'), +(122, 0, '_transient_feed_17b4621cc308bf021dbb467ab991abcf', 'a:4:{s:5:"child";a:1:{s:0:"";a:1:{s:3:"rss";a:1:{i:0;a:6:{s:4:"data";s:4:"\n \n";s:7:"attribs";a:1:{s:0:"";a:1:{s:7:"version";s:3:"2.0";}}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";s:5:"child";a:1:{s:0:"";a:1:{s:7:"channel";a:1:{i:0;a:6:{s:4:"data";s:33:"\n \n \n \n \n \n \n ";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";s:5:"child";a:2:{s:0:"";a:3:{s:5:"title";a:1:{i:0;a:5:{s:4:"data";s:50:"link:http://localhost/afetec/ - Google Blog Search";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"link";a:1:{i:0;a:5:{s:4:"data";s:87:"http://www.google.com/search?ie=utf-8&q=link:http://localhost/afetec/&tbm=blg&tbs=sbd:1";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:11:"description";a:1:{i:0;a:5:{s:4:"data";s:83:"Your search - link:http://localhost/afetec/ - did not match any documents. ";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:36:"http://a9.com/-/spec/opensearch/1.1/";a:3:{s:12:"totalResults";a:1:{i:0;a:5:{s:4:"data";s:1:"0";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:10:"startIndex";a:1:{i:0;a:5:{s:4:"data";s:1:"1";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:12:"itemsPerPage";a:1:{i:0;a:5:{s:4:"data";s:2:"10";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}}}}}}}}}}s:4:"type";i:128;s:7:"headers";a:8:{s:12:"content-type";s:28:"text/xml; charset=ISO-8859-1";s:4:"date";s:29:"Thu, 20 Oct 2011 18:53:50 GMT";s:7:"expires";s:2:"-1";s:13:"cache-control";s:18:"private, max-age=0";s:10:"set-cookie";a:2:{i:0;s:143:"PREF=ID=fa235ceaebbe6185:FF=0:TM=1319136830:LM=1319136830:S=pF4vTWqZY4vR6Ya_; expires=Sat, 19-Oct-2013 18:53:50 GMT; path=/; domain=.google.com";i:1;s:212:"NID=52=REPmiQVdQo-hENrIqSFsocDPs0eFjqVIZ0mwD7xnCxYzo9Vf8RpX3DZSdWKa90mQJ2yvQqAd13QkF4x4wKgAScOKdJy-yO2KxOegZUOpbykqNhVLySq4uwInNuO49NXt; expires=Fri, 20-Apr-2012 18:53:50 GMT; path=/; domain=.google.com; HttpOnly";}s:6:"server";s:3:"gws";s:16:"x-xss-protection";s:13:"1; mode=block";s:15:"x-frame-options";s:10:"SAMEORIGIN";}s:5:"build";s:14:"20090627192103";}', 'no'), +(123, 0, '_transient_timeout_feed_mod_17b4621cc308bf021dbb467ab991abcf', '1319180029', 'no'), +(124, 0, '_transient_feed_mod_17b4621cc308bf021dbb467ab991abcf', '1319136829', 'no'), +(125, 0, '_transient_timeout_dash_20494a3d90a6669585674ed0eb8dcd8f', '1319180029', 'no'), +(126, 0, '_transient_dash_20494a3d90a6669585674ed0eb8dcd8f', '

Este widget de escritorio consulta a la Búsqueda de blogs de Google de modo que cuando otro blog enlace a su sitio se mostrará aquí. No se ha encontrado ningún enlace entrante… aún. Está bien, no hay prisa.

\n', 'no'), +(127, 0, '_transient_timeout_feed_ac0b00fe65abe10e0c5b588f3ed8c7ca', '1319180029', 'no'); +INSERT INTO `wpr3ss_options` (`option_id`, `blog_id`, `option_name`, `option_value`, `autoload`) VALUES +(128, 0, '_transient_feed_ac0b00fe65abe10e0c5b588f3ed8c7ca', 'a:4:{s:5:"child";a:1:{s:0:"";a:1:{s:3:"rss";a:1:{i:0;a:6:{s:4:"data";s:3:"\n\n\n";s:7:"attribs";a:1:{s:0:"";a:1:{s:7:"version";s:3:"2.0";}}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";s:5:"child";a:1:{s:0:"";a:1:{s:7:"channel";a:1:{i:0;a:6:{s:4:"data";s:50:"\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n ";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";s:5:"child";a:3:{s:0:"";a:7:{s:5:"title";a:1:{i:0;a:5:{s:4:"data";s:14:"WordPress News";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"link";a:1:{i:0;a:5:{s:4:"data";s:25:"http://wordpress.org/news";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:11:"description";a:1:{i:0;a:5:{s:4:"data";s:14:"WordPress News";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:13:"lastBuildDate";a:1:{i:0;a:5:{s:4:"data";s:31:"Thu, 20 Oct 2011 05:20:18 +0000";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:8:"language";a:1:{i:0;a:5:{s:4:"data";s:2:"en";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:9:"generator";a:1:{i:0;a:5:{s:4:"data";s:33:"http://wordpress.org/?v=3.3-beta2";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"item";a:10:{i:0;a:6:{s:4:"data";s:41:"\n \n \n \n \n \n \n\n \n \n \n \n \n ";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";s:5:"child";a:5:{s:0:"";a:7:{s:5:"title";a:1:{i:0;a:5:{s:4:"data";s:20:"WordPress 3.3 Beta 2";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"link";a:1:{i:0;a:5:{s:4:"data";s:55:"http://wordpress.org/news/2011/10/wordpress-3-3-beta-2/";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:8:"comments";a:1:{i:0;a:5:{s:4:"data";s:64:"http://wordpress.org/news/2011/10/wordpress-3-3-beta-2/#comments";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:7:"pubDate";a:1:{i:0;a:5:{s:4:"data";s:31:"Thu, 20 Oct 2011 02:39:28 +0000";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:8:"category";a:1:{i:0;a:5:{s:4:"data";s:8:"Releases";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"guid";a:1:{i:0;a:5:{s:4:"data";s:33:"http://wordpress.org/news/?p=2080";s:7:"attribs";a:1:{s:0:"";a:1:{s:11:"isPermaLink";s:5:"false";}}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:11:"description";a:1:{i:0;a:5:{s:4:"data";s:344:"Changes since Beta 1: Updated the Blue theme Fixed IE7 and RTL support Improved flyout menu styling and fixed several glitches Finished the Pointers implementation Landed the dashboard Welcome box for new installs Improved contextual help styling Tweaked the admin bar a little more Fixed a bunch of bugs Consult the full change log  for [...]";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:32:"http://purl.org/dc/elements/1.1/";a:1:{s:7:"creator";a:1:{i:0;a:5:{s:4:"data";s:10:"Ryan Boren";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:40:"http://purl.org/rss/1.0/modules/content/";a:1:{s:7:"encoded";a:1:{i:0;a:5:{s:4:"data";s:917:"

Changes since Beta 1:

\n\n

Consult the full change log  for details, and see the Beta 1 announcement for information on how to help test Beta 2.

\n

Welcome for the new –
\n3.3 at beta 2.
\n(IE7, woo!)

\n

Download 3.3 Beta 2.

\n";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:36:"http://wellformedweb.org/CommentAPI/";a:1:{s:10:"commentRss";a:1:{i:0;a:5:{s:4:"data";s:60:"http://wordpress.org/news/2011/10/wordpress-3-3-beta-2/feed/";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:38:"http://purl.org/rss/1.0/modules/slash/";a:1:{s:8:"comments";a:1:{i:0;a:5:{s:4:"data";s:1:"0";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}}}i:1;a:6:{s:4:"data";s:41:"\n \n \n \n \n \n \n\n \n \n \n \n \n ";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";s:5:"child";a:5:{s:0:"";a:7:{s:5:"title";a:1:{i:0;a:5:{s:4:"data";s:20:"WordPress 3.3 Beta 1";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"link";a:1:{i:0;a:5:{s:4:"data";s:55:"http://wordpress.org/news/2011/10/wordpress-3-3-beta-1/";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:8:"comments";a:1:{i:0;a:5:{s:4:"data";s:64:"http://wordpress.org/news/2011/10/wordpress-3-3-beta-1/#comments";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:7:"pubDate";a:1:{i:0;a:5:{s:4:"data";s:31:"Tue, 11 Oct 2011 00:22:35 +0000";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:8:"category";a:1:{i:0;a:5:{s:4:"data";s:8:"Releases";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"guid";a:1:{i:0;a:5:{s:4:"data";s:33:"http://wordpress.org/news/?p=2071";s:7:"attribs";a:1:{s:0:"";a:1:{s:11:"isPermaLink";s:5:"false";}}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:11:"description";a:1:{i:0;a:5:{s:4:"data";s:301:"WordPress 3.3 is ready for beta testers. As always, this is software still in development and we don’t recommend that you run it on a production site — set up a test site just to play with the new version. If you break it (find a bug), please report it, and if you’re a developer, try to [...]";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:32:"http://purl.org/dc/elements/1.1/";a:1:{s:7:"creator";a:1:{i:0;a:5:{s:4:"data";s:10:"Ryan Boren";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:40:"http://purl.org/rss/1.0/modules/content/";a:1:{s:7:"encoded";a:1:{i:0;a:5:{s:4:"data";s:1951:"

WordPress 3.3 is ready for beta testers.

\n

As always, this is software still in development and we don’t recommend that you run it on a production site — set up a test site just to play with the new version. If you break it (find a bug), please report it, and if you’re a developer, try to help us fix it.

\n

If all goes well, we hope to release WordPress 3.3 by the end of November. The more help we get with testing and fixing bugs, the sooner we will be able to release the final version. If you want to be a beta tester, you should check out the Codex article on how to report bugs.

\n

Here’s some of what’s new:

\n\n

Remember, if you find something you think is a bug, report it! You can bring it up in the alpha/beta forum, you can email it to the wp-testers list, or if you’ve confirmed that other people are experiencing the same bug, you can report it on the WordPress Core Trac. (We recommend starting in the forum or on the mailing list.)

\n

Theme and plugin authors, if you haven’t been following the 3.3 development cycle, please start now so that you can update your themes and plugins to be compatible with the newest version of WordPress.

\n

Download WordPress 3.3 Beta 1

\n

And now, haiku.

\n

Features almost done…

\n

3.3 at Beta 1.

\n

Test it now — have fun!

\n";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:36:"http://wellformedweb.org/CommentAPI/";a:1:{s:10:"commentRss";a:1:{i:0;a:5:{s:4:"data";s:60:"http://wordpress.org/news/2011/10/wordpress-3-3-beta-1/feed/";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:38:"http://purl.org/rss/1.0/modules/slash/";a:1:{s:8:"comments";a:1:{i:0;a:5:{s:4:"data";s:1:"0";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}}}i:2;a:6:{s:4:"data";s:56:"\n \n \n \n \n \n \n \n \n \n \n \n\n \n \n \n \n \n ";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";s:5:"child";a:5:{s:0:"";a:7:{s:5:"title";a:1:{i:0;a:5:{s:4:"data";s:32:"Software Freedom Day + Hackathon";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"link";a:1:{i:0;a:5:{s:4:"data";s:65:"http://wordpress.org/news/2011/09/software-freedom-day-hackathon/";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:8:"comments";a:1:{i:0;a:5:{s:4:"data";s:74:"http://wordpress.org/news/2011/09/software-freedom-day-hackathon/#comments";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:7:"pubDate";a:1:{i:0;a:5:{s:4:"data";s:31:"Thu, 15 Sep 2011 07:33:56 +0000";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:8:"category";a:6:{i:0;a:5:{s:4:"data";s:9:"Community";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}i:1;a:5:{s:4:"data";s:11:"Development";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}i:2;a:5:{s:4:"data";s:6:"Events";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}i:3;a:5:{s:4:"data";s:7:"Testing";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}i:4;a:5:{s:4:"data";s:8:"WordCamp";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}i:5;a:5:{s:4:"data";s:7:"bughunt";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"guid";a:1:{i:0;a:5:{s:4:"data";s:33:"http://wordpress.org/news/?p=2058";s:7:"attribs";a:1:{s:0:"";a:1:{s:11:"isPermaLink";s:5:"false";}}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:11:"description";a:1:{i:0;a:5:{s:4:"data";s:359:"Saturday, September 17 is Software Freedom Day. To that end, a few announcements about this weekend’s hackathon and WordCamp Portland. 3.3 Hackathon WordPress 3.3 is about to hit feature freeze. This means it’s the last chance to squeeze in features that haven’t quite been finished, and enhancements and fixes that no one has had time [...]";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:32:"http://purl.org/dc/elements/1.1/";a:1:{s:7:"creator";a:1:{i:0;a:5:{s:4:"data";s:10:"Jane Wells";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:40:"http://purl.org/rss/1.0/modules/content/";a:1:{s:7:"encoded";a:1:{i:0;a:5:{s:4:"data";s:3772:"

Saturday, September 17 is Software Freedom Day. To that end, a few announcements about this weekend’s hackathon and WordCamp Portland.

\n

3.3 Hackathon

\n

WordPress 3.3 is about to hit feature freeze. This means it’s the last chance to squeeze in features that haven’t quite been finished, and enhancements and fixes that no one has had time to address yet. Around this time, there are often dozens of tickets that have patches, but the patches have not been tested enough to be committed to core. Then the contributors who worked hard on the patches are disappointed that their code doesn’t make it into the current release. You can help us prevent this!

\n

This weekend, we’ll be running a has-patch needs-testing marathon for the 3.3 milestone. Basically, we’re looking for people who can help test patches and/or refresh patches that need updating. Lead developers and core contributors will be hanging around in the #wordpress-dev channel on irc.freenode.net to answer questions as needed, and will be committing patches as they get enough verification. As you test the patches, report your findings on the trac tickets in question. If all developers who make a living working with WordPress helped out for even an hour or two this weekend, we could clear the 200 tickets or so that are in this situation. To make it fun, why not get together with other WordPress devs and have an in-person hackathon meetup?

\n

WordCamp Portland

\n

At WordCamp Portland this weekend, some of the WordPress core team will be in attendance, including me, Nacin, and Koop. In addition to giving presentations and participating in the unconference sessions, we’ll be involved with a couple of other cool things at WCPDX:

\n\n

So, if you live it the Portland/Seattle area and haven’t already bought a ticket to attend WordCamp Portland, hurry up, as it’s going to be a great celebration of Software Freedom Day and WordPress.

\n";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:36:"http://wellformedweb.org/CommentAPI/";a:1:{s:10:"commentRss";a:1:{i:0;a:5:{s:4:"data";s:70:"http://wordpress.org/news/2011/09/software-freedom-day-hackathon/feed/";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:38:"http://purl.org/rss/1.0/modules/slash/";a:1:{s:8:"comments";a:1:{i:0;a:5:{s:4:"data";s:1:"0";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}}}i:3;a:6:{s:4:"data";s:47:"\n \n \n \n \n \n \n \n \n\n \n \n \n \n \n ";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";s:5:"child";a:5:{s:0:"";a:7:{s:5:"title";a:1:{i:0;a:5:{s:4:"data";s:23:"A Tale of Two WordCamps";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"link";a:1:{i:0;a:5:{s:4:"data";s:58:"http://wordpress.org/news/2011/09/a-tale-of-two-wordcamps/";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:8:"comments";a:1:{i:0;a:5:{s:4:"data";s:67:"http://wordpress.org/news/2011/09/a-tale-of-two-wordcamps/#comments";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:7:"pubDate";a:1:{i:0;a:5:{s:4:"data";s:31:"Wed, 14 Sep 2011 21:17:08 +0000";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:8:"category";a:3:{i:0;a:5:{s:4:"data";s:9:"Community";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}i:1;a:5:{s:4:"data";s:6:"Events";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}i:2;a:5:{s:4:"data";s:8:"WordCamp";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"guid";a:1:{i:0;a:5:{s:4:"data";s:33:"http://wordpress.org/news/?p=2057";s:7:"attribs";a:1:{s:0:"";a:1:{s:11:"isPermaLink";s:5:"false";}}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:11:"description";a:1:{i:0;a:5:{s:4:"data";s:380:"This coming weekend, two WordCamps will be going on simultaneously — yep, it’s WordCamp season again! This weekend will be the first of many this autumn with multiple WordCamps. Tomorrow (not quite the weekend but close enough) is WordCamp Cape Town, and then this weekend, first-time WordCamp Albuquerque coincides with 4-time returning champ WordCamp Portland, [...]";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:32:"http://purl.org/dc/elements/1.1/";a:1:{s:7:"creator";a:1:{i:0;a:5:{s:4:"data";s:10:"Jane Wells";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:40:"http://purl.org/rss/1.0/modules/content/";a:1:{s:7:"encoded";a:1:{i:0;a:5:{s:4:"data";s:3683:"

This coming weekend, two WordCamps will be going on simultaneously — yep, it’s WordCamp season again! This weekend will be the first of many this autumn with multiple WordCamps. Tomorrow (not quite the weekend but close enough) is WordCamp Cape Town, and then this weekend, first-time WordCamp Albuquerque coincides with 4-time returning champ WordCamp Portland, a cool juxtaposition of a more established local community with one that is just getting started. If you’re anywhere near the Portland area, you should try to attend. The WordPress Foundation will be sponsoring some special activities around Software Freedom Day, and some members of the core team (me, Nacin, Koop) will be there.

\n

Is there a WordCamp coming up near you? Let’s find out!

\n

Sep 15: WordCamp Cape Town Cape Town, South Africa

\n

Sep 16-18: WordCamp Albuquerque Albuquerque, NM

\n

Sep 17-18: WordCamp Portland Portland, OR

\n

Sep 24: WordCamp Lisboa Lisboa, Portugal

\n

Sep 24: WordCamp Germany Koln, Germany

\n

Sep 25: WordCamp Sofia Sofia, Bulgaria

\n

Oct 1: WordCamp Louisville Louisville, Kentucky

\n

Oct 8-9: WordCamp Sevilla Seville, Spain

\n
\n

Oct 15-16: WordCamp Jabalpur Jabalpur, India

\n

Nov 5-6: WordCamp Toronto Toronto, ON

\n

Nov 5-6: WordCamp Gold Coast Gold Coast, Australia

\n

Nov 5-6: WordCamp Philly Philadelphia, PA

\n

Nov 12: WordCamp Caguas Caguas, Puerto Rico

\n

Nov 12-13: WordCamp Kenya Nairobi, Kenya

\n

Nov 12-13: WordCamp Detroit Detroit, MI

\n

Nov 12: WordCamp Richmond Richmond, VA

\n

Nov 12-13: WordCamp Denmark Copenhagen, Denmark

\n

Dec 17: WordCamp Las Vegas Las Vegas, NV

\n

Feb 3-4 WordCamp Atlanta Atlanta, GA

\n

There are also a number of WordCamps still in the early organizing stage that do not yet have dates set. These include: Ft. Wayne, IN; London, UK; Edmonton, Canada; Baku, Azerbaijan; Oslo, Norway; Sacramento, CA;  Birmingham, Alabama; Pittsburgh, PA; Omaha, NE; Orlando, FL; Tokyo, Japan; Paris, France; Zagreb, Croatia; Nashville, TN, Washington DC, Baltimore, MD; Bangkok, Thailand; Istanbul, Turkey.

\n

Hope to see you soon at a WordCamp near you!

\n


\n

\n
\n";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:36:"http://wellformedweb.org/CommentAPI/";a:1:{s:10:"commentRss";a:1:{i:0;a:5:{s:4:"data";s:63:"http://wordpress.org/news/2011/09/a-tale-of-two-wordcamps/feed/";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:38:"http://purl.org/rss/1.0/modules/slash/";a:1:{s:8:"comments";a:1:{i:0;a:5:{s:4:"data";s:1:"0";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}}}i:4;a:6:{s:4:"data";s:47:"\n \n \n \n \n \n \n \n \n\n \n \n \n \n \n ";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";s:5:"child";a:5:{s:0:"";a:7:{s:5:"title";a:1:{i:0;a:5:{s:4:"data";s:35:"Vote for WordPress Sessions at SXSW";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"link";a:1:{i:0;a:5:{s:4:"data";s:58:"http://wordpress.org/news/2011/09/vote-for-wordpress-sxsw/";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:8:"comments";a:1:{i:0;a:5:{s:4:"data";s:67:"http://wordpress.org/news/2011/09/vote-for-wordpress-sxsw/#comments";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:7:"pubDate";a:1:{i:0;a:5:{s:4:"data";s:31:"Fri, 02 Sep 2011 04:45:03 +0000";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:8:"category";a:3:{i:0;a:5:{s:4:"data";s:9:"Community";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}i:1;a:5:{s:4:"data";s:11:"conferences";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}i:2;a:5:{s:4:"data";s:4:"sxsw";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"guid";a:1:{i:0;a:5:{s:4:"data";s:33:"http://wordpress.org/news/?p=2036";s:7:"attribs";a:1:{s:0:"";a:1:{s:11:"isPermaLink";s:5:"false";}}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:11:"description";a:1:{i:0;a:5:{s:4:"data";s:302:"Each year, members of the web community from around the world submit session proposals to the South by Southwest Interactive conference, an event that played a role in the birth of WordPress. We head to Austin every year, do a BBQ or throw a party, but despite the fact that almost 15% of the web [...]";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:32:"http://purl.org/dc/elements/1.1/";a:1:{s:7:"creator";a:1:{i:0;a:5:{s:4:"data";s:10:"Jane Wells";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:40:"http://purl.org/rss/1.0/modules/content/";a:1:{s:7:"encoded";a:1:{i:0;a:5:{s:4:"data";s:6289:"

Each year, members of the web community from around the world submit session proposals to the South by Southwest Interactive conference, an event that played a role in the birth of WordPress. We head to Austin every year, do a BBQ or throw a party, but despite the fact that almost 15% of the web is powered by WordPress, there aren’t many sessions related to WordPress on the schedule. This year, more than 3200 proposals are competing for about 350 slots, and who has time to read through, vote, and comment on 3200 proposals? Out of those 3200+ proposals, only 8 relate to WordPress! I thought it would be handy to post a guide to the WordPressy proposals for SXSWi 2012, so that if you would like to check them out and vote on them it woud be fast and easy. Leaving a comment in addition to your thumbs up/down vote helps the staff and advisory board know which sessions are likely to have an interested audience, so make sure to leave comments on the sessions you think would be cool (remember, they also publish the podcasts afterward). Voting ends in about 24 hours, so if you want to weigh in, now’s the time. Thanks for helping spread the word!

\n

WordPress-specific Sessions

\n

This list is based on searching for “WordPress” in proposal titles, descriptions, and tags. Clicking the proposal title will take you to that page in the SXSW PanelPicker, where you can vote and comment. Names that are linked go to those people’s WordPress.org profiles.

\n

Blog Wars: Movable Type vs. WordPress Revisited

\n

Mark Jaquith – WordPress Lead Developer
\nByrne Reese – Endevver
\nThese days people tend to pit us against Drupal rather than Movable Type, but looking back at the early rivalry and learning from the positive and negative aspects of it would be cool as we position ourselves in competition with new platforms. I like seeing Mark present at conferences, he always prepares well and does a good job. Though I’m guessing these guys will be all friendly and collaborative, I might take a nostalgia hit and imagine them in a fistfight just to liven things up.

\n

Designing WordPress

\n

Jane Wells – WordPress User Experience Lead
\nDisclosure: This is me! Balancing the desire for truly open and participatory design processes against the often more efficient and consistent results of a more curated design method is something we’ve been working on for the past year or so in WordPress core. I’d use the design process for several recent core features (like the UI refresh and internal linking) to illustrate the issues we’ve faced and the results we’ve achieved.

\n

Open Source Social Networking

\n

John James Jacoby – BuddyPress Lead Developer
\nJ-trip (as John James Jacoby is fondly known by many in the community) is the lead dev for BuddyPress and the new bbPress plugin. He’s proposing a panel discussion among reps from several open source social network platforms. It’s always cool hearing more about BuddyPress, but it would be even cooler to figure out how it fits in with and/or stacks up against other platforms.

\n

Welcome to the Chaos – the Distributed Workplace

\n

Nikolay Bachiyski – WordPress Core Developer, GlotPress Lead Developer
\nLori McLeese – Automattic
\nThis one isn’t about WordPress per se, though using WordPress as a communication tool is one of the topics and Automattic is obviously a WordPress-based business. The main reason I think people should vote for this session is because Nikolay, core committing developer for internationalization and lead developer of GlotPress, our translation tool, is an awesome speaker. He is hysterically funny when he presents. I would bet money this presentation will involve a bear.

\n

Deploying WordPress: From Zero to Ninja

\n

Grant Norwood – Michael & Susan Dell Foundation
\nWhen Mark Jaquith says a presentation on security and deployment is on his short list, I’m impressed. (He said it in the comments on the proposal.)

\n

Beyond the Theme – Using WordPress as an API

\n

David Tufts – kickpress.org
\nObviously a hot topic in the community right now, seems like a no-brainer to choose.

\n

Local Government Online: WordPress Beats Drupal

\n

Jase Wilson – Luminopolis
\nThere was a presentation at WordCamp San Francisco this month on moving a news site from Drupal to WordPress. More and more the question comes up of which tool is best for various situations and requirements. And obviously getting government to use more open source software would be a cost-saver in these tough economic times.

\n

WordPress website built live in 45 minutes

\n

Glenn Todd – Dvize Creative
\nLive walkthroughs are always fun, and help prove to the uninitiated how easy WordPress can be.

\n

So: go vote on these session proposals and help spread the WordPress love. If you know of any WordPress-related proposals that didn’t come up in my search, let me know in a comment and I’ll update this post. Thanks, and maybe we’ll see you in Austin in March!

\n";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:36:"http://wellformedweb.org/CommentAPI/";a:1:{s:10:"commentRss";a:1:{i:0;a:5:{s:4:"data";s:63:"http://wordpress.org/news/2011/09/vote-for-wordpress-sxsw/feed/";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:38:"http://purl.org/rss/1.0/modules/slash/";a:1:{s:8:"comments";a:1:{i:0;a:5:{s:4:"data";s:1:"0";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}}}i:5;a:6:{s:4:"data";s:44:"\n \n \n \n \n \n \n \n\n \n \n \n \n \n ";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";s:5:"child";a:5:{s:0:"";a:7:{s:5:"title";a:1:{i:0;a:5:{s:4:"data";s:17:"State of the Word";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"link";a:1:{i:0;a:5:{s:4:"data";s:52:"http://wordpress.org/news/2011/08/state-of-the-word/";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:8:"comments";a:1:{i:0;a:5:{s:4:"data";s:61:"http://wordpress.org/news/2011/08/state-of-the-word/#comments";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:7:"pubDate";a:1:{i:0;a:5:{s:4:"data";s:31:"Fri, 19 Aug 2011 15:32:04 +0000";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:8:"category";a:2:{i:0;a:5:{s:4:"data";s:9:"Community";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}i:1;a:5:{s:4:"data";s:4:"Meta";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"guid";a:1:{i:0;a:5:{s:4:"data";s:33:"http://wordpress.org/news/?p=2019";s:7:"attribs";a:1:{s:0:"";a:1:{s:11:"isPermaLink";s:5:"false";}}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:11:"description";a:1:{i:0;a:5:{s:4:"data";s:307:"This has been an exciting year for WordPress. We’ve grown to power 14.7% of the top million websites in the world, up from 8.5%, and the latest data show 22 out of every 100 new active domains in the US are running WordPress. We also conducted our first ever user and developer survey, which got [...]";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:32:"http://purl.org/dc/elements/1.1/";a:1:{s:7:"creator";a:1:{i:0;a:5:{s:4:"data";s:14:"Matt Mullenweg";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:40:"http://purl.org/rss/1.0/modules/content/";a:1:{s:7:"encoded";a:1:{i:0;a:5:{s:4:"data";s:2043:"

This has been an exciting year for WordPress. We’ve grown to power 14.7% of the top million websites in the world, up from 8.5%, and the latest data show 22 out of every 100 new active domains in the US are running WordPress.

\n

We also conducted our first ever user and developer survey, which got over 18,000 responses from all over the world:

\n

\n

We found a few interesting tidbits from the survey responses already, including that 6,800 self-employed respondents were responsible for over 170,000 sites personally, and charged a median hourly rate of $50. In tough economic times, it’s heartening to see Open Source creating so many jobs. (If each site took only 3 hours to make, that’s $29.5M of work at the average hourly rate.)

\n

I talk about this data, and much more, in my State of the Word address which you can watch here:

\n

\n

We know there’s more good stuff hidden in there and we’re open sourcing and releasing the raw information behind it. If you’re a researcher and would like to dig into the anonymized survey data yourself, you can grab it here. (Careful, it’s a 9MB CSV.)

\n

There has never been a better time to be part of the WordPress community, and I want to thank each and every one of you for making it such a wonderful place to be. Now it’s time to get back to work, there’s still 85.3% of the web that needs help.

\n";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:36:"http://wellformedweb.org/CommentAPI/";a:1:{s:10:"commentRss";a:1:{i:0;a:5:{s:4:"data";s:57:"http://wordpress.org/news/2011/08/state-of-the-word/feed/";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:38:"http://purl.org/rss/1.0/modules/slash/";a:1:{s:8:"comments";a:1:{i:0;a:5:{s:4:"data";s:1:"0";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}}}i:6;a:6:{s:4:"data";s:44:"\n \n \n \n \n \n \n \n\n \n \n \n \n \n ";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";s:5:"child";a:5:{s:0:"";a:7:{s:5:"title";a:1:{i:0;a:5:{s:4:"data";s:23:"WordCamp SF Livestream!";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"link";a:1:{i:0;a:5:{s:4:"data";s:57:"http://wordpress.org/news/2011/08/wordcamp-sf-livestream/";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:8:"comments";a:1:{i:0;a:5:{s:4:"data";s:66:"http://wordpress.org/news/2011/08/wordcamp-sf-livestream/#comments";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:7:"pubDate";a:1:{i:0;a:5:{s:4:"data";s:31:"Fri, 12 Aug 2011 08:38:03 +0000";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:8:"category";a:2:{i:0;a:5:{s:4:"data";s:9:"Community";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}i:1;a:5:{s:4:"data";s:8:"WordCamp";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"guid";a:1:{i:0;a:5:{s:4:"data";s:33:"http://wordpress.org/news/?p=2012";s:7:"attribs";a:1:{s:0:"";a:1:{s:11:"isPermaLink";s:5:"false";}}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:11:"description";a:1:{i:0;a:5:{s:4:"data";s:342:"The annual WordPress conference, WordCamp San Francisco, starts in fewer than 8 hours. The sold out event — three full days of programming for bloggers, developers, theme designers, and professional WordPress users — will be shared with more than 1,000 ticket holders from near and far. If you are one of the many people who [...]";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:32:"http://purl.org/dc/elements/1.1/";a:1:{s:7:"creator";a:1:{i:0;a:5:{s:4:"data";s:10:"Jane Wells";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:40:"http://purl.org/rss/1.0/modules/content/";a:1:{s:7:"encoded";a:1:{i:0;a:5:{s:4:"data";s:2414:"

The annual WordPress conference, WordCamp San Francisco, starts in fewer than 8 hours. The sold out event — three full days of programming for bloggers, developers, theme designers, and professional WordPress users — will be shared with more than 1,000 ticket holders from near and far. If you are one of the many people who wanted to come but couldn’t swing the time off or travel expenses, you should check out the livestream tickets that are for sale. You can even get a conference t-shirt to commemorate your “virtual” participation.

\n

Speakers include members of the WordPress core development team, leaders of WordPress-based businesses, hobbyists, and everything in between. Take a look at the schedules for Friday, Saturday, and Sunday, and if you see something that sounds interesting (how could you not?), buy a livestream ticket. The stream will start at 16:00 UTC on Friday, August 12.

\n

Viewing Parties

\n

Celebrate your own local WordPress community by calling together some friends and having a livestream viewing party. In the case of regular WordPress meetup groups, if you do a viewing party we will have a process after #WCSF is over whereby attendees will be eligible to buy conference shirts if their meetup group organizer confirms viewing party attendance.

\n

Videos from all the recorded sessions will be posted for free on WordPress.tv within a couple of weeks, but watching the livestream allows you to support WordCamp while providing instant gratification. And let’s face it: the best part is that you’ll know what the heck people are talking about on Twitter using the hashtag #wcsf.

\n";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:36:"http://wellformedweb.org/CommentAPI/";a:1:{s:10:"commentRss";a:1:{i:0;a:5:{s:4:"data";s:62:"http://wordpress.org/news/2011/08/wordcamp-sf-livestream/feed/";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:38:"http://purl.org/rss/1.0/modules/slash/";a:1:{s:8:"comments";a:1:{i:0;a:5:{s:4:"data";s:1:"0";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}}}i:7;a:6:{s:4:"data";s:44:"\n \n \n \n \n \n \n \n\n \n \n \n \n \n ";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";s:5:"child";a:5:{s:0:"";a:7:{s:5:"title";a:1:{i:0;a:5:{s:4:"data";s:23:"Best WordCamp Speakers?";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"link";a:1:{i:0;a:5:{s:4:"data";s:57:"http://wordpress.org/news/2011/07/best-wordcamp-speakers/";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:8:"comments";a:1:{i:0;a:5:{s:4:"data";s:66:"http://wordpress.org/news/2011/07/best-wordcamp-speakers/#comments";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:7:"pubDate";a:1:{i:0;a:5:{s:4:"data";s:31:"Sat, 16 Jul 2011 21:32:34 +0000";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:8:"category";a:2:{i:0;a:5:{s:4:"data";s:9:"Community";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}i:1;a:5:{s:4:"data";s:8:"WordCamp";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"guid";a:1:{i:0;a:5:{s:4:"data";s:33:"http://wordpress.org/news/?p=2000";s:7:"attribs";a:1:{s:0:"";a:1:{s:11:"isPermaLink";s:5:"false";}}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:11:"description";a:1:{i:0;a:5:{s:4:"data";s:357:"As we complete speaker selection for the annual WordPress conference (a.k.a. WordCamp San Francisco), it’s clear that even though there were more than 200 speaker applications, many great WordCamp speakers did not apply. No fear! We will seek them out to make sure that WordCamp SF has a fantastic lineup, including people who didn’t apply [...]";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:32:"http://purl.org/dc/elements/1.1/";a:1:{s:7:"creator";a:1:{i:0;a:5:{s:4:"data";s:10:"Jane Wells";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:40:"http://purl.org/rss/1.0/modules/content/";a:1:{s:7:"encoded";a:1:{i:0;a:5:{s:4:"data";s:1600:"

As we complete speaker selection for the annual WordPress conference (a.k.a. WordCamp San Francisco), it’s clear that even though there were more than 200 speaker applications, many great WordCamp speakers did not apply. No fear! We will seek them out to make sure that WordCamp SF has a fantastic lineup, including people who didn’t apply (too shy? who knows?) but have wowed local crowds at previous WordCamps.

\n

This is about as basic a survey as there is. Tell us the three best WordCamp presentations you saw in the past year or so. For each, give the presenters name, the topic (exact title not necessary) and which WordCamp it was at (important).

\n

Example:

\n

1. Joe Shmoe, Using the Loop, WordCamp Sheboygan 2011
\n2. Jane Doe, Top 5 WordPress Plugins, WordCamp La Mancha 2010
\n3. Lee Smith, Your First Core Patch, WordCamp Atlantis 2011

\n

That’s it. We don’t need your name or any info at all, just your three top speaker votes. We’ll take a look at the people with the most votes, and consider them for WCSF if they’re not already in the application pool. Thanks for your help in making this year’s conference better and more WordPressy than ever.

\n

Vote Now!

\n

P.S. Have you bought your tickets yet?

\n";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:36:"http://wellformedweb.org/CommentAPI/";a:1:{s:10:"commentRss";a:1:{i:0;a:5:{s:4:"data";s:62:"http://wordpress.org/news/2011/07/best-wordcamp-speakers/feed/";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:38:"http://purl.org/rss/1.0/modules/slash/";a:1:{s:8:"comments";a:1:{i:0;a:5:{s:4:"data";s:1:"0";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}}}i:8;a:6:{s:4:"data";s:41:"\n \n \n \n \n \n \n\n \n \n \n \n \n ";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";s:5:"child";a:5:{s:0:"";a:7:{s:5:"title";a:1:{i:0;a:5:{s:4:"data";s:15:"WordPress 3.2.1";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"link";a:1:{i:0;a:5:{s:4:"data";s:50:"http://wordpress.org/news/2011/07/wordpress-3-2-1/";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:8:"comments";a:1:{i:0;a:5:{s:4:"data";s:59:"http://wordpress.org/news/2011/07/wordpress-3-2-1/#comments";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:7:"pubDate";a:1:{i:0;a:5:{s:4:"data";s:31:"Tue, 12 Jul 2011 19:49:06 +0000";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:8:"category";a:1:{i:0;a:5:{s:4:"data";s:8:"Releases";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"guid";a:1:{i:0;a:5:{s:4:"data";s:33:"http://wordpress.org/news/?p=1982";s:7:"attribs";a:1:{s:0:"";a:1:{s:11:"isPermaLink";s:5:"false";}}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:11:"description";a:1:{i:0;a:5:{s:4:"data";s:358:"After more than a million downloads of WordPress 3.2, we’re now releasing WordPress 3.2.1 into the wild. This maintenance release fixes a server incompatibility related to JSON that’s unfortunately affected some of you, as well as a few other fixes in the new dashboard design and the Twenty Eleven theme. If you’ve already updated to [...]";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:32:"http://purl.org/dc/elements/1.1/";a:1:{s:7:"creator";a:1:{i:0;a:5:{s:4:"data";s:12:"Andrew Nacin";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:40:"http://purl.org/rss/1.0/modules/content/";a:1:{s:7:"encoded";a:1:{i:0;a:5:{s:4:"data";s:1129:"

After more than a million downloads of WordPress 3.2, we’re now releasing WordPress 3.2.1 into the wild. This maintenance release fixes a server incompatibility related to JSON that’s unfortunately affected some of you, as well as a few other fixes in the new dashboard design and the Twenty Eleven theme. If you’ve already updated to 3.2, then this update will be even faster than usual, thanks to the new feature in 3.2 that only updates files that have been changed, rather than replacing all the files in your installation.

\n

For a full list of fixes, view the changelog the list of tickets. Our release haiku:

\n

JSON, the admin
\nA little bit tidier
\nEdge cases covered

\n

Download 3.2.1 or update now from the Dashboard → Updates menu in your site’s admin area.

\n";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:36:"http://wellformedweb.org/CommentAPI/";a:1:{s:10:"commentRss";a:1:{i:0;a:5:{s:4:"data";s:55:"http://wordpress.org/news/2011/07/wordpress-3-2-1/feed/";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:38:"http://purl.org/rss/1.0/modules/slash/";a:1:{s:8:"comments";a:1:{i:0;a:5:{s:4:"data";s:1:"0";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}}}i:9;a:6:{s:4:"data";s:41:"\n \n \n \n \n \n \n\n \n \n \n \n \n ";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";s:5:"child";a:5:{s:0:"";a:7:{s:5:"title";a:1:{i:0;a:5:{s:4:"data";s:27:"WordPress 3.2 now available";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"link";a:1:{i:0;a:5:{s:4:"data";s:43:"http://wordpress.org/news/2011/07/gershwin/";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:8:"comments";a:1:{i:0;a:5:{s:4:"data";s:52:"http://wordpress.org/news/2011/07/gershwin/#comments";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:7:"pubDate";a:1:{i:0;a:5:{s:4:"data";s:31:"Mon, 04 Jul 2011 21:07:06 +0000";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:8:"category";a:1:{i:0;a:5:{s:4:"data";s:8:"Releases";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"guid";a:1:{i:0;a:5:{s:4:"data";s:33:"http://wordpress.org/news/?p=1924";s:7:"attribs";a:1:{s:0:"";a:1:{s:11:"isPermaLink";s:5:"false";}}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:11:"description";a:1:{i:0;a:5:{s:4:"data";s:329:"Here in the U.S. we are observing Independence Day, and I can’t think of a more fitting way to mark a day that celebrates freedom than by releasing more free software to help democratize publishing around the globe. I’m excited to announce that WordPress 3.2 is now available to the world, both as an update in [...]";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:32:"http://purl.org/dc/elements/1.1/";a:1:{s:7:"creator";a:1:{i:0;a:5:{s:4:"data";s:14:"Matt Mullenweg";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:40:"http://purl.org/rss/1.0/modules/content/";a:1:{s:7:"encoded";a:1:{i:0;a:5:{s:4:"data";s:14127:"

Here in the U.S. we are observing Independence Day, and I can’t think of a more fitting way to mark a day that celebrates freedom than by releasing more free software to help democratize publishing around the globe. I’m excited to announce that WordPress 3.2 is now available to the world, both as an update in your dashboard and a download on WordPress.org. Version 3.2 is our fifteenth major release of WordPress and comes just four months after 3.1 (which coincidentally just passed the 15 million download mark this morning), reflecting the growing speed of development in the WordPress community and our dedication to getting improvements in your hands as soon as possible. We’re dedicating this release to noted composer and pianist George Gershwin.

\n

Before we get to the release, in anticipation of the State of the Word speech at the upcoming WordCamp San Francisco (the annual WordPress conference) we’re doing a survey or census of the WordPress world. If you have a moment, please fill out this survey and we’ll share what we learn by publishing the aggregate results in August.

\n

The focus for this release was making WordPress faster and lighter. The first thing you’ll notice when you log in to 3.2 is a refreshed dashboard design that tightens the typography, design, and code behind the admin. (Rhapsody in Grey?) If you’re starting a new blog, you’ll also appreciate the fully HTML5 new Twenty Eleven theme, fulfilling our plan to replace the default theme every year. Start writing your first post in our redesigned post editor and venture to the full-screen button in the editing toolbar to enter the new distraction-free writing or zen mode, my personal favorite feature of the release. All of the widgets, menus, buttons, and interface elements fade away to allow you to compose and edit your thoughts in a completely clean environment conducive to writing, but when your mouse strays to the top of the screen your most-used shortcuts are right there where you need them. (I like to press F11 to take my browser full-screen, getting rid of even the OS chrome.)

\n

\n

Under the hood there have been a number of improvements, not the least of which is the streamlining enabled by our previously announced plan of retiring support for PHP4, older versions of MySQL, and legacy browsers like IE6, which allows us to take advantage of more features enabled by new technologies. The admin bar has a few more shortcuts to your most commonly-used actions. On the comment moderation screen, the new approve & reply feature speeds up your conversation management. You’ll notice in your first update after 3.2 that we’ll only be updating the files that have changed with each new release instead of every file in your WordPress installation, which makes updates significantly faster on all hosting platforms. There are also some fun new theme features shown off by Twenty Eleven, like the ability to have multiple rotating header images to highlight all of your favorite photos.

\n

There is way more, like our new freedoms and credits screens (linked from your dashboard footer), so for the full story check out the Codex page on 3.2 or the Trac milestone which includes the 400+ tickets closed in this release.

\n

A Community Effort

\n

We now finally have a credits page inside of WordPress itself (though a cool revision is coming in 3.3), but for posterity let’s give a round of applause to these fine folks who contributed to 3.2:

\n

Aaron Brazell, Aaron Campbell, Aaron Jorbin, Adam Harley, Alex Concha, ampt, Andrew Nacin, Andrew Ozz, andrewryno, andy, Austin Matzko, BenChapman, Ben Dunkle, bluntelk, Boone Gorges, Brandon Allen, Brandon Burke, Caspie, cfinke, charlesclarkson, chexee, coffee2code, Cristi Burcă, daniloercoli, Daryl Koopersmith, David Cowgill, David Trower, demetris, Devin Reams, Dion Hulse, dllh, Dominik Schilling, Doug Provencio, dvwallin, Dylan Kuhn, Eric Mann, fabifott, Franklin Tse, Frumph, garyc40, Glenn Ansley, guyn, hakre, hebbet, Helen Hou-Sandi, hew, holizz, Ian Stewart, Jacob Gillespie, Jane Wells, Jayjdk, Jeff Farthing, Joachim Kudish, joelhardi, John Blackbourn, John Ford, John James Jacoby, JohnONolan, Jon Cave, joostdevalk, Jorge Bernal, Joseph Scott, Justin Sternberg, Justin Tadlock, kevinB, Knut Sparhell, kovshenin, Kuraishi, Lance Willett, linuxologos, lloydbudd, Luc De Brouwer, marcis20, Mark Jaquith, Mark McWilliams, Martin Lormes, Matías Ventura, Matt Martz, Matt Thomas, MattyRob, mcepl, mdawaffe, Michael Fields, MichaelH, michaeltyson, Mike Schroder, Milan Dinić, mintindeed, mitchoyoshitaka, Mohammad Jangda, mrroundhill, natecook, nathanrice, Niall Kennedy, Nick Bohle, Nikolay Bachiyski, nuxwin, Otto, pavelevap, pete.mall, Peter Westwood, Prasath Nadarajah, Ptah Dunbar, Rafael Poveda, Rahe, Ramiy, Rasheed Bydousi, Reuben Gunday, Robert Chapin, Ron Rennick, Ross Hanney, Ryan Boren, Ryan Imel, Safirul Alredha, Samir Shah, saracannon, sbressler, Sergey Biryukov, shakenstirred, Sidney Harrell, Simon Prosser, sorich87, szadok, tetele, tigertech, trepmal, Utkarsh Kukreti, valentinas, webduo, Xavier Borderie, Yoav Farhi, Ze Fontainhas, and ziofix.

\n

Bonus: On their WordPress.org profiles over 20,000 people have said they make their living from WordPress. Are you one of them? Don’t forget to take a minute for our survey.

\n";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:36:"http://wellformedweb.org/CommentAPI/";a:1:{s:10:"commentRss";a:1:{i:0;a:5:{s:4:"data";s:48:"http://wordpress.org/news/2011/07/gershwin/feed/";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:38:"http://purl.org/rss/1.0/modules/slash/";a:1:{s:8:"comments";a:1:{i:0;a:5:{s:4:"data";s:1:"0";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}}}}}s:27:"http://www.w3.org/2005/Atom";a:1:{s:4:"link";a:1:{i:0;a:5:{s:4:"data";s:0:"";s:7:"attribs";a:1:{s:0:"";a:3:{s:4:"href";s:31:"http://wordpress.org/news/feed/";s:3:"rel";s:4:"self";s:4:"type";s:19:"application/rss+xml";}}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:44:"http://purl.org/rss/1.0/modules/syndication/";a:2:{s:12:"updatePeriod";a:1:{i:0;a:5:{s:4:"data";s:6:"hourly";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:15:"updateFrequency";a:1:{i:0;a:5:{s:4:"data";s:1:"1";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}}}}}}}}}}s:4:"type";i:128;s:7:"headers";a:8:{s:6:"server";s:5:"nginx";s:4:"date";s:29:"Thu, 20 Oct 2011 18:53:50 GMT";s:12:"content-type";s:23:"text/xml; charset=UTF-8";s:10:"connection";s:5:"close";s:4:"vary";s:15:"Accept-Encoding";s:10:"x-pingback";s:36:"http://wordpress.org/news/xmlrpc.php";s:13:"last-modified";s:29:"Thu, 20 Oct 2011 05:20:18 GMT";s:4:"x-nc";s:11:"HIT luv 139";}s:5:"build";s:14:"20090627192103";}', 'no'); +INSERT INTO `wpr3ss_options` (`option_id`, `blog_id`, `option_name`, `option_value`, `autoload`) VALUES +(129, 0, '_transient_timeout_feed_mod_ac0b00fe65abe10e0c5b588f3ed8c7ca', '1319180029', 'no'), +(130, 0, '_transient_feed_mod_ac0b00fe65abe10e0c5b588f3ed8c7ca', '1319136829', 'no'), +(131, 0, '_transient_timeout_dash_4077549d03da2e451c8b5f002294ff51', '1319180029', 'no'), +(132, 0, '_transient_dash_4077549d03da2e451c8b5f002294ff51', '
', 'no'), +(133, 0, '_transient_timeout_feed_a5420c83891a9c88ad2a4f04584a5efc', '1319180030', 'no'), +(134, 0, '_transient_feed_a5420c83891a9c88ad2a4f04584a5efc', 'a:4:{s:5:"child";a:1:{s:0:"";a:1:{s:3:"rss";a:1:{i:0;a:6:{s:4:"data";s:3:"\n \n";s:7:"attribs";a:1:{s:0:"";a:1:{s:7:"version";s:3:"2.0";}}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";s:5:"child";a:1:{s:0:"";a:1:{s:7:"channel";a:1:{i:0;a:6:{s:4:"data";s:72:"\n \n \n \n \n \n \n \n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n ";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";s:5:"child";a:2:{s:0:"";a:7:{s:5:"title";a:1:{i:0;a:5:{s:4:"data";s:39:"WordPress Plugins » View: Most Popular";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"link";a:1:{i:0;a:5:{s:4:"data";s:51:"http://wordpress.org/extend/plugins/browse/popular/";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:11:"description";a:1:{i:0;a:5:{s:4:"data";s:39:"WordPress Plugins » View: Most Popular";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:8:"language";a:1:{i:0;a:5:{s:4:"data";s:5:"en-US";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:7:"pubDate";a:1:{i:0;a:5:{s:4:"data";s:31:"Thu, 20 Oct 2011 18:43:52 +0000";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:9:"generator";a:1:{i:0;a:5:{s:4:"data";s:25:"http://bbpress.org/?v=1.1";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"item";a:15:{i:0;a:6:{s:4:"data";s:30:"\n \n \n \n \n \n \n ";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";s:5:"child";a:2:{s:0:"";a:5:{s:5:"title";a:1:{i:0;a:5:{s:4:"data";s:29:"Arne on "Google XML Sitemaps"";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"link";a:1:{i:0;a:5:{s:4:"data";s:70:"http://wordpress.org/extend/plugins/google-sitemap-generator/#post-132";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:7:"pubDate";a:1:{i:0;a:5:{s:4:"data";s:31:"Fri, 09 Mar 2007 22:31:32 +0000";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"guid";a:1:{i:0;a:5:{s:4:"data";s:40:"132@http://wordpress.org/extend/plugins/";s:7:"attribs";a:1:{s:0:"";a:1:{s:11:"isPermaLink";s:5:"false";}}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:11:"description";a:1:{i:0;a:5:{s:4:"data";s:105:"This plugin will generate a special XML sitemap which will help search engines to better index your blog.";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:32:"http://purl.org/dc/elements/1.1/";a:1:{s:7:"creator";a:1:{i:0;a:5:{s:4:"data";s:4:"Arne";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}}}i:1;a:6:{s:4:"data";s:30:"\n \n \n \n \n \n \n ";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";s:5:"child";a:2:{s:0:"";a:5:{s:5:"title";a:1:{i:0;a:5:{s:4:"data";s:49:"Joost de Valk on "Google Analytics for WordPress"";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"link";a:1:{i:0;a:5:{s:4:"data";s:77:"http://wordpress.org/extend/plugins/google-analytics-for-wordpress/#post-2316";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:7:"pubDate";a:1:{i:0;a:5:{s:4:"data";s:31:"Fri, 14 Sep 2007 12:15:27 +0000";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"guid";a:1:{i:0;a:5:{s:4:"data";s:41:"2316@http://wordpress.org/extend/plugins/";s:7:"attribs";a:1:{s:0:"";a:1:{s:11:"isPermaLink";s:5:"false";}}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:11:"description";a:1:{i:0;a:5:{s:4:"data";s:145:"Track your WordPress site easily and with lots of metadata: views per author & category, automatic tracking of outbound clicks and pageviews.";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:32:"http://purl.org/dc/elements/1.1/";a:1:{s:7:"creator";a:1:{i:0;a:5:{s:4:"data";s:13:"Joost de Valk";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}}}i:2;a:6:{s:4:"data";s:30:"\n \n \n \n \n \n \n ";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";s:5:"child";a:2:{s:0:"";a:5:{s:5:"title";a:1:{i:0;a:5:{s:4:"data";s:33:"uberdose on "All in One SEO Pack"";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"link";a:1:{i:0;a:5:{s:4:"data";s:65:"http://wordpress.org/extend/plugins/all-in-one-seo-pack/#post-753";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:7:"pubDate";a:1:{i:0;a:5:{s:4:"data";s:31:"Fri, 30 Mar 2007 20:08:18 +0000";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"guid";a:1:{i:0;a:5:{s:4:"data";s:40:"753@http://wordpress.org/extend/plugins/";s:7:"attribs";a:1:{s:0:"";a:1:{s:11:"isPermaLink";s:5:"false";}}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:11:"description";a:1:{i:0;a:5:{s:4:"data";s:92:"Automatically optimizes your Wordpress blog for Search Engines (Search Engine Optimization).";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:32:"http://purl.org/dc/elements/1.1/";a:1:{s:7:"creator";a:1:{i:0;a:5:{s:4:"data";s:8:"uberdose";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}}}i:3;a:6:{s:4:"data";s:30:"\n \n \n \n \n \n \n ";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";s:5:"child";a:2:{s:0:"";a:5:{s:5:"title";a:1:{i:0;a:5:{s:4:"data";s:36:"Takayuki Miyoshi on "Contact Form 7"";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"link";a:1:{i:0;a:5:{s:4:"data";s:61:"http://wordpress.org/extend/plugins/contact-form-7/#post-2141";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:7:"pubDate";a:1:{i:0;a:5:{s:4:"data";s:31:"Thu, 02 Aug 2007 12:45:03 +0000";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"guid";a:1:{i:0;a:5:{s:4:"data";s:41:"2141@http://wordpress.org/extend/plugins/";s:7:"attribs";a:1:{s:0:"";a:1:{s:11:"isPermaLink";s:5:"false";}}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:11:"description";a:1:{i:0;a:5:{s:4:"data";s:54:"Just another contact form plugin. Simple but flexible.";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:32:"http://purl.org/dc/elements/1.1/";a:1:{s:7:"creator";a:1:{i:0;a:5:{s:4:"data";s:16:"Takayuki Miyoshi";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}}}i:4;a:6:{s:4:"data";s:30:"\n \n \n \n \n \n \n ";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";s:5:"child";a:2:{s:0:"";a:5:{s:5:"title";a:1:{i:0;a:5:{s:4:"data";s:66:"eight7teen on "SexyBookmarks | email, bookmark, and share buttons"";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"link";a:1:{i:0;a:5:{s:4:"data";s:60:"http://wordpress.org/extend/plugins/sexybookmarks/#post-9249";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:7:"pubDate";a:1:{i:0;a:5:{s:4:"data";s:31:"Sun, 22 Feb 2009 11:30:11 +0000";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"guid";a:1:{i:0;a:5:{s:4:"data";s:41:"9249@http://wordpress.org/extend/plugins/";s:7:"attribs";a:1:{s:0:"";a:1:{s:11:"isPermaLink";s:5:"false";}}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:11:"description";a:1:{i:0;a:5:{s:4:"data";s:104:"Adds an attractive social bookmarking menu to your posts, pages, index, or any combination of the three.";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:32:"http://purl.org/dc/elements/1.1/";a:1:{s:7:"creator";a:1:{i:0;a:5:{s:4:"data";s:10:"eight7teen";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}}}i:5;a:6:{s:4:"data";s:30:"\n \n \n \n \n \n \n ";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";s:5:"child";a:2:{s:0:"";a:5:{s:5:"title";a:1:{i:0;a:5:{s:4:"data";s:30:"BraveNewCode Inc. on "WPtouch"";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"link";a:1:{i:0;a:5:{s:4:"data";s:54:"http://wordpress.org/extend/plugins/wptouch/#post-5468";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:7:"pubDate";a:1:{i:0;a:5:{s:4:"data";s:31:"Thu, 01 May 2008 04:58:09 +0000";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"guid";a:1:{i:0;a:5:{s:4:"data";s:41:"5468@http://wordpress.org/extend/plugins/";s:7:"attribs";a:1:{s:0:"";a:1:{s:11:"isPermaLink";s:5:"false";}}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:11:"description";a:1:{i:0;a:5:{s:4:"data";s:150:"WPtouch: A simple, powerful and elegant mobile theme for your website.\n\nWPtouch automatically transforms your WordPress blog into an iPhone applicatio";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:32:"http://purl.org/dc/elements/1.1/";a:1:{s:7:"creator";a:1:{i:0;a:5:{s:4:"data";s:17:"BraveNewCode Inc.";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}}}i:6;a:6:{s:4:"data";s:30:"\n \n \n \n \n \n \n ";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";s:5:"child";a:2:{s:0:"";a:5:{s:5:"title";a:1:{i:0;a:5:{s:4:"data";s:38:"Brian Colinger on "WordPress Importer"";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"link";a:1:{i:0;a:5:{s:4:"data";s:66:"http://wordpress.org/extend/plugins/wordpress-importer/#post-18101";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:7:"pubDate";a:1:{i:0;a:5:{s:4:"data";s:31:"Thu, 20 May 2010 17:42:45 +0000";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"guid";a:1:{i:0;a:5:{s:4:"data";s:42:"18101@http://wordpress.org/extend/plugins/";s:7:"attribs";a:1:{s:0:"";a:1:{s:11:"isPermaLink";s:5:"false";}}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:11:"description";a:1:{i:0;a:5:{s:4:"data";s:101:"Import posts, pages, comments, custom fields, categories, tags and more from a WordPress export file.";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:32:"http://purl.org/dc/elements/1.1/";a:1:{s:7:"creator";a:1:{i:0;a:5:{s:4:"data";s:14:"Brian Colinger";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}}}i:7;a:6:{s:4:"data";s:30:"\n \n \n \n \n \n \n ";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";s:5:"child";a:2:{s:0:"";a:5:{s:5:"title";a:1:{i:0;a:5:{s:4:"data";s:42:"Mike Challis on "Fast Secure Contact Form"";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"link";a:1:{i:0;a:5:{s:4:"data";s:63:"http://wordpress.org/extend/plugins/si-contact-form/#post-12636";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:7:"pubDate";a:1:{i:0;a:5:{s:4:"data";s:31:"Thu, 27 Aug 2009 01:20:04 +0000";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"guid";a:1:{i:0;a:5:{s:4:"data";s:42:"12636@http://wordpress.org/extend/plugins/";s:7:"attribs";a:1:{s:0:"";a:1:{s:11:"isPermaLink";s:5:"false";}}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:11:"description";a:1:{i:0;a:5:{s:4:"data";s:131:"A super customizable contact form that lets your visitors send you email. Blocks all automated spammers. No templates to mess with.";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:32:"http://purl.org/dc/elements/1.1/";a:1:{s:7:"creator";a:1:{i:0;a:5:{s:4:"data";s:12:"Mike Challis";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}}}i:8;a:6:{s:4:"data";s:30:"\n \n \n \n \n \n \n ";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";s:5:"child";a:2:{s:0:"";a:5:{s:5:"title";a:1:{i:0;a:5:{s:4:"data";s:34:"flash gallery on "1 Flash Gallery"";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"link";a:1:{i:0;a:5:{s:4:"data";s:63:"http://wordpress.org/extend/plugins/1-flash-gallery/#post-24163";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:7:"pubDate";a:1:{i:0;a:5:{s:4:"data";s:31:"Thu, 03 Feb 2011 14:02:51 +0000";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"guid";a:1:{i:0;a:5:{s:4:"data";s:42:"24163@http://wordpress.org/extend/plugins/";s:7:"attribs";a:1:{s:0:"";a:1:{s:11:"isPermaLink";s:5:"false";}}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:11:"description";a:1:{i:0;a:5:{s:4:"data";s:146:"1 Flash Gallery is a Photo Gallery with slideshow function, many skins and powerfull admin to manage your image gallery without any program skills";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:32:"http://purl.org/dc/elements/1.1/";a:1:{s:7:"creator";a:1:{i:0;a:5:{s:4:"data";s:13:"flash gallery";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}}}i:9;a:6:{s:4:"data";s:30:"\n \n \n \n \n \n \n ";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";s:5:"child";a:2:{s:0:"";a:5:{s:5:"title";a:1:{i:0;a:5:{s:4:"data";s:30:"Alex Rabe on "NextGEN Gallery"";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"link";a:1:{i:0;a:5:{s:4:"data";s:62:"http://wordpress.org/extend/plugins/nextgen-gallery/#post-1169";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:7:"pubDate";a:1:{i:0;a:5:{s:4:"data";s:31:"Mon, 23 Apr 2007 20:08:06 +0000";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"guid";a:1:{i:0;a:5:{s:4:"data";s:41:"1169@http://wordpress.org/extend/plugins/";s:7:"attribs";a:1:{s:0:"";a:1:{s:11:"isPermaLink";s:5:"false";}}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:11:"description";a:1:{i:0;a:5:{s:4:"data";s:108:"NextGEN Gallery is a full integrated Image Gallery plugin for WordPress with dozens of options and features.";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:32:"http://purl.org/dc/elements/1.1/";a:1:{s:7:"creator";a:1:{i:0;a:5:{s:4:"data";s:9:"Alex Rabe";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}}}i:10;a:6:{s:4:"data";s:30:"\n \n \n \n \n \n \n ";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";s:5:"child";a:2:{s:0:"";a:5:{s:5:"title";a:1:{i:0;a:5:{s:4:"data";s:37:"Michael Torbert on "WP Security Scan"";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"link";a:1:{i:0;a:5:{s:4:"data";s:63:"http://wordpress.org/extend/plugins/wp-security-scan/#post-4986";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:7:"pubDate";a:1:{i:0;a:5:{s:4:"data";s:31:"Sat, 29 Mar 2008 20:05:44 +0000";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"guid";a:1:{i:0;a:5:{s:4:"data";s:41:"4986@http://wordpress.org/extend/plugins/";s:7:"attribs";a:1:{s:0:"";a:1:{s:11:"isPermaLink";s:5:"false";}}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:11:"description";a:1:{i:0;a:5:{s:4:"data";s:63:"Scans your WordPress installation for security vulnerabilities.";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:32:"http://purl.org/dc/elements/1.1/";a:1:{s:7:"creator";a:1:{i:0;a:5:{s:4:"data";s:15:"Michael Torbert";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}}}i:11;a:6:{s:4:"data";s:30:"\n \n \n \n \n \n \n ";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";s:5:"child";a:2:{s:0:"";a:5:{s:5:"title";a:1:{i:0;a:5:{s:4:"data";s:28:"casibus on "ourSTATS Widget"";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"link";a:1:{i:0;a:5:{s:4:"data";s:65:"http://wordpress.org/extend/plugins/ourstatsde-widget/#post-18282";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:7:"pubDate";a:1:{i:0;a:5:{s:4:"data";s:31:"Sat, 29 May 2010 14:16:19 +0000";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"guid";a:1:{i:0;a:5:{s:4:"data";s:42:"18282@http://wordpress.org/extend/plugins/";s:7:"attribs";a:1:{s:0:"";a:1:{s:11:"isPermaLink";s:5:"false";}}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:11:"description";a:1:{i:0;a:5:{s:4:"data";s:51:"create a widget for the ourstats.de counter service";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:32:"http://purl.org/dc/elements/1.1/";a:1:{s:7:"creator";a:1:{i:0;a:5:{s:4:"data";s:7:"casibus";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}}}i:12;a:6:{s:4:"data";s:30:"\n \n \n \n \n \n \n ";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";s:5:"child";a:2:{s:0:"";a:5:{s:5:"title";a:1:{i:0;a:5:{s:4:"data";s:66:"mitcho (Michael ?? Erlewine) on "Yet Another Related Posts Plugin"";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"link";a:1:{i:0;a:5:{s:4:"data";s:79:"http://wordpress.org/extend/plugins/yet-another-related-posts-plugin/#post-2769";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:7:"pubDate";a:1:{i:0;a:5:{s:4:"data";s:31:"Wed, 02 Jan 2008 13:05:03 +0000";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"guid";a:1:{i:0;a:5:{s:4:"data";s:41:"2769@http://wordpress.org/extend/plugins/";s:7:"attribs";a:1:{s:0:"";a:1:{s:11:"isPermaLink";s:5:"false";}}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:11:"description";a:1:{i:0;a:5:{s:4:"data";s:133:"Display a list of related entries on your site and feeds based on a unique algorithm. Templating allows customization of the display.";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:32:"http://purl.org/dc/elements/1.1/";a:1:{s:7:"creator";a:1:{i:0;a:5:{s:4:"data";s:28:"mitcho (Michael ?? Erlewine)";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}}}i:13;a:6:{s:4:"data";s:30:"\n \n \n \n \n \n \n ";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";s:5:"child";a:2:{s:0:"";a:5:{s:5:"title";a:1:{i:0;a:5:{s:4:"data";s:38:"mdawaffe on "Jetpack by WordPress.com"";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"link";a:1:{i:0;a:5:{s:4:"data";s:55:"http://wordpress.org/extend/plugins/jetpack/#post-23862";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:7:"pubDate";a:1:{i:0;a:5:{s:4:"data";s:31:"Thu, 20 Jan 2011 02:21:38 +0000";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"guid";a:1:{i:0;a:5:{s:4:"data";s:42:"23862@http://wordpress.org/extend/plugins/";s:7:"attribs";a:1:{s:0:"";a:1:{s:11:"isPermaLink";s:5:"false";}}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:11:"description";a:1:{i:0;a:5:{s:4:"data";s:104:"Supercharge your WordPress site with powerful features previously only available to WordPress.com users.";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:32:"http://purl.org/dc/elements/1.1/";a:1:{s:7:"creator";a:1:{i:0;a:5:{s:4:"data";s:8:"mdawaffe";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}}}i:14;a:6:{s:4:"data";s:30:"\n \n \n \n \n \n \n ";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";s:5:"child";a:2:{s:0:"";a:5:{s:5:"title";a:1:{i:0;a:5:{s:4:"data";s:27:"Frank on "Secure WordPress"";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"link";a:1:{i:0;a:5:{s:4:"data";s:63:"http://wordpress.org/extend/plugins/secure-wordpress/#post-5920";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:7:"pubDate";a:1:{i:0;a:5:{s:4:"data";s:31:"Wed, 11 Jun 2008 10:26:19 +0000";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"guid";a:1:{i:0;a:5:{s:4:"data";s:41:"5920@http://wordpress.org/extend/plugins/";s:7:"attribs";a:1:{s:0:"";a:1:{s:11:"isPermaLink";s:5:"false";}}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:11:"description";a:1:{i:0;a:5:{s:4:"data";s:25:"WordPress Security Plugin";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:32:"http://purl.org/dc/elements/1.1/";a:1:{s:7:"creator";a:1:{i:0;a:5:{s:4:"data";s:5:"Frank";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}}}}}s:27:"http://www.w3.org/2005/Atom";a:1:{s:4:"link";a:1:{i:0;a:5:{s:4:"data";s:0:"";s:7:"attribs";a:1:{s:0:"";a:3:{s:4:"href";s:52:"http://wordpress.org/extend/plugins/rss/view/popular";s:3:"rel";s:4:"self";s:4:"type";s:19:"application/rss+xml";}}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}}}}}}}}}}s:4:"type";i:128;s:7:"headers";a:8:{s:6:"server";s:5:"nginx";s:4:"date";s:29:"Thu, 20 Oct 2011 18:53:51 GMT";s:12:"content-type";s:23:"text/xml; charset=UTF-8";s:10:"connection";s:5:"close";s:4:"vary";s:15:"Accept-Encoding";s:13:"last-modified";s:19:"2007-03-09 22:31:32";s:14:"content-length";s:4:"7895";s:4:"x-nc";s:11:"HIT luv 139";}s:5:"build";s:14:"20090627192103";}', 'no'), +(135, 0, '_transient_timeout_feed_mod_a5420c83891a9c88ad2a4f04584a5efc', '1319180030', 'no'), +(136, 0, '_transient_feed_mod_a5420c83891a9c88ad2a4f04584a5efc', '1319136830', 'no'), +(137, 0, '_transient_timeout_feed_57bc725ad6568758915363af670fd8bc', '1319180030', 'no'), +(138, 0, '_transient_feed_57bc725ad6568758915363af670fd8bc', 'a:4:{s:5:"child";a:1:{s:0:"";a:1:{s:3:"rss";a:1:{i:0;a:6:{s:4:"data";s:3:"\n \n";s:7:"attribs";a:1:{s:0:"";a:1:{s:7:"version";s:3:"2.0";}}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";s:5:"child";a:1:{s:0:"";a:1:{s:7:"channel";a:1:{i:0;a:6:{s:4:"data";s:72:"\n \n \n \n \n \n \n \n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n ";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";s:5:"child";a:2:{s:0:"";a:7:{s:5:"title";a:1:{i:0;a:5:{s:4:"data";s:33:"WordPress Plugins » View: Newest";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"link";a:1:{i:0;a:5:{s:4:"data";s:47:"http://wordpress.org/extend/plugins/browse/new/";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:11:"description";a:1:{i:0;a:5:{s:4:"data";s:33:"WordPress Plugins » View: Newest";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:8:"language";a:1:{i:0;a:5:{s:4:"data";s:5:"en-US";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:7:"pubDate";a:1:{i:0;a:5:{s:4:"data";s:31:"Thu, 20 Oct 2011 18:45:54 +0000";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:9:"generator";a:1:{i:0;a:5:{s:4:"data";s:25:"http://bbpress.org/?v=1.1";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"item";a:15:{i:0;a:6:{s:4:"data";s:30:"\n \n \n \n \n \n \n ";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";s:5:"child";a:2:{s:0:"";a:5:{s:5:"title";a:1:{i:0;a:5:{s:4:"data";s:30:"vagabumming on "Branded Email"";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"link";a:1:{i:0;a:5:{s:4:"data";s:61:"http://wordpress.org/extend/plugins/branded-email/#post-31324";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:7:"pubDate";a:1:{i:0;a:5:{s:4:"data";s:31:"Thu, 20 Oct 2011 15:18:54 +0000";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"guid";a:1:{i:0;a:5:{s:4:"data";s:42:"31324@http://wordpress.org/extend/plugins/";s:7:"attribs";a:1:{s:0:"";a:1:{s:11:"isPermaLink";s:5:"false";}}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:11:"description";a:1:{i:0;a:5:{s:4:"data";s:48:"Sends your logo with WordPress generated emails.";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:32:"http://purl.org/dc/elements/1.1/";a:1:{s:7:"creator";a:1:{i:0;a:5:{s:4:"data";s:11:"vagabumming";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}}}i:1;a:6:{s:4:"data";s:30:"\n \n \n \n \n \n \n ";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";s:5:"child";a:2:{s:0:"";a:5:{s:5:"title";a:1:{i:0;a:5:{s:4:"data";s:35:"jamiedust on "TinyMCE Blockformats"";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"link";a:1:{i:0;a:5:{s:4:"data";s:68:"http://wordpress.org/extend/plugins/tinymce-blockformats/#post-31256";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:7:"pubDate";a:1:{i:0;a:5:{s:4:"data";s:31:"Tue, 18 Oct 2011 22:49:23 +0000";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"guid";a:1:{i:0;a:5:{s:4:"data";s:42:"31256@http://wordpress.org/extend/plugins/";s:7:"attribs";a:1:{s:0:"";a:1:{s:11:"isPermaLink";s:5:"false";}}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:11:"description";a:1:{i:0;a:5:{s:4:"data";s:103:"This plugin allows you to select which elements are used in the formats dropdown on the TinyMCE editor.";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:32:"http://purl.org/dc/elements/1.1/";a:1:{s:7:"creator";a:1:{i:0;a:5:{s:4:"data";s:9:"jamiedust";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}}}i:2;a:6:{s:4:"data";s:30:"\n \n \n \n \n \n \n ";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";s:5:"child";a:2:{s:0:"";a:5:{s:5:"title";a:1:{i:0;a:5:{s:4:"data";s:37:"ramseyp on "Foomark WordPress Widget"";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"link";a:1:{i:0;a:5:{s:4:"data";s:72:"http://wordpress.org/extend/plugins/foomark-wordpress-widget/#post-31304";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:7:"pubDate";a:1:{i:0;a:5:{s:4:"data";s:31:"Wed, 19 Oct 2011 23:57:15 +0000";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"guid";a:1:{i:0;a:5:{s:4:"data";s:42:"31304@http://wordpress.org/extend/plugins/";s:7:"attribs";a:1:{s:0:"";a:1:{s:11:"isPermaLink";s:5:"false";}}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:11:"description";a:1:{i:0;a:5:{s:4:"data";s:69:"Foomark WordPress Widget displays your Foomark bookmarks in a widget.";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:32:"http://purl.org/dc/elements/1.1/";a:1:{s:7:"creator";a:1:{i:0;a:5:{s:4:"data";s:7:"ramseyp";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}}}i:3;a:6:{s:4:"data";s:30:"\n \n \n \n \n \n \n ";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";s:5:"child";a:2:{s:0:"";a:5:{s:5:"title";a:1:{i:0;a:5:{s:4:"data";s:27:"goonanism on "Gallery Only"";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"link";a:1:{i:0;a:5:{s:4:"data";s:60:"http://wordpress.org/extend/plugins/gallery-only/#post-31272";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:7:"pubDate";a:1:{i:0;a:5:{s:4:"data";s:31:"Wed, 19 Oct 2011 11:07:37 +0000";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"guid";a:1:{i:0;a:5:{s:4:"data";s:42:"31272@http://wordpress.org/extend/plugins/";s:7:"attribs";a:1:{s:0:"";a:1:{s:11:"isPermaLink";s:5:"false";}}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:11:"description";a:1:{i:0;a:5:{s:4:"data";s:123:"Description: This plugin replaces the default gallery with clean looking carousel that utilises the Moodular jQuery plugin.";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:32:"http://purl.org/dc/elements/1.1/";a:1:{s:7:"creator";a:1:{i:0;a:5:{s:4:"data";s:9:"goonanism";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}}}i:4;a:6:{s:4:"data";s:30:"\n \n \n \n \n \n \n ";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";s:5:"child";a:2:{s:0:"";a:5:{s:5:"title";a:1:{i:0;a:5:{s:4:"data";s:40:"Sergey Biryukov on "IDN AJAX Workaround"";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"link";a:1:{i:0;a:5:{s:4:"data";s:67:"http://wordpress.org/extend/plugins/idn-ajax-workaround/#post-31319";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:7:"pubDate";a:1:{i:0;a:5:{s:4:"data";s:31:"Thu, 20 Oct 2011 13:54:51 +0000";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"guid";a:1:{i:0;a:5:{s:4:"data";s:42:"31319@http://wordpress.org/extend/plugins/";s:7:"attribs";a:1:{s:0:"";a:1:{s:11:"isPermaLink";s:5:"false";}}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:11:"description";a:1:{i:0;a:5:{s:4:"data";s:62:"Fixes AJAX requests on sites with IDN domains in IE and Opera.";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:32:"http://purl.org/dc/elements/1.1/";a:1:{s:7:"creator";a:1:{i:0;a:5:{s:4:"data";s:15:"Sergey Biryukov";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}}}i:5;a:6:{s:4:"data";s:30:"\n \n \n \n \n \n \n ";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";s:5:"child";a:2:{s:0:"";a:5:{s:5:"title";a:1:{i:0;a:5:{s:4:"data";s:42:"dean-silversquare on "FB Thumbnail Config"";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"link";a:1:{i:0;a:5:{s:4:"data";s:67:"http://wordpress.org/extend/plugins/fb-thumbnail-config/#post-30863";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:7:"pubDate";a:1:{i:0;a:5:{s:4:"data";s:31:"Thu, 06 Oct 2011 17:08:49 +0000";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"guid";a:1:{i:0;a:5:{s:4:"data";s:42:"30863@http://wordpress.org/extend/plugins/";s:7:"attribs";a:1:{s:0:"";a:1:{s:11:"isPermaLink";s:5:"false";}}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:11:"description";a:1:{i:0;a:5:{s:4:"data";s:150:"Customize thumbnails and descriptions generated on Facebook when your post/page is shared. This plugin lets you to control exactly how your posts/page";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:32:"http://purl.org/dc/elements/1.1/";a:1:{s:7:"creator";a:1:{i:0;a:5:{s:4:"data";s:17:"dean-silversquare";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}}}i:6;a:6:{s:4:"data";s:30:"\n \n \n \n \n \n \n ";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";s:5:"child";a:2:{s:0:"";a:5:{s:5:"title";a:1:{i:0;a:5:{s:4:"data";s:44:"octeth_wordpress on "Octeth Email Marketing"";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"link";a:1:{i:0;a:5:{s:4:"data";s:70:"http://wordpress.org/extend/plugins/octeth-email-marketing/#post-31309";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:7:"pubDate";a:1:{i:0;a:5:{s:4:"data";s:31:"Thu, 20 Oct 2011 07:55:35 +0000";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"guid";a:1:{i:0;a:5:{s:4:"data";s:42:"31309@http://wordpress.org/extend/plugins/";s:7:"attribs";a:1:{s:0:"";a:1:{s:11:"isPermaLink";s:5:"false";}}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:11:"description";a:1:{i:0;a:5:{s:4:"data";s:129:"With this plug-in, blog owner will be able to "link" his Oempro account with WordPress and start accepting subscriptions.";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:32:"http://purl.org/dc/elements/1.1/";a:1:{s:7:"creator";a:1:{i:0;a:5:{s:4:"data";s:16:"octeth_wordpress";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}}}i:7;a:6:{s:4:"data";s:30:"\n \n \n \n \n \n \n ";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";s:5:"child";a:2:{s:0:"";a:5:{s:5:"title";a:1:{i:0;a:5:{s:4:"data";s:21:"sstukov on "UserLook"";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"link";a:1:{i:0;a:5:{s:4:"data";s:56:"http://wordpress.org/extend/plugins/userlook/#post-31252";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:7:"pubDate";a:1:{i:0;a:5:{s:4:"data";s:31:"Tue, 18 Oct 2011 18:52:46 +0000";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"guid";a:1:{i:0;a:5:{s:4:"data";s:42:"31252@http://wordpress.org/extend/plugins/";s:7:"attribs";a:1:{s:0:"";a:1:{s:11:"isPermaLink";s:5:"false";}}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:11:"description";a:1:{i:0;a:5:{s:4:"data";s:79:"Integrate UserLook - real time analytics of your blog activity. Live dashboard.";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:32:"http://purl.org/dc/elements/1.1/";a:1:{s:7:"creator";a:1:{i:0;a:5:{s:4:"data";s:7:"sstukov";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}}}i:8;a:6:{s:4:"data";s:30:"\n \n \n \n \n \n \n ";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";s:5:"child";a:2:{s:0:"";a:5:{s:5:"title";a:1:{i:0;a:5:{s:4:"data";s:22:"edouardb on "wtipress"";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"link";a:1:{i:0;a:5:{s:4:"data";s:56:"http://wordpress.org/extend/plugins/wtipress/#post-30214";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:7:"pubDate";a:1:{i:0;a:5:{s:4:"data";s:31:"Fri, 16 Sep 2011 08:23:38 +0000";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"guid";a:1:{i:0;a:5:{s:4:"data";s:42:"30214@http://wordpress.org/extend/plugins/";s:7:"attribs";a:1:{s:0:"";a:1:{s:11:"isPermaLink";s:5:"false";}}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:11:"description";a:1:{i:0;a:5:{s:4:"data";s:99:"Makes a Wordpress site multilingual, and allows to push translations to WebTranslateIt.com service.";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:32:"http://purl.org/dc/elements/1.1/";a:1:{s:7:"creator";a:1:{i:0;a:5:{s:4:"data";s:8:"edouardb";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}}}i:9;a:6:{s:4:"data";s:30:"\n \n \n \n \n \n \n ";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";s:5:"child";a:2:{s:0:"";a:5:{s:5:"title";a:1:{i:0;a:5:{s:4:"data";s:36:"rodrigo007994 on "Simple Pagination"";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"link";a:1:{i:0;a:5:{s:4:"data";s:61:"http://wordpress.org/extend/plugins/blog-download/#post-31300";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:7:"pubDate";a:1:{i:0;a:5:{s:4:"data";s:31:"Wed, 19 Oct 2011 18:32:46 +0000";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"guid";a:1:{i:0;a:5:{s:4:"data";s:42:"31300@http://wordpress.org/extend/plugins/";s:7:"attribs";a:1:{s:0:"";a:1:{s:11:"isPermaLink";s:5:"false";}}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:11:"description";a:1:{i:0;a:5:{s:4:"data";s:56:"Contributor: Rodrigo Villanueva Ceballos - zencherry.com";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:32:"http://purl.org/dc/elements/1.1/";a:1:{s:7:"creator";a:1:{i:0;a:5:{s:4:"data";s:13:"rodrigo007994";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}}}i:10;a:6:{s:4:"data";s:30:"\n \n \n \n \n \n \n ";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";s:5:"child";a:2:{s:0:"";a:5:{s:5:"title";a:1:{i:0;a:5:{s:4:"data";s:40:"masdiblogs on "WordPress Ping Optimizer"";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"link";a:1:{i:0;a:5:{s:4:"data";s:72:"http://wordpress.org/extend/plugins/wordpress-ping-optimizer/#post-31299";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:7:"pubDate";a:1:{i:0;a:5:{s:4:"data";s:31:"Wed, 19 Oct 2011 18:11:51 +0000";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"guid";a:1:{i:0;a:5:{s:4:"data";s:42:"31299@http://wordpress.org/extend/plugins/";s:7:"attribs";a:1:{s:0:"";a:1:{s:11:"isPermaLink";s:5:"false";}}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:11:"description";a:1:{i:0;a:5:{s:4:"data";s:119:"Save your wordpress blog from getting tagged as ping spammer. This plugin is a fork of the cbnet Ping Optimizer plugin.";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:32:"http://purl.org/dc/elements/1.1/";a:1:{s:7:"creator";a:1:{i:0;a:5:{s:4:"data";s:10:"masdiblogs";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}}}i:11;a:6:{s:4:"data";s:30:"\n \n \n \n \n \n \n ";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";s:5:"child";a:2:{s:0:"";a:5:{s:5:"title";a:1:{i:0;a:5:{s:4:"data";s:33:"scribu on "User Management Tools"";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"link";a:1:{i:0;a:5:{s:4:"data";s:69:"http://wordpress.org/extend/plugins/user-management-tools/#post-31298";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:7:"pubDate";a:1:{i:0;a:5:{s:4:"data";s:31:"Wed, 19 Oct 2011 17:33:08 +0000";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"guid";a:1:{i:0;a:5:{s:4:"data";s:42:"31298@http://wordpress.org/extend/plugins/";s:7:"attribs";a:1:{s:0:"";a:1:{s:11:"isPermaLink";s:5:"false";}}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:11:"description";a:1:{i:0;a:5:{s:4:"data";s:90:"Allows super-admins to quickly add users to a particular blog in a multisite installation.";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:32:"http://purl.org/dc/elements/1.1/";a:1:{s:7:"creator";a:1:{i:0;a:5:{s:4:"data";s:6:"scribu";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}}}i:12;a:6:{s:4:"data";s:30:"\n \n \n \n \n \n \n ";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";s:5:"child";a:2:{s:0:"";a:5:{s:5:"title";a:1:{i:0;a:5:{s:4:"data";s:42:"Syed Balkhi on "Prevent Skype Overwriting"";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"link";a:1:{i:0;a:5:{s:4:"data";s:73:"http://wordpress.org/extend/plugins/prevent-skype-overwriting/#post-31302";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:7:"pubDate";a:1:{i:0;a:5:{s:4:"data";s:31:"Wed, 19 Oct 2011 21:02:25 +0000";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"guid";a:1:{i:0;a:5:{s:4:"data";s:42:"31302@http://wordpress.org/extend/plugins/";s:7:"attribs";a:1:{s:0:"";a:1:{s:11:"isPermaLink";s:5:"false";}}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:11:"description";a:1:{i:0;a:5:{s:4:"data";s:110:"This plugin adds a simple meta code which prevents Skype from overwriting all phone numbers with their widget.";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:32:"http://purl.org/dc/elements/1.1/";a:1:{s:7:"creator";a:1:{i:0;a:5:{s:4:"data";s:11:"Syed Balkhi";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}}}i:13;a:6:{s:4:"data";s:30:"\n \n \n \n \n \n \n ";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";s:5:"child";a:2:{s:0:"";a:5:{s:5:"title";a:1:{i:0;a:5:{s:4:"data";s:20:"Eli on "SPOSTARBUST"";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"link";a:1:{i:0;a:5:{s:4:"data";s:59:"http://wordpress.org/extend/plugins/spostarbust/#post-31263";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:7:"pubDate";a:1:{i:0;a:5:{s:4:"data";s:31:"Wed, 19 Oct 2011 08:11:05 +0000";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"guid";a:1:{i:0;a:5:{s:4:"data";s:42:"31263@http://wordpress.org/extend/plugins/";s:7:"attribs";a:1:{s:0:"";a:1:{s:11:"isPermaLink";s:5:"false";}}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:11:"description";a:1:{i:0;a:5:{s:4:"data";s:58:"Show Posts On Sidebar That Are Related By Using Same Tags.";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:32:"http://purl.org/dc/elements/1.1/";a:1:{s:7:"creator";a:1:{i:0;a:5:{s:4:"data";s:3:"Eli";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}}}i:14;a:6:{s:4:"data";s:30:"\n \n \n \n \n \n \n ";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";s:5:"child";a:2:{s:0:"";a:5:{s:5:"title";a:1:{i:0;a:5:{s:4:"data";s:32:"GeekPress on "Simple Pagination"";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"link";a:1:{i:0;a:5:{s:4:"data";s:65:"http://wordpress.org/extend/plugins/simple-pagination/#post-31159";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:7:"pubDate";a:1:{i:0;a:5:{s:4:"data";s:31:"Sat, 15 Oct 2011 19:42:16 +0000";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"guid";a:1:{i:0;a:5:{s:4:"data";s:42:"31159@http://wordpress.org/extend/plugins/";s:7:"attribs";a:1:{s:0:"";a:1:{s:11:"isPermaLink";s:5:"false";}}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:11:"description";a:1:{i:0;a:5:{s:4:"data";s:93:"Simple Pagination allows to set up an advanced pagination for easier navigation on your site.";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:32:"http://purl.org/dc/elements/1.1/";a:1:{s:7:"creator";a:1:{i:0;a:5:{s:4:"data";s:9:"GeekPress";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}}}}}s:27:"http://www.w3.org/2005/Atom";a:1:{s:4:"link";a:1:{i:0;a:5:{s:4:"data";s:0:"";s:7:"attribs";a:1:{s:0:"";a:3:{s:4:"href";s:48:"http://wordpress.org/extend/plugins/rss/view/new";s:3:"rel";s:4:"self";s:4:"type";s:19:"application/rss+xml";}}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}}}}}}}}}}s:4:"type";i:128;s:7:"headers";a:8:{s:6:"server";s:5:"nginx";s:4:"date";s:29:"Thu, 20 Oct 2011 18:53:52 GMT";s:12:"content-type";s:23:"text/xml; charset=UTF-8";s:10:"connection";s:5:"close";s:4:"vary";s:15:"Accept-Encoding";s:13:"last-modified";s:19:"2011-10-20 15:18:54";s:14:"content-length";s:4:"7663";s:4:"x-nc";s:11:"HIT luv 139";}s:5:"build";s:14:"20090627192103";}', 'no'), +(139, 0, '_transient_timeout_feed_mod_57bc725ad6568758915363af670fd8bc', '1319180030', 'no'), +(140, 0, '_transient_timeout_feed_867bd5c64f85878d03a060509cd2f92c', '1319180030', 'no'), +(141, 0, '_transient_feed_mod_57bc725ad6568758915363af670fd8bc', '1319136830', 'no'); +INSERT INTO `wpr3ss_options` (`option_id`, `blog_id`, `option_name`, `option_value`, `autoload`) VALUES +(142, 0, '_transient_feed_867bd5c64f85878d03a060509cd2f92c', 'a:4:{s:5:"child";a:1:{s:0:"";a:1:{s:3:"rss";a:1:{i:0;a:6:{s:4:"data";s:3:"\n\n\n";s:7:"attribs";a:1:{s:0:"";a:1:{s:7:"version";s:3:"2.0";}}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";s:5:"child";a:1:{s:0:"";a:1:{s:7:"channel";a:1:{i:0;a:6:{s:4:"data";s:61:"\n \n \n \n \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";s:5:"child";a:1:{s:0:"";a:5:{s:5:"title";a:1:{i:0;a:5:{s:4:"data";s:16:"WordPress Planet";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"link";a:1:{i:0;a:5:{s:4:"data";s:28:"http://planet.wordpress.org/";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:8:"language";a:1:{i:0;a:5:{s:4:"data";s:2:"en";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:11:"description";a:1:{i:0;a:5:{s:4:"data";s:47:"WordPress Planet - http://planet.wordpress.org/";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"item";a:50:{i:0;a:6:{s:4:"data";s:13:"\n \n \n \n \n \n \n";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";s:5:"child";a:2:{s:0:"";a:5:{s:5:"title";a:1:{i:0;a:5:{s:4:"data";s:53:"WPTavern: WordPress.com Blogs To Get More Advertising";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"guid";a:1:{i:0;a:5:{s:4:"data";s:31:"http://www.wptavern.com/?p=5677";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"link";a:1:{i:0;a:5:{s:4:"data";s:105:"http://feedproxy.google.com/~r/WordpressTavern/~3/d30p4ZUDNac/wordpress-com-blogs-to-get-more-advertising";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:11:"description";a:1:{i:0;a:5:{s:4:"data";s:3213:"

Automattic LogoFederated Media in partnership with Automattic has signed a deal to sell advertising to potentially 25 million websites spread across WordPress.com. This isn’t the first time the two have partnered up as FM and Automattic have been launching a series of websites for specific subjects such as FoodPress and EcoPress. This deal presents Federated Media the opportunity to sell highly relevant advertising in mass. For example, Automattic most likely has details that allow them to know the best performing sites on specific subjects such as automotive, food, tech, etc. This data can be used to display relevant advertising from FM so that the content and the advertising are related to each other.

\n

One of the quotes I’m seeing attributed to Toni Schneider, CEO of Automattic rubs me the wrong way.

\n

Automattic’s WordPress software supports 25 million blogs with a combined readership of 300 million unique visitors per month — a total of 15 percent of the web sites on the Internet, Schneider said.

\n

First off, the only thing of Automattics’ is WordPress.com. Secondly, while it seems like Toni is talking about 25 million blogs on WordPress.com, how can that be 15% of the internet? That’s like saying 15% of the internet calls WordPress.com home and I highly doubt that. The only way in which that makes sense is if you combine the sites using WordPress the self-hosted software and those hosted on WordPress.com.

\n

Based on the press release on MarketWatch, the advertising will be Opt-In. One of the most important questions that has not been answered is how revenue sharing will work. One would hope that those who are creating the content will end up getting a small slice of the pie. If not, it’s a bad deal all the way around.

\n\n\n

Related posts:

  1. Advertising Now An Option On WPTavern
  2. \n
  3. First FoodPress Now EcoPressed
  4. \n
  5. Ad Block Plus Not Needed Here
  6. \n

";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:7:"pubDate";a:1:{i:0;a:5:{s:4:"data";s:31:"Thu, 20 Oct 2011 17:00:39 +0000";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:32:"http://purl.org/dc/elements/1.1/";a:1:{s:7:"creator";a:1:{i:0;a:5:{s:4:"data";s:6:"Jeffro";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}}}i:1;a:6:{s:4:"data";s:13:"\n \n \n \n \n \n \n";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";s:5:"child";a:2:{s:0:"";a:5:{s:5:"title";a:1:{i:0;a:5:{s:4:"data";s:59:"WPTavern: A First For Automattic – Investment In OwnLocal";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"guid";a:1:{i:0;a:5:{s:4:"data";s:31:"http://www.wptavern.com/?p=5673";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"link";a:1:{i:0;a:5:{s:4:"data";s:107:"http://feedproxy.google.com/~r/WordpressTavern/~3/WfR0XD9RrGo/a-first-for-automattic-investment-in-ownlocal";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:11:"description";a:1:{i:0;a:5:{s:4:"data";s:2426:"

OwnLocal LogoAutomattic which is the company behind WordPress.com and is usually the one being invested in has made an investment themselves in a company called OwnLocal based out of Austin, Texas. The company has existed since 2007 and is built around publications by providing the tools necessary for newspapers to own their local market, hence the name. Liz Gannes of AllThingsD was the first to break the story and managed to get this quote out of Matt regarding the investment.

\n

Their approach is highly complementary to our own goals of making it easy for anyone in the world to have a beautiful Web site

\n

It’s an interesting investment considering local newspapers appear to be dying by the day. But OwnLocal is doing so well that despite the total amount of 2 million dollars thus far in funding, they are currently supporting their staff of 20 based on the revenue they are generating.

\n

Related But Not Required Reading:
\nOwnLocal nabs new funding from Automattic to resurrect newspaper revenues
\nOwnlocal scores funds to get small firms online

\n\n\n

Related posts:

  1. When Will Automattic Be Acquired?
  2. \n
  3. Automattic ALMOST Acquired At One Point
  4. \n
  5. Automattic Sporting Haikus
  6. \n

";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:7:"pubDate";a:1:{i:0;a:5:{s:4:"data";s:31:"Thu, 20 Oct 2011 13:00:39 +0000";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:32:"http://purl.org/dc/elements/1.1/";a:1:{s:7:"creator";a:1:{i:0;a:5:{s:4:"data";s:6:"Jeffro";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}}}i:2;a:6:{s:4:"data";s:13:"\n \n \n \n \n \n \n";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";s:5:"child";a:2:{s:0:"";a:5:{s:5:"title";a:1:{i:0;a:5:{s:4:"data";s:59:"Weblog Tools Collection: WordPress Theme Releases for 10/20";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"guid";a:1:{i:0;a:5:{s:4:"data";s:41:"http://weblogtoolscollection.com/?p=10618";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"link";a:1:{i:0;a:5:{s:4:"data";s:73:"http://feedproxy.google.com/~r/weblogtoolscollection/UXMP/~3/IbQ0BKE4KiU/";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:11:"description";a:1:{i:0;a:5:{s:4:"data";s:860:"

\n

Asokay is a full-featured but still simple and easy-to-use blog/website theme, built from the Toolbox theme.

\n

\n

Matisse is a minimalistic two-column and fixed-width theme.

\n";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:7:"pubDate";a:1:{i:0;a:5:{s:4:"data";s:31:"Thu, 20 Oct 2011 13:00:04 +0000";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:32:"http://purl.org/dc/elements/1.1/";a:1:{s:7:"creator";a:1:{i:0;a:5:{s:4:"data";s:5:"James";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}}}i:3;a:6:{s:4:"data";s:13:"\n \n \n \n \n \n \n";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";s:5:"child";a:2:{s:0:"";a:5:{s:5:"title";a:1:{i:0;a:5:{s:4:"data";s:30:"Dev Blog: WordPress 3.3 Beta 2";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"guid";a:1:{i:0;a:5:{s:4:"data";s:33:"http://wordpress.org/news/?p=2080";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"link";a:1:{i:0;a:5:{s:4:"data";s:55:"http://wordpress.org/news/2011/10/wordpress-3-3-beta-2/";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:11:"description";a:1:{i:0;a:5:{s:4:"data";s:900:"

Changes since Beta 1:

\n\n

Consult the full change log  for details, and see the Beta 1 announcement for information on how to help test Beta 2.

\n

Welcome for the new –
\n3.3 at beta 2.
\n(IE7, woo!)

\n

Download 3.3 Beta 2.

";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:7:"pubDate";a:1:{i:0;a:5:{s:4:"data";s:31:"Thu, 20 Oct 2011 02:39:28 +0000";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:32:"http://purl.org/dc/elements/1.1/";a:1:{s:7:"creator";a:1:{i:0;a:5:{s:4:"data";s:10:"Ryan Boren";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}}}i:4;a:6:{s:4:"data";s:13:"\n \n \n \n \n \n \n";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";s:5:"child";a:2:{s:0:"";a:5:{s:5:"title";a:1:{i:0;a:5:{s:4:"data";s:47:"WPTavern: Chip Bennett Hits 1,000 Theme Reviews";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"guid";a:1:{i:0;a:5:{s:4:"data";s:31:"http://www.wptavern.com/?p=5668";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"link";a:1:{i:0;a:5:{s:4:"data";s:98:"http://feedproxy.google.com/~r/WordpressTavern/~3/L4-YiPgPGKA/chip-bennett-hits-1000-theme-reviews";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:11:"description";a:1:{i:0;a:5:{s:4:"data";s:1598:"

Just a shout out and congratulations to Chip Bennett who recently hit the 1,000 theme reviews milestone. To see each one of his reviews, check out the ongoing list on Trac for the theme repository. Thanks Chip and the rest of the review team for providing your time and knowledge to making the theme repository a better place. .

\n

If you want to learn more about the theme review team, you should listen to episode 106 of WordPress weekly where most of the episode centers around the topic.

\n\n\n

Related posts:

  1. WPWeekly Episode 106 – The Theme Review Team
  2. \n
  3. Theme Repository Now Over 1,000 Themes
  4. \n
  5. Name Your Dream Theme Team
  6. \n

";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:7:"pubDate";a:1:{i:0;a:5:{s:4:"data";s:31:"Wed, 19 Oct 2011 22:00:56 +0000";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:32:"http://purl.org/dc/elements/1.1/";a:1:{s:7:"creator";a:1:{i:0;a:5:{s:4:"data";s:6:"Jeffro";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}}}i:5;a:6:{s:4:"data";s:13:"\n \n \n \n \n \n \n";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";s:5:"child";a:2:{s:0:"";a:5:{s:5:"title";a:1:{i:0;a:5:{s:4:"data";s:29:"Matt: Programming and Writing";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"guid";a:1:{i:0;a:5:{s:4:"data";s:21:"http://ma.tt/?p=39629";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"link";a:1:{i:0;a:5:{s:4:"data";s:45:"http://ma.tt/2011/10/programming-and-writing/";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:11:"description";a:1:{i:0;a:5:{s:4:"data";s:2462:"

I really enjoyed this quote from Brent Simmons in an interview with John Gruber.

\n

I’ve always thought of it this way: a good writer reads a lot of books. They see how other writers solve problems. They pay attention to what’s happening now as much as they pay attention to the classics. Good writers are readers first, but eagle-eyed, careful readers.

\n

I think good developers are the same: they look at other apps. They “read†those apps, the problems they have and how they solve them. They notice trends, they notice new solutions, they notice when things work and when they don’t.

\n

 

\n

It reminds me of some passages from a book I’m reading right now, Bird by Bird by Anne Lamott:

\n

Bird by BirdHowever, in the meantime, we are going to concentrate on writing itself, on how to become a better writer, because, for one thing, becoming a better writer is going to help you become a better reader, and that is the real payoff. [...]

\n

Writing can give you what having a baby can give you: it can get you to start paying attention, can help you soften, can wake you up. [...]

\n

Because for some of us, books are as important as almost anything else on earth. What a miracle it is that out of these small, flat, rigid squares of paper unfolds world after world after world, worlds that sing to you, comfort and quiet or excite you. Books help us understand who we are and how we are to behave. they show us what community and friendship mean; they show us how to live and die. They are full of all the things that you don’t get in real life — wonderful, lyrical language, for instance, right off the bat. And quality of attention: we may notice amazing details during the course of a day but we rarely let ourselves stop and really pay attention. An author makes you notice, makes you pay attention, and this is a great gift. My gratitude for good writing is unbounded; I’m grateful for it the way I’m grateful for the ocean.

\n

That’s how I feel about software.

";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:7:"pubDate";a:1:{i:0;a:5:{s:4:"data";s:31:"Wed, 19 Oct 2011 20:29:32 +0000";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:32:"http://purl.org/dc/elements/1.1/";a:1:{s:7:"creator";a:1:{i:0;a:5:{s:4:"data";s:4:"Matt";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}}}i:6;a:6:{s:4:"data";s:13:"\n \n \n \n \n \n \n";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";s:5:"child";a:2:{s:0:"";a:5:{s:5:"title";a:1:{i:0;a:5:{s:4:"data";s:26:"Matt: Federated Media Deal";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"guid";a:1:{i:0;a:5:{s:4:"data";s:21:"http://ma.tt/?p=39627";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"link";a:1:{i:0;a:5:{s:4:"data";s:42:"http://ma.tt/2011/10/federated-media-deal/";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:11:"description";a:1:{i:0;a:5:{s:4:"data";s:478:"

ReadWriteWeb covers the WordPress.com / Federated Media deal which will give high-end bloggers access to run advertising from FM, which is significantly higher quality than alternatives like Google Adsense, which has been declining in quality and is no longer a great choice for bloggers. Proud to be part of the empowerment of the Independent Web, which is the dark matter of the internet.

";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:7:"pubDate";a:1:{i:0;a:5:{s:4:"data";s:31:"Wed, 19 Oct 2011 20:25:16 +0000";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:32:"http://purl.org/dc/elements/1.1/";a:1:{s:7:"creator";a:1:{i:0;a:5:{s:4:"data";s:4:"Matt";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}}}i:7;a:6:{s:4:"data";s:13:"\n \n \n \n \n \n \n";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";s:5:"child";a:2:{s:0:"";a:5:{s:5:"title";a:1:{i:0;a:5:{s:4:"data";s:28:"Matt: Investment in OwnLocal";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"guid";a:1:{i:0;a:5:{s:4:"data";s:21:"http://ma.tt/?p=39624";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"link";a:1:{i:0;a:5:{s:4:"data";s:44:"http://ma.tt/2011/10/investment-in-ownlocal/";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:11:"description";a:1:{i:0;a:5:{s:4:"data";s:264:"

Liz Gannes breaks the story that Automattic has made its first investment, in newspaper toolmaker OwnLocal.

";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:7:"pubDate";a:1:{i:0;a:5:{s:4:"data";s:31:"Wed, 19 Oct 2011 18:20:03 +0000";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:32:"http://purl.org/dc/elements/1.1/";a:1:{s:7:"creator";a:1:{i:0;a:5:{s:4:"data";s:4:"Matt";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}}}i:8;a:6:{s:4:"data";s:13:"\n \n \n \n \n \n \n";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";s:5:"child";a:2:{s:0:"";a:5:{s:5:"title";a:1:{i:0;a:5:{s:4:"data";s:69:"WPTavern: Prevent Skype Overwriting Phone Numbers In WordPress Themes";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"guid";a:1:{i:0;a:5:{s:4:"data";s:31:"http://www.wptavern.com/?p=5666";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"link";a:1:{i:0;a:5:{s:4:"data";s:121:"http://feedproxy.google.com/~r/WordpressTavern/~3/4czZcc2tZIg/prevent-skype-overwriting-phone-numbers-in-wordpress-themes";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:11:"description";a:1:{i:0;a:5:{s:4:"data";s:1250:"

I didn’t know this was an actual problem until I read the advice on WPBeginner.com. Apparently, some WordPress themes can break when Skype changes a phone number into a number you can dial with Skype. The fix is a simple one liner that you add to the HEAD section of the theme. Personally, I don’t use Skype to call out and change my options to prevent the over riding phone numbers in the first place.

\n\n\n

Related posts:

  1. WordPress Themes In 2009
  2. \n
  3. Simple Guide To Adding Theme Options
  4. \n
  5. SitePoint Gives Primer On Parent Child Themes
  6. \n

";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:7:"pubDate";a:1:{i:0;a:5:{s:4:"data";s:31:"Wed, 19 Oct 2011 17:00:12 +0000";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:32:"http://purl.org/dc/elements/1.1/";a:1:{s:7:"creator";a:1:{i:0;a:5:{s:4:"data";s:6:"Jeffro";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}}}i:9;a:6:{s:4:"data";s:13:"\n \n \n \n \n \n \n";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";s:5:"child";a:2:{s:0:"";a:5:{s:5:"title";a:1:{i:0;a:5:{s:4:"data";s:51:"Donncha: Preload categories and custom post content";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"guid";a:1:{i:0;a:5:{s:4:"data";s:29:"http://ocaoimh.ie/?p=89496545";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"link";a:1:{i:0;a:5:{s:4:"data";s:72:"http://ocaoimh.ie/2011/10/19/preload-categories-and-custom-post-content/";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:11:"description";a:1:{i:0;a:5:{s:4:"data";s:2386:"

The never ending journey to WP Super Cache 1.0 continues. Go grab the development version of the plugin on the download page as there have been a few changes since my last post (where I announced support for mixed https sites among other things).

\n

Some of the changes:

\n\n

Only thing is, I need your help. The development version is running on this multisite install of WordPress and it’s working fine but I really need feedback, especially before 1.0 comes out.

\n

So, if you’re comfortable with WordPress please go visit the download page and install the development version. Thanks!

\n \n

Related Posts

";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:7:"pubDate";a:1:{i:0;a:5:{s:4:"data";s:31:"Wed, 19 Oct 2011 15:42:59 +0000";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:32:"http://purl.org/dc/elements/1.1/";a:1:{s:7:"creator";a:1:{i:0;a:5:{s:4:"data";s:16:"Donncha O Caoimh";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}}}i:10;a:6:{s:4:"data";s:13:"\n \n \n \n \n \n \n";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";s:5:"child";a:2:{s:0:"";a:5:{s:5:"title";a:1:{i:0;a:5:{s:4:"data";s:59:"Weblog Tools Collection: WordPress and Internationalization";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"guid";a:1:{i:0;a:5:{s:4:"data";s:41:"http://weblogtoolscollection.com/?p=10605";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"link";a:1:{i:0;a:5:{s:4:"data";s:73:"http://feedproxy.google.com/~r/weblogtoolscollection/UXMP/~3/X05idqRPB-8/";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:11:"description";a:1:{i:0;a:5:{s:4:"data";s:1077:"

I’m sure that you’re all familiar with WordPress in English, but did you know that WordPress is available in 121 languages? There is definitely a lot of work that goes into that, and it’s just another reflection of the power of the WordPress community.

\n

Maybe you want to know what goes into that, or how you can get involved. If you do, this presentation from WordCamp Montreal 2011, featuring Paolo Belcastro and Zé Fontainhas, offers a great peak into a world of WordPress that you may have never experienced or even expected.

\n
\n";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:7:"pubDate";a:1:{i:0;a:5:{s:4:"data";s:31:"Wed, 19 Oct 2011 13:00:32 +0000";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:32:"http://purl.org/dc/elements/1.1/";a:1:{s:7:"creator";a:1:{i:0;a:5:{s:4:"data";s:5:"James";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}}}i:11;a:6:{s:4:"data";s:13:"\n \n \n \n \n \n \n";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";s:5:"child";a:2:{s:0:"";a:5:{s:5:"title";a:1:{i:0;a:5:{s:4:"data";s:63:"WPTavern: WordPress Not Likely To Participate In Google Code-In";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"guid";a:1:{i:0;a:5:{s:4:"data";s:31:"http://www.wptavern.com/?p=5658";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"link";a:1:{i:0;a:5:{s:4:"data";s:115:"http://feedproxy.google.com/~r/WordpressTavern/~3/s_nw-Io5ZOw/wordpress-not-likely-to-participate-in-google-code-in";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:11:"description";a:1:{i:0;a:5:{s:4:"data";s:1819:"

Google Code In LogoWhile a decision has not yet been finalized, judging by the responses so far on this blog post discussing the pros and cons of participating, it looks like WordPress may not be part of the event this year. Google Code In is an annual event sponsored by Google that is aimed at students between the ages of 13 and 17. The goal of the program is to encourage youths to participate in open source which is in contrast to Google Summer of Code which is aimed at university students. We’ll know whether or not WordPress is part of the program either through the WordPress.org website or when Google announces the participating mentoring organizations on November 9th.

\n\n\n

Related posts:

  1. WordPress GSoC 2010 Program Under Way
  2. \n
  3. It’s That Time Of Year Again
  4. \n
  5. WordPress, Matt Cutts, And Google
  6. \n

";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:7:"pubDate";a:1:{i:0;a:5:{s:4:"data";s:31:"Wed, 19 Oct 2011 13:00:11 +0000";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:32:"http://purl.org/dc/elements/1.1/";a:1:{s:7:"creator";a:1:{i:0;a:5:{s:4:"data";s:6:"Jeffro";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}}}i:12;a:6:{s:4:"data";s:13:"\n \n \n \n \n \n \n";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";s:5:"child";a:2:{s:0:"";a:5:{s:5:"title";a:1:{i:0;a:5:{s:4:"data";s:54:"WPTavern: How To Insert Links Inside Of Image Captions";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"guid";a:1:{i:0;a:5:{s:4:"data";s:31:"http://www.wptavern.com/?p=5650";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"link";a:1:{i:0;a:5:{s:4:"data";s:106:"http://feedproxy.google.com/~r/WordpressTavern/~3/_-9dLCijK04/how-to-insert-links-inside-of-image-captions";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:11:"description";a:1:{i:0;a:5:{s:4:"data";s:4326:"

Occasionally, I ‘ll take a look through the WordPress Ideas site to see what kind of activity is going on. The other night, I discovered an idea that immediately lit the light bulb over my head, mostly because I couldn’t believe that it was not already a feature in WordPress. Approximately one year ago, Jeremy Clarke submitted the idea to allow URLs to be inserted into image captions with the primary goal of making it easy to attribute images to their source. I’ve personally come across the issue where instead of applying the image credits within the image caption, I have to add a note somewhere within the post which is stupid since image captions are the PERFECT spot for attribution. Fast forward to October 18th, 2011 with WordPress 3.3. knocking on the door and this ability is still not present within WordPress. However, there are a couple of things that point to this feature being added soon as the status for the idea is marked Good Idea! We’re Working On It. There is also a ticket in trac, #18311 that has a patch but is currently awaiting review.

\n

While there is not a native, user-friendly way of adding links to image captions, there are a couple of ways in which it can be accomplished. The first is by using ‘ instead of ” when entering the code for your link. However, when switching between the code and visual editors, the link is erased leaving text in place of the link.

\n

Second, you can try using the code provided by Kaspars of Konstruktors.com inside of your functions.php file which will add a “Source URL” field to every image that is uploaded through the WordPress media library. When using this method, it’s important to note that the source URL will be visible only if you specify an image caption upon inserting the image. If implemented correctly, it will look something like this.

\n

Adding An Image Source URL Field

\n

Third, you can try using the Links In Captions Plugin by Zack Katz. After activation, you can add links to captions via the following format: {link url=”http://www.example.com”}Anchor text here{/link} Two benefits to this plugin is that it has support for the Target and Rel attributes and you can use shortcodes within the caption area.

\n

Personally, I think Kaspars solution is the most user-friendly after the functions.php file is setup correctly. I’d like to see him package that as a plugin so more users can take advantage of it as it looks as though it was part of the media manager all along. However, the best scenario is for this functionality to some how end up within the core of WordPress. If you have the know-how, please consider contributing to the ticket or writing a better patch to get this into core.

\n\n\n

Related posts:

  1. Removing Links In Favor Of Menus?
  2. \n
  3. Spam Link Injection Sucks
  4. \n
  5. Screencast: Basic Image Editing In WordPress 2.9
  6. \n

";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:7:"pubDate";a:1:{i:0;a:5:{s:4:"data";s:31:"Tue, 18 Oct 2011 13:00:33 +0000";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:32:"http://purl.org/dc/elements/1.1/";a:1:{s:7:"creator";a:1:{i:0;a:5:{s:4:"data";s:6:"Jeffro";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}}}i:13;a:6:{s:4:"data";s:13:"\n \n \n \n \n \n \n";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";s:5:"child";a:2:{s:0:"";a:5:{s:5:"title";a:1:{i:0;a:5:{s:4:"data";s:60:"Weblog Tools Collection: WordPress Plugin Releases for 10/18";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"guid";a:1:{i:0;a:5:{s:4:"data";s:41:"http://weblogtoolscollection.com/?p=10602";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"link";a:1:{i:0;a:5:{s:4:"data";s:73:"http://feedproxy.google.com/~r/weblogtoolscollection/UXMP/~3/fltHL9bYCrw/";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:11:"description";a:1:{i:0;a:5:{s:4:"data";s:806:"

New plugins

\n

Contact Form with a Meeting Scheduler is an inviting contact form with built-in appointment dcheduler and video meetings.

\n

Updated plugins

\n

BackWPup allows you to backup your WordPress database, files, and more.

\n

jQuery Vertical Accordion Menu creates vertical accordion menus from any WordPress custom menu.

\n";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:7:"pubDate";a:1:{i:0;a:5:{s:4:"data";s:31:"Tue, 18 Oct 2011 13:00:03 +0000";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:32:"http://purl.org/dc/elements/1.1/";a:1:{s:7:"creator";a:1:{i:0;a:5:{s:4:"data";s:5:"James";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}}}i:14;a:6:{s:4:"data";s:13:"\n \n \n \n \n \n \n";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";s:5:"child";a:2:{s:0:"";a:5:{s:5:"title";a:1:{i:0;a:5:{s:4:"data";s:35:"Matt: Chatting with Dries of Drupal";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"guid";a:1:{i:0;a:5:{s:4:"data";s:21:"http://ma.tt/?p=39621";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"link";a:1:{i:0;a:5:{s:4:"data";s:51:"http://ma.tt/2011/10/chatting-with-dries-of-drupal/";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:11:"description";a:1:{i:0;a:5:{s:4:"data";s:493:"

The other week in my hometown of Houston, Texas I ended up on stage in a joint conversation with Dries Buytaert, the founder of Drupal. The video of our chat is now on WordPress.tv, and worth checking out particularly if you’re curious about the early history of both projects. We’re more alike than different, and Dries is someone I respect a lot.

";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:7:"pubDate";a:1:{i:0;a:5:{s:4:"data";s:31:"Mon, 17 Oct 2011 21:06:07 +0000";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:32:"http://purl.org/dc/elements/1.1/";a:1:{s:7:"creator";a:1:{i:0;a:5:{s:4:"data";s:4:"Matt";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}}}i:15;a:6:{s:4:"data";s:13:"\n \n \n \n \n \n \n";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";s:5:"child";a:2:{s:0:"";a:5:{s:5:"title";a:1:{i:0;a:5:{s:4:"data";s:21:"Matt: Parenting Story";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"guid";a:1:{i:0;a:5:{s:4:"data";s:21:"http://ma.tt/?p=39619";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"link";a:1:{i:0;a:5:{s:4:"data";s:37:"http://ma.tt/2011/10/parenting-story/";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:11:"description";a:1:{i:0;a:5:{s:4:"data";s:233:"

A great piece in the New York Times today: How do you parent without a future, knowing that you will lose your child, bit by bit?

";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:7:"pubDate";a:1:{i:0;a:5:{s:4:"data";s:31:"Mon, 17 Oct 2011 20:04:54 +0000";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:32:"http://purl.org/dc/elements/1.1/";a:1:{s:7:"creator";a:1:{i:0;a:5:{s:4:"data";s:4:"Matt";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}}}i:16;a:6:{s:4:"data";s:13:"\n \n \n \n \n \n \n";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";s:5:"child";a:2:{s:0:"";a:5:{s:5:"title";a:1:{i:0;a:5:{s:4:"data";s:44:"WPTavern: Validation And Sanitization Primer";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"guid";a:1:{i:0;a:5:{s:4:"data";s:31:"http://www.wptavern.com/?p=5643";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"link";a:1:{i:0;a:5:{s:4:"data";s:96:"http://feedproxy.google.com/~r/WordpressTavern/~3/T9RM9yS6PtM/validation-and-sanitization-primer";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:11:"description";a:1:{i:0;a:5:{s:4:"data";s:785:"

Daniel Bachhuber who works with WordPress.com VIP Services has published a guide covering some key differences with data validation and sanitization. His explanation is not so technical that even I understood it for the most part. If you’re a developer, definitely give the guide a read and give Daniel some feedback.

\n\n\n

Related posts:

  1. Is A Plugin Validation Team A Pipe Dream?
  2. \n

";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:7:"pubDate";a:1:{i:0;a:5:{s:4:"data";s:31:"Mon, 17 Oct 2011 17:00:28 +0000";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:32:"http://purl.org/dc/elements/1.1/";a:1:{s:7:"creator";a:1:{i:0;a:5:{s:4:"data";s:6:"Jeffro";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}}}i:17;a:6:{s:4:"data";s:13:"\n \n \n \n \n \n \n";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";s:5:"child";a:2:{s:0:"";a:5:{s:5:"title";a:1:{i:0;a:5:{s:4:"data";s:48:"WPTavern: Plugin Review – Expanded Admin Menus";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"guid";a:1:{i:0;a:5:{s:4:"data";s:31:"http://www.wptavern.com/?p=5637";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"link";a:1:{i:0;a:5:{s:4:"data";s:96:"http://feedproxy.google.com/~r/WordpressTavern/~3/x5rDUCXSn4M/plugin-review-expanded-admin-menus";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:11:"description";a:1:{i:0;a:5:{s:4:"data";s:3721:"

If you’re not happy about WordPress 3.3 taking away the ability to vertically expand and collapse menu items, you now have at least one option to bring back that functionality. Sort of. After quite a bit of discussion amongst community members regarding the new menu flyouts in WordPress 3.3, Aaron D. Campbell contributed with a thought out post which concluded with a link to a plugin he created called Expanded Admin Menus.

\n

After activating the plugin in WordPress 3.3 Beta 1, this is what your left handed navigational menus will look like.

\n

Expanded Menu Items

\n

Unfortunately, it’s a far cry from what users enjoyed in WordPress 3.2.1. Instead of being able to choose which main menu item is expanded or collapsed, all of them are expanded. That deafening cry of pain you hear is from mouse scroll wheels all across the globe. After using the plugin for five minutes, it was clear to me that it’s even more of a usability nightmare for myself then dealing with the flyout menus. With all menu items presented at once, my eyes have to scroll through each one to find the specific link I’m looking for. I’m presented with too much information at one time making browsing a pain in the neck. If that were not enough, the collapsed menu looks completely different than the normal collapsed menu, probably due to the CSS it uses.

\n
Collapsed Verson Of Expanded Menu Items

Collapsed Version Of Expanded Menu Items

\n

While I’m not going to discount the use of this plugin because of that particular bug, the bottom line is that this plugin does not solve the problem that the forum thread was dedicated to. It’s not about having all of the admin menus opened or closed. It was the end user opportunity to pick and choose which menus were vertically expanded or collapsed while being able to have multiple menus opened or closed. Nice effort on the part of Aaron to provide an option to users who loved that particular feature in WordPress 3.2 but in its current form, the plugin comes nowhere close to solving the problem.

\n\n\n

Related posts:

  1. WPBeginner Reviews Post Admin Shortcuts Plugin
  2. \n
  3. Some Not Happy With Flyout Menus
  4. \n
  5. Review Of The Limit Login Attempts Plugin
  6. \n

";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:7:"pubDate";a:1:{i:0;a:5:{s:4:"data";s:31:"Mon, 17 Oct 2011 13:00:53 +0000";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:32:"http://purl.org/dc/elements/1.1/";a:1:{s:7:"creator";a:1:{i:0;a:5:{s:4:"data";s:6:"Jeffro";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}}}i:18;a:6:{s:4:"data";s:13:"\n \n \n \n \n \n \n";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";s:5:"child";a:2:{s:0:"";a:5:{s:5:"title";a:1:{i:0;a:5:{s:4:"data";s:54:"Weblog Tools Collection: WordPress vs. Drupal on Stage";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"guid";a:1:{i:0;a:5:{s:4:"data";s:41:"http://weblogtoolscollection.com/?p=10596";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"link";a:1:{i:0;a:5:{s:4:"data";s:73:"http://feedproxy.google.com/~r/weblogtoolscollection/UXMP/~3/fR0VLpyYLzI/";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:11:"description";a:1:{i:0;a:5:{s:4:"data";s:925:"

SchipulCon 2011, a web marketing conference, hosted a very thought-provoking discussion between WordPress founder Matt Mullenweg and Drupal founder Dries Buytaert.

\n

Despite some technical issues, the founders of platforms often thought of as rivals had some interesting thoughts to share about competition and community in the open source world. You can see the video below, and there are some choice quotes available at Schipul’s coverage of the event.

\n
\n\n \n \n \n \n \n\n
\n";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:7:"pubDate";a:1:{i:0;a:5:{s:4:"data";s:31:"Mon, 17 Oct 2011 13:00:12 +0000";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:32:"http://purl.org/dc/elements/1.1/";a:1:{s:7:"creator";a:1:{i:0;a:5:{s:4:"data";s:5:"James";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}}}i:19;a:6:{s:4:"data";s:13:"\n \n \n \n \n \n \n";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";s:5:"child";a:2:{s:0:"";a:5:{s:5:"title";a:1:{i:0;a:5:{s:4:"data";s:95:"WordPress.tv: SchipulCon 2011: Open Source Discussion with the Founders of Drupal and WordPress";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"guid";a:1:{i:0;a:5:{s:4:"data";s:27:"http://wordpress.tv/?p=8184";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"link";a:1:{i:0;a:5:{s:4:"data";s:41:"http://wordpress.tv/2011/10/16/drupal-wp/";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:11:"description";a:1:{i:0;a:5:{s:4:"data";s:1828:"

\n

\n
Open Source Discussion with the Founders of Drupal and WordPress
";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:7:"pubDate";a:1:{i:0;a:5:{s:4:"data";s:31:"Mon, 17 Oct 2011 06:42:50 +0000";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:32:"http://purl.org/dc/elements/1.1/";a:1:{s:7:"creator";a:1:{i:0;a:5:{s:4:"data";s:12:"Michael Pick";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}}}i:20;a:6:{s:4:"data";s:13:"\n \n \n \n \n \n \n";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";s:5:"child";a:2:{s:0:"";a:5:{s:5:"title";a:1:{i:0;a:5:{s:4:"data";s:59:"Weblog Tools Collection: WordPress Theme Releases for 10/16";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"guid";a:1:{i:0;a:5:{s:4:"data";s:41:"http://weblogtoolscollection.com/?p=10591";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"link";a:1:{i:0;a:5:{s:4:"data";s:73:"http://feedproxy.google.com/~r/weblogtoolscollection/UXMP/~3/4GqtnIwu9UE/";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:11:"description";a:1:{i:0;a:5:{s:4:"data";s:1196:"

\n

Exhibition is a perfect theme for any artist to showcase their portfolio and blog about their work.

\n

\n

Journal is a simple, attractive, one column theme that would suit a diary or journal site.

\n

\n

Terminal features multiple layouts, a custom Twitter widget, and theme options.

\n";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:7:"pubDate";a:1:{i:0;a:5:{s:4:"data";s:31:"Sun, 16 Oct 2011 13:00:15 +0000";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:32:"http://purl.org/dc/elements/1.1/";a:1:{s:7:"creator";a:1:{i:0;a:5:{s:4:"data";s:5:"James";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}}}i:21;a:6:{s:4:"data";s:13:"\n \n \n \n \n \n \n";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";s:5:"child";a:2:{s:0:"";a:5:{s:5:"title";a:1:{i:0;a:5:{s:4:"data";s:64:"WPTavern: WPWeekly Episode 115 – WordPress 3.3. Beta 1 Edition";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"guid";a:1:{i:0;a:5:{s:4:"data";s:31:"http://www.wptavern.com/?p=5632";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"link";a:1:{i:0;a:5:{s:4:"data";s:121:"http://feedproxy.google.com/~r/WordpressTavern/~3/M_hFtTjlgrQ/wpweekly-episode-115-%e2%80%93-wordpress-3-3-beta-1-edition";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:11:"description";a:1:{i:0;a:5:{s:4:"data";s:2757:"

wordpressweekly1In this episode of WordPress Weekly, I give you the news making headlines of the week. I also give you a rundown of what to look for in WordPress 3.3. Beta 1 and give you my experience thus far with some of the new features. The end of the show has a 3 minute audio sound byte from Schipulcon where the founders of Drupal and WordPress shared the stage to talk about Open Source.

\n

Stories Discussed:

\n

WordPress.org Experiences DNS Issues – Not Hacked
\nWin A Ticket To WordCamp Toronto
\nPlugin Repository Now Has A Proper 404 Page
\nSpots By Interconnect/It
\nThe Best Thing On Peter Brights iPhone Is The WordPress App
\nThings To Look For In WordPress 3.3 Beta 1

\n

WPWeekly Meta:

\n

Subscribe To WPWeekly Via Itunes: Click here to subscribe

\n

Length Of Episode: 37 Minutes

\n

Download The Show: WordPressWeeklyEpisode115.mp3

\n

Listen To Episode #115:
\n

\n\n\n

Related posts:

  1. WPWeekly Episode 25 – Almost WordPress 2.7 Beta
  2. \n
  3. WPWeekly Episode 61 – Could WordPress.com Ever Rebrand?
  4. \n
  5. WPWeekly Episode 28 – WordPress 2.7 News And WordCamp AU
  6. \n

";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:7:"pubDate";a:1:{i:0;a:5:{s:4:"data";s:31:"Sat, 15 Oct 2011 02:04:01 +0000";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:32:"http://purl.org/dc/elements/1.1/";a:1:{s:7:"creator";a:1:{i:0;a:5:{s:4:"data";s:6:"Jeffro";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}}}i:22;a:6:{s:4:"data";s:13:"\n \n \n \n \n \n \n";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";s:5:"child";a:2:{s:0:"";a:5:{s:5:"title";a:1:{i:0;a:5:{s:4:"data";s:64:"WPTavern: Video Featuring Matt Of WordPress With Dries Of Drupal";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"guid";a:1:{i:0;a:5:{s:4:"data";s:31:"http://www.wptavern.com/?p=5629";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"link";a:1:{i:0;a:5:{s:4:"data";s:116:"http://feedproxy.google.com/~r/WordpressTavern/~3/fzcBHUr5Pn0/video-featuring-matt-of-wordpress-with-dries-of-drupal";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:11:"description";a:1:{i:0;a:5:{s:4:"data";s:1694:"

Here is the recorded video featuring the presentation of Matt Mullenweg of WordPress with Dries Buytaert of Drupal discussing open source. Kudos goes out to the Schipulcon group for getting these two together for an awesome presentation. The audio is terrible until you hit the 4 minute mark. If you want to see a transcript for some of the questions you can read them on the Schipul Blog. Definitely watch from 32 minutes onward as that is when the audience starts asking some pretty good questions.

\n
\n

Open Source Discussion with the Founders of Drupal and WordPress from Schipul – The Web Marketing Co. on Vimeo.

\n
\n\n\n

Related posts:

  1. The Crossing Paths Of Drupal And WordPress
  2. \n
  3. Drupal And WordPress Founders Share The Same Stage
  4. \n
  5. Saying Goodbye To Drupal And Hello To WordPress
  6. \n

";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:7:"pubDate";a:1:{i:0;a:5:{s:4:"data";s:31:"Fri, 14 Oct 2011 17:00:13 +0000";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:32:"http://purl.org/dc/elements/1.1/";a:1:{s:7:"creator";a:1:{i:0;a:5:{s:4:"data";s:6:"Jeffro";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}}}i:23;a:6:{s:4:"data";s:13:"\n \n \n \n \n \n \n";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";s:5:"child";a:2:{s:0:"";a:5:{s:5:"title";a:1:{i:0;a:5:{s:4:"data";s:73:"WPTavern: Share Your Experience With WordPress 3.3 Beta 1 With Me Tonight";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"guid";a:1:{i:0;a:5:{s:4:"data";s:31:"http://www.wptavern.com/?p=5624";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"link";a:1:{i:0;a:5:{s:4:"data";s:125:"http://feedproxy.google.com/~r/WordpressTavern/~3/4ZNH0tDHOGo/share-your-experience-with-wordpress-3-3-beta-1-with-me-tonight";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:11:"description";a:1:{i:0;a:5:{s:4:"data";s:1730:"

For those that don’t know, I produce a live podcast every Friday evening at 9P.M. Eastern time on Talkshoe.com called WordPress Weekly. On tonight’s episode, I’d like to hear from you regarding your experience thus far with WordPress 3.3. beta 1 if you’ve had a chance to use it. I’m especially interested to know your thoughts on the new fly out menus and the drag and drop media uploader. If you can’t call in to the show tonight, at least show up in the chat room to be part of the conversation as the show is recorded live.

\n\n\n

Related posts:

  1. Things To Look For In WordPress 3.3 Beta 1
  2. \n
  3. WordPress 2.8.1 Beta By End Of The Week
  4. \n
  5. My Thoughts On WordPress Weekly
  6. \n

";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:7:"pubDate";a:1:{i:0;a:5:{s:4:"data";s:31:"Fri, 14 Oct 2011 14:15:26 +0000";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:32:"http://purl.org/dc/elements/1.1/";a:1:{s:7:"creator";a:1:{i:0;a:5:{s:4:"data";s:6:"Jeffro";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}}}i:24;a:6:{s:4:"data";s:13:"\n \n \n \n \n \n \n";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";s:5:"child";a:2:{s:0:"";a:5:{s:5:"title";a:1:{i:0;a:5:{s:4:"data";s:81:"WordPress.tv: Paolo Belcastro & Ze Fontainhas: WordPress and Internationalization";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"guid";a:1:{i:0;a:5:{s:4:"data";s:27:"http://wordpress.tv/?p=7022";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"link";a:1:{i:0;a:5:{s:4:"data";s:96:"http://wordpress.tv/2011/10/14/paolo-belcastro-ze-fontainhas-wordpress-and-internationalization/";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:11:"description";a:1:{i:0;a:5:{s:4:"data";s:1845:"
\n
\n
WordPress and Internationalization
";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:7:"pubDate";a:1:{i:0;a:5:{s:4:"data";s:31:"Fri, 14 Oct 2011 13:01:05 +0000";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:32:"http://purl.org/dc/elements/1.1/";a:1:{s:7:"creator";a:1:{i:0;a:5:{s:4:"data";s:10:"wcmontreal";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}}}i:25;a:6:{s:4:"data";s:13:"\n \n \n \n \n \n \n";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";s:5:"child";a:2:{s:0:"";a:5:{s:5:"title";a:1:{i:0;a:5:{s:4:"data";s:60:"Weblog Tools Collection: WordPress Plugin Releases for 10/14";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"guid";a:1:{i:0;a:5:{s:4:"data";s:41:"http://weblogtoolscollection.com/?p=10588";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"link";a:1:{i:0;a:5:{s:4:"data";s:73:"http://feedproxy.google.com/~r/weblogtoolscollection/UXMP/~3/IWrxFZsyfnY/";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:11:"description";a:1:{i:0;a:5:{s:4:"data";s:1396:"

New plugins

\n

Urtak allows you to gather your users’ opinions by enabling them to ask and answer questions about your content.

\n

Watu allows you to create exams with unlimited questions and answers, and define grades based on collected points.

\n

Widgets in Columns allows you to show your widgets in desired columns and rows.

\n

Updated plugins

\n

BuddyPress lets users register on your site and start creating profiles, posting messages, making connections, creating and interacting in groups and much more. It’s a social network in a box.

\n

Viper’s Video Quicktags allows you to simply click one of the new buttons that this plugin adds to the write screen (rich editor included) and then paste the URL that the video is located at into the prompt box. You can fully configure how the videos are displayed and much more.

\n";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:7:"pubDate";a:1:{i:0;a:5:{s:4:"data";s:31:"Fri, 14 Oct 2011 13:00:42 +0000";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:32:"http://purl.org/dc/elements/1.1/";a:1:{s:7:"creator";a:1:{i:0;a:5:{s:4:"data";s:5:"James";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}}}i:26;a:6:{s:4:"data";s:13:"\n \n \n \n \n \n \n";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";s:5:"child";a:2:{s:0:"";a:5:{s:5:"title";a:1:{i:0;a:5:{s:4:"data";s:56:"WordPress.tv: Steve Heffernan: HTML5 Video for WordPress";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"guid";a:1:{i:0;a:5:{s:4:"data";s:27:"http://wordpress.tv/?p=6955";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"link";a:1:{i:0;a:5:{s:4:"data";s:73:"http://wordpress.tv/2011/10/13/steve-heffernan-html5-video-for-wordpress/";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:11:"description";a:1:{i:0;a:5:{s:4:"data";s:1821:"
\n
\n
Steve Heffernan: HTML5 Video for WordPress
";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:7:"pubDate";a:1:{i:0;a:5:{s:4:"data";s:31:"Fri, 14 Oct 2011 04:43:51 +0000";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:32:"http://purl.org/dc/elements/1.1/";a:1:{s:7:"creator";a:1:{i:0;a:5:{s:4:"data";s:11:"wcvancouver";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}}}i:27;a:6:{s:4:"data";s:13:"\n \n \n \n \n \n \n";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";s:5:"child";a:2:{s:0:"";a:5:{s:5:"title";a:1:{i:0;a:5:{s:4:"data";s:48:"WPTavern: Score Tickets To WordCamp Toronto 2011";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"guid";a:1:{i:0;a:5:{s:4:"data";s:31:"http://www.wptavern.com/?p=5621";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"link";a:1:{i:0;a:5:{s:4:"data";s:100:"http://feedproxy.google.com/~r/WordpressTavern/~3/nF8UkPkJKhc/score-tickets-to-wordcamp-toronto-2011";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:11:"description";a:1:{i:0;a:5:{s:4:"data";s:1313:"

If you’re planning on going to WordCamp Toronto 2011 and have yet to purchase tickets, think about participating in this contest being held by Miroslav Glavic. The rules are simple. All you have to do is leave a comment on the post and explain how attending the event will help you. Each winner will receive one ticket to the event. Of course, the winners will need to pay for their own accommodations and travel costs to get there. Winners will be chosen on October 19th.

\n\n\n

Related posts:

  1. WordCamp NYC Tickets Now Available
  2. \n
  3. Win WordCamp Chicago Tickets
  4. \n
  5. Sponsor Me To WordCamp Detroit
  6. \n

";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:7:"pubDate";a:1:{i:0;a:5:{s:4:"data";s:31:"Thu, 13 Oct 2011 22:00:15 +0000";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:32:"http://purl.org/dc/elements/1.1/";a:1:{s:7:"creator";a:1:{i:0;a:5:{s:4:"data";s:6:"Jeffro";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}}}i:28;a:6:{s:4:"data";s:13:"\n \n \n \n \n \n \n";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";s:5:"child";a:2:{s:0:"";a:5:{s:5:"title";a:1:{i:0;a:5:{s:4:"data";s:27:"Matt: Steve Yegge on Google";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"guid";a:1:{i:0;a:5:{s:4:"data";s:21:"http://ma.tt/?p=39617";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"link";a:1:{i:0;a:5:{s:4:"data";s:43:"http://ma.tt/2011/10/steve-yegge-on-google/";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:11:"description";a:1:{i:0;a:5:{s:4:"data";s:199:"

This essay by Steve Yegge on Amazon, Google, Microsoft, and Facebook is pretty killer, I suggest giving it a read.

";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:7:"pubDate";a:1:{i:0;a:5:{s:4:"data";s:31:"Thu, 13 Oct 2011 17:36:19 +0000";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:32:"http://purl.org/dc/elements/1.1/";a:1:{s:7:"creator";a:1:{i:0;a:5:{s:4:"data";s:4:"Matt";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}}}i:29;a:6:{s:4:"data";s:13:"\n \n \n \n \n \n \n";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";s:5:"child";a:2:{s:0:"";a:5:{s:5:"title";a:1:{i:0;a:5:{s:4:"data";s:53:"WPTavern: UK Civil Service Site Switches To WordPress";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"guid";a:1:{i:0;a:5:{s:4:"data";s:31:"http://www.wptavern.com/?p=5618";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"link";a:1:{i:0;a:5:{s:4:"data";s:105:"http://feedproxy.google.com/~r/WordpressTavern/~3/f2xIDKHrlqM/uk-civil-service-site-switches-to-wordpress";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:11:"description";a:1:{i:0;a:5:{s:4:"data";s:1778:"

We (the Digital Engagement team) were tasked with producing a new site at very little cost and within a six week window. To restructure the content to make it easier to find we used Google analytics to analyze typical user journeys. Harnessing user insight will be an iterative process through the ongoing development of this site.

\n

We chose to use WordPress as it offers a simple, quick (with such a short development window) and flexible open source solution to a site primarily designed for publishing content. As such it is easy to use for a wide range of content editors and, of course, provides significant cost savings for maintenance and development. Rather than develop a theme ourselves we chose to use a theme called ‘striking’ developed by Kaptinlin that fitted what we needed with a little customization. – Via Holding the Fort

\n\n\n

Related posts:

  1. 5 Tips To Create A Great Site About WordPress
  2. \n
  3. Joomla Marries WordPress?
  4. \n
  5. 14 Things To Consider When Choosing A Webhost For Your WordPress Powered Site
  6. \n

";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:7:"pubDate";a:1:{i:0;a:5:{s:4:"data";s:31:"Thu, 13 Oct 2011 17:00:46 +0000";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:32:"http://purl.org/dc/elements/1.1/";a:1:{s:7:"creator";a:1:{i:0;a:5:{s:4:"data";s:6:"Jeffro";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}}}i:30;a:6:{s:4:"data";s:13:"\n \n \n \n \n \n \n";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";s:5:"child";a:2:{s:0:"";a:5:{s:5:"title";a:1:{i:0;a:5:{s:4:"data";s:67:"Publisher Blog: Key Differences Between Validation and Sanitization";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"guid";a:1:{i:0;a:5:{s:4:"data";s:43:"http://publisherblog.automattic.com/?p=1740";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"link";a:1:{i:0;a:5:{s:4:"data";s:99:"http://publisherblog.automattic.com/2011/10/13/key-differences-between-validation-and-sanitization/";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:11:"description";a:1:{i:0;a:5:{s:4:"data";s:6699:"

VIP Services developer Daniel Bachhuber shares some tips on writing better code for your WordPress site:

\n

Your code works, but is it safe? When writing code for a high-profile environment, you’ll need to be extra cautious of how you handle data coming into WordPress and how it’s presented to the end user. This commonly comes up when building a settings page for your theme, creating and manipulating shortcodes, or saving and rendering extra data associated with a post.

\n

There’s a distinction between how input and output are managed, however.

\n

Validation: Checking User Input

\n

To validate is to ensure the data you’ve requested of the user matches what they’ve submitted. There are several core methods you can use for input validation; usage obviously depends on the type of fields you’d like to validate. Let’s take a look at an example.

\n

Say we have an input area in our form like this:

\n
<input type="text" id="my-zipcode" name="my-zipcode" maxlength="5" />
\n

Just like that, we’ve limited my user to five characters of input, but there’s no limitation on what they can input. They could enter “11221″ or “eval(“. If we’re saving to the database, there’s no way we want to give the user unrestricted write access.

\n

This is where validation plays a role. When processing the form, we’ll write code to check each field for its proper data type. If it’s not of the proper data type, we’ll discard it. For instance, to check “my-zipcode” field, we might do something like this:

\n
$safe_zipcode = intval( $_POST[''my-zipcode''] );\nif ( ! $safe_zipcode )\n$safe_zipcode = '''';\nupdate_post_meta( $post->ID, ''my_zipcode'', $safe_zipcode );
\n

The intval() function casts user input as an integer, and defaults to zero if the input was a non-numeric value. We then check to see if the value ended up as zero. If it did, we’ll save an empty value to the database. Otherwise, we’ll save the properly validated zipcode.

\n

This style of validation most closely follows WordPress’ whitelist philosophy: only allow the user to input what you’re expecting. Luckily, there’s a number of handy helper functions you can use for most every data type.

\n

Sanitization: Escaping Output

\n

For security on the other end of the spectrum, we have sanitization. To sanitize is to take the data you may already have and help secure it prior to rendering it for the end user. WordPress thankfully has a few helper functions we can use for most of what we’ll commonly need to do:

\n

esc_html() we should use anytime our HTML element encloses a section of data we’re outputting.

\n
<h4><?php echo esc_html( $title ); ?></h4>
\n

esc_url() should be used on all URLs, including those in the ‘src’ and ‘href’ attributes of an HTML element.

\n
<img src="<?php echo esc_url( $great_user_picture_url ); ?>" />
\n

esc_js() is intended for inline Javascript.

\n
<a href="#" onclick="<?php echo esc_js( $custom_js ); ?>">Click me</a>
\n

esc_attr() can be used on everything else that’s printed into an HTML element’s attribute.

\n
<ul class="<?php echo esc_attr( $stored_class ); ?>">
\n

It’s important to note that most WordPress functions properly prepare the data for output, and you don’t need to escape again.

\n
<h4><?php the_title(); ?></h4>
\n

Also, as there are always exceptions to the rule, there are a selection of user-submitted data that needs to be validated and sanitized. Freeform text areas would fall into this category. For this, you can run user data through sanitize_text_field() or any of the wp_kses_*() functions.

\n

To recap: follow the whitelist philosophy with data validation, and only allow the user to input data of your expected type. If it’s not the proper type, discard it. Sanitize data as much as possible on output, and a selection needs to be sanitized on input too.

\n

Hit us with your questions or tips in the comments.

\n
";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:7:"pubDate";a:1:{i:0;a:5:{s:4:"data";s:31:"Thu, 13 Oct 2011 15:30:19 +0000";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:32:"http://purl.org/dc/elements/1.1/";a:1:{s:7:"creator";a:1:{i:0;a:5:{s:4:"data";s:16:"Daniel Bachhuber";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}}}i:31;a:6:{s:4:"data";s:13:"\n \n \n \n \n \n \n";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";s:5:"child";a:2:{s:0:"";a:5:{s:5:"title";a:1:{i:0;a:5:{s:4:"data";s:59:"WPTavern: WordPress Not The Choice For Multinational Search";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"guid";a:1:{i:0;a:5:{s:4:"data";s:31:"http://www.wptavern.com/?p=5613";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"link";a:1:{i:0;a:5:{s:4:"data";s:111:"http://feedproxy.google.com/~r/WordpressTavern/~3/n5ZGTZCjKQI/wordpress-not-the-choice-for-multinational-search";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:11:"description";a:1:{i:0;a:5:{s:4:"data";s:1422:"

Chris Liversidge of Search Engine Land gives an explanation as to why WordPress is not his platform of choice when it comes to multinational search. I was with him up until the point he discussed security where he states that WordPress is plagued by frequent security updates. This is not true. Security within WordPress has gotten better with time, not worse and it’s not like we’re updating WordPress every two weeks. I’m not sure what Chris wants in a CMS platform. One update a year? One update every 3 months that fixes security vulnerabilities instead of getting that fix immediately?

\n\n\n

Related posts:

  1. How To Make The WordPress Search URL Pretty
  2. \n
  3. Adding Google Custom Search Is Easy
  4. \n
  5. WordPress 2.8.3 Released
  6. \n

";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:7:"pubDate";a:1:{i:0;a:5:{s:4:"data";s:31:"Thu, 13 Oct 2011 13:00:47 +0000";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:32:"http://purl.org/dc/elements/1.1/";a:1:{s:7:"creator";a:1:{i:0;a:5:{s:4:"data";s:6:"Jeffro";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}}}i:32;a:6:{s:4:"data";s:13:"\n \n \n \n \n \n \n";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";s:5:"child";a:2:{s:0:"";a:5:{s:5:"title";a:1:{i:0;a:5:{s:4:"data";s:58:"WPTavern: Revamping The 404 Page For The Plugin Repository";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"guid";a:1:{i:0;a:5:{s:4:"data";s:31:"http://www.wptavern.com/?p=5609";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"link";a:1:{i:0;a:5:{s:4:"data";s:110:"http://feedproxy.google.com/~r/WordpressTavern/~3/4-uRAiHHINY/revamping-the-404-page-for-the-plugin-repository";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:11:"description";a:1:{i:0;a:5:{s:4:"data";s:2257:"

404 ImageWPBeginner has laid out an interesting question. Do we need a better 404 page for WordPress plugins repository? They think so and I do to. I’ve experienced the issue of clicking a plugin link only to be redirected magically to the plugin repository page without any explanation as to why. From here, I perform a search to find the plugin that I was linked to only to come up empty. In my opinion, the 404 page on the plugin repository should give a few explanations as to why the plugin was not found. It could have been its removal, its suspension, or a bad link but at least give a little explanation. I especially like the idea presented by GraphicsCove in providing a list of 3 or 5 similar plugins. I’d also like to see a little bit of Matt’s witty humor. What better place to put it than on a 404 page.

\n

If you had the opportunity to create the 404 page, what information would you present on it?

\n\n\n

Related posts:

  1. Listener Poll: Should there be a page on the plugin repository for Commercial GPL plugins?
  2. \n
  3. Plugin Repository Now Supports Videos
  4. \n
  5. List Of The Best WordPress 404 Pages
  6. \n

";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:7:"pubDate";a:1:{i:0;a:5:{s:4:"data";s:31:"Wed, 12 Oct 2011 17:00:53 +0000";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:32:"http://purl.org/dc/elements/1.1/";a:1:{s:7:"creator";a:1:{i:0;a:5:{s:4:"data";s:6:"Jeffro";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}}}i:33;a:6:{s:4:"data";s:13:"\n \n \n \n \n \n \n";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";s:5:"child";a:2:{s:0:"";a:5:{s:5:"title";a:1:{i:0;a:5:{s:4:"data";s:59:"Weblog Tools Collection: WordPress Theme Releases for 10/12";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"guid";a:1:{i:0;a:5:{s:4:"data";s:41:"http://weblogtoolscollection.com/?p=10579";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"link";a:1:{i:0;a:5:{s:4:"data";s:73:"http://feedproxy.google.com/~r/weblogtoolscollection/UXMP/~3/AmVXf00zl2g/";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:11:"description";a:1:{i:0;a:5:{s:4:"data";s:1569:"

\n

Danco is a blue and beige three-column theme.

\n

\n

Setrage is a brown one-column theme.

\n

\n

Slopes is wonderful for blogs or websites related to winter sports, photography, sports events, outdoor pursuits, etc.

\n

\n

Vintage has a vintage look combining textures and complementary colors.

\n";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:7:"pubDate";a:1:{i:0;a:5:{s:4:"data";s:31:"Wed, 12 Oct 2011 13:00:59 +0000";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:32:"http://purl.org/dc/elements/1.1/";a:1:{s:7:"creator";a:1:{i:0;a:5:{s:4:"data";s:5:"James";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}}}i:34;a:6:{s:4:"data";s:13:"\n \n \n \n \n \n \n";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";s:5:"child";a:2:{s:0:"";a:5:{s:5:"title";a:1:{i:0;a:5:{s:4:"data";s:42:"WPTavern: Some Not Happy With Flyout Menus";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"guid";a:1:{i:0;a:5:{s:4:"data";s:31:"http://www.wptavern.com/?p=5603";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"link";a:1:{i:0;a:5:{s:4:"data";s:94:"http://feedproxy.google.com/~r/WordpressTavern/~3/VZLLzTcTDW4/some-not-happy-with-flyout-menus";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:11:"description";a:1:{i:0;a:5:{s:4:"data";s:4004:"

Flyout MenusIn my short look at WordPress 3.3 Beta 1, I highlighted the fact that all menus were going to receive the Flyout treatment. The ability to vertically expand or collapse menus will be disappearing in favor of the flyout animation. Personally, I like the feature as I now get to see all of the menu items without having to click a button. However, many others have voiced their discontent with this User Interface change. In fact, there is a thread on the WordPress.org support forums that is nearing 50 posts specifically dealing with this issue.

\n

Even though I like flyouts, I don’t have any problem with the way menus work in WordPress 3.2. In fact, it was the best of both worlds. I typically use the Icons only approach which has the flyouts while always having the option to see the full menu with the ability to vertically expand or collapse. In the newest instance, that choice has been taken away. This response by Jonschlinkert has some interesting questions that I think would be good to have answered from the WordPress UI Team.

\n

Who was asking you to remove the expand/collapse feature? Can you point us to that request and the support for it? In other words, why is the designer “fixing” something that wasn’t broken?

\n

If you’re interested in seeing how the feature evolved, look at the log for ticket #18382. For the curious, here is a short list of statements made in the WordPress Development Channel from May 31st 2011 to October 11th 2011, talking about the flyout menus. Nothing really exciting to read with the exception of Otto42s comment on September 19th.

\n

Otto42 – they make everything take like 3 times longer to find. i used to just scroll the page and go right to the menu i want.. now it’s a matter of hunting and searching and checking the f-ing flyout menus

\n

If Flyout menus get past beta and are in the final release, that is when we will be able to measure the success or failure of the change. If a major revolt happens, it’s not like reverting the change will be hard and it could come in a follow up point release. At the end of the day though, the folks in the forum thread have to be commended for providing valuable feedback during the beta testing process.

\n

Related But Not Required Reading: Why Hover Menus Do Users More Harm Than Good

\n\n\n

Related posts:

  1. Justin Tadlock On Menus In WP 3.0
  2. \n
  3. Removing Links In Favor Of Menus?
  4. \n
  5. Things To Look For In WordPress 3.3 Beta 1
  6. \n

";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:7:"pubDate";a:1:{i:0;a:5:{s:4:"data";s:31:"Wed, 12 Oct 2011 13:00:07 +0000";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:32:"http://purl.org/dc/elements/1.1/";a:1:{s:7:"creator";a:1:{i:0;a:5:{s:4:"data";s:6:"Jeffro";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}}}i:35;a:6:{s:4:"data";s:13:"\n \n \n \n \n \n \n";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";s:5:"child";a:2:{s:0:"";a:5:{s:5:"title";a:1:{i:0;a:5:{s:4:"data";s:29:"Matt: What’s Next for Apple";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"guid";a:1:{i:0;a:5:{s:4:"data";s:21:"http://ma.tt/?p=39604";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"link";a:1:{i:0;a:5:{s:4:"data";s:42:"http://ma.tt/2011/10/whats-next-for-apple/";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:11:"description";a:1:{i:0;a:5:{s:4:"data";s:9692:"

I have no inside information or insight, but historically Apple’s product improvements have strongly broadcasted where they’re going in the future. Here are six things I think are inevitable for Apple to do over the next decade, from most to least obvious: maps, iCloud, payments, TVs, search, and cars.

\n

1. Maps

\n

When the iPhone was first released Steve Jobs called Maps on iPhone the best version of Google Maps on the planet, with emphasis on what Apple’s designers had brought to Google’s raw technology (can’t find that link). Four years later, you can’t imagine such a core piece of the mobile experience reliant on their largest competitor. Hopefully this will also give Apple a chance to fill usability gaps in the maps experience today, like that you can’t click from the “where” field in a calendar appointment straight to maps. (Drives me crazy.) Note that the only “Google” branding in maps today is in the bottom left, they know they’re getting replaced and have done an admirable job on the Safari version of maps on iPhone and iPad.

\n

Google Maps + Navigation on Android is my favorite mobile app of the past 3 years (haven’t used Siri yet) — it’s what Garmin should have built $8 billion in revenue and R&D ago. (Remember the Garmin Nüvifone?) Apple was smart to partner in the beginning, but they can, and should, raise the bar.

\n

2. iCloud

\n

The abstraction of documents, photos, videos, their equivalents in “bought” media (iBooks, music, movies, and TV shows from the iTunes store), the deemphasis of the filesystem with every iteration of OS X, and the rough ideas of things like MobileMe’s dock syncing, points to the combination of services that will ultimately disrupt the “magic folder” providers like Dropbox. I love Dropbox, but it’ll be impossible for them to do the deep OS integration needed to match the direction Apple is heading — never thinking about what is where, ever again, just having everything you’ve ever created or used available in the same place on all your devices.

\n

They know this is best for consumers. My friend Rene told me how when his hard drive crashed last year he contacted Apple support and they gave him a link to re-download the past 4 years of music he’d purchased on iTunes. That’s obviously the right thing to do, even if labels have had to be dragged kicking and screaming toward it. By this time tomorrow it’ll just be part of the experience when he signs into iTunes on a new computer. Update: Apple released iTunes 10.5 a day early with this feature.

\n

3. Payments

\n

Your phone becomes your credit card. Apple doesn’t replace Visa or Mastercard, but they do replace all of those scammy rewards and branded cards that prey on unsophisticated consumers. Google will probably do this first, but it’ll be like Microsoft Surface, brilliant but two sandwiches short of a picnic.

\n

4. TVs

\n

I recently got one of the new Thunderbolt displays and man, a super-sized version of this would be killer in my living room. (The speakers are surprisingly good.) TVs are just so bad, not so much in the hardware which can be beautiful like Samsung’s C9000 but in the mediocre software, un-features like Auto Motion (which makes beautiful films look like they were shot by a Jersey Shore cameraman with a beer in his other hand), and interfaces that just don’t do anything you would expect. Hello — you can detect when a cable is plugged in, don’t make me switch between 15 sources when only one is connected. My TV takes 5-10 seconds longer to turn on than my iPad. “Smart TVs” look like “smart phones” did in 2005 — completely lacking in imagination or joy.

\n

But to really imagine the strategic importance of this you need to think beyond a super-sized Thunderbolt display and imagine what replaces iMac, one of Apple’s most beautiful creations. People’s need for a desktop is seriously declining for the first time since pundits started predicted the decline of the PC a decade ago. The post-PC ecosystem is in place now — touch, battery life, mobile-first applications, ubiquity of internet access, flash memory. (In Steve Jobs introduction of the first iPod, two things stand out to me: that terrible font, and the fact one of the main features is 20 minutes of skip protection.) Mobile works and is getting better, and you won’t have what we call a desktop 10 years from now.

\n

Now imagine Apple has a shining 55″ monolith smack dab in the middle of your house. How big of a wifi antenna could they put in there? Could they crush all that lame Cisco teleconference stuff with TV FaceTime? Is there room for a few disk drives that don’t need to worry about skipping plus a SSD to make it fast? If you look at the direction Apple has been heading with Time Capsule locally caching software updates it’s not hard for something similar to work in the other direction, a digital hub that’s your media server for the house, a large-format display, a time capsule, and an Airplay target all in one. Imagine just one power cable coming out of it, and everything else wireless, just like the iMac, and a few killer apps we can’t even imagine yet.

\n

Finally, home theatre needs disruption — this is a land of $200 Monster HDMI cables and similar gouging that functions like a state lottery, an intelligence tax. When I walk through Best Buy, which I try to do once every few months, it feels like it’s technology at its worst, the magic of progress used as smoke and mirrors to confuse and dupe consumers rather than make their lives better. The Apple TV is just another form factor for the unified experience Apple wants to create every time you touch an electronic device.

\n

5. Search

\n

There are hints of this in maps, but just like Craigslist is being killed not by a Craigslist-like clone but rather by a thousand highly focused replacements, so too Google will face its existential crisis not from another webpage with a centered white box, but from the interface and context of search changing completely. Many of Google’s searches aren’t that valuable, and a huge percentage of the ones that are aren’t going to happen at the desktop anymore .The context of your location (which your phone already knows) the “results page” of a fantastic map application and the input of a next-generation search interface, like Siri, completely changes the rules of engagement. Google’s not investing in mobile because they wanted a better phone.

\n

6. Cars

\n

This is the most far-out, but I think most certain. Voice-controlled search through Siri and Apple Maps provide the hands-free framework for a rich interactive experience while driving. Walk down the car stereo aisle in Best Buy and see what $800 gets you, or a $300 GPS from Garmin, vs an iPad or iPhone. The screens feel like a TI-92 calculator. The typography makes my eyes bleed. I find it morally reprehensible how bad these products are because it’s one of the areas of technology where a bad interface is most directly tied to injuries and deaths. Car folks are making their iPhone/iPod integrations better and better, which may be a glass of ice water in hell, but they’ll never make the jump to providing a beautiful marriage of media, search, and navigation that a great in-car experience needs. Right now you can spend 110k on a Tesla Roadster, a car of the future, and for an additional $4,500 (9 iPads!) get this Alpine head unit. (Watch that video and try not to laugh at how bad the interface is.) Retail it only sets you back 1.4 iPads. That’s just sad.

\n

“People who are really serious about software should make their own hardware.” — Alan Kay, 1982. People who make hardware should get their software act together before Apple does for them.

\n

Discussion on Hacker News.

";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:7:"pubDate";a:1:{i:0;a:5:{s:4:"data";s:31:"Tue, 11 Oct 2011 20:09:02 +0000";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:32:"http://purl.org/dc/elements/1.1/";a:1:{s:7:"creator";a:1:{i:0;a:5:{s:4:"data";s:4:"Matt";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}}}i:36;a:6:{s:4:"data";s:13:"\n \n \n \n \n \n \n";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";s:5:"child";a:2:{s:0:"";a:5:{s:5:"title";a:1:{i:0;a:5:{s:4:"data";s:52:"WPTavern: Things To Look For In WordPress 3.3 Beta 1";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"guid";a:1:{i:0;a:5:{s:4:"data";s:31:"http://www.wptavern.com/?p=5591";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"link";a:1:{i:0;a:5:{s:4:"data";s:104:"http://feedproxy.google.com/~r/WordpressTavern/~3/gpDvDMJVT0A/things-to-look-for-in-wordpress-3-3-beta-1";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:11:"description";a:1:{i:0;a:5:{s:4:"data";s:6426:"

WordPress 3.3 Beta 1 has finally been released for the curious at heart to get a glimpse as to what’s coming in the final version. There are quite a few visual changes that you should look out for and provide feedback on. Here are a couple things worth noting.

\n

New Feature Pop-ups – After WordPress 3.3 is installed, you’ll see popups that display information pointing users to new features. When testing, see if the popups close upon clicking the close button. Also see if the popups reappear multiple times. There has been an issue with popups and IE7/8 with them not going away but Alex Mills is betting that those have been fixed as of ticket #18693

\n

Feature Popups

\n

Admin Bar Revamp – The Admin bar now sports a darker color. The biggest changes to the admin bar reside within the rearrangement of menu items. Instead of the username and gravatar aligned to the left side of the bar, it’s now all the way on the right hand side. The search box has been moved to the right of the Add New menu link. Updates has been added as a top menu item. However, your website name now shows up on the far left side of the admin bar and this is where you’ll find all sorts of administrative tasks when you hover your mouse cursor over the link. The dashboard link as well as Appearance has been added to this menu item along with an assortment of other options. The drop down menus also look a lot like their Administration panel counterparts compared to the 3.2 version. Last but not least, on the left side of the admin bar, there is a small WordPress icon. This icon acts like the HELP button in typical software. From here, you can get information about the specific version of WordPress, Freedoms, Credits, links to WordPress.org, the support forums, documentation and giving feedback.

\n

\n

Flyout Menus – All of the top level links within the left menu now have Flyouts where as previously, Flyouts only occurred when the menu was collapsed.

\n

Flyout Menus

\n

Drag And Drop Uploading – I think users will be surprised the most by the new upload media screen. Thanks to something called plUpload which has been added to WordPress 3.3, we can now drag multiple files into the editor. This has also allowed the dependence on Flash within the uploader to disappear as support for HTML 5, Flash, and Silverlight are supported with plUpload. I’ve given it a try with 5 images and it worked great. Users who upload photo sets to WordPress are going to love this enhancement.

\n
Multiple file Uploader In WordPress 3.3

Uploading Multiple Files Or Images At Once Is Now Easier In WP 3.3

\n

One Media Button – In WordPress 3.2.1, there are 4 icons within the post editor that allow you to add some type of media to a post. Images, Audio, Video, and strangely enough, an icon named Media. In WordPress 3.3, all of those icons have been replaced by one icon labeled Media. From here, you simply drag whatever media files you have into the uploader. No more picking and choosing since the uploader is smart enough to distinguish between different media types. You can add your typical meta data after the media has been uploaded.

\n
WordPress 3.3. Media Icon

One Instead Of Four

\n

WordPress 3.3. will have more to offer than what I have listed here but if you plan on beta testing the new version, you now have a couple things to play around with. If you come across something you think is broken or not working as you think it should, the best thing you can do is report it within the Alpha/Beta section of the WordPress.org Support forums while being as descriptive as possible.

\n\n\n

Related posts:

  1. Have You Removed Or Disabled The Admin Bar?
  2. \n
  3. What Can You Do With WordPress MU?
  4. \n
  5. WordPress 2.7.1 Beta Released
  6. \n

";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:7:"pubDate";a:1:{i:0;a:5:{s:4:"data";s:31:"Tue, 11 Oct 2011 17:00:57 +0000";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:32:"http://purl.org/dc/elements/1.1/";a:1:{s:7:"creator";a:1:{i:0;a:5:{s:4:"data";s:6:"Jeffro";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}}}i:37;a:6:{s:4:"data";s:13:"\n \n \n \n \n \n \n";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";s:5:"child";a:2:{s:0:"";a:5:{s:5:"title";a:1:{i:0;a:5:{s:4:"data";s:52:"WPTavern: Plugin Review – Spots By Interconnect/it";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"guid";a:1:{i:0;a:5:{s:4:"data";s:31:"http://www.wptavern.com/?p=5584";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"link";a:1:{i:0;a:5:{s:4:"data";s:99:"http://feedproxy.google.com/~r/WordpressTavern/~3/S1hBw1Yfcqo/plugin-review-spots-by-interconnectit";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:11:"description";a:1:{i:0;a:5:{s:4:"data";s:3718:"

Interconnect It LogoBack on August 25th, the guys over at Interconnect/it released a brand new plugin called Spots. If I had to describe this plugin in one sentence, I’d say it was a text widget on steroids.

\n

There are quite a few things that make this plugin very cool to use. The first is that it uses a custom post type which means when you create a spot, you get access to the editor as if you were writing a post. You also get access to all the stuff that’s normally attached to a post with the exception of tags and categories. Because you get to use the normal editor, it’s very easy to add media to the spots that are created without using blocks of HTML as you normally would within a text widget.

\n

Test SPot

\n

After a spot is created, you can add it to any sidebar that’s built for widgets. However, you’re not limited to using spots in the sidebar only. In the Visual editor for writing posts, there is a Spots button which uses a shortcode to insert the spot into a post or page.

\n
Spots ShortCode

Shortcode Button That Inserts The Spots Shortcode

\n

Developers can also take advantage of this plugin by using the built in functions. For example, instead of hard coding text into a widget within the footer of a theme, you could turn it into a spot which would enable the end user to customize that spot with whatever they want from the administration panel, not having to touch any code. By doing it this way, theme developers could probably get rid of a couple theme options for text areas or default widget areas.

\n

Conclusion:

\n

Spots is an awesome plugin by the crew over at Interconnect/it. People have been wanting WYSIWYG functionality in text widgets since the day they were introduced into WordPress. This plugin does that and so much more. If you’re looking for a replacement for the default text widget in WordPress that provides more flexibility, definitely give Spots a try.

\n\n\n

Related posts:

  1. Review Of Front End Editor Plugin
  2. \n
  3. Plugin Review: Technical Support
  4. \n
  5. Widgetizing That Theme Of Yours
  6. \n

";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:7:"pubDate";a:1:{i:0;a:5:{s:4:"data";s:31:"Tue, 11 Oct 2011 13:00:47 +0000";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:32:"http://purl.org/dc/elements/1.1/";a:1:{s:7:"creator";a:1:{i:0;a:5:{s:4:"data";s:6:"Jeffro";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}}}i:38;a:6:{s:4:"data";s:13:"\n \n \n \n \n \n \n";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";s:5:"child";a:2:{s:0:"";a:5:{s:5:"title";a:1:{i:0;a:5:{s:4:"data";s:54:"Weblog Tools Collection: WordPress 3.3 Beta 1 Released";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"guid";a:1:{i:0;a:5:{s:4:"data";s:41:"http://weblogtoolscollection.com/?p=10576";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"link";a:1:{i:0;a:5:{s:4:"data";s:73:"http://feedproxy.google.com/~r/weblogtoolscollection/UXMP/~3/HSR8P3jB4h8/";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:11:"description";a:1:{i:0;a:5:{s:4:"data";s:925:"

WordPress 3.3 Beta 1 has been released. While this release isn’t ready for live usage yet, it’s time for plugin and theme developers to test their products against the upcoming 3.3 release, and time for you curious folks with test installations to get a sneak peek at what’s new.

\n

Along with a few miscellaneous fixes, WordPress 3.3 adds a new media uploader, an improved admin bar, and fancy fly-out menus in the Dashboard.

\n

Users of this first beta release are encouraged to report any bugs that they find and visit the support forums for help as necessary.

\n";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:7:"pubDate";a:1:{i:0;a:5:{s:4:"data";s:31:"Tue, 11 Oct 2011 13:00:25 +0000";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:32:"http://purl.org/dc/elements/1.1/";a:1:{s:7:"creator";a:1:{i:0;a:5:{s:4:"data";s:5:"James";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}}}i:39;a:6:{s:4:"data";s:13:"\n \n \n \n \n \n \n";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";s:5:"child";a:2:{s:0:"";a:5:{s:5:"title";a:1:{i:0;a:5:{s:4:"data";s:30:"Dev Blog: WordPress 3.3 Beta 1";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"guid";a:1:{i:0;a:5:{s:4:"data";s:33:"http://wordpress.org/news/?p=2071";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"link";a:1:{i:0;a:5:{s:4:"data";s:55:"http://wordpress.org/news/2011/10/wordpress-3-3-beta-1/";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:11:"description";a:1:{i:0;a:5:{s:4:"data";s:1950:"

WordPress 3.3 is ready for beta testers.

\n

As always, this is software still in development and we don’t recommend that you run it on a production site — set up a test site just to play with the new version. If you break it (find a bug), please report it, and if you’re a developer, try to help us fix it.

\n

If all goes well, we hope to release WordPress 3.3 by the end of November. The more help we get with testing and fixing bugs, the sooner we will be able to release the final version. If you want to be a beta tester, you should check out the Codex article on how to report bugs.

\n

Here’s some of what’s new:

\n\n

Remember, if you find something you think is a bug, report it! You can bring it up in the alpha/beta forum, you can email it to the wp-testers list, or if you’ve confirmed that other people are experiencing the same bug, you can report it on the WordPress Core Trac. (We recommend starting in the forum or on the mailing list.)

\n

Theme and plugin authors, if you haven’t been following the 3.3 development cycle, please start now so that you can update your themes and plugins to be compatible with the newest version of WordPress.

\n

Download WordPress 3.3 Beta 1

\n

And now, haiku.

\n

Features almost done…

\n

3.3 at Beta 1.

\n

Test it now — have fun!

";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:7:"pubDate";a:1:{i:0;a:5:{s:4:"data";s:31:"Tue, 11 Oct 2011 00:22:35 +0000";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:32:"http://purl.org/dc/elements/1.1/";a:1:{s:7:"creator";a:1:{i:0;a:5:{s:4:"data";s:10:"Ryan Boren";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}}}i:40;a:6:{s:4:"data";s:13:"\n \n \n \n \n \n \n";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";s:5:"child";a:2:{s:0:"";a:5:{s:5:"title";a:1:{i:0;a:5:{s:4:"data";s:51:"Alex King: Anonomize Non-Public WordPress User Data";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"guid";a:1:{i:0;a:5:{s:4:"data";s:27:"http://alexking.org/?p=7539";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"link";a:1:{i:0;a:5:{s:4:"data";s:76:"http://alexking.org/blog/2011/10/10/anonomize-non-public-wordpress-user-data";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:11:"description";a:1:{i:0;a:5:{s:4:"data";s:337:"

If you need to remove non-public user data from a WordPress database, these SQL queries should do the trick for you:

\n

View the code on Gist.

\n

Note that if you have plugins, etc. that store additional user data in user meta you might need to clear those out as well.

";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:7:"pubDate";a:1:{i:0;a:5:{s:4:"data";s:31:"Mon, 10 Oct 2011 22:27:30 +0000";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:32:"http://purl.org/dc/elements/1.1/";a:1:{s:7:"creator";a:1:{i:0;a:5:{s:4:"data";s:4:"Alex";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}}}i:41;a:6:{s:4:"data";s:13:"\n \n \n \n \n \n \n";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";s:5:"child";a:2:{s:0:"";a:5:{s:5:"title";a:1:{i:0;a:5:{s:4:"data";s:66:"WPTavern: WordPress App – The Best Thing On Peter Brights iPhone";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"guid";a:1:{i:0;a:5:{s:4:"data";s:31:"http://www.wptavern.com/?p=5582";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"link";a:1:{i:0;a:5:{s:4:"data";s:114:"http://feedproxy.google.com/~r/WordpressTavern/~3/JuCBYEM7uYs/wordpress-app-the-best-thing-on-peter-brights-iphone";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:11:"description";a:1:{i:0;a:5:{s:4:"data";s:1328:"

According to Peter Bright over at the Technorati blog, the best thing about his iPhone is the WordPress App. While it works great for him, the latest version doesn’t play so nice on my particular iPhone 4. When I try to moderate comments, the app crashes. I’ll be publishing a report as well as a support query on the iPhone WordPress App support forums shortly.

\n\n\n

Related posts:

  1. WordPress iPhone App 2.7 Released
  2. \n
  3. Can’t Access Trash Within WordPress iPhone App
  4. \n
  5. Turning Your WordPress Powered Site Into An iPhone App
  6. \n

";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:7:"pubDate";a:1:{i:0;a:5:{s:4:"data";s:31:"Mon, 10 Oct 2011 22:00:02 +0000";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:32:"http://purl.org/dc/elements/1.1/";a:1:{s:7:"creator";a:1:{i:0;a:5:{s:4:"data";s:6:"Jeffro";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}}}i:42;a:6:{s:4:"data";s:13:"\n \n \n \n \n \n \n";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";s:5:"child";a:2:{s:0:"";a:5:{s:5:"title";a:1:{i:0;a:5:{s:4:"data";s:83:"WPTavern: Four Common Sense Ways To Improve Security On Your WordPress Powered Site";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"guid";a:1:{i:0;a:5:{s:4:"data";s:31:"http://www.wptavern.com/?p=5577";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"link";a:1:{i:0;a:5:{s:4:"data";s:135:"http://feedproxy.google.com/~r/WordpressTavern/~3/MgkHL2pdMso/four-common-sense-ways-to-improve-security-on-your-wordpress-powered-site";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:11:"description";a:1:{i:0;a:5:{s:4:"data";s:1671:"

Generally common sense material listed in the article but it’s always good to remind people about these techniques. As far as I’m concerned, just being in the know and having the awareness of what’s going on is half the battle.

\n

On a final note, while website security can seem daunting and intimidating, it’s something that should be approached from a standpoint of keeping aware and in the know such that, if issues do arise on your website, you are able to calmly resolve the issue and get your website back to where it was, knowing full-well the scope of the security measures in place.

\n

via – Four Ways To Improve Security On Your WordPress Site

\n\n\n

Related posts:

  1. Ideas To Improve The WordPress Release Strategy
  2. \n
  3. Does WordPress Need A Native Security Suite?
  4. \n
  5. Top 5 WordPress Security Tips You Most Likely Don’t Follow
  6. \n

";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:7:"pubDate";a:1:{i:0;a:5:{s:4:"data";s:31:"Mon, 10 Oct 2011 17:00:56 +0000";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:32:"http://purl.org/dc/elements/1.1/";a:1:{s:7:"creator";a:1:{i:0;a:5:{s:4:"data";s:6:"Jeffro";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}}}i:43;a:6:{s:4:"data";s:13:"\n \n \n \n \n \n \n";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";s:5:"child";a:2:{s:0:"";a:5:{s:5:"title";a:1:{i:0;a:5:{s:4:"data";s:60:"Weblog Tools Collection: WordPress Plugin Releases for 10/10";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"guid";a:1:{i:0;a:5:{s:4:"data";s:41:"http://weblogtoolscollection.com/?p=10573";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"link";a:1:{i:0;a:5:{s:4:"data";s:73:"http://feedproxy.google.com/~r/weblogtoolscollection/UXMP/~3/2KA2B-d8jhc/";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:11:"description";a:1:{i:0;a:5:{s:4:"data";s:1627:"

New plugins

\n

Custom Field Suite allows you to create and manage groups of custom fields.

\n

Q2W3 Post Order lets you manipulate the order in which posts are displayed.

\n

Updated plugins

\n

Bad Behavior complements other link spam solutions by acting as a gatekeeper, preventing spammers from ever delivering their junk, and in many cases, from ever reading your site in the first place.

\n

Fast Secure Contact Form lets your visitors send you a quick e-mail message and blocks all common spammer tactics. Additionally, the plugin has a multi-form feature, optional extra fields, and an option to redirect visitors to any URL after the message is sent.

\n

Gravatar Signup Encouragement encourages users without a Gravatar to make one.

\n

Slick Social Share Buttons allows you to add Facebook, Twitter, Google +1, Digg, Google Buzz, Linkedin, and Stumbledupon social media buttons in a floating or slide out tab.

\n";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:7:"pubDate";a:1:{i:0;a:5:{s:4:"data";s:31:"Mon, 10 Oct 2011 15:30:06 +0000";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:32:"http://purl.org/dc/elements/1.1/";a:1:{s:7:"creator";a:1:{i:0;a:5:{s:4:"data";s:5:"James";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}}}i:44;a:6:{s:4:"data";s:13:"\n \n \n \n \n \n \n";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";s:5:"child";a:2:{s:0:"";a:5:{s:5:"title";a:1:{i:0;a:5:{s:4:"data";s:60:"WPTavern: Drupal And WordPress Founders Share The Same Stage";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"guid";a:1:{i:0;a:5:{s:4:"data";s:31:"http://www.wptavern.com/?p=5570";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"link";a:1:{i:0;a:5:{s:4:"data";s:112:"http://feedproxy.google.com/~r/WordpressTavern/~3/qtmjPzH7kHA/drupal-and-wordpress-founders-share-the-same-stage";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:11:"description";a:1:{i:0;a:5:{s:4:"data";s:3921:"

Here is something you don’t get to see all the time. WordPress co-founder Matt Mullenweg and Drupal founder Dries Buytaert shared the same stage at an event called Schipulcon. While catering to the web marketing crowd, the event also has a short but concise mission statement:

\n

To grow community champions that make the world a better place through extraordinary thinking, smart technology and cross-industry creativity.

\n

Schipulcon took place in Houston, Texas which is the hometown of Matt Mullenweg. While some expected the two founders to duke it out, according to some in the audience, it looked more like a bromance.

\n
Dries Buytaert And Matt Mullenweg

Dries Buytaert and Matt Mullenweg at SchipulCon 2011 by Ed Schipul

\n

Video for this session if not currently available but the folks who ran the event have said that the video will be published soon. However, there were a couple of notable quotes that were shared over twitter. Here is just a sampling.

\n

kamichat
\nWordpress founder @photomatt says the next gen for Wordpess is more social and mobile. #schipulcon – via

\n

Beccamus
\nCool! Some of the best tech & creative opportunities developed in #Houston like wordpress by @photomatt #schipulcon – via

\n

Janerri
\nThough biased, I’m enjoying the contrast & comparison of @Drupal @WordPress It’s friendly now, how long will that last? #schipulcon – via

\n

AshleyRSmall
\nOur architecture is our greatest advantage over WordPress – @dries #schipulcon – via

\n

thisisnotapril
\n“If WordPress wins; Drupal wins. Because it means open source wins.” -@Dries #schipulcon – via

\n

qcait
\nWordpress @photomatt’s Drupal developer profile is #5665, created 8 yrs ago. Profile lists “simplicity” as an interest. #schipulcon – via

\n

I for one am seriously looking forward to watching the video of this session once it’s released.

\n

Additional photos of Matt Mullenweg and Dries Buytaert can be found within this photoset.

\n\n\n

Related posts:

  1. The Crossing Paths Of Drupal And WordPress
  2. \n
  3. Joomla Against Drupal Against WordPress
  4. \n
  5. 5 Questions To Consider Before Using WordPress or Drupal
  6. \n

";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:7:"pubDate";a:1:{i:0;a:5:{s:4:"data";s:31:"Mon, 10 Oct 2011 13:00:24 +0000";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:32:"http://purl.org/dc/elements/1.1/";a:1:{s:7:"creator";a:1:{i:0;a:5:{s:4:"data";s:6:"Jeffro";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}}}i:45;a:6:{s:4:"data";s:13:"\n \n \n \n \n \n \n";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";s:5:"child";a:2:{s:0:"";a:5:{s:5:"title";a:1:{i:0;a:5:{s:4:"data";s:63:"Weblog Tools Collection: What Was Your First WordPress Version?";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"guid";a:1:{i:0;a:5:{s:4:"data";s:41:"http://weblogtoolscollection.com/?p=10569";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"link";a:1:{i:0;a:5:{s:4:"data";s:73:"http://feedproxy.google.com/~r/weblogtoolscollection/UXMP/~3/LXeWa_RmVBQ/";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:11:"description";a:1:{i:0;a:5:{s:4:"data";s:1232:"

WordPress was first released over 8 years ago, and the latest version has been downloaded over 9 million times. With that number growing dramatically every release, hundreds (if not thousands) of new users are being introduced to WordPress every day.

\n

I started using WordPress with 1.2, just two days before 1.2.1 was released, on MacManX.com. Of course, I moved that over to WordPress.com not too long ago, but I still have several other self-hosted blogs running on 3.2.1. I think it’s safe to say that without WordPress 1.2, I wouldn’t be here today.

\n

What was the very first version of WordPress that you ever used? We’d love to know! And, of course, WordPress.com counts too.

\n";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:7:"pubDate";a:1:{i:0;a:5:{s:4:"data";s:31:"Sun, 09 Oct 2011 13:00:55 +0000";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:32:"http://purl.org/dc/elements/1.1/";a:1:{s:7:"creator";a:1:{i:0;a:5:{s:4:"data";s:5:"James";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}}}i:46;a:6:{s:4:"data";s:13:"\n \n \n \n \n \n \n";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";s:5:"child";a:2:{s:0:"";a:5:{s:5:"title";a:1:{i:0;a:5:{s:4:"data";s:91:"WordPress.tv: Kathryn Presner: Taking Control of your Templates with WordPress Conditionals";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"guid";a:1:{i:0;a:5:{s:4:"data";s:27:"http://wordpress.tv/?p=7023";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"link";a:1:{i:0;a:5:{s:4:"data";s:108:"http://wordpress.tv/2011/10/08/kathryn-presner-taking-control-of-your-templates-with-wordpress-conditionals/";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:11:"description";a:1:{i:0;a:5:{s:4:"data";s:1850:"
\n
\n
Kathryn Presner: WordPress Conditionals
";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:7:"pubDate";a:1:{i:0;a:5:{s:4:"data";s:31:"Sat, 08 Oct 2011 21:09:14 +0000";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:32:"http://purl.org/dc/elements/1.1/";a:1:{s:7:"creator";a:1:{i:0;a:5:{s:4:"data";s:10:"wcmontreal";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}}}i:47;a:6:{s:4:"data";s:13:"\n \n \n \n \n \n \n";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";s:5:"child";a:2:{s:0:"";a:5:{s:5:"title";a:1:{i:0;a:5:{s:4:"data";s:45:"WordPress.tv: Allen Pike: Tackling JavaScript";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"guid";a:1:{i:0;a:5:{s:4:"data";s:27:"http://wordpress.tv/?p=6952";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"link";a:1:{i:0;a:5:{s:4:"data";s:62:"http://wordpress.tv/2011/10/08/allen-pike-tackling-javascript/";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:11:"description";a:1:{i:0;a:5:{s:4:"data";s:1799:"
\n
\n
Allen Pike: Tackling Javascript
";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:7:"pubDate";a:1:{i:0;a:5:{s:4:"data";s:31:"Sat, 08 Oct 2011 15:01:12 +0000";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:32:"http://purl.org/dc/elements/1.1/";a:1:{s:7:"creator";a:1:{i:0;a:5:{s:4:"data";s:11:"wcvancouver";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}}}i:48;a:6:{s:4:"data";s:13:"\n \n \n \n \n \n \n";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";s:5:"child";a:2:{s:0:"";a:5:{s:5:"title";a:1:{i:0;a:5:{s:4:"data";s:58:"Weblog Tools Collection: WordPress Theme Releases for 10/8";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"guid";a:1:{i:0;a:5:{s:4:"data";s:41:"http://weblogtoolscollection.com/?p=10564";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"link";a:1:{i:0;a:5:{s:4:"data";s:73:"http://feedproxy.google.com/~r/weblogtoolscollection/UXMP/~3/C6sM_BhKrTQ/";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:11:"description";a:1:{i:0;a:5:{s:4:"data";s:851:"

\n

Blutreme is a lightweight and simple theme with built-in fancybox support for thumbnails and medium sized images in the posts.

\n

\n

Pink Touch 2 has a stellar mix of color, texture and typography.

\n";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:7:"pubDate";a:1:{i:0;a:5:{s:4:"data";s:31:"Sat, 08 Oct 2011 13:00:12 +0000";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:32:"http://purl.org/dc/elements/1.1/";a:1:{s:7:"creator";a:1:{i:0;a:5:{s:4:"data";s:5:"James";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}}}i:49;a:6:{s:4:"data";s:13:"\n \n \n \n \n \n \n";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";s:5:"child";a:2:{s:0:"";a:5:{s:5:"title";a:1:{i:0;a:5:{s:4:"data";s:41:"WPTavern: WPWeekly Episode 114 – WordUp";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"guid";a:1:{i:0;a:5:{s:4:"data";s:31:"http://www.wptavern.com/?p=5566";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"link";a:1:{i:0;a:5:{s:4:"data";s:99:"http://feedproxy.google.com/~r/WordpressTavern/~3/lhA91M5jOGg/wpweekly-episode-114-%e2%80%93-wordup";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:11:"description";a:1:{i:0;a:5:{s:4:"data";s:2926:"

wordpressweekly1In this episode of WordPress Weekly, I had a roundtable discussion with longtime WordPress community member Eric Mann on a number of topics mentioned in previous episodes. The end of the show featured an interview with Taryn and Martin who are organizers of WordUp Edinburgh to talk about not only the event but also about the WordCamp Guidelines and the interesting dynamic of hosting WordCamp events in the U.K. region.

\n

Stories Discussed:

\n

WordUp – A Fork Of WordCamp
\nWPCandy Turns 4
\nTribute To Steve Jobs
\nShould Automatic Upgrades be Opt-In?
\nPlugin Quantity Not Quality
\nReasons Not To Upgrade WordPress
\nKevin Johns Reaction To The Post Regarding Reasons Not To Upgrade
\nWhen Will Automattic Be Acquired?

\n

WPWeekly Meta:

\n

Subscribe To WPWeekly Via Itunes: Click here to subscribe

\n

Length Of Episode: 1 Hour 20 Minutes

\n

Download The Show: WordPressWeeklyEpisode114.mp3

\n

Listen To Episode #114:
\n

\n\n\n

Related posts:

  1. WPWeekly Episode 111 – You’ve Been DevPressed
  2. \n
  3. WPWeekly Episode 12 – Round Table Discussion Post WordCamp Dallas
  4. \n
  5. WordUp – A Fork Of WordCamp
  6. \n

";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:7:"pubDate";a:1:{i:0;a:5:{s:4:"data";s:31:"Sat, 08 Oct 2011 10:07:50 +0000";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:32:"http://purl.org/dc/elements/1.1/";a:1:{s:7:"creator";a:1:{i:0;a:5:{s:4:"data";s:6:"Jeffro";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}}}}}}}}}}}}}}s:4:"type";i:128;s:7:"headers";a:9:{s:6:"server";s:5:"nginx";s:4:"date";s:29:"Thu, 20 Oct 2011 18:53:50 GMT";s:12:"content-type";s:15:"application/xml";s:10:"connection";s:5:"close";s:4:"vary";s:15:"Accept-Encoding";s:13:"last-modified";s:29:"Thu, 20 Oct 2011 18:30:41 GMT";s:14:"content-length";s:6:"143014";s:4:"x-nc";s:11:"HIT luv 139";s:13:"accept-ranges";s:5:"bytes";}s:5:"build";s:14:"20090627192103";}', 'no'); +INSERT INTO `wpr3ss_options` (`option_id`, `blog_id`, `option_name`, `option_value`, `autoload`) VALUES +(143, 0, '_transient_timeout_feed_mod_867bd5c64f85878d03a060509cd2f92c', '1319180030', 'no'), +(144, 0, '_transient_feed_mod_867bd5c64f85878d03a060509cd2f92c', '1319136830', 'no'), +(145, 0, '_transient_timeout_dash_aa95765b5cc111c56d5993d476b1c2f0', '1319180031', 'no'), +(146, 0, '_transient_dash_aa95765b5cc111c56d5993d476b1c2f0', '
', 'no'), +(147, 0, '_transient_timeout_feed_1a5f760f2e2b48827d4974a60857e7c2', '1319180031', 'no'), +(148, 0, '_transient_feed_1a5f760f2e2b48827d4974a60857e7c2', 'a:4:{s:5:"child";a:1:{s:0:"";a:1:{s:3:"rss";a:1:{i:0;a:6:{s:4:"data";s:3:"\n \n";s:7:"attribs";a:1:{s:0:"";a:1:{s:7:"version";s:3:"2.0";}}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";s:5:"child";a:1:{s:0:"";a:1:{s:7:"channel";a:1:{i:0;a:6:{s:4:"data";s:72:"\n \n \n \n \n \n \n \n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n ";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";s:5:"child";a:2:{s:0:"";a:7:{s:5:"title";a:1:{i:0;a:5:{s:4:"data";s:43:"WordPress Plugins » View: Recently Updated";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"link";a:1:{i:0;a:5:{s:4:"data";s:51:"http://wordpress.org/extend/plugins/browse/updated/";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:11:"description";a:1:{i:0;a:5:{s:4:"data";s:43:"WordPress Plugins » View: Recently Updated";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:8:"language";a:1:{i:0;a:5:{s:4:"data";s:5:"en-US";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:7:"pubDate";a:1:{i:0;a:5:{s:4:"data";s:31:"Thu, 20 Oct 2011 18:44:57 +0000";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:9:"generator";a:1:{i:0;a:5:{s:4:"data";s:25:"http://bbpress.org/?v=1.1";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"item";a:15:{i:0;a:6:{s:4:"data";s:30:"\n \n \n \n \n \n \n ";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";s:5:"child";a:2:{s:0:"";a:5:{s:5:"title";a:1:{i:0;a:5:{s:4:"data";s:28:"Derek Herman on "BuySellAds"";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"link";a:1:{i:0;a:5:{s:4:"data";s:58:"http://wordpress.org/extend/plugins/buysellads/#post-19514";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:7:"pubDate";a:1:{i:0;a:5:{s:4:"data";s:31:"Fri, 23 Jul 2010 14:43:32 +0000";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"guid";a:1:{i:0;a:5:{s:4:"data";s:42:"19514@http://wordpress.org/extend/plugins/";s:7:"attribs";a:1:{s:0:"";a:1:{s:11:"isPermaLink";s:5:"false";}}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:11:"description";a:1:{i:0;a:5:{s:4:"data";s:41:"Official BuySellAds.com WordPress plugin.";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:32:"http://purl.org/dc/elements/1.1/";a:1:{s:7:"creator";a:1:{i:0;a:5:{s:4:"data";s:12:"Derek Herman";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}}}i:1;a:6:{s:4:"data";s:30:"\n \n \n \n \n \n \n ";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";s:5:"child";a:2:{s:0:"";a:5:{s:5:"title";a:1:{i:0;a:5:{s:4:"data";s:20:"kubi23 on "NoSpamNX"";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"link";a:1:{i:0;a:5:{s:4:"data";s:55:"http://wordpress.org/extend/plugins/nospamnx/#post-8421";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:7:"pubDate";a:1:{i:0;a:5:{s:4:"data";s:31:"Tue, 06 Jan 2009 16:31:30 +0000";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"guid";a:1:{i:0;a:5:{s:4:"data";s:41:"8421@http://wordpress.org/extend/plugins/";s:7:"attribs";a:1:{s:0:"";a:1:{s:11:"isPermaLink";s:5:"false";}}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:11:"description";a:1:{i:0;a:5:{s:4:"data";s:130:"To protect your Blog from automated spambots, this plugin adds additional formfields (hidden to human-users) to your comment form.";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:32:"http://purl.org/dc/elements/1.1/";a:1:{s:7:"creator";a:1:{i:0;a:5:{s:4:"data";s:6:"kubi23";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}}}i:2;a:6:{s:4:"data";s:30:"\n \n \n \n \n \n \n ";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";s:5:"child";a:2:{s:0:"";a:5:{s:5:"title";a:1:{i:0;a:5:{s:4:"data";s:53:"Mike on "WordPress Ultra Simple Paypal Shopping Cart"";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"link";a:1:{i:0;a:5:{s:4:"data";s:84:"http://wordpress.org/extend/plugins/wp-ultra-simple-paypal-shopping-cart/#post-29458";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:7:"pubDate";a:1:{i:0;a:5:{s:4:"data";s:31:"Fri, 19 Aug 2011 15:44:47 +0000";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"guid";a:1:{i:0;a:5:{s:4:"data";s:42:"29458@http://wordpress.org/extend/plugins/";s:7:"attribs";a:1:{s:0:"";a:1:{s:11:"isPermaLink";s:5:"false";}}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:11:"description";a:1:{i:0;a:5:{s:4:"data";s:150:"Very easy to use Ultra Simple WordPress Paypal Shopping Cart Plugin. Great for selling products or service online with Paypal in one click with a simp";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:32:"http://purl.org/dc/elements/1.1/";a:1:{s:7:"creator";a:1:{i:0;a:5:{s:4:"data";s:4:"Mike";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}}}i:3;a:6:{s:4:"data";s:30:"\n \n \n \n \n \n \n ";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";s:5:"child";a:2:{s:0:"";a:5:{s:5:"title";a:1:{i:0;a:5:{s:4:"data";s:22:"sparkweb on "FoxyShop"";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"link";a:1:{i:0;a:5:{s:4:"data";s:56:"http://wordpress.org/extend/plugins/foxyshop/#post-24544";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:7:"pubDate";a:1:{i:0;a:5:{s:4:"data";s:31:"Sat, 19 Feb 2011 08:06:34 +0000";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"guid";a:1:{i:0;a:5:{s:4:"data";s:42:"24544@http://wordpress.org/extend/plugins/";s:7:"attribs";a:1:{s:0:"";a:1:{s:11:"isPermaLink";s:5:"false";}}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:11:"description";a:1:{i:0;a:5:{s:4:"data";s:127:"FoxyShop provides a robust shopping cart and inventory management tool for use with FoxyCart's hosted e-commerce solution.";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:32:"http://purl.org/dc/elements/1.1/";a:1:{s:7:"creator";a:1:{i:0;a:5:{s:4:"data";s:8:"sparkweb";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}}}i:4;a:6:{s:4:"data";s:30:"\n \n \n \n \n \n \n ";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";s:5:"child";a:2:{s:0:"";a:5:{s:5:"title";a:1:{i:0;a:5:{s:4:"data";s:34:"antonchanning on "bbPress2 BBCode"";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"link";a:1:{i:0;a:5:{s:4:"data";s:62:"http://wordpress.org/extend/plugins/bbpress-bbcode/#post-31129";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:7:"pubDate";a:1:{i:0;a:5:{s:4:"data";s:31:"Fri, 14 Oct 2011 16:18:41 +0000";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"guid";a:1:{i:0;a:5:{s:4:"data";s:42:"31129@http://wordpress.org/extend/plugins/";s:7:"attribs";a:1:{s:0:"";a:1:{s:11:"isPermaLink";s:5:"false";}}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:11:"description";a:1:{i:0;a:5:{s:4:"data";s:116:"This plugin adds support for popular bbcode forum code to posts, comments,\npages and bbpress 2.0 topics and replies.";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:32:"http://purl.org/dc/elements/1.1/";a:1:{s:7:"creator";a:1:{i:0;a:5:{s:4:"data";s:13:"antonchanning";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}}}i:5;a:6:{s:4:"data";s:30:"\n \n \n \n \n \n \n ";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";s:5:"child";a:2:{s:0:"";a:5:{s:5:"title";a:1:{i:0;a:5:{s:4:"data";s:36:"Sanauna on "Order Categories widget"";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"link";a:1:{i:0;a:5:{s:4:"data";s:64:"http://wordpress.org/extend/plugins/wp-category-list/#post-30759";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:7:"pubDate";a:1:{i:0;a:5:{s:4:"data";s:31:"Sun, 02 Oct 2011 19:50:20 +0000";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"guid";a:1:{i:0;a:5:{s:4:"data";s:42:"30759@http://wordpress.org/extend/plugins/";s:7:"attribs";a:1:{s:0:"";a:1:{s:11:"isPermaLink";s:5:"false";}}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:11:"description";a:1:{i:0;a:5:{s:4:"data";s:93:"My Category Order allows you to set the order in which categories will appear in the sidebar.";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:32:"http://purl.org/dc/elements/1.1/";a:1:{s:7:"creator";a:1:{i:0;a:5:{s:4:"data";s:7:"Sanauna";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}}}i:6;a:6:{s:4:"data";s:30:"\n \n \n \n \n \n \n ";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";s:5:"child";a:2:{s:0:"";a:5:{s:5:"title";a:1:{i:0;a:5:{s:4:"data";s:27:"goonanism on "Gallery Only"";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"link";a:1:{i:0;a:5:{s:4:"data";s:60:"http://wordpress.org/extend/plugins/gallery-only/#post-31272";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:7:"pubDate";a:1:{i:0;a:5:{s:4:"data";s:31:"Wed, 19 Oct 2011 11:07:37 +0000";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"guid";a:1:{i:0;a:5:{s:4:"data";s:42:"31272@http://wordpress.org/extend/plugins/";s:7:"attribs";a:1:{s:0:"";a:1:{s:11:"isPermaLink";s:5:"false";}}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:11:"description";a:1:{i:0;a:5:{s:4:"data";s:123:"Description: This plugin replaces the default gallery with clean looking carousel that utilises the Moodular jQuery plugin.";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:32:"http://purl.org/dc/elements/1.1/";a:1:{s:7:"creator";a:1:{i:0;a:5:{s:4:"data";s:9:"goonanism";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}}}i:7;a:6:{s:4:"data";s:30:"\n \n \n \n \n \n \n ";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";s:5:"child";a:2:{s:0:"";a:5:{s:5:"title";a:1:{i:0;a:5:{s:4:"data";s:37:"ramseyp on "Foomark WordPress Widget"";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"link";a:1:{i:0;a:5:{s:4:"data";s:72:"http://wordpress.org/extend/plugins/foomark-wordpress-widget/#post-31304";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:7:"pubDate";a:1:{i:0;a:5:{s:4:"data";s:31:"Wed, 19 Oct 2011 23:57:15 +0000";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"guid";a:1:{i:0;a:5:{s:4:"data";s:42:"31304@http://wordpress.org/extend/plugins/";s:7:"attribs";a:1:{s:0:"";a:1:{s:11:"isPermaLink";s:5:"false";}}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:11:"description";a:1:{i:0;a:5:{s:4:"data";s:69:"Foomark WordPress Widget displays your Foomark bookmarks in a widget.";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:32:"http://purl.org/dc/elements/1.1/";a:1:{s:7:"creator";a:1:{i:0;a:5:{s:4:"data";s:7:"ramseyp";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}}}i:8;a:6:{s:4:"data";s:30:"\n \n \n \n \n \n \n ";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";s:5:"child";a:2:{s:0:"";a:5:{s:5:"title";a:1:{i:0;a:5:{s:4:"data";s:40:"Sergey Biryukov on "IDN AJAX Workaround"";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"link";a:1:{i:0;a:5:{s:4:"data";s:67:"http://wordpress.org/extend/plugins/idn-ajax-workaround/#post-31319";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:7:"pubDate";a:1:{i:0;a:5:{s:4:"data";s:31:"Thu, 20 Oct 2011 13:54:51 +0000";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"guid";a:1:{i:0;a:5:{s:4:"data";s:42:"31319@http://wordpress.org/extend/plugins/";s:7:"attribs";a:1:{s:0:"";a:1:{s:11:"isPermaLink";s:5:"false";}}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:11:"description";a:1:{i:0;a:5:{s:4:"data";s:62:"Fixes AJAX requests on sites with IDN domains in IE and Opera.";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:32:"http://purl.org/dc/elements/1.1/";a:1:{s:7:"creator";a:1:{i:0;a:5:{s:4:"data";s:15:"Sergey Biryukov";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}}}i:9;a:6:{s:4:"data";s:30:"\n \n \n \n \n \n \n ";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";s:5:"child";a:2:{s:0:"";a:5:{s:5:"title";a:1:{i:0;a:5:{s:4:"data";s:29:"plugin-master on "WP-Members"";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"link";a:1:{i:0;a:5:{s:4:"data";s:58:"http://wordpress.org/extend/plugins/wp-members/#post-13234";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:7:"pubDate";a:1:{i:0;a:5:{s:4:"data";s:31:"Wed, 23 Sep 2009 19:07:34 +0000";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"guid";a:1:{i:0;a:5:{s:4:"data";s:42:"13234@http://wordpress.org/extend/plugins/";s:7:"attribs";a:1:{s:0:"";a:1:{s:11:"isPermaLink";s:5:"false";}}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:11:"description";a:1:{i:0;a:5:{s:4:"data";s:120:"WP-Members™ is a free membership management system for WordPress® that restricts content to registered users.";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:32:"http://purl.org/dc/elements/1.1/";a:1:{s:7:"creator";a:1:{i:0;a:5:{s:4:"data";s:13:"plugin-master";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}}}i:10;a:6:{s:4:"data";s:30:"\n \n \n \n \n \n \n ";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";s:5:"child";a:2:{s:0:"";a:5:{s:5:"title";a:1:{i:0;a:5:{s:4:"data";s:20:"Chouby on "Polylang"";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"link";a:1:{i:0;a:5:{s:4:"data";s:56:"http://wordpress.org/extend/plugins/polylang/#post-30393";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:7:"pubDate";a:1:{i:0;a:5:{s:4:"data";s:31:"Wed, 21 Sep 2011 20:26:16 +0000";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"guid";a:1:{i:0;a:5:{s:4:"data";s:42:"30393@http://wordpress.org/extend/plugins/";s:7:"attribs";a:1:{s:0:"";a:1:{s:11:"isPermaLink";s:5:"false";}}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:11:"description";a:1:{i:0;a:5:{s:4:"data";s:39:"Adds multilingual support to WordPress.";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:32:"http://purl.org/dc/elements/1.1/";a:1:{s:7:"creator";a:1:{i:0;a:5:{s:4:"data";s:6:"Chouby";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}}}i:11;a:6:{s:4:"data";s:30:"\n \n \n \n \n \n \n ";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";s:5:"child";a:2:{s:0:"";a:5:{s:5:"title";a:1:{i:0;a:5:{s:4:"data";s:30:"vagabumming on "Branded Email"";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"link";a:1:{i:0;a:5:{s:4:"data";s:61:"http://wordpress.org/extend/plugins/branded-email/#post-31324";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:7:"pubDate";a:1:{i:0;a:5:{s:4:"data";s:31:"Thu, 20 Oct 2011 15:18:54 +0000";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"guid";a:1:{i:0;a:5:{s:4:"data";s:42:"31324@http://wordpress.org/extend/plugins/";s:7:"attribs";a:1:{s:0:"";a:1:{s:11:"isPermaLink";s:5:"false";}}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:11:"description";a:1:{i:0;a:5:{s:4:"data";s:48:"Sends your logo with WordPress generated emails.";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:32:"http://purl.org/dc/elements/1.1/";a:1:{s:7:"creator";a:1:{i:0;a:5:{s:4:"data";s:11:"vagabumming";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}}}i:12;a:6:{s:4:"data";s:30:"\n \n \n \n \n \n \n ";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";s:5:"child";a:2:{s:0:"";a:5:{s:5:"title";a:1:{i:0;a:5:{s:4:"data";s:31:"nutsmuggler on "Events Manager"";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"link";a:1:{i:0;a:5:{s:4:"data";s:61:"http://wordpress.org/extend/plugins/events-manager/#post-6340";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:7:"pubDate";a:1:{i:0;a:5:{s:4:"data";s:31:"Mon, 21 Jul 2008 13:17:00 +0000";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"guid";a:1:{i:0;a:5:{s:4:"data";s:41:"6340@http://wordpress.org/extend/plugins/";s:7:"attribs";a:1:{s:0:"";a:1:{s:11:"isPermaLink";s:5:"false";}}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:11:"description";a:1:{i:0;a:5:{s:4:"data";s:147:"Fully featured event registration management including recurring events, locations management, calendar, Google map integration, booking management";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:32:"http://purl.org/dc/elements/1.1/";a:1:{s:7:"creator";a:1:{i:0;a:5:{s:4:"data";s:11:"nutsmuggler";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}}}i:13;a:6:{s:4:"data";s:30:"\n \n \n \n \n \n \n ";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";s:5:"child";a:2:{s:0:"";a:5:{s:5:"title";a:1:{i:0;a:5:{s:4:"data";s:47:"awpcp on "Another Wordpress Classifieds Plugin"";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"link";a:1:{i:0;a:5:{s:4:"data";s:83:"http://wordpress.org/extend/plugins/another-wordpress-classifieds-plugin/#post-9736";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:7:"pubDate";a:1:{i:0;a:5:{s:4:"data";s:31:"Thu, 19 Mar 2009 14:55:00 +0000";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"guid";a:1:{i:0;a:5:{s:4:"data";s:41:"9736@http://wordpress.org/extend/plugins/";s:7:"attribs";a:1:{s:0:"";a:1:{s:11:"isPermaLink";s:5:"false";}}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:11:"description";a:1:{i:0;a:5:{s:4:"data";s:133:"AWPCP Classifieds: Great for increasing retention to your site, adding revenue for your business, and creating customer interaction.";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:32:"http://purl.org/dc/elements/1.1/";a:1:{s:7:"creator";a:1:{i:0;a:5:{s:4:"data";s:5:"awpcp";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}}}i:14;a:6:{s:4:"data";s:30:"\n \n \n \n \n \n \n ";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";s:5:"child";a:2:{s:0:"";a:5:{s:5:"title";a:1:{i:0;a:5:{s:4:"data";s:71:"jagan.2desk on "ClickDesk Live Support - Live Chat Plugin for Websites"";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"link";a:1:{i:0;a:5:{s:4:"data";s:82:"http://wordpress.org/extend/plugins/clickdesk-live-support-chat-plugin/#post-30808";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:7:"pubDate";a:1:{i:0;a:5:{s:4:"data";s:31:"Tue, 04 Oct 2011 15:59:26 +0000";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"guid";a:1:{i:0;a:5:{s:4:"data";s:42:"30808@http://wordpress.org/extend/plugins/";s:7:"attribs";a:1:{s:0:"";a:1:{s:11:"isPermaLink";s:5:"false";}}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:11:"description";a:1:{i:0;a:5:{s:4:"data";s:144:"ClickDesk is the fastest live-chat service. Built-in Browser Phone and local access numbers in 40 countries are included. Install it Free today!";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:32:"http://purl.org/dc/elements/1.1/";a:1:{s:7:"creator";a:1:{i:0;a:5:{s:4:"data";s:11:"jagan.2desk";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}}}}}s:27:"http://www.w3.org/2005/Atom";a:1:{s:4:"link";a:1:{i:0;a:5:{s:4:"data";s:0:"";s:7:"attribs";a:1:{s:0:"";a:3:{s:4:"href";s:52:"http://wordpress.org/extend/plugins/rss/view/updated";s:3:"rel";s:4:"self";s:4:"type";s:19:"application/rss+xml";}}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}}}}}}}}}}s:4:"type";i:128;s:7:"headers";a:8:{s:6:"server";s:5:"nginx";s:4:"date";s:29:"Thu, 20 Oct 2011 18:53:52 GMT";s:12:"content-type";s:23:"text/xml; charset=UTF-8";s:10:"connection";s:5:"close";s:4:"vary";s:15:"Accept-Encoding";s:13:"last-modified";s:19:"2010-07-23 14:43:32";s:14:"content-length";s:4:"7856";s:4:"x-nc";s:11:"HIT luv 139";}s:5:"build";s:14:"20090627192103";}', 'no'), +(149, 0, '_transient_timeout_feed_mod_1a5f760f2e2b48827d4974a60857e7c2', '1319180031', 'no'), +(150, 0, '_transient_feed_mod_1a5f760f2e2b48827d4974a60857e7c2', '1319136831', 'no'), +(151, 0, '_transient_timeout_plugin_slugs', '1319223231', 'no'), +(152, 0, '_transient_plugin_slugs', 'a:2:{i:0;s:19:"akismet/akismet.php";i:1;s:9:"hello.php";}', 'no'), +(153, 0, '_transient_timeout_dash_de3249c4736ad3bd2cd29147c4a0d43e', '1319180031', 'no'), +(154, 0, '_transient_dash_de3249c4736ad3bd2cd29147c4a0d43e', '

Más populares

\n
1 Flash Gallery
 (Instalar)\n

1 Flash Gallery is a Photo Gallery with slideshow function, many skins and powerfull admin to manage your image gallery without any program skills

\n

Plugins recientes

\n
Branded Email
 (Instalar)\n

Sends your logo with WordPress generated emails.

\n

Actualizados recientemente

\n
Branded Email
 (Instalar)\n

Sends your logo with WordPress generated emails.

\n', 'no'); + +-- -------------------------------------------------------- + +-- +-- Estructura de tabla para la tabla `wpr3ss_postmeta` +-- + +CREATE TABLE IF NOT EXISTS `wpr3ss_postmeta` ( + `meta_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, + `post_id` bigint(20) unsigned NOT NULL DEFAULT '0', + `meta_key` varchar(255) DEFAULT NULL, + `meta_value` longtext, + PRIMARY KEY (`meta_id`), + KEY `post_id` (`post_id`), + KEY `meta_key` (`meta_key`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=2 ; + +-- +-- Volcado de datos para la tabla `wpr3ss_postmeta` +-- + +INSERT INTO `wpr3ss_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES +(1, 2, '_wp_page_template', 'default'); + +-- -------------------------------------------------------- + +-- +-- Estructura de tabla para la tabla `wpr3ss_posts` +-- + +CREATE TABLE IF NOT EXISTS `wpr3ss_posts` ( + `ID` bigint(20) unsigned NOT NULL AUTO_INCREMENT, + `post_author` bigint(20) unsigned NOT NULL DEFAULT '0', + `post_date` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', + `post_date_gmt` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', + `post_content` longtext NOT NULL, + `post_title` text NOT NULL, + `post_excerpt` text NOT NULL, + `post_status` varchar(20) NOT NULL DEFAULT 'publish', + `comment_status` varchar(20) NOT NULL DEFAULT 'open', + `ping_status` varchar(20) NOT NULL DEFAULT 'open', + `post_password` varchar(20) NOT NULL DEFAULT '', + `post_name` varchar(200) NOT NULL DEFAULT '', + `to_ping` text NOT NULL, + `pinged` text NOT NULL, + `post_modified` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', + `post_modified_gmt` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', + `post_content_filtered` text NOT NULL, + `post_parent` bigint(20) unsigned NOT NULL DEFAULT '0', + `guid` varchar(255) NOT NULL DEFAULT '', + `menu_order` int(11) NOT NULL DEFAULT '0', + `post_type` varchar(20) NOT NULL DEFAULT 'post', + `post_mime_type` varchar(100) NOT NULL DEFAULT '', + `comment_count` bigint(20) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`), + KEY `post_name` (`post_name`), + KEY `type_status_date` (`post_type`,`post_status`,`post_date`,`ID`), + KEY `post_parent` (`post_parent`), + KEY `post_author` (`post_author`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=4 ; + +-- +-- Volcado de datos para la tabla `wpr3ss_posts` +-- + +INSERT INTO `wpr3ss_posts` (`ID`, `post_author`, `post_date`, `post_date_gmt`, `post_content`, `post_title`, `post_excerpt`, `post_status`, `comment_status`, `ping_status`, `post_password`, `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`) VALUES +(1, 1, '2011-10-20 18:53:37', '2011-10-20 18:53:37', 'Bienvenido a WordPress. Esta es tu primera entrada. Edítala o bórrala, ¡y comienza a publicar!.', '¡Hola mundo!', '', 'publish', 'open', 'open', '', 'hola-mundo', '', '', '2011-10-20 18:53:37', '2011-10-20 18:53:37', '', 0, 'http://localhost/afetec/?p=1', 0, 'post', '', 1), +(2, 1, '2011-10-20 18:53:37', '2011-10-20 18:53:37', 'Esta es una página de ejemplo, Es diferente a una entrada de un blog porque se mantiene estática y, en la mayoría de temas, se mostrará en la barra de navegación. Casi todo el mundo comienza con una página Sobre mí para presentarse a los potenciales visitantes. Puede decir algo así:\n\n
¡Hola!: Soy físico durante el día, lector de manga por las noches y este es mi blog. Vivo en Albacete y tengo un gato llamado Alex. Me encantan los mojitos (y mirar a la gente corriendo en los parques)
\n\nO algo así:\n\n
La empresa Calcetines XYC se fundó en 1973, y ha estado produciendo calcetines de calidad para sus clientes desde entonces. Se encuentra en Vetusta, tiene unos 2.000 empleados e intenta ayudar en lo que puede para mejorar la vida en Vestusta
\n\nDeberías ir a tu escritorio, borrar esta página y crear algunas nuevas con tu contenido. ¡A divertirse!', 'Página de ejemplo', '', 'publish', 'open', 'open', '', 'pagina-ejemplo', '', '', '2011-10-20 18:53:37', '2011-10-20 18:53:37', '', 0, 'http://localhost/afetec/?page_id=2', 0, 'page', '', 0), +(3, 1, '2011-10-20 18:53:46', '0000-00-00 00:00:00', '', 'Borrador automático', '', 'auto-draft', 'open', 'open', '', '', '', '', '2011-10-20 18:53:46', '0000-00-00 00:00:00', '', 0, 'http://localhost/afetec/?p=3', 0, 'post', '', 0); + +-- -------------------------------------------------------- + +-- +-- Estructura de tabla para la tabla `wpr3ss_terms` +-- + +CREATE TABLE IF NOT EXISTS `wpr3ss_terms` ( + `term_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, + `name` varchar(200) NOT NULL DEFAULT '', + `slug` varchar(200) NOT NULL DEFAULT '', + `term_group` bigint(10) NOT NULL DEFAULT '0', + PRIMARY KEY (`term_id`), + UNIQUE KEY `slug` (`slug`), + KEY `name` (`name`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=3 ; + +-- +-- Volcado de datos para la tabla `wpr3ss_terms` +-- + +INSERT INTO `wpr3ss_terms` (`term_id`, `name`, `slug`, `term_group`) VALUES +(1, 'Sin categoría', 'sin-categoria', 0), +(2, 'Sitios de interés', 'sitios-de-interes', 0); + +-- -------------------------------------------------------- + +-- +-- Estructura de tabla para la tabla `wpr3ss_term_relationships` +-- + +CREATE TABLE IF NOT EXISTS `wpr3ss_term_relationships` ( + `object_id` bigint(20) unsigned NOT NULL DEFAULT '0', + `term_taxonomy_id` bigint(20) unsigned NOT NULL DEFAULT '0', + `term_order` int(11) NOT NULL DEFAULT '0', + PRIMARY KEY (`object_id`,`term_taxonomy_id`), + KEY `term_taxonomy_id` (`term_taxonomy_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- +-- Volcado de datos para la tabla `wpr3ss_term_relationships` +-- + +INSERT INTO `wpr3ss_term_relationships` (`object_id`, `term_taxonomy_id`, `term_order`) VALUES +(1, 1, 0), +(1, 2, 0), +(2, 2, 0), +(3, 2, 0), +(4, 2, 0), +(5, 2, 0), +(6, 2, 0), +(7, 2, 0); + +-- -------------------------------------------------------- + +-- +-- Estructura de tabla para la tabla `wpr3ss_term_taxonomy` +-- + +CREATE TABLE IF NOT EXISTS `wpr3ss_term_taxonomy` ( + `term_taxonomy_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, + `term_id` bigint(20) unsigned NOT NULL DEFAULT '0', + `taxonomy` varchar(32) NOT NULL DEFAULT '', + `description` longtext NOT NULL, + `parent` bigint(20) unsigned NOT NULL DEFAULT '0', + `count` bigint(20) NOT NULL DEFAULT '0', + PRIMARY KEY (`term_taxonomy_id`), + UNIQUE KEY `term_id_taxonomy` (`term_id`,`taxonomy`), + KEY `taxonomy` (`taxonomy`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=3 ; + +-- +-- Volcado de datos para la tabla `wpr3ss_term_taxonomy` +-- + +INSERT INTO `wpr3ss_term_taxonomy` (`term_taxonomy_id`, `term_id`, `taxonomy`, `description`, `parent`, `count`) VALUES +(1, 1, 'category', '', 0, 1), +(2, 2, 'link_category', '', 0, 7); + +-- -------------------------------------------------------- + +-- +-- Estructura de tabla para la tabla `wpr3ss_usermeta` +-- + +CREATE TABLE IF NOT EXISTS `wpr3ss_usermeta` ( + `umeta_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, + `user_id` bigint(20) unsigned NOT NULL DEFAULT '0', + `meta_key` varchar(255) DEFAULT NULL, + `meta_value` longtext, + PRIMARY KEY (`umeta_id`), + KEY `user_id` (`user_id`), + KEY `meta_key` (`meta_key`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=17 ; + +-- +-- Volcado de datos para la tabla `wpr3ss_usermeta` +-- + +INSERT INTO `wpr3ss_usermeta` (`umeta_id`, `user_id`, `meta_key`, `meta_value`) VALUES +(1, 1, 'first_name', ''), +(2, 1, 'last_name', ''), +(3, 1, 'nickname', 'rodax'), +(4, 1, 'description', ''), +(5, 1, 'rich_editing', 'true'), +(6, 1, 'comment_shortcuts', 'false'), +(7, 1, 'admin_color', 'fresh'), +(8, 1, 'use_ssl', '0'), +(9, 1, 'show_admin_bar_front', 'true'), +(10, 1, 'show_admin_bar_admin', 'false'), +(11, 1, 'aim', ''), +(12, 1, 'yim', ''), +(13, 1, 'jabber', ''), +(14, 1, 'wpr3ss_capabilities', 'a:1:{s:13:"administrator";s:1:"1";}'), +(15, 1, 'wpr3ss_user_level', '10'), +(16, 1, 'wpr3ss_dashboard_quick_press_last_post_id', '3'); + +-- -------------------------------------------------------- + +-- +-- Estructura de tabla para la tabla `wpr3ss_users` +-- + +CREATE TABLE IF NOT EXISTS `wpr3ss_users` ( + `ID` bigint(20) unsigned NOT NULL AUTO_INCREMENT, + `user_login` varchar(60) NOT NULL DEFAULT '', + `user_pass` varchar(64) NOT NULL DEFAULT '', + `user_nicename` varchar(50) NOT NULL DEFAULT '', + `user_email` varchar(100) NOT NULL DEFAULT '', + `user_url` varchar(100) NOT NULL DEFAULT '', + `user_registered` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', + `user_activation_key` varchar(60) NOT NULL DEFAULT '', + `user_status` int(11) NOT NULL DEFAULT '0', + `display_name` varchar(250) NOT NULL DEFAULT '', + PRIMARY KEY (`ID`), + KEY `user_login_key` (`user_login`), + KEY `user_nicename` (`user_nicename`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=2 ; + +-- +-- Volcado de datos para la tabla `wpr3ss_users` +-- + +INSERT INTO `wpr3ss_users` (`ID`, `user_login`, `user_pass`, `user_nicename`, `user_email`, `user_url`, `user_registered`, `user_activation_key`, `user_status`, `display_name`) VALUES +(1, 'rodax', '$P$B6JdsJvMxPBgKGjLOcvMB6yC/oYonv0', 'rodax', 'darranz@rodax-software.com', '', '2011-10-20 18:53:36', '', 0, 'rodax'); + +/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; +/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; +/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; diff --git a/referencia/WordPress/wordpress-3.2.1-es_ES.zip b/referencia/WordPress/wordpress-3.2.1-es_ES.zip new file mode 100644 index 0000000000000000000000000000000000000000..17ff9ead8c57f1b557640e70432b5ba3c2488de9 GIT binary patch literal 4346064 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Ⓢ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 z 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 =JBul5L#O2SyHFEy@h~&Fcskhm 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%0DE`xa4kdBYBE5p+(L$@ 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

&S|9>EQ)eguq~o!rKC9w z;nXxrMUd+G=~C#@wBZ%LUCW)JLZG)OSW!6M4(waP5#1;#3W3B<_qb+#;)Wg?&g!%$ zUaGxQZ+l#A`WPBm3AwKp%;x3y|uv6)d_; zNO79eJuXpQrIVyAY4#Nky1B24RkCh1bsAA`$jHIzVZDzv=ISq$3w&B1mF!|7zQ@{3 z>JS~&XA>t9{^qjf%G`b2{m!wwFe*k(DN>csbpV@p@bL;oQ#GjC)FbNRRZeklJ; z&c0o}@yzX84d}r8)NM?Ksk5WzM11hh5GYrLr`%aHcWdDG)~u*b@+}wjQoE%>2}h`FP~n<-B4{2qS>$^ja$7wWs9D%p`*DS7;O0i^D`(XtqA# zCo1LaNt`%^-0*KofW|U}A!2)AS)!r@39;xuH#Wui3EZz(Es$bvF!G9m#*1~dz=T4b z`Bv0sWs`ES4199;bGppfsD>#A7zjlche71=fj>HE{e3bOm3opaci_~LEcZdEbx4NO z4uZ@?eF-|Y00?*yUFDugEG2DJFd+|)jt0t~M;&C1Em<33<2?Oo(_YZm)7N3w6c`@! zWe&=ykoLno?<(x)8{4d-KWhhfE1!KE<-YXIj@~96y%{d?O^(6fVufM*rf=FyocX5n zu%km8Md1{mdzlr3`gLy0}=*k(2?^Sf)uD*k@dBFe>{Mh+ftkH)pcjnpi@VS>%r`3dg4)sL=e@h+n>Dg3I_#uePlGm_+Z$)$eak{o38+*lkmlI1;>1qbKr=hf7$$da*!RBrr@V zF1HuKHrNzq@9nmsLL+RAUX+>x`8;0a8Rv+}L`D0w7j@(I8&B+uiw$Ksh&@XipY#THl5Uyyl=Lx3ps+-mkMVo1=%(0Y!b{Jne2zs+P11oje^PEKFJ(a@4Vr zMTR4Nj5cUp=ORsXK&vBJ>z6Vow4xWM!TwM2T4IG4oFz!95LUh8>_qrW<3`|TLrAbG z_LmfX!e}3sj8GD?N3UQ|p-%OPOVribS#kM9-lRaU%Sp<4`%&2y_PKt7;DFLmtrPv>y70iMhf9Mgcx1Q>fz5zkxx~aJz9v zn&T_Wh_{mo0$#?&I!gttDM8OURbsSzSHaWd4Ui-~CZHBc_+6NzgVa9-*M!>3&p8wr zq0unjXldW4*mLrrtLefz1R686Ezsn&j5zjIbZ+Oz_G^>;(3gzKC;DxTEkGTr7)wuR zNRN4`MXh$ui$~1H~Cvd>BB*-PAsYxmvYt3y8mucvWVfmHqV#B?Sh;E4LCm^DZE#~^fk!_NsLC|Tt^aw2A`D9#Jy%Z zs{SsaUQwna!%#06;ddU{RWg-znv$l@zdkq1?50jpz$9lunHMJV1rF=O@U(oBBC~ND zoBng*Yhw1#g}aXp7B+{Or*^)ySc2G7FbGNx#lRTvU@+Jw5!ycbq1Q*$uP4v>|VuMNj1burG zCE0o<#pq9Pdw;r*LDP61 zPk;aUd6tA9$#B|Y7D+Qu9@65OUx6*n5ExbN59^vN?sXStFcb7~7=ggrN(ZSq-&x}0t7 z?thX*+@q1nfsKz%DPm!T`%bWA#d=Uvx-?lWIs!DfUx7pTLS?8ayjF$jNiDE`oo2U{ zOoXEYYOa%;m5M~Xa3ci-(T0Hb%A9dpKkW5b2Qn4p+3(1Zv|Vb||H z8P0JJDY!jMT#(R~!6SoL&?Plp`txY@#fyya`@>S8S-@kVufpLYec+?uX~{J#@w*%k z)QaA<8B^2_f~s;{1kUXn%#Kl+2F}z-B2HmO!%7lCm5dD=(pk6o2*iY1$`!U0!U~~6 z#GjKir>zuB(-Qt-z*Ed$DC1sJ=M*e^6kUd!q|~61Tfz_e*s6INfAS}JmtP=kvO$^b z)#t?1Cx+`abo^zKUEysZ`z&J)JHw-r-~H0UhHSs%10y(n7bS=-h-W|?%~z_HDH%;J z8G2VcC>^*ih@dwkS2J_{(wR0{~1Bo6&||8y`p`OFp<-&eR9=mDTaOY#)p z+w8W*O&7Tvs)C)4i-L*fRP72~02T*RQOVU;RS6O21;qoDCxPnhrW9wlMRA2uAcYrC zAvT&ln3h?Jbw1z%T2l5W?nhha0O<}fRFJzKobZ5v0|U|#tkilscLFv~7g0`^NoD12 zcrqt>R`)|;07)A*i~)mkq%=^POhV9Ae8WIh1z!rlnJR!?%0+{qo0KREir^(?_S59I zW!sHUe1RqcGH6!4=Nga>q6*B+Foc6xl)9*6oiuYEQK_l@=V{k4aL#EAaLv~8_!#pW zw`q@IVa6^YHk4dL0MqxJtCf!nYbZbU8Cz$*?RjH`<@W%ZFa-A@u@jG}nZ%&HjeAXO zC!qlXVBa7%QxB47om)a@h8N^jRW%&SP@(ZJu2q0W@WaPH{6I)|T?2SlLtsz^)2R9& z=cB?+d-t>3Z0AV&qLDTC1i)kEDH)5B|QPcN=j&T@k8+uVQy}d9BT^j$Bp=3tB@ES3q&O1#M z`}H~IsSO;K%$2w6)I4I1%lEsF#1Pzom=C9!T^jk@ljn6 zli5s%z9@Y8!sx^mh~#e~Zk`2OhBr{sY++H!_#;;q!gT0Nhof1@G4pDbYU=*}JoHzf zs{A@S==gl%$WuD~vXZNZQ~m%Gu2h%y7xU1DT|Ekm>v9vWYy zHOc%gFBoV>1)5M6Yc1MjQS+p?baPV6)2{A!UxK#poyIOk))0q~6rU8Inlnk<*a4wW zf=}R<`Bd-IPn5fxxb`RMr=AVqDMT?laaqb#Zf7Uo7Gnb&=^l^$Ka6LSN^>SVaALXB zg{p4>OneC%c$tX^;0s;&M5$Bl=y%h@<3{plO|(yHTUJtOtJJ_1Q^Bb%uE`gJ_ywTD z0;5DsgB!%f(lQek-a>HVSICFnqIo0Wtq=icLkHYuy;ja;#23MIEd-2+O8j;YWNJ)& zW6yE1UCpxu8jPWxk3eb){t*0ga4-0O1-}C!19UuaZ!+<8+{)$3kNw1p9CR}9GQSFpWMtb*n9YX%6x(5M{QpP_v}xQNji2F;u9 zLV~U{f(6-G2$l%D3AMqd0a@NN2ZtlEQk%=mc!2<+!Ao|cSK_Xj=oeCaaK>{DG9}iEMyp6bQ4Uy#HbRY6!SJY1DAqjFWA+9_a8y~5#UoNUoh5RA z+7bo~)?bFSB9zL_#&T8vRL>?gxz5;=yye;F05qhO?9;6W%4V#J`ZR=QBpH=crG^ly zVTg6_h-}w_;4!~}MZ1ZYym>FtS$<1#8d-Ry{v0xtERr zZSo_ZDJQp3li90w*5pO60ZtuO!H8V+sF}N;j2YuZ6mCrPfW#>410=M%E^4e1^nI;XkUVYr2Tl3nTeLVc)0;zjf+F1ye##!KJLH zq^XuGt<|xzX2%V3ssbe{N60`8S zdXXz^C3nB3p!xIL)l*14yLdeZ5@^C8M2&1<2%S*(u&dKqIqS71%r?WXIoF_V%I^MZ z0Z*$_29iWtKFFhW7;8gji}mo4RzzRY2R;qdy!(<0#2SgBs!4XyVPPO&WsEjU_Mz-j z6=y|&MYxGo{29pJoNR<YXs-kS>hf9=L8r$fYg7nAACv!!@Rn1TOI$1mC2Kh&!cs z(J`=G8X)UjRi!4C0!s@U@?6}`P}jpCZ{LPBBuZgg-~9~Na|jATSls5M2dqIeNG!i@2$k71-xq^m$jlfXO7-4v?*&mJOb1XYU+*s9u)GcWUY*BpM zrtPT!RXLQ-O=j8n1uEgS^>Tx{`9tZ>%hucbpoqa)FUqRcg8T)y2_5x9EBF<~(e76T zIfeqPLMy{huA&lG8Dqatkpl(>t%hzKz-e-|L7l~}i)Wjwj1^Fgbo8QH-%9oJb&MNe z9bHibpItf}4c9%x;Y5XYrdGytS;a<^>b8ZKhBYL$7IqiHXLhfX5p4Lt7ZT=FErv*N zs+_7zEaK`OsS*tYXc8{PF{bzCk@86qKsab5gfNEjf9$Aopo=YM(XpWW!Jjs9S)DxI zzS1nbIz)`eV+j}ghO~cFI+=Ki<4>2mQEgl@ z2N($`(Xbzqp&!)26`Puzw{%Sag%HmrhHaC6%O=;kK}G-WmlRDyB^3hJ-*GgsYplc= z$ShbzZwLk*5y{h~u38k~Ou+$0aCaOh`wjO4y%yV+h7~cOGv4s3m1xsO-4|=_ZR_tB zkw%rzF((?BsIq72K6-AY%5kKb{YI~E^S){uOSR7`T%-*IvvBjaOcbM4qpQ}DJyb}b zb5M*+7VkD6T0pJqLn8vbriY{*VQu$N2(_EJ)*XVCQ}$gns(f)43EMmiB~mM zPi`5k66eSoq8L!ETymA7Ll@tl53-;IkGP?P;{sh6adLUW^%CXR;krN<+ihsnAW>sN zWp$_w077+OdJzbMsnkg0I`-x7|M4ti!wI8M|DkylV>t>L)aaW~lYbYNoYPGF;#D3N z*XGivTLwc}HziAf>IG&m8mqt?9_g%u8kx#cWET$$ROjIuCJAd?U)=o+0%fKybp1S_ z7;xY|rTVP`uwI=5iRC51aV1Ebd~UI?Xp_tNQK?U^zgur99h)z5m70kfxlsr9@rgZb zl)h0pXd)NKcg`9>OQ&OBY;5HnYv#t{Gg4!v*!!-?jmd#CpKhMs_|P>_)P6sj%IVON z8M71L(?eNH&Hs;>fiFZV^WAE0o;pgN#MnO!B4X%?I5i{xws2ez%+KFPI z0Y)=76ZY8tX>1Ky6<@}-cPxBFlz8gQgnag1xH@B7QqSXqf2vLB)ovUx>|^f{=98gz z4!ypc4bryArX<OotxHt>RB_p2d^5*4@lvAy74GUmRxqM}9nrbN< zHGgfZv1*ilY3Nn8XU$eXdTO%3*&g3m3m_RPfsWd(Zx$VcQXeE=U`cG^_Y-*1aAj{5>{|I z7{*sX#GZ!|rSs*cY|IHYw-K#r&A~BlfGlnQ3>}x=&vaP@c@gpcM~a^ zupW|^SrR?0^7}?~|1RW+G3aPJeK@gZ!ADU@%P7&AA4LT}^tgph)9+SEzFyqNGR8Vj zZsaN1A`8(R&zfVAMTvP(U0z|OC~*_0qEKiDbc($+9FCa{#(wO^Tb^|WThuyEVQ)00WtkLHjm)vce@m)eXfnDfGG4_-lA}`P$3QqB<(IgdnQm5TV+1#1~E1gR3TqR40_I#XMb8-3kDyu|n^ciGj*dXi~a z&8g#6UL+Yg9qmEU`w*kEDYG&}aHL=vZl$##%DsNvYF@lLO8N{Dw&jW|wo;>azxF*? z*46Y_;UsE&?N3s|HT~3%0^?&4jtRSo)>W~rp1rRzxY7JuA{tMS#_)MfXl@|QLfgYw zB`VL~e5gE4jTp8}5%9JZ1#r=`6?1mJgxPs(rzA$ZFdCT(1~jGMk1|{HMA`Q+Lxmid z+Ob7AZ1e=-Zj*4!PRu1=STcEscBN+nD4!#*Id&_5r!q<=NB~XYn+Uf(+NQZ{^`p4= zdS3B1UW|6KC6%M0;XGY!`tqcaHRYrTRa$8*kNgq-O|6X%DlD!L`9*e~X{BfpEG!0w z_E2IotQ|%IgrJNW~ufikXw zd4W&gUW2gf)MR;_-o#eIa=00N76mBFwEy zf(>EWX;P_?o+x#%G>n@Ku5yrzQd^KvwOGq^Y@Ae401D$Z%oLaz#5&pR3@#``X-UrG zxGWU5M!82a@Lurx<+D8{1yj|+r{{a*8CQ`g#F*4l+0d$5@zp=5KYj!esN59)s@Pbx zM94_9t$49H^$6=LF_H}SNumSBM(raE9Cc3V_?Rnz`6e`iJ*-KtDjiThfhu+&-&a4I z@EG;VzGv0hx4q+_7Kqukj1=cJRf^$eWgI@enUF1#F=ZR#t(0&YmsY+-Mvp27NkUJt zQL6;(eotu{&PoLt%o*pK=rWQS%_2-D$9C-p21!2P+{HzPxAl^oWzs;^lmeRPx!(pp>0xE5$~gg5O+=fU^yQ+^okmwYsl)k`#l`%skCLqzfQ;ck z@dTW06e6tLs63Xd>Mq5wq~4p;BZ}?O#ss<}+&M4>3(oslWoi~$_wXx5KqDr)K}tP4 z8KeyOZ-Uux6edhi=l_5$Y|$i6Z!qLen%n3>Z-M@>$89ZCaB4hw#Dcz?Z!nJ&kK?DQ zO&e@1a~MIFxD9GULVT2rObS>KWyt76NVB))=esp~>?wU+d&kBNh413kW)-{)T_@dH zm?&!_GD^7P-}TnHM>fv%E80t=@n^vW#@eER0cClrk+fN2e1bF^+P6t?#v6n4JJ)xA z!(`dstjpr#or^ZJ0yAlmWnE%YE!GxB>k!&&h$u}^Fq)8_9?l)ti`x|D;l`o`(M3BU~^DjnqHqGZ$Z-xQM)9=wxOAb4Ms=8xn(|l1iXs! zkpfc9^lWk)8B<9#9`&WpNLhb2ojkrFD{7AHoJuN_iK{Y)_VqK(DODCVlY%UY(BIYd zTTj?&AZdIs>G6)Ow5c2eeCDeBX}DEnY^@?svRvaN#h?#uFe{f6wbVgYS7r?VxJ_+J zbQF^bSeYr{BXVSc9G_%Y8Qz4UK=(yu+*Fa~#u~GZ=`0yDs0z=d8;uKisUgccf0%d> zVOpu?Y@3vDeD8kAao=S0H}sFM^2OJg3*2`dM#WCVus^j)8k zEHEwerw|}GRJ)*GOJ?tXm8-dX1}h{DMOUP{=%4$xYpa`)RT?kiPrlMCE|fFzGpfxB zUODUO+Zo${weJ-9-d@a)JN03#%Fp3vSgEIv{Jn^u`}8AyyS5J%jMCz0ylMzn@wO}C zVK4;pCp>H9BNbKrD2C|%>i#nL>S6p)^tgnF-{Zp`Jy|dRtMCd1T*o1f$;3KgC9j1k z_}V+M`N}2-LL>5g0%E9`_eaigwXdt!x+m$tQxMj9VQjXui#^apLw`?^ONU!v%7O}V zUJ&1u@O7}>M!=35j}_0}WlRzL)*6S!O7>WOXOn#> zJhp0(6w>BH*=-x4Mo1-OZJ&3bf zgj20oH)hQ+I|KcDfxeG1T%{VVg66(uRH93nWEh&=%1rj+7dA>y9c$au|A4D6xXyA9 z42ricTUO@ta6Zq262nLS^#{<$;V1!_ct^iRZ&zLbW5WJ^`1p(0ug*SyfUkeSNlvgy z8Rr5^U{sJco-sMWZp}xYmU|4!co?2xv9l_XqknEDld7YMZsoh(9b1g0GX;_vEaGyj zt!sopYglnuR7x5=CUi@(IK~@2?<1!l` zRjOsX5p`B>emHDCCZmpiXX9?-Effm!fwuX;)$KDKHje+hD0&-QU>S)b_$GCZeGwsy zh1?wtO=GaO;xGOrR@De{9ID!Ub&B*9D}z#MRBIR-$?I*PBZ9e=wg2)^EcHQ}G-*&3Ez&ktsX zzJpswZlO=ue3fkNdj+MpGGH0w8VDWYWkiZePOEPw)dVNW{Xl(%rVG00_Nw0%43(&{ z(Lh^k(nQ1nJvWLkQx{nP92oz$@FgdD8uQqqMe?fQVb8;N!FTaehMAwHi|Y-V16!@A zqOsO(W2GhR%D*%Echx$9LLwx;v48&1XIrav;-T9H_Jf+Tbf8!lIj~|+(pJ3{dpTjm z-TkQ26g`Xww09zBlej81*|b$?T9tsroe(GN?#4pWaw76AZV`m*+mIBQM3-2qDNNt) zF#!d8u2evn#v}pGuf7D%O;9piQCQlukefogDxM;Qy+?Q=%jgZl11|1<&EV)6|7*^7 zAiQuxj;K(7EQZQ$ED6>aqrrPzzSh*riTHR2J&BzlVa&r{k}FNu`s~rHfK5YFGpC)Z z^zRsPpxl_WuSj0V-HM_GcFaL^gx;|T^L5l{VUfMp0?UndbZe7x6iqc<>2Xbyje30D zMUyq>J=ws1dHwPk+_V_qmT{p~H`#@L*8nK0=1>3Gw~G6jLiS-a53W_kAAk@Ud}#t1 z$<1qH@Mwcq)uIYY5QfMyl3~JtH#RJP&bi492mz~y%{5z=1>rWf?3?^5OcDBGwH2EO zoggs(*Y_D9HwyFnY+dL5B;&C8drWDM{aZ@yrh@I`d>^hNjKfC`(m?B4XPZ?-SCfU- zF1{w2jlF43PHX6F;uK$1i=_%OGQ?Fh-{(cbvXg=UQvDg!G!*$F8}UU?5SZG|GFNKTZ3-;`(wfy%T(Zc1G#^evUT zsH9ed5oAdSX;#qY(6}?Jqd)2~dgst|jK+?miK$g6u=+>C7TCWo)qKO`?)TXO=8K*b zjJsdywMllIr=Ck?RaML5WEoS0)`h)LG22;F-AmXIt@c2%zr`qEK?u6Ib25~X*brj)LrFNai#!Us zd?5QI@j|e(s0xPWff+Y<&HFskRVWvvPTFwO5NN%Q%6L&weFN@okG_N!Z{ZHc@G-cT zVnv9SUQ`U@sR%Z^F3a`92Xy_t+rQNSx%*ju_24x^lmBQlb7A&uBx4y~vAPo8faZds z1{ik6M3}-b1X86Cjth<2hOK$O2m+1{&5g(2AQTEthWC=r@x zSL*gd95cF$w8uczgFrC;6eUBD!yS6EOM>rDNR8KFF62c9zCelVI01U&LrbfQHK$ zrWF3g3%zBGC@Sg`Dxf`u99@Xqo}Zc%xGIPJ$cb>y(w6kWYnTP(CF0KQo0~j3>P5>@ zMf8*j*HWnLH?(76MBUO6!9YFXn?pHkt76!CHYt6+<+Z2L=d`&7wP^(I7n>CZLx`}e z&5END`n6o!zDg@}5++s3%*BN%tR&9U;92B>~$7%rvG-uP+o+@cy8M}Ln+9lr^RXa*!F|7BwoDL@eEWim#Zm}2v2=nr6{}P0Xt(Ul6Fcu19rKx7S z_U18pM2kv*P|%i4!Gqr=K@HIU4UHH0mmWmK zvCcSv)^R$lq}&+uNYh8<=7z$E-h0^zD7|2f%GhWq?I_7qt)EO;dGJuAwG?~MK@$ev z&M8@9ujcDin5_v_L%UMN&Q{s-N4-5zy;GKuD|iDJ8lp}eg&Fodm46o*DN zJcB&E`}HR$W)JnMpMnK!F!lD`&p9DjgRc1wQA>f9C#bY~b{X+)+Gna95hZCs8}#Wu z29B>cz`mUk$flsCfSN>x}9m|BCBDeED9Xv>adL( z=UHZ|2t$q*h!Qd0Z}@OWjQY=8I|wgPz@gJ_st;9zBk-&->1wa3t%|$p8m>6X?`;|e z0o~#V);d>toh`90n;J+iDAzUBGoRZ{Xiio@5kdkTSvv7Ydm7 zz3V1Y0>tUbv#c~n!kUr_oa_I+FA;6J!{AkXv==P6He}Ox>cVN6vESfo!me$YN&ovI zF`hWf<>0UrqR~I#rr6`saKF;tSI4HH`mT6+G+r2-G3#x0Pr0mqHgM7~oTmBMsyZ5Z zf_^!;IWk^wv#pim@tKd%sQx`{znuMAuN07gf6^kswvMSEQu&<|c4 z`@ypf$eesd@XX!)bs1k}st;XEi?b!EY<9xy-D`#tb zg_$o|!Qu_2IeX;pElOQ(*#w50gE&E>i=?}%X^7QLP8?mca~@jE&UCTim58v6bbp8) zDtha?vL}9Z!8nrs%W4a#WQVy5%@YD4U;OR7-aESYX3Fhyc&*R>I%4=9ZmbO9C1B%S zZjdM?jgx8r!^_~+xp*IGI#W--d4Brh(KkIfX4Ao7;M!^^06%RH1Xwpg-1^!Uyi^&d z$OeT4Iwu=Z~(ajjp64TB@ z4MCxS;L=QkS)vt#qic&**zY7Ahy>Z}%2IcW$Y?7E;rWGv=MfQt28l2Ln6SM*)Qmjo9qtQeBa&kQG3PW= zEoLQCM|(tg4HRO}4^pbA+v`Q1nQ@97#QRNf6}s(Iq+qWFv^MFB&1&V86?qvISaZEs zD~7Q?PT@jEmX2aNZ%2wJiJW-fGX>i!N+_B0u+=YnyS-&t`pP|`!0OxYk*EQ{-q*A( zgnWTvhssti9ng{U;6 zKK+<8dX}Z6EJYw8U_QI!1ABP?Q=^rnOY`vD$gC81zP^qZ6a%=dg1)H6(Ql=iXZ*&j z-u|}UdI*i*{d|d#BaHov1)P#T>peB=Eeb|5lUFspF|`h>w1dLR5UatTzkc=nnX7Gx zM0{JS55K=6l%A!^MwbFK9)4~qPMz}M8i=(A^%iGYM>yjZ=_v{=989hU%lZO47`N=U z7TrQcZijd4FO%#&@zy(qQKc|R=bL#F7uU|Nre~VDVAaaTC~>!K!&zS`$ZXiHb{z=^ z9FKSL7U4z_3mg?H)H=|~0_-kll0ZQxt0q-!qu4^^9jEB)w$x%7lQLUm34VwlwFL<8a(BoIzbp(G!W%yl$2Z}C@F9{wz_Z)Z2d@}AlfE!$$2xt9W(UoWpK$2~n`+UP zF6s7Q3y7hI5l^t<-^v4uTth~}JMy!_-ccfxtujvXl*()=6v-UdN6>ZQ90A*q%OEgk zPY(mnz>j(cFrLkw6S9FZP+M?D4FrtqUq)PLbDbD!c1|5Z{!2B~=UAdZ-fIfgR4seq zh;meoMb2W98Q7wF9STku6xh5)^BV6nh~tV229vfz&-awE_e0JtTRxnrea~=25skP+ zIPH{ca_i9|hlYpYyh@ixpl&O-r zDnj1Y_mNGRPJAe7uMEy+=&co~%5iexN)?uCMuVl9RcTK_JG;Br`guolf`z|;;cgb! z?Bt^w(#1!?qilnM)#5r@a3HHGQsXP){P&+lp<`2t`XksLt98DK=AkH3)2lqQhhWRx zDXE!tE{yg7+0T>&*P%5PYz>n%${@lRuCpdW5dcAdQ(IBW^LA($TkGK_U67>{@0k7l zecv?$`{r`P7G!#(YlISqy56@1|9?UY1wUcV{Dwro%MCE#_PWzFOfA!BJ4FwwW-bns zDyeGR=}S{vZfWX+bF4KwEy;&n0KesmLBN5OCH*oi5xoizoUyLE^qY>D{H3l}M^KqL zC3bDBgA;*IF*zWc|&r z*Bmjv?rp`3Ji9Fh^#3kIx#RsQu;sp6Cjj~yHU;W~UL;KWO@fbxj%gS`#j#<$7wnQ# z8?)pi^-ykFL`93t)(uq*QnmJ@kGWg_7=K#D*o(l+qt$3v02aJZ@UogaQBeDW)I_2MNFiGWh?1Pqtyvoy z!xinkX(=<+;eLwq5xB5mcza?q5*&#x`H7$-)!@4B>7SaLKna9&5ur?QT4Kx;88lvc zYK@A@mL{T(?28EZj{|0^lBycyqhZpv#cV}LL17ymJvuyY?a|Rs@r#Hg?r|P3_+||u(>!v@6 z2xeUXLmPO4W41E^}oJl_VNN2@QeaNp+-;2(8%?!J$9 zoyrHzom<)JRI!6%qyBM=#uh@}NupAx6B4S>AB4K~ACEEC2esp?4Hs?VD7+#<+oGyh zO}TJZ_xVE`MI!78!_FSndKWe(j1ByY3OdWEc&6J?Yd_`&f06CMT>-}lp?Wmdmb$Cl zsyg_l>W_09I1rcc5y?}~qVno)Z6Q{Q@`Ubg;^-DlGI7pOi>Oc1NEIT8zTtTx#C|)c zU_=g%B%X9bkw1za1N0;?wp5TV6)jYYQ)d{G-pRNk4kDZ%7NX!PvG3Npq~)d3LPL%4 zAySmSNf%TOj;9neBh;Z<+FV|JRbz}TnQP?(%D;8>Xd{QfASsv>Ek2~<5)I2x<)8>M zFktN_`bqVU12>7T=Gq5kUI-`b074fhO|oAw(Gz9%6G(7~G*XhQ=_J?0|via2*{UKCmCBOQVy7baJ*A29=gFgdAS z2$Q=t0cM3o^(;4%TsndQ`Y6c0f?%v*4C*{Y;(ca#g&^xH(CSN8N)`!J>g%{j$H zSO&V>5ElrQ0P6+^T5~|PaYm7{EgK_&XgMO^O=yH;Ph6ohDjOEBuA_wv7_6H+V8zQk zMsFiJ+=iPtQZmx4vn7$qD}m99Y~{e8-p{b1hIKe?8Aa|l<)f3z8VeD~XMpP6@Z|7# z#}8%9nvqmWYn68NvQWq66lUh%hhn1ym7u`B4IX*S9HLWQjwG*zE!R8UtgmtqoV1JK zc(&{87)EjGnHy6C4&AX9y*1_Wc*2?Nv?=T|d$6u ze6x;HVbf8fpyGay$s{C5nCG#YLRS=H+flRDGGHbqyADajn<_2ObAY}yn%(;zo~aGv zBg2p}NXBx}*k(kE6viz!nz?&-JGLn&X9>mvJ*$*zU9B<3lC-v+``~N>HeHwn6^`G} z3sBVpYUW>m_?V)$e)#x{Pwo|;!c77{eWBj|5kAIpS_3|UQT*G%zq2QKz$c@B*Usl2 z-|RXoGlvmHJ50ln@AOR2M?>d=Kl)8)!`vOlhPCUo?AAbKejF3ojQHTka?et*tM?!ILuVLp>)i5%*%yboBgUM+wyyCICTO3)j`4 zo)u`=nB~qx!Qnk#gcIdF!ri=Rw46h^< z-+(H0nXt3_h(D~3#E~;x6%9n0(_+vJ5Q8{K&eW?ITb;%r^4ipp(7xR~)iY-|NXw$z zsk9fx8cI5Nm50SO%r?j<1v-BVDzZQ; z7hw{rm?ZtYUnEw2d1l^8Ft^<6^lh5mrYgdHyO#U>6^32eJWsSdVwMb#LOtzBp%F6DkaBF$Pd(dv8C}9}vb2$jVrXw;IugYt zIp0^tDV~K`S7VuZLKEF~W=97tzgeR)p7&RwjB?comW4(bZOBioGYpGBlu-{7U0b~Pr; zH`abTs+?-L)8FS{AC6C478~~EiiUqFT-N(2Z6I`pj-Wg4^VX=rqG2zYqvMli>TRVQ zOvtrF^Iv@_J?Ta1w42i77D}Z-WFtY#_1~?_WD^xJQ_X&SgUKhAZ}SKv|5c6f6H!ZO zh4N zelQXR_1fS{#aw|tl$ocG35!Im2u8EVOO)s^>BJ*nC^YK(xAF2SQdy&1j;{3;q^(Cw zAt%AwcI3GH9D6<6;)5;iHBDiC70i9@&4eQ{?K!&dn)f@ z4B)!FkGg^>xa)4OGJFRD|4N}@jf8JgC1+7h84B9K_}tJ*ZnHQCMzFwm33#!NxKoeS zbQ5S^(XeazGgxb{dQNLiS;z)-S?3WI4vLms7?8ASPDUX`+Hrnj^KeW-;^brut1Nfs zp4d)R96I;b5{6ElH3gy9JFq_8SL(Wx@JvYvTqQ}mCr4CA{w7-&glD)@e$igAitv(a8v#5VSWp#uyfn}u3TptF`dBFXn{n6nd>KW`*TMrW-|h>vG7Opch2jA!k*fg@5;08B7dmb2(o3>-xoYam}U`8Kh% zmh(t=k4S8#I^e#>8YKxE?{{iU+SQ8`m)|j3?>awLK0oJ8A(fQ6ic;AqUAjqcGHl4f z$N!hHE~}(<5vQ$}F8KYu;`cv*s{L^g{QfLV7g6$ivOJa9dN26>H~;EdYV~B>r;BI}jNtdI3h}FZx=ZuC0DfBoK@m$TDqnp`ytHXOnM2lY{|xb5 z_)4@-ec%GNt{5l1zfxfBNP6}bD=xx}JjBrMxGd3AvR<=uBHyHiLGYbpA|OV9V{Jwd zr74&f?(}&ukIO>iFd@pa4A|E2AygZtpmKk3I$$`UtYK#U8YMUwA9QLlXLMnRH_-yC z_;UP48s0=#_#qW$KqOT}xIn-gQ=CRw*_no>$?AYUvM`*F^6=_DjQ0MLtI11X1uDmh zwtt!#HH%mTH>c=jEK(jQ11P%_!XrXDjn=GejAc_qlix&YlTxWR+gO)fwu)7MX zj={*~4=^9%r%Iwh2JW~}HK@zxD@Yx!WUAJU{ z{1vSlP!5(bEWJl2%yV3tj$UW=UZuT2ca_)81=W^pardvWBn`13e#bWV%>rZ~-uhuXAV{@! zoA&x8m7Jc3B&d7(_*N%n7|71yomtfbd%(Lc!6I8c#iZhaAdk*a*fiI44DkLc5=I-v zy?ujeY8%*R@MEr9P++9-JIt;7UZ>r?jn@GOq!B_JgWBJQX=yNzI4MsHCbp+)9c{A% zaK~-Xjl~sgq7)Tbja$4ntzkPt_b6L9WT*Y!>@@AtH4nujl=~r+Id}j*c!cP4>xt9w{ce| zJ!4`=vx8=m#-mXy$>Y&+%a6y?_K#0S9uWj?mHVIuZPc+I`2`i{trP2TRptN?BBfxD zsFf76*|7q`b$;g53nm+k1*t)~_hB$PIJkEYQ3T-orP8+W;te+?TpA()|IDpRi!8sP zts&QSql1L3`c4k|BXF$4}RS8qje1Q7`$@R4;s`X>#py-TWuveHV`l? zegay9v3r7MFwB!y|y00hUa62tzjSh}03r294)QRiSP)kPeR^sQz zh9_ojUsDiCP|YT|*v#X+bBWxL4VOUnw{wgNOeHGK9W*OHyv=BDAH;Yx@^ns`Qe#J` zuywRro0^Ixg=YpEYHQ@EiL@cpLh5C&NufagifNAA^a7wZ#A0IwS?Iz9J#t$h<9?al zN3sRd{@;Iowc#S6C_;ydOWKCEs;Ys#_?O{FEfk%YO?;2CZu3}55%-C%0hR8} zhJeyQ8^uICkJe*|I+=A4waRXEI)H*FRg!jb-IpwELTLaNx)>vObTC>od831Y^rG#vt588I+=*Z{*&!c4=3c|?55~l1;aIDv2RM5++ z@?FvVp&lf5m1**HXsZ1z(h);qoT?*K-SnYT-xZz@8;5&5Y8)=^@1^J1b&a;^JO5ze zZ59sP9p64u{;24Gm~G}%ZI~*^RfWk79Bb>x{sH4B;U;InXwazbm&E`UVKa|-=xv)( z)7rcPo4axGEio_-um0+kRq-v+v!(HVnk&XR9ZlWwv}`vuoE`Ryy_~p{u5~s&^urHdktR_k1U!}hW)r>f&$Gr$n$RrMi$ zixG_TxSCmEcnU1_Lb>sd8V{v~);`6bgR?AwPA(R%apy6X@?P7@)mt8lOEWkn@)j|c?ED{n&6@~(TYh0`ZS6brks%v&g zWE$NncgJBP`9}iJItRY%E7s7~_T=E8xoxvQo`tohPvIgY4u(8b0ryMHm))PyFpv0-I@r$tN{Txc$P5=ggr zDPJNS9}bP&`s+O7g5MNsfGCLbhzfqDX0Pr`GGX<%5n}XhsOqhsY89>mcOkUBADm}P zOnX)V5k+Nlx8J@Kiw=shq~{>SB4n-`CCYIIApK+5Qb%((`BOzYICZBPdYI8SRadH{ z0#$s0D}F!t24gC2;{wY$huQ=?Pr~%A3uLGONC`ohg)>2=+&_EjqE!%&0qU$bh&7Dg zP<@pB;4vr}VUejO=%Z!yhU5R?2Z}|ZjJWBCs;M7@T7e{GNhpZ=IxJX9rjJ6hkFKdQ zaJ(i|LnbUrHDMIVV+hMsG~J$!a#Mg$93#iUZ5*+Qdz^b=Gb76C}h$U?W) z*7b*~ZF-lscn1PuhMkbf`tSeor_J3jRN0exXF-RBj25c?bg(sX-^4Hzvdm#@>>^5S zYiP-CnTTm+dm&zCh1~txZYwkFRKi;jF+^6&UOqNA`e|8$EWGje2hEGz&Qp3bZtpY* ztI3|C+Y=Ea$f6RB)sY`GBg?g0vZXnh3Y+UfY=JdK7Z%d_l8jv3Sq%(^aCZ&d%F^&` zW2i16oD0pf7){NBOh8b2hvwuSo(AjKnqC%K33ggbt&V8 zb5qe3-@=9`78;LAsKE5*8P~A0N(HN7N-1q=YAV*y;d>?z4clf3iX?X$LZs?~Erd!_ ziBY7U9p8iEfJ>5uekJ&D)l{z=K$w0=DP>A%C(3)HwxUT2Sidcb?Jo4WsOB)ppD8vZ}SJMNzm z!Fe!Aw5gl%Ki7yG^2JW1O}o&78$O%4OosVDnf>k>P3Y^-nwU)x+BbIV_}J~Z)=}M* zt81a?vr++`p#JaALj_B5;9`(F*ds>B{EnXr!>oSL`0;Gi(CCqH)v7G^rse}(ov^JV zTvC0hWWhxY95n=H@F=>BQyF3Zf|1lHB@YFL5&?~f>A{O}9gEBDV6)r|1L;`F++Kw2&`$Q=UbCmn+Urk*NK+)+zgX9sl*={ z@t7vJzcrhQdetA}DUW}`5@ekD3MY=uN=hC@B!qm!TMP5;-5fB?*j0!D49pp&Mfk=P z@6h?`2Ah%Uw5P@!%K*Bm#vuT@P{`4aH@z0YW6WGF;;WR4L}P2IawykVR@a2LmRMC6 zIUp83lby$EJ{vdS_;BW)MJIe+JZf&i z8qQRnl*u4e`;Wv@Qe*hLKo?g6K|JOyr?QIqXTt47)rLQJE?X_WqKS`_VAZmKaGp>! zOU$#+aE1h*iUuLrCJOAQGL!{~T-oYACSP9V1Z>MDiE-0tZHA1Z-ja8&dvBSpiA7Pn z2n~y}ZG5Ey2lew7COURGcu@oHJ5$9g6uzgmDz(?KQ&5aLi*{h@&WJ*xvq; z+dk%qupd*0rl|EVR55SdH!EMyCJi>BSFk`|oUy(N`(Kw2C#l%K=nh?n7A3+!E;L>o z&8Q1*o3;c%9$x9Q&XJa+#Zl~)J|7ta)p9<$uBXb?C8E`S;50#5!n%oNvE(u7S!YXVZOiG2De_T zv=(cr1@&dimE>eNl(SP%t$RRD)#94nZD`w&mi3H`_wg!YoT#o4sRwI~yo5!J)GtN8`#skK7eIvccwkxAA+9+D7>8Jmiz9 zGi2qe(?hluE>U2{N{9h62h`cNaA`p^Se-D<=r+qiKF-oTkxJ!kN+j0VdgpYpQ2+#i zHKT7O4}T&-MrKjzVufnBMKo}Xqp`cJN}1BDW?fo+R;?uutN*&SCS~;-lLE#uV{+E* z$lBiCf8FZlAK$`l>3YL-M=m$swvIe}xsGNW_Ht`j3^y>AK_PT3Ld0 z(AIqezB{QhU;PTJtq97zv_gNS9DwDr31iLZI7imd(qIv>wYQA|QL@j@jrKn$+0_-} zc$FD1VyG$f(t)PZLgBxn_J^1t%u`gXDkgbbLR;xNc4XX#T2rO~sZv2%#*}muN6E4X zKEV*aJ@&VLT9tJlTHSEZ*1c8o_L?$tlt&pGq9DILpX>9}Hj-^-zDqLd&3K8hqk-c9 z!sU|m&^9`C+!4)L-3wa_if_VZC2@~0(SzQvj;xY#%0IHt7$q)`2gV3uD8H!>1`s9y zmnlE{ZM3y0>KNUWS8>#VkKIHyFu-ugY>dW}=1zf|!4^h&=WF02+hC4o0T|myEmZI~ z3zBI5{xckl%N*gj$_*nRel&geMY>6SSX9IgTZvl-_5Q(%88|LPaN+ zXvI&+5v%n9F2bwN=q zI0Fl+Zo<%MdL)7|{6pr#u&;B63#Y;9`BU7L`@ttJTqy`M+aw}qMgpAppDr&ifB5)| zuObzTi=Utk@KaZ0;lrZ$PejRHytigk?GXn@AOMu3*trbxEjEmxl2lZ0C!8%@AShnKKc}pBaRcDY&9U6Hsla~g>!?^ zIigArC05qB6f}K%9m7u;5KqV&mnF&wczsZ04ps{*ij4~3p}m4tIgs#P0;-TZ3Ud(=XR&YBGwzCZ?4W)ixP9QKPF6n0jaWN*S1B35TKb{&5N zQe+vzIk-Z{Ix1V482x}ffQrq~KG3rnt#X zTy7mflpi7{*iu|QL;AA1;_J#@B!#!K8Ec_Iylt%EC{<;$eYfBsvTWvyu7hkYc4Rtg zM-$F?k}b&TNCaEPtBmI6L?{jl<2#jNiWwq$nV=g2)Z8d;j43EAsj1Fkt8NH$6ZtfO z+G^^c<108U$d&`czf}s9dnzUUHmeYm9nlJZr9spy=;8s$7*|mVfBi`59dL=Vk}Mps z41KHz6w0GtagV+hr-&V1D6HyI$c8+2eZmaGp=8%6Su6^5NoY*n!g6;SCh5S=ENhy$ zL5;MRGO9+#@V}+rPB`OXZU}_lHX7d*sl+yZ2?~Vp4;>jEJ)#VLYtqUTi-4wXq6o>0 zx~COp^zN@Pr3sa7p@IceYFUxvI!1f!WsAyQJz`jh@;~c@S+KkQCk+1{e!z6FtsdzD zjb>$_P7PH7!$<|JVWI3k1>wSqFy8;;PE^@>qN=lM0u|)pa*M3l>FjZ2g8$qzBY+8# z>KWl+6zy`Ab`pcIFJudc^`z1dJB%WGBh@bqvyJgSNfMV(a?QjprOo`%U9#Y!&H+l# zCYW4Je z9jf;zUBohj?*5bLDqN@QB5ot1mV5-bl+3 zG7d-m-#wN!cpb-XvAMjAsdiVz$EyHlBI9s%@6e!^-ra)m9OpFnZ(f1wM^% zw2qLW-%uS1^z6k36Q=uYU(vOI5hIxl7pLxrr&NVV{j7Ubc|*gx6M^yJ1`U;-&9MmA zq_$>*TDEpbc@P)ei@q0W_HY#TmP1cES|p1&U2t^xCE@v~3UcUJEB%Mp(An0!iPl@^ z@hW2A1 zH`#J=FQ!+CN{d&ZDA`&8MQOp29Ojt8xd(CwM>B+2SD?7&Q2mID-bZl7Qc8VDk`vaT zz`Iv)gy1Set5=@EuHt>N&-^xK#(*;50%$itsX=&&E~e28r@Nr;few>sP~1k8Qy^nr zob;+vo;=ohUA%FW!{F{HGT2Wz2NY}{@)R(OV*4^m<2gs$g~i>kCd!`uom7tnJ%d&)Xm znwhg{2HZvydq3I)PkTsQeyf92aM^g%?>Cc~Hqs|l#k`^f{5n6jX z&l#8t)=b+vm@#gLz>tw-d;Tem8@Mb7sbdlM1<_DsNevJrdIz(h5ECae|MTg{|9p1b z*woR)|NNvY5K5env5n<)>K47qhDj~siKvQ-R>L?k-@bzGcF4Fl zZLb_143MhFlOeq6z{s_~ONi#+Ttx!}=b=oBG(X?{42@Y=e6KOiII_5XjN<`gJRGnQ zCN`$zMf9$uan+Ykj|;;&sAzC+9a_?5eI!rM1*QW1F@WNU03o?gI|{ilg<&bCUZej{ z8w&p>)bAWw`AIZuiUR&FU@2?_Yw+>g7AXM2W%3;QpNl`33!*P->UJzot74hxFT$RAPfEQ zv9>&-Esqp15G0i;ghO<&;wat2;>$68iM5E85~KEpwU>%S`+rc6I!nK!JMQfY^- zi95;PmE4Hx6uBLa{$U*s*i5$6^~;D=r9YugN%D@Xy_-s!R)Ii`QFlEgDEUYv&|{bN z&dy99Noeb=I{nz(`Y2l74>1$f!AP|>Si_A#R+A~ZXEK03m8rUZ2v(g`OQ+hsdR0O9 z`%b>A1%f`$ZYdTPq-Rq8bXUO;3M_ZS;jwYjyH%{s)j2^-5U^MA`WoDL($`qglNNgldTtiK42zv72 zVXwIz%_dGcEuACddcwXiDKo^whosF^8j90+fhZ+KL}h!axn8+6b{IhVRhDn7lW0r% zy$Y|2hk=;EG6pH94C!IDIUGo(DSKUfvchtj`}-2G5qL|%kGh*Wv{?fvRu>Oz0(DUZ z3UgFOvoFqg(6Q5mdWdT2!#Xv7ZY_->HB$)2FdO_cEbe)6QFY_hgi#L+TBN=lNRhe0 zJ`d;fJSgLm0?J=TWR1K)b4L_hY(Yj{kZBZl6LbSR2;LSrKD&Ia0jP#^L{RI^5`Vs+ zV)P0;=n}iQ2l5y`{i1>_RD@fC<$(V@tRWE%ZwCeyJ*?srbrLQ?v}}3VIWB=pr|TCD!ki{F|QAKI0z-xBCe)QhAV>v3kz2pTlt4 zXcrqgs)N=yym-{-Ee{61|HYF&&5aKZ`ZYJUrN_TT`NrW2Qo8&$@&X|a6*Lb|x*5gs zq!&N20bI|4;lar z6fx#I>;gNH6T)r0T7kB(?2<7KljtT&XjYWgr*VofL_Ef6S?AG$FeMQcS79QOEnf6N zF4HKiRSKfzOk?PR}HZPzH%+LWsT|mVx^{D~vBP#9=ZOD{} z4i+%AswJok3nPEjwFoPP^k$`pvPy87t>c9U8kC+Fjwu75QY~g-ZBWmAof9a)I$KXF zJCVW*DQ>S=M+@@(cml4->&U+^q$|Iv{gZ>XUu}7-#y7^3wx7q-xG-hi=NWLA_6BBCH$gtAa@@{U5Ezi?0M9T#>FFbDkF^b&gja@< zCnq)4X{({(H}`ei`t!sLMkETNYfz*FR_WoNBIJNh=504IlUeJ}77_swP_+faGcO!` zi<4qVsMR@X?8RPar*OqYWQCz&UxvV#L@)5O_8YQk<`N61FMD)xIBq>A2VHw?JZU{9 zxj9OX6%-SAbWR)bXj#_`V*x}(E^mW_$B1{)i;)6$RX#yT% z;7Qwgc>>3S&tu3ZM-K}>?(A%0g_`pmZp#v*gs{>B2sdbX7X8Gj3Y2Aw^jf{%y*AUC z1qfWNOR_JnQ2c>*oeF?wAe5x4>>j>=2;<=b1c>e~?DC6Uz09J5+3GuID0WZBDg6}5 zx@L`s=UBqJ!oPxavznu<(7`Ho%2s;!w-si)Ee#fFk3JncK84)V`iuMTjOR-6N#AmK zWv$~$lPY&f9c(a!qK{6;z&~y3T>}9&x%)|^aDTdqpjXK-xEm>c6Y-IpWwJGWb9w1Z zv2Zr&beI0Npo7u0(!mbin1-gUL-bj8rLc=$M(adm3O^;=sy40i?19d+&Tw}7b|k`S zpHZo?ux`VD6uqg2)bwwDR3Asu)RAvQ%lGKqPU0DbM`<8PX4)`WYp3)azQmnsu1@p0 zK^e_+FE$(FXD2-gteSEBCj05Axyn)+H; z=@mpZ+@x5znvhhL*Ov@AI-JJRSM>-u1X(Y~sp`Kr;8Wwct}Q+{$Scp4ca>^6YUpk@ za=uh{2>xhh4-<$aa1lFIQlgZNI0LMJW7kII@ytv|HJ95PXfRHgd8ixmAgqbrIL}rPbdnU-FVl@(#xxefUelPZ~N{MP+z@p1q571+J-YP36jo;yz^S zbTm(&0^sF`D57l?q%3U_Qg0Lu2M(=n$+G4;ekV<5?eL&u%KU{I4x84*vF*+p%Rq~o zCXesCCDYF8_G06Ia!-BoDPF8qRbuCVZ(8$IPwoX zuQ;J;jc3VuYc}gzASxGCU7*UDCZPWNm~*SNK*L2}zkDV#Yw?d>*YM#{uUmLBZCydP0<(@*m@)(Lwvq;}(MK;mtXtiPBmqHa_H1lS=|+DjZO#i|7gz zRhte%C5f=mBLa_93m__B|LX{}(OhX^O}D^t7dP{+JP5m1laxwh%OM&ck6RBBOpSo@ zd7EO<>g~>g;&N56{{%`nU_n;7n(#Gb95Zpp?ZWS4F|6x79MuVLaqSi=|vwY z0!bFmAjCXwihy=KkmCa}qY67riM19r8}%PmjYC8@szMp6NJi({O%IPdPU%tQlzvSg zOAFi_vsOaqkXEahdpfoUlw16OhZ9NqDawTt7(t(goX?gzBlV#iN={e*`N-;7Pw7Ou zH3RYtp+Iol8l&SXBI}~jOHi4<{Cg!-x)VQvFUg~66=5X>VCy3mFcZ+JO%Iy-a1s*xXIC-Ch zB}VBD3$?ksXYQyu#oo=U=TGCGB1K>Cyn1oIazj{i!M|l#T+cJ$2Fec8C2)GR$XTam z=>KfeRiO^9p_NCQ?9!0Enx1vj4f||#yptp*Y8PRIEe6?)4?g2)oAF5G38`q?`U_QQ z7sFN8<$b&^)NYzgPP*POLAkB#et5Fe0wS!@F6%z+5^kH!0n<@ehhB}<1~RnY*0m2O z$6fQ%utOWmRGJRNkMr-lGgK(4=ikVY_Bwx1%%dy0{t!Vv*kAmb@0h^5Hs4;O6XiZ`yp|fjecld$Z}l z3oQssV()0IJ?NUs=H1kFReBfUXvY=r5*`{>yivt;nas&?7l*OoP0A4@d_y&7P`d}H z_rmWq!ISAulF!7#MUx-DS%g9VeWU#Hfk)`Sa1VFmV;^K-8@$Hh46;%a`XYzD;ZRApK^;jTcLE?)QBswJI1u?G5$G2{COs|U;A>S6q_ z2u|$?mhkxd;H!sm=e+tmuttr03f(i!#5THDC<9w~oi*P;9b+Hh*qe;HSZNc-pEPN3 zb@yDO*Qjf*^cwcS73>5767QZIi8TnXgtc6OMeew^w%t!&r(s!!3)uWJ2?)1;xO}ro zom8NKo$PoISlmM*OxW)gL7nteuYBvuyH{{dmW;d8&+y9IaY9Ax1qR3AD*;a{hf`G% z8g#^`#qdQ7JPogIrK8kXxR=8#ZA_|qdEMOiip*g=nj`6A<+69m7+rD77L|>vJai(+ z0aVTk31z543&ztb@QsD3@Lj+{Bv*hHXv~`5{jDIE0^5r^?rqN`98JWM8w@Ir4Ox1! zDonDc^NvWc5P>orsIoMtQRiDY8KCN&>W1=>dgLKhA-6baWepVjUiA~c;)EXuzN~o& z>TNIDSp{< zrnC5^7RIA_)7iI+8tO;m&`!plp{+#_oWg8u8&}io{y`~-)VjvhJTmo3F<8rLw5UuE zZG3`$$;2pV^fEDA0cb`;VoWnZ@vE%Pu!hiMtFZAMTgl2^z%5w*@bMR)xR2F^d|&^J zN!^sP{i#d=7vuO1TGvx@ZW6XXaN{G{c=5qn-+8HQJ%@%n@zi$@p89US(}t^V2szdj zjG#@uW(QeA|2^|T+tt(Y!5bZY&_;J%4Xdz|y|EuLmnN0$S4w&F1=Yle`U1Irz;D(xNgeh#ZhLUyoJaV3!x9akn3Lsi}>2g_ADJQ}dTb zT?F-;8LiZW7T4iVea%jXJNs2eod&CB`ggX)oXjd0Pc1-y7;>h_v8+PQTe#ZYtW%?t z?m#b0Al%i1(cplq*!af>2Ng!qV&i{KnHO15@e@5)aLE)dQgIpe)Z|8ew3N|FXAFIH zKOD%!4e63NUANj^yXV&?ykB5!6<2R#)u7z2qZ)h5MQN#4z@x5+_(|RV;>)d=PFi)E z(LtBi)9Fq0=U_B>x!XTG>2w}8FGK@_#T-Yqw>mf0^su3k3VP7-5Xj?NTB1KAaX0R9 zGTN29ionQoEUzp4z5M4+%iffu(oIfh+?3ZO+Ib;+gE=fKdlDz5jLpQq`#9_yhhd{x zISspla2hiH-p;p0V-`m*%673iA5;cZVft!BHHJS}Oqj^TZ)+#5gQ5NII!cmw{aLV$ zO4rz3Ej3~7?G<3O#t^_BWX^nK`mm7&B{gJvKeM(|fDlkE;l0rlF^f`tikp~1WXVM8!3v|d!wvV$#nnVqTWIM3zm6!=`#NJ-FMa7;5XTOmP=rE zLHoT0Z@842q8%Un-m=&y4qfeC_iTFNG~JIc>+S?!Uh490!+Em}JS7skcyr^txA5lO zX8q8iYbQ3^NbGOTMrTJZ@gJOxHZOx^qZo|vk7uNox6#mdW<|9Te#ycV0k*DdCocQV z*7C&M=UloCv6WNG6GDN3GorB2G%{YQ*$00h8Gw6Dz%6D*}=TVZ~VtHxL z`NH>f)9&!U4!4vqy2#eCQ{fKh137_~e+c~T63wy!!kkl4Epif4xyMjtUlB3LCst%n zY7nUsPk+wLwI#|-yQS;VL4!rI60JD%XQ;Zi$ENt~+Izx+Q_19?T7&;NGeU8~`~j9t zBeP&_r)8PP^GzwOc&GfxXR$LmCey=XuO#92Gik8gR7O3q$f=LtEuwra6FA<%4p@}c z1nRJ5$ZRkQjwKJ{h7xEpO! zv2GaL2vItkiX%`~VIKorBQZNA!W?zxa(IKeM@{DY_Rl8MemO=n8}DaUT9R5if&w`n@o zGmKecXo1t9djI6w8Zd_} z)WMeYD}!1u@M4WBNKRY}5XRjF=+tl&t@o0NZ>PH-$s^19ZwM~JEq8FE${i5WL%#+` z5=*H%zv5A^w#K3@w;3O%UHC3bvlaW>4#yrTz-A&mi_^D(E$AZ!6oaHsf_a*R3t!0s zr?aUA)YJhqo~CsOjR&j0@miw5@m|17ebwkqm zxXB^gnXP`*6*1A6=Dw4}b-WvV!(rEFUiW2ZcCbkR?|Oy48WvyOs3VV27V&`zyo&*XsL9K0v1vwY@h~@ia4-|`;w!6g8x)KyT zjXEf7xHKy1Mn}H&c9A%ng7hrL%8?hC&bensjgpLO^Xs$yY={a%yw#xH27n+R)@$te z>objAsBm8~wCT83%EbR#6x{h%!lZ2{$1+uMM2cSsSqTZ8d-Lpla`^%*V*GIJR;L7RLpnd(5h}ZqQtW%Vj0R zgN7Rt%Ut>@)ixvSAJsED`uWIDS`R$C;Za|T4FxOU4q-A2YgCac^!E+$qR!t<` zvu!J&Jbo8qvDSydi}6K3`hq~=+Y>;<4! zF#;~>w&b)nZ%Y9X@&ei{vUwhftA;YC3bqiE z$&7&H?|uP&bOQt|hycnx4p5((hi@{WR&^+-wH$rd4luSe#u`29tqR*VT(6@rCl8K+ zz;$(WR<%(tXH@BM9iq!0rvL_}@ohbKN+rYX=-_C;Ejw)n{?o_tc;?6a)4!iI`}GXY z|7bGmc%jpLFrYglc3pNu`)2Y0l;A+{VUR_uiE2@f(+w@UgCWRfCCh^-S zz()44eh}lzf@X+#wfW+DyB{Fv>?*#xF77@x#_&xg*cqa zL)p`&w5M%K|0t6Zj2A?zv;-#mK6a(i$-cGbw7B@WwH0v3-s$P#>|oV8@6nGm2z}z zNoSjeW4l6;zlcixyLoOx7)1c1Fx1%rh1CI_CY*y&V`-^M&d4!BE|GN!@dV>BCj|8* z+z%ex!rOcGSJ{G&wY+~xVT3S1u5JjAoDK;d9e;%$Q_iChzxqe$ET{ndIjPiFjxmbw z2GJs%F;Gi%tEE4(c6oh%)xYkUGu1>G0%Sc_^B@w4h%H!r*7@ zfMe^g(FNS-Tw%F3-c4p}!W98x+R8m`&B*R*ZvdevkrKj<_e?4cW8!^!=%2e$eeRa( zc=_jxiIKD8F^P_(Nz^Dm49dlUA^5HhMq$%--8hVfYaf$Vx01#1#VNgp4Ly%gfv9B2 zTu>okl^^4ibOqtZ-q|yWmwi%TPh9lW^Q@=@`KXiGPRGbkN28i{DB>pY+H<=#eh|0k zO8esjiSV|rrFXe7Ps}~5*N_Hwio981D+kKSuqg48_lhu9bW2^VFD^v@yXofHa*GmJ zq{6tgNaa!<(>>MsG0JDPahX!?BB*=MXpxG^{!DG4epwrHYG4W*8Yt>5G|k7MbBlY> zwwedu__7}Amwq&^+IX5ExVp1W{Qwc1BV?I`Mc;Z3;&c;I%)O!s6lcI!dg#yZe$57a zGE$#3B2dY1cAAsfVbh$PCdu$A>Hkq7P|XI;2;rXXJ|jYfKj=}2qY@5dIIw}Kz+>)* zr%)B2DHUN?Ab?KHb+7-a0<%qM8XixRTO@l(TvZLG-39@}FF_5%n(MF+Z`RxzDrVo) za?}vK{|=N`?ML;94CC?0wvDgKbO8Lj9%3U}v>$(mhD9s{w4h?lWJ27OrA~7RzRU9E zIbNu2kX+;uI`(1f{`vVcDjZIR4{QLs$nguyVNAB0Raou?x7YFF8Z;i* zOE6YTMD%BnZ9oeQUS3?FUG=*^zuZ&v!2v=%VmbnQl=_6`CgnidQw46>1;2xfxDn1riv1x%xXqEGOD(7zEY+)MM`r$NTVvUs+{ndB2wZmg8CCqW93 zK2MIuo?|Q8TC-HkG>`4EdX(L!C|d`-IfEy#b6iV#m|t-@X1&Z9eaSo7XF-owrkfK9 z8NtudJWhq8Z^AgC^H@WO;1_YDATC6Vb+2Q1u{NH~`U)mV@ujiE3pzxN9Al`a4$ z*2ki;{ceS6Tb~6N6tEtsKP}nL?__w+?Mpu0u;PFpdqJMuR59VbYsQGj_ZtPOq81F=p5HyzXY6Wp5FLTpjVT<*K?k zB&)8DR}>zAWKl$wTOcT6ROGS(Ilomq^NM>j4Deed6WXbpYMV$qsgo9`z=%psnzp0% zA&$S?nKZ-kaSe(sh!|LEw$M_#okgsRsw|QB+`P?s%x>X6IGo;ItkC&{iVC|}HKsDb zu;wqzHAv7pL{4~~;D_M+>vNQ^qqGqICnFO$E+zFEilO)wOz4wW=eQl&=3oVcK~oGw z6xrgfiHh&i*Zc#s0bxkfHSjy_>&~OUY~oyoR$0F`I@w{*+{B!7pU{BN7Z6ds(^@{y zkb!jij{O6%a2ZGo-tzqhLJ|6yQuu*~(Ui5)HH>39j5WNA@jd=wJfnPmG_yx{|10zj zpj)kM9zbW2rV=w_vUt(Y3#FwEBA zQ}~jy;z$!T8x|W9E%c|gD6Yra*1q%Pboy-@CdbxIP<#8qx!D~lCH^famdxROFKXL- z`yg|6jrlfvP_XJdj7gd~aT7l9@lYP=u*i#xug5+fxf5-Nqi)&^U3)eOz@@Xw}&%FhRfMvuqRK~Z5gU;qf8DeaNJj-|^W9PB5 zXAm`gh}dDmY|SiMhn?>Q`g&K6YN)Z`$kg7B%>BdAViiAXZ!m|hQZa}{3kEc5<(1US z`!Gvt;60h7wS+M~3TZLtd3=K+^xJ4#v@ou-B)q|()w{n@j4zsn*7zmbm&{k;`*Ez1 zg+6?pk|tG>>je#DWMTt)A6D3@sqGF2&dBrdF3PVD`w*h^EoA_((IrZcc@z>1QHC+Q z(w+JUMeyJp^Lafnskk);W`&XvT~UjK@g#TzUHqdCiwm|PwRU# z$+hxb~ZqaO6W!X5tpASWg8Q0<6IZOJ+`+5 zB^szWi2$vVMXA%zG38@&AWWV7Hd$8g{>GR+Iz`;PJBVOgZG|$|D0NJ)OPHWJcMD=J zus-Q?dS+K)8}iT1h7NOM9gci;?#<6fO{LWB8;3ro-!QO-#;PkZ8%^pLn{r$Fj*#bG zBcG#te!6e(Bj4?9r|PK7)Zh+Q*iJbgjR-rXYf3t^PL7OxH6;xqav}q#@OI%{LM`HFXgeuH-+qvchJ&KFIguo^bYqTKB`+Jjv6-k9Y z%DkR*(9(0R#ge?@a7AEj)dNjZhq|o>64P0C+Iju3DXrT7`tjkk%1CkYl^vbpM62N{ z%Scw5@+}K-U0juQh>qfjof5?Cw04Y`w>=vkHd%wt8gQ{;lO=0;hl{tG(ere9rvi>< zPJ2kU#8jjcYO*MW0rN^1eLA4I8PjncsxRbRs=freW-78fpT%xW zhI1)o(f2%p*0`W_Exq71`TPl{0Vr2yW!-i@V2A$BK|d)rWZ}5nB#D#(o%gtAHQTOw z2JE_Pec%WVWS;l{asz5_Ln*PMa2Ka0DtBSjNY+k!@?t+x98>~^O*ZlA^#udK5-L)<=;GUEP}{FA_M^5Fn7e(n_qt4+4JU!%w}C1y8#KeGm51$U!4&@?)%dw z#9D@mQq!#7?fGsmD7;Xvcs(8oo-T`?cwVbUVYY*hm~_pa?@wgJJEt++zmBX! zprXsFH?U&FRZg`KIns8gBC!8^>6Gu?4UW@1UD%_>{@nqQSBRPXsYvj4CyaQ>t z-**|*R8+4_A`Dk9IPO0rNm@)EtjlG1lcDb=#!77_=d08GG8y}zM$OOD*)Tz9I&+|< z7#AQ?5$p@24a_6LWLR>vw0n(edsMNR#~cd67w0-d7P=xt zT_?Jnz<)X6&1tyrJ$T@tM7SQu(TS`2RDT~I_}rwGF}Qb%k_NeN3vY9-g+$kI)pwo@ z>-y6sUc5bbu@%n+P-Bqa{k)EAa0m_U9#>cQ5!Q^W6{E>aN_^gTWkKQ5O)E4+1Z|4S zeHTyB_SF7XzbAK$Z*f zdD3Mf@>elC>{k~Mm_?75W-bj?NKaW&y!u;(j_S`Rlg8gBm1T1)W!MVk80R1k82??* zL~PjUhqm~7mR`nJo7_z?rbm5S8y`B=%&SNlP7W|3VLa9dIx7ox(UcnO?{YG+7>=TD zl<2i8Hc-cBqK=g4ySb!a(}+);O1iZXV^+V@v6A(jUe&X{Bj$)Y#xHSYHd3f$DKZID zQYleJ)YvLzf*k#@FFp4DamrW7C8*(W@FIwU7IG1~F*zy}*esCqC`Dg!Z5_m8vl93W zB}R8G^wYk5TgWdBjVStsN0kk4pc3Vd*RTkEg?gEgv#PqP=jf;Ay1(eD4sPS}+V={U z8~l!VN&~RXhiSaPXwnnv{$q&(P(SfB?S&Y%BYcXt55eu+whzh@` zjH7W7eVge=^<=;n>Lks1w^#q7VTURM3CHC))*GW2$H z5AHktMme);0b&>;lyI07h}O6T6@D*>!a|_rQ#ebQZf~y{Jd>>O-$irjv&4jI#GEAD z*&-lDjp;RC0P~jF=m6FM^ze!3t7wMWfZ5VF!ye#SJm=C5nepxo|I|#vf>O- zHMxmBa8YFsDw2OBqBPPgVo8j_8Z60BqvI=9nOm#%amv1PeoiJ#1Wxi8aVn}|a|M;d z23Jdk+(SQheZ_5JHu{UqfNcfaNMePb-u*4rbPJ5Do+j7BlP>?i8DdpuJ?XOJH-BkM zgRz*;(G81QC0%u6&=NJ)(rp}B7jtQ*ugj9&{H29sO2gK%y+p{tpIQcIdZii~F8I&E zs9F=sDf=@zaq|f4Z;TIoSt->C>;e~Pnue*3dn0kDHh5iyaPX3Lfr~U#BpBv8*)o2& ze_b$Ym@w-V`1($Hm-nra1dB=hJj~xZ(;c8e*Qo^# zuPo|^0son)H~%5jvYFy0%IC&H(OI*+(PgtMf1KL-($A|5L<7$gsJWOvar!B;M=>XIko&W90aalxLT`azL9pn9M>d~YIw1s+BGVDj z!C0gVi+2&WE|vb-tOL|os8l!BF}Nh?xKw4lqOpZq_}z7sB=Pz)lK~5MuGf=SiFP^k-0_MLM;8XAH2|EC6NWtOJP<}?=die9Q5%2`~UoZ zgAktYW2HuDVGg`{Pb)|3JT97(2CDx4Zgz7#X^8o=l^iD4xqqQ*3<&LpQU7}qG(B`! zD(;AAN&80H|A3#uvJ~MK<_G70FMx*=d{|??N%+&XwCYao<-obiUkU&yLf ztcz&__^J-5Gp-Uy(NCU;OVd^IS}I$7uq4Nt;t-ONgkrl{PxDO;mDp2JBgBMJ*3P%r z%dA>t+}`(H@h+v!T*wgifttDu+U@J7NkoZ>c(1)wqrie4tR?nM%#?E8IIm5?2JWaR zwmjnXWlr3?%0cZ;BrNf+Vmt3~knMVq_i4aXWaQ9W+IRRB*X$-hsOgcwqCOw{t^vAu zCxXU;lpY!TG10f1y1z-wGR2&+l1($erIK^M585f+yPX0J4-Wh- zbH-ZdfXNtC4*RxMIAxytw!$N#*9QiL5F#YnYImn(FcOGwnKesdK(#i4x4KRmIe|^U zC8@B9rbBZjU8uRZ zqF?5-UBu37>v_{2hi6JRXNjdM?NP@*3KZj~IWI~e zd!D9iX*t*;%^anAQ)raTSvo$JIZKLL08nm^lP4EQf&`A$ZFwyb^sxxaa!C|PkO}Et z6dcv>h*+4?b@EQAU`Ugoi&rQOvLFs`msiu>a+BgkUWSrn)#2_Lj63 z5%lhHa-I_!OoeO_>n-Jt)7Ok|iFlP5mSCCQ{PfXEtp}E6F+!OPRe||5$xKza%gW-~ zVdc8UEG35pZAX-Qldfgr4ajLD{pqgADvMBpn4PIzRRpXZAoQ36#7X|iuBPIyRN-(C zt~34q!z#V{0cT78F_Wmyvd@HS2cu7KiwchObuQoVrwpZ-G*nVp|0b=_@TAI0+pE2^ zO;_p7KZ|5_^XV#Ip(cT8NaI%IcMD_4Tv+fBE6@lc$eRD2S0KT%*qFCDlEteRI9DqY6^lY z$dbkMo7c#|sE&p`tK)#}cD31FA15+rRrRDew6_bGgsY;&Z53Gn#IilcAVtEPmN}vr zB09;i3#s?16rf{}Fh~AQxxg35#Ao6!6+^nY(^nJPmWeCxK(92lmTe1{TQ`^O1 zdD{Q~XXC$Z@)R>LLjf5DZ89@G1NgL%fQ1Uc5+9*P8a=rEPH1pvMMi`t2zeZ8s8$bf zaAVPtS%9M2;NHA?n!K#@20Tsi7fTO8q(;Ra5L1~4O--U6zcy!OUT4A#Kp(5t$Df@3 zG)4v%eOi~W%(i8oUCP6g!scrj$BNJ)!^`S)x5-LN#t5M5uBUEEyxUf_n5EeYSFc87 z+_Q2obEm<;4$%~uH@upfn`Peb2CSkrfb0`bXJ}lrC|I+-ns4A(AHf#p>173CEjN?a zBF6?Y#R`UCArKVi3>vFA8`UO=%q#M04%dwexmS+Vo+|!3zqppaY~e*Bk(B^POyE$h z=cL`0#cT&&G*DJD6{WF6ni;WqfPu+jyR!CA6hmwRbgbf6l(|W^sjSk7OA$R~yq=F= zzhpWx{L%U?r#U-M?wp@L{mLprKWi(=WTpaT4O8pzuePsGnazoYumF!EQ6!81W+s4C zp0m2A+ns19hNSyD$)LpbP8y)P|7f1A!Leiqn8`cUvQT^!10o_d4~9M4H32k9ch}hm zX~VZJk<49u(((V$?FJ&$S?{$X%J`{+dv!T=)_d0&J{8d!-!>d#r|8ZbJAKtZ3HMd+ zWE|=eJIvLWycA5MZ_ce5g`(zJZ?ha?BAv3cge1#U#I!VC)%!cKB?+ZYnza9vUDr97 z&|D5SJls0GgxQ`tj0;kdKZ&x>oU%2&Q!wI>7ibK)l0wQ`B9TNz6=)6*z(XJ$&_ecv zOsu1AJfUPec!0E3uyYeR$qcQtDbj##7BB)B0)~twM-U!Gcc`thLTS1%By3O8NnxE< zPsAv~2A^r`lYw5ROD)ZVETa`Nb%Q02DaTr3A@qvJCs zIPVM$*%5iqfLYho@zrTxW_Q({ZXvyAw(diE{+ft&rTv4PZ1!=z%a)g!woRIsA{%Bx zSRRzc#>#;Ke)`z{F;rBqifxLa?mL*-cc)?zy#J7MdSQ42r)UKm#!PWds;GFecILZx zDfvdrY+1aEZp*+GqM>qJE>!<4`@CvL_OO>wIb*Yw9yq%5;?4F$HbK6`A z?9Ny4<%*1rOyzmK!;e6N1XCXR?a&4dpJ}xDTwHnQ2uOTKytM^vVv7~hswk*Dxl`L% zrbB4a;)MPMVWsTbHZPN`PHsM7v7B917NS=55!~f zue*zExsj?y91ssr`ZORI@Yf=ph7)?6QjCw|T=Za;;C$ji!c&OMlPf&7Ox?FCb6i{y zVCn#`JsA5dtO_yD%N*h;mU26S(2!&TQII7CpwMv#)LCK*RtvnnO~8t=2J_$rn1CcT zB3jAU*9k>h7jR`pH3-hk904ub@MXjA;Yso*T_ekAfv7>@hx|nQ1GepDLDtiYxrn2c6 zYLm&Qx@c1nqPmecTfzVo2$6*?m!Te*FICEIl^R~kc0a_;3Jz(sbmO_5gEJng1Pj(& z9Nzp0kmd-$8P6~ywrB{Sb|-}1C10rVp5-et%2!sX|3mdyh@rYFt9X2Wzak6Gx$Mjf{QODMB$XgDkRsx@;bxZy$%>OQLK1FLd4Ao8zW8OS^ zu?2UWgWs<~?OUkN+UCAw7_;ucQN@&mJL&bVA^6QL$k6+|)9m`Q3m9_7 z(Dn`UaaN`THUha@gr^FFF6sb!WAq3gCx2d`m0Q0GFPN=H&J+3?bRf7h0W;7ty@q;) z4)&qGud5xD%@(my61f$~NxGf*5lnqz4~BaW5r`-+b(JBC%d;FWMU{T7Iue(y^c`io z?6OMVm}X`ljGlB|W-@WC7bbXJ+)gRs>0Br^TX7%ZF}PbHN=2Zz(`6bCim%nIb+!BA zT=;N?Sg$aOos-QKGoURY%l%9u!P0M$6_~`CMSihOeg{2hRmAIgCQj<#B^P#WdsJrF zw6^8a)K!v`t=25GauiEerI?Ot{O}sPS5t>h?M{oC6n-J>*4IQy_7G*{_ByPqGcYo| zPg3yR2t5t7EVt{`^e)dJvrFg}5Piq!sp#A2>D99?jLChf`ITMsD^CS-hyMs|PxUg6 zu2wG^rN)xGiVWtkSMiO6bqD+|wg}+!nL*|WyiPs%KD$mnI6G89{V8e%8-8+`E_a~1 z(T>m+xoA9rG(`syg@pY@KC&hTt3mAEGtCc!T?!W=0&o_F!bFpevcxS1?Yms~Abt2j`S9F;f7KhslDAYGULj+q2S5J3mq+;as zDVN1@@>J|iqIXb7MrCx3j#TWT=`Ni?Dxjy6&U4K7+Zi!MJB|PxJ*JTry5qqh3aN<_ zP`!!vp*D+p*5o}`gTzhlOJh-!9T$6z?U< z*#|Z0?m+xRew8h&ulUVKlvU}82`47r-!KpeQBAIdP%w?eh;F9~kG{x`V4CEjN%?BG zViHpPf|%&bN-}utR+Dv_FX_WXprxLe3L#DGbNq${_K#?D!264qdf zCV#jAZN(}-PQHUfLPc9k-TA{JLsJQ@;-$I!!GonL5LO>t#f@FWv`sg|j_ibUm~H0C>yM7-Ors}$He^k`!sIw*k?4Av7m zXY%EXKYa;n9#&Q^PQat&OM>CXr==!MfwfOY2f*tpcmVQu05&J*OeMCexr8y43vZK^ zvkdJg$(Q$`fob`r1pTBs!7BNs!v2;&U1|;+s?KsWMEglt7!>7Ep#O{JC**a4zswVO zHOsRS)uwWuD&s7^?E1xGkRv9kC8DTy3&P3hO!|2<`b$>SrlhDd6JudT#3mMTj{_=z6ecmLec9oW)Re1k580_ zp^#yMu*J)!gRU5@Fbzy1B!b4q&Ohl>~a9nx;7q}YkTKC1)I2<}2dE9_& z)0oPid2j;E;nX!=UJQwLDa6pv&$9Qxd;dpM(=Y#GA-%P4by)8o8$}pc#@cTmDz8{R z!SGt?Zr0?Bwju~`Wf<^mIf+Fnnw4Ggld+ZL6{Dpmq#WtGHl}TTP_Z=~9AidZVj=_~ ze)d7J+UzVKiie0*oh^k5I?L8g7{07f8^`X=tEX;xAR|6*E6Nzxzr|Du=FAokG7ks> zg@h0tGMNPiYpgG1mjW(s#;snT@Ak%ADM}U42y-Tt03qu4iK3-%zxF9c4mh zZUqx&tG>Y)1AL){8g)OlRV{R7~DwJ~Z;S>I3nay!sPfy;#>lk@x|4-b~Mc1V(19&!+dIOL1~V?%Z0t-HO~#sNZR zt$TJlb{epyeL|8R%dwBC&LUCsm4;c>iaKq-9vgI8RfqAg`Dp8Q7z)`E2?sG@@QSSh z_zP^{^lMzZy#$0-wS87?vK3Vz=Y_t99wpiF{8(L5;I{P)JgZOhDy@-9*91)Nh(Erv zY%@pTDNxpQRjjy_)l1!TAKaHvJw))#JFj_96P@S!V3E}*Ral?B2=BMp$sS@_UFtfzlo#ZCsxGyRTd~e-k&}r4WIwxZW zf48yy$WOEDY`y=Y>h)U(sM9fqGXO60ZxV!7w)ZX=qSvshZ&sJO9Ro5;Su-i(%wm!; zxX>V&jM7?g(E%F`U>5pPT;x@ojL^DOiH!6j-dWfY(fbm#7&NCeG+thPLL@UidIgnA=@Rr*CLy6X|Le(Uq9_znK_%^XI?vP4^ zqNNj+?0vh^iQYDDJmd#}Pk&8OVA(PkwFz1LAGV4#FcFs&@R7ib;Y@Dio>%y8F-4j_ ze6T2rDwDW&LSWjBc;We+kV_1BC8f4S)x#Z(Q?ZM^af(-NO$B|&(gu1PLq8W?KTjHn3-^*9k0^~ z-vwV63b|+l?pIM))NXic(jd+Yv5lc-aptHN4a6!|QEkI%KsWAJQ=2haJ!(o1wCeIJ zOspCBWU6ao280(+aJu#Lr4i{P9n|5r; zWmdHdGJJnZ5p*$~Yywx6*QYrmPwYQ)zX!`-yk0waVbS3?PQ=qApqLQrbETqfnu4Bq z`6m0A+`MpN)$v{G0ZvUtniwjB;rr53>?GMbDo!l`%e-Wh?21c}WD+OIb$u~1KkcT7 zTbhHhnR;v5rQQ1j>i42OH$TS|Xc*BU==R?0oP%wkl6UXBA{-cH6{VNOE6B-VR>%9x zEJdiqm|~2&?cKwoy2%8GsR=(Vmb;auZa%;#=>ZddZ0MS$(l~b=z*=S8t61ht1$A2$ ztD~>^>fb6xY6`V%X$Ct=yPan9S!di2lFpiU1}=)dvlV``gIq;CNTb%xc*JaWO9Y4T z$1{q%OhkEIM&Kp33sCF6_^p^*%&-TKAt_KjZ!hxHO$ZEFg)G}(M8Tbtjx(QBaE0Rf zrbKJN6#xz^&opDfQlySRf--!tw}qThe6N zzB7sCdPi(9T^2S^M_%D3ojy_oTYCvSWUxE{Pv7b#2zjBsr5mU#5<0uu+LrKhz&uax zFLO%t`>$f1BK#*HxowMez&38|kzPAEFBE^Vj;1_Wc@l*I>#^j9AtSscWMW$CPLde~JezqWE=d@H&p zLGCt+ah&|}uh%)LGbBY?{ZaHrxyvT0D+Qtrm2 zDtYPNv(()hQ7$%$iZ$FvHkrB&Dv*6h9=Lb+?{jh2m2d#K%?EGq*_8%W?(oPC{ygk$ zw&Y^Kfm?AQ;mVMiqYhxGTYZA{wsY8_GY)LY&7XBnLR93f--STK));C9you}g z22(fCDC_VUoCN$#4mD#<8gK)9KQs~2BQN2IJ1@GyNO$Kwc638NlaOV87rBXWESU3s zW*x=G?pL2&+w`hf7prU1xjR-sJ(9N}fRCt%+YwcILGt4c;~2zc^~aqM)|2VrnY`m+ ztG*fN5Kd*<@dl^6T{aGePT86^FARc@s=IK0$;cb-C9U;BTbITtyhDSD4t7k*o0>bu zOzGh>Y^gz$rnr#aHSVaG@Svh%-cv4&?02j zi_dZVp2W&x`~K>YQAqkgiCt6DE4~~Zqh$DiUxLIFQzZCl0J@P!TD8ODb#^6dZ=q;> z2&_Xh>xF3x^RwdWH zCrZO|G+*evDR8IZOOnk>0*;ymTCX*yWzpm6N(rG3$;rn^J|dzstDDMP>+J#fvhl{Nfxo%ujPVX8m>Wi)c0FewOkFF1Rh4s{zH>XW! zkv564l0MWiMtmR2^+<+i?r3MC0I$();xI5b1Sgg8Z0MZDUDG>h6s?>g{iuK0L8szr zx>Kh(x)G@Ytwf!B+|@8Ih3}ahSMEmfZjwD+ky%Ug>sex(0oGWZJ*M=)XuiQ~9)jDZ zh5|`_zie>Ip0?*EuBkL%s!`I?qCy|P5`bQ4B#n+5iQb*IX0UxEDl7;^c-!g)5bctZ zq&nTf7E8agBiG1GA~gZ3&5jep?Ok9~n^OI0xT8jyz~xt~Fm@LBI%^GhV!wRSHwr%x z0uc_EM34n`F`5UqtM3vYv7Z-@tuAGl=K#WYGwi1}a#o#+fo{_R!M<%}NISHyfdNZn zoWcF@+juRc8Ff-(wRL#X6cUR;u$tXrfsx5$R-(iceY|Sh^u14uPg4Q-!TsD9q%a`* zL-%iWw^s*h4JoP;yqpcLIXl5ygmvNGr^g9BKb7WXb!s((|H&m0ns68{U8VwP9VU*Q_3LHGJB-k}+#EA;yB6QD)0;JlV!Xs$xvGv2S(l4azS@5aZEPwGN!x5e1 zq`!Kop4?u$-_RJThQT1Rhxgsc6Rvt0jg^v-l^h&0N*;4rUePwVTODWR2wfKwe4SJ0(vki;znZYh5S@8dthw)g zN>INyh<9`#{OEwt9its(k1UP!8heTn{-W(dqiGah^2luzMob9rwRmoJs zCV5u5`K}Ab=zy_n)?g6W^V0|qJkxPvOK%LaP`qG|UQx=@UFmRdRQgP_UT$rg0D_-y zi`3$7dkvxvn^QjPQ&%rIKDS6rwWhd}Q8zhF>agfL!eNB+ippUirQC4A(pD2AvJOtu ze~kmQvDeUWESdZ(oN7D|1^zpimc^Z<%B}S>vy(IUHCBRvZ_sc$a+Y3f1ym9n>TZGK zh)U=6Jt$QSpV|T5X{MFxPOoAI{D0=aaJFcXFwOnh zM`xYWt*2AIM-|X4FO|#(#*;3K?#qB5qs&&7jkA;Zc5-Wsb4P$mtA9}7b;~v|?w1c% zw7tfrdxn1HF)K%(XIiUfvf3AeDV7I$${Qj}BT~CZ6;!~k?8JT^2lQ3!s3#H6Gcc+N zMK^NdkyoO_)(65XtleKa)xA>Z2yB!->l&57G4qfFBxX5Hr@ZJck@@fxVD+?{-#J5$?Y(4KTFLF5n(Bx)=}S z%c2L7#{mBl+{F2Z5_GKNThIyp5#O6a77*SouZ$;%P3$4O-(iu%MC-kcmP&cV1t1oysnLB{Q!ujPO{sVq(#4 zSTIB1SnLW+7Ql8xf&6Fy^%v{qifx)}Ku(DPEhTEPTaJSY(HI>vt$rKxT?%HJ3J@;= z=f&Y{LcLK3BeZ?Vr(y-OYS|6@T*AmIL!_!VNS7*Z9RN;<6bbcyk({vka zO&FmuLCYc062Bwh&;#V$6L4_O>@2%sYCkhGw*qg-C+={n`d#O<@)TYHUDBoVahjj=K@(&VE!sd?~jd#h<+ zkLHp;BRMOPtLRZLRGf{&eQcA$4qg233PuF`B6rI%2HnvPFi`3791-WJwSy-qR6Qeu zSl)`kam52(?QIC-V2>x*qakW_*q8H6U%y=XKZLIqFf=OH9onYBolcsxiV1LLJiz#I z8Ui~f&5Vw>lQ4Lmo)CJ7Hm3!Vm_%rVhX&Z5Z_g(Si~g_ zK;58GPR?m^PVHFq)`Pi674_cNOgHq_8Xde16g$b`6!g__YiR}4S#n%E@-;QRy9G_e z4l1_bKXfj34J!vNaCwjUEIp=+pO^uC7eyUAFJS~h+42RwG zXXpw06G;p4{8yK{@c;?(JD^$NTX!S_Va3~E0cCOaBTlq>0ke|^5?ZWX8>jNp+rNd_c4;w3 z(uuX)M(Os=yP3nXGDS}PMnKiE)#p)t`Rm^wdS#2dt9kFD5wzlxQcdOc%(n~7l`Z=+ z!^Pb`jJC+X8-0O8^Nw4fIeW<^RS-XJKO@g_Ab!Rn{JcybKtai?tapNYha@tND$soMRb>3cZ+Esw6^tWWi{=kWBi5l z9vr#hQg`eTkc=e6%J=74^mdN4)8YbheT3cceN=enx8%OH?DOX!1a>#CJv2+89JXWY z0@jALx6%!Xo~KrQaqm?2w-1Lc5zhr-E}h!}1ox8sxaSx=JFPb(dcRVbv|s-^?m=VCG<+fD>!=jxvlFOscSA;2jc%`>A(I zwBZi@OT(g546H@dhbc;$?MP4TgYL7g{uRX@A2{PLN($G@Uf6^fFzXu-TLKYzBznMK zN)=b53PHfZ#Vr&}Vx-wPfxp$g=UH+W847X)-cE%sP>P$v&YJi^kBTT$^xDvhOLOKi zVw9xbIeDtM6uLt!;RelPE+ECTtkL1Fuyj? z&ZTYz{&?e+h0+Dv44JNEI_K9LEO|B>{3N7lGG7SPnhIm|0SCyb)$YZpE91c$(On0N z_g#!LPl>TEcntKH>7NsB#5pS(4taC&F(d;PWUpDPq}g`V zH+jI+rNxjW^V#8tf!NW|=jHmoVgX@0#uJ8w8g|wfRLm)!28u~wEk#!cjDGemQx$!B%k+$c9L!v-@JCjrwRndmVg35N=h$kX4alaC#d+wDT?8Y8Wzx0klGXejw%8iUs`lEG1J{PZiXAgPERgW>H}bnziHO0rE$6$} z!ny%gYg$=$wBArR&;fZX^q3WL24GyEz~yh~pI?ReV|E_1&x*cNhk7`2;RFuf^XSd4 zTfzMxD-9#-q9YDy{4>Dm)nW-vA?rkyN(TX%i8)EDZ>kTm50~Zf@Q&!M{%~B;>AACF zHC*D@&I$iGZ;+X8=2>i_U!E3{6Vo$P8#&PAc z*^p!SMjt6?xFMw&1j*uQkxAnw9@~=TCrk6^56=l_FZAJr4?QxrN`VC;Tjz{Zsb*?o zIxABtrVr2&`P<43xT+=i!SL z0R<`xzwqzn8e>x)dtCBZCa~@H3u@c&b*v_Ua1Z0YiEhK>G?($%lM$iSomGbgCTgK| z2WeBs$zx&@T}8)qqXDiHMqXS!N&cD{S0E;#Ii%&@6x9;;&W)6_+kJXG2-eNQ3l%@~29wpO9pFVXND zNkFUlvY}~_y&&N~o!dKNM=y-HWI=fc;LEumn@)J;Cs46R*dXw}gAcV}-gf>Quf)+c@Z6MiU=mWGyWSGwF^m!P_RFw@*2>gEi_-YVM zs}c=yxrM`=uy^c7I%4OKP#|Oiz)$z`1o0TfG^A`E6DpAW3>i9vj3&|s?2yTj8vJ#S zSo=1ZfWQ;D?FB$@| zleZ+iZS|YfU{GWjib6JFo7i_cmFf1C+WqANTTo|g1%PW?n0GsQPl5-f!-f@Q1lsb6 zF85*W4vPTMWL(b;Kgdf^-t1*VfV-7aTtl>$x?U7lOq?51nE7-D*-Uln2wU@u)4{8#`gf=*4OSz4?v3Mz<~ip~MQTKdxhKkD0*4aR1Ls(G?5ZfkDz`o2*Y zc|c%b-d|Z!FmF~~^Jw~KAJhm@%hyW0FlX!6NjGj}yY+j4c`OQY7ACi|aQ0HV8K(YEqj@sB;c8Ulf1VWv~4 zHCVoC>1hV@xu`(oM5?LE*BWr^H;`U@D@ba=`JK7_vfiOZb%kjNlr|&sAbnd2M+Rp~ z;kB|rbA%H9Y*;0ST!r$?^`q2mf7eo%`rVWD+tVegbjY*xCDZMO?vgD`$iUN^)WJ8B zp3EwBjdcZF(0x}IiQp6UL7Au}DryR=kHd+w7xG1v(|30*s%*_n|D|!ErRpD5jMX`W zDw8s}tjyd1G|CQ8U>T3@%&P)rXl$$WAfQt}0W``B22`J zF5SRkuZZ8nl3M4Sci287Hy~F^j=JUO%&}K&utKYAdx-~Oj;nk!W z&gwO3wRP9j3bOfulwG=)EYdYkyNRFDop0Z70*H$3OzgVDZ(31u5);FvJSaTXxkq2} zD0}HyD*0#G9AA^^`8Q5c1I>|Rx7@`GRwIruC%{?d&MIi2#zV4qFz1qadGwP}zom`WP`<{&$F^5i)S;Sd;KEI6pNR)N zf~>_JTVc6V=HKs~Bh1_a3~%+5#e@Yphbo>yB0Rm!C3P~Z7!>T97kdGuD${t7?PskH!7T!!AbVyAm;w0598R#lBcQWaPIA<sd{o#CXwxK^s0ad zj`-P6c){%8HjC_Ho%)+`B}CMcy@A-kk#`Ki$BpE{i?ya?;{)+&%RnS<<%YILq4{=7WFDKD^ph9^CM#y8Rh`A;n z+c)jb3q*T1c)feb*^9#Hua_#+6j17YN~F+a&!K`T67N(U@xXdYkIL%? z_$RRmvA%|g+tLZN!<>d`_x4g@H7C4nYYs_)W%8MH%&uZIUEi*aI!$B^M;dRHxl<*2*<)73HY_}aasVp${iBs zE%&u&@Xmx?*Aat3%B7%;O6|D;v9H)Q!;%uW&SR>)JKhd8fuseSy@dbO-O-|r5|o^< zAy_3tVdTOtGg1L>Q?5{^Rj#*B8b&f|DUe>=6~AeTAGTQfqO0mp7h_+`$67yaUdf!? zKz+;@dm1Iz@uIVreeVj{mcjas!&n5Ex}`(;$`-J&Kj4I`KL+W4ZUp z*O^v4LoquaV=oF7nEzl>^L1(MB#nr{$C+uL`h?X^_iKANQ)7x?SH+sv^S!eIAn`g&gI_6@+rFQds`YKYSs2938uTI z#Bp=A#%U=5fVH>%tqzA;f6~~JwS9(G zVjn8$dA0edkFxt^^#`{*@TcVvz)$@lUWh*)=)RqK=>?HV`pH9QERLHuybhlHorwN7 zCC$#{AV?}a&h%ytgi6g{ZWzEBnTS1}L3FwF3pHnKbl9jo;}O#>d^+u><5i8>x}vbh z>e=5R1q>RfKk{_>m(KsN#<5Rr%BPRfct|GT{T(}Ci z$vTGc+7e#1IZ3o-q;{4>{v?mleUI-X4+pPUb2_#U@C)iPpzo6HDMWhWsGpiVO_wlm zw%P2kL^C|GVC)5tJHdR5m(76#C5&i#5~yz@d3>1bZ7FHB3%vr74Ky+T+oFP zXlY0R|CD2f>A=d#dJAw^g(@W&#=DP6bMTQ2_Q}Vp@4s>N=oaYo5`iwKBsHaMU(rNt z)xgO7DAaQs*l{rjqaS?O5-F6n>T`^0(Dw%Y zvrj4jy8LU_ZuvmpEILZ#XpH|e(R=k?o!+wOLZ0WmiMQS40_purtB0|LCUg0K z>${$Vhk3gdZ5-k;N3BZS_Al{@4OMK&H9~DOYRUMp_abGnlS2H_c z?M-{pK@|N?i1GBii9xQ85pTIvPxPdX>gsiCe6`aY^o*@D9bKg-_6d_jr?+n5r_Ts` zS6akXdQ;d;A7}Ka6V-5BiIuPn`H=7N(L8v!=S=|#d9x1ilzGyV);hvr3c1NdG_IW3 z=zQt%$_p$Wb6^8|R9J3mxQDX*KSWrJeTA&ZHnbk6n6!%MdFXsS((rBF&=@F()*Ucr z$pM&#mvWRK^(hdwjDXJFZk+Z^HxXW& zDc>B7FR`?@_4=A2(;MmF^JXto5u(Y$CUzw#-g9L4K5XgiCDyfpKUh9v->s4e+S%FSLiqHfCC>9{5R4-F0luT1Tc4U5e z5&Cf=C{!7_P{($g!YpDa+cbvIyw_rQzx))N|*;Z&)#hhimn; zR`m@gCkYG!3Gg4sefb4%g1P7n?$77{|3m?BwRJGEb1-&vq;s{SF|@UDGPZG|Gq*7^ zcB8d3vr|@r007qLz?RYZIhEZ&0KUGzzPW$@d;>{Ghp%XEWo%<;jBoCUZ)$60WNbqV z`J4AY#a;i1`!#_?| zm4amC20c8lW{<&g@Kj*a*8IVIr-ym|?0^8;lNqu(cBC^g5e3B8^U?q<#8f>8i0O;@pCcuS{T{FO3)|?U}bvRp}#2mDj@+r+};B3SUF+Y;G%g{ig?aC?DkW2 z<{|~aO)b;bMVyi8woV?lSURG>x54?24IzN&79Y(v!(44e|G82CX9L8t3E4F==AO(e zHG*L=;a2Z8=^_;$4CUq>HQ4L6wHcj)-rS|92#T&?wwU@bR-7&GQyyRZlFGume03u` z)v0w2Lya%CV?I9=OzA7-19`;&Hd_1rNZ$6Re|E~pMD-KhNaF4tGeesNIsNL?%x5Xy zlkROgD76VC_Tf2jO_D#)%!fd(Iv<~F8Q#{Z}w zQ!0|S`>gQ18$AXpO@>^x7t&AugmuX-b)KU%p?N%zjl$|eX7c!_MK*Ka-2(*1;>`2hIHdFmCEMs=KM)|43l}% zcNnC2jPQN_9}0DkNE>!9+NT%%j)tQaE*0yyF9Ce-50M8moewhd)s|dtTv}6q3vB=P zNWOjkT2QGZ0gI<8l)%8EyE-`uD1FWyNz`nWB)nlgmRU)_*uNC-X(4ByXa%jOCE^yo zHnfeLjsB{ro`IxtPht*@>)WR}8bV14Qa?c9h|)iR#p!c^z_L*+@4cdu@`Kpai;0{b zbbOAZX^Dz~6H8e?UgXigq5k1GTm+m%AW-iNH%wyzfFBvlN7XSQeBMX?rk*jJkTGKXT?qz(_7^24IZKe6lX!9N<^5% zmuA@S1Kf-%p|^PcEwE<-&hXrKV%&Df34nw|Yox&DDJ5OCJZn*%#MAu^{J9v{5%Nl+ zHYE{gpt8Q%JADJKf_*N)A)zn#@yD6TxzTK~01#9Sk1{o)(6vrwgT}F5xU&yacSyv% zPg>$s2Un>4`C^RsNlI!L8!B<*%e8E(e#&0H3Bs~Z;;W4`=w=+RFO!7X4C!U!)gv$) zMPY}kcvhLHMTJd#gka5+B`NXb)`{81I zhx-mlQm+`YFy%-XSP9nX##!Qj^fchoBKXO-)U-z05Xm;e~O}X zRb%e*IVxfdrv$prwOUSJ*-#dzvXIY{MXLYmqc)O%H;?SD{KmxLE#NI*DGoGyk+wsQ zOJW`{1A>Eb`Wq4$EBS;?f`*Bfxv`9ThvyCzy*GJhmG!rZs7Q7DqO9YSxIbhC@(xN$ za=XUX-{+pAhtVhI$$K9p%3Qk_0X4y73Pnar^)h%fDl>3~jBge~hE!KSI&v z4-{ds!SmMm46RB(&{JCz3bh2-IF==tLIx~&h+JM>t%d!NFNEZf)s$oGTJ2kFKenR)8Pk}bMG9gOU_ZI*( zfXZ%1yOADhxRFOc30Qzp?OT#-T8hWI6!M-!YX8c%iPg3?nKL-m%ump5&VJwnUCMAm zQK?-I^iv>jLOg_W1NISB@KkCQ)^?KEhq$m%U(T*(B+;$}Dhqseu8^dQc43kLtSs(# zYKeuxIDG#wwt5^YfI7p|?vMbJ?bE!aXpIb2NHxdXhL9mR^_D9xlsQ(d6= zZ~`#ply1rAYxn@|_E-RsP2$-eVIbYefT@f-kLahO=u_LOCpC6h^7s>l>+TjW@e8ZE zvHq6tED5QJ%(k{rd*--l)u2?|RlOx*IvJs^SAk)sKxo<*)!Xus$Gf2VAcL2@10sSu zv`1PpxOl9y_MjmlXP|P9@SP+{S@SmL*vhq~Js>9l&*j2#7QL7-Ia59(v$(k-Fw9R z{J6@rdnaYjYzdTXN#xiycEZ8+(=#hKIDN}=T4d&0on7anA<6=kCMR#8Jn6i%ZT)T%<{ zR8LBf=6f+a`tA|Fh%wHy`>pcd@-a1X>095}-!1GpW?5i}!o(Pg)-iq#k9cU%O^hE( z0Kq;7C#faW@>1fmfg#L1e*-FhE#TmR`D6CXI|krF-3lX^YlzC@Cggwk6+q9B_Snt} zw=0Jj_clozR{q}gHiDoG&CjTT4OMFRQx;JcP;&x-YQaT2upd)}md%f*Znp|2_@W#S zSKnZ|eS7Jqlky4jx$|pfr2N@VJnO)REoZPWvZl)y;J<yt@LAVe)1mQ|YJmL`$XzSy4fK#ZMCYgk|O@!whgdvOMr; zpM1m5Ha(x3@p|R({r!diOuw=eSwAx|APlWdj8O!1V7-u)edCne9KXtAbUm zZ8uoqzpTC^GDG?t^wh(?esZV3Ko*?FlfQw4 z$n;rrV%(P4uSP<31~d9rVF4#3kd8;fllBYVO#lP7jT(#tgoE4a`jlFiR(BQ^rXJF{ z{R;r^dE(HZj!8|Un)v37!JOqcqqoeHQ|+qq$3by%Ldpk8UUKiq!Dy>g=cU2%Jcy1U zBn+4S9HpUjdk9Ns>{VgRx5k0%jcX{5av-IGqct^qB+RD?s)tJm?rx@%w_K^0hik7u zw1<{?5M=rfOHG?KesM(?4clMSG3e@+z{itADj;Pzn$x%f%Rtb=O=FV8Jg(E|V1-Mw zd5fh2)MGn1B4L7F%DV+eb(ruN)x+Ju%@-od8nh@DaOF@1dc!}HiyhQq0%h650~d=9 zRP-h}7lPSkT=UBm$ik2n9CnkQFGH2Awe{WiCs;iJEaEOD#l(fziepZ~U#s{hjeZ&d zQh9S~ze%Z9fimjx-63J=2!i5ngwGJ8$wV8egAeYnAu2z&QB@#bUg)mUn%>qKagtde z15ijkOTQ$-m0UPBt{qar%iK<`?v4nOV!FLZZ2K?qWWl!02x0q3)UMDAX5A~xWfuZDWC$%{Pie9Nu?3w-A2T+q55u+b%ty~Iwt6*|5NQur0`_)@74;baH<^H@2>T3X=%RiEE^V(;e@x>jL$Y>3VLyFQ~yvW@( zaR6*3oGt7p^{K>F0g#&eWNI8r8Hl~t1qDqqC6068r z_;={xfk7}lm6(eVCcn>kD}z91(cE5`#+>l*yikV_mgrDF5#f0%hc^{&9+8PCDeVPCGI64l;*&h37tvydiGXpeZ` z8+Z{+WSZSrtMrYG$+gyYo9)SlY+0z#gq?+b;w~QC<_2WCtQkYkeJ5}j+zO{3+M>|0 zO`Oa7n>*~R;1<&xR)`c;H@$(tN5Y!q`T?#duK#M>h>pPP5`O^z_`(4IF#bE(XKwv} zvT9YTTmJ!lzRlke73YICmLuXD*1}X=ILij$a?t!M`f$PovxwGp@g)95i5`OA&s(>G z1xD_x13HM2&)&}+T#W72^%kveZ%*K{yNbj7_u9!!Q~HV$V!{2ff#l8jE>;u%=2Hn) zBT!YeasfeqRjAvD)^m%cY)Mqdv&ui$k$8FVzX^PD?>%+Y3dj+CVV|(8X=&q|(P3M( zMleh%QWwZDEgJ={LU<^kq)YK9vgky) zNF(Cq*~7@~W-($b6i$cd@hQ`ihrS)1oH89NoZyY=I@Ldjl2D($s$bcdEt-bBAQQ0? z$&pbtON7;>Oz7uG6>NaA{pwI?>d|DX%GGvJ66YlDJms&FRnL12k*u;J_iP}sQmA+X z*+mkMITG(+HaWW?urnV-#+D%(gyA7RdCjlbi2K`!Grz}_8u=b8PUgH|V>65Ty=;(p z!_pQB`;Zj%Du+8Mrl+_xGZ0#}@HtpzHXN~_QicJBLj%7?2R3us_7G;2GpmD3)>(%q z`xaA=$J>r~77@4Xr!0n0CBF>mNe#xC14+1*82Z}!OfSOCN>cdb&^(x$)~uI;TOr_3 z7JH7CffxO|x35;(M>XIA^Ydx0rTLs{hbJ4 z&i)h{NjRREOF85i;nkhP7<+D9!DGEJoW9E^&zF40_Ehs7vs-DKF%G6a50?sFL;UJv$}q2cpZ-|*zVn6L&5BjzHji!TcT4$U;~mPTDAYo4LYU^Rck#;}rXcGEfr)e_x0 zDt+l;HgW}aYSVC9scC!!ZH@6swvzsYW4lI9!s0tgpD9chMK{^WgD4LIgM~N(pD+aZ zdU^3bI3qm7k#nvrk@GO2-j5(TijEs+k{$wGk|7T5q`o%0XRN^9KT!-yraY{? z#CVfKWv}YFN=|gHDrY)!wi22i3mvkfhZWQUns#;xyH@W$9v5I46Urf+EJ+FZ1Cht( ze^?F{&oolRywI2sXHFOqB?-kQxDXnlDY4Hly{QijhCOUaxJMHx>G^bj-Lpt`9>^nz z^S+v;$1%kUbOzozW!DI>%B|lh)%P+DGMiN}xD8HFDH!SA-R=%HQ4ELjTWY3C{u&4K zCC0te^9kCQ2G!1x&yNKe(#0$tF_tY0K(ZT#Gg=~8VlDp`-)nkaYH$(e}ROw%i7j^gZ1V!Kfv+EDf&wDXu|>)o2fSPoWlOm1~fmL#b45 zAg|#QK~Lp7TZq);wW=G;{(2l+Y?ZmKt~HX~z`oP;kd7JKo*1T1u_00;C|4tTn2gJn z24UG79FA;4lcE#$zpa|aEzDtTcqn<%cTEKoFy7r8U*7r(6E;r=V`CrHkc+WstP{(%4AhK!x`ot*zUPE)MB z{T~LvC+5chgbX^!30p>95+o-BT7n{z&*st8iUy=iqauhOh>eH)f8KH>6wr)Zsp!Fh zR(4$bct4*iZI+2l-JPFfXbrT0_8F9F*dQz`2+~0FTnP05l0>uMd(?uwS+wCmbH~Aa z#kKFF8p%#$=K4Rg*lDvEMCQGK!Wg@Z{U%u9aZ=c)VO}oZ;I1M5waG26O%*-7Db_Wn zEraSXJi3isgG+(*AwCKg`k=y8S+Ku>^yD&frMYP!JMHD7I&FgXYehwgCg4wMI2JzD zW~&Xz)2(2;8=R{#P~XvJr9~So$1!9E=tuHA+)DUy?gb~T1;m9M=V~g#?NJvUV)CE`jzvEq#jU_(vifnx$BNg0`rBh!Ko8Y&L4DPqPky-!lUTkR%T(yC2)blywOK(KxF z`Pd_ul@0Xm>Ita{bYDkSQn|k6fsSL1bK7CUd9gr|%WAe>Pv+Bi1qsiJh~<3Nq2PNT ztOv5%tjmf(84fOOwMz#Pi?k}582a*Rd+luJ& zy|sdldG+IaVA_{3Q1`szEZzMGOR;9fYs`36+;Xs^T1wF*1P?50H@q-8Leu9C;^tRr z>#>*gMO66b>OzT(Dp$Q-=X#e~wmD6)x4Q}so+x96P5%~PW%|VenpPGMPU1ej@n)Wc z#0%E&n9K)V^~g6jc5W65`w1QwK5da&vTcNya{qJ8G@xtS2n4sQW1$#aV$NoiS$Xi| zM@+*jTlw9rwTE)cx;#kg2|vm9c~SKSp7jR3&XUME;dAEMG6SQZu;F!qhC#B(_1o=ZjwE ziye%>4u?|Ia&a{m<@5D2bxB30m~d~L;`d{|K5i*|mDXM?e7Ud!F}2ghSKC}Ht_7zm zCP)qOu`+H7(ZI0eQ_&MYQI${m(_$wo^dfv3U7JU_cl3fFlpHv#PJoACQ70l;vi1gs z+#V1;@AfOW=}{TmGy>T~R^qrx#Lz^d#;`fvBeUvAwrLc16!Akm!Ik>-PllJQ-s^?2`NVOk$`4;GB~4d6i3@>mSo>)@%6T}OwBGSMqnue z*OY{QR4G|up}Rk!C`?Q{dLmj^w#Rzf>Y%RW(&9&Qw=V2qWg|&UVw<19z6HZy_v-jN zTI0uA&>bPoaE*!aYEnN^$>1hVX)^e&CQ3b&th5ts!t;8OR40(q>F;Eu}5y@IAO)y0msrAz5IF#JxFxX|8NVOH}qsp%nU z4MbgQXuxt>Nee-Esl)rsH%6k^|GzEj~uIM$|)wi&nyyz}gI!O;dm z$1{u2)1T;NS(`I?u4J^|3N)dC?q?*xDvr1N?O^0;hYl$8=ZbbuQmcw)VjMk-{6{vW zsbUDh$rt;Wk<#k^!{bCy#>bLFpw+N|FvZ(}1aPqr0%f>J`SX zwgI*z4-aFd^K(vM%FIbr1Nf?Qf1}ax0#^tdpByQyYw;V>hmt5@I@Km6Tv3UWrQ2th zI2V%bUF*yxSZ(gVez@KB z95@Ycn$^2qOEoHqvZn4~6RhR?$-Wu+hW2hyFj(&M7#T zDA3ZeZQHhO+jjEDwryJ{wsT_JILV1^+n#gpOx2y4nwMMCFJ0Xay&t-3ckk6}eJjP@ zEqU$)dfIrA#I|8Em^-wVW!_PCAZQAoiMW43oXE;NPamn@G@rd%a1~)sKFh*xem$|} z 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�%i4fs5{t2>oybotmZZ*(XWXc$>*KRZJ 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�^kP>Ce;GLir zE1aLLONnWYcT$Eei1K{~2=<{MXQN3Y{7CK(QJm9Ym(X`xo2#oU+6XP zh)YNdd_BYMABP=2wKAgOorAea*x(n#V3F36Q7O3$K)c}GBynX<-gp%>!%Qn!2T(*o zhIrXjrRB-f<#Zm!;e4>7oedD?d{`;yh|u@KvJCY zX{HrO;;y1|seCbWD;Wa%p1mt?R&ze+`v#+BYPP_R@m%2%qKLB-<|2OcG?lZ+n%SKdJ#*q(P=&kX_^?OM364xppHk8qS_kR zn^`;?q>w8E(SQJ-wO&>#qV~{<)XOdcW6iKh@}bBm8^;7>7Tg$hE5OYgVCfZ%N4<(o zE)N(Z6xwtNp`#!0&iPRS4y2AxrAbYoOERebD>EqQqs-IWC5#KpWwzL;<=d&x0+l-z zf{A64LEWpKcm#@XLhN=sW>)?wXo>T2!TQwQ6grCeMsk9U@@ok1Dk{<9K!w7gj zob{nGwL&pKEl0%51Z^yblpPd#Vy(QiO=GdRuI=SXT6o!iDwG)@bCXcw)6r^4_DdT^ z5h`I(KNjWW{XJ=>>`f{Lw&2bXq}a|?Pg9nW|U?UjR?nJviO5IU^#81f^op(rg^K#j7=L=cvzQ`NVpuY z13xc5DkV(SHjO`nTZ9rvbsVD@VIqN_wwxC!t@ZWsn4GM~*QRj#(LYxC{8b z>DufJjTcJ4)2?M(o8I;f+(wCleKOg|;<}ULmwGUHBczhr#9Tu(_LtWM00q--&V6~w z>+M|&iVveNB#^r5RuhRKwli!`0B6B1gMx4?iv&is&Ic-(b|3kARm++&(4)gC9G(5YXZ1p|EuF=?G4X5*z&&_8 zWY#&tZ=*~n9U1azy_!{ZdwohW2GJrFIUb~A6r5niaxvuW&5WKnHPnOrsd;Yc$IN6< zxa0I3sY7&ZiVtGE#q;@+~pHzZ#eH@}y@QH+BP_Oy9Jw?sFV|N_nKxq4XExSya4i21vnd z4Af#GXSj-F-EkUo;UxxfO(tES2G}$1x0I3xhbz{q#*j6ha2g^Dmg+hFRO~1utqZ^h z0sjCHBjrxXq*G`E0#oL}edqwGc`t!Shs-w_&N@*+evLSFjYXO;x3e+MHaqnD`FmE8 zoRJPGn(*J>%)Q;e#e*?0|D$6qrlxIE=Jop`cwCq$;1$7d9ecD?b{uoy+ z_c)~3P)qCmC1Wb4M<9|nNKf*mY)*`+H47+|n`mA4buM#`Ji7hOJ&Brql(ILW?xc%y zDcGTp8?&B&N^OlRJBV$9z_Ft2RT%L8wGGjDo=^zx*pRvPqQ-gQ+85!l7@rX*j8L75 zi<@VbAa*Y7QDUPl?4@LqZG{M8pbU(W=S?yiINem=+gt$A$TQI3nzYfJuEpVPQ&3il z7I`t$6vyjL(j_*`>x*lsWMLs09eKzUlM_8060zWu{{W9Qbcvw2W#PNb4y1!mM9^rJ zWnhY~%ufmjB+;Y_EG5dvZss{+kt7F|DnS%z96+S#KLV8QK2bg<8sbP&!04fLk(`LXSw5KJxi6yKUyqw zs9b~Hs89(#PI}X}$@EjbVm2~H1~5vRYQV5$ZUzQFH(%15bO{4?4;Bjr_aJdniXr$=tVC{Xq)}q#a7|{4* zl)nyq!1SqFD(tqquW6b*BwSpnc2S6w?q>RbTB;Lg&2RfjYkhkh%@m5U#!z#D*{Vbt zH#(ymG`E1ArHj7cI-LIidIk>4S$4=(nTw1N2Ov^lhm9ZBc-5iHF8NvSm z)jW`~D;!#kOr}{uO!dV}nnkEKKDvx?C{~m^dMH1oO_fv{Td1Xom|?gi?U{JIV)Q!6DwjwMX@Z3>^v=s?HTjfd*S zpq4lsBR=AMz{#SRS{ar*S=%mdL#HG~D=+A@t)b{raT+$>?{haD+>QVB1kIU<(LrN<`CZ5u|k(yUrC<*p^>Ylb*-df<71^{JDT zp30<#o_LkfA}m!n7(D0KCZWX@8!FhGmsv{jj}{0c&XpurV$CAQ7*bmUINEYPm0bs7 z6J5GDg(cgM%~g$vT3Ob3LKyas^3`KPE}g)PZbjq$IK@pARLzy%&<(l#L>`q`IwsYU z?`Y75$Sh7ak^cZVq@ym%%09@3M0YC$V7HMekwa1h;#GnL#=)QT(3=L3zjYyC>Qeyo zlgO*j>6?kRG@CcH63X)lUz94qgU6*tY!n1i#bmf;Mr2Pd-E&56iokX&K(eV>HxJA) zf+}3C4MfwHMTXs_E0j^mBO<0d8_}A}35-b-G(~_oQPdtm0<@ws6=aymCXRQOL>sZ! zr%-Bgr?9OUx6_k!VOwzQptOuma6Ri-)fr2&kVkaL#u(T}7c8vUC)Wn0xZcXfR6Q;7 zM-Yw#R8Rp3%1Kk}nw1}6DQbk-AvW$!#!f+10E3+K$I7nc-h|^CyDqC@xJjpz3P{xTNZge6}e)LA^}-IJ3$I`U4krdgb1X`3a!lpSIJ;p;KjO29x0GX_tMvBn;cPN8%7>L`n zZRPXEagXmwGT8mK+>p+D&`e{(cMmLZc==SyDeRE8_K`wl4CJXIOmySt(43x}R&BDQ zKN*^G8gb-QC!&jIwsdxy zQ0k=_Uk3}GpyS)tsk=lDNU#Y>S=!!s{7C879z))ug4oPAYk3nH0TKhr9%Omc?E&Uj zNqn)_InI8R>;N6|1;IRY8>?u|uVhJCoA44^-MscdAbuo?$pMe5pD&dX{g%NhV4qii ziWai&ie0`1kcAKR^r(DJtrwhqn|AU<@;p}ncYyJM<>y({taiI9_jVD@Br!}_}(Vcf}sel8({P>mkE`C*U(9ZyS`mIcAbO*G|vJZsP97(i@2z$Fef4$J78bTd31B za9F%9~AzHD@i_PuXRTr7PX(bDLYK8J(kkQP}hJtYyTF zV?U=2ar-arVs2>cQb2_M35P!8HJjsQ=9!Ou*>2I=CMMEuLZ?=ZcaONuPmVyQnUgiV zu_##~Xxsd(2tQD2D`g&vQw|tRIT&C%iYTP$@O4$s4N3dY*)p6H1?L@XSSw>7+Y;QD4RZF)7d ztp`c4k=s{ymM;q<2HU{%Kl`m$3{2lEF!lSeF3;}mK^6qaSObL$51_2)OQvZZ_9q`| zwRoUtn(R6ew1T67{i+u%kl!3wjMviKp=XvxZ08u_hsfCRNUgQ?)trj<)3kCgA=L6d zRZ2`6M^9(ltx`3KUg+d-##P)8^{o{Cnc!^8+pD>ocKG|CF}mL%lm7rcX=a!>3tZ}L zF*9yb8=rIQo@(+lab;{9j8aN>y4#Y-5j|QZaT!S1!_q3?n{l20xWpjSGvzKX$Oj?6F6%vw8F9_oS}I z-IcVz{oQzEg;AerLd(eK=kHDJ2|8uunp@eJT}r@_jO`7IOF;hsXRtw|53|LPc{>2l z_Nz^bh88h1XQ}E*Jk?qi1req=?=pDF98$DANn17wTfSx8*NS$77ED&GrzN)^Dq={M zwQ<%m$~=Q`C<-W55O|{_=S7N&v5%lYezi6-!aGg5A%l7WpVo|rNQmtrpF3B9)Z_b8 zv=mrrJQi40)SR3g=9uY%mdY)-dv@WneZKSv43I{#FgXf&2t2A=13BWih@G;qByAul zH7C{C$rW*SunY>mTOs&qLmn=k-FiOgUI%v0Er(UZf-do z^q>i6W^K&HkEuDJ2q!cF?q~x_!ty8+4lvyT3(5J?XlQy1h~|_mPFcUoM_;`Z0}PU3 zvh5gCmhobc>@R#FzgD)G1qun?GR$gPwX*kmI$J1O9jS@avb8P~$loguBPKD;w ztOeTGyGqj)$Y`AHBd=0%Pa0N<%H0dK?vo?38DvIY32uk^&^x1NMbj{LL64%0{69Zkh8myp_@)j>|!%+C?OB zOCi`!6&;z09{B#X8Ma#EM&vDNU=rRqO2#vdx!NjAq=7ZuGR)B%S4155ylro;YPuw% zPXwsK-ei!kQ@d~!0Ho4zs>lPLcObwt=uMMiU7kqYuyc{}tmLRhtZK3^jfffiMx0%f zRK-zZD6V(7btK7jNPjr<(K_o?nGo36ed;c^^J8RPUly zSsP<#+K^+*2ce~ORyGKHY@1Y`fc})5u-X|*XyK2(c`_7bg(YlFf`?RzSdnh#GT0=Zp7n2ylb@is zvc+#%X91>*0B+@v>BUxNZVVK*8;XRO zKd2c8(-bLDIP9#k+CwplXeCxb$lb_3KpGR36x2b(b7p|7(3h3Y6z#}gkn=T7N$nDv zU6P{0S(HeU?c^{VFh9zSq=J=`JeG+8f(Y0GaCgWC2OdUBe5j~Bw*V@%xu#2&r4oea-_NU-aX_Mrx z#9H2I{{Y9G7X%!rII8gD*!-3-Veb^HNMsGm9mHqarv&;8pR+ep(CzgrVIKBEA9|2O zdt*QIrE3J>$eYOox9pgfI3tg=H(}QUXk1|X8tIH-F42UXk+Y?C2I|IXE@Qcp;iTov z>Iq@<2R&-1_{vJGmH8BO7M+c_kRsh(ZE=QWj1!+(oEUHg;=mrn;uBdQECp@`i&2Rcj!u~C<+zpF>7Bk1W2CbzRR8HTp1G2WdX;zBh zBjk|HfC=;952b4vFGz-&FWKETXYXE5;%7PEocoN`WK9|dGG-g1kGnzOWn;VRNe+SC zT{=o5P#2C_i8%M7g3cGVdd8unDqU&1#l}uU=0!-)vaT{sWyqS@tSh6M)BgZzdh{>< z0C6q6i_~|KWSshuipR+`Yl3E`quQMtw%Tjh>k*}$+F-?d67RttznBkf(UN_MLb^EH z?#SImAZsRrQix!Ovyd}m-G31KRJi;q{+YL0UZZLxxSLM6j@=upM#FE`mMkp@tdP2L z3jEJsdYUOZ8Mc;NfoEOlH>l3GOp0vP;5-LxJ`8s#;=oM|Wx2 z%|_m3?*waZ>ANzv;UbaHft-AecfwAooN`;y%xfAQ+_$p9ZKA~+bPXJYj+w~v=Chh@ zX%`74w#@bHj;8VVrYIv)LV+x#RvsxD=DirVRyQ^?JX1!>z>s#FgZ8O$YqG2@kdj-J zjur8fjztk}EG4vPUG{%bW>-ZLL`HXH01u~H)^L=J)ROFPPwbYicFz+*5bAeJ$LJ_r zO$qWvnk(7csH9JekT)cr?r=K&D`f;^`3>DN=HpMZYgjbnmE~kD;w{st9-ftWGIBFD zojUU3Xr{T8tkVu7+mg8HoEj7wWoCq}qMFQ&g@-;SP(Y^Q868!RYAzs1q8BrjL&oxB$4(MQwtQh?Y69tylLJ401>mjmyz-v1v(X&b6#BDNb=px z?;~(sk3r}KQbuoNnT*?1@`^Fmtr^H*vO^l2D9<<@f7+;;2#qz?4Y)ZO1v7(>ogkt6 zJvK*m-x8{m_`%4jNwm0ah%mX7uq2*<5$i@w98q+J zF}Eb(s3lbZA1u+aEgcoDy^X#dEj!Xj{{V3AQS#%hOHKA_sS3|)bmzRpD;9V}K)iZY zDnv;>!8}n91EQhF8xT$o55`T4HMEfFDJGJH=i)L?ktdod3W2tchzT&OWq8g{)~6LVLi3IJA2><6jSU@-fLL zIW5I`i)XBS&sDvXQ`N5TW(p*pR(1){5`3ruJY$*wjQh|8j%WhFdr$*^_DHA;O3rb+ z9R&b*AN!DOW0kNo;vD{z0jXhYCw{YEK5{ay~S}9<)R+S-yOUYbh z7CGmjB+)|ybt+v>uOVpeV^BgOaDGINew155pf_;$a2Ap>(4y{UW(qp-b334I@;T+?qUyk=LBb{peoRIu~%%Yr5|YwSMY)dr`DP!qc$sT@&5o3rI-L$49yrE zdR1E$4~F=7)4CD(P6p$Q3YM&W8W2o7h7q`8a!56n&^?eXqX)d3Yc>uPoPDa3zJyXf z^ajj8ZQu-yW6GW^t4tYZ5tAZp$>`0_K9s0sT1~9HggC%%rkx7Nky_hB3%I{{VAE&@#(w-XT(_a}E!^78)SHM$sgKJREb>4_XE-BCJy#w+)|B z#b0D}S*{F!h0KqE_=ak5v8l8k*6Q`6DTM%e1>&K_CSFaV#LF8q$h-_^9AiB?)v9_# zw$MFc=Y?WG!a&ndGlF65E`S7-zc_y>&DR>@D;Ykf<(j6)(jpgCM~ z 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

SIPxBI-#+8rnO6BHVUs3qm>eOfj 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 t5w|ttBtD-$@Al$EOI@0O)mlRi*gA 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%0D73syH#$!1!}h7^o)3qwQN7y3=7OnmjAt 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

+L8f_dS%TEY)4q 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

_wyuSI0{saeM4AbyI##s^YO?=ZCHB^A(|xB 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 z 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

5e95{3CyJYt8InxjATk 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

%?>+yIi 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

*BR|8n&%e~$08Cwxd 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≪Lg;syWH494D*!SewueCfsrf9T>Mdr&JYFpL2<4#`k0YTY088Uf#3XJg z8aR44%r^tTtshYU*02w0KpZ%wjll8504|EMvIj5D8=8i=kw5P$4onM|$#=5zemO;Er*B zl%3Fsug!i)sV^HAN>k7}fnE;7>n(Avq!YNd2AnCJwdlb!U#+g3jJwO73BQ3(ze?oE zv9<0}BgK1RZhr+;edOoc*8B&|BTxc&vpn-A`yw*^w8)I1dXmU`=UVv^q`el9ws5ou zvbZ8+^>oH}2!1LhKCb)n!C`Ar>7jPuWAltyiZq1LVX+jL<`RGla?OIm?-m5HxP_(?r8so5%gO(c{TWsn-ee7?&`TRp z8ZL}Cc@ccLMUg{m6f;PEK5yFCG`&!GEL9TztzZe8sji^QJ8nr-;hdd1lPzK&sD7Xw zPrVf3oabTtR4({^#}&s?On*DNBE#NXf}rhZM3|z*bNI`Ok7cs@hUS@B^Zt=TG5K3n zO zhNpU}s^$sIOCGZWc(QJ40Q*|~1NezLCL0v8kmh9z)Py+z6WH3nG&()pwev^P#d*|c�)_XB|%CeCyuz+6T)mP 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

-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

Rxsb@vCx!q*=)n2@u`Dj4x3H~Go5Gzv> zk+NlFU>N!W(@`;dVtqnCD(FWv`O;{YtF@#|&E{i1Rzfs7I%aEh7m*lJkfUc6gldvJ z(B?-N%{}IAsAW=O&puBORKqQP3*0|qI1Z!aT~$ye|1ta16qF?keisTQ8sc3gQS3VQ z+EiJ@^;OYa@d69989B4XS-Fu!1iVF-d_IAdZTa0E8q#Jm05FW11#nPSlPp?2>_kNS z_OQWragzGiL$3;K2IG~5;w47g$$1z#L%M?>(40&i5zkLIzXD;rTQYc??f!Otx7x2d zSoBQ>E5hh+S-~#In+bP{1aw;W?t z%y9SH3oRyiKNubS-!&}i7m{W~Cg)lk4`HGg}ZZ zCEQjJe(mODTLk6?dw~iJ6e_-fa7p`}S*{Jh@%p=1P8FeC90kPv3rPFQ|5f{l*+X;G zZRKP6d2D)(LBPX@hy&SZ%?k!WO1spRCC{UW>o5QSY#n`JTxaD1U?4^p zV6}oWK2NkqsY&-(qJR=hUqU<8&e!+;$G(F(pcBBC18Lzva4QeS?H&_oo7qLNiE$bc zOSVf~Y=Ru1|Jv{Q(@pN%T>zm|6-qw7PeT4mGrX=H2X>a$oXLO>G7skh2I(PCnur`A zyvy;%J-Y=L5YlhTba~wQwlZDj)XDjH8FJIFCF7HMrjJe>HX|LT3-2}SYwwYizI$sU z-~!G#C}dCa`0~I<2DjBw>N%Yeo4$=jhh3YGN99BjR~orNU5(?plI#A)c_yZ*Nr`Bt z_5JoUFPqB&r1`#z$vw~ur@&e9IxE84m24F$vAppj@0x^1-|vs+mBH72))l8uUd!?= z&Lxg6F|;=-uzZ(u2hQEGF@w+8^T4s}Hdo;LD{f&f`#ZXOH*G)g-S(_bi}BZFTT~Tq z?zS%WjmM4gt`cl;JBP!!hd`K5u-Ppi-|^)}rkzDgsO2AzB;#EfUj^gEwQCeH-A5Ns$c$HM2cd>gEK9ri&5e%EuB*D; z&nu4Irza@S(=mLqoSu%()bFeNqoU5?X+M2ewBvGIyZfZeCXRjZ2Dh|o3&ik`q1(?C zVaycVhSiHPULSC6JDD}uJOoIqE?9IFe?oXu0!?o6J>rnBfh};E_Ub@oz~|%T*icl` z6+b1^(m*7+ON-pEpW52upPKw@XQa}{Q%V3Uz&Glg=93=^66I^0`u#?{Q&(W9 zTdbfUt;A>wFQe~IkAaXvnZV~E!E3(`DtJB47g_ZFjZxoA+Q<>>9Ksck55o zxt~gFYA>#N%@@yuxNd!()b^VB@YZveF5!jIHs`g2ScgFHopv}FY`~jr$4eUcQiFdy zzoXdPX$FG{t3FVJVn@;)op1UE{wMl}k{6)K1^DU9{dsZ!Gy4BA2Qo3X_;=N3p5K#j zefS8$*W80!Z%%nK+)L^{0LXT@kbRaCR69Urv2=qc4yIkJtDh%i(``*AGkp>w`_$5N zXP}T*zjv}y%mX7J6!~IU2ok8{QqfX-oNTOcJC*Cb@wIVIp$#AgVNai+zrwl#YM~5< zy|&CY8AM+sL*-j8mgR4&CT>5pK_`1w&Or00f+Jbfqs#wjpokJ{o|y*S*zENT0lx$M zGu~C2Mas>eSQCFzT>rv$42*3oY-vngY>ob#_53T_35gSs8lXoAxqd};vT9yH0imO; zLe-{rCvVwdm>{jUt;rmc4)WVByinW-%1M|Q_qxBmTK?J*QBnb-G@qR199QZY{SC)D zd+NPgXyV~j1LMVoP&gk4U+6%nBxD@8x2|XK^wX_GfVF4pJC>y9@4}6U*y(vKKHxe3*5nl z%n^S4Yn*eft3BlE00cX99RA%&kFg%~Es`}3E4#SP$Mbys5_+VY0IC0N7yO^A*1weq zl=ZV}3qLRZzwQ!ea}%5YrCIyG_DLZ9&pz>q?7Vd%C&p#igHCh5Ur}Be0W&{ug5~Wh z5{_lMznseQV&j-yX!OUjb$~pezz>F0d&nD3hI#GbjAPkp=oKM#46BxfulFV3rjB(J zy{AG5+L>DXFNS?8@={TK{4ib5 zY6q$`=gMf@mwWs2A_%TCsIew%5m*c94D)aAF`Fs~juKsJ3D*+rp~Ta5AdD-b#xobs z&Z23n&>WGlnV}s)GLzx5ke9t#U`n|YfCk5_mO~ir7S`otH?-)?aybm$Vv+bJ_#bAV z3LO4cA@!qUmG6k8;Sk8Z5v6RpG2}1e)s@;ixRQ%&rY?Z1taB1UQ+H^VN$@D z5XYlw7d{?S@L{%Y%rIF9Iih%tq#~r#jd9Y+{R}|m%9*8iAjFNA&y4wpJP3R1La&*E zsuF?;1*?)=aPR^bXa==LFG>PbOtC#u$M@q^e|Lv?v7*%Z#5>N6BR3~Qzj@V{*YN=K zpP8Un?5x8X{Du?@l1YDQY%Ki90_EJIX5hOLtv>UBUcCMITUAs-rmHrzeT8MRb?q22 z8Zc=IR6dpo44oLf;VRoLVwLzv*pVNhKI1flzo7XBWeuvBrKrrK=2B%SnEHssuUN8m zmaxs-Z`qhULCY#CW{g0U_V!gG3H{r=9bV9cvHBGGNFD`=-y`NjDouZ#fM;Y;DryFd zF@+?@ij4rV`vM+WZr?h~YO$O686m=&T11G%HYc5_4JOtrW8D7=Qm$g=1=#HaN;}pbgXjmt z+bitj?7J{e7t$G3$?g-1&Sg7cQsaaq@%(An?Kgp}EyYJhEJlAQmbZe@%L*oB8O`-* zdBY@pz}$0Z4p%8m4wM!_vJhl62e(r(Y&8cmMT@E_0+I74kRfRQI+3y>3|PxA3{=oZ3BHJO0J>w3h1yF)jZ#Q)PW9{YR!-{tc;S{hIfe2 zGlduT0-fEGPPXcvjtkgbKKrEwwg}QdzN|P+*2{?c`e}SC8p6`ah&k9j^{|E>6|}n* zIuEY6D3ULEc|GNBwgn(sFy&f|8QY>9FJtmmmeN?*CJn{&*w>UK7F6hqD^-zI98iO! z-As!36s&Gor=fVQ;Kl@5fCZ8O+0G+W4~ zPC?MU@5u}47Qb%((Hp<7*$r>*U|oK2;@yTYdM9FySJ!JQ^?(YrWw(zFGR$3KV767 zF=eD;&U*CAOT3c+9y$0WE_40MFA+vE)Btt)K>THYHvykhMy`hNrZspv6MnHRWx_-! z!WggY`W9yr=*V*M>vS&@U zj|*tCMcr13V!7qYI4(?|83@XqLKr-s;|sh73IN<8_;u4?tGkR+!Wd>7sN4LiU2Ke1 zT?#{0oKaK!V@sr)fC4Kr=|xu7<`IiDnBWdhMS*AAtx?sJ9tb;A+_D?2b{geKBZ8Ydl7eG+L7*W-4Z_Z(Rx;9ea`_pnn*&Uf(n z)>Zf6%dA4fy=YyaM9;aRxQ=j(pJ-wTYGq7oa>fzy5SdItqH6gsRmeCsKl(=zlRjfZ z*t~wOO)O?nP{iM8QU~}^!Gl3QhV@jerSCHp&a8xsANZnwl|r)Q(!MmwtF3U#=KyCJ zRz;(5|?K`x%MqH_T!CKzF^k|C~OPG z_C8+L*Ky)xgYkmU%nD``|D>44NDNPm^h)+Twnb=z|}sP|AO*rPfFq zV+s7`4Dc-ESTPLgmBK@R11)b-P}i+G`;aRNtp<1OOhnBcPo-=>K`Y`RRcrkG5eq7O zsj%NaI?B}nNeOf1sU0#dKGmflWo_1p3~+j#A(#DZIgWn z*1@vwc};3NEpXYq-tE`Xxz15x(3k;jR3bBd0eUwzU?zl|)5hdO-T&UB%=Z*bZNh=0 zcv*i5Os6+@a7?^!IeF+{R!RHa&F8Z{cl-X`ZG*W31vj;fYo6<|z85!B ziA`4_zxdP`C8mfR5o~yZO*4hN_Xr?L2*#eqt zsbOpHbAAL)w3jO_YRZsJH(_$+aU69j^OYv7a%@X@Hb`_wKj`Wz%IJ-O3p+<+MB+(?GTXC}({ z>FBZL<)MiZJP?=nS3r4lb<`9-?fnatVSUIYBnq%r9i-ebX~SNwx2MTQ>l)YJ02pnGMO^z)fbu6@eB4wQ?BYQxl=>UkOQf~z%#~+x+OYy zHKNJh6W30UaqImV$=H)=Vr}yY9w4Uhn6bGpB$-ueU(o-=i}eFfHv`}R02t{1+6Mk# zw35cu&e4YE|A!ol)D`U3*^zvI`wc2*syZ4BPBwvKBduFJX>QQg@PNoX!-1k9m`D6h z8!P0WlkE`sexHgdSK7a^kI7RN7T$k<2kfi?|FyCn>si|d-7OYGmV0$ z#1G$CmnK>sY1?1IM5@Ywl+riY%6#=b<8XTgHSC*0N88*s`WH)-1(SpBL#Z5p=R4D2m|yhH80Eng9?T6fbfDx`g-F_~GDds@^{DgBN(njzkvj@aMd) z(cL@Aynkd!hodFD!*XlQd`P3DY09=HhENJg?fs?R7Mr5Ixk}}tjA=+E`&b&5%ZkR_ zNI{<{wr^l6=@tAA{QzlpaOy=fd|{+ua&4BkkPO4{VFv`E15<3VdFZ?XO#f)EBe8L3 zjlLQS-f$5)6s=L5_3!SbF(dUl%K#xnY(O@Tp^C*(Stj|N+YBp{oC4nP#B#TzmA({7 zGw&(kkgdzvxnyA#vqW9H1O6lHDDy-JZ5&%Hbpjs7$8Vo93#`k}_2ssp%uh(r+cQ4IdtR$Be$< za^&<_1^m-i*4E6f44ER6U?oC3APO~;J8m;#1aEgt{x*^Xtag3DLg<=Po}jdmU4s(?^Izw~hGa#EKBIBXuF;BK zuieY|K@9$!#|y^Hi?oBR+8qW}cHHazY_WGYlTO?nJ9Yd@xhMFh8y~A%@d;uaC$3(h zv8fHS#X%)F@N9`Yxc)+2GpZ9D)^dg9+fDd{OuvS7UZjDj+4(0&YALt?`Z!+$m-(aWz5=h zIy4MjvbtuP?!Dw9!S|oyB1qLmdat_h+G^l=>piigF=h^IZpq9-Qjh*(zG)Lu*5U9a zDJkY1%s7r(mm3JFYfK@XV9sjlmv0kglq!;}hFxqgiv#V(8NS}DO!-AWwuH)NyST%@ z;rcu8c8wXULi3=Ai9`Zh#0ml{df5Kt9LKSP4fsXOzEq3i6IhgPZb5(m0TtNdt$}mA z3eTDVw3_`c)dgI`Exh!S)WN(+7HtE#$Oz9(>_k(uVMb++MA-~>RFL3c4UbR9`!&Po z)!X;g>S_1moFq%&VzCL4GXP`PX3Vu`c2W)Fe%`wyN~^UDhDKi8KG;}Av~+rgwW`&X z>yL`|(cc}&NQGnQLzS>r-fCWcDWlF^lkSe-msG1gx|Yq=IeO@-2E^aOq~UN#u!V5fD`H_ zF92yv)*(??4@C52{+K&+j_WBt=IhTZg(auTsO7Lvb1;SnMVot~$`x*k%{?35wl)Tl^qnF=CYT%o|?Ng9vAz@3*Z87 zR6g90YI}|Bf${khHGJyQ-uS|!duCjH=I%bbUhoBfBCf!FPxF2VT;K111HE)KmGgiH zJi_-soS_Z`APn3Xe#Esz9S{uW@-jErxVm{{cFPK{JZ8D5(_LUg^?_ z|3V!uqIVx291r6);ISLzZe;sLE!aiDUlJI*9!|v8e)h06c@>BPx42$}8J}0DS za7Jcn)75WN_B4j=GuM$;RZuwzA+fo->4hX!2w%pcYbYIo*e)~<)DwoI-S9vw4jQiB zx%2z%rbzywa|n3nOME8+Kl<_Lvhx`rpFopekW{R^9o4{nGG!vxuvoqGO}Es0_mnR5 zCj5yzV>eFXt%T3f^qz6|^O{e-M33e46ZW6*04Mf_Eb%AD*8B6~{cB3`zjLwwnt|n+ z;(_a(JRz3SunFJ7<~otP0sLo>N^%^hNI&L^ z9Y5o6*#9|5XFEIVe;2sOR8`>CGkE0`jOcC zXSYKaP6XRo3%|L@5vW_SaA>2lsIzF&4vF{nf{@>X~QBNc(ty!-A%hIiS6 zTyOz)00J`>ZEnz` z^e|*>4=Kg*T8+&s5xp(yhiQW>bIHgQEuO)YteSpb5V!P?HtT)AJdDD#@#i3EK?!PM z-i3Qp))6L2c>&(%LmS@yRb0g(LxmbyZcjm5`%4M0t?3-9x7jlg35mMzTUxSOgu397NkK3$^G#Ua&4ws^h?%`EF_opqlPSpBPvFTH2AuRBp zn9^unfp$@FK|($|49rloaXc)+28CjW0;fyiE&1GbLDS8NP6pGEj8yrt>xgWGx#?%@haE?H7v>V8H43cT{16*wN{j(B16RFt>xu<4O7Rq*yg;d z3~*vrR~G1w#D)e8f@fC|UqliMl1H5eZ<{*Pm?_&<*lq!D-o$b61n;Y-1q1Z&3n{bf z_6htgQ=cp2o(1=Kxe}7mtcx7gTsrW3Z5v@#iDR@`G;QqNa5W*dY2keAKesXZvv;R; zokYyZ_^BjCdTKVLY(??AWpz*(Q7wU=DhBbsKfvNnM*`MYo$`1i~D znr#cy@8c(q^Q*zkuF}nawxlc-ZPm`w?=n2lD`(ZrT9uOAwInQ4ogu2f!$Y@fi-DwjtuU2K}WT$IlcAo$NeDQ8`P+F_#FYH%z z51pj}O)xhX+mfx`L>fZDqqumO0ffVbGaY$3pvboq2T2mJ;p@j%+)OmfuU1jbUTPq- z??~kt7^VdSC=u4}7$9og#VponaI{6dbofx}OJ<4`Mk=%m8Pc#>l62NGG@nGFX0Qyw zZgx|N_QxiD{r#~2STuYy{y3cuy@1#!1!$huyTAQg} zn~e)6UfdLYzyZOFP@` z{@$EmMD}C{l}iUkqxF`gK8t3ua57tMGjbKbQccsPJ3->ocW z{)AvT{135lZCtyMF4CG*MvZ-L`Gpw%yaVZTGaMZB5&@ZQJJ8wr#t6&)IR# z#olrLidYqOQBfBeE21)U<@>yiq}kRjO>ymWR_Hq%oi@jccBtzSJ{=mI_?B_@x(Mc; z96SFrNRDQ~!HxfdwEu6R|L-6f{S%`9#{`2ure8i-2ubYb0o_%H495OBT$n+Qml$o&OaEj(>j}VSaaBH;QU01=Y398;TKciE zTqry=PnMnLM8F-_4X$&HR(T+S|DArlrULsKqzV*#8!k~)Vp<~{5ZH~y_pck< z;>edC!NB|O&ECPsdtOgE7ogH0U_4qYRENsZ0QwIz;&j&x1Wck_BwHNMm$DCxDZ7W}4C(g3tX8kB~vzgjEk0?+6rz zn9%%<0~wQX%`^dIIXgbz|F=42Qoq|~&{}-z+as=!ZF_t8*YOX9#4P#n!s{cT* zN~jMfjc5ao=a!aeAYhA-t3vM?4-uiB1XL5WXIZm&#U1Xp>%=w4LzFncfd+jH`RQRY zkMyKUhsTHLx>#a~AV5THw*}l6mjz7Ha5Osz^2F$7`mxF-)hfR9pQb7f-J>piDQXmF z-&P)n0pN5#_n;s3d$y7pO#*w|bv+fe4WkrE+4})LS;# zAHqICvDI(5&2#+VSf>Wt0VPOkN!!2!D3nT$)#{iO+)%2(&AITmJkcL;oKk}0-N6GLu&KNkxU^TRJB%q-X#={|mM80E28P#h2 z>J{OnB>?wnb)?tZR7d*@U=aKUw6o~mrH;(Bz_{b#v&238hWb?Zm&^8XBOqb{dz@T- z-#mOGoOj|jFe?a9?&C8Of18mDb2uK0z!S%!bDV;UUFb1L%IP+%uN8=-uWSv2fa5}ISml#>{b225|7Uy;tbF2DzZ5$p1 zf4I|sL;xCB#TmD~bHkrAJiZB<`7f<1jATOvhFXKHrUPEodW@lONOR`~sO#d$%sUr0 zY`HL(uzVu39(B1VAU7k{_}|BB*t>Xrtfpb?Y9}I2klw6F1S z%__r(p9fDaF5DR;`bUl?eM?eP))>XIPs6oV$+m(yAU*EeaAg-HBG2{P>C(11-sNz2(!$k2$U3j@-&2et%RmydHNn8<~61dKNgm%l!j*2@xtWn z=)9?dTODvyzoZ;0Q^vZonxUe2e#{a9#{L!87TTe|PTMuFSWgy|a2R7A!>TF@!GyH= z0McMkhZ3h{XjA04NCa=8+c@adhclDx95CS7${eZvknKO>I4*#0UVN`pb`{+v>Z9Sr zcSf zFPbU=$T*2b;&|J>xLM-%8Wk8S_8#wE4d#=WL}Z9Qs5HYXy?UsNmDGyFXcYK&#{o-8 z03e^`1O$cAeswTwJr|Y%)uB1FvMG+OC_DB4;@4e6%&NY4%V2sp~xO zM8Geelz9nn_u6fkgNZF4qDv?PJncAq8W-OVW?|m-7iP;h2B{j)!l2e-H-w&I;IyWv-{oNKY}ih z%WYLxs5TxoxhsYk-bsBP+0V$Xl$|EX?s1LMxc|ov7H1YLgxI}6!jS>aePH_OmDod< z`!P?>1-nw$7Ayl&GP~k)izx2iCVXuZpvlE88TE zV^xa}CLs|WiNgq~_Rz_k?S*woob!TVvL3e3S{ls_%x{NN{v|=x2C2P|fxMt_MSj?R z7G9+uXsIxb)xAbEqBp)Kzdo(I;AhBd#{*z~uwMJeRmjUxRLHW~eu#$2go#n~ z#WW27YHY{1B4XdnDoeR|lEwZSDsIw%`LEZ1D9`Dp@p74Wf4}uD_+D?Nhe?3M%)e8m zbQ}g{{q`fTN*RbTb}u#_74yG{??Cm>RzB1wspNazeT{UX4cN5@GwO(#T(Jz43k!Gd zE^ok$RlVN@l5V+`I>Y&hc;?>3%FRwsKqwgqj5Q;r3&hl4keaON-`oW9Ghu_&@O$jg z>h!f^(Pw(GG^b3EM;l6!@U>ZV@DlL-Ipz%yIE9hdX6l8})ji)4& zs`eFPG;z+UKX24iuw~AzbO~B8<#ht*{D7T@%9hCwnv2Cr5Fpd!6l!3QY{EthSSDh7 zGW|I4U~%~waXt0N?Qe%P_!Z{Qfj=#^74P6X*JtNoK)T`j>AJ+&x*^iMamgHegVnG6 z;j*w^`2)#OE-e68otW9=FWnMah)7^(pG1>MGU2a}2x0BdrJIHqtCbqV+%*(P*P`p z4gtWK(Usw;@gx(PYpu^0NacZBRmckaBUJW@MBoYIeNQ=qLRKFNM#_?GdpXEaf zg1#lhIb?;P3=x4udQLTYDh#2fHHPry!vDz)AK&tpoC;scPEyDuoMg zW8kz)ptrlBqV1a)4DS<)-<3*9xhmg9C=`Nk_UKu7KMXwq&MxI>HoNkfbat~;DqBn* z`^%Xy0A%NL`R%_Yi2pRo|E`;gOM(A>_`f%d|6QP2*_+t9nwmK?s;NQ)fhu?6$?N}H zYVKe_-#_0!|FhB~qS6(m=K%uJAp-^?`;Q+oHFI<_Gcj^8`_I_1D<7Lb8ytXJixZ7J zeFth+^fmd7ZnpT&HL|T^ZaIJ)V4<{hd{R`pX*z?XnGAi@?tUk?eOF$QlQwm$)$5rJ z0|>z!A}Af032XDs(^sJP_v@Mk=a9v|FHbE%8c?M2yMu~CP939}t9l|mjnb9Wm#*^c zMNNBUUrl>SlN(Ji8CEGbHPTyKELwB1+;V1tN8A!ZOj%Z3KLvBYsj5z&%p*}<9AH`t z_-A6VRW$BGl_MJccFHp8%uFGr#zSiWtgJUFgtNxu@zsHr>?5ZDcxA61K*yO5nwnC z)Gj2`8fs)dtOZp<&7n8=Sj8xOuajK~W4)fl>}$uFAl@YF zx@;d9!uc#ETeNCz)$Vgpouf4iD8Y#2wt_0O>7o6Hf*y?tle~HZ3&hPZE>r!7s-*V) z@XA5Q-0!kFHozy4pRjuO44+Cj5gcsb;SC;PW*=dUd<2LdRP)XoqE%4zWW89rWgi`J zjSu%9@qNFLfcG1c{QF;163BLPU5j7E6bdNx4~pJJarx8HJW%I3CYP4!oRCxs>kRnk zqvRlnvG^pHr3A;02{}-}TNqry#toqg>H^K2=r~+AnmYWMU63$tIM+o?&0cGWaLGsAV6v|$@KPgOQ z`n_O{VWDzK#f#2gqW5S-03cl5%&~u5h$4*5IER$Ab7q*}20){1`ZM`c1yswAJ5iR- zts#W56QFK%LataF!vEec*)@GUJSl`4iRtwh%zoq5QbjK_eucAe zOzxSO5T{@BpdVK>z0ww7>j7q-_bDuslCBqcHT@@!4@XuGOjBxIxI7UXE+kUL76?kD5XF*&RU1H8 zk%>vpt7#uF!gedECTSMUpt0fzwb}u25|kI z9}`Yu%T-}QDV5eQ{4BXu=)`F5zFJC9xnP-lCz5RzenN!^(yW^xpL05tAn8a9f1u&V zzmgO^hidvG0%kMXCK&asP>@eR#ja1)>^4ud zI|pMnZU;4=J$Oj=uStR>gh_KilYKHyc2)oC_z;i*2^DC;^JBk;@rR<&3prz$IC7pj zx;boLVNYn7VgXZdXK(QesMYBl2XZRAMH3-W@y;Rf>{l*BZVm3VdhR@-ONsX9x_ip? zm0^nU&y9H~$>9r=j31u@a3TzT6AWIgh-?KK7e&H_mX6hq2^g%Xq9!W4=8*zPMG`Nb z`W+YJY@Q|`1MX#snnOFcJ?`1h{(WDzBTQu4SxN(0Ct(_aBuHr-JmJXxZ>^$Cg**<> z#Sxer&mpH5Fmc3<+jW_OU=!-UXKPmuIf_AiKFP=XVt6lpgooF{IqJJ<-zTy6mP<^f z3srAYkm)X48794+y76<%i^+OzgCF0c^S|ky?927A8G{zr(b&zaNhI+b}NB zmoP^(U3wHh3v3F4+U%_x*nLGkH{6cyR27$(UC96FJ3GHNuZ}gs`Xr}ec-<}p^C~!x^bma`zH@3_4h_()u z*TbkDp;Ps`ID!>6zmlTz-Q8hO5f>dWpJkYKN1RTt{1L-iQ zz4K!$(Q8EvPi39B(d--G#<=Vl7Me6e;5e225gM^2^7gbmm-7TumJ?}6p+o`gLSJa? z$hRSxDal-Avy+o)zRP2jNm#g~G46G^*jY(RAW3xraqymV!)*N15iaY9$QtSkO*jS~ zLrUf1*(sy>?o52R5m2fE1c-*ah@YKhPM@O%%py(&G*(Q{mQ*>aOs^UyK;Bw)2^$-r z>1_i-B5-AUsH90)C{C(z;D(9{i$JU*EPP0^sG%SwDhT3Y>@bZ`r#YpGmya+X^d-o$ z_#X=oaHg?9W9g$0u!FGB_@5wuu+1_ATf4>RW{ z*dVFJV@>alP6$8v?=+bRfzQuVVLL{^1uwlIY}7e1W6*0-F=lAIU|I1?B)~PKDB`eO z`7LP*(qS$SM5A*`OI73M)I@xlJC-4I0IaB5$3riP!l)r%rG0}B&}wKy^2$Qa(^Yfb zzk`XEh9#8V2L)#YLt;tSE(ue*EP;>(#XCmI5-CI}1rETb zMil3!+nX&GpJn6XQ87>X3 zs=8o?42aLL=GAVVE()rkFa8@ff^kGGDVTI%0FZ9{yW<8Kq^vLpfnV1Z+hm>8cepB9 zs>U-M5Lhx+2L`8oBQ%XH?3YgkB#WJhzBSIu*FKVwNm+zbc5*sHtd3OF8a$XUVmxWp zgsb5chESyZ+IeRV5yLC`9e4r=&+cShoNQr;K6SE)igfhp6{3%bgw<5TG`hHsa2y+f zUE!n6G?%^ftKd(*yyG&$)-YlHyQ*i2>BD^-h6DGYadDQq%}k446tz)@v!;`8{;Xbs z&4DQ&-Hp`nghX8s$MH@f^FTdLkf?Gj2KOut)JQG-d%_T=6&AVFjoO3h$~bMLuh^}9 z-=%Yeq)P9Nrn2!j!D(2NWM`V1oIjIWDhOc_al|A=wHk9>vet`$T9@-Nx=U=4^~&&* zvA}HOqU8(uME9CF{Z_}dUH?*MK(1QS(&*&*#&yVN&1!VGrnTT9EBsI`;b=VVy8R81B&TzZMX;v3x!G6F@9XS9=lFi0_O7dg&!0s>gG5CN?Ve6QMH(}s7ehZNpTO|7t!-1V2eO$ySe z*-XmB63jE^e#RrgWvSC#Hi%c)bi(-*g{|FQjLB&QW43QLU5ebYVPhE8#Lr~Nw1jrm zLh3$)gwkNJI;F44%OQh=$?EHY_=;OrVR?l1r&}Q^$dL* zy?*nR<~Ghnh$Qizrh?FOhDK|trl5W{pL%v z)!xCTJV#L$mcX9DH$d>wCUT-#JH>iOUb4i6)+;WubbdS&T^6#oS+W*d^A+SN*$nqt zfZJxhoj%>|sZsqiI@$rgQZfFl4T{89AB=89bws44uY-RZaGvHk+-pk5Vo$2r)u4O^(OFh40Y|9~^HIJDt!AaNMP^lX zN;)&SGGkU(lS$mFc2~g$Jn+hS)5V~<lzvi?EGQ%ej~0P63cB`Ns?J~ z{l%nHb{Hefd%QJ}+~_ziRy~0{#|5{}Z)f&4I8{#?W$Ld~InSaiyN@9#O$!Ok%`9|9 zSKUOYnG?Z{pC5(F$2+w3ac(P|D%UEwK#p1177pET6U%e7qD13X(v7v&kQU90YnX}; zSx3XX-$1dY#wx_ItaBW5_=ZqfqI(j-UaG@lQbp}pjwAkATcHG1j^^7{y+Sf9KOrsW z4(wuhPTieZVl?>ZGg8SOw0^Vz;gTa$K%>+qu1=y*I`ytYy6xl$U#qizpKC>`PyR;2 z&N7Se@)U@L6P_V~+!7QQI%Zx%0=dNj!PGWuaiMO8={+nCys z%>sZw*$C#U=zK2>R@?jp(s#fASB$0R8bfR2LIq5^pi>Ygv^}v6->&UU_kbE+e97}! zqXmeDo{co%gq9mg!*y#ITn{sj7PK)^#eYRB2L-P3X=LQ;0pka&8VIr7IC7PAP=>qo z6|Y;t!I#Pee1G&>O=7$~F_eU7q&zB|x(YN1(ZwhB(TIfg_`>SiJPC2y_rrIaVTNhF z9{NyNXoV^I$+g)MEZLYXK_GrA-+W87-#jTy$N2EtU(0Czz6ADz@m|;T=IZGNctR1H z0mWt$zDZDm@vm=X9WpK52Zh01<6x^}zl^_|Qc1-}lczd=U@7r&mD)!zU;LFK`Wv9{ao7yYs5ymKhGNlLc@s_o1 z2NA}T)!Lscb;HFoS6a`?!&FCX=p)k`FQ}$n$U(ZM_+~e=knXu^L;ryt-nBt;$b{kv zYb9;j&VlNMd+e=A5G>Wc-0Jbm{B4-R$I0Vmjo*hygK?y9IOi`HAC6%Jo$NJ^y~fTAQtjOxte6^9fGvjvUAE#Dz7pLp;QhY?G!<1=C&Hg zmb6{Gnskoy%~B9Wv<8&5Md2XG-iAM(p8_7rGaF3{l%W)({S}Q7m36D$=75fD^N_p* z5C2F?zbX7(Hel0Tw^7Cw70{Q&DUmiafZh5&wsLw( zRiJ?8?(Hb_SU^m0>t~?_sW}U$G(O-*ZD6V6i{}36K-UWRKv2Q~zN6d&;>zsbDJ^AE z$;+G_I`I?WIal%f8k?gA@9%0dn|HKUs}1HPo1skym0Jp=d%nodE+4SD`>>zFHtsL%th|k;3M02d;(5 zEhF`#!=|k8T=_AaS!bO;KNxDKcjK7NTsC&vH z8>o^(I)5VV+*1|iL$rwz$77@XD5FHRe7XIL==xLv&$GfI8dk9JjsVSuMZxC!`fjvbN0K7 zD8A+G%R4&C(*m7Ut|KJ1V0nc+&#D(Bc)j$VA)pbAOONm}XkMX*XM|UEg;xPN9oyNJqZlN+gPZ{dhYA!n*Lf;;|R(Xfb zOn2r7r^^f`@%3T)SV^G|ccFa(e5R(f<56abu;2V83#th!b&tO-Sd{4xufbN$mUPMJH$jb*0wHew?7F4!W$B=!!H^3``DMcpm zGlbveAmLnM$7u1hG#AHS%l=Y#SJhF?zh>?7u9W;0Dj+PFJs^3k*Ojozy~K^+QWSPM z;=!pWEwQBF3Y{lmfycR1u6O4<2i=9Aj`FJLDOk711P28BS;|}apHP83?tGd2^ zL0ck_*V4+u?~gI89XPNw=8bEDMliJDKbm1AvS6`2Tm^B)Bx2vYpn3#?vW6Ujxrt+w zr>WDeC{+g_&>@K`d%0ybMR%h8e#xrcUlxcxUXC~IZ7+vmqqAPQPs5xFxqJ=urropa zpQ(px1BZJ@@<)9=t3RM^`ew}IjpN{-EY&^6-w5${-QlO78EI@Joyf5d!A~TOq13Wr72dH#5M$(KHJ9|tC&4Depqp>VYw$|^w$j{X;6b$>>AK9Y=blU%k!{Lvq&4k-;4x#r_(;6P&Rg6pd%3>E!lcNO}9c_3fUJ@CEVw>^-FN{Ad7b&a(m z{lyQypnMG%QDEWoDr~SROLYpsJ4*F?fIv9!uX~G_av1PDBL1l1qOCJyhbc@G!^^|- z69V< z$<;?oU8S>|2DVwjLONw5x;?Lyf$TZE%pogq_RQ{9X6bv+hfzFSE=j`AkO_B8p3_%) z#3Id4!SpKTiuor$PZ4pcmB3tKn)}z$ifv2-82ougpa7>b4##r!sEOe(4Xt+?SC)Sx zQ(-xJG9yPKz3#!4r0=B1Mw(~LKgA0`tav-;+Qsyh6bG#am0ktlTQVCU6* zlCbS}1L)n**S$i_6+ga{ctBb%Y7ReWvL$ti~B=gvVCzu9-e9O=8c zOc!|Sp!Q&ufSa<$df34a7}t3f`5dU3)eiEUU(Oaf1&9B9@zTM-KR<)5BxUw8 z{N6l;YPzaP->(y-xW>j?FB#ZqhU2yZGZ5VfUh!+@WBzNNxmGdph-6wnqH=_|=N!W$ z9(d*$L~7*tGAmZU7fL>d-^Pr_LYKW+>Z7n!&k1(b(HF6T1DYk4T=L7eb$LO4$GIt> zV6iGMeQfE52R<0CX2?#ahinQyY@Y$YO?rkth|WRKIOlrAV_hQgRrfy2ByARTv4MLv z>I~fw;UGn}lm^XqI8fi~IHP+^mh$|p&Q((0sDx40p0Z)Pu3!%Rkjj$U@DH9nh6e;tofMb7hmMkpql>DUv#EMvk-W)p^3<(|Y$ zW_mDz8>8(neK9+mhAby9%ge;hi|DEO^%B$R-_X&2hY$6b-T9AeW|bsY@2tJ@U$S;e zt5jxr4dURjCyP_p>r;Dhp*d8m$VWKl^%}gRiQ8l7AV*Dn0(u}UR`$==t6bDv z?gNT48`Q6)+Srk4*_<16=9kH;O7jwv1G~Qrb!8+WC5%D&yV+G%j7~drT}(U1C@={{ ziqv{}<1E3g+l4CCJ5emb9q2tc7Tx|nEFU=HTOq&=ybpBoi>??RXW+Srr6WRZH{z+3 z@*)|3oEGVXm$&LkGXd+!c$3HL{bSc1)RMLdtgNK2({r~)cwN*@Auor$e4BxT^(g#v zU;5b&=)(C-m7#lVq4fY)w2`JoUL~(w+5K<@TQ+-t-|s;GNNKcZ@5K}TqUL6tR2UkR zBpiC^o-pS{Qcn#%0)gef{$&Wfs0|_`<_3Mq{^p0D@0#A*GiN_MaCE6N%_?b0$nOTr`$nC0Dt@Vx zsaY_tih_5(1_OA~jD0QJT5egjdYonH-`h4?S17I3MVjzZn(D3lJ5Jlx=4qsrJSySI z22H;d7GQ3eE5bmMqg@YOzF2c_%h3k6Em5anXQIsTy8lA%*MdM^Y@cOIYH&rVgqoJ+ zwES(-a*ME-@7-q3nXU^Msr0h+bAQi{SmI-}xGz}nT9$Od_tNn(MK%mZ4cDwmq@ujA zAAu68W@i&KOO;oBS7A>N9JpG|Ncl>347s0(?Bn=PMP8T_z;rc79DciYbDUx^nB>$IEsXNbUor!!F z)ME|JjMN#~P>ObWPc~XjtyXZz^!<@s!~|@0hO)iS+jtzTR>?VSw}6^?>zHi(fz}T5 zPNFHMj(j4F>JW#!D#~8^QqgGk40R%Kj?BW}LTx5%mb~`bxPxOT0ra4TD-zd?PUh{G z9ZMl^8Wx6ux{3s#MpDAMfy(w~j~aAxaS+yh3FNy0TtOu2r;y@3{$VtLOhGyMW;ntAv|Q4w6LW=qf}QSw6}u-V(Q;qSG1j-0S#u`OC>G$Gd~@* z6t4?YGEUAX*`zb)4mpGKHP63=+=Y&sr2l+f)tU9#*n&)*Il+n3YB^cp^NoU+R(w$D zywG53mZr{qp@9y!LEKj|*@Z^MGiI92o6$l)VA6^u;hP+o5k<;fvR=9^`TBEIk?1bB>op@OYc z*+5@xFN1Nv;M85iiz@FJmRc7vN3r(K*;2+s*)h^y;cPtJ9K0fOlenN7nYEBdWcr)s za^Y73U2WLuj7_4>x515_MSa<35}nD8pZFl%`Q@ptP{j-sTl@*wuOm@$`?mYRL++IK zNngbkf>Yps2pJ(-?v?cvLH-d~Keys%CWDn${2V5%sIRk26Je(?<O z1m(_0bffpuo_S`41Sf|GL}BJfUTqGAICwhXf4ZF=1Aacw6j;_&-#ru5S<*pBULJ&> zouK&g5As@5#*#0{jH{ZS1{F`u^aU z1w06#uKj7aD!XJ(PMk`alJL>xfHx1~H~X8mutYE#;*nzf>Z$F#?Q}pj&ZhE+?Lopi zg}!tTQ>H=YA4SG)<9fBed8|v|P@UQn0ETmRfP!C0J zl=<2DI>;Tum$3QCF*YFkwVj>&p48N5*DuTx0Y16lkk!5k{S=@}IC<+I>m!X>_-hgQBt=u;!-O4nODKI+L+VDw=Eec@0BTW|A&L_b)+GQWLp@Z3=}EEwB(|hHq2X-^xu$im)OP0UbQg|`{VA(`XH|c0|FO?da zMNZvehWl-geN9r4jsODH#osRs_sJt&_6YaSXBq^(;9IM=umn3PFj!_>4?-!4zJaje zyFO5OCHn)%CjUp8b^( z+DNSEJ~%g<9=HSb9&U+vD4a%Kdtk*;Ne@RrUQ1q?M?!DSzRAFIyw%Nqr}S4N3-W`m zN&Qec&si`woke=T&p2j$rI?ykyySwOfZ!Y8>%K~;Rxb6)7wH9=qyz&axO7&$2^P^k z*0*nZyLfsGZB{VAwveT9=Z|@R^?f!B|294NA>SkJy}PF*aYDOab2dByVSy!*Ik+hq zE>sEm3$1^3ycPQ~6N}+mlXgJ?LtJ})$X0koO&xRDUHib28ZRCJ zGzPL#H@>I;%<@MOutfbxs7OiXM9-L{;2A4Hu7RaA1wbu z(@1I?q}w7P96UF48S`%tQNMaIEPSmQGT4y&DhSl3LK}M~;@fzyeUQ_2-RkuEN+x=` z2WWqTl9>klnJ0C$ioG0PVO1(MeLaeAl$da3J)>eMf&=<)c@VIY(obTDtFboWe zm$_GBVPmUvgKNmW0e>hiRd+Qme+4P>rz7XzgqCHyhE>iCV7cI|V+K8P_ZR)UFxzR# z_ma<*8Zss?A5qv=CHf`H5sqW1TZzM;a+@PeKCjMbsXjR*BmYmZ2+9qv!rd@WheEW} zw9*6WiEZcmyyjq>OJqYoX5X zwML6#zP#)7WkJI3Ayn%nbOO7*u2vkpPWatYo(Xx1X_E1SU^s4S9NhDK*x=dfV&sON zde0GsD&N;VxaBc>4a(2sczEgkrqY~XthXKSV;9#<+>5&c4cOQ6fK$%Sy$z|$$q_nE zDyf8N^^uFMnWoATwajIqE+3amcXBj%Q(=$esZa$q0YPhW6 z*PA|9rsaCO-i-$Q^@gM6$tobudPBl$V4aS2aT$CT!FJD47)$)_tDs430#Rg~S5p?K3}0o-B4rx1EC6J)lR(+>?#3mjcy#Zs7+ zqHj1SBVmXLkXgT*ZPvfIMWyQl@C+5ecA=Y!{1q7Gl)*m$Ld6HY({E(HB?W8oN7$01 z^X z8u6&#;Z;1I7kr;{$~7T33}#o7=a(JXfAi3(x>J}SL_V`L?;MUqe}{)epbn(rQa0%H zW;Ffk`%C2vv_*hnBm1fPRbh3)hK2Ph2|=ENckaQU75#J&ere&pF6Q$8dQ!xarG>gh%C+P$$TML|<)6X94fysWc3CAa7xZwGZd5hRy5_Wg z;c!7Fq5D|HO{HRu5Ki)GDvvz0n;2;@tE^o19s1r|q^qMv)eRvdv*#Gk^B^T97#e@n|+NX_|xv)!|Pq5-`DNoTaX3luVLM#$J-_+e=SdA z4?W`x*l7qQT5>LYo1pPH%AJ4nex#<}@fXN79gdQwS+Wcas9nzi4%%eix%N3J&Z@T1 zxh&)hRwL^&L}a@BZaLMA{JNM*m%rul8)2OV{ZmSp<50CC`Zp0Id%RBPeP%{r)1rY- zo@R0Xf_m)NaGe&!P&Zj;7u9bJ;~AN1HwH(DK8QgE=$flUu?ZG)rCUYhSGxpWM~ZUH z+*i%la_>w(+&84m)-^`VDI_am;b)59inHp60OWqP@0MhWTd1+9#}{XDs4bt{*iU=> z6RRDO&Wx)3HNbc+;vZhjF5ON&q82HfBN!O^RyX?QA9MPJ_4)jV2M1iZij32EJTR>t zaM7ELfllTu%s*F%;7=rSZiu{dk=fs6wNCI%Q7=A;)c6N8h247m7}qx#JpGLnvAc87 ze*qm@MJ8GklTQ!LJ6kRSE&Xx6FXChz!`mFcxPw~uDjX;K3?R>!AA0NoUJ;nUv zkrplI(#S*5x8>Ndk3I<~&UTI*lgZVoMg#*S3g)(aLdv*Im!$L!Uoc^Pja?_lG=bC? zS2E8hyj(Nhe^kMGNx!Xqe*QC%v*U{N^|r!jgzmO{e9$#a`=GKovaiqJZD=J2ej17S z8V<#N(Q{Qrwt(PA=OS7XUr^z%p=)%Nu za})4LV-pXkgyEXdIL=j3aA9u;Bp;UQ9}Rvi^Q4J_Q+3*vC0H55jSM3X)<2C$(HR{? zf-&ZGC3>8E>#Q5z^7O)Uh=@Adf5uvtejVfq8YH*R+gV~#7)nlPJ<|eg!MndOaXF7A z=-Q2n zwn{eqy@Rri!*o`1-uk3O{()C1?we#<_6+n&rbxBU1PEQ9@Y+2UqzKFO7AoHGer_79 zhgfzTm56ca-xq$Qa?m{uepCC6_|-a`_GlWNf&_i((`VCy>1cMO#H{5P>y&V%aCW8? zKb#yj)9bmHfYa;cIjjKo%o)uZG1BP6p5Irv%g#1cvrF1+jfm?LE{Icu)OrRA*P{&I z)-_9u{T&V>AAj)$3Z5oG`+}u_F2<;=pQb!6tOXaK&Yvua?5ExZH8j2M1MzH229y^n z7FPOU^;2`fDQ$+S_>Bl7Ep#i*kdh7~%9A7A^8~*lF zVxcx#wDF?2;OiKS`#n7T$k=~-x;!}CO>$yyt+i0GAje4bg3-LLPE`{>9XNu{ zO(tZC=v0N`a4x|W87(_wjpu_Uii^WwpZ0nL4j3f6>kjk=ka;&$xBguA|3SRwhva@e zK1-CWP>0WWz1x6PAUp*o{3|Fwyfyj~GMp*6{1G%a_grnLAOb$fw`Tw(FL#*fy1*j8 z=+;8XoE0+kPP96kC&!K09CzM5Y(jCj6PdI<@UZ%uaP{u9|9Ogu+}gbZ>yT)>_2qDf zK2#=5CWp$9oqybV7DWh&5PW1mEo>rZAwI`{zJ*k<`+IIudQ&y>mbOp3f8+gYuRI^H zV5J^I->4EzDO>vJ(pRZ!e@{+AGK?JGikN}6N`-h{RDrHw8B&ON!}Wu`O+0kMC9{s4 zU_<0l-9hIx;j4ym+bC_}1Z-C0^uRw^FUv|XtI~F~#OHcrc>wPIuK+NHQeqDHFTTzp zIwr$(CZQHhO+qUhbVxwZS;!4uhJ?mcU?>jovJ2>awb)NUx8!5@vocv3T zzJa;xM)-5!YFkuQm?&g}-oOYh154z}Uw(#m8i}aKvjnZaaYfb6Dvx(5xcp*JRufB| z1g2I~fe(gfM99wVpAV&EslDAK*RSFb;FSN;Ds>?L&RtyI*;~ZQo0|t;^5fOqRHY(= z^FqWwBrB#WgJaSb?EN$I71_4VSA{>d?(g&Y#qzsVY4narD|szJk2x$8AOS@ ztvq+qtDnZl!#1z;^hBj!u}WQSy1&AWvj#=2deAH`dgtD${$aY@D9ok{~j^n0CJ z*2LTjP1-NgJKMcI7ndT&7&^rS*t!G%kRKB!WLjf$p5cwec+iYBLX`tVR1|G;H1$&H z%!cX+jESK#Aw+Fmaf(O3z;JTWICxvCB1V^(C$YMWc9NBWS|FfVY&m--DbCF=$Bw|4 z%s9D}uXv6w8yr)H2|WA$utuF~)D1SL5EWmgO^0UxDP0LBl}4`4e#L1#S`3!VcQWOJ zw=Sc>MAO5S&bxEJU17fiq2r6qLXv~#<~fNj;h)SRW!;88+!Z4^7?zEd(kLSzs9<1t znl-smsS?%ki$f@3Hd)M)+CE=%_Xtl92WOdQxxLh*CkIWEi-uyKW$W4bH03~1Nn6XJ z)Rw$~Pdz%a9ksV7Y*9dko2<&(50ZI)hK1*Xh0`LYYxcb4QGX8ID`j^y{g71-TebaA zU%9f8XSO7QLWX&UKp5J$Y25wvj2k*z-Z`?4{HGo*L5BZd_!Dy)y9_^_(5UhpJ}iI; z^rllzVCoxr-z*OoN3MfepW3K4_zi>!T=8-m97UMf;ky#%<(nc+E)xp;?&gW7JaJ+b z%UAPhjYH2Le=`;V{pl>XDEM^Rennkf=|{1&&w3*8@CDmQ5)a-+eGE^-K*YO%0gfp+rKQQjshC&c+5P@w>$wMZ;XgZa%+ZaFs}l%5``sUJr4)hr0>k|O|N zXp2r^KhP^iHI;dOuTF58h>MMUd)xgNTO8m7w!8)u6E%`AuJUXAd-EII^>+Id>vQzI zap<*OO1L;q93saBo*qqJK}0jR-=13awqT?JQ}#{3)0c0|)4}jit*i2qRbXsXSa7<4 zo1=XvhrB{7`!iy0qG($~=GA5k0du2=y+~UjXRb!M9EdQqbZCp1etApD%FQOslG(HC zov3H2htVW9^Z4uljd)%@V#n~`jDGK^8H2p%F=vHT!gC&QFY#zXsWS1z47E*m>peJG z>S4Q!tmX6UD59f{V6Ym{Ht-dEy~U2zZqskV)*k2iJ?+(UiZkbMXmr8`pa!&%IX;;& z0*oJ+pOIjNpZjG6fnD@xwMEi~9#>sq8zD^`vj)}vegFksUs=P2lmCuIugeEyz*f0# zy~!OqE@+GtD)wDE%3miZw4dZ&=}V|`%Js83?g;uO^)i$9KM0>9xdoo^@6ou9X@@Uw zCkJl}Ax9m5wxVN+3+g^;2c?LEINE}! zL}k{t=GiWT{3tX}=8~sIAnX^-)F+EiY~fGUaF1;8-&7@>v3uu!;BKHmg%5OU$r(U! z?8*D6u|u$8_6iP7k6Sk1WTKHkMgUj%CA7akkDJMS6d$F-TkJWQn*-hs6Jquj8UqJ> zo^mn<{FvSj?S32s1U>RzUwF)9+6)ir?((65I|^jE=a1dAQd#^_Vp)n?J^l#n4+>KT zUiSAt14IkSNpYY{CN9$y)d)G_zwinP=9r?aY$%&R!NrBy&b9FDYOl0YIjiRz+I+0x z!0J;ALU=k+)=k-Rjn>+FIr?}Ho|-%g%4Ew}m7dfq(uWZ$&b~?`0S2R1KgPUK9 zG@p{cjZE-sBt`S{$x>*Rqx|P18;bO`9Z1PM)7lap;ES+I`iRpSbe0@XlpD2mwLf0$ z{j+qdTz6Z4@OLyczNY-z>%==u5~A5Cl;6HO_EnVM44ibt>xX>NuqRQ!-|yF?FG9_- zf@{@1-YgfvO?RS$RsRzF?+z-Bk)gdH>c3*E6aYZ-A3LZfM)nT&RwhQa|B*d3#%txV z&6!+qV-VDtmMCpHC2vvTk&?c;H@fM`9x>tGUQs|%2NBgc3MIx2Y9`h)AFy9NEOeiI z@@IA%A&LsI62=XP^8QSTTfqY&f#9xr;+iZWg){dt60abynb*h#A0o+cfLzNl9g1qR z3vyUi_K7in2!Q)kpc@@X#YFN_J%CTo-# z=Aa;{E;$SmDGdI&pP*2zS~g%)w9z+>u#&KsoZV%VdefR7@+4a>*>~PNib(D;%utE> z#4B^u&z%c_tcUX*z&fZaI|fWh*vX2*aZjm5ZJg-UZ%(L;PP+_Qj*tmZb`b?XoQV^SCMu?rUohVk z*&?DN0O*?bEgFy$Epm_1>E(wmF2oYb80SJ*leiu*qti$MvcL5j1J8C8Uu_`&-b<3l zo^@%Ka!EgMhwe>IvQ9xVSCK;Hwv>flfGmlU|HhyeUR!Q z(j5HP<5}|y=QNyIi{v`VLJh?Rq^Pp2;&B5bm=Rmd$fiz;jz6GX1pjU- z6l|WS#ME5Z!{g^8JZ3!dT~sk$`9wOFTQxg zCR^3HS~?Jst`Ef|pFBRRZ?e8*L)>w0+^Q`iQ=j*ab*;}}QnqCN$J1K3&;V^KG4d*{ z3ukzT0qm;zXLmPCYzkDjf`yBZg^JIbOs{al@X^@A1ETUpDAvSA)IVc)&p3ve>{Des z1vf=#)0~;|`3i`7ZR;*}fnQfQ`*kbO_Je_f;%pO7jlxGoHs;2t%#7|SX?~Nb+p$jzvA)T@Sy4J5`urA65$F#%fi>m`CEYE zOk*!+W~Su<$8hG;Rb%}rWx$uWs}nbXSD^X}S8vK? z({IGWEhjUiAYA&vg_af$i-U(pGiZ8LHjR;#V>}2#ykCz%ox~4q2uSEssHuJ!9F9z+2P{JGXuRi{t`+0aN#WsIG7ia%rc>|!gh#`FM48T1xO*lp}sIsHm zeN<=D@wvF&T=hT%ym0W((}tqQA}k4;d#C-fDP9u@GHs)DbEOASFlu-;aUrL23dKjX zKUj@bHgl7teP}xCf;s;JbHBJ(h`MnvZUhkjKe5p=SGVM@q1Syk-&!Hoxnw`p4*(lV z2=Rzr>yEZJ2o*6U#9-mYf*2jER0XJo6+`>!`XI}}0`K3<7yDA`^MMuQPg*6;gJP3@ot#YJcR4NM5)unhAkf+BJWQFkxAB3}LX>iHeA*Fb z*5BO=vu!}ILHG$JqS30QOiAH_GjLY*kjfJV8XFanqT&w$DmYuXs`zJKv~vo+23C`R z1tPAb1#bVO^8gc2{~~1?l2wujB@Mm*9Rb~<0h(dyKAmvuWhqM@Xfa#mfq@VN#z+MO z#KQH+P|=g8qvl(J6A{)4oSpH50Y!!eS{D_9N=nF)VfN{2kdX35ZTIUFLR*ww%UAL* zrTiqzLyj+b{1`6#Sk(QR!EMhrI<6R_yr|hPrrRAsD^56~GG%L66~S(=1}xIyc2fkp zZl|r*vY!@;g|}^=W>wDoPiL?J$D%s_i*tR+URt|Lkxt5Nk{hVHK3|3TlvU2CiFGaH zv;1euIK!6&#(((&1$gcQPN_E9Ij*yrbSF`a?E#v>K3|BA%PPB39ITMOERdM}sih2` z704IEN?P+Iy0#|idRw8Zdfg{FVSzCdR-gb;%?e6;$!mYzZo zWAM5u1m6dof6*#P^HueX4{qZ-ud(m&H@Pk$W!QziXj!^|kqq8b2fA5zhBxgN8VF{v z8h!{8>bHq3tH~RP({}@Gg`wau4nW8Hs=+)~n&r|wGz8}+1~5Jowr)5Ch)p;2z)V7O zCYjeZ)-kN@6As)+T#)`Gg@LC>N}ul-Fu=S1nW&&>6;r;r@zhu? z|!*cqrl>9y8f*J8}7tAyxeTo;r*VE=^XZ11iZoGk|yeQ1XR?Wj_aDl2<58jRl` zus$bp$!BmP87e8u$@RIux#(GzagY2&wB{{?m$%$(1TXxi7OlSN1P%s)KVgd>sTwT( zHT$zB14OpMlkP&sH&~LQm0V|6JNrKC^lU`5Ml3FCQ1Y3RLqMIZaC_gnC{);>{u+7J{DS&K#6s zV%LG)#b2V!RhJDmfA$k6lycgV^2am^PN?M6U1B)bdxo*GS9(Q zt*Z{R8uA6})+mJv;Uz3^DKpbV_|Gp1%hr1ggjdhr_G;hdJDfJddh#XOwB(=6z)z3)SnI!tNFUGVQVm$%^So;OO5#9L zo-r$`voF$)LgnB7oN|_-ihz?Y`Uh_bm#F{T+O_K=h49|g``&S*DiQLr^9C~peVKAi z_$nqgIOh^m=3wYa2mFnmy3DZr2U)eK9$}0zKy#tpR z+E!8X8Ijs2%UP%p(0QzNRt3D zh5a-f^!jhxX&elVHt=g<9g17t8_}N*C-V>+(zH=yg5XlEtWikX>d6v{M%r z8+;n{Utq!f_0qGw)`}%Leg;;e|2Ib^}%<@j^uzI`xgFh)s= zGgtXRjtwn_e3iR&mr?u2z*TQUviNN5sv(vAuOxDCTY@=s?o7z-@9F%86vpv?E_dZT za?Q$W?7v^Bb$wX3x6fNqqkQ<((-kj7O<=lz60KAw+u4Cq6{|d>1)jC7hv3OX-=FWquixGOMmTh_L z4_k9pc(Bo)SU2Y?2pm1&kYfdMtDY>(NBeeY;mBkIzn|R&;Kbqc;VY>x*C)a0T+avB zx;?dS;9CJ=&#+dA7(ah?->P+q+T3MZA@a>H@Os;<6{k=QCXLB6z3c%q zb;ADqUJlV&^INiV#5PaUPJQ3E^Y%dGK+~Fkzy^q-O#eCPYv%LY2CfynZ3o@QzVY|2 zi7~LR;Qg1v*7Edzd@WW?l-OrA%p2A4sIm^kf+lP-t9@t?SEb>4_T1aBe))e^Zi}u@ z2AHaMCuA#NUc{A2${=;q9R-dUqfo+13d2B-A+!3~aM@v?yV5GZhm<5<;;%@1W)=Fd zrlK~s9L;c4+!+K=PUqH**<}c~s$GD54>Rt_9@6Jf{(%$eVLbK?2&>gcttz&YZMGr{ zOEW3oi&s9jCV8>dgT{ByBh}=>mdvkm-MhxL?MknOQ}>IO23xJ$2w2DIwXQo(;|Q3$ zC0K3D6o&U@Ov5{e0}{w%BjL{(J948Og;y>-hS=whS)fWFt~SCnktpcqnQ5g)nRn~} zT;=TMIVfe1i*^&S(fuYVW3YS8I8|C$^f*Zj%v^?(4XWg;=!#+%QsbIl$ z-rh$RLj(>CV~$ejW|bL&_Y=~N>|NRJ3dsdVK(Kf-1NxyK!KA;(c26esg(zY3x_7`& zDt&$S8%YNyYGF+EL@Kpb^ps~kS9Xg9H=SD*h0qmu@Jmn8aO%b=JKVhu3wN!D{n<9O z3u`4jw+=ea-bJW6QcTq3Y&w^Jpvv8$2T^^VHkY27U>Q{HL03(ZIZB&{mqKL|yzo}v zcxkGEEk%v1O-o1TV`a9~@29GF%hsfs32z&`aHLdQWu-hNn#uaFhVRj9U5s604FlgU zYF{vTM?rzc!6t3rUWe0(pGBJ@%a#&YU7CIqrH>+hScmzHFt+*~B!-5Vj0XOGWCLuj zw(x6GMc1U86l8|6K&Y4`tw=BU8iSs&UmG~=A$;V(f+M*4-{3;D}9*Jo1W;1UW2 zEqsh`;7ipgCYL;@d(D9>{02gS{yM>e)E{&HF~^#Ie}ek?gfjp!2>hhC9^}zqLp%dt zh_bQ>aRdY1hW#0i@^VY>%)*ges@Er%GnkQW6>M8e!US@R26#f&$H~%ZA9My%mc4VD z-{8SdQ6Ug%V2Ra!R<7xIng!;?o&0tU(kgL~@TLw5KcAs|sXlz@VFhEFl9GsGc1dQA zhO^%1S*$Fo76Xa3JRbEvGSr21N+nrof?<*U^bL><#zPG2Ya! zH1!{D?Uh^IolbnJv27tOpRRKlaP5LG+fxr+3Wy-_HWq$qy6Q;~EnKex7|~+HQ8Ct_dI2JU1uApLN!kQN%oX&))BS#tEy&)j5Ih zT2&rPAOKKL^d0k46*u>Yc{1RaT8J^uEyRGtk;TQ^pZ{YbVYjhO|MQQyhd>DUf5><) zmJZIYCJz5-d;jrTa!%`?!>9Q~Hua$(L58l|^bwwP0+AGqCO zJAHF0N*Skp&X4~BELE0rYU@T10z_-%98tv6$1LpEwpF+EYXk(u=b@mleDi@xc`LdF z!G4rja+FuODgL+&Q_ft9U=(GqGI53so#0Nb>1}S-4CT^jd5MNp`m#UYdE^XQ0U|Se z={phZi(Cbxan8lhP*O z)AA}yvl4D&(hZx6&a`|~R&44ttSo`LYt(T`Qbfly+CoVvYfJ10Fe?%%;e-^tGrl?X7V=242&RNl?dW`` zCKA+aGM5d=LqaKH4rBDFw7y7q=$G)CiGG^nxa+8K4r-Pr>H{yu@=;*!LJILb7r^V_4c$&=`a4LD{U=C>|ta zTc>86j8%5o@(MGAPpq7Io)YAggSfv~VHb3dD=46Rm1w}m<5mB0&!{V_zc0L|ew2D) z8AF782bTR;28eH>>5LH?nM$d)7iHQLO_wUq@_jYEIav|68I=*Q2IIbqFV1a-)?aXA zDN*Th_!Y0=atBJ8@o=kQ+1ljeYG{-rXNpPb#hsebE6w_}bM>6^(PXIgNs}zIWRTZq zW@&R~W*EBdh|f4S&CJ&iMyskhEksNtEi8>FW?CRdtar>Q#E}}vbWkhhJSFG;Ej--F zg&IT{8!{6+V|Lv^>|BXay0~bvV#lz_G~tM=#KJ1>y$ZymYvEW6El4R!KTP^vhywh7{Q{? za)8HpKIAPFiiS`OiqZY6ZMPN37JIUiVxy?Oe#Z62_sC@5mc!`@ypjQ1tOA{~oncA(!E+l|^ZSEa_bf z8g|rDrqz)5QL=i8pNl7!2!qeuY83c|>L>H7LarQ%mf^HInw7n>WFr~WXC-~g)21v? zs*Yvtw=-CT%m#e?BG~95symDwqP28;Ah&}~C0@{*cwWS~2+p4zGneUmp_WB>A^#nl z^hVY9c{LST!AtOO?;2;jQATqH2|RWlhE?t^y}^~`Hr6eiPmC#RthKKR3A*_076)pd zGn(~^@qX4wG%u3nZJ)zC5PS&g*m9k(p3veMY;sn^gwriNs9AI| zY*Sca*-tNL&N0#G!P$h}j*_Wo>B{7yC3^G{<8tIGsL`f%-`esW$4YvpIevBcF3eSU zsQ8kleARKLRnUDE8rC&;rE$AcxGJ_^8pz}Q_x(iWb5(7!ehDr|`(WW#(a*^&-H6gm ztO*4R^!&Y__b*9re7~!F`;#*pkzxjQP@Kq!S;A(2$r4wJu!Y2?u1Tw<73K?Y-o#1p zBR3~|9z2h;1UNcwJt-Kx9T_!vaOeM;7&6)7!H+M9r|47RzF1XR-uT>^s%ai8Ij<$s zSm^Z#(l1D_^3NhyqFFs99+4(WAl7?9%jI{!Z6k6saLah&>I*8>@}zTl4vEXkt6Wcu zhIi%k=n3kAcL3}MOiC{M(xM}FOs;@v&VLv4^oN{8!lvAl;Db{LI{;C0JpauA)oWk8 zsh5yAH&h7acpOy_SbQ~k@;l6$nKlF<6RG;za_0USQ!?P?D%R}Z<#>?QyZ8R%D*Rh+ zgt-51^yrn2WofbA0tIEFeYIRXCB498a}SDd7Itiopi`h}aGYGD5>EcX2n`&UUZspb#AuDZN;@Py%f<8&_O|`Ze&7i1>*3VNp%y{@e&8tKdov6754Ye%)A!nqpG%bq!f_J> zH-DQQVKcr@-qex4n1ji?l>~vet}Y=>s8bKk01IxMLq9(L^oY)1KW|UYo;+TB^t}G_ zNcnxtgw)@$$0@P8tYdFw!R|O^@QWXZM`Q2X7Zp!47yAtU0t1vP7~f|a`~x;a2=`s= zq~<@9FWIRAJ0iDOCGiK7yh4ywv&dG>rY-eVa_&-U=mtnzkSA~yJXB6b&E zn|;0!d(K`PdF&fm4#0;QQmVJasoQDjf7IOvb|!Au2{`}OaQW(tv@-jXTD8(h0%O!c^01QWB7vpeQqFV3dNwn? z-|@nCVm$fKg^z#j-Z8Oq+TSd|D2WCO$D4V^`Mlp`{&F<@v}b8uQ;T}jK=p5KxAS~b z?^$9KW*OMRwS(;l*(KhKIyKhkl5?nG;?^CPGSAP1GhX@>Y7Fs-{T;XqXYBZWf{x8>sfluf~B0jj?=ssV~phZ9IDQ z7kJXkvR`>kX}ImWS!0z2Ugx$SZ>^wYwoxlAH0pYQpTO@mYPg?b?XID#^&~FX*8es1 zYVNeMsps?OCa(B7srcEh*k^^W{|R3xVS#+u4*@<$+xUqNWIy4T*m47qMSyO;L8KgY z46hVZ$W1~22g3gj_z|TJAVT4SUC@$3A@U+H7se~{_+f3Bo*N&VnIC1&5B^RNKqQc51HyZ-rhxi@TB z@TYvBl_{rY*>>=r9v$0^K9`WlFXW1Et?4ks{fUd|xn{y{a|#QA7a-sue@7C52WvD5*!;lc z*nNvxo$jhDGhQ^>$Y#xjA;0kw+DTyg6P3om*V4p%Z1bMXs*YfyK&M!Fc45H-s zx`_$)^J&$TG-EH;O~UHvA6DF>laudGp<$g)BM+f=P<$`mxkQZ_TeM~`OdpQH@KhEj z6jG>H8K6kQN6ziL0KQTQLY2l_J?1Av(NO|rDu8=(`7KBc2AwTA)YV06Zh94sG*n=! zipQ8}dNH`GlrM%1{Rw1o&J#4mj`q!lUhw1->s#J7 zYthK}hPON3xC@7^*1qRe*5nTDy(WjeC#cHYch&^fT~j^A_^|KG`|#X|E&5oCbF|i} zevI7yC^BdavoIvrOs(?XWgf8^7!0v4LQ;=)@MQ-1wWrP1rs3e;1nuD<)P+tK*qz0aN9_m(Gb4`lGWD4Az2WK(-mOtI6kr*>tmMm|<3h6ZLEEP_@?x zI@-$%o1YO1W+&jKmgzfj?$%Dms&UmseMWEwt7EpXbB|d>4*wKZB)iCra6XWPLmIxZ zvvR*Ztu!|=u=U=X<@JHMIU+GXECXCB+(V1}!e9Cr&3c%M3djm*S?}Kboh`ePMl*T5 zBM9LTq^Z*j-RA(bGh=FqFMN+=(vT9029eOnM=z$WGf?WWFW=97gg|sVunDTpP7k5m zZ6wzL_a*89vC=wk;a2k;uC{hLq=zTp+3N_p8~o83Becl3dFlES+)117~9{sDsF=MCbUFDwA+*Sz{aUfXiAZZh@Op~02~ z#b1))g%!Rz+u50wzG6w_%3`D){u4f{zcnD4BZbXN)XbG^0~(vZ46Qd+0xq{F98gPQ zs!niWECNj@8!q?qqm8|lb+i>|dyMtX{cvb}$5h=||VFoaP3l6TO4$&hicIP~<~k%FrdKAKRpTwoloA?hb|g@f}~6 zDQ*N4mi%DEgPkS#fp%()IVuGU!RjLPMvtEPbOJFISTe@m>mw12CSHVZk~lR7^%&Gl zRtL05`tM+jx07g8=t0sy-b%U&IQE0lSfYdh@0zHV0Bo^r+>&A%g=iQRFS0+;foh zQ@~SIZQVjwPB5JDvpTb?4$O4r!n|NXwFXnlJP>H19eA@^LC`o6_cOK$^qt5e-6Pss zc-b71N@H;9GXZpab8j=Q8y^A>tQ7W6Hx>u=iqcQc_qWM&X*F3N*{l7>_2+mmW1bA@ zd-cHz)8e26e*!CrIu(pQw9!HK$~1;3!y#Y^%|sMNEW2O}8LVgU0E9&(35M6Bfk+PQ zquLnz)Do_kZqg0TO{u9t+p?i)wrD7Xv7W92uAu&3HO`z5e<1)QL5rc4z(bH3|Jt>! zLd!%pjoCOh7gGz0KLkS*0;v5BeJom@mvGfdMp_9uk#6FEY^ev}4AS+T%yO@n-r2Y_ zsYB+@MIbsWgw`S+PwhrjEE#CRMg`Q1nJ#RD9ixa844ZijbNWehqIcyDNHM0~5Mcrl z%N7xljj*B>b-6+HcyKTj=n@Z;POVRD!38#&yk*1#W~prfRbx}odP#H)8$12F;?Du3 zNx+k9AvvRTjbo*XBuWc)VZ6~E27kD^^eg%W%MvSE%9|0~z@6%!XHkie)DA!Y7SMRB zCRxquap_>eI^baI{43#a;=!~MSy_HkOnLw?`DD>5DwN+W1E#{)gKuaBVY^gZL758a zz7|iIuD`OnlksY-Lql}&#Cq=+><*N@P}3VMK?m{>$xw!Co99%TNex3J8^48v5T!!@ zk&Pp-UvJexrfjk!Sn~`e(0Pv>B!h@6bOiq9m=fj6`V$qys=o@n0*g}5^)U+YvD;{p zw2cs=bV@T=#Q$Oy{s5y&R>hQEPtsy)7bGv`mQb9RFD=JyBB0;g+`uyvk8zPkj zoL0A&JXUsMEmY8W#X66oN)cVyEkSE~53UF0dyT|^Z#vKw-4)7t=)s9~i==p`#gWdA zB)p}iM1n%58k5>EI6>LQ6ww6(+n>fAI53h2tmtR_iIn0MfFG9m?s}G5YY2lO+3`X* zU8ihLr<+*4y4T?lbqRH*mhfedCAb#kH!j}M=MW3pLw)Lmiws48yrRZ&-9msNDXV~f zwt=_&kK=qwt+CsDoGfz=zv0mwZl;y}X7nl1v_ zU}!WwYS@nE=USQDOxw&T79*y{`*^F^+^EpaZ+;LPFhUPj=E#AG(R2ua0B>^y_a4?m zGJHwv(`kt4d1(nd{YD-S*66{1sJE=*Ze0n+}{=PUv72|eM! z3@ZXAd-WmK9(h!IubXV}dyMFt2!^WJ>skO+OWPFCPW$(u{eEQl6-I#Ou@Uf#kuq>Y zI55sj3rPmIl6Gub4*GuFUI;~{kXCnpf)=eGi2X7NLn!rFD+zUG=J(!Jjd2!wOke~* z<-e`yB+h?8&IH6vIbaBSKX*2!tQ<*mzzCiW$e8R4`@N3He_xz&{4@(EoS7!!1yr>+ zEk}SWV(Vt_u#FPEiuSLkZ1ArM)aG++D>LsA0e;3ogjH*z1lc_jevb;hj8%>Q%t|KM z>7Kh3wM4nXzz`R<5dwt8w$^H*Yz=dstVvndPR@)L@y8R#HB&dFx@_AGzAdhHr@ZYS zp|{lY(aytDm4qx9Fw+DSF|1_u6WDON6W|ICRqUkmv03f;RFyZ92lRM9R=CUxMoKQ? z^Tdb-z_>e;!t_+chHge~9;3!M2b$8){A^vs6%t&y9H-3Yqs^4PmM;k+cB*rG{vNsh zv%5JKfay$zVZ_=9Nyk}BUpmKe0EIhO%#Y5B2qL6Wx{w4=zK@UIkT}<4_l^$T0TuiQ zvP;*UA}P?=t_S8=sHf_B1nIhi$11@%D?;!d3oW5L=ur)wQ5@#mJ_-W~?}hQ?F95wXG?K;!lH##1v70 zEfQ*vW~W4ZT*wa<`Wb5yk-e@hkzK;{J(E5I1~!qygrtRKpEgx~7qpWX6P&H&4-^AB zKGFw*EyZ>$eIlEZJqmedFtkp|N#N{eNRM?@M6~4KE^O8Y#N=!^qo{$yRt)&?X2F*) z|6T;(Os>TSzshn6%qD{=I8@zm=sYt1t{RGmBW_Nh*k*3$Hr-uXoT}9Eplh0T9>kqY zImnegWkh@Fp7iJ9Nnw3>O%~7M@~|c{49WR~{YFkJprM1ZOVN!dLXcz(Tp#8JHHSS% zyr&xE3Fn@i!&eE7Lk#ixE$-`-pGsE?-(N{(n^;RClYApMndhbUT4}Xe9@Zq!6sNe{ zZQ0bF_)Dak7+61(Ei^r%iUroKoHtgqPd<%c?dd$@izqFs4sKH0LvcOkX4SFImOWWl zDJ|9f?pn&MqXufKyE?VY*@d~nQf)SVk!f?F+AUy!#2^~ZNfOjy|-AhZgWGo*>ku7$U{I%o^2 z5E|4bvZ)@veKlU}i{-{lwax3P#M$>Av8(2CHiFx2F%X|darKtZbYM)#l%tR(Puw_bCm(0t{19cuGSJ^HU=JWCB*Kbwe~J5X zE_cT_P<_&AoORvNin(%$Id-B1d?&AVF(?@8ab6u(apZ5o~^Eh3U|qYE4{Nhb`tCqeBa8jP1K90TEzmzo{@ zG1g@8+ykg;>gMGsG{#jRXMvZ*=`z_Zx)K8v+r?190z3P-EHY zB|`!q0V#lc>k#~-KT;t5mK2%+vUPxf`u7$2yDYc@$nM^O?Jv;Kz|uWuA>6m>$NUXQamong zxb`#A;XVMb>60(rxq0IBO9sDl72FkW1TAm^GF8FIj%l33hJ1pY_ci3ONbz zJBlZIsOOK+(9WVf1Zw-gEK3Wn!W8q%vSjfJ()77)#P%}x@j;U@@oG>VlIZC2MWx6Ssm&aJ2KSQ0=BJ~_mN{Q zjzhOL+c}P1#y=3yBpyY!uPF(U1XoZE#|_w`Ecb_5RzgB@8sm^goVJrYa zPMfsmU~_V{ns(7R-mgDKm)7>0EmP|j(<)4${D|NYpIjEmyH9Y(^!WHJ$_6*7}IrDS2Pr&Lp(7oF@X zHyw30<|RrOumn5ki8IQ@o{>SnSEg-Iefy9+<2Q$$@!XXf+0`mAo>s;RuaF}$UF+D= zI<9k?m3>2~{B8!9Bn>Tu$j5%!l)*Q0FU{lPeY{PO)0(aPc*>iy-DAigL_P<#I*yjw zv)F|F%kPyP-nSk23m*A##Yl1;?UT0^Bvdu8%+6=O2*yv?aLj-G` zLP`47OPfwj_M1>LB4S$Ztnux>{o2-ngEuw1$W;zbf%BzppNMk^r(N!d&@lQt~$t(1Wy-bHi~dr0^CoVq4T@ zA1bfZ%ip)}H|Kym9FM!#8jN|*z&Ys}KyYMmL@^I7_-e|9VViOK=cwj-XZR&e zCT=TEeGcPvy>{RY6ifezCx+&yS6-h1BHr|HkV`IdN(y!w9p+~Mii-DQTD|$j*(Hgu z5P`H3oQ>~<({r1uqNf2;JA(x;w3eD&431_38J~ie=NyoQA4O@Mtzvl#J#^uE$nx&= zrD|}WHtc%|S$q-34o8l%mb=Q`My@0~rPv>ii)$X(K1({Hg_Q=J1~2vzOSWYJ+R=7y zytGCs2#Yg|3WosR_lp|@3W5cv?e-em(?)2FB`X$p&(Rf!TKD|@g#K`i%ebA(VOX8w_$aq9xKKSyZ)#S2nfBIX5upQXz3{(f*+onH1$bn}&fdfb+nJmspG^aQFjN>=VH(9VNYAB0B5p*{1LbVcI=^rT&gr4{j6~UoBsTYW)Cr z;*Cn0qA5Kdmo9RK-y>J_ZxJx9%h_-2%+D&bOy(5I&xoV2yZ#AstF1pl0J?%m_%Y6} zYDAv!gm3ZtAlkIx8qPF_51b4d zFJ=`-b~T(bE-LJAkfhpn4k`cmY_#gH-vAo*S<{f%4{)#2_OeTSK_Vp=IH@e1HQN5t zkR4VF-QPRUWz{BhiHG2Kl&-yk$19L?u<;%Ky66)EWhgO*3M$93dFY=OxiW zxa6_?EzWVCE?%cMvb2otrt~`9S(Ju$23q?uzG~?-1MDr2aKNOeqE57bQF|okOW}#^ zI<*`Xln^iUduadSb1p=OsZ<@054yWC^<^j0<)}_nt7Ev7ECiA-R?jkjns+)3VQ|YF zGl%cpWe(o_1~cz*CVFdC46k{NGFd=#6Ry2Va$!gyPSVXGp^GCodTAA;00t&p*$l=?ei{wz*oz;;GNk6L6d=r?`8+B7Vmu$TRMuV#)Ej z^3}_xZu8UEyP81eYHNA)v1K)E`VZcyeL93HC~rNF*V*4 zp*E$Y2(?uSwOtLhu~r4O!Q=W+2DL6_d8myAP>(C2cw9f0LGifWf0yT|4IWok0`-{3 z6&3n=+?J9eRHqWEy8vpv5^7@s6jLLL^W%EV)EJaOF*V|1U)xerfZANEg4%2^fMRMS zMX0Wn6rt8Dp*9vkF*SxoD5l1w42r3d7NNGKqyV+GRt2@yUI5jpgj!z!#bcfqp&m;~ z5o)s%YHI-$kNK(qwap`*otJ=Zw*_qR-V_{sp5dXaxi5`8uH2cVWV^TqY*}$Zehzd z3p$*Xv==}XbT}y~+0UeGy%MTqKa;Y@l~9`tpe!~1Vs!#3vDEmb1k7$|e<^fkH?&eH zCdXfkP)v@GWl-xln+u?}DxtQkq3mW?gt9xGhT6<+U=B)3O8T;8 z-9led(k?3aQq~cbCJ)tJ0JUBTRdSe+vd5KBn+u?}DxtQkq1FqB2`MR2tfZ_{3DsQy zwO$Feu>i^*t>kzrB}|PpE(2q7ye&X6HKrv%b^|K_+5M{&s8a>hT>!+icvk@0D4vj{ z>~R&)<^rItDxi|Hm@Tt=*So@0*}bb2iYf8F2*sqBl|ijnLTxO7dRz&$xd4iZ@u3K{ zUDVQTnccgJPh)YPM4C+1yGgL*jzvjyLJ6gfU;ZHWf>Gx zhz%!iS9s6rj7e-XJBp$iynOejxwW;i-E6~)BRn(WL$zGc9)-yygvS%?)Tjfp zkIR-Q`;`zzq#|6|izE~QCXz>3nrG7%ZFlW2>#7NNG#AZ9_<&oNN$9M#?JphIL}#sQ zzpmR~Hta8t?Jt}57u#riO*PTB4Yxb?7u#stHrlprwQXDNE!~7|xMQ*H*hV|HiH^m~ z@=B+(shY48(dpQ>?2L4}7O$?wt7{uI8j)+FYa8xbB<);wy0+1E+o+x0j!`~b6YI9& zb&Kt~ZFJqXwQk$mu!A)ly=!8_HoRf6HOq%Mn)xrC&yWF^4o=_wl>PeS;K%ts{`dUA z{P)uQ_xcU~_rd)4V}$<=V)I{O{+p!u-`xCnb+vSxl|l^f{=)7#ygC_@`Rjt7FK7v@ z)mcCpEy9Ybt-6&D@>{1Pzjf_zT?^ZhRyt-Sm33?h!eQM(X(I)V-WP)K1spc zbheMk2KF3&&dx&{yT8Pxpk$EF{7)m`UVm|FA@kU3gb<~odzW$;dyj7IU9DKlc;HlKmb8b>ffw}Fdz8j59Sa+9$KLR z+Nc6-84Mp=!TV`44h*hII&9!4gvWqP*#InfFkI$Ie3ndXJV2;mwl++l!=o?QskN)@ zE@V15@&)}t#vB<>TV>uHTP}dP&;nczVd&#Nl-E>;WJh8D>`$Z1VAmC+B#0zaO@j|Th*vEmZ^e2CGS;KzOV@d$p@;71*P zU@WJ9z>oieANSzLZ}8*G5-rTNdc71sKjwaM_*4_$O*LpE@W_B|3z_oa#(hAH+hyzK z0dpZdj(S=1cm?BoHy43XKr#CP@_{t_p*6&O2f@wAt<^%HpHLK>K(JoqMbNY$80ArR z3_*CJDZbywpE*52E7v(2c#?I}sadz9D-5tE?cCL-71Ulm*x3y_`q}wL;_F_E6h|Zu z$*IDb6AB8MPa?8l&CZikK?sN_)&0P`uEIE>5H4U!2+pFH@vsly`VdPwt64l=rRfES zAe&qPedFmk9ws1i97e4m_Mqhti@Q%MYRD!D>Q85yEAgAEme8~TIb z-9a?EIG4~Wpa-%Umm3tyX$WA}(n0Dd0AW4giH2x(@Ebq!3(>%Wq=kWFpwt;2Df5D* z)t@;Y{qb*|#>SW4@Y(Vz2CBmLwEwOloV7qjvk(@)M!rE*o8@~+NVX_>TwO)R&p8--C{kFAJHDk5TCva%HeIv;WK-l*t#2KNzuYaQ zr%aHFU-eI}hT_%@mVHy~7%dJj$h&f8_$-S~wOw{Aw{KGbTC(D4I9EQD6yP3aS{tCf zvgscJUNrku})>y%F>qw6!*ZRwHOOg0EV^KE{OQQKBxFKqS{J*- zT~{BiHQjgcegnP-sg0qwRMX@%q$=l3s&X}ry!|V3I4%hvGUr}>{h($9;^}_#o3-Zl zvHGD2Gm@a+>NUSQ#t@f<@%RHmwWLVP=VmL!^p!IT?3SF(!Fkb(K)L{t zUbcd?42qqXiqia=Yb@_G5fy*XLj3EAmUWxj}I6pTNaHx$)0T_+z2>p7wuQNA`b<5p&J)LgWye;tFpM?`9v6@x%m!q{ zuVs$#4e~<<;var@h+81#N5!qvkUsckK1Hvdh!feeAAB?%(rN2c646dXSsWn~F09C9 zLIie8@T0{ZmMuPgDdd>yaWDdxAxyJ^n<^XV7fe$tXP#OtgrY0m8{|akqvJf8_L+>P z4NN&%7*1(`CQiWS2WaBcyp6hv-c{N^B>Np_SLfMP#Gfvn8sDAG(0Q^q%6vUhC|f(n1&p2f?B=4=DksU z^YF@z-^;o{AI$2hAY$K4RsZkvczR{Wql1o?(;K~_5hh%;G8;EuCRvt$Mal}MIl*Mn z=tEW|MAadx)~{341-O!_HS5T$Ke)aq?*d$K;XO{#`1{5cCX1uEz!tHu2%$>u?E@Y9 zLBf$ZetuweLA8tD2xb(w)mwLR-6SoqqOuL4Po!>!^>V=`K5!JNSjVA_I8M{M z|9A!7R%T~Exe5j&$kZ#jWH|c~Ty22@O+h6_^YJ8WZ~&I6#4$07_Uem+chBkk89}%f z3a5dG&bRxoU)1V_6XiyghY4b25PD-V^LBI38`%>z*R&hFk!k#Z!}M~3$FAm24MT#4p+TeHXtu~pDaqKCmvYrkNQr`$?DVo* zE9!pAi#8hJp#sy{(zOOS6^|078P3vS8XSDSz}t^hoQ^4+A+&}WA&f+R{$l_AJ_~Ca zJ-De)lau+3qC4@Zi=OjUJ0dlLPU@PNh4+YZtuv=6((o{gu)SZNx$Tow$apdgGstNV zuH{Tcr4y%z+@C4-k$D#0`Tr&yDB@K4P(Ox zFzR9O+Nf#vaG75b&jsDm!xnczZ(22rRKsf?7K3t1v|*%F4RS*4yD$A{dN#*Yp+Ud@ z&4<^|-@knGy5BdP2?Plxw#a)G5X4YGJpY;W)A%%=QW$uWdWJ5F)@EH?ULX@bsu9uB*;BvJ8fxaeGOw1aXVMRB_{G2!PW9*oJ@xp>?NHvZPO=H^V2od zQ3yc*CyQuTeFv=V_jO%=-F@HC-#6TM3C47Pv#pxhRMpqjcSqUohQelBSKpTJ>yDgV z48+8r+c~nYyHR$xT(j%le7*Jj2R*FzV+Z+If8TW9^|(52T=r9QGTJ6`39NH#T$B+Stl}aKr0vnnv#4 zaqq);MjUJTYnGlBV8whDB$;cNpQ*P>f0=E`bY+3?2vFUC2y@$pd?++yFQREbfuttE z!$OREV5O%)EoyyiMJ2yFFqrhsv#M`-lDs~DR7tj~2I$99MrM=}l~a%lrI**@(R zD?`vu_%+13#2|@?k9(4%Xr+Z7xNB?+BLL7Y4A02WoMcX3(C4joelM@NYM}7gM`(Wo zKQpdH53FaC)SfcjA_LTj%g0 z?tsUsV&%LCtymEI%14*8n(Y{EdfLXU7BrkWK2Ju0P4+^G-Amqm*X<|H8S^SO2Nttj zUqNo85&iL1G#Izi>DeAu93=yDn2dvO4`1QmgY@ERicun78>xuO>pI@~w6WMGgKf9k z?lgz_o=;+U5D1zeoj{ivfu)Hg_5)s^0Ve?5L11};`reMqoYUV8(%H-i&ml@PE1HnaX);_z8U+_%?}9fAm_<-H0upxb z!<$I(9HOHE=yyg@$++P)Xn1Ob)Zb{pzmL^#WXYVGx_~|CI@Nrc(ZNjx0m4riJosU> zAFTHGc|3QagC_B%eLVo7Pm>~L!KB#@dE!DN|`AIOxDo{XHd=hfe(4Xq(R7!Zq4t_YA$mjZKPHw{YjE znHg|FivzpBb|gHP>m_9SEl9{X#RlAM(rFynTB|mtnFJZ)zOnV0p@5C01pw3x-z~u< zn~`4tg6CPh;Sk_QnnXV?q|APbg%flC_KVjEIXK`<~( zP1S5VOSn8Se(?xEbqoU0aEP75%4ZIwGTY(DVuv3w`q(e>e>#1|xXtq)L0XByiyoiarUZieJOJ?rR@x0)cz=0XeOSt0?;iBwgaht(;JApu? zfJ~eLQnWsj8K4b_23cyCho9jDFlhvO$8%Pcf<4aTYUpt-vb_;VRueYI0J;gI1#8Dd z(Y%0}UCcn3`h>69;chv~q>;-wxa1A!!ZhCCfk;GjyF9I_lU>+*M(!B#cP~FKZ?{DW zc`LbaH^;|CHV$gikk7?M9{!SB{?0TR$miOjM38mnW1jtedzGJ&<*ob~h?MUfKeeLR z=C^d!Y*0WSG7Q3&`oeMgtjJRmPlLHpuCAJCjYeig4zB{B5UJfP+kx;Tli_h69!ZEj z8nBHxi(5w3(zx#J8zMerM<`q9xy{)wI@*cX3_X*&+Ehe`@v50Ud?i>OsXQUiaa#sC z@E;@wD-{5kA0s#4#^WeK)fkoLTzx#?VBG_Jws=R&1632l!=HUib;nfo-0199^jU30 z(EHT&jyhsW^B}sPRlhK{>HJJ3C$pNMrvYmXZwWQLrN+_@{$p#^pDuzRRS!nV}sFmXYPRgVKM?wf#s>G2_<57#lI%w3!@rG!Ff7@V~yAb zLwfUQ)}N()fC`~0whu=8u3U4Js-Tb-2XYv&6>OXh`has}mV^1OO}(b`3698Rylr?% zJW3p@(()XPw|+;EfY;@O^KTYptUsum6lp3u$9rk8`jx>J32{rSV!{c{h-Z@FmyQBP zd(M&*GgrmN>zE7nBsRjt(6V?MR1;YX)Qy@9%r`Z5*I)U!tQ=Fg8?eAVQLAQgZMxPx z7VtqAT%LVb$(V*BvkI&A-@yT}hw8a=bT6GG0I{Jn>FMnTtV*W>D#_jEVyfqx_U|ee z5DuiCkVj#--G|oU8U^blfP;Mpp@zE^!u)P-Y z<^_p60WV88m)ZG+(31+8*6L2VUZE0ZEhHAh-k~udC|=dt0@ur3> z2gaE5(CAV$a`5>YS|PLShA6k3ciBIY!npq`cZ7sp%PMFN*-iwRAQ} z(g<#>#S>1<*{IQ*4$X74Jj6B#Uc2!iK`lv#+G-tc4HEJi98b z5FgF?t|Q0g88SyUB1>|<7#ZOOA{mzF?n zL%oj-n`s|EMBEbh2Qu=(S2Di_+h~#fp(xIF@+iTFYZdK>M&yeO+A|z}@WPHW2NAUp zgh!czZ_eyoKcE@@>(!^I&=r4}8k9fyg>UN!gp518XlwXJn-YV2Yu z&JO4wH_Q*Jw*|<2R)K2jyD6HI^{EX)VJ4+0h%HZoQ6bu5Ge#~Aqn3}S_$G2921qc4 z~S! za%bFHwnLxFk;K>azI*@v&}O>`;C;W0`qm6p1dlaK$MwP_%FTdTHe3LMt^pSA-4GrN z^K_~4(HGEV%Xn^pfYmV)^zQ8MBm3P=+3V<2au&^Er~E=TJUC?|KTmB$3!XF4b}0(J z(jNs3v zQDmhGFIF|*h}*TDb!y?g#ToVr-;>CCMCtkVns~=GxPh8$ft_{jaO-(XV>NgEVH{uB z1Qas=NoKF>xPV_=>{Y)bb698$wr$C0p|W(DHq(<|;=!!g=+t`tQ-%H~%5Y1);l-PH zu~TjEVgDFk?d~nZlCX{fSiiaV8x(!X@hFWm!1{r87EocIWN1EPyMd@n63&%zYqlnn z)J$=5E+}K#Enp^6D{SKD#YU)czC*oXn4!U7 z%vfp;$A-mYca7!-OJ2WucewvOj)8B6vni~ETJ3a{Mzgv(d=94REE&f}PCp9TYxrMz z9v}NmD_z#HV3%%)+bl%j-OaR}PHWInZLJZsR~R#TF~zhpzw9!acZ!I@Rqn(4VGB|M z*{f(b%;f~0UR&W)3OONS4Vr8(XtJWEVk4bJcs&SP_BhMAWXiELG%*9O*Xxa-BSNlp zQapo!ufm2II-1|+tLl}JEArNel2&|^3b~}n^F>z2z8Nv*DRJ5|=*5y>FQS7r=&n}( z0pA^D=1!|?(ajQfL8GWdx3X6s)HlCR6AJK!>u!4WR`WaM^< zFa)+Hx0iSL1jij?GT^c`YNU|Ewm&$j**-au))cH1>^FK&TF&OD z@Nht@>h2vw{@~?gFq#k1fX;Lc2GE&HH1>+j01cO2LT*3Db*JOTn`()?C~KjqSw zAF1GzXSQaEwRWsuHSE{+u|aETCkoD|@#$`F3E+E6MuQufKPKsE3jY7Sr9Jq*vl{I! z=~3Lo?63Z}GyAKB%zhc4^iO9Oix}Q?BBowLIPVm=pTCBD7{hlr_@>H)UEuFLzu>n8 z470i_Cqp^D9<>@zpVW_OhRi6fiY(bLtr&*J8$q)zDKE*_vjIOav+YBYk& z%S$}dn59e}xH+Y`6?~IS61o?^f;VoU8n#D|D`*MnwSS{N3~S>#zg79_MOLBB&SY+! zJD9DmCMU;7(2*yI0wllrgUlvjPmR%SpkXbVfrYXFv*H0)lgSz#l1`%xEeDq&poMAe zD?^q(*an7>hqX102XnN{?PHWEBN^IO1%@8YAtZN4-nWaP7T&Kt+qt)U)C-ru31VmW z=ut1MuYj1k_i(wF?U}E=TK!q=sCRk1^32G|+OsF-_a0@agA{eW`w#xH`s}OTQSZ13 z&J!Ke^_OeY;-eb1v-@!Q82l@GC%yXdb*)#&=Cb4K<$C?P_N>;f_t5{Mm+e4(_OVd87U!1Z1$ zPnP8e5C5^+>NTG}*=-PgR*rLHD%;4^xNeEVQERQa9W{ULuQW{uU)AvO#Qbgk>b2@C z{1-&~`(nCxy%$A^>Kh%`5^|(ZG8?K;?jlZNya@wiE_g8u$eR_6Ax07GDQJZZCU$c) z3NykJV=I|?!3FEB-qL~AmhRVfqFMl!yDQK3uJ`J7BboTG8vR=bSp@&PpJ1rb_Hq}c zQ-OkX`ODv|*u%w`y8<>lSzz}ubx{EcE`4#0YB9fC-#-5?N=K1Dn1wPDm-T!Pi;vf; zZ$GWL8A9IlN2TocN->ga|5*n-N;HnLE46}pfr>@7UU8uH3eDGxS;kGA z>ySM!XiAj2@U+}%fHl?}#mw|B;fT+`E0@Reh0!J4JOOS7aPrb{R7w|QKSF>o61!tr5#0W9{&cN>_ z7yx@G8K3RRwIo{om_<(Q$~=2*Ff#3Xoj<^cl zVBoK2H_JYv_d19Rux6EZDDn4nK*#@lG%sqlZ^{i5CUo_Y;fZev37D;Nl~uq6xE20w zfJ+PNBelAIsanF>4@_&jA@>Hb)N^*FE@-!aHbr*@09G)9|r zYYUxk%U*$*-I>ly;43&Y>e<8%em(`GE{ibOm!i=o*;K|HKf=c699lDIBVX*MoIyPC z+R|!mr}b#BzWTwrK{eZr;PCCixBYjAuU@|Izc_gH^85bt{loVk-X4%wn$ZDfbL|al z4kwo}Wc)@Q=p>$9#_@zQ9T?PiZ3J;fq5c#@Uz?I_Ha|VRd#B`D9wFiPl@)t)?F6{AA%nqn^?>tTV;H_i*F+&A3qgM}%B><&2r znKNu;hXBhYtzBi~n13zAdm?1(Asg8ezu!?jW?g92oeY&}nen%H3ZA1jsM~~((+P({ zvdi^F8fR>UmwpVA_Lk{51@m%q-iGiZZ@+mCR^x_aqJnCB!$Xt*$b=z004FcxBv>Vz zV}Tb`?OB{_SB(sSvCo&?p^% z<^&-kk!LYxp*cW8ynKTe7Gok6EUX7EAp+rQyX(j-y?XO}|5b3f|MtC47#pBQ$9N$g z(edd+38rrj+4tbc-wPkD^j3GD{oMbr->$#>qt`O0@MW-LB;@4D9ydF0Ff06{!whHfj)KDwN@)aLpH#DLcyC+a>u(# z0u)66O8~R{aiL=rM8fZ%!mwnS(*wMXf@99Lv-yY}>#x%Jl=qWy1c%qzy~>bos$bpjk1Ou?c6-lit(AK3*?-tydb{@%XNcaAo0Ph@dc`W;Gbv*N<*hCH5>?;5 z_Hf!U0jRn@?(OnL@#*nz9l051^6;UExfxo*W(7z3hN41wJH?|5P}1ZY!5!$%+jd*qSxl6`XXkIfe_wL(^cFLqaq@s^Dd3OIadQ}a_au3evG-LgctmpbDWe{EStLc}tcZlZMes!?1c30b-tAuOY^<@xnmxoB5u)a=ULvo6FKi4U zo;YmcVw!$Rihc+{1sEPk;67ATDHR#B-5^wbQY1%DDA{N#jrA|}ru@;#{SoLto>cyE zzf_jto$#;L2A6L`VESS9`&2y?TMDR3(ho+|XX5o;{dmTe$b7+6LRQ)hCh?_kU`=M$ zuh!f%@b9^;ng;?*TMIwDe;(Euh}Z@W+Ya1};SGMSv3!4ojhmK#Is)*`hiPZ!9%e`AsL4K_EkkkfcX@vV6#U~ZT+McIYCjKa%M z@ZVQ<{Wq;4+YcV)1vT@xsjz_QEdwDMYqgv%NuFo&WoP&d79wO*u z;w)u))C2|l=_x|Be-!S0&G?KqimP?yTu-A1r(&JnA@<2AjT zVL&Iqk%X=Jr^bD+1h(0n1SZIG>FYSd%A)VDAQ^+`g}j(i12jiJ@cGAue*}yE`1Wjs z!h-*Jfk}Yj1|gy3fiK^^2@nbHjjZ{sS6w`5T_zus3y7Qtu^m_8uT=xn2beEq0#hd4 z`9E;lJu^ZOYIe&&g%hv<(q(!pkO&zN3IKDKRYl1d=7&>G!lstRRotKUt@2RQBx|T4 z?J_zx8I63-ygVhmWb7-hzYfee5#BIXnMgJQnSbl(-`=}lpOpSu`|0|qw{qQU9`h#< z?Z2%x+FwvS`vbziP7+M<%J(q#Nll85Hs!77GUhw9z^#!i1;_d@!{?1T&H@V>daSXF ze35YR`f{EZ(kaCYE9?3af?(lgAIt~eWDA*V@FIhGfTm$~ukItnOSftRklQPqwQLrR zFTAbG;f$M?`*Xwp^RfSD$N#hI|7lf0*JX3p2@iKwz?+)4xifzv7)~b>vB-Ijb!~gO z0FnPv77Ul$&E-yWxf?96KUv;*vivy5m-XBQ2-=WEV$!PuYZ*b3Uc_wh2CE(pBbOBX z-C4(Ctfs)mhP_BH<`=e-^6#d*JUC-Z)R!bP2Yd`wJ4r9`l@l7oD7lcs4FZS`=i?Lg zhHOrlkVFsN?y=#aQA-Ci3AhXoq|-Cnu#KLF%}L4;Fi^DyQZqDJ#RNLTUm%t>r2euQ z_o9K(&fyApRADY~3!4C*Y$ly0B)U2}A}+Gt#rIGMG9-i(qhTdfk=j_GEC9;GlCFwH z8{YS#xl)_ywHx+NM$zOWnLmY)HW=dihI{tSeUTL#y5VM&fn?+djnav_Ft;R_Y)VR+ zC>h;;bFFx*t&SV?jiuY7w^m6N;=Q;!)5HIc*H9k^n;zxg_(AkG2>*M(iSn~%McUBC z52KR6hMz|5t&q)^XkSeKFaiJMCsRwq;$Yp&Y3M)l`2)Jmd*tE~{mY(J-Pmq?Tm4s$ z>VND*>#YV^@z(krV`4c2dldMHqBRevwZ~&NJ71s2En(3A^>4QPu;iGe;+gj8t=>|( zsj7U#&Eu6-$yklJ+GZ)9*))b|xg3_)pnW=PpvgD6A~*vfqL{F3{smb`d2}35iT~DW zJA>U9bo-9v71Yfa_(dk@PvRL8VbG$-Hh)Py&TzM)pc)ahUfaKz>UM!R44HKfc|)P? zmaXZ}P#x5MWh9lwrHtBk=~@2p!*qcXH$P9mfU8uaOmIL9_qJrs5^+V#S;LF0q$*>M zKfV%0z4ClMHVYB-Thy}bE$ZAXAhU3m+IYLagmFNZHb9%n!2hIU&h}T?(#?t(hFl;Y z&`I*y;YasxF43|#o-?q}%Qxc1Y{)f+xeR+OvBRRobDW zGGE%kv>3Q4IMQ(ixE^y69I%3ck(dh%(PjaFwg7DCnNG7OFwwhoX@-yfm_!0|rP#oK zeRDE@kU>3I$n+Z?cj4c<{r9PN;B~lfJzig9BUbvhN5kRq(7j!LK=$&NhD3Grm@JeG zstReS$XL_cl|dJOsmm{dxFh+Vp#2*?kX;o~qzZx~*3l?3(2W?HdW;}I&{6yf(Zhdp z4@uC5mKEQ|6Fdr2`pM6OczQ8Ykz;IJSuX^nl@+%7CFFbJ@SHYC;>HGkCXI?M?YWAP zD>~FAK7^k~Gmf}9b8))D;HcGV9fvORB1hh|I~gM&p*#r=8iZ(`cz}agnidz;gENii zc*R!Gf%-E(c?^~=6yja53Di_si}&?+P!fxv$9y2aS_`8Y=+-8L&@7p9c?pEa~UyhG4QP}bE!?W4bs_HJ4xfJHO zpn!y5ZW`X$@Bwj_E5V?YtersjAf6(4T7EfKha=QTXMs^7RnnInjw^xh{_y%u|KR(> z_dklTvd#?H1vnYxTVNTcqPtU7bONySg4bj?nUJMcNd@}16?ml3x68L_?TeOwIU?q` zG;|bEOj>67mj#d-c<6#rp@K=FXw~Nuoo8W6G#kH~-GE8ukv^=f%Dr-z1hdXL=4*7+ z8a1Cglfl%x*Gv26OW-ny-U%Nw(W-(umP)rt^mxZMq5)Q()X43 zdBc7_nSMHnrmEzzEBRPal7VTU`!2MZkM$sgl*1%0`wZ#V)c0-s-7x&A`@She8bxLT zRe=y`qNcUIDKyH?Rr8xdAtOZ8XCcox8mO^u3VqHKj|i?{=(QuXF?(G$R+Qcp>SXha zj{3f(zIWAkp+ht6r?3_Zt(0{c`#g`bjDDU&c|!;=_fg)E@y|WPHe~cy`KDy_kR*1Z z3Y=o(H|5s6C%Lv*J zpTbSI6!u3K=T0lwc0%y$c&5J#J-&^`V_hHwc@d912*LH>B1=YUc-u}0{^WNeG(7M= z3kA)=K^Hg)_%ijr3m^Q|9E5a%4Et3yJ{jr~8Ta>d^;JgwT7Q)x|7W7U%6Q+P2ByaA z#NMF>kkP(9Pt|9~FUgsvv=eOaBZZBd$`5%uJF#|nt~z!??YZ|^hIN?f&uU!pna0Nn zbDxKtd^qu@%gKi`pNE`y82UWqq(ht^n-dSedYw4o;C~k4&3qnmi!kwc$SuK-J`Xv` zFv{_elMQ1vKN~XYiT)}>{;X)d;e<$@hc;xq7Ye|g5vQ7m+zBxQ9y(Pe9j`4ds+3NU0L*5<%}UU($6%jr=h==`+n2IRTV{r>ZWI(fYSX zTOGHI1=4voS97xIRvVh4 z>k=mk(#yyjqf?Z?Nq883Hz0d`MZ!$UcMxriA)q%}?cZa`;9*H_J7nN2Ew+Zdv^;+FYGOM1A~sfxF-j1k^^|G8qz&<^|hi`;OLMZLFp0*x z1Z2S7J36ABeir0xC?Df1G{At@6C0eoPl;&MXL*uz?@8o3n9;M3I3l8@3&yw`CbM*^ zpQAZ_Y-kg*_AjO}hO2|8EqFMFWls5gZQxRR)>XM@{als^1z`s!T(csjO(EM-`P&u8 zX0|SoRnNv!LFdP1{M=|tf^w>HtCy?QRW`>)8@&K+&B4=tKB9OUU_dyTq*qY9b21H9 z_j;3@oeefs56WK(J#vFJ8pTkQP-He*9%b)!0b8ZQKE9cguVfox1##0~# z1j>lx3zz1OJVeq9u;AdxBj%)M!xnO)tOU%0FoGX@QUvBWYYrV?IFQAYnK+AI#1Tc- zuq~roj%$4m_pZPvt_iNF3{o?QZ=y0FE=}Uh%+V5K13ks9vsR!YwS*7W;QwB{c!4Ib zgzB#O`ho&;!y-3-hk?Q4+~v=W3D7{HdC^@8KWrs8yY~>u^K7`)YL^FFDRAaBhh33q zo&`sB8b*Z_G-@UEAi;TZ0a;)+-Bz<~<17ko=+T~H;#0PZr+0OXo0^T_qaxGT#54@X zW;V7Bbj|>?31=Bifs5;oNixjfWonZXnFfsz zU=jDlPZ}p`#hdr$?i%~z|mVP!l+DF0a+ByNn$Qv zUJOr~dlUe?R_Ac;5EL?=#fFcwFvy~hagm$W${6GCBO_~V8c9F~kgVVnj2REPqzzQg zh=W6cQ-itqtiu!KRplYi)jiXe^LX%)?Dep_%ukxPZ!;~Yr`iJxM21c1B4&dCW^M8y zYYnGn9VVHX)+;vAtD!BgSlpgRpOSPwtq0NANR(_AVZvcBFdt>&?KY%FXm)8rN2-4PfC9RzfIyx{E}dx=#r@+SEB)59`@8oZK5eW%dGOV8@A^?MtkqSHjpJ+a58;Gf82jQv%(~3Ji1YGb zEuw#3&_DZVImrF{n-8_1TI6(N+CuW_DtdZ7!GCPU)kj(o4AU4RWrHDaH04NW=*ANT z*#PWZ8^L9K_l}uU&_2L53G@lfY0rTSoDpzsPO54o5myipqaI)$_{8S3UWHW{1sCTR z81TN{f{LrYvm)n5dlG6d#fJ~g^b~TcwQ*O2Y{_7iURit}iz}ldKI=i6V+xHZS=N}Y zUivNO95eK{thv~r zi0LfD3fZTL3)oe%fJ6eTYYaRf0Z zyIXbeLku5=PNVfbB$rknLb|N|=1-W_X|1vTrFZ#Tr_ufL^!mOHV`2WNgW>xUN~$Hy z@COltXgqL3m+w6n%aRThzQk?hPyUee0*>^Qz6~;X!iyKUof$BhM0+-�)qGq$bCM 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%0Dud8@|k4LgW7bw2I=Ki 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

>H2}bCK{A| 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 UrfPhwEF81VI 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⪻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

=MpfIHbDO+EEEhGbt9Lge23zT#nxny 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

`c-mGF&2-V9DlxN* z_jsy4`2B~3c^F&Q>@FlLN=B~pm_mRpbZ6I6Fc_9#p0>cOl@mFYu4|~TQI3LK z$KVsU)$6QHsVtJVBD^`cxT^Pp9j#6^nug?fhqA>Q|44jwBxAuM;5^+G!Dm+!r`fR_5Q@Jx)iB3^jcmZ}#o6J7JKU3@C|7STPq=o66)TnAMQz z_dctVLSa<nUpF|Y;(wO2j{5Q!vo5` zuYtauDhxMn(?*p%LIv4@UdDcqMdK-pG(mgp}o#=VrZRSS8ud{!yH_oQO zeTYAo276z6iUb)Ec|Y|%|e+*!ovfDk)0}c z{;&=KE1Y@Th-$GyYwp{9MI)M% zE)LRI80aWTe5y5aS`K{=A9|e~ALtki>X|`9T*Fh252$*ntGJy*y&D&D17eh5LHhC8 zdB%2^oe=-1@1<1%VIuBq-kxAG0RudnqG^(gWK4kF_fu6HghGNBNc|Vq@FsUSAxqxst7+^Ly*5q@RNfP?6x*zGJ| z{yzNhK(YvREmRY6EWOUaQioB{eb-!)?pK+u6=)sl2fRQ3Lm?Xm&i*&M=6C)3e?#Ek z5J7e_1Rvu!3c2wO&HXK!q{jDwSS7zV^$Q zu1%Ppd1g3vT@Uml@0v1*&Bj-Vtf;9!XGgOKpez>77#5>iQ8RzWfX3&!jtLsH=q$%o zq(>mJHuIHH3K3~NF;tX0ibPpzaY|IOB5=tyCR?i8xC2;ZWMvZ?Rel$y2HB>Y%VZ&D zf#O&~84~(4ObiOIQlyoyWWFfICc4rVE@x83C|LXJfHzp0x6O?xj{(Wf*_Wg;=@O2wO6{-uT`*PJ-B>ifl|Q4;8kou*SS!kX4HVT;FMnzn$Y1Q z6a~ZJ;v17QLDGb2J6DntubnlVJ?K5)@r;pWU$Vqg%M8zQ;E4K1Hz{n0-?K`(TBlqusGf)*E-wOUE9Y(~C+D@G%Q7M^eHHMRy<>X%NmeB@#i#cUcdo zhF(y&Ybt2^;lb-Odq!j8^AQY|b;;2=hE#Y_)zhTd&Lw9cz=rBx8U>M?-!e6ay0=^l zlGHt(51ndxl2-YgJJ`ud*{QeYIG{Zr8Z0;`&n}|8k256L5yo|YB~eR5_N}gXbHX2< zL^9BN5mus5$5;8g^Sy@foOo>ib|=W#QLqQizZhX0#o+af&*0+zq^;H zkmwYPpYuNhQLqis|7(Tz)eO6ouX+&nDKPy|2)9z93oHDTA=sPJoA_Smatz7lgAoo^ zuHY&P$s*gmk`mdm=O9uUCeJ3%E+bx^R`VJcs#fz9{=XgAX(%Zl71}lbjB~JeFn=#@ zlr7`e*8HCFi=$8U{q&S(5Ru;YwJ}(?9Ir zxTNeiF8Q~D&OaIYm*F0||7PNDQp4L3nH}qk`vs+MzL%}V62h?)4T3gkgViz5=qCkx z|7_%Wl6Bm}So7T4jX>Ai2VUp7MLnDNw#iyv%@Uu-eMh%>=+oszou^eE+5yo^$w}I$ zZ#Hu_rhHf;tw>(sSXw#*@!dmtU_UaDiD+#S6K?^$(vR2?HldMQ@^q0HC zMD&5${u+`9!RL`78?(uc8wU)_H1L>F#bN)1Kx@6D;)pzC&k1b%5F$kroU3c7kV_ds zfq9WAPvAgsRhd5t)G6#Q8?>jl5YKW6)edeW*YN+Zw>820V};# z1zK3SiC@4uMw-y3c218HCYaceY=`P#2e)%2oVX!5XF+V5Ap8@-X{9J65<<}Zo46iE zF{>c&*r|@yvf!6$Ty`8gcr}Xv!n~`4T!|0xD-I0D?dLC}h{>uT=~BV&1D3|!4zWV**AYivR1raeEroWLHoy&|`U_4~>lqyBeQ-}(y)q!| z#)Mq}xCA&}Wrv8Q&!}$vs9->$^O~i`NYP2eFe}oF^j6+qy@U#!r4y9)rlG~=G$*5e z=HwSck4EyR>Q~7Ah%A0X7KGO&)fGmrRoBZ&g(D;i-Hz!irpVdmEKm4Od=xaCUljJSIOJ`t(|;tM01wk%Nt9QSuEb(Tw>3IGyj+UXOQhZ@fQy z(<_RJpOY7O&tLFnVro6xkGGP{vo6fGC_a$a?4d{BfYZ&scy4l(itaS` zZC!2Syb&0}x40cvc6ys6Irm-~f|~ct7|9E|5U}IHXK;b-e#ymPb1=CRu6SK+%25jf z_V8w zhi^|(kh?Z*{ztpWsl7!VZ>U`JMR|=tw0xxOCYl8)iw9(sg$IqEk7C?@AB=SGF!~74_I&LdCBpbQ-Poqn zSB9AH+u?d=J5G$}_J#M|@vN(BF^7qLbZ{s<-i7xYLTV#}sRNyoxySOcOR1&)IQfG2 z{y4v6Eth=oi8AQS<ZzIVDJ>1e z$gZ%LQHg=SzCpqP4ru|-s8qW1MX%>5={bDoqLt$a5O4LJVP-9(nfYP1)j&Rmf3|o~ zJon={l(dz1S8kKfal{qKeN%%}7@(!`GSUX+OY_~Jz4`!e0i2BO>NLlJEjm0$rAK%a zViN+ABrTco;YU1^?mQ)PA&X4hg5HuFq9rALu9%9P4w+Rr8F0|gP&OjS(?1Quwz}Yv zu%GKNN;*!HgH1<6gcauNBT(p$I$F<56b&VSEd~LRFTtS~yc;NInSSnFE+j>b0G}2_ z9e5XK5N?4OWzT33C6L_dD{&!{BW8(c>YPb0?&?M?ZM#1k4iX1W3;;pl1ByIIFLg?y^H=u3 zi350@-7v0su;;=(o)f_Yr>Ewv(!Cavp(Ft_My!Nzb;G`r>kyQbvjEBz1PvdG2t_d` zDFkyXF@i%7((-t1nNIxUj_w6dgmB zlA~vw>04*972wG#SQLkCPpBtR6Ek;0heJnesj-BpWVSDq1dtLX{>XHB=Yr-9s4miY zUSARe!A0m2?echeUED#sR+VDlAy!4Smj~1ku*g|`2P_d@(I12^8u3R}uig12;3S1JQ(%xd2Hk!$uzLoVN-1I0kj(UmK^^EXe3fc&;ks?nE|>?1j>u~pe(Y%$J?OE^Bqva~k69yw zK$n>hCMDx2(j6hV3Yc9lW13%iEso5@L=7d&2MT+DBXi;_%&f-5qJS1LE@DoE3dRh} zIT5U68>t!DX&s4TrON@rj=3tY0n6Ue+Pf6Sv%PeXF_|a`#9h!`)4nU)%3zy@7mpE= z5P7z0g5u+~i^al?NerS$kGbXzH{d}U;fN&{W3~U(wAUl9*E>U;j9sK-&sD<$|6aRw zx(8+KIK5=C#6#I>lN%ddL2*7*#rlj2w_Cc-#Lr6+OXc-EuAh6yP;W&3m=6X%`>owM zg(+J!gsy}a1G2^isoThvTtzg-88up7URqO%;hqjy{IhzB|Nh1y~R$;Hx}edT$+;Un~9 zB@Wy2`8JuViQDq}0&B|366q<{$7cSK76^7oY`Qt4D3fw11xlY!*)e*z4FR*8ggH)Q z{a8l4{7*X_r>4HH2oB&5^dil_%mX674!s%o9*mRq7ZSl(`sTK&?Z0;b@qhkba z9O5`PcXqynhmcERKhVz#$E);eotSN3zCd*M`-q>eHwD`0BE6A zC5u@8U34+Kn~tH0EprCXi^0{M?&<7qPOr;0f@!8sf}l;!JIUo2?jtHOUMp_DdlzrU zO*+HUv67J8alfcTU^eU;FLh1q$$cCX$%Kry*YcTDW!~y2@uC~~YF&3(v+?ueazWqq zCTp|=ZiN%BTE{i~X&u~lA~dlM#9xu~PoQrpRaHlCS>te=hqL;}TN+v2gFJy=7h7Ag z4_2@@s}cLm(^9_OPoF7Mp-WeRcc=fPU0>4R z5u}=Nt;oP3o*cnpl9nlfCIxRfXC1K)Z9C;&&s3S0uqL6`6a)BQtR zim2sdfoLi4t$95r4B|#Kcf1q9GBZavrz^W1*+!FlzQ~Gj)r>xJJ6SM)mn7D{nA?FUbl^;QB(1`ExAq)`G;orjn~N zEqP>ReU59tE*W7H@8=O^+}XK;PQ8~PvYVX|LGAKiJZ%i14v@kuMS{+yJ!}3wjWM~e z;w+gPJ}Enh+8IcA;M zgxkR^+IJSVx-SAl;WnR)`@&?pS#u-@rNxv}?w8(zA(qxzT1s3h4&8grT&w5N@j5vF zJe{=2LAYPz_@dY9qArTk0F=CO=N+dG^t$8lz$z=ffA$?K$i?GgBBZ(>_TR| zD@0KolmX!~Q@^^!A6p81BGHXnDEyFlJdWin167TV$lG=%zUq`ABP&Aw-ENM7rR%G^ zEMYcd5bX`oTG{s6$#DLqfGeCLR7pf3c(f5Ge`+f2DXaKvf2BChB(eLmX&H1VgrwW) zxCi}3wkzz0Y|fAdMb2fG?(1KmhkpeK|H{>8=qw51zv&_bza>cd{!Sz2f0C>J@7|&R z$c&SuYW+5wNoq&(Fa>yAK&FGrN;L8UZ6#An13 zPM+Hh@y^DQ&J340_%L5HR3>|Eo;nZ_RAyZtV`-02d@1Zo#HWafY83C#wzkLZI%WQvEBOu1lCxOR112 zO#$zy)lYM~stMP9&ZdsrMS2Xrx_|;y8NTJ~WyPN*k){i*w~GnL6s{E#TGOe;Ey`Qlje%X*o5 zJIYA|4O8B;hE6v;-Gmt79@W<^0|itYj!bvrd7Ic1;N2Q4M{%2HIbtd!@jev8k)+gh z7=5~bfog(T(G`u9g^!3Sr^VSduDzEPGXOu$g7ks~{&rL`#6U(hHLDZ!ooG(xa2j<; zVuU5Of7k4i#qHLs2u;Mngmo5%b2Y?`mrs}8{gw~fV0~#jETm|lgpbrId13-Tf3-_9 zP@E)KzUe^03J7E$gStEs0ZcS|&Wq`)2S1b<&8Ffc1rLQig^)aDP7HH$`?1ya;<3NK zh1VdIZ@colgROID0zF_mXG|&?yJII}>P&kcMCBTaHJ2ogjyf!P5TPB9{&l5Zca!zkF`XOC@&;%-c zfkY;4gY2X!wWl_7Zb|}GkFt9)zs9Jg94aSQ*4}dG_n2!k0ngJg)QX*l@5uImY35VX zjLzP@?@J9`>&->O$`^0CxMz-|@YP|;NlfwUe0U3i0rNC&3Wt})r_C5OTFAyrSf(Xh zudXpvjlO>rORkHbpvB+b7bG@0=LJs@Fgf=`hPp62U`%@Hc$%7YyheX#l@M9G^)Q3n z<>6B3C6RXz{gVfSHLmy}Eu04!MsbXAy|X%clFr83+O<-lEG-|Rmp0wr%C=W<{RQD+ zaF04TinqI{oDj>ENlJ;ER4XnyvAo) zYvz?%9&2nc>G^AIF(vmz!0k`QRsxXjnaL{I=9AC&6Nzd+zK1!J0?K}D-O(S(SBBW! zGzM<*wzgu#Qr08}HPc@a#WR4CXjrHi49Sc@hzxs;(oyadIGV($!I^#EV*k;%A1u@T7px`t-pXfq7*_Wz z@3K~mE1!xvXBjcu9vo+W&Q#Y!lhaULraPQeTZcxgI81c)s|?!$f@~VsWU4|h2b0aa zIc^WpHh#vKvA9W?;l`^R{bn-Y#QR;_JQ?Db=A)vSIkwOTG@3MCfsamSZFq&Wdi@#K zkTc7#k>ZhtM7(Y`tF^8!A7f<$)y>0sG6D94br=xa2-|n^Q;FF6Od%8WWV2s){0Had zy6kRSlMK+jrXT!&N?M~}T^xnOX}jdG)JH)V&yevap>(hXB9Ozz)#LoZb_t8GVVF#o zC8#tP0rY(>o)gA|O)Wcws_{=PdtEmWjgw))=$sqUYBbPxn2yC}>+jqWAC{W5LxAFY zF*3SzHm`R(g7uhLHsC{GpOG0u{8eAD*%R_+$ecabSXCeCc%&;IMWiXL&uo1lAo?=L zv@)1~JqG2COrGq>RG8vaKG;ud!~f%$NIF6%A2z?i0_gXMNcs08@ISr+|Ls2fHwo^6 z(w%=INOF#qw&-U-2(FGdBP3yP1i-GA$jykq2N7u!okCGXdJSiczS3D|v~D|g*qV6T zG7K7RlHRY7b5MwdWGUTp{u3xk7lqgR;*6hnp*>K~JE-Db5p_ze0tGgQOV$epAL#3* zegi^Pw5coO3vd9I3Vk%2%ul-Sq_{JqWF$<)-PM^%H)T5gvNn*`PlsojTq!Dq#=57) z^3Vm)XlL_{3~I$@;$!DNOK9x%CC@V>k0>BH=oD0;>;&$*pEz{e4xYC8lu*ho>myVM z>;YAgTM>dvajv{{$K-(?c=OvF3kK8q=1I$|V54|yi7`}7%AfDrD*QlZ&`HZQ<&?a6 z$!3hKdjjof14lQYk|#(5HfvMoEj9n30kmW z_$U`ZSeW=*?zom>$&6Q@7&6Le+5B;nx^ig+?w)M&{cduCo|P+In!qwW|ZMBds8=ld+%35hx@a+s@UPD6aOc!{X zFKp}CMAwLj86PAONiY~bSyQM>z>}-2%WZ29tPTg$8gn>s!s#G`Pud8}s%;na@3I z<3#3p;C(IPBRo}fj3M-JT(u=Kc04ql-udzdW)b9K#~H(sjO~iCHRlVd6Yl%yOR*h& z13ZAkY}gbAqk{FBGMTDInDm>d5&J`XBG;h!W{!%(P%wy+E&bY1Aa)Vg{E&!)zL*MU zxZd#@b_{>={tw0JOvDsEm}$kE+wcGX`dy$F`k(#(|Fn6%gthLUT+dsv*JgtN;UkH* zRWB)CxYPYWa%~*1%!XRov&4gd!7@Rw24Hwo>N8_njP3jPWAA0gLd?MOU>s|yot zGTihY5RBXV2a!?O6)v_E;lY^WmL~+Nl`B2-lII|2@Lb1gpy=lb}mjfX;cTe#p~Rm|k+p%h-5#WKMLW0;P6 zD!AMSflA{(GGH>zo}WNpxO+#~1)`006Q77w7CBBF%q1Yf;M5 zw(ATqyyV>h{ctXAQsT|?3imZGJqWpjb!bBH{cql@UfNnc!6R~5MsZYKQ+nps%o$P@v1eRDDz1q%iVwe`N@6uN zXfHK@lB6A%mhU~aQ#8o5-|EZEkb8!ohWeh65Wx+C_mgyu~ z7P~yPa8E|s9Y;fhUbMreS>$qlhX3GaZJb>Bj+mO0m!NCpNwi=DwCp5?0K?fahC7+1 z0MEJ%pH03&vJ|Km{zwBfw>Jy7-inVqhfWATmH>mq%o1|;@T+fs-HqZ3T8yKVb6uu=p((J&)Rn`*t|< zhDSDsRk&wyOOT_mR;||`b)G(uz;XqG#mP~<1bsh(DM%_QzHq-WfpvA&cWYR)U1`lT zaSHwSNmr;#p5stq2a(hsgVf38JE-zC*C}FS-Ybs9STyo>xUCU}@k4%cz^5fkka4H> zA@mns(zV57bN|InAa`~cdqHB?f5+6t^mjbXN#DT4*3kLC>0|i!o~G*rH?N6rcMb#n zo9zYvpOOFc)<}BJ`{!FjY29X><6D6&6dtg(=;YbH(AfXN`dgz9%xujYA|N1s2+cY| zNn|WM?|7R#pN4c2$eWRe`6#nh!D)Ss$IO)SEV@j6pUKR#%mLx*tMkyJ2}(5_UaZC+ zy&hgk=k|Qnt0Ib;AnUvX5Y;b!v`V^te(9HHlDCulnQgwbTX7}asMc`ul^VM`bZ+{U zdU3N8J)E6KDCF-%-?}RQ88(+Z;VLV*kW2OL>56zPofy~)_d(p|_t>df{09B3q}FRa z0{BFdwI%DHJ!KO=dcRtrspgyfhCTbT&C_2wE75n9`h!Ud>7Z)%Z;^PZ-dJL1+ShWA z0@m73b)M~*IQTCt3uF|K&S(%Gsk|0+OxKPX2&U32=t~anw1A%M;RKEaB?7xE)+KYY zsn@9X@~+e)Vh<-#qi0wf;@=L)DnIM`{5FG`DwD@4@(mr>o|x6Vw}CCB22hcGYxhac?LrVzjDiAu|09C0LH^GTrT+) z*y5PTViLcY*?@t2*-UC%V#g&d4v!f8z>ek?&@-gmmfKT7f9k5K!Dt8+BHjoN76<_FfMPjR$kgT=|6{&Z!L#dPQ4*L7r?)-PIdMg&Zj$jptaEI zev6IV#_fi4WEC^xNzR;5U)W;Z7CnlGsLKRioAUQ@vr^Ps=ulC)$PE`FoWAY;0;tQD zPyPh?>puL?`Sj@jj+a`0JC6Q;O+x#hTliaX;9o8LpWBRHNNsSa3f}mg)=T|FYjyhvWuT>mYnLnY3 z00W99p+XSbgZsT8{MFg+DeD(Y(^_dt1LXSFw%O^uq2FP4rj?YBC%bY5USPdc(^MJ_ z4<~vM5VaFGnMQS%(Oj+5jhx|}#wk4KFgaZM7#1NMqhkjqQaeVs*X>q(>#3 ztP!Vcn&j*4EkP-qUspoDu?O~dDu4=3rx)X5gU%4LR)RK7pmOARKr)X-i$z8{XSn{Q z^I-V>q`1G{FnGZ_-Xp#G0YvVcTO*h>X5C1{J$QjRE!3xC)1eig>1^n-txh*rl$=m9 zeP0;tT$1TCjr*YE;ID+XKg&laY~>nTgkfVu1}_muswul3F*wrK0W|^oLS^k}=F9O6 z>C2LWIwN8aXR}??A-)6wTd5tESByrPT36f(~Lyd z5)LjgKn)zg2Eb}G%8EsLzEpr(50OG8)F{`dHzN?N+BR_zU zf{ieVoZZY&d9XH_zzoRKFk`e1uEb@ z_8Ssf%jb`q`wMLAmn&8fI48MXk`P)LUrMDGU2BE>FL}ToQ-+g0z>65#k*YD)?%dID zK0-S4M)a07PmV6ZT-V=-ldJ>4ZHKJCJ7}Tl=;|cIXW2M?T@c5f^*TX8{G@XZy{XT7 zr#>}5>%BkgW$(5jAjNl>-7SrVmpe7G53uIMtcYN3Af4Pcz<(sN&0+r(PN&J!(}_SX z;*C>hsvzbbf|Z8KkAReK$u6Nfqb32U6G>1i%ZMlzp=4Kf0k+!HSm1F1w7{R_R9(>K zzrD??OYBap>!@&Zy_4#|A?Y~iriN}5ysWQ|VOzc_J`T!8j^A)B_kOJ(p3T`5^L<>s zj{-lRZ$f^WC7q^VN`hTr{K`FkJ2K&nM(leI=;uJ?|G|X?UXT%DE7>(K)C@^_fF;~P zt>?={fUG{@QM^mvGsnP;3fF!3LS3sPHK@s&@^as3IN_8{5!- z{o5ztHxC6@sTk}_72P;K?Obver z0wn2<-;RdW3wRPGolv%fRxTOxPn!-ZAZE2YPme7IomeCMXq@PM4>7?uoOM*JW9@Q~ z^2H#k)dUYhKP+7%>%xXimU8JWOm^`crn~9X9vMRaSwC4*^>Pr<%%k6-zuBW0ix8Cu zvBC8yKjn-aMChTt+ExnkL#YYbfcxd*8a+uKvg1(9%%xHo6xe|&%9JpzA!Mt7`_5oo zIG|u9&T3YGY0oNKcI76mK&_KlsiVT zMtyDE9fc;NafG01M9A6_%}~>)a^>%#2+X>BLZsc3tL=z_Bjx*4+>m6Eu4-m5DsiFW zK%1bvflO(pHV(O-!L6p((#Lt$uNeV_YI!)pBe#z09XsvyjSqJodnf|d012FU8f?Pg zedjwN7H1*L^Sn}a#w2;c#{D{7fE+%BZIxEZU=nn4ku^*AZ03yL@O>G$G3cr7)0Ar! z0dJUQ;~QK%OBvM6F(*9yXpNx!xVTJ6J@Y`NsCDQUp+vL!9Wxp<&_jhWC+Ir^lje-lDHneZ$GhPn zEhLbi&wy|bJ1vNTXoQe>l!idI#p4aby1SctbKs7M&0!b$I2o-CS1}WuVp2`G=N;hc zp~WVm!0UY|h&AbITq-`Hhyg>1Y+@K;{BGFk!Cj1|WKENio)u3>`(i>%4Xv& z^~lzL2qKT$v|WVHCj25zZI&-(g)I7xfy+F$7H=->x0`#k_<^X#%Oq57YZ$y~2vrTh zQ8B^ydRa(HX|Gr_hQ@b2*O|Rj1&qImlf0uI>~Lb)yVs1@hyOT5WQP{Kq#w?6xBwI9 zy8=yE!!0+fx&oXdcYi}=A+O}xvjD5Nf||hC_P>+$zWGEsQ%AHxMMHpULlEM;tn&O- z*&$KbQDsRwXwHn9L+S{6rLz!FOC*1<+7p7C^6v}6SW#x}%cb57q)c6}u(XLuI0c_h z=OvUYj8GedKbMElBa!qq%i+;sO}NS32JEuP6H}`6j$n_V-k0kmab=FF%B_sS9*NYU zDnr-5PFVQDPURd!2sJpzSz*-%`N)!0tzDi-UBbw>2CgCRYs4MApGlO@cG{kJ`*|Lx zQTQE|Bq@=29(dK6l|!KnyJtNE@u@dMB?+D#wyeC#6c>OG|`#U8ic zgP;a}AyhYHgY#*sCobnnJ7e0zf$Qw{Me6lODZIii2pl4H4TZuFsnlkB43?zQsL*!;(Zt{p^>Fofh6MO&SEtlm zwF&MIe*6_JqCltE8i5&gy^$`4Iz*dXF`S(}ld*W!Eg1xy&Ceo*W5F6LADFt3-|WNRGquq$%`Qh)ps+n!evRV%e;(4U!adsaOmIj^=GJn|dERm8? z^G>;qbwF$p1J<~1a`Jht>07V%dPB}&*sk3?fUTLN3R~4;=8F?9a3VU$<@Tk?W!SSk z9x_&&hkI+N6}mqkDR7!2dhDDj(*yRzmAp_w8H&InB?IadJxFgPN+<75oSN4Q{lgTy zy7mWAG8Xk<{bzidogR*zpGpFdoSsw(lTl6gJ%ykaur0*pRDK1IjPKU7a=y*SCf|o( zDk<&f6sW z7{QbdDcI4I`-B0j7h_1hV7%UO@y#)Bx_n>M3RpYL8ok}d5_f5nHe|SnMab{U#>E6Q zZa(;KITitQc#QHN`1u>Y;={SGhmbRi{f+p-{;Fnu8!o722h+7!GwSCq1n7;S28Uy< z$os9b3jGVXT07xEz4y#>d{-9rBWNMFz30Z(VpOjbp8K3_750R+q>5w5M*Tp*uZQb4 zet=E%R?jcTVj4GmQyabHO;ok;%NDfLUs$e>kH9ERzSSr#lceB#cTYIl_jJRxhzSmt z;*~?4LdZ@*5Si=}EA<6`=*EK=c!f2;5Xm^|hZhvwmruS2ijD4E>Dm&F($PS~EF#RR zoik=J$_*EPpu)lyy(ITxT`?!KdA!$kkgoz*jfT?gA9qbIP+8X?V#hT4DIUTy>g%Sn zJ~{gTLIZ5=<*GGYjLksQU&{k{XW7H!#vTBgBiN~8Cz~WUL?NSxE>B#o>Xy%B^ zC~vu)DR!xYTF}j>n>nA#oA5iO*YGD2Pe;NBD)M{v47>>a2_v>jn zx+3rM98TmhHgp?T+FsV+FK(3I^z;p=R|W`P&_^@VV~&bheqOE<__OcXM%j}}<$aT> zmP8*}0nlb9DAq;%`hv$>y!XRRR?pZqecZ?9l=;p8!rlrgRFe?~8+Xi=uJ7;RH8qdj zSv`Bc|3I7dSIYA?-QSJ=jh2glBbooRl*icGz}V=&OnH*V<1@GrLY5CHQF1`DA=wRk zCZsY^QuI?q927>0zL_z@1R#GxA-NPOxIg{u+n)%&B~rfW%T;;W{wT$^qo;?pgXCjL z1=e{?g_KhuA|S)bwTYpUga3_^I_50x*}CeS2(Sd_IydN!F#>oV=b%T6^ptyv2owCXX}-6v7`KeU$w;3L`;pGp?BxLheuQ=> zyS-83?6#nbYwms;@IgzZ@fXcB6wldj7)(ohNafB;*SF@d%Do0?W;As6q3L3+FREqP zIp^p}Eiw5vnfie(6xB50aVYM`rXA)6eu8ql7zqJS$fq#sCP7PH1KzxJqN$w@Y`d2S z;7b#Gw4$TpVEn^8T+_2k+~1!=GW9Fec#k4{V)WirvKGB&)#DDtcdgGkI$?)iB=!gzd8eP^iKOc* zety1s!J-z`fk&=%R;bWl+(1mldG`sU_2c(3njUM`08i|AyWhdEN&K3T72Mv^0u2wE zG!9+b5$!Y4k+Z6fAPL9o&F0#5Qmb>&fR5sN5bvb@j_;~`kJoq)bVPJJxOa@Dte3;c zRak8^%}rY#m;PKLZ%1lkA$1366i;Z!L7<|$z~=(Q;nMR!`$G(9ux^y9)yJQ|GEL>i z3XWRVXpJeVs-&+K(p%oyQ*ND=^LY2onimc`o6_0IA?>FTDpefye!oN`^p` zC9lC!B@}~8KNu0T#)+~;kXQ0r-HdZk7Ctzmh^vH|$@AICP&+xu=Lx))!#K0-O_8uv zj}rBMU5#YMZlyZi8;A~hS(k~H!uLl2&~#Iv*WDC%F|PE(z58+%0C4oUq)weNzsO>X zr73Pa_bQ-9>tv;_aps7h@gai1gXnfUH2&_0E?_Y!H{)~)gAkKFD4VT+h5oP6lfN~r z^{?2*Un=U#N{|4+^6fY>|HwP~?=_3RJY59^u#4&&QX0{1IU4dlGh9T9LzR~TR#oY1d^UsKJ z;=JiN7Mztzn;m60{c^&W-_&JWz#{zpr>HnOlGX!D%5;b|Wu*)%*MP zXn4B)ErvR7DX)%f7Q=&D1{q(!kb4hGDo~TKn_!Gg*)Co8aY7Bav_YW9mC`o=%)h%O zI=m*tLhI}vI zVi6G7tA8OvX0o4IYKs^N**bM!5pX+*y;Lpc3|V&@2MR9T?^r8im>jHj4$f{Q%LPYq z+IZ;RiLU&Lq5UILo&KTnD`U8;ZTLBdX3=rg!|<-Yaw^?t|G`n1t%I(2SpGUa7rLp+#S zKoRpLr$mtN;SMg3!aDy1kY93HscP5SWGHL_BI-|$-5pJ8t5%pl$R^ka%N|q}?EoFbvfFqez$Ajf6W<_kJGKTf31`JM0EUK1`gV;zb-luycli6# z^4CZ{o1TIf;bsh}6LJQ;M2q2NBM?H?X|)|?P5EN`GX~azCPvdZuI^7*Gyo9luJy(a zjfDAS9b!i2or4AyQIV-i$~L9vh-olB)Ue8^NocwAM8q^hZFq5ik{8A_afJ&8to*gY zBPkYBq)Qku&nyMB>ZpJ`+heqKZP^+Ix7j=cYumbp

z5lhGlFDx)w~KN5wK%*IvM zvs+$IEzG#V`hnj|l&yo5er1SrZxIAozt&@5(Z(TW)}r0Ir1mORRWFK(rj{3Bmu$iDVbIHu4+Bud8_f@;XT_BCN6rWjfF~(Kan=-*rgKgaVPVwSBX!2DVgc24S$Um5i_BqVzwhjQTRw3;4?5%1^D%!(s%ET*$fq}@pfV#cl}zshsw zJffLXHC{%@`8_*Bp#t7u#4MgWzHF(8t7%Wqa$WAm=%mA%&DhKBcd^s;5nV=J* zT3275jQx26YVl6BPk##v7@2TV?mWQ8en!CG>|FJG^x4J!8wwPSNtFma4KQ zw8nbgb9s~p4~qF}bY4u5;2-X$^s?Jqi((ntKmkgdhetaFfkqA`IjUm<$E;p}k9-D@ zpMAJFymooWC`=FC=MakaCY(SLmWAg8P3qTemDw|h+G4IHLk?20yB>})KTUbxz`YBE z2u|*pGsl!>B);Gu6QWrfPpMyaZJDF2os28NfUO-`ntIyUI5k+ino`#+TkZml zILj>^$Qq!AGp{1Lnq~dY zH))cW|KgwXy&ml`1np{JO8DZN>{}RA7ygok!Mxt^&p}w7hiF`_dRJV-B5Y(uw_qN; zU}|exbHUVP-EwhTx9C4SEptfm38z=xn$6a5ZYzk*E4D1>z4gg$gp9(`@az00wTVAF zA6?zT-2{~Ke15^oUR64^%v*M(Le_C;%C@_N^0ayW()g0R9oq11#F zMNLN{SM1Icby8M!zD}x6>_4$C}JyjIiO+BNJx;9q{>*I5Qf=e=D?Ul|_O<*WEQyyPCIkLI{rp2RivQBBNj zQ~8u=-8r2)(2Vi+G`>ySPSNIezR9qhKJRd^(``B&ulR-QV^n98O`&=4_EDH5ON;q@ zKPIy3UC;Wf?Q89A&?aH2Q~%|C1;}uhAg1LHM}IkQkq!5=fy7R%Rew+?rljHFE4`P` z{O{LSKE}7+)f!iUnflQ7XqnXqou>*{s%>?ikGnx_`0@C1II*vhj*_|Qx{1>nJ3(JH zlRAqPzVavjv5?NzhlD@aIX0S%d*iNR2KagFV0_+BPt2sNplii_OHCe}A0rttnd?r) zGRCi6Pcc3Mr*p&6FH#&xcBiB3>ZUDG)NF9ArQ3JU$lyL(cX1C7@5=cO(`oAY^p5Qj zY|=c{A0Cp*^6vxo&}18)PZN>UroP?IH;cgL!^6+n>21X3eK*e2)!WY8F5-J9-#ITW zZQ9MQt*Z?VJ)_s1Pv^<;%uWs)mhF4Zi`GjNyrvhyKL_-s_mOu8q6Y!(Wt~uD)*;E6=7pj-Mlq z!7q>M$#t%0oritb*i9`TlIR_p$&PzJX9t|u*1NZOjCt&i)-JDo#`FF5j&PT4){1o0 z-!ALhv*qv^eL6=O>=9kxmg(EI+kcD7nomc$E997Qx1X<T>(GIrYCW zcdv6c3n$!db#`ASW|{vl08>D$zqkpnebx>4Kj?q8IP|xT*+UDLU4v4syf|&X>Bsl} z`ek2uzvzv-kFnuLG-rx;Zf|Jn`Nwy&CocN-r}@)oo=sbJ?(4DVZL{B4cRjsi_s)?! zE;dM(p^6WK>hP^evHyvf#d*;`wV>b_V%zr$-$M2`jhCPqFe{rG9lbcWPhf+>js%r?E*6B}UqJHP= zUDiEvr>Dd{c#Gffo#zH`*!Fehv@c7R&$wN6U}5~oO}%FPb*p0Ju4!54zF(N}?b8=u zotd+ArDE!L%cuVQX#CC_$3~CL?{?+s=i`PaumAGa;~}+!ryuSU^O%U#KiNbm`3Q zd*7Ux`}BzX%JlWiCVe}3NyxO?h^1ps{SkKd`{xENdD*xt=;F}LWpA7t?Dp-Mq7j?Z z?|z^$-`n<{X;e@Wn^hGeuuErF^Hb-zh)c&2etodZ|txGwc zN1lGR@vomYb9+A=d+N#~+24LV$L)vL=Y~Cd%D7u6zB(>$e%ziLflnXj(k{Oly7F}6 z`^UU~UfR6X`<2ty)+^1{Kvn1c5LG9A6FlM%JZh_ zs{t8D(@w5_rD0U!HpN#vpZ;T)Xxfm?ubd3eTkw+FsxLA8*tjor(y}o#@7^$dQ-Azu z{f6g1eg3S;_7Qt!>cUr2F6^H?Ytok2uP*yBf49gZGZ$2AQF>V2M=u#h%s*P+Y+dJ5 zbYbP4h&_M2e@J;pHhJB?>)%hSNw5_tZZ=02p7?!4df3Dq^JCMGyXG{>@TV(sXZ-og zzOY{prX2cy<&%%x4gc}-n)Qh{FNOBnb?d^*wTC}m9`xSLlM{XbJ^0ATjisF`;^T(B zGj7MbmTAU;ap(8X61!cwRkwS{o8mNE&Z=RirJo+#_ru-cXS>JE|LpAhd-slcb5+34 z>-#NSU;o{%Zqj|miiDc&NeOA!PIO)~Z0(8xV;j$k*NUeezPA0m$H|bRrc*WV9?kl? zPyHw6#WAl=+w}aE%@KlkL->2D=%pR4-m>`?Wcd!KFzSzGwA zIdsbYsHeIgu3WCYd*iRdp9bxjk^S>k_p93L*4;DC1pdBr>-KF2J{Y>?=a{{BXE!bv zMMIIVn)cI-!8LQ!&MYo5er-8eXAHa8{8Q%p`}`+&X?%Ro%BONpR`1fDi~e)xs;OCD z>^h=7w|4!7kM3Ue`aZwMn})L=7aUvvP0i##&d$B@*L7Rg%2$)D7gAO?|MKyfM7O}% zcg|kEGY0By&n-J#RoI6?m%2-o%O+oVaRR82_Y#b|ZgpmAPTU@{>V<3CpVoi$($Vml zf4=T>a>I>PqdweuETTE?2>s6b4!+9@rzln=j}u*}Pd)VE2OD-zuNhHt`pJqe;>6dR z=kDxs<>!X6`gJec6j6VkS#a^G+B3U!^_TXHE$+AG_^nMF0;Y&=u6|toT65C5cb*LW zV1oNElNZf+Q{4DS*pXT14_~^Ic;N&8LmfZ4-u>O0Q<8-<;y?SQ?l=8!Z^(Gr_xSAP{nBGjW$v4Dc4y(MpUycyuH@3Y8wPDET2vT!ym0fyT;rJV zFLsrrjTW6B+^^f2^-l+E{ciiEtYN=gpM8DeRouFBcLZJ9eR28Jb@D^hHw!LqITy5A zV}0Cx#EyMe7EXKN;`>L}3_rhP_^lsTzxw^5p7)A1-A**!m^13b_l}Lbw|wK(!EV#0 z%-*9l4Gir$OBHbpTjz53wm7k#!TO%W?{emgTX`1-Mm3AV2b&t`>en3yxA z$9H35ry#fEZg(d=zgKOo$e6hN^{^9}uMT``Wzm;w2EO-Yw;!el9G8v%XkxSZou_7a z{5oaQRmD&JB}*Qwn6uXN(8^Q8MhDE%hTnW8>#1RTKi;}K^!J6+@7?`<)8y-%?!YXM z=_e-5-M!=U%c3)*M1L*svvXGHA3x6+Q}^?wiM@~Jj?PT9#hrh{d)mat^rjh0{bx)S z1>e=4D=XOPU{6F&TQ?%L7smfjQHUiL)U-^LC+(iC9HOw78M{7&=vkM0HC3%&Wl=}H&vD3t=-)}S@yyO36NDq&KG;7!*w`ubi z_1STC;fxuVPMZD|5u52B5aoPB}SH!!% zI9O5fiKTDoj_Z?;?w@#CxBj|ze3P-;x06CbH^2Mm=(`<$T01%IxqyA*iz8BIE=^5Y zzE4o@xo0YJFU&n7pY`YTzq*<}|KOHMZh89F$>k;c*4$oITC{D`FD5fm?mP5KkHX>$ zjJtk!@8LJ%o?N{%eo$@Vg0viS-nUtsE3Q2~QgfWSQMqH$@Za2i=}}sgzTm}>q`93g zbXzlF$-&E)pZ!`Bm9)kG+!4c!w@yTkuKghPg&QxXZSEHlIRE6fCyGWN+*Z^$babp| zss51u*y^}HCe69XPWs}7x9W2zP4HcvczttYY-dBiPsS}OFn81r=z00YuPTm|>0b_d z?1iI4{~WS$W5Uwaa&9`;|K&u#6JLM%+qpz^4sH%RZQ8>KC$nOg_-p)hTAf? z?dQy^O6OhN@cyAARmtwjhPV5#uY%gN!5M?6_CB8VgX&63+8=q}8Rw**J93P@dSboz z%U?YId4Bh~%@x1C@frPM_T(o&U;Nt8S?(`^*pk?EL)-z;nDei#d{1@kcHIoyoNsP^ zz3u%c!>3g%PHtR_^C|mY<*w&C5A=Cn=4(hksaf;b&0brcC|Y{!XzBZ(Do>cs5B;b# z{MaMwJEpCBE9%P9ClfY(H1LVZD|hy-w!NsDG3)bBUR!Gon{Z`zgM9t?&F>9Se_{@t zzBgPwHe0hOaMEMBdqZANScMB~?b>+Hi6MK^)#Fd>3(cvW`{&iVpn&gfFMYVEA$0wv zeSza&-gihbw~5^ z^zq#!6UWd08s|yBA2jhlWgWb2eYY%i=7jyrDn2{;_U)}Nu)FU(+o9z8&wngTys~n4 zNXiza?}hy%ZhNgB*8M!&eNn=uv%gn9x%YrRDzH!&Qgm_N?b)x?e7R$E&p%!(`7EjK ztElu%Km1z!(Ud>N%{cq}vyUH7J^6xY=7H6xrhN`IPQ2}O_of93>2SL@{e9P46vDtj7;pZ33pYL6%yHGK? zqWYOHE|k`W;A%B@_f!8#bC>P@dT6)K`4ehzGf@uu^o{Db0vEly=lxrcO^##r-)=ZA zZukw_O8B`W>Hm51iwm1JR{K_jzf@D2HekkOb9%#xc~GO&j|WezF8YeQ*lYCk4k>5y z4&MGQ}8x8wQ+2}4{yCZ?~}K#q(u~dyxtp{Y~R2u>%Yjqs2DvU^Wx(Fcv>Li;|}C^ zfBvb!tv5cpw#*|eb;N61Lof9CW?p#No8AY~>%UnNvYzHH&Og04vfISVZ_oHG>F|5q zhpMj3-gcAyYpCbmRh|)Ey%fh^HNM`#PoZM>ek!m zPXGVSF^l}yIdNio&>ubb^fVUk_L~D3DvW-)9~t9CB~tWYiuxXT-~UpRG}H_@nWXXh ziVA&FQ566Kl4=^OlFS5PgBMl|CXBpFGMmb}b-T}hqTcLIP*92GRc6dB=?`mL29u0; ztTk9Sf^c_0^Vq0DQoT-~dByy$A77RHnyJqH=?D;GmMC zd`b`VCwQq$c6O)KYEP7Lg!NS@LOI}r5WvPPtG{q2qpAP_CR5bwjD_h8MM_Dlq z#;Wqz|HcO&LGM=4k5-AG&NDcDvf{~g22#$*(DlI*TM3YrPPP~{CX;@$8=uYfma1yA zEYIO8sW#MBSSl3&5-bOB9CkOy{H=68vhD*7xCYchMF2RJ2pT-jF8nBiH$@hZStBv? zH-2%#i_{6oDqL|e@=DGx&lSVcy?7X`M;Ps~tTB{V>BSA$#Zzyw=*udd61`hje{=MM z<0}-KI}z5Wb}&(EB2XU^K>Yx)PFiIijMqlXWmV=PFwoZ-%Ee?Ilo_D6R7!CLz%iAU z*P93mRLoTyjV8uyFienxwoK&pq`M1)jxP3mE8@hCGJEW-%4 z&l7N+5XfYQ3~!>F?2QCyi@{Ahw10n4P(um|1}e(=CP-dL1`ZlBK-1rCz@VW;1)%jb z!wM9YkZlf8@&QIj8;O*h=NT{vSg=lXu=untlxP)$Q3O&4gWQaD>u`*TbR%SMf{Bz5 z?ynhHlHb2iem}Rt8XP>KJq8aMR5+xdsEB`bA2z7}&;jtSw`O2rfd~IIbTI$Yi+}7j zX!t<815PKOOuGY4pR0q1rdO|mUM0n#u8TDw5T^u}X&!-YdXh(6ocyyCDocK4Rdu-p zsw2QI+G&cdbAbU>uV<=2KQn+HHTXI!U?L7K5myy4)F6Y!gS^pO>dkyMW3WXLflrJKd}Sac zUl~L-RkdOQdli%QE(yQt4+}?=S**Ju@8yoN&{*1Ou`YQ~3%xCao7er_RT7rTfQmM= z9AwL&dQ0aAr^K~ANHBY!+IF~In})B+Py;K~q;wp;Eo*PAZu~n^yV}vmt(vwtA8_Ml zaY0R~pJ)|U=-XXxNC51a9nVFaDp;l`G``lT!?6Q#E4m`Ozx&|_we+35wWzG6|pQM zWs!_!CKbG-l870dEuuLF}f>?1di#o7OC@TqLnFtnj zWSK}-62&snEb7FHI?I9(%OtX*B$iRJjG9HsEJ~4e0LOHh0?9HEi!xazn`L^)a=@`C z%jB}sG}gNp%M`GTmKF78Q6HA+%ZmE3s6UGavdkdXXE2L~uuKt)idi&FHXJ;TV9`hx zjbfS6EHj2>a#*BenXxQW!ZPDn-%=Kpu|DN2V_+GMMHMVv$ud7?_vf z{|fwbmDGkL^-R2>M0tlsM7Je)wk5ueXii!nJ z_@mgqH0Er5b-d?!#?MAiq5;T+Vyo$<#}JCGBc3d9I(5!!~{McWbm9@>H4M<1ZAh~9>Fp`B>A;QFCJek_oC1o9Js{8S+K z3gkY4{7fJ}7svww`Gr6p5=g5+HVfoof&5A!j|k*ZfjlOV#|83)Kz=QdCk65pI_t=t zbAs!6gq}l-kxWLRASRbugdjJOgePc`PcHQo6f$D`a;Z4Di&Jx{6nLMJOQlnY?UqYr zQ%I`KrAER_SxzqXG?L4aT!RTWH{_OQClvj1sb>%pA$LPA^(+*nN1%qHk!J@DB|=_N z8rT!#9j&3n$fv7@k|5tq4dsRWdT1zrw_p#o6APz~&_3LK%Kf>6*P4Fwtt zj07Q&f?g2skPaOvgrqW&RaFSiB9TnKlKw?xOS7sXn$XdRCiwqzy-1ZTUL7FHPa-_d2YL;3Bw=`bb;BVTZ6N;#GUtAu5_Y z7an#I)yXc(%LAg+$Exi>b+z@iYNO#c5b}zqX_>quWYr^9)isnxJz^`eHglc17_LjD zkFD6M?Fx)Tfl-7R!+>!(&p6yR(rWF?P{1{c=Nb)MjEIqY76F&esu~`93`BNEIs7;LRP6CsRa_0SmFc2!G()8#o1qW| zC1)liq9h6_DKP`(n+kzc@KLF_hVoFAt;*V0LN%$5*~UX4hYxdVZ8GA+n81fo4H1-x zkW4-a{2Hw)+e9eDhut=`I|MrhNZG#aeB zba?2Sjw&;3ldbUsw3*;K&B|p&%k^2d=~f*8dZ@~7wi#Bg8@Ot_!|Ntw)%Ji)d=x?O zEDf!s7X&{a>2kQ7B|ZTV+5)5tcNTq5T<%_O;QTbwWq^!a@cS$ptBI-9*q%dU^I|IV zY>TlhDV7xkvR>pF^MUatVC)QxFJlH7L(AoHIOCTiV0(?Q>3VU!nz@4L@|8L*r{xM) zXnP}VABgAc*o)lh#m7<4A~w>R^3Qkd!gDuWx-M8Mv?32z9YqzTH6!wMyu<~ z_2tIovRF2VTk3Svuz`Z!0A?&>tT1>L)>tdl;?Wd-40+kD`(Ib+79w$KTgQ+ z$o2{_Xk+w`BinLXHy3iS8&s9K2>RI9XlrLE(${g$1mNDQ3uMe2kTKT~j3nQnZU4bu zJ7ce_fy!vs&O=a@-^BcZm_Gve*AV_Sh+0G2)?)rn@6g&OFyA`N7v$jE;NaUp+cr7) zp2U2cF<&t5cE*9ct-xn{7c)fora_);CrKuSS!@L@H6O?PJ>HS1DJy6x;`l!Hq+NiZ zI(|Uw7LsPT5C^c6wnl*R*@eRip;0Dj8Cs={1sa18af7V#em#$u0&r8I}!}ow5n8rZ-rj0LvF~Zf%8gY@Hx4 zTiWClys@$jAlMa#Rt7qE{#|_?@pqrO&Xa$Q5$ildYxA9_U;*P9TATAcv0<3U*b|1r ze_-b5CS-EA7Fh_^4#on84PrO%{Gg0(Sul13VY@b%e-b&elGauYaF}Aib|O+|WQdYe zl10gxS)vp$Hl(UkM5!6+qO{Z$QMy_sO3zR~(8k57(ilOUKAX+>^QglI;~xXIyBtQET{5Mm@+iJJ#PVphw#c_Ac`YNc*I zU@eeoWo~}Zz7dTSc-A9#gUEx0hQlh2rr5D4o~eX^wirpr((#f?`Wj5%Wn)G0(n`@a zBooQUGV$_C<{HGpZLBz6Q7MLrk61BQ67NwdxrRI??qk__uS)hB@@758O5=ShrPq+J z)N`yX-mg*y`T#K^v83ZK{x)A6qLT8xh60eU&EI;sQf^aPn`2`7h-?ACNP`+;I)WPV zw~0Xwd2k*oojd1FE?CV}D&P(7YIpnfhVICrVeBgbNriaRK5rQ#3I za%lf)8?y`P<|4$=#H6rVT8;N&$U*bu>+3A_CW92#!;G-7JDCNy;RgK#iGeI?GIjOl z%D-PEy>ET9%L5XU)Y?Q%R@>|iS*oqCCF@cS)1(MYk*G>kqi?jYd9`KS^=g^K=oB}X zu>bE}9*uE{rE5_q@iuBrbv5aH%ux^Gb4j+CtQNMb2meV0B6_fmdg@SvsaYwY?vg!Q z#S|>fsmX3G(P{-XXxj|jLMJ|?O<0tgn&B-*fk^76q{RWsz<@xoodg932ZscA2o4Pn zQ^qM1MIMM2F=C0s){7*8Sa*u#ETg~{UdF}3OKiI#NX8(U7%YYzS*8msiDf)*m?vC0Wrv{7u-Zx#X2oNVu?(i3!@irte_am8!JP&NNBjQ zBDhEyZ_r*GXiA%3bG+E*e|RXUV;DsRTbmCTh+yy)g7p`+FboAb;Z{{N1>^qDmLQ1*ml1 zoHw~R2W(y-3hU?Hemmflnbz7=OO~r#)#*DlMZfeS{=L^Tos8TZdbI`bKN%m8!HYw& zx=O*C6;3wcTs03MS?VhF-mTc8)BawWKByD;zgL$LB`(J6pRmXdi>y+Ptk^}XT>%VY zj2JLE*W_9IR%)_j&o4vD2?tSoEwqBTxX*xsA@}t$9>lrC0lUGVB9nzIUxmBsOxF@f z;v*)*H&}p-R!6kU2`rr+$lxm1zC_us2L2~Ct%U}54alK_)tM=dRa8-Wa+boC$5jQl zzv$LdLI2lFaP|c~kvcicSBwJ0Vpd5j#ZoC*W0M8TgWZA^!S2Bx!JbM#Wr$KO@@%Pj zJ(0KrOEWSFs8%mLW`#91FIY_@OKD6H>mAH8WGM|aEfdbtu*w#}GM(^nR-C|!6J-gY zggsgBB-Tg8`XsYHDXdSb469ktJLHcgK1bo0G;NrzJvW=2^z^)hd6})9G!$-)6+ITtXXMz zizn7f{3aTKbAXQF7_AuQwSi-q2t7llo+7cx&HY(C5tTd4alS}yKpkh*&;}IIB&iYE zO>;_0Zc|{3f)B)~(B@%4R^YLD8jwzct@+qs7cF0@mBF>IgvLH?-ecL$m8{JN-idT_ zPR_aIBCUeh>-?Q=?zyzxEf~9LJs^hAIfy(dE@m*w!0-dQ=HUBidmS{xIwu<#|05hg=m8<8p(Q+u1l&TYaRB! zDv%3Q>4LZ*6<(rH=|Z>=d!Gg!o1^~$P@w~BHQgjr0TJ|F6mA(A{u21^oFiZVq!up57#_HB2IK z79P05U^E8IVEAK{>@XG&lcC(0=RDc1-Jl?1Yzc;^0KkJsxADCafsKW=l_s7!2|Tv< z8fPH%N&qvG67hhjAt)jz@(c|j9>Lg2%mhe`alvR3s`Pc3vD!vQ zd$oAo9w?f{=WBq8&<&%e2kT9M^G;^UP5MbLKvuwB;?oW>`q>>O>b>CvhWvVy*=Ukh znDlj(Rb^&bsiC5(R$EnFEyaF^0J4)c)RtohZ)0t-v7(}y9KlHP=e{A83*O7Ew!Ve{ zrA&s}4sGS2BVqQ*yB%|cv9JC$7{E9Pl4Iu?tgkgxBZE60J7bJ68R9t`0eNa={Dfi# zE5(SGR!?FZB(23jj1z7}EK@|c{HCpAgTsX0(B53=HG9HLZk}n%F2;iUqc0xGlffrq)e5u-8x+Nl@eOb@$Rm_JLy{=nyvxTt@hUIh{!(J6IUh~h!KCxuCW%qR=wT1lV;ob>tRZ0h}`@X8)8fEHYm?yTX*1eD*NXYzFz*Sc>e%JOR zyY=@Z8wwR#0@}=gOf;i@TDl)Mmvp6yjY;7U3Pm@{!Yvsgb zM0~kUpj~EzZO-(9+lm^V*!8ImdC)7E&^fT6ZSvTWpAU`r{3nC6wpJS))4Po1BggiCsg zoJTw3v7D?JF4`(XbvXuy!t0dOG&e^ZhCvuOWVD=kVx%bWrKV*u>NFLAPSY|V)O2++ zTvFjNJriDJ;7evYAWBuq8F0zU0z_#_CX<|%4A|1FtW+MM&7`OSyPA@fs%A0(mda!# zV@PQ#09Z3%l?A}18L3Q0R!XLT$Y(NB(=r&qo2D=zO2uTQWo0_?@a@lo|Ld8r>(sj4 zB^xFsMU^T_PfZJiMH^ZirHl@UmUbc&E4v zES=1Hr?7Myi_%%2EY`Oh>(iZO@>rD5GQC(-z|uWfrVmT^Wl=wt?$6Q#Sb88!4`S)T zEd2)>sQ7i14}#5rF0cbk7wx# zEM3FW1XoH=WN8yiTUgYRZ;C&$7G#atlUdAFuu=|83sKVoST75F+J1iy-zj!6 z7zo(s0fML+NjEJ)NJXzevt93fLADAOGPFx`gecL8O(3w?;3t{(~H#{#)WAU_evPX%(HK<*dF&jj*wfjlUXUkK!v z0@*B(hXwM8Kpqpw;{tg?AioyKlLC24AWsYAHv;*sK%NoE?*#I!K%NuG^8)#UKwc2Y zivoE`Ab%9d%K~{tAb%3bp9S)oK-vWI7xagtU~dVow-K7s0H!ZlYaV%Nvo3@ao3 ztej{GhSS2L5kN7S1|K-C&DI~Nc)1ncX~keel-LG1wHYLVAb=7<7{1^-#u-NQ>-JDetejkki>Sc| ztemh2gvQy%HNz{;Z3V<=W&JUm{xEs;01KVlqiCv9XH>9O=;MO=1|n@RET%n!eaXZ! zH^m)XB#XgYL{mtaB%-N985_|QS_Z&^9@JuV4dnm={Tk{?<7=)6Up27V!4_)Og>hk( z;kF1XhCNqyv^|dqT3ah#0z8EheC^FHLADnVWL_iyU#+^R!(a7{qAL}EeuZ4KHkUG` zVr?|j)%FTNa63U_00A4?HsCjZNuXnF8on z$Qd_>>t=9`0oN_qRUx4jitKA>G_?YIFUfSXEt+L4%QQx)k6fV2FyyZm*%sMC@WH@Oz+nR28C)+4a&!8oAsoJ!A8`CAxc9WX+b-k4Je`5r zaJ&G5DFg-}Oc09$yH0}T1N)88IItV{3nhX5F1R})VfzCI<|TqG4~Ad>v zKC0|xTL-nSSA$Py$O#P6?L{g`0f2d-et@J+PB$%pd3m?(yZ|#6-~%vc(k$IU!29@x z57fm%s7V0j#lh5LuHLqtz}1`AT)QyosE2(>J^Ya8ZN$8NZ65(cU!M14Ogeaj3GXL7 z?-a}{w|xo>@&=zQ2z?)zzu+4l{Ugepa5a#Xy_+KloxR~39NjtZvo%>Io`%%I@*mf6K2J_s1Vbad+W#^tn zlLDAcxE}#zua$d*=Y9;6c5ZJw_dK3^4&j#Bo&Xl;e=wr|NleB+j=P@)Jkwml#Mlu!S5@y?N!>UEyj9LXa_?b?SQ~$0lv)p;$gGk zi-*l>hk>uvg0JBYUj#g>ge5OU3WSBhvjjB@br45s9mKUSZq$I5#dR3FZNwyQ{+n<# z0~}tRI9a>b?bs`3!!TI8*BzL|;y%D$0kW%5#1MS-C%BeN{qTTWMRfN!>T4L=XYh#iG}j;ydZBy8Z^s`fmAF*v*KStuYtSxHO&7d@K@8(lm~3ovmJ7g zM{7_E#%9bY?oCNX!I~{K8itY77`zIs1Lz4gmJ+L|5=xRs1>+%F4y5fUsVgjXl(rp* zyoR=nYuO1*HtWZE`NP9Wp%P>^J9?PYxI97-=wVNg@-wZ|YxPiJu3_g6IN!J9d_UvN z_f-g;fvAyPLQ?7sZ95A=M8-dg{LB!0){`Adf|;U zmuM>_5EU4p*8fQBIF8fejS4@}R$XN$t7kOoTS-@z+OA^1x+<=U8=o6uZ?rZdZvu>e zu%O=r&o^9T{s9SqegKU`qEOrxXFw`$lRT1Aw`tp5kU?VIA4J@PhZF*_ZxR*SW{F5_ zY9KbVMb_p5J;ZR1h@>k7m>` zOM^k)4rsU=l~<5GrrgjlCN;5f42RF0nPfCgFpq&nNqp#vS#TSJPv)s<9D^lw6C{D< z4{WW8*fm>lbqR{Kzm*Gb+l8C_qX><$M`(;7+-`~lD_@F=hD{e>CSZ{m;BbH^#+d;( zxC82pl}Q2E3)T$m3Z@B!(GnOq09zDs{$ZRf?FGd_+oE)I#0U%#Q;>Z1gNE*!uQ*%z zo$HQ#jrDQliSUkvC6uB*g9gU7`2jX^bPorDz`U9S@KJ-QR$uLwng|~iOH`+;GSVNi zq=fJxV-&&@EZ>%r&Gz`<2KTzEMniQ`Eo{z*rCyo222LZY#EZW8SOn=nxD17(T%?dD za-@qF`KFs;Xl)go@Pprq?PtX}%DUzHq@2$i91x?gw;1gUZ;lmGXY~;xmn4v66$Vxh z_}%u!_EiHgg7Z~QU`%qXDEu$fE+G_$p*t-t*|~(lz?lPSa)HObqG(6Rx3=K6SoUp+ z8*Se*o2*Jn5oIMO%K<_zQi_%C0p3aDUJSkEr`~Ytc2MbVg z*sKLF7y_B+LH7|c7)0NNxO7FHUNR||6g>1`&VV)r7@3_LU;fYD3c$NwV1wuj-dWemJ#MR}x?F`&b^hySVuQ1MbK51{b~E^;~#xV5AQ z!Tl-xMF3~-JC?@#hOJr#RnoTpUNEAxs!AEWPqj=;HmZh7#kP@!NHb`tSR!J<=%Y}` z0G#iK+$fPkE{8VGO1(j}1ypncFUuWULI4MfBni;?CAMX(2QMq6~VGNK)cv= zb=&XZ6OAn*Ot3WkN*#}-`5zAedLsg^8TmIc``egT)dJY3svJ%*YL&E%zmxocyaI?v zyLsi=DzDmAJpZVmg>J1?Qtb7|*~ew1!=e}*X%h6n#KY25irS%<10Il4QD$m7qeN1< z(vODj60h1ISd4)68XwRdGJnJ)m!S)Vep1pTrf4Z>1{nQ7H^?YxcTW#5a`h%xUvgC< zG1eU-V)3Mi#S<|Yp@@4}F%sk67NZ{Ry)8iT9KCIjPJ(+|vCWP2wi99VxodAry82$O zN5eUq(|hP)+fxg1myP9QeNz z@GoO9^54c_c|Zh^B;-9@s!p=A1sBA>^8fJR zlhf+{Mfkk`hp&nJIeGu0CfWr+3<@8v9+bi9ng)%TpAh1R{Ex_i`1F0a_!#T-FohM+ z);LP`dE5V#M2K9khl?C+RX0{wVDV?2_Q5Kzu$i zjvK#^^Iyt=nB+fPM!`p*Ys)dV7{}#b%Xs*BSRALX;&{lMXR$tHj09=_rV7EC(^-Y4 zs&X795Au1~e_wf=G9hB(IwM%C9x{m))y7hNb+NHO22G0x{|iY3c3o^NBm({U1C{gP z>|8hu6efg4bugNLNTm#L{fl{JX|*E%gO*^T~%6D4V(D^tyu@B zoL9ji@sMg?9^2W1BS6zO|Nn64P{I2?oQ3ATIU!6Ydp}&()EM+;IO?FhH#rI!=g33$ znhrr^3lf%-{g4rY9UsoEOfuNh#K-I*t0UyGrp!{WuP%ZU&jB3&z{$=16MxS>cGEKK z7|}y7;MIrhslan0{z&&0##R7cKS(w?fB%2Oe$!%l=4x0VN91N^q~qPc6$U^vtFwr; z9o8+rr506$JiW$-)}EIs%{+^pmb$Mz5g;LpiSax(Z$P6bm?aw>qNlQV!n zIU_w)!q0u+xLZI$1FScNcNoc}0A?A0zR4L9erCX=0N|OY;bmq@s?;%FXHr#JsSF$y zqvp4TGpQ+=Y9=*Roo3&`mYSZP%%sAxx%S;_OlnptIAmpHxVISVF=@#FhE9WMd9@yM zF==T4mQG8{OqUBI9wsd_H483TYSuo^VA9p8nQ+NWkvaQ&COs9T0!CXcbM}@@dPZ_8 zT+-7(oTH~=GE~WMsIMwL)xAZZ!(>1HUx`(56@{Q>qsU5*y*p}LX z3ZhcGJH(U557j}fhFxI|1}OWKEWD9NXoFC`>6s3bq0jxT4k~N1S_;P$BV~fJpK^qB zq;eaa_yC9EAT}M=+KBBC4);;82+kh{lsBwR#Ihm)E2~*iIxFfyu-pA*!;ow^%}PeG zl5wo0l$97*Nd+qz&q}ncq>zGKrN;W+hWu$qZKVC_tzIUM-mme}Gp@7Q!D6 z=64k7lwGz*S3LgZ~Qn1E5+0fNBYVsU-lUmaK(8pr<8p$gTtq*=65F zvUiaPfHh!Z#7l%Um^uMh45#V1HOVP4tf?c|Qw-->z>~xquUz;7#rgroDlrv+sX$Bx zVJa9?A(-lbDcCW~hQS~3(+q&?z@;OmA~A&#s%$i-I$^3aP?8v+Bwc`#b_Gfr2b3%x zC|MFvasab3@?@YyaM~*)N(IU-4Jfw^%$JGzvYWDCX}^0@H@N1&Rfck#dcsxH)RS@t z@Tmk9H1!fmSXR;pAFHG->`i&}1&49{OuY3_AGx}%-^2pZ%g^x z3;gXR{`N9|dxgKf%HLk+Z!7uRD*m>bzrDrZ*6_D?$ZZ{3Z@+J}-#6RuTkZGl2&KXn zbx*I1bZ-nBrhM}7I-74EHlq7t*s#bi4`9QLKZXs9{V{A<0-$2R#{;NXhNJ)|mLnNJ zi`|esFpp9ox4?YL9VvqHC=cWwluvmgkKjBw($_OMpYldtA$b5c_U-^+Cgc;E2Vi60 z(0l+J`-SBJ*w{ZTAHc@S@H{x`Hy}J8Ajg3b07pSV5%~Zo3GSE&z~hjP`2alb5Sa(y zhtSA;DjbDH2cjMS<;Dg`C0^QcsmlB}W9P-=>XN{3S@DU^v)@v=iYUUpy@yvU#FSaui)i~MPL z*&)@wlt%+#$936(A8E8ePwd4z-T5Jf%iDjs&hLd)_%N7Q!*@>d@d5sx@NE!NRU=-3 zC(l&=LybsXVhBS~`@qON89wV%7uWz9fCYGF_p*8uw%+qk zevT~3c1egke7y+1i)8=O0KZMm9XeIP&94kTIRr7_Cjj>Jd$){qbgFYD>+d(5w}HTD zbr20N{NH{q$juJxC`m0*@kise7<7usH$)V0d>9Pi$%p4n_w8N|cVwAMa+6%>ma9lE za0)w;f}koK3k)9os-)Hc+xKDDDr#hThY_$D+CKaxm6%^ybg;o*^ZP1tlIxNIzxo^C zSYmY=H~7l=0PirYAZxq$!yIH?d1RZ6WNqL9Z$Jc^V)s3&O`a)uCi8$d;M>J+##I8@F|R{ib{(xsFc)@Ht2+^xD-wjZak7c!5QD3_7A6 zj}S%s*g34NGT>u^lh|s2=qi6?dtM;`nPWUZ!oFrb#BPrt(Xp*Co!mIszu|C|KC+ec zk?r~=0E$3$zv~Hq!{I7@R4eJD+Vwl?Z{t1+uc$a@IuY$<1eVo41BkLux7sWUekO*+ zkOMkI`ciXyd`@X?7c7xRvhTq{$a)bUrBSX`Wz>VckSuHOHAKs+gs;|4L`zIt`PPaD zr~APOh5t$d1Pz<)?^jWdSq(pF!U4g-R}W@$T0ZQP>jx}0KL{rwsj0#rzq40FXC659 z_XFS+!MNYklsD*W%M9iHi6V69U8lXnRiiu*%mIg}w2`*9tubx34#-Afp2r_Y0H+At zFVnG|-nHBE>(fTR;ma4bBROP%;>?chw$qG92n0u%oh=M)q@2CON^dVd56(!Y%AC^6 z3lAddErxPlZb~mHueVcrd9-@dULX(XeS>6@C!#+s>QHvJ{jE8z|tV9wwQp*%E)x>Wq|Rh(bmtY^ulR3b8sXJw3Cfy#m~_ zQZvP1IB`U`b-fSO=nVJC^pOT)Q3ZH8NET&A!iv5+! z0Hrj5?35359O0=9S4KORpp5!b!#y149UM`nJna9Lus*pg(%{YU3~Y`s zV12YK(;I(!$)_L73}AiW(@T%AK0{b$DC;wfWk!+@E%BdN(z8rC>tkRMd{zm*sRTIE zTGrdhO6piY6N@aY4_ITSv1mH$GYdA2&xXC^V2JU7FC{I41LmHBe;v&-CYE^@-n<8< zm0j@PjbytJICo&ZK7_sNAHn}))CnvM05yeARz=MNsA&w?Am9U5ly3rs{C(9;NfeyC z4pcg(vM`m6sa}{W#8e+l^~cm8Oby0V5vGbUH5^kTFa^6P{C!7bN{6X&m@36o8KyW) zRRHBt1(e4G>{bn5EU1C60@PEqzprmYQ)~*pPi~sji2P+!o2F3ykHUP=|8YDiWGVO( z0zD75qd$S>BPY2)AQuYc(*pU7Kt3yw&k5vWfqY&dmk8uifqX$AUlhof1oCBpTqcmO z2;_2sd{rP{6Uf&Ea)m&y6v#IOa+N^-M<7=V6n|qWwhRn1{_&+?kWt2$fk7r9 zp%e@20`L|~Wv`-Nq<882P21#4IIt~+5BD=1 zF8<7mBV463+yES|n6`%tpLQYPHY2iiQ^|)5pLVew6T&@#!&Q=SPxIjhz}H;(aL?fM zN*v){!r@+a2{+IgZV(O^dM7@;utAfAYeTkQfjy89_d0}oLkRbG9Bv>9_YNO!5PYA7 z5BDz|u2d|N$|@oI@V8GQnu6if<{s2Sn(V)Xl(Udgu>XGp93Es5@M+ia1kqGIeCG?kN? z^@1cX3MbDEC(i)M`_!JiPifmehr4!emAj+Pz*aw!>6d8RWnk~j$Lb2i z3h(Z-XZkf9tInj(T*t1>`WV>S$A^0phYR17;@b$`#b^7|CEPB~aJ%AgJssiBf{k{# zZO(!ZMZq4sE_}FiV2dB#xn~de3D~bE?n1&{h+UiYpbKCN32vKD<863ej&Nb0p31hA z_es(l>kKyzhwJSK_Z54%uZV1~0(&eU?rRY43L)G#aJaD~+&B4f<7{u)!(D^J^>Ku| z0f)QECEWOy;lfs9zHM%|hr3;5dmq^2`EYkYxI2Y#cjIv5Nw|9);eKKdcP|bXApd+m zAHv}_yM&wI3^x*|7d9MAWuu|i9k+*jTx9zi*c140PeQn-g>b*c;U;*&c+Yl@4>!_w z9uvAmF0omg1bU+53TSBG+v9Qp#|3sL^KrR`@< zS9j0!$dW-=`@Q$ss;;T7uBxu8uIvB*|9*%bvCHxol;t)1Y5Kt5pt3}QG^U(TMVl|T z?pDV$B?&!&ui_rn?gjU%C`qYXk_T0knKU5uYfdI# zQ>|~P7?T>s^z+ZiR_lvp($dzBLVp-OlQwhii!gx|!7^b<8C zA&13o)ZbIobDpS{9Tj8qf7(%(C>YFtOq2WF+IXZEcrI(DlbUr>OSG6RW38_QpTz)d zJ)lh_+RV0R3qMTL`mOA}n)O}{1+IKrAj!Z~tIm3m0upT#U;;DS5q|WH^?q%VW^yio zW`dPZ9~Hb_4{PJ`)p+0$JP@p0Kojd@nz@5ZRNrn#4<^GRkL2z z+-1@$)(^Fb@VjV{M0N8cZ9JjVZ?QxI;=;daV%k|qcG^Ef%sVM2z5LI${S_4TPCII{ z!uqAiWx*Yk%NS$7)~sJ^<6UbdD#3qfn1)wk_WLb)BFW{}@5mEP#;o6yrv_vAAIP%; zgX%f*gp-$97I_M=1o|U+ijyVQf0Cy(xybqxdCD;g{8<~v^o5V`e^W&Tt^Y&yP)*-p z2dd!>RD(69i?**vsZWsCyh6O|-TJt?lzv{B>`#@y{ov*k$6Nr&fT#HI?*KLD}O(7@4D?=Ha^-ZTf`?gp1% zoFC{ReAGb(rK4=-@toAL!$ZTPyN(~~9vaXN4D=7CVh!S+$l)Mvwxd6#G1kZlD6v?D8LqDwh(g3_1!GptK$ipZp$0_@gX;mV z_T~oMvU|==hMD;2L|VT1bp`G?dXBRAUvOp!NEBOU`QM- zVike2I2eH!8bNf(1?YF0IJu&$Vu1QGkh_rFBH=H_`6P%fK%Icj6$kGbw*QnEdLKHq z&1L4;aTjLnxS{i<2VwoZPgqLd02DCmMyErnRU&K?h#o{Q6rB z6hNgrdbd5P{sH}fV7Gu?$Ml>V#0?>CJ_73u1)`R040|sEy$6`y!C9X@MaU0@LWdVm z*o%EVg91#RP=GnGd&hxYyE`{+^pFBvpa%mbjtkzzt_oXJY3rak5c^&xg$%@cD5fTd z4~{q*6&XV*j~0mDEzCJQlmzU!Cg>OZ+ji{Pwei4)9oKEogsV=Rz#fl5Hytx=q{YD=pJnBpElA8>Y``wT$c4oGs^a4VP=Vyn@ShoYiyrGS0$;9!;Rr4P34wcy1o$JjQt= z=S^I0;c_dN+c`r4)^Pc9E?>drE4kcBc--nPV;2_0yScW98`pAUFE{pa<9Zy4VD$6_ zfVk@`9K-Gnn$tN8<*^DWr}UIj-V>)|B^Nwcg&rAkC)Y(g^hz-CB3v|=nxT^6gbb>wb$-;N-CP`Z+v1$lB z0Qa(-tRiY8)hE?TnorWHpX@-HvGNC8b9@QTt`gaquRzDxpPe}c-9$OnA$pQBB2V|Y zxb&c7aO&tAkgT9hu98fvFP%dDxOtg)$(z%CHw+wBxA)$Hlq#*)vmgB3C<8XGORIJf-q79xzk02d`(g`7*V|F^ntlQIZBc8Z-ATAC7T&gvH zqA}5AHbv;nH9{w&kwmN68lf}MNTS_r7ktaYaku1)`{={7_vK)ZPA@ra(jaFB69#VS zW#=+%%==f_5uDjyM6hRg$v;9wLt+ZIiF9&A0IWR^rv^uy)t(*JBZzEz#l&uh&|H5w z)w^-7i&(of&Kg#fh8D7Ejhb76_SujlO49S*mPt_S8)IsWy8T;cFvnNmP>}~LabS=m zP@if$xt2=Yx1PeNffkV6zZ4 zxI|v!oYZqtu&kUuifL3u=}6&=+`J%3u{W|)x{wgfITM?9qVxaR0fMJ4R!y%k_w+St zA1=%T3DCSBFF+l6*7kNkTxcN9Hby9otxa@5s}}269n0c?7RzF+KR6IU1wf*aeZ&yp zIAOriLTN5eW{XM|l|lAav1IYmN^-0I+m0AsyRdtED2v=PunIBUJ3ZTbe=ftIIBBrc zSmQ|pwdw3VvUe_NeoD`V*&&-uZ+FF*eqpg1Jju`2LSk1pm*R_2+|J9JzS|j~(W*on z+dUtym-}g!omI^0lBC6xMF}% z*eImKTCRf`3EQ(0?9iP4iN!w24FUka&&?NZa1r^-gufhyoixnL*uvo8R>Fn`7dp%Z zU>}X<)8q$4bG{j?4G_gz0b1tgU{}(`B*19qVwF^brDwhqqGI5tg{)!~CTO(_(P16< zgK5nxybg1)%Z{!kxGixI13BmrBKEkRW9CF?NiH0B$#i5gK!3R`}j>>>5$kvv$x?YM0a zU&CRbS{#3K+qD8u7AR9F8uj$&3L6f?Swe}`$A&cEfz!dg9CMzu=tR(6ToKD=C_*qI zf*sU8S9H(K*13o}+Sbl}8?VV&+(V)Mm@uL+;IWM^I9_*a|H!D^-^&jHglF%e0bk0- zIUPx34xVLtAaU3*bsMHm>*?zs=#^6go=I%A_jM=< zaUL1WCd~~+)a2;sZ~$xH9zX*n2S-N?3h3{Kae!{OijG%2INC>+{=29=BRXi~5ILvU z!@eud>70Shn{jq_zCpY;;UKFUP@o`{YFlcwZ>V?UG1SXQy=TSYO~gGb^HfCP^k<1> zS0v?ySw=}IUDx7|MnreHGh6!J^6*_id4>|c=SEr4IPyRXeSNY`>9@W1kH}w zO!w^go4t&a1XYA~aCqp*VQu6{_r`&2qIW8=bKdChPE#F=6T%rP+pQ;&93_nDhuCDZ zr~>69hkc?cVQ0XP9Nq=Ixs(cnfnkFj`)4m`R1I>(PY#fVQEZM}um(HOfo$~hV$M{j zb_u93f@7&@Tc-MAZbtDupf>ss4(4ZKchYZl>&EzQ{|LS;+oGbt$tx2rw{vi`A90f-B;fINZn(B{`}&O= za?$-W!382du_JZ@ikmDS)$KdBq?5qfR!tV(i;^fJL&8?1VhPI=fN zRmG#CNyX9curBte!;Zw`%^JauOpnu1{3r$%!ZGp-zxbxLT@>(UujF={Kzb;^SC<|x zMsjT&7RM&kF&xW5+zk+=4U(C5juS&zg67+VzNlDxSW&3M+MpwE+QHqS$QB>i;trl1 z7{JKc3){0^NPz@fDyx{N^Jgqy6S_-cMw`JIn$ak;yo94|e%tTvo8*hj0X+)**d3+1r0)L`N1d%X+i6 zoc6{l=9DNoF_4H4_xFq%XzaryI|c`iE4QSMr#Xjb8(iJ*-5!tgyfuvp3-gX9W+2_3 ze&ppLdH+g3-hoCfVCh`;COyxap2wCt%|xyB45X6789r+H*m1pEK;`@G3jx`CBuhO* zhmT)P`1vFGg2URjI*Nn1I=2^Xe+@~S2t4KjUh6k2sCOdzZ&^Nj1~zy3+|t^r047HP zZK(nv9Hq5A0+!You|kt@MDTipi?yw78cjV=idsRJ+72|JSYvy8z%vbiCNvK*;`|4{~=1#prU1>RB2%SN8Hyq|9Vb@6q38|t7X))d6Tofpf#TrICSza(E+c?HV~iq{uk zUEEvz8>aY~;@WpH{X^j61cEk1Fk(>;-cvOPM>$y5%Zs>DM#nm=g0sa&F#?z5Eyd4D z!0{UZ>j3jb2e~gv#|w`Ajr4NxC)jk%-96~7Oq^yb9Wd! z;fL5~H)q#!;Y89|G*yrf0PID2f!Z{fIkZOR8@ffsDFdMYOVtFM?H<;Pcb8h z86Xkm{4@9?m><9d$)6*rA7%hn#rOjLKy1U6e_}l6OSpcS880C0qxgFfe_z4hOLYHx z_#4OHBua4xfB%BNf5qRA@b?q^{S^X$5f3;5NY|YZctN}sO=mUm-gEL6{G)c3LzxYYbDQK+ieJ4K^^$KEZ&qAu_;_Hp(J_DLp} ztG?$EYZVw=Yre|Hib7PxMPFm`*V#X_Z?JE&wD(&X@3%AFmowh)WW3+ac)y?VPGr1O z8Sf7=-d8f-vl;KJ8Sf7>-XCYY|CaIoEaUxo#`}wm_kU%)|DN&wGUNRf`>p%(zsrRF zp0P*SV~pr5N>~R@ScNbUdUvd#L#W?@Q53RCC0ATj9H!O)#s0ml6Gx=_gSaRReXJ9w ztG;3q5gMTE)S3T%2;wa8*SPpt&iipOSndaKff?AtxWEqV5nNyh*4ashV4+Sj1RLrk zLoiT(!Vqk*lMKOXi3YS78{`EjCT-_SN`XLy!&yhKMOHMOL=@1uI)|Q6b&hGQ%34Mn z`)bGm8Ki-e*xD}_XRbKetwG!s6xT1UfT+*ZCLl&5hBNY-{6rAPQI#hkc~sPZZahbn zU8@9DhlXbss;g40>I4yQRgS5L^l7{uDcEZrg1uLfwCWryW^hVmIHk%e3nIP&W}9Ip z16DK9c_^TSY$1=@mut0+?;+g()#D+lhvR&~%sY0X$Ct=A^TYBw)}sekKpfNU>*m!x zMz>Mlpon!FNxs+z`jVKB7fhT#@ALV1x9-zJ5(HfZ*5ybU%EJZm zLg_>g4{kwvC@*4E)0q_{w+C_P|(*Z9L zjA`)_oQYf><9flTktO%(*7{A7UP=cViy%F#Wo435&XfvCg}ay(@s>zB&f=kRXMBtJ zw&GN~XHmH;p(e<*32SsB-jf zt-6PI^ZFiNMWQMkg(!~*9qsy2yR~jk^@B=@=~}_}P*~lkb*ny=aOl?7?fQ*IIig%*!ZO z#J2WLq#NYq8ORzZ!)>SHVODr0ikKL$@6jp1L=#SQGM|pLtpihJLI6>C-IRD4@U)TG zQJb=xwOdVctGip>Z1vV|hD{uX>i|){_PMg?HLNeiYDp3;SkEq(`YfnlQB~k|$$kM9 za3~1Vg7L^Cam}0+R5R8f9>T4~KE*mrm9m*FX=q-#N^YP!iAZu(;<~2k4^wS`Zw6I> z>WH1K9BU-=$a-m%n)v8Bwo!%?SB^s97~T|$?SXL}YG2g+8OR=mSaH&9o-|t^{yr6N z1(l}RG-VekDG*_b~e6KJR>S53|WB@m7zJhhFP3Hi_3VG_1@XqSyMcuw|^5 zK8&*OVvmcr`3SQfXNiuk4r#38jP;Ss8=Pj7q>yTZ~VjF5ytNF--Q20 z^F}j~+z)bGib37%W#OY1`L6J_BoA2M7gZ3TRr4@v0Cc3z2XWI``WB|>z1b^pkIAnv zu;n^E>x}g(OWf3TlQeeISqr?RPKSn(tEq*LPnk)4+Mp)IkK3orZv6NubNc$v$U|lL zh3M=#)GO|x%Kue5>mHHyuSC|rf%{JRH_ZBNChOm`L{C?bG}d$0I+xBG2C`FT@A!n7 za)wFK)&EGLCPEK-L;vI!=Fe_n{!0`lS3yrWgtGiabc8V`{Y4al+`Lfs0wb~ZViJ&vc(#c$=9B2x4@DrxRUAXzgx!G2m4CR zryIW~B^)x!wY6|gGIk$^Jq%4W`qAu;X^1XRU=d?sy>uU0?WWisNz4QH!;6m^W@@t8 zkNHS*=cBX1Fn!;cTdI5XZoR&T+jI5J=FR3U7>A!G6R#AFv78YHfMuhTiHC~PY z>oan2HSz!@?WFyLbL%wjJu3&HE@4=oqs0H3iPZnWO`WPkq)xM>NWD#@{)J5HZD6ns z{zyg&U!v6MiFE31)|chri*)ZLc@iBLE%8-3_!$cLCIZ|7aKS-h9q0kW&M>F72M(StQB+4|>tz|uWMUa-9Kaer1 zhCjsOx3T0EFw_pNq{MzGiWEOa{IgFZlOM^!A`1VxThw33K@|aDoDDzD!tpSsy1^S}(c*YA}cZ z)B1`VpasvPSesz*?mVIg|A2sg>l$P4x&pv3x#8;~Ca zVs5w;9J)@7U~nA*?q}9d-H?JH7TD-tAk%f?6b1nkjCuRt-GBwuIcsSZyL=&S$CfYj z8RhrCaem>qUOVr9{d~>q=lfnie~Hi&XoX7L{ zSZQmt_cgIKvMhNryaj{EBSIhWkMd+l!iV%HgkF^n{j&&dv;Iq_WlK=SGVvLjIms}e zhKY0RW0CB$1UV1>m&Wk;u02crQD6^-LaPh)rD9rnm z@$hHFmMB~zHdo{?5$#$^Jw?@0ZK|Us~;)6AE`WwU#J(7 zrHkp)yPaD})s(fJqrGls{`6tPJAFg+VJKM+7*)Bk~A5`2~NW>bHH(UQx5yQ}D zF$_@wX&~Bym>(k1lc|~Hx9C=psvS*YD^8}0E&7ddx_rj0c z@p~AU+dqo}KPzGno5Rl*euPYjaE2){7zZEx;i$B1$ zx*(31te2+UjpJOg&ib02&3mXyzD_U=3rKIT7WRFLRg(B1OVpS(k;G%nd<@zh;v$sy z9;GqDR_-{1!nn#Ej^MXp({L&^xEnIG;k0r`Oz3tv5mtL5%vra?Nn=eW4M;e&-W1>p z1GZ3WJ>)W@x~)Y4ti-fH+LNuPh>k{r0&6Ov$_hNYfdLX-`;UyI)+Y}W)-FV#{X@f` zFX0HgE|t7RJ$z)O@6EM6F0g~jGOWqGK?AIdgt`Z5TM&w#P8+@p0HSlodK^v>c34KsxDbmHIM$x8rDEj7UjFb+2L9M*FqNJjX zl`Sq?Qns}Cvf@=r05-K5fe|#lpaf=XfPuNWfJ8;gLZWRZ&SsJsl?&-m0FsC*5(nw^ zJSS|_!_0Rn&s~X;j>HbK!XYt1vI1yOF$&+U_#v0_3xvHqNym{2Vrk3d>gAyt;noVb zu7N@#!XIS?g@%lSZXAN=yF{=I-a`u(ES5Uw3YsB` zvBoV1s!E4$4zU>xqSTsD2lB!EXLvod7>l6ju@hWe{bqlvSD>iSbKc2OUcK5?A$s$r zjSl5M=m0sZ5WkyC=O{Y>?b>M-)X)R`fzi~S!G3UZQns$D>JCxd5@(9Hf9)RH1>K^- zgP}s@wq~DOuKX?62<;~*M-B8twaD#X z`Tc`<6j0t<27CKKT36x>udAoU2a8MM2K8o;8p2+2Rqn17Xfm)k+(-!GECto75oijs zAvQwQNeN-uH@!w?d}XM`O^=6G+cS9U1?@(RXW5-F-BV{9a%?N>xpXmtK@pkU=&49S zZ$=i?v|t8;baQZe<3d@esjXSY4_4TrB`N3Rf49A+!dylrpZBb8Ru# zmOw#AGkESYo);qYW$iMqg}G6|jg{P3#f=7TM7Rdrl{H*j%e5=HuhZxx;wYe``i!D6 zAM^R6Co15NjbWGGh`~gc^d=cBYi+_^E!@k6dxda2gu9L{F$}+i&5{NyEuTtOS{-s3 zR%5JuCmgwACzdD5;+>j;VM=35uo%NK3`;ac#af8Wv^;36;r%#sNfMMIw2>4j%KVYT z02Q%(Qs+5PLP4bLm$zUIrd(~UpLnDY*;*SaH(T+9G7(o8gsod9!+BVKjhwZ*rb6cz z;Ecw)YH}(hpMv5)ZeKk)Y3d<%8rWeYI4j)Qt%f4cxae*8(f(=M%JiDa@WNAwzk4zv z*Y{|qT>m0u0$R78lu7)23THF2rmDt|Wt1>2g)Jp1Y~@K?5aAbsh?69Ts2mHB>VXhP zR6sO)t9{HehA2Uc7JRqiXh1P@PEbi)p@Eqze&T3d$PmmN5hoY$a%eW|SnwsdccfT& zDTO~rPvY2JL=7)B^Tdf0-Ju^RgBbnA`>rS1blrde#pF)nZ zH6oJ0E7Ch#!?*$TTn)?E`&baN?kuS^Nu%FGIYJ!W_+|O)@`8n05zN$K;f@275=rq( zrDWB+NYVn5f|a#;GaBJ>l8K!JvY$^PF{!~$!S%}@W7cUlLFOILl9U2cQSsxxlV^g^ z9f2S;-E$!Pbi2;SakO!M0p7#<1Vo4F&hxYo0HTYlT0j6Y0*QZBr)fCHfJ22X9+D%tMM8GA}t5K^!sa=P|YUESqS~c`KV})2>Tx(_Mn*iyCykl0uEmPg0^O=PRjsE0t)(`6<=>w4hBH zL@nsCi_`7UOD?CAIBIX}rS>#Csm2XdQlI-{{!&E|*S-BB5(yI-nYu!VOBi(Rv2u%( z;D)zfCY!U1N_FXppw8oOza#{(2$ZwERF?TjW?o7oc;qg8@l#fpJ~%gbpAZul7BV!_kp&#WC)5WzPSKYV*85Df6(hgTb$qMpF( z)yCFF1h&Q6r?D{ZRhwdMjo^iEZJTyyp9-3+cGzw;HBGy7J#V#PDLvUkLnpk~CIz6SWrAY&?dX=xS_$UA(me6Sxh`oTyCoku01y^9~wTA4v zluoW};L0W#a&cuFSFYyDF0R0A3pQIfa^(P5y1A0#%0bv>aRoM8Lu7^p8!YuU<2D9U z0Xo%|)iGfF02T;{^yD+h=O-Vw^KuUT${nL~r#uRSJdnvj@_`4P$%W(ts}ane$cIA( zCKrt`qKh;cgUe zT)3NsyG6KH33sb-w+nZNaCZv#8sY91?jGS@C)~ZlyFY>V%h!{vmamgQ5AIu! zgGALQ=)sM3utd_0^)N)@{`Eu;?icjn0YMKQ5cJ?Vf*w3a(1Yg+dT>z2gC0Cj(1Yg* zdhq=9L=T?7j_ARIf*u^&ZJ-A)5cJ?6DhE9{uo6KJ4%|f0gM+9X^xz;Z2R-;gK@Sen za?pc=v>f!{peqMGc*#1cidBNBd>N|(QF%362BLD%gM+AiISYZP9Q5EIDhE9{D9S+( zj^10(D(LWY1xcj=T8ML_dc3?G#JQ1dl_wSxm3M^|K==y_>5R`lEK1Ac90&w)M5Is` zS}y>6ZTanL_wHQKMsaN9roP5`oWz$;YIMoAAQ3$??BVrX!Z@~la1 ztOj8RUMQG)Q=PzB80=jyKpPyUVt+=8tO7H@%upHIM@}PsLqPxVYJ6lNG&t*CU+)o{ zq0ui&EVMVW)F8CoTefYy<^ly4lC2Dn>SnSRLK4VF(gJVi0XPK5`)wL1dzAp@IK|m< zWOSxTeZa2Ml7k0fdvlB(x8GoZU>z``_sLgp(e1a#;mrl}c60TJ5>I-X#L=qRB zwdd06l({S8&9u6Ze#9DqBi9mD>0OnkrZ$z{M?kl>H$_|wj#=dJ*;1@*3D;XjB+_j; zvlpxR;%Y06k(d%~YYsr-EQ8G;fG?TAWy=6Dy9R(kb)=<2fJK}$KotSGE|+V0T+fH5 zC6^1i3~bp2WU{Q5a34@*%eh?P0L$v7T!!$aipwFI$YdB9yV$Y-mW8gS+{BGmqZL-V zZQR$+{j0hEa_(Qt{jgxZl4CL=%@y5m>$iZCN@6+s()*!AQ!3>w!&H^GxPC0Zn&R=W zys}|cM7UAmHVU^{xGf!Yw^R7nvC3S+Ow!~IjG_WF35=9r&lB1%OUam1;bhDS!3f}$ zDly(bgN0^Gf55T3RFptY6q+CycF68BNSZG}K-|IZ5-9n#P=8qf^Gn$(8c!&pSeL>8 zqgsqHNmgL~ODZ#!Hd<2X=Wz~|lq%ack`CBmAGr(>6-CL(BLf+TcWe`lg=`VYKyq!l zNSat=;a;^k~+&t2Y3FOoxcAY?mHPy;RBmw{grwUWaI-tW= z;^i6=#qnbNB1BkCMeTIq34pwwWBF3!IabXYt!B^`$!5tzf>(e`m>|2@h=j`y+ z(?rd*EwV-0wh-cy)58u@%m-J@xnLt3hI&BYJ2*;Za<}_)F3+$dVRuC7l-4Dufp=Ov z*Vl2&F+wG{gr||Wqh63X`N(e4i!^orXg?G$Zcn)n2p*P^wA#V6-bva5wv5S*Z>uRZ zOp7<0dcp;23SXhfqYC(=uzLY!x|z zOO-FqX~kx_Z9h6&!j2Z>418Hq2g>w+0dTUXa8OGF1QY-O00;p3l8ZiXs#;&c5C8x~ zDgXdK02KgtZ*pXCa%FRKFL!V)X>Ma|b!268FKTlybZKsRZDVCGaBOvFX>M~bZDnL> zVJ~H5X>@OLUvO-7XK8LOYI9Xo2>=5(N25(%yBtnccmx3c|Nj5AT6uTdMw0(3GA2(8 z44dE~QkDo~^JIxS9LveZp3EN%R}Tc5WRtiAfTSdl-+in4z(GpRc;0MYoPdSy>bmP! z4eQfY=w>Vmbt7Lp$&qJgEPM`JYSO3Jk36bt%p;)_P_kiOHYan+X7h}s*|SfHv zT;EAkGEZa2rDQGsH<`JSA0;Gvj;UsldBHYtmh|3a(-~Ya>9!sd3MajPj-CW&gbI9H<+_zVl3zZmF&V@wui?X23w(G@52ySxIfVQJ5u> zpSI-277bfr8pK@|PPxi|NR?6HewVy&cevL7vtsV@8w=1c?e1jS?R)*^ncI2a>`l6$ zvU}EUdMCZJGiTy??&$=Ut(ixo)+27r#6~IMX0tI-3(6&X%#>`8S?sT7EIf#gt~CAc z)bW+w-Kpz=T~3;36WSBOF*)m@NxN-lI+?iclv``%u?XxGhs^|b^Pf#|%>QQ?e{$A% z`kCXMyJx+2v)$`a^n0f{Iics=@BL}-{M!w^hM7R@eadN)m=0`kW{FbK5q*iwb_$khW;JAJYs zON&kQ;Q07mV5Z2E8u`K=!Rjc{mv-CAk`=X{xB&t%K=5H|`ZSznb1OhIEbZwi7?0Xx>(S1!&kUB(P*UclgZ)m# z7k0+mtp*(>fDC+NNmnj$fiiJYI^fik@s0}-gAnnDM^hZ4WQkE0f248hKx?S?qj)^F zA9vM_{N%lTk}6jNA88e>0ls~-{L#|PqR-KWCYKRUtcwdnD+sNiaVRL>21$V ztfGY3L9`~1842PU{5gR?bhfuvCLNc-cGiq+0yr@sP6`b=eS$~$vwpI$7>PwmKoST3 z4J^!Yd*LLS!IL4=H4EHQ1m#+UWJ*>fv)1-nE^65=!&)8SkTtlzZbXCoGX=M#A6CjC zDLN#x{m~j?YR~AHn;E)mHA=xz*>1NpAUZ?3Ir^Q>hEK7sZ4!pL)o>b`@#mkcy;F=R z0k|gEwr$%!ZQHhO+qP}nwsG3FZQI>*?#=AZoyl&pGufn4skcA%__>q!L(gc-pInHU zAorU>v(|94O^_MNPwEVpB;(vYS64uxAfwX>i(UK|7$EV_lLh|}&2o!*<3Edt;ZEvM z8LgPIRzP_xj>rHtYRhI{oJ2Gr!(jDVEv}!)XfPP^Mb7{rv2hj|-OZ5#Qy};b!5v|Y zYJ}82Bnza>UiJcriEzEk^j9>QB)>zrKH*E!l8kybBH4xh`Ji$;LsL}n+Ej+zbM<<# zq#=~=Zef>xX<3oAb^gErKZ}8WMw$?yIzyG?=okWdbrkZLXl}z_W;Rz&O{dX|xu7N( zcY7gAusT38VS1krm&)6e3b)qntNdX5y|yzoy3*c&AqJB6Xoa^-r~T}?ss0`mDMCO0 zl)golz^ft2h#$WY?b9Lg35^m{iYV#}A9-yhUB6fA>V!#~LOOE_hRBdj6>5HY;XEdY zE>x%|D9qt5l)jsLHJR>Y|FRDMIu`&_M_{L#UOOFw9&V!yIdDPE9UPWHek6(caBTho zP%y(sI3wX;$gAGyza#QUNCHH_mIsAD;qDKV}Am)$*yI*ge; zylORa=YuX3lWB)T{-h#Exgi0%g+I8_f4LOU76jl1urdqzcex6fgS;aRu`b?G9*pYE z&1nssF)CRYdtp7vuff`eb~7%Y1i_*i-@qVLFSHUA-dzZH6!qvxe*qMs;<1N^X-E^UiAz1=xy=RF zc#jEP2EaG3fq)OT8~c@{a*Ic10R+c%4D{Y0c78{1-4I~Vk;~Dk&H1E+3VI>zYj1`8 zX(PZ=a5wrWDgc@x-1q6SMS~;-!*x3FLzv-8STdOX%T5)5_=?Cy8wPNEd}Imr7K@_d zE@(Z)10D_4)h-cBgf<2pmQAo*jh|U*brJu~8@2TU#(hri^AjvIlYSGFMG1J|*M}oP z9${xzutuWO(CA*dayz>dQ$E9vHG)|ZYX!(5ZO-=w0A}+g#=oiRM}9F5=m)`Ty zD9b$~F4Bnpyxkd#h?I8KGXT)bTgvaru!5^&r%xgO`E#e z3lOE6%04G#Y8^R5b=wf6xy?t#V5jj2qzfX_v02v~qyY)ipSIy=@y|H-0Gx`xW?Gfw zyonVr;se+z%%xSc8HCQHAc#uXrXeq39qJUP9mrVdTtyJC2-ce)&fJ@p&!zpbH@1XB zQy;uXy4-dK6{VpeXbcztb)@wZw`4Dcf=ikyY+9%zfWTBPvSyhNV=srrPHkWZMxfQq zO4cwdK>sL$egK{vQx2A_Yb9#;!q0IL+G>n+R}YJ*3~t0VyhA&E{RkBT4)@|lPl)cL z>;-=ygn(lq%1BK=3A2aXM8AYU;2mtl{3lq?eJw0hoGQGQ`%MD%O*$p=-viAA;-Kg# z!*&D(aGI!%L_u(r;T;U=A>;j^C_5I1fchtJk^TtzUHWFM#szw$G<&6e62E;Ee>eq& zjW5P{xp~@H_x^xVHG`q5V3fZ|i}?4r-d{s)dC+BYe)@Gbr2M#VRZ4;`&-@UZfymRfpbJV3XzJh$T}B+ zBSpwTXhc+~qmUQ}#_h37<}qwuE4loC6jI}(Yl#8Tv~992GafCUdls( z7yKrNCnqb>{!@w(*y^g`VNIqWn!gbJicUVmgTy9}h9j($TlTO{RmCTTUcGm+8q;EX z&&uMBY{puGfEPAm01`^t=hce;GS@|hSOWZu;(B*-6v9IqF}s-)prI`aT0fz;ERH}V zNxR5v2Y5nO5cn)CI#$YEHX82CP>U&w!AFMT@(KiC0ftcW#t}~iTG+4%LQN~~pE1#F zcA5n+U=9JE-rg!`YbaXlv8r(DWs-{rL{A?h1H|t-KAA%ju zBTW!kuf)w}d1@Jj!{Y8n;Zc{GUJER>{3)d@c^{W~n$qREUU6p1kW?Y>%c8hpn9qxF zo+d4E%QI`RDWpdPD(VM(D9XFE=H>~A*!cKOZmnZh#Q2qw!FD@Tk`alS$nM+HaNeyA z)TGcs?^utphsSU2Q+*q!yu^L2tkw%%!kPiIF{{C82?Joon3dw<(cg}(ej+)hkU~k4 z<%F!0?@M}4G~lBR-OP4zZcKqoU>>NP6t;&(F4((xX>A|;$#De7f|%jEI*!1!a4^kp za-JXZ5vw?D?k!ng`r$Nig2na|g9sL6h3|mm$lWMDC5$99qM;F2h%GXtqp+v$1JJSg zFd}??2!jz!uR-J~UK10I3D#|!1qo?3LBDAC{=)>ChsSHN$~TEp+P^gXgRBH^(EV3` zj?fUkLXG{m_4K#m0Ot7s3-Jf{{4{d#0G8_{Ec-UHF44IM`s&5E-jkIC72jh+Un;(j zL+eJ)AOkQ$0irpSwGYdHFjm2pMn}VIovp}j!15Ra^M@%{#J%YjGz$W=mC9%&nkG3O zd9DoLSY$6&#s--K9T@qq1vl|s{;tf;91m+wRY3WC6wwJ2Bxe>(nB~%`sv-#&@)zLR zwt;)w@AOd06X;6wm+ny5gXULSUbop15P;g+6ma9G&jA536NJ0B*6x>JWiH2H&P+!^ z=_o_V?yR9dAA$SOy*%t_qLR>H#WNg8Y0o48R;pv(*0k_c>);w#w2v$hxYt8Ellce8 z!T@r2;%njp54;-dpW{o%8$qQvlC%Il91I^zWuSu`F=y_kc61Cc_tK34zWb6=6C>eHm=!QyqfpvX52!dop z0fmh(j@3tH>P=v(opR6R^C|j#rXExEx3*CE%Z{?8uS&l14xv4J-f@xori#9W`(iN~ zZ@Gds6{m6)18w|Ib-`l~JQ5I5@JmTG8iqf&82=E0-dP&44k+@d(*?23H}$uxmIis` z$mQfijsi|&IbP#i!t^ZYL%V|7T@;dAIF4U4;2^57kS_#=Dq!+=IX@Czue*suM1XzG zg@?b0nx9KvZCHNL8+06$uWxd`3o-o|s;0{8!ETQ={>0>qj)^8>p2d=x@KK|4E$CnLFG3KXN74xK?qS?e|VEYUNNH z(}2^SZb?E3!>;ou0eJQni^iK)e3;F`o82iQBE?tRVDGobQb-aCt=1AVHrDzLsitFu zry_7+NUUGmS$^HU@3&!XJArh>w?lnDACGc%Jiq7qcau%4K?7M?e|G$STpxeTZZ8fN zK82M~<_7kzcYS8{p-PLL8mSQq5aic5_AzDCkR8@JEXef8q99};qV@T)Sr7`| zRIYrJ2QX>l0?V@Pz*BuF{DF*A0^46L&SZ*72%VY)|brtx}yqVkutIaBLdQU$AfTh zN%&1)_I@(QC`>^Y_Gi%BPmOPjFOKg|Kat@!ByAG^a%|;6iT&b;Hh?OGtU5U*38azH zU|o@n>|X>JO->*-SqB-8f8UO;kGe;o*iW(a=zy_p=b@@ye@=3$$$8|<#ZI2_b0^I> zMrt3h0|1RS$Qw6|U*63#Xw%gu7M3#TmT0?)jVpJ8WW`} zy+Zj&kWMvpV!oYEIw}fF|HqoN2QyGXoFJu5Ix}7c&dOSfa8_A^ajbo7D(is7m^jRD z94kyA*`Go9-us9z?KOIqe@m~@7Q)ivU-JH+yAeofMUQMZfu3tf3`@xqXYg}GifLee zjznRro=_PkM357UkseIST+kkehMzm^{jBIREp2aO8G;Y%Ao%gBA%e&#MU^6W4gZl~ zPwaO0%alEylubF45tR1pp6h2Z|Lqh8v<-zegW+eK-fqn#$kI3dF!7}e*5^Q;e z!cVdu}f%tbTpX7k#W z#l{kh2&_$I!?)Fo?Z;4w-JBF`z+G%1`*`v4gD;g6YT9x0U#1~<1;!%pqC_+p7v7<#f`aA|aAJMR(UiZr-ctCe@ z1sz<4TAF~akuW~IWM?Yu1BS%9j)Bc|boIh3E7bWQ*8BW#XDjn`t>x%?Wx;uBsTOKl z%vD<>my3}Wwwdu`J0(@6g~MN1W_p&8YK$)k4oH*uogB5rG*ID3&}puu-Q{OfC$20{ zYRbH>Zy^Y&&H%^I1(6INMr>2GR4=o7|AA|i-D95>s3QYY1wrir`2cvDbG*bEV06yj+5_~9pALrJ-gQG z+MtWtqToEcK4EA_{;t*`pN9?aGB7`oJjEdwy}>0JCymQ4fFY(pCQ*BBjqT@nx^B8? zjlkHDIR;htx0$PzD2oi=Ep++%W^CCw8fX0oYi;Assa8$#mNNn(wPtvRiNv^O3+aX}BPo7OwYB zbMSDT4hD=8o_OocB|AZ0i_d`ya6yyj+X(AWc1VfSw`OJrKZy?bzW%U@;51_A{fmfO z!gfNn8x8&?DYxzi!lMXi;(rX`JNd;vl6+f%_-yMT$tw`HaG9?Ty^``>Cin(^4~6{Q zZzX*3>6xE z;1XI3cOh%9OYg#0Ew(<`!Sq5%&~q`2!0s$aD0UWcj8l+$46Tw8+p=bTTiAufJ*o29 zUM=9vY^2+Ub<;b76Lc8LnZx+Bhc70b&=d0fQ~_c=@U0K1BBg<%->XqEk@ao9KWuHB z1~0=V@#9UpPh#g#AR4iR;2Cl;v=tANCeX(u7(adNngrW3Ucn%$^zE@$2Huw~YO~g`07Om~vGRIh$N8P~YDc-@(wF%iA1JtKOVd zVXs9wm(i)pK4DFsSdaEaQHaXs_$IJ)BCkp-bE5fvS5q{uJL;K{&Bk?6s4SH3Z9sam`@jzJr#0-!P(~>wBo6?8k#i6sdI~W__8X<$ z)+Hgy<)~7VN475QOBY8xG9)hE+It26c1^X?F07KxV<|2GqcOvzI)xyF!PQbq%&iI~ zrtzIy5RmUZjgk?iPF+8%v)q z8L5D>ctDV>M7xp^+PR7-s5M23ic##6?tv^Ycq|E3=b|F{Tvdq8!|B_Y2tJ*K?SmZ@ zkuP(?7eE2PO_raXvI|6SPqS2krZ9LGVcColv!0eZu`vrZjl5FhWJtE>N__MGC_AAY# zQ`r&1j3BDqNJ(k5*=WIhXrw@64*==}yA^Q8P;+|}bM zTrzhf!V;ILt33B%zC`(HmDt)mY>=-cF`miAOakAsmK8pcl`}6 z#V~=bX%g(_NHKHGa7s_N+>$EHt(;I~fjdg4KXy?=UC)#|Nf*^O;#~d-}HB7&itvS0}^wQEqd?A1&21W2m*jmTYU6k1@oY3b9^2bbpG>z`d1)#1QL&gl%aT zhf?9Mb zODmdpbcxa1_1|j~v+%sxH#k;~>;ziYldmR^ud-(Y@6LQq={wFbPL{>nqC+@r^>#R1 zmV|3q2Ll|D_JaO>X@}9c&9!Bn2q=ksaW&_kh&(jc>f!E<;wu%g30)hdmy5lLADI}g zO`jKmY9z@KRachma#~`|q}$77tv8Ffp%RS1CU$4`LXg)=g!RyG%H#H~u$w;US%=(X zwJ6)3mD-}M(F|XBHA;!d(`v5b$~dIOs#}z4bx0~mo~bg(VVh^EoWErouivs}_cAVz z(1qN}VAehrtj2zeVSZkZDdcAKRGWZ0KY_Vs2}o<25Ye6 zrBca$am-}(*(VQNs4(6hG=O>?t<=V)m?c}SBW?!oN*N=jX1;3i3I2716GSLmjVd6K zx4V75pMc~Vj)=nPM|y{}>j&1%#5j4d;7T|c?%l@GZXs%#F+~J^!Wd($^Q>XJ8n+F?cS{~WDgAh08bA9AoPEF z=l{O=AK=#dKd+9{ib?&~tJ9h`PMhtBKRCZo$*%&gWkiR@o@v@7Zi?i8rlk`*8=P$T zEC`TNGq3J(wMP3(Dbr*WRiusn24B+lB36ntKa06MxdUu2?@}v_a1FPaDBT!OulIhGQ}H~ zs2u1gzR%|5M2xps(=-u~OnnclZMBh2oq1<^Gi6ZpXC~4Me~f?GkUl+~C*>g_9FF2{ zNlIs$-knw}lX2C!a1_<`^pndOMQ|aLR?SL7v&uyG$Pdzl04PY&%9csk8cN?S1w<0^ zdksorjFv&FMPjrAUJS%?n{-(h*I+fACu?ZvbaQ$8DF3OIP%x@l45=5>espwG7N>Q* zHMO7@^}~#LS=*T@DxA@QoDrXGZZ>pt_EP$r|Az^jqGKR;ekUqt4A#jOq)8ii*n){! zFvqjaj5l1LUq_okLmC;0*)^up0}xJ7eX%&cRN?F3w6b;>I=V-&wl)T@h^C<6bAFie zf~^rjzrKi#6rPM5W0m>yF)BDzlQ$1gGDB#L%2uE8NY;vg+Q21+I>RrQ%xoI_fqM7` zGA~P~E7=tO?(1bpW6=w@Z`!z{J=+)u2z+Trl7n8gdqTv)%!dIHqXhvGnt3jRBLoFl zZOmQ@lK}hBxEOJ$ht-Xr)RiP!2}TAv*m$cuxpnj?Gf)VI5Jw&rG7s~ek1+`BN_|m? z`l}Ll%?UHVHX|5dVgpm53nEZs#cXu$Qy{s^tGFi5;w6vw#>`+zH|ykFTj-Cu5A0YW zquPAn9iC0~(>PlS?|QzoUzX(S9}1stnUc6wYM)+_oY~bX?^cnN*_EmL&*j1g4#YgOpN!JLQaW;e)w+K@Y;hT@OUlsV8WV=S6XuZ? z?yTv|O{b~FJvA*98P?I%8VXgK%oI@=VVYpjXuw%z^|I!zNc91YqR`X^#r6xyE{G=) zlBtwl&le%GL5>}ix+NY4(T*;tvD!P(D0s3Qb_mjjajd#qkR<+mkvG12rG$x}r zCXj{E68V!;_p#e5(W9{WjRN8WFuBlyR|40IQh!;=feIUbH*@qpXv74nTyj$z1BldRC^pQ#yCXLEt-!ETtX z7c6?y)hrGeJCg>0lwJbC8q1Rm;4{<)p^#dtvX7^-BQviLhV1ygB9q*@E@(2 zXm*-lBZShESPz8;++uQokd$081k&aM81_w|()TQe&Y!sOLliicr)7hcc>vMG%k8ry zhY>Z?7~j;tqMJDadZPd|62NJMfMw|O<+C2iP@t_dg2BuhU{&MkqX+v7BO`lM66zN# zW;>)2JLz9Qg(F=_V~xvt&<#W|ne;hFCk6nv$6X<0_Om2-6AxNQfK+ZZ!d>JxkYQQvF4icfOBCmgeW`G zf&qfzzCnN2=AT`C@II%7vT&bli)t`7tUGauv>+Oj>GN+4^jb~VzpFB(3HB8Y42e5F z$yT5+%wSkboCyHWCS-6e=w7uq5oRyR_F<&R)REOacvU?ckTf9 zh5l6H_b9q1fMJi#q^_b(MmC*^8VOz|-M?;}g^@T&qx4NNmB_0j!q>0;p`nu|XA%OTZ_!LdCL zO6uOpcHaJ8f4vNvlXVOK1dV#71ME{sZctW-s9Ie@<~iD@1^Vd*=#d)03dNlQ9Du(z z%y6s24tUH1T^@1{n_i_$&ZMDqrVqz%YC{U_MG$jQ%!ZZ2<6oa_f>W7VPg$YFk)Q_m z>#F;6 z@$}qk(ZAS&i~6vLNYwBC&_WI^i&-Q)=8?ml-%)n&LKezUv45ltRqnH1a5?pUkdKsyU}?YnB8B+DehI- zhCPMgH`A?0=I-Zf|B-(^X4U06`>0MTf77Pm!)(U8gyzfSESjXdD6M2rEgG&E zX-uiDoT1glC|+_{*NA*%O1vaAamB1httnTcR8DX{K2fP@wAA+MC?d4KcpiC@%62WE zx(Nr_3mJvDxPkh@9e=j$M1*`e9L^{0k`-OT&YJy#h4;ZXdS$QYpgC$dZ6w~;iWcnc zvqkYR)=#!uH%`9YHb-%N75%sAksHQHHA+*}XPb)8%u;Q$X{@=~H_y(e-{aAHYXGz4 z*w8&-!(wc%YrbKubGBoS^IX>!(@9rXJu#TaRAc)%9%LMEZ{i~K5sohP=Ms<7SZ0vF z=yT~{U)UD{Ho%P?#AADeA?2gL;^ssFJX%J($G6tg) z7L$bXbecx-?cZ`}JC_6S;XRZq_7_2NIKF2$GT*K=M6XZ!e#+Y_CE>6oZ&c{-i;$NV zFZB{p30~Q<(BhI6jIao-RYm5MOWK8Df|Hqzj!STJ+-l=Z*0#bwsFUW2TQnafyPZkP z(Gm4`<(+@U`tcLC(>1J6xoTShBP7C)HgryIr-Kjets4-0VizJ%yot5P<(!eF=5LAo z^m59vM<^Ubrm0NyVHmyiJvLe+_~qpGPtSB{no1nmWSN!jI>_P1DjS2TJmaXH3pbA* zbuK=g7k17rrBKGk`PT%Sn@!>F2|SrM@2F6WNan_Oh0ro9&X-5x{#X#LF%Jv?}k{iMZ%+AT0WjXMGN6WrJa602e#3a@+UhtDMs0Eh#iz^60r04=gQYyqyWf@g%n z(1!BzvtF%)`!vk5l=R|*?TDKu=cdx+r*{%no+jBkhseQmd+n|rOTH@+Yw?B3>hZotwTH#w`nUG zKFAJ522Y*dM?4M^aadl9JT_b6pE9H!XktDr>I|20TTrr7Ltx!q5BP2Y%l=K?ZMZu8 z9?07VEBCb5kuID)ogK(qroUc2m0C(G*VdJD<-*-I5urhTaahx7oo$`*?Y^Rg9?hz) zj>=ft(!;d7``Q(swOTed*TppmLHdT8XYX9`58&&M;Od6Dy^FQC=pXoIn{ju;SJpdk zZG+Q13((*Fj{np&S~UCn6Ai`;tG@)y=gGrvAlHy3Tmf&ijXl^M*ZX8*ov4s6 z^@X9b&2~|8%t5A01*E_1r+~I{SQoGY~uQV`HTNoRMEm^<+RD3n0KugU|uO`L94Vd zHLaq9!*x8o9(9?Bt9G#NEzU$29!!!-nJA>_*p2!7dTHDJ9-qB+Z91CjFIu#FX4@a8 zrQ66kezTgOUq-W8e4gIh=k@$SMb8%U&SvU1a-2y&GQR(>$hE2$7mq|kk3rAT}G%7B01~Wp7JG&w+!&DJ6I;Q5ZuK&6bBhPO83!aAUP|EV0aKM_ZU7Xp3>pm-;J~d*qUyjJh2N3mJb#K=A1V>_VKJ3E zZcXU6z7eU?@Dl@AV+o7KB)gRUzg>A2{bP$>Zu&G~(UG5zsN?!9ihJZS0I++d9CWxH z>g1Rx4q(|yt?T3*7vRJ4jgMhGQ8^tY}{)xGNN-|bODGI7RDQ~zk#eSYM_3V02OG)XR*s^Lx z)NI?eNA7N|hliDkY=a808W#D*Z%H67m`Wp^B4YY?*3=aPm01!Tk4`Tc>GJjWymYOT zkYHSurE7TO5cq93#CNB9w zQ(4d+1Opx@u<9=QfwO#6-7`sLC7@Q2;oG@?*}1>W3{a^otp!C|ZF&fL{nQIV>uN=R z9Q`f5kw4SDrII4MHyHW-+ns;86R!}B#Pe%rn*RydmND^Dx~8uZ=`Yfsl;9fEMar3N zQiq-ef9eDpHB;4bV<($r6g}bhfM@$PEP@9 z6=tWKbP{3~C8RMQgdvd=$gLUC`)76;kx#8kt)%J^aK4>iM8jo#YXs(Z;r(LiOUzRj zZKl-`drqL2`j}tX97BHIwPaWs4Uii&KH544; z4a`Yy?tuaNA=L)X)!~!atJxl*qDi#i%!&}R>hsE!j3HhVwE(`jbn6D0cKItEM}I`m zM8U*ERNyU53dHF$&8AK!3M40#-7`;3XeQL$oeRqSIDbKZL3v@~Y}0}_277)`e?es$ z1VtL?Uu#VJr0-8>pPblQLK&3}K_ATa>4{xUML<(v+ZARGC!ZC8Vw&d(cx%YNqB#Yx zT(8Vn*_{5GF7ii)tq8Fql}H3bVh4KZncb*OMCYhndMiPS7fN<5;AgUidBZ67Cm>N9 zn8QtH3Ju6*KlaN2G(YV|J@cNwYCHph$ut6VEOZ7sW`Hc2ML~0vXJ6S_WBqh)(x6*5 zw-hc4CI~v=q(2!p?^?goY?(~*gcXYEwE6FE)g?!_7(1AS3$Wc+>h9=0l7g8`Aj@Cy zR8SgTN=iFqcjDwQsZZVI!KA{D!Ik2gpGptv4jv8~l?_C%k1~1*O&6es3SDl>rC$zW z;C&;S7+gD;NF>Wh9TSY-{l?i+T!+K+i_-@SUw}JpeHP)*JDkb5sry;;=gFA(cWok$ zVaFba+3ilF>|s$6OqC(W@aOoL= zA9sTtW-Njf%N+H@3(yEcQ5;PUhfa|%V`U&zkdid{Z&da$C=#HFfBNZ?O_uid4L#fN z@Z&Am^tLGYY?^SzbhKLD*c<%50nlCy6Ncs6JkY(nD6bGwU=fA_OZ)|wnmDLmB|qr@kdkZ_6X86Gft)Z1i+W; z7clVzDyXz|J$n>aIhASQK~ek$G&5+DT0~O~wXdEvP*Mdi6QDE=jEMLPzmpgk)5WGN z<9qXn07CnZG;$GI$E?axC{K=QeG>r#Trv%TvMYi=9-O z8L(QEWgGSFE>kKntcu^}uNY^aP^+F+rquYjgq=B~T%9*x_2;W>MGRc{frnnxVYSj? zLET6U!E&CibfFcTgSBQw>m1OqM+Rkvk;4V@#0pp8h%HRkSFGJ=z8L0{6?XZ?-B={d z^GHlz&c7;3^8cvHKws&e4_lxH6}v+af=D55D}Df&HOfH=50g0{P}`kQ&e{U61F2O3 zr(_eqNV_sPz?U^9?gk`&DDL)1%O8`^Abr^EVvW6Ax8;rg-rp_zveZZ4GVkONCrVe$|_Y& zWPRV(s6$Er{BBE7J29!Q&(L}jv$XVyQV_7(F_99m`hQ(&Rzv%sP#`>)7cj&@t@Y~6 zEaQbFja0P$+c#gwd-?%EjbX}g#fK+oxD^>lk{(f#8+@4#nm!Vbd$9kU7wl4-AA7-B zA=Tr%1Eoh^wkw^0eY~n-6eroKoz*h+5h?-!NNC*MJiPh+P_Cmm*4A2Z=kM``;%m| z753oG=a4*9T6P%jPBw`qHhkhV%d>TQ5#oj_Hk|#c$(8ovwhS#V?jP0mZCkMb&k(;| zySb8ki41%fk!F}-+-K(SqiQX}$+=^&6KgWEI@PDcR79xhVVl3m zz5w(4qhASOI=u|S_e9nyb6fpwfJ)Ey_jjRIB#UWnrA*51+&~>ZDDK2@;~xljlGSyf*59Eqm6v=GxNzHW`J< zHyS%eIofPGtnXl07Ap?zpDdnUZzWb)5orM1K;E^R7ot110+|G?;uf{6yO`k7@KCzx<= zfF&Ap8nB6TK*Kd9X#f2beeU%AOJ}{F&xGG5-er{t42H|}=?QTG^XqZmh@XpIxO0S+ z4#X8ag=^F$S;lYtkS7YnYsC1}FtFXRo7*OIVKMujwJXaD}bGh{MI_#*jb`pg@zvCQ>m zbV9~L{6&@i6#iEj6Z7LjT;Ko)BM7v|<>c{XG^W6l+&5q#N~^LZJqjU46sJ=-aF@pG zo%bl`m+iyBxu|1-e^Cxiyo4w=@CeBV{bf&@(j0`ME88yyU@o z_5hhp7UqB6%7tKh7csE@*lt_I5qmkHVJ~bA`0fC!?|`lztq&_yjCzmxB|e+nRJ5%w zdc2D|W`?+TFfo*C0q+%G5_W2?w!%^?_->970|fOenfxpTc$|o#sNq=RLcDs-Owf1L z^*|$vO}KGGY&|cw%+eS8vCt6gBQtXub^n}ozbW;ng35g?O3?V8x){3SRsGiunQk^s zi0|O691dH_*yT{(O?vNJx+=bYNQzx;iF+rfcEeRYA62tTh=QPZb*i?!bOqaMf${KX zU=!5~f3ZucG|n)va8J@T@=hi41LGjc!Bbtbq@364xnRB0`&kXwj*y_u2+Nz@%bQ-DZX%5Num(lM~eXb+>AXp}V?YP=Hymw%S_f z6YLFa*tm5={lY5?>Vhrm7X#GXTu;bt(0X7oF}!Saixn$yM-lIE>vTz|RZU zdKm2MzijsA&<_`23Z3sw=X7dxG9>$5-;xSFoWit4`{Ha~)ddz@Y(nSxu$bG;WKY3s zatzd^pW|(vI$EVoA)LM!bOlyxQUp(S1&LbP7sDmXyuIF|ZgQ^+w~HtAAvpvY+VnrvkJx@7m`LUbh>*pdrUF--s%`C~O7p ztjIF{3GW%-6zuZu5z*)`^#3e?^Mfke^TGoFBr^Pq!vFumSN-=a{Qt^TEo1%Ts@m`C z*2bb~MOkRKpE;El>&YFMc;u2Mr$<(O#U1ewf=M({#)&D{V~2ltbhzJwlS{vs+zpfZ z4c!`ULE8=96);I>sp-rcV~x=Dc6PhJS*KSrJRIlv;={~>QjgduCer{C zA_<|Ty4&$~|Mo;51h$(d#rA>AWO|PYAA~3*G$hiCx-zKsaHLcjFRb{`O}OOZP(ttz zA2|O|Dh9igVq!BMyj7( zzoSJo->sTcw{TB!(G42A3M4ZJTnihqEfSs9|O~aEScd-6){QGrD&m z6xQGuhBl^wB0vL8+ZrweFhVTaijo8byKs-vp0Y2xItm74E^z-~z(&mdYoUv9nw~48 zWpK(EW>T~`$u5~H))7vbKmtu75sQFIT4uz?ODcBkL`Fe5qU13X6^K*APZy1ZHhOgS zb%6r9zr)sL&0RqT=H-nI?d|>TjU8J|UE}mL1}&&NS>0p>Q$}1>2I?=pMr6f(#E^P7RZsnOs9*>9K@NXzU+L)lM#x0_K}$hx7F` zipXK(Zeqj`Nz4S7O?Pz)#IK!xzQi0-ZB|T1!UV^J;30(#E#9WRz%icuoYMaW%|?sA55_{hF(5fAqbFvMDi|B6P; zsZJdn^o%GYt~A!^XUOU;WW+RWXG@(!Ol-GU-9~f7$d}Ozy|k;Xebp1Xyk61(yiEO<&MUl zfM>W8+D`2WRDZx3%nTe7bt#`L1R2Qp%aHJdY@f_N>_r93zQb@Df!O2l1vw2a$rzOm zI?#e9-9YA_6_3R|%T*>lfPZm8mz^=_zZex*lwV}3UXet#g$k1(`Hid^fQ}oL{*LRX zLNS&Fltx}0_r8LxaL?Fh4Qx2r<=7tjx_lw*;4ypHRxcT%^wF;D4O)>2@QDDomWn3# zAMdf#jEZC00b~S|0AMBnT`IyM40}4j74l&+f~!@hIdIfi zR0vcka5-uA_;Y)4L#Y-HKR$qSYXxoFlH4XV8m`qcscZFoGTsORP z9@I;36c1qQLi8&D5W$754L!r42s|4>g7Bg?K`H>$6qos~LmjOtY)SGwMdYtB(Y*S% zpf^DCpsau{J)54_%9=9m-*9}F?5ocLbzSit0$jSQo3-$tgw@t-qC?o3eIxPKTKg+- zfEy$^&m1p8b&_-101v7zG)IVXo+&II<0;Z0ndreuTBMyQ=5pmVW0>|4EO93~4X;F7 z_UHkTo(p3*#4bsHTHx0D8?882<2A3W&5vsczz2UcPrFa2<({X*gC}!5bJ(S-_Otu^8*NsR3Rm3byZ-g|Ar|c!8l+WDh4x zRV&|NsWIntHxR}n6(!;Xv{e_7)Ui59f&;hK$%0I(HB#lz){YAl+6-e!{vI72VPuD( z{(*p_K<;nDQKBhC?o&DvBDdQCWr0b5MpwWoT+0t-MH|nd%|C7dp(M52iBC#GLxf`_ zbav{(Mz<^`(wq56LC&t?7dI! z%v|~9_u&P6RO_qNPdq)A3%j&gZWLLRS|OSCHp{SWo6Zsbt-< zVzKGq%3A&0{VejZ#GCmgAUe$TLRJlWppMr=lQF=5rd^ksbo?%VoVsk@HIe@7EAN*` z+!=BBGSV+BBfB_3HCvovwV}T?LM8?Ju(<+y{%#7HWtmJ!OQ3xzLM^2wSR=<)uDii%d&$ z>CskK!z2T1#e~=BK<*}{OA0;7z|N$SU(7OR&hXXK1j>V`7n{Ze^gUsbqL9N;(Y}XS z^4{o*ZB%zpMO}(T=fjHm(^cUJ*9q9=88d@At!Wv;oK$)#&digFKLKB7)pfew_QdEn zAl>aTFXLM$c2vp&?oHx(`>{goUF8TuxRWb}l_rV-%a1Sw0qf=qa%Urs4pJpQVd<_) zvT`D91u?_+sF}$M~haCj2@^cR!tr@ z4%0%{+t{>cjgx}%E5+q~7tBV6*wTV38zw!W0dytvbFQ@s zmtVHzxt%EVsl^En-iE8Unj>FQ;?!BU9V#%jxlUV%?_J&%A@t`k6x^y2{m8CX7`9Ex zv;CG_=|)RPI=vj&372E!;~w`w!wR+_yFN+T9O0F9b%~HJ%Cn==gGzrHp#(^r%yvtH ziVmtI4M(66x+Venl?iV-%`#?&hy=;tWM;%Fu<~0ys?(fzkK{gz4ME1Mn}4f7x2~ehSl6ifCh{ve(Xh# z9dULLEdf;$G^A$h2Hz^6>=(Ub(H|8}nr~3aMXBsIvcOov2j?cqgZ)@JJ5n$82 z$tFaQcCqWHg7t4b33eC~a&nFqDQwa{+je8B8}59@)dFsF3mRZp3E|_<<>q_G#VGUG zqbgpFocDQXh)Xb9T)L&%rY#Hbcs`aycAI&omnne9xPyLDR-EBq39(k3KWw9Feasma z!0y=*kek{J=0K)08obX_mLE@qc`;3{QN*8oY#t7AD0B(rJ7xQADPO&>BF?lt*co5J zBw^%7IGxFxGhh`mpeV4d$if&dzk~I*l0z&r%nURGEJEqe2q+8K$wS$n;j6B#n^~*A zI%1haW|gWbG5Cs2aJX@Z-X72|N0`I5Au+GDy>jC$(SFT1!V((rYBoGf)^L{|<`4E$ zKi@D^9Shx3W7C|fGNJuyFV(M~uo**E`1GxMFAPVHBA zVyo2(KfH&SJgMN*LCvmwW)VLY4$W^3z}VwBUl@C0EqRAhQqBD`b{JXs2~(UvCekA; zRU*<70|HO)oWt4*HiVtFB^TWi9jTANui#(Y^Xq_#2MTK&v|+o-_=E;mK1sQAHR3x* ze7MS_HF0%2!1Ak+cnkEn&;_r;;nJ7 zqKmT_X9Ke@u>U=th4a5#v>Sa>-TfDU79r0S4h+KxVpSjjARHI~kouq4`d^3^T1RJV zx^L_MVmzW(PvYML<)ak)Yy%izc-i$3!>9?`tI=N>l?ce1u;L;5m#f!%=s|>pCkk=% zDVlfg@0}!y{?c0b5l?^-vmQ9dO2*)5{sity$O;@zPJ~s>8Lbv}aH-kVGXz9&gSB-a|A`)S3LK$Lrb4<0WVgPj1dTMKFi1S%l6y@7k2H z08J~ATM3(6n-YN?7ivknV>XGH4PQc^I}^N}JjJ86BscdDxg8O$ddhG*y?~?6eafVl zL92E-R}dTRugCeHPkpM?x9kpC5Po-mq8d<>2uRYs&AF_Fhd^CNgYN>t=^~V8 zu6ER&5B52@Y-GRe+`bTpHGDUS=A4VBRfi!1kvugMZx342iD0xQm*ITofnVil)0N-nDX~|M?&G}bh$yrGT<{xV76U8GB)hm-f(n(t#AuIK3PE)8Z z7Vgi4=^#NYRI`Tn&I5Cp+1`rWfm4~OnoVP9#MtY3gC2oPTI%mNWNz)Tq;D{E>S}2j z$Z8@j1MFH5mB+{s>*hmXhhCzj2F>#{1m*|h29ZI(Qrtj2kJ=`(^S-R;;LgMI(sIIi}KofAm*?kN3i#wTy zP9QRaf%*XnG{Rtm9jwfC5{VA4G*+7M9+^Q%~`J7e#g1)Jm7!1s3QGDf?TSuwEQD zfsU~QZB{VED@KkGiytYkFv~?jl98;bt(3_<|GHeqxLz-$yD#k&>1Gdev0L{{1fw40 zdJB7#U5m>{`bk?kPK1+~lFWwCTn;QP>@aEqrQ+JWZ+zM#>V~oGrOWHmY4doiMUx%h zdqtS4ef$q|jY8kS&~qoUa?l$6VPoi(wDxU!3oMlY_=*3O%f-Z#Q1AItKJm8>2JiMA zQ^4%cnI#Ovr7j*}bWww~pQOHvIy_!c7@*OS&GYQ@ZarIzC(u=Wa0$HT#&?<2%2ma` zhV)=i^W!SWLd3e6$fx61!2S4Gn@@Zi8r$x;gBgI)5DG|>Nam&kqR9Qy*U$>%6ml*D z+!d3IgzA8qv((gEbNjMnb7%Xn44P`PGk*4Etvw>*398U+PMzha@K?*2Z~WGR1NTD* za9znQ7c~h11|!E1`Ldulq@EKQaIyldj&oUk>5epsxrrrAN}*O9&vjoaM_zp# zdp&b+qwP_}DRetaP%VI%^Yv74tI_Mo2CIK#^vzLau>0d*@ixJ$KAP`Ju=(KU1F=Kv zPUbDayZ(vXy*P)^C{XDKhZusUHJ!SRR> zGh_FDDsyzNQTp3$GrZ*H&T3-x)*;wT1~Zj<0Z2~cwxDXUpwbOzc2mXvTC5$&eH?$x zSmo|Kr|wyX*2Xta_4h@^0O*!}>CVJOX+qA(Y4R11NLsLv-8Oc^s=n)H>WRtTrgsJh z$38+ckG>Wm4nkYxoXW&)RoX7wP2YH|(KT2ruWx>Ku<{r*bhr7Bocyx8T7C}DjWMlQ z*1$e?h*f4{!h>fjWo~|o3Frk44uRt|bJI7ECql9PxI8e*M`4>MZLa$y#BrZ3e$q)r z%xxD=4Nl$AEF+7H`>Dl_!($gJTU@ACn4ZCWoa&uwM|_MO;~=#e{qb~k)yNjOS?oC< zSCgFEY=#ZX@O!)@*sI0&g61=PB)K8sgu;|Yu+PbH(>>)??{YBOt)Ro_p#@fm85+y{9cQFA5p#ZAE5ki2lVzdmPyW`bgHj z>sowqn8GzZJ1>}vRR%#BCGy!-%&7p)^u2x{h|`7!Sp88k5eT~JU8~|;FJz!vkp+j_ zv;Y|3)I6QhH^>7rhLSej8N4g*dIW%B)kM$#52=uajoJS`75dkqL}=1+j@zWac)z~+ zZ~j?A|J}IxkF9?hPo%TAHT#zos0mc=KcqlmKjp+>p|Jk33o9uhqWHaI{IejwLpEU7 zmG|X)gS3~>Z~_3Jk^fmhfb`7oZ$Qag2n+xGX>R9i=VWeYPar8QOknS5_bsnz0sy$J zXDOK}E1jY7K5st=Nr(C-O4})-LJ%klMfjq`kx>ysB1nZ2=B=SB^dX9hf?$v4h5|=N z`$nQF(7=R4t%4sC=0^tuVOE4?2`ofe6 z;UVq@j0_I%9nuN-L6O)45Fi?i37tNOfdDT)JUrAyz2MydAh!i*2tcoFMlSwa~y{>gf9v}z$03y7$6`91n7DI z1Pp*dAvA~*0OASIA0;Ms0|cf4P{i)kcy6hy5l+6zpxx5ydD=)gMg6oOXdS@S)adXi zrX|s-QP>QA7^Dl(^}DBGGWoH<@7_-W0J(9f-&cG8;WiCdJw449-3+Hkd)@=~MPz7r z@Od;-VJ`px>^b|)ebUf3VEJ-``PzKulU{?E>q6)LdX6xyhZkr9|_=$tO?DkJS$Q0qs#6t!e zZXU;ozqdetz2hzr4N4lesZ*gGC?GjRi=;>1GZhhq3B^+mk*RLD?5Aj@5fUl`!yaNEBD?&o2 zJpK*xhWKt1=K4|93SvL>VbJt~;q-xS_Cdevvjqx~4E75l2tgV9;yCJ4R{9H31W(oC zQt8t#3gEKzDwqc+*u&BFtF*%L+QYvZKxFq(boxPp2#!J^8xXFC0vU#@6Gua!rv<$b z_DO&sMUW7Tg`y}BNyo8DFe-*C6R1ew-tjvA;0)0gYmeg|1u*%)2X~4yCi>MY@GinM z3AdH9V+D%kL(dvJGp5I&}wIlu=#4u!H3{jV$Azns`L8eFW3>6+^CqW7mW+HEk{UKRbs678Y zsWxw`NPI?9mcb%{MVv6UZfsQ#&Y4INO-3Om1QX4Q23&>PoX$& zDTR52aKv&1W|GPzs8W!wxK)~`jK~_JDO8o$tXQKEQi{y-E1h#H08LW5s472c0m~fS z{Mn-B)VUpTD+y07Wmau|;!ONB*s|Mwvt&HcWFquS*e{ef1!`YM;MsKfXslraG^qOo!&v`Fafj?W`i3I zp%rXJ@Gn2sL9)83H7^&cj?@p_jtJiJvOG>|z#~HbxU|tMcTOWc3P(3WW;si!Qe6?*qf)F3}E+H$OPR5h-$Qa&fbm zY0#__r8T9k5~vb1SzfNkYPxc(BJ8{l5!W8ulIzs$Ze8DO8M~5g_pXyy9B=v$6oXTLodA0RiD6gCv8Ly}-D(Ii7+gu_!V4NQ+_Z z1Cj%qVVmIsGB7eiGHKa!+3R#g*|uWJVs063nUSfKOG;0Pg;|kMB#!1FX#!idA zrkf^Bb7^y{iDdnuX0gU~bEj>PCZ|S`x{9VwgIHBo73p$ERYwV8Nt;}PTt)V>*+A`W z^H_6P3uf)nD%eJKvrV(Nftew?S<6uMz;!}bf_J-j)CVs(Y{(j11+FHpk5i)~3YY5l z6yJ2_HNW@JL-HBDnfeUE%qsIiGx7xGphcEa#)7yRx>=i3z

$n6&={T?!vv2KMmQ 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%0As9^8!fn&oX85D=4j_AGH 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%0AbKo*i{15xszl04 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�%2=^>2yEh&|d*k^}dyqxq%=v7S05h0ig;vU|j1 z_Mz-)fe+_UEYAe;np#9EApB)-J@f4p^=5x%TI$9TL}gyn%iQd6mxP4_;$#9VR3mWM zd!VHgJoSE%?naY2#f##{E-SQz&egCi%c&+q>XTU6piIcZ z?qnieh7gi~A>I|&DP&N?UehN>_+}2Z;4eL3~ zJU|%;&wa(QF@>$)bJWLoRWL$)x>vaLiT{I+Z z`NHsed<6xz_E&njMFm9AQv3AITv@d9d+GK~6T;6do~GvrGH!}RU#HT2Q;kczEG7zr zP)mLrw*GySOw5(1lz4CUa5aM!0v?`s}c66Dh>m~g#O3^#~a$2w45{4+EAqx3v4k*1zG(xqC zrjXf>v?iL{c4)1v;p z1-7-ok{+iU0~OmA4rRFbdU*Qj%X)xLuQf{_*KcbST(3Q+);;pHwg>LOV1}9fmMKx) zY>BOwy^mc9MwsT4NWW-q(jl$On+|L!G>wAW0jTdC-wC~x=CxJ$5brM`8=5~2lY3G( z6oQ-YEdt7TmtgfoD~6Tou=HL5{&vVNi=}+Zw{9-q5Jl6YE-Kcivl zv$i2rSAPru(X4EfJXxdP(u?phJvmJ(B(LhsOH-;MT(}LYuDy!7{58!nGkKkS{nl#? zS|9Ta;|lQUv_n~sUidq6Ez_+q{SG+QO>4abBG)aHGUgR3&TEo|otUQwmGC6?y!dF} zRHEcbI>?LaJ4U&EIp&AuB4A33>iPjeqX~Co5-ZnxXRjUnxNg-*~ zVHf1l%;s0vjaFB^*T7AGzA=hy1s0eXiS1!gr~W($2f6#f>lk7~xoh8k-cUP&n1z|r z$%l~IF<)=e@m<`j2n%+p8DBxWhWjG33Apj;>nf$vEAXnEZ(xI_wibi*LSqZ6 z&#Z#hghiAij+(xtqRWvArha=SZ$dwCFn7Kw^#;pyZcv@uR_bpI6!IiAT;xmqXqmmA1~~2S>nH zc-v2e9K&HLplL)T{05=-9k+}7@Dzg5727BIC>tD}tNqpuUe?1~q&ga4@=mQP1%#m< z9(>ID3S<5DQ$Eh8mF?N1a&`>`tX#Z6^T@b=r=(9h9G<8B4^~0OvWZD%WsNF|Z;fe% zC<^JSPyoF3h1ihWHm!CM>NU@>-qcqQn=53)XgKhTXtCpjw}$~QmFtK~~fA$_pV8migjf#w2+vAD_EZ<1Z+ zr4k!J_-DFxyPJd+G*tLmh`ZT@F2Qs`0`*Hd-`2~EBoEme)$We!_D4~KL)b28N;poB`@_8dA#P~}MhtlS9F7*S ztKtOTdxod7ZJN{ARXV=RzM?gz)CGj<+*u!%4c}3+es63Riq}L`U!m!W?deT>6#aVe z$Jx{UXTKi5+kbY@iT*jv^t4n>i|H}d4@#Bv&m0JAqCzlFOpB^DhUSo%$Rjb`<&4uqlI?nFPeqQ{-+v9YsT zuwWXqLhgo^&4P#jGgbha+`5ihy=*&OC~v~^Alo|6v?{Xy$j*PwtsGq*4I@`&suq-6 z9f{`cRo=g{Q8`yBagJD`}MVyv@Mfn@{K1X(myY{c2^Wa0(|E|E+2XDt%6kJ_fgWEM zIV>lV|261O(Z`M{@VhS2itcRMAEs77E_l@#>2Ost)T>(@^{hEB26wy^exsL0*`E}{ zA;_Liw53;FPu^Xpm)Y;=E~Y2jFjxQlZr=<`942iC4k|!1EU6i71ga1?Q)R1JPuxGg zFA+|P>i`WH5&ozU;Scw4T9pb4o<{_g;%E>cg0A6cz=@!^_F57kC|0f9#egsB-{-V6 zCL#}jDOEuADkVi$ciQD%3)?b|2el{tcq6`Yb@+#V292*v9r3_H>slfmxI{06$ldkZCd*%T3A-gLRL7-;X>wYBt zRYzUpPa!H(s`k-=t%wv>7758pLVy~*$?lx(B3#`mqpDn} zEmquN!klVcOp1|F(*4aXuRVjS+LhYV!q%{ME5oO=^K(3u!l!ub`P=aiwvM>{vn4{wTBlU|Hs|(tC%u^qrFE zYi<-f2fm5X1Yz{l4v>C^>ZJcx5|l{dmnUytVN<1s>#9Y^LTPjwp{`ZrogbbgKr|8# zj>0llLr0x*+}$}xYTSZ0 zoZYN}LNkzyX0t}qr}P&C621@1jqGB2ilW*-o$DS#*zbta`tc22L2cLduT}T7q>qdC zOLUFU55C71xA))=odC%P(BWqEAzAodc1L@yV-=2*aS9QImtiQzRMedQ*MEFq*}++k z)tAN1VrGsoRs=3>7sXfq+K~mAi~<>N(<^ZXoD}j_vO%Tgz0c&c-A)QWDSG00ajAvuCgSBKw z=j}bTMOnZc3=rUJIL;fZPF2dQrSGNqea6%*c^wLR{{O}Ra>wmgris;<=)wrjx6WlHw%$Xj)tmO2aZXonyMH1P%#Xh+y-mjht_e7w%4D|(jn(qpNWNr_-!cX zHM)Rui#p$k*8Of&NgywdGUJ5gaw#Og1+V{$wit^i0mWsO*!!D=d7A?^^mF$Ib;$5_ zlKeJU_z1qLTg&Idv9K$$QwTWq&c%`Y0aW(`cFIDjY{gN@rzIe&-s(MStvTMdSA;VY7f8G|bLrG29fb2$Iir znXyw(+i49Vp%z(ayBiN~tsQZP*Jy)Ns4gV9KMuu8m%KZ#Nuqb+HHQDCgKk6bJ#gxg zEyEQQIiX^~biO@j*H^cx0C0)Q!++@3I~&y?G36l15tN5`ZW@`wz^tsG>#ExpbEdCu zwAs00z_QztXHWz!SWfS86*~4g2l^zlx88S{JpD;|Vr}fm&lPJGH!G=9Lp3(ZoHpk+ z`hZqtUtJ)x+NSvd-CQ&R1?Qm@C=R>jY~WtcNQphzAt1N=H@&{_JUz_F3pm$!ra5BS zS%Jsw6>RD37)6_F(edp1x|mGS#xcFhBDGLIE7a~+trm!+p0s%xou{SxRATnFn0$!N z@1p1FIQmC+ey)#4-l%QCRi2j7n|wHgmE?J*3LFe>(+M2F{bzACj?_LgzidTHxrm@bZ78Uj2 zh#Ofp57(J^P>ecMDh{|gpx5zHmJaTYrx>^+gzUuTYp0`PbUno zx)S;cF2-LE)4PscN2Zi_&#*UlyD=cy;RW06n;iZorf%caSdmNznt?HVnkgX|zUo2* zthrE^BOF)y(>VdswRmhGbW8eb_~6G90RFU?PL)jh2KW=8Kok2HXcztJ7E**G8^EiD zcy-?dDT^px>;d>`CUIkWHBmFf<~Cqa8f4d#tPkfqt!Sp^VuM<4fS<)w%`>#%0MK_u znX|FhdrX>AhZh%WI|8>~FeaxCfC1+&f!hV>;xWjE)AV-*%Pc79GeB^d4T1jnVZARm zokQK+YM%35sH_gJ<fGcz*G*E$y z>um!23QH?7Lgfo8?=`^)^$}KFMW>G}?M|oNu`~k2#ER0g$)f?;7)^NqE1B<@k`KpqnD>_P*=?_LGhK&%VId2 z&W%iFR=&1g(>(W6s{mS1fe=~fLy_Nni*_8SU_0q>G2OTTA9zrTKN89`fw)O zRb0f;wa<4qqXh-{89OLl;5=)LPM`R;G6yG5?k;WoeZl6hLqA4)6gRvRHM*eZr3zxA zZ+*m(+Rpq3zBk^&M@!(paP~N+SH>GEsn>8jLWxT~_7$Ip7g?$h%gXle@6zcN22Kbl zy#A~4eFoD0R(lm4IiYEuH`uZ3r0N$K7&cGKO^PnYVD3eaZrL}6B?baE^?MF6+)G1> zx{$}GH#gVtae7sl$$9gz<9!rV^}oL78kPx~Y%4)RvJ5?RgcyD{ z#ejfSot3SGrM7sOXQgFadq*Z7A$+IOS9(IkyBCMbt*W{PgDt;$fw~g1Jc)AmiKMt5kcBhEagm1Gl-oF(AdcZvz`0NRYjTwCa zwzoV?EN&P#%$hHS&kmB}h_K*a3XB;zT7siQOD{w3)rA^&2&ef5M;K8%Q}@LxMEspA zWsWWKox%rRA&(5Q-1|u4nwd(q%FqyV&g-B{5FgM%uUAE0i)FsxWEXItBP4%lJ!R?x5 zda~&S4Wwtx_-D%E;P&0KlMTVQvX2_33eO(A3#H2vuj)%WkiNq$(CJRxke$( z1jic^tp&L7gDXM=D(z_er46Zw;LNYe1{*GhNgOEz{~;nVL0ddZYFd4eo2){H&pSUh z__DM7#7|wI-5Jm_8_r;&lX`)4g+$Sm)A^Uz{n5x@2H+s7|2dA^VkJmQpk22~_D-VxN@apO{+0Lh?Z~Vj*eKV^1WTq zJ(UnO9xG}7+9Gm){(5q~T>17XT>k7!BuSHm8fn19!oj-tBUlVMD_!M@z9htp`y7C& z1}?t<$zvgaPU0nI!)iTMIGt-=Ot|bDE@A&cU?&gmB^o!g+FrVhiF$yfXM|UL*Po2~ibec$E%R zoBl`8iG`bJ*g#YfkKm2-RDnE$67w*gaT2z zJg`LTeTUJjW82-E-NtzTAH3Yeolo{P-oU2A{qq$%JpAOKK@i~dwO`4pDkC?`8gN_L zA=xDwymvP4s?5I{`v;e6vVQ_TK$T;;thXj&6j!x zmnu;(D_l$J;taIC*&q;2j*O+OSSg`{P|6T-^mIxrvE?gUi!CnQlTmzK?v5xgD-yuT z{+70E5Nvbp!r+s1fc7!*C!6*hc33LnO=>mxk%up>7^YT8tWz!_faI{~=})I)5F>Q725=esg3Vx`b_0 z$3SAL$S^Nzm86lAMW84KU+2s)_gEdN;~nA!>%OIve8CsRXbQyWub7yADWCyM`|{kF1`0%xYxOy!9&k)Hr_EET!@UM1M|zeJ}$~g;}=LaWB0x4_3E9 zN|aCb(0srZF4)1%;V41KV}J0B1ocx+Heag%%kq@O<_*M411kYC=;K0{h5yUY+N z2_lO+94VtI{0e^3oMoR7)*zI=#XN;CE`o2A$Hp6FjMwuK4|v+N8+|sB_|b4JcgA?& zZx}tJL^!d|TPHDK;|A{p2V2zGWr=3@TI%J9!Sr6zycjEhbjgXwuwI^SA9 zsbH2@WvMvO5cqg%v8x2rPH z(rn`GBu-sq`eSEO5h4_rUlB66pgY%Ber8cN1 zCpA@?DMdkqNR5zzT1#nAb>i)7h7P~kY1e}Ct4-Cxu*YvZ)nmdjBMScrA{OcJw8a1y z2%vVm33a4dppQzQm7hp#RRYIR!s~Nj-GX7BKO#RmE5A;UGx^0*dy<;%XTl?Zl33(m zlPB&a!Z=Xijn>97f}UC7>#^o3SsT&Iz)ael8Px4N7Zi}Z#VaS;VKQauP2UyQ*bD!X z!8zza2z+*x<4K&@D|QBTs7MdBU*ij|Lsa>ov&HKEzy_J7$0m_X(IH3nx5_H{B4hKM zzb{)e09WaA8UTHm%yKO4egNAr38A!c?Ddo4@K zmS1A(Ay@$~`AhI3(s+3DLFQsJYAdkYgVH2ArMC5DF*X@(a5f2~vj^?&w)k#$>qqMz zUROLPncFNv?59*tdi|ahR#-vnV~-|jqHxKjz2bUtS(9ny;5>=WzurI?`(|>894Uos zaMv^bT3E{WW6WwIK#~>y259OA$j6BrbS?*&AFSu?+50#?Hjwpu2f$KdO?@inB`Wzg zo&0>6ln_y#{wU9ALm$u3cM?dWg@Ww2oJV6JyTm)y2P>|7Z=e~q)DvZGW{6rZ(P zGR=xy@R}3=j;i!SPDVrxszBVegx5jj#SO0lYCiyctNXzLB{k#Exky|-ndAus15nV& zX%UbJi$0(by|Yp!CXnM53b2|~R1wrp=B5R+IF@r) zta32tW7P8NSimWooB(w|YM6;RgKQ&-tA$@Sdv%N%)hkYvMUbQkGnx2 z_b^cK0Uu~~-T*e0)+3bi{emPREmO`l9f+EGcKmRVwr|_ybt;e| z{yv|c$LusHY5HEy41ACFF((bTD;lo+aZzj}!1WtDL_KTw(0NIA%d9#sNSrC>fy==h zH_s^=SQqICK9zBhmvL!9Z{&LSEPh7Vj~lY`o9>j`IP+S{XjoV^)Qi7qdw=OMly8bN zD;CKk1_^Ccrfm!+zXkP!vZ+kNg&>o=EXYfTqv%JhHoMix5huUz&2!xQrE81cojs)X3ZN9QOO8vLxkIHgWk5Fh8cn4cyDu_Dyc@u+a6{@nXsU#wEn!bXoDCAt|IVg!2$N zWVekIBYZKi=@bg*CaBVMlQ6{;5|f7H28a*>+m#f0D{1j0sL2g7AdevGOwxt5zW%n;Fot`)>YX)M~FrIglE5&0K_dz;>E` zKF))EUgv(NLq+hOJg;Z4NC|-L*i8v>=Fc2J%hNakp~t?It10y^N$5~js9S;gBz!*C zLwH>Eu<^uWd&sc(FCN{VwH&j0TI`*dKVv4(Apg+UDam}+vr7)c;8I_DN3CwmO7<6Kjw{PZzYDTP`^P{S3YL#ua~&C%Sa6P@Ouy z_Bnf$Ceikz7AohZI#QZ35!k}>{JD`Kze(5S8xU4lSWxBkVa@J8Q~4cl>|k=@Rt1hY z%OsJzPq^($P;O2yYJ+f>QpnKv6$}K zEK6BvoekWuMg~*UozH9fm}rf0xnh8NBsH-Y{T*m}XaZNS$z3-wUY*+O@QE7_aQVek zd=Dn`W6Ef&mKt_S_N69|Gcju+B+NFdM-SPDXKq73MfVEk0T=Jo(0e;m43cp~ z0X23y%~5Q=;v z_)VEn4VzqM^b?ARkjQdC|3HVm8` zH9sMh+pzEgDPEo|LI%7(nkogtrHUxq1Ym$DLbPdo&l02(N58jCo`^Jwa{+<;lZ4q} zya+stO+v}@!+iQ``Z8-b2{9Gcx^3DRX;U|*{QXy{+znn4sh~ed+T)eN?_IKq$~s@S z62K*M@CoJ9wOPo&6WD^btq4LStZlf6hr^ z?Bl?n)SI|`N>A=XkjSP8do*pY$P(dBOc=`17Bu*tou#PC!M#V$K{wrIfep}xs!%OU3P=MeD|F{)d<|tb2pydXUBY3ZVwo0f zj$S&BYkiv*IleB89)-x;(Pe3zZA}aOnX%L<#FaarU`W~6DYX%<7v1Gsb5h!P80Ts3 zE?}vDU}$#{Q-7G^ZcS_4Y^napcOt3=C}Zs$__P?i(nrbatHG7MHMKrKda$8sV|3FQ z8W&0VnO7WNn5Sy#Dge)eW&NpShatA~hfiYdy9DvoIoWB-tnFbR0}3IKwLO3~SBdQER=%=o#Dtl90mDDCgxYUnYgR_Bqyf@n*&Hse zS&y5*iY>5docAoq#$YgbmLS$&kEz;pStHhg;x_$U6~Qb6azL8yP9#RwY+{Ui;j0?v zG~;c?5Tk)rINzS(*s!{z=s8jQ;`+C4M@wa5(wIu{g)3TR7w{(f^0SpTx_fHxCFl<5 zfM~`slL=hv6A_)5j;tcIn2suY@8BWo54jD_aiOqpGgtCpPD@?REOIg)u0^Ld13ERhIKE-Yg;z zHfZJkM8ciK_h|FPKI9~vo8!}Wovx?eo(p>JR>jAv54#zofJ^mNr&fIPh7p5gR(bXJ z2o$YiI-ILR?exzk13yU}SMpQGg}Kkz;@ujM(s`DyjjThW@-8n>?Vbi++D|{>z7(n& zPTSaz)5Jj3jjc3-jM|)LEjQGdTbDTi9vD$u=am<1S0Y@Isn$%|&*6`D++UJ$3uEld z(V<-l-GJ|8b_qPP#4$nnygq8rx)67qSIAN&D_}fu@6(52=y$g3H_#ui=NaLDF$gK*127=s=bTT&x$OlQwo^AYt;vdeV7U?n)O|L%|7$v z{V)xp@maUB`V9WfHk_pFxL+q%3tGhVF^$=yAckM^OY(9mJroI`8g1@*cm5a=KmS2g zy|1I<);H@Y^8LqxH~$?R|IfLqk-d|NsS~ZCouw_U1)aI2*?*_SB_4mI{v%6uesO86 zlQA(iFwq$6yZia^2L}gdW@aW3zUObvvzDl9G!Cdt%mrd5RuH<+OL11TGLp2467n>Y z3==X^GZK~aGm6qP)6?P$K9ENPrwjXm;SxxNAppV5$PoP-BybR;12aW&pp4}Z!QNnm zYQGQNM>Vq$q}x@Jn%a*A_|KeNY~Vx7<)3ieq67d4{XZY)|0yT`54!UI%FDZXY@Ij7 zW_G`**_eA0DxQq~6`Q3Vp831LBhS3b(%r#cJ(>(3Bcdr|q9m@AwkGoP72rGEqd~q)l(Bx?&AMu_*);3ynsfU3$xKpFJGrg@ zl>Vq&^tGf9S5P*7h)y3^hR4#;_ujM_G6Tv{(On4;z|GC?eRAZj5t#UH>*USN<0Z$F zUQj!Y?329a!$)s0gY&{oDmV5NTTI*SCY|Qh&9vbWg5$ z;&O!__qZ-(X57rpPkp@=YBEOR_NCKNseS&SU>dx}@bArX3IIkph1@zyarOKuk~F!9 zZBK8ZQ6d|cSgXs61s*>NhXRxE-^Xpx9?R0igEXry`NP@*0`*H#(@$@3QNx+v+)~pZ zEprTOeeqG;!ybRXN}#)3HR7H*A05j8olO+%WjpM>^3%`IwmclS#X4(Usesa z$`7TZv{f+ir>W5bT~VbKFj8+QLiH9Tjp9X-x{ ziD3=Ol~g>E3JV=8M@%lq^HiuAhVqd2G8;gYdB|@!4bxfg?74$>iJ``>H6%VE``TKt z?yb3z>bCKU9#zw)4Fn7a0Hy@%rsG$G z9Tm#iiN6X?myOfx{GwZ}#2~xx$JXyU~BV6|BIQ}09CWqc%@WE2kVr?_YR*EQ*aB!w7#g1`@U~7c1Ypd#}l}Ehg94w zzKgAEW}~xnh*K!KT%yW}zQy`}+mNXsTlD5+x8pz_9`o_8h;8q}8SejS8FJj0M-H&z zFgX-BK)JJs3t|CDn5Ga>mMdm!$e%qdR#>d7UIh@6l594w6Jk<~n%DhY1~%%%SG)4^ z5xfDs0iTmAf;Joq$iPg85Er&3#etcK1;vJLgry%o7=fmNKq19Yfc$g&6Y&?}QNo^tqhIVSK~kaiz(v0!K6e zgpEA%llox7$WTw+N!tODWFgKODBm|x<1>shigg3zQLS*DJ!XTE(KI-XHJLzOub*#cnyU6nK zsy|G-3zrj0N6HJQBUHd!dyR{wRVr}w+jlMH;9uRiUb}*H`<&gEqm)DnLf$+A@ggPe zl4g>zU{Pn%=ya)GcWPT5`Pjn}_Pt>Jjeus{cwmm_L4A9~wee(?wqyx2@2T}eZ0i>k zKJnPWGjQ`thlb2rRV9>Dcxl@R#bJ%t$Jn}D|3RyLI zbeUO*yX80DFi5it`D7|n{Y}3c9pWus=cf97#IO=hh(l_0VJmA#gvZ+c9+r2!sb0&e zmYTMVSscbxH7c5`;lZ19yC1!DwvqCWsdIO9z2Eb_S~Kaq|NiV;8fxk{g?u^LnxA;MqmqYh>xwJ3Si4xs6;sjX(mdpf>ESTpN<)y>nd z7t{JbeK~w8no)^{bKx&Rd^o{TiQEiO3E@icUGJy`?k%*SBd_UKgrRaq%Hm*3v}cM9 zHPPkFhTK_8bZs%SQU16ZW2$1N6kzFokC+Sdm2*LSfi@}-G%G=J4&sDchzD^(ZAEEk zCW+GvuQ+>n9X7ejjwylD$(mk`Qj3`0{Tu}Lp3qXy1fY@ipohh&=U(UJ7;9NZx+V5e zqf7KKhLi@>2k=z_f2dSOB_ngDv*ZNm~j=SQC zXPk=Rilf9s4>NL2+#0fNN+v4Ypa)tlp;o)^$KNrP^W+lVndTqL#XYv^nIy1D^zM^D zeP2+OVyYXeGbZj@mkAw8Uug=Drrj3gP8TKpW2FdAs=T&ywW_K0=_idcYkVB3IyafR-v+8dN_BC;=D zGkBf84$UdKvXA*9#S+Z_LW%>JIZQKvg)L<@4DHsaE2d|3WAhe5hQN%nf``^E%5SuD zAg|$q*JnX&{4$~43!b84yPvmnlyp?a3UsZk|IQE)x4`=5mYrT1f)z^~l`nBX@G|J= z#E~CRd7kw~_gUroY=Nu)HT7p^O5~+A;V1=d$VQ%Vwq-XncE#g^UsKbwC&*@a17u*8 z6JGS|t`A`nw~!)GRnIcs>y*2kx^5nt2Nv=13xo#GSI|9ppY{ZdDIi!ipZyASG!7!K za3F%mASa-az$WXeEnLF_1={Bl1lW+xL31y(ZKMtXW4PMTklU%}wu+sv-WQflD)`6s z=7s6!hdB%gZw!OY5bV7_j4BYx^`RL|b2Kw{kgs5aqE1W&yS#Awcy{5&xx4>B4x~op z#`(!FI^nZDktadX8K9@|5^id-)ls;P7FZah>-d61BFdciJhK{rw{>cEIHn4OKPXlq zkk%an#K#VfF$V<=sCa4-b`=L#!kFD zS5Aj>dxfF<@pr?zde!UDF21>fw=1Ao2`0S%Stw@svU&Y$)0ozan8AS7+oR8gV=COA zB;xe%1Yfs?6>pQ3k&tl2-vio(>c*YszaIel#NV>w8A=x?VN4(P3J z=z5WoFM{sFT0})@B_Wlh5YL7T`>WS;i*i%ls)BIXW|KiG8hbcS2s6$)wMV zwmA#Pbh=jcTQ*IoY{FJ8`FcMH5dqk)S0c~7hU#)GI1Cj9r);JzPJ&k>k40+tHiw=o z1(%wpRL+7h!_LiU)1kM%B|s5}LVtsKNYoy7cS{~kx~pC^)E&MF{Y7%rWRC=V`-Mog zewkb>6mf@HpyF$nifhlytH``#n!Fr#l^@<4tC?m5iOu+xX&WaFqv#d-=6s-T&gNCa zI`+U`tFvpT4kq_oCdn_B%*PJTefxZu|NZ(avznv8&f!5mMJ`^*Z%om`1V}H9slSB=x{F+4Ak2_cL2LXtCkC`Q3vi4RX2$uJLQ}I2E zwW8l#vjJ7AnH%j4L-;rlRA$4Dbqts~0?3G2lQ=VP=$rb{xVAStjizesZR`dR2u(qAAPt=H8(lvmo2aN6q73$z=P$ZlYgbS<3B$-1In6SMye zbvyYf1B?hfPLy%KV0n6J%v{v=L_CvJ`N{Z4@IS_p%K3aNx{$ksZqI%Xc`KS3B#u9z zzD1$h$DLgPS!OPF=r|Pyf%gz84h@{LHCZK2TL+Eqq7wOA4$4SvC8zt`n};QjG17d& zJ_0w#f+bbdRJ+AP%V1XRl;j)IP&)sDL_OWhF8q|+q*QVxJ2l>DTMWZjdV8?{E)Zr3 z-Ld&+FC2lWF_oZkUK0q6R~sHc=r8~>WL~>ik?p=O>jusD+X=S*#yEJtL>BRJTc<0O zX#sf>)|!VF<{)Adk2q7oc#hyiZV#Mo=hFQrN|hb7%^1o773Kni9ey32S02n}6^+G* zBnmRIB5P`wiAIzE4wUR30zf}#!107S8E9Ed6nbIIcF4tzE1xNw{?aT<<7ctM9wz?wAwBmrl6UST?jruZRzKddcVYWfXueF1`zCY*nD=yD%Fst>E zM&3Ly+32$hE(|w2S7>oR%F2S)^8Aibp56ZXqaup*v4p;mKMU3sBWL&fuOauBN%Me# zi#}5^vD!FWEiR=SoPAZY-mE>?G`aH~fz1j`X9 z8_hH~O%)Vj)}Z?v>syzLgiuqflxD`OyKfK44rTY`ySkHIhCt7#xVDG~>E&?|6j&jb z{f>QZ=_{b#^>R5h6W!Anqy}v^%o~5$b)&vR&6|*^zkqjD2pdDb&w?sK!P@yI4L@pc znR*JVwtJ8=?dss_P5m9=Q@y`2oum{+99p}@lLn8E5tw_Vvf|(i{FLtuiY0ZLNS|ht zT_Q>&6XlFP+EfwFlP|Qko3aPuuWY{fuN)cvok!gs5Da_uaTOAxP>-k$xa!DGFA?^H z%H6VoN%*QP)W3AtyZBj_xav2=1q(Vcv%LXt?AA?V6NGP9Zn82&J11xGWtJj z@nzB7DCxB(XVCQIG@We*v+IqK%3~_&Qa25FdchoP@d0slOE#$ERpY@lhg0)1_va2C zY!2Un!f3arldKY3{+=%BnOMv_rH|tbHr=wd-v|31@w$+pizYkA(n~zrjFYSU z5C-B9;EfTsMcvYQ?{;;b!Egm0hwND+8-bM@GIY7f4_?Zh@4xUbQIpoSZn}+z!QDj= z7lfqo$?kcrl*!9-KE7_GtIu-PB!u#JTwtZ8*d^-KV>nwnJEZvpKT!h@t5=$;jRrGX zV3|QzIWW%=H%sy8ieWZC!`uyNE;U1)+cx)Ws@)rp%+*>+Iqx_vyZs!G<)jfvubiv1 zQ^bi%ZW>H9S6DB1#80>XNl_vpDo*NDl}Znx<5H%&h$##I^R(nvlYj&3;(8!YTa8hW z&?br-H%e~w;X9l z)Q?AhoZo_A*VN6u2TBKj$=~@`CF{Yk-m&RDdP4i{cXv7=jF}*P#_E_#%dwuQMmzi3 zc(?uL*4ZvM((WJQ!=!2xHG1|2NBHt0B4JA|EgDnn1|YLCk0cS0%bG*c%Z`{LSGq#> zCc3U80wTqNtCmhb3=3`dHHpX#pFc^SN@gA{xCrgoLm)SIT|z{P3DW~Ti-y23U+Rq_ zJjC#{qIG@Wq)el!N8SpTY8}_+bHpkH?blvYE66kpjVRrn=fb?0cm{N7kEZnncXGFF z&$^jsNn2LCqoryIxEYW`bxXzN1|*`|8EEj8rdrPU@wWo5D_cuGa1UJ3uT$*YL%Ra~ zUuLhcCwAX0f$Q41(8!0U=xK8#Xr`ZQmaOuA$V#o{{B7?41gi5nymwVjFzW>QWM&tY z(=X4S)A(UdfASfdqYCnbi{#_G1<--sI&C!nL*cDqpxG1$){MA$-=^Bp0rv2;t!@(S z3QH7u0Uz`MK9{i%5xq~^`>z+F+$(fGgc_asOqxtl3XgT=rl+*yIoBaxrU#|)%WsaZ zW?9?GuA;Q+N>)$RLrsXmqHpbRZxtFyNd-_8v!2VL19)ZNA^-m%^!+zM(*o0d^8cft z>GppoXqp%p|Nkmz{jRgYJL0098VApfs~+yCq?GIsvo?Xmx>aGR4PXcx?YAi8=_ zDK;4-YOu^OmO)iMv3)6^8j04b*j-=s=Jn%mEe8P(F(>XLmDuBddQ#vH#)R`j%jl{*Rh?3D%eU#y>;tzn;@)9ZPg^k_&e3 z@P#L&mK&wonJto?Y$4wAYrxqUSN>f z^RVtoBM*H%7C3UrCOej`IdjJ+BrxQB>^TlAxvhuG94Haj=&^bJ4+mmHzB5KQY-oX# zMPf|Hu{-~o%;ucl5u9+AEL)j|IRiqY$M(%IWH)+5A~%`o*HuBB`Eo$^$*=R$X{?U2 z=I@CdkmzApd}ER6Df_QS^!jv-L{cPJjC7QoIAL=(QMDgNsPl%EjXpJlAQLokkq+sl z)_mZ^4cf#%F72`jui{8Y$nz8H&#o?cxZsV}uBmNsM6%o69S4wZWHcG}huZR~=^X}B z9fh~&G^acgFd$*q7P9I{Vq&Pd%>1TeXI&U@u?TTtVqabz(YDQ3HU=|hZcTe~*llGX=Vrg*yzsPhyStxFnmJGE_&B)_lijYzs59cU$qt|* z$za+@Av+^Jo_PQxFhlN!Qsd=TT{aFWItkuZ!jbsrRI(^CeBJEIK~v?lD&#c*8RI#hq*KSqjl+gY#LNq4gCEAuZ* zlgDp>dp60tbQ5D*&gY=D>)jv+%bpp`2KWmH$6D0gebun9pwQo$MMt6!nSvkp^&clJ zNazoCFip95UWx4BmLRx_uU<Pi(Ky;p7<#`(*g6FJA6qm*uCLkh86no!D>PqE_?MEfSvP8gr zO^Ai*m*k?@249OBWu3_XlAQ|#z%H_Y{T#?N_wGqVKARe!ewDpZo*+> z0l2tZ8ZSaanXoL1{0t;de*yx2fq?s_^7fZ##? zu?=En$IK$3lFT`l!#J7c@VLs0J1d4Lo{pF{E2H}=&h8$ma6b77TH zzNW8X5bR9YRv$!0TyYrWUwLrH)8%V-xPU3Uk0AAzb<)(~RL%UK#cE^Qs-hOx##rn_ zTX*rw%SHT(2uQ(Hh@11JN8M``;`{8t@$>B-$P=LG9b-4dd(E~Zq_VvGn0lYy)&(X< z>1aPTUp$#4OLU^RFoLWb*K6TQ>sGDz_s2dwqMwJspTMc~vQ`73*Ob}dn6U&c(k%>N zh2edhQ81BWj%+q%WvpZiQbkk{c7M|;Y08kOy%?5#)KthvN5+?mR3%1qi zM5zk!u8WN^2|Y1y#+dKWKsJreqe^j!7ar z7Ks3?9f%~BZtAC*iZj%5s0|zao6vWKMy%mjKTgnJ&yl?1O+Q6zcft8{%%_t-)HEhW zjqrwD;IcPhT7uL;|32kOm%WM>lbV8tR6`nAl#8MvbhXg zjlAhho}`jV2=9N0hVzYqLw6KJ0yYQBJ|Om%)iQ1KwJA(Mxrkp>0<(dvNB&|bnG>7H z_M5kZh11~8F(!sTvS*EE*2o>tyKb1~o;QTd+m3OxKWv#uVTw=F{iy&Ln~-{g&X;aw z$t272K+Yn7fmmU{q2MukOtLCOCUfUO_mPo?rrQ$fmw+l%QPnUT(TQ(p$ zMo$MpHDV^V{G#kqeHq)M5OCcRKItQ`fWw)>VsO{kX`&*3G<0jU%mM-xJ!0{=j!tehFHGKvJh@OdJ{bD(weOq;K!Z}E&-uJei4+3C zvidKnNf-CEKA!1tWM;qzN}Oi@-0Z;cvkReddv0GwG3vlXPpd*2GwT8pg~cuZm+XQX z$uEF}mob^%fpbOAG{y(fM(+I;d$%Z7XG6*S>s})_9%~9Wk}ULs>WKP8T6{!Bq(ry@ zswW;oRfl9Py5nkezRdgQIWB26^dh|JCCJo0(iLTfg_mLl>n3vWr_)__-@gXdJ32OT zs#G*!$l@5q0}orpC31QvKVvAmC>#bfv8A9EiVL7jaVbWgVZe2nU+h^i>QPzdng&5f z3r}f#sa0x!6d!YIC01)lk@1eC@=XN(q=X1P%@iGl1S22r!6>u?1lx2MpNzVgNChz* zlxFFu$O}CRsg9)rW|BJahh9{MZbZ$*kI#73HLXIapV>+^z?82bYOMq})|x9$QI*mm za{KJYXg=)g2Wp%L{2~ya`S*kSntJ`kI;V;xZw5uh{$vnDQ<|@=Zwk0<*s3}? zU-dld({6Bb`L`wLQ_J9ZZ(^TvOEpbUJcjNu7~JTwkl6)vIEYJiy_zjwFG#lz;~s)zUK_Wp46wtjQJ{+QnR@iF7^vO6p9x9j_SwO-rH_w}@n z_epqe8Qm2S9jkp*M@!jFu>BJJ;`y(i(^fM>U_W_xc6fwT&5r_MI`iNk$ldh`7;(tm zw;qbiP02RGbF^c}92wDER;;PjI`hyk#`u+3Qx$%{?eVZ51qxuJLF=Pt z_h)VcrYE)V$jmfT(V^0;JOCcOz-hAaA0NCKoaIwEN6ZgsnX$G&(oLzu%q1KFOW+Y* z0#fg3kUl%;vk-&mD1R>A5l1*RwNO?y3vq?DPK^XL)MRMP8pMhka>Kn;l@+9uLcem9 z{uRSTKCsmzi%Qd`d9WzNXKWQVNuN(zSUzSZ??`5kHM4{S0BP&479Bk{+`7!vH zwV7>zKPH+M#3s;BOJF&`e&Hc8LG_O=vQ1ZRS5Rls??@w}a-F(3;Gujwt>mra($83Hc@YKt8+f<9FK2YX8-G@!ZQbQ62U@?sB%N>X9H4Wk+0E_YPrqDy7%8j17u@N#(Fqx{H`$ z<096IQg9>!J*v)vOFR(%kX$Gj(WM=0nnWjB<=2s(eDy_;ql7!rw2PK(!l3NwPBm~d%w%DfS{ zFQgqO%G1+JkHnm4^FB2I2CyR9=?5`;T+#759wCIH3}bYD+VvzGq0!=_LH6QdIw`PxYlsGC8M|& zf-DSiH#AY|RrJ9YofRGur-qw&g#iRB_qFK8urLzgSPc@#3{>js{~VoKA01;vM^Hk2 zp=u)D6`!7ED`YeirSh8VN0(1RB`WuCVOJskBFSGGUAg5Uw!L~vu>q&8B5S+9d-xXR z>Z(-KQleg;_5UYZhfsFr=AIL6AN{9`So{J2X#OjtyQeU~lJa`aekf z3=Y_TBJDYG#10>TLo&HSz1z)9ooyin=B7nNtkorjZ6tGweTi(vZgF^K4_T0$bcUxa$k#CYD z;oX}@3~|FROG&aX`FI=lX_19q>0MaAI`N{NrW~=4SuG9jL2*j0Eh7O=E>~^u(5)54 z1mFZVsA)k2e$?)5fWPHNNU1f*l4LeH2(ItEuciE z1hss?Mai8qOS13#Q4xe4>BQIfPtFq86qeH4AdifMJeX<6UF5FUqIZT{VOxn*QiDrV z-Z+ObOma#XX5%%AWoShf>Rpaw^8Fr{w$1seTTU&6Nh5%BYRj~3|GQI4;zyK|Uj6qs zT>hf=glrMPo~hQp5l;mwo;B6ec~gkK{Gih&2k%ghTPc{(2dM*TH_B>A?f{ixrc-=L zx)RT6M@wwdIMgscl}(3R5BnAsFf}yAAbW$3m=>&*Ov(znQ*68U1n!ErRPC)8vsXr! zVBU;iLDt|1;EdMUEq%R^158M8-b$_h)RY!(pL??&D?1r`tR@CK;fJmgPD6nvIwEZu z#gi`(15`KEAZQA`b2z)|RD%V`K@{HAr2vbj^y_gR-e%}s_fLURh^jdA-2yZ3)sS=i zPaWYw)!xRHBa;EiYsBh8*`zv&lOp{!j7fZ}&%f!-NGNLgG|o7Rs>s$8irF7WY<= za(8#3u^&7qmI0Q${uT9op!IM=FY0gku`RY)gBl?@V3?>z>5tjc6UKE7M2^a0C48Zp z`hk(k5F^V&X5lcU@#l^6t^vC~w=^@5(=X?FPSNH39KVVJWfo}H#&CA#rzZ2Ch!>88 zI$^Sc9XcmYqPX9*pX-*;i4w>Cxxzgt`%%QvG7N4~_kRd@bEw*GHD$h@E(x)+68SUf z6lIOD@@$UrkbG{fu5nHzeUROF*iV5GNizR?<=G;3(shXPBI+5 z)KrvR3f%^#~F+ke@6q>1LyRGq@fk2Y$>l?c2!$9U*D7z8*NtZT>ESj1Td8YM9>C0l1G}`5l(bbM_N@5 zFEA~&r7z{Jj$Fjc7#WjW~Uys%S=vlr59?N^|1)!A?_)e*R?N^rqX0eWa~%# z(!?jeG-iboF=NgRZhl>px85dEMLu19Gr%B8g8*`DP>MkwJucO>$GXP?B{etlqNd_Z zuXCm%Kj4L9EsF44klOEYYp&YdsTeigbAramClipQV!D1Ubu1y;qh` zo{A)lP@_7K_#>CVv_KA4o*OQzULR~7aQg2>OPs~bdhcxT(a7IS`~;5igFjeaWD9Ae zm^rA6Hy{1K&_>YEKXy;{1nod1uin@ohd+G|@=4yS_wtT*M@hB^=}~h(u4^hXzGxJ8 zFficWW!%$P&Wu@ zi*4`r)15x5BP*<@x%A*3)Pwd)Db;twP)TsZ$pn_|Y^9zMeveAzVRCfI+`+m_+N2fX z0Wk06hSc2#;tYGOxZuwLa>HrznZV_ZQwl}F;2=p6kzl+n-XjQiC#wT`%m2Lxem!p9 zVYnAjVUFN;4I33L0+207fFPIS*R)BqTW=Q5C) zzOg~Q8{l0gYLi1l@L<_wqJv1_G8M-$*(b5U>!H_sh-hdGITw(nD*R%Jzhcovf?n+* z_z+y5;Y$XmVft#_X30JZTobfX9L<iE> zPMXlOOKFNXq@*@4tX{N=vu4X@5-IL1Euz~xQXD;K68ZWLBzwXT49Dylpfw`I>&?1M zrNVphfZdWod;^Y_K*=E585Pe;J@GLK3qDqdT^zNdMyx=0-1Xa=5$>b91h*`?+3Yf*k5nHIR6F4CQkozH^LW2_9GZ|yVXz35zADVr{&$d zj*M1{qH?yV@_?lH@&KJ#4CQsRdUKb_fJ3RxDkKnHg#MAL13D|JeX$}3Z0l2IRjyO< z;O7F-YUfvY5CX$AnXGe)QFq3EWrHn8h}Tzs5i=J5%f8PG^XXy$ys~8u-}PvzKgcP2 z=LwZ)mLUVUTHb23RgvKIi&@S>KuZ%?Qm9N%B62f9@-jp9>^NSU5lMN0L~?VCpEzQqP~aphW8Jpm z3Mn~Xg&SP=2CNJuXS*FAJisBWJ7U%FBM4!|GQ(t!sqts9l`6y3c)}-adD$!E7oZPP zjD`%2Vn{Y1<5$H25EBsALxfb{2TLzVoW`XQ6QFK~S-cc}HsG_2h>E`q0rLV;=;+YU z9x+`gD1hc{L`m`?Nj5%WfI1;D4JM)^tdIy$!}N&l=mnYMf<7#MQ7W+T2^}JfzPzQ1 zVjk{>4MnmMT*8`2`xWyj<(=P|AV~3_yOd}CoZ}48f-$$jy6JzYo6FaySgIeGR#jG zt?|tvvdj4Aa(RFQu&}kGq$YiyrkGmPfSM-y57(ghqJJ(&N1YRDIeC6!f3&>3z3-=$ zS>~lwL@i}RIo27>zMd8xrR_gG#2)V&xDZQ;g`$6l+hjTPq+r zzt9v`nS2?*0H&_xUtAHPma&zEkU2~hSW;3T!_+C?1wH;Z&n@0>m`qd=a01&uJ3y+< zm$TZS0$}R-4y6QyVX?XqrTz#Iw7hbskbXmG4hAsFxuAsWL33SWyLTPwZ-Dnw+WZxl zlUT*#Nfy$pV;lu)zoc3T*bOUTOIkGKTPk>iHg-swPCr_;3lrj|O^*}B70QTA?BXvT zwpeV-gj+utN2A~S0L4tr>d<-%-`*mxG^ACdJFEty&Ba1t+Tj)CG zKj+Rz`f3h)i-N>MQ-qox*uqi}&+43J`b=f3sR2%(w-8EW>6}>e#8vH!z=y#BKsEqt ztDqz!V3%!{x(1vSj7;%$+e$2(I!iDzZXc4=;7+@*b=iNHj6-n=Uc8dU7qd^Tt3?5a zW_{#$3~uz{hj?m(Uls=L*kUW*c^Y{#PvHrt=UuA2oo?hUVX>0ao>F1AK2^iO9r%$a z2>-Q#0RIdh{+($Zo7Yh<(4J~iv}jCFaRs_Y6|^XtN^cxkTOJJslujj}U$_diKbD5k zrZO%cZk>dVOp>)&rkwAb#q%I=har)j!a>=yQ$6GlUvCpUtb?za`N$>>dxH1-)?e%&xMqtG2@K@B*fGJuRe_wP-2=2pR<{Si8(!S_8Dcz2PR~Fcy ztu?GqFdA%d!8jI0DUo{oj*w+3Ljm2Q5gjzN0`X89KkHysSP2t*y{Z-@-y^;;S@xNV z*FO1sSL`Dy78^7M`>m@)WiX$oqf$hqDwXEf{Kvt&7kzfO3^{+mKL+v@C=NSZizv?^ZYjo7`0&*fu>(**P0Tj9}PT(LFXG_hXVLB)0- zKp`ts=jlR|mZ<6$4;{1%MS=b88L8Q~_SX{7+|g2t)Wuv`_16*7(9$EhZ%2pex$Fr>2|$Bhk0!xAu)@-do9^6NmI_QG~WH z;dc@+#s0guIdil6QOQXX(4E+NWs9kE#56Kux)M@WAEmQ!C78Akky6JKU2BvpG4cF> z`x!C?=Yp~QTWzb$xH)+;_aSn~NoD|+GGKnFsei`ZZH}eG19Ni=thu=s6lRi=N?KLorBY9h zfDft~4U>Lui_^2(=BcCi&M9x5(g5NfnCglFn0qTRHZEJ`HFkp9PEBJj&k#z}RbPu? zZ7>=7fmVhsQURTh5I>Pm%P%e}Am2=9;i1lEhO{Gs)lxevFX>z?t%OBt=lai767>Ku z-cuTcuR^DpdKKb<+H0^TPV9A35tGYBKdnzew!1!!fGL7_xeCMhmDJdf41r~y)bmHN zzdJ4-0S~?w>0shMp`%o@din4XggFAm`eBfP9;N_^e>2rHNlQ0-m%f6k+2`yVWiYA@ ze8)#uN=QjJRJVW=>0R>-L0Jf3COBN&JTj%!c=u56ex4HYo3I3FtcnGRs=${tm!DRB zhg{5_7N6f)dEMY9ynXAG>yG-^i-FVgO5>=&S>=E|lGPb^&g!c01$&aw$BWdLqh)1I zxIw>iOxg<2yS;9YvT3*eh|q3#dSG{dJYKe+jA8oR@8MqSba?&l_PM8+J4MtfyV&fo zrr0UO9Romj9>BcJj|N1x3M{G8~={z{@@CB)8)i{ zZmMkn8N(`|G<5KO|vxf|^}U5MAoyb8reGxd-7Sq18sn zO?VYomwUDwDOI6ln&4V$5l=f|^{7t^TA&s5EN<_iDD)h0Mi~5en^Bldbvm5@SbqcF zbL!=Br|PM@v|ZEnO)Ft#Kd=|B;!>GEWAiu6yPne$?4(h$M&9EuNeh<7_Xj8}cPCn^ z8Bp7t4<0_76@56iNII`cqhpM%aSN%FJXzLgE_*4PIaIeEl&#jYgd2>594k1j43@de zWlW=!X{(sDN0u^oqE=}?7MypCu|3F2RCu7k_wr*320`W3LmU<Bn2*1&~G_ zF{U4DTOe%`UDOB-Sajo;KMtcmSveL=96yK^UU1KCztG{{tE~Z==byTt^|}OL zJ`HfLRAXIzqj&{>IjRfq4Pv#imRry5q{mQbf?KD7TyLGWOTHClwr#mr@O<<}uPr+5 zn|t>93);H`cAREh)Yiyd1;fg$ZmmH-a=SLGrQ?2I=jMre1^j}|gcenisis6gM5PU# zhj)L(8qZBkk@&Fu)ydPU-+*CtXZZG0)OS_1nD7?c{&o8w z!qfkqJcjWfg{Pn0y#E6mQ}}N>(?3K%FLQt zU(cS}-qDigzgGXaG=csNWmc)Y8*9{_28%pu2KBC4txO$Q=rRCL`839 zbF$?HNln>VO5Lmyi_klDJpF}*WQj>;u7sXa#Ybo_P>CqWpk*fP3CcWnd_bzy7PRW( zk7vRgumRDBWsI6|sDk#V5Ntdwjx14M7_y;YK6wXXlE>M`pOYQy%bZ?EQpsXmV>Nc= z7kFsl{%O9py)j~Y;sT%QpXACv5`P4e%@iT}-pxv*&SI*j~m z0FpP0p#;Oma00=c*Om7slpylBY`n&M2w8ruTv&^^#NoD^>tqd|(6r#ZN$f}2^=p(g z&BDHGUaL%zum$_y=L-1`$v@C=d!FWJ|9%YtlU)CM#xSy6Xh)7BZgKEV=h=fHp@$o# zzCMHpc~xbT&tKC@qd~(*ZN_ftQVX*K%1_ z){yIR=>B@*fIAl*#zy7uXnB9YGb!y`t?i0~lC&hLPf#=SFlg@Q$bRG3BxC1(lb?VM zl9CF-Ie5O$%Y$FX4dtO`Y-Q}%;}y4#hird_T0jNy+*uGs#|Pj)Babhrm*@8&JT5EP z&rT%9|L4g2-$>T~io6!9qkm)CRjOOrxuBTx?3| zgVLEu&09Hre;UIaWr8@nR9gGpMhr7fcd(CJNcg9a;v^o#deU@dpz~%f#?Jf+tq!ME z#VK)kL{@a$8;xbV!9D@X$`}KWwHpNO7(-Ux2qqugN-QLju9F*i5krinONmNRkkU|> z@RH8#k;K@A&Y~N?xat!kLp0h#a!K#vwSqh4d{wl^s2tsG=8sipe4|vKmx&VPY0z?@Jq6>eNmFNvD z=9{Uf$?)`Ew^mAs3xEpSR%xag>XQ`}3kz%BnNtM$;UwD)8ODa|gsQ&+3fIbkf7krj z&UWKqDHPG!85I%x3usBgVG*W}m;pGe@Ykm|kv7qXgCeWbghn#inLR*jOsh;BY;nnLmPPqy{#R1WsWzj3BkakKr3COj(`9 zhZ%`^`;k_F3mJKV9eG^5F<>nUl~T?Cl004btou+Bz&QJOW59E+DHl?lPct5wl>@iK zprdde@TKxx1NPYFajqOsgSvQ)9T=oYwBm4LDU_*D9=p3moH8m42F0HOEe8I(PAvxJ zXY-qD(9k7@cI~HpgzOeo122<#0`0T~g@b#08O|yvRsxJ)))(4t&ZPaxrj|0B<_@U=TsP00C}V;Ct$XtED8)IO%28B;3K-<3LfuSbf+A`_TOMb8a=CLs zt(^45qL_dHlX4mAPQdg<8-luQpKW~BN7Dr$Bx`S)o^Z<-S2)keTc>mh8 zSI>xXnHh_``{3U(&q4G(V@|Q$qx7ug54~skad;9wWwmG6E4JF+Dxa zO_oS8EE_-Nkh*)PbR$H+>Te58nK0)DN`kNxJZ<}t285)R1Zq6$#2l3&UfAavYG>i> z2i(?aI^Q~FGaQvV!lr;*jqb4s;$+*P>@_WsCWJXQI7`0(zb4MeTtx9wHAEPxDWE7C zpb9@cDaP30z1P-SR<%~CDZHjd6NoObdyHNXUtqbT!Ak=$J~+R>@5dGA^F`nRjd&cY z_f2shVnp}Z;7SBxJol;x2nsSBXpoIxT4#8$2J-?x^K6rNI@5WFV6@qlYFzSN@6W#W z{m-Jr*viBc2@N<@{sRfW_+h;;{ExlW|3SM@JDE`%n(0~EnEYF9s_kL>x7xI*wr;)7 zhTzrI?YEv|iYWAZ*t)4!UN_vC7I00v$*i6BT|ly7A`MYFE-Vw|^*J;5s>$=m%aTZL zWH+@xl~HhP%Pc!1?)uwMYBRoC_2Bc8`c-f?g}P89X1nY2>-FjE&8CLG{+Xdul`9R? z{tEts@$Tw8xx0#YyUo~Wfqk8WnV9jVUFgd1AjPf?3GSDJaJ7dPx9IWU_a$>r~9 zI8yBG;Ym!xT-i*SDNQ0^tP!h8MMpZWdl6T)U<)%d*0qvS9?&b~#V3aqT#56_k^q%& zh^`^-MKaF51w^2eHej#~M$%syW5b6o$YT%8xR)Xsn*9Jwg7y3+u3Dhey#hVoP{Bh} zX6(Y4PxZavjspNt1Jc%Rp(Sw=DiQz-ha@KlAZ|w_DM*za!46Kb?S)M_ie1|)MmNe@ zu|k=VO%WgTHvHq8g11gT^Y@cXp^`aH4fH1Sq)J| zXVc(aOtr?{%)~gFYG~~@dg>8-y+qH4^N3IpQ_Za3EBbGQ_gl``snc60p4%l}ej1f6 z)tFzxzyWyIj88DW7J{%2y1~dGnEK9)g~W!`hKy;Dg5JA!6p6W^rJcS&aE`u5OMxWF z1VaWGy#~AKz%q>M!k(4Z>x$&_$2>HK9BRD>;d70<71#Ul{$%2ADoFteW$D4DY};X#I=F zQdKsPk!F&wRt`$74kq}?*V9b$-CnN%3~zN4>oAbY<0G9LqO>48#}8N6$R;B|Dr;r- zt%CWjl9|fLM~Bs^{dMH$seRR6*{bb26lOSztaZ2jYj(60lHVAWK5QN>V|4{_`> z6i&|Lto>;)bH-(6_J};eimVwHF_plNA%4bT)|7m;GFzB4!Dio0q6$_t9hO|$<~p7sOp(NnqOIS zgqMu~PC;eDrFSv97!TkcnSh6>VlSa>)E+f9r;$++<=%d=ljZt5pLotj#e3Rdp_T9| zcHa(w_hkjA{w@Cii^zRB^97O(w8|X#?m={Sl4rl2YT_To^0d|drRYk-^$zr`o zBm*`J=Xi}ZKyIGAA^d_hev*=Ysw7?a57JmM$weC%L?>az-R{AoP@m374x5We)V1Ns zLxu`Bqx28EyNn=mShRTHb}#6M{A>aa()Wb-20nW)iX@Ac?R|&vH2s#kc1vnw*x7TM zK%li>>e(|z>LJ6Rg8^$pq=P|b^qSCBV-qkr9k^)zECk8LppiO}8-=i16pD?$+U}?J zJMmQ{Hl^K)#Ye@hdqtgoxb$p{$(rv_7A_uPxSUBZMsJ1xe4vw2V^4Ddw}=NGM=7%Y z*4W_GHSxSrqsLne$Q9JqP0kK1Jmi+G$xYC^e{-Uw$M*V&qxxl5P?6nCZ=i6ETiTO{ zumfjzLl=d(&Wg|FU_YvQ^@j7MX#4`s|4lVoG@ zZ#F}n!N3G)ud7?OyD;Nx5znWy0&hy9Da;mE#NwSNQzW-%N`A0p_?!3Pj z1OWgL{^4=c{Qs*5|23!l_gWCCvTpw~r+lI~7Zs6+3!`C@a{8tPfBL=pdi}yPhzuN% zAaK4&^VwbsET^|CQ3^TX+4OoVs>wB#Rg)%Ko6p1hP>@q*{D`&f6@Mem@D^p84pm?> zI8cBVW=7%aO+~DjB{DKBMtV5%Ih%*zLlk}}?5iu_3Z29F4SGo2VI+Vm)E92bl%LU) z{tE2guyJmPJyc3U8VMB#9a<@TzA0lHiOd~uh%LO$C)(Tn<{xWu>>yIJF{|k3k~Sg< zmlkk-Ao)UU1w5590$wkYtx0WP1a3bGuR4nW&JGM zoWM19Aa#@5avn=49eSXlR-wiM8*7BnX%xc_(`)de$H&b$_ICtMriX-qGy+>-u6~&0 zmKd?2LJYQb%2&8bV+@AFWdQks5#nEIuEW4lRP%C)4y0Cty_F)u{@2`uyj@Uab?KTQ zpc@-FGy$qm5fS(t6DSwt3s?avL}YsIefdYpz8tdcQ6Yd!dRpW5g6ef!*x3v#&*A|Q zR`Ov;!*K&TlT$a(5KQX7xD1q>^GBT!HuD3U_-1A=m>t+L24aG=wnuL1Jte3j)ct(X zX7bedv8bU9VltZm;?QP^T8K8qFxZ+I`^-_8S}wgMQ@G4_rk#MFDh~5*CUqD2f0_mD z0G3+|NxVBBO>GE&2Pa6!FX!HR%(ijKFoA=lvhk=w0&7bZi&$?e+BlO#Zq33TdVNlgs!?kvu5ioY9WCf0X zQwypClOOI7w63HEqf@)-#~o1P>*zm{hfFYLxHt3_ZoBgo+yp9VS3S~3?3%)MKWVlQ zFCKUO$xg$DqwkGqRPP4v>(ma4`tiGiRcojkFz5F*a|>iO=alVro-tal`r7NF-)l;N z4jrE}omPos)e5zP)$%llU6iYCfappaji9g-NoB)t90ny?tZDZKMOQa|!FO+xMdK|x z5vv1UbQ#?utXJA{IG;&VOHrXS-=T7~~?X)meEmom1{CY#vMH}}OMXipYB%!U!!r*8)KJs;s1y9H7G&3XB6cdIdrzmpNh z1WlcZq#nnL2R3WaY+W7pjwDc_K#&p+~K;0M>%BaJl_q zu%X)A=JRk)dl1+O_#Xx!!^vmppZDsx&Q-!`m(VMrt&;H^6Hb{9;M*eX$av0Mr)*LA zh0VME<)^ghOXltDZ%^jukAKZk|B&#;kBtGie%fZY;h)_0Ky{Rh**~KX zw>Hzjm(>YHRiK-%hhpEq04aqOR}?3Sg7j^1GPD;m;9WodflU?V9L%D*a5Z}uDv&m| zcBU6zlv4v}p!HWb6=^sRBr%^`fuo*%7W^G@^rCAm(svH3n085K;Ca^+f_kK8d{z`f zg5*p><phv1-K)30g)UVxAtfT#q?sLL#RcC{E(~zff zZxnXXlgsz}-h!yNOFJa*dto-cOBcpTzCz(^X8T_>Y2cf@!t#qpAN1{KDBXCGMfWnM z5O~3yq-=&{G{HMbF|Agg#*Z2z6KCORhrwlRk_v~R@D@YjEqN-CBX6x-C2I;j zz*%f!;-_{0Jgq5-*($c#G7eta=Ec?5WF(=^Z@SN(9xONJn@5WY@h(YpBQEE9s(F(o z@Pt~$i>hS{QpXPn=iv73s#|qCKYo%6bq6x=SsL<;sA`~<^_WJ$LGUNvR_@~%{q5}8 zgx^aLucaC&ko)LIZ|b3$y9ss$OeK(V?i&tE38~(!!mWk@`%1G4y|4=1%0uVp-|cXirzc*q$&qqYyW z;gFBd2b-lKq^QPO7V34dC1{?(atgp~LuJ=AY{$Uaigd@|JxK$cOmFJ(Pk$l1RqPIg z0|Dk4!m|Y0q~;~g9VXz@OTTW-xJYcx3L8uwul4iIGUpRHY)q;|p@wzM<@2N%=b}rX~M?PMT0S zoZgzD+decn8MQCkDL6nuYn-9rDar~0N|PR@{M>UUUiybY@0i9ka0(iY?+s|1^o0Cj z0U~d(>b^&P;6B9q#rd9#bsOc>zVoR~2d$%%rpjF@sZ$@D7$8ODk6;>LE>&_qaEhZ+ zqq2bu04{S8!jkQhYJycCdssL7C=tSS6JJjisLA0Mfgm!OmO7^%Q~Gpox({;C8K61w z3R8~8vG0Znv0$O!ye~vWTy=ylX%qz^g$QkD$%;W0d9q%%z0$>0zlpbz=vRobwMWCQ z28x)N<|6=6L9Bbvf!CqSbsMVm%q$no1p5c<-a0>rRHMAcQM0pvdm=A(R2$>g_u#fi5yNS;!wh^>9SoOaw!M71bI`|~z`$KYwm_8cpy0iEQ8Os60If%_*n;6zzBfd0TrWJ| z7ld)%;gTOndfO9h&UTWlv%eKaB#UlK)%hlxvib2xr@4ePg6{8CjM*kdGO?st3(7r7 zE*e#aUf=6+nbWn@4Sz2gBc|(o!|S|-&NQJtOJh}Uq!Na`uB#gV0CTWpanQgr1UT$^ zlX^J2_F@b_Pj^#jF_h@4rZtQ(P_5_(c$bWf9FJymaxJISWGWGz;xxlm?CF-z7TOm9 z(M9&CstXUfHLAm!y_8q-sWRnwNX*sd?Ptn@idtLbiycyU+j*&|TyLX{7yc;Y59nZj zQ#NFW{+}H^bugRK5NB-T3;2_2)W?yrn+m6AMkF$E;6ve3j9-Z&8L4WnZf@v9eq;8q z)xIVA1;{Dswv1Mh2x(dzfR)EZYEjooGCdN>GSuyZN;nx}S%jy~j%U!zAyllaRs7P! zULz&+5{Hj5i3;*$!=8{WJ#`yqAk~V`>-LJMY#b|P6KbV4}y!)wP3ZtqOUA=4>`m*#j-XW zt`U^DU(B_qEfRde|5JVY$4Wgol!&*6l;-@qt-nLxo(FJ5{THRxQ%2F8m$`g#muw1-#dFv=zt3b@g}5r0jaxI70%#c#4xWz8wjcB zdkf6ejUs3h+r-(3$Pt^zMEVkgiy6W3x@4r3AXcwhr?W{04wZpDS!wnLBmO|HKpe1P zC~Bq8_OcyAM0#MEk{ZHyt99+1(O&l_jTzI1Y=OZK=u)nl!YU|VW z;}+2^JyAT_M_(v0h;QLDo58OX;FxJ*}-|T$wTG_bTu*=pa;e69!8~G)qgr zqZmW8N}`i|_EOn6m#IBd04!?}ni$fK^;u|y4jjnq5jT{4Me6DT9Cwym?XjZl->4iE zt8~@#xDtZ285W(*EEE8QR6G|Pq6X(*hRF$Q(3DGhIdnErMxZ`wgswYPyi zQ;)B|aY@@a?0ijb;KJDq=xR$zye##;r~7l62+!gwBXQp~?v`rAqe3L1yKD!6PjJS^dAZd<*m98YZqDr_iz{5;n8xd03n z)eE!ka}Hgu+6=Kb6jNRTnjqScCvs5AbkuaaTDux&CbC~p(b27QJr3MITkq>Bb|cA} zp$q0f2Y_15;h==DxkVHc&v7CC&^6qa0Htj07^Ck914`cPj~gRK=T(aN^1ZI_l-&zasU;dbp3OZD&tY*%*6Q5=kZ~VB+cS@9& zcP4USBIq%?f5^e=^iD)PUz&Iot^uR7W&JX}&8(~Z{}sCQkNHC{Hrc<;q{zsl(07GHr>?cjXWi~evL2U&&} z5jgh)Nfi>R*}L_#btQ?51syi%B*73M(B;SXE>fr?%gckMq$nZE=mtQl5uc);h^zDj zxuI_Zd||}jg|ExIK^s5ORw%qsO{8f8cOhSvqLoY*S zOgRoYL>N~JNE-yoQrgMz+b9LKh2rfLNxB^+2}RZ6`bq79d?YgY^S+vSO(ReQB>W08 zOddr!1}9rG*X{M!+WyqJpxr`A_6vSTAKpx-Pd1|QHuGOMxuG$|+WEUv<-=B{Z3^ZT zjwZePiFd!CHqBG9!7?<6;e@ zh0ITMv=aMMDK6wDO-y#mZd`F6NcLBCxuBa?+#2$!v^$px+aUK}!1J#cA|1+>rBftA zPr<iYzA)gVpeg!RIL&|4PgNu3Ew>VcsdX>vO9$8Y{_2>! zU8m=L?OxV*es}4&+vx*iuTUn|%p+C=>;jYj5K4haDWyHGtQ?HeWR}7V^UMU&@wM;B zzjl7Av=o0B5Mm5BOmM_o3{O+4cLx0&)pB98&gvVEwq;^JmdQr^oTEtQK+3qEcx#v} z1_`(h+!p#8CRhoO(%Zr|KKA+0NQHixk~I4B>gvM^U*vE1eQwKC0@3Zd7DP;sK|$6TB*O|r&g+x&LNY7&jjOP! zZ9@lz1NJfm>t5f#Ai?4R65U9os%_R$eT&Pu$SMRyqH>iV!VGP;)zaN9Tf~?^E5y`0 z5mFSJdMkMsVKyw8GG&u#?YHa7aULaNwNjzp!a@UrYB$jwOL8(;!0--yZ1sougaA%f7|>fLd*)~CO4jsdm&TwtAsb5#}hXrzB(yCE1+ zK1%uYl*QVumC*ti#h7_O`?pdMSZRZnohkD*?%R4*zA+hM+@oGZ7M9Wh>$7vjr=Lka zfrW>ztVWgode{RUiOGslZC_(jaf!EsPq@Bg8Y@MaQr~nrL=hy*K(ECPQJ4jTJcU=^ zl3v-%IkAk9Ralt0;KYH+5W z@xemJ4VgRR5+%?&T*see=Z95^Yb*FeLs&g5droN0-p|*luSLXNX}Hg}kLq{$SU88+$i)KMYG|=F=z1II**=b1zb!ZZczgr>vmuhLmt${iT$FA9p|oND zB**{E4Rf({vHG#nFg9{Pi3vXdJzOu2w%;d2h?0N*tXIIz=+EP@?{kFAjA8G`l*ayyPM_d!wyut#9(DoJ ziR-_V+TD0?y2$*b6#5&KT&8zBR|S8!|4a%=?`DyqRPR<>jDJRNCz&U(F)Fv+#z3_WCwrVLy z%OoW^u=@kRvzeijQ8{HTR;NaVldqV{jMJL9I@Ku4G@bwEg&vu)zAi}0VKb<|*es#H zQW^ae9lF8dJSyDL3nb7!{fi1`pEZ7Q{!ibnlt}P-RIhvROGmU96GgnT8)8*024Dos z=N^Ze)KsK`o^-$Yj_KCACO+K7GE2S>ggz&r_S#(*?QHO9#L!S)Z=mbZD}YFFJjt|g z^t7jE6aLG8>ye4yPv(o6001}#0040QV~_0QU}XOvYvZMtj{_!a+{yM`@!!V;m{hrh zOs~>T6VW@4rux}RD>tjwI`YaSRszwv0ixh>d}<3MpXc*zK43<{QSq&%&N7$A;}Eo* zSyLvAND-I)bkXqf!OTwDu9p2STVAE{(Q+gC$`A*g}-y1 zoNHIN?oR3xs)uYkDAtkE)nki=nyB^q&S2d`uLQi5#fN9^WB}2$(5%|1NS2AR7OG1$ z+3lXK6V;n%3_7jj9nR=}7}Dk8_F1q8%LLWulzc!?cdsD)Mr+bXW3L5RzaM9?vw#ys z;P1^3X~v!hJ^$()D}m++GP-C}n?PKYWyox*@8%>wR;1|SvgL$QPHSmZP`zE>8>v?U zUemqQrM25BcT$G03HqsA!GME8WKJ~TvXy0G0e0X*T=%J$Uh^rl$MV-utfcE63Et5M7P}5^C026lph-Tb|gNW6>d=I++V!3PYXix=!FDJ-OM(wA5{2@Ie* zX;T_(2InkU5(Yo*q!_NuK)M3n4gYVGw3(~g?7Z1^CfW4j(P_jOoE%g#RrdwyhK^Fh z=bbz?I}|=^g@sO@iHaKu5lY>F$D`K>umR#OM$i*cdfKWEs`Ffsu{xeA)j!Ib1g|Ak z6->xFe*t3CLg$e>;IfPMVZup_ATRo=f%d#M1=>qPtn>o_vX?HglW}2fwDyMzcw>ng zD#@AE7<`~O$4xxbc6m_7}r(ae6)tZOhNO-`am^a zd%p^g1G#2>WAEiSeuW}&>ef0I8MlM;)uS3?M!K)EKAJ;9_4U>-S4V66)RT7O#Bl79 z?siZWAt^yX4A7mka{lYRFJ+o(HLp+`hRiy7R2^VPnLy~8dm&H19fTP4gqekW_<>U4&`A(Vc!Ds2kY;N26u zzeNL^c7Ia`9CPd;BK>1LI9Crqn1M8gz93rI4t(F%xY#o9}a{x%JP4hAY_1DX!% zzKclJnGUcdclRdTUh0_(jRN=wOI1?NWMxIltW(&5T{99}%>kBN-e2j+DA`%<0tBA+ zZbc6OvP{ow=R}{zd(5TQbNH)~qG`-1oyRMrq)x%9$OODXOlz6Wls2pNM{1XI+YwP2 zhTz)HE3G98!tbC;6jb%)C5aEPyfh^tM9q-w#gsRA!b~{I=8!Hv#gZNcbN{Ui))^M& zlxI1AAiU?J)%fP>>`0t$?l13$gOd~5;AsR(_RoUEd<|`cGqWh(j1?C5EQ>_e!C+xX zN}!kuixkOUY}G}=+8z#~-m$=v8n;wnNFw5v#CS&FhJ9qkJ&=N^GFq0;_R>XJXB*Ui zJB>X0Hh0a{t5gQL=*2$tT%%zSuVm$FojFy*M^p8r4IdbV)L?*HI=)+Jl8ofx4H&^7 zU`4==QX_zaWeLZDynVRxJIx8LgWkR_{$@qc-F7n`xsxbRITcetrp4 zY8)V!_DLYYptK8=GPTKNMsq=MfQwoES#DneOeXC^YmFr#UQ1OM86!irxJKpn;Rj8O z{)dGnZxBCpka^lUFb|x{s^3dN4^V|PiM_W8PX)Oi8X3nqsI#Fc>q3lEHFNB=cejU^ zB;HBW>i1Qb5Bp%hXVzV~DyuR{9ra%iPF(c0=cF){NOmCXk`IWLp%0xcNaVa#bKF*3 z4lU^e@5wJ{fg6ng)}UW9vwI6Fl!!~*BwJI(FIQ4n_0WL=4UP`#IOxcj_38Z6TNk;# zUl&;Hf@!s;;mfbTKHg3)DW5N+o2H(6xV=B$Zlm*)nGj-tnPUIe;6cQ<)>l+H`rz4T z%FT{;DvB0Sf4p~T)Wd)jAprGo_ocn5^*iEVc=9@Jg&0FWZ*~UP>Lx%!L!U$5QE4`Q zI!kGGSzx8f-<3Hd($;zO^KKPqmzyiJ!q=bL(>pJEx^p|y-dP~b)t_-!B76m$i4c&v z6^^zYe2Ht%`4*SstOk{&aWB6YiY#qk&*%pqor){p4Cy%q1Ezl6IFzU2m8GXSa6{#v zX-(tt(5=jNIHg5$tT~nq&92=SiM>v;NM)>Wzu?9f60jdqzcYK!hkiTsGQy4ZAP*lu%gmak^6*A4frU!yAzb#q zdM~>0Z9mS7Ja7WUQtJ3E^Bd^bd-Of~84{@G>u${P36|3BHf=bH?Et5dro6b}{7GAP zEz^w)ji&))wW=^r?>Jr?a;RRR?Fmw5EAog!5FkR#N=IcLLEaC05Vi%dCak$&FGNC@ zeFf3*A?tFw*3li?B@{q-dbIWPtnSYqhVP>qU-i?PIG#fB@gZUp@EX!5AOv~nar8_v zZa#jU&f_fhtd0C=fpUfa!zL1%^<@VQgZ_gk=g0PhmfuimbD)q6Kw~4Z{{slxiEzfm zulyPOoq}4etkQ^k2?O`T!m<3$jXPEN0^PYf{TezhW$~9c>#EO0Dcdhl#k6ec{r4*M z*W47QaHR89O5FHqVlYUkOtAG--qrmZipl6G466hWZ)A7E*Ak%%CLJw|YQ zMsdr@BOaQZ*I^a_;P>ztWBUJ#uXE_qL<_R$OWU^XO53(=+qU(kZQHhO+qR9$?CM#M zdUAijoy1xZXYZ347p>PSz4{u6yr8vQE%T+hl5Faz=jR|CUeC9vh&%s|9w+@$h?#bF zf(e0|Tqrwpl3Ufn4U@|uH-Hizm!_(FS2$AM!w$k*8GoztK)o%ezBeb75|^)gQ;r$E zL6>-LkAdRfba#S4t9iiPn9X|kJ_8Ke@!#d1ymh?V(qoQ5P)g2{6+IsydSudCVvVQg z#jBw_l_sUVl>zAT?t}R!9V{@AI5z_L@S_pbwNA$nDch9X$3-AsLCgr%4B^Hh(lrFV zCMhG-6(8M&lqU~e`Me$;Sy!~bV=FND-@NRk4^sSoOKit8-&f=Sb%!2BvW3kmCV`>| z?x~R`lf|NHTI&92!y&Zm(m?=sGFwaKUwA0)(0gtnh@5@--s$elq{t+8v>@gWB@VVY z4rZ(m9Me{tC%3Frz0g`yTFi?NLS)Pn&G!u_nH{_Phl8w*t=J^gNomsE$^tc3^YDkG zATxqxF8z~ZDYh98wg7LzO+u2)%EHw$7SGbFSB(Vs@N!6?4z2tlKu}!JBb0`#IvK$~ zAH9oO+5OAE{T25M>2>eJJ7S!l=fag!$mEwTzd&x-=kcYZV#RU>MF$=1HD)4m8a?V^ zpF5!Oa9r~KJED@6{yAgT_FIK~<{yUGpyOSH_`xm_tKXD4XeE*T@dLf&aWlHqZMS)M ziz0u$Q&4AxN8lKprx*YZVl)d~O$tQkaPDnvPw?F&HOKVFH!W&Dc z_U?Q)i~fU7R_tfN#a*i=(A?1`6((oxzrL_U@Ob`G*AKG3ZqzVHzwta4hKF2c|MQ7^ z5e6f6spwA9c?X_c)M&~YEj|8-hLOO(v*G&h`e{zK`2h^1=lgqUy-u@_*`*VwPN>&8 zIu>gCsxp6T&BdxjaNHR2Psf5jsJGw)!}*-MFP=k_5d@lt-|w830L=3C-6fs=U_J zwv@};fmAbu{@VE>)x4cbC?t~%y;76o-wVO^**&0ra66s8{QL1EV(Db{{)ZZ!`>zEr z1CUmcq6l@@GYQCVY74FSfAjs*y-e3+^S~F!EH>b@eqr=DX7~1raU%i@gxEe~S=tTMnA#yV-SKb?~9`JqZ@Pzhzm-iQ~Z^1|2D=vTJiOKoVmb_`sVL_kI zCyvhK#rE)ed_P>CKhMM2;Vsvca6>N5*Y!Nmt>Q#2z&hAf2Vi$`ub|# z%2>+-2;F%>W=X(RI2|gD=(Ey}h&_-_Pm*!B)1LE89f7`Ry;$d4I^@Fs8vt6ml_vq@ zQzUtlAcKw?34sCOeUou4?6DKKBIN+Q9;Q#L4me4&l3$FVrR%HYV2}#QE%jZ3MR1#e zu%~f$OL-hVzA8<6KKbL|^_9fix>jtpW5(r$4UpfyH{8c=&u<=@)imzl7pOh+ew^z?FmH7!h)PnoE8Vef_u0HVbqhG8U#?`n5HWpqGQkEpLEn zzX>Yykv3a!o5;Bm{&A__zHQ);)37G|`)eu#Ai_e#jiM#bX{dFKx%wx_nQpVe+fM4H z1baM-L11uu2jRvfhfa`1^d_~Hs><)#!2S*+)}!4QqusD%+K)T?@TOk& z=13MOq$~OGl(1e?T=|lm7vAM@a4=yA_D~2Pr_t>jYYeOI1_0)YXM$DvR5m;eJx1O7 zgK5$%bq74v8kTFzsS>E&%}_cG0D>pTUS1gRTPQ;Do4UQt3Nu9gngu-LkL2}t9Ps9D zL?iV7n&>Vab;X0vxi*LtB zl}Z!hpYW?>tS-@HrZv=0iK?&7>$pB=tz(ToXiRr1*F2+&O%5Ak9}8y?9Jt~MST~lh z&+0#}SQ*Gwo=OeQVb4!aLgJEZVclcAw{;qliZ#BD0_%C1@uYtg9-&|Ubo{JBe6I0F z3u1_iRVGaU*dF-hchisPOj--d^BA$j|I{!YZG;tPv>2GqepT}g1Bs%<)u=JFhjH?AY?ToZP%c!LS@2E z9hLix{0yn*6aSPDl?-bt9$Ed+I6spUP(um$4e5pQJQogz3ty~yHBk?h>D!Cs2vS6U z*ZdYRzpb>kjC$coQWiw!hbSv)x}mcH59k?8qc#v;HzjG2EQGGlUI0Ut!w}EeG{{*) z#_?uC{)Pf?6h8-omZT-vuDA)RkvG^aN6_qT1>Y7!mo~&On-c?N`%){A(h#eug_X_J z<-kP)EfBDQvRxi$$TT!GM7Ub(eul6-_#C>{uCQf3tYY-pxY$E4AtPF zk`Z8k5pp1V;{t?NROR{xkF4H+K_ZdyR_!?+#hbHme@}2YTESL9X+c>hP>~r7QThA= zy)L{s4jAv+X-ty_G4B$GqX{S9xzmZ4@7Ci2PSQCl$wt=x$+&Ri(O+)9n><6k7_^ za9iD9&44+zcu<}2sq2vzEjbhleB8G4XE_|}q|-%8Q&m9kiNVQiK%3{e5|*gr+L2MP z2aDs3_b1f*m^iORbkoC4nSdkmA+%;<4BX?by($~8u29dss?&Ff2riF7|C?NwkN zxfgPwKM|m5apXDj7#W*9O{|AS+38Gt+JE&x&xptQH1@A_VGB zs+{^b#y+67Z$IiF?!PoaNZKIWTR7HjQ?EaQC~MbvE@gUmcS#IiML#4k?&b)tw3phH z*PKxUOYmzj1PI&eK~c4K+ixa%6^l^I2F{xEM7BF$Mpnnazb`uHC4&}9s8t%Vtuie( z$*xxCrFl0Qcs?TzUm_{Khmb!vqUQQG~r%TzP?cO}LwAZMmTlkW5GbV?QR=A?yOuM49g33(JHt zPG^+Hp7io24@iIL+h66Q5F)jI-3LL6)o3#`QJA-^_0jQ9Hq$X5bPk;Q@kS}jK-fhjDkG7@=s^`qvXOlL14#Q?-rCU7~A zS472nSBn#nQoKf6w8r@Ai*P)?P3`ktOPt2#vic@E>4r(8Qi(f#p9PN)=eQiEGx^o5 zp&L(p3D&knI^w;+unCDC%4h#2p$IkfHK_?X1mg-3cF{(Hx^%3PCcKzVSeWsp{VfZV z*j&PCpkqZnjC7y>Q}|(nkVr3dp@GggxOFA2edzP8DCT>`QJd;y-ac5PO+~z!Z?*Bm zF=q#curm_nBG(F&yYSY|-9h}r6E&QWmy&Jbu4nDHMSGL?ssH-is0ad|)`HcuNhQgzrI*mw(uG~}#3 z1z$0b3t6BRRCJhuudIWjPrzTFeUheYyXBb?3M+RzwY8ta#3|(8Y=)m1@8Svk|lViqQbYzoN3(UJ?BRH5i zpLn~Z<9U$XDbC67etme4dOWz=WvR|Bk>Pb`8kZz`S2*>gvCA|2^c_H8~!@ z>}vWwZ1Ky#{nqE;-?}e--%?xyN0Pfrq=z&OErc^NGcfw!(287k?0$Cu zg-%=aHar;yGZu7rig>KM5S3I`&3kDq6VMO~Lz3SUXNFH;UyEl9KiS2t+z-A6|Qbt{CFA_p8AtxWVoaEgJ@fw^0fWNG>DnKKb=}fdm~`| z>!JU~L8L4_nwF<`;UqmU%|4Hx|GV~0-_Z9rP3OsPwSDtt|HAE!Io@=S*YD?4Q@^Jo z)8fl|Cs5}ytS(o_!(^3LS%m7LdX(6i#AK1`CL=kHiV5aNcMVfc#ZhV{Sn*O2mah1@MFx zJs^V}$_=!1kzv@-)USW%eCK~SpqOYXJceS4*v;Q&B=iNX?>E5?m5`>dZtCCBzfJM$ zC3bCs(sL9svECPGEHg30VNcM;^s%GYfKt{)Tbj;U#X7Quqd{^NYDP-f0_VFry%5@J zCwWbfrFvl#C@DxvG(O)$$v{8R`Y$poL0$3m0xkbN^Ud^|VlXg7Io+>m^ZF}zxO@fMcUh5D2zF?`0>}@{ ztXA^cKAY{sVkUS?HZ|3Vuwg^>tTZ21TWfK5aMQ%v?Z{Fc${Dz<-ugysu{ye%4Q;%D zsGL61Q8xZ|z+}q)F+vz#4qpn0JwP#}xI=nIbHv3VnnZ4#S#fnzi0*D)K>h2;;p>?J4`@=l%KoY+hA{hEX`%!zzG+%Q{Prx62X-ged50VP% z5=T|10O@-o8hiAfZM8lc3>J%clMm?CIV`cs@fM{~iY8dpo*?xZMp2<4vlQ55S z>rnQ%RZ(U$!rM@l6px7FPuLylKak+`9BIAZ-(%}?MwC_3&f0?4Lr?@lrCT8rY{6$f zs$I8Gf8SPTmOl*CQ5Cp2p7qMPDWRhLvQ2VnDy_ji{X_`sBFH@8HQ5A6TJ1RALb4K` z1O0_K7-s*J#SPI8g~|CHG4@4*ft@@>VAvOQS>S12mQbApdqw{4 z*A&$bu~#F5930a5;_qaP%*9fMm*(zfUb=}d+?RcFr~6RtcClzDPA%$E`dqBb$`qDx z_$reI=KD&6mr>fIx*9EsDgs67e0tjFN3;!@n}YUkpG7qmmekCZI_-m)F>ApU&`ji! z8Fx^Xq%u<#g6r*IitZ%lw>OPcw$2Vo3c$&qScDP^y(&nH#q5eZeF(T^OD&|jr{ev5 zCSPipWyS(w(#dg-r-Hm)+mF?W+y6MdOYKtc(+9ordoQgnIl(e6XpPOVaH)vnjar^b zoxNUj$uuR3>nTJ2Wo?ppVNuI)W2!^AVpf@41vkYPZqcJ#rBS^tn%Dk!Rf|$u9_T^E zoD4&nzH`gW$AE08K zGEEPQ2@?6+`#D-#vom*V3SmhTU-kS3zFu5WDN29c{pFW+)3Nil%ctjozzgNH8!~_U zmsWts;u)Ky44nxcpVi}Ch6rzVk%*Als~~Z<)Ykl9*6>p*r^xg&bQQU4RX}q$I8?rp z_D1}>cWRhX+*VHkL1z_&wb-%$#nFr%aXYSmQCIWLi8bpLmFRGH6>6V}jfF{%WkO=Z zas8JEk$s;L3eNsZq2qU}^zc`3audFH!e~@>K1gh%B2oCYT%Y;EZ>AYJ=G$A(B=szd=W+uWxcM;S0J~*}Vrt1<+ zdq`XS=in+j(aH#>FGd~H6x%2Wu+8f6LP=MFxIJ~vb)F}(q~}aHeUZ1aTawUVRkwbB zyUM#BbJX+LJt*#^Fl$h;Y^m{A@^Gl6V*TnyP;TSi4*f{od=B}ijRTj5rq-B_SY1{s7%iE z=qu4hx&8r7v?Z;mp;e%8RD8hX_%A~Gv$A~>a8DEn{8$L+yk1Bm|Nlyxs|}x)H6~PLW?rbXu7dXgt^!fq7pbiR;;}mMB@d znLf?*iWV<+Ig3lGos`aA<05Y-HLvY+FBCukRIXit?-%S1;rEWud*2w4;(3Bi(j>k! zCxG7qZ#t&FsipV$lLk~0^Ydm7%k>TZTY_ciaGnSI9dVQ~8W{1mZVhC~Mj^g3q2q`( zF%*o}%flnRj};UbptgaXje6FHWdZ zyFTw==jE~dP`*NHM{Mc9I6saBMqk1gI=9IL(@)U#iOwqre)S4nXRW43pfqFVZdU9g z=K$O`@3+Y(PC8iAvUkl4wAB5T#wO;EVGwAzWx?IbzGTnYXG~EGc|b!VE32h@=Z$w? z#WM~Al^s*il8_17X2{K->+bo!FBtrf3xCSEijp9LUSF#J(}}iD9S=05fwb*UJEQ3| z$i3eZz^8n57~#51el&^HHEQCx_Mku-V?U%qqV+q~FY+w$3ni&+)>!P(ocX!0MwD9D zgZyvcKSBnY*HE8FL^3(>3X;pI8iOPWqulTM_-kFJjeiRr_2pl-0;ny{7* z;ewYjwZq-ssjfV+iB}?Ue(KU<^Bqh$g|u@4ktaRLY1(q%Smnr>qF7? zUHCS1qfu>c_6IlI4Ofu-Q~|P4Hrqu=Ypdu_o9L27B6}tL?Wanwv56tOcvF$A^Ixsd ztQ9d24g2oT1M$TQc~Wk{K}WHle=z|468T&U@VoaCCIIt|Mtj8d%9MWZkUhGpV%($hQw}77zgjCMBdC{A{cs++0m0 zPm9EdaiNG&0+!JE0zDi`x+HZzN#ZKVExTDO=DSOBf#q{C3!;m1PVcCqvIVJT5`VOP zTjgYA+;CVN8~Ot3B=Lqz%+19eBSwx11JJ;xJvpImM{MI>)*YYK19-#)^zpksFLfdy zBi2OpYxZZq=$7yLnCb~kyUbTi9RtHpKu3RKM_egFZ}`Sis#tpovcb}JR>p5dZ^4Cp z%MDusR7|^xYp)@Uc(`fz)Vjqr&LQ+<8nHWJejL6oCBBU3YtLYL|3o>c z$a%FSTiMZyEF5JT>fVA1*LybEA#TJRx|f>}vm>w0-h8{5wYz4*vN8E0*X&0)(Aw2V^UFi0DggHxR@+!Ng1Btb%05WG>}{&B@(%F3}a`t)<%`xTBS->H2%QUA;eM);1T^IR0O}W$T%yO(7ZZN7!Fm(9yjh zz?tN^kC1o}e#Cf=t1_Z~Zy^_NEw;5)33bN5j*o>4EtU_r8O8mm@o(FnCDz(H0 z(Jk__4ekfLZ;}qk4<*-`!|T5N<|ULT3bV2ouZpRgPA;p&t$1+>6 zW>5__gp>)*%Q;?GGPeoIAQHntG)Awx6y~UtuqPu7Gv>w%b0+R$srC~jD(ep#kYw@CH&c#PSOj_wkxKG%|=!oYM zcxhF6&hXg0$x-L2&kvvUqa#d4Lu)&VgMJ8y_K5>9Axp=P1m8|P{@>e-xv5kuK@J68oDSWK+ii0txTH>BqJ~O9sJV$&DEKrxPpsn_Cqu% z5W2MlyKwZOQ26R8w^dodEUQ=V3~Op=o^ZY0FKn*GzIYVW%w#5@UwH!3QMU$*7zR?t zF=>tg+Q|XiA(bWybyBdL(M{mhJt|{ks%2eYekD_^AZ7P}o-0t8An1kW31dc*mzI5{ zaAi%-#r1G*uJVQ2@IZoN;}uunWXL#xW??=LQb`hBZuoRN_4=B}CdKGati)s2y>GOk3VF>qSk#7-tn!8IH!J^`jLu=QfLzOcwiOG7WBGE)MCgwjjSeai0X65~F>q+Lz zrM{tmUI$bI-ow9|D$Jc!4?$=yr6y$3dOh^%NH`ktsNdp^T<7R`^IN(o5x{ZE{E#vA zubl+fn0@_7j~h;!4`3|M;6?_t>cV0aW6N&6r5d0%PG1eOW>hy>4~*4JSP($H;kFOB zi;z(IQ^S%LLN8p=YW&RXho#n$aJ+Ku6F+e5fW{_eu)`?_7!C$XtmKE=3RAl6mGA@3R0WyqXl zNGNNUQ)h5JeXx!;-_i@@OIRF|?RtILP;Cd_3Za>10VfXmIQ-OccBa>0bpL!;K~g^` z^L!l4fnsF}9$nGpT?fkA5DusI04_&CaR0?rQC^{vBD6fqh)1Iz@_R^<*eh9>c;>Fp z^4xLPO(C=Dkxi>2*B?wRRS2SzN%W0rK1p0?nN*1W?5gxmH%?aS$VP)|&QX*KVpOG5 zv?Rr9F93&57!6DQN4YtQ?&3O%-~u60qnqyBMHSJtP*@xLtm^>N;JSKO_^33?BtaC+ z$?NlQdH(WnFvV}4ZN=Nj$1>jq#!pF{OYo0oY%_LNe4ZjIk*~pe*SHXDAa(wc|DZj~17$|taZt=M) z@mI+Bw+t2ZarCbA;ygeAB&>Cu@ft5S@zZ1jZRd9D5L zH2msEJfWH?0DPmBN0(!5V~j1d5K3HCWg%gL1}``>hRzZ(gAaVPe9@!OXC8oUkDDav zm~gA`qO+|0_%IgEh%O-ivhwWH|L^?R6Q4Bch2#pc?P4$*pvLOCvF1H9dIH2yk)lM2g)IN#s2_ZEdWHc$DOxjU8UM0%cS7Q}?!vj}NS7zo&VBlDuV+;q zg{w!r6gDAgo;l`LF)mH*7DwK(?85obW>w>EW#gz<9`4fqG`R!_@!(cwh;sDwyIIN% z?Ey2iBwibS#X!DH0-6Sm4dLSZ+p}Ar&rc!c8wFFWfNbomjMA0fiimC6mFoT-R3bz3 zCj%O%+2{`8hLWjHThL9raA+8`5%54=bdR-mo@uFdJSFD#W1uT4EMsJKrTmRa_7}OT zd|S96uss{15Y*ZfWN_=*u6;BfjBfclE_)xBP`aUm}fO=6FQ z9s46b9mjo92kAX@2#ne1g1bcE>xWC7SjpB|)hRJ)lXUYccpwdTEW>~38*qC&Ul(D#aE!}8u$ zG#@cFCTfxR(8_k^4y#^o4K8odDDDFKYQP!W@ybM*NH{d+Lr&Hr6L-)vewOm^>IkQhaI z!z7oA17G->z2b*R7HPs0%|`3E|3NDII{A(ik$WYwuyS!b`Qw;0RU^4)Xf`F6y1|Y@ zrhUkKu@D1ErK&Mml67jH|5B16Xs5RQ_AduBZME1YYb^dxbhJ}s`t@)ST`ga+RV!Pu zi#bKnlagBJMA38hqoew6vE<0-oAyFwter-o0VAd78xsxTg<6o|>*8?M_kT1p|H}w( z#t-^r5dQaHT=f5^k#RP5vUG5vv#~cc`F{YY7G7)jEw;wIB>g~>rh;wbiPR((OC<_d zJoB|KPY+{v?^|1MS4yNrOy%NK1R5*$-@mi4xugT(i^thFqrl+I!2<^1n6UkK`qgPy zTM&Cb&RM=gesYWZ#3!1gjhfiCPk;}{{zf012LPDQEr#N3;V^;+7qExTBl(0=>a=F> zv5nqv6OW7$KlBq_@;m1d!4T~kkoIG8Q%qjNzi0*j6X@2@gD~ponoY*pRT%_?vcFr8 z*da;Zcv4E<*?|pL>c!V_`S~TPAIyrzib$B6FmNSd&0Z_(- z_*^EL07E`Rc~)_rA%87o?>Re&Svdsj2n4DAx9gal=Y>Qh<-`v_9GHuWLx0{=*lhYIWOCHoCy>D|Xj@7t|P*AjmhHX#3o2RSyN@g(MvGCsyK4qm& zc8~AN?ca-yWBXrkKf@4y`9-W|-EaKbhdboNz)V!4nK($U?lP7$=rC&}GG&9H9p=S- zlo8HUXcZJ~wo(^xExsq?Ws~Lk3pGp5LWrBG538JFKkT5^p=PNiM#N6YO+R5<1+XS0 z?#RZF53*V3T%`D9c{!Is!Gml(bJXNxCW#=yfNj(U(@((e~Z zMW%lS!#&YvLz&_wB-D@~n({?nhOo^z*c+{+3xiSK+Kk;(Fvz}s{w55U|o#cNo`QCyJkl#D_4RR@Q=nbPpaAAYnB$ABa z`~iWguX#ZjJWY&9B*#{XpgJ*&546LUZY-Z}E*8stFY2@ze)~;2N#Ibj$#M~uNHgGM z^sSomCTT0MxbCGc=4}6Iu+>|4gdml&V0z3$IpFTI)spk~_}|?07@Q!#CVT2ZC0r&w z8wc17JWa4j^&iflV1jE3ejZq0gzT@x4e*xzxb5Qw$bFQO5EAe6 z@<%^0iU*g7E#88a?@%{s&}-uPj^9eHf%kB6;S$7-9Sv0~c*s~)C^Sx% zLtBaBi)9d(g^HH!3}2r2GgK$GhsmR+Ax<)V{>M|Qjhju@S?8=o`b~wog+e+OzPI{i zJ|idF%0g$mFERUtT>pO6g4k{VSsL2*u=GymNfC#~Z=N)9ieAP zXPZW@Nd`aU>7M-%J1?xI$ab>v`M7v24~E3_%&n*GzrOl2c+QyZGlYW zFU5s}|18r={qaKHyPh~w0s&RkZuY6 zwf3Jyy>6MUnMSQYrtOfaMTV&(z* zzeMDsBPB>J+{=(-*226==QKE@A)H!DjgoD&_JR&CpU?WBYKjJivsiVkXlN~HSa&6- z?Pb;Pz%NJ0$PISt;5O^LYWl1kfggn3XVB6+1eUOZ{#N8Fk8B55`Yuq`tjhQS0wl1Mzw_Uy0BN* ztmuH_o@B%TpBFUBA5o|+f=Tf30Xzr~3zZthfnU)I^8DKxj3KPY3YXMLln3K5+k5p90 z`Czu7jpCfoY1os`to*TtxfUGc(Pq{hnuXq20Ez@iTH;}>k5ysMMmDJyn%ij3Yp!fwdT3_M4|8q zWNF|R@&YuS%T>zmpcMW7Rr1k;YyF+ZN)01OarP&YnT%WRKHoP?Mg7CM zVA1`lWT%s@?o<_H$R)HN0G}IuAmvBOiWegF&}L^ENrS>Yd?-Aw7q5;>Q$>WEeQm^O zps72Q7iwW(!-EBXvDKf)E+MaAwdaEUAkM9WYP_`Me!(!h+2+q*F=e`U?tjl0PM9N) z*EVm>^KK!5IhMR|R5RR2gZ)4B9bNVtKh_Hq2;w6bz>xHvX`fS2_NNcIUKkBQy#KB; z%TTzLBJVi)(^(tXp1-f!p}4R<{Ad-V8oagBD~Vxf|d+q^Mzw}?tOY~qmGZ42C=1eJL zt4&Sg6mV*>O%^IuR_O#dISLGNxu|~z+7&BpHNR{ff;eON}d(!R04BMkYJA5LDxc3Vzd)S z&P?})%jM*xAoKbtxycCj$Sv$rh18QerA&g?{BN3nTd{CPcnX+Y1Rkhp z*7UO&+k2ioUwyllQQepwc$o4OyM{463ut-SDs!c^cdHzG2-P2xSKS#}R zFpvCzPY5nZI}mX7Y@eW^iT+t*y?bb1rAFim@gFO^0e&f$YvI;7H0@SsjH&DqM(K6f zV)!LtjPbouu&toi>+ZmCp#q4F`lU8DP8@fGhQ>? zBHyKnCnacs-ADLA5R(L!-4RXOsnuj&vxlkvFfxU6PIrv{a?2-8xMVqFdqQZvr-|7P z(-Yqs&%)Sf`(mb$$+M<1_5wwMg#^PBU3t`FCLDMKAyeSgE80@3LX*Ta_`cGC>*Bda zb3^OAHUkonYnXnw4N8PxJqn&-)j-gzF8RXh(Bw>}kws&$6f+^ab$X!uv#Mv z$Sj-B2PgNUys@0JM-MYYg#yw9sQ>d2+tN*c4b?Ik0%4tCOr@X5H`AIJj2riD6~oEbElNco)TH5v+;R2@A$ zSa_^7Qo^dhs*!z=FkB1hfy!AOE9%EK-?c9=#^SWxvQ^c%l5)OjhipcPrrq%w9#0%b zob}|5E?*v$l5fvRvqn48`HEKzC?n#l$K#SzZJ zxz(=%CEuIw&2xPiVCVQcq!r@XP%h;#j$)p^4_}QYO_C3VkEaImlt$tu@oJ4*@M6e;DlJBJI?SX7o3k zxL2%#Wu^JM2!eKR7SplV0tNnQQqwhSjG3RkD1*g{>ZSQlK+~o}{x|tEcEZ8S7Zo%) zk?!j7xH7~KF?ek#kr(bBd?n4ij`BrZJl}y%>ZIOg*d%XGf>NdD=4NbK;u+f%iWXe! z+XBn#il^+C1IMp(MR^c@ZKBgb%w5Y{peFme>-ou09NQ=*jry$_1EvW|R-pU)c$?f9 zo)n-nqa&yZQugO>!isSZ9QZ#hT!!pTr?LMa?{gQ1aSi3gP;4C5S3`jU$67R+ea2~> zW`LeVXDNvFEShv=OCk%g8-YH{rwL{2fG^6R_7o@ikUd>fc#q6Ub0xlx8nli%hY50# z{Ee%pGK%HiLSJWLdxgGwc@{X6*@^()cWtKPU%5qaVzSnLpCa$(&&R}iUS3R(vW8~k zjY5GM9JK*P3pOx;;=TfLS8F)_3tkTON^T{oJDDrr!pFs?8s8hv5{lGYrj&S`S;4Yl zR;A2szOUQA-u4tQ*DSKQcJe8Q1^^>HYeu*wdFo<*Fb~0Y*7wczWtv$3UbAi0s<xgbSzuyGRhOzLR1SQ$*ZAVhU*-+h+pY2 z`s4A;yNdTcMpZh%KL3E_X@aAQegb&98zObb_uSOYPI9LwQ_?u!0k&W!c@sup)a?7< zGNDBDi=<^;vuLq}HTW&m&I_p-osHAB`_$v`iqM?OUksu*x~;8(a9ij6rXJbe77)Tp ztXEZ7io0XBF4ab`p?Yfbz-j)gwg+b!3DxPfgSaf?e@N3Rr*j{=bYs$RZ#(fc-xWAOSt0cW!iM@TJd-K2^ur?NU{2xvjrg3-Ivyczm`eibcDUG!v3pi*J&gsWidPBLJ0Xr8R*y zVao#o4AGZX6qEB@t2Ndi7LNe7?JTlf&Osp{g7hK?vwM?0E{V9O0Pz!pEALqGz-u%! z*l!JywQ06d$HcZUIroOali6qX;Z_5uzFy;s<+rRVZrH;7jwj4XGkqV(zTSRO8#m0u zuCQba<&Ef+O77CQC0bsKooLmHx2=>Ftw>}|g|wdX+{ZTT|J>vRKKhNsTw{fx>}m{M_B znB@Ms)TLqht11-Tr2_bu@pvt!re0~YtVlU~1wXz@H*7=IHxI5Nns|NBs>*2gZ5G&t zhJ~YS`q$&x!T(ay0nwC;1-C^IHC0k?PK{T^5_Oa5u9SP!z@pV#vc^h(uqHcs*HrN; zUj7gjC3elL$4TM3JZ3o_q=bJoYRDS%S8t7QNf4;JKu(RWnr0?BF=UU38snCG?P@UE7Sw_Q+$r_g!86XgyKYFDR*#V) zQbl`zdTNU3_}RG)(=##K35o;P!$Xt=0fmibk@n1rT~cYkQtURC*tPPQ(p>#MOSdA= z)go+6nsI!hFn^AH%Dsf(FU&bGCCM)0+ED6hAn}8Hzzh^A?UPI@Q_#rTANe(iJKO<5 z{10E}v?YoHB+IsK+q-Sswr$(CZQHhO+qP}@J@a;7X1*e8Rb@peHZkKSKm|CDBP=ML z6D8u19@+-HTd{-JH8uM#Z7mt9DQ$uUYg@OxoW==9`kjMTK#*jlfyt~dL7^>Pod`X{ zn1Wl}QQDko?i!~wzDsvzL+2IXq+sS#!W%(6 zMkht!p_0l*p{uIeq@NJ3jiBFc=z~d#bz>ogIeEw9 zn*A*m??^Y!XSvP`l0VGJ5SCfuXS!FD$?5GJ~?RO|!*Y5!X4&&aJrwW+tlejZ#10mCx=?5Y_5{B^brR@K1$pt4dqw~NDDM)lOsXo2EX z*kutbmCcUr;dU^$JKe#6$LB)igm)UJO_p=o=HdHZjc6v64mP)PDEwtL)W?3WoS_^e z+7j+JClXTHoUwIBSs7Q>770n!*&@s(Hlvf2Ee+gW_F1*xB&XSd2LQ0Fi~hXlT9@Q@ zE>y*98Kg&TiyG)&&_xrHO3n~IfMH^j9w3K3tnaZK5`QJUFBe$K0;&n$iELH{<-y~j z$bMfgdH)=uXpwqgDRze4<*})B^V+P#O!4KIXg4e4S_~*G59P#q9*$}Kcm*x2)#)>r zM|e{Pv5pOky;QE`rx}JD6BE0|Y<@a{ZQyNMlGVJ}=>@GqfSbbZuCT7@9GK3?~`_GkISMH@x#_-w}3tWs(KzA7fk4@e)>jS=lWlfddHI>rBu z@sk*UeHx%J_79YP_oP^=`)i~WQy4!hvHUs$FLLnkqrTt%ijSaO5jW`oC?GSe`?n>2 zde3F}?uGx>&7k8@P=Vqea@-_kH1V0!#&pnBbG(0BjoiPPx_^E^QUF9V= zqI5h*Es#yn#P20*EIH*W29Epd%l?gwK7Sd5@0B${i@w1v9v>YgL72P`lQFuynuh9v zcwGLx;GHb%`!=((unyOB@dPR}H~bipMp!&V*>$Fk6G38jl?o|B zr}S=&Ar23pKEc4ygiW)AY6i=g(6#cb4UBVggFElrKQPA{)- zgrLCW%OI#JU3>)`_$BRc$?2HRyjT>x83~{w{hw#&+<61Z!ryP(vQL*Jwf(WQ0~}~h z62uG&qIx$xH=>h)yrQo|yb<4~;E9*`Uu>uRVg7xT|CdZn01AVgu*C2~JeBnbe|Mnh zzQ71W5g&zrO$f*eqoWLL=p3bMP5bRnHDUuLLQ3d3SHH+v&)?x6ye`h)r(s-gMreaX z2TQ+dYIdhJxYIL=r86%y#DlaH5qvT3?j^`0{#Li1z^YGnBF1Q?6Zv+(z!b~SrK z@TgAiW+76SsY2L;JQH|XFU6jlZ;A5U9M}GKV8pv2t?5wO#N-7&2@L`ms_qzWvbfi2 zQ5aH+3T&spnm$Z8`+7nZ$-uL)&y6#`7vqxqJ5G8bT_bFD+`$R~2pYoxj$rvfk}#;| z62rZ~f-6xUee@n>#iZ_St1x^Ouvma(7K}P#y773;;w2+8gPqEQEU1nAYhvn(az*K+ zo_xk+yOwh$RC|`?hF4cWIBKuVa|e)b8`_(j1g)xPeed&yRtuNKcI_vL*RoU*RnH$5 zX9;*uWW7oIlpZMA$^K=Ezm|8a^!mOj$ej#$_V$Tceo=9skgjvq@5;bnE**o?$oqa(v>j zVLN;d#{K(sq32H^5=NQz?lV+KZ%b@@3%4f~5;BpbYs5n*bVy^7B@k|wYtG+q#)5%H zpNtei7XA}mL~j8)JvIctP5v=j;2NaFVC|X9xs?&VJE|O^T}tz`KI#Sy(0a@tju9Ih z$?4=0TE2U$<66bk`woGWxZDhKbQM0AHf1sOfH;swtVuwh@!TFdL+@q!k#g7yT9SLY+&NLsAX4OsKsH~Dg);0;6Sa$61g$WT$ylk;X!9Xb zrCiI|sK^~D)UBccxbc#{MwSY?ADcRD6{={>c1gI;YAuyp**Fp5l|G;{y^%K6ccdzm zNP0JF73+_z5Gand%nw!z^-Y~4Q+f!cllJTkMZ+oemk?6pNz~tfao(Mju4$9WGt_At zJO#h}U3TGqS8DrCZ=;A1(Y11KVmyF`WU;Z_h<$e$k7`a4YGmDo*Wz{=vt%OsYX!7L z0gHxtlAFr9=4=yKL7v~O{NiGGR8m%~ZFY(jNg+6v`6_BNwI@ zV%0b;k0ZvNzK)Vfj(}A+rkIt=7p&jl@oR1R= zbC2}uIn~y9l04o{55L!sjf*{w1}%0j(evQPAVI;&nw5dUOnkY@0VDaG%!AI|qjqt+ zL8U8R(Wl!hTT4@tat!xd>r%syE}j(cOg%xr2J^C<7TlN&8e^VKmsBDnW2u8);i)Gs zCFW}`lB#0LgG92Bq_v?znhwqD>#!#iI3X;XE9srqrxbYjw@t*>fB&D1^nWT3bi15x z18e{Q_5Yz>@&8xUtBuKj0@DA3_4;4cVKwF4>_Uy85-T23WWyq?YG|ZN?c1kv-1mb;B(0XEdqoYQ*#Hz9`PM zD6SBHipodB#058}mpkgz1huA-S+0<|Zf)w=6~?B1TqAU7ko3b)Pn~g0Aq@H<{Mz(YZ5Zczypl2n>o4Ncg~j;db^6RcXWFhiON& z2jw?gGu0s&!n}3j$>VA)Ml8@9NsdUg1`bo8SbL}otCfCMYFpz0W_7S=<8ooset$Gh zE_a2?3!u+~yvnL|W#E9N?OMi0i-?Bqf?~>bZ2-(g48QtPoQLj;OfpSCYLw^&7C7=_ zyeUjWD^pp+Y?KC?596=%cet;eW&Xz13knwS3W*1UjMKUN*}WJ2@e}JFia!kh0cS-+ z2VlkOg~{zE$8)_YzYy{b(>>o}-&6-rg8>)dpVhCNoK)$x9tL0ZuG%0~Z3;dGD3Vq= z`iW`AAZv^TifHft+nD~*9WH3@fw2q+8J_9=Ac(m_cui@2jS|@+;E{f@6%OPvvJ+L< zLf1~tl!-?Ib&=2AH2)T*wOrz$IK4`vb9oQ%?#@nt6Ei?%#$qBE^F4jxgX`;qJ^d#+ z_sK^Q+t{bzYPB8SQC8Ou?*2c_7)p9s7`CsIw0q2^me>h>p#xzU+9p%YTEyFcoBs8V z*svj1inli{@xGxU^NfCubU^G(6GA2xStwWw8hrM7pZ9|AWDQJjd|&;ZvD1QpTe`f1 zp)Ou#$}k@c-u4$SqM@5(eINiz$pa*J4pV+Z&m>mT1g0II$=DXk?K(R^vxyPLE3IY5 z3R)%|WNDY2k@5H_&MK^Kqr`Ac`ppwET4UMLUx#4i6Pak~?#cMNCwcUbl4pN`fRt4d zsQ#6iMSh7jcIWbdYr52FxR8d&@y7Sk+0-Y*9HTNw8jMqGnhb&tDt$PA7%d>^z}qUAf^zgD@N2q)6P~uUi=wWnv8=4mYy*rO;kZJBC|5O)g*D*x2%CtZ zJrUC>C;gilee53LzIX3Y5>pAZ9wB_f zq5}vXIADgQfIz^o!HLh@oiuFYKM|ebL1gVM{XJ0YUWug^i&{9b!)nQ00>L3c00@v< zs(>micpB4t2G+*$jJ@IA(XcDA7@gWA_ec|c619x!z9}jn(*knNqw_>uBN1!!bh>-~ zzKmiUSmge)=>A}UTy2Itvn{&7{wH82tgE6Zw|Ek3X{>&TuoA&beUMaRR7jVp4E;yB zvyEr1Z)<=J?K>fcC3kCeeLtfmFmmvi2eA+PIf18#nPQM9l82dJ;VA4k4-8YG+hBE& zo=l-?&&G}DaVZJ*NeyNkyEh4bSxD zY)p%e+AkWQ#yhJ@RhSR+A4HEG!XOqv6u)|OyArjjBOu`iAby9Q4hGa{IX zZ57#bh+mbb3&!sJ{A6BPbH~Q>SD7njm%UK=FDoZl7!+`1opv){)6;6L>gjcd5n-<^ zS5Ytr=I%z}n&~`5a3P5*JLo7jYK=c$_82_C679CcP^>n5a*%9ag*KvBmEKup?WH-m z338}>I#_JZd^VZJt@$q5JZd5pxL3`9Tmz1&Tv}fbxOl9`YJn~P38Ug`P^ozJR?Ps!1{fJ5)(j3xS}Y8 zuTLu{C~?;yBM>Md(#S+p|#GIH07l^!Y8>7Mj^z_nnNb$h_ z)*g62Ec0(9PyX~{2X+($U+1P{5XMF9Z23lFpzTV%M^{_ulJ+cIr-*Ptl12F z60nyc%m7_t{5nfiT69SnB2fa%<9TP?p(>^i*xuF%?MK&f zd+N)emWCtReKD6n%jG=)0CDtX{rK^zzm!tZ5cn75>IV9$K z$cTxjpz(83=CCpu4oJ2(Qw0nj+!$SWGMvPq5U=#ybR(O`#He_Dsbf9nDA-Zywm3~O zFv68+l~vBHGhl_ra(ymMp=f*N17uq)8`^QxA|YUq9lqN4Jr2Nw_h$$^;^8{+1~sJA zeMi#PT53T=5`+}gPcFK~)P8epsDKvDSc#aY0l2tuK7iXz-DE={<@&wU;+1PYt`l%9 z6P4;*wKdDNHp>f?+u{qnz_C}C8fgGbmFy8tIY?{wwE*%`IJk)V@lCZ`&*sOCn(qu% zlP!&F<4l#dOog}BEMWWDcJV%pc)=8f6B5bV{UUbqaafg#A#bZx^$dezbl~nxaG?AA z;4JNwIKvop1D(~_VG8c=fy4|WZ%TXSobGhdA>wfk!@yHRoe=pw(Mv?0Kq$y7E7Y9a zfHe1sbuc2r@@@c}+V zuGp8@ME97ZOE@Iq;+0Rs&2b>G_jYRK12ueTsi4t=3lCNlk;9jZVU#W3K@$Kcz2khh zne`lSMy*jS5T-&E#bYan44v)5)zLxT{mA*~dRn2Fv>!oCO>uiF9Jz#65w5%B#0im& zj)O)~h4R^6pMpfLh>7kSu-b>OX@uCAP$oB^LhQ^Dt*;|%Q%+ILpNlyF|H@F?Bv z_!}$2y8DfsHVYyipjOeq#Dr=o+m?tr=JA?{Hmv({G$p6oIXKkdVjq^F^w1txOhq<~ zA_6!hd58b7Bz5wsRbVh@^jKrg^)zw~&XF){kMCPyYj6-1e;<}4y!F3meTT!E6en;u~fVAbMDeU+gw*!j1o7nEOnD9M(e>+7bk0UESm+PQ_LvLQ5~=xYJTq>~V#30vO7m+Y1fAF<8Mk*-|J* zfKj*JE<{l|tG&d)`R4elFXM`;9L*UILVo_)Oj(TqOK$J z^BvQ4l_1X=C>2uAA1kn+G0{dV9eO6_T$Ya>yi=5{rhsNxwi6nGX`C>^ZBYG+wc@(+ zUHBpa)r~3|JGZyqx#%CsIMxh&nY2$TyZKwh`PQYE`3rG$WqY~5W6xW3eLq`oetEu5 zuQwZ3!vC}o>@f!e2S?!D`Rvb*fn4224v|`QFCyKE;68G<$RL;jwSH4C5{lezGrUR> zIa(NM6Y$Fj8=`7phW(RPJS)mqlH6F;h*756My+K>d#zh+ZN++&zO>c+`3*)}9g2s^g2F^J!6%C-vkWX=d3Q4Yskwq)=;V!I}Y!<;$}a49@K zA8>6{T)(Ql>EGeFAT2kjcS+5<9+QlV1-vS|HA_&<=4cUVLXAPtQGNRaku{|ChfcL=uz=^J2dYe$x>InOI-S_Qp*(e0XnX}v zq<*M`?rtaY$k}t5Ea>W3)4tW`@P%~|@k-k6hs1FX`!}&g)uy7U&HC=oXxGjUX8@>d8{g3DWv`DQ2Ccl>7Eq`xu6KU7{FCRq>e3XB{ zZft?6Jv)IT5_K?wZy3Y;?H8%$k997!;*KP_!PSF~jRgxo?VNf@YMD{z3Pva_xAsc) z4lkeQ;reJ)&sxX;#X>zcF!}(CW*e>sUpP*~y!$nMi6L~zJFY8870-{}YI)@5 z4KobW_P{B5)xC=_u5VOn8+rF27_iE1NdVzL%43(dFs5^|AQKut*eJ4%M)DGR0_(pi zsBn6PKHq)#Q`r8Yk^@VWodCo!0;5ZsTac7!g;@jSEcR@%)PI8~-IAFbK$K>wgs3zV zWT3&3Y;|Q;>GkFql0)S7SfF$Axx(f9OW;udEu)vN&g~?lcM>65G}l#Ymk*ew3{>dX z-3Xvv!tIJ4q_W2Mhifn;{{O@sHy^0jJ?tej~L;7{>!f+ zw7&>+`P?AH#9p>PVAF2KLZV;7E|zaEs0<*T2@*fW5-gJ=@o&oAZOx>WUJ9|9JgAlw zs2J`|zDfvfLlCeZ*Nh^gf20s-j@NZ2Oazex#sdRU^lJ$Qe)2k=(K~66xQY>1DJ1&DX`oe4RZPE z@v#Gq0GC)8D$r=?YE|piENQZ$)t;aJxYJ*TsQBX&Y8$=z7E_RwO#(m50hCTBg=lnu z6f$AWZb7iuZ)Llg%)Sj8Fp8*(f@q06dM%BEEmhRZ{uS90+t>U37($C6;sfm5IGv@1 zs>J?-KrgP^k7x?Ex{gt&8WB}A-fR+aAcj3zjSMkLmV-c});ue0Y)7vGzl*L`2GPIa>s=2EQFSh8l=y<( zu?G;V{H+5$csWxqn~~>f!~@V#CO0!;{_{J!mWkUIqu^3lydBJ}*NUrF?h_buRvvi| zLbKi3>S)v}etM_HZMM_A|LY#2eZXroqoPH$r~-_8^x1H&->%^j;=5J5R@~6ojK4@wk-+rSDAVk z#pzApot<6wxy@rE*$M$Dlk7>J_)HfeT%XNED3qQlk$Owq8i)0iQsB~QFr2Mmxc``|*@0`dD<(;Tmm5^Y7v?0b1kJXX*E{}gkTX!di+1<{~=<3{Pg@X0yR828;= z(FTwxUT}Ka1`m1j)?gca)S}5sBdTc~sjMf5=HsBen;LYLx6%F}ijBJEe4SMs=^L?! z`gy>n7iqnG(K`tV0KWzJ%$V_cXFm1mvP7MM6tmcQgf4l3$H}(B1gg9kPZKEZa7k5S z7`anl*zcoCUG;3|WQK@nRR{&S8Lg-9KP|fNMp3sIYzjqese1w``m^1s&_Ua#_~h6k zJ5sJ=0}tAruBtUvx8a-Nb+-{&qwSclUNco!`6UQ$8{_{8-nkVF5}ClOe(ZQBxNb_% zB!q8Y%Q2Y#t7)Z+g5Lx_CNn~JRb21-p$`HK_nS!&z~v#twidwM%n<^*?0s7q<9s%u ztj7JVK2B}9)8{cXs7T2L%>YV}ITsr#3p$G-L&jmXZn zZINxW#^6`V=}|&$EwoXE`V4|xSJV{48>POPt;Z@w$w4Qc6kJ{QuQM=Aht>|S4%VfXDAX8LO zVY=mPb#(-pZM(fZlN>=ZNgKRu0TEb`>A9@+{ zbvnH>HCAgfiOUg^D9=#B+3O#0r3G0p4#~%WvJ<-@mLf(Lekrk<0q&K7PL7CNf}TiZ z5icYgP#iMg;UrZ}WF%znj16sgk|JxBM(mVEWLbpXD%Grj5cIR~nX_cD%UnZn{vw-s zJN;z7>sm}#BsnKUs!&!l-p3C!+8ruDlp)9V7|~f9mNG>rkYb2tTAduLID~PH_+~l+ zxOlW^h!w-(5S~fdSD~zYz3217%ReYUEMhMnZV-(#wUbHmw=N>WvN@akx2IF~h&`yB zVik3|BDI>{($DirdxOS0sHCYB0WSgJMi!UBA!h0%6|D+1o^30?$^+SSujH`@`yU$e zi;&|LJa`u)>7H1@+LB!uDjBm;NElO6z)@$kJi$AC!lgqCipNHpJ=H zWF<41AY}uk^*-o35|J$7;I{@BwnSeSPW(es{r5{T$|*mQX|S$G+J?^G>uB1x?t{Cn zspyKw`Rt89AQigPAQ1G=NnzTHnlT|1G~=CG3y`#qgMfOb!CElf($N=C(`u89|DjY} z5fQpOff9MVDseO(!K0mW691foA8fFpg|;>Q#(i$~?>*G>gE{oNY~}js+(B%~;H*5a zvj}U`8ve_Iy}D+rI2HLF{Alkfa4BjA%$}vGQ@{b5RC$1zPnFy>%ggR0SRi%WSZr%g4i)EkkV63 zah(&q-Dz6=es+aHFMQtE@{^-d`6hhC4}%Y>VI6vEpPp6AVr9KvS>Hr;M9^~QzZzX+ zye!zuKF?!)P9E72r>jyNOPF183S<}xO0w)b@EoRds1w`=W2u6icvD4#E@#e{o+LS@*1uF_a}YgW=L&- z<*KYdq5Q++XWH(@brtJ=*aS9>c4|8#D8<2^J#(0>xyt=K<=wl>!fVg(wsh@lnE)VRMh zj5;m!{t_#FW0EBvl7$ZFx*cumM=EAeX&2$~s`C88U{#A)Z}00djUIgBG!NeP&J!P60_t!A3Fh9297b?1xc7x)A*2_1R=5uq=(g@HrGbo> z{^9y`cW_wqb}G+77RdXJT-*!))14!-j;=XIHiJvO{7Z z@50cWa(!-3Ne3iXS0P)Sv>#yhTAbAcXscuRNg}VtQ4H=1$%38Y5}dn8gnF?M`e}x( zBC=WsxUT}6*dS5=ZVoqDo-F2dccdGKs0qB4(fmu??RekHfd%Hcj&D%P3!f1x*(DSg zmi{R~RCB|!!eyI*M1S2JiZApXbiQ*l9NK+Ry3(iW44T171rV5(2g*eon)H*y{{X+k zZl2IlGiJ)vfVQhcR9Y$NWD+5p3asJ~f|0E87-2T^p6J_p!Y(e|^o_7(ubC!EKq-hK zcvK>C<7e~I*^2uj?=;+d&c%1JGeGtUqR+EgmDHg2# z4QA7GMo`dQ%XzJctCWzQJjGFmzb!qCL`(hapzWoZTF+9E!i^-fd8+%#T#SoKcy6A@81=k8`>Z&J9{^{0$Ab%VqC+=5@A_98)G$- z@R>0jd<5?)x!0fVeIAby2*f1HWq%pwOGKF#?4JO^MmzoVAA=phBJ{KF!&54GkI zuQLt{A)iUPAj2Cd4GsZCR&qhozGm|JQo)@mhC?q>q4Y=~ppy5|Hs6cAR^5Z~T%@Ow z1hF9%QAICKnWF83`s{f$M>Ku?z8@ay_F;f#g4ls~lHdR-gxu*^`9(PAW5B8OW>V=t z*P$T7<^#1$rlNTzi#cvluC$DdWp?GI0o8Z{WJ>2Pe&zc|XhOK13MBUC`V;e;BW;33 zu0}{IlZfo*f7JerI8xAch}Z9@Ub&R%Sw-fS3%R$apev+s7Wl?jWc7HAbjyq`pw;g} z31en+osgr+*8JpO2s7S5uF?;s_z_bUlYcK1ISGF{=dk127XNwXPChwyXrQ*V{sHqG z_nSet81)u#tQVP|?w94WeaQ)d&1$P9U2GH&>^|Jd^?Bh*Wda-e^F8(G^TQThg;1@jtH5eO(#@5 z8x4nem5JA6WhP{z6XYleaQKFey7?NJ(bL6v=zdDVNj74#b8lL>d=2R- zETHYk4m3}zW&jJwQ(TQPDHkCA3fy7{a$(QoKDbPzFRZXDlWCyXR;n0#cwZU@gH3y%!}@+=yv=XYKPDOQl-b2tq+gKdw?$DM&4f0=Vi9vn{?i; zq8NbU9Ly+cA%xNsYNUgoB6VyVTv~LFdvtZXj(L?&xfVYA0?Q|Y04MIqS12f_F)}CO z=x5e;dHcqLkWZ6z)|3C_h~m@O3n%~)lC?K;`tJ8OPz%)EbqTyZOHAu7=#z(obc>)S z$IH$hK0maYDjJ579)=q8(OU^W!N;RZx4JMe0J+GE9wXp?w~b2DmQhu_+H-p|t4 za-R9RM!*;ev9GN@4{mjc8|DK#N8nQ#Y%2U+8mO3=(iF+#ZomAsfhtTU!cCe8J{E5= z6Y{!~Ty^OOi#*{96G3)gRkVzLh_u0{8c>ZZv>rceYfwKqcehBqn zk1u*wD@uQ0|9SuncK{I%D7ggxcF{htb$vykdzAfWgRI;6%-B^2^n$1P!)497!Abpb z93PnASC0>OM!HTfz;!_pDP5B4y*{7;#eZJWz~ za?X1v1t$T1udKAJO=VlKOR}XRG7U#GN>3zpstXzL50=PDAeTvbD4E3uFH_i4?2x1y(6ReO7tuDAX)DhqAox z0~GJ9;PhfXawaQ)vRd!+m6I5qP#rI=ef2*-y}yvJNQ~c@*JYG)kMU9~Vjvn>g6n-X^s5EU?6^bJhv| zwVlp%z31Cr&(|D~|B?C*p<@&IC6)y>BHqp^;UY@R;_l<(ipFAd%Nvu8?BnGlty?MD zEIe%C8PVYL=1Q^B{K9pgIIP_KKfaA zx8gN6?A=EuN!Oj=7|wBXanB{Nnt6D6JD zU2|bqdKY!Aqpy@jrzl=sb!X6k&0bd`%-qOwXHtyVUKi$>o9Q))Q7vK$jsd??OuNUx0Tdlmo z2I1n#cOPN;@nT=mX54{g%+Wifz_#61%CGkrZ|eY&ThA*1j*+_IXR2Z}H|c9-);={o znBzS65-sojuIo0HdXl{2zoJh|rCxzj(I_i%>@Ffy?I;>K?Qi~AFj`3@l9iTqlL>X^ zF@VqY+;^p!k@T5K)-96pjtR;B5f?nK#xIE^HL|@w;62?K{P|B<{D4<Y{h_J=4dn?|R)mqm7=<$P6aL&08z z?Z)%L(P2Pucr~MB=%bNRj_ZuPi;*SYq~_e*S%EBNy84KVO|nE?k=mhZwl5iw>MzQS zbK;w&q#)5uwFuHc8_CqFBb}-YpUzF@hkLqnW(@NnSQ+X@oHeIx0{(0No?*|Gp~Fay zaciBU+C^346BptYFF-q)kqkJ z?v7|Sp190^Sf^d_27RoW)zW}V$;gBrrTq{7X6d^IyArd*f_~vHrxk7Y6$)n1Y~8z8jP1Eqf6zZ+uZGOn-A^6pgSS69xAK{^_8c7NB+&K_ugZ=;rMUt% zjL6NE|D3}8hTivlIt3y0bR6#=)U;>yYwBaWC=A&yBASj)sBU16t*AD54UHPIAWFCw zqvjT0OImza1_LsckTea|liyhgm;2&zrnPOY)mNgU#{}iu5IGyGnN>ZDL9>;@q)ymB z@x*>};I2kdwYO!#%W66cyEPlVG3;}y#Zk>0(-|5#Y{aG{iuBWXbe;4nq|0fxQZJL% z{|_{QE*y?CX{78iY>jTA$6+Q+sL=<{-p7n?YM#)+)HlHfFvU-&W zz-680h0*``> zC+12n3U^3W&(0EgK#QMEF@ILNkmZDN7L%thVPt9lp8bK&2DcNi_pJr?6>)8qMx!;ZYoxX6#aze7khuEdakeN3vClUl|K;|OHM5{Y zj*m*H<01|6wrGe}y63=_$PhDiNj+-X0#>I5h0ck@}3F`P84iLOSY z?1ljGpS|9K>=R;D5&Va@PkQz0n6@8h(j8}Vzs_PJdzCux{-YlA%;)(%LT#6I^uW)N zReRz2(9uz2C%5(EhRP}qukUx*SRA6HE-%3bq)lnXJkX;7H3Vb6PZ2(hiBm#?&2#;& zWy>JNzJvnCB5t>6TgXW`d902U%#^HJU6ODcrQNDyaI+0cqm1<6D`#5PJuF=e@4}#V zaCNK)j|g74_3(`mtwbBW>AA)xdSyBS_6bvD@fuHjj>j<)vF@LsOe?#N93TZ5A!gPg zUdKKQD{IllwoBb0wr#KE9r74o$*!IDsnQsxudsz5>w)l&Mstkl4W?o3-xLx{SN3C9 z1H!*;V4qHOj%;d-UwcVszHkSm3^2cv|D2`LBX+-|wn#duMn`vymXIctiv-v1h8u39 zy$&D2xB0e{lakKHziuA#3qo z$3Z)#3ZVn^JIa*hiiO3wcrvltHwhPttx!@bZb>Tx2>_Ggp|Vi3+{S7@Idk z`k9&T%IxRaHzIE3K@aXq<}O@dJJuy=zW1Pk_wkesh^^R9Eh9Q^UEtc)0dwd-F2{Em zGi#mxT^E9EtI{@+6?#i=R35(xs&sSMQmHV*w_mp;ziwBeyA`;(lctl6uK3a}x#geP z)pOPkPSw}ubOP#UdRi@&001G|{hC070PH}A;`WWiN@@pPzIq^!z1t+N? zLV^Cbqli?^LlziXvU=Fnt5P@Q=_qJ5^U6w*Rx#|_YkJtM@esh0$stWKf_PHFQj^w9 zp+v9UW5YYzr*JMzH5U?fc|xX{SNNXt`&IU1=5NXOg^C>D_}=zzMqusvoTxCQcs@3W;7{K3sG4hGRmROdl_4m2N0yu^i`Qxl<2tq?ah>_JQO^>jg zO*>QOYc1`Z->A(~+-s-|YIc?_YkyJE%P+jr8b#69Hk;a&3z5E0f~0i%{?hbByFj=# zI=+YAw@0-h6vZf2p6XY4V@Deh&3waw>0VGUFGFybx<<68c!3xkw-m zq@EEtn~jG+;|n-Z-Qcb+5t!s%?Pp&&qxe`qlY>h_o>m3R6ajm@*tGC!p+XS1cg70GnzFxQ>dqb0+{i38Sh zwP#=Q6WP!+KK#~d%Ll`u(|V2f+?`hA&c%vHzg$loETbeVZD6O{@B`&FSGc9HlS#I~ z!oRkO%atywRjK@ZnAPXw@HtcUq+Xj}fzqE=Z%jqaxI$uFA+@v?7FgI~qg7kbJ!3`A zsL3DC$R@kuZl)SAR4l+%=Q;YY=@*H)pw5;I{NXvE**viL&W$zq{D%zRo`O%=IrGwI z#b+)0$_#h01>0*$miM^1gZX*<6w*Nw9z?B>SbzuzT6rDX`(pJhUr7_bNPqgA>>{H# z-pFEgQxgQMHW9<7c{jl{YWoBWdS-+>5hlb6)W=zkvVye{^pjQ;&hT> zbCG*Zlu@}V0nP+Y51%G9_!)6kq~A}|{9gBka2Q(CW!qUfC8=!;YQP!@v;aUzRb#d= zu9N3}mX1YmCAYo840%Z!txUZ2!qqt#Ry-D}w{G=>0O~*aDbMn&fJzz*+LSQ^TCT1w z$ww8$T`n!`Knh(Dd^w8`lyKH?S9Kujh+u^ieUV^wOC@sWa60j`!ornH;@-d8Zgd@I>u!JlFG4>cHD+c0 z1z@mJOch_T22-4$p6z+NXku~s{fVo8jJY~zQ_iW%7CS1m3os_;HO@iCFD~l6+(8i} zaAV#~XiJiyhId0z|BtV8=n{qpw`|$AZQHhO+qP}nwr$(C`Ic>0_1ClR!M&6Gf@H1a z$=PS4K+V{WS}uw+Vf>Xd!?`phf-042sABxRte8wl2v*F4(qOAD0p{nQL`P_xfQAjt z$C_Mxz2+|W(j>1q;XkgeoI+2lxXMBZ!jYJ5>ZwSI?kkMh8();a(lymAEEY9$#-*_@ zP54np8v!+_jz{p8+}`0@yKn$WH{|`>O6sb}P0Kob{jV;v73J1OG3{u&sYk~w#VX)* zY(KI-9q*gvw4FZ|{Hz@OkDT-U?0vRdUMznP_Jh}q;_sP-*4&c|Gv_Y_ujj*q1H=E> z<-I%SGX1jUQr6|{kv&a{YH9o2|Jd4JUKV0xXVom15HdMkm` z*9d87mUZIpLb$2}zyt{%g6_I2dI5PvXCyZCy#JzSJ3ROb30W|_PZ{}ci7~q?syC1= zl#x7)z=k>grP2%+h0!D6?sK>93AG#6*GyOy_&a1JR;qUK!hL?0Jt#5yOtt`ED&ut8 zJdems@6vohX3ByBGi(^gTT6LEBAojbY5#m0`X;`iLBBzG;^&w=Kdy-X`yrmVw$PY= z?^NFSx=MSsEdY?`aQ67#;5u<$;hPT59`3+qrmilzeRB}UE^ri2jVu4U6Gr%b)I+Tf z?nB-L(cx@$-T4r?Pf*6~`#YK4tH8EWIxB)+_0yq==rJ*9+Egj)bi{O>7L6{rT>DJ13{muv%sTL8DZP&h>b{aejaCPpNu({O$D$ zyT$j?RlPSMDK%M+I%hs|Q98MKd4kbD{J@ju_a93iqAe+J&dfyrJ8b9V>Grn};6rXT zd68=HR8}Rb*VLNvq$0yQ+6>aG3a3ewiSmkxcS>8i=8{xylUUMH8Ene&gI$>q)C)XN z6Mcw#;4w?B$d;n@o?kY5^7K?Z&WtHfJ$TT{kG0m*=i}$~A3GJLvxbWpJ`#({AcYp8 zC0sIYlyE|n-%v4ziAG^-XwXv?ZPs}?yhLclAnFiBT_1&NOgLgnnm4w^;+ZN;rmyEnoMcb*v;UPn7I~i4>%o z`QRV04tR5Toc#y*17;>UHqE3f4i$zIw;|6XYYG8y&rq(dc(E(~*{Mn-EUQZ(rUj3Z zO@pWP+*F6KU%9PHu{pnFG#RiMT{ZDJ+3DY5@yL0>*TAS$5BTwihi8#!G1AA)!vo-o z5yT@PAsl@d5eo+o$3jF1eQjynjy1T`Z;t|JQoRZV*+UmE2#h}IR208-2auq}zfg{8 zL5>v%1_hPRYMDDxf@aL7AIZtkBeL~xgb06=RN!Q{`#O#jWG-TEPG463KL=@W@d3$y z)>K6@VsD%#2|*mJlz<{&&~1HBry(?+)S!i%p@Cy>fER(TMK`m z4!dQ6e~YWtfO#$9BYv%Tx1|8G$akSj3tP@P1rFk^9hKx;H!54l@6lrgQ4pYSW1?gK zS+!=s&&fS$QWnuwn`E36xIxy;zxX8xHBbWY^H4g_W5)9WiDHwbX0A|ru=@r>^G5ly zc(w+O1cf|40cur`E#)I1837y}9CBBt4p}{~SdY(l1k;Vx9;3{G4&-%o0?EfrBF$~0 z{#N4Dx9CHtS;^#Cgg~9bLJ%i}j2SMR;c>Bej@@ZgIAU)C3s?<^aB9p7WR50~D?`@Z z6^nn&5#L`WZt%1iEXc84=I*iQo(FOK_r;=O$84`tytJ6ifacH?r%Z8YJwU%$9-y3` za2mqSR5c~Kjb^~`!9qwelbSdg_}a&xoW0;_&>CiV!>*tQN_Fcg}%dQ7}s#gyuXUqY0EpbmSjH3DRK>IKI_^5hNy3s<-J5 z=PC6xpd-X1^rVmWe>F+$?)QZs)Bf3V-B-3AoLxkp)mU6MRrbq}YOHF0nyUeg_{)`|nYKdBO$z!P|sN5ECpi~AQa_`r7y&yfT)>Hbt3 zTSdpeM6KJ5Hmaa@w$;3=oqa0i{4(tt<~MJvLi7)=`j!Z2`Q0i{978|J`1+aSdtP6- z>S@{FkYzzsO}e~JxtvyRKHh;v*^O-q=`?dqhTvQ|2h00gtqMF z44EsyVe9u$WaVU`VXk0TKn#>$1qJ5K2*zz#5@9$tX+T_pdUaU!#4vq#fN?yvM9R)j zk}P(eDWkEvmEm-Xl5XaBe`Fy|y9O?>5MK{obgj02qEs0%d`}udN#$4G+hcj-wdGU8 zV72g=0(2XjDn+GD_idKj2jts@xDa^b(pSTit~5SqVq++}Mv(ncn|(E8&8}+*RFDNr*H?DEX<7#LRZgAxD`i zet_vQ-_26q*x8$-Z29As!sna7>@Z`dJuD!^JU1i)%zN0wL;+rz9WNploS%!sp~^yA zkGo2PAjDz}Gj=?NBVF3D8^>{-$bjRU%C;#RWA@5Zp2TXT?iBf4#Jj-+E?Cjv7SKiA zvl&$=eN~JWw#EI|#*G=HzBI&vphF5M3$Gmny^><2XKit{1j<)OYb#vP01Sl!980c% zrorKwUA$!yE|%%AKvIQBZPq`q`M9=LT|5^fy@IJksv~A*Y&GB|Vvj055LuoDy(P*C z-%==8jS7x=?!-6D$xOlw9{9+29a#9{V2)t{z?TE^2>yf>c+MXPWC}qrM9LJ2!)KN| z2Eg(d+8U~>^S;77hQSnJl6an3@;GJH!-l*zY>c;ZyqIq%bd=^qh5s6%oc!0#BKVWb zp}Dzm5`#jg-LSo;H2c-PbF6Ctn{z{{U2Cq2R164IFIIAa03(L%2DW55)l@Mc);gc| ztR)ulPnTm0dv}x6RXg1ak{+2Sff>+*5Q%vE zXe71ylMxk`VWuT$l#f}dTUgvN2GB@{8q3_cY?ryG=1>PmJFEL7Zy zDPZmqmn+BHd#ITiHU7@d9YiGgSSqmiP<3=g$jgV35(-ky{ej0qG8J8f1NTdW$&17M zRE`rfX2v;iPA5KK#``0?72z}dCrg$L0G{Px<+6uk`0iDWhR2Fj86z=5E|Vr;+I!!O z&7(9Tr^vjWnX~rY zX0Dlw-72f%nBuAqrkM{kj#q%vQwo34zIYnw$!I}~U4a_x(8`GHlf{lO1u9tmfYr8#nNGm3NLB(&X!E4pw@>-sv`^oChWFi8 z##b7z(9Qs)drw2M@1=YI1D~6^HmnENeb18A^UARCB8MQMrEDgJ(08ZNSMbtv&=>;# zdNkCEJy7MxY1HPjKK(hDNtLN`4GX%czjj%qbwt~w!B=gC+Dg+|>ZoCEr9IEgTDYE)O1BjRMro?| zhi`)qG?_VV_SGqs{0~rx7kUscmJRX}w{7qhQ(p}MnvSy!Qgi^FA8IxV=;;}(evXr_ zN*j>^JTE}0b&HWBp_pT5>U`{V9^UGXX+P|R}2 zIi$)gkAv5TwS)VYy@}JuNO%r zmupZ!jP~axcGx9aBsYd3Ir(Ndnii)u&hK*9Sfz`f88g=#{ElNW&j>g0^Gk z^HBI|%Esl_<@59Cq`zpHoPKVuczW4fo^ia>JN>1v8EGH9Sq85?0hrffTDLtkedXyI zsy|gRfxs2rCbLJqcfEjG>Vq<3O+spLO`ShFicBv>MXS`2(uCl8N8XS^8mxWz#Ognx z;MuRLjpOjyu4mR_#6Gvf6XsY53(;%G&PS<0{fAyNY|q|Bd_A3fIX|&I2TsaZQIXL1 zK~`CAAZ=hGfSS`#UIdayI7S7R%-Txd8Wmh0?9v!XXwZB8&nPWdscr)BOQ(N>}E}`q0SS5mx6!VEn+lb70}R=ZsRZT7F7M4lko# zyKEe9K<<{aHu3fCYf!8Gy|11+Ag^(0nVCrN&(lsm-UCdG-Gg6%U(h}C;kh-&UQ%ik z4VH#iMZnohoO@ld_e8^=1kpwQ`Z@osJlz~|L;=uA>JBv8VskW9d>8QeSdfc>!$8R3|nx3f%Mnu z=QzC#<=K=$(yUpBoDK(KchfNH`QIFdX9XKzno*D}OUbZ%;;cX3dc?(Ml~}hgagG6x zR6;tAYk|apzI8@znbHUY(QrI)AfGQWe9`il{_v9cva`y0^w?N_;Ev!_q?J?ipxtLg zsB!`>%|ot)D>~9|Jv}%&pSmf$QV}IU@@umvin65#sNbP!_6X`3H*q4?0KQUxK&fbZ zJpoXF<^crWCpoK9_x_%T574!ejg@%}uRJ?(^oq=kdDUA(R`{TP2>BDH4404)N@9CY zCtayJCXAR=dAa8oEx$l31(vrg3L>Jehfk{suos6AxT^}S8xGAuA&aYb{=91U;wlaW zOa`{Yj`zUfB6bIk2fQ4Fu0lj%w-*|!&9};r;3_r1?knh3zd|byB;b2f$DT^$LYHZK zX|$OMlMd36F)6+X9o|GV+)2 ziSa2lK*7%`ITXeCO2i-!L`i1JjNI23G4!D<(`55!!vIM5rSF^?dZ&sRXPWyo&UiA% zLgar;IDd>mS1+70&U_K>{17DeV0;@-{|%*)EKp31p9%Kme-iIY;)z2TE&k2N8_o~* z4*R|IARsrS=`Ldaj&H_?>%|W*HwPyl&&@mke*Sd)t1icF{P;c{CHMBn>*E<$9j&LC zH67ln|CIlV&qDL|r%WHd(=OcQ<=y?MZjXkZotM{e*Qw)nThlbJ;iPgKH~#i^FKJrA zH#bCzPF|#U%DEWkoDiuP;ZdZ*5mhpYlsMse1oUPL1vf@PX@qF5)FAVuN)nB!7LzVC z0Xy>rTrSbjp9xOvh)6<=SWL|i;~N6H(3ruGOXdIu!~`kklOm?c3yFyUKnm*P0H**M zA&4OYd<6N6Ls;OL0>*rHXe|mgx*iwm1D^~4v-CJIPZ|%nF-jpp{AKNE5A&}hmWdCHv}JrCCe3d* zm_HkVi`4@0w1PuF2kgL{n)iVV{zPLKDRK&vVkGkUP&DYXpkE(vvN=SS8$UAsfZ*+YUW2!O%D2bMpk2(vq^F6 zbBYeLA&^ASkg#aZirCfD@2owkt6>3#3g5 zFz5xE1cge00RH8$)hOfZ!x#7jNZasr`aQzU;pfT4gN2tLj2iu@88cFN-vtt7SLehJ z#Omna!^XqAf4wi`#1}Q>NIhy;W0K`*7`w&%2lYXsiidc`L_8-mVJ;P$U-sKXRt2&o z<|k#bTKmA)g}Qh3A9|1Fv}fddWym85qJd39KqsAMwix7*`1s zvMeqwGKEiD0Ut)&7vLG#MrT8v3ep|*ctU-^I50YGP{UChidn$K+*NGMPhQZD@Rr?5 zeAiHh32n?oYe^e793Bjy6->IBH6zdLOIOF+**aIZg&ekPAnNB2h^|(4zK0hIrAhf( zidBAygZX$UjQW=RsjE>7Ag1V~*#Gl)XQ7%g$+b1Ckk~|NYDKpkEb%h8z!P=6~`295-;WIknGjCGH;NGlZGk#C)!+45IE ziuLy-Pnn8d=(&pW5rBgu?4E~Kx@su!u|e+=depl=)U=u+xl4&%-G!9T5u{sicQ2-0 zaK=6weRCz|6X9ia_a=Eop1BNJO~O4~+PcHcrv5N#Z(x3Y&{D;cdx?98fb!i;=B#35 zd*t6FxiL}pLL4NH-ZaGyt=9TMO~Ij#b``gnJq&?y*~Nb2k?^sK)vyvQ9G0aIu+_^L z^!Eh|mhJ8ghKN@^LzCmmHi1iIZ=daA+J9#-CnwwgH|OESd{{h$|as z&zt>To#dW8uLv30#j(bma}ed~g8Y z1YiN_Jab}%DPkD1MM?>Bbkn~gzp_K*^OMD8R4MSW!yHbH^T?h$FjAs}q{L)u9bf}H zShg_<*`1K3`qmh!R&4CKZde_oS!Ns#i?a}?EWO3srtnLE5eHDn*TLkMlo zOs^;}^FSwwUSk&MA}{)N##u^5i15OfWG4t`d{^nUFo(vF=+Un^kP0@Lcel@tP33&c`hzfn-4D`M@8Qbmb~|G9NFwu#Kkc zLwSRwJs!0}X>J!Knjq?3n-cb^HP@CRtXH5}A-VgnhRzyMJY zuh`2XLspN6mP}xWiwuAVLaQk$Zi+%5!H>#19{Tiqd$IA5bHw&goUOpCG*Z#Fn1$m) zDs(vn8+g)&|3_riS_v4Fc|yrQ7(sl)OGA#Hi+Ye&I*g&|7+Wu>7Txng1PDi-J8cce zvuUeYwJlDGq;peM+YpM-&rT35?NTS&L)S>WNM-OCNM52B7P)$b8u~&G@P?kXy25m5 zs2@0*7HE`*m-hhy^N!EdY#N5UGEP6DJF(3RY@&srG_88{i-gOM7=`wsu=>2F02PPz zss$@48JzO9+s9nlTdEq{MTK?FxsC=Ak1?X-BA7V#c(d>X7Ze)jW{nN{pn;OJShH3` z5Bz{l3{e2VZqWGJ-6W~Gcbc@jxV;75T0FrvTYLQbJ}_uCThME;YP!POuw%*pbmU96 zXv;AD|d%Q900>9)%8G0yf7w( zWMqPIrssi}9aA=VdD;GZ#{YdiKV;wQzCy^XrCb;^l(~KxjX^oe$N@H}6J!eZ1kS!@7E@1z}A1_0Xb% z*G)jct>Zk9eM_aQH;kwul-31zsx8b^%N2FWkmc?Hq&2!N*aKH*nH60Tw{Z+IOl@B> zgahMFnObTZFK;$V=lGy|+lYg7b5M`ah-PUlt5dJ|#sY&S^HMz@mm-N_&c%cY-r~R` zaLdcFSl%q*n*zg-6-&-qfan6P(u4HT=0R!`qzxIBaoEi)qO;9QPgfpBTN5RcZ030@ z%CLiIyj#B^xuFBOVRLc=H*&*fX^TMRaWuK^78;`=9!dgGOs&#+Lj$al-nOdTsy=8Y zt@5HHm2mqnTVn->e2yr)yGLg_xHF5SB^z@cuDdZ?Mk?`waC|;{_%XOCh-l~{xMJ(G zzJAomte_eRdpZ!utyLcB2iXjt*oNxQ0IWt-@lIFHg1$_JGt_PRQ#Ia%T`BUe81myi z2I%>5dj0)x!rPgR=Vi|Q4K5soeydn~_(}JNLK;HO2~-aJbVe6E5{jiI$IlQ-E4hHX zDG8@117tZgI$>FU;{aQN#x=C7R`KnIvq^?m{ul&Dk-vAM5+l}DHPau`(St^|$uj9+ zO+Y9gm72R@JI_UwTapH*#w>|L4rGT}nBk4av7J;Os8&cyBLZn0PwY`DOD-g+ ze&-uy0S0!!z(tTF7G~6`8@HzX?07d@Rm!j7&w^5*ZJEc7+@eJEO9=I@rZW{NQTN>v zK~Z^2B<6`lG;ABhaIH8h93?+Auu@w_SRuJ@nX7pUEotd!WYSA>*=2m1EaQ{8T)FtS zV{5umNtx~Ai6%7E4TWA1Mli$|Mg-GI9!0{-<(=1MLwfQu+Lx|Ep$QG`)s`m(h{?_^ za!jh}%FTmZqp=`Kd>@ zd%9uCY{8ecSfHtIZf@))u;KOAc!|$Iv5ZC=c(jhx$kbhqhaf!5BLp_tHXAkFDYE#T zIX<>=)kXw?RoTp@i|^T14Ue}P9LaOHnKtJkZG~uNgZH3yt0k7P&k*%lraMbcIuRW3 zD3m4#N?gUeuKEyUNmaPY_?+#4u1Cv1IgAGg{p`_GlC8R*Y8Os%7CQFRQuC7FubAD` zavbfkDk1AI;ng}&;j;QtOIgd;%o|3Obum->6m^=Q$0fb*9ftpcEPe~9QoWPVuK90y z=g^&c(2kRNdws19Gv`X$siu{`wpo#et+6~B^Sedema8UeNgMbSHx#d~SWUzy&3wIS z;i$5kA>K7_u%;^nl?>Yy^mLA97x5!5cX`RSw$oZv%Col3rTcb=SO32{1T^&{n%qIO z5v&onXlTs|r^A!1?8C6RRV`8t(kH2;2Z<k9>_0GBTY|gWIg>Jh7U84Yfxfr zx7G|L%LD!9CM&}gR4cfiNitpbcn>z75qG+`H#`_F?d5UqgMMR4Hh83n(tn~ET^A#@ zfHR%#tot8&b4WgCj1Y!oIE)G5C!RAUVk-3E4=YjEnDqsV78o z|3z#aLHmqS!Xh<}oP53*K@sr(#?cS{yZU;=2oqQs1GGi%en66OQmd>#7HGdO9nFm$ zyKVsgT-(E*Hl*?d`4>5y<^N$2*?xMTWx z-=A2^+!U_M=H&pO|Z@asCg=nV)+Ha6qvT^V~ zQ%ypeJfayy+!8}t!Lo6%AQk-P>NY_hRm{*}Y$9vP@4F;TxXrSrY3{#Th$H&wG&k2pIz{+x~i%&1y}6wy#uqK$X@?5489MXI?fth@vf|@ z!0(P5oG9V~JEe6e>~szOD%Jch7DHuu3f$}JC}&%OTK!Zz7CO&vzmK|S5GkcPnFCYL zdDtgi#I7dmRyCuPNNep;?dp$ojvbFrsq=Vbg}GR5@y@%_EfIBfbzUuFy(SvcGToFa zdz~$>DZbZK^#xP_9x}RQYJVbalx=)Ul<}ImN6V!z)g_u4;)jQU#o5b+O9`dcRd4!Fh@vf99#6# zx`<$k@Ny`9-zP&9y&wg;LDnjh$7mK_5b1O1aP z5%z>*2e4DNIdkGnyDaj9(x)9G6X5SxhG9E;7l#LL*7shx=fhE9m+z=7A)3KsC@Joq zbQ5KfP{&=cbdUp@fGG(%CI=Y*+2k6jIx`}=z(LZ%f0r?0LAx=ZPoNBjV~$&d%it~c z3O5KCdVK@+`@8e1VI7_6Xvn1mR+wcxs5XnI41Mr+Btc45Ti7GWDg%rWPLGJMM;7m& z6VICeZPY4`X{?UjX3SadfiMFvPl0-3xHki8K>@Sv_yc1E&7@x#ID&e=cnjKHxK=9 z8GG^t0SA1Z7s(_SucL=#a(|@k>VdnvJosL9@^bO+GhJ9k>zkN2S^`_C(a)2$Z{QnVy6 zkX}5c?o2!Ml9xGV{r1g=XcSY0PBj^=04%jhnIKcs|I*VKuT|^@W1k>pw z;I!dctJm2YXRZ4V#V|CRc|(f@I_0n7-6-T+v%e@8q;eqW#zdo`=kFb*Xhkni zrUz8$HifwC{eNc^}F@!p_Uf%ZX~H5ll~{hxMxg z&*iAy&&2gees_EUZOlTJ*~&N@8ePJ4JKIv;{7!YXy$H7Iz`MVwk2%c7DilIRU0K>6 z!Tted6pO^~SoCY&EA8c{o|kRbtntQ3)+wCCR2AYz#b zd4LtRWJ$Ze>7F!OxoMSp=*ra-xMp{a^5Zd=uDt+}@1>8ye8by^mHVIcderaX;PGL& zbWmd^H^xrtaequ`n$0C0i(3xACA+Fh%B?lNMiBRs&1J@NMHb0# zZ|PoF`9f1yw8wY+DgoRDc4IjzuMD-tiAsD99kqENjuCDJPU%>?iPNIO8f9xYK7L}Q zQNa&G_t3B@^k)2eDguOJk_u;N3Y($ zp7~ebd!-w<&32T3 zQf|P??(EL!nzro1q)NmcRoiBX#7WHk;9_zjb3qaLy89sYXj7etUy=U>;n`^P2MC?O z^H9^~ryzQEAK_-PveKoVgfy9Cb+T&7ww8;l?SluAEH!6LPv7VQ^7c8QQ z{S;>$) zy@?rRZm4kK-Bk$oGs#FoUgDjpgMu%~d&b2Rz5l9iJ^_y`Z3}|EQi2g|Yb@9D4sYW| zIJ>BW*Y$k9CD2~oI zIY&^?y`#nibG092QJi(1Ik*E6;xb1?1PR2Nb;tuqXF|`28jw1UoacucNP~c?Ap9%S z)4j+=q!RK+K$=j9UgB0a$crUonI}oz;tq%jfK7vhalX*HQmJTWb*VNGEw3zJnKxU2 zJ&GI1JV0U@CyEyeK`qp+!vBNCBjT+1Q?=^SQz)791O^yy@KpR~zm#GrRrXPBVzyQ3 z1hSn`nv&%lxXFiT6I_v{vA|}3FaeN34%+Css2};?;!c1abj~7Va|>cF&|6^SZwlQP zw%!Z85dwkT3hiOHo3}WKij;x-;dB*W-sf?6PS|%d)QnULn&C1-1U(StV^x6tBquOi z@654I35{rfZvNqPdyt9HwvSUgzuY>I(qhT;8u8RdPkcV1g@b!gn*`fJXE z(4gBfd$RS!`PNIu``e!9G?;QRDih|g8;0sYC~v2@eA3A&tpIV6jFM;oX(D!THAbpe z90UjTJzZv2T7tY(rr-#4<-%vlPDv6y`s^fwpGKz=nuFfEzGhN-oy}2NVQyUftKehA zJ*`2TuqOnkZfPE{j^x2*u8O5$I%?koz1`dWrsh*rhmH~<8F1CHJ#fE9p)~4(QiKbOs8faHU+k$0v z4o4+7{9uH!^YttGF?g_2(@WJWWpJy9`N0k@-%>4^NFTP?DOj%*gx*=Z9l zg6_-YK*EUtm*7gF?gXpUn!A`4+ltDGEXnlv1~h{dR=nw4SyQdS;Qn>XF-l#pR@~{D z#SbZt4fnO@4Nq(u6}Baw z-eC*#1b8F*ZTh;p14w4Dkg%8!?RxvFnXeFo;+uq!^poTH`5y_T2XT+7EJ(jY=tCXi zk?z)(bwVU6SWFv01~(T|soy%vZIh%iQ8?Kdil(q6L(wgxFlr>`fgOD#pRE4mWxGUE z5l$Qgwy?gWh*XS3m^=qb1#^ZS+T`}E1%o_uqxS=}0`o_Z3rAHVY5NavSTyJKY~Eu` zc{*uv$3#9VY;}OUNvGt9c?_b6yjCDg0Wvo`!JddTpmShQQ8k4wE(q#IvV5~r&YI!( z#U3Y!#%Q8JbwGd*m;(L6Q`vHZo3v!8HqPGOH0YyKoZimb@m^64SxO#t4r4Le3C68{ zu&6vRJj*J|ah9XHT8!%iaF;Q+nw|j!|9jvyLyurA{n7;y?Uof&P00-3510X8DXX@$ zS%>$JHgqhunyYbTq0Xg$I#$1QtbWuALTX*~N`v(29|0TOTmOgE-J+ka-8XE%3%E)+ zuz4s1wgb~Y2gyN=ju=W>NL0znCb@E6gIv&7x2dYPYW?MY`pf@VFll|wmsdVT%q&~&$avG;vGLS-;TE;^1Cu8+RqaVX_$kgHFvRLPPu3j46dSp82 zaQA)+O-2<5U_V$pw)bWDdxF6A42&zUc(aY&h=Y28yK{r9294vQi`f$Z}uYI3xf0iug-l6PYj6lrR#=-e7;o12sZ77Uu zpo0n_?GL8eq6R7?;%(d zr_*_^`Cow3z56cdH(my~`r|Kz3-jFfT4G;VX5O`~rk(Q610Fw*=BnV9L2ej8YEb<@ zU^}R}To4bZzM%|Z{+56NTI*-MO?Rk5;gfzg=o1dIv-8n*V*Uv&P0$o@_}i(w1q^s) zVlk!m6jhZkuiVs+n$l4@zEk!$+~(cYSxULawzLWfbwLtZOR{xdG9Fk0SThh_2{VZV zYP2#hZ!t5^`SEX9vgu0U4T*y zpj`-OZQ9cw_}EeCyLbL5m9CPt&% zFJ3H#;Q?E>I+6IEK;5^*mL>AQ-9K=S%%eq}vFT`bWjP4c_W?15)7^`1FeKdqSvMF6 zm1Bhh1yJufarPk`2i4aAAcY28K;|3%;1!52jj@lUpJU8KX^jmwUEb*WK)}=7g*J8_ zZM{5dZ(lVd*I-8gU4rUEE-spiiK&5vpF!d(DS1)1Q>o%L$(C{z$bjO#?$@=I_}_-< zyZd-v@$Ojz?RgWAXxp%*sp{i5>y_HMvfx6@E77HVSq(*9?j9X)@eg_~qy2C*_2l_~ zxI6zCbCsFuX9Ob`VGn4u(>^TI0C4ni%!7k9aAL)Z2|Yb+ND#?^8I`vtIQ9I#58duz z$0D<&hbjd_IzVf(!2KW?vjyJ;pO(Q4k)QxuU)5=SonGwpo;P>IP6aBZ2fIV_cS`~= zFS<|;u-r0tttWvi6efY|sP(i-R*a+;d)lq{)MK#Htgg!2yqEYB;rr$g)jk?-LUog{ z5=*cWJ$D*YZM9pW>A}nJ+Qm3;_-T#zD~jOX#8Ee=9?GXt3kd$0KvK{npl=pKQt{hR8e^Q z#JaTs9u29Nn__*Tv8Z*adVQf@JO{M~<|LqT{L(2#@sgiSL5LbC?It7}U`+1buFu5$ zp;U%4KYae+#5fDk3B#HYKR`k)pKOG5Dy~u3l^R=x(c7hldsPmuOy-EWvDV89XnpZxG1}nZSQLCc6m5Sf3m!)N!gXr-U6dWZTe75iV>tO)?-=p!L zE-hwiTBdPn7%cWJQ z(Waq*_<5j$yI{kD^$|?7VrXwqUUusynu0h87Ldj#$b4*gNcNT#M_QIy%VrMV#bpZ&=;t#G|#>m@B3B!xwK8`5KtSGag)YBQ(>U3FFzoyRBRp`)p^!fwnt2!=oS8M#m~9D zxD3NQ({fR`P%zlH z_T)gK-ZoGof)6ku0~^-66OH_~_Fn=+WeF-$4u%%QXSCFm@ve9{P|mY;v3hzYt8O-u zSYYi%zi&!aquYyOVN0#7q2`b}Er$%MnXn|3)P0$sXH3B2h7xLw+H*zhmWp0n79ugQJ&btS7o>*G3m_K4 zCN~ul&KU7=+4P;z7((#G%(>Zx;tYD|W}?GwlgFCuHX;_;8+)=z;wS^C%Ws@mvnJf~ zXO@X7NxhLO*-J1_HMcW=hQ$@*8C>%ODUkn)XH=1-$RJkeuv=8SSPmhU4ndOTVr*rD z$?$=g#b*}X1UDq8)ZO7dXey-(4@&|SA;TW$YwFczwC>jCp1X0OX)MZYEB}QbRx9&|yLX4FEA{uH7Qjz{=p|S8Z>2 zL3Fy`?s;*L&m$YAcy>Ti)ZSTKQo$hVMR_VC%Dp~4Asl^>~9ovINSs}8BRHKu0~?=suB(> z+s(v(4<;z7z=`6Jj1UU|6q>C+yWR2K!*~GyJ@;(4+_;zmySKOBes2SP-hPf;7InMb z>#J`o&$?pD6frAf)4A_s>iu-el9}d~gl3y`PP%4{ebLIvsiexS@Jb(yGDS%HGPVad zWpYJ5b7-MoxTeeLopn*DxPN8krBwB3To{$?$Z~)n#Vcl!TX2;HpgHJOJh4)%IAWb( z`CF-qI2B19%N}gXoKs6DLxH#!@Xn&jurY1F8zRW;i;#68#q6U`8f^sz-*t23TD&+u z-JSvR*1Ockv6n4JQKRH+Xr4*(MhR%G2WQWe75QnP6AJzNGVq{xi7JmP7Suu|UT&0% zdy1`ASg^%SrUn&k#Uzy~2(si}T)z9_zhf3z@WcLn0*#0WFo`NAWGTPL92 zpf_(052o+WAxerx&3b{KZ0>V{)HV}2?sjF_hb4(*I>6bBN3iW6d zo)nR)D)U4S3PyxeP_S~|Un;@quJRbrX#&R0ra_DZo0ni!ulU9+Q?>v-pGwVuAtsAS z))$|Ja>X!oXFP`AGFo!jR4mKL$`zsFeDTO3XW$drOeqP`X`WI>c>*K}?Nl0bWCn=M zr$uPd1wc6n2^($EMkkrd6|}DAWV8h5v9>9}Q{_X35)4h#6{`4Lwsg-l!!CW>k>^(g zb`kep4ugF~MB%z~;|_Dicy7B0Q_pIu&oPMVaa8WY(qmM7Bl6l;5}^VT4I*&Y*HZkz!-7FL>5?iqK*KRPC=IKm zj$9wNK;NiD%E#N#zk>Jec~-p`5pHOA3BS@G_*o%&G;B+xf(WNQs>tmX#-l}@81qIY zE1!%Cyw0Iwbwd0Wf%$dFCTD$sK1iPq6kN@Hbu%MFaly`egqIJlEh&9oP_a*ckz1%z zS^|B;jzAdezy&JX`+sb_p9F0CJX*aOI@neCZ+kuLaF1T(x4pNeG>+^F+1%PyOi#Q2 z4`JUJD@xQYdG4{#J+^Jzwr$(CZQHhO+qP|6b7wM{$(!VR)5-4iul~`UwYsWyuc}2I zaHS%;WK3A)&ef;U9PFSs7)*X`t`)if{lM_2>rf{<(t4;KWuG7eSB0$Q3Rg#XSK$1b4fU>@P zM?P@ zE}Hkk&XUv((5uXT_Q+I#v7NZsXKupdZy0TX65vGMB<7PLKB%b1^$tig0K+RN-xVHu zrmrI?e-l2T{$SAvSc9Lc0l`lzPYBjBpD9vC1bHc?w?DXWzd0g@R^w4+@Edf|goemq z7iuT={_?w-ds9g^AU;5(k8{W zd|kheEtr&b4(U`v#e%5P&Cc-%tPwuVqmOQQ|7F4=+ENKT*b$(Sc;Wc?SJ7TXIs=vT zK3!(p0&bYDIYU7Ow0YS8gX^-2WfhwKjwcg%^n|&@u$~%FYyo$OUKV*8< z1Qe)J`*1&y&`jsGp6sP^*uM0!9_sgZ%CA*c9J514ZXeOF9A}^?jw4hmdI_zq!ey;O z#ZM(CWIMU}hO>9MGu8OgOHweOB&}F*`~tqB;Nm6CnHc}1V$WH}o6yR9ATnHKFXt&d zFWD(%>IZ)QO#;h>Q@grvU$ZFgH|?9ZWtMm^kwcHhVmQmh4G7{J*I7kuVKn!8%t7N3 zvQR{Y!MukH+6A-f%l!}HNHYzJv>=>MLNnZ#sRWFm$|gQU7&jhs z^_vxv7hHIf8X>9Hrdi0Ww$an8R?!GwCNtue9ioYb&-vmZsdi;p6R7gMmg!arNuGy4 z&e=q&S(6+~hE+msz~i$ASXxojV+4;&)NzvKKtnc6%_3saqIGp4tBvT}E@{dT3^ZQi z+yH|ZpL|dX&9hUS>(c9dOTyPqKtMXkJQ3~d2Rj8Qh2@g)lc(F?n(BJ;ew)gwghLkw z5|R!z=q0pzrEO@P*Z_;sFXYgJUk`Wv@HBJGbh~DZmJTODiYpxs?r=lxG7FE-(@Ik) z0ivo_pBX|WMe)@{J2)$cpvd=5YR}vZ31Tu9drHtwT%*GN3=#=0XY+N^=L+3XQYq#@ znM>sRJ_~ijphWj>IMks0fhm=iFfBnvA(Z$=er=0Vgr?}wnlYPQhqNoV6-+u_E6Bg8 z6F(%_$~FpXz)6Vy;HWb9TqDu}L?KD)(w&XUN~31U4n`B1qqllnkCqg1Ze2h9Vbssn z>UCueS=)Vx?Xat+FU@gZuk7P(FVS%y3{j*m=u?O@HeV`JwTC4S<7jhs2+~h@Z+367 zV6VL}u{?ZPa>#!Naal(OD5CBN28DYmk9lib!6onT$&{k`$ykiVXaud@<5y#1w){{W zSVEO+@8VE(D0Y?P0zQ*|#bB5$I9OuTCui5-*DBY_U%J-U%?LM1`Ng5zIg6+_+$bCs zcZsmZ$}4yjNYpR&VOB3Xk)ZV6%1^*U%(9HTvP$?gReO!?Euamk`Yo8I4Xy#vLHuOr z*?8?IIbHhYl%JLQ)>1%%HKqALnW15ZnNb~H2q;VtC|1ym^e&du$AU?|wIqUu#UL!uoYAdDLD9AlcGz1)q$ zQJHKM5FF~lGW5s%rTTR6HrB;3G6`m2>Y0W5fazD0Y<`90ezEF)`#W3s6>vF6d~M^& z_e39F6RTSD+^OK;?w2nRI5nj7o=Z!A7JhvF3 zUKmv6S4U#FMxdxRUN;j7=)lj9q{!HE?zpS=Gj%451M6bQKFUzpx;HVHoar@)trEZI z1#;Ltw(VM*w?&-Ox^kSKLq*0QGv8jCgPwLWFQ5iNV@k&%8TI~hCnFq9iH(LObxN{j1*_SuTzzSB^CCYAksATFFbut(+u#_*vN(wCmw9D$a}9)i z>r2~M5LT~p5BMGrxdMN%mES9S2KW6H^D{SV%IUj1;_Ir5MfT}wy4tg^>$}b4*4=%r zvoU(|rP(#j_lN;MPnlI?5wDbi))Oz(S({^fdu@fF%h`$P*}GReoy+oaw_6<@X#IKH zKjZk*-QE7^b%_46wd>x|*&W<#by%tWc*CF{#?fSmI(vA>UT}!gtcF8+AGDJtY*GoB zv(kZWv;VEgwR}GT$4bW7a3l@_dU*xuR9S)+UinhD zV%q?n<{S%DB>`Y%rfv04V)8mdg_@7LC_rbKjAwmeELh@eE?c7=WwLv)pQ|x#6HK9h zjiqg~571|QS{N$$2)BLb%|XRDcDtitCi;z@PV{22iQeJt6kqTMRM7&R<9}QIAJ8#uyfb#WYM;~RmppQ7 ziH0n7+Wxn66^%O2^85X82f)|dG1ufS-wwzdD|sT+tXNBj;SXHp6ZQrZt5eA%w23OG z?JTTvEXg1bxAPG+srN(wJpQ6y;PNQjC?Isaal|zgE z{S!*wo5;G_$gqXi=E68wTdGspUz<}zynl<{hPr|mf?0xUa}E8$R-tAijX~nYwQIX2 zi4)8k=PA?Q#5N-J6+2;9w|bdoow=b~7m3W$uH&^k8}*UK437L!Ps*#dZ_4p^n{cPk z*>eY!!{g9;!T>`@y{Z`@4Dm?JCKlzm%SE7OynwVuti`98W{bGg2KCofxcbJyQc;$u z?r;%*Iz@3gLxHM}$QhqW4ZqA)^5Qz z<>&Jf)Ryt1!(drDMx0{-W5qCa?s4a3@i(ie63Q@1V(Xt7=S?zsSaU5H`o-|S)}7z` zw?^_>YYyiT8NJvV(iZ=W{mWyTQO|>|N%C|?ms&QKQR%bwPA29$<&nhExzs3Z0oBC4 zUd%*$)QISH0Hb<21(Oi&)@1D^o z?U>2;b_9F0VQLMh8=XUDw#_uiRmVu)Ln0{iQGjnWL=zZJ-b_0+wAcI6#jytm2Yr#< z0zqFV>i-yCuY*6@uXU{(&)0%UOf3icw{7iMPl~FTux2opaX#4BibD|9bQ&ywGJET4 z;`u6dU+{2e$io1^36J-$HCHGxSK0;Y&p^W>m1E|Hl?7Kl)PMwSPMK8j-L!(zz^LfT z{vE5fyQZtsZ{4&Wg`JitJXS!m`6znBy`jT2w5d&~zp5ZK*pT|{o?YLJS<`=ZESO|r zskL9*@j;s*l7l$d%It-$kRIFxdgnZg7Bu7W_1SevN9BwX-@HU_U=^+VDHX zZ`mfXb$aDZ0$|M=Emt``;f;ZBr#9O1&^b~UNAK?wexnr#f9c65d zrz*8)9lEA|-k1g?yQ;aZkiCW8K`Mo|0q?>gQ=@~xg8`cEPO-5J6WC)Wfgvlwn!Ltx zBZd4taqLflW3(xkzZtxtaJ+J4{WB8yEp@NKs=W0l1r;jA*%o7$g7p_oA;UCyg}Z>C zvfL%v_qXWte|e2T{_`3G0J#0{uB%5J~_ zKfgb}|5egK5KFN)f(8I!|2LV8|KH!u&h|gfB~NQu|1&Q`_@Vlah!zM^A{ck6X*)Pl z-0&2S1n4Gdy9^y%=LsNDMX`)9YNzBBx%~BEY;2q)7ACimLs|t)Y0AoeP4_lQ=k-;# zy|^ErOf|e$_^K95Lb$Aee^qwOOl3XbS;f5H?^ZhvR^kg#(%l^wIaVeQa9vkeS_Whb zqm}t3)5*=ro{`m^mF-0`HJxl+Jies;A)L4*+CGB2U_t$JU6c64(jH%DuQ?yEq1|d( z=fHr&`cSI9GuB3-NZ!yzo>(1q@b=GbqdWSrTrKQQh*i8iLMV^`k{Nt<^iZniQ9)!s z^!1+i=i&CP({;Buy4Um5n+;L-#~gC@ks&sDNj~k$3E5O(QfU;#D%?2Tza5fnHZJb_ ze%7LN|J*(`E9$X1Y^V__8+9_aeSrcYPmrv{paW}>!zK=wIZXaQvz*y0*7uI;FK_JV zA$$b3|5hvRWyQRNl~IC!ZE%f{0G7ly7aoYb_qJHKr9{3{pojIcbWV1k?%Q>kxMTNt z^77h4R(MrH1$47mr2?rtxrBRc&EN147=#v6vSTAIjoS&NWMCk<>NIvCML7>9$f?=1 zX0`CY1oRmGS`hxRfJi*PhScIodoTviBEYWV^@$;}vGWGRBwYJ9+MkW}WY+5s3 zIDxfF?JMR_eIPurz!l_3z!cky%fxSINZe}5-hj7i_@G1PaZOh>L6SP$38BJzv2QB9 zmN*+ZF`pAVZos1Km9<_(KgWx#mi26Qyje`6Yd^x-ItRQxW>$DHc%nT^LW{}m4e{zQ zj>IuN@F*SjPP8;10K;?*W{C#jUWvuvr0X+X^P<;_7Vd!!t-FNz(ot=u`sUvEW^2x8aZsfUoAzKt zt|F`^5Z5D$)H!=$JnEV*WPV2kw&CLzi+~%H#6DP90(TU} z^a@vRFfY2V_L7TVG_l~M&Q{$9^XE*NdJk3?7(lI22jfkYi7j^5gK6b3FhI=ro@25(e|cLF@26C*ER8+0amv6pa9`Z?AZN0P2RO(E=O{U(R*ILi-u=eDe#|0VeK>n%I5$h}AtE=_bp(f*QZ6og8+X z+>cac-GBR=Ah4xqp@>J#pwppjjOf~Yl6VOpkWR|oj(?o@FNNMZM1{ZP;#)uf-rWQc zJpMs>owQivBJrWWHujl6mO+F+!4dzFNojpw9;f3Js59a1!@md*tzk5fO+qb7C%eTk z;WTrF_yvfTT|Y>U?ID0a1$RdF4N&T2UPYNfnGa)LqZ>uEsHLh+S8JK0V>rF^o)x*K zgAy7D1@t|}CyI?eYiwK@GcfVMjMVOzIUtSJiDsPN+ZPZS(1c4v4S;&FnuZ941@>21Nz<|}epV^udgeN zeJWFZFmxLe<5`iS%pmcoH*ckox_N1-tBvZ&Y8+68XYu%V(Y!-;k%ktp+KLxW9svDP z^K72@t%L-!!bL#rAH{wHnwc6ezr$#PY<{BPhy{k0n}~ru!la|2W<8h51BSPMf(d63 z^D`)i!)Ba!;!W|Gtpu4`-{-0w3)e6XT$pUk;Xh$!6FAO}z%GO}P*%gb6<~JQ3-*ky zT-wHgFo4dEEy+y=%j_?FMT$8rDYy#4+peCW6!ONJiGx5Ks@sw4UQPZI5w~1{G7xGA zxV)084vFNDPBja_dHQ4&TU5lCN(3=5bYu$p8-j@YnKqNcpBFYapI-sQXpsE^--Ac*=wr(eOnQbr=!G_K;P|{M zUI*E`zx5>}pK2g>Xi1!GfYTpe(SYflfUt%B<{@}V>`mKZ4^c)P*DnY)0(4^cs%p~C z&i2EqjNMIa4Yz*a;0(l8FPB7Dwm@_B;BeyRM;IrY2>BoMH!bP>B8P1)t*Ay+a1&~% zdInK;f+7dX1wzTNRl~g5AMTw=q?sGyX1^4_0wo#o>vzxqdj# z^_B?(1g^I_D6y6OPW_m&04VxlY6g4h!P-40Zow<^)0=!2?{B4+2$pPS=#;)YtJ>ZY z?jnt0#`&EvoAbjl*f-$#jvYYH*LqJT%eiQsv;kidQZeg0qI%ncsiT-yF*VWvAT1D9 z5#5#uo|p`7=nHP-XjNbtpe-i|n4{!BUAueMT1z?&YD#^mL~Owhm5?i5BdI1RhUiZB z_ApMZHt?%70*>bH%O@l_H~ME|(&MAkRCjTZPyc~NUKs=2+H#*OTP zfT5ta6ig%`_PZ|@1PH(!o9fcogQFq&0BJYpbw_7D*jbRVm5NVI|1x7F^c$%!LH8hj z$;WH#J7~~x(9%|yx{J}*%T`X$!eoUz%CkSHR6V^xZ8hXo^Fhf_U&wq}Y0w~)Htlj` z5%#wn5dOz25-b~*Wvrr~jhMYFnTAwrf-ijI~TA3&ejsyT~w|XNSg(;&MY&Gz2FoXi@X>;4hns%m!=e&yRv)47b`GfUQKj)e2Y-V=W3BPr-)UCl3t?c2l+0>q! z5DWTxE7O^O=M)_rY~t1s1N;JgIj|7a{zmhT2$7~>@@o0%;iA#1o(Feg=B4i&E7EiR z3Lm85woaDjtR1_UtF-G!NNxU)zoQ>xkK^N({(8$!e8;T68WWDZ#IhT^* z&UM+HzW=7|^UmqsbGs~q8PLk<0?Ghsx*o?%>+9aV;yczt392ORi>UgecG9s6`21U) zY3vAr(-ch40pFZq4XOUld;>bxmkE$wGms*4z{2?XP*=;cAOALIwV|>#$(jq<-uZ$Q zG7|{{B>1$s!ODicxvz;GsX|;4S5)YmU*(dP%^#?=KL#Vtpf#JMoWzE|<&HSr<8+SD z-BWa5*eyGTX4Vbf>mS|R6kuyl#hoQQeNzVuHzl=Rhbac$gv||gJ%z;9rOSaNn`aEh zqnm+w*TI6;&c`_|wncy*n3$KI9+Km%3)~awY}w(fBHEE@=$^P+_Z}A`k9Y42Z_D8q z$NHYu%RR-3)6rOMh?x)Wzik;-03TD{}>!yQDvDYN+8 z!6qarjDLg=e{$Z}=cP-ZOonE?A4!hvqkfefym@|b|0{2C!IXas1OG>ZF#o^2#ri+< zmS**Tyk!jjfAW@k{2(JL$s_{O7AKjAmxRkd0RDhCn=;RMPz3oRLszPDGD zsYz!QXKPdT6A?~fmABoI0P+cBtw`XoEx z0boGe7jCU6)FdkyL00tuI8vy57a?4Pk#xA7P)s;L@DlBInx;~?EED=bU9!_R&!=&A z%pRA{Y)%C}+6fnP^|+*d<|uhLQMKkkj2=k^Eh^WE3@>SalP)o`jE=F^k*+z!U#O`7 zafX6w$OaH#YA^j)YOq=SX>lsE(CwLqDHK2iqD^g`J2CKB;A~rVAfe6kr#Vo1>c1u; zxBG|Fp_$82f0|KNO`(Mrj1py6RR47YufLk|6NvXo1l1iD79^c)gs}O=7 zVB-11m9qF>^_PAna0yALqxiI|;I8SnW-8Xt{hhgh}ki zh1t-f4TDSbT*IaCw&J0$0CiA zjmqqTQq-&2BgL?wz+!2a|NM)y5yyN)*D?U7uu=e*{0VGtj#>$-rgpj?mayPG;ae-9 zf()`%ug0qH?4m`WG0@uvlgIG7eROmRZXor+0D5U2^2tQ-hA+6Ti%b6+nJzgW*?I|Tob$s#C3duF9-W^G5;aW#YMdHedx5Wplm~*2eaWa01<8! zb0jg}peYDcdZT#!TAZF`Rcs>_4k54hC>D+Zc8^dQ-1P9@AKjWutU*GU(PcCuS5!!Y znyfmkuHXpGd+4}Jb{Oo7BggP0Csb7_DNiQQ({n^<6R2o>u5q~$a$8Sme{E@WdGg>v zq2o0{_eN*|HOEoZC0}plyG*^bM`E#5w%secbZ2B`SE|~uL{v1Y*34a<>m)Q6mu^8r zH+xZ(W?KH2g;q-O)?;0ad>l_E=#H<6?XHXd*+)vHR6*D`nQsB{^i5Bz8fSEOe~Y_s z@E3MO&6RBDE$ep8iOuLJ#t2;^(^q`k4yjFC7 zcoJ$eNT_YxSo=OP3d|0+P*pW?vNCc$a#B5!!h^j&=rEEFS~pr0H38Z_1dbj%dT>0M z&?~13I1t|Z{=tGPT`Ni#_zwDf_Z%1V#aU?eLnoB?H%Ji8MD}Lh9(l> z#gOV0WbFzxP{RR;sYS1P{b#g%%$(2N3q25aH4L~)`7A0j&Mexu4KJSUr`%TNX%_=a zR4<2WPfsjNn*FvD>Z>U z%g+HUFl|@NOvyra=Mn1!>@j||mm~+Sl;IgrrAq@QJzr#3{J~g zWw6_qk@Q5Iq0y<%3TF30#d9V3@l>mzT8ehsPR;fZB1kz_35azuJuTr8EbT+2vv!~CWR4lmNDELTX4(CrT1<_9+0)8mk>Nx5($ zT?W-m%S4qp^*4jYx6OX%cy%gjto&-#E%@r1n{u$&aT-x6$exV`ZSu~Fp~q_5vr?P> zg8Wx(Glw2*nFs^`(EktL5dHU>tg(%ggZqD!WxbU(EjPuGd{TUd$o^j(d#Hkb>~8;Sxi!m>*vJf7`@$6OYHwr zwsBPJGuT|c6S)A^Y*=wB;s=7ZVloWoqf>EwKQaV8T*c#EV6ultfV_8&ZV`cbf>;+= zXN?i2(sKaY!Y~sqP4|;HH-X@+QX{3Z142dw#m*4*;-Z5IRsc+Q3UJO~8;{E50^|aY z{baJx68f?cr{ToEDO{2>qmY*!B8{q_gJs50ps!x1*OY3OI4!oopjbqoKJCsiuvF35 z(pIsol2e?#2XrD{TTFL5qkM1ap<&Vp!BI~KQ-T^Lsy zLx~wu45F}^$3Z&rwT#FgH#T7M+iZ*$zZv#Z%#?7#>luIRA1Rz%oue>x!;hJ98sJ|P zeEmXKwI{fZQT6d!dEP$$t^(+F4uXeO8))Ne z_zhm${}XIs&xdwzx74dbN1FeoeJasBNSD#Wfdi?<0Tn%vNZU%WDzV;W+@hnZmDlO6 ziGe>+b3c6@2pSN30OG&rX&}B`lSSQVKU*o2ViQ+uD|3RnhhH-uAS0JhwHi~W07FFj z)~Bxg6-k^=a%0hR7(#~fw`a!l@SPW)WZsOE+MF;k)$cMHd#jUIt{{e1f%LugpX%pm z1Q`TvyMLYxt{BPmeZB)Ft9L4Z^W$&#gtkKrwm(LHjNxviFQ5<5?uqsR>CqwwPp{|Y z!6mN|O}!9*4j0DBhRf@%1M0Cj@bwI_%>p{cQM}%j!zjf46WKQhW0Y^nWY;`QKhnUygr@$G|NBaJa?rPNw92(`6Yx$VN5)#c7;WV@ETC??TDBY{FcPN`CbK3l0^$E}tu zPqSEtAUspRrN5j46(*rRL{Q;2(849*My?-G^?m-QSKQ@^JiT+`0n4%hx5QTub#eX4 z%EO-Jn=o_wr1AXgAhfs93wcI|y*2kytbodb>5l1W)hHm! zRH#HiJK`1ZV85VJLp+Fie?ddki;tZ-2{hi#kR6{MTwV05c){LwV+9`7`ZRN*vihj9 zwnKuP!kRa_ah2M4;wUnwyyf+?)Hr^6qq2NaU;YWS+9XFzdy-*GjKVlNi)hL-gLuF3 zjj|Ocw_Vm9x2g-tV1LJqp?8Hi0)@J6E#e#sSWsMC{!T#p93#+o@b~doWTf<4e={H( zsO~-MKtkMdq3P{iah?K{nJ+4olp&X%iK9iDk;t;jSfeZGg(gBrATP};xXcz6 z2g+Bd*13@Tr6}uLuHyi%c$QtZ2(Y}?5t2=0myF`!Y^$QGX{V{Q+XbISU=DrR=(OnH zGpS}Aq9)yI4_u5;bZCH{N>_&goqH?Q>+Sg!$a>p6J9Y+lPGT<%Ur(>QLbtv4iKng^ z6>t`#vNE@jqoo-!W_E5(VT745uKie!Nco_JjwpqSP;_`PYR#9o@KiDSeCkAtR*kf$ z(($&j2Eg@H6ioQajSu|YA_1FlbfFeW#=b$s?3KXs{QHDOr})5GMHvJ`7DEteFZh4y zcHx#APnPB2S;`T>m>So~sAPqv6XZ0r>!NJ^xP(>H>$Izgbw*gn(DSfWNlg#R)O9qG zQ%Jsv=%?N<2zI_edhqDZI?wt(671v=nq~Pg5E{CaE(y*fWo%{llq|#dGavb~>o;ie z`3NtZDl{>q)hgFT(Kr~H#+zIPP4C?d;wm4*IHOxC|&tlnm;x zW?|Mx?(oHG`s@>LEW}GlPJ-BLr?CB99O4#FvE1A=FMe(RSq&#D4FBk+HflY$)<}p# zk$FnUAmPwH5X48oI3vngfG8)wo4(i{uzHzS!coq1ZgQP;P)y&ta9K_2EMWp7-xmEX z+sv&Sj6>UVe`p$SS@Qu+X|ZjfGQU&D#fwKdlSP*7H*DY^wY!fPm8WjUUj_F?cZrde z!@ai}Fouq`TgN{W?piiWgzR90ro5cnLDVd0PSIotVDHfx#H>oc!DJ=Tu2A^&4f!Ce z)N$4bylXS*^Z7pQIL`VgHU^Hvog$!DAU5f}(g3TbQ zB!*->*e0uPj7>VpDWSt;&Sw^nT-(L=Kip~cF`nmkH5Gtr@O6`&b{;Yk!74TnBcx6~ zfbwfR#yd+*K*c|5$#?3C+Xzxu!r$&1=S_KtZVt$W`g)%{V(RNnm2|H#y&8Hqr^|3N zT=_S^2Aw*6J=MP|Dh^xKcYP%@c$M`8*hIk4=}m{209A0X3)A*BKlTxw9m(lf04gcC zv)h*q-)-^A!GTKV!S30t$2fa^gsCx%ALx_OQ<50_asuW-Hf*BltV4lRAFGZuDx5x- zEV|p0tX!I&Sdw~9df_UXY7U{LXHN(v*&|t)_Nfzt_$czU%fmv*fL#+2K?=(f8~a*EG)isDX?QRl)s;uYlBugiN%#r4PnXuoK3E)+Ent- zeJ#}l%=`Ik-e&{K4sln@WumCwj&D*qKNKP7N$@y5>s=)(i#E;myc~~gSumlL7olfx z0*a-3Ng16xMK1TO#BS}5$hE8v-v(~YDRB*YOVIw5b^`O1N| zyW?|lHvaA!@?)|n(B;y3`MVar-wiGH^*iD<0Q_1RZ+!37WTq3p)`t#Xe;JCBtZS+^ zDKwpSC4{c1v&M5&g*AnLt@Z~k^EJPf)Jtw$2LZsRAH74`aMpo8>p#B4px-d&M$Ayv zBZMkw&0kHM*bo4E46Y@!oQ;pn9=zYzyi*!YTzq_K{NpjjAyY;t51Qw1C=(gyc|M9MxbiTOHI&$Yx8wblPem;~ro9m86aN2ntW^uh8@a4M+EpHhkqgoZ)9rpYD@lmo^ooQCCNr)YlK`Fe*9EBea=f?W@vD?*q$YcI(@z&4^6K7wCV*HBmA{B9b5g01f|! zg-HH;T;u5EV61QbpCL`R>OYB=-snPHoM$v$-CIo>$vOI8tmKDA}da_~l2Y0*^NI;+jIaM__)kRc_SXuJRA<-(ILP5TSb zgEyJPJq8o#PhU?s38SvK7G6yU)}WSTIzxby`}|4e|5qj|mA>0lVf=4^EUxc6+Hc7G z0+%0nf%-1EpDXO|(`Pql!l2&+@}Qj!-dLIfI!w)$a2KM&xg*#4YeE2Ra?AuHf{0nk zDrQ;I_`D^Fp?|(9V693SYDiS0o3!$qK__1+{6~FDL#hXSzhs(-odXc!*E_-l>x5Xq zHNi-qJZo4@MQD?unQwq->{+@=S18(ac|r&yCVc6FT$L~sKrtErJzg55 z0^$f~$VjkY^O$|ZBBoj49q3(^*p9T6Doq&ZHNd>vLCL{HnF&eh%1!}XhKM@!XflED z9H_ZBqq63*VRU6k|Ng6budSWnVmLR_|V#5|uZh~d8WZMIB+o%lb zK?=aos^#}u*wv)mm)akdP|o@-eZ!{$wGxosp@eT~%2yd!jW->}u&i7fE4DF$+wUDd zq>dWvmW@K-MNG>TC!fCGT1kLu-QBGvt_8@Ev0PtwIOcG@XSy0Lxh5M{9av~HK_D(* zZg6|E_8IjaIqAkq&@C}qmVaJ7k{YY>?);eplTu?e^`kvBSw|OZ1$Tt7qcz6)9Y9$0 zW|i$iOfLZvJXmM>ljAGKU@oFpzK!bE-gluM0bIlerHJ`ULsQL(y(qQkvNaFid5E6! z8J139zA=l@2>Sr`wFsypryaz^9}Olz#UXUP-QVmvyFM`&#VxiDv0#(qeGMK_tuhJU zk=>MF`b0`Z&fJa*)pH4?;oO%i^Km0YlN0H&yxSscm-{B!^4Ur<+w4XXv*0n9gvJls zl)gxo>87OTTTANH(%U7!dO$$9gAl%DZ7Gsz~v(HCb+kB@?!-$wT>soSfrHJ$F8`AZv@ zo7Om$Z6QC2L(V;iI36<9-J`Mc9UN#-H9J=!Rz1-mHf0{A&pi!w4O6!u+Ke;Lq`Hl1 z87r3{%9PE4_X|th97Yx(s|wN@%Dy=x##lMc453#$-ip+fppz@yt;Hm{a4bIBUfNxj za7*~Sctt=j8R3OvxcTKFlfD17M{`)}_VxZ#nGPWSJC(`MO5f3u+Qit{=s%LqY?Xf< znhp8~>lYFQT(8tD#m4osVXNcvc|p^^8(2ERyUjYlVlmpLpVnpY<|lL1@^5*}*^eKljBH9tCLAbD&OIu&pbLMkAB;FmH#Zk#|QOy*aE zT6VQ|AHqvbr;D@DlFji%@p?+aUv|uqEgj515ius4kmM?A6chN%q)v>`8Wh<<$=hQw5sjjM~QG*Fe#9VnuWDL;Ylo`X6 z;Y7s__)y76?GEdFWqyGuM~x(@v0P~%9Qv%W`2cuufa}H#C+a5fGh6v=d(Es>tA8zH zHuF=9WXg9&C_>~2oOb_pHwPPcR-fe)Q&Gnllp{M2=@PQ|?g`z>sMu-mcvg)H%32Be z7uZ!bsD2%so4Z~j0;?p&M+|Hyeacf#vK>gHpQkPrj&|}Y27V;3VC7ST!StFzzoZ($ zl3Kuk{b}D=PIXIC{ZW(SE(lYH^e98yY{YUOp3BPFzzlh4QoEG&B^Se;X~E2cBVIL~ z(9DZ_&v^W*#X`~<7zI_@C6fhP>@*l|ae_#;fIoNV%CJ>Ap)2OS%wE!A(m!6g3!UTb znF=hYk^pfyb;LOU9b+qZNykstt1|3|=_T?w>%(+Z$Kl}CQ?yJWeL9>WJ~=X?$exArpW)|}Zf|-RIS=r=1S!CGuYR|PmsRB*C!uU%#MJiX^|9F(X<^th>Xl)2mTUhidJ8I1@y(ySIZ&vu<*D z^Yt>A(N0m7qD!Bhb%}HT>Tx8EVIfhKmS=`%#$-T-xmbko%mF95y`z4pP2r0spl+Nd zD3z3MDqEy&IvREi%!ynUD?DTP&q;B6WC*euNpH-D?V8x2Y)uW%oZ}Lyce938&QGIT zYe*pMuBxp-=7$6!(R9mC9dKokh9tJ_uBv@;^pyS}vlbz<9}PW9dEZc}@pQ?|lqm~W z20V6CHKw(EaC^~x-L1`%cB_V}54RaA0!nfMMMKLrL{sUNl1nM#{p#g20*cBV;Fbw# z;Cc8q4(zbQL~xss%>xHqM}_W$v?}K|H{LcZ;q&!bBdf$7b%O|cdm0_I9d%;owu(yQ z;*bxcQbq`S|8|Oz!a`ADAhgyNnBa%AW`A6yH$J^4ng(i<@>!Yk(_JAN&C6&Jb zMqX_SFm(3{HJMjelmF+s^6USjNJWutE=#8X0I)Ix0ucU3k(JGmV{IM zbJn>_P3wv(rpEsF5hf~2LYkOK$@^u;_=fKWPkgxd&-+Bj*ggkrv-V|=yywjv;aRru zaIGh(l#;c1XVJ+E#Z(xltBvbz_OyTIW&dV>Cvtm_EIc$YPb|cjKZV+G(AeMjfUaFrY9PIw9LA>yx zSJ-wT$GMwZIr1jI0}@g2qD8#)AszQ>j z$}1EBbPsy*;XzPD&glI)UWd?J#GI@F#pzE5_6QXQ$ig=TzY8Kj2LAY_R00!} zANRzeatLF`6ff-YD83vK+r)xApR8op-pWn!`5f`u5AZlP3}-*A;ve$>q6=W#_>^~d zg(q2H7$V%nAbt~j`stB~`Iuo;Q0Oy_YlsCfht~SYjTvl7En7vX>hsP5bvqt2hLUDTtJ5f2C^OI=Ih44bNw9!n~;=d2S zD=N}(Sr~UkV&S&%YNX(SxT^cTbZP>0kq}L{sOk-SyIL?l^z_5oG#nsx4y@{)bTy<3 z0oU7M`Kmt2=*7I4>kk|usQ2iztv^hY2lo7rG-twW*!po*dgL^uJ6_P?7x>(#=;YIv zM=%IKG+H3I%?wqB00zZfVIqm3c{CwPGst$MgsvZ>44W$gMJA5^q-&3z&BHPH2HHEmMF)gn`bOc zn|18uW|h^z!^@#U*lvVmM}|pruEOfGPi$ok0{Sik&v$Rn*FvS!C0%_GRGbHW zpuxKC;Z(Yg4Vx78-vd5!2b%T9__(a#T;8ZqU0Xkr>EW@oeM3IQgBL%RGS}xuV)EDN zfQ?I0KyNA{o35u!0q@P!q*yXSSfI^u8Xasxg~3iXQ$%6I4N|XbyFj6_50}#P@R2kD zY+zh|4fdlv4L>!0K4{=FzPq1*tTTwqEmD+o8a0Q9=I>b;(iymqY%FApR0l6zjH3LT zT!3#D^6dotfU!z#4I?3zYtNoX?vi+cMBXRfc*N%a$2d4m!~!ikwzMo=5p$6~tQ2?* z0SkySs(|Wr!yYROY1qinxERikgU;=HhCS>TBH~vj1G^SU{FjMF1!u>{4GuhG7`KxF z%)$vsf#M85iUtKBDmSmM&lEo_DXu4t9>Aiq!Z5`8onF=iNpIJ8S57EdBf){mWr=Ea z>mj1xtl)G)*AD~wkjyAL0BnBcMuhvXfvGg#QF9-H6b!I%rH1;>8(WsDeVoIz+8YRP z4u0shWEOEC5zg|npw4@n5c5-9z_t&QIHX>-yS}xmzPo}A)YDv@;vn~Pus>>Sr#kdO z9UP*ae)027?(J^xZ(UPk!yGKiPOq*ez;p}Pr`%u8cX5R`A$bLw=1Zsb%a(U5m&}2` zyG7;uTHBu@(cNi{2$%5AwbeJK8hZ#S}InvGZWf|@>-ZslBM0G8*f4$ul)2%Xjf5E8si&0Da2DKB7^ zobkICyoh}@w)C1gI1_#s0B*im_!=HIO zr2Tp|jL`xDo3WUI$Xv>i+g|fgZ;4(Og&SEW-C%>~<;WC{DE;R;grxHvJk(zt&z zM&UMOQv~c1Gh8u=hsF_XPDvzA(sQIE3>C2l66vqW&+Xtv@^cUueV+2eWPGZ-&3N27 zPfn9bJV+wiX5z1vpJ7Djky&cvTVxh^>GM}7c!@(iiY^TCh^~mJ4*8sNtWkyqJ25Pl zeKd1;@(gV(irq8P2~xD%Cqv+ljv}fj4ItyD{XTBAed&hST2VxOs+DSsAE(i{Flr(j z5w@EC3--xKKn0*^c=&S|Y(0hnd-(9~+SQBXa@;@(W3Wn z-@mi=0AJvLe$m@h^o15BX~5+wMc1k5sTNgubw$^x=+6Ncb<0(Xu0m0ip`yp3Zpj2f z?Tr`~KrD_TKEfcijVA?2i58Q2DR{hPi>NfNU2T~4R;aW)I!koS62f0<6SoZh@r@PK zzr-xaa4QE)5rND`ks8B4Iw(`yADu@4^O6Npmql}uHn+9WJ&mJ-Fab&6Rj1StI zC4^)*Jt8xNV{|+qDch>jGc_Mx0nu}u`knme=rr~~kd#iWuKYU2Q z%(MGgIfpjaf;@)hc3`GD+Ha$Np?#;FI(?l`fP!z_TEIS0(1*#~L!X38bCl{HhGSb@ zr>&NQ2u(&B?gTYmh3gktLc$KxaR?$1G}_UGP8}SGj0UM~KpHIPpm?0pQQz2}BLCEc zjI+Peho0_y68BGKG;nW~u(L(ufQb7@MC43Seg`_;NkQYb07V8#`kN?SKu&vrc~GJ^ zp44(Nquy0n;I7XCJa&xE-?RsP>JWTEQ$O^i+6_;45v2tRVs9K0qj)CI1w)Mz50nR& z(4eu0kxlH0n(0v6KC%^6-Vit{WEsvxQj`r>0U_=+yW{u%09(CYiVVI^^)zHtuv% zSQiaft2vjK1eDk4iks72QnKoOT%pvor!V$R|9^rG=Oy#qQt%YIod+SvEm4ZQi~Jd? z(n(}i!wF7Icu2vq0TRUHSmL8%Siw zDa}_;I>A3+d>x;KBD=&PL2sEX8N}+KphMOs413dp_=3>ET0m;(=^5zRv20`qq@U$! z=SmWl$kPs@BPdWuo;F$E2?K`(JcD0ZHRd8Oy@|yJPM(RKVD|!gC?+%M%E5m=Uyk#B zG^y2;SIdvhjgIC(b>UL;R@n2Nun+89YL2r|NJhsaR6W*BXXyB%ALdSk(>#@Uk zWS39`q}9!vVxBPm0FAom4pFiJw$+bw)L3h6rI$_wg_*QT}>GmUFzAg+Pn&Hhm+|lV*=P)zL^O%kgOu=_Tjt|l`LsA)h zK2pY`C%4gI8V$PkVT(_my(a8iuL(IkWs$K}TMV)N9N^+qD(v^xu!+~voBoL>`A>0u zJ<43nfLXVgf!RwWLmQp^hVg+}iKmMPyU%x@9?IBs8OF2M`!BSl66Ec#yRUb(7_Ew1 z!FPG^eDB5HVX%g3o^a)o;)i_jYeX{zCa_?j&UrZX@zGg?JN|xzCUkfNQxyaZn)&Ha zZ?&zSW_V=GVkNi7y`UTMfh_b3VY>&phV<}4d%@k4!%suzXfSZafvnXfzOrM5Tjbh> zzYU@lz0F2bPyz@vtZcbE1^TfdSI3yfrOZPvuX4Ooy9UiFXID;SEz>RL(+T;QSx(U> zU07_=EN3^me=jqk4XPHmz~b*t{t8pvyqY1@f3QkD@$ds3=Oi7)YGJ^&26;A5ig=n0 zJGz6!GQ8WB9^fXDAISW)g4MUqF(B72myEmOd1APef1AQ>X%If~5ac+`F1x6@;)5bO z=I={F0z-l6xX7Yp2%^_|3|5}4}JkFL<9tfPn_-S*acBspDc`<*iCKn)i;pqMoP2Ow|@1_h8Vj#@#t z3&6jlO-SUB`RywmFC-$2zN%+BW+5KTgPztsDMmxL0~LNqj6xuaHLI9;G){`-cX2r& zw*xyctg;qG794Of_-Rzluh}qs$+#hE^&=JcPf{WRqS~s{I?LpE4vGeEy-4b#)e&}d z(;`I;#IiG4jLlsr+-PFCZ_K{l`OtIP&>ofB@!7YcCetUS)p9Y1{{V+SdNDBoHl zwaQAFs|ot-@A19}biaB@m33b(U28$C)b9>@r3Et1p(lA|QAAE^&$~h@3*dR$Wt@i# zW;OfMT3(pB;u`vJA&`1oWwLGQSMIa6j#_jX7av(E~s^SDpDbhg>KxerF#zI)FO z>o-UYyz0=U232s__P1E!uSgOYpf1#(LXVHT@kJr39*?J;*d=-bBh09VuV?LPjlyQ& z%MM$R)w5TFy3QSVkPK+UPF*d}6w=~|%TahaDqRG0I%CqDCxf^vCI@`Q^rFi>iQa}u zr|@|ak77{D)1tnZ|C-)LgOLF3N8>IYmC{7d`&lyKVodlhEXyMh0ApNp26|`J?NJxq zS%QTS{ZQ4{c>w{SBJUPNrwk~zX-pV-gXAi0EL4z<;v(vv#+PmWR+VAcF?=QBQ_BZ? zFN0PY<)vWzG-f1jWYKa`x}ecfYJAtA8Vr|AX(0EiG@ED`sWR- zv_K`iYO0~vp5#^w@H4C$)93eV(W5;SN)>^h3CrBl_=QbAEgJ%M` z^XUYyfg8w!6k!2(rPHjBVi`IlimP`n&%F_+8EZkj%Hr=B_T|0e%<#+|Ut<8)1A#iD zEva@yxx!fAxu;ekG+vD7(U`q4{qlCeylR4|dwhUjr!alZPRN{+7VWwS2c$J z`CwVxX>ZBz23|vX$F8R#Oy9T^V|?@33*#u z?mbGmn^1#l?SA3wjokBWtgWrZSd9!`vaTC6w}SpK9mf`NLeqIId)L{0rNwVJ&^oo7 z!%ZJ<-9duSf1XjsRK*2ATUy#QW-M~*j?ZZj;k^iEGL_(~oVE$$)QX4+-+Yz>V~ZGB zxl9912L_IXx~{MzcpB(+^NUXdbY#{3;eerAtyi2A(DIIpaATRx%JMt6sTOw=i(O}w z9k%jDpLGFO6Yz;+g;QC=wH<;g=~039m~q}iop}yNu5~t2_jb#{Zu4f<4nFTz%{y2r z=|_enT{}<8wPko%AGJCvlebmcF}IC1&fTSwr?fLvl~SbmQz6$Tq_a$#W@0%*yx>p# zKcw>Kg;`@Hov3A$AR`@$E*ltw*g7wq{1Wj>Q!M z0O>P~&yd01S+q$6<~w>gD&>izboXM0gXBOJlGIUgF+>F&6g)C?!wwvsiw5Mk;n{J^ zp=Cg=$xNIC=sSkz7^|{?oQm+YXSzxR66FdO#axU72*oxdz9i&TH857pn|gcb9Ahuk zZX~Yd>roR9r%7wGi;b`T35n)a{w$c1=0~0QLcOo*5CPD>Km&BuKfDy+DuQjtgSa@M z+e+7lKQLErypUjQHy~bmnHKDE1g(rPo`nO1qn{YNrVGJ@KoL`e7X*b$yE`nLO3rB# z`gfxS>Z!71L*nl_*MLPX$xkXeYP}MoD{x3I`?lNiq->n6*JF8o)!-Qp6jm?0_6evd z$J0@a_Z++3XK!9UJ>1)W+3mvWwBEU`c9(yfR_v<8C4JZ`!*giDzB>8>!vN(|Q9YgA zH3=>e4YbJyZirdTikyr6^DZ{!$$UOX*>p-q%P1K1*kJjUdgQGpMUu_TS9zS2e0v%W zh3pYD(bE`&7L8`utQI;O42LzTXCdp~<}n7CqQ@J|x|_Zl>4-^JJ?LIvYve<5njIws z%1Yo2rLs|1{MYD-Gj&9|)spBs%B+fu`T3V}8@iWV;!VToI7-HyP6wHpRHmd5ZRiL@ z-pT)h-A!42rde3yH3E#Y`}#20dwIAY{I{=L|98;(Z%1GL?{=U+X;kpH^3;DX1%KOq z{$}?eXnhCx@V}*C|7EcA=GF7Pr`w0S!C!a(5xjYYu>%7SEa1p>{nnPs%~i|s^CcG# zr;x>Mp?>XO4nPzTGt!I!??lPCz!*uSW?oeSB%0o_-P>vNJqtWjbgpLIysnFxnL6{kmsQ-# zRDhzI=sAm(E)cj=$>*xJZ?l_M;O#&kKm>gW>Pug<{F3L}7p}qO)y8w3a8{d{Mjx}@ z)Rtmb#V=jT*}buDJ?AlNa;4QMHCG7V+WEfVGe8ZeRK@N!rR@%Z0X5c~=9c|@9?W|> zb6AFOh3K^B$BX8xFG$VfYs=Cyz$+!DZOU}x8fPS~sMLcCD<9PdpYC>?CwW{e6AcC} z7aLD9&h|~Hkt3GGWWqN;+g=k^H<;nYAZA)4gR1QBKo1@IlfLHo1PhCcYXR#Y{cnYU)rFlT4$wV-JG<&FB95$_%MXJI1%<(yfP=nfN3Fq z>#Je&9<5$Ib-lYhrp!0I?c~ztiVIIycFF0Et7z5UOLDl}yP9MN#lM~O^a#@7ultuIEQF3x>b!!~HWE{Ba2p>6+ zt=l^8vekc@v-v&{VRc=#>sFm|Rqm{-W-V3(_S|Azn)K{bRcK4WBMnS$uH2LbbY(Qm z6_w_at~9T^0q@;paT%roUuQ{i+&9b2K4TR&8)Ul<9K^-Sw9ZSavK;(d4!x=wM!s4_ zoUzd4t_-R!HZ$FLN)q`Ro;=O1(%u|i*XWpYY|Fn+$*ehsIrO`D9XRBV8(&P4jIU}_ z=9cNWNQQy)6eBcJ(3{*wkzbwHod;dU>Row+iQH&tO^c0V&vNjp#C*JB6`JMi;*WOo z6#W_{IWMm>#_a3qicSxk7oTfu&X(=wTCl7~O}*4}oh(XcRCZ1Ax}wX5TYQ{y=^NhR zSfxL0o1nr0*`^~hI%2S!bBFHrFdeFU2W%BneYFQ{T`0Ml&55i=EH>CR!g0B6KD$9U zi+QU?gNo#;>`y+=+M*mpXX0uA?@*5BoZ5?19blkKYydC*iI^oNCg_87OpHcMp;&TF zZl#X=2xr;U<{A{E!f^?dCNccyTinl#Db<&hm7|f?AUVRM3jng0rRRtpo)x2i%wQnd zL?YNK<?NADqCN*#e(dU@sby^K2*llrckZP>@&X!Q;Ih?+lk^TleYy z{$KZY--YKBQ)QV0BuXW#K`sj2%dx1#m3RN#UjDCW`S;c3hg;uwKdgi@SLcFmug~8y z$+e^^ zv+0PHOWnmY)++Td0Ml%u)qtXeM61rNe?jVT;Plg&SXp>^T{WQEH9Vulwwt=^LQ&d@ za9ze2iykx`8aFKX%^Ogi+s3enO>EP)* ztU{a@@?320aAs|wp?Zm24m_lf_2%hUO1Ta%0?O{2Zb z!bF}n4BpwVmz%T~7x@a` z%4>jgC!S>h7Jo+&X_7lXVVc^=0lrgYn#oexF#bBmKVxb+CLS)SqHmDnOFHJugc#9j z`{3!`9%eH_J-IEhae3*VjtB4+Z#(6Z7Z1})DQ!+nL=JM%QU|#4rDmtY0vzR)+#M6V zeu$ecJFAwyiXR_*D}Iz6mf1UN=pV02t>GWGJ?`PC~gMTeQd9fB|EQdLA7tL-iTeIHPjF@MBQMZ4u%ol7* z>@|OX5b7Hc*8uSvXe{KO7&K!l{AuG1cY~C9>=c`hi$4J7Adfvkh9*)}>jzdjEgi?T) zGs@z5fHuZIX(m-viRt)soSri_WdU2+>d%l5f6mOYg0>!}1d7}Acl{xn;T-Wwpc+Gjnn_zt(UjAwEnaoh<~{A$IKGd-(c&sBWANE*X2B+YK2MBbL1OrqhD38^y2K zb2?yd`o1+4odxGzNw!ukUEkKOBujLIi2eer&~?d;!*1zp6{A_(?l5q7^iA91(#e<` zCZ0Y0OmKUTL^H!R@0b|#qvZIcbQh~;AGsampz%eS26wK6#CN^qZCK{AN1MF)^vMe$ zSB<$`h34LusEfXSWn~j}4xZHNA`{G-P$b1r@`C*R#q-y%p5jL-KmnHlejABb7OpK5 zCoKq6akDAQez*i*&8&;~yeoye{C;Mt| znUN5dUO-cd!V}0Vmz|{6D+ASMri;-qoAhyZV!KqJWt;F8jVkJ@uDDUt!<9$$?s2R0 z-a(cVjiJ*LdzlwEpQ2WK z3LZC|4jy{cZu3M$W2=4t$=q&`s$+Q5i*LvCpZsud&VbtCy{wCZ=g$c(IoGt%!VNP+ zUz^Ec9@Ni|zLUw58!~vCxcFKSCJ8KXZ8@B*l#VYnVQU*3@?V$Fean>_J6WD&_LZGy z&X_3y^&TM zb2gY6oOmTLVLbP(GJ!mEhkt(}0`MpS8l3=2#(^2 zb0OjdarO*4j>mC^$@8YTCj~8GoKBC)LDI3W;eqh@^86&u92dzLvA}GV+kS&*q82Xd2L zJ4g?yTwIiLrcqi!jTOKR@fgilc{L7SDb%?Wztb~#l680Q2PeZa<-9!sC= zLeHH>VA4r;V8c3VbOw}7uW|bIr!kosbEN*Wrn%Y3XEwbq2?3WfK7&>{h6>_9Pud2~ zoa_Q4USHkIyE9BB0+`q$skTSBd_N0V8j$zcimnzz(^?Vu7!gc{JawY=h1 zs$y`DF@|CoA9HSK-3-`_HOL`!41-`MKx@iNE>4E+M)s*Q zz4%os2k5{X(B^aychfPd8rwe~kf%W>c>8MaK_s>6kKwuKeZy+2}m^aqIi!K~iGXO>#a6qR zf5|;MyXAy&HwCJAV*V`J1mOt-WqS4|ES9EowUHaBmduUmaCX?$#J_5bkeo=XgocDs zrMRjl^y-$wkfD9Wr{~Z2{<@3T_33)N@Jbu-K8?HV5#9310o?svC^;eOuG1-2sE}h9 zp3TLv;hVC%XZ*B-M zxaG{OvnXr6#;)_`-!rwi4>YNmfyrG!dn6tM_DBN7X;+?dZRf_(kdk1stEE=nV}I?TQtIq!H1&h6<6%hlH23o|f~hvg_1Qa*Q#C z$ozmgh|yotB-z%w_$IypG%)QvV*p+3PAIZeX=V`Roa<7~4LDoJCL=On(Yz30@QQX1!a+Yp?1!B z*j?9AZN#(0-TG&XPKKxo@XFHSt%R>a)FI#uE`r`Pk9&aFsrmW&ruX?-u69|1TB&BT zcq3d&#%Qwb#_5A0WJRXU^O8zlt-=ViH8b zuZM@Pf?s#HcW^WI%kH7(Dsb%gWNYY>VTH27pmIa8s;v!zlwdNN4`6%Z!r|=&szZ9T zMB7BNGeiZ=iOLz_-6lstoP2LyKc~#lF)(R$%l(PN%vp@pXSL&-hj<&VI2LK;{uN%4 zXieCcVTpac$kP&y=EGgd(QuN$LagEEY?5iunk0QHn~&r= z1-*l&R20M1ph0p*$Mjs>wqQ$2)8i+)pn?Kon2azL)V)r9Ju=iK(WFo*{44R2vIE${)Evp!ldo3;{?g&z~% zH30N|w@)gj2ZmzlynWTB>1s85=06O)WH~bPI3+g;%7~gyf-;wm=m(^7w+>;If45iH z+QIGB^(8Ozi>WY7`;m;g%3$l2=Wu9E1(##n!H+)@|9PPuns`Tzo&r?k4ml!dS*AP3 zQ6taH>0~lY&`cyE4B2;DbR83`i%xhR+Tc4{u%T_U_v2#ipl+yp>EN=&Z|Lj8b_l77 zPx`|cbdLfSWW1~Bd8FGmYYuB!stdQ$$t;M?N_79borV)2m@Ljy7O74EOAPb*Ca-a2 zZ4zp2Bgg!Uxb-5;*EGu!IGt3j-zLK5eKoGs3J}D_s(oJ~HS7$SPhvQ>c@qV75MA=x zi}95Q&Ovm&85Bw%Vjbrh=4DONX^!t+$@hSZxTA<`-x^zQr72LnY=U&Bc|Q+2yyy;a zA#m+w;>konTm*C~IR$VB<>Ba1a&5Dm%6rwN($CXmI3TrvvlE$%G_tUN0c^wX`Eojq12Z@Q>9Sd3$u#4gy44kYBPMrxN^*?Dn_?X@`Cy%mm6d6}jz+`I zI4)L3(RdmSSK{%CX$DIz6O3i5k7a`qg~uC{?*st6aigYvym?bm)^3-THFhXqA14@< zWl&Mk_6geY3hSnmD9Lh9c8J)(G33&!0{MLAV&nRA36v_yxDe-%C6~pLLmV>E3d={K zSJ2Xgh8W)PMUlnn$h0Q#X)*7bF2b z!gXHI#W~8!xlC<&(^)(P*h}VRUd{+%Z{N z@^LaR>VZS;PPi3z99o}Q5VLAPIadWD+HCO+*oh<`i&14s#t8+?31OY<8tK#FdorPS zkxeX^(k*zpRDTD;WcGAKD^JRD`1>rj0tw5~iPZ#jC`|~!mCvFq(G*8oR3!E#dvcjYxBhOHWE1zVNjAK287J7*lla@djvZq`4fDvFp&?Yq2sInR-iAM?4EM3|%@Hdm;D#3HBdNway;m#-f^et?%CxgZ{b` zlaNmG`{|T|;HaHf!>ypwiOoOZ&?$>N0k))|bkGfCqBTqbTn`&+uYJ%1iomQnX4~V? z1z4@rV~V1%RqnAijr2CHnnsy~4tce2ele^qw8n72&TSzo0Tlem$=UJK(KBFI7NZS- z-tu**1PvI=R#!xkN%u3V$wI{Uz?CnvWd=nfGR$`xU7p2sq);iuoiiq_?kLWVW5N?x zW2sl>ypQ?23ZM@a=xb(n)+lTr^G0>;%pE#=SrY5KTRi>X##=}E>1)19eSRn2h@@N4 zJg~1yUXOp-YJLA{ap^CpD=)5vtRuMPEysZxN4(MDG94Bhwq#bdpeH-P1}*FbL8Sq2Hk zwzRudHgPytRSb>RQH(tvCWrgQ|o;QZB-j^ftN1eYEt=u zfUHqjM$vK7haRT|o~234G(>eNujy^Ww01`G%njIu&uCh2)iroljfGXNk`JTGH% zo>OUeNXSU2Hc~WkfU+UMJXp;ZiZ$2`#j<4WTDSpOYBDG$2z>?TMT&>ByQMt<9)?%ZMve-0hnY2a?@Eo^#sGB&}y<2WcNhPi$=DcY*Bba?OBH_sB2w-is z+3d*CPg#XB(bm7U{jp+&E(Nc>P5dEoGf5J9DU8AQ5 zu-osS&|N*zLUJvzP6gmGo-RNMc#bdD1>XK&x!}4$dP+(A2Kta|Z}D1+;K}SqoP1XQkrH| zLWX~gN2@7?u3y008;S)=#w8M4jI>&j2t#Msv^F=E)7n2 z#*=B0(bp2(wdZO7)YjsTFeF%%&`JrLPE&<3d^0)DKtQ>~#MgI)EB7#%1;#-;K%UNm zU0jG6!d>A{?9<+8!q?lh^}E8N$ko4q@Hvkz^@Yy1>xo3cHo#6vR)VqT;Tw?;Z@~(NWT;gRp}FW~nm6 zU133NVHaJ&2G9V!@GMY`%fLHYF+TXZN@KCg$sZaad>zGIHW@~Pelk0xwYMmSbWZKU zlr^_a&C&UosHKCr9hk4~3fv|;xY;YqnoSXw$vhtu6m#9I9GIH)0%^Of8Mump1U~Us zd9O3Z-$K;jBEBfZU%yrp(88tQVgXld(0W~~o*FS1__O=!_5R`h)BWcQAJo1}th%z+ zSqtUdS1N!1y?M1-dbLzG^qF#~@_8L0M?X_k`$On2C>uqkn?RLn~&3`f@RjOW4axZ5{yrd+&pO%-2RY`DLHQ}6WlpWK%J&GYU z&geF%jmN9r8GQ`a&U&qRM|a>khPJ?zd#8Lgin3SqE`v&N-@H5vACzwOlqO(I zcY@Ws8>_4E|KOJwha?We=MgN3Mi;_b$0NBov(pY>6%76n{JN2B5Knc2(AIp47%ijP zm!(5)Z=5a@p6y^X1+W>WRY?#UJcurqK?ZNFa^+VbkVlbU3*XpjTW0YRhZ}X=5<%@3 z{>X$S+J%N8^HNyq8jqv{pG)%^)-?O3Dhru#f|WOcs2NTrK~r052YG5(U0X-062syw zfI7Ljp<-wy4wEuM!6^6JPzKZMacYp2OxbC_KfPk1Y2rMeKd)lUCMcW6@Z>n`o6vh` zbfQV2?!Yk6Dr6S^pfaB~f(?xFi-*pC>iMV^*=yeIiQ8lTwp}! z>I!|<%JGr7Q@=rVUN=i*hDxxdP%qIP)IEJ^4>E$SYKq#Yp=dY!C;!HIn~;2;)}RH^?i)0 zwj0L<>}4bTsyPAAJLP4oWI({{l8%mtZtPC!I#;)3jDbC2b-CmSB;&LbynsoIGd8>o zC0>DdX}Bf}yl;iN9K&uHp7aZ&$7x7i{2KGwI6{X8!*N(PL{f@PG^kK^-Xk?YY9@8E z$d(+HpjH=8F1nX!g}NMjeoAyMi3twQY00OzTU&&HH{#FJNaErjQ4SfJ;UawO!@Mf z`@dx=M1EWN&A39JM7h$FN*kR**<~xpCotcNBlNokgm+)R-haIje3zSySIm6PrA5!bYU1AhqsIK#l26FYxYCK5Ld&4r5{N>GM=MIbfQ-AQt&$`)!)eB9G@d*pHXWMZ*zC2hegPv0IY0>QVmjdNkiVj7Ae#;=J7iOzWr6CkVU0cw z0F$v*rKiQw@&j4Hyvy$%M!c9v$aZlfTAWOK!=xYhiL64@$-De2v`HqzRl2qmXeC)= z1Y&0^Sa^f6OM&L&Vk7uLu5`NZVQA@w=ti)@Z@oauUjRp-K*xv=N*iYGd>4D)4y1lt z(f4@n5N+-nrUrXYcMy!PQ(jP16_@XLkE@|LDgP;5W6CfX3+Q~8=~UG_G1?5Lu+M3u zKLlu3c_faj2#*V}*~I99dXe)y%}x!(sRD2$P0d22Hp!&NM8TEFlhH5g-!!KrvMdH;wsKkv44}RT$8ys%`{CxL-R^oYk zjD8j+nEadC1EzVNrjx)}qu;*b>5_K>WT!Fi8fjxDk|pnF=t-<|mZveD*LIWzu?ht+ z%uLmMdVEZ`ziB37fQ}>!Sa_V{%tX65lv;t1j>XOV;2k>63Td*?Al;GzJH*vDub(-9Bo3YDM<48I-dn7N6JNpC^8G4>Ioy-st~ z7%Bd^lxI~2W5pYobB)XeD~w30HntsX+r{U4VL6tXSGT0RYg4INPdQricgwSZuq4Uds)P zG>5RO2K{eN=VC4ijWODqM7;x&7$@EN;}0Ih{b`mImn9SGoqEF~E5uIF3Jl99Nc2te zfVw))t(%ulc{=i{aSJQ=(73Huv=<;Pl@Z5BgJIjWycH}(b%0AoaN57#bYOSN53lIEaoToDZ;|QC#p`ZXrXL&g4pPg1%Kn#9>Eq z0rR>(u98M+Pub@<4_#(s7D_x}-VdA$SkhL-uA9r;pv{0}Brmdbd_26=wL~+aBZVpY z=y@7A9uU$2ylKsL;@{-B4)wvZiJD_dV{kwVp=}mx8BZD+9zW_m0@M6~89Vn>K_Ibd zYWFd4B_4jEiv>rOcQ-*vE}Jn&dk#)#Ef9F$`ijE+-Fl6u?N`GyQ)f&k+9cM<;-`RB;8 zZ7ap$Ol8Bv)O%j@3wmiA4iT}2O1r?$TZA%Q!l@_!Gd-=(-Tb`Z3wJKM^4MM_G<~4moQqIL z+~VoA62)2mB_lX?80*p(7l0cw#d|z^JyCqFUQx6pMPNvBZy8XxN_3bs$96e;4Z@ZP z{<7VGrY%VmJKq5mE|q*UT^fNUGZ~Y(H)2?#Fw+j2gFOttxkBSi35WIRx8?iF9INB| z*X07`yBppx*YGiv@Y%Tj%B)^kbHFvSHuG_r)RvX$dfQPA&z6|ZYt6gq<~^UycWIU! zC+J%`KLghAj6(65$Ao&uWyCqK$wjM_yWvN{9~@4kG9XKz+kDK5*D_%MOS80>2=G+9{0-LdrWsM zu1L~o3saLfUs#uk+R|EOoGFgsPSy zy@9#v%p^R}B}eCCzJ7!`iOk-}1QMfAGj60(%Ci6>15wv42A=aKc}@ojbQy3saJ~91 z(Hmm!6?omI2%c$MWG}K!uqIti9&MJm6A5mL%)*5+PnvkH(HmW+E%W#TH97?%bSEu? z3k^~!K-LPCVv{kNNU{X>%Q4wG&Etmy+Q8ft(sMWobHz=G z4VHZu;&5Tq&|r0S^*;Q!86c5=QO9XB6M|ks0Z4EB)IWhb1~$fYG*I0@17aI@;+!aH z>d@1pjY@hWJ@lb)13h%BJE99;?dpt@i6b85gILeO@rE***p!O4VK?A>%bPb1IQq%S ztFvsD5t|$Y$Q$t(r4;f~ewkx{3=@x84Ti07sm^lF*e8+-zW*Xp>{{08hA< zab~5dMG6u7^kNXl{BqPw(N_fbF*1TM+(WF{qWa`=yI2k)s|TYRJqSY&+2X6@NQpl& zUJv?GcEZ~0P|z76KA%H6qlC3{jUbrh)ksR=U;g@YWknEf${F@eG^lMx|8W|m%Y~cTz zjoG1DTqzJF{Gvm%H1o%`j^BSvDG&jcZ@c`?!(N^d)q$obj)agEj^W|@Mt*I$jT!PA ziCBy)pO*r=K&d>Ay#VfZ86kVMxs6SONxH@}=}ed-SI|wHKJgBW+uK*&r~5AtcV8ZM zclKVJSm<~gtg!i6jZxtdUR`_)JVF{FHb#CpgM@ITSQbg~t8W*tjvmPnJ@265IzF2SMJxCT#tq zU?!SvSyBp;j~t&K(tGEAib!B{oE7@Kw!#?Zq2_oF!Z)v;?{DuMgwD*(b#C~{p6LLV zB|+TSU+O_qtKJ3?7Yv~>nniS-!hNFHT}9StGn^2{X)2{66cbgC?%b9Es?#eQaTNzT zv^YtqRTnj-jg;vE(Yu#%l#PH>PP(#f4V^TNq=2>PfT5RO;0UVMX);#Sq5-TeFex+M zIp-Wk6`5)r50{)V#9MEr@jjHpb&5M}-XTitHK~rJlx zW2|cg?-nkY6wDBtZPAKpo&H|Dd49Neuy?3_epnW(bJ(ss))Y(o3Z)2?gtSS7QvgmT5&ZN1FmdUFz3Z-3-94sTkZ;`ZVt zZ?h$U9K4)uio9g=jF+oW0^`*%NM!-@LNwQn25h3|CLopdIcZCrK5=pOmx=2{ zPaYC4`f65SxF5Gur2#kHH%hgt6-%7)&*x#X3K^$$onhP+`_qld>v5;OwIr>O4Q?K^ zZFwgOPkAtxIaJN|ApJfjfNQ;?o!3d+VYAoIX(1@#?m3!%+h{TvLe{1w>_Dk z@PVSF#~`qb__j*{d%#q~xQz;s_LK~p<2X}WAr>9-3QIMHv{lQMCbwAHa{oo}iq=iZ z09Zh$zqX*^(PjQo1nP~&OE=;*7N9`fcjWD;`u47gN^N_%u(Ei$vN+N^NksP!T5G8Q z$zq_5`^1Rnye6oPv#{CAwLG~oumlMtRu%9kd5@aq9-r{{wzF>IQ|Fnf+vCczCc_iM zWn$cVflk(#-_G2P0gX;E2Y}|}(6g*c0h0&x%6rLg#+sQxtio1b`40UObJ!>3Y9_Yt z>ead@bbYysgk$GcqS}rd)Ret-dnaHjJ3N!RiWN}Q*G&{#+QyBOkIqd_G{22~9nI0A z4J^@Dxw7ie8g4>$XyZZcR%MqDvfvbMKFzlEI#G{%1c2HQgUwMuB*QWu2#?Y5ufGk4 zVm=fPR%g)6#RAud^_>utUMmQzeTeQ%Q)>P5EVB+1Nc)1UcmjL4qV zr!KwxgbUo;t`_K;zCM*NP0^+;>M$92pwA=PVp{^1)I-0imQ3nJ3#l0!SCORiJLWn= zMD|1yRyfCR$C!ZH#O1_j20F}JraCo5m#$jowK*b`h-oDj8RKCcw}wOJWN=-?z%GH4 zan%J$Nm=bpD=PagG_^6!@DsA^cY^A>U_&mj3i>F`e55%+s-hkbj$`uI+n|W7NFJPG zP;LNi#B@WnK#_xYgK)D-HWAK9$0j(=yxzeetnay2cKM)t-awMJ|V)iK~1%QMS} zP9qc~1t;DH#Z3o}euoZ8?fg12N%HgvteGWP8ONVw*P2n%NMeTt@FlLoSr=J!M(wt; zsikuzBENK8se|O{pHP@dCO3AQBCpV>=&DVipchVH78*s0LC0b5Se1wG>#V1E<>)Gl z>C<{OQpYD`CwfK^y#+d`sf(W^rS7^j{WP&LA&-uoD8+jzXupg)$@j@bI$=4VJn+zk z9F>OU9Hv$7nz?bgf|3ZCqoezW)2ue2GNE`ZkRCX@%=&_p3mVhFnGw*j_>nTW-S7w9 z)ASakDAHk}jXw<>dE}AiMw!@+z}9P^t-IjX4Lk>JQ=DFXcC5m-9`B8A)>AU5A*DU8 z<_#q6cD#;jnsSFq_In3&VhWC&lbMjyjm_M&Ekmi0_Oq{k=u21s;LypUf@n$(u>!IF z%+@ttib}x~SmVe@4ytv|F%V+D0#%DhY2f2sW3BV;aRSh_o;hF;z0fhA5t@z!TRsf$tk~lC!jyLX{Ve6PA=s@rV;Dvz2EZ2+#gtHbIxSKZ6ptM zNbh-zP2)_7C-?zl>JZ6EZ&5|UC~VRpL#z*uY1EeAtmz!vB%JlBb_1dWLn>}IV!!1`qwKuiA?n?OAx*Ru;OCX}T5r$7^&C@4%*-E+d`+zP1ZOm_Es z{M5uU;C$JH;CDHjGklD1-uTHRx=t|5HH$b3OUhZSrS;AFB-WtWqQvZ{8PZLbV=LZo zTJOZ5?4DR6-QrcgiEa`8Lhn}Z-Ma_xehSnz(b93zIwm&Y{xls;rm`V@^ZNNswO<ZrM-r+Gz=%yMfx04pHH~2zvT>I$%$euMi`!9 z6eowK+GBdkF&N8{Zg}^~uRY%_sym02G~Ps_|mmlJF=6ufb4A<dRcgQq@lH;AVQ$|JtY4IcWgK&PNVLf?XGCd97nd?tT^1%8 zXt|l$CoK3uEok>I7lyc`Z-1y9+C1fx*kQ>ezyYa6X~|7o2+XmD)>IAvLfQ#%D?dtp z2W_x4=WjQg5{R<28!xQ)S-ed_5)FQz`=5neHx z*iFjPzg*7fF{E=W_+szHE*q1?B{I_OfLNMTG9KwoM04fP(kGG8x-Qm5((6_g4{&!niuX64`8X2sC^<&|0VD&5@DWMK z(L5uO?%7L$4;|(yL?GmGLY5=Dq5T zCh`iud9MoG!_likYb`lvd9V3Q#zt_$aX2dE_Uki|b8g)6L{T2Y83_+`J;R$%nu^Z<`pQIBhq zI5C2V$VCRN!Ns;mwd9!Gt$NEnIpb5cI+5;GqI<$GB9M;kPgBUb@qk;Q;dAx?R`Rdt z481Xzf!b-(ll6F**Cg)c6!NpV+xi?YoKs-uoUf{m2UgCed?6gwXq?jsh$EIB@I4J( zpLK~AX3LAqA*+aLCcNO?F>ka)?<5N{i{^^_$9H8aFIk&c)tFtsNW)lPW6fzdFX{D` zGD<6t-IVKUMtjj*Vy?DRy}FZtC9}F>QFHjv# zN9YM+H*O7HgY?=ngn``sgi;v)uyk}JGuaVH+S(T?a!D*Z&s9p3;B}s>97d`8$;x0y zCbNa6pSmwDmf->Cfkgw@rzpSpbRNOK(HZ=^;G$$PTOs=xl{-tk=V&k^!xdW0oEL0C z!#8L#zs z#{}x435}2*G42R5(I>QfI`uA=QN3a_ zEEPe6sPmreqxd{MKK_KJQ|BESRQa9PoOwP<2A|+x;vtH^xuuZ@4S#a2)5ymV)V(at zPtEHRv-q#kp2@Y*F^jLVu8@(FrdeKnX%nEygc{U9AZw|ZUq6wJwNhl1!@gl4Fw)}F zWRk-_{46fuPc*`Bqfhy8fZuZXgQnREn6vSqGs>4I=)^?n^@Lhk(pZ)bnYh@+F#2>c z%<$!$aj|@C3dI+3U4cYx8lpASc8^h{a?J=fR6fq4$qBA5QnNpIO-w&y z8f=)xHPtjPiPo%PrG}a~B-3G}gGFo|XGe5!ZAa^T@`;X^%0Qjs1i>aH)8h(KnQC=a zFP`_pcE<4p@jk?Y>jS3_Qjw-8336z^K+O}jnLPWA)YM)8SMZXstwxTI6}F$=wLK^@PMV zN9P?qG(w}SCW{c*2#lgd@P>_oQC^UO<_&LdJm7M!{thP|Rw>NHPvox1p@%H9x{PZ>@2s!LFg)V}wQy z1d*^6hUpm6MHa8aUM$T4yA)a?m|h?_Vq3~t6}0Fo2Y$1xWjSW)DtCyljD77!@2|VQ z;q}j%(Pe)GXYAZK%6h)0PteP3c@2$$?!i^K(!!8JAAVd~)-SDYtMlX1(vuY%zaO{F zrDH7Shb{9$j;eU*oyY4G74gO*5PfX3Y4asDdiD->hiID!KfDX0qKNt@bj<(3lw}8` zf8aE6LUhH0L}I(xN*lrVe|fOJzPkBcPG8nGN$zlfFU}kpQp}GN*dZsyQ0>wNlV~tN zG|+|d7(-utkmKu_n4ps?A)?hPjT+}1+tMHgi4#{Eo81yu@*A7C&rrT=O!0NJzXl$b z_FsiXJvlgoACvwXA^xain7yd ziWRzLa4nJIH8lSm!iK&9>s+IC%Q|1xw(^a(oX^9yF5hqt&T9-Mx|8WJUSlXJ9`m(^ z(rak`p~Pxmwi?!r=rxeABl_hiI5;3U!hrPS>*K&`HJaDITq>jAo)W^Mam9#BB^Qk^ z#$XWF;&2r=d{Z2z6WEjw%0#$oeVh!wuKk*cm*&NnOgv15biIk^Hgt`N2i3me#G4-p zhv~l9=1KMw6IJe7qh#`L zV`HdBfSTOY>(L} zDXavCM>BU6eQi=AFmYrh#)<4HAKsDu#Bsy%uUys?eYfU0?F>N$p5i62hO(R1FNWK% zEw}z*$@s=FL`jX@0C!!zbkZIkd%57rhItf9}G1m5R5MKlC5}=)IgXEG$sbC;2G!g30|f}(igpA5t%yJa`L#&GDMqO zrzm!pQRY&hK7Eg3nc#J{f`vyblgE!Hj~9SRJQ=*OlM*q-Q&u@d6A_0Xfgg)N#yrGN z7M9wadHxulP(s@!lcSw*sU#h$#lyf~kX%rd8aInEOoErUmUW5&r>!jkrU-lsA$5v~ z`)U|tXcn7CBIF{7Io$+3$57EoL&S$J;ujQLfflEbox*ZHKEAVhTQlJ5)c7lMryaof z0vO3SpKC6;Uk_hA_m4*^(KD*CDbV$97_;4r<7T1zFJ@dZ0ThS>`RaiQ2YrJ01+l8IA()ax!}a$oZIZ%%L6R$uOZSCG%eZ(;?Zd#4@Rbguv;_#prvr z&?mXS0W4~-Zv+^bLB}xVJUuB6$w`C>-m*ykB$R#m`Ow^~DK-G(qQSE^AOb+{@<7oo#jadI?v`Ga z<3u??8|%n1eMNDwVNA*tQ(}3Zr{8?8YD7D^Y%S>0K{NNjOVb<${b^pLBMOG6htU-O zF5w&OHjoPjiK6%xd`ANt@kwG1nU!hkFF*x9u@4pODaktZzhfFSu)+1_#i9VQF9Khf z-(6jmU#r$)wXi~AYO0fk{C;kwS zpx1v!4P(Ktsgt%^bvk_fe*C_8UpyKnq(^W}X3!YmxAUg$Al-3ZKUx6@rPg50;~sC8 zlWOs_sTu!Lcl4)r#fdGpKiMeLh*Hx0Id3(7HM!T@!-WR>`(-KHz~RfPf{~a+hzazEN5n>b&UDD@vUThxhT4PXIB)JVUan>bZGYu zz4pt=Wxy~ihP(%>DIs`Q;A5THybF?p0P8{mKXhN!1n$Y>n~!eo>_0vH$E)3dHeava z{QP|HX|S-ovhw!!)0LH-!=2#oqyVjTR)a&dktDo=udM98TnH90pXbKP%K7^z<=`;spTpJf zbJ!*a6A66BI@iSNVB>Upd_oKXT#6?I`IN3_@(nRi#EvO86eVgM2Y1)jgWhEk!y=B! zsl?+9{efv)g(FRRU#|~x=lCS~?Q}RAr<0FaUQEx3 z!|`Z5N?~_DNhj&Y$;V0dG5eTjc~-#iPXP{q8Q?WIK>rB30W;~S2Oa4{PX^GH82WMq zojHcyoIrOH=+AG^p;PG55V|yiK8>MMDfDUr-TDaq%AjL8^sIocO`&gR(7AKy-34^- z68iT$bZ`}VxCUKZhd$nhPTrATLN~FW0Dbl08sM`I_}m73?f^b_0iSz-&waq>0pRlx z@L2;K)&YmxgTb9RzI$|Z@A&xs$;pExdHCDvZ>MXg!*!tWZ6xuX$=%7vdw|FNJbzFW z50TKTKsL>K zupg(fo8?;fnCt(W_n0uvvq}G}wwRi|2Ve*^jxo47|L$}C?I*hzmzy%tbRu&|MOaF&{kRJ}`ys^i&k$+dUv#`d92vG~Ymv6XnKnO5Dz;Z#c+%)$vFrhUV~zCm&MMgAH!k1uW3y&F}T+gsiL=xfo2cOb`j(wkPPUNKQKY-F{VNw zcRMBI1?~ngZh%=HG`b>zPmhiWPJ+8;Am4FnB4NZ5hgclHg1n!_azY1m#n>TEcGO;a z(Uz>KTAn;n1hz@6s*(AzEFJRdNk?i@DI&;M5?uu^^m&P4O^93WJ4F+5+9VD>pGd1@ zksu6H6K|#Mr5=?9K!BrB@7M%yNyaA6084zi-NrGcG>)HMWkj_~n&lX}fhdZJ4ZoJf z$J1eift#!`f>R(-YTBqz+0Q9LxT`G$w07XtNbl|>#!J&^D$=qpF?*nFG*;^-V3`nP~)hd z)XwF2cS*8lSvB1IxLNyu>A7ws@QU-sC_Ba}xFK;=V6J!NQO5*r*%-%Ds5*2D$s?yw zaZbbU7LrG%P!NP0&~|$67NQ4U5xV{F7K!6izW~luw*WnGieRB9PoB6%P!*uW4o<0X zqo1Zjzf?N(OT=f1R|0?gC5}NKaZB`)V|?Tn0$~%mh48muB26c`TLRSeqo^PIg|g`P z-@QWcyHp|_didh+_%hD@Qs;Pa$0>!sOZ4k!mmX!Z%TfUt6>kit87$@{3PZ7>PvN0Y zU??z(Jf?x4r2@HMATJewA`h0AW(*>i*l%PgZe_VOyNwO6jVi}cktbJh9GBXe%`IH$ z)r?{066uxHr(zc~h)V@N&6w9xXw&O_gclstbxYSt;a6MKYk^@~oxYqcJ{FFD)NS zXh2x*jZ@{AZa{q950~6HcX~tU`v*h8<02D9YFMzg2Nsx>wF$K*`QiBqp z^VkWUiH@2vMpHCSS_Cv`k(dw8@?hi1l18r;ors_~dJ%1sd+{(mCj|;4T`W@zSa9X$ zjnfQKuJl*))cBg%7T&>svhhCu^v|VGv(uvWTMt!jDC-t2w@a1v8Dm?E&WUmMlF_kE zr3bhPFi93GB`KHe8XMg*BuKTunh9r$HayxrVUUdR6LAG`px@&BvH0C_TsJ+rgJ<{;?qcbaLj-lTc1U3x<6zl!K-?sHrZ{X!S3)}fh6bE;+TylSi_E9cIFMY`4$_XB z5bka09`|l>X=N0;JN*}NcFfL?CU}UZPRcorr7_!jyI$WhlP?cZzEeDu#A^w5kB|Ec zjNoE31&ZMVBbn$P9IrfKlnKCQAn7y5taAFB?JI0Co*n#eyfH}`EN^X$1-ZJ{HXY?~ ziKMoZ5jfZBs3mIl-!B+*kC10h9DBE_@80NGxr4HqyKLTpT{wI4x73-B&$rd_f?sye zqAYJ&cfT91bB($@m8yTwPpl7x!Hg3;3u2j*N6GJsstG781);WICP-!P_} zbIz6&9b}_rx3ek@WKjw(-TAw3%70O@Rb{P1)Ktz45$553quOJQwZPu$up=) zp#5*0K@|TE_dVM$cWP%sX$IMev8grpUpLLb@_f@8um{pA#mnCmq zA~bbf!tD~UhVgHv3yuQ|m={9I-<6|ykj2n!#Gr25_GeR9xt350J%kM6==^LNfEV0{ zCE8Gb`h<0mKN_n%s;xo{Qm(T~PqdiSVXL+V8-(sUME>D6TpmM6ET4dc** zO_kfO%0qA7X)_;62X1Ady`xE$=pf*2GJtIeMpNo#QDzQE@I-~OG@D#UctGY`N&=IU z>AVEwB%~FZlF&Quv(X|!*2h4@M`<;*Ps);eYN-UDY@edm}LRe!5nxbM4YbreQY;$ z&CmEX!2q><&@XhyQhIJmhrGCi(9P!YbT-w|0zTa^R3%|wp0%x_n%%@j{R`WkQ~k9WJPEq8%LUzdr1~eDh-W z_1;sThR=pmj4+En736*v^rm>Fl}}6Y!s}filMwEOnL;(?@l@^zfyE|REyXJV5jKqR zbe(<<(2|#4)?^B-94G>1(_R+_xJzI$?E_PGafpsrxOBsNG)B;G-IWEc#bj%BGgwR> zNkRPn2R^XnNjzK3Uex?=~+o z`!)@F%M1cW#}_0B(8w@Xq6;2+xL$(}XP?vfyma*Jr;)4Hskx&pO}Z!CHTCjX?nVE4 zc=#&dJ17BPDZ$By{*^cf`2z6-E!dpwUCe~>_?YB4EoFE)MZ0A}`93uxp*Po5!VgTe z+}uf3=^F{pVRgdWPMUq!hy$lD>z&)3bxy*hrUtrh&qwD2CcjtyE^L#_Obaj^335Ie z^n4y3#3)32<@4}CPma86*$!i`45NZWJ4)M6%__greqG+ee%2d6EN}dg#vuYHR0a`9751Gp)M= z^(9xJ{=L_D{@g1PjdviN3l87*e#4GBO_Im7x!K@*`D5{uwa4s~4y#AhgH`y1-8GHZ zCA2$cUoWV;Hot$r_;BUwT9jf;k#T$+VFqJV!sFvOtIYblW&M7XT!6e-Bn1m91=umZ zdk&~_5QQ^B@{BfY><3lTlB=d8ob9Gkj)-A9ZOduhb;yRdm@c@0{`p0gnssaS!BRIS zb~{9~2s*tV92mz|zuL?y=pDxQ>HFfpD$a~_+L^F7qrGsC9A;Kh@k8wduUU-c48u#9 zP8l5~FI-I&ipq#N4z(`P(QX&KJ&EZ&2+}d8@@!B#|Y;Cq*?!d<^9SErecnUP!e|6Y}57_EKd$Wr@+unP=|8n>B>;2cV z37A>@_3q)D*DnuWZ@)ZvwmVl1pmz6fpr1Yi(TX+5$~e0UtYR;BpB^6Wz1ZDn%RXl!){8=!I5oiBBnQxlPdQmD!cG6H?#}MdZ+@X-*|b6XV;Jh;4>BaC zz&7SRdr7+Voj+974&D{0kt|L3ut+Z)q?PS_!?=V*%Sn`DHP303Q~Gi0R*n-SntGe< zqQ*rQv>WbZ?CZl0Hzjg8fQ=2_u74(iGAtTKgL6wy$b^M*6OU7Q8AS_J#>?p-W&CtV zO(tVnY76t++ftSDKx;n^-A*wJN9vPXQ%`Ae=+FgFbNmGmghLpYXf^Oe5R(<#=7_E$ zB|8;b^J#_}4E;DO6$<-Nbp++M*YK8;pV{(NGefmKkPaZ*fXP_AO}-O0L5qaBAzLHw z^<{s;V)~&k% z%bFO1W_d|ClGnFhT5wYe*bk=zT}S?uwZ&7RoCAKWtTThori!&|S7G zmK1k6!BAI}{>jw#*A%`0h4JC^t}$q?Q8rM0o^Q%sZ`r{f{M(is?Bb#J)hsni&~LWb zB*XZ63yndivdEapVUDoH5?|AR4w41FJ#*k@EM0(5%OoGJmy=ro3Uhn^+4`C_uVEhh z+U&-)3z!4>U$c}|IkU8kIXyM`$W4T)C)oRqAPgu#tVSiME`F88=3l)0%^K1r2lf9E ztDuK$6+K)G8@F2GQ1RspWAhq;6)DMm4zGk-Fr+2q)rs?McZZMUU+-M6&>0K%d*PI-C=SJ5CdXA2}{mgt|xCrqJDX{#68db;SRTGJF=Fl(%7u&Xyy>Z9ior=BL1E zkvd#p5h71u5X zh8LgcP8!Z3*Z|^LBJxo&7>?kV{% z5Yk<2o6o~rh>*RSs25H=7b-k)r+PM`hkfR{+sjF7Ltyw&8pp$UMm!I#4JRGY^?*u| zmUVwO$NGXZ))C#%KmT>&j#rSFoJ=SRwsBuid)>SMj*uAg^1k(ee=f>z>;Krt_0SDC z&&wXhu$GY5T8B~8!15&&t?#vv-t&|}0|O57-rhlQKgg#O^sYm#Auftbn<*|Yv)zMQ z2~rXXNq)bpAiEY;t32pfP;QP_3M->%Y-lYnR9(S)KN&`H6Kjcb?9Tp+owU!IZhsh2 zm`@xS^{5=+PEw)1wkQg0hXHE90DKb#z2q2$-4qSS z{Rj>Jf;WY7*2q&m)?O294Z|Md=qCk3tKErn|}9c$wG}6VhbDPA9}2L)cjfJHa+WtH4^n3RbugO1N`A-O2dw zw~3tIsl)Jg1u6lR>8eXR_g;@Wb8{8Jk+o~haU%&L5q1(4C+>zr?;JAxE(3oqH9j%G-WCcr9i(@Tdn<$FZQlA{W& zSv8=!&PqcaHfiIk;$y>e<(AO{8jxP{F9F_Gu*fi5CLW1aUW5O8XskQ8SyyWvH&L*l zzoK)H;H|><>h<`;Y^qf?ZzqOvObY|WSKQIB(G3#eixYI9J3#s2SkFRCbFn2?9FZhh zZG{?-Ij+9ODs{Qa6*^WKGua8e+JAj$>&g~L#ubAUKU#})ry!c$lQA$kWTuXx` ztUr5PyyzmVbW9&S3!uTim-9mgn)fDPH3Y^d)6ma!{ae}rP~MuR)exMyA~lEP z;?cTUzASc(I7NO416Bc>}yI`$$Ly9x7h&|yar+ml!pK5^Wz(JUbMGC0~S zL-V}2!%sFjQRjzG3Hou9R>Y7yB~jP?b^icmk^B7h?ti}7JwVUxJrHJ|NXmdTBl0}g zNKHw+S)G`mevfYk`YlhNS<=ua_T*Mb(%B#c)I^>EuN-RGhrNf1!lt8gsUAzqZ@ zixp^78|N5ClW(1IhxiQN?G*-mWt!9o=KEzC!NNf*xUxte;hFeY_7!CcR>g^9`d0uF z^0dO(^1jPgm|Ur8lZ|5583jya3W_cbb{F|G)cdX)jhXG+ z2G`)m_V`j2eleRyqCW8cZUOX!tXS?RS$~=o3lfo!=z=jijvRmh?}kllpd~qWxViT| zyBl>~Xv@CE>w+}Nv6`tP77yE4&2~eIy!3|6T^BmRE}iDE*+2{y2mkqeInMjh#6Mw? z%T;O)G&x7il`Y+pn1;||gEE2k!5vVNxh4_39Hl2%#Av}hW1UHjdv$u)30^?mL=poG zFD*DdelruB5#?BL8XMi`1ZQ3&-#P=)QleE2pKTY#Ej{6=zfbC(x6nfDF_t^UP%FBz z2pnCLP`1qHDR^xyNo-Q*|QrhtD8ZW|`#}!JH)7G-oq3{#I z!XI)u6u~Bg&l^&E!E7NM>T&EXZ4%^IUv0ZB3$)EMWLdA<+nYZcHku*O#nl#fe``zQ zS=bmP8H~hMAlOl+?DV{)zkxDz0r8z!ber$V7HfwcKaEciVv^QcL!D5P)=za=G%@^2r?sg$e3yS-!mVrh;wTiAgaSfKo$YMD1krRxAt?@vmI5u)W$< zi##Jt%uKwgiDp0%{v__b)tH$ElZtvSS~V^LjV)4^jM7`i0|P~2T0!(gxbC6?0KZ^8 z;Z9jcsePxfZF7%xd`Tv&`QW<>-ZR}F3Z7{5BJ=w|joXFnD4haz$M+?2wW{n_w-%Tw zQzzTYdLTz;v&3+>2+UaY7k z56MNd7<~49PZr9o`iFr2>IuD2k|hryzuRW zdW~qs=_}1O%XAIDGtq4>*SJDzSHX(Fp3xqy5??F7*@|?15sM}{ijhL?qUGQjYbI!> zi<03qEBm)rdtzo{qe?x>yOS&}FeaX)*Q-|D41OxoL0a;gY8Wd=+FnD-`aI?W@C58! zN~bS3LBf&H{G&AOKYt6Q)9QtKr-iga%zEvpg2})WuzHMt4Nc#OPNtJDJ?o`rS^9mP z#@S^Jt#*J`hr53!jZ9u`#fb;sm1Q-2R3i!{a?i|q<xthzsRLkYw`FgG` zA#Y2O3ttVSg(cs`sGOfIz)+J+SSW4)Gr4 zi!^GZQ0Mv4bg1^;RHN-RE7S&!mWxv5NQ#1dVazKHMBi6GUjOn~9mPo?o1bm39pm=d z+(<>zR<%Y4I12=4G|GZkW(A&OqI>365SHtu%@^`4hG z0`kreE$1$MOF?qgDdN?V#5;{MWxnB=qD%U3a;)g|$<=CWj~AV}<{dEFfuD88_)Vmq zdt^s9$t*eQ&g#Be#9ejZ)-3AGv0KBbTm7Ni9Kx{nH0)Y}aAhTU>aBZvcR6*ZsK}ZQ zIhO*_$zLQ-1KM^IOK<^`JvTZ_lL5Q1FOE}3%!)Nq6pTJJjZQT3)28IsCmaboWL3x# z_&Neu?*UscPj?Y=kh7jMBV)v9}%D)8FN9|i_ySJ3Z|h|p%+(Xc>N=p-#% zRocg=V$h*XbDura_^jT!My@7b^NQf9C<(`CnaHi4HL>0 zO_LP`U8WlJ<~a;0U$=zR*isJt&Rz!&I@B-57n4MMR}axUZaOZKVcL#)}uTchlQtAyd!fS3e@0m-UV-0bT+X_~%wHD5@#?%ac^Su5V%|9=%cD_BpQ*@oa zmiGc*DefIsoPR;Gt|v2Os9lnnMs6QSL|4r%6@=TmWc*m6LHQuK0g}JrchizKU{z}j z{8Geb11sTHvlA-YM(RY9KSmXENQ0!R?4CZ)+CU|e%tYd4`*sf-_NQ(YC`%d)){UmQ zRQw+}dUwLf5->?_OT~)`Pyq#&8Z8DWUq;qZF0(C^koNDB;2WYz%T}-#d{mAY@6iO4 zBAB08q1mWfHY}NY!rBhylCzC^V3!}u3-^H7l-=@Catc>3D@Y&knhxhkkvol@FB!l( z%3G?VZ1hRs){>S&0P1emP_iOSn^3Y_GH2GhWnF$a9>I!qbcAd0C>^q6czXoOENvU)BxhT;W9cL& z@m*?-&UaAE;|p7jw}^Bdu~phUZ|M%nZRpb{_iY(o1H$I^1x7n)Ij9nmbVKd8)UJcR z65PJGy4nub{oTqRKT%#j6w@z~oRTCQpm8VI0Yx%P*e3tE-VE*t{^|I1oSu)n#pNUp z7Nf>DJ(nwzvN5FV@(m$`2`@=P_j*jOm6c$JZfKxCDJ^zGIvSK% z7&&gcc8k6YO$c8@CVuoT#EZ4b7#B(kqT#&k`7f8$5J4%b$mu%6WJGM{!dx`Cu^J}& z5)%n!>0|(%Ha87_d2#q7LpRqk5rw3<#0*+6DtGv{XI;TwrJ$b$V0jHl+QN;;I4Uq) zKz}sx;ad=TZ1dS*_U7=ZLlZ4z)u(G=U zxi)Jk0{rJNgkbGIbgrdJ4F+Wkd!1}X2QRYpT%4Q-cJOA^_ba#NvFgsR?xfO2(FZnLv5hm}tQu^tpKaYpBCGQg81NjyF7yNSNUc)8BlH_ZZ z;d!?@N2!FgaW8f*8j9HDvq89hgpoGTYPmg%&DU`eWze+zqObHVPxwhOjK=zGiq~F; z{9<Lf5`g6{pY#M=&u7B@^m z=&Kcve{dWcC`vI0=q}~+?U%opRAaVqBN&=Tp3O!ER~e7x~XF)##irF zaW*)VHA0b}X@VG@@)SE{U^6Sxl}E~LY3(;=5nV>rk1t%BrzkE~elSx8?d)y$&LrT9 z#WL)Vq%2gzAWp03L15F@O9y!Av%fG>&5gC1qHA8!H7&YcQ*_-cx-La|AatEWtT0ND zMz8T-+qP}nwr$(CZQHhO+qP}Zo8>HK(d$k+>F(sKs&g#{a#3>vcrCk(MK_*wYS6!IkLTi_^Z_?McbFP@%Slygp zWx7vqb;~+lsIrhkgG1~nF;pXv@)uV;>)8=#fc`D{GMps!g$f^>s0c6lTc{ZJ+$UIn zG(WEf`fBN0-L4J}8X=bFzqjGY!QCPHi+p^W&$T=Uu(NoKO?47CZLXb@P}s4a#-4vSF3ZY>+^g zi2*=QTE+kM6^?4=m=yp_fqRE#FdXC{LhjL`KlH;Ejo&5%*6EEsy98N?CJJ7k`)Gtc z`GL%yWi_!Ros9J>;boUSNvD#Wz4u7hp^SVrEGj>4-WCI1JK5=4y~aD2>@?)?qTrI> z6-Z&rn`V_B{BOh+&Nn5Z)jxL#p6GN?cruYF~=+ejgfbA8Bku69V_y_==<)eYu_J--lqd-3n#_V;}~-|&8SiS6AE^mRSM{OuIj zx$W=Se7a)&)-17Eh6xPuS%ZN6!z?(Zr$zG>B%p*@Ddz zM?HA+-v#OnW_$JL3i>&uHMCn>tytf*`5x1|d;dbsQ*F17(phJ4ss@W|y>`mPP>d3^ z?AQMpm%V+SXNvtg(d^DqZxpfHWE|~VuW0gU0vb{o84fFJ@@2CQ!})ajvo+7o8H!=? zZgucN`P(gEqirt1yq~_x5v4|+a^$#L-@zaK`FwHmkk$B2aoip%*3Ir>u0XiRtIIt% z1UP81J>coE(Lz~uD*`M{2l3G$6wMX^p8Bp|i z$P&#Mr1WseMpfNC<7>{f?*2RYnJjyg!=-caRo9qTmzCcrTB3?}j)+1&uejzyFIwN3DWE0+WKQJ4`%dK zkL`~E^!_Ac5dFd~zjFGS!F+ff^pVvSE{eb&=D#?}cd>f`fB*Z;!J9__j05%;Y85E6+w=b&zMFgf1{;c-pP#h|Kh4DU6iZLpa!Oukxk$!N-*x$L5vRz-4$9)Km>N6;)I zq)R&&z&63B++er;7YSVo&^HjYbZqvDb8=quf&30YH(hy3v}ihx4qUt3kKc$`WCi3^Fpkpf6rD={-vxP=jWc#4y6HMWITz5FRt49j z-EFDhI%T95E1#ZVf}wozF4!sL$udoG?brS|=Qi+l_%jLT_i-@<*WOmphF3=M0inq9 z&t`HfFGlq&tYjobp^(EcB4+;!Z+q43Oj#C2<#UofIs;rQ<_l0ODwe!ErcsGUxvFz) zG5H2msPF;5AOD18llmjUT-t>08|W#9rK<*}$M8#Xi|c#>kV#fPmm+qyIpga}fWc=frms zF{TV}QoE&dmv)y_*iB7kTP5?wt7z4JRq9@hg?1S0KyFCe1jj3AI1?&Lcgqata7i8P zX^PiUvyzB)``R+Ihbb>BE8tXBZ)&P*2Nyvn+_!QD9evuP z(@IljQ{+XB=*nH#|LCOpiJ++vPm-b}nLJkSp5^$pWJ`$@CubAizpMKM=MKrW>_ZkC_ed0|GE6yU%nK?q4DqAD^vFBH-wi+%mY zQ08HLcY0~rvtzr*=UWa@Us;N#zK`NFtt?m^n1M)g)HLxZb|gGu+jS9+e5-7KvDob7 zF^g2bORc-_UESX5N@rMi?*`1JlSyt|BgcUbmrR{*v*c(-qGyFWGn zd*1%*PkGsE%}e|0Zu)`ao<>9F^MW)P&DYN(b_h*6U_>vy0Fj9&<^$rXp)>Kq7Lgal zc6xI)FA5|LWB9pD_V93}l)-gdnl}_mQuhGL>O*B-Xf2^vqp5^I4#-I)Jq?s}vn%ti z3o;j67P7J_wZ^}1MG;#2tMRX7=yan^`k z7jwFnr&d&PV@BhD;$a!3_vpDohwQfmoEHR^XkAD_mN_3g6VM_EkP}P#d3RFoh{r%; z0F-U4x2E*zD{WDe@focAm7v$S+hVYaEVkZ1T;H}!dBr>ok`XS!KVTZdlrSvjt*&&M z#;9X9*@@KFTn%wOB`uXr$!u1UT7)9RRg`1OyFTPOMh{E{*E=6~?SWT3-^W>KfQ-dw z15mBA9Nu}TQugK0me?gA(7)jBW*-5&_y%wFA^&s6bCi8q&NRmFS#E`4|NPRzLKBX8 z|7#sE?-s(`_G>k+(p2V>fo8g1XJnbKmZ7!_k>7H4)=RdPA>&{PR)z*Rn-+fh1qLn} zAY>LMse5Ze4xk0QCb3N#T2m*?{2&X?h^ATcA07-?qRsQsBb4~CohXya$^)PWZ%3fK z25Y4%sE-?t)=rSdD*PJ4a)CM-wL}IyZY73tJ;=7h@AAIs;=H3tJjP14mkW zb9)tKNC04+E^Jxd|CWk72*B^(@81ZPhSS#QhsGz0l`15;81acSX;Om>#bd%K&X$7D z@`XEhI!Obu!qLBa_!-XMyPsH{?frxDB{Z$!Ti>^iv7ssB6l}TMT^>}okrcGg1b1Sk z_kg~=>Tl_3Be{r_=x%-!!Mf!16W{%h1;u{0gvxOxir+{y=FDQssbT3-BY%31*8Dt? zjMRkJ5>;jyM9Os1!;QWbZKQf>ivz0!GC@+M)N-0269ou)$}^OQr-fN#iQ_o5gadqM;BFO*v2*3)sjIJo6MyQs2pM^V(s( zvA5B)=PmoJ;$N8YDBcpuGm8C~BmQnJ3jYk&<94tN6OJ0~V?g*DG2U^m`@bUYRgrJuD>@4PAFfamn$+RJE*5uil*5-*$q}gt3v>stly8`3tAG4QsJ14O1a@1 zNLb25BZSHa(D>W-$NTF+2V!7=)ZGdfq9EnUz=jB8`Sb(V{wHI{k?6eRK^(M@9r+Rq zVA0p+Ij39Aw;s754--2#gW&G7C1M-T!g9+l~2-{eZ#{RV1L^s~+3NH<~owG!82 zpU?}%zm6paH0>%&?*fU`h!9}ZTJ?46)IV7J@&C;@F*N58hX))DWW*Cx@{Z;wy@1q6 zI#+BU5&bY7oW$|DM?VeM_i8(b<%Rly!bfV$%UpsntS33TP!>_=hZ}K^M8%i^j6kWC zR&4vnEw8}r8iMuOASeV4CYAZOn~J!8SM90~aH3E2?ZsQ@)BV z22=tz2Jgnh&!C0RNR{k(?*O151D}vWxfz z&+>)tr1Kl{$-8oJ5;)G&DW{*qkfMbGjgr!aAlZtB9xQCGRUyQ29{ReB3rv1F4$o^g z9eKs3>q78DMuHT8MEYSxABB$32HUIdlQKhY$miDSkf-8DP_oGd8K{Vka#T82THqnu z9uh)X$r<7Zb25rA03byaUKA~~OH%*R?f25?c@j3QP^VU~r9=N-nDw7p=~2B_rDFN?t;BFcP4+yjY=Wv+?&bX^ zZ_WF|e3V9R>vf9nKvXzwK2nR!!(ULss>oz2J8B3Ha?iIb;z&yqG{YMH+i_mkqPWI2 zVnR9iOGO0hUK;Ork}uvk=J_Slos{=!Z<&uVoO1=gbvc}o&d`JD5Ke<^=XEO}mo(R8 zDo<{YjLf$U&irQ@OEGKz5{qEIUM=cyb8ZN>8wUD4RMD!IE&N?Ee#*J&1j0WNt9KWXZ5G$&BBZh1D5PCB$mc*FtsV^7iO z%!|VwFRsjLwtJmCN=FAv5)3@b+sS`x0E9u^KM;5r#-wl`hZvA+53pKR79<7+p?uO? zrnWTDg9m0hISvlb9c$lMzYWd>OD9y0!m0 zSFDoRw$uiWR$j1B0O$$FYfV~3!gs!(&nT;t&3R3lVFhE}$mn`K=QZ-Ng(k5~keD`K zp$lvQE(s!qqs|g2ng*m=aPbGO_f#8CMYJ8^jveN&V;0sVMsl`IUH9~UqR-Zi!)pgi z;U7Oz2yy8)WBD6q`2ohJPGaj=%z0lF2VVMSxRWZFc*>6+OiC$xeZk4&OI~>)&a46~c#=>8*1Q5jp%Im=Yb=8zL!1ixZtfkjEXtKAKXz z4qGD%WTT1yZ!@|iTo@Fm`Q@M>1sk*_M+N)PpSbpkL4-lS8g_tL zNf3N}VMLp>{ey^SEj;9a$4k-wLOb=isXq_P`0E%p+fmsnFPrICRpQo$J0M#CiLo=^ z79L2_9Cbxd5~!4LLkH`4Yo9z)G|GtloOi2&hHna45}g#d=(zxy%ZHkz_=K#8@SQ65 z(0<5C6z$bbgn_*a`M~C1Jir|ZlQZ4gc=dkCIEm&D2Y(Xnnlcu_uN&9S||=PFRoH8mwq&&4$xKg zIE_{9Rz_pS{(t-!J5AtiJW+x_*Md?tE3G}(NM83WEP{fHn>@ZVJWY-8Bq#vgK$H^T zbC4B=#=aFS12z7`nYJ!>x3XoxTNyHQEoKE`;~97-rFJaZ-F0oSX`mBIls;7Q6*Rx{ z_BvQin`0a#W@cOEK)Qfu*jF<+!7K3SgVH&jF|^{3 zid3J1&I0nc=_vq%?VL3Nyf?}(|6XlI!4uTY`5 zZUVwYPdD2p?(HY*Ftfp9R9>v*;d4Pgl6>z7u*F%EeP^CtOLdHxh@a)DY(^!~B5i5n zZ1;ZcL+l36i~2iIaLwhRw72L$dSthMq(7IVoV(h?ikUwca|5(Jybeqhr+%%^ys1xeoC%&P-XRjL`c`?UmwCoi@ z4dp#{;;;JYMGg#62h481mBwbrT<=4G;WSYX>Z}J*!)Nl!>7W)>X32ociU(cq$gAKc{4)5Bq{bU)= zB$7)cOOvbzaIg|WX@21@lQ$p1PhjEFpNWHG#!>ITWz88A{+igXS0Be9YX38YaCu;b z`8=gwbN`Vu=HK-;DZF`aZ##9cM8b(|(RVkCXsE~2`dgJS-gjOgK8Z0?q-@F z=h;**+q*8ymov_4Sz{x;ix?N(I&uK@xjlv_?2nL#kC&hCk$b_8J#+j`RC+hwB|=Nd zuT{-WIp(UhMY0=^-73KoJ(iN_{dCp(&IF*<{WG`+cRa;!74kP}>y+#69+pH2!CMKp z5)3skfgN}0AvpSmV^@qfJ~RaZd~{D)s8QZJ$OMNDqAjZbYv#k!S9`Qvv~@p|;3U0u znk8W3s(0QCqqF{mvMX(W*+hvJcb9I{`w6lwIg1D}KbbDhHt@PDv}ed`$xu{%jRS)E z&=basYnQM_(GKP^Qxa_CxV9~xZv@zFYLN^J6PE|cT~09rUI*<|Ajg)_P%uqC&Cm%dd8@U>#bln7O&t>z*&Bs+M6~g5l2ChMJ$X;QpF)=7haNH?0h92RNg>b85;KuieF=79u0jbbWcEzJX~136 zP7>O!l&s=SbyOy*HPY|yywdVj3cR(n%<&?fsU3g7SA-eh#M(yx(OPK zeJ*VY@WR6WAm5Ty7)JuV?@OR4`c!@s;DQt zHlBM*$o$gmYhju!CMfENh!f|JS}@~KG%Ysi>+lONNe;f@KjAMi2+sqkU}b(p)B4tR z?#|SW)w!brlPD(;B}|Ul>&kyO{`)yrFEE{q-d7yk9JGTbESi9QQl1wJ%DeG!WS?xk zTQoASAUVoIuh#oC6i#_^jPCt%tlQxtt>+!`pX7hO1?FzQdRo205qCgj-sauE{bq+3 z&@Gv3FBcJ3+*yqI7AoKu3b^-C@fU#|W$1)zrQFYaQ#b|rF4H*LpNd!yFuLs1!+&56?O|6fNh2KqKD?u7m^S`k|<^YMdRV(6C z%a`MN9$%}gIHRXL>%rR_tN| z%=r2`Js+AIE3YDC8#HFZzF~Yez3@*`TRj#VwJGOHq6ppdyJSW0C*s(74-;w;R2_c|^$M+q$_!JwpPG1I{AB%snL6P1;Klj!Fq_Wvdu))ux_G|nbA_SOc@CjW1`apPl?hQ!u*Z}yHd2)McH&dqF9M8eO? z9R?2@pVUNl@cF#X!_>2GYv-0_zs_O38nwb*!}K!a$x-uUs3Aa7{l-`2{K?5Pp$$w~ zvnqBPWbyChOAY2d%mXy!tde(TnUV_a0^5s&R+2KKc8XDJ)lxodMdR_RzO@%t>x3Y6Ojf@C$qaio_aT91< zuU2=Wv`l1PWqw3H$GF9smA(CQclOl-49CQdQ63MXpL|=TH7*?9yD9-$E4$ zc5wrm>Z7G;GXGGZA^U_~HT{}H6^uJLAJEvS_R6A%mdPb^@)IIH6WW5kDsq#hfF{bb zSa*;Nw|SDPMY4)AOW>zbJulmk3naCFFc}HhfAg$GBPijMA#YA4gC>%cGj__5;J<$t zf@U7&S$4ew3Z1u=dj=KIWcz{Q=yStT(bUXDHn~iqMOp^@vh(*X>`ZQ1LpP7IpX*nv z`U;FyEaCL!gE9+wEXjp~ta;x~1smxYb$Mw&44H@r zud)UY&V1xhyvpox1%il9Dn|9X;@d@%1@zR<6`0rV{V1hGc&yy%hyrI?IY;|{<8-Zb zQLnIo%^}$rdx6dyK-*c(hW*gJL>H+wHdfKP+aU()5xg{s^G?6AS-1Jf| z9LmBEOa%xfC(q1&z)Oxz|AqyU&%-D?@xw`a8b7;`QAL?KS7p-h{Ui&M(v7_@9zF`w z0U4h>a{)Pks|ZXIi2YGJx5GDxWt3UxP$B3i%pifJtkCBdI%m^2o-lxkQzhX?bqB8v z4S0Re0f68E2hQfSisx=>P#$A*jvB<~NC6TNUJic_YDL>I5_8W#cnLFc{ zpMRlLRV8?yW@bu?i2zd3&+*sNEs2;?!Oak=k-x?%#Z%?;$}$x~kbC5qP~rY#8FDD- z3E*p$l+)8Xf*-qFm5()?=2>jiTPt*!Tuw?g@!SO$CS{X%-4+jhW|N3N@ig!aB4_Xm zRCQQ+B%u%cPyw7jiT3N*y$cvtbyIN!E(-%KS83hzUn8&tfY8Nv8STs6K=pRDO*R3_6?aJV|j;N$w|C z2iuW8KLe5PE+-W`OB#bSAVEeKt%m_l<>mw@keWH3uXvDa)4jn_eR_d(F=i(v0i>%s zF9ck9?BCy?nS)dlBA&++%B738$Agcnj*FaYE#=)i@|zFkqM413Zd1j`96-&ZSF%aE zBGvz1nuTaJQc209R?)4xzOl@e6R^qEnzqm|(1)c)th>4;rCGX=@>G*h=Ms43G~Y)7 zAzz=<&3TycM8$^{QkWF7$nbYmsMqshLy>nYK;0?myI_T4V%9LX!?< zNY=2KE`{dmPhyfn$(MbSQ)`-c#ua6$&VhS zw9S!pv}1XV7P}m`RTn(y4bqSM5W>98OQzx6G%VJ4S9NKa_d=8R4H)?tv9okwC9pg) zA!;8(nXFd6=yZMEkyh19tAYuwQn{E!f?+`GUr`O3#t0YeRnVE6p5G#aF)Ngqe4@bL zzovm_h0D7M3#}O%1(_7K#=FP&AtK?Wn2cDxCH9$6w^0YNp1_O}Xvu=M%$n&}+>?&8 z;oYNb0&}(&3?8x?^v$7v8@kW$<|uKyyWYf@8Nokhv=X?ZR=l*kyJw!0bX1cz$k6b> z3f7Er(>Yx|d|i{CY}k#lXJzvgR{@Y_VxJ325d;{I7)6aZou|KN1CPP@vC0X^c_5|1 zFu+RV3X~~T_H(|lW;Lj{@K}sk+E+Ev@A$4*kwLTO8Eu=T7CU5nvSzn z?!z)>Kqx{PFEtRxmrCLz%m`7YjRCpsK3eNqo)L6U=$kP$M;rhHe7T4I@fW9Qswu1| z0Fw!$h5{95E=*S;M)Fii=OwKLS#ylpYU$0C?)~_$*qj#kA9y*VpK=G+C!wA={)@`b ziiM!}viPc63v>r{)aM}no4ZOCUx|`34|xi*dbkm{0&l!1P3;`RhI(Aj4>;u9OUG9y z#GLJ36Ag2xt%|o9Gdlkn&f0 zVQT#DYQiyubOG4(E)S+KFV+ycC)NyL%DeNqL(696vjdgsPwH(kWOFQUhJc7oEVW2I zze2Tq3d$Ac9Ph(EEnM9F-F3IsRv`!`tm>Hkmd3>Xx*LJs(1CUG+uFt<8rFY9b7Qc| z55y}TEuYeBn8BpxH+EdgZLHosqQ5RzgUz;FY@y;+0WL%wKgC&+Y^|(G72Pro!=uB# zW98j%*QSu`Y}uRpx-3VbFz1NUjf{C)RS=T#>cRuk0UA795X z7SEDNzmtNz+kgMekL~l02xa}*Dg|>)Uf);PDL~aKL^OM6B_oJ-yo%YP{#`*fp9e>5 z2R+2)z{yWGm(N?|?s3^4*O^?9$LZBJyoYCzRJQra*%zeBWmU)coAF#MulSB4a{DWN zy7yih!}J;P$iegxcuQzyM;@^KMB%wMi8W-P3cjDEmPc7}{}ZJ60gY~$w^i;B$6X4B zB}M$EBkviZB+#Q|F;}W%j^^+A++1mHEfn^DTFK`*RTtG0}ys~rJi-a3V#-}jGv zkTVwEk;sR3JE!bu)5jwXNZ9X0Ld`kVoHPt04&3Mk75(%S!?Xd8X&~_qRInIBwM7Do zD})T3*_mIV+*lleirX#Q|^;mn= zcM?JX&i~Cx5z#d<=jxU?^910JaRY-1ci41=S_z1w=GQ0w)Ur?1IiST}S*#jUy06RF zalv7CDJ$u^#b%S5Bl<2~Jefv#Bb)UgfX`M$0!j7+xOYPv4e>;1#ZhF-V|}uO503@R z!_AF4{o7vr{_g~ge1<1QN7rm%zO|i&sP}g}rX@nS=>KbVY~5(M5=*8EK{H7n_bE3L*rT6;jb(#E~kbw@q?- zYK##2m&LYQECMm>C&hh;z>$PAjbNHO4u3;28=Z8poUnkuWv8y)w}pyLSCSi|rSS*k zt%_YEKZ(AtGWY`^fue((oz}ZUh@~Av+k;egLx00Xd^xObQ!-!~V5_j;1V=L5g_hy# z%d0JfsUYK&jI2C!j^dLn8v0@6StP9eBQc7}P_=ouDHg8`VDDIC)YziqvUdIh;UX4s zGJ{^df*%v^o1_g5h9}cI_NVEqKZIfwp8^D zY{P>`PK?2YOl@XUVorFuU@<^uG_1&xh)BFWk#HT}gh{K_K9MAZHp%UayqC8-UQL{- zXq60PxW53pz&n(@NHCVxj{JvYWWy{{?myfOxFVzl+|PY9@$?=Nov0+)~X+cEv$zg z;{*N$Ch%t~YGpmR3N&X-AVVI>3{b6s4V)Kcp(l9dReYULAFJ951n_VYdVs`&gZM~h*JolWR=y@Pp8LB| z2;3oOU)gzO64Cy#F{6(@B@=q?Iq#~AU5=DH)Gn4K$ds3=WEQ|uD9*d`swn}(yPH2i zvx+dH`lCfc&i8g7w(@Mqz7XWpOm-;hA7ar4sOf|0eh{F{k2mnDhHIkWVMd@oi|&RD zP|ghVrv;x^58}`8@Ab{}N8x>MxAvX{0Iq1__q8`to=>~2K?J_R$GwMim9PO#u+_Fk z(6M}}ZKP3MI~3bq87~OAI*PinJ2)ct%Bqxn^}U25a1?BHtPpyuM-Iaj%stnBr$$hm zd?0blRfwU^AqgP(*8G7w<9Ez?1CHoiCgI2WHSON4+h}FmNs;Scz zg86f!{6bhl{A9*R2HspVaN!yya+}fo=WGbdj=qoZ8}cAtWBOK%j9>ns{{~{%=eb6Y zL1tRDacv?G3^;3%8icKC{D#P1D!)v}+vxhd0xNtiamc7v*|fEY1QVEFK%VJv6MqA6 z;#Lrs?A^!wVqBI774rUN=sQ~T(vx|Y<|zbe3Q9UWri(QN*vvNqq^#6q+1WK?>lrrT zppVrJRrLo{x(ipSf%>_bHMJWq=fM8R2GappS}&Y=o9i2*ix&jY%(lG3mR(rh&Bx|H zRyW?Z;$azBcm#d`YyV43CY4~DG?(E(3bzT-zOge!1PpmT8sfOUflRf-wlP>I?+d-Yw8?8;P9`PzEX5-@edrWE+zEOhV%G#sGMYHu zr>G1<@?by?y)opOmP5KQxZAf@0L9g6sJMt3S%MLjoCi8Q*4V0lv6$W}m)W#TRK)=M z8wmZbJYm48UCQ@Fq+09(_!ltc9Mjpa1B!#OAm|Z>tG$#9%aSZs&gHIe>eK$xy3_mo zpa>;H2rZRV4ko=PV;+zuFsFPv9Gx9L*YBj|xGOw%$mb0H;H4TGND?iOMa0pera+AL zokPRWAfgvni=cfVx>M~1KPw3myZtdL?6$-qL=v-iu9$8EMX+a|10D2%H%z+MDzx&7Cd61_z^Xlt7)+clePncYUm3{c zeR*o4YS6Ac1aHSPm^@5o$HmA_`Mcl6y;HW{>QMv%hqz^=S<)rcSO$JK7)FEVUqc)o zU*SCz?t^8k$G6s?h;SzR4Kkc?J^s{p{l<#t9vrn`&k$czhNAu-tXiB<4}<@it8{(+ z;AKSoEf9I5_$@VI{HPL6ZcM8}9i*k81%BT7{Pj^FU!83RaM@<<9+BA^P&YYRDa~hm zTlTyc$v%xL4+B4kXv_FegN`tYjY;e9M?{A?(S$g3TJ0#vnui)<;07nRGzCN3s|nT& zINN5i%aPV|p~=xTg5;Ff4s-PA;k2N_%ZA@iay|ogYrQKApPkJE3z=98NA69MYx;;< z%q5=cz3EISu8lm3(0qP_^?-C0kJ5YslM?GTqv|-<=BzPb!{(Wkh)lLCkby@W&1B$x z;AGZ&T}DYe+T;YIaQt^EoH=2!R|L?Sr{T$8ycWf?C`sO;@i7Go0?`YyH^$699i<+M z-VY6fVSNR<5cZXbp_I3EM8u*wCwOD|IHo@bg=x#xEJh|w*ydI(7Pe`c0GI_Yd>Ps^ z>A1`+U2KVod6R%TTC0W~oU`-h+QsG@5UZBaD@pAgR(R~Fs21Vi*v3A_#v6yeDs?4}r4rfi!&f(f&H ziI;SU5 zpjmoZcN^wb_p~_bahe4|cpF`aN=8A6lb7f!p5zJj?;4hq_89kKD<@F0(izN`bEn^q z=iu?A3pxNC&F=A_3Q{J7LoUw$hlMVnTFbrdQ&7$>4T*0;evxn~ecSz$ZR%7b$HyI% zdHF&&?W`t4_b&SPOVP4~Wh!6#2ec`}6p2SF;pFxlTdz}~tB8~2L<|MvKW5E1*yCA> ztmT@>l|7$B50WuGHki>9Vu*#(onr=!fW;JlO|AB)1SM|3x=iI5#j>yeuG`&mi`X8I z*GJsM)Y+S!HDKbP|)dEvNWl0znS`sk|DVtjMH z)4D1x)IRa8Dy#=YC|#WOU7CH$uAFZJPv2cg<&w}QSk#KPK*Z?g@QjF))5?*Z&q0xu zCcR)DU@?bue~ae?GN$7i-_K@{Omg~oZDN591V{zJ@cA4U6&tbvwyHa^uiUyvXZjJ= z7$n(>-K%5$PH`f7g4j9E+}MesEeGKr&ZY>iL=O>>Aa3B2l8yIy1l#Jn03+3-P!vUe zkF99Z-Nq6=FZ+Yeu&CuGM`>AkMN6AcmozD2#1_s@5OlL+}) zAvrIxo*w|siq&MFPj?vpT*3gs3~3^&UE&a3@?r6~@LWmI1Az7lRZugcQq+yD?!%+o z`*VJyP2vO;az~0nqo?SRkt|S4peW#otQ)E4@Sl!*JdXo}slJKAEB%M}&8-wz9Ij8A zSt1$S^UnlELofWXGBHR;ZCAz_0l=9wg^qWN1tl&F=lqI-{(g17?N=#cx7X`(3<33E zIG_SqG7`&XW)I}&EQ13iFXe|k5m_^=2o8s8Qu^O(8rY^x<-g3VIPYAtv(Q`2nhhhM z*=*cPT+hpgrLwr(s=vRVqcUzhoC8f$C&lm;3f@4UKhS-CpFiaq(Rw)k;Am%R4&A^Q zp?ZN%ml&FY2(@Y1uuj|LS8ZPkJHx{ne%N^bQ!^^bC8NVl23`%`3-Y^?%QJKGHklDL z5XX0;d^&tY-urc>9ly``P?WA+OTNsnJ~3|c)I67Z@8Vj}{r+lt|D8DHgPlHunO z%IY^1m3@3y-&Mx)`}>6`aOE@J@2g?)Cs7kPk5e?R{5R^jdd5??0lzTIuFd14T&8&l zjWybGM?3Rj5NKSanl~>#->>rzqIeov+QV-<a+sE-Y(PULpp%(E4X!a}N8 zAJ*Wz`h!qB=RCGvwoQx{b&SyYuip=$_+-65qI61{)1q9IgOu-G@ku9zCp7HBIclQHu!z7|Lsy!rsE|bD%EI;)Z+L4)aX{UVT;QlX)`sB3!wi=v1yHnm9C>T(!Fd7UQS=O3IZmL(J z@|c350;0A#K?5yV%bQE@Dvz65ZN^iK&*$}K+9Y;@`|5ozz2eQq*I8ovf~VUx_fr*~TNZG9;!i`wxgl&+x&WtDBXNt-UVF>x|H&=#&IJ0R?` zQ`lEf$ARMqQsfH7rq07GI@aN_N&#o)M>j=8wag#|zX9`enR{k_rfjrHOrSUW=Rz(@ z>K7;5LTgzdOKe679B;j7RUYMfxh+86CbIm-I}fn1yuZwY;!ZH*L8EDP#iaq0g+-od z1A*C3m?O*}L{9cWWXq#>{J}NgguTX6B8k?Z%~fkbCIy>o!hlXK6M9U_RHplRKoS6T z#q*~9E6=v4GdO5Q9P+uyM=0vLV>P#U1#h#(be>4ZOnLQE9oVC3q>dEK-JmWrC0ud- zDj=YIOu*W)EaNoIp{!$>Q<&9nItH!ao9M2a_1^+5SKW9iREuQ@Tfox^wO3b^?Ka^9 zWUl?yc)i60sj?h>LieIrQZ5?V$7B0>6$svcg&2xM&W2O)F{W3OK6l$N0770(M4)Gl z>KK>r3!P{^>|L#UYI#hdGLqJi#Ambq@*UF*MV9A}+x zZ|g6QRXiCa$z7c~-R#ar)kNRXP^8t!)B8_m`2c~VZ%y^aZ0H{xjbs4}M| ztpedF0=z3PjQ`Nqj(|a!9vP;-e3hF~7;JZ0iy)&DGajFHE)My&<6eMAQx|r729#e; zZ?Lq5oiG#aLh*bPCq=m>@5O?|g|?}}^m(Wi&3P5?0ulvlAoZ0vWPmae>BYAk;4Bx{ z{PcZXj340wk~U`bTNQ^!qXa*k2BJ2x8K(IOvaRr^!EFjc0Vm4~e2yLEMNpaQX>G&| z*$%i+bqNJ5Y7_>zi9K$7cF0V_qWXme1>kuI&k%Oo5!Ey_rYN+v>9IF59+k+qP}nw(Xjpw|kq( zHzbQ(odN3*JWS8U!=V&qxHqS?NR<9K_+h#ig)A`^#@-+(*}PzxwEzLG9rKmy>B)So z74_|%w~Wr}l3lwcP%eqo9Lc~~lNO2{W8D?FDvm`;#hO35B2pt9V!#~-G+1m}M7YxK z$qb>q!Mhtmaa0!G8C_U*QWIjFH9ANE`REIRtib4^cnS`z{>cfhrgb)&Kfsr_KkS&} zV#L;k_(`jOS$>n`k)xo+Z>|7(_&DmT@%9920mZpW)w9|s2(_!hlULnaxegE z)m{{~TgbiH5V&Oe2O>F}s`uzG+>OZx(tEqvyR>0k6;^Rv!*Tq72ljFkVRrE(cD}uA zpHe+ncjvt!gb3?ao>2abUTVVm3R4x`I=HMx3HNz@ov%|=dmENe3L-76NpXJ*HuX@TrS%pI~kJ%F9H@fh{sGlft z#JDQBWyrj0r0ax9X0^!JR>m_43`ayDnd9QWxnZbslx3m>6k0a{TilRuQEE;%&`SvM zg8?e0#NB%Bd=S5Mw8CD2^TzyqGOjwtC&b6qX}W{{p*)u)A4j>mz{bpPlD}F8r4My{ z91(i_a2U=H-yz$-bo%g6NpcHv)<%P_`>~Df5qNx_Ia@hT3dMEG_03j-fUSMs) zGgLi-MH)CIlW|fY!MDcdIM-B(Gy|d(bKbE4g`jIyNMPii=VB{geOu)~pun z+jG@N>hU8aLde+AKzBTZ&)gmyE0&^^joKdm9&`;qPc%wQ3X=U&5 zkC(EW6PeYejjaVW_OPpY&u({kB|alopb!hs430yEzh-{s$jGx1yP%7FK4*0Y3YSyi z$rTYaPiae1S|{ZIY*Yt1O7;N6>+hiz%KZ4QmQlY z{go=&Iq_p2p-rk&VwQQ?rGKtcVcV?;OEt{09OliClW?Gd%V7WrkQS|uM~#ttD%PTE z9aj>2&6b6&^};R3S&SYWE3?`g^#ImW65b&{h6Ig0sw`YZ8l*>TA{>_Ok~;Nu$IYU) zM(lR?0*bBUMf zY)Me50zOhK`=@;T)rAhZ!C$HEeBNv{>Wz#hVn#S{pEFd&uL;-hy0=&I6HltAik5mm zci|P9h01<^YYr%#nCxgt#v`z?G|6J@wP#<}I>xJk-n>~uB0xC&0G-T<9bTuFhaL98 zTGm`1%N=d7^G`$Y0IUTH=CmfL4s@1A;+9$41D8bB;hk=LdjwwPT)5 zrSZY&Y3x0r)1!^!DdEqpuR^ADy{&HbhN+o`iV|??E@7VUpcwYAAxGhLLG8!Zs@}Ct z=FJ%BCmmGoown76dz82r`?xo!-ukM4KgAKbVhT?FKQ3x{lNLRAC zlgVqodp+Bo7tjXi8BGs|`P%PvZ@byj*05N1sh>^`&uPekGTc_Ws`)#yT7G?c|8qwVZb3{-^^W3~NWgk2?BX4E->k zbHmVP2{xZQZPjrgxb};X$81Qq>K%mmRJ-(R2{>urO8YOcGJ}m(Eb<7-Gkhq@7q*pM z+0L0|?19)|IlL2uSt3loY~{u6i-Rkn3VxUYBke&<5uTQOP3p8EyS z?3@Q!Kd|u3fAM0nMH7NOFxkbqO^*hd@YV7Z@Owz!EvvTek>H{@sa#$%3`?W^r{(TG z-(?scOfc7Ctch1g>~}`mQ(Y@;O}Dqh9L-jukne@hT z9}GCi!hQ{>5D_XNcFdK7c=FOMCI*+&(Ck*KT`hI0f4cba-xujNr+@F;`ogoDYyO7$ zhb{X$qwAs3V=kfv_qxmEQ|hE?U1<;obt9F6z)3t73HU@_%~dWIRFzusFMWnm9g-+= zhF!Dxd#j1fB9T(`BAbv}3Fm$H&b0o@^wv-M{>tnYEjLZ6J?m`o0xnmsyQ#{YJF_~_ zKKFkD9~!Lvl7$u=T=Nl>R(x(4sU{H{SAUXYEb{hMUD7{_ zs#ab4a4ENff#U$DUXWnhMtH6CvYw518Zl|77AxMKBK_I^=_>kN>F!skcP>Bl*Rt^? z#q$pTptUtLIw~1BC9Wn~jDW7y$71rWx!qXIY+EBzq#1uNr=tl`Od773l9Wsl)sczh zjCpISQBx^+FbWEk%Fh6v|5IT71>!fi>y@Im4#5niU0ag$kHS6YMGqU7Z;_AXRSh2X?Sb&*Zfp?O7RuTF7=Okhvw6z0iVa`!;5O zy~eV*ZprRJ*4vvy15f$YU_G})VCu*)pidF-njp#ksmPmTA;c@+4>2KIbm0z<{f3d?zmOUIf{pR7q>%uK}mJOqqtZ zby4{ZvCebJSd7+-@m*FzF{k2ED*6hFUy^k{AXl}*&(D(zhRmIZN^CQT-T}Za|jLaDXe2nAD$zy{}mB(G1zkA-o3N9g+T7uTcwfYEib%r2L1- zny;TlHkGQho~rTyqq%?P8PFP;H2VhawyZzwKq9Fu1-Cm0Ly^mRc)o9Pa)y;M75w(H zuk5F=vrC4&U=6OxsY=kDA}6K;9_w;khC@V%ilz#Vm>dB^x4wx-Y{&3z=Dlrlwc2+R z@Cf7zkr=Erd#*AItSd9*20E`Pz84qOt9*q;SMDK2X{OkVgd~J&->0Yf(DeH1=_HT!@CD&h# zdGMRZ80ZQ>TlHD|Tv2ikQhIWJ9$&+#eXS-qQ*Vf1nyM?!1kBZbEW_~;-%;9p zcv0d7unQ4NAWn1wlt+a~QWTGd;=W9iFQtBELHPsDKo$b3=U78opnvH?GdC2{z6z+H zeqw%I7B1piD%Nzb$G7pqagfCvVSdah{gBWbCoFNTzN!@v6+`(vJ_-nsMEf5sCu_Tf z2G?arM*-aqNaPv_$y2`+=GUT_D@d# z-WzR=HI7?B7fzuL}IfV{}&lQ5D$DL#aMUrR*~qa-gKOAdR1* zeMI&T2Y-J3w6v^1ax@Yt^`19uCItS6OIsqJt*0V@g<=m(7UJmm;P}iBj~%`ew*&rr38?gFDr;55~i$&KSGXjqO8pjxQkJ-96;T7uIa=Xk8bOHM`eu%N;)2 z9$Dr!k-VyrNt^_@7dSIeF6YeSwv*hx5@M29S-xgyksfP=jF#zJZSx;SAV`>OC-{G# zaP=nMD*`ln0(5%B$U8>$-$9RM*T>ROD^Etuy7hEChyZxQ^sjToXofSJAE)mR!GBq| zJ)9zc{os)Kqpi}9Me-A|zxtOzK1s0RVi^4&wjrPTx&E+VU;_Qe1{(mJ zF>vsV>4y$TUV!Uqe9w^S*#KR9v6dunj2cT57B1J4=Ls{n=Mv>ueBCJcZ6=D2L1D?i zb*9C-^pTCE?yZcuu&_w&;U}_@_|tzLJoR@%U1Yf!?GDKjL^D<-JV?3lL@rGl-vyii z`Mbf@TWVzvb`uZMFjk%mws`r3W;{sOFq0Bh^_Mn2f;9-mRLac`$D=T1g%t-bfI==a zuMrgEdNe5_^rgH{qhG8VdnwY2`#?+>UGME0s@?ZqSmRRQFw2}ovc_YVOo)82Zk(jL z3h^`Z@Oi)qy4IM|CC^>B!XuzXa({R@i_q{lYHM zqNCwkHrjnwL*jmYZXM)s@I4nePNr#X6^V4&dWN2yxaLexP2N!G4SF7YJQ$}rOGVOl z5YgZtHv+TIULgW}=I9b1i%p~koqi0HzD>8+b2LYIeuv6A%kbc|_=c;6(atoqw)@Ot ztUSo_P4e_Pdkm1@pL@j^f)`fA7f+w_HP~jSFo@Uvy~zar8t$lAwovRENqq0n=Z^AU z>@n7?1w3p?h1$RxKj;8+4hnZwTuD1ky(Ulu+S1xrynW|Mq;JxPVnITm9Rh$X$v8Q7 zk|it3`pM*BeJ3P)0b)5!qQH$W{T;B(+C$}LfHjK7GJIP(TcIEd^+&mJH013Tp~{8S z?&GkA$39vJQPRF;zMfP;p%(-5sz9<%qJWw_Y^44|9)18?n*(h-eGo$T&xPiuzR!;nkQ%*<9qbLpSj5fU=* z)fRd1O^$*8r`-b03s!*tU3S-D#={^L5=_c&m6~4@)chq1%>KkL8%=tn=IEZbf2MP$j%tJ#)YEPNuz9?Cb7{NN@paddY#E}C(n{5;}vIC^{*Fs?(zd`q}sP|EqAdBX> zZ|bsayp$1P9)cVc$$QrhNd+tIFAvH^)Z()5*ORw7XLAbQbY^5%BV#4D!<1wKUK5&-(U8K>r5F%9$UdX%T_&8W&@jqF|i2GbGbf z#hzU^KS2eGMn`;D5kSH}sY~o@wyj>Gt-ta;=X)_qCbh_rpV)$;Rzkic$Opw2%(XI0 zk``v;KWDvGPE6!dm1}HoEjFH1cDH;V4&vRN%_EDVia~nNl9Q@vqXT}Zj$hgSChO9a z>JktNdOZ+dDND~nMZ&+cA4u|`8hJvqAM5~SWO4cHE`7{(U)20jzR&1jYpOWu4)6?B z`-T7iJwY9C@-bN+008xy|FwW*XYFieW?*RjzdC|eTG-?D|Lq9=4R9^eA?!=-)(=EC z>N*)>1F_5U{wr=q0&5shq-ZLZGQM%z+UtC|sZFx~Y?I*FFq?=W>#FvDM@3DI-;1R^ ztIEdb`?=ynGh0tgqlm8LP#2Hho_|46RRAP zO<-+iW#xUaWtkS1F8K$7nfnTaX`&q3arO?2Y@z)QV3@_6vTSo{F^}x&#)>at^g| z60AppK^vLuK7<0kB!Vuga@S7k=K19II81-U*aDxU7N&*&| zfWnTXg3&oyLI-&8;H8!v+bCeg8IW>j)YgvYkxNM?|5*3R{rQM6g9qHRtw<4jXThyp zCC9b&+Jn1F#>HhU&CyZmkA^+#CH=mt07!dGT}CA=6z>JEtfU?~vIk?p($)Cm{hTZ$ zVd=VR+g$JZ1oGzXY$A$4*Z)Lrp%z`3j+Y#$gZemKyb+MU6bG*^tlZ2q&X%h-*|GRqn3@`zgqD}wV8pFWvNLc zj%i799MkmNym4CgAYO%>9LxX}?(cI6ue3kBf=GeowC!N%eN@ zM!`KOugj|R^~*4nr~4COTrj%hwa}s{wvXRpeP>Q`@V`$NcUL?FoX5V7CX1jk0|4#C z1@k1mbW&VeyXEb41C==~K~E7#kQ?VfCfo+TD2Fi*_ryL};_oz)wOh3T0;hX#Z?WQ` zwmJB}PmBABGxO5#cQI7knoI89pD9poA>8*I3>-Def04BaNb9D^QN7-qIvyY)6x*8- zhEtM=G^u5?B$Jk!tzyxwbes}?OaGIJ!G`YFGeBA8dhI~9czJ$;lrCvYQ z_s_RyFZNsYVyu0Wc@KiW!|>Ye-*d$Uxz{GuFdq^^FY0unn1$ z_88h;DJsMk4e;bc;(-XkVVR62V=*)MjCO*neI`$*7-R>nMmQF;AgR8~B75tFbC+?F zusc*pbE{uN5HUnMw*YOfsmlU|A46E6nUy)+%M(XRu==!RzrrptEl%nuI|eCaZCV=I zArrW;5Eb=zizW#6Lgy5Jv8cS15b4M&CNa9*LwN>u!iMtJ*M*|%Q)NcW6b*+9{B*<( z1vcGSFv-5l5SxJXQEH@)^?UoAj6qY5Vxx=O?#@WhYSv^Ot1a5CK{D$Vv|sI!6<5x6 z>50dMSi}5Fmqc-3KSe?BKZ#b&EB!1JsRn)fS&C|2Bz5w9mQ|rj-U=uB5LDZ8{j39h z1I|UM#Vqyid)pw|xB;4LL2V-eT0nHyZVM6Dg^ZF3uoIu5p*8a?0^=

>k@E+pG3EXA{z{2A5Z0|*1WG)5X=evD}tn4pbOj#DLbyBnDm%;vHI%!$e*GYAkWQX*g@ zJ_)$c=GtNwSR|u$zNr@ZxazuKB)QNnn4rd-p81?5>=IMqKXBj-9`2ZdF8uY0ef1=A zS;YN_TtSImNk3Nb7ASm^5?tspuR*N=T#@S{1<~q#56*x97uKL5>T&6Rz$*OGJZa86 zYsUMT$U52_0GGiK`|{kQ9hb}>FC~L;LEN7Rce7xG)x8d?>mH?qbC9NUvU}a+u)i9O z!7eHP#?NAI-;aFm3(3*pXpj3K4-i8z%UCS*lL4Bu4Q_Sd@D$MxqI6QWmmhyFy@$B8 zaCjG?#EJMF+%TqbnA;5#fe~S}Y`Sj5pp#|EgskG$q-&hkY3Ljwi|wwcEBg?DD$k=3 zt|J+2zBDidV?!`hP5)b!dYdr{$rN;I>jY7COjWr|@xPEaLu4qta2SUrxWudgoES#k z@vMWU<1)mw$V;4rY!UhfY$D(`q7kAKm>#eozi((Tq~hk&IR^S)~Hh{C1UV&o>Wlu!J)WjS&eZzzcQvI1pl6CLpM6s`6Pch^L%-0?3 zWdhfr?Mc;N&gXOD*(WY&*|>c*`q7d!z$Dz}nsQXY5?>1h-nZa6Qna@pS68T|7n~?O zY#O5`I3hwy>0{f;QGAG6oC!a&!8~Z1y3=yecDtH?KxBPk)>_xU#Um+%WI)_UjwSyC zAgVo48N}Hvnh7Q`r)(J`An@#$S@M1n;bnu8wmA`j#xxjI0pbqC4=jlFi&AwjFNpo? zr0@@!r091j!?BHvQCS_FFNVL?q-te5ns+epa&0Hjd$9=VTWP4p-5Yg$0K(JR^$}@`)+-R~0Mv9bIYYmoIv;EOAeB z+t{3*=-pCJX z)~&&~=xVk(t90H~eg5Mw4!M+p*d#z*rErdzp@dEjL9VG=5#pw>?ndb&f-L3Tr2)jN$_%*mFdpx|d8mg}%Yq08yXZJv8&96!Fhzm&>n zndC|w)7~8}gO*GGoe8q~st#q^Fo(&S+C$oLwJThi{1?0uAD%q% z&jh~r4{rTf(61f8^&KKZ$G3=%d51Ol5|zQOlB+rw;~B6Mx*T~~>FgPHuIr$$hr~(X zo@ECUs?08ss%Lr}mOD@dW4jzgl(5GcjtDRoJ=IHBehcj)%3d1`unZB6VdYX2@`C5{S40(-vVmsk2|KDe z76o38Cti+rX-#pYMScnOu_ZRwR`Wp(>LoLC6@d!7L~V^Br0W>GrMr+Snoxf-=}LTW z10F~<)Y8-e!SYUwzt6g6^Mcd|(A80GK+^ymNVYrDXv+&|EN;Yb@TopzlqJYngA#+A z*Vn~y;`d@MBqg*pW5`WfU>}k0sL1jkJ7l&C%oF>T`56i+@c2gGXAjy?LQOp3HJgdO zPP(s~EVvH#+kR*K+BhfRKoDVuz8r~?a;&1Vo-`eF?uE3mQTCc8+n!8efl|GKV{%Ww zU{ACQ7^%?eIAR$b72>(fwb8l@iYRQ)Hq_$JjT++WVr?FroPU4{q(UF1Kf_c9%cywx zI7>-O=rWBwnBgOuI>#t)-yb~V>a9RPJkDEi7#LwQMvCpGXUI+Yv^d!kKOjcJ8rzaq zZJ4+U+(5aoXs&-CWY!D?B)oLy*VXMRZf4vP{Pau#tONRdv}X@^4gk*p#wS7Keb&p_ zWY!X}Ntyz=<^-Ep@Q^lo$4x@o;u=+)6_fV~##x}|QcDULI#mg={09&9E()CHxzQ1QKl!e%zTHrFc5HT7F@8i|hs?T5 zd^3&fSir4^`mkPTiyaxZW)mJ9kO8E(dgxyL$=mcRYM z0-~gPwPOeN5xnz9JJBUSHhmpp($Jx`S@J(l0-zCI9NF+7NBJvbFDE(CKR*6R5iHoC z$R?@KG-T|5q%W+Gf+Lr1SJ=B{ZcrbhdB}huPVl3)q8O2<`w({OZwQ}PnnKw<#dy<( zZ_=0h?`43hk8cXx&}uZ_t=cFy8BqdNGbJN6#3|8!7*9B?IX1(-U=-JDk>VLqupCIC zRniEvx!N%{;Kv%lEN?85D8hFdd>FBRfw%9ihLOT>5F5Gy$IxS0GYTH=kVfe@&i|CW zvw1!t{BCa!-KVvjX%1M%8?iFkb9D97g4J|cHAg!9c2K3s!$&x89dO@5aVN6h)=iFy zEzWIb3TvUi#ssYu~LauCebO;R#L4MuGwfL9C4i-L9vTA+4n_d%dWl>kU4W?$*~iAj#rGnxX9R&uBglLCi^t#H+6*9 z;&hp%uidQb4s2Gfrw%x}xYqWVVd$QK6E$_%651gbf{eH7FX8W(_%~%_ue3G7q>ndb z!iNRs^*$(U>Ril#>Skx%eboGf_Qy?9Nz2h=xv`K@tU$V+7(M(M9VAEfFiYj}$>VAd z5s5Dcacd(y9!?v1_q;;7sPCYKP%-r`m88&B?4Q zyR`}Vg8CL=+F`HF*J^q1w%ka8L|kriPXn=@Jl9T#-ZdF2nuH}JueZ#NFu|rFjXM%2 z?_?V}02NA)nUAthsG-Ai3qj_|fksV-pc>At62|YbQf`1o7+FDWxflAi6^?P>tgxr? zcz0V!#GT`1ucLS@C3m=Pz{!!kt&e}+rF?~9td+)rMbJfgcuwxm09gTEyjw2~%Il3E z{S}byfu<95b1{`7bTR|X`v5R?>_}lELQoDLxouf zPGkVVYmJ<&j-J<&smO>&4^vzbzn040D>{&D;ReagG^_#H=#E4iiyTHK{0pfhbqoH_ zEfCRk5WB9ifi?cK!Ctl;u^U8Jd=$86XldzaDLnh}Y7AEbw!A4G5)9iFsYQfL9^?{S zhNf8cXdoj5;o5rt7~5$oAY^q+NPwL2PXQrF$cVlVuqVPj$wN|*9nT6Qz@HAHaBL!# zf*h=}jCNit|1<4;kg}nAm%V>P5i8&IH`Ne`$|b#**~Evx>zr2Wdgw55^dSaGOdV9; zpK9=`lZ8Y$DT8eny2-J>xy53t#=PzKCqwn&c>(t@rQZ^{<0gwN4U93#0wf>^pah`Y z0}cZzhTds!X<$)C+bw--yfEQbmN>dWYKkSFkx6>Y9}MA(WxJ}rF$-@*DVgV~1|hDj z*&R)GMo?G@$D63zkb&w-7OArdCcsvpO|XbS-3aqG^}i~!ez+ytQ{vzSG7_9YlGSDc z*YVIVTW}f^YXNJ78LfVOeE~f4A7a3Ian!@F2iHt+H>AjMt2}`=>D;^uBA_M)y54H? z3W;eX{d3w=E2(vDs^nN=Tw&kOCV=kRm;1kf2LePWf{_No53SV_;l zFS6X|+-n}6ac7($yd)S$84NQi)-gS0%x`9gyeb^ukL`R{5q2!Kkg$_f5x4J@S^fj# zIla_eO^X&_zifM(TFBUuUuYNY_jxRuROYWa(b$yVYF*&T|Ef4mS4BJw9YowXL6=tt z#2y*6;vCrTb3qpBBuHjYDy~_96#jU-npFS-c5_QXwt!@cF}4LS^=q={MGZpI^y8We z=z_Ctlk~i_We0h(yT|6^U-I+v`*i(&UBT`KpD7H(slnV0IdsNd_YJ2ROM`X@6)kk5 zOy$&B!v!%03ohRV@k>T$@XAcyPIw#meAR9ihcD{T_xr$5fg!Ob;Q49Vqa$nmvIi2ZC(6p2Uq$oP*Gkh>@Knmr%#z+ER zTGN*|vbj$=a(z^8-i@B;glLYL#oh9jt5pd-p;F^I1zuj#YHe4fTI@H|M>!RO4kT7= zszY7${9S%$mTcGz&z9JwtttHoF9`EAEPxeN}1O+Iw|>%<1WT{LYF|y&`DQ-sXXz_-9B2!w3o!(f&%n zGw4BMa6U}0&%IZQhB_gYTOK)$j^$dW4MzZ|%NOF3t~%3T@uHMeNY}M1b?O>-CMpBg z;Kcy?JvnMNWV~WhQ7G02c(Dham~vN)p{k`xotB3DNtmB;!VrO0peAc%NgBS3ECV*? zT{&1<`nRX_wJa}AKWjY0<+fU0d^DPPi2f-~j|(=^h=VhI>eTdm6grj2DG8b$X)BxzdTPt}IDk zB34?x(~3&ff0j0*{bQ*(z0ANdRG?E1;ab=ZQ&oH)yCg85oZ zKo9D0kM!x~WDC_fRqY&S)&ArNIAh}NP2|n9bn|dE;-rgoSgcPg^uktyGqKm7DENsV=?m9GI>N)hc?2CZ(@{(yTQ$UZ5UjLScODg>Pn` zqhL5wM>kk9jc7%LzO{LOiXniir(8_jJx8wOmSNU|9+NBO#?G^=Yoe*~%j0Vl+xTsx zg4Mzv37(Hj6#c=N6T7O&P=!?m!(6hpv!q=hWR0aJvrmPI+{JMV!z7K5q@_8b5!*bj^) z`?fFYH{ZOtkiPNH)dxV1m?6VvK}nQfI(pYCU?eiZI#BFMM}&%9UcC;8{YQbK!UwiU z?uRE4VLc-oH2@quj$T-HY{iC#)@cV@YkYi6oMGls@H+K=<)(buPs{Y^PuF;XC8Pew zFfu$rML&e?UcU`90>4E=Lw3*T`kQPveFUoG#B#-yetCq>*0>HP>=Xw$IHy9=afhsk zW|Zj7iLL2kW!2MmY?mczG3=T#Rvt`q=JIWoey?VCm}({-s^+zOmU=8vi;cTRiOGhV zBbMVy*CZG~9)Gq2r4%t4Ez|YvPN+S!M9N5JL8>+aSqj0=ThAcNdNXe@rl z(5p6Pl5~|=F67{}|Mi!N*d(bvP+gpjZRRpDA@Ec2-_BRUjjfE`jJnim^PxFFd-|)m@v%mIy|7>*ihBLvp%rf*l%wpnD< z9{B^l+_k+=*dxeT>C?6}e5*>L=LFv2YN1p(hjzn#V^w@w`}~bl-;uQ1;sP|Xqwbra za{%CtKU{yY4mcS-Y|CM(G%v|sT?f@$W%aPj`s(u)*Ho}KXB&e7zf@ugpJB;))tlqP|Id5jZ@=d6zDD9l7i(m5g=?J#7D+0lv|o$z*)+E<=nE* z-$~lnQZf4FdwvT7{=g<2nTZwEWycin(bt)#YBl&m^DEb?)4$EYdO9pBNW&p!dEuf2 zkC)yNjJbJI{OYWiwSCezjo}cnEM+vmFHc{@R7-k7AJ$h=VNS1`I&~BM zf<>XzTN>_nFm2Ih5z#{IaE_OYf;*!79pq@K3aC%Rf}1bl969+fpoqb;wMgGwLWNWu zEkUX33{0y3&CJ$pBxlqTZ?10Eo)B4#hP}ZgNRzrqDJsQckfx!J$jsT@mC~*>#h*#hpz^>{otCCX0@RfCjBm+?P zkha*;T8poxG3b%CiuP>Jx&DGU9<9o@q| zk(*ix8fvS=KJtg*-86tI^=f6~zdZZCFM)=;**++;Qxq67fGV`a&#fkAuLU-y@^Ajk zS?X2ASP+;^$W{n-NT(6-$hGuxW$B5Ci^w8dD2>niLc#7MI0Omy@dt_ZWtpUd7IF=+ zCPrG{2S1pzih9Ff<6*ZKNbwkBQn3gPIfb zk}&8AMI6^_pW_aB9B@K)krO$g;Wns6MK7*!>vD3gW`}(?rDdY-GR-_xZ0PEoRK+EB z%k-gzJOM&PJl)IH3KY|%Y`HiLyu)pEP4tS?@niifY;02CwywtQGatF<2S>V78nmk4 z%GAvcxXg)?JW@YE4dbudRE6at^h#BQh5Wur$7sMY10GWwU5$EqS)`5z@pvUO^UEZf z!h`loompQ|Y~DS`?7YeLA8;1Rawn!Xz52o#6W_pC$f1De4Ozkdf>Anql@JX!Q177a z*sv8=GFIYPWqM491cQn+r$Vbxf5|HZ-@y$@%2br>EAY(B{)$wJ@qV+);v2gRk|&0Q z>mwS|m!A03`I}&`AqKHznQb*3(?~v087|RR>f zf>G1Q!qMJJSj`bV<`}MD$G(iZlRj;?q>M`6g-`_MMggp zBQQ!Z;h2nzD|iq^M>zpTf@^?(nLTs2ci-| zK|DbOc*Fv5E^uCFXaI;zu;tE^;}r5nHCb)$Qb`rrv9VjV5*``%&{iEW|EhkbZ~d$}n_=4vGDX&%z?6-891ZxT>KZVgvlktrW_gp0G9D`z^4KrzoegC} zKD|3^_=l@n7gV9kIThi5o#_wY{dI^JWk@Ll?U2E0u(4k90TaQUBI3F*A-(VpVvpcx z_Zp~R`WLfHLkZKphMP7*OXK$0&KofW&9Ms-o=65(w;49r5Ig^EcaQcdGWISToqnaZB+S@0C(_bu=$4qJ>RuWuoB4eYf5;y z2(=s1dWnC(H@HsGvmNtjH5IasM*vO5C8T$gaLGKj&XVn?@@xV|82NljsS~mSUU6wiV zVZQJP+j!D-0>&OT-7$KsM9ueDiK!LYoOLt$bG6D0_;|AVOk=6It2KnK*Mqm$H0-zH z@;$PK6A1y|Ly_zKI(=8>hd=Op*7-EI6CkSO!|H99;_7z+d&3tEfEHle;;v-drZ;d0 zwZ=pn|$GQI%ULid2S3OLWxHJLr=wg(GYCj?I+JwI8`^2>{kSM zb@BFB4)X>?ud(FsRnC5w-WEy~!sOOCkKJHLSYTK@5sgYN9kCI~-}fNQGY zZsU67QZWf~iy!f`U)#8T_4gCr0qBCurebl8y_y%1kMw3vNxt>dS6!leH0J zr=~mX57C{}T{v4etRWqhH{uxO_r|qhOF8Z}*B2CJ>wd~uJGycVVcw%js zR3=ei5WwGJLKHPIN<0zxw2SkukT8zofM={$ZOS1*GBH(p;AKAjGoC(mKlPG3rnqb3 zFj0Wve;%7pldWJ1E)$+*@jQCGBXL=Zyh}xY!(_!mZiUge3@*DLyra-Q@JLd|!dnIh zU@nxI!IUk$JekD4h;yrmM(@*BUirH=Pys7nS0e690R z1_}b$f*jn~5xS)&gSJxz_l$^BDq?7ZSK?Mr4TimLI3&j|<9vb}wmzGTDg6}WLM*I3 zkZ<@LU=)d>JrnMDt$ z!WSF|n4w!VoiXhr6w!=&%7t-Q`3FZ}uvKlr4L9WIydAlDbwzTrRNWhj)e|*9WkSL3 z5I6NQO>!3b};># z%?hTt84ve2yr6MbAppB_^SHk2v6DBSvri6Vty(9?{J2In-5i5du;W~w5_;5ghs%2# zFVffuyEdj_UW2veBdmGW+c7)oPs*jfeIfrJoh^5k~La<`;$c(G}_HmWs6H z59`_!TFUP}yy_02u8J;ClZ!TbSyZoTl|v^-J+u!-H8?1F+-@dY;dGQ6xdun~XIkt4 zRaBGXud5LwOSm!1%SO+;-?U%r?tz&h)H|g&m^f^J%L{ZUl9zz1-_7-yUaSbqZ;xP2 z@sQY}z!wk|K@r-3{*-ih!LQDmjmN`N8ZR7f+Sos4SB_{sxmnw0R)?GClr3BRC}e|usoRnAZbxL;uVDOu z5vKi~47P(e3=T}Z`ZqT0R+BwmrJi<{7m}BQR{2S+rj=+>0Mf=r4J5Z$qS?f zblZm+a(76mVfAIa=0+@>Yg3YFJ@h5$c1kvvRyv0b9!8;5$V8YY4V)x_oBGIEZ}C5Rs$ z=2UbV)Zg6y!`L}>=fVYRHnwfswr$(a8{2kvY}>YN8#}h`WXJt=-}S{A;_ZYr;hyS`u;)LEfjQi1*Q0nTwP2xmXDhvVu0({TAVRTsq3j?&{W52N z&sY%7e}#_|F|hRkarjxN`I663=>ZfUo1GLivcW03dPRZk274vxPc*x~k0^&|OF>3I z$>u67BHSmQHY5L%S|?|uoS9B77|y2uPCu_^Hh)^%n105Am>e86f%-)V+izrgXq!B9 zLVMq@r8KF)KD7bu@Y1*TifclfW8^Mx-aw{)+wX03xHu?}uRn!v+W$n|-ti^yMt@1* zQnpd+4QtVCu{a5@M)4P*q%Mpj>xfNFoEYNqQ^(2P_-M5^0^fvcxqe)u)!aS~wh0f4bRCr)m;GszArN zmE|ul*{M|EVYFx9E!9jn%HmaI0VRo$YZW|-3~*Y;bb6a&CoDqhDgfryR#4c<5F9%Q z`93Q#9#(WFbZtu{9oney8gvvmNg-Zan+Y1MEFHM@KuVAc zJDx&1E81F7F&tCK=91!2%vi*ymn;1|kqs>D11Gpav{ z9I`z8G)IUSz%W-U*x?9OT^q0?Q5#nXz!mSI1c}Gw6R^(#rKa|Pe_rcmX&6h9*Q#5)}tUqp^u{F7hsehwjN|*F5T#eUwZTSIh<67creZ9;#yt zdoUl+4k6gj#h9ib2r9Ko+N6CMF zC@h;5ZJ~M7c(=pFav*Iu9&lV*^!M)lrn|m#*!%tG{$%R$*}d`o*?jY5pOG8e?w@f0 zZU)v|dElr}XngyD#ERnHv2&>Jo6}@g@l;;0ly?GM7DBeMZYg8QBnk!d-8?|>oiRe+ z*EIJjH|7t!53yw;MomdgEU}qRr;J4#xGS(E`zKb3VA_Cu1Jgp;Q~il$A0B#+m&I`! zTlFVi$g8W}0LcqoreZshv4?BSkhV>mj5)r$rS%XBH+BAegQ+79Pu0T{3?FL{bPkBV ze`L$h^KRt;K5pr-L;F+Pq`k_AN@MkIZ=J!eGFFk|S$Z^ym>W9}-XvwRFEZ_?1BqHU zQPh_|$Mqm&_0nMeH9tSSd$fM~WtyFQ?~bRjT-D@BLUT^6(&g;4$wm23psI!PeRY9F zI05NZ;NbRb4LCoORs5)5aK4>}Dg2P1j3jJy_{VGBoa-1gCU+rI_Ng2HA+hX)7qi=t zak~93t!Q+{q#u4^@aj&JIpBJ&e!oE^7e>OxMoqp`(~~skl47sAfeo@F^DsbDg37HY zlF;_?NqpOgkcj#*ShFeNGHeswcYn2FA4J#S5V-#wqC;)2->~QTdP_3Qf31_zwHt7{ z(WT3F#Tai$fR|>m?W-?kTy8Ncm%S9FecH4Hw>2;Os?Xir2Ds2Rm;La_RW6_Y*eDU; zBfcwemEcsT`J8DDmV& zbF7q@OlDxv&qB5sIoky&HPS%`i5 zLhOH|zOUz1W8tE84qTsGIWAGdC1tsb4jZieC)q4iK>T#AKEh}d#Xyw+HC-^~dR)@Q z%RTr$-|d*FZ%QHVNpocWFUxI?QWBbz5-b1iLH~=SG!1!ofmu760shzy+O==n-MhKl z*}-m2V9BsVnQHeB(mb2<*bSqDfFrOG9Bs7Z1Cw0DF^iiO$xm~XeXb`-g=eiq#^`N8 z`pSNC1FW+R%>K}azLV7`>uYQ(wwp?X)+2?WPAFG^@F<9t9wM zel5@WZ$Kxr-G0HPp2y&Uc7~U?J05 z>THcMZ``m<2bGX`Ei>$JJCtcnBbt8~%0O z1?Kjk?)!G*b^tU}%zGPA*)s|nJRmI3zlgX{?u>QtpC%$RJU5L0zE2ta2VLAtuc=(` zLU>=MT@o65d?;Apc3<>t!)<&pEK`e~oUx7xgFVaxJ#P@BqOF=xqyndbZ?ninW2&9# z`qgL(GW}t%F1*-@<=rRiWcjTbaqV|K!1w<6{z7p+?&m6g-mr&H;C=aGtlh2?A@Co_Y=xrNJdMgg zC|r*w(hq@1Vk8ybi34k#QPW>rueniSamZcs%&9ODe3@JdKL2JG)JPKpH`6edJ1TA2 zWr2nfFIUYTJAv+Y-Vb&W_xwH1B0gtDo-;S!#x0+n@jw`~&pS)8izE?i zy0WBrZavOxCe7R>Dy;;o??E<9J_+pQu+=+#%7H(`QPBo{bYrhswqJj?)%K32`p!&q z8eQ8QVXb4|5xU@kDjc^e_g|#XuJ6BArT?Q2PL_-FT|pqdE68sPiz!&5rS~Ru77Z8Q z#Jx&P9!QLiM?+*6T*8(A8Q|jKfkmEmc~8bH5}hlP^o}sOpdMB1cvYQecC&Yc z?bJA7`<+YnLIl`wz!$%j}knP&vzy$TcPZ6S1V$Ke}rScA{^lMY0v8RRyi%QYUF{(p~z{V zDV!Mp=@wOPdzOP+JanGTEqX{*#T;evl7tNauX(GYpJrFdl{M#ZQ(h>n@9Zt~v&iI; z)l(}ou2U#=`)msB*JBmE<<*}B!N{Bd>#Lun{omfASEFYC<52w2Bfj=o5)ANcFnL-q zjH4=4;T;pX^o4*pP1 zU&=qZo6)CI5MPekW5rmmv1N z8>gVy794e7I5~sT4EG-r>r|j4Jun#sNGVDlx=1)b6Db};tvDLl!og%+BMd*Nhh;u6 z5x~DTbZy|76*ALQGn8*Z+j$<_LMsdL{yW$zxVM&xet3z2-O%3QrP?rOLEYC@%H8b! zHvvgtdtbOBz5-p!d)C$QgzrER#@#CtOqe5ibyx$63lmAUKIDkR(=iqop;0wS0hmE; zFBFA!(OryfcAJuZtC-SiWl;EUdqHJR&}|J}I&=F-dm!Sy6$KyW%zZ5@nT*YC>4L=l z!w;6zN$DM=p}X(9>Qo!y>;Pg-)_uAp*aPY135|NrrE~@s&*idhrkI#LBRWmPj8a&_ zSAoEj7XBo%-GW74{&j9PTf@>I+xM8)!C>c4?MMU7Uby&Lpuzg7@P$!FQ)5MaU9v*| zNa4Fa*C2!6U3jJ@mX-mMk$Ot ztEAj|`GQwNdQQPyPuQF?o1M}e6r!&?rRRQPD*`6yv>CBhG9G#RCqWPUz6<$Oo3q5d z#TCAh8?FP(0}ku4QzDqBuKBZEMF9mPxCfvKrIIdo4QihvWF7AFt-Zgu-;Hy7_x9!P zZOF&tE~0lAap$)E?QXj_;B8BC^oY{vj+ta)zT)+Xu-I=`%GgeYODeybiv9?rPeWJ7zm}^MlNd>Qt!4XpaXd{-e9= zy4sP=OX2A~Ti*|Z#dB^^d`R6tj0IpDjufyE^rpyZJY`qeJDDY!dc_Op*exQV)^gl9;e{oVZuL@WoiUReCu$ea7>ur6 z*j5G@i1B1DP#Z-2`%7mYm9%QMEjVMe~X;96w{w`QGq$09b7EfHR@2av?L zB9FQqzM!nUIRzYy7>+dttUmfAY$4}O#>RgGILVcL3?Wz-ym>|tLH9EC+U=Hv%K76e zf!lvAT@a!^x{wL-{u9Y39y<$zIQ$p5VuLHR2Xv?%{c*c)G^xmqkJKleS@Q8WfeYg~ z4F4L^usi0%H(xXaii%#Lz1Zw#<12yJ(udDhdh!0x_p%!_rA$JN^3|B$U8H!(a6Y_%8C2Z zk`4c6UmZ}CM{NcPJvxjUWAj}0#+xl*_tPzVm-Nqd#lP4;-a+Dlb!hE*KMQ63sj&)H z$8W~(f+hZ&VHOq^B7q`L-I$*Wr~O{kkSGiv?@XVMMvuKxH-y=GGBGPxBTZD3j_76g z6@<|@sdQ1?12=x}XK`p>>pQ!hoBaw#t8~T`C4VOe`E;B4_5WB1PmX@>Y+EAyb2@{` z>0t!ggLP_iSPGC#{V{F|!U5h|1#+CoaS^xJZ5ahaQ7tU&vox$RFVN+>b~SlKy>_Km zxHY*3F-R;N_8bOz*^kj&DDYJI6BS8=zA9S3jBs3^FU{eieK`V6k1vWOmzWP-pNU0; zrmJO)PRdC}l_h%u6Ru1|nDo9%C^N|@+;%+*$}$3IWIP?F1A6}OlcmyedGR~|LV zFjd@TUz@DbFtCBWS(UuU@O4d)Kt{UQCUwy}`vwi;Ko$2p!?Rz`h(C-wE=xqaP|ANN zs*oqj^kYN)m&0iLW(iOIuG{0+JF%1lV*W14L#0=7%nblVdo4o0vVnI=|KbRs z1oYvH(!cMs>`^pQvPQ?<%HfyZ{eu4gi1Lf%?&CQ#5YY4r5D?A(s4_Kmu(LC_cm3bk zOl>^2INHw7jx~v@RAp-E1idYCSsPE}vO4Te%jE4374B--WTR26qEY{>B&gweZ2tPc z!7`$xoQ&LD)LhiKs6+#C1jfe3eh-a346pjSdE7P6-&W199GP^=J?X4oIJZV#spZx` zY3HJQftP9>*yd@>X`-iB>Xb2aP_K~qq*u|^H<782c2=ELeiTwAW18!zTPvegCknk! z)8zHWGUk|k=+u^X?aM&`?Y-SzF80b@vB(x8hT_#XHr-YsHe@VxG{Y! z1M>artI@o*YB4mEpKO&ymw$x#<1nLT#4)Y-A3kGNdZ>130&fwLrs>M2JfWp(SL5uz zo}n2+f`8F|p685l(w}TO#z(2PCU7dxX!Y7WnMu}_%=J&Jf}`HS2W?}G@9GR}RtW<3 zaF?}is)Ih(c6dKXeVsP{r9w)2+?kzK&D$)liFZ@_BZ7uYso$|zgEUP`r@=vJ9nB&9 z;F(7JlSEl_D!4>mHCs2eCN_^gB$;k}#!O`h9Qr*`3-ywt@Qa{;nql1wlHQ!9XH zLr(c5Lm`PRL`hiKV6=ebo1|IC&|H1x6_Rodc;16tQvoFN7%%z-D=nh|=+vPRK`Ty+ zCtcM|iWzX+CLDN|Sf>{T9AUfHl>aj`u;tFe_9ET#c;-;)k8Ox3K2k(Cq3;PX0fS^J z)n{`-#ZL#XHGiIyhYWJ5#?ssZO6txS1UPVj>W(=0j^dBGw{8W6?;2cqUBVVlx6>#X zFh(?{SBiUAg!G&s8YW-wqu;GpD>P%5NT zAIOuYRZvgRw63K1sS}{8f^~>m*y77!h2;I!k1vpL<}j|nu7Ij&GAC&0HIyi+A1gG{ zNz4G3tj(^AK%sRk6q*F~PMOKRDwWYiQWbM-_IZ1{%;UFqYwPyy(}*{(n^BDR+hilN zI3;^TZ#QlD%;QW4^H(P#k!Fb}4o)(<&7*=+zi-kX-Y5E->HaNL3ndpAHt7Ui=QhD3 zApHK|MvO~*^ha6DNhsLJK*kxP&xBHN;YZz+(SHr64plDSaa9nC@k6!C?>d>kfzMY} zf#J&(j?A7?*ls}w#HCmYjAiz6{61%HM5?rc$ADu&8V+5wqGAg=BygA5>4K5%k(lG| zYmST`_P{WI$mWELc+_7J*MX#>^+1(GMf-r8SYXw)s)^vCwE`>-;*^Od} zC_Tzg#qm7_rideJ1M@sfnfNda>!$bT>0mE;HQc31K+~0+ie^9~N;t`4RHYF}hjwen zu55iGACblf4PVj=oAPlUfd=mN`?}uKpF>HWL{j0|6i1gTUMC{Y@Hl0r|q3+D@J2vDUKa;_f^r zd1Xt`m#2A}thJZR!CixrG1K>J+u%lax9ve-A8~gdqi(6x3lqFS3Rzh#8m^JK=+UB% zm=#-K$UUwh9!d}ehn(6}2a=J(U72jRSlx9d38=cImSi!AOSEH*b;W_FwdnZvA}}=m zvfrEM9(Xg^$5o9Kf%6tCem`TdkoYs9xD)D`Wc&Qo^@qKc^Bc~-G(SGS2VL!wyuNkU z1OdOrPI&=)`uZ)rK%i!JgCA?%Vf}e}52>>$*PD2YklURHUBa0W$8P%G(~|BJc`zYP z!tu4+xWCfwM>oO|XcJyPldG+;1uQaw%ArMj;W8MGI1}7jMc;@>kPpT??0VA{K6zB?jmK zDxwD4ZXrkPHO472ay{%P#9%y?&nGwl&^@uE{URYmH93r&sz;&rB%UWK=oQY+w<0@i zs91p==B|o+EBu{<4j6jX`PfiF0JGT_u_UO=DFcJMD=TQAqt6yd89%k^KW5oa3F5Av z9z5dV@rU!O5cpXfcLr$GnJ#6GK0)g$#x!e5@Hn+K~ZbXp&>4c&CmU|U5izKrvRkYXZ?hD?#m!BztspCDivso2l2 zCa0>nj|i%Ldx5N0;bwh_&P~ghs&vT7UJ=dhfd!=0Dar$47l}&A8 zmM}Elx1aIV-4D#4Z#fj3JfenwBa?o-(5eLW&Rurzt z^jBTZJm4kObBxGaq}&0%3VWb+6p{GREE0x6G5r`XY9W>N{~>bI^~4Fjd_KHkzl3n~ z32P2YVodG}X%bRQ2{42>nCeviWgwBbs`e>Q095FDmiNn{NykhDaaq5qM+WwWlwGUfnZdP`Es$r za9_>!ldALmu$iW8m_|E0sMf^#MDbRnpf-_Q1)_X+5Jzf>W#VxzeFbeeaW*HlivZ!h zf>~in+-^S{cst;?^#U@Qj(P-e)*rHHGH5!^mPp_DR6_(A=efS>?%f!{Upk~Qy)>j;Y<-zHa$yCMRGkF)kjcoQS_H>$4*hMG4836+`s%; zLv@11dD^h3H8JwrR2FWG)f6-9Y>20;t>srR9QRi-crz z9fK0T?~U3|*}!~-w1+Cf!VTKGtEE5%+QVjJ{Xt&d9E#!DGoNlPh6VRbwnlMvTz(1PvAt>Cj6$+p%Wy##V(A)9<(n7_+b{k`1ZQF));LPOz(P@ zIXmHWIy@!zY_=*AnrPpj+B$WYHVyBfI(U{>S?ZJ1MP?zC8(PtBy*f`lbIm9tVZ(k^ z#2*T5II$$?vj0>SB$Vi9kPEaM!x31K_7>GO=7n>3w=tm^7?sMWEb-DZjK#F(;J{>{ znwXoL_@7Dni-^N1uuMQH5h>)=5}5tKBohtlENQ0y!GK<8ff}3Pu83m7a+JH?<6YdD z?ueakTU0~Fxv*CrMbkL8Lvbj>|CYKhi^s5NefYOhCABDe*FefWu@uD#tP%!B`gbrc zp-YGn+%6Bo!E#GSW&J9G@oJU~RWW2375nv3wG_V%XB3A!)_(AAc>YS=n2qx~JP76o zFqkg5F%v)&_wP>b7MRo)K{O!a$n_FPzZB*^1oC#}{g(+T<^uY=;RkP0EpPWaaeyJ| zYs0w!z1Njd(%mN>q2Xu=wtiv}wR=3#lmUN(1i5VlO1j!Skz`1zRXmOO^ejzUx6EqS zAxE~%oNXV5@Ou9&-B0>@?=2FB9Ci#WWLU2KSvGOSX1LsuZHx?TviM|^o3FLdImUBN zt$|5Yams0+Z7J)Ra6NBw>&zM13vcU?+|_2w96NdAuR8$w6JHe@}Uq@l?t!+UzY2F#8j#f=Sqr7?fY|iK7gMB0o0bbqFx3zKzK++lB z(mpsjVUCYk?-mq$x^N3+CtV?{jMexXGf|!$nC0CH!f)Xlti$us*-7qKU}(kt&`)>t zRueZx2~Bt$1f*m1vJW<}=SM&l)zxK)%O};;EqBs-a|*v%rq_wzZ~d%X6Ur*N1-Ncq zT%|0NU(-e{9M1h#nlg%qrZMzVgL@zB>(+#RA& zOrnN_q}FIemL2{lUFnFCUS=~Em9U4#uGMKsr?4O-<~$9WT7_%!UNz4dyo-iWd-8(d zZxvYZWJ_3(k_tMDHlUI`cg_Lb0O22j!{4G-?w|r#s5vD;85Cd_WFxcMigZp^;3TEG zu$uEiiQo>hjtKs35l!g=((^3}LLnHk0mLj>uy+S5=-F2&;;^_~;x7#@b?1Q3^D7Fc zxjLHE>)KUZne?Y_qck7@r}=@`#Jk$0yE&?h=R)4fBR2@gD`=WeRZVyhNe38~N>B4! zUdbWs=-h;KE=9zFYOEL{M!pnvxeL}~-!1-GhO01{l`~>_zx=!-$mjR_*)aq8gtG9! z(teT#+C09exJQsM6niD{@saN)kMWe=Wb#fa0f)kEVS4I_rg9)-)JXR2%_)l|!}^-N zaR+TACGQ9LjI?-egrCS6gSNVK_gw)mZ&rMxC>r0ks!kFZyUmnUN~XmeZ@iBG7F64p_i zXp$o~Rdyd|By#nasfP?3cNl7cy8$vNm^99q6UGw80Ri;fRARrj4P9HNHd*k%lhZ6Q zA-Z$7#QJw)_)MA8G9SiTi+)5(b<}A`((dV#*^seF~Qm8&YTUaInnC#}-z%NIf;a3FYoeH~&4@s;7A#n&oLP$myAxML} z-LSuu6ic(WT#%N=wPEeYzamLDex|~;9=q5j!QO227Vgc(uE_z`2@e}ZMu(x7;WiDK zoP7x$DI8h*y4p32rvyjGgAp}=wrC6qNUT`o>m!UCJ3AGqbwzvQAkgf}pxgs?HuiI! z{Q~2&M8)!k05uEc9vvg(qfjFzZzs{Pp_Xos^| z6J~s$zrwD1+55iVH<|86A1}g#v$Rnr9y%NG?r>68u9N(lXI5EiAqYQ*rT|c%AeA-N zaM1R%O8g+)M9dEH+QC1P$pd`X_ht$WOlU=+VT6YsqugL$b*N6kS<<$5-tZi~yLz%E zm!5{$`S4uX-;G-iwemmf@g*ln>CP7=!^Sdh?rl(61qH2pD=qUB6AR#Mbe+A;gn@Pe zud-|Uyr?n`q=LpPP6sihkhzhC5{a>e(QQi|SmVUlAh30mU$s_6+4rUX^aoFm8_?1o zpuymu@>mowF05#(wXkzAKfMGob?61)@d(?MUe_COtN!lYY4sY&&i_?@r$X=ia=V}h zfKL49d^|P4c+C;e!x$4F7McwRJ@>-F80pp%a`pf<5c5%*4_G9>b|*Lt9SXXc`x^XD zjQG_hU3gv5X51k#jt95M7Cz(Xq5L$PzmJ(tt=yUdsb!=;u5q=!e)L-13brM@DagHv ztbym-eVw#EY?EEMM8O7MZsIC(uX~`PX^VyF9TXKtD;%eoR30`MgyrqMF_v^*2}e^;U=(Z01cQo6)_v!{ z0wV4Z{60-OyxjWL1qzqOHOCzu-}P#WHT5!TZU2h#GUL=5L;E$q?%KfV-6wuAh(D<3 z&iunIvWZT>tIN=P$Tr>_zPisqu?xcKk)pE={O<&z_^G9t|1HW`#~^_09k1mA|20H4Q&>5HkbJ>FBUHl_oi#vVMlVr;xv_QVhO?WsX_A#DUQ?xSX6UoHHmIjUnxbi`)B z)a&s8!ZThNs6xTHGEB<8W(AVldixjbD)iQaI9f(8*!TUIHpHh}O?&Q;l>}eD9)aA7 z#?M4PN{GlX=2h~uCU6MmucxkdfIx>v67dGB5xM#|p$Sre^3cy8`hw38hG44Xr?$1T zSGhtd@VNTGc_%W8C@tEmpSk1Ji|PK{K3{x47x!0_NB*xYzK@URZdT`(pZn3H$-Tht zpg6UZL)$gzaeggXc!`mG%h$9r~jZZ&*tUb`T68rm|?; zHptYssj5v~j7jgr+e{6gUerMG;(#O#Rv}1w_@B7)(Jq2ze&*vcgy^;Z%$S(5-h!w6 zPq@vr%Qh3&uNK27_SdD*KOB3W}7Gtxj!VYG9GM~hol zE}XH+Z{!1z#L=+HXVMK#(+JR`-< z`3g#OF{sKUyTDL5W5hWnhDO{VpmQG#qhQ4b0w`Qg@-OO{i=zziT1~zKjO_GBz8sd| z&>rPzcv6E4cCdbNE7*=TeA&t{NCa4up-|csZ{|h}wZ6qb)s5&iP*>|&+u!D5s3SFs zo$0j2kfiK#*B|%lk~$WGFzCWKh<%|@Y{48AfCV^Ur1-C8N(qnzCz~6ST77?o@hsDTu&?k@(6#dK|LGzD!HwsLT)`PKynQcBIH4It1tA*AEHgZ+z zEM%XjX5z_I+yHY;b7ofR{3f?-eQ4T{`6r$+|SnFpDWHtjMe^<&YW1B9fmaSE|U z>Qkso|3yjn9tBXMC!f>$_5|J4Qf31AQi z8RDD&^ngh=%^wT<#G9<$#_WdThc^RV|I$$JgVKr&r756MI}U_;Tk<&dX9@40r&tMw zGf9sEQ;7tQCkawqgwEUw2uJww3YE%pVg7`A>pq)59-W#+6i!CAwxdfb(3zbxCO~0` z8mPfBd*B&~_Vvuy!(0%eVbiQFDN|M=li~H5XAVkdC|ck_)+r|XYshEFzf!x=evQC< z4dcT2S>f|&(7F~^A>%qzg&~WUYeI~eeDT)25mdB6 z;zb>X&WQ{!^6NG@G`Mx~9w|51dT<_)d@v;9<<0lGeyb0TU z-u{^cumD47g7^@Dt_YXp^@kc~)?jqGS3LTQIeji1PF~2qob2`b^k4}r;OcO%IF|>R zz95wK+#8s=C?AGDzPQ22BMV<3L@n!%=;Y`D4wQ?T!;&B#*Cgu+ByW&@_ne`F0jo9( zn?G-~0n}eNt8{jZD`{6?IdNq7p3K?f=IqicY-pTomYyFw8^^!?|Ajp~r{c~Wly0rH z6B?=Z%P*%kb?}#8bzweS(^MIy_sbjKU4SkO8nW&M$jY?wYtG^IWOqTGECbyaE2X32 zFVd}9Zp|V+d#7@paZ{-}-ny==ZuQWEL3y?7%9m+ww*FdGXKF*_7LzUjK;`_ttEmx$ zn(GPpecUc3NnN*DyKW6I4;OI&=l=LsI3(o|{;?WsZ2#?ed z|B)yG1S}c*1>OGh*@O@%pRq+wqYg1_g(bNBf11lbKB zJ?NvzxSjQ}zFr7XyH+!*_O%3bCR+Bn<&&8z$zHg+Mv|oGpu3-d0~Q%BytG>}S=JG=00JpXPr%U?@`Womh}0!JX?vtYFY1xih3m45 z?_>2R0-UcMBJF&Q{xFdFQKVinTU67%~`sk1EbsZBAno-a*~y*?*#)zaV~z4c>HXywXDtFpfaPyIV)W}(uRBbrjr@67vAT0sE_{^@FcO| z0`+s0L_|MPG70!AyUtApj^$7jK~Vz|unJve{<3?YDy>mqnxq-%V8Zl=+`5r8r;wc} z80_sY9+wy`2(uTeDx7fVzm^!z%PJV}VhvMK-r24D$&YiulPZ5fUf> z0VTg2yv?I$fpa~0YK(6>f}-T-N}8FIi{$65r673N@QPq#Ss;LZsJ9+918}LN9)v*T ztyeCdDW438&2tP9U&sh_6-MQ-T3R1xB4-w0p`ssET2sW=iN-Q`;U3~|(2x$KDTsDkekb0g83{b5P=}K+5&`Py7>n#X=)a$+;xayDnY2o}#(R zdSxYx4Sl^Vi;sH*=PXw_My#6Jc&x1$40;Uma>5ETOo|VlnA7p@)YA3$Th3&b6}eHm ze{Er5Lv&iT*7CfR-%xbiu+cNA^8%B~!F#c<{dP0S^P4*}GM|64)BM7mI^8g@gjC|D z*hqyuU2WlzP6@X=EQ+lg?;{jie1g^BupEjtZtuZ83Qh1xU&&O8O>?C?8Vir&wCu*n zg;N=;_si^nETg?Lv#pXk-_ZpB_7a{O?mb!_{zU@6{gORcde8LUxb~ChJHV2Wvi=9L zm$hB~m2UoKJu*zW5LewKT<~%#`haZx-kibI&>cVD_iIUsoLdPE8z@Lk4fRx&TpMjY z!&?y*8Bs5UJMLm5HP8RCsa%ntpR_1hpClp=BlLK^5a6OEQ-=Pr%2#~j6rvJAPJ?lK z&d0pQWG?lOt(>oW0}E8}Tn2IMd7GGxl|}ibEATHq_LG@buOiY++z#14dX^=nlA}jB zOnhQha*YpDhwsZi|T*-xla9qQI_oJT9NiP>(OZh7p2h?qgrVSCS5`y0ZuwNJQ z!TcB9H^ScOl(=@1EiKELHwUWw#h`vC$lWMMNzP+?x($BW#Y4=kYu>eK&uES0t&}^C zNz-;ZX1|P>V{;QYDQOLqE(M@2g)e9`|7+<0Mmh0cu#4-FE_&WSa*~Hqrh`nu%cV=P?A^m!frF#Y@*72GYCcMghqs}a$++SB5V0m zV#8`xABk%5v0{#|pZDvgy31~cM-i#G+cyR`K?=Fvb06dwl-wq3**cZT7yhm4GFaw7UX zXFHTb33nJh@Y5ieUntBlT39QVWTc=^*Ig3fimtwOI z1?Tm!c2Y6fFkBBQ!C|rDAdz)0&m$|zx{YPznWw`HkpKFU%4?@ce>w6Z>+9o-@%gla zdbZG?(KUAl0n-SFNqUh4a_?oIY{~7twryxwDNn;4Tm<;{4n|&L&pFFH{!Gwr*`U{# z?X|$b-)+%aI$1WwCR}?+w+ub{;=l+3nEO}=T=UFCL;`~4TTHGtiHy?UtKQ#6^{Ol> zH<=K9+Hrv08D6ri!dIkg@dEY(dw6y@W&Wb*hSbZQdT)tXTR#7uF!WKMo(>~xH;HHR zNJ^_5*3M%$ZMqc}f7xQ@9dUF+hsYhIj2c%;!UBY@n~Aq2KeDa$-~~>H9K3~%#0`ey zq;@38S%pdAdUVFN49M>fg2-7QB=k4hoAZA9wzG{*dZkatT2@B}K4u|02}5h~@Ih}_PU5g@Oe0`0irg+AqIW47?Ar_5M0IT9McCq460rH$lBbKSU?$N+{q9$v+U2;{-A<> z8TF`!Y$j;7Ku@&nhL`gsnBcm`ESUX)LQ-YJEPU?0%di4rS>j({Gzgm~>=V!8=T2~v zLJsY9@K*;zuMiLoy}!w$-Qb29*0E87978?-2D}H;70WdTD(9HpR_XASqkK(#Qxafa zc4vC@<(dvA!YWi7faU{4em8ZK4EQziOQL&_rK{tt60xdET9emKt9ACESbApWURASi zwFJdx6q^_3K0h{|7zz1(%pIVt%Gb0I-(28QMxeZ8f-Lsn4xBC^Mak;5lX|16WHaRr zD9A@eU?NeU!ylI6VE$k9ljNX50&xb7Z5(HXU zf~UAHIKs8K@KLCKA_LesNI!H&ijePl$y0kx9*j#G+Y#7p6NWM|cjFYX%GBKxWz%YX z<7ASE(UAivk}e??V!DW^bQqS{BCojS8JOny6gQF-?|!F1qtJmeoUAFiCYkQIg$tnq zY{SyOpi9314a}=Co*mUFhG!?9ccoCu;+-H9Rw9AdE^+dIrX69cJU#@*_A4Q$JO_-~ z5hLhwexwnxh4#soMko(JKQ!@UjuAhaABta=e;v=i6Ik9oCraf_>==SJ6Z^w2m+@o$ z^`j(+S=r_P9{C;ht)MYhYCVghFJ+02)m#y-N(dAuoHDoBy^ZAP)IV@}yO^cO!kfK~ zw2)x=`nF0>W{$frHwb9)Lk7<)HX4>8OTe*W3#pRJyS{?ooG-9~qkxwMr}Mh*iH0$9 zCGNrLps8P;a+nU0-aj)@B|!fN6lbdEH0DIIi52r;?G!2&%KnLNIrhAE#$>B)4#XK) zv>9mjLVzU6-^az*1xTJstcNSgqX?Y$WimHD*xq` zOl@PgQ79r;lw%+X+aj<#$7VSq(kYZzcEk5FzMyzfpu18=$kBiPV?eieh}Rq+v-3ot zKO8NT0=cY$?SF{I&ei5V`nOoq+q2~_hg3#d4?i10$|CNaErLK&cYpqnv6igsKKIJdz;ykkUK92c^ zz#wS(7^*i3?T{9zA5bvSHp9gy--MDAe!hbeFSWyh69XW6L^MPU8YC@C7W{(jMEPZs zPUnx1-jrNIZYA7Racy7D=;;z>Ic&WzgjY50%BFnB$p5~`%%<6gL;lH4S+x+}U|@PJ z8m=gK^G!UfrabdLlyB8X{9h2!A;OPc6;bt7yU;(MLXz`{;lQn)Mafgn9zIM*$=!1) zI*GEcb)5RIZL~mVVyNorPT@n#w@p$i?hUUBSg&L^k^$pVzT>^6)wH^PV$aS!=?s<8 zR+X>M=hr-L|J`o2vD&b|5(kq^)@1v)AD1F-vu*n-dU zdoLiNV#Oz`R-VIv;=-Onud}%B$M9o0!7mmW+*varCk~+jWMRtzv&=NiO0N`FtU06i zL`>PL`QWjm{F{b(;Shg^3EnS>v<5S2&Z@lr_@gh<)TIQO&hK|TE?eM%+rN-?hVKv& zw{DiF`jVL=7Z6)W+B6o*zLsFz9uON zm$q#NBc?Bnn8~C>z z%W#Ljxhcr{$PuX{Ag&ZeERZup#9X8~xc*?a)2IUB@4z$Ao7=qVJOpAPHx!P3P z|44QTx1|`Z;SAVpP2yt5vF7n&fFdYE;I@-}8_C*nHKXqgf;&%cqlsn@UIblb?(!kZ zbFt60eeXhTZ3S(_ycvNI*>yed5;Hn{L3v?&25rw~7enrR|9AEc>VZzrCuHp2CGeow z-|crI1G(d7I4zIu+_q{XaIhw8{eo?x2kM5zFShMZU^oX5kVxn}P!K98u4uGa&7?qA zBbqLDkBTlT!+QRXWkzwF&@{Dh*&<;ZlZJ7|wi&t!_kzC#!S%p58yl@^U&8y5a66Va9M z(0Wl&uh_7`j7kWAH(=;wIO0X;gywzI$!(@^Z!M)H0x6`MGS;EvcT1r5%_2<97^rPi ze&@Je-|f7`F=es-{Cs)R;WPX149?cfO5g(QHnf&L@9?U+OeZzmG@F+&4p0$fbr{U}BBLKQ_^vb?DP2H@<5jAQkj&Ok71|U5QJohm-i8tf2yIv0oPviB<5}u>8x?@W#ibL? z+~non)y-`fBbRN2wo)tgI4qJCz_!hu3jUcoKePweeLT`Jvr80t3+F11*!Vwmol|ot zK$k^h+qP}nwr$(ClN;N)v2EM7ZQt0FhpCyGn))94C-mv+U1zPmB$h3Rif{bbzjqn# z5_K+*g%QmrhetTJbUquGk2KS@nc2)N*%)V;L59?C&g3K_Rf5!=Om$OU7c<#<7y96$ z(|gxcpbZ8g(lqo$_2VD#T=S9-Y;Gcgd1ztdBR#b=9G3vxWKDY<-kW|}(JM2r(Fm~nXEo2Of`)Ft_Q%p`0MAJXV>}n^G@exNY^YK@i6)N6h7);^ z%j3q`P@m6O_)V7`%A1%n{CLf&4>DEX0%FY9QSzT z_On}>GaaS#?2cUQM|iocQ8>ZpxFc@*hMms+)#o_xqO(9+XU=v%+>)3-sGRK)iVq+t z7b~nDiO42AB;(m(MndcYcS2A&P93B~L{jmHKob?TS0pg9%L4b&AK*+xuxWqL7)!3% zXe<`0mkQ&oney1dys^ULQ;yyxc{~8qIc39ToZXf}J=ipR2bk%F&Tvw8I_$xNMy%S^ zKBoh2-Gb%M&WLFu^218sdl#(>&=0URW6Ar2T_A3)+NDO0UX5U=dG3A>Q4P8>m}H!2 z5Bo)A-o12_wb6fY1kbdE`|5)xQc7#-1Yzrauh=@1kO;*}y3JbhX_~mKl@sO_!|mx( zv2AYFpu`PXvI5RAY^;ooYh7GEn4|3vM{GV03wFRJ~3;zC(S6f18e6 zuQ8tY&KdlkFWaEs%`jf0tjTJeU3L21^eysp+>4VT-!16!0fG)w0k5Zfgi7@$n0922Wc*XUb)$DxST7=BpT)S06Oal9V7FglhS)(*Xl zzbtS+Bx6J%64u)Ryx<@||5xu$<2l%A#|NjORZUDYaQ`E%Id8p9ct9w zbvS&6ISc(lqsl21M}u_MbUG%@SiQsO*z@P<%+t3q^iUt&1hy@0SLsxhx-l#Kr3Nc{p?ez_n zZ?Wd}jh%BF>#L;!u^whiwvpr6e- zousPX+M6dv$LkNJbAAnd0IBiNGnH}HNJBy@xSNzi$r3xz%sB0ugIb~B5*1zesyDjl zZrQ)9NFJ9SPZ?P3b5))}`UU+oH7!&!b*`!SfZO^?YM(so`MEi@nQ+b0j3Kc_DBg#uPGlYKG9+^>}vQ9N#l zmo*Zl`k^R_*k8^ax(=G1|l9NMWp;quS zxw6tsHEn8}u}YrI@ME+eWg& z=<|Y9uSY3S$YhxgR%3TTEUQ7f8X>t#QR`8@ZDi(p?&c?dBk^>8x|Eq(%IfVJxsRc= zUCc8Et^$?!xqY)&Ut+Ni3#<#%vRSpAi%S9clr27-Vpi+|9&a3uFwL9!pKzO(QZ}KP&KtxRtWSDhGhx4ey^cQ*;(y1#2$F$ zjfpeO%;jW+xFJ8A1y*S;_yEt8dhvGsRy8uumYK{JA4BUYs42cEbJBRzXDUH^;}?0_ zfnYy;X9eO!88-0JC(;vMx~UFJfVXua>_}T+pqhL(j(ZM|V)3KBXGgK`;5J?Dk`6q- z#k5fl6mk8G<=Do16LBJcjy^}!aJfEcMNg`uN9=ARsrFS~hVp#?r%0NE$N)La*xCo@ zF6-D|k|_meZ;PzSP71R`A0%{H8WYHFXpdeAl7c+s!_e1A_>-;L;cJsVF4Ab#yeVHM z)@pdT0;_h}l-#|3)->#!6`JSP_|4M+4Ds_gI!l}56cU^T)};CdnS(Ot;B@kb+GIXs z(FZ1c&sRPRi%m$ZD~m%s*R0GI#;vik7(zRUn@j>HVlbviraj46@DkJa9IJYHXNl%$eMybO|L%SLczAjEGPqnocQs=al*S%qr$;odx_U)_ zk%k!p=#V9TCC#-Wn%d6Vy)AI^?cHZD>~gPlx4p)6K1iUkZSg|Nmc*HvweR*T89}FZ zx`%$1@$2K)Fpw+v1peo;UUC{y$}}+_9h!rcQm|6JTp>sHvuqNI$#0q&8_UI*EGqJ7 z%oSNzC=Q6?@k0({Ay^VxymmUu4C|Gd;()o$DhhsS&FjZe= z8i#f}6%Q<<84{ubJ$oroMFN*~*6gPyw_xHB-@|Y#>aTUI5X0p_6Gt;C+>w;4prHWp} zn)GxprR*&MeKmkNh>Zo=tvTY@vI3jNXW!8OO9hTsZ}FwWYuNA>001E700H3r$ARu( z@9gqFBfLTy>i>-J>uzsA> zi$vT&fFLjtXByuZ?NiNCJlG&FlZHh2ByG5^MnXKg$Kdg?Cx$n4WtIray%ILh)$?*r%?Uq;TPQC`&>tU)ah2p7tM6g=A4^#R$mX#Otxjzr>mCqql0U4 zw6;jh;pi`0+yF||2aTBWQm8+@U3VB#O*p5os@gJZ(}q8tP82yoruq<`iZuU}Okcsm z1zqBDVZEV!JH8GVeLf1uR*Jd?p@d01AEvgQMO!g;l&LR|HB$q-WV1gtXvNNEIkFDZ zmo7II%TK;Ltyf)~t@c)59xtEK+DH6!>(Zk=98cUBDb{2zH-&Wr#Z0BOSzj)5ep$Qr z^l)UTPNQIda@C|kZ>fv-AF`9*{Aj&eciE{wM1L)oYVY@^J#ChR27~$c zIlaiAPDVqS0g}wozrVP5M9k$>#}Nu$^zb5T6)oB?Rw5ELa%GH2eD_95ASSSrD1H5N zFIG&y@N3qh%}Q!MEM?E1u`Zt%tR6X?bC%8|k-}-O;qUNNUrp5U=Ih0&&ie7<>I^t1 zDtKd!%N+lyw?VwSNgu89x(v&#-n5laiagWmKt$?fT<(IfL^eB6XwOxfRO~TC5B*9* zN}|C(m;8R^Pe~qGwo&b1k?!Segv+0Hfk9@5S+YpRuEA`*~x&Ipq0&sAzGcC&Q97`#8)dcnl92R9O@-( z-t8OPq2-IBY5K`E?Tu{`n0AKoxF)clk4vpN04aAi2#uRfwXe?l_#+bojgPWHDLxBM zpb4y;XtFjsyARrDCbqnaJhX#KMV@;p#mS{TL@R0sKgLf0-MUwdn}|d;;$6<~5v~GG^OdZ^Wh?4pMu1rNtQzHYHregCTT{(!tf1f(&93=ZZy z#BClNK?TTOEL!pE3Z71yanXKX=yl3%II+LN6ukac!Ypl8!o=-&T0qjDPO?`6Yqc4w z_kHBEL&VSFgRmmxKqHWVzy6Q|6yWI69dHKmrH}zAWG>JBIUEvr*{#5sHMhUiR1Plr z#mA=smj=3F0pu6oK4D#S=pDegsLn0Z9$Ke|zBa%3_-f5$y%n=((jxeCnfstxK)9ie zsKpHbvUUe+EgrJJ#LTfEzFgOfaY*l2c!bBIANM za~2({=6`#@i*t!!c!U^CE_`DuVeY+!0eem6G!-h#*Trh2J}vPo?r>Q-Cj{Xr1iRq+2P{}VeK^Z=743N5?rV6`D|#r_R9G~SF!xsrQY)qx8JSr_ja6v zjhJN^tvA0(9ABN)orUwo=yd1pYam%20n)RG7=RmU zT@Q{D_v9|2&QM#C(NT()2mB)3i5GX-@<-0xPB#NM3b~&+a>-2_&SWduGR-_h1TL*( z&Pm2!v&xP@5EO))zElGaJwGCr3L1$69PglHD_Gs8{2LT7*)RoAjoA!8>}MP`!WL!} zF^p4>KCSLD_ts@?gH72K9ZP5;=1d_1`t*5wL-#5*MYtAb6JGs#+;Z>6uZ?zg>);qU zNl(NwM|*^sFpR&F{$Aa{=dQOdNx}(#Q~}pw|1vzRcG4mkC+*s~SG&JTN4+&>xCv{u zTZUX*PJnmew-6MF!4;yrPI#~xXnNU*Vy2p{5Edi_alL`z+|A2pM}|E1UkEjk zva1OqQ&p*fsB=T%Vej;X&ke|cm7D4kbL;FOmg*w#U!y=bPJMZD8g33QAZbZ%npiU; z7S44W)t`<;#jN!yNo)etUuF5eI;%f?*#m(2$v3%4g$1ttEcMAPZIr%&05%G3;%x&T z>Ir>_dcnRg&J4l|bKd@zg&ewF2Q^1IwF2eL33XfPOeN};fbt3(6{Y;ijYJ1q8%VxK zu1)Z#Mz7w|a!fz~$e+x~{9u^&D#=6s1jgEIlpiy;UJ#44yWl-|J{>k%yp`fB>pJ8I z<#iGN)}~=m*W;Gmg0msX?pVb)zPeAS(qIZ3InRN;P6ZX?(Ndfjk*dx#j2qwiLTOL6 z)f0h2tXnD}a z>CE+5pU?vB34-UhugA9;U}wAzfFZoLJ4<%GtIV1Z-F6#ZZ!5O*n%89rc@n5qX!*;% zYUt4Hs_gC3V!<-IPES^zEhXjsiyN||fP15f!AECtbXL+#5~Fp%O?Cl~oA~{S1r624 zm$%*i5-e~4t|CqgQ(G1e6rd1~E7LE|0rO`#99orHsT~0O8H#|hFf>GIgBslc5=oN6 zrDL;ZWwSD7ArKni_6RBc|GoO5>zuaqaW{pT<8@K(2>|&;cl4v9@N~<6YsKMK zYBR|OdhJj7UQDl`lRq`^=j-;5K2ot?H=4RS0f`)!oXx!an z$Pius#bYm3A6r97<53YlZMWU74I6AjwDgPU#{Yf(>|(mn?#^!&2p54i!2U=OjP4a& zZ$S@p*-y+Hn}Gq|68+w2*|tT}T6D`}pkzGsu->IDQ|9I|lZ zjJ;PMKKBKfJAy90ex7EVimQw8aRHdA1Ry0i#_qoUsWyMWEQB-~7e@eCRJrB4lLfee zMsYDZ?C3SZ+(43uUmV^<-6a#csWG86rlW$BD~ogE`JcV+W~1I``-C&$0B>yy=6nbX zTE)CKOLb;+Y7I~BfXmIZhf*tCX&Es!-4X}!&y&KwEP2gi#Sn1iyIVW3A?G|Fi@iLaE;^4G z6^9J)`duEcY4gHwql*Fw!B9)?>#Kj600L^s{eiA-fY4o?ijf~<7?xkg5^fN~;3O$d zV#9e1kzRLMC>D~`TInxh-i_)zE*OJ8)B^0cOu=SnZv8!;OT+oQd_{U2$s#&-K^@2k%BJ1!jA zGncaBD5mf*a1=NJef*$SU*gKMzt!vQrn?`;9t$r`yaNF*fghMEW>BM!>D}y4s4|&; zB%n9}KBD|r{2X4NSUW`vr>HI-)k#VlXa^^-Q4pgx73ck>DV?v7&kn)wOIc*=b4zyD zx+_m!CuXO93GILb5pez1{oQt!-wQyIS|`HWwHfn^*wbf4T;+q1hQ{n^=N)$5tJ8Gp zcmoUTri_+)ZM&V9Tivl|fX8L_p2r?<=Ur!C`_JFsp;@2b-@!fYDY$vov-f|1YFRoc za{xetY+O4kBu7^|#50V;kQsUa)p_perC%b5p+WmfDiMdAJ0j0=I!QdbTkHjd_-{nq znYtn6t&k|?aFf?LSPJGU?%5pML@-Oc%KCyr)tjn1XmD7$5KqKkAh8MI!!zcZBnfJx z`D0F#-U9_E@!{^!dv<^wpuq9-2uLP{0JPAHf^t^>Qa{>xg;roeiGV&DodzyUM)5ts zJwgEbdL8X$d-_gsO7jIs|H+;4UMsT;WgH|fX$41i-8K2_;YNO{jV>Qlmgnl~c+d*;S%jCw`zR!u z@(nvIh`$pvjrDU-=yEC3L0Rk&5=PzGmv%20#FzWjU6zREhJsfo<*NF($FKLb(DOY} zT@m-Q7Hpc*`w29_{4CI2iTMV$?RqRmIO&e6$mpOmkVwe)I{zr6s%Zn`5Yt07liAwW ze~$iA=O7OMBiSW3c4t~mzuN+ob>+W+8fY)MD*EdfcmYi$s$r$U>tO!~_yb9E3&68e zAI-W@ECYl`5ZlgLl^`@xI*Q)gpYvLD%EL+6i@);(wc9;8d<60{B$-#M7VQo0G318} zgs&Mu!Jkb(3)f?;gx`%Y2JYla_8jj1$-x><7u{fOvJl7)%YC2bg(_dgU?rje&Koa; z3=N*o4ehC^3)U47a&y}7v@iIhB#Wd!kr8t=9Tg2b6$ls52WwN?+GfB=L z@cFEIza4GPFJ3=g<>8{UwT*jrB@q!x7NHT*+HTw_)}fz+ z%@*ZOv(Yd=!i!7{ETbqlXv+zQJr+XfnD)KmbQ@7yV+*p|odA$niF8T20$fsW+HghU$kuDWctQrXt`qR@mM`%Ob|tzl&pM_MkZ(b^c_Nh?vme z1H5}`Ce1U-P+K2BOc~M#gX1p~64=!ZRqMXQ^6xs!$PSE%EIjlotCUCji< zenYTqdSDF~g@2nEod&RyG4hLLVrnlPq3mbKP8cMdJ03ts zwRgt+0ot(xvQT{fpAaKaO&VY@_PMHcKJ8L0WX{)2W@2y>uMo)7I|V@wQc6Oz8GW{Q zIBdq<$5x@14|7O9IU%9Bz!-<#{?q9jDFp{6zDcrMUHGsuJ+@5d3S_=|pwHdI!#r}` zYmf2V4;(XicOD^VtB9r9qaH4JQ2b!!V?)o>+P!S9m?lX0@RsHavv`E!0enIyCoZzM zb#piO_5D3Ko%ghpvIokmTlH4>2fPJjMvKw$EP`mA4Im>$l|o|)qV)G!IA#yFX?f$FkH6Hr+T*s`3 zf{{3xzeRm14pZV$^z}`HP;Gbu$jK8>2-5s;!H8!Xc`iiUX*@R&Z3j36co_>b9jq|I zQ)}PZzluaei7Lz4ti_aT)0S>@j+!;ptF)`e0e`-}>DzEQlDL`6d+a`5{b3Uu=d50< z5d_eYj}&s09uFOS5y9GB$F#XBSl@h77%(^gEI1L%+ebUjRBO$RLR%CU@4D#Ur~{_U zmCLDbz|T&1%y3DBMV~~xhXahiV*~>5FMi=T+#0YYTvnI`8FclH4scqKrIe|7dmb@!;^sSEy|yA z(Ef~K^&3DPh+~Z=Pra%2q{z5DcG2h%+A#`eO@`Jq6MX z)N&Q1Wm|Brq_;bq>xOIx1}4QyMvVDpH^W_SAUMD>&0j)zUtGW{%I~8+KfGj?-!A+P zLC#7EM7eFHDSReYfa~s)L~WclNpK-?XM~O>Gi{wIS!@ZqYqdemK@(z2JJWE;`6wjt z(Qc~hmTW0JgA`B)+JbFTMOpz!xu$0fSmKZa{_V>nfOOjyWl{(hs&=vhsD|#b5{jsQC=!Npd zp64s0ES={Cq}{Cm5gchpAb3f@k1$8(*{au)uGq$y(WmTp6p2yy{=AbYgniC6UHn0o zY5h=HimjXv+~d@^_+4i{HdWqZVnC+lM8K(HhWJ=`0BVLYj0JEMBc^`OD zr`-hWm3JW}*fby@lp0KTl63MI^}C>N$GnBesM_oT30vsU)u$QFxN98Tsxbh>A=gqh z=NPrKN0cea6O{u^5#S*TaFBtuGN&5qYIDu|9YdHs+@sx@7)>k&Q#lFPTb63S2I|;c zWp>>}WWGKs*0Ia{81avwSj8b&B7GBx6Acg5Lm$cF8G=J_H()ZO3ls<2eG6S^=+&b6 zCO!mMC;%2NITD?-oA*$Qe)1d02Vew*Ew<~}lIP-0R@0i)z99kAWA<^;N*Fb3Y(<{e&s zmNCc61I%sBa=!CJw%0@bH3X&GKdjfkiwe&WujGKVpzbsiHr%Uf3EsZGO8#E9FSE#~ zDOYxj5Oa2!IOLP@jMc+Ql_uL@(*chk0twg(_*yhX1=bHKO{ z38c3p+lE6u#NAs7g4hpAe5|5sI&jbK2%IA4-XjRDjVq8mb$MsQaY zX`a5<9W;8d63=ML=B)j3od|NXWJp+4T`6n8Y<(XR1o8eeOY)DQKgzz2zZ8b-9ADlv z-6pG?#2hHUZD9WaF+w@ZFp`hZE=ozu+#rJ+LldpHOUW85lB(tN)zGckgKWVSf1mUP z1BdH777;m+hiIKMxvrqxLR>Eeq*>4T^AW#NO-xT)AeKhB2e~dg_GXGdSB##kZZMec zTkGY=gw?>#zf0FIS65u=9<#>~sl{V({leUw0Oz!x!0eA~nsQ{1QCRyu_a+V+JO4F| z=fAg=+)pKH?3h$M!~I-;}51RMzWsg*l0^?uaf21U#B$%z~2>NTN0um+W8S@B_Bo1k9zM zih;akgo8PRkN(t@$^xfnEa9=hATl)W3(=S^;ZK0{i$x$)vHf-Lxz8Ws!}Pxhm$G|5 zAwEUz11>ZiT(|P7kFf8i#qqE}i4A|xd>I~$|Uv7ZFaDr$CYF*u&;~iiotSBjCih2Dl3@7CHgIw!x zi*(B1uNKT4-g3Sb35`J;Ht=5kGT`31p$g47^!m4$ev`6vK#%z9t6Sh-SOH z$Iy9(F!H6)`=|GYzb;AIX04jhXtIL0^Lh)!Bz+yy6{C^g4u1eML$?jAbjNKAc<-y) zp>14;tc!&)12_*rB=MA+PsbRyww`d&HyD?7g#$pGhfsucR3qpVq$P68$tU}1VDq*? zkIRg7Q+tvkv<9DdOq!Girst?g@;X$gD3FlPuziisc2&N^^C7!soD(<{;K*XEb_A<6 zg+HE`G*A6#Na6_YT=+485`T-t>Y#`nIunY6+ALGmo*@1za$?(&W0&q6iNEI`K?^cX zk{){!rCaGnwkfEOoBCk!frgs>wtgFHs^0TkwsRlk> zmP~s$eWiEtdU}@-t zSSQG$%Dk>;41fvlU<>lT0idf+KJ00c5&osfKqf&~ta)BUOuQFmt(>8_4-?g~8cb<7 zahwYzh!f;)Hw!aGw+NG-@&WA~RWUCQi3NO5Puyiqmo9~aRsLj&AD^emAGeXy5Ac*2 zL0^RCr62%QQ>@9R*$UE){52RARHQ(@Tp?86otZ%dk#?xUZhdeN)lG!WVtEHHuS3&kzNyd=0hR@vCEJvt0^`z?zSqs+>)Fge8P;C6=gakgM4nbFg*IIkf2B=v3)i7i_ac;3|}K2fPL< zPPJG#LI`qj|xS_>a3lA{7lIVC&fEq?eip^URP?h|8@;#d~ACzzWm^)F&3 z>8-Z#KJw$Oy<{frP4Jp6DG)n};$IGIUOyW=%eE7pgVYGEv)~YSpOnQ_wNMaag!&P1 z4fB~J5k#xl!y?8*A(L>TyL=szCM*BK~h1jtl2lpTdtvi%P>*e$0^ZGs- zj)V8-@OrOpqZKq9s5`Mx`e1T;3x?mW2~cuQJAJV1{#u(#zkdp**Uj}a;_Gj`SetLk z6}|WYA7*zCvdAImnmx+LXb*pbNVZ2g7B8;WjCYbCUA$Y{?gDV|xmnx8VD-PrbS%sj z%=D+r6d{#UF)p#M=PYf|E-!7Rpyta<+bYeBwjeYzXMb4~|1%-L21gBr6A{{F$G5t5y5)}Ch#lBwbS`oMJ?R^z#SgnN9oRjRz+tfo zJJ{)dHiYyNE8tA5X@?7~H_H$$8I{}z(Brtj|9%h`j@zxbeZQ`2A3dCEnPP7h**bHn zj?_Nq5|VyqVEP)R*4}OfI=lbux_j*nTD%_6XaJn*Mu4pHp<7u-x z2*way@Ig)1dmV(=o<`7%hKE>v11AAwd~)HjdIBVapg-2qB6cmL9$Xyh=Ib2p&4Y46crRc$(0 zF8sNOO3@GE3~7|+DV6d?YQr9aKGJ1FH?8+%w2oILD2NSioP5`AFCh1JC)oY zKcDZdoxv|(*j0cf4Tgxf?ru!TELaBu3JP?HxN|Syh>hzmBu~~=j1V=3q4A8wPns3` zN*%?`XG_-*&O=2+s&L8N*X~VTPSiyew*9`L=i83A{xg8*{g*>`QhRQy_S+Cw=4)Jc!?(D|6tpPMpU7GkU^ z`iM#WY+7n|a<^Foc%T+C+WC28FhzR9U}J_tUMFa$U2RqKdUXpcPozTjYFi5f!-Xz4 z@Ax5kx^^PO=aTWL%V=D3iL+2%)_-CRhkc4VwKM&T&Y~IJSQCe$cXC!!3Bfxme%C9s zHN5iVv-t4<9SVQL4D(f>if%@NM6{q;o(KcBjHY7ezFYO&=1Eo%Ntgg{ILN?NX|x#h zg$>&siy^(+Y9R4MB8>kIa;B9Z^?f`5uRW2<0%Rhg#c>N9KLfQlsbU142R%SG*rG{S z1y{q{4MI~bi8CY-(+txyu)?_Z5D1gJDimg2H{7K2I__DC`q@*{=~J#X=$-fg+-txj zI@5`7<)N^w!lu$f)b1p@(@lBB+6QW4> zm5Tt?lxYYlMfKZ2C5%<}$l@H2UbNQML%BR+|IMdZ8BQbWC|D)yP%T|Rj*i(NnKcXN zR>3V_L-uqKS@^_z8tskpD>cH~)t7++Fh0k z+PK(kiEh2Z7@J~;uzySXUuSpr0;NP(JJ%N z)J)prKUA|TG*7B7Yx@R*tYF*+otS9e^JGe;%jtbWEt#w4=N^1Dygx&sygm_zZ;BHp z7SS=DoqW7mLov6vg@TAW48a3C&U}=uawjRV!mP5mYh^L>Z0~$4<$9&(-V{UmCq@$RMyo7u)$= zFcG2GfG4A-;70AKo_t*JKI#ny=^Yzl1c*d{Ajb?GVb_~%23P)C$_#Un#@Pk8JT#o*Rvg26FWHMx`uy_dv}$`7^hC4RFUy`bsEp{ew8<08`PMfq{ZafRip6> zInmKz>DcY=)1r935msNqim~BD*H0im#r4o%(wnE?^MFEo>FqSOU$=i)O8qUpok)KR z!`F^UIWZ9-C-8HTwy9l3mh%QIr#UBJdvW{n(zh{xV!VP1Q@qccPO}91+Ihmn5NW=0 zmi5!^a8~yr3?=}*rCi|Xj#PA=F`Uug@TM0S5U~~Fz$2InfT={bKM=Zl!Nu(9rX|z1 zo7Uq|p5bLyUf#1yTq{5mHDe-b`dP*{|;1_l@UI zlpW+wR1{S@(e%oPSq^X0ZX!XXdcS2rV@s9b-Q^Y35E$?eqQo{dP6MPkx(c-HdPan_ zuOp5b<1!Co&m2*ja7`0cP!OiE7L=dCPsvA+Ca%n({N@Jw35|TE!Vdqm&AF`(8chtR z6%#*MenioOFy9qb zFFcC4G7@LC2$;}H$m}1-Pb&?sbw*bQ%k*`6=|QpoO{}tn*NkMHA_PZ~8%tP_yX{P} zvM6F>ui`dwUx8%QJZ@fMZ$HQmX&W>1T^qhb=!lvB@N$w&-D zXwP)X0rx0(Vk_ZItUEI-#{usFGX`~9Y~8wC*4-j|XK&ZMEf1Dc!w(ww2s+<9^8f2? zKp@!PI1XZ!pRFL#f4wmX@cNW zf1~_HFIBOB>e#&IzvsFZY{Z__6~cAZ5O)0~x929B4OTeSw@%gTZE_m%z!gb}fMl>V zsd_vF?AXWN{0ouC9f5_O7r|;QE}iK%U;AvSQ2&`&f`PoNb2l-zHb%Mj&|GZ8sR zPgUI{O!tXVR1t}EgBlslzrxfb@Sqxr7-Ekd!P(EBoz3D0JdSWj&*Z2yYz#3|l?MF> zX1!MJ2GqSlF9D>NOJ6^Gs=|y)anDE6*oY=bx4ViK8mYU(uzJ3RFs>iQvVodxqu z9E46LzwKy-L)o^Je9Wz`Mft*D;R}1I__q_Yr z-rDNSTL(HD zdu28Ei9zwtSe~9c&XA+n6E&n(zkywlG zF(!20wxuWs24)P~~gP%-Md#?p=DQvS~zHP#w)? zOxd4?XvYb`)!d=;!sTRAq!N|L=Mr$rHyN05L5pfm&WuCR&W;uE!BB66@Kob)lY0lzJ%Gwg{aq*v_4?Nqy0laM0X==--4hY?9ZEofdLb0sKV> z%TI}aCIvk{Jp}3wbCSzG_LuRHUcbPti+&9(!wU@DzTS1OOpE*<8^3$3Z%Z=oB}*K{ zUvncU2knAhg+kF15xm#aZWSLQi8dA67BGP1lO+w} z!@W}VkCmHxGT<)u;Ys)@v6$H$fvG6Afdz*zg9jcxK%^{eh|n&RZ~l%}nKPBydAVFb zkpf$gOjTc>K9BYYM(($GVjEBIx8pv%`dAzUdAWioyfX0W{ck1s48{wYPoGtFI!0v~WDig3~V!du@wQk`pJ1V#YAL57b?Vs$e2`_pNFgA)aS^Wv~G##gwD zXya4X`$g~vQR7?u&WS;Bx_gAT$Ujb8LK!@iWWlg4PeSAe1<6JoDJWSbg3V8HHC4o? zVk5Ni>^8k~hBA0u#in-38@S#`ChmRKet)u8!6V41yp#gpjmwv?$kfzQCWZf zyRQB(&v0anal+BOsr3{dVHcx%MtrH)AaO^7*!1zE;F7=ki@VqJ`Jd8r3yGim!AdY% zl6<7&oFQ($Qc>F#dQrX?`nxU#Xf(}0E&AOBPZN-OeY{P?F(;nLJN^p)PQ4O# zZ|og*WW=s$tvllnYK?EouFfc%zQ6uD2+?y{0lP=u@_=#GbF)~PH9-OXwWLfmg)kI* z#rf06Giva!az0mw9v01m&3S7WQG(gedDzeABrvX%$-EFh!tbQ;qk<*Ag4?VnQwjoy-=>C_6DYtEIkAdg-;L=1s+(NwYrFR`6=?kbwLedRLI#TBo=u zJT9u$!|W)_>M^frn2W>vQuDBdL>}Qwg%}sjn5al zdqB~5V$%htA)YPRyV-oK7+9Kt)mlI<3BZPzqT=?i1rf4IMWPjpfzVj;RSK2cMl~2n z+;tPc8&U`)0UQ?CpqY^!z=4O?2dlUI5)`&QnJ($cDC)w1U-}O_Vh1LgxJn-M(?qhQ z3ShvZY==NLB}qobrKA$|g>tUK;gsh#p($-2Iai@x*F?@r9Jj*#-x^-!yDhq({uxC2 zgAs8`eKYHQd+aW$F4c2pq%wLbj&PELa>n;ZtslMu?teWGGUqUk(R z8Qmk#)&iiJEvPN2MW|8srrXe4iU|CZC@{|6_H;H&YEPBP-zLpDM`Yf$?=Kb3bcDcv zof7>o$faUy!ABE5LQOHy2CfU)2Y9u8Q)dVb9WG8GfmKh!2(VuMMiVy<6mW4d6v}xe zhWkRJNa}_{fwK}_MPMI~2hchY_!Qj^+KtpD3b+oK5LG4cWk%Jb_C+l5TkN`5%j)IW z7GZ-t&VTM3{`47{eZr4fdWzx`HNA#{o?bJiTm>vJsUN9@DFyTUd(A`ZOS@e5P9i#` zvFVgw=|>7X{gYriTlPsaap$MRD~Ne+up*6GUtI+J1Xx}3*$oQsk$0p{Vh${suW~la zR5-5IUi0E*?bw_yttiu5$=|%V?(z9Im?SVN? z9!(xPb5!^GcNeOx1&s7^UvQG? zdK-5PdV2~vnNweeg7dI?eCwk&T{on}3BbfN5eAV=8h*pWw=-`0Uu>RECr#_W!qR-! zv)d747a6MtPqmRe8TK+OUVky^-rs5p4h%$z!4|1uS}YMEXl#@7jut;tm-?3AnaZbE z9^2`R1;|uR8;)(k`58{z+SE}{0RzHdD;VS&p+0zjm5iF1esMIRyQ5>kl=u<^z!s=L z!wBEdK)_^pNE6)emGYr449R#MPoc_!%>r?q0@TT7zSZy%HhIL#(Chd{i@CXt5k<)F zw2Pr?XH%@FKh#zNQYFYRfb0|Vhq<;jO>Sz~5rD<@B@0_6ILzQJ)fPxSfA^jg8Xql( zs4L3Sqkc#t9FfpyUQNp~rVm|Go+Lc4p_luPnEtMn5~CYHc#2pzNfUgIu+ zD3l}E%x5bN?X6X~KMJ@>-kRBI{yWFAli5SwQzH_{N+ zF=n^qkw>fz=D=+OH+>S5l^a$GKvtUtd9p5v#q~t2g(r zzrPh!V^PtoLCV;kwOJGOo8=yxeJ(AiAtbe0GM+WBa!Oc0l~zdDA}RLnET=Q4H*Y1k z`VDr@-t7D-ZW!;zEFl+j1}7K+;G51GRO#>OSKbJXH& z!-o~M)EZ%n6gK@fLoy#DK$TOEa?p7Z#c@~gTvg!cmgTz z>ut4cd3_XfL6?99rgf!rG)Er?MbK9NJbLVrOs}$Fd58Kj$?*U2D1KE^YqohONcP{i zMDr`~7<+9IO}}hJHIq&bv#;ov*V|xL+RC3ea1OU-RUvkFq6KEyoj;xaQ5dD|b0@KF zz%f*?>3tUO6~YBE~)z@4R7C_8s-=Cbe>y%IkV$6p^|1x*T3rXAr~{6>F`X7dph8hbzD zG(B#f;JJ%zlk|#guJd;%sNxNE68aFXe+Y5?GW?GHG`QsYnPPjHZaSIniMah6UOR-F zSQqdNysehCc|gYX`z&&|AM*CiFqvPX5qlAnO1j}Rsu?L)ao^{x#)P!P_P`J&eHt8X z+VYOMrSrnsZa23KG9!O|>=KI@9#F=3K(mdzB&LRK?HjV>O)?1x?QiJOc?~byVdq2t zpDc4r&37+Vs?n8ni7D|#5K)|A|0uFMM2uKXcW8W^2cdJNl(i!_JJlDf_^hLOaBP|o zt4Pm%>GNzjc;GuWrC~@8ObTC601uNJxek!waF6cA%sd_P9QTFbHhKhf%_#<;UScvg z4wS7H01_WAr6A5KOl9&u2|sQ($_7Fw{j@o}i=>RCR&a`I={S0G_|`e|vCx?s01}}U z-yH=487*r^YU7$+*s$LH=1y9wNe%eD)+5iU2+ z5<6Wt)%S{mlte?E%eG5cfkiy-m=Oy7#6lQ7nFFNo9YJBqr8{Q$g{%;!Udu)Z-I%D` z@d(&g&`?EknmaK6l*VpG2p}sY$fY&hV6)o_Li5aKZ@t9}sVVVclX#yQHGa5&M*`mx zB4b(sHiNPa18>3lgAmWIWnV+oAvn)i%#9Xv#!aMShz6wdja~oR`i?s>zx8jFAHn|4 zp@-M2@J@6KK!Y17@=zfH)mbpA?1rj0BVE`#8)jhi3TVv#tyAX}s=Ts#b?L|#uYto2 ztb$b3Wy*|>wn4q`vPZ!Y zK764d}-qz0rJvVf_tN5CAHvG`bN6E~zd7 zj$WKh=VvhRuy{D5Hw=SlS}IEd9YYwDV6eerCO+h)KPVit<8lWC;v5U>Oy}4OGG?Ab z)dF-Go6NBe&3s5DAwc^xP%XoRQbI}%*l&iv|9X(xtqUlgz|{=InzaY$Gd^q_;Y&{v z*Osb>`^P({lt=7?GcmLQSdvE{m*(BkDm~ zx3Yfm@Fg5lj`KjLmfvhp?0fcUA-SHW{zbccU*A58F;tGiS}@5HPH^Oo*I5nu`2LjEAiz$Z`*}~B%4XG#`$eB#a~pGHpm(}oO2d#nDtQpf&oDNOi~@8(Y4(z z9zK0c`PLYXq`9DR%Hr7zH%t6VNnl`06;_FzZC~59-`^E^aL0^T7T>>k_S5s?Pk*sJ zOWJc}M~9)egkKzHtXa?KQc5beQfK=}#a{xz#>>kcPKZlOJ-ukE114$50w2D3@$fIB zhlSYfs#TcfIg`%`(?a)1%MJgoMc$|&{T2SgT5{W6)1=UJq4RQn8FY1jN8xc4Mg~7C z!BeI#ovBZ{jlZ}VD}LJuztkeYvzI}+x4R6xZbKiW*D5Q$XxI?d^SMutP9euHRqlYO zVrEs?mX4#cdp04eZ#O6XAxjs)5@!Rts_-+qCt&3jG$2B@T^J5@;nVs24c|fNV5LsV zV5|mk&@haDvx~wjfvO`l)5)@)`Ky1Z(JN>5NSCHTQzO7BaU&5O^B1J7ATZQWVz_ayFg8?q(iR z7$(xq1n8bg*nkew$qA7CQa_&T>kxlX7F%&=aP`sX39+-AF9hJZO5mYVA(ieQqeRO^ zwWtz6UO zXC)b<#f=g&H%XYzwTC*lBr4yyo;34=i$#5g^(ZeO4NQ;n*SGZN!B>5$`FA>n)ZO~| zEByPbergGjVdFK2^i`MTk}<6vIA! zC0O4sXS!U$<7`w-o608pc)6&@&8g!^#foxu!S^T@SD6=s0u6&(9^PH!X|Cc7)=bPpXVnr zU?6oPm=Qy<;vUkyvXz5h+5<7yX)EF_E!;{DeBpV9k=%fBMBD}6dfH2v3idf$&ew}{ z@K^t_|JBej%!m8`3wWl?q+Or1prtp%K^`vw&6Xtk?AmSu{`FSS{j9$(?lO3j5hWZ+ zj&d@7i9Fw$xZ)N8M-TC?(9PO}%{dlq(0CAb*i8&dQQz%w9_@bDtzlsgV8tOeWK_^5 z91uFFmi^{A{qoh<2Xe52rpAJ6oM!FL`6Jp7eB;W}cTEl6(K5b}WzhL2s{`-7;S=D+ zy&K71KOFt*lcEd&mb=A0w_~Q`aGOqnb?nCTIK1&B(jN38A@vuJO7jp2O_(F8ra*i3 z*LgGRp)v~P6K*{$970QTqu~d8pJAN_x@jnKOtW=D-YjEa`8jY?##m>NtsBzaS2Op# znO;dq<-i7qijsKMkfSlZ4YU@wdm{{0&(Aq@TFp2-$V8uE@?tk=ne?YVA&r_OrDLG z4`M#prUnsxrYaei7`d4{Xwr(3FbNpErwEp%liWpDV~fCC3tU*-Q}}%*XLr+#poB5zKn$!>jn@&F8eyqM!lM1 z3p$i`&<^Y*e7qyuq;&p=km%_poc>um0f%8%&>WVcr+`La>GQy z!At1g0W-Zk`m|dax zcW{Aj2xCWA$c5aRTFvFXUJL`RR)7Z5I_VF{^*e^|MJ=TsHXaH{W)_&b=B7-kdsjl4 z!znm%?0g0q3a%|SlCY3`!@ZVX(VlCK588HVh0{o6g~IE0HHW2{ji@p+2{^b_iT;Cr z`f;WU`;F@Q%HNvrA_N%p;VeI$`8GC8;=Lvy=WHIIIQ0pFMoG{er946zpTQ(HU{nV1 z$|{+-WKkK#>)Ca$(xGNn*@cT}H|`Cu$6b02hj~$MoCqZxzQ5bOFPoS0J`lR%Qq4wq z*qq3va{--_F>OxQgu}6~6WF%K5ALWp(KBCANCN~@J!`! zR`aj~OTK?k<}v{oVl+D#L~rce>PTYS@p>C%Cjv)kOE~zVb4YUk(~}2SZe_ACa#(6+ zZM|F>tjU|uuS;&eHuMLNaS(B~xDG{p7++u*R(c*a*ONVw+a0F$EOVUJGttpp+c7#) zLC?={O6+vI&dKMb@!MO|c!1bwfAz)}ULhPh^J=7i4YTS`GQPQOWng))zpR4=!oyu>y`oy?`+NXUX9An&H#95}kXJx$ZP*= z*wlvG;qS|+?7`gjYEI8eD0uTU42kU|DX%(&hfWsh&YzHzU6nktd`Fib>4V@z$)5}Xxlsi6Rn&-GzC56)c6U502~>ayJ}_KRGdy9IhARrb z8j?Ai%$Tzh9M=~MC`MwVx|Lm^n!rr`mJU>ucS_P@%SMJdaaDEWr;}0G{Pg_s!{aB( z74!1Rae5hnH-gl~3hy9ykdB@fJyab9^8r0ke^*sBH)d$t%X2X~ZVS$3HQ79(kLDMPYSo-HQ`l+y#|Zwq7n0~3L)vt>JtED!=A&cI@}a=fpV zD#=(Cr~qwrm(e{;DX7_2LK}Q{wJ}shQNr!ciem{I_6Z+#`bmLFTWC}Q&rB0eLc%{F zOHJyNm0X4!@APIuFAf2`MFB4i%ah7e$yON3)|ys4@4oTU8Aty90iCX@vm9k&Kq;t$ zFti6u5t3d{^PUMh2a--%7YlUj6Al14U|u!y?9#O@Iban7dnjI37rmkij7U0jswFq6 zXB;TYMFO*A`QDJ%_zma_ex5HU&mkm~XncJlAAr09y8qo)bpL(5YD1h6hQVKzNIxO@ zn^OD-5_}pXU@Pq5d{d8FA1+y)ZAbiG3+MYHZj$`U4y2*PF49A%tN+_+?|=LQ(w_JF z=Ii3v-W^ftbJ#<}3j>8`#@4;}=egDB^EXc(qz`7Q07<8q4tpD7O4sz8)L*VoEYO(gI zUxVv@J$o~oU(WJ$K`Yk~`f$$&3i!}R4>~gNu>cN*^|BdDPcfp7{9;E^c(qrIM&JGP z^wIIrv!|nxV~f8V-gRU)8aZM8IVZ!buxfUFRxi`ykAMJ0TLC?ML@tPZTHjUjH;6;X zt#DOEQXW;4Da#tXiwNjBk_xihmR-Gj=X2Lx3RdHnB;^035t=}= zwQ;Di18q_RKqf0VVDcQRq+Tp09KlnsMJdo`q8>An=tJ_CU|X!xcu~#PPSn1lWF+pp zCjKzhTa286N-{`|t3Qp-E}XyuszjeqWIUa7RY%osg3^D%F-!X6305XZMx{YR{cve7 zgk$r_@iiP3QHndrX%6i%xo;q-6ve(gwW#0$2rU!};~SH(QzVU1^oiP1wxI;D*!M7d zl;fp6%tbUhdfcbCBbY->`mf9Lxs)X|u~R&Z!%^4#J?a_^Cc+P+pa*%IE4cJOwmP48 zZ^iwr#^ZY7UOWz78?9U71)>Sv86qnuWrHoU*+4dn>D&QwB#fcX)$Gc{G>MH9yx$>| z;a3S;ldOau!fKA|E_qe^Hq>Y#WeF9bpzha}W-PqbSbj)W%z1P-^x&#S)DX`qR=13B z>j9sw8$S`4%J*cy`iY8fa}Am$7Z=iudKpNpX-BbRB%bIn)#pYYQ5W^7pCk}2q&@$z z`IYM{pUR)&;AnnivdaUc~h3lk>3d)bwkqthCkG|?AE4;X_%atJy8mXYkOTrv1 z2qlU6o3#zruQE(BR!x{Z2{6c$X>C$WVRhB@LValLFg6I#jaDz0ZXVBUK`$qni+p`r z{QP|M1eRIabDZ2UeHs>%&fg+0HsD&E`Ck+%gAd%C<;yXJp_&NxehK zm47c^_rR9x1>TPgAD_(O)R{m?Op zOFp?6_qL=gP43^{LOM!1(NPY230A;rLL|;>L(Nsc;Ofm8*Fq{+5YVW@61uL3Z-fLy zIjb+r`zG~tuk`-*vSpM$#(uzEOMhl!;14#~=C=04s6(5=To0;^Np;gwuFxwHJtlAd zXw)ko(O=-->*hl7>^wdiIVk@q*RYjL1PuL-U9k-m;n``9lOWq@?C)XFZTooK5{vNu z*|wj&pKQY-$|9DWbD*6q0Jq2vY@`-2w`7!QMx znl*`5utdF|kg4@7vrQ@1pe4}+Z3Kv`@%wHIYa;#Wv#2*&*NiQ|#*pdf_q;LYZj86?A3W^*5g0`P??{y41p6*`|t$r~g|5=Zklmbl8>^dw56Xvolehn>M z%qPt$4M3^oZ)t1{xd!Aah{h+uTM{;Ke^Hb`CAL7EUS(r-7gm`&S?b2cW0#RN5 zW&dJ-QvCT|bMN>6Z1REOgukICKPiKi@dom|c#t-9;PtcFa4#W{k-KeKZeS`P|lOf4M9e(rVc79A17r%j3Lj8huEf?*EF><6p>(9sh$zj{nWzCTMua)+e!er&lyx zCYqE!IlBhetX`C@4DM@ml?UY^t8|>CWiD-tlkn>Ca&w49^QcAp_y}_YIzsCC++w%; zpz)xbG$E#Yp&CQp?Bu!-8xtahLAL@SU*{~Yf~N0SqhJ{%=7mA1U{7=#@&jP6G`bP5 z6p_(md$V7Kt=y6UoC%ol^3(@V4S<(@N-} zOu{!gepc?$es)&3;Ku?-9C&MkB~4-dk{=KJZZO6y)GDan&1XQ?pFE$_pYH4C+)i?| zcZA<VkRjOay~mv^ko^`yG>$DWNtxGg)f;Kq})?n5Q!OC{)H_r5{0OnPgGGWax%%Rrd-7WVCU9WhdzS45AscASC2lI z_qlEo^lx=;u#>QE>o~jx&$qoJq5XDsH3co;0=3y1z`1T$5GJFk>LT5w`#`W{Q%x+F zexvl|>QVfF=AdjxzQ8J3y7sG-f0?|zUYiJDU|>ijhwAr3l`NYvWFlwJutRrLXZ!Zk zkk|}65{KGTgzAS&bWg#Axe5}P=+0*3gDgpbgI%y**18SW(OTU8Fcp%Fc>~p*K4CQl zjy*bb0l~cTDRB5SF;~jxqZx5-8}{Eaipbj{GJp=2>qy!a^tU~yYEQxyLv9#|Cg_=k zh9|Yl4Nj&S>d|4%D=vA4Cu=jZ0HvJeZo_Yb zsBQZJS6VYeJ!m*LzSxc>r=v~=^8;fCF^+WKT`Z50SmT2Vf!;BwFdi{lj7fLYVXMwx zJ+YmN561Npt#KYmo=QePMRCs^%J5J?_QLTb1xbM957M!xDYlH$L3UE6W#o>KYaY6# zp{c=?1|_sq;#IafM^X{ZZWTCUK}#)5MOCcOYZ?@_a9!a2ZoI?91VBT8V=O5F03d(} zqKB^c0mjqtj@@we_5NI^O68?Uaj)LpG{d@eJQ^}kQEzJFrV#rZfOCO56byVI`vzwM zL-A_m^%fzYheq#kZDovKa5?cDc_*Mar@K-hQGzu`$3Els6=>T*QiqG`tQn8~ww|x* zupw*lziXD@@(o47;G$>uG>sD{KS$4ByPTK7f{t>!&!WS3#1mW*xx*~h7=DH!w~zlc z^kDNd6%fx62kc`l0uzM{OC(h5HrxFGw|v-wUqM_}GI_M&yaP#$1>MkAnQaEV51QTq z-fgU&d6!qWl$TcIZaLm7nu0M8+@c2Lx-@%6RFwmSU9 z(>c{>aTAe{!(s6=hKhsWd_lS0tCbUA#HSgXqHokha_N(lNE0O&Z^KeBAI``jbCkhF zz+gTNM-dzJ?QIwe+)ktnU(LzLZ~Lf|!VqdQ|9D(l(*$;Xz&SeMP=W5}r}JWdK5+8P zMGbPzU)L844y`y_&u-Hh$>z_^Q%aaXR~Quxgg_vYf%XqA0<5ENuUhwvW!)Q(BGNKa z7*Bq1lQ9k2Y=lwgeGwHwzF4fOv=EsHy&sk^w?T0UF-1^gm<=R#izJ3E(No9al&?C< zSCgCplbC_8D!3rb?aROZ{CxC+e5aGpfiQ{_$4(|grNGe>DLii&7_K_+6r80)cb*6p zGmwYzjL>87qMFoN(gIcsJOYb3v9(bgS4jiPZ`m5Z%wu1()n=Ful=W^(js&D*t+=3#~NDdooN3egu7cEwfa98MU%zgjE(T_*R#ob-6 z+=7N99H>aEFDEtVbw-1joJ5*4`Eo7ncke9qa97zX_c7!05mWHUZSqMqF%J#=xn%Dn zo{=~5?a|S2%lZb@mXo1E z#IV@i=U=Hb><8d8KxZ(i7_YbddcOXete}uwW?JWPP3;LAhY{ewoSi+?%mKPiiP2j< z2Sss~nt@T##n>#1`6Z+^tReFm^dOE4DHgQADyzXDoOV%-!K_)$*bldzlRlb;iM(>* z9X_oV-plwC9~*y;AqQU()Njx%fOR{Dv3i?P2I=~s&bvK~I)p9s^7&3^!qz|LyqW^S z#qJ;fqZcq|w`0u=Ga!uM9_xSm%jE05KkoVydczYRAU1R6H(p*J$PIMWe>ZMWY{L$6 zoA`N{gPw9dTpR8zJV>AG@csR+F-t&y&nxY8T4gV@K`2Z7pG3+zRDW_pHs&vqHNEoT z;bg)YYB0wFbk(0nnKW$&ryJNN-x1K#n~K! zTBIM9g0WlUkWEqN7J4j+@i;&yd~x_{=b%S{0_b6eP>Ae(hx&`3;bCN}9l+B`C&5u2 zCT-Vz$#MO*BSON=f|pI3CV8u)|V+IhJmg%sP390 zk2oDC6G)iq5Mc!hOC^_%l$?=La$ZhEfrZdlFhL8-HG|#1}HY4To;(9Pv zlggfJJCP4sFUW5hJGy<#bH9hCTzrI-1I#YpT=bZPcZ*+UzpQ>){&MG+U+?^BuD)0J-qbJETX*!4;Izr=R6yZ z@#6kscUXfP_8@ z5c^oy0Bw99jvZKp8De(6r|8Azt*3A|P0W-=&!4?KKK{$|C!oa(C#r=Z%v5olV7Ah~ z;9A6VR+G6TPY6tpe!f~Q?j0PA-5vhx5CYFIIqq=2JUakBJ$i|Qjy$Eb!P7M3%hI*m zU_tWB2z(%58JHN148TnoSwv07P5?N&CP~(B2IhO9gWt@E?@Kjeear|3paT!kOxDcz zWt{VCFC#~boNVaNoSA40jh||ARd%^LckG%tQUEgyt5W6m zf6%%6S^tgQ&3n1q)oJtgNH<6`8~TA9>_EWVvKqfRasNl$2kBSGU zS&(~DW8Bu1T`h1S{(a6H>;oQF>t$0shkyO_;wW($hIGRhP%V8qzjW^$pl*|u)9f@V zG#nHwUpmMcA1`-JtubijIwhN`S1Hze%gV|lDXlES(DMQQu)m^$zg3d z@DgAo1~7yJ zrHXR}3zUSkE!h^Z6={@}xba{VzSFDX4&{hr<+8_6NZED=Ylp!(4_2e>0e)ry){!FE5mYQ!Bp?u-uLC-83#b;iH^X`zpJ?Py>5c@W7uBu`^*H@L5O z9l^Ci*OCg>=%14nrN74{k3y{IU;}#g_|2Nl|J*H+SU3^ia_=~b{%j^-{K&*LNNx#f zMYM|H$3U^Y(t?ouDsAc2LcX8jdgJ+Yn|u^jp-4f&yW(6=GjPIcG6NmbPbSnCX@lHt z(h|DxT#*BAB?v@!Q~0N^pBvpRcSEj31{55QHr-b%VUR!vLGu!kOjQHq7PDNB#u{BO(;7_h_p*_Fm?AE0R zF)QJq^8nR>Mj21>cv!eCU&ECEy0xDB*QCaO`8F(2nl26(J`39y-+Tw$`wtJ%ABR8Q25|1ehUMLZf5NSrPsa|4k&(f{Ll|DAEF28W=K@7(jof+VmG%i ze^`_Bj#Igd>OSVQ^bmicY`nWp>LC~dx|NP(T*6F@sl-bA#!OAFwQ`>0)izbthS&A4fqf2`ygsHP9C5+KuV3 zS%73}`VoEyE_PNyO-(MzbQbtC#NSZ<#KP*Z*ArjyW4rz7t$f$O!e9x${~ZjtM> zYAV2vWLiBLk!hf1ffatlJ+T_tjypTKRXn|f_ru|#U!YzSG7@R@<)V??1A={%&?ua` zn05Recq=n~O@<&J1|GIisRmCcXl9A`8Rk~?B!{MKo#1)~U&Y}F15CiL8VOr{aj-_0 zL)ZG(X4+IsEakKwV`MQTE}!F>00{dEcUey{mZ3d&uW>P&F4r?0<5}-%pM~FFo7GkR z1>HqL&*zkC-u*P}CPVh4GSnEnz8})bg+EZY>Rx!7UUyhLl2tSp7xkp6R`nE0Q)AM8 z3eRDLbv?AyE$gaR(3`9EPv1ht4I>T7>hx*Og-wI2fvU*!Xkr|Z73v+k{?!cCEjcc=7a`wtU)Jq~* zlx1XpAs7&SFEGWYA_sMQMu(Pf3>!`NRai~;75|L&OL71BPZi;ik>yvRJ-fEfsMBb_ z{Wmy2zU$sS?q--TuXdS5aT!BB*1De^R)m{rdMt-v zc?(;z^*Sdyt(OfkW~*SfDXZ{PU({^oD&TJ*E`gc+Ft~GQ1E|aqO>bPyIQ3TpnKd9X zkPtE4x%SGUBDIEfpy_!>9z>a*@E9`M!DQM&YvK+0MLmct8X-3AHqbq*kwQoF({cb%$`FJ@`B>>zsC{Vj#T z36N9{w*|uG-&7cUP*OT?RJu|*b4iiIbWx3TwVv99ZRK*bzkU+Kx;G+ApbRug@1=BRsNlMdUR% z&kf7KtLe${Yh!dGw*{J=cO0g_;S0^vf1$r6``!Kiw>(@PMiC;LH5=gIBY_40T(j9{JL!w(RrCdvjwq z&JM^j4gB(o98+GK$V^df=G+ZD4sz;qhAQH{$|fZ;j1Fzq6PQLKbi>{(hFI$sZ!t#=-N|v(Wq?oBZ#2< zhi0hh5va4SEdB)w-`#y16v4m64mYoUX$P;rJ}3v;$p^LjZ3rOb z_9AG2PjCN&?#jWz5B>Gsq9#EUc2BkM#kt=w3O=MNoCR%ynQ)!DLy zEJ!>+&Ew97p~`%I9kPsTt*bbiEs=zYY;X`SfTstu*o{ofI=D*E#wtnDJ;|=^d2^Z> z_kO0q?E;6;bvSqpAAH(8YzG#=B9y`dDGOz!F z62vm*gwEtobw1bc{@j_TB7emkD+bMpU%dOPy=+!=k%vRx8dr|SEC%l3LQmWh-rV;M z+?wfwnd5H6B{^SA+!Ya(bS_^wdh7Mee4h}h*NhxAPA0+6!h4~(f$Y?Ew^*e8mSV!2 zMnq*Ge@rgiu1*L&?n!Q^!2u#ugtnnj14}xGhWUm^50V5Zb0C_F8{Esy3eOZ?WP4t9 zRd9~h^As)+GuRiI(Weh_>mFpV{B=a%XD%39F4c6|7a|H3buHko$0*tpF> z-J-DC5$-Kp=41lGlGigzDIm?foldles+BwR3@zvG3_hf46aMJ)3hU;Vo?4;A|5zE18&(pjA%HYUx2l73Q0cT3Z}Bri6VGI$MWD? zlmE4u96~LT+Zj-tR)P*WdIdmW4FmZZ?ACiQod9QQ8b}gP) zk^3bct>>Q8#lBV0%hDr3>S2Rx5M&GxG*$~%eM$v}53?|_oJRWvhqz#6Z? zGM*U3heMtU2^e?;^4_rAkc+X#8N_Uxexxb$ejt{8uxE_&1NS$3o%oC#rBS-csrGIs zS{>FmOHWqtSx=4ps+GibJ_zAgX+qLJ6Ibkt;x|t{4PvV(YnJKlNX=gbxZ!6B#op}j zb4JMdRZ-GHO3E`~rxLw^Wh&+5q?8Pg^{*JNO(!Ib)z(mL=@$lSZ?uxd<}FK%K`ezi z;3lH?x}qVLSeMOPkn6lkC{%lE+nlpYi!sgQ>mrHQ#I5kQsr;zP@6cLwrz4RaeeKBT zcV&X@Ib|PLXL1a2RZMG00u66AGmi}k{?Y_~UWfkS>H9)GJnKgu60Y=V;C6KEUX<|f zZzEDhgC{+Y_{E@=6f@ZwQD0yU7TU-AX!uTd{EQyK@R64iapaULvHXuA49RjH2OH|E z16{>zNzF|?5V}7~aT+4uW+w!eE4Jesq^bL_E4Y(CkrOOh?bpuO?W*{g?GLY`7zUQw z%EK8Hck^=*^NEEezo`LyLWQwAJI9l;zXw3zhj<#{^C)oJ(qhkeBEp8iLpU!_aBh-T z*;5xj$>>yt>+_eQtjzz?0X4Wtb(zesB&`W&3Jw#hX#DZJU)rzVx!vMaMkW`E(7x|k zmhl*t^2~OqKw{IcYS3tKsJ!eF!}j+-gZ4jo$o@A2IB4kM-VP^CGD0|Q7V?9o-qyvU ztYJ2%_ARr=zIHMtm3zAl=bp2ui1%Sw|1vUaCZ^251j&+1w#`3GDma zWx|)badWu#TK9JOEZVzhb&xY3w7mm?^x;q~XB6ZVHSjF{(Y z8Hu+QKbTlT4@WAxhmv>JKp_m+3qC&7L<(`CTJyLFx8EFH(*Yl?bALdcb?iPNjWg~xYCuuNegb)MF6M7p)$r@Zpo6tlbGFfOWmHfEEzm+iUTsiCC2E{R8#E_hzocPUIwP32(Q}?$VPOTrAs8&M zA)yUb$B#84Y)w4Lw6-yxNc+Hta!(^ZC0FAY}>YN+eXExfTj3{t&)M|X538epR`F>x_t2j@(z>Xbvl)d5@{L7Y)F-KX8tS~Lv4EAuobbQov z==dKiA^GsopPbE%ny+HwqTPb@=gKO*M$AB_?Zuh?!**Hz|)`l&z$T;9Ye3-9mW%Up8m7l5~@4iDg7XUut`?u44bTBZ?)tDtSyAD zEz^I!@Nf$q9pL4G@1f?6prtH9zW}+O`Np*p_d#yK8x@5bO+=_s1vhw+xs|?uF5IGd z{@aZUyS;U@pFSz=MsAmG_;x~RoI>WwUp=0?&T?Yo5nJV*R!5)Jgv68l^gaR_Gh!~@ zvv{bHVpHkkn?4)=nSwWEun{gCz8)O^B@B_MZ@~g3gVAXA7R@`k7ir0 zK|x&Q^92f&8%4Uu8~N6@lsvJ&NfnBUnul!NsH~Y)obCxp6EhXlZSP+79ZmeCm%c!V zutp`f6$GK)VDBH8)SLes{w;FzmE-X zY2hS?p*`w{%o3$T9L!7yrXK2Bwh>CcZJ9vMO$FD2o z@OT&3 zQM~Xg4=T48d(HiiGrFTJQdT#N-S047AKSS8c%z;e%u z{aE^P_IY<;Qc4f{*tlCO@>6H;(>2`n@Ocravz?Mu>ua244SSSf~%S+dBH`6bdivW3c+% zZ9c(3eA!)%!R3o6l8`#w`ax_L!C3r09Z@kvBvjPVLCuEG{@`;a zZs@r$oXn%if1W^Vf4BbiId*qxFUrFBdXqM3C^Ub>rtq8TjYc{mls4_mhUS!{+1)?d zx>vOI;}RbjEda#8*5X==59ld(Wy)&`kw-G#K^)`kJM^9SuQMkm%*&la0@>fFXdUpT zSSoLH($dl!xWGPSuT%-Z{CAu@^fe^dMB>{c0e)KZPn)D-ITRgV^9R3)P$hEzXqc$0R6Rzzx^yh7fo11p>Y3)6G z!L8Rrm;Y1767lUkYrN1BgzNU#@zr#leCgdCaC+klZN>WR;ZB|8^qH%)E2bI5Zxt{V zcU<1i=Jw`k-(^9LGJL39VaLTUu}W>6lm&54o3iG{R3DT7Ex@sY{D8fF1gGhe7x>J0 zcu^Y^OZ4|!Ch{}ovJm^_D+PXEN_dFr=aFkB6mt_AAr8yj&nTr`q)DChfhGY_SPZ!4KDU=sPP*pSh5FxmDU%Y@6z4K>3S87q~$!qUm_RzU%4-{1lqi^P| z(K;^r0FTw;(3WC_NG44P`EuNH(K%rU-ug)m3ob1#L)S9Sx=uS@YhST$+}4XaaR$vS zKD0IMdDE=dE|@y=2{VJLf2O?M??4B#I2r zSRWa4rA`n^w`0g9YW?suMZnLB8TP^;0GgPti~)qa1ewsdEX*}p9FvQ5y~t53SsPDi zs)`P3Yd;TMX@yq>4W>qb)mxM{;0UF)m|PTP+%H!teMiA%%Kh-s6CXdrqh2~G^w}ue z9B3`sjC$%dxYD%h$cYaAm6R+p&XzO=2FSwY&LGnhxJh$O8S+OA+D{a0XJvPM&GUXO zvXA2Z9mh3Wz4A3&;1*M22hU*QMZV!osm=?~DohKvR-$YSQq$DwmazKaf2yZk%q z?%o3@Rm7;@fYy@#YS4tqhF=ZLEocU_dr zPL=*K;{IpE?H|p~Od}=9lFfAwr{uwo$xB9u#07*=5dE0I@hnvQ%|&8M=Ym zlWg&*s8A|r47Yk{htBdZU|WI7-sIDd_;Y-Rd^orx5rQ#3Z^FNb_E4|AK)rrRTZwwc z74(bOJ;V`L!1Jc0Cp08i&x%%yTUqB;G~=}RtN5}wNA0QxpoYzh(2FV9;k2at=;2E_ zg2N(l`E%MzR#;SBBC?ic<6f9{2Cv1XBbH9Xx}Uk@EiAO4&!zJGn}-j$ww~zEB9PhB z+`}#sDR|0CX%*uGFhXHHeBZo1|@gF*h6N`=OFzT!Yiy~^* zKxms?H37qjc6Q792rv1$+yA8`xRb}8eFfUR5nZtn zi4h(32rkQIytaPEBP-Q+bz~YjApRYe$c@6L$_qgH2BMGGyFi}L$QanMPMU-@W&|Hp zWYm~9zs<*=z%UleJL*8fV$8EYm>}BIO21F?51ro#I{c?z0$E@ucR+tCrz$0?5NU}b zG0ghp=j?q2(}3P!p_iEZuJeMW(H0Hec)qi-doB31Fhk)!nn*AVgT}-7lAYH;`3^g( zS-@Vk9C^CdizmG(u$Mg(g_H3SrlulvwPaeol*N z&FbBi&Cf5*yz&COe?u1SQVb(*>rVlP`~4sUra)Zhe$dB{=|BkI0`*-xMHI*a;^m%8 z%~y2p3z2yuhSXrs5kA+3qItUW?*~>(ol80!Xy{ZV_gTqZilLh@;O45;b$a|N_)8X1 z5j=c2_hIM z?B~mlxF)1VE*LKma)=lN?-8+K%2KcFcg%p%GUG(bB!%jKy@iUS2tP5nQPZ@L#+njm zy7mK&9tM7A?{(bQ&l)6G5ZdKoIX>Th5v`aGI?U=R3ZZ*mU5 zZ+?OCb5vlO$$0!wutgroKnG6bw3SKelK&$|!dE`fP0Ma87nMi7*H?_DnIANAJdY}} zt4aZEr*vR*x+2z<3ddtP5j3++52}9acrZp6Oa+tXLdh^?PC)W=whNoIIVK?eoe|bv z7O`{*>bIBK#kfa(C!;hungV!Wx@^=5(!-8ef(Z`*3BUcN)2@V31wm1wO66T}P&Zvm z27~P*206Hw8)_9TNTkgXT3p}sa4tB^>K)8mzIW;p`t8{cKD;;VGzbR%k$QV;Qq+Z{ z&0M+YY3H}{XZJ&@3fuDM%>k|>wDw4f>NLI?IRrc`T~tcNF>pp5V@Lj&z;x7<*kvyaJ{Wgz}KHQ$Y zE~_xQM3?AqcQC||EdN#}o#LXav9*BVR9*wQ(ga)NT3sA=5vfn{0Q2TJcoFB4}vT zN$ew4p=T3a4Pe&5F@3u1gtg7(I9R9Yv?586wTp#~HM?sPX*k@@p9OPfgG3N?JuQv? zDmj_F8kzGFv=0@`Bu=?MQAxJtrqNLAGO|Aio0*D2b%v7=mJ4SjM2x`v%0}ghpg?yk zTic>#wufAw2f)P+`n_aHFX<`5qB2jf=fxuKE|{of-Kk`ciK6z$PWjm}-O?evbhW7p z0&DV?W!+HWSyITm-~}L(+rJS~y*dE2!&ub24g@OKcIgr-Gur0d8D^v`ut4VNQ}{6= z^=HkZ6pyMBiKMTHoFp_EqlV1+3$A`Pzru1JjU8?g!{cFOiJMaxN0aF_6&r^1pdFq~I+9 zcA|}W;q}dr9U1il|s(D7ES;y_366gj1s^2M= zIko0_rxJddgRwE9XnRLR@3cU&|By^|7WDcdoXzuR&Sa#%Ibv8^=0hQNndsR*a-N7V^>TrK$w=DAcunM7nSeh{4x*^;$R>Y-iGx@ao(6Z%cmu>^0e6)j;C~_DW z;g{-r!KrvOUBS1>A=*eGp+}2FYk3p2GP0=tofA4;F?)jX=kls@Sai8k;v&|1cnNoL z>-QQ$r%SVf{$M#tL;P?wPS~JKIA5WOd*&bHH4%8~U(6_XzmUATp&mAO{H+u+6jWlN z8a-Ibz;Ya2!!fNiPdJ#Mv4a0$WhJsFNRP2a5E~fF71W%IsHXZGcI(U8^5wTPt z8eO%I#{d%&rsRy1L`0kDo?_KTCk(5cOkvc!aLv*hf3?=>F3eFtbKZl=GiJtH?UJ@?zH8t#7KdbQ^^sz^uvA4~rNvkQ1$-Q9^+YbwZ@}&rd zWLdw4hO@y}*%|g#i0HJ_lE~++m$stBU5E$;QTIdpX+)Zw7SeeOp%pCIzL&aw6x1iR z_lWa$kDT#SPwD7fFjZ)YOZGcuPemaV+6iwU;!?-G{0QMV_Q2{m`hJBNDwC93Q4+1J z3_kjGG^9ec%YHCMQ-}&$CovXZexQDD(2^OFPTIE|pWlxksGU^&vPMD`Tgf(?e4wYP;kPr=h zt}%{oPH8fd>cn^4j2WaqmW0@{Z(Tf~=-4p~ds%s~UaDW$F|LQu?TQ2oRPX882{MRQ zB#hMs6q#%~HK!ik1{% z)H5*kwTz^Q|3p^WMY^O?o}Gi5`klw)W9YlJ%pF*~b;upIN*V5Ocqb-65uwrL>qF@h zM&-*zs{jRi=N@tV14M;`u8cl;z*fUvFib^(Vj``-P27YZ{}s!Cd9(ow%3iSAOZ31D0QI+@(39p6&P!RI@boPn&Cidh$2-H+4$_sO=6#M(v%qM?MXb|JSuB)Aq^+dC`7)J+g^N9> zgO5-kJsKuoIO!86Z$Jc&PS`NTP7vbxKl}MY{D0%&TmoM2zL_u|N!*L-^F|W`A*yc> z^Qwi9brU>GY6^%=eX$DVm?KBU{=dyp$pRR)So&5br2MS#&;#|BOlh(V3^%D}JXBvS z3^d3Rphk4vGJtE93mtV|R{};(zp&=)!Tm*Np+fa3RcYv)WMFO#B8G~2md&3*^Ptsn zxR4ra7}H}9{ioQ;L4-gD93yGD7?RD-i+8Aq_s|ZE8`WFI@Zhnl$H^gynIUQd79~{F zEv=Q9g-FkzL5c__&UNr-)x0_AdY!ScLvo{-9m*0d(DG~QopZwkwiy31RCc!D|B>0A zR3di~VqVRv?0+fm=p&WER;#p%4K=YWMsl)&tc2v5Z!w zu1J%rEW2Htpw>p09_1QphGU3h(0dT|jiSy3(cAq!#9$}?jFJLPVAJjyHJx(M1#LTM zsd;lA*nrYL*9pYMx+rLk)q0OS+@xq(LI)TqJx>$DG$zPv`TgB0#gtOc7-;$AeF)sj zmls^Hwwj-Cr}y|P$n8KOr_lo*BvVBj?lH}^GdkJDUJeg$lW?HGzFX&Q|1zSMLtv99 z;A`Nv4MU2Rl8Aa)V;WBN8z@01K3w<)eBiK#usHi=# zg*WVFDAABr85IR>G4{z9-=*C=g6g<~o4^h7N5|BkJr4kFH<&4gGyWz4= z+{W>-emDk#RlD^XiRJHMiIH9@saOX{!*--IPLdAgE@=^?mBIL)dIxTOPt;N9C$d-Z zLrf=m3~L8IgcLpHwXBK3#fQ-7BCMCRH-u>OemTbMmHlie3u&x zpT`uzu*hA&tV&ndR14_cj%1prgB`pOX)rSqQ{ZQkg}cxUV5q`%7K_QM58^9rQB(}o zmP<$_q|xTqs38qEode;FY7A!Liz(2H9L+>B65^k4VKZGQ;EI?z2~9;2w`V!i>VBH!-#< zzPIJb`&0=_tD>yY&HGl~ZI9wvPi(fSJr$}V!0}rGX^<#Y;y=~{GTDH^oMnl|Q*!6* z_^ugCJ=jq%1DtJiOWy4mB5vbSgN>P8IKBgaR2Io#Au0#@yUgZ3k}R*kY9GCuC7NWs z{_Rx#f2_riW{_?908&dBB^B5=HPzHlc5;|me@D^ObDPv@J$nc_`OW~=0B;>By>T%y zI{$^fnjI%*L%-aDHxSq0ant520wP2W_!%WA_j}0I`Ye(2d$ZmpN(^fpfqnk-TX7SH zOSN$WBkaj7hm(QItI<#B`&+7jk1aM3+2j z*>hPraQ;wldiH%-bdT0ztlCojQhP7bKH#O9f1E1L=_beKw#dAn?#d6%8Hv6>l9QB; zLIukr$F{(~-kQ_Lim?^Hzs`>TgC8-%(=COprj@ZsmSC^|lIS8ed=twM{eaESBY3m%%M9SaVLB9m!Awz6E){zz5VzQ{Hri z8-^bL!OuT3;XX3&yqX|!R;-7JtB=kXUDjNIXS%TMyF@~%*(2f&JPOCWwxb5Qi;NkU zszT4)eu%7525#p285`frdXJs{yT0G=)|UlY7;V&p48o%=%JanBoO)#Vy znI3(KB+!vkCR?!B%O^T%(Oz;dKcNfKz)xkVtpgbBD)d-DB7}jI=$@pZEk(c-@1$Wf!D+i>`Ou z0r09AU-O9}&u1P=_d>@OZ!L3z&Vx)}U(30xg&DR2IE^%wVGc+73`UMYxSm(VCxe7p z@ME=h7@R)I|0tp)HiQVh8Msx7-R*w;Cxlb9l<kICqGe_rNtBRzaCIFV=IZhCLViBMmD0ahlS0tpo50K%l| z*Os+awywna#ku1WXVSfUsFfkJlm)x1Z;vlA!5m@FeoJ7VL#Y)h26WUiI9^KXzGmAU zULN3W7lcSpXy6Cr$KDE1N>} zjNH9HJw%M!hFal??$XKdfx5hkT;rYtq@yJnb)DC!$r^|vcA1-YtpB#S(JI00+YyiJ zsG85LNn<{$&D6`w6(~N*k45?l11Mh#MMB+3ojCC+x)6@-99mk<1-+oop&8rO97X0R zS87I=pskh*{(a^C_pWmF(Xam&&=EdwOeV7F#+E~Nt=F$7fSTU-{~x%PG@<>5frr*>8lTq3mxqQKP zn}1$1FO`M7nU9xbhpFd5Wn+UfZ?# z5GLKKW~cN+AdsSG)<)`BqtD;pN6m2YhhVzd!=yQ_QIeA?;N{KIu+S-lsKOu(M98%N zmT87jyTrsg#Z)vP9U2?Go0nuDZKr=;y!CNJo21VU*?jrWETZDJ>QoU;3OEVFXR9!b zWBcF)a8`w2ZniCW^tw1}Pg7Ulv~&Y+XQ*T2Jd;6ORpL^85hES!+7S^MH-Zqij_`Eb zH#!AEJZ<)HcW6-eC!^?U0_WzNaWKGuPsT?5<0#H{3+foBIi7jRn#yU0U}PZY58zV? zUGswV>UyOv(j%_9C3aSP$05)C*3i2dKDzWXay(1-xWQPsWUp1nS~qwb7U^tq`GnVX zzt1)gUW!7ID~H;JZsd<{1g6)whzBUns_x6t6+S^+E9+PTC^eywxU#>^e_+8aY!{s-D=wVxf5j6+|BfhUH2wq%Jl3@%qY5H zoV`bw6fZQy{2 zw>lgCQ=RR;xQCQ*$9AOKcU_Vt{K&rySBADLxk=K{PEK-B;|V`Ie~Au5&}y$%DJJ=* z{-yu#%}2N}D?w%e)b5-T=^!uI_Ygrp;Ou>CBP(3Vv^Mk2{6@46j?qZ3VgS9~Wd-#3 zbyn64MC!le1W7lO*Gs-GL#%~>wu zkIUlh2y6xI#4*65X0(!5?n9UcWg9gTAWM!*y;ZUxqD@YOM~%vR`qwZc(x9qP;igHG zJJ5acZ*=A5)c5#xSTr$8`oglf1m=9@c+HZiGhU)u*EMR_X&;y*2KA(r!cHGgO;3tG zL0#U*v!N$m0l9~>s)}3*^DvA;5rIif%LnH{zzra>A!z=6RJu!vH=}T94f9j8XpS!a z3&kI|U-5oz-p~i>rXSo7w@vN@!DaLKIfTgGFAUPrGDp5zY%EYX5aZent{OoXFR zrhRF#4HxV8x;_R#;?4T!gnusIE{raSP67Ia4@)p0Cf-Sc+}kP%EG-eB)j~!|{jbYs@(xPL?6@Yw!OUPJ_ob76 z)6}y#REgjK^OG2>1iibXDh(%73yh?fO7_y$a{p*x$!g%Q*PwoiTd_~qf4slLPpOrm zqZe+eykfpQzFX@iII1$qsdRGGPug!R4;Q>`m+OdUVh6C}!N23|H-+k{J}17uX@n%m zQALA4PFBv_GjAkCIKDq=;Ps%!eR-#C)&WW$N7eeKAJzJ&&2OPq@YgR{H&>m9dBSx= z-{8{n(prhZrhU82ljurxq#VDUlLlDcPR!gk^YBaHxs{KgKDjyaDp9`8g@*rQfRp+i zB$)$5At|?;*SdTyyzwSM_9mrm_2Ac{-!jbBxHF6b;7KKwd*hH=M%q0+&|(o zbmdGZ#nE^UiEejrG5VVSz6>TOQm_|M*kg%>%gLJz@L-il!d45dvdJZqTumQ6eHm!0 zYEDY{N4JNL#OgHw@n<_^6)v|?u9M(pU~qaV!ujxM)*-ay-*DXuW^9E&s9y_AZQAk( z*%H2_Y6v=6wcnUXpMHIBwe`5p1@S`$)XN}6`^hJI;V>>HF`7OQmJ+z?6=)UZLD0)p zfRdyeSxI9Yh*^Aoz86P?>?dVB`BBPw-(qt6U1xT9F7~?8N^Xa}fdas=;DJ)ws3jJe z`G;b6S(f_~pwjiirKPjY3w{y|m^r9eo$_wyicZ>22Bxcy#&!zm`7xy5NKXxjs3uA& z38Hm~%EN8QZr_4RvfvOHARr(xAkS4-0=O9+y-yGzAV?@6Ak-k3Anx`~CJs)f&d!YP z4)m6G#x|}drp}DUHipj54FBCYyLj4|Ix{#}IH;+@f`IFG5h&>Wcho!}K)!#ze@ZoE z?KdS*1fu(l=wJY*nnuW=aN}vZs~t~f{h&@tsz#!9!{Ss)+q$Eu1YfVSy}+a*N$(^s z-rF}bx0mlmIa$W;j{7~RZ}R&#Y=zJOjgFZLkgOk-g(!u4rCfiR$^sN~F&I9d;vBGY zTC}O4e-P^3YXNf9J`5g4OFn*)dd9Od)B#7*&IKv3zI$^0|EBb3r->-ug;)OGOR7Ll z8M6UDpg-YyR0Qxj6)S2~3C@lrwHNscJ*Uq|{%EHnjb;H!5`7iXc6tWf2MwQ6Ver)W zx|(+#6N>|ElF_FBq)wdi9tUA|kjbhNQpEhzB*i@0Gf(=U=Vwlg+92a*&n+&AunNSS zfN+JTFh7%{;nYgs?F=~?$vs6>SF`JmNclzLi8*CZ6GTv8RWwIh<1fZVxe4;w#^S^i zqLAVbe{$tTt^ycklK9irYNa|%z74@7gG!7GS)5->98jI)Fuh@Ol0k=DC7cFY-gM9r zJq>%T7WRAQw18gW7nd$832NoUU=$-Iat3{|amn{O0Rk0`6{;e&2j2vb5)MEUNjX1 z&vHmE=ez~KQgtvxl}}fvt;HaWdR!D2sq(`fm3B&rT^v-10;ojJTc<}cMs_Wz83sHm z^`hglX5JsfoXxValtR?9RWSMP`aorM~5S~pC3ZiE%Joiuf=F8fzO$i z9B-JqZBT!Q^7Afi&OG%M#%3W8Y=++F6Yp5|cB;g0@8~(tv~YA)X6jt?hK^bqMgnoe z?sQbOf_QNvj6{En_J(l+{{5>AQ@#Ff0Yjh zhqDKfTzDKSS5$=G>UdR5p9=SV_pM09H`V)ryRFIch(AzJiSk;-$nea;P2J3S21Nd4 zXRKQE-E1-;D$Dl6rN@gZf@~gbkWg?rJ0L(fgE*za6r7tEcuJ^1OLQU|8eZ4 z`a+@@G_ff+lfMhOH9*4MRn2v~3-~!=*0X-e@7Y9|7qPBwrc4*@kq9lF1Iw67nzoqU zJC2SD$Yb20sPs>rq`Nc%t$i~_Ic16ML8%UwqYGAwsu*`-PB%I%&Ey>G|5VWNb$?FP zYQD!>-H}nBXWH0gwZO2XQ|^Fc5yGlw%Jen_Bpol-ykf!Ap=GnR-#bl+YN0Te0Gqs* zd?#-!r(xxELJB>w_XNF(HSvIUutYF$f>IO~eTfGvQ+K0lA2B);n2ueJ(Q7q+{CIs= z@nyB5_e9?DAgvU?pdI(>Om@%|oRK97qK0}T<1uI`y}iT}OxeEra}mBj-I#K}jw~u> z^`F566X+MbA8sZIfB8CV*u>7Jx@O>RF}Tm5wKIXLL(} z+g!Tl?j-MkCk&I2tXxLk_OKDZvnJN}=$KrVz@d$Z?Ng+JZ{6^B3tt&HA0c``si{RnjY=KS>$CBdPR(2;HcsZ)DB#R>TXECH6|0tV)DMiV@{O6Ti@txdITZPJr&YpOJ zazYBoREDIuKLF7V?UAepuK9F4MKRTzg+nq?i$iZRB^+O0(aqLQC5)dbVzL(j8ddor_a@gp@vvN&c0IW6% zEBRF!N|e7$F=jwEUzqIx9E=&0_9hNh_UY7x%_DyZcpRmkCS$vO8p9T!zQ5!fq>|~h zP6!R|)Ai;o|M0S{|HmH1L7WW$5&4uqa0fhK$uP(!HV^+9c(dc^a`JZ=OWwcSH}!{z zk&L4^=au65LV=-hhDs$t*CQblZBK<}&O%sw|3rsbCT0={YBS~PzogHDwS27-{Fo)w z>%~Ktc+(yn8?YaVWFoQ%RbK~mnjslmp4Vpn-W}3($j17(JO`JR=D~fnM3XkV!lsLf zCf9?a&2Ty{HFO*o8=4*(w0}T?CCC9mw(a)WhCMJP)lP@~aC$h}F(Wh9hv*o$4-VyH zgYXZ~^QE!6LGrQ*DmzWyU!Lx{>N89{ZXt3lV+YKW@=V6->+QCEfb8kZV!dL@Mwt84 zns`w*@ln8oC=USMe)$pHqcGExVM_tp(ULy^pc(RhF6GS=cMq z7A|kQ^{&n0ETHMm-(FNJ(rM}6cy;2eLEVJR!LtIvbjQ}Dh)*n`%6|0_hF*H0DiXHJcJp**VK81AifTj zYg4-$XgMKjA5as$3F4Kj61O3_#+IBPN?tZz4%zTe=h-!$Y2h#_xr{q(xw^ngSs+&;dR>+P>61>&dvH0u6el)lff84d-3;pkH^P1|j10Qz{52F~C>D^~yW%j~Z6e93u=kn$(tguk%6q5-FYfBdp+45}unj!1#3%W0D^UGbAd+?;Lw2k0wyy7?<$hR1)Ur=}kDBz?5 z;8do#;ia`x)JQZA44xMwS}-L(w&<+RMOI)}WHwSL=G;<7@20(HH)_lV)R-~#iBZ9S z9>KH(8hR6L>Nwv^T{UGoe>t3^kigXD23XtAW*Sre#^oY7mF3OGi)YXor**2(BB4@6 z@R0&s?b`oP9L+iXJ|f0GuPiSHY>rui_ns<@ zVJ!MxP3!l%u=>;x0+Rd_JwrnmFWOEV_)h*_!^#>U_EzeD2-uY3{Yg7Z#6;+T1mMj$vG zYu}}BX8tH7hT#r0Sdxn37{lU7>K@f4y0p3jxkuzg>?h<2j%e_L<9kN8EJk@on#Y|b z^VC)Q6u8&i+{$iK0&25Saud~V2}P#1#ar@n^DzFv`cR&gsO<2*)iKS@wd2|>$n(A& zWg*eBApv?x(}4{^kveHd#`5NG3$cN#9v01W>gk0>VHJj_LV1O?)$^fh^+&@YV)3h} zWR!;;zTwupb=CesS9Vi+y_F)(e_*auvkD`9{Jx#F4zDD}8(dUlN1z*VU9k5rhw6D2 z&ORPR2S4ELFML|$g@i;mmm&kpCVcq$@sb|^xg)j?_a%O(3bfz!VTx4$X+eDsm=-rm zv!Dw$q9VSmMpqT{BdI$SrIt3=x&pb$L$~b7La0y#7hXlJEr+a*9gurme}z)Q$aG^= zd21g{&2lREE{L6+>z4P03=;n9xI4u*_m0mK?8V8S^XtZg0VA#3=_Np%8}Tb&^?tqT zUhT@zjUejH?!kpsA~wTVYUp?v)U$W!V0>Bi?B%|BwzIeIYMbkn?!1@*^t?h`Mqpiz zDcIFsy?68}{&|eMEoPckXzS;Gf7!HOc4EgZnb*&d0`gAZB(QDe+-!cXVQVKUzPdA; z=|6#-EIjg!i+a9%LQ3jIyBcv{aek3ZsQouN+riRgDj?QWqpN zpZ1{bdLHcFhg}v!yE*U5=^NKig&^vqL7OCVHhd-a@Isc&H;g|f*P-lUvveo&2$V-) z?rTtGOa%qW4J*pnCwt)-*j6+^nT0ftK5;u=+r%es)3%g9SYwpXk6ejG4Y*esqc$}PRqgJh*T2nr4%Si@v7B4-}>m>dw zk97{gPL(-R)CVti-1i-J8pvGh*$WbA{^Wu(*YJ$VkwY=@Oo!WD&Xm8V#6rKGP?KOy ziMz|3Psw+iYH)6w<3u-of0#SEpoq8mC!2tfBOu_;pi%ukR?+4TBXEZ=FbWts&81DU zR+VEOQP1(zM5j5TvnyMmW@@p7^+;MyPg>7+);9)ucR2ELw8xs2K0*F;0KXosNg@JLIr z9pY~|F5zOXx#%RYVkxOl156>M*tPNjs~I9EBxvl29Z&aIO%0th6jW8d>h(a1hn$?k zTUxy{kNo^s)ZAg=R=`R^Rv>6J=~2?X8!M<`O}isaUaKvd!U!vzE<_Q12zpc|DMFp8 zZrY}dUFz&Sw%Huk)ISbr>rLXRiz^O!uQg2yw76}K%E2H&>LV{AS;m3!)Oa-Pc}{!8 zNdZ!&?9qSSyC?Y?qjv0r@ANcr$5{99gLVPm*J&1Q)>9$oi~}=mTuraK=}XmX0@W2Vu%SV&h5{di~jGOiIeqAkjPO5$V#Bgy3$&JVF&YFJ_Oo7uQWb5{_KG*muFI zi+EhZSbg{Xm_am%Q$~n3x;V&21=+NLD5Lc{oQkN8#?}b0vPm?YieeFoyJAD#?Dj3u z&?x3%6B+>=SVkj-!%5E)snV_*C|A<7#0$r_)}uLI7K)h`TL#7o8p*f-4T_%ejii)E z>FNt1I8YCXLfA6Br4>^Vo;vcCNH#QnY0`l=bI9_NGTnva(&`|Z3|p|sVvP=0332ZH z>99Z%y8kMshOzHi?*!CesV)4H>)O|D9`S035+Z$%)5y^qJhDnw?}{$=5{-k^U0`Xrjjq{= z^yN=PGahom7rq3^qrdrOXNm&bWf-S7y4S!Yr%ro3T^%G8&)yfU==y?^liT!DNddky zL~&`Ph7iM6v4zcG5)fEDv6pjW8UX|MsiL)G+XPFxQ21KkHP_i$RX!a;V@PHtOp3wK z1xNhW|H)B!#@tp1$5sCzqKtaax{Z*K1X+av*{|OK@lRImr0{F<^0CUtkW5FN@fY(y z-O@*{bFA@;c!>k&`+W9yV6NT$tT|0I<1LGO&8d-HuCs*OlDsWJyHDkjMWp-k{gBl! zTU~j{np>jk7L<_D&JFWW0s!|bgFw5S4qUPdN6y;o^&cu;B1Nbh0~TDxVaDUjuJ0o! zk2h`P?hd@TE9&KB{@W_SOeEm>wF^@t;J%t4{j{}N6x#9P!$((d20RX~$UgR5ngkHFlM0Zfs{-4W zOnpUge0MsI7ara8akydZix@jTs%oD&UC6M(gTBI=YdwslQVzuX( z+qP{Rwr$(CGHlznZQFKa*tTukwr!t$-M5r=ALkd0*?L2DP`&Hs&X8zGc9ktSA#Td4 z6jVkCGw$S+RdveAlp)Jnh-34k~MUo-Q55ex)c}F zmEQ3)QOOQ5X{PdMMMj$B;O*@XE4Vv-%Vw{qL<_KM4p>$KC}bq~;9-CFfqf-#4-XYaDi&u++;he`%14(99<9A&wat^Z)L+IW+~0A*GF|#%JK^} zGc@L9ZSz;bSLXLi90OvO;D_Qa<-qJn@3$L?lC4xCgjT$KlnUT_fa+{_F7~Q5n=fpo z4CqqT{8auEbijroZ8Zt_c=N}Cg5DXBLc4ED${Am*4J}NzMqdQF#=B8+1NuPWCx9)@ zK`w#K=10;r#XsUZaew?pOEO%l7So>N<)gZ0>L1BW6mVyyk>TVdUWFIP-C71Edi?5R z)ZBDGmUWAe=$0gO{LVMw=B?YJxSG*7+gdy^_LmK`X72;KOdBecYA0plyjL}A9|(+v zhTU1wZO>UX(1Az0GTgz|p|r?toaG&4>+R?9fKvG!cO2(*Pt?%U@~4`V2bLp2HM~li>!?caw&esITJnZ=}scs%> zHs!~BD~qcgRlf;n1uEh@%7q!i@YmZn-o3HyTc$F|+Pq7t51GF=+lqY}_swW<^i1_H zwnY`=7iil4B}8r>3FSnz4z#ySVAIjUD`@E0pp4Yqet4TqqDYJKi;_|q1fv*^R`In} z&K9*LOVtz9Jb6EVZ!h&AEBwhTi|k*sQz84tl+3QO?g7H!Q`78@swT}^y$MfCwKOOg zD8-Zk5;9&HBx(@7&nXJtFM!n%9U#t#U05>#LI}pv{op>laG??G zVS!X>q3Q$IOH`Zy;?A=ocdJ~MMn3abxR6cS=t|`4V=4gLyzLp_<;CWNl3kI0t`w!i3Y@~*N9!c98xa-5PC_eAjItmTvT&D`kc5Vc}xO{wqnktwO`rXP^ipg zJQ}2`5D^ixGD@@DpZK_#2^o>JWm#9j^?O|D#_IOr?P{VvGS0h|bLYm?*kZA z0I*#}5mb7-2;h5A`csp#kFYlQA(u#Xn273BmZ!0bmQ%X~-+)6KjZ>Abp+d*RTf<)X|GuWCfJHLdV!W#hLjHx|XA1wOe|Cbr_MpY>aQ^5MG? zZg9u#Co)eK6IP+Q52(wg3YJwduX+)8uU^kqXns|5iAwnMdEA&YG`^kUx=a>>zL)rx z$YI9)VirY;b9_k3-O7u%)0{gzfIsd-RiPX|1y2fn^ce|* zz(whLXuKS!A`=|lm1gWT0VI5jm7hL1a?Ub2I4oe~>_eidhf-AxocK2DLy2Zo z>w}Vgu$7RzTT)|jks0f)E6%RuKPUc_a=y<7-D=cH$)R$j<}G$NiG_PqV!-(v%#s=H zeVHs|9JGmb=K^tX)l+hYEc6vXwc9CF5 zb|^=e_D9P;=Y5MRrSntcaMh^Clu%b|3LCwtX2qP|i?Kg#$MiAxT!)F|wa=C4phDnFvb55n1KwtZ!KOQ#!QP1Ee> zm=j{TRUdBu8l~WfVX9}MqhFYt&3>#R^6N;pK(jpqa&ej}S4Gdj2eUGP<*wxLemYrf;m8LLjjF!H}!{6HAtjVLm%JpqT zz}s{0dCN=Y{byYeCSQ7jT%Jl-LJ+#L@sZc4}>q8ZDt|d z)>@1p&d*}B+uQKGYm8*fH`Dm%t0rj@PjWO+6TW}jkEM@eU@rAy?7#-;U3j80Urn%W zlwoJ*TBrwqGW<7llnl!08zP7xu|0(Kx3IuMT4>uAAAj5+X)XBwn3RWXpsKY$WF4SQ z;<~qVsr#(b)i$%YWpp{%(!>4y4Z?9XR?gshk2)m`wVC@>M)Jvz)_s7Cy<~ zL{zSgKfZ$Z0{*Yp7TT8$xB?9TuucyEK=7Yln~S}%fwRefx^2svpLW>nNI&Zz)Mo>C zH9#5-NkVXHxrrSTw^#)BF+6nq7(JlH#YMcg)KWFLI+wrSrf-@zi;kH^t9c=>j5sqe zVa&Uu%e%R!S>7yOPygmO5|{@HN#Zc~rQ@wdR82Zi6jB|Dm>Ra~j#HYV2~ z&N79`&_ry}MOUf)#l9wFo~;Jg4#a!a@aQ)|vrz%xKcdB9e(`$Yt)tb{rB?b@+4E8fRYkbb)H8cDp&UB`)J=HG#va|Vs|wWp0oI~NR?sCyGCYvai#h^^lMwwGdeq(lO`*7t zsi?#6K@^eLMqzcyOlXK`2%zU2VL9cXUh0Flj?x7_GOf)!PKZbIGcPz16$XlCzk1Sz z5;3TYnwh>J|7AL1)=D8xo@LlP_6OWyrAU!)3DzIt>N~$cwZQ)+S2~P)*gL;o@8@?* z)E32<)5jjkB$wwKC6o9?nK7;7>0EZ+ucjJJ|HzKrQm|rF)fj&(}Ccg)rtP3yxbAuj?xm# zZHU@52xA{kFR7L{EM3_lL~&HL@9umUe{~)1zt&OZodY}#tlhE+9_`MWR!8y=*~8H7zv86bW%i+7iO_j!j--rgJj2fEIG z!NW_uz+1TI^l*eB^bs6ERt{{z3HUBwI9$I0x@50rC8Ovm1;J-S)2LWyz$#EG8`Nw& zRT(GTFcG5d3j0;@0rPUa!&3qmMWGod;Hwk!o`PJfJTz*!r3#!;7M5QJA_lKSZTM)b2r8GQoYpknM}yWtB=t?>^WK$LVufes z%HITigT0LkADQ=aFnq7DTBvv|gAEQ$({0fl55B;2%+odcEsH9Im*2BK zu+r(wB%;W#3AAcSne-GoOtf$?DJX3PH67YQ6$5^4l1WQhLQOxdH04r-1c?Z&hQZt8 z(Bqdjhnv9EGc3`swxv#lg#29sI16W_+S3G%)&(RQP|P*0n`3}1;@hd;)K@4WwC3!Z zwjk8!W$4ZSIxF5xk`dsWx zBW@=k9ayltqTj~m|HoDZ+rT})vp!l$Md-domEm*n;>n!6t3gegBQF+d~a}egda=wrSdERof?kSE)n2Xt2 zpOyHd0msxWQiYX5{tN2PJ)p28TpAx{AYc^IQn>tve&hMX}AkV%b{%6MSh zNPMngujCP%;OW@W(*2;llBJX9iirm5GvM07%c!rD*2K`B5V zTXCxgr36gtnR@xDALw}vi;>Y;awQqJUFW!;_sKSVtKVAvCfUH|;){EbMNrdl9|WB}0U;f| zZRO4nNX}_39{B;eXjZti8%y0JfQ8=Q8gMgUS7H+uzql<&8n$iqr{bi69`6`^x8FG%NqxNTYbtkjJ(8%Sf&ll+=kSO> z)2ZrIj&!j?SX2Q;#!V2`$N^%GRa6iuVO4y7N0^&r)18(U1aawf9pI7{kulH&NNqn? z5Rc3e{bgb8R5tKTe=jJ8GcElsN@Bax@P!zS6hj=9gwU~g3r~Eo@RmNDT^~Ge5}XdV z0-^4wOr>YV$?vI#xXRweC?Plzbl!Ow9fGzgB#ZjK*D`?)dH1~j87FZ!ESHB7od4vjryOEaH#4fUSFAnHqbot?O*TAf z)^mMM@Zx=`CKFabNI&MRL5(u$q|9OayKk1@XS=g_e_jw&$sTlGXELZV*)7!vMlt@@BkSm3)8p2C7;wOeCe zuOyQKU$LED57Jx=ANsMX^@wbL>(uV&lkU+H+~0^M6O#hMf`!s1A)yzZj?b?P z_iLRUmcICl44rZ-Jheif{g`y!P8B|^x646`pJE#po~1Vs@ejC#3x0te@C+*NG5T-*bm3)jQ zY~;%Ma?HN6Os^-Uii`(+^+l4ULZxlL=9%lhiVZz&{>6P&oE&U@UPpzUOyCFfL#(hk z`;Y|f#S!)$R(Rc@wX~is61K`Cm;3b2>M3hc?ixiWmG3Dw>ut0LZZH7>!AQ^ zUUBm~tk@*%mw(AiO6h%J(aUTm!3$u;V0^GDk{wE+IXM=w|pC#l>Q;H{PQ1h z3MHg!c69{1JYyhZVrT-NNOOq?i-^s`^TqRsst!)-JvqSyFv0dy%|gX6?U>7lXw^(7 z*HdtxF<}od2Khc`h&c>cL=-B3*gl+QLc%(l`f<*4#|XA#5oh2@U2?DI>?$9K_bcQ# z+?f>oM3EcMTNm%9b58fY`ExE1MDp5d`mfbS^EML5Zqwj2&<7%_ zyQTq05@t+G#S-)~82(xP*Z}ipeLc%&8d{$|%Vv)ALG-ArF3lUqj7AW*=AD7MI*_-3 z6!QY0@}9^G-m=TGr5S8QFDBmkUL_Yfx;9md$|{_TuN4RUV8s^+bqRmuX{-W);h#Nr zZZ|r}67Q68fzu(ICSyYVVcNvbmWKaNz9`n8=(FbiwzbopoN}~Xt_9!<8m)7duI_7pblTF% z{b}1R?26m0qbnH|vsx=UkeJBpDQOHM41O+_ ztD3edr=RiZ2AY)eeaZ*NnRUIe(LwSjFX}e^?`^WIdS-PtDNwVtMtE)61_^ zvnqZkr0Hk?hvUTO%IYm^($1~1E~-Vtv5|J|`%E3aUze`~GK0d(%K6Q6k%0=$Uw*^K z3KS+<6Yx$EUGbuoE2PwWkq%mtNzkYZXLQ(zvJ*$GG@9zmr<>VG6f<@=?3pEyvwys3 zdglI$g^M>z+7@qdRW0jDPDy8fO`fW2q3)w5tXiIX*IKa=_{r-kBQ;U3<_p7@* z0=>HQ`)AP|PF-M8sby_CkTi$iw8zQQ!pBQD1wdJZ?l982y*xWsK*HUIlM1uCQ1rmo z)YQ!a|M6KEv*z@2CP}TBZBs6}Q))h$#;IvOJ`v1C9;tM*;IS`kSb2AXCA!AM-mXcz zUXyAC>WmzB>6jMy`iRzBF&cHd*N!8mn;o@M9In~X(lczA=BVdcndyEtkF8F;+#oT3 z>>qEJ_X!$N9}urcM{ibBSFx+C=o~p+8QV37*~TmXsq^tA(e%J0jF;fB3yvM3%%4#1Y*q**KBIBZ& zfOw&yS9{!GgSqmb{ZlqgU#EU_P%S)S%@@c^GJi9F$hh-3DVw_K?WNRmeFN)>X`}WX^m$6cV?BL$4tZN?wzMwV(8VBb`?o32x#`AMWoEnCS}g`YPArkfeTT=%85+42ZLVQw49= zv#1-Qo>737nz#f?#_ek;=Q>5%6}Q6@Fq=3a6c@8#qZb;3pl|{_Lv*#56>tJOPJE+U zi#!)I(6J}YVOdO`(w z<%~ng&aB%E{6_=|ulC={YkR}}Dz3PQ*V4#D`-53PF*XyKkm{uiRWgL{Co0iMs~-Kq zWv$*7IS)`vqT}P!nYpgXmup)P#M+*Yz54QGA@*D?fWl&yGiB_Twn03@SfrmK;@}4W z;lM%UATmg>T-VOByldH46%3&!JFV0|lIMhxj!F1;I}#Kr66|~3=f)B{lFUA~P^3e8 zs0j72v>_pQ7=i+lb{Qey2p&GUFU}!Va}lDKWdSZXgRk_Z5PsM`dBkaKY^@9apu%0# z-`c0!LEwqiZ_RCyJ!ue>4gE-UTrd*uPA3`y!pmh!60?lGW}hflxW;u9Hzk#us5Vl%A{p^>vkNW*sT6rSCOd4vDuGd=zVqa;j2QlfS9>2z zQzaiCV@p~iF|qf5c%Z2#cS8rZd>lM?xWYQ1GQG0`O=h)<^+{~XeNmKhTv4onHDoZt z?rcG*2@@RL?$1*3o!?^$$*PIjDZ(knpyAYo9ZmE+4t0>Ybw^MVR{kj_!-K4#D%QM1 zE_1B-7`hq%{LVp9>u^@it$->pV2nr%o6&BG;OtOwcaLX#zTD}M#3rAmYFniNe<*pE zl2080{OVI6Jq`e&IUWF+H50!<Q&>ko97uj3|lK%V1_j4~k14qM~ zt>9+L9H-c94tN4D=$5pqXjEHp8|Xiel|SA88|yzX^d9!@&el#Zl~HUwk#{iMt9^*k zFSH`Fa`osp{C#&i>(gBk`c_Oe3-aNqmbI5uB;qzgVK&NO6^mj2x0^M|N+W-kAFIt- zG7Tk*~>c(%D4A~#P*&sY*v_c@9gYa0xVMN!A1w@V<3LoNqq9!{15#S>=kwb%F{&OT07duiY{t}nB1RwJ z=yDB?qNam~-X-ITBfaa8P9`4nF0TEA#2f+gm|CaIl~lXTKB4^@Mw%4g_F~%$8aG^3 zH9Lf2*YmxjSz(xz;sG`B-S&@2sGI%E7Vj*xZ|k;o-z`gX=bbR3S8z26D~$dfMH6Ce zPQV#dd2Z2FPc=#=S^I|LAJ5CMG%=A2v={5=W5iyOI#6G-`Zm?X`!C*k++gR<>!LX= z*4$XR*o@`E1o%0>Pda9X-oKAhRyl83lk~MS03*4*F61RY=N4H{=VWjvVNo0zgM}(K z49$X={XC(e-)yWH)QYz!mn!z5NJT$-pj-Pww`H1eKj>Yeoju}_w{3sygjsgIl{-hg zk`+AWc_!2^PIs~iNAe-7oHslR|aq`D1ST-fW*18wC z8|l9^3L|#rA3J+-3pxlhD*>gThfAJT>y8=vzQ$J17rqlMV9C*&vvMzNC}?c1nc!j0 zTZjLA9N*2$1>s3igk{^J4wVt3zWL3St*=Jinx*_Dj^1^w7}7>uwvA(v1kCkK7`WpD zyRCBAwE}p7GWCITf2yE9(c8#|$VvZ#^K)}L+sk8}U&ini@G7gMMA5zNX!0mM+ih)P zMAj>e$zQLHX)xSw2)PEW^^joi$nH?FMOm*_Ob#AnT-EDl zV2HmlI9_PUWoQO4vj??wA)Tn9)H?K9OB50~aylyQ6K)QJU~#&#h(W_LSn{Nm1&-57 z-?PdXAPfUNvBFzbRk9p#@6mmv3A3lZakg9IDeML5gec3uL)1K<0#?CPbq2zQ2hiZa z1SH1HxUn;A%G)pJS{6n%37YM5SbFsbChzz=27Wp@W0N|C@x_P4U*Bx8^rtDG+pDFaaCV24dY%>enh%n6 zjv}QG3W>-h8Xn};e&9(Xix-!_w*q!sz0;{R?32k1Ih0Fo_~2ipvQx)n4|m6A@50qN zm<+i;TGsK3Ql-Y&<5LIdTiBgB4L5FvRXx0xt|XzGE|8V_`Fe_Ldq{x`n7khccQFr9 z004?+CmsG3BOO1lNU_>&8O6;+j*r2?ZavTiY2kn_)M%NIA*N?km2lf6~Qo zk}h1h4$jN_rZe)>+DJ>n7>lEMfaRSKYWK%ue=`iP#}clF`Sk7SxwaME?f8?}xtijh zc8O37omWyiE^X5VUZc{Wwj^`HG6<%$k%;!$OzY!)UN@>L$-?rHvtVB7nKl~f<)s7w zr&g1!1I&gvqZuk9Xt*M{eg|Zamoz5_bImpbM zcL_|JdfBd8;}LM3Tnr_=JL%o}lCc;f@MnWJ$)dx1O@^|0& z1%3!&HX80wbJVjJlLy)xL67K%fJd>{d4cZmqJ&x3o*7T)9nprT zPP*tF4#oirsM}#1+QCEjuE{x1n&zE$uADU+nh$G33jkujcb^Bf*Po zoj3kFc9@g|ix|O_F|9+A@pnKwyN6ix-TH446PnRmFUBdT41H}Q z2j;vp>*H!!O$o!tE|W~5^i{D%qT2Gr=DaN-@%>jI-Y*yZgJkM5L(($aADxMUA=cH< z*_HD@nbF3olJ_5H0!Dwu3Zu-4hIdXS(KM151{?TRXQ%(_>$^zYJ{4!9BZ(*9%XfhX zlQ*pw3P4QfFJNsnV?PYDPi<%@UKA&&Etpf zB<*Y35%A$$_YG6Ug3su*S^BZIV^;Ag~vf@q*n5-T|Qg}x%FP-WM@Cuoa7@J-6A6i z@zh}>_|du06$;YK{=5ARmwd2QLkCNsu(ni%N)Mt;BQ>s`CUVyFR%u_TlQ=-uAY5D@3G^(JPd7K#S zzQzWyp#Z3tLnxdZ{pTH|BEY@IG+YC3vijy!V`JMi6$1xPE)$wqPE&Q|flQiXIt^9L zy-{L})0Y;h3e~v~i^M%b|EL0AFJ0nzQvvca<|<}oqRNqe`_!c&$!FezRL+dtSaTt} z7?3(iBGaYHiYD2*z)-}H#vT3?^bl|iV{&d%162@SUkJ^rJ&0;UU?a^3L$?wjF0wmS z6cIhpybmg(A_I>5hr_fk<4POhj1E=e_$7R|AH z1l7R=x{N|uFBdH)FFBs3G^h||f1Y4e@{a}tP% znv#DS$wr)=Eo6vMtP|LB3Ld=98%7syPF$Xz01!gR-NXj6C^@CBwtv(>b#^98@Gie! zr3qkg(KFQt*IQL~4u!KwEQKHt=Kw5l98Dg#AZOBnaFfF( zP8bZMfaN`ChAsdbxTVa^KK9Sk#iYPj7mkXGLWA%gBOVPa1pXf+mA@xyV~EemXT}6J z4hnLO5is;5-ofgWd;0-v+nnpr@H;+h+@_xMa&pIKfrjJa7+JHU&Do_AA+9djs~XXj z#>Iyc>b3p_9=c#NaGuzCPnyMwbv1x}^Jt%Kz`|I2ByOv57U+5`iU0&qcl72~wc(?@ zP9W){(7sTZDJfZ+x-Gxvg;}nU5Icq`7HLtL{_R0CL1fWG}^H zCUqfCuo5o^M!V<5JT=&yE1aK$$(7u;T?M4`Tj3d zgo6Lm%hD-ASHEJE=Yk`v+`#vA~jm)y4 zw!y#^y&fm^1SngY?Y-YYme0Kp(!C12_v!F&teeff_w^+ku(TMpGKsg;(EGKPMxIos zBLn8Cg5)a4(c_5-TqLxEeYAb|$5zhdUc^8TKD% zq^~ZRPy^gsql$xj)z-;qH)dWOc0gXA&4EsNvc#UKeY8P#bPM}|HA6k92`Cmt-2!^^ zMnpYp_xDRGTU)TdkG!M{XMH zlb`hB@%UW>jZ8N;GA}i!8ihB)#GXQy-n8o1;m*#3Z#-J-!EGd`3@bTA2G5x(3X{L5 zk6gn{!V0M`4gJXKm7`Ue|iKR$3L z-80g2(ui94VtBkvUGfQO=u5QZ7n&0?oNqIts||eRNYMlOlrk*kG4JezPYsW9KKSJx zzF-OzJN=_{w)jiE8*JF~i|Da(LU06yS;P8oTSUNihreu`?v-q9rtY>H&Em$;Gpe@i z$5+hTHFIEJutfK8s8K?>W!UuT3_mZ~MeLI(ompr~(=LOHCl?p;I~`mi)vtA3?e37N zjDy`rq$tX6?}nE~ZtoAoA-Z_ljp@L3=cFV16)^{cGxz&H`&I^1$&o5;6cZ{%m?NX{ zVSC$(fB~fFY5FXKZ~^Y)tC{c4co)kbzRhq^5(u!aB1Wl@7?5!n5AN-+n_e<%jU}6F zaNs%vj!G$=4-xDx(~vWJyVw)EMjA0CWftl$XxJSNr>$H8b28ho?Cda<{zRFObexgL9pZ?*y3zh?QNp^Cbn|=4#So_+e}7E4 zfyJ}pdmNIBTnHJJ8VfCv8MIfDfgO?(oE-8n01pC(C6LZW39`l4+Rsz*?DgN0FCRO2 z$p~EZp7=j~7ID@hknpF`8BhZSs^9_+<2r*1FwBui9 zxnD@90+^Yq932UGdTHGndFo}Lr0J?-momRk4(lb6v}{241&6@)w)YctphWeG-%Xus)leR^*z+I;%oHwEjEX1N0jTP^ltFszsUdn;AW!% z&DP8f0}<-1mpt?)8qmyMO6^i0&IawUK>^vPyIb79o_3dUbls(K$)(Qu@b?? zH-{%dIr+-^R?@%u8HXG{K5{FzlA-N^9q{33ZhmL81LFj6rnW=% z1ee}gHCtPY`52(i;kCkXRt*HzE%jmEV6l5b%%5Au+pHoIKbV5D2$9W{ns4Tzk?{fA za_6Jt)AZ9dLk(C~j%c#}CR9yptyRRuan|Kvi=bkdYV49yWFgx;o>)_SB7!%Hz-wPu zV^Yog=J-IB=t#)Kup-(rzDc$)?f#ewlyf=|#fk0AbVeh|Fp49}x;-@XBY(+e~h)$bxH$AS#%R(Pkys#f?B6_l)-q!9&2`7#7DC z98|IEk}|#C1z(GZL#^;HX2ie5&Gu0G(q>S*YsJv40PD2=@mCRwexz7H)$M(CT_jb{ zgaIq1Zlvzg6Lp}xfEOvwvj&#J=vfEKONwvL3nGH>WY8UOFevL#k9jzF>yIB~5BZ_Yqv$}rDGM3;216pZ zs@tYZ1opQ*N%GiuaAZ#5x1UkT;Z%V+q_e8RhwTiU1H}$Y0og@m3KuCeClWq~`W06S znd~ETE*gA6RVeI6hmI=LwM)&3XOANjl(35eMc?1G4L0?%Loc%WdPsa~z@826Z6D;n zH@%>gJ^aNJwQT)r7s;0V#nf#R5N#<0t4PTeq)G~rgw7hnoo{?YCBC-2S?(<@Cp<55 zPEN}7(=7V+FwuLXRZ;aGNHwiv_a5%6`QSE^XF2i zN7oJGVrWBlp*XPS2L7dBHBxSSSrrdC=2iAspIYkGvX$6lyt9W^;NOX*_7J@h>;kaR zZ$Z-;4=UcQ;?SL@;xTM6a>TAk0kA?U?jZ-v&|tB%q^3{o(;|=`GAWoFWsp&aY(Ssy zW?Ey#XPPGde&3{c?(oV{FuElq`WmkUuBXY<(2Hr&9bkc-qaT@khiU>|rEJ6AT`e!h zpuaveszU}$6N}qm@AqUeIMg)FC)o(3l zt3T?}2!pN!^%quqvasvQ518^6gJsqp9(hDmhBC}|U4UN81Sh#hW=fm;J;BtGO^xnxS6$D4Rvvc$tEBe^{kHo+n*F6hTC@ECT}p=E3XTKECAsFv zMpu_XP!n5I@kmS4uyNA;Olchm`NfAy@nKb@a~mk(P#$mi+tEgU8>8jl>Eq=K;)Ps` z)i`#SDCd8MOWzS386)EyZbvTnBYqM{6_HMvew8J4ZeKAkT^6c`+1nQKyMMX+8fQy1 z9SvXhn&Sqo+%_!WZHBDZje`hgV>g+wwu5wOWp$=?zv=YkkR_vk9B&uscQwFo5kPO8 zjgs!L z+j1vmqc<{kF87?U+6zPI;E7|4G~lV5wi_tS7ezDt&j>ay+%C2}qAL|3GQd)+MuHlG z8xpAiM?W<+7=JUZ6#hRn-hY^lkeF#bRfM|Bhyb6Y5?JI?{2tH zIXnXUUacyKCMJU4iF9zHwpczXdtKoZS-l>)hS~0h#?aNE5!PX&`;^eAN= zfClS#2``i(50+C_WJKo1D6b_vy3I=zh-sDO{QkBYW=OjsbfpNeW$3?GF8pK=`n~6B z()Pl?krI>-EGK4p_!CW_5jYQ|w!go{Ok7t;nrSy8wB+pA_=QmzIn2;)8KJwv6fT5Q z)yxXREgtJ8`wAZSGqH%AQ0qdv7x6EAybAribgw60t2DR(am#HXbX7|jc zHGY0D$FjJSQ-ZQ}VAWdgH)e-iZg-u4tytGwzvNul*e7cO8R6evop{|tKb1al>I!pP zh4Fw8CB4vFN-G7aHsXrr|C?Wi<8PsQe~>uOR39k09WWNC7rJn>$rC2I``VNFbg$G;lZR+U+VVjL>D1PoQ?2x z)Dn8R)r-caIeg`cND;^h$eOq@2B zNS9t5aTW?yI#;sHdA|@b!+ey-sB)hwnB0ZOCwRYxM4*eB53rhGLm_g<9o&DZ6|x4S z3q$8W!4fm)xgds(Dv{Mq37wq4B-sf_e!)zE(o1FavLP1j*q8S0U)MF{S_df6C0S`V z_DB&NLPK8pq%Y}*A>&cgQAscpMmmBH^-4O67hoP6&L5v?M+#p|cOo+%Na>#~5%nua z-YAXi&^t!2fe^dRv-n&(%c1s0TqN`kOcRC8>WJ-m5b(7YckEpn4?ZeO6@2rudO2E2u7{zVRybHy@S(xtjk{j{G(a!=Kia z!?i9+y*9?13#~T%?7#p9p;FHR3baLUhwJa_oZh~k)-N99ojv862@w<5Z6mms@4piw zZl*7ffOBd-)LQk)+f_-^TtB94y>4S{>zYkEO3G3Wf_vx6B7CSe>+~YqeLq$bN!WrC zRZ((G=x!S8k_ubrDp2zCs)e#m-=<1v4B%*ozC^VKuN61JU&>9}$@sv8P2Yxq&K;MN z%tQf%>guQ!L?ds}hts*vdVGcHBj(uZ} zhD+tIuH;V2eT5pS;tfIj=#|Oop)j+EJM3~#+qVPNQh~;Lh3-f6$^U-7Pf7>ld z|1KFmRW+VJcBYN4`n#m%c=?UrNL{clpPl-cbeh3vCMZmuX>S4-v6WqVArV{3CvHZh zv>2g8Y4zLfda3q?AgdrRc}6h)K*IgE<$O?|C`UVLc27Wol0ZpPC>WoVo$G3HT8&{=N>LzZ68=binC%OA)Z#w;*0idqMD49r0$cz`IP3% zBQ;!|do_^CO`vlHXq}@6fi&w#2IaPiw*{q007FJtW0g8)_|#r-MELp0B!@s%v`!42 zcf{8y#A#Xb_90Vb2#Q;ww(CpukvHGsqf;Qk{nn-{Md$F!J>PXa17iTSsKbPb;d99J zFHVQA_tlP;fU$qf0eIvhu!BsocFXa(hD>d{N50i@`g0Ydkt$m*(pr#NP6#we!^-}A zdQ^qKx<>^IP2csZ6VUyx!wo-Mq?rOl9D!ltr_U8yO7}e|#jevAOnLYJI9sH!eo;kH zrv-J1TSlZq4-L!Y72Tg(Nj;p=?whcO?@nMxSp%I&H~X%Z?w_~(=9fIPj|=q@IzP^D z(=ewmwZwCQf}*{Q9<;jCKpb={K!(k(E8s#fS;gdfljJnU)z?wgSS*JJsjSEasu|l( zYjyh0h;*>Bg<4h*AIDPj!gU@RWg(Bjpja7575y1P4SXojT#TwpwV`_^!X)U87N96! z+E)&zz7oARQT2+-|Fj0{M$O=Ya-()Dk_&xW#vPwXt?H@`~jjoX(LtE#35 z5d^DQ!UA!Ypg=S1syjtfr?Bd4UP}tfukfKfy1EUCuPwltQ!Opkxe(}SDLq{fS5}IL zwU(&V=y2M116M3<$Bo#s6RgvqA>VOv)^=&@|GIpBRsE>YU0l@D%>$(rEr7Yl%nolV zn;ZIeo$SQs$5E&NgYfFOT{>$rxq%5!Yor&as|wCYGjYB5QfIV7;~wFqE3eEIh+NoE zR`!fQmkel30zcf&dQ-xqME(AzedPDjR%7r&d8BMo{}-Zo9E17;fD|WwCa;6~vOwA= z_WU?BFEu0ZurSxNvpFy|3mXK_puveeI!>B$1tpw0EO5d6boAI~EaKXr3{u$@v?oR9 zd(Ozs_Xq4FGYR!0RTua|mOzmfTJBNT<&t9X6Ms)~5m@hbhLSWeaRQTmFDs2_c~S;k z!j9+74d?K{NtPSKv-i6>!CdD>^-SClIoq?>)N

zdyVSc8XYKZ;RlU9vh|0fE@xP zg4h=l@(}iAXoC_~-<=rGcJK)__em7i2mD`|mFd z&laXboIZh?!4UempXG^Urx6uxlJKNYQQ#;iqY3Ti+GeJSSGlBOSC>;O~bEsQN1k>#6@rV7TMNH*P)_X+)5|Ziz-+cH11*GKNO!|w!Ru1N7}>J5yO1M`?N$U> zmxB-6J6vT{tV%cK;0?AzlgrEvcZi@egeoK8H|H+>mxZdX&87AtbMqt6X~e8w^w1b* z;pnPNX$*xG{O0c{7W33kwh(ErP`E?EgKyV9kljS{vvLbk+Cg17?9Cq4!xg`C z>F@c}ho76O^=52^gF?}nzTWt>E;`tUZVFS2GoN%mzC}=@ zbNrv(0(rL_K7BGBKul-hZ4W6yoowHnK+`L`Phe-MoVIJkQ_e-IL$)J@MW}H7s9WaM zgWh(Qo8GK#2MVZIm5qgzWNi!&SEHYI+!cjcI3Ks&p<(3a^d9L@&cPMJ)-?`A2`N+y zSBt};20vM-sUaSu@O^`l1`A;WlUwFXXb*z80E2S4^coyQG1F&G|6v8F#cE!oG5PB_ ze4sEtnb?IUa;YO*!7r;V1FMq=bGM`j_1x zxZQVrvN8S|UDf{y1@m4TS0_?Vt-2Jd;I4N|>T8+!^@PpH&Hudb;GRG#G5&Q?d|2Lh zfI>eq2?l}DE@^a%R#!||2NQ+cWz>L*7qh)5oxfpcI$smJZ+QLS$?UC?yL8)4k?(pC zA3LaPn4U9@R#h{j=bw@tTPJ7)jx&-cORtk68?;u6EGI-uwW_hFBF4lx_~g9VefZv{ zX1q9Bb~Jkp;NVMac4zAI9tc~?3}FZGZDtZ!H2<$0r2}z8>K=ktD?}%h;l)Vjsx%`h zIYLRcf`})pxO`iF?HGoTV?CNJsl}~*KwlLUy(a%pHn`7(LQeDSF;=e*36nEmDXSPd z^JhJouqs{Wo2BOJg+97(Ea>$FQy#t?S zRu#MyMNXskSW^i*jvpg;JMZ2IfEHcfl}%M|Z9%A}$z`j4jn5h%#b4EocNVgHSgnyk zV|AF(j##Jl0tBIa2OljPZzhhOuROXCPpQAHJh1m^Z>Q$qri+t?Ua}aERTr&0OO;uM z6oG>f2#F>+d+Wxjrr~^~%Bo}x2nZewz82WDo%E3`lK!tN)SM7C_A+_eHL^7fDPwJF z$@Dq$VmP&#`zr*oi&bhhV43Vg_;j(^JOo`0e1Y!ov&tR=QPpJnXmK)d4QCY_77EBt z=B)f_iCt$QF&a^x&ReK4f-c2*OE}=LA*35y!Sz|IA?@OOJ+C45&!-3)o#rbT4WSy>&Yy=+*!&a(*>jt*QaKKY8ODV{2Y+RR&tC`o& zpXa4-2`u?}8M~0P%@_=^gA)$8bGp4m?)0W6h{`QdBNiSLd78cWh`rjtFF1CggdG+3 zpl-S9Jb_Wbl&=3+XgsI3+hAPIq^HPs*rl=fg$2xjIm1*bBo##6ew4jcSOk1^1iY^* z&iyzB=4)g7{R4tVcj)m5XX1wSopD8y)GWfmz_RGJ5R8 zVlMaQy`WDsWVsJ7U8eKtteypEdS@>VQ7L+F4xh}4(_+82=TV7%)f0Wl|BIJzKfFfm zcgrl#gLQDc(Wzw^S16aTYab8H^V#hkPKZy=1*kS?MyBwr13zsMi{fU{rbD_;f}1O> zmhkD7-Y%|^Z+OwHzCToGl+5QfOV6lY(dpsA?_446^$jJ1`+q-dcW3BmG-IIPT>D0ao*_>m-e>ddiJA%$`kCU-5K0snA)3_#u|&<# zET-7b-4%x$Gg+guJagV9D(g-3BT3%tNc&r%Fj8P9p)K!IY3>=T2e!je%pY^P?_R{FBAWn!JQZUM^*+YW<&>hh>_~8ncUp zy&WXJ+@BHIE_^|?YqNT=xVU{bC`FCTb%z7dr41$w)VXF~J=G)Df%Kk~%a0J&f!HW) z8mKo|CT@821D7Se0FyL1>@qPW1xTK)9IID=boPeFn(|3O|L@$bzW?vP87g!Fnvf~X zPDwVXx|q~+xLEov=>4>a(b@KP6 zeM8Q8gj`YIu0f#M!6Gll8`-jvdN1|b8Kk2{d8K6AX&0Vzg=f%&8K3QzQ{30@L zQafutoBpbTv95J?BZJ541?pWLjX>3ix~ffO#$%=e>_4G)n7HWTLR7`>{G^KIslEBj zM(j$l8*UGt>@9?IKOJt2I{K*DwgbFg`3Qawt2Jwd_t%#agLIStHatUgT@!4@1SnGI zC2`u73Lv*AFqIfjk= zF#Yfpk>^l1B}6mhl~51tu&_tYExE0Ps!B|s-1aNfqN$Q!uzdSBL9jzSV!(7l(_xa` z8!ueeb*89gA}d+ayt6YB47Y$3NuY^NbDF0GI#hwCuot4z5Q9d7y{ohyTwAN^UhxpE z!I^T_KbwzYzFzkHq#YNU#H*D6+Dg{#Z}fKl(?z{Jq4!4sN7j&tWpYs)Uh0laudj{6 z^1O1uabKMhFt%;K?#9dfT}&nPg|T5ZH=+Z}W6Hnp(9zm=33Ln?t-Q>6337@i`VPDT zdtz}q|AepPlk zi)<;!0qa8mzg0bXZI{sou(;lKKcyWv+_|yHk%nq!&I_IOmEx|kw!q>}m^dRTuPz{W zG%Svk-)PkCkeY)LNo$84%jj5LEIwnbNoxAbAap$#$H7c?uY8k;bZf0S)0Ue}(!?C% ze4*Zd*9nMJ?^G%|#ha4^s}#-3)p1WyOPP;m;@W7OjU7>9;`B3g_@0a)@&?`V@-0?O zCR+4l)*&AoTV{*Kn z7p052xp$SpQ2Hpoc4c~(O=knbDa|XlOAPTvDdfA&&`?6%Mw-E;%0N26cB_)m^C}(@ zKWp)E$l$32$wBkzI_=pXi$aa44!E1<3^W7p zCB%SZOh@_l9AxEf8IgTbx4&Wx#zcdzGP>*2!)!gpxB~LWpG=ZaGQ|8#?xzf7_d@%E(&2cGelc96x@Y2X1YHsYDzdtl@ z4;+2$&)d}mMC|v<)Cob~KL@8@SONX;TlMAI|9T3tpkU2|>J6!EO7~W%>+Fz1IZ0Ij zq)7@6UcwGh%T2&oWYe2sDHQ{sIJ2)T+v5W+g5n8hSWj?$chMAbc$11^wO&5+4(3dC z`EY1IyEMP-pGol3-obncZNV>%nh2$)svnvtQONnA7nLOp!|a)NQv-~l?Olr5K<`>j zE#2u`HO$mzP3@$NDx<%IctRD7d%sD5>tFP0M9u)kgcD*6!D;euSGkln+HQOYl*fRv z$;12#S08G1;T8lX``?eeR;QTMMTq>uE)9`|2A6xTTH3=Y0Tz*aq19hD0lnqx+nL!6 zKaGYaf%qH#7G8-Egn;uM=DPt)%xio){awi~FD1XSJU7>K-Kgx~M9BN)PTe)lO{W8T zZjA4RpNA5=7Wu9#meb4qL;uT}V^sLxt2q~E)hdgmw~`0B-g1ME#rYtL6A8c0xnD(0 zFFIH3d7p5ByI4~@i#y{$2-SGQ5K?~UtFGBV^G2-M|+OQ!cU9p zn*;7%xfhHNDIrk;zr%PFtV;Gzw;P@1GjX5y%X@0IS~wo7BO+aLx&Z-ySOV5xTclEx zVF|(^cS)aPoITf;9JDQQg8SuX4pejrm+t{{YMfL3#}x#&hZX({lN+yBPPy<+4w7<9 zFP}f@!6PT-G0igf) z;5tIbrJ5WV2W6k>;LH+`#+syamfZULriERyPwoIAxu;o z&vSUe(ZvWadxgzG3FI;jc1&{JWcE*+IZJ7EdTuB5uenpVTRB^Ns$R#jdaJ;g>Rf|9 z)c-V#l^eyXG^qvu6EvB-+IUTS{-y9W2#wK8yYdsq=aKN}j8HlX(`V{((+2b$Re@{| z^za4^)3?xP0Kn2T3+G|nxnK&pkg;iqP>P7CgBcVy(Px^7^cjg!yP`7c6;KGIDNG$v z!~YdU(o$TEJi;Mti@?s0swrNvc#oK)r`*vzg#Ze~fA++wm`yT?!9NAd<`i{wFgF{t z>&>!J;aSM-`!a{o4!nHB*R)X|4Z4e#<9T_rw)ICR<@ zW@My2m61QBSXyzaP1{*7IR5v+Pjv_LO<-`%Z$JYB$y|Z||D?Dqwq}l2|C^u& zPxmJKe_lY3u3g54c=HeM4?4a<0T2S{qcKlADvy!ipA~3O-Ql%-R12=Sr9fliCU5L; z+n4^`>WlP5Fp#9}t(ka<%9@(|`u|zhCu0TakH@G!lhs$a|MrELFcRF6Ak@^EuSOP; zL3LC$;eUKSOW(iVQD1V&Z}&m{?VAQ72F}qDLr22H2Rdz<)X(VG+5$ON`3)k|P6OyXu>H|B(#n?!#E(!q4SXj-`Uz!nUW^n$gEH?9Bzlk&a-e9R`ew`V{voMsNyDGbI{oK>H#yjHRb}UFs%Wt#!PZoE zhv|+L%%9%(YN&IEH0vdqo#`EaSm$_DeyYv>0^3Na6M0uR=$0ITQ87U7j@o}vBd;35ypo z{5!#0;|AElf z8H2oTfe5jNzr8HPd{Ft$FZ#a4pBLh}Y_-?nV4A)Fz6QXx-G*<_8$+gHd1#DE5^l$_ zy8pZNfE(GI4<~$XH~#{3`GvT8SXjCtu~-**9)W0wn0xkh{c&9^*uk|L+TS)Tef42e z9Hg9|Pi)hfZxe|=dvydXI=24Y5xf_(Sh8PS{ey(xK~(B3ZN|751X^yBuwp@i&c-Vf zpY-04)97FDwv*exB`s0tDq1#ta0Rt;MM1y-HompI;uQbvcBH(+I&n2rLj_;~Sghys@rq}>=p6m`uBE27sP zWo8~%q~@toWnc&jFPiZO8+z?>fzqrO*Yn;InJTK>F{l8gOS=wd2W4k|MI;$rY(5uk zrRrlourgQ=8-FFOAWH2_iy$OC-r@iwK_1tPwZK*kqZX1NEt`(HO;4!~>x{lNs6Ni8 zPNz;;A%e1v(B1Kk>a;l!8mkwW7U&&ddVAuCz8)yz*F}z+Ab33=In_HlF zWBw#13xb>bwcV%#K+sNHuaDZEc|aJ%Xf()ZpD6%M%I@iK07Z^3$t=|VkH7WU-Vq%4T>})u(eKSxHH)XCd^ij2 zJ}^(&CusC!|oY$N2#`858xIhUtW(6Wq(AMY4FGz~lS{qXllAk6vl^H%mI zuo*B<2!amf{OPh3_sq7uiiF%po0aR>wGaBmd;Q>ReQrtRROYviu!;weKfOvh4A@8N zSQEB7BQnjZFm>fm;6sc1gaSgoPIkk=0zAexPLoztre2IW(rM?kf47W$=-3o+Pxz2^(PNzj|Sm1XIOl4ax-fh+~kx{7%-zD!jb%^)$%bgG*u{FgPy>k1xrs}p(ERP?$J+s1P{${s~?s$c@ z`S9>}m-aP0_#w(7K9{|FdHE-W#C{{bq!soDJaeyd-D3{uV=R4sT^+Doy6lY;0$MYT zge-W$CFY5J9dPMqA6bJ@abhsACxnWsuFAUidP3%H&?y=i8uxhGicx+E^WMIjFC$;+1 zu!!;RehWtSJ-6Etgw0E_RSFx)DSopsZ_BsCOo6jaD3<<<53kFykB|ldlZOjX<-{1# zJwUXdn13zgQ(4rKG&&}d^+2P`FDbtfYDV=)=New49^n0XnK9PFarZB{fcDL5Na1wq zaAe(K_xmHEnEmbV&x2>xw|io#i0RxbjQ5Yd0`8MpIf7;JeVO{2ddk|sIN7HTJ3aPY%ng(A+Xqlm zIWr~^tej*0rOHF;NNcn4=)&DPbf(zv2vK{0x^swMm5EVE38oC-L4>Em3XYkUn3Iu_ zDhD|QVj`&bLo5CCXuAaD%+Ri;`H`;u>boYRK~KTlNe$K@k3WpJo!HXF4fNaZLi1qy zJntQRv0=jQms&}r@faL^*B&=r*+Kk1WdDf64lv0`EVGr5FmhwI9JQ9AO3Lh(v*aOD zxI@GypC*H|1}l`~@SD@wB-4fjc^WOv!+2%@b21yoD4cNxo-d zIMLGOv>cXhS>yMnrJ+LI12fX-2;Cy{q(wu-eBB=M>T+5Ed)KTcS9KLR zcGg-VjKImnUxHYzg(c@47Oj*WV&lQK;o=8Re11v(ojUGA0ehKFqaD=OBZAy)|nZ|2$*uLcH;N^P<>g-9Anosg4g!)nXh zAzV8QI!f)L5(`l&Lj+u13|!Kr>}+Y$#B=oK%O)N?)NDLS@5L@VGOiERvmZ3pRRuM} zMRLax&qM`=G?^c9Oe>uE{MbSdhdSr7)&?n0I_}9c-_bQJJiizT<@RDmkD)HanEsn{F zJ^L*3m`cRpPVq#o%!zq*C`OdnzR-mMlMrJiLnhK1gvRLx7u=DG4=A-Av-{)$I=7YE zJ+S}0)J`nsSpGfOax4MXB9=8mXgF0u$kL^G(GN2Ld2b@5@dih=zxQIq%9P*+0Kq*rxQZ?v&bLuX!*o46hJx|haj3$nvw+79g zFUbal-poZ#yZnKsYKgClR2CgSFp})B>Oc*{q8v3?Pm{4DXz>GUaAF3f&lNv~tqZde z7CCdU4S^2rf-}F?DTJ!YkmX1WRzh5A@pSzLg;#+5OsQybH^}_pQ{W+;+-FaotWA?# zKyfT4dP^^&72hc72rc11JyDy^A~x8=U~!kesx57(3Em+m?>wDfkVzd8nKW?bJZLbWCcuarU5lKi{ z<``q>Me@Z~)8x$V2fSE0;T)t^QzwgMR4fK2F6GUd$Okt49bKJiq3uL+z{7!^v^3qR zFh(pJ+vu|4?J(jHZl{WqFiB$W$6uNw7nihT>8+__U~Cnqd3XO4U(hDIy+3D`&oN4^ zt78y&3XQ=6dNGDJ6H~!6pVq<@V{oU0w@MKLboUN76?wyNg_>lfgRYfmkyBT#qj?)t ztv{v$Q+)bwV+Kaa%J$89j)2DE0`Qv=`(O6UUKR~imbgln9x{wRTFcOeQm@U7%BxzK zB9F4bq2l4m`23G%1~{oFX)s*wA-5|GS>qEZyrB@>+?mSP!;+|+MYcW+Xt@`EW~e%uZm~#jhWb| z@qgm0rVh84Z4`vH*GDOtxzc#;WE1JQ{FkRycD-EbA=PJ61=bpK&ty=rR?&01it%dl z$p?pRAzQ--M>IgHdiVY)flw}_Nn{c4#wlqB0YiegP4?rugSKbGX3&#Rwl+yKSb+88 zav*aO;i{Z(HT?n@T`{U#UBk1FhL3zG_(9!L8Zx}Dwlh1D(u0s)=%B-#bD50S?clC8 zagxc-?3g3uY59{H$IjC=aP`d^ElkcreVB^fNG*6~5;!z1m_Df+ar;Fn(OJa}0#iyG z*z%Rd%UJcfi#T5f8TR=&T7laCi#a%I8&3iYUu>x5$_C9%mC1h1KYEHN*P#b)7xQ$M z9D9?!C}vHAxTb0*mwh7;4j(R#?XveG46@~7?hk}C?y&byN>s;ANJJ7|88Q@L5@bSo z_dktMsfOlbgFiSOh>9L~)&Mx}C$ziYR0jo3^um4BYsG47NeBG#?JFm(n93E-6Cg`- zq5bFL33zSf4)0~R7NiOcOG+oH!MGnf`U`ilP{|MtLz)fy9VI`dXw6#gj0XImXwLA5 zQSbt~^S6ej>RPSuql)3PdrFn$O~iXkra9hBJ42XpJGKSQNvXTVo)Nme1QgMefh-)NJW$VQzg5&YQ{B?!zFMD` zhmNf4qARQCjmU|x0(ViEZKrI?dt_*SbB>aoY#-1w`>q>oB4^SEfVbPC^Bjn#1Z)0Q zd^JZ01d96Y^03dYWh_T=QH5p}DN`7mhe-a70U^Lz-fB5|r6Z;R?nmFyB-fcAAVHh$ zN>cBnK`CrkGQ*0LqPIvZmM#XHduG2#2|0LTQ{a;363$XA&jL-)JV=x0VnD2{a%fyZ zqZEQq$PC&O%ky6Bcys9@p%-ISrrFEy`w!TVURzeL#mE=S8kF8iO^OixBy4FkA@XL; z6N-Ho?8t`oZU=#(u#=mA>_nXVsi`)sO%e7lO8~TS!RY{uMDt&{GXZ;g+P(S~027g2 z^HFg=!`$qT6-RthGD{nnDPmF0*Y%pJAE+S)Ro#%W|$t!15^CYd^(kKkQ`dN{E) zn?b&`$i`J(^-Zf*53}?^c1>nsH0~rD1$g}MUG<#uKH|;6Gk#jm^rtE~%x(zf&uU6a zih0WO`9o;5;YBmZm2uI!D!9g?Bv8D>{Gf1&n)zhq87T(f414zZ{PS%Q%;(i^1(zI? zeg03eCh5p%xmfS0jN)15d}QhC#9J=vmkHIolK&$EHX=L~aI@aWq#HP)pYy{lrB+{5 zI>MtIOz_`&+`dZPj6M`o85w0rp+rgt->L!oTt_&HtSvvLWB?;Ewm$C^)M$e=Q!rehhXl7@t228SOnzlWxe( z`>tQzGBa&AQc*d7Zyun&CNI1tLA_UoP(23S%jH)jPK)D<$v{qxRx@v+A1@qBkP{99Ynpl#$pWcQVRR zF$>$3+VGPLL~fe#v;gA4LEFeQ4@`}`K^9{pIM=pKD?p~~)Nhs9=_153xeu#`-R?n$ zQ~(8Q5FA;mTE-y6p&aQ+qHm3B)6+#IdUnPwO@F1sdQV5CK$*df%TJ+0P6Z5#fJD*_ z_=zlv?MM!X%jP1j%Q;!ekM^)jviIH@f}A{{J04-ndV7kE(4Y{FW|Y$YBb9UJJtVRt zd8R7zMDD)*{J@`&D&PvspJKHdUJMirL3EoGYYsEHw!~`E;xwrav72l?Mk0;X)D<=&-5e z`KC&VuFHtL=}PP9%?Aj8fF}ev(Ab?6)-+ZG>mU7`sUU{q6>pWCvnLv_D>bS4)m3j` zjpR-`Y#83y19PyXOD6|%`LsbSTsS9OXrMN%#4@^;3)@P!$jK435V(-ijFER0&xLJj zRsBRXFKA3;sk`Luz|y!_CMw7MmxarWk^kTAl0UNaO718=GWW&=R<3z){|1=KP?^@K z1Ijtx?rBPmIq7})Z|)P@_Svw_G?WDPd?=yB!xy9tMS$4T$VwdHF$WG%j{5L*5gLd@ zDPcFMvZJ~=krzWe)s%g$3jz_xC-oB6*aZMikyk1#;D=sNs8wb}t@s1JCwk#)$r#Kc zccY7m+}tf~xXibis>*7Z<>a?)SoTMMCof%p~Btj}jFxf5#G?BC-OlZ^)={K}rxv!-HrQ7#Sp$op8> zswX)7Il6aEz zk`j>#TN!S8?2gb$$_xtBRFWug@^}DhS;o+*sgA33dUv92U)2q~kw!|9Oc-&rD?F5! zM6FIjw~`v9n~DSfB{JEC)^V;N*wIJMOoZ*?U3RQ8lj#@;Qnwi>oovkk<}At(%^jga zBdK#G#)A5aBsgHp-Qep~=);Qvl}F{E<`p!rldi?Cc%rgU%9ZAfFRcvh+Auyi7GrbI zUSejQw9%$Kd8e!4-qv=2S*L zh`BE6gJUaxzOCo8ygBuykhhbktJV^5)-gL|&IJ&V$PsT?i84wH0z9WdH;7a1Ww*=F zg*2xe)6j?X4IJWFyaZcfX*5Cm?znU0E?3#xx+G&pnJ5;zH=qBZ>_TOcHpdc@Uy;cb z{#u_W^LPidCM=od3RQKm3ses;h!9@Dldp~^9K1LU&qRV8p>W+)u@|gKQKjFe?~}eN zl_55`-@(qiavUlB@E3nkd;HaFj#zCyP3D0a*uYV02n)aoGMT%AYRHp_`s75Z*k19N z!0Qed$XIg1D&NA+_!Wpdy0`gBXnwtam2VA%ySYZiurQj%M?)Cd5oI>!^;N|l)>0q! z^F-@Qpz;;JgR6L&z`}8fDgYTx72pXSlRyVtNfIU~za^;_;_!~t0b41ia-kD}8ea?Vb!)dbQ zA24B}tNM3H<_D9cLQ2CIy(NLnMK75qbENrH^;a~0h)HZV((74DbT&5rnaYDu;-)sx zM1Ef-IC6$Eh=xc84nJv{znYF4w1AJnSD<=716y|14wU;~aK;Lui)bT#KeE$}P|oyv z+&w}0!%6;N$uMZvg%bzdu}_5)Vu(BBp9vy^A$|m4)UHo6>)VCd#*!1r{!UF*bf@AnYwjnRty19i5#36?cA$BfytR_q=WbPp@#Ty zj3A&h3N^mne)Osq;%ya~{e_d@`IFv5Rj?1r%MNjTB-=@{_rnU!nL;Q{B@HHQB3nJX zNVaTSkCCGM!b8n9$fsSyI?0v|={BJAN(gfMh4!__gXEO*g)holX*3b?>8;^e09TV7 z6pPSZwEO&}&sv&sOlJYz$-Q*%K;lj6%v7Yo?KTr3)A}_*kKqShyc#HcE1~X)yrlFd zY53X)eRPT(I7G{10+vZRvk5=g_`&#(=AFPKRp}HpF%CiD$vTy4m+IjM;MGE7e7f9j4qXj}8 zqgGfj^uM#l3c67}hK^}_Dll(Xic|(|OU!6$WpNvB@E}Cv7-3BBD@(5$lJR&>GQfPW zoclnAY>ymRE#Pz6(!)G13X7-Q9U=q0DnL3wMZKmL{T#x>>^(M!HGBkNi#-kL7uDgU z%c1vZM;8yH!&yrfTZ=D*TsUo>Ddr}o*jy)8+FX`W5#~y39(}Xw?BcR*2mYxqorat9!0@%MH(!=nYLv8H+k&yYhMe)F>5#wO4F~ z9BY^5>;f8V2}Q-X3lu1c)<+|AIB@`7%X1ClP)WE^0eK7MvPrVgl=nO_K%F19+@OZCMnD-fNK!jTcEc-K#~yQ=RBr)*--}J+sqU+DurV z5N-b=7ve8AS+?@usiAmK8kTtxIZ7jB#X(=&3;P;%G%M|*qvO7rq+bxp2OkcO!DJVS zVt4u1f3Dct$T7D}7KN7)=M38j+5Ig~N{7MrZaPMy{eO*JEM9Qnv*~uyjrOypHYFfz z2^=bnOwTINx_D%xkcl^Dtgt~ps-SLbYw+lw{`8AO7MyH}AL2zjrhi(7e`J`R0Kxl0 zcXRM5Lqx`g6hs)wrm06g8|8yqLwFbor)teY5oQim29}t>)TgPR`*iOj%|sc2JK=)a z0NR!2XHReT;16PZgk)Usnc49ai6s9q7)nHEug{Nw6;cWc4KtEBII8ubrKU^$8VLKh zwQ6;ddO^oMiB`V!-LJ?jFS3iTDoUpnP3=i64=MJ(_Dq1|G%VVr{G}+n=a9sYL2p=?wosMyP!4Ga;Y+^#PQCi$J;pHzE2hvn575E17@ zI(kV!qwn=AB52$cKisi~k4i00L=^ilgJI=u_@^&2c;8;UYf{@VtAVDwc#CTXJJ6VS zCDPO1fmLlq(K-f7Ki<>B70Ad}0G}YmmxK{g2-cm?;dn>d5KL)-y7&pD&bl}tM@CXU zAr_S^y?(+}QfWtiZEIWNvfyF>}0`}9dtKF2aTgTl;3Rst5&#|rXhiAQ{oev55!F%HB%$ETf}LV7MFhG8_%*ayB4uY1pT11c3+ zy*y1(a(;jWtE5ppn|{jd$Kaz!hi$u7pSX|RTe@dP5s5ChCHPrG@3#bos5SzOe8T{0 z+=l>J$qu(LaV1mo+Q;lYhg7~9xKSbcUNJ&&-YhSPeg~7gUjBo=##{}@CHmhRUm=r_ zWrv6Rr&(eHgdnz(rtdi^{kO}}TY8ISn5JhY3}2};lE;WBb|(~|SIm|#+;W^1imZo* z=HtK7C0^_-)A@rBjh;R#!-c7*;8m*GBVncOUOr%~?M<8Z(A*)fj6GUKCy>TQ7fl~i za(NV_9a|e1K8!JX?O#lyK4sG!tu0|0#){Kk&sJtgprVtz&=!QC7EMwTNzMrzx5`MD z$|DYzFDsPE9#(vw@eW3pT~P_+vc!`KX#DyR!(eFjO7C@_hhGE=0bI^=-OSXlZc*$3g&ly19rlR%mk3G~!O) zCvsZ8Az&-Q=op8-Qp!ZD&8FRt_$j?`*Am=!I7Hu5VY^K4P;G6K6_MY#mNy0naECmfm1!s(1nGRKM98@WqfZkku)iVA z=fJt!{1nL=z^qfr#hE&UPED3`spR+bo2-BVy>Qd&WiLY&H&jErSj3tAAaiq;9@^gs z6;wD5T+5M>&UZ1e{8i-d?(6zBX!RX%F@rq7VPYUkzPOdxeDF&fruW!el%0OT>r9V# z+h{rSB&03C#^WuOXkzcUFso<;8%|iDi+9bD-b=AOA@}xtahCa&T<1c?I0S<%EoSfH zGQ&QK;WOFcXi329Juz|Hm%PeJ=L zf_h)S>PTdOw~t^z@?`-69##{4Z%z};89D~@E+i3pk1J$11l_JGJH6VB|D@zbd+A7; zSmDk)rb9B{ucj{UEmo$b;Fl?TRw+n8&8R}7g(Qxz@cLY8%wyM`yx&81^SMp34Mv|F z5Bu*EZ})?Ioq~a&2EXurmlVL{o{xW%V%67mal9}q%3`_a!T=#_3zM5PZEd=K5u%v6 zd3xK`2x9uA12;Ir^6@kx&DFe9tqQxeD{dx%aD`gq>J*3W7j9wE{vNFwJyPa&U-oiSul<8zyq)ab{oe7b>+|boL_R$MUI-0JFjq1%leLUQB+QY81PRKy zX2!OozHTH()2U|NOVmCTkfoIzn>#P^7Hh{a;Guj^ zuk5)Q)Q7(RYIbz~#BK|YJ&gFdKPQsrU3GkBti!t@r8(S=GW>}7HNfC|MJ}!E`v8xz zgV)k!uX2KVeH7-7k3Q;aZ;&*Cf1fHobBGe_qm#^LR*w?A;zmZ$<3)mKXy(x$T?`z6 z5X#SNE>}85V4t%E;oCtLWyl=Gg|zM%S;6Xz5WWgK1XN-04oE*@=4~kxUon>(2}|=N zlXy`+GJ0*X2;}RJxkVY`=aYjpNWv-rV~ET;JZHMLy?^zWZ7R`lgPYJvXQhYDkhIyC zXdn*67gab}zbhsTk17@GGCe5C+gz|pt^NHBQZDLP1AMJ{qo!Z-0jV}CDxnf<;=}qs}W6Yz5kJO`!=2B&N#d(*%sWLIQF45 zlIX)Hkr%ms#^pQ2Yw}N?VbV~jMbYQZGF~9t$n5od7HAwo z{W}qMp|W|dYz2Xigp;EO5tA$=yCg_i5b{6RI;S8_V0PWMZQJJ8w(V)Vr)}G|ZQHhO z+nAoV?VjELKKoRiU3G4fO0II1q>}YM3mO*Hty_SMz~`0i_FK?&Tx}Wu`TZ~D^xZkp zz@M4m9!@Lc)=;MIp(QXtMh2R5Z+uVgLd8sg0B)>$jm!pZhclvB#y!$Lh}Y85Be_r2 z@(%meipUYOGL)XPGxsr142c1=0?I>=`d5N@I`OMsoeqLz3ed|x*&T1-ExAiil55d} z!5}P!7lJIQ{Z)mnxUJuyS&i+G_9TTIkqqhU@M9>b3l5{DxvBw zuTlyFQ{a~$s?`)6)Oo}C((MKdwWciIYZ3umAq`gd9)4g^U#Dyf-t;cj86OBF!q?kW zsUoa|Y?f)9Gw4w$giDi6`MxZN0yhfGrt-phdpWjkwt9eL(txI1r!zJtq3o|^F|{s; z9KX#Vx8Qbs1UG#ZiCxAG-gVji=VIn!b8d65on;Yww#t0po@ZfDhL z6%7WeQfb3hYTAqLIMOS)5b)Rs-BwvAkIFmQ845w3lJD~r{U}h12B`j2cUmj_wci}G z3Kt*6=OYsrrr_P=cUNLp)Rvgnb=H5;0%!X*sj2H`Wu!b@Y^7%r5TMcj_HiRW2nok6 zCz#C5SxES+?jiI`E_jeFtlAn@zGM)51z}ZHJD{`JYKOq+vc7I6? z2Nr&fI}XJAstn|FViIA4#ka<>hQW}`R|=|TlQoqKm(Q7nWQeK^#pxKg(F{mHeK%CW zP&6fO0l=+Nldt&5xEsW+-=y}BCQGiQZO1wi36_k|8)~)TvM6YBy`do27UDg11`yS- z0i8J;7^7<;i)92qn$Y+jfQyYDU(E^lDaPJ6;-RF{kl2u*XNw=R!sxCxX^7{G;<)WTI>ZhbZe@o=3iz)VKF=g z5Hxqjcqvx3CAdCPIG-A?kuf{_DtSt?0}PiY!pAg6B)@T5NL%So$`tJ&Y2;i@JV!L> z0nz7y2h>)hwVj~`u0p7waM6IDC{za-*x$!`7Y=lj{=d~;yZjuzeI1@n{}p;TyEa#& zIG#~j9tFBKpxk`%nGirVBDg%#j&JcC-z^J>v=@6Ty}F+4Om?ArGL+a2+~zj4wQa*MFVo#*ub zy}VW~<^1m@hQ*LzQG(?H64K0AJnI<($1L~A_?7Do>(8A7PEzkU?Jga-Qj2wN_Vm$~ zut!1Ou;nhjJ5ASsyorO*K%7a=x5?$NKo?R0UPYae;0JdEoZ@4BP~GRHps9P*5w%}C zt(d;4i5qB43=|Y9cZiUezIozkuY;B$=EG=agzwFKgbSmr*D$aWW_m~Bk%%wXUVli? zi<`>98n$!64JenoK@K3>?|g9Q1+^v*TisPUFI_-6>%r93-EH2p0Qk>A#$o;gxZh&T zCA=@U?yXy@{;OS5&6i*B^dRZ?-_K*5r`HrhZAQ8)lttxY82rwYN+-TU33ES}dhx-K zha)O+vr8u@LT)EzWt1p{2H5=7>_MIbT_+?7i{;4bsro6smRrFY;w5NK8pc8~E(loH zT!Exj_(E6Mz$%}|Z!Mp4j0J<&JKW~hcnAk{@f;eIW7)Z_=N1VYXlBsHbN%EkGjRuZ z5z8(TEf|XICJlPz_4Q&COKZvsh^NW=UTjTln0+N`1quZW_4-2~z4_TDb2Ra8>Ujf& zXMMVOlgjNLsM?mHkAn@EL=8*hYkw|Lyk9g+ z9XEfL%!Bc&I-?uZxMuZ%;A||^3wC1EH5oJ|Qn6*)A#rScmuEN`n%^nL3U?OWIeI=& zDzq)ddeHlJ7`~F>ddX*siQSp)bzO^S?YSgNN8G)G?zEh@arH0m{>J+B1K}3&8OkZdl!plb`jMLXezQzOl zw+!G7AQDqm=D}U}hWxf0jbD&?XZa;)c{hr}a!h@X{HI0Lhao5#$@*A#XCAPdgopb2i+4D#G={sII0VLHM}Zuk}!9pMf7O zP9DZL>Gxx+y>ob6l8p)T)LD(HrV8^95zSm3)jp9wdAdV; z9VBYhIS9g!{Yu}RfBGBUU6##WbB&$nNR`ksUNE4Jd7C=epb;n!;c8nVQN|b5v1LeX zjs5Kpz(VHDfsU$fb_Qf5<8Oc_fT>hU6KIUo3^MGYp6CM2yPzfyYl0PC;NRWrzImUo zgR>(qCTJs~0OnK>^=-RrQ~H2S1=f}R330RR*9vV+-|S%ta^&m)%e!0VEW65%^6EJq zNn?)JzF=_2xUsuU!=)72053>JdF8vuifTHA12Fvy~ z{#JNwjkTuZFh!mh$8yIN9e6{ za2@-Ya>(FS-uLoZ&b)xw$ZVK?luyW{6R&vxAqcv83UlC@ay3XL)&y zuqMD@`~ZY*_E}QWNWQFS3eDn;+;5&x!C^hJ9w5lgb<2CuyYK*>wEW4Edn~S_vop%_j#-T;IUg06n@#uvkcrc?cWP}u(|&2EvoPRgCx7) zi~)E~3>^si-@~2PNY)W!L3KdOifhO0V`hRQoOH)hEbjFm-e1ICK^Dp@SNQO?_eLT0GLK8#-AI@QbpGf&JpC0A>}Hwx5eq{QonAgP zlo1|kz0w(nn@4b6Gn!tFgH5To6wDXCXER-#?~dCY_-BvbUuT#voy7Z-N4e_QF0R#= z%Wgn(F2YrdObgwQsXI^c)l zNps?Mr-uyoqECT{#v08k8|buGYf)ezpK4KREHBU6SEyyzM*PbSO=S8S(DT9&^oX$w zQE-zfjI?ja(N0|BPc#w_Rj{ol>FBM%QayH7Ky9zQS0*pRU`H}g(YRzJ$vimGRsAbV zgPvuTVv4QssgQ{0-4JFA#nNimnHdBC4wnS`xww5Cz1xD2QG1wg1Sv7pC^wm&uwvwi za_(~xGydYLa=prl0J*jcGkmkMrdNE9y%1`#%-A?_SH4~M@Pa=39_Q2Y+N))62E7NU zs>_a1O=m9bn20_GsC%WsX>s$011$m#xK1li&>4rxX* z9i(zFgRuB*I7YcgP-x(}0|%fLqZrt$1x8^b?!cGb3AJkS%Mz7nsJOzRRgx*Xszt3J zpoK!DE+P%J4yGelN^x~he4!N2Ri)q;q5uM?q9G-prpO8M{4&Mo?O9-sE=%TA9rx| z4E1yVSOi~tlrpS0-9A6I$2tsq85LVmKzyDJp^7i8sIRCz0|^Dnb|-|Ru6mQ47H05i zfVMdViDx~ADXC{WM&>{$L7~G2=do3qJBV6uDLuqw^4~bHC#1<#tl*(%kmM`Gs*jnT zA3d1wgV-S$TZoa`tXpS79tN*ASGrDa0!(0*xlbU$@8MbWOUi|RTzUUo%QRk}Z93Y& zzOmoFYDN7L8#go+)E%b~Dy47+XKblVn>ZHD&hpCro_^tr3eGKwz!v>clxRq$f6 z)CEPv@=%Z`27b&mI<+wK@GRx8eR`a}M7+7@QOZ>DJn7+mO(&TUGIU)7O)ljr-!9l9 zuNGT&0V@sW8VjZBAL+u#5$1snLODK!A8?U~?#Tl+7p*$B4t6ewfnnbZTKpxuAJ2); zJR++#o*no@_K#KSi_>KGN~o{qSLRV_4EhQm(~52$#wC20MfjaIDcnq=u_qF-P1k?=4cQBEQ~8X1f{$7P6x>ofs}?@ClQxJiqbrL(M-MM8Ayn6a#PDrKEW!gnZN z+??Q7rl3jqW}-Z=A#h;~l?2PW+H=O$f0eFSY#_@rrJ*WVHOVB^3$vCaL)ggTw4w3r zi2~e0dYeRh3MPd)lSB_vu%b6W}LEzJ9V_783KHg z6~c(z>p@pQ?D`9*>nA7YnL2v2Ui3_B>R8Slh=WbZnB{smmf_i*g7 zWD(~h#!@!Qly0;{FRM4LQ`YKMm2@TT72%@Rze*k_9?s8dRH<%5mh_#u+JUfeO>d4; z2=85YD4;;!GN~yalF?e(V&t^0et2zf#$f|b=;35Iib<;o!ss^OBi6X^mC3te~tb(A+^uXTzbqRU{R&$mU*?{()+ zXjKw1PQvBm=J~!PVG~=XCBe@pSQ~oF`BF%>1|*Z-1JEW@h~dPjePnL0N3ctkqg1ze zs|Z;>hUl-24(IGYLkF88CQ!O-y}BsR^=SZ%a!$hDji|1K1|*wLpd7xFkp2+Xse9Is zoaU)Vg%5nzse_egK#kVt_6M~jL6nSF${+P9-_^)2IEyEYPvxT`?5D05gbUAF3)9}I zjJ#Ldz2cQ9F6wemV5==5kC_?LTDU zR<5%k*qit878%nh;O#AV;OZ_Aq0AWRDQ213{C9_)GiK&|tOOG`cgj1>!cCeoXt&Rl z(~w`uJ@X|EbZaF`*G)SGj`G=aR0Eoq)o^Y z=iE?YgZM~Yp44SIMfzbx=Z4wd!o4-M%dl!TLz-tP@$|CR_?AoWcbbY_`t^r^u}tq( ziZxn0fZyB#r^}9$G6Hm8hEBN5 z&$=p=a_$`){!8to(T-k>V?Qai-~>v}gBE*i)k%aCpbfOw`>Lio7qe+MdOnjvF(pC1 z0`>m&ii%3sZ7YCjI2lD6dO@UajSU|jYPmlq1=QM?eIQR<0sYm|1p3mVxeP`rSiM^s ztoUo>T*wNzG((vG)r4fvqQS1vv@-37d4oY)EpE13B1h=@Unu zSEhv_5G@u7c}9w+9cPPE6Uf!HL#S}j`Z;2`@<@qwUW^}qj@lbmTv^xaz0|IJnxY$q z1IfR2M3%>(U3kajIp>_KCT~!mTGKD~-!*ymOt(BXsp#ZlIRLVnQ6!ioWdOP!u)?m< zUoykkVnvQl_&>bV8(HlPKEu3_nDUOD(rL;2k89TO6|gV@ zOyhJGgr6~3K>FZu&_Si>Iop3RhyhFG_#RKLTMrhW9PJ*=L=a*~UWx*@`T{#q+yq@t zCt@6ALpKsJF@UXws%|JU(B=)#6wP4biVvtw1u&YWl4o9n+JJ z{2Vf}bH$hqei{1qzyFOQb|J~nDND{E7P?L;5UqR0w@QPT2R+S(1qq>*Jtod`6plK@ zO{)=POr{E@>_Px>-06|x56jrU~hs@j^=rdtNJtGx#^y0KR*kH z+0w44{c0N5`Rjwo^$4i+JEchp&Vg-6jlya1!r-P+A+(bR^ABh`cJ#kGkoZdW6f6v} z90c=lrKm+n&lI>ZfV>h8&L?GfHZG)?Ct^I@9MWOT3n-q$BTRmOsks==tz!OeUEUuZ zs%Z1wuch^cI$THzmv?<*ob8fKa{3uT;EY|EAw-{JlL&W$DrSX=z%f0RMu6p&*!onZ zbn;}l4w25>A_Ko6@dpfmnAL16UYrN-WlcN)_au@`wjLTvMGwjqdAyyADFBrZf)_nt z-GY=#g~!E^8GBxAQ7YIBEJdlAq7)f;R;=Kh_ymQYW_|-q?)a5L5j736-y=A!e zN6X}l$jJr|>DL!#^+CfFngAVjP;?#KrgB=d;9l3%lmZd3)lIwpx}c&-0DqTelutxQ zwgR5|=&-=877I(DG(bcr47ID&q+RF$9WlA&37hb?8u;!QmV9U|MtF*;QeM=!jS(xHKZ31=v^u za-3RscA1jp*h0Eo&va4f!uMr}Q?%==7b=`byw*fbOj*tq^?c{<2cM>~&+cH4&;kiC zW-5*9U01~kKx4$AzuDI#EM_>*wX$qj#|(<1cpoaechfXRpP!>TXKgrR5V~X}fU_*j zM&aiHC-m>)>rX|%^0GxkOT)u*;_7~s?RdwdtqfLMQWw3`rLsL|#W^0P*sy3EgdB}q zX?#5e_qeBc4X6x|bJJQc4q$w-`F>8MBdh!f!^K|V?p;3gH%d! zm|Ob6t?P14VsAeuPG(Hjy3c@E27;-_U`PUhL4L`4FlXB}5T3>SIPPz}w@@Sbzs(LR z>P-o_xI>GYDi~;$PqB6?> zjhz}pfHP<@2+hVZ%AiaSZB{QiTZ3HHqR-=wK`@BbzhjKWa{bpS(^Rz0uAvK)LPL_p zeNWFztS_asQ%)MqFl!bC6EAFX!5BkhK-puBtPY30rhy^?URFsqZn*Gg#VP8V{o{lWg2YmtjnW}F5mJt&4 zchF?FimKk(v5WKu_*te<+HM+U^+9s=o!H*1L{|cvYj)9 z(Z&$NqJ#Knf4T9}x#g&j+Z#$u;}Y047tzP1_T8im*(+LAIsT*=TmRB8gKrY=##t9P!(=Xf-ShFPN)u zE9Qr)i5|-4r;bj53ool3HgQZFxRrSUJ4O>>T|;<(Ievb!6QMC}1rRdu6fijJiP-WsJ_d5zp6rMWxy4-Qcgq=}Bq-9&OK9Si}TkE>;r)Vy5M1 zi&z24ZvY`}3oHrO5c1pxMjP|TZ^N|SIYU0wGuxkbp!tS(On^OF7@-}p8HcK3O_Br& zuSSJL{|-N7r$mP#-Tq~I=gX=%LnoZ)Q>7Vp;|7`s;dlYwL)9B*?5Z-poC;;CDnSfN z$R+9SiCxMBPg5sKTtv6%jT&;8nToXyA08_^{a60-1qAlerT?01qB!ppH_y|5iU zy=*7nFGbHv3JK4ld?(r`^A+h=ou7#Tdzrz7!{}ChjlWs8qqz4HHhC??`NSXg_*}YL zJkFxdvuAR(O`wg6WZv-x&_K@C2NLw zahZ_A)GiTi_kuKsb95b$%d{#1|8j|ZL-3evbAr@4W~B>RgUAYIx&J0CNW59jeyPy| zU7R=3{7~DO>^8@4jcMXsVFVUJu%6&wMb0#rt%LO^D! z&w;mZW?rshI9qDTZTn}mQV?^CQMie_LiOo-c$kI=Q-)UcSzdUA7r>N)w{9r4e7IwA zK+jCF69d+~-;2;Sz%_7A5kD7LLv$$*W&{CqT6{jtc)S&%IUGQrDs>KbL$(Y6rl3%V z?A9oJiZKdVpN5Jj1*T8sWOdJ8c2G7qyvHiH0O>Ur_rx-IjNM#~PaW&EbebQ3Mc!2M zO~c0LMe|U)mp_bOw?6xdwT+{zib^qw#^{+ol&C6C#+t*H&9gU&NB5KHz~x63Oag6)X#DPONzLa`Fn zpUHnVIINeKX~KwM3;GilHNl;#^;OIuqk)N@r%Eb8r!8RNu9iaP=D#`!MNUpAnMuQH zH6UJF%aa_NY0F~PJ(&x>TQumavK|MsMIRXl^PyJ`3~Vkk5~>JQhHsX#lA$ zt}xu7n4Wiv+U?lP-62%agHCHe=fzMw%Th7TP8Tf>f67Wmm#v*aT$P7)jEbn!1N9&k zOyruIWGYUw>Xakx$fOd}1^rKy!)t7eNspI2Df;6#p+D`h_u=26@b-zQety+0Hi766 za4lDaHO=XyIA%1{Qi}mlgFEMGZn)zj<6fb9sO`Kxq;U+rPGOFsTpmhn>=tkN8nGdI z#z*6rq2@tWT#$J5YR!r1#t#+|cHHfBGRp^4qpfoxBMyOy#!$+r{marP;6qM<4D%2G zL+L}iTHLOLj49~>cB_e0Xyn^X+kIA31BzV}f`W+Pf5a*QTnRBYG3cm=}%F0OW4S{Pco4Pd8CpJ zqEjJ5wx3l#+Yj5U(lka9k`A&9Oe{AyS1K<=UXUq=S^H8cTX#p#f!rt#wy^U_zkZ_F z%E5yq5iD=B5tj$dMx&lQh`|`u8a?PpiAJYI1yrj3lpwAE+N-qANX1l`@-! zXLsuCj^*)ZUy5XaCc#y05b^)i9t%Bf5vZ(omkqzH7V+|!@sln-B)ydiklUUbo(Q7X z^Gp^D+(s0}W|Hr$rH>91u#x$m-xeL4zlsV;<{85uM2IBBnvaV>kmZEmF2I})1Sat> zs3xE+9UDRBdneYkp;c~A${>!g7~M`lHo;S@a5?$=EOW-;oG2cC&a%eZaAG%P;ukpS zQX~`bzf9;rB*VRSuAkzfRMY;dp7qAoy)r25F^vrQ5k)1d7WK*zqtL8}Wdu@OwqykG zKWm!iX$GxF>)3z+ToLqVuu^5LwXj`hS~-j?M(@2kbH>0>}j$ z$bq7*1)NF={gI~ z4|1XW*k4OH-|438ga4Mn0Za0WhWD8GLcs|D3U?ZLxdytN+!^yirL~Vgjtu{iE>L>B zsthI5R}EQbIAnc}0Cb9ky?pIT|%?oxp1uHT7eN95X(N!N< z>go??-qBS&1&;!wD?a}{^TJen?M%l1{|=3Gbm8BP(nrStF>wYsghQ_MiTKXH3-uLY2Hc}ut zCM?yObJc2f*lC&QG*7mhrFhKHT%@KvB&r_c(~hCjp1{+dfL9^ERN<{vU2dt)PN`}# z^pkdSC_gb)4Z5CD!bQ)I9TrQpy?@i7NrlF6fQ-7Mzg!rTEzCL~nQTL0>1ytyHF^;| zYXj@lSto@^NHb~{W;J1s5cKItjWV|@P#Q1qL3G%zeOROy@A{idJXX&7%sAW4cHJG$ z_gz9ntRWocr?}qqunr1?VJrZK)Nn?0RQOx;OjWwPts0w~6Kn8U>AMi*QfsoL582x3 z%&8qSj#f{YfB!~jI% z5*@wpY=pB`8>s#ty#!=()vj@CYWKXYt)yaq|JeE#jk@WtgDS&Z&2tkA(c z4BPn4s(QgB+xQVpanTcM5&0gfP|V^ zMaiVQv_G!Z#9>jnn3pc-rINuVP$KWH0^MhkBA6m%N-6JkpHLuygh@p>&+Q$PtNRX1 zvF;F$aM+usnJ8is25O0KdlqkPZfLeH(dwZe(hqFJZ4K!Wcv=@-URJ$}c6|B2{y5nI zpR8sJxi`+F0`%^1y^gO1D2Qm&!XQGj(UyT;NFhG`2$h*o$Er;yWi=PxwnupnZ+32x zA$EJIQCl~8341rvkCfC|IZw{yZI?vY!RY&@Z75B9YNpp2KYyM?x+43tOB_+e2a4Rk zxGS5aB~aiGSGx;|5!0wRyOgV`qcG4oq@`jvKL`KTXuiE)Fy^}d_WE$x7g=YC4qUb6 zSSo*OS%du%3+DXgRl`h&DQOrb{8EdO7AmGR|VWZR6H)F>i`@N~Ul`aPi zI%4J`A2=BWM}ih*#!F4pZEeUJ4p z%+AhErjSCf6!Aa27i&9#x3dAX2yHEePX z&GE$j${V+$iuwlbaD-9WGwv%FhfDeB6u9e;3eCtCbJBygN!r5J^DEa1d>>d!>m&n$ zX=c}Y41C^K*iFx-F7Afhc5qw+?&@ElTR5bxtJmsx<|-bh4hcG7?dR?@-eq%_DP&SoZWWzZ5^7nwWzGE zX4EG|%jhMHv09cx#Q*}0xsKolx_k!Ex8)dab1J>z;5KmPQ7-0kAP;2+^1Q@~%QKLQ zQxpIdvI>HQXpF9QITydDyYMZx)u@^FI*)C22=8?(jo}ro4afpMvh32F@9jz|exHWzh-1mSFywG9A4fkl2*}nItuqsw zHyQ}ki%z-gpJ}EBrSf5BESknYLI)WrK7)YI{0;M!JYzDt$Lgf{BW4qxwLYjnc`Q4%Lk#g~LHS z{M$(~ITcLzl$+!)j(+lBiAj4Wxbqa0eTG3In1ebogzM@KHvg;y!u54?5Ux8|nLj|+1Z(nWq|KZ5^Kbq-Tr#;1|liB%xI5G(BvIeIR*^cqWs9)qdcAh8Tb`emF9po*#~^5laIo(*iDpYu+Rs zhD9)YMMDFsGOk&0zIp7A8nhEFqz=_|Egr>hKG`)*r)olsfK!8%p=qmd@O%%>Bftc= zAw)Q#1ef<_%W(JPKu116mJNNZ*{j}i1v`eo8R29VXP3}lZ|ZG_HT>gtm5w7gKi{C! z00ocJO|A>xsS%Ey+{v-<4L`)Q3%~h}%3^;gs(jZZeiuTBa4z#yuJQk1WIRCI4}KwJ zV=t^l#-4Y$vG)uoWd8xks-%7ZGM-D@FlB5tWyaJFN0*``n3f_&iZ)IQL0qwE6J9YG zby$}ny9foW%g|ND+SH^Ud@LdWmFBvS&8EJzKS{d4)FzC-e)|6&**?H5}b|6EPAw@>W? zpf~Nkm@g4SsR?42%za}43@)xbGI#V^r5bwbV>8M|+asRr?@Gw^|2_R7oPXrvBKP>Pd1MD@5a zq}C221t{Z9fhM_oo~|AmGu(?p$M&L3xp3h@;BB_j^up0f)$^auDw4HHaxdM)ktaiG zN`=%kU+@Lt@wXj^RsT4~8NsTepayEA_cRWtR6zMS6r|p06;nDnp&4@#bd|0M^oQZL zhT&Ioh=$^Ea#Iml_rRebEVNm|K!?V|?f!k%?_zXnI@b2r<1JK@00_vFyvfosNyC7F zk!Yg9zy~yB+-ypu;wxLEDTQ!MhF%c#J~;1LWp^Y8F4qtBKOCd-ZZpcPgPi{g4MyKE zVVN2DQ;-gYb*X?yJu;)28I<(1l)SeQhwY--`OAEfdvZ8R#g8gbk@@v}wHfQif$o_D zU?VdNgJ};e-iMehIX%cDV4`JziHb`t6J{+GPE4^rL|`Lp>%Ad3Kk9I+_|WR5BPSdm zaioB~(eJ6AK)=I|=u~Vm&Y3%$q_92<(tfDq{nQBeU80#_J;;^>Ei2MDt!Qv=0x-pl zPb!M^jA{8QEPxdSAFB#cho#zA$3jz)LX7jOq(wALD}he6f-x13gqCQ!{o@fTltnQx z(JJ)aQ`tqGV}_!r3`=N;xDbn?9dyYO-!zgVEuuYWhLvgPa>>b5Eg5skL(~>bNSuaI zw<=Q#WST4Pf@2cz_?xsuy%IHM_7Tw(XU3D>;`g-@XDc~3*evWXy&0@ueAcJ?pbcH> z&ZwnMY8NdNa7+>J)7HCnM{B97LfpJ8W(DBHd&XA zZKi3ZvQWRShE>*4=)ti@`5acWf*`p{2AbDxo>&MIJ-zj_Ca%7?BB7iQGh&b!Q0>6t zxBPHKxn`5FQZty?%%5X-cGfUC_ArSx5aZO`EKAvF93WexDQQrOwR;yZk@Se%D|V0{ zrEQO)s1d%h)}1Y~-2pIDmbBG-K|uvPc%#d~ozZ+nkaA`WK#b&~VUm{ZRHIOoS&d0+ zl^wR$uuicB#p;9sjhiSZLVUpqZ}Yfbw(diTNUW+cyu{<#h7nEc)apB6H4gbwE=n_c zl|4nJNsNV2&Wz?U;*6b0P>#LVsN@`|p@uwNn-{V^jMZytgG|pK4(d&IhJiakR-8a- zHgpxq4hat}x;o+);+Vyoo^fYpmz*zeXW&ZRX<3_!#vU~2NX`WEjHk!0TUz5?>&Hfn zpQRSit&LtUFO+PNB*M5LQy&GEX(bM@G#ZP{<;AI`c|$pl*-Psp&Mhjmv${T^ z=<>x~P&PDvOO}y{!nT4wwGb94n-Tff-s6+i$M`eFq-BAz{0NPp5Voz$4B%`#V3|N| zJLL>wkW5HL6bD%sa0u!6tla-Y%b(%kWiK+xDzzG!3Nf}>TB~7iai15HJ6V@fXJlkI zO-?KHC52g{jxsH-w`3m8hhLequ}mY_Kw57@CpPe~!*bO-4SFeGqfPq$jZApiUt)q` ziVgi@XKYcTuCuAJv!(M|(R4{#-)=IV+Xh3EP$St%&(Mwp6q4%m3nniP9^{YZPnK!;vH4TBXR2z&<&;zWPxXz(v2J>Sb*}=>GC)ww ze03pw$CZ-i4I7Bb_Xo$oK;;f(iXO!7j)?0HA;RND{fJ$1?T=VvZ*6|fiiVE~MJA}e zs_qrtun*ZB`2v-EzUrNpQpC6obTGD{XaJD(vom= zz$RC<}j32pbWTFW{RF1MRNKFacaza%zOqMC7O8M*~=b%&`FEyfp-Jd@9AyLH;Mt<|rQsXGcF2kKBUD|%3h{{O#tSl@rrlzsM;H|qs zm5x*vP_OmsDF?p4ZlCfXT%z+08q-v$``e9UcZ8>sU*(AMZ>P@Eyuz@vdRjy(&l}Bh zhN#XCofXJQWGE3#oo%ws8Qxw@VebO$y8j@|*-%}Zgxet&lvPNb`j|_R_3&}%VuZZ! zRBYix&aPaaFR@Lc5FUKEFp*~gx{kyS`&*32WfXFbf*i@SND%UNQL69Ij$(hcE#1HuZ*}7oa>fYlE}6aK?nKDAGK!#l z^!J_B7Q!eIbZ}tm6m8G%8JI8c*+4Rr7En4PA9vK=oPIhVD8$r0e%%>z!)Yg2gm;R? z&d`zJLpQ$3Mt;T7S6=2zsS5`KcKSM!l3Li4KX#o(D7b|eGHfXSk)tOifw@9+ch{nA@fR%})>((4>(-qn z1^js@@60Au&?kw~luZ=#^;4h^E)4VOL-}E5;r)-!;wy>e{b%2Y%u1MZh`#k?EJ5~T zI*k9E{)?F^vV`snRGYn6CUedIq!$!&lB0xLhw2Ji%uMY7OLGe5AiFuhgBMLzh!$Ol z?HF)ugdl8y!__ljiLg>+soy9fWd-3WPI2jI<2j)eFh?#+`ZQiGEWR?yqgvOkj6U8) zu7Ahi>~^__Vl%)uGu_L0)Ekm`Pvp^-OiNvo3~HL3RM&4y(xjbz{pZhT6(<&$Z)a5F z1G>eI4No`BQt&zL>or-LaVL>~!{-pxKRJHwZOkoS(R>Y*_jbiKA=0op0r;WSFj#;p z`^vz60WE=#G=o$G8IqMM#*Y5sdGTJ4nMkC3gP!C|0bUTw&O`qx3jF)gV)$;nPfky`^(V+8l`E(n z9ch7H1vuhc+d`tv=k`#iAyjKs$v|kDK!8*LPFrZn+p(5GFb3M#gB>_XJi|`djixdo z@+_=gAv5zAd13{Jd&vd#pXUR z_*Bu6be9>uNF=whL;5$`m;fN$P6*a1PJDbOh6O0!ei3ikWs2Tq2XeJr6oQ0K*WOy^zzU0*%t6Fki zo=cPqc>_~y!gf}wjZxX|TBC7lJcKnSJ*k8xFtl8$+|S8uLgro;5#d7pl9GA`)Z^fv zgRd!hNQ+Sb%u9QYlc^H!w+Q(*7#Vdnld}~E+Q~5b&7iWK|X$`qJYP`0j2S}Lzo(rq0)G+1gA=L0vS4q zhaCKq_U4if7^M^Efe0?V(+Du~^qHB3vASKw-pz6j^~306sr==GyR~I!LN)r!Q-=Y$ zNtrq6rVU$uXyvikzd2=e_S~3H0@fyKAA6%%ese}6?q#GT-84KJEXatbtnR!O4-M3b zh{cEwS)dS7W;>a0y`1Mr4?N)vlQh- z?Zj5G281~;jTbv>hud`sTgIuG1v8A&mxkK#CYsahT`rWb2_x-r=MkRC)it_J!Z6O? zYX59p;ZR?ENZ76vxS`?XPUHk!9QhbY2*>FR!qR`eRN0amHYq8Ep@+eU&B`t(^$r4D zhhXU)J9)Ti5V%yw%LJsd;aF24t|4?nm?RYD>?{A)t^DOSLFmk}3AvpkQiI?!K`Im> z1E9@iE{gw{@D=L;=Mk}wOOz~ z??HT45nD7(i+!+A@AO7%HD0)w5m0b9uJvRLe2dP>(X|4(`GKNE5@))P!_$riv(1v1 zuj5`05K)8?Ghih3$*lp=V3j)raU70L_rmw304}b9CZ6|L_1qcL9GNGNrg}~&0O|nA z(0@g5;EC>Z64DVc;6Y3k@T74wA>es_q%1ysh;TIr(@PnOJtJI+#~cb8(ZV$wg4B>0 zYj?bN3{zhVaX6iT_5D0aj$?L1pIb7A*rdcKWI4sRoo=;k5>IUGnFr1_1sso+*yN8 z^IGKBKfF|q1#IIWyN>COwF8RRJcr)yep#Cb%%1;M3sPsN!q)pf9v(iEDpsNN0bK2y zVsyc91778k2@}2?R1B(P3_mrd>UPz<{54k_I^Y%W5)uUt7Q6B`HOzubBJ+@29%8T! zcbpq|i#_z63gGtK-Sv-x3LjWBwX@9PXDXv$RIpi)BifRgjoY zO7JQ0qi1hLw^uWrDelzN4kl4NbG|;P0kPsUsxF57Hi>tcvw}v*%FdV90~!aXc!<0T z$nLM{j~2C69bh3^n@FX#J@;)e(1=zEW{Gim$6o!eQ+*uPU3~2p9{!VKJO0kkkU1H9=IU8LVUYWbV!Lp!#g*;4zJ+wM;d8nuiC|>vzMNU$37I1yJbXwbV`i@uWj}IjIP~{V1y77nMK|9GuY-&=rM=TsG6SyM1|H$S zNoj*N3ibCMO_lWTow&8Yc$NtiB1tpq#D}h~WoA|Wkd0^ygam@2Cm}H68tH<=@gxF% zUjJL@eAUJOrj2N2&>&3Lg|zV?%XM=_#^rXp={8qVqiI_rHb#KG_ew1bP_~_l0jJz% zNY5-y&rnR^k~EGuaQ@7i^{CQHB%Ww2%G5)E;ciA@er&2qc+S;QVh0BGJui>Z%xSMY zQlA|1(xz44<5zv1rTR2)Q~)@0H}HjPpIByRy}`Dx))DK@=Pex8`e0j)ImN_dv_OGa zaQYO(9k0U8&XAv4n9W@lK?A>J*#4X(IfvV)L}PW!4JMIgRwBz5KnB3 zcG#DR)&`L}yPyc%m$}R!IlHc^qVSA=@+&u64MfFU(bU#vT|P-;n{Vs^qY zZs(8Go7^-}-k;y6Ic%uJpYIJ3Pi^j-TIrWap}W$QDR|Ek%+|D5zEMhV&WtAEa>WEO zbK%qNOh2E|O{KMldiDT=H>}e$H4OOp)+Pm{j>`R4DAGP-8`wDR0>`)-;{Zj_I`9Rl zF<$DD(D_*4xNnHra!!B9qpA!Q2>&Kc1jn6A**Q~SFW|Z=$aqO1B}5B_gX-ri+qQ+! z^w6%~v2Qw)Y0aV1R?8(31*;Jn_Em{{Q{(X@&7m>!(-bVXDi4eb&YZ&J1wUpKyhREo zX%rP$6hi0YFUZ?|c=aZ^cHbwACo>z1@yUGGF-|6@ z%gjj-<@BN0i{E4c{oEgmhz3a#X2bL9!kl`t-j(jXSAEuIYl=Su) z3r8s;GOt7)!S#rFQ1#&Ce7)&ikQ6Je+{i%6t zr5L7KDkH;AQ|3@h=1$xDwuX9QVc}(EIAa}OO(-cDJa1x-7&SD68ch1VN(pVKA~p5S z2tYV7JM0ciYPM+s*v-V| zk$%o6w}-nrEj=np3{=8Y23%7Q%+jFpS#n+pzo*n;9#`1qGQHOy6%0-(a;KEOb8X=j zg2@*9oyV_9y6a|T1dd)WX@PyDMXB~o;DE&q#*X(0GisBB0oPy)pwk{24=)9hekHa> zE1u%G9HvwCUYHLbY)xa*=GeE9)+_~JB*oqU8zcs(0T#r5&gm_VrcI~ zAb^@IXd_9+5cmW(krE@O=+5AZNCmQEuaiKq5-Ly{=z6hIeT=s_!M)iC{Vnp*NobzNqPUWeg7nf)lB=xw^P>!h_XDhfn%!hG z@+<-G4l4UaJ9<`eJC)Ip;*3_&!)c&da$Ik6M%^dtP@=~pu4p(`JH2w*gn1lk+LnQB zw(Sg9F#?UGepJyzeY;$xS7b!6j1VBtxkG6>V6F@OHmg;14yO~5ux!JHE@6yC0OQ-I z;(d&g((j49wW2t4z}rCI3V_trcRijd7(l;y_J$B-eZ->|t?`8r7wh$Ab`pWU7R~lPV07Up_tl_ZAOAFiRw`+l43f&Xm&c5a&@)!HFmb{Oa_K%wlO^z z=#bN=U8#_az4p2Ysa6oE;-o!7tu>cb>v7c!HXS@fi0H-gH}PPjW&P031WN_>9>H#MH5RC|I+U^3U;g3r#j zb<&T&f}~=QWeYM=ZU80!=%+n#G7j$GbpAqQT-<% zdZCJ2a;}|hTop)TbNR=JrUE7=9+>QyNi}GejgN5C~!i zTdwnv8Y6mnc)Hw0{5(=|U{ZX|<=sE~q~T0(e8%$7;3NY;_KYK-&nItJtB!sd>j0XL zL^^XDQauuqQY(C_Y_A&6sPx>TOLoXp0i z=BftM82iwQ;!yF{kTyLrm-3mQmrXN?u*R*9qpjhfAl%U9$px#}Cmorg~+%LWpP6L-!vPW~{n>j@07QEq>L zt3Q6QV1^sth(Vr8k2m{bx-FRGBtFR1nK)*3&mYASsacnMrV9e^m+M9xvuJVOIM>LA z40iB142FM36;0eur8DysRB{>byWJsRi{45F`Bj3{n}WG{%usX(4i8-=f3cijQqJTe zMQM-IJ^p&y$6sUl52PW8P6S?F@~Fb;-_n$k8nB)vL>2@M>fb_?v2t>OtNdxL67t1; z9^9$>M+(#NYx7OEC&Q#LQ!!$A8u~~V9|TGlU>C!UpKXBczvZ}RxY{e#^|@b(PAt#N znGT1de$jgtcUF8RVK%OUYUQC&3T@-u zXkN{wNi}N~h1ppv1B?@xucjI*MoWKqUv=%J^AzcD$E1!c3SD)-3+LHq>yJ$#GkU`E z&Z!&4dqH@sL&|nf*w`A(0R_9?}ov-*TJn>5<{3u)-%|B=~1>;H*ic&GbMA9 zJGbzz79E7KIp9WYamV3Dbw>}tmtNpD9uDZmOQ$aEgc6&T?S^yNBt7V80K$>b&De&n z`;yiRgD05Ynvr(* z4jrf_DZ>8gWhn3=_CGztdf8BrFX!$`o&~arX4jK8ke!Nr#T9$eM1EkPX`4}cUnTT$ z0fQ4b(u52WhH$L4V|G=)W>*66k`_;_LBT4-hgfMeZGAd03@I=h_X0 zA&(o|DdSadkv}@@FoI`%*1?yk^10_0s&Q!SrI5OTl;iG1xRn&0$maS{x4vltCon$R zm51d)mnt;Lop>gg(5F!{$$P!+&2lvN5N%gUp&i8}Q%|y}9Yqs!aK7B1TviehzA+!h zgZ=U|X3@=EOSk+)K?I#Ji~H?^8SWxj6zmPq3eM;4V9FVspaCnFF~*LgE)Zt z4}=l*@d^=*2n`Tc6f*x%tjn2rN_H}s!^-=WN}l1I6b|uJ0&!j}n$3e2Q(7Rf`ES%~ z(4xGOwbY+YNN%9-pSTvhddQB|)@>F)w@AJH)F2KC=)mXwHsKq7Gh06BHFW*6;OQT2z7~}-K&%opB8}tumbqm?YTU%T{(p*I z!_wCtR_NU&$KH;W2D%WFI+Hx(99`;c2TUNH?IJ6llT1fvADBm$)eH+q z;6y!c`kB2WX&rO+P6A>28{_}J8Awpt$~s2Uyc99$i$}5PwgRi`+LifjRUKAY73USS$S9Xx6kaZeV76$a9y?kUVHSbVzIeLjTMvLG-1C=Dr7#24E7DM zn?B0c;($sqVzIipX?ft1==W_B|h?EOGR6ELF`7+`9o<hq!NS^1(3pL3OcT*x4C@Ax;35(V?z!0ng|)!`6cmV{v)=# z1`26ZD`T830ZJIvHa8?|wPvu&{PWB{tEdR!u4bwz@URmMke*y)N>BbS46j;#%|Wfc zTwZY8E)`)roDCqUu?H88L0!s`;xq#>Enps734UJ#KtB z5AOXKAfXk48qx1)zmZKGowYQAk}nBD5%YO8&0^_ zffhrCs}QTECM_Gp6cbi`p{cMCxmbYxe70G;cxcQ@E|gv_5C1HXH4&V`5s;oXv=nLt ztQ0+yJ1vL8uFcVJZ7wV#;T?gKF}I#B!kcX2_NyC&+42NE|9I^?hh6mIsU^iGFUCcjr08Pufv#E2zb=l&4vpazSURUexr?qR(a)C}>o0W3^(b_JDAdug1U9j5`h8#_| zM*7gV^t4swlB$j_Ukc}J$2I#a+RJmlI~-pYob|Wk;lT`*i!98-#D0HOWEk@d+G-K# z&sa7)sNi{_rH{>@E&3~rZ76ola>>x_DFvw|KDIxGd|9~3RxGn37*bD05Q_rS!Wb?j zEl4h_JSG_dC!`f!-4qop62Bw_T@+PSc10qrF5!qhl;p(`uEBFERcvs&$W1|p%!c2E)WvY6WV5`}>2FBuoRimVjF+78K&jP(%K%$$zKMW|;1eYtI z|AL(M;b+qs#pdC*dKay$j7e8Z605>RhgUKhQ4yY&J(jYq9l%P4?&8X7A;1p7dl9cI zfD>*QPS}QYcgHE!heS6!hdfH`IqPZy(=%H|@F259_H32h*JV>8^UuwY!gH3pkwCVS zk3cApGkvO4aCHDM66O1wEf8jS4vC{)&Dln~r~*o;U>}v3o{>Ee$?jvz!dOt4pdu{Idmco= zAZR5lXL8u-c$SKHezm`kMe;wDX$aE!F7@HKaaFXsP9~G^yQ1EADn~qP@@^z`GAn`n zJgH;tK!@bwTWYdMLi3q`7+dM@IHAi1stK>h`*-N)25q_8)$g6!SO%*dej^@MpVVt(W9daw-RC%}dOckM|7raQ8D4jDtt(d^Y<%hSls%oiex43H9tw>6 zIr}`y+hZli`xJM`d5y%vRmD*micJ7lpRLQ7H-zsq7^{8j8z3%bCl4l}7V_lg5h!+8 z&dnTs%-;zf&gK>=AaQ%s^ElE2Fr8DT*^AxSQ~(sEnj8&;S-}l3Ez%K3z0q|_E)<2+ z9|WmkA2R$)wVD|4x%4BQIUV@J?d#cLmn)!;aJmz|hgS;n2S0w!BRR(#Z4!~L@M+Ue zhN(|7x=%y6SHIwyZqP1$#~D=Ug-?6CjQ)ie_0Dg?&1K_W#QA_XHxq|2EEmP1!tivv)Vbr~J4GrFWcoVAi zujb+D4!rb!a|CE`L7KO-7XY#6Moa(g0aiR~?82`n6@-n%wbzYPdx8_iAF@VD72mX^ zjf9|L?V|X!Y5AS4g!v=%xgGgss$zClRv25SiNpoF@JZl*Ne5(x)~|(!4)`rVe<|CU#j`uo#tY&=Uc8tZh;-3b4gq5n%=MAJkR^j2+masL`e~+UXVYbkB+U()Ok2aX zbKI50Od5xKdwWvncXvJtJ|V&#=%(@(Tnb+FCR;3h9|XUMQ9-4FTVvZ+LF0FiV)s;m zH2?ehUaIO)N^=ZoN?rNrVS)sFyTu0=ggB$d=+cK?(N;d@(jnxD@V$_wA+lu)=M@Sx ziCRVv_GGy|YMO3F)GwP6NbV%MeT4#@53B@2d9=C;iAn=XF^ePx1+Kwmy=6^5Zwo5OU z20oJZ%&a$ytEg|JKU_VKdv9J&F~%RlA;B6%W6&$vXVCP?kjW>B%k4hOjH69ZnFYyi zq55n{K=qPp3cu3H;@0%h6(s&LRiEJ5W&)r{DsvhWh3-EwTlei@9WAe03kY&?JZIl@ ztYg$EC7y9b;bC@+W!}?_aL)Oe5lTDUb2m$zdRXBsV-m~=;RK-eW}jHWoL+kV5#?>k zJ<>9fI?m5ph$Q7H_99z(7CfBV{7}5M!)2Ly@zg;#E#ox@mR%PNAnSt+dpSRSnh$M= zWMAP+s-kFEEx_4UacggS4rEu(l_|WlvmCnjHmxrD&UnrR_zvfH9ol{>d49@tN;Mi8 zx3_jXkV#bT6Or2~{9Gn8+2m0>7IE7HT9csuFu`aZ>oX;5&v&KK5s?#Lzt!8T~w#o)A9Rr z_sP8tffsBR+Kp=OS}3Cr>4OFSs}9?G#>qi{3r^EFdx?p`W?iSOA)qo)=$xoNadk8# zNk4>$RT3DaexPx;b`b)EYE%8^l0V)iFeUhHq%w~@APOdeO1;GVh9%G$8_-b&K;j8& z52UVwMzBS=DFN`fIvKMda_KeQ(#q!nlNZJiX{Qg8-6kB8T)9m?U%y!4@7^RgotA;C z4|kl9$cdBE5G(XOu|7itkxiW47(&c~8IsOZ*)9{`cK=yK*crgCcyaiO&B_TKv<8Y$ zTWwhltCHbmnqhR-#W2jR7w!d`;m0^=z z$OkL{l~4i$+1x2rfX-QR-+xYXRn#0wwcUM(_60OAwk1dv4TZRNAk2)WPJ7PeHK+FXg$TP`V{R z=+PZ|xx2j3L9lM!xI#m0Z3TZovoyg`;g@(x(JeD4%s8^LD2r>+t{!*PA40aDg)k!G zs1oEXj9lM?`#SO}Cgqqabu8l+l+AY-N~Nk%xG~KYBM8LH-vh7XBQRJ0tq^Pp2M)5! z5RkjW6a@6t>ZRK-ZL(PF)D~J_CV4KXn8q zFkf=8jgi!8(xPo7PI)RSBc--<=8}09WDl4Dr5?Ot;^(qzyZ6iiT%4JFEwmI#&|$U2 z&<6#8fv`(AgzVbgeeB%+T$o^I!O{WzltHnN|7!gI_&6qtevWQUFJT%dLs~QZvuQna zJ`Z-F7d$`O-`i6AoBu*nNPHSeAVA$ku>=g(xp}R-EE0z`lI-k1W5}{`@Psz}z8(*z zHHABsfr-O&fq7&LlQC{!k{{y?AVabCiFzK3(1M4|XI0AcF1@(r= zF~OAjzqfRB!?HEBbRZU_n7Hp=hE-*J*lDrylk)my7_eTws;x7rMfUum`FZ}^$TZ$N=3qAu6IlB#`#^ zP6MuRI(q5c+7(0AApKz*MT!{m)u!<24Ejgw!fVn1*Gj+l7|OVVWALs=jVs4*IT)du zJQzXR=kP8GN1h55VZ$*l%X*xNMg9DICVx|2tl0eWmCRIxNT6>eC7M0);H=gf(5<=~ zG!KX(!TCt(dvl9MCWI@LJWdvcDM^N(V>58cjvhWt>o>c+MWFJ;{$*WZThfrV<$gdZ zy$6NO0@Zf!JIK6)#QTV6$46ZQ!Xu5Tw5NJY*!JS~cTyt9<}GS`#& z`ld%4XxcC5xnrEbB4Hfw#F(j=NMwd%3tbzDzA+Dwm|~&%&q47R!f{v1ziV+_5XxCl zmJ*8{|HcBx!?(oxmq=GyIpg%O(ryCD&q{zp=xq>Pw;x=-K|cN1LR7&i?6&o+SwqqE zvqB6UE`lwHN}ahD5|cXMsiZ{+F*XHb?%O|?L-+l>S&M0R*Qxu-axGUayuQ3IAMQAGR<}lpDb@S7U1Kr8VqF54XS{ zkl(KB#g!>OA}|%$=wI)tSb1?q5QjR%AXY_|=z)#w4ttET@jMBG2?B13htz&|$ojeK zaVg2L4}n<~2tP=7^)N|+B2ZohZ48))321K+{e$EFqVrdFLufo8?dPB-RVo_d5Njs8 zy%X_tuU5s+K(0EWJ$NZ#q|{`d-!iR2_1d}q^hG89Z^V3oa#WEPrhuP5XjnkK5P(LG z=R03%9lhJk*Dzp~wVMG|*XZ#Yww=zdG^r`X-6051n#k)*3)^DSp`^yWJg|y7WH81{ zBhO!6=)5Yd0SjwNWLlV-eWStK+X(p-|{nh_q=T;~&|#)yZ; z2sH+xHj{;^Q2}=Mx%ODPUKg2AR2=^z(4*r4p?4-mSj?p!aF$~dwK(x7+3Ksx2dN14 z#TjeXf``5^P#~)&1=EsCOO0?Z6nCGtB$IHes!O%*31GefJ(D@TjKN zC0l#7Yy8-r=ZbrGvbX8Dqy=+5pmO=xDjZ~_Pi32|=LJ$z$s@2(U^q>mzf`wNcU%?o zB0Xd*cLvz^q3y-8D2Ae)_Ih{zTPxILDK}p z*u~I;R1cEUioES9u-EoEaj2O1g}4)gW>Xzj#4GhDG$ECmAYBO$!MB z*_14Id6=sPcj;*2F8ElRMcTkBUCVRQ0vd!yusHe?y%`kk{FJz+< zwov2jYD`c8?ll8o>CFhskS2J!yb zpqErQRGw`+1zBV=(ksLtbg@^1+oZwPi!>O^Vv+H$Q}4~LI!G#_)EC(D!qsgqKY7z3 zdDA6Xn|AY9t+m<7BiU7**MXD`C*mSJc4#`RTuE!S-eQyDDxc?KCVh}+KH7X`<}_oz zc=y@CJfiA!34GANdYk)ck)_W<2M;T`i32SJHE7nVAz;WPJHds=|J~5_Z%@0*PbuyV zt0rei-BJMR8sVAlFa0V)JeJ6fMA!y*Exi2i4L)uHspSt91;wNk4*X6O!MV#p01fYl zU?=X=F%WXo?aai)uX5d)TQkbAI<@$1x)^@w*iB7*U_xH-%*3o;JunMOxMgXZX%$Z% zrUTzz&f;!J$J#i#4OunK8yu@jY`QgE8^IPyz)_dL1SPkingy>0$?j1bG7i7u8!_3x z^)P~6OdU;5FGnAzm9cqbxHN5?UGyb09%#!Oqyy4;(@dNsHpp0^HLQAhN_HA@(xDA& zbML+5gU-(B!54qx-j~WFb`HSa&ds1B-o(%A8bz{Q*XL@pgxwgZx9v6ZAFQLlsb8z- zwF++mtG$6uYO*_@W7C)qPEa;x%TkvP zIJJO0^M(j0w@%-C<0$DS>#OhGXdbs}&h%*MHC+=V$-_2xN$^fl_3F+{m22Q^8F9Ml zGg!5%SL3WSZo2t9@VNQcso80N3GOZ8RPsakWEMV!_tm_NW(Eo0z^_#PhA>!eu6zV9 zCavRddigV8Zt*QCVd`HL&_7oyv7MvRrYLIET9sF^KB@k8)%6#ZFiX!bw9dJtx95~H zcvjh)mt<2rii_{nY^=*=n9f~kQyd$6N{g@Smwahco(#VPq)k7o*_(dVs^0Tcy(E-h zSibKO+e`1<uXl8>H$8X=l0_3WU-0- zA^j@y@5T0}|BZHzzIK-0rA_{h*Qfjc2a@`$D^4yhMW#-?cIq!HVfw$QH~*&oVx>*F zbNAQ%UCZ|F+2W18e^W*IJiH_kMV5Q61iV_xv~9Kd+eS`}%)Y{w4ey_abn3 z!*+NRII?RyvI`v3>$Af#_d40U8aSd~BMHy)ZO8nLXYsjh_Q^Z<+ByB|op+ZuiwBP7 z|2F0LU-#;_+luM`8|Z}V{~tj23$(*JZ5rCscX{m$f%{fmCvT6`YA|388+ z3cvTPH~hcpc$Z!$pKkL1n;xF^+v&@@?7wuvF}*rJcvioe{;xwx-&^za90GWwIp}ep zScJEBc00qiflP5H^jHmZ6Q}+v+7T-L6W;_4S1)}*c0iVGdp1imn@jNVC?UD!@>>f9 zMf@J-ZR&YB>5_0~TcevqUi?T!kDp}kfg)Va@>_r!B*U?8UJ&uJGa`ZQ3~+icd8JBx zi{>J}KB%OLgfFFd%MK9o8rW?F$|^SlQL6u%+*iK`i$#CzA! z`CvC>i9QQtoj%#Q-u8Bwunwn91_dX!Pa!4d_1w?-V^iXdWIUs`Wi5h;aH*c-;S#bab*0(S_c!se5}6r>scbHi&CYwJmrdJfM@P$-^wbg%gma zFh`ecwlU>+y+^}X2)?eezBV{b!u4x%*L6!nP2*3#4sQh1$Gd}B7WxkI!V9`S) zEkD!mNO-Lze%mr}pxA}k-f3n5|LrscGKAkB-0l#PCEe{tg4eJ2?1x20Nd@}r9dqI< zHLl?j063#U2tX8(RS8O2wiMs52 z!*t$(s0$A!2@jW>T~}`ecBCf}<|!H~mRRGHK@lkEg~-eT@kP?5U9B>aa#gKb_;%*C zo`6F(|LnGl?*bl?DVR9u;jJyJ1TD!GI~$kjuSbiREDBPii2RXeXsv85zYw*u(n5>X z(t^t=pzY~8SYU0vS#53bd;p9%P3{u4_!L+aAFQH|&m~U`*?EdfL zpVwU(YZZovX=0Uc!%s<>`;O@r~JW zY^G`}R@lT(*+TzM{R-lfUIdt8Rt%yG zv07l>Wg4#vIIoKA+=?hXW<-dJSi&+ZB$8YGVK^YQMrnqSN@E1QVKA|P&W>%V_e$)| zl!p8QoCuWJigNJh*|@B#I=EikCNEmq{sff6M)R24;1R#OX2!0B6{}+^f<|5a@I2qp zub7wyQI<2JZXC9u#Ps08L$Yc+mcu~>`;b>O)lK|JlIa2rgpV(V_LWL&eaYr7({ueY zbGRR12&TqnTcY+$(6nl{*X}dfU)6`~k)7}UdB1u;MIH-`J`>zs*a>{VN)2}*>$jXW zFfwIXjgO~;{S0KK4`KcW!f_Skg?{(p!z3ArSTw3}ISou&7$j^J11N~#MTX%_boY2- zBwK=vWDd#kqTloB?GT(cmK z4u>EN4gnY@f$R=J82&YasLEc67t3NL!j4t@?NP&4Y%3{F>Kv<| zNH%=`KLfPVRL}aWQ9uDPp3ImUT#O9U1_glCEJ52W+EsTTVpm+k3d@WfWOm#M>Fp(! z8yxKB=LQlYuh(ogKS#(ifs9(W^T~OzanXH@ER>i{lIxEh$irTs5kbqAJ)C^+&dz_A ztnh@IPv8~cg(H3~*gdmTO6mL9OTYu&%AB6ILIcH*{##S2sSgg^+J*YjZ)y7bFeCO!mlTaf0YwvgUg^R$gLQUsS3qCaSftv$wD{ zFN=yX;hJ7#0;Uv6Iy83lG@D|5(aX)yXF?Q74Y?JJzfZMOYjvXu*t=U03IJ( z-UXQG#KRy0;FhTcLYO~2Q77WQjyU>^F>2u_zXmCLtexk3CiU;{Bel@E7gPCe8%bxuhF(!fP5c{mx=u2iz z>ahM><2e^Vl*EF79$&Rg4zQu!A!h{}4FWVPf!X90xp}?uGN~{-(5kDu zc!vqObP(X6@MR0BF-IhIQAV&Xq*`8e7HMQq;_zVRx)>;hw&Gye0Ifbepjz+P9DIIK zft}HAWim!3XQB$Nxg2;Y?7C=$Ieji3OCuFdIT9UPkrb;M6|0J^NnT}V*M24eB#u@* zxaImw!{j>CXgqb0P)$$d+=!VXRZYJXYOy2KZcRW$cCem~nPLIKY;YxSfQ4QUi-|t{ zTkXouw3uoz#+E(CMr)E4dmUZ5iP>PhfdI2!g1nv@YBM=+UeWmE#aZ|v!#jP;^$0Jy z-EwQkeM_dDh04z4oE1sP?4|%#$;B+FSss8AYF^!MYo*YBe*R}! zHfex1OUNBPeNXpOkF|}LAaf?jzNnm%ia~-Uu$nV~6YR~@fY1Tvy24Te3FHC}BsS0& zQyT&Y7z?R-Jo8jX{iPXq(v1k9C{zSFSa_xd$7ux%q~wik;*5eu za??p-BUN}o3;2*moU*h~gI&>vyTfR69+e-K@6~r#q~Yp3+P0Fp#TM4Q2vV?dWU56v zwN+MAuX5vxVSxjRzXpRtL=Y96B$LC2)wC$$njx#+EGLElO4+ko)iz(tdA+;3znQYt znl8$Hy3Tzydfd!_j3jskZ9BakDw?NnKa+l?>Mcm7SB*KEWhYvCRE$33tOj(rphOze9&5s5a!n8;9kQ?Hsi9+ran4558yp0d640(zrNyt@rvZo*dDOCr%F)&@^=I6M^!__u&|1T+g5Z{!)hP@Pi~uOf+dtu*l-Rzjf1v*q)}L59CkLDHEg&wY&4tE z1}G$1G7M{+U7i4Ng%!Wau)(b$k(^uGBnRStu1oN-O*FbuD=?&(FdHtgg%ah5QN=kY zs-KVi2=7JKYc|>AUekAX1J&?pb2!1~?AQU8_ZFPgi_}FYS6qEcQ&yJLr;g?;i}99X zq842i`>fyQ_pA1(#wK1Vp%`e3oeQyP>MUPl1FHvM8mpI30L*^1ebvCL6T`9-SZ-+$ z;lu^CxU*feW{pQIyAg4c-DYcB0UR6I-c_Dl*P76G$^fI+?q3~e6l1OXCGTQB@IMJ`cPv^Vco~TfEaxLhp?)^f|md-B1C=2+SVQDu70={7<%oQTQAA4*_Tx3Or3xdC%r)UdEuKi`3s zivE=-4{z1N-)du@JUN2iPFbB(q8%>UL(CN0~43(tN?Cv-|U#_0g+ivhuT}`erY^}DEnlw0$Z-te$ z#6@8E?hK2pu@x~g-OS|as})5Kt^t!D-b){!D2WL2U~;uKUDn(w2A~p&)4E@Ps-oqw z3G`Df?lf&CP)?_^mWy1Wg-B(kCaB^jkQgeIjG1+N+`D$HAmMXr`{7Yy@`r+Zm{YNmzGq-Km+ zHo*lpY0IWTCXQf6!bzwbgZPzgZf6n)oJHW# z+Ev-DnNsYNEv{Z>U(TX-MsaW^Q@OCuG`gI?0rXikCRbAiKgjM%3E+mV9%N$tC??7Ou{2SWdRe^u3sy6-Ms4x^^yE$(v zOJTbkQ-qCby*v#QjN3r-`dp437)Kg|DF7;?kW~oZfIDv3b&Wy$#{fL46RXY?GoL1B zsjfNP_qW2%=E}fPd#^>E{j23{1*&|xf|IE~-tn28QdTWTHT*3Z%>DO>@=52`wyBN* zD-eK+16Hby;D!MVXM7IC+fbvtqb)3nf52gisS-OYZ9a!}oFfUa92yXfUdS_C+%^4u zdyc((z>uWlv!t2C`eCA8UsdyqQbr4V*=l{GIjA@=a|l|k`c}NKmi0pB!4?c_sBd(to|4@`jxdN%Q--mFJ~}@(#B3&HIs))PM2kEnM<5} zXIZFK;h&5a8T-VE5JNU7UtUT@n+#sC=4lhidC3UrKs$AeSlh&2GyRd}St+K;ZT>o2-7>!<3Lj zj7dMP>&2S(AUe31n(&o*TeG_6!c zmc&tHnmo{qsdEWP05$QbY7Jlum=y&nIv?9`dSuR)%3K4~Bd2UvJ^|nVn2NZ`(rrT& z%M**cZN=hkpmTIl7Pcs;mx<8aP9G-Z2T8iBk|$%ey+$Hfmj87`&d2s==W!rNE@nNP zC|cGk1qH!HvU&SaTZsF5cYr=-(S=kNMP}LwIqd7v3Xy_;$B_J?-yUPn9?S2_%wKjd z9HFARhF5HpEF1wj0rbb)+_L!io)P{4{S+K*hQLfJZvsRn}?%qERk8X z`ip~q#a%TJb7A-cHQTGov05@iVmvHGoLb0Mp-)`z!BKNAJ+N-YLVf8B&uLD$#9N??HgYvK*}ds4{A&JM{;Q(?-8d+&KT z$K$&=bb0sGugJ$dECSwj1v?~Q|?3=K5^VuK>gWxRx@LKnlb|TiSQNv*qa^4Y>UFb~F z?TXIVP{$Oi-M>C1?AJek%@lL65O=V-H-TYU6*A^LMC}xfu-&OjKPSJkvP!MCo6SzR zUYyBJ1=Km{b1we8p47u^lbrWDeHL@L8dFSR*(e>IqgpRYah{!x&ti!XdD3s_+3e}^ z?5k#bp;xTuUadJ^V`*2Yp*qc5CTMLf5@&V{^;-I&Jq%2v$b%+I15&^8z2xjSecJV5a@Q(SN~9G=}OHJftmtRlE4}`0~B_2@>eG|BE^YyyUa$f!;R&MG)GM)pohX%B{KbbBahUz zWh+k|c5dXK8dwP}d&#+)R7n=Kx(>&*o|-gefTY!3XgiJUG_fYB;L0$@z{~@sE?Be( z;2ta^vpgJ@sCNk>YnY|^BBYdATi?E6#o07dQ7v~?ju9y}Krc7n+kRVHv-zdLB1N`! zitU$={Qm;KKtR7F>$a|SzTFzEZWvcw>@)Doo>53S2itbc{6pJ6SEEADAF3E-gLz#|A60&fn!}{n)|ZQ}4zfB0f*m^wZJC8C=0ckW4YrG2n%+Pny0BHW>n{4rD!OV8 z8YsA0wTn5CuU2j3t5qlR)#@wLW9cU7lYC#h^R9M9cD{i8JuOny9w~F9kwI-W=#E&o z94JI+al_K(%}BK1xB`c5mT$s#07rOm2xc4J`fU@ntjPkNSEQK+z2VQX4(MldKk56U ze=)Mzqw{rs$_XhJKY~$ zX=cwd0n#`1Y`461cjHWJT%mL=qjBcqO{ub;QN^5hlqwq;Rm@pWsj`_-#he3`Dtszz z2OWRdO|^17Sh_2aJG_C~8phowbFj%PZ$E}flfUdv-|f~5%FydPAOF71abKPH=8J&* zU4|CEJzQS)*4cx_kg$@o;OXVpm3JIy3dH{3CjaW>-yZq5PyWFZAL|9{F+vOV7DL?) zFDJsjH8J+Bg7Ym@4z|oQMeoqJm9=gmtS9JOT|Y^hQHNlJUloXZ4?n8L1D(zOut&P; zD#_C~5vrmsX&hc%1#vTo<0#JOeu$&~m50w724t4^TG6nd;%g;4!eQJap*IgHto5{ic7p)ZSY2)nzAJZQx@3)6TQF!c0=6#hrPnZiVr zRW;=04PEnih=s^ak_2sd`$9;NE*4BG5U?WQ{1plH4NrK?cHq6dc>M~VQGpkr6Xj{$ zaZhpLJ1+)5$*#`fVF{vG_bE3L7|BXX?-4$QOPY z1p4edLVxD1%APYsfEi(J2-rT^j7{kkOFW zUhAgii_h^d0y3oOAb{0A6(`bdVHzsWMo;(3E4KCs-|m5*E=f9}P3GAv+Pf$ed9#fa z>Ec7vV*815N`4c_Z#EbNsTVK$c&*l`9I0^tM+*K)*6O$;#2_;5uL?pg1 z<|#H!$w{3Ut~QeQ=ETS!7IKs{=SFH(=b0^S^A7%ZN!F(ys6{QS6s#)6qE$tkY#r@Y z+NZZbtv`B_Rs@YSL(|HW$e{MD9joBh+r6+yR2ckMF*wZ;0@*}DYB1C7T7yCuB4Lj~ z8u8jUmg00%xMfPXFsU^vuhU*P83e7+@8S|iXkF3fpNCNz5CibO8x%%7YM%ipXW69F zVI0v^<2gZGXEi(BaDcWTplPPD-^YuAgiw50E{_w$`DtVSsQzmIW&P~jz~|$w3*%y2+4j*kY6U+f)589%Xpj1y?>kQ0UzF@DXkc+v_G8%apYf;0kg5D z@b4*P!;F9Q`t()f^r+F?KRG_XID4~y(cG(_H#XLsYo-ykj!%voyiOMJ(9qm_NrmJ2 zF-J>yEk(PsO*0vAK_;vat19H@vAla-1Yb1%eBu4g!!|M1LZLu!+hCQ{QBcw5aY4Pa z!1{v$9Akn|tYGf5yNOWz*?~jbXBbr(x=GemRFz{;jOSX0bXUqVO83JF$hbCTNx-xODZwIL@J2E!g1QBA7$S;oCVxAo#*{NgX=;`X~@srg^MyZdXs{A-c?IoLcr z{FVGY+%D6E!-IXAaB#>H4jY(IDVJH1%HiSR0VGvLQk5sIilkMZv?h|)c+$E^TIWd{ zB58vsZHlB#p0p*Bws_LENZRH}b&*u(NqZt`k0%1rCVWZ<`m*%Azbn5_BR z%{2ND^b>1Yh^4^N@>^*TgW0+C?yg#P?!4mSkJfKyFA%@b7h5D6(&~N6OP- zR>)jQYWStnBHx~4U1edj7Fi7Q+xOn+RV6`St|ZAq4wCKEv28Y~_*GpnP=YLFj|S|p zAO1W9)ec{ZVjs6RT;)5%roHU~>ogQG3-%9a8ILB=w)cbECeIiBr)97$;>0M>fn!RX zIcRl1@t%GN?%|d2r#F6gs7@wq2b%9`(`;>t4JCR(dL6aJUNV*YwUKSvUB=EC-A zt2cm60W4a4E=%V5Dm-&VX>8`6AZhSgG2PD1c_n)MLwB4h#Uw2U#{%89*N;-~GVs_N z%0Zj&3K1g3u5aV)?Bq-*g#K6AlxJs14vw(4i9MeuiZ}7c7>vpb$~}f*)asLf?30 zbI_}=PGi@5W*vAgezRlN!&l)YJrh81f+*j$%4Ef%7JvTS+bF=;p!r*7{#OLrYNs$B zWv7#cGjQOnR4t?yRRZ?{sH>E->Fc=Y+Zsn7X+ai&i)sm{c4ftT^9*bg@2qk9s=nWN z-8jDRV4I}Af6+Ko8bnNp#^JlWJ@`k>hF{H{^dj!fgON#}F(*nBUT|N}C3L4dO5mW} zgP=_eh_DYO5Yn}OPlk5u z0~?N|kt1I2wDS>9Cm-)A2jkl0XGo8uG$3gGlu}I-dt{Cy8sF!I35`*okQ#eEG7};+ z_@6WsO7OBgZ$^SM2CuyAg(;+I(}&*&trT2Q&4R%Ee%r&133{>!)I@PR?E760buSR% zOOz!`!$qAAnKir%s5qcrYaUCJ2i<;`EEN;)J{saI20M72dyg1!t!ukk&?BNJaMFY0 zy(I8scoXodgt$ZpQ=uZ%htMTqw<`d~7$oQ>02t7&%it>P_Zee3f|90&Vbx;uv=a^c z?PV!>-Yr4nDOCcWY0Z-JI1{#MIlg5s0?UGRyQqRQH%A!=+c=v5wsWK!hxN3Ix|za- zR6kB<<@8l3gGD4k6ky&3z!x*E9Svb0byAc#q42U?C7khvY|d+k?qM(N`Z35O-Qb7igssO2p~NDLS|OEQYWsq|B7d;Gbt*m{<({^a5Siowz#2@r$kUn0&CX&$ll!T-f|THht3 zjYyjhrykrGSCH=_at?)il`y*B4&yFAi2w+N_h^|asftbQI#II0@WxO`{b9GO?BXcP zLHf65p2w#!5&apD<7w1@W%L^%$`ukTrLtEa41#_;yz>rA6)6E})Q-G*yX}DsZWL4J zBzkiy^T-+?T4(iC08gVN3CWNbWF)3I-1WLmo~a$zgFS)H*4|!tyk=_B z^4nOWyK3MSR;K?B8|2^NlH3L0c#x&4*Ei*>#P}*qQ$nMtmB)>JnKztQ#G?{G;<6>yLnsVFsup;Xddo?i8vC=mZR$w4*n35#XeC@ z;~G}BBnSSj?i=5S`uFCR{=IQveD5!5n#ee|rRYtZ298z2Wp$F|jyt9U3mJjn#6sp4 zdR&R#JaOK1DkK(G|0fv!JaKi4b=mVH{F=spPQr?x*3``E=Qw_w5=q6O* zpQ4*4nmeZNsqwuu{Q#o_>(lqtCmK-Jq|2@edU;~Q5qmCxO9+Kg{j;uh53m)w1-fL? zK?8N>94tCj>w?4UACZ-sWpU_tyO(S)0yB;E^vL?$PFIj?2RGFJtND|E<0mb$o=?>q zAl6<$blJT61tOVs$tqTE2#{plBrywcBCZ3!O*os|r>+1+IEvo!@cdaKu6gX9%8tiG zx29GlYptLN0OF{-!pSTEbS8-#I??9d~Q9=adr4wk*P_uBi>d$|+t zBxHc3;N4d6o_QPPwXJfQ9(}xceL-M(gzKARO>s|_3s1g%{)P1K?Og`#CRrdw`EJ<% zQ1D3e+fi!>JB6j&I81|XKcD*si+M@h+FiO%)4|Tl3REezqTWiU>nGPM{;(ZJ%|X|{ z58`HrEUuF9m!Oo~c9y(BcX$={6L@b?)V{sFE%p3X9Q6XC?hwvZv~m@s2#tbS@_?(m zOPZHYF}aRfA8yIIyNE@Xyq|}JW$8Tu9bS=7jNG=nw6<1W@~#7tl9uAZ?n6E zK4|o2!V=v?JIB7N)$VV2>FI|-R=_hN0Y4V$q;M8$?h&(LHLSvG~6leHpv2W zH}?!!_bj*c{F@bI)N|-PB9sP~e;$Ud57$X)gT+Omhf?bi`m zzmgK&C>mhjfDkJ=WZ~`Qa+s6dZIq37j4k?ow+QCsDiuvR(7o2kuG-agFdU z4mwbYHI4Rt?wNucQW>{%&+rGNaGvL$(O;0}57P+xbax5&2uR2JG3o2wrQUrKbcu+x z=qMmVOca3@BYyH1@wa>++J~)9(shh?P=fu0LRq2)A{3yMi9T3qN4NcM1<&K7zcOZm~F4umcvPbbhnl7aIo7TJAn9Wth8+ut`bXG)7+& z`r@z3t}DB`a~aT0?zVmRCk}7Oq)gL@_~^HFAVIzDrMN2Ksb$)|2lbhd{%w1g_i5m` zTr?hmfM6myHI7W_QE7^pNSi`>b9JI-G4BSBQolc>G%F@!BcKN}L=M=oEaFDi-;z}& zeumn8u-R{tsTP0)jJ7CN-q)vRJjjeAeA>zg(B}n(9!-bfn zl&nDUz(g@VlaE*9YJ=X z)?0=XJ#57?xKgBe5Qc|-cvkLYrD&h!@hoY6Yw%0+eAXLZ+Vw_NM26W+G0Q!Brd`wj zLO$>;4$4^N`MSPLCpQ1{3}nv4z|A3a<|FJJ6j zBuREqMmIFESe{a#bcyuUL?=mAplMl$Op7kkZrmD`^-7x0rlV(>0E)VEpIxiHpOiSRGAL!z`(IZw zqSMeVAA>n8?P%Y1<9lz+_rCsJE$iQ_X8wlqja@`91t@n9MbTASbYx@1_7ktQxy5RU zly#BvhwsAqxql!Z)bLTsBRyU8cre#>{|1Mu#py-#EnT+rxu zqx$Y{i~Ota)AR~Ym!4#pURBGN-`#C9IIApue}kk|Y1*1uwn5X^jr95kP2Vun%QSt{ zOs~-NEsk@Kq%#=XM%g_Eqt45&OSpSx*=?G>uaxC&ImqBgLn+JC4&7z9%NgkvlTTYT z-QqQ+Z+q2Dr+v0<@teW7_)XiiZSs42m8P5g-d>~WD!(~Sjo)h$w#IMTU)vVHsqAcP z{AM&{@OxY1H3u!VSxQffxn`>SZg%z-e4UK_V3#1qV#!tVEr5 zv`L5Sb{>2~sPkOiZw=ER$Hjk@3@aFFIp0dhA;`+tvMSUZHCkcZ(#lt{yqS!{o|dj< z6tCIkbux)o*jp3HH9NiD=!RDs^bIT?7|A%F(9*Sx;x$M4tJuHMnOVm2Ryxiftb8r2 zLd~w>cY{uH-xE1pXYQ>dyzb!Im$e#17t+45()VcBygucLRobxLKu;hgYE}_5rQg=+ z*&@_#(wr+hhqi+Vx&(uT>v(TQWd*j$HF6Rr((Vzz-Ggq4Qfw%%>4 zSjS4QugdbZtO_+pjbX2=6{kXKq}JDX*_yj>%`Sb}{&^Vb?c!!qZZAj;X}}?KX(sQ{ z&kJTYVg_@?<92wy8Xkwf3&6VCywYF7xYRyjGzYaCdF^p>Jp&(FGSlqtMwYp?J(U`Nn&BcUh_A6UPQGWMN zPJh(s*`^f+_jW3jt+@-kl4CLz=vX(nLTL>h{aB|tu=S`xTa)QEJLA9yA8=bn44h%*Z449Hg_X;7aT4GE1!4sRu#V94KqFw3$vPk#^|!99_6U^B_d7DwTVi zGQDPJH0%i&yCtwE;B8sHmQ|tVs9{aO*n@#J0oO(8T1N4jqr5%m;kXLyId4mruVq!J z*)@XRAicN5kPeHWmkcbip~^VuyRvW?HwH=Ajrw|*Q+SRXIuwGRhvAJiIH~wHO!2{< zwbU%_?~9je6SvE>=(Q#pWmdB0ELwAvH7A%oENf0Md%SGTUAShK4u-KYzwjk~4qaaC zjzR8s`cX$h<16}HCyIS@*4W}!Pbc47aiC|WNrc={?Ly-M}(7Z)|NfRS+RRFO#KwNpjXtiX>` zhay|2ncZ$^4p+&TWmTv-YFJ7O8yZ?lt079)GK$yi@?mh-(rg4e zjxo7rrytom4#g?7b=zC8fxxIKzYrG%3~ zXeRH`LOaf)J2E9Y|UM`W|#iX9}J8};T-hAO2>Vn z+$+C#*)}R5bGmlM9?MWIuvIo`Y|$)YX=}2vCz5N9bmx#P(<-hZNwZo(Xy}`LL4e!T zNBQYGbPJC0Zl@bXu?-RV(~WL@hX$w9S2y}aR}Gt@THLe9pyREZ_%0f$jCB(y{n)lw zQU%iXr26+OMFp|~MgsVsXuWXAQ)`aowx3+vq#(!eaY0Ss*F|#8mELYg`pDUo=`~kI zf0)=j$LaC)P#0F(GCh&bWPSg#>)QhmG4wB!f!5|SPpvtU-K@YFtM8C1S}C+qqty3x zR#4^EH~1h@T`B}crJoEh^{hIdb&st@In|PVE1m9f9NTMhwL;BN!{`K@kNQR@VB(22 z-BG?pRywr+PVCuEtx$8+Fy}ieqmh|R7bYjxbf*-rIm+w%Tl}md7X?;2rN)}?Sa~a* zZYiAD)16wOX4i8}pSow#vhMhyFwP?^a2WOqH z4NNt<#TO`1-0o=dUFWGaXL3(d3L>>;C!ZwX#isF(VzkofW(F-^%c@Xw)UbyWZLB?< z)@AuxR)v~fBLWXk2TxH|ofuZZHky}_k-E3R%hue5Yj$aHqR<#BQftm+$3g}rauCEl zb4uoif{;0|T1M^XQ**0`A~Ls%F!j_ZN?{u%S>lbBN?8Cx+tW5*oe7e`P0hS89f}iETf-j`V&-QH<5pLw=eRcO51s3QnA1V$zOs zo0!O`r=bm1guTL8n$_GVt4hV@H7U!ex_HSx#VQZO|+m7q!0@+*X;BQU$-9V(kxX| z54nAdev)f;|6u0DwRNPk#VVQ0dYP`C7vh{zp;@7GgA|#1@$%&CSZhav)`{Z2noJEd zEM3beUbD*^mcky_NoXi&U^Yc^%}&2Ks~5TUbf~gT(e8x2BBr&t??oE zXWdAl5`U*BQgQ#$mN(Sr_qMzp$nv$U3N^dNy>Sw^&Jt^mRFf~LpnlXCu+G)Ty~P(S z{TE9Kp{oDI(m^!&_9t7*9MGJ;BWquHUqN7-{L>KbBrJPRsrNDqwBwQFZ@g`Mx5IE8 zlHT)B>e(|Rp5}P>+lu;l2XnmQjx%os0Nd4y6DW#kzErAzCM^kcLSs0A-n7m~k|+fD z-sOSBorr{w6I_H}7Rgu+6@@Kl+ zJ_Lk%x#zrf9rVUrS8!jrNwB7R@8u0#hd=5Q3GCrbtXZHApK8Q2#eUZ#O)a6$w$WJY(G5N0XODT|tuRba7RMOjU(hHtOwu81KRQ2`< zQS(iz2Uz5a_S+o&&b_w^`a`g7;R=N)E0P?=VYJAS@Z~6kBSDtJPe(B>+pYqnEg!0u4 zAv&5Oz80`y!O}y+47T!A)Gw-QwR&u}&@0l!!ub0qHU(zG1$KwnGc=~$XS8q;L5uON?Bcnduy=~LZOHVwQHfrW+nMQ3Z{ z0iyidf8Kew^6kHS|E#c6_%{D;<=qNN!j!KIB;oBpKT}YHK zRxXTu{h7~!Sd=udw4%m$#`m|35-TOM1kIw4a+PvcN=aI8WDwSOAV9nf^>8`tbjS)2 zgUhp!6+XOs)d}z5n*36!w6X+u;g`tYWvIv7O0UhclE_^XXw8dYb$J^SJCs|4R(nhO zG|vn{M!(pGV#Up8rkxO{0a#T466WmfuxJbuGG~P|XQi~n!=CM_jP>GDUJ zYm*ItoKa)+lh(9aEwdw4yO7tCm2@kDs+O=%w=yN;P{9m>7%swzrvaw1D%js6<>?7m zF&Yk&#<=-jry)_x)2F(?v_6JCc{nZb;Bz9o1smC9jch{GnuAuVJZd1``BTVQX86>% zmCx(18_oUtc|*Q{V3NZka6rwkl$x(jerTMrn#|B-EYP2DNyKB2Vg=v^_~!IfJx6YS)BAq_Bum2z%=EIgu~KqFWO0 zRV7XAnQ^TtSpjO4X2G_Fcp;*y?Ftg2UIg@&E4oT$rz3&RRFJUNH9YqMkN&Wr7nu)k za(o35N`tl?L&wQyq!N1mvaA?6fyNaPV2)H6l4(QHP}s?RHvB+F*Z?%laAQbc$M(*U zx??wH=;}KUlppH&1^Ahp8lwksCTKR2U7(dQZ%i$sM@Tj8A=Fg?giBPBNQ6j}QO}Gp z8l?YDxZOdwHu^&KnY~5^C=xAu#IXrAmUN}@ef8U-dHc0fPvNhd-37e_n#fa&3o3Q6{sIGmXO#qIu?t=XKEfzzy{&PlxT(Sa?s(G(N(li7Y8ptmE`k^F}wyy?4Tji$l~TeO2-eoLo(^-MI=U_Jy!_EwmtP0N+TO= zn0mtTVk9fn^B($FjVVY|#3=$UUz9ZUe2yK4vP|*vmbGJQ2nR)p!oh>YVLTxz)~KJc z+H*JHte>ywAc=P=afBx|=bn3mj4uAU4?e(L< z&twrbyt%!*|3yyH&x$3wsxUNSM#Gdm?5DTQ=HZ*;{fncM<7V@{87Dv^ zz|#mLuQQP>I@+L22eL=i2|-J>rv#@Mn8#>lNtQCfE&;DJxBf4dn*Y_8PrrJX%NM?W zwp`oY$t_wzLHB=h-E_^I9mk3S6;}AKDgyAWcfUxnyPjsr*<~U=8jRF;Tma(RGF!#J z&EdM6jcLfj7`-&}y`%i6>#l)4Q3&i??Iqp+)(!;9*5964xqzF8Oc`Hc+FVe6S6eNATFerl@{pu+e!( z9c&`S9&E-WHUD7a1}Fg5wzJr261U-z>I`b~5Mq>jIL}MeJPnp3WK3{zAwPb4Jyln; z1OD+{&HPT&Yptu{L`Uyxp5o|g%vxkuGffD9)mLkCD=Rt0NU`UCnWs+-GF_A5xf(LE z3!MT&p--;xX!94W@cy`xQ=C$@Rgu#b)k(U;$wL-Yj;9u>LD3Utnj!Erzi%*h3^0c< z{G*NnOwfmcOtQxT%Nu7`@?w(<0@hf(Mft~-Zx?P!pmgB4NdoXs&Gr!E@ja3=h2FXvKz|Fmswb` z60E{`bLp~OT}>-DR}?SzLN;`qPD;xDhzeWPeBr(a~izNKi`Fz>rEHtPUbbyX^=~&eiwd4;i@;6_wgEX8hQL_ zW%QsS-?vfxfu07#o{#6Z+cBXiNJ^uwHG6-AxZE+k(dbpn<<%nj&pN)OcKY(vdl5&& z0hS_-3i=6=Yx(46G$1L_Fm45fPXuw2h4E*FpS?_l?iLOFi=a$J^kt)DE7jHG*y@224IU=A>~%ilC2r zzpIw|Q1n6#j{%3?Kmtlg4O3Uj$L769@O+c|T~kN!NXI1t~$C{PC*i zhh2DZ^ttnfxM zJn080n|YYNu3#AQ3P&|lp3E=_8N~uyRXUe?1 zvT6J7A5&oG19+|`94N-M@Om7uTWR)bNH@e21;T=5?`gkBR_%mugKpFg@;Q3(V&Fc~ zfGS|Zg#(@~W*m}Jvmabz%u6WOgv443KlxaLDl9ebD~2U0=L7@zZ-o)iK@0ktTQ zjEl8cs;m_GRiV75#oZO}H)h&j7x4$EsKs?)>}XAW&g zYS0Z+Ykr^}Y;+QZRJckYCwY>#1~(AXanndYN|lQ<>1~9y5@80Yb3?+8Zzy!oencAs zHgn37vw^1CSIJzyu~k~-Gl0xGB>&r~RJTi&wYAcEwY0kRv8Dm^P4nRB6CMlq;X;$( zDR5%hds}(WlPF6^&I;IB-*2p`b3*2nU`!#3&S%;}Dhp~|h+7-#q`1rxQ9%FMMJ^4>Ww^CC}gx(Nj7&91vpE>6`Wz zFNmF{L<(b}!Nd%9vr$mufH4i%4qD2?jZg?K{Bku#pI}wIkMWAKP+2SgOz{4-vb_3h zzV!9ma&g-)cIw5$_XWIvoO}1KLMdcG3v!kfiQaQUDb8O&$v3;+#`^l|Iwm0UT@5`c zLsIilwoou;VQ40I)iz86#$^I)OKE$ir+`ss1E?|jrSe{zrAcen)Sf9RJyQ|f)H)lx zD)8}vUaU^mM);!%YD8-rXBf?r9Fs|eZ`F0=ntq4;T^oCcT?ZGyO~*uycbY%A!HPAF zE|Y-@+x2fq)x|Hpj>Vr|*R@Ja=Dk)Lv}vk4 z!WL|Is9~;N5jz_u#3I&p|!>->vn(}cvQcl$T^*D&SJi_aQr?3V^flQ(;Xh*P#!_z3yH*xqAPoZ@FLi$=1qLlp-33Qy6!#Lq)#C{ptc5+FU<@=WUIfJS=(7$_4UPnG zhfQTkFHDJ9*SgkO(hp)$j(21brW#KOHKGjbEKWV~4IMC<V5EdW%mFb<{{9~>{kB00Q7MrwLSdg%0s`%W(W#EukSG~nm81_r z@*%tl!w(-KbzDZVC`Sn*ljlzo8YQXg4`q@VZ~dW2<5ayI_OJYyb=mdb|5Mue|NVP~ zst-ZCt&o)b0%Jv?rj`8te@p-V|0I+62bH3~|EGQ$d{9~ROVqp6G{TKf*cSKwfiB@O zYRf0NfBc{R@xT1*f2&aPkN^0u|II)CUkWY%_>ZK-|4yOhAOE+1{4f9b-xM-P!hinP z|3;zWAOFKY{_{WnCxwWA{Gb2zzhxzWf`Uuw!%(|c)jlQ&#cw8~?w?8DQvjJ7pY*Z9 z4)QhhV^!sMf=h)vfM8v|;SIYb|;ssbz zKf0lx75*t*7Fd9rP?q(OSpTSnK}&pIS;HZ=Re&Y46#cr#9~I|1th$RNwj2_T8d-?iWYT zDRb{tK&I<3(i?Xf^CZ!AzeHy108BM&j)LLZpU}SXRnAQ!_&}<%QvXw@Jc4#*_bhSBjG+MD8 zQoq*=KMaRTyRU<;OcGj$%o{w7HvW2eor+@2tdE8tBA&F)t&YF{N1n97;D>#gMp+Sb zMLouf;ZWeCZ6+mrL1>xxN9-qRgMW&K-JvMO+pAe6Fi?r9V2)It#E0sCh+E-M)kS~* z4sN34|pw`%(Q z--%)KKdGkAfB%pF@n8Rss_FCJ6H7-+`1k+%Uo*pIO;lm#)4Htkzc&)}693&l{y+cv ze_)hsh$Jh4l=)v3c3~MU;op-I|Fgn8lJMW^3I78z<^F4hlmGa?{^P$e+m7+^AO9Bu z_5Y!A5iG=i{1?eXr||}_YLMkz08uuG0t{|Kde}`WMV$^AsWkY|n~VLKOg0W)wc2v^ z{R8@1)9U6{nNnZhKcY$1Etz!AO088z5=|*qNFko|0|&NVk!ieYWu2!rc(Lsbk;F@F z2xx~irLrMVe#hz+70SM26^pCYHJY>e|MZOk+u_0_hpASr(=K zaw3q52K?pR!uc1LB2exfv8S=Bl?{=^AW4jSCl;-HXB^?CC}q>Nr|^&_T$t$g>lT^& ztjPlMKI_@)Do4*{MCt2&-iNYU!@$1(!XkSAg+=uK%Q}O!w!JRXc-O3N^R%OLtMm82 zQ@VjAy*jW_ygIiyx_@FfNg$By`rhp4{XaA2tn)S<)W5fqF6yQ?cH*8?1 ztkptDUe?b{MhLN21o|Zth~lW*`On?110=F9ok~}r$bu||75}c?u8}z-@Pyy z_8nLAa-RC`+LB+XO+-<{R%VrO-$m_^sCm)6wy>Lo8FX6RQ(jMwXBQSm#oJ+JG$ zjdFC5G!y*m`VUr3G0n=P#`#}#W%9c57hT=IeraJ7V^LTQuaB)JzdpA{|Lb#W^uHFW zQgH9}8>`;;W*5Hx(d>rfeUk&nyt!h89Wzz4R^gD3d0XVbJeHy$NIDjxAUJn?%2LXk zJmt(})Ugm*A=<}pIPWB#f8i6Quvd=%Vs-I}V4fuFb*3(;`BSSyH17Z2{}6zJuijf^yJv=#8cZkIQ_vCwbLIRux!nL)-VO@ z?Bv3#cwXm}N&3&ZohhrHb4?&xbiQX2f4*<^?D@Xcv*-I3Y}IO}DKAVWpIgTKxotU~ zi+M-V^rJNf&wn&pa&c%f;6hASQWh@$WRzy09eZ;?(TWi?cVTR`)3W<%y%BG@9e-?^sGne_su~o4raiK=OMFU#i|zGI=XyC9lXE;o?tJuaT>{3@!S;#L=7Nj zcDJ*$!~1C&VbCe*?SAJ<5+N?A@t6K6a&TbF!}Ttx0?sxxfZT`RK9P?C z-ow);f6Kw^B)I~5yRj@u?gVhKumOpHqK;+|6PJjn@Y`a~BVyuPxKV>{C=^sd_2MG^ z+GKr7Xb>fN8mmELg-RD8wH9~^(cg*>67vn@;l6lq0a^~j3#=Ddd;xG>Y32;~DL373 z!C{aAF?@W`her~a0l*-ZvVgLe3yFy%<3=5o$q_Dq#+4>6KfJqWebHa+TN1^B9$IfU zNr^NsZ3u{tmqx&|Nby(ffa6c5>!R+ih!?4F7^V?@C`9vAg!s=F@DOn7_Xb`oisK*| zM12}oJVLx4kDo~trx|m_+f^pOyoag;y1u0A0!+1?~i}-xWKIj!9m`<@-w{?COf}Hi+XW&gbBn&|)$i47%_tq9CaUL1Hfh z;eX2^=9axi^UZnVtocLz?D**Th0AT24<&ehJcenA%#c5pK*Umx!`5sVSIHo+sd%rpHq=yvf@NvMY}{q^aT3y!5QP*87T^d>{BRPJiIC`~I(MzZRH7IQK4LZiP>;qaof` z>xKPc3Nz-@Bxpq#50O`{ipuSv754nD%=?<>u+xuR{@b1WUkZQAzkT+u_`bjZRF(;d zop04IUXM@HEB}nwxsmJ=f+^CV0+e1Y2`HxtZ!gk!cjfJOch&OyXPAf0p_w}j0Bx9- z#+pdeN)#w-8rT5e!vA3^HcKQuUD58lD}K07sda?CB;I2Zy|MB&{CD3UkUj@lArtq& zCz2cY6TB2t+3|iP4TqoA9q%=@cb`02-62y1_|rUD+woqKhQZHuQUF^79~(Q~IW`48 zHc4^Thz`Wm;+HwSL=@TD@%}RG4&mqa4hkMN@c;Xtk&3dC1bj>|wW6d_USc|t)GwZ} zLuoSVh`vVeX%CxDi;Q`TYSs2s*IuKl@GDFcz}g%GtE|ETzolU>h{+h@2X}mOVHTcv zhYEeL`Iiz(Km-+%2Y;+srTm_ZZ&-@ej3UounF^HIP;R729B9224a-eIQ-=FU{Cl)Z zwpLAV|9;fJ31Vt=F*ju*DpXKV?_uohG`NC@*{S~lq?U~kcJYX)HRuQn}lB&p3C zv+>@0Cg1wSJW==c@c!!3VoF zPEF*DZaq47cDTP)t-@`mtY_jh#ctVoKG=Ca@DvgU0uY`!yKbcJ(*m^kKzo1K@jzMJ zX;le*O%7JX1!pTO5qw;}4J(3!JKnQkZ(=y3j1wI>z`Qbcm;M0S7vdob3G^F}!z07U zd~!y_f6uGY-`$~U?U!e)(D?Kxbh!Y!0Z+NJA^z^2HpsEr{OSa6 zB;^ID2fMlY;5DA*Xz7nxGYRd~ity=VX=`rRglhhR$(JBrzs{(X}=Q+vjC zkYTu*yF8-0VzQ!*$pBAf;Tm>xby-@@WS(paGgq^3Np%a52yCjPzby*s$}FN4&uZdH370{9TaPrs>UNsaU_W@Dq&-Ye3OPl*cpS|O_zuX6)y_u zB)f{LbY(0>*5v|YLtl!(SaB^$*5+P^2$NxJz5H+%0|7p@!GPOjy2vR)Q-OYBrEXg?CJRVZ01d-2c56< zNk%}NX;N|P<7ss9)?BK1>*Hx+MGw!bh9}dw6KXd3M*G9-w*Bqx92|MJkf6c?DLD>* zfm-f%0ySskPrq(SFnkB-kV#f7a=k)^52=Ia6tH7J7G~d)|CGOVE52KGxgfNXpx;)6 zBXpgn=(M6-Pb##1T%9+^<~mo5Ovz2E*s5HYOt`zLjzMkUt*XP)8GLY}!3La6ydl0J ziqz6Ux3FO*VX6b|sYvF*W|Sg)EpuC4jVF4%*T?6yu7euRN&UJww?a{xhBRDYG6KZHF))42iscO(cXGQy1poqal_jKjqT z_v+!{Vlu|qyWf;R@tiDuHoFs!39m%=u17bEQo%y2aENX{A6NA}R@dEr5a2Fvp3^ae z_Yr{NZDe6f;V61s!}JaII(=MMh3W7uX@Wd(2NTQm0F=e&*MZ*-;^b|vrN~fD@dQ%c zhDKK8LH2WOR~0wRCqPA)zG-lmt_-?<*w10@Copbis9nSNcnGz-N9QNSt*!O#Vr5Yf z!zAJmRl`gVLJSp~QQW*FlS7OSZNhGGJzGBkLCapQW<7W(wtLA~Z-scE%{O%?0y+Nq zdI@+Eh!T!Qk}{X@WOh=9+ENw;o)7yU`q6EFh5e=72EC>i^TB zLt`dPw?$*ywr#sRwmY_M+qP}nwr$(V6WjNl-oZDh-%zzr?XwoVs$T2Cd|J;T&Lh8< z>)MrRf%pVgLR}){2ww3$Ow#;c9?Kv_^cSMLCK#lQ@%%{NK|>GzyYw59VgR8Au}}^h z&KP`b@1I)jvYQu{cj!QlXgDg9moYHD$xJN#Z|h!7(8w)Nn1P^Bgz1IYN@Xi8r)AoN zO#Gq;7R$XVJ8Jr#E?(<+zc6V%g@nxJ|IEbM<%^l+Dhx}0%KF;qDY#%qy9DoU?Z%o+ zl`!h?*h6@;HT@*T+GM{QB>%yK#Y^OVu7~1=Ua>%D$qMxklpr;hL1^nF#u2}ALp}LI zTGN??HS4{h?u|`{=(9lY$W~6@QFO{upp7Pjw@!RKnN;Z+E08&488vYc2ATk>tL@U) zoO-R$P5nRv36ovEh7yCEuUQ+Hc99>Fv9B`{bgWx-n8(PW^n!Z9)ri&+hbc@nFR!E}dr(xFV(f{*yCXJpEyBqF) zN^3OL%a>=+qDXHXR(TFNRT|lj0xJvFi-nGX2vCEQyu5|ON_Bk-?#!^)CqoiRH$!;N z$*hIHq>=0-^-w+i`Qzi)J3);V%o=w|v5dg;Q=fHXPSMJ|K^--WyhJrX^q2S5q@f%i zyAh&x_4rVzapz>flyn?DYA%B}t>swdzre&tx`u2@iccHiP;>Hlo3=V>b~!4$%tp`m zC~m&i_Skl{74cd9;jlSM&L)S_AV;8Xmb7N!<~oajfDbD1);HT*Q3WxCQqQaD1vZggs^T#J|updCe}d&}V`u z2%W}`xkmU!BZ4W9JBPlAbsq}Xe;};h0XZN;0btR{cS;vY4M@#8W>gT|#6Cl^B_-6_ zwNnfPuxEOsr@~;q?^4DZ;DGWb(48f(Q&up}HSry%r{s zgzS`;&MCTO?NB{6jwwG0^W}=yE4<7qlI?OsnXn?@q-*yHmp}7ANpa;|u->O6>iIP7 z>-$@|qE*wQo=iUYFwfL};dd-OIAwiS=zDtE5juOCa)knVN@@W$PAdCo=UCa_?yW0- zXI(gcEJ!AZ2GO(upW$xYngA9<@cbS)5+c`7=0c$H?kGuLL8+OW6#Sx|>h%9y#3vfc z9*X@an#uxK*SL7mpzf)VH_Rv%lAwGNX|hTPCUGP51RC?GyF<|ZlII$=F9^?J_VdZ; z#|T-$2AN;UxN=5%cBaDEIhXiQ;O?>yQt~Ue2X8j*nmo?Aiw2?jpJxWaMZ%nhR1*-? z`XVp~X3s)^G)I7kb8cgD(v&hN1gq-_O1%klB#0xcxEH%R?v}S~U`-0>M_JUh z5Lw?BNqa0*vogq7jM;$w*mSjR=^e8TOv;1+^AfJIcd6z9x=acY)KsB4Nw33F25^I} zs(MFz1vO(+L5pGxoG$^&1LmR(jOAtM1N)M#DQbt%+@b(lNeG)f?oy=w#6}1?6-<93 zGv&1rWcC7wfSn|?i(WIE<-l}?$CGJls&YOD0^6*)v&_z|^{Ya&X>qWfEF*AWCwO=} z@D*!Se-bIg%SBiB^oKUce;>pt4^JTZ^X)*yZTUVF zhPCtTefe4aY>I1uA7sPYZGjW?>746rpZIWoAu3cv8eF#1qE-GHG!`ka+iS~$zeJp zFAcC0dWN2Ax^me+a>CNic@uby!2=bWvLc|!zeEiM{a$x7(t^mr>3vy38IHKQfgvjt z0kB&+|BZwnZ!=9zMb(UY&J@#?hGZcnV~4V1Z6-v$prYeLZG2mZXvo ztUu^BvjNLZAO?I#T|m*|5Hr<=zz&J)8QcXI=EY*p`H)4a)=jXVTXif=yQ({u-MKLv zQJ?xtmEvluYHFrxYHF!!1@`mcR1IyCoYa2@gwzwCgV zY1ThqE_pkYfv}rf3C`4;bwcmnA1pkW=VTI%ThIMbva#@aD{$G2?!2Cwbzr?@o7?Ou zHI+If=;hxJlXP-ehsQ+P@zHBvFoy3@n-C?3$)3%X#8Ww}Jn1_@7{sC1@uj zAIA7mKweK*6*bZ%Q(W6!D|D!$Znr$>z%eLQ1VH;zusxo)&}eXW06Vv@7YJ-~G5fK; z=7+4Oh!>(hn$=A(O41?66ZM9=(k&7b<#$_QHp2slzY}hJtO#h+`I~FJ%0_saIi|M} zdEv`;q7Z9UTwNnD)@z%t8WDrzsC_Bls{ComybxTjA)?;Nksh0-03iLo z2C$CmyuKDF=IYc4f!EQ}3Mm4Ul5;_!Pxz(t#ZbP`-aB?k)HO}!>viamao%ArUqy2A z1qdK?<=wk*?MZBbWP^VO|hY_;zg&IYH9(iGF=3a_(}@Fnm!(9@JMSyBa-XC ziV(+^P8epZz}_RGcfZx4&uM*$rmTm5`A$i&l78!uOQB3=r!pU1&Kg|? z-!7vIXmKu=4-R+v5<_KDXL{`Kc!*+7{H3ixC7w!PZOts{tJ$U=sxcZaQfy>kJad!5 zx#*p-!aZJ-bOxjcyJOj71;WVoVPRQrh&Cd~CxSJP9K1Ha`((CYo+gRRNR#X4b8L%) z{{fq=9w!b<$Js{72(}L{HdZ3f?axu+kYv&GvfaHP+JR=d5cglCSR>%iWfoWNR_j18 zeZ#w_G9fI&1aOs^YLoa3kN0;o9ch^_wjf?SXf*TVOM)Yp`X~Tms)?u(g{MM%OZcc^WhbK3>3ha~eQr zF(RRrV0%c;Ry``uvP|BCF=RN1#_$;xltA!796UT6`-HoEq(meCs_2FfvziN|3z^}blV>onXR;~tvYM85LN2qEZQB9>3yv;SPj&&>&9^$s~FU1T2?29n4vbF zL<0-g6~Jmr&!X4l`0r|%Z>?CJq!%e@8JVh}#+PLmBph0&L4!7Gs;;<+gY0B|t(w?|+kD#>&{{8nPaw%1Bw=(||vH z^oz%V=A6+)4WXBthvjftkoj^pD%KFCH4<$Yk3yhG(8iZIxXLkq0 zQvV#vVUI50c|6LZt0ni@mn51dh>;7im*a zx5?g##BhUUjEmM0w8*r|ct!#pzd^j+z#bDoT=`O2zG*K7w#Q)2e*O8h&O=NE_HM%T zmKYOu;*dJRK8~1m%!3$IS%~pmF%d{HU9mgC5N&bKWJpUIwqEX?IkZT>`He#0>pJ)k zBwldZdKpafZ)r2Pti=p|3EJsy8{*eW2X@2&{;Q^&8SxY^{gC40z)KS2_0U0z0k>ywEd?r@%UecWdsrS{w?t@2!96m9;!p;%hzE7 z6|PHCso=2VF4=q22umR@@f)xd*$d-Q*vXRUjLDIZ#ws;+cJ-`%{*E=U&vTj}`C=Ou z86_;PPJhLHpTa28Av>aW-55Ox%p|bC10)@JM_OnWFNu2@Q`{IH0ilWn^&u|^j4DWi z@vt(QX3RLzAtNAVgX5m!8Id6Nwiv~h4Veo6{wtPa`OcCpk-7tul29wMTe9--c4y4R zwH{u44;bJJlq{xbC}1qikVsB{e9cecLASXg#s4sD!6!Mb5-o2q_l*as6H3V1kJX04 z4Ig7$uuWNW{;e31lAAMdb;Sh%%)fYA(lQWnVJF&>1~e9X3%t z*cX=Mk*XqsU5SQ0DBWyXkAjXmr&NOXAVkIh!&tGu~gt2nc z*w8&1{82|8p{e(D98MBqmD6~c$Z}C3i*0okw0ThhKVdx*lQ^fTYKA_6$N4X*W>03( zs$9T$JFL$pRdr<$mBnAt5VFX{!edJuAm~dCkNU1!drO@}Uyv|xSn^6@I=AlZpO?J; zXZ{rE8%gmZdVqx{YiG|cH}CJv(y7K{w>tC)D7K*_tGx(#AE5b3S*GO{2yX1iDN?ZW z-K}kNY45t_dsw=F8q!k0#t}D(N#5dx+KyMvr>k|HHnKzoomUiuXxd}62p^oPap5r% zBs9vlSOe9U)53=EOK*S}TY~tq&jY5jKq677KMAtu-Q&Sy14;F-HEYd@(wo9a#dlo@ z3O5ZtHFwO(zG%Qa(^48bWMgUP^>LYm{u739BO^E~8x@q~%pZmmsILo+;9aYqXqDdD z?R&|hwfR)gv-)$XY2HGn11)PBP2d>hbZoI6{VG%&-1@!Q}xai zoUJk`PO}9O^YhSHStQ>2Q;g094L#H=t-Iw!@Il5Qx^y}xCRh#Ua&?U9%mr!xRW70( z*I16!avM;7PfWlj|19+sB0Ny}Y9*Nx%eDI$ctWSPB#4!s=fyyjb(p^Eybx@hpy73H zNBR2M*-PdK33rrQ(uD^;%=rStk2VyxG7u$J22Za3v5|+w;PUc$yN~O_IrR_eOsl@y zK`G+W2x-|#QH#3A{4qRPy~({&QES0&uXE;d^t_zUEB0IVw3X~UHN8VnEm zy_3&hw%>uo5s)G0J;#;FanW@3e>F=Zc z(%lZA9AHRecih=~f^>`b*C@WlOz$2bXI2&u3t1$4-C$r-*CIWNvrM!`aw6_k!j)Hw`+sSJ93OG zNX~f=C|7MOU3_+~Gm4izGj*g8;ePublJ20EgRU6v^$w}gi(Kc-(V69Sj?$4^() z9*dUsmkaVaFYj@4S9#@DG69m(iKn_3pS&TTU#}#N`~IuNef>6{k^i0%rq{#w7|)74 z>>=XP8PC2(^4u|o(atb5=py{{VVp6%r6`k#a_cQ1s1xqjW^OR8n|jju#$U&=w?dG# z9{si2>XJ^%$TEJ4-gy{}P60RS76YAxB zg295JbM7H*0HaN4t~pqx4FuW>#&!Fo0u~iI_oLe!1gsHoKR5uY@AB59^nie{5n_dY zqs05SVCyfe56lMAGYKhtV%B~}xSt36`@0O8x_d_<(QtD2t?77)H{jYXqMX#@;Jis~ z>cVuA=PepZ=LNQ`NBavvR_sV}KghMTsp(XhWTD4}zb-H(?FLJP_`(;2jqK|tasr2S z+(?Hb|7?2yfWg7^zL4Nvk~w|_MuA=vvC)&;Q$#5JN4KPzg{$=5(mRdx{$b)zlGqH) zY*dBI_H>3_}#A?=|p3*LK1hW+*8|F9abcgP8MWKihYvnn_u# zg(((@_H{zCdiA>VQ;zDeTgI-x3e9Bz0f*x^ zcKK#a8Skc_TI6}Rn#5sC%W_SD z|CNy^BHmT{3P0*+vUO(DbS^J0x|cT0kZCGnIkTalF)lTSJL%pU#NiC0R{nA*b&#q1 z8BPb3>~p6+5%|Gh1>}hXq5>DeZ9#}42X-)4K$vMtaqqf<3MM)f{asjPopvle)JHiQ z9BFHKpkd59c2W?MjlOBFov%y?2qNB3%nHm>6U~4x z%IpzM3rq$(i?Yp2C|{#K8l$A!V7h77cB=%&~V>)iq_g-0%=V%l}`O{vUlas5$W z(hV@5v}+$9CY*q$T1?G50*YQCxHawcuet-okKk9Yx&n%>AzEv3u`+G3G;yqBZROpF zMG%$n1CPCIF3R9o%EfpA{-4kWQC~peH%?OW+>YU))oGU$C8+PG?LNELE(~#Aid9RE zwNfW({8nEN1=t#4;Wr`WHJ5%Wf)(Sugt|+g zm#7l>kG@lW^0A+9`{#FAr#pBoFV#ARSl;E7@`WoGO+p4QS+>v6H#Wlm+S0rS?F4%s zkP!CHPD!Yc1?4R6a26?1AP5ywgg85=TXy_%mrOHueKBIt?UeMlI`y7~}R@w36ogh96*{+a6YYBj0Q_?tc(-MPa%Pi1J{w5)5ZJpXwR-lQAQ=cp22$*~g=8&fEeiJ4q5dafksHOr=! zW(>IvxFcBMqI?-U*6D03GQ%cD31w=m55;09*@;#Ciz_P;`%?A{v6t923|g^o;HN_^F}|miPrt>mSwG4Q&|h zQPlnz`CnV^CU*5MAds8^i2*ZF3;8Q+#Teu!>)*1C>(3_OiIxw?^ys*_2r@7sl^0!MoMqDjs!Np7 z1KZC1Gn}$qa(PHQvjKWiyqC=o6{)y;9ZaqkBddSnr~#Tx)xyaTNe{zMhATz=4G21I zG(ALAajKx)3#NCsU%g~|FV2%wjY_9B$$!|Eu@-io$;_A_hh--)@7BP%HG zYW57A^Y9YtT9h330<^l80hN>IVM}^}eoASJ3#nPmES3c=D1M)%91z)`Mx1*u$2VIZ zcbBy6E`;qNYL?=x7S4fj8Jc8b;fGWeN__G^t&aMUgR9~eD>A^XCRk&t=N&fG5B6Rp z>Wue)%~o!t(Wt0SXj1>7oB(+oRR)+TJy0tVtFAtXF3}6btxYmO`&Mxt)vI=K)qB-= z&$i0m?Ke6lY$OpUuP3(rY-Ef_mKEX=NYBNs0h)5Dxw_6SX}8O}2)en=4^a7!t1ob{R{0K>>32)6ecq@4KhBg z{v<9M5RDvn6APOLKAU8WlV|zyvCnrWXdwL67BWo996DLL^ zYXc`IdOH&vLla{LdvkkL6=)z(oi02%-T#iNI~dT^0A#TIdWFZOOI4JpT0}1qK3^Ei zBTI%l+0(PLa_iV$uFsM5suQV$WL6n<=^C&v&+>b{ree$u8sW()hDFi(5tA|F@LKlp zQ8Z@R=p~&A)ZQQOVQa{apV)+w>*}X`Q?Awxq`rMV853Wb-;U^hA$Yg{5*=#FtQD~- z*rh{KtMI6Vk45TJ#zm=7jl=oquQ$^V@2ykIRkp>nR7*vvn`2cvGN}zGx9iT@gZOD< zWLO%+>&ARPZK)kUS`Qif+R38ATkb6#Ea_ij3^*F_JZi7_J7sLUf0@;3g5*r;OJI}Y}p zP>!p3LnY>vlBeF$B3yjGY0UyLnt~*$Dg0NYpZzC+dpvlbgt4J!nkBjh1{BRh_@8Yy z$edCn-=^$rd9!@54f0lagh%FRF84oeUXo=ICJT_6+TLEz0u;ksm?4u=N-F(m@42&_ zpsQ?f*z9mmX(ksl*yEyoRLsr;*DfDi+1#7{p%oDYI6H1*8|Rk@xb)wSY+geQE|L7G z&A)1RP!`|)k}#tb%8BRa;S`$T8yfww-(SoT(zzB3N$umt$QfCmUOcOoB~54eB(L$i423yxNLhtWigAyd!`%_VN?hcOi8YuVq+ zhfOGwt{(CehEV8{7lbNz#{ZtjriGD<<;mq<%C-dhh2`)NAp;`tc7zkeZM4-jo?9nk zdbbU56VAt(3DTgrvrG^3wO+|hy^*;K_soilycp{&e#gwh%J}qmeOGirFRt`S>{`izdRF~7-7J+*(CkFp^*{v!kkp*r`z09c0`3y~ zhLeF<`RR0q@scD#6Uja==99fbs^V_+{^9zxs%MMYpaOOZa2B?2>>#3GkNT>U?aYSC zSTXzMXr(ldnvdneY2kjB*&lBW;?@Vocg!)^khujud8Fk{bJqk+>2_F|knz^qDcBkQ zG$_VaqbRUUYn78qV4iaCp5;WCrC>a`tr)nm9vzE-PZ0hA)_>ZnxclX#SY|XhMle7n z;keS^Y*fW;T;W{0vz)Lcjfip!X~`)2>*P;Ym1xSPLTiq+2Iwh2?_Gp>KChQ$>c2mi z;IIp8AtIz?l2wi~X@-ZT^|czodf&#aVUy~ENHho&%F1RN( z@%-`nMbHt)viot&?vMwu7Oiavcudscz)vUx#EHVTgx8KUqqu-!+}b+k_fhw0xg6xd z>-r4K>cx_O17MuMz|Co7^ZEOv@mAxo6?JnnwMgv8WBL8YMdsiL5+?MIcn&7ZtD)d| zVE<*mNNGi5KIC{C2fU%?c#3YB1Nre5pari` z2F9HRPB`lsbL&jk!mW`q=|PI}oxuPNSWV3o?5AYq##(;0PB%Y!wYp3JD^&@s?AO!N z)i2M0HYBI=hJFYu`rv!1-SBPQoUdHRHF_|XwGfHuEK|snult8(&Y`RITJ~?F>(#W~ zZ!mUgJ~5V&6l+2VBb;MKhyRdZvUjjgXq+Uvtqm<&MgC3@Zbe&VUX4f zXcZC$uY}p-SM)g%-e~)-8TL;@aI81VVVL#39cazCG41S4Te7PgKzZMf97O{*=^b?s ze^bcuT6>s^FzVM0&`jc|L%%`G6pqglpm~nP!N33@_*|4uIY}-p{zUe2c`QKCVEDFLMxV*HgGi<2%cgAsJ-uVBVRjZN$)a-lI9U> zH89((GJWp=9UFD&KSBgpO6*eM&`l%lcpo#XHN9|#@Eak2-zbEF8mTS`dB(Do!QC3 zn{fu=oqxqEfdBSk3S5V00g2DnmhyD-x9t~+r)r*e9?M!?mc5PY4JQzd1Axe*6g2Qm z;@S>3cp?u`ZzbjH+okwxqQQet(O8)@`LLoWZ7wTvndqCcVJDu-cv$!a_)A6g(e1^B zYOVcPFuEdkSO|L2X(+I!6F4`>{$(mu;Ev_;@_)g?HyPR^@Cj8E@Q>$L$GxdeSiJt{ zjvKr;Y6pAw#n4wr%VX<3T4Zpp*%?l1rH{#>Nwpy&q4xXZUIS z7{pCDbLs?mh*5=U$dF;tq+N!{#tJY_R|1*{~`U^gf-$h3B`y$PvBS&&B=t}5u zu2vG!205d+5DUEv#tj#nH+N3&g*;3~Z=m!cBRxigC5r_oTeof;S360p?j<0YH(u_MxonC)B$#Fgg12<+pq! z7}>Lo$EG9B8BcA?933%CnHi>tGP)*Qu9fpfEX{odN1&Ug@PxZ(IU=}bk5SlpyiwbK z*RsKSLK`RzFr_l8cP7|QUvDT|s6`hh#;Xh1vw%A8kCtJiBSpCs4((~YPb$Ta7; zyq1i3YVMjS`pKotUl*2PQYCU4CM^7f1KkKq50JaSVTFAn1W#T_eP zAj1C{c^q6!96kPL*17hva>M0JJU6>g@8{W!m!aC6o!;$16`$|~7>jkqUOQwbB^}*6 zY8p#lGEbCtNltAJ|9%$|0KvrhDkL^}#omT-8G=%w!Gu(b6ezrXY(0;7{@$GB-B!)5 z%$czJ>7KaM{It$g(LUe3NBqE%Gcr0puX-zQm?klruqan)#^eax**O^Aqe?=C3O_lhnxBTj7$=OFq&3R#58*&PN^q z7A^>Boi(*n0Joy0N6vB`uRBtWz2<==wu8 zwzvwb47zopuXRO=KI-)yPm!}20tNN0B9sZtp7igQ=Z6}X8GOcn5ypamsC_%R9ESW@Z8I1-5?fihX8bOo<6S15n zwq)1~n$f-4HDCG91qH@n&tGj_H}PuBd#GxU$zw>WGAQNgudKF! zf$AExYAPXLMjx z(qF!Q)Vu@NB&X7G6#lA8fD}Kqegp0^mPKlvZaxZ%Cp_f%O5uJJQ1wGj8_0%WjjX5K)tiKi=rwJ6Z(S`O4t`9p~*GQF?m3|hy6?SVo400gyfj{W%o8v z64#>`YR9fQ57E7UdKi#)gMz-+M71p4;YsuK6X7lnbK&PM!;|A5i}=Nn44g_{{S6BO z*9WN07&H!);@~7Pbof^2XyB5Y85SdK;>8xuhmW7dZVWL_)8)nJ#{Zm#Jr<=>? z#gh~JTvvd@N2C52IBj0KO0iVsu6tOyTzZe&gn-Y_?xvvGm{tGJ#wg=%1TV%xx5%16QSnYk|Mw{<|r<@8)X5n zxn`!t%QV(L+DURM>RN-j<&@tFO)qmRENM@k_MTf z&6`btej)zXQ%G;yaQm0$1HmX&d`JtYDVV^u3)O@n)gk>v9;2gkmE4{0yLH|nGzwcE(V&ZjqC#63$&QR;z?r0kA9JiJQt2HyIz@Kbp zVWYd;lO#Ld7ScK$-1BQ-<*qfVL-zjkPTz~@ar`vNXVd< z%BxoYJ(=D1#oSuv8qup3oZGUKpHwyAo|dxd^B`)P!24#OkS3t5s&_iq|8Yl@#abij z1s>G?=3+j3CJYo5{P?Ka(poc@UjU@FSVxsSvg;mK@C+m9v~{lbz1B#BDiN2X__BuH zx8u;{RH}r16m{jMR?v{~@;!L`#cs0JSxJ61!RCoKkfsjJmg3aH|HI+JtgpR}9=!_U`CwCri0S#W#(03&x79pq*=DNE+AQy+>3)a* zSQz2mEAjbaFY0S8$l|z zx9c1k8>pOVTHeEq=wg00S-}KBQFUu1boLMXrP>yn>JB=TKaj0#I8(E{+iGVk1m3|A zt9V23yUEm(LWmaZV*Q=K0yWFfZL?I>Lv!$sYlFE4p9*z)_Dg(K>jd+@z)S~o(XG-T zH*EgM>-QQx(7*AN6tod>p zMIRsSqR3X+7_pS*SkEk#UUFCXA{dC+g0wb$6=oK=XJw8mZz(|kvXFIL%nH&E9xMX^ zDP-J=F^gi6x!b-7mmi_4Z-meF_;M7-t^e5bn(3vp_x%)8@4D}G>}8Yt_b-;=zzMS` zPsh&RSbw7$jV_UknhQ0M7mHbxm>$~d@<~%Wxo1Bby_q%7c3k$Q#e5S_nV_vKQpkJM z94c}DUg>iwE!i0-u#z?oelWmNHa3peQL*u5-0M$y=rY>PNkdjK0sCBxt%H?vP`$uR z#z29f{p*%)rVMDL3hy?~Fltt%_M7^S43WCGVA@^ZxFu^0lB2)>zM0@;g$n@Ji!;C(SZ{oE~1U}Ql!a*z|2bfy^dYu6$smX z^?bW=>tw#3LEOT5!?cAcQ(p?8@V=n}5(J67P>bsNn`cUv-jbU?070z297?ZdSwvyW z^YXH+s>iRMjF}M5tlfQouKE1i{$VQZrBY<5WgU|S7Q&2rlpy_Xv;)HM9@P6JAN5>| zdS%PNmyt7}m)RzyW@%ZRv=1j!0oQ4K^{!bg3lC(UasUS9b z9S@UUGwU+O2i6&U&v7@K!8CD&J=ilS_m3L^*Hfk8uS#rmg)Qa0E;cl0;h*FOaG{U? zkY6+eTwnWT*ZuPGiy*H_caJwe1YZKpQzSPw)70QkspuREZ7UmS;*K&UOsutbxB;=~ zWA?FqtHuH0JTkwa4s%N%*CMQH{%|^1Hh)5wkj-JPbkjk>EP=QSM-bmBg1RoNErj{a zMrcYu3FF&7pAndjZqn{jJh?eWgNKglP7LK-@eGf+jj$d<|C9njbaKK)*3yp!EuVKP z9@h{f&P?k@yX|I8+&s#bf2C%-rY($Q-N9zOgkEJhb9Rvey_@5F=3qE&JnK2il>w23 zlw&6uke;K{MSs@xDDjm8+9%noH*qV{GLLcoM1@ECi)floId(aIuNUEFC{Pg`&IXH8 zPQrEZsJ)V*P?pmNvWbmQ=zVDZmO?QdQ-9jU-ALmV!&_K$TaBAo>x+(>pfIyAZXx~2 zp<_ZV)v+Y+gG=(r=IebCfi)uom<`aK9U4zfUhy$+GjL-x6aeo|N9eweqD7|(x$O}n z+CNz&A_9jD9*J7blEG!*77YT-^F#68!y{}bQImXk4yJ4gAgTyoSVkJx{mF}Fz+EyF z83-gWlZEo7gCL-?FJ{*P@``%lBwS;i9)8j_1?pQT$s)d*UTn^`m+yPEYfT63WDxOz z(x}@XXu}#4>}u|0YSSKnrOJbK9uouf)k{#OkG#gz0H zdfSmZgD@lrZlL2S$Hg4c`8il(%f&s%eqqA6<`p9h8s zyml57+bA>mKVEEux8;6;Y9L>o4&|F)hz>#dPVXPOFd*!)R*V3E61(pgq@~)C6PA=bqW`Ov<_S}kvz!1J?4Rjm`hL2iPlywRc zYea(j2yaXlUiFYkr7*cm_kB{2%NcAqmRnVM8@#7dWDEgqE||T*_5qZRIV!lv`MhA= zHJ6Pv-4r*NcfR$YGBdDG#tgFfbM3f(5)c2`S5xOvqc0@xONEzzmWPScy)n*qb>Fq@4VSzYX9RVQCD}5LQ5$ z{~5-adNqg;s`{mdzm9>*xWfLdoib;ZH7&%#q%O`jMY254<;2!71af)n@0t1 zB-4y(oZkbULh%cukq(3}M!ccX*}om&dkTb4q>E}}B#`MCx`W*^U zeddXtk<|cb1vL&gEu#2{sVQ@vz(awbhN>smLx>;RTVWB^KK|oCJzEb_Kr_D+Xq-P4Xv576l^A_dRN?1{{SW2MvV;S7HY`c zO+!zSACMgtj5vtb3%Ij1I&0@{%0lVZXg zvJcBIyK9HGi2;?to{AGohor>p^q9SEdE0wNW8z47IJD(PwSKX@{SGS7R_z2;0DEZZZIk1Z83UGPdL z>Yodu19=D#zabMkjTGNMA>kMx?^%j}&6^Mzu+nJ24KKN+q){h_5GT^r)wtBKUb6I8 z&o(SMC27bL^9Z7ewx0AEfQp3Q5M+~#Oc(*_^X8sGLn=%T3ra>v)O;g|b`E3!|EcF> z&l#E;Z919a;>i{Uguw>#;rg>tU%V~~CMF)XuEBhAwO6;X|FIJ(OParFt9`T9ay`xN23 z(C53XDo1S9_NUIMPv|htxXL?qb$Boil|__CZ_Se{QI4rF%e$?r-%huuvipUrJt00J z1a)sxw53aC5R4meozDfSMzZz(T0i<>6A~_P7ncUX9JCiYiZzPYG!%YtzW7ry-Cq1r zRt^GNxhCV**uF7V)GPkzsY@br9#ou>SqF!1HZysB9r!MFT9W8@kkuYhum~1_uL;TU zR|nIcn8J>*9sQsURI^+gG!Z^Jzk@pFE3S4Zm0+Pf<^$bzU^WN0?;O6s_}ybU(SSd+@NE>zvDlZjb!{VnPSkT#!FMKc-Ls6uDOK z+qN&FGgo}0N_Vm_Tl%7ivfG91yN7IJf6AI@Re)dV%JY+CRm!_cp12}wYX zrVS}O%~6|%Q*x>sGr>5e>)Pp=|3}w3bZOQ`*)}q4+qUhZ(6(NR98utMP8oth{mTgZ3{aT zk#c?2$Ic$HDSr?S&Uqz5C2hvr)3l)ueFqja) zNBRdUKwpg7lqmRfGxaPWSh~p+yFA38w)PemulnH?r_9ayNp{LoNE#y3shtf&gHr%S z-H0Sg60d_fWIIJA#BqXHy^V)F>~v`U0ccCU_UV@cV-UzcU702ID59&jx$w}PuPa|I zktC%G@H9Pcd<6l^J#Gva_8W~1+i}Zmnra`3jtI;i;1$THL;a4fmkgVhs$Fl3&e9+- z{pYkJs9d)Usp0pxgct5YWHhnR^WvT&xX} zTr8A2Qh!W{T`@EY;}U$%mzL%&l(#~wGHe6msE?Rw6?@!l|I_TazIzGRr`^}sA6B?H z38Ov&WV85mSLVFX26TEti!}afv0T`= zq}F>!ywG8_d@X@d2MwCLyib?zbbpBxNeCnlR1rx%I=HSyi$xh^{{fX&7zz>AabNg(I9kso;D1-FU3*UMq;}M3xRN|vWn!bp zk>BCcN27<x-{UM>}(lHi$h(8}*D8v7!wPG5h?OImJ)`zh{@1Mx!(h*x;cl1eE;4;X&CDY`z1c*%s!LS=3v1G zagO-PC4>MkJb(G6aCiC&rjjA$jJT&Kv?vd-Fs_cs@M0X!nTLOyAR`G*coP4#uEYOn zbrPAc?PT5=wd(=R!j1G{ni*v*m&#`=_DxDI1kTGC;*8Avvr`Yz!w8HzI03)yv097a zRO*k=jA3O&R?`t13r%euXB?E)Vj_=YK` z2>DT}hNI@PvIgJyvas1Rnr}t?=J8p~N0x5McueWfuvLjyot>o^h^r`^oq~6CsnZ?s zlsKV((9WLrxpd%DQB;FA;efa?$e*6+;iYL}!?V;8>lA&@ai>8E(%XjVIKVd=uQ-5x zTHUyovW3G7BJHYc2_#G3qEv=>0mIU#!+C!OtoXm5Guf*&h0?P(z!I1@juwXCY0Mm| z3B54gr5s(-q>i|4Pg9T@-Q%@in=x+<3KDrvywHq{!D;N=O(cVNDU~)eUQ^2zEfo^f zHQ~O&{$xK8We0q%!Rj9a9dAq>394SGI8NHPayA*@eK;De5iB;~D!vukZmAtLRu6vx zIqx#H@zQPP6&QTmjHQpk8OQ=ol!K|t4hG1vG@EDx7ZOfeIZTksEv4{GVi$_wt9}rA z+;M+S9vS6rRal+V8yKG}-N-oP5@^kjSYWbO+ogd81eQ@i-{(s2*thnd9Qn2fM$9vM zchi;4rpAa?9RbB2z31^GIO^Uq!krBS3=>lFL(sKExIL=pl~yXRUfyF@yfky&u|&nb z^r*ZUqbiIi5@CPYb<@49=ks`C0X`{a>oF^n3^N5=ro^vBxs?}45!}jv31jh?xQ?K& zU_KS<;;3mdlx?M5o~`Gi7+l}A3%P?DqU3 zJy=UtE&c!-7VVQdn_EClyJl@w%yT*ZfvP*s3$*|}jI488FA@LXM5_Q(jQzFmZ=;Aj z)o;Tq$J?uis@-a-`VEM#v}^Bh{zI~0yACEUFF;?6Xh9R&&Wp&lMFZ);z?^%Q4Z>g9 z1b$y#+uK7BZYmQT#Fry1_ks&j5YHcP@2?DDeLOcMLLN(@= z=j4oj)$++FqiD`5L*%#{9*CmVEtntZZ%;iohfU!H=C!+UsHHOUIii}5*X`CjL#Kb!}j5Z4XSE1&+jO9eH9PbVQ|02yezj0GH6Na%9rCU?-lcEchXSAPuJ zxid-4T<)1vCJP$^z<5M+f}A1_;f%I#JCsE>u6JKYTo-X<;*)TJRJ5+!+Eo@&KmhV2 zMtRL^R>3QxdhDK2Es8mFaRdiP!lUVFc{|aiBV!0D_rGI>)QC^F1J3wco^{}2e{u98 z?H0cWbHo?|#mw0|PjGcpIc6h1U{7(1AVk-uHg5u_Oe7<(lpu%C=Y2K1fPVlNO+xp%N_^rBb%Ori1;=|GHXG8AedzK&RzH`K~Ao2 z*J?UAHyzBhS{`m8qSE0g00C3)D*Ae3rE}^R&k&dyG^7HzE;VK?G=t8u81g-nc?%T! zNb2RJ=O!II55j8+>*s&OqFzmNCldwr*lqczV8OT6jSvr-oxwpi=IKk)bP^@R=Y;(2 z`Loi1(ghE6&ecjsFW*1dn=Th*VHa0xqe+8AvbeP)hwD;taP-vaOGRJUhelqpnje!L zD{A`i5v%(ST%4C3O76RNEN;(;HoWds=m)VJ8&8vRlWxvF3Ybg;OWU3ARyFCF`zSml zbU##BHA6tbWJX~}1eynA(3!*i^1)~kK^owD7OelG5%*4L!4fUqlv+<0!W8@Am^-D| zjy)FVRJeBD965RI3^Tw+pG8NXgT)c<_p8}ZRPdxA;wU3Hf16%$vdv}HI!EE*k1T&L6s$0)>`t(v zU>B`4Z!C9#c$jX5553ON84L!2{w18w-h-+?Ho(~vzgmzi z@nhb{PI|}d)cSRBp>QkNpG|WkR%_&TqT0GEimL2gE&Lc=j`g*y-tda5S6$udG)YeoZUjeF?jM#ElD7alOZZ@F8!9T>UV&XxXyIb7qD)kA?1Jl-1NJcfT6{ zwQcmAJ-yp&X~~vlg-!@pLp} z=$D5S@S1j!=sO_0Js|<~P#?(SFimKid%&qpX#5b}`vN6Zn5{&b7lr?1-~s**#wph< zY8U``HF$V$9Squq7w?4&+x7MNy14bLMHtcV!vB8JFI4{>7O;Wzf?GKxG8HWkF-#B( zA|@?uP^fI?+WBXWS$l&;n!sGAHC*=ix(>TK+L|ZPs}$t7KWPbyT#$DKA9L+0aKzk4 z)A40dV|wyzQ?a~=NZ^)np})@E`ifZ%He3Z(u%{k25N0^Q7Pz6!$MrsYyR^4DxE!XB zv;y&_%n)hLpi%&r{#2KRqotWNiNkxYVYuU&Wjsqc?QUBHx#@0(OCWafw}YjrZNR-k z)Wf&tRh9lvihO8r{upps4Z~z)$*6y-^z*)vqFzPw4hzPU6e|4Bw;7CmYQI*e_OWy~ zSq}~IdfP5{sXL?Z>L!BqW}5NT%H?oMMB<%M$K6)!#dZU=U1DAoZUmuR0tT7ps1@MB-C)yr3Z4=g{K*PPpBQ8o?XZ+F zoJ<0m!u7!H)5t9>V#rgESD3kok~6?;a#|*^j(XH?p51jFREu#rw{bnQ5bLB9{@6pA zd}2uVmnttjN?N-*J~)f3j4Zd`z~eH12Uc$W<| zaC3EMU_h-6F}ULNq`3jaDgEGh7qHUk?Z0r3s1pYgokM`ZEUZ}R;m&NO{QYHZHc23N z9xpT!An{SFTw`wrk1%87Tif_Dd2{fMPexD9NUrUhHZcwi7DXnk&~%VZxYX90+@X8y zNUg!1lX2&bZM%m(cLB}HOY?0B#A=-Pg`YbxnhzDLCV>c4=LCf@LM`0pPhse6nn$tRNvh3zE0!Fyk1?rw#Rp);mDtC#Q8$yo=^e(E_`~*$r@B`B_c} zU5IM@bT!=P82=-)9^z%v0V%-^r&Y43{dPA^BMMlZFxfp`bVtD5+2am}GqMZx(%|cg zVBhLzGP4*sUOC)*8~d0KRoHcBhDTKfbN$8#-s8iG4wt*iOB+^vcITRt>Qk;(Wtv=; zXUJKK04X7CclrQsSC2p-K;gvALQTOka$}4y}+00L!geu#c?_}Rj(Z0=4IS% zIF&P-nj!qa_Eaubf+x!zE3<@sQPD*+<#sqwIJ)g?K3C`*XGthH$NLjhdc;(EAZJ!d z`TnLfp>y&-c-#R99%*}W+xmmMPPp&=cNR;Ix-z6&m4z^!UeuaAz*qf$S`S*^x?W`< z?o&}f0;i(F7IG;a8lkXtrXk>(kDMa-F8m2}E*#=|MkiWBx0d)NROQx$8$z-w;9cyW z;3!WVSkLo*U{rq04&dfx{zArTOg~tGyna{=DE2I^|I?E;^4rrP1W&(_N3Nm*9vj{d zl>ksy8z4OP1aI{!kxkQ-)H$TA8Em5hnKXii_ruVYg%t`KOXp_xJTSH5E(PE&Wwl+< zxr5`j;%qV8H2;0U(4b)JzL2czFC@HPfC0l;W&Eu6S(ni$(CbDBIAR_tDwxv$;dbE4 z3u8|xHSV1E<;Wp5r3i>d=BB&ZnDY!TBewA8G^Xpgds zXf-mlky9RvT|Ev8Cq=@P&P1en?LR;K;w$z+p0|04EJ;Q7_S{eLlvoii{0m#uSfPVG z+A>W#X98E#p_wc@w zZ(ldZVIdb|nLBhVh=_ccEzzi85h<_@9|(~hgm#E*H$SZ*LLYVDfJ*7%tu`u29laNix7S3v0kB%-S9O*H@5qH=J^cNG zCWkPF<|QEB+?0pi{XyQT?7+QdJm)yu0$!`DJ($~ljO{*!KZ3U~&20F*C*e$Rv;GjV zL+HubEe>s`x&5uO2A>93?#ouK$q5_k*!Rl$!Ouafsp;yeI=+N;?+m11mvsBsLcw9aT3p^;)ZF>;62~-kUa)CHs0Ax_M?!-98MtmsH zqs|fhbH3Cj-tNeDu1}hGY=*+&QjqWY{3-s3Gv5e&{)$8JQ@LbVZY(`d$A@Rv@#Et1 zusIAFiiju;o-=L8IQ?&ULL9juQqmz~rOAUwa~v#Jzpxw$S1s9fNtsgzBV@6n5Bv@4 zY){UAUIY8a_VY2l-2hvD?LTipI4D}Qbp6%xq!N9YMrK6P zsSX`TgAs@)BVY+tgfB{S&(wv+Br51v=p%pWsSLtxgE8dKd(ZS`dMRr6=t4si(lr^` zbl}|DWR%h)sLp>TK1M>wlRTJ`u7s6sXO0p@4q1?NI@B1I@W>c%NVRKOk7rfoZH@M# z*R<+JsvD!|0o`HxKWK_=1yy#3XqJuKazk{nXyPh~(|(6%q6R|Y*G=z;(o=Z>^2{@e zy1=g%50-ibRV;`hvN9bV#6Xias#VR1C!~=ISquqbm0vc34FRS=L37ctx85usTWqGV ztg%jx?+x87*eN4tfr|I71W{I&t5C4#=LY?=h{;4pPPkjXCRvjzB5+j4)gY-g(qNW~ zCqY9_DG&I$xfb-?OFTS_E1hoq&HQ0OA{Y;JJ%}bQMK^Ivr{_z2D2zEW!fEoiD!i01>?;?S5UE50W0p z5KA`{`zFuZ9>a&+o!iwCEV69+YPe)C;ZV&VLU#3#e5)GQ^+ojLSa%0f&JFB&PsW$a z{V6@Z_xIY}?l(CsAkPTZ4fcM_mroGA_?ColChLK`bOI5XN7zRETEhM+A~}ApT*}un z%T@Q~84$I?l6-cJ)H16D6NzX)#9e-iv~aud7$unpeaa~_Dob*RRRk+advnWxOSonN zlNtuY$5K>hx6l=Y4z5&m!*!i#EV$V;oDf5l@}8=rvsE-z3_dQ8#l(BMi}V>hFsx$v zMPK~Y48Dlj549 zZLZ_j-dFA_d2$_uy3`>rbh9Kx5%}{U>ZK?~St}3}?KzOLZ1=D-xJjsd?3uGaD@+Ms z*8IbOh}I5C1G0v}l%65N2!~IF<+`>YN&NyZKvpL%@J1hj5qpTIvTBW4@-1S`efOj~ zn2su(Yphs@YyKcz)=EE&E^34z4EGA7(2N6Ky!~5g0^`@^+DQX@rnK@c+eOUKX|0Wz zp5AL^O6qV&c=w-*8H{!x6plr0V?M_2gWlC6|K&@#%>?Z$zYGy(5zl?D?Z8JY?<}$yX*3 zgj3CUSabkF&vRU^Vec)o9!Nvh7o;p6&q+aDU|YTBt^TWudF_QvIzBd zfcMUzi8+WsTm23gsNuMitA=IoqHAU_jcv*;!7hi=dg63!4icaH92Id$$SvX(;6xPm z1SEVdH`b7ltd~Gr}&U(J=QKwh0Sz*f6XPp)7 z=6^LW?7%`WJ)vcq4>&jJC2JJzq4y$4RX;$=Ca(^RGM$^ANm^v(o$p_o_0tio>7LYe zQT|KgNeYXVahj(mp)s1PXnBW7KT&*|*dgnDD0_n_nm6*CY{9F>wtQuZyE86?^*wd2 zE%n#CkNGgQQFY)}9G=ibk{%y{adB7L?MUepzc~TZE?l*Rz!^sB!PeLQsl(5Ow%i`E)m|t+}`aE6Z(|O$nXI z26EE0b+0z{z#qsni&P9X7b(;ma(R<3k~Z-?_%nqpv|u$fr!{fWE{dga)$OU+$E;3-^y*6Ep1Y$+GfJj9O+(a7Y1-HhgMO zbf*;7mRMSxZG8U-lNc5CVr7gWb8MU0h8?mDRW9^`k&t0-q1)dgW$UNHK&CLc0Bct; zMF$cbTq!jS$vW8lmxoc%y4Q10Q$Q1Un^_F>m zmUZmG(T}4K(w%AUu9T~w@ZROzc|b_$5mCQ>t&b4{5cIwGqqyCIRAyEU1E&0uVjYj@ z_XFN;jQ%@DAk-9k`nIgiVu_r0xOrTzfyrYplnB{Pw$tB{aqT=~mcJ8%-a-Bb)66s4 zOasjKa{B8`rT^Kb;~(GuOG<|lD_Bfgu9~=yhd~*ecQ0$+N$pXrv~SBHBhYg@*)+}VQBvD#@os zxoze4!Hc8iKXTDsr%6F>>l8h|;nudy*y39M-aLhB#peP`ES+*Z5vTt9O&Ck$Vxh29 zhElt5bA*P*SjqEu;7eI+8bsgVjHZZe9&WFdO_IXMNVf=nT|>xjEFRx@@XcYlmBL`L zVXj#4wKbc=1(4sLxK&-8tzE#_EzWL~5}iT7B@pY;w1JzlTujXl;%)>gcgL2b$iABh z53f|gbG5pJqFSGyrXL&tyx^D9+dK035DlSU z;$y`fxkC(rYSChl9=jgB4=-AW|Dp{QZxKuyQI3RC$i5VR=t{y~JH5(3Jd)>TqkIqM z3$I~L--O2Vm(p{$;e(#|vM~Q~>53qa zB8QdUxy;F6P>zA<`38F}aZ4y-gV9kaiyKHXI+o1$$P?-#>IP=~v?oZuF7aOA>0))R z>xQW&Xb+wK?W}epDfg>m2K3J_YJ}adRNi;s{qbr6JD>iE?vlT$C}+k|B2qP)-6p~i z1I^8e99>C&$J6H|JN6`uMK{uc7YOJ5d$YXTlfXSugQAuY-TsxpV0?6p5qjW;hJ<2A z^im`vr#;O{>o`#;mHC-d&6w2XSHvOz75;Zf8pB1Dpalk;A+eT?rb=hl0B#H6o>z`n ziJ3bkHmSjV)#+69w{0^t270uGM{dmD&*Lt4CBGNs3bEoY*V&u-A^Yets0deDDNdcqwH2NJ=#*8_DMr4G}DaEXlrgE>F7ssy=FiskQaV68euW5 z27Y^P?iw+_WItWRf=&SXpK*^tL4U=LZ4B9w_1_(GdRYn0T+I4B+f+_T2b$xt{~4>o ze~P^vXXy#1o7xH$*P<3<^n}*O&1Y=s+`1sH{r6lnWI#uuY}G^|8q=R_DfT^Ori%9d zQmsd~Hgkw@BBS~ftSq+%DLf+YEks;7V-3NOI(&i~^EPEpwE+fDc;{7;rZ5*o8WVJt z?*~b3|8FzHJt7aifybK-39XsD*m_yA&h;e>wK!^n;t%3i^@f|sPVfZvh3CGDMl}DI z4GlV3?ScrK3G6`akR1Tq3yUri9qhm1(1{^O8o%tPt`wP_+Dg4Xe=eV>FKT7nDse9yI6>^rkVA^@BJpE1KNDcsz9rG!36o} z9ycB@&=mh|^5!4$O^QGFcW`~11S(Il=bLf$r-m=wi602z#{n>DMSQBNswVseORst8 zWw!@a^_tfXT@SXq5zxVI-s{cJ*-vvtl11Oh@fJRiyd#fQ@~&2LCx2qXQbXp|ytoQ7 z--hi-uhq|vI?J9BH7Sb+LACGdchU$oKD*VKdLNWMP4~?uslv!rn?%x(@6yNe=DB4= z#OF~+zwmKW_`{j;SSmIp^YNK_gJR&o%r)!4(=J=!@Z`_hb5}`RSRuGj!gerj?4)AL zPA$vrsBWuNj?WsidxS6p6fG70>slE1DJH7F`W zjL<>^#T$>XYs6OZDcruH6TQsfp%(KzvVKkg#a3``zAdNRWhBnYl7qXGWdPP=o-MkfE5lMgwAj)KiI zFbu*_R~@5ST}ICf8`kgOURb{K_82!9Cr&_>pZ^d?4FN*tPBc+$nUiIyYHidm8XQx> zGio3I(rA6Joq$Ymq=g5Jz)*y*K(f8W-@KFA>OjZHzxSwOFS5B33cQUy<3D!gDyZS_i$kUb-Bv_%mx1$()*DQi;Cm*%SC0{X zZvNXGy{nr=d$9VOXwTQxPGw^rm(B<_ITN+XS*sub1;E0I*?4+V2dB{~KuHu{y}Z+d zZqppsgWX2aRqI;~W~k^QJ#Z$Wg)SlDZabn6U!Wx0?9TOfxg#xuQ5OLWo$j)Km#Mi1 zQn}euwvWB?G!QX;oy@R@3V=1&*)brg`5xAV_x zwocmPy`b>uGee`(k#5}NCrhK4$rz)yJLc}$rI9}P;!xLJmcIOnsWa{2z%A(_v&g;S6dOuug2 zAf034F!~T#t#sc!(arcYEN267uhbHYv>c(u0wp3(`%wgY5D4d%NU9o>LhPO6l{y_^KkNZaU*H2HKFmhhPM)Hix! zzC2CrixyG_mss5Du-M(LG$WkGx_+Q;!Eei}VhnfM!K?CyO1I z?E!d{+ym`BlQRaJY<(nTYVNP0fC7Nmtc^Jz7*7F-MbL~3P(vTd!IkcXh41*V{fGBH zaG68_vXp!bNN}z7_WLcS2p`bx==Y&I$As6>%waJ?!`|1iI(uHgtInwBS89+7cNzo^ zPrV1c07jZ5Xx%=?>zL6$m0=NMLOQI-s*fZksRFO0F^RZ{|839I^t0s%kMN1*%H&2H@bx z-ysm3NJQEiwI7YrB1TFcwg1+cg!g4kj(P0#2GJ7v7HT))rD1Q5@g1AE_0KO;KjZ+u zqty#HH-6_LLFe*R(=d1|Kkg^{sR}diipXAs@Osdx`dlUAY#mJ0#eZK`0f)&IX(Jsm zxz>FlLZaQF0WQef-nStn+nH9mYVnaZ<({1i&n_JI&$&>X)$@FSs)v@+PX$h543G<< zSc>NuM;C<;OYmEb3y+XWd2in`%0=Brd)3a8x3kA_?93=&n_J(0D1b&c@oxfF)Ftxz z3rUo<(oFYIv+{H+MU`PRCJ2CMAcHNEnWGAOm~B@3RSYc)j!eJ=1rE!6H`o4X$Q*G+uWkcOHz5$O z_RMpvDTAdN(>$p-kSglTZm#9uez;K=&Awxb=@yQm8K7&S`K8SOS9L9q9atX!xd2QR z%Rwq-zphttwxScnR0}2lXuHsi(2an9H38w4ON=^*LUN~~U|}4`f$~LD_uExfbwG~3 zrcp-EW(~D<U zvLyHjB3MCyWmJ%031~ZYt!Sf&pYs}RAeSs1UHRv?694h010b`63V+$`t`{X2v$UVHh>0QuBr{9G6^@UrTNR5j=;) z_^1O~3+tfp^9d%K7G@)L(-S<=0nr5YGotx}392_O!W$th(`^9hC$OXwvFC9^&zUZq z$wM?)dK*UOZUqu+;`+lk5K9mv^Fn*j#>|jKx`kFAU-r_4z*l z-&0IeVh;bSvE(W+yro;vZ_pNR)8BKPstYDF;2|Z#ZjS4lf|;M3GsZ4KlB67`D*6_H z#yNVr^`kT|H^CIeOqw@>P` zb&!7Ita=!~1N52WyhcDV*wHMBIHTl1rnLMxDUBL^8!1g&kHfILT^z#au5aV-FVO!+ z_&^!v)zX6l0byYQ0pb6j2p%9g#H^zgE-{6zah$zx2EL=x8h7S zMz=Is6u zo;TDu1+5%3fkNTLszeq%jDiA%@u5{o3*s}$O*olkK8{*ekly4*DxoBeQmKge#kzX% zH$-yj7I{l&K-@MlB4MS*vN1kFMD0Vbl)Bfy-D&u>FoA^_pWZ=LurhQbD=sUNp$Nz4 z^XuJB59R|Hr4YteRO_5l#G7aa2i#*RbMy-=hV&KlkV++Ek#5p$2cyVt+_@0@8_Zz@; zY_Fny{b(X|M?ux$AmM<9I-ZNsAeKEdup^s_o^fv)*Bjo1iiI&AB5Salz;q!2po11o za7`6!C`C)A!}o7b+tfjw-1>xw!j>!8&(PU+Z_uVw@G8awNBtgnuK#I zO_H1iPRt_tW7t@$U=`|rrq_CoIDl%G`FC?x$K>Y2K}jE<(56Mf20e}gh#0t9?=zd| zM6_0%zKkJ9v9rKQqapn27kJkN(vFUb=?%*#Sp!5Kk7P>A^$Kd~+LGHCk(&_r*Y9qd zq#NbkTfA0~$>y1s$H^S(L`|xk#I2}eHI5jE-}^idG+$061Yd22880eWP*y z?VvCn$mxYvf^CWSO#Xx8pC?VEB&&MT(xEC#r^K=;cuozeFsx07$VrE>(~?^=*)X&! z+>4n6xCPG?wS{qk{tkLED~NK~jD47Fqn&IGC<^w3J41@YSVl{E<3?mfFuS<6DfU2& zSU4S{WdXYWXxLs@{*5*hD%OC&VT(btH7UuC2A1P{a6{B7r_P^M?TI4$RqJq{nUBtQ z;c>60J}G%iQm6a)bfa{kq|28c6u`^+OTMi`L8DY;167S+j}#@dXcxaINQ?>cb(+!V zLHqsn8*6rS(NDQE=Oh0l7aQCA@HzZtba@W|wWsc-2t`16+4VMklg27>dhN&DQQ4WP zo2hTNW2a*q{BOA_&Y!1Ag7jeA+%;kkrftgHB-_l2YZB548@T3QAZrUN24f@5&3ikG zwgYF!`Nzjyk#T;rlF!(rvIbpUg1B-uy{98koYUMAqDl;hPKgfDqe9EHOxP~8a|gS% z%HmiIXjxV357?sgF7pn8D4i+F74Clkek38IEv#mHV&7XtΠRpP|aZ3%~ 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

%^kUHa>O3`#}lU0qEvd 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%0ASZ|-qgr)j z?&fR|E0D6|WCI^3Sua>o72T5(p3pp12fsKGGhWF`?l~`FL-(nX!iw5qi@d*@wV-TS zimF0aKOw&0pNKkLS?wdW&B!DS?`V#BtbUR?MXR&U9)>(CHwR@gJ^j1P$YMR`=}-lB zL!@T-wugHgVXF?qdq!Mdnh1KZ#5*}Xyj;vBzwq6=9ld0hZ_XKbGn)$9bRdROiwP(v(o+;EA_rw)+g-(ho5QL00&D4a*hRi0Rf+!@qj58*rch08TYGxz}-tX_YwdRv#aY~~iL!&yJ zqh_JP>nTc4(q}OLHjbVJLh4WotpQK?>k7U;>&{^qqoyE93%_X@pQ9fd&=?@m!XXCI zl1hf{3sIl}k9gaeZ=%$RNY|hz)nvB?IoBpO=&81hM`%bU7d&F)>&Pe5QX3J&lryIR zFQdoqI#l55JTPK}$8#(3gghaN|2#e5sI}^`f%lxVCh#?}KG(c~jlYRA4&(SjT!?)`5gt2WTaJlY~bf-JDx?aBQsv6MJ zw^)vQo)%@FPfZuSbo0WVNkSvTd#LL(cVui>i@5ZIWP05ypTR4vkYzhP2=esifw|f6 zc1$m8IlBXlpQLPD@~#}U(1y8Nsc61mrTWRVQtrD?vkUN6IF%_GxfC9jb|w1cXqad? z4Tf@<8VU)Sju&BavkESEWlw3RrH85vMMV4Ta>!bPG zCMvgBv*%)z(Pgzr6;w{$WiH5#dR{kId#N1mEB57VDPyrgPW~&o))T64($p<7r2A$L z)e~<3?~lJq^~LMj2-pb2s=yFVt^1eL4)1A)=(x`wF97txb{&||h|?!Biy$5cmo=z-K^^0R`Ap0q>t4cC4$6vFcJWfVx8r5nIs31V)) z!UtKv{I4OpFIXCkiX>t-(u_Pak4&nLx-Q#>b$BbLINT6q30n*FItqEHxU-L8Q`)PC zj)=z}1i|)K^{3^N1C?YD*ixm)dH=8s>CkJc3(qrQzcnn!Ju-4jYp3ks_tBT!FSsbd zZN_g?Y$G+jK*D_-H9?E2Gp2z}vbB?xiKv+2ca#S5H=Q&T64R==;NUD@G+g?1gOld5 zKIKEGw5dAG{5c_y2>>#0L@`V%V-IxR-mY^eh%w_$wZl7M$c#V7p~MwA!4ntKf(5tC!^F}xNlVRUPe z_Y_6X>1blW2j^o5D7Rco|S8ar5RskVfnTWcv$;k!4FwT=D;R2K$u;G3hj zn3VvZb1UGYvNb@sr}+GZWnSsa2hU$+c$mJPDDYT*#)?OG$V(CuhNXq<2C$9 zfe~1{@?UfVwwg^Uf-#)}{;*TD%TY01$$@aX9;ixA1gAT~bceQu?gFhckRx{<7WyyInGu2(bEZ%lYE`Id^1z7@7J9T7I4yPrcj9ynN!Sq|%jd zva5qUoBF-HUwt93M@ZcnMjlQf^Q`6<2vMC@#Tiv8^3mQr9_<$ejqw(2$+!YNY`<;) z?TBDgDmc1G(me|vCL~EEfOonGO9s(LO)*=F`sZ+b(V_R7R6$v*gYDrdavqGjm8f1u ziMhQXgY3kfS?Xw0lo57p^t9I5W%D*;Fm?uCWY0!;!&Z-3l^o7cwvldFh&&`(^BDD# zWb}b04dhDLEgoiBGp!%S4O;dqu&`Hjf3h=S8Ym&T+IxVG&hmv&E5cq5(+EXvfh(VY zON-KF;R7obT@t#R9(3M`M&>zTvbUJvdZSf5{Bk{v8x_D{T9O1~5Rvubi%-({k*Umm zds#Tu*@<}FaHsEmcOU{gEJ71gv3X-nqvtvsDMfyQXPfx0#*`T`vFa^~OsY1LIE*q0 z1&&0o{->y6$^sf&s3sw9s0o7aBfZLrdL|){STb0VE{Tdz$*DqL6qM=CbQ2?%vAB8H z$5^X>zR##RDFa*hZdnx|G-Xhm3FBOmkvxP^Tc2+@sg`tFam$I2#~%veR3>A|w@k#B zlPC@&hftePxoYDTDS{yu7fQ2OYY;ea;#97>7{&-QKqgb!x23T_3Ms+L$Vh%@vmelm zIEc-NOvUynViSfwMaRh@H&=RtM_F%fF1VKIVlxSaP^gHGvPAG%AqJKeG9w&Y{e8Cw zHI>#vr&GC)AYp4lRFyTDBP97TjuIM8QoH(5s=4dSx!w%NxX;_#xUdF(*a1(u%qP`S zkQp185sv(y6w7kE{RDTt@Rmo|fhYS0rW4g^n|r%TI9IU%R=`k-j%8Pniu9Xn$$;t& z=rJM1W4a8r(Ez5LwmfjanvCsK&}p@Yio13Eig8|N$o*wb7B0Y7WL z0CY`K8Dw`Y!Q*Oceq%o<_Om;~Tdl?|t?}o=tG8pPw&oRZxqa;Q`s2CsaiCp zf4~#UW&QgIpT~o7p6x!HwGf!GY#Sh!OOvH zz1#A=+-GIcyB3IJ?ZH~d&{;+iOxgtkaB7TILcBE(Oq*cfnCnp5{H&TVzrB$KiE zk{0nZLr=zOSgEi5;?9}7J(|jWP~gtnpZ0G8^R7CBcW%d1T~#XT{OKBLR2UrNcV zX0f(!P+Ip!Tb|hN-MV$Dx>?=k94s9VF~(cIGMilrM}0EO-tcAL)8oB}zYURp8+Uy@ zH1!{o5alYL8U5zgbXShqd6YX0xiJ4gT@!WZ1*Y^}#(votRNA@l`L}gjXdSn5>8VF- z%7T$#rd$Bcoc<$g8uhO(s*Fmuku3}$py}Qo(yP`nO>wBdeqT>FE z{EwfQ?zUmKB_%jjW&q)j315E}JA4@G+AWSnGsBYtxz=46$E&(P58|6dBQvK(LHT(S zO5KFxk29bcYZYMdmd_#C(w#EWqtKlq&M==OAtD{{Is{4a5-1VBOlpQ+4e3hW`985T z<8|MOparVq%uFL9Lc2uJ(umn&Hf+sa)=9>z)3v(usg#CJ(tT6+}#J@a8vh@?bZ;%4h2mxr4^On@ZheghOsgEps8c04I z_!{a87|tR*%M{KYSzDs#@027R?Aao1mLP|Chrl)gBIX_npu7JxSWky_LVUkiwxMZL z1u_3v7+k}N>tFQ~4Z4 z98l)h+h}%wk900Gzthd*-qPYW3R8}A;_0y&`l`bir-#)?Lf@&{R_5j2l06_G5PaaJ z>0d@tYo+O%u1brvwC@s-7cTP5_HRQjUBWtX8dI`e3oXlP=Fsy6#7p*wM=x~}Z+H5j zE&{urNKrzfIkLX`MJ1@!spemx#>&w-I_VarG~455+{ zuGaS<&s?iL?(2`)PUIK(N@tP)=m$rF0LM?w(X1lQSe}5b@K4a#C#gU7irW!G`7g)6 z-eBvTuV}KU(S4kcS`05rh`GL<98j=@-bnD`XZK@Z;Ke?$2QyUqxwb9=_BoTzI7HTu zU-+241MO2VfEw|6N`O%Y7lWCXKUChJ2So`;i~}Ekz=9_nSW#4ZX=&ejX^)CQ1#fcT z&S^wj2XrJq^3V}?h8SF_rKwU2$*OFXHi=_<34?lyVk?Gp*yHnAt0{qPp<iAI7xdUz5)&zS0kIa}iwM^ZCZ2RiT7wDG01MH4_zGO1v_R>_|KyFYA**o#j zNLesJXYZXcPxlaR>e+`+%rBk7Q>n5}RFS+vfMcLY&aFJkoE8n;353v-M2p_E{SH^z zDLd7-R0f4aN=g^@fokG_1YVH7TNXwS>{9fe6>P`Pa(umagbc1bVb zGlZHJnFUD-PVV)TA`*!1Du$^Wzn@YhXt^)O!rZWNN1A}~a`7#6s%%}e-jIJ2 zuA5bP$BW@bFnX_+So)R{8U_yeW_m&6iA)MV#32|-e5W9Lxd;E;?)p#cT7aV=HuU&s zPX;-awrWHRB2%cc<#61slmNz#qcuXPkvK zGi)@7pzH&uyu0%YeDb{v5IoSn$SIaktoZicfa9BxU>`y_7$`9XwPG=i17-l_svq)9 zD%0V9%!fd#6GB6-lF)rDog*c;wPvU)?dapsWwBpT0ivp|thnGz`!G@hEZ7E8XOzE_ zYn)VY3APDM|8l4lyvN?(p~CXBl`*gt`mg9mv{}W3l=Y1+eP1yl=O6w~5I)B@C~jVv zh0{!(VyFpipK5THh^VVl!JUanoy9vbXR&Cx6Tx7yBbt+xGngTa0nn3CNF-dMUrZ+) zWcMUzqmnc*Rn42ZJnO{xL5!wD^rMnK}LUP1RCF6+<#YHj4NUX2I-!7 z_FSb0vGWJe(K{5S`4A|Fv?4IsaVU3eHeTf=Z!WV0(L9RDMd{gi(=w_#Th%Mybje8v z610}efjGRN0=p%!#gv`#e{cjBc$47rDzn5em{gvb3TdM=Y^}rb_t#AAt=T(m48{{! zpKz6YE5dQT%kIefTkAi_^Gq?yQS8w0%80A&V!0`tm;2}&k|kb_PCv19@j!N33!}{| zqqgB|&5h$jb&;|$X317TqO%5QK3anm@jC4yZ-wG3Y|2Cf6v{gYkADFF00FBgb*u4g zHBE*v<3%IhmnvvAu3$%}g1rPOS^*oJtk`AcF>d%*-d^pE9!8H!LzhEPf^N|IyKx?l zjcddxh2(7v0~BY(w1jaS6%+3xDSuu4Z<} zXhEiX+V2H%L2H|v}D{t+?`&pXAj(Yx=l4YR*RTL^7jD%s;YPpba zFl`&S6A=0zjP&AC$FBWloCESwQP&cXQ9b>RhXb*Yw~Y{h6D?e<8DJJ%WRk%{qSW{T z>zN+_Iow)!p*f3?MBlGMOG;>Z&f2bhBAQR5Qzw8FFxyC#v4f){Cd-ya_M1wsM5xAW zrMu;58#lb+=Rl&w?2yb*EOuc(`Cs&S7I$1jmJhBV@Ef6s;?uBV%?5#9cJA->)7R9$2M4MN8NjVzB~ ziVqTTOyPkUpnypK=1C~Z4ig9`0{5jO?p$6%3x;~M?>JKX&=unX6(WPZJQ8s!6{z=@ zKMSG^f}+fs$x3xt4L6Y`HP^1(H9|YA^0Qm2jg{IKvF_ z+}@qG%b+!b!%mAp)+gS#<3Q@Lt%&*kq7Y6_sMQ2RI0VzdYrM>#%?Vl}iH~Ga z=1weX#%jSC$Y`@mzGn_*UC*m=ZAo!vaBZ{db#A7rO+%V|X!2RiXbYZ#_U7`Jp{G&AZS`7Al7~*Bs|0bAd{tu+{U;hvq60XBT**f)&H(NCPVGHGyooOH5;+xvXo0B@wI?8_yV9mfn#zS! zCeB+9_iP^xw>ID)jqYEVn&Ry^X0=424R^$jzGaLliIJ=5B}%Uo-qH{eKyPVCNEL{K zVJ-1Gaa}ov!pIs2aZST$YZ@m-X!w3>iuYA)o_&s%<=y_wWi$IlB>!J*vHY@h_U0`$>#OgKEKk1D>8 z02GHzu6X?CkK!xX9Kh+=6{|4z`aK_zP(1+(bK}K#TA3vXwJJJ!BNvW|) z4vIU<)c!~6&2k9n@_>SxauujSjc86+FYWlikP}RZ1v@`N_unYxWNnxkNQXAp*5}n@ z?b5l-zrPh@gH|T3o1~7iM#*$;KLZZi6YBL9i&TZ{DgA39CQnO?GhB*I*EV>l60yUN z!0?7uC~*1-0a#`w6^xIT2Wb#9lGg}5TQ<-L1Jqv9xIY;POXdG@$)`%b-B)SgEw+=|#iA_Of)-;mD$uqPy8aT10K<;>I;_0`;_SI>&Fhv`pBEXgRqg=%|} za*wtMus*D2bWPrVPQc0EY25@8-A7{kK5MvFFCS0NyPlm24o3fik*0v(9YF*t-U;TR zK(b6-vi-a^!=R^=&}hZgJRSlELXcS5tfg1yA2P4h$hL8QzBm3Am@uL}M^>|5G5$%j4&4=k>MhDJ&Ee(PF4u9$T!F^?y7Xg-o-E_rr?~5PyOE3{V9& zchHvaY>FTiA~^UNyWc)=loSY|cPhq%&d2_XGs6@Gr;b)*Uea7sGg^X`&$9M}@(odZ z!#SOFnc3H}PxJ`~Mx8&?XrdAi9S?cVQRqmpPDDV{$~JR&*Iq4jWdJaNA1~!b7==uU zszHb_*~hR8DOv9TMsOa2N_(SEwXXP2eOBtF)TF+|IZiV-BwM|U9#$+^sepK+v38rE} zrN#d4=pieo7N-oMJDb$?av3aqGoNlbqJhdX=3$u@H<+&;Uc0fY_Y}0ouL1~k`^OrZ zTYeG95bcCE_1@i7HzS@byA3yHE`O_^O&X#wgGS%_f++$q{I|E7jeTHE$FA>fRz?%) zDsgb7ik`o)&DpirSxR@ulgS-YPeiDe8=X6#{f|p2^C+DAB_}uzMd)8&N1CCOhA`0b zHi6EgO%r#558fdis3Tx)FO4jA+U2-7vIr61C**+g{76dO5X$06KaxeBKE5hEA1b`jw|wyZx}c782+G(A@eklv;% zo!V6Y0G91adgEx8#kO&Y5p<4pl1C+nmiQtpW*YvMtdr*ffqRomb(S4>LNs+a{aCQn zn%itz+hZu~Lvnn~Y^0-qbcV{)KttQ;#dHF%GDuhg-+1K_s+_iTl|a6eg1!PZw8Vvj z2Xx9C_5yOP@Xlc@v&V$#FwfdE4%vmEP0YHYjVb0Lqu)s;Cy@}->pD59@kCh{jyUD- z=2TwrV#DfOX$=JN<+Qo)9GyO(I+8{fL%#D?_hIpe4h%}K+`$T zG7E_a`;2BzV68dl+DYW2HMJ|_K;Tn7+QvKju}BEwoDdF!i5G{R13?8P2aw>G6xI`C zh8&&gSmT`NTv1|XYsQNgxqx2Ma0dy(Ffk64(?}L!nEw5oH{!0=)ge1`5a-5#K5}cz z&;2G?$N<&H_tf!!;7Q`d9h;gFOZ-W4VwRcEfi@WirBBJIYG3(Fhp0|F<6&f6`AJa< zs<7>o9R90m{u&g>&KNpna*maU13c}he>PS%(X@Q<$-2nO9wF?tC;lx4f29L@^)x6O z4j}*pO$6wGjn7z^lHBI?6O&k{$6~hQa=i5AKMaF(XJvFU`G^y-&X*DKHXW^Z`1B_` zo#3sS#z33Ea{R@lLI<}O^b%= zmqzv&H#i1Uss_?A-kjRH@*f>dfE(B@iaEfo2YQXcA5)XRO zqEVobDQr5Y)yhv0F5_7AK*0n@J3Sonu~Z}EAI!&fQFIK^jp``ydX6&Kn}CZa^eyHO zD6>M~BOoqWP!FdkW5|RZ&n>(mYGoWSH|rV49Owwt7r>_l6-7bs{i8@GITWgaVelQu z6oz@%ytzU#mhpaKm%2YmJAKmH!sKz-7w3{jf-?8F@!p}2wMx@L#K`U!ifB&0Zegb0 zub|kJCl$)DA2M zDREi`6?u@nK1G_#XShV00z6BbgOgoHZz| z481{A#u?r^Pdw~KNl#}h{O^@RFw!k<&rq{tU{Lv78LD?Ir+>?52H2Z*)xMmbhf!m^ z5{KZmOO&>}VVq}x9Iu@Ig`JLrWJL#KI`xWCH@JcWfG$cz+$yO!9}4)9+>2vwby|sy zMZM=IX2h6vJngZ*WlHl8QRkFiP60=osZnD&vLUgws$ignvGZcR`Qj-uWEf$^8+kwh zC_QrnGX(-eM#GaknPBI{=fxvI*d(edAJ(_D6`3JH{e=1(u1Pp8nTderZcVPLUbC^Q z^*7brvnKpQ3Nala!vWfChe>+qj@c@AGW-z<)w3kM=ePL_(S-f22iF(kH{9b<-a*6u zajg8!W)o+mYO6N!%EWeU1c?tP%IF-ScR+D9cGKsX5iO`V`LQ2laWojE*`D;&Vg zumVEdbH2#Wx4|f;t4)OP=9y0aA1VEK@C6QhAN$I%e#%h=b8y5ST7q|1kM{1ClitC2 zoTX1K5)-95A@ICCTMUiRkj9E-WAoSSlOvW(4`|&1x>PQ|f$^m@pQyLMX~ENh(mW%!pa%WSJGut$7hWmkl*o?e+P&I0C%#f;biJH?&FOh@v1LuL8v1XX`WIB-_N&LvwR6=C zT9Cpc7|l@Bw4W(`Ngn;WIpgeC$Fft+L0{^i(s`ppj?W!x4Fj0ovK4Ow>c34EoetKm z_sACU@JAchz+f@4Z$au#;vPbKUS-YxQ*5j0dmuIDWI)hqnaJ^skH(n_sp=1;sQB|o zb}WKmSoM2GNPk3Y!Tb9Z=Ka4S(2yh=<3J+B$$(f5&E=bHau^FW6sljUb=*gt^wk_P zkj7a>20P*$o@JbCAi5!GeaC@l%RL_-$o4 z&CD18{9=it`IEo%YB&|?*rWEiPHMae;8A=hiToyUJ}HEHgQry+&oAphXrrGh_Z)23 zZO$)xBax1iXz@L1=*^7ViEbilS5U~U-`MGP1FMo|tqA+RQz%Y*v;6X{>5A*DoeK8Zaj}$4vFJ_Qy`!Er(uN*x{Qt+1Ntaj z%t+=yb&~S-E#(>&0VwB#MZ%dHJDI3YpBg4H_H>l_Xm}rq07;c#R&tiUCJ7u-9UZ*P zSG!sf$;5gykc`h?%S$q;_#|Omzw;6D_~FLB zaQ|$Hh!p6JJJ6>t+N7thUX6w*B+0y@aP(Aj8lWVCNM6*LO-bT<565H)&s`D?3?=9o z^RWqCM*HHa8qC&O=wyfr2VTr$?;GWZx?S5@+ri~bp3YfI28BPMaheO?k@ur?QUb#F zbgIW)U*Nyo!~f2`Tkewj%SmCG|Kw zgvOULfpVD;0s(l30x&>MB5={85ArP7j@yQv_lNwNGb{<&+-3u1ePrDjYo(q5j{t%o zdyqJ-ihU5p!Y-Uu*7wSw&i-tfsW}Sr+ig&BlRe6aNY(=$zT1ry>^Bav*4kjjQuY*L z55`_y{Ig^H$fY@Epc1o7C{vt-iMM@bH0VhPOOd*?NmOybUC}yGYO4O&1eN1y^%tk7iKrBLgtzotBYm{~Mon)uGN8$KHRk)?qiO zg(Dlw{@L+)?*e#g;w#=cB-DT78XKbcstUG_hK`v` zwk~MdaR-kS_h6fqB;po;yI(`kM_xu`ZseOAX-z(g1`uBTS=6L@n}>Ol5C_*dAaiaq z<5c3iXbY1Gjv8n@JTyg+HTOWEi$4mt&wUsEp`rwaBx>-&^3nn9nO1t~dKC75!4yQ+ z99EF@+s75E)qc;!vQMQccuaf?7H|V*_9I&A-8Q6(E4kmCBip|;zT`B~A{0H7_ltG7kOM$)8LMl@c`Nt=8u zkyC?<#OQNJGZ-%hxXju-uGnFA{w_N5#{`A3{{ek}iGBE&<}s=)vzgN1gwsym%1b+( zQ}2Z)SJ>QQ-+9WK!{DRp!gu1J*u9X!mXa|i)*R%t54IRfla^4e3Lz?ddhT9!TE?ym zEs?G*7~wnHTbTL@gEkc zEF{~vJV`&>&;Mgj`P5`d9a9(p%>ss+IN=_qW^kDj8zv( z8@`(@@DUiw0{Ma-)kzlocKu#N8Na+Lpq6E8c{cw(xadM_y;BihhKVSe>}HvmH@X(< z`Q(}QIiw;0O}WY>qx}(i2~B?XjFBq%?4%oM145~rCxVYI@~)+XJA2h{PFAHWd>HSl zfLzn%%Cuey)Nevj%8t%Rg%L~j0uB$U64(7VUQUDYA+xyQWUo$T?g;{u)y`le*-EGF z4w$HXxg@3ObUEz2CH`fMBP(@ea{?w@#rZVd-F1uOisN|SntQNs*U3K$fyt)@m0Y7v zH~}+#hS3(=dyQ`>Ux7~4)w*E)Qg^s;wRWGz2xZ_s{C@zT+3ZCB>yMe{brX-@X|3OHr`No$uO82J>Q@4;_P~S$ zj1ZhGt)dB^{%tDFaS1i{4}}wwYyG$Xc=X|v0(>8(^P>rV#tb1lU8l(Rn^HN84h zAmz3k&US+bm%RbC}w^-UnVVt z^VI-4aj=c)5Bi~352(r<$xO%oR}U(b#mED!fAFBk{%qNAfPY4E2zhz zevC+HWN)CNP~*VI0g5Cg&L|>jWkn7IIlqq1=PAG)y`PIS+wU`aQx((4`vQ-iXxJ6S zeth2Lf%BX{6AkAY8l2x7Bsoyi=0`DKP6of!fjjCTMj7+dmKYctvbJgbb_*BP#meX# zGfW95ki2L(c7jL2bCe@kH28HTGuM4|-7W0A@d7%)N$KmD|M9ym=^Do4*Z zee150fcD7Z6T54b|CDC>V)&ZT{7&5kTfjTsYufNEMg18JhTheUC?8e>b7vY#+9GO> ze&3$m8$G@IWoU`c>NFULuWeCsYiuW7A4S?4^^X&6iq|ZKBn*8V=6en10mlGGK3*0o z0=VJ$27(^Lhd?w5H}yt4`uiW~p`@@yyw~(b9zc1^(iOg{RAo>^1KGXCD7CRAx7UJr zTceQOf{JM^(`0JTwTb$4$-A)zt?u2G_4&rr>~4(!lUJsK zu1$-qqVuKQ4>j6BVYAmUT+0O~rE@C%)J8@m1?h~fZ=cU)AtqR$r~b9t95 z`5NecZm3OXx;$rrxi9yfdmVH-94eQ{bX?G81%dU_WnbCQz8@7cOth-G>x=feCEwC# z52q`2Za%uNF-q;Qi#z(!$TK1Vl^#xdQ^W-D zSK^E1@#oGo(3WY4c+K1J1{Ue;<%r=BZ(x-1Nvtcs|_jNe7#8e3IvcS(vgvG%{QA}$-+h0sTT;lyQ?6>p^wHjIkxPro_~`h;WO_sLE1 znvdl%6kM2m8S48PwmiKRoe^nhX_>la4r{qGiR)gXc#l<^!FhS;m3d^vGOoMsTyjnX z_6ys9E`#UVWn6UVV;eS>^DK!hUv;&cR6pwZczeCOID$&E#j{y76H5O4Ic<#L9-nsd zNhw~d)#!#o6L9D0WP?v#1a?q~ru*wp0+`AR? zx=NPiE#R{Nkzt~1AQeqv16^;}MXdKSc~*p7SlP~m>yB$-*k{vgyzRdn)b6&nD8)Wn zxXuY*2$R-*T|Eoh`mL+vl`}9p83rK(rT!1?$=Tg+JyV5P;KLj=HLk*CD0vC zL^=>&C4=bq!zmi$z=3#yHp^kN3o`5? zv_vZaFukgF_%vnppuCzbQ0B~t&>0mrIB*T%^ITeLi_Ha=QX7RgK1vQPYN;f&)U!uP#M`xe^xCxCQik2`VYt3=+rQw!Vb0rSX0tmRHHr);IcJ~C z8jhn6;D{uUUN+$%_o=>LiFIaKBEq0Of8v!u0IOWy8B0KokUNqmiU@uejd+R))o}39!kYJL`#b z#Z55%9U>2#*)7-=TQYa;Zerz4Bw6!Qz;D8U9X0ufqZ$QvBzH7?e!05*j&BI%`62Tz z18o9`l4^;F_dAzuSZBb8CjKn}P4Pd+%R<0In7llU!zhCX3fw7>^^^7Y7;qdZ)l%;y4I;xi$Y_(!Kfqg5{fr|2(YN=O_?;= zK8x=qzmGLJd8ek$vg+DMlsSK1E>q52B_jOPuccfC_hT(0n{_1=F}X~oU>Ba=VuNbL zz}H}4@#*xOe+6L}fI_0+s0`f^=0~rq24V%DZ@6z+3Qk#7M8sf99z^tKU2dzcD#a=z zQ;8nNfF5qwda#om8vZXa=ik)9ZM>`{$WE9nFZEypc<3Z&w7niRDGc^|h~z#B8_+QJ z4(8u!mc=um8asdXFjm$I?8;J8pn*91-p5Y8Z~b6rGyEzCfMI%V)kw8GaCqHnPK7XiQboVp81i8wGs!Wxcztu3Zon#? z(q51GZt(Of;iYhq=fy|E23z$%%Iv%W>{dQ1>Ck<6zs04zfylH4;^%~1+&W$v>cMk~ z%QEm1L=Ly_<7aEBbH#6ss1A6erzI7mBgJ9bAMEfYX$r{NxV^)qu~$SCIpItgDnx9&@sQDDMf+B}30k~1mVUs%$J{!i&2 z#W_08J+bxPb2p;?w1ba~#V896tJ#e*Cn(58_xc77X9v{EsLYc(T|)yNMaAEkh~Lur z>A*p zF6$|JopS>VJq5e!A7N0)qa{rh3gb&A|B=54s$OOmSPQjP&F2DV>QC)#0DUY}pxM?I z{3T!RtI9^a-Xs4u+Garj$gXOC*!TTg7JDXTOFQ)#?DrIEo?6r_IzY@AV>#*uYMJxGFph6HdMpBl`qHdV5pA}sOxBhl+XMnssSyqA zX}GIwHA%%U3QhPH5wz&icF*LwZ`P{$I4TQ4U_V~iaT%v|Zg6c=-|;KR6}SuTwB`-`=~9SQaUYWsbh-|nX4Fr;*?-c;u%&EHqeA|`ap)pd93?%IWo`2me20Ux zx&qpJ<5jGWmLtoSTbZlkSQu#&TshMzm^^{?fVl2V}9CCFKm;=+~Z zb)^V2=UNYZuVlOFsHTKpO)R^SuBBd-BeL|R)-n~Bdau~$JV4Lgd0;X2%w6M2 z4KXUbLvUCO2fFndVLT5@rhZ6)wi3n{z+~^LV`T$JTU4Gb>!qru7HlP)qyb(-iNGhZ z#bL@;z$_j_@oQv=G27K0z~QYM7>6nG3}>e7 z)Tyk|qLolehoV!|->F-+U9Q84!ztfgD{gGYDq)K)64!*5`#Ypqm{UzWnJcVgKr4 z;&v9mVj~*#ZseK@59jnlE3wfHsN<9taAkW*NjSMkn8k%8tqiNbZZv2AP+tFx4C~4* zNJNgHe~76c<12ykeK)pP2__}X9idoRmzc*Y?ppdS6590;WlMIa+%UH>4E3w@;alw~ z8kGS4s@e?;@YL1|kM4!VF^c3EW`b%Gp{{Y&TpvQYO8GVe7e@dH=vSa5!=5YuNU16% z8dm}w-LeU)(=20Mg74L!*atyqUp`&bR+m~ZM~Pi0H^PJM7Ygq~kV6l3ZEs^%Gm}5B z>)2uaDh1GCKh1<>XY^{~@n(7*$zLoJQ-K`IEkb$umYHDzY=hGi+17sH;QTLt* zF5?6P^JejkrgZupV4(EeH&*x9P0{StOcF!)NFqO`qq-MFwoB1lNUW&WD@H|UDG1OV zYuW9*nE9BlmvmfNfgv3|eTWHmi7jvJi}39xC4ZrOSnVaRr!?VrPSzAX8qi)3;Ym5r zWpURryC62w%~W7rYfII+--PNpj975Q@kk+lUUhL?Y=XC$rfE?pua#@aU92Q(3D1sj zP(x98Yv>Nx(vzV1F0@sLP@Pyb>d4HPaRO_w9s;^&xaz$${pFXx?SdL*caS{|&_7#4 zN2(608B`_g`{uvVV-B+^6mwPZ8$fAE#Rz|a! zX0&BqQ)>{(L`5xWuGyNjddqi5f_29UZX^f55@0)L?!p0W5()_3e7={#Jg*c7p_4_Z z?jbSenX0?UB-pPPG%aEf<}$1@iKX1KF%Z@dtS&I-qNNn${j<(oEXZSP?so5&m27_e z4Rp>nNH2IUK?NBGoLi1cR%}z)>u)oAcaM(6&M08M%3W?2UOf8 z4AZoaZTx3Y$XL{>Ei%@Za+j)PKl5=)(+Egzv!R}k*PcEvQS72lx)fIVKzW*IZLr#A zvpr1=8zBK%pl+wbwKLya`&xTrtdq6G!c%MgiDcDnT~%MLW1a&jAvyJ3X*-XvOtSc% zrs%PD8jX=`9_W~7>_;wZ`CeP|^WP>n9bf~-Tu7Vy_1&&;$obiBk9*=aS2p~TUi#zl z0I{CbGAkzYu+h(WMzs}pB*j@2@}=Rid~1X8-=zme9}cCu~{j!$MQIL@tR9`fUHkOFgJ{M~3Ra$u!}5e#)N&JyF3Tvo0$ zwT4;aPUc&pOnLySl&t+!zP5U$WBMdW-HV>_q-8Jle~+%3bZ}w9lf&&1<_D^5`>ZEq zl!t&3HHLa3uyLm1D?vb7z`s3$H@vY)j}sr6c(^Q=$&foE(FOdTocWoGoP8b|s?xN8 z+cfu^qDs8s3Y7XX081mj0S%F4mEsqcNn#tag}r0enR%y>S*uSBvSk@Cu*A*S;pTcG z7Y2DUkJaO4q_EOCw=~fQG?-_Ge%v_m{9lJlKlFU~AtQ&S>^k{Lp|@B&P1rm8m4?ny ztgyLHnc)gyu<=)|a5@a#n%4k&O{OU5bP<4o7T$Dh@*Ks)L6xlJlEjD^ZUTeV zhlVlP9@URFIjJ!4dd{kk3_(Ce^xn3SxK3r_SSOm8a4)VsSoR^a9)d2$$s>EJH_-g1`+&r9)37r5RsS zBt1U|1C+Y3-$XKI9vCw2Ux25mBqk5r$sRW81cb}~y&IMXb0uDLm$p4gPKTrY8>Gps zf*3lNmYVutnJOOh)Y+fNDFRt&qN0&@1G0b?yQ{I_Aw4h`Eh8Z)Hcr4H{?&QvQ-`)t zuQ(>LqbhO+THt2A*$qJKJ}{ z91nEQf;Oh^7_yUJ`^;>jHa%u(pXlA_UQ;JdEYQz1*}H;0p2B3hkic82tB=fHUF%3# zw~;mFypOD*5r=qy(hpN^AA1}e+^R}SJ124gX|*wmoU^7O%$D?8(m4jc%i>1Q0?)8u z{pY#cA|H!wzFQbAmi>O&3mOl31j%7G!(xc(RUQE{oY)(q`ZfGOOMR$eo@P2%(S-b- zIA2ST3&J7;HXUKJ0*k@!qI|KcnLkRlU3{O>o9WM0Y*1@l`kU+;qq$yC0o;=7U4CC# z?q@wzd?#}}jHXd7DCn7pBAvkF_8;~P)HAanyKhJP2_SvloKd!|qY%UFPZ6FVec~{w z2`*`tdsC&wW*IG>$Tbikzmdz^Z0>a8b`ECIzQkb#I#E^%DiOvH z#{mx@gb|*6_SyOTxXIzeyJ$834$GVpLX6jMqdzOeb($5v~Kr!fs;}-M`SZj1HfJdEbjWO3Z8aV}&k@ZSmPAg* z`oZR?dh)nx=CnG2)~R!*;5+$ddw<0Es2ab_0oc)I-vXh&SqM<-e9=S`BUUm3)=07H zWyF+iV;u=ipFPZAx2%i@{^ycZ6BZ|l&lR=(l|e@m1oq}?y5of2aT9x@MNlXNDI zYZjtR_(WZg2g%E)0_+k53(Cua3Lie7VL%TCKj96vSXE402}TBM@Gr;P}SEBAbbYieq3$U!X#t4clARKLh^9 zZ@9dN4A{M~&+RvaR@-JHzvq7JJvDFH&ju$9il-x!LFj;cE8IsNiSf6CD}VhBe23Z( z0=CE~r6%;drpP#vEE;K*PHBS0bsSGb=irF>i`EPAVSC0AN2eL*>K!iZXNkCwVWX{O z4R^^%r6*oY9YwBWmQmt}hl8IL3JdzDDDcRSkTvGRB|c!@75J`TAO@^D*$5GD77GQz z;m6mjjRVIjgJ{-Qf{W~a_B2Y>jr+SGP38II+G?h)beQ^WrQsHw*xQ6E4nK&ZXW;Z~ zBb2=htf3(9nfv$oN@In#`sRU$QkOUjG$YdavZX&^isyq7?4mJiHcw>1;~P5n1QXg1 zFoA-G8CD!AE8jNFL~&|RXe7artn4e=HH0*t;D#|X5M+RLY(OjqsPNBP6G9m}-<2^+%cAXol_RKeg6m zYeook|ICZ>gsU3l%1GU-3|vJMgh{lMQ$d9wy7so2^khb`Vn3%kvCRXAyjgXUX(gbY z6IcJ<7Gp+dB=WSYr7UF0_NNobklkQK0IM*vO~pWR?Y{vo%+>eQtB+!K+b(!ok!O5q zE>|VZ16q1Y+YDxIH)dm3rP(k_%Z&l$8^j1huNINB-efL`?DJ(#1E-yuy7UPes%57_ zAq)eim!DsBDK%^yf+K*4B%ZWkDFft7Fhqjente|QD7GZAg}PU;^5iB+P}qZ18enms3fD5bY^32O@kD3 zjsU>J8LrL8(4_0?A}VmIj8vB$WIJ=NS0p0((}JC{MP4YYIDK0tqkIcyRs?r?x+EKy zf&){px-NQ6U}_5YdP14bcz^#37n^lSZEgH&yQ`DRQN3An@D?ym$3jg1?S>hHP*{|k zfh`)%T^d!C1TdifO`UBq-ZlCzW@;P->!7by9KX>x^4^5_qlttpTO(G0bg~T0i!>Z@ zwyj7K2BI_62>f|G2Cpt49A;KW=nL8);hJb3L#lr1Ga%$K@`)`XK3b78&|@T?PTcuE z9yur?0ZX;^dCSfOv*YLVH3ZK7m^IpXQNFBVNDA$Dz5YP1Vyv|dShLW}D$Y2BvcSL= zc+ub&iMJ6_2?tFPr+Dpfv;|_Nrtw0WNx`a>@;j58eNgcIM&OuAEpr4Q=mL02tn);m z6n|}@;KDSn6x-1-b14kau4UoWQTF@1`&^x&a7eSlLN%sENPrKbfi9_kzH+hX(O=ml z(gJYyIX3~9h*FQC@-U0rmTmS_g1L)5WJQ4k)A!pELOUr4M}>t|$gZF8SVC4SwxH$A zZpct-6u>4NGcfZ4QtD-c;7+haB>rxVNO#CJ^KnIMaZed#spEj``WIAV?^0q3VnRGB zt`euqF{GTp=4vK%3sSx*zFuwq)mzR+;5IJakqXNqPN0gabYD<2jQ|9 zSWf!mjkMP^!SBcvRmfP{o2bw5B!*2cFQH^;2iOFYjA1MDc#&pz0Xk(G+ZRx{_#*Tb z48*Rp8(mB{=sv}$Kuj}Fy#I_Y%|t03<`SPPAXs;M5hmjtcc`N z$3rtqrMuO=L-^(cpg^8P@HFwR`W?&g%d3~HC&l6{`7-Ss=ER_R7Ec&WE2WD(z&TzR z;|iR8%^MLn^O{W&EN!NeC~xQ_ok7?4Ih<}8UL4l~Y^cZ#a!lA(TOF7AqIqO6a)$DMIyQu-1n^}vZ+SvvJSt&FA-_FIO76$ zAD(H%E1#rR+o2`v$AL80)0?q1t*@`5)N0TpE**(;dCMN!1IBlXjnR^Qw~Mz0ZiBpH z{*tO&9#vMqZaMNy*?GAZh=Gs}usgk(3}Mwo!wdI4^u_^J_3{s&UxGmF-7aEH znLI|y6CYZLclUWE0iQaT>lpWS^s}BdjxoSHx}3zJej|*e@I&^6(!gPZ(p2|X_~ zA;X1TaHD$I|NC=UrgQBznYnJsmHF*jYKf;e^MU{}kPY5zzwnU+dD>PQ|9`&M`05@g z&kyC7x9hqFvvGP}qdSIG5o|uU*DI(#^CSs5mfU-dBAn?U2o~Emv;q1RSL@xCg3J!Gl z>U%pEyix)-Ok-dPoCfLqBoTqiL;@q*HRfIgH=qm;`dntWc%bjm{YEq{ZtXO!6(SNU zBf0as-Fw4}jq$uK18Q}V?40X8Co-t1d-&wPcDOuzQ4qpyOHT<;c5Q(LVXQCj7J8S~ z7xYjqyXDf3o_-lxAT15GCp51owv5FNi|WIz>$|GQ z(K7%Chq=?IAtHVLGUxCYw3&F#>9{0LvZ7P!It_%t%ew><$cl0;ew~OD&5;z2QEYrs z-Po1Su9xl}GX!YuaffFF>))kz@UB@~IM`_O;uu->G7luA!KDzTm5H_c(h6IiX}wJ_ zVD!0Az(e8ScN`mdhW6oc>GM1GK1yQzs|g*7TauA?_d&(HTaYNFhVWp8EdP(8CEsEr z-BCT-W)0U{f&rK96g;gqZ#|If+fDtG?`a|x)W1J8tA z4BV@Y>|%y7@$1*m==HV+%@y_u&vFQebIU+`?`YEl>MgDRI_4K#U#S0P9Gs=#k{y%- zs&QZxzaxx)0Fl49B!^sx-c_&1Ex^P-bA12Ks~Gr&OS9$NfplumVRZuDgJzO$elJ?= zGnL%D!GSwy`Pg>fy54aXbnX~Ba3VX)#`S5AEOuPzFEjua(S-#I9UIz^obZ)DL3KgQ z1i}?^wwhCfW*fX$lUtNYrm?qS# zc93y&h(@$07m_BfPIU*y+BX4Oir2aZ_Pl(-WK)y_kAko8XdoT|zpq@nYC4e&Ov1nQ z>-akapR(M=;1@@9)QI*wC)jLVoL9FaVju0xOS-g+;y;F?X?XQ$zV5h19%Fsq zKMcA&`{%xB+mqSh0L+`Psqd3I-b)KAxajzl>By2P_paE!axr3f^~CX95$qeBy};DN z@TQ0>p$KbZPeX!DC7Yk(zTsq?n2)HKVx`MRxv^v-dUkw13v(+R5bl4T$%X9T>PH;G z@|072R)svo<^=_v565rIfku|Va;f1-k~-tcxpJV+=UuUXg&Fqjy$x!LwE-P%$N&%v zTt9b~@Bfm{Kq8kVQ*8N-{)u@rl0Sx$_if0N>&KdVIkP8bQ|76oW3AIm3b_*pjcPY| zJT;N-|M3VtdJO$d&)ygPSDL@X`)yxu)%5gVdHY(TX#t#OI)S@8*!n!f^V7pcad-Cc za6jNvI2>xCFs99LKOGTF%*aNB&r*)PE*Ko^Jr5)2cj8D>B2m5Hk3AZ9&_Y5_9cE-~ zl#Ap8WyBigr6g+iAN^Aa^?W>oO7H=wTpBtOfa5Z3L9jW$o=%?6-_J(;UKZ`pP2zvj z!!VF=tiH27zsf0&$IY}GNiHJo@g>0^^nNUlbng?7%AbJe!V)iUG!`h42QIlY&U!U{ zvHs$arIaA+@z@dX#U^c0Mmo@&n|&4iF~^Hs*X9Y#Dwah~>4$qQC(z2p>sH_)E=eN3 zGgN2kbp#$oWRU3q1b#+O6I&QeLj;L5BB+=@j+x2$726oWV@Im=%4c4U+dw``_QiWu z&{nV?#{S=SOp+H|!K5Q@vtz_V(oJ(cGt!K}WuX2cg z+Qao}qP(I!2;4D2UcjT#dm)^i`Df4up^i*LQ<)Zf15Q-;NQTlJ!~Hl5fwyF`Y%Rj* zZd@|~ln76OLy};f&JE*ATBkz9TDh4wN4}Z!nI|~`jF1Ov6WUJ|T!I3zC8%jh_mFLi z3JitrnqXT}F%!JzIZul) zCrm+4DjuR}(0~aD(3utlP{}xJrbuJ&-$n`7Uv3bW$q11%!?DPq8SD`QZt{;}xs(ns zhs&sv!Q;MxL9y?O$lodTSlWy2vj+Dk+C$%wt#ilhwrJVS$B3wYt`6U4VcnrqQ6k$$ z#KhyQqQ1*ld@s2zI`PFYC@he8*2S0NdZv&|ly`aDe?0~hz#xW_>_@ZB`PLm9W?DY? zHGlscnOiA%g?;&`I*8>#irikaPJQl5>4g*=Wk~$9y2qk*|5WiMbtj=u)o&#D33X#y z>ZM9w_r5lA-!_Y_X>K$izR)R!{*(6-3eQ9l4;d#MG?dY^(Xr() z!)NZ7Ki4T+^Xvr)+)Fll_&(N_h>q8=WhGwZxP8gXb6^s$epzi=^^%qIX)yeR^_a8h z$JIpweInD>0Mmeiq`x9--y1A}(y(LbdQ3%Jeb*X_Ty|q}7Pu&q9^QI;*UqNPHQFWe zZz65%(O4V7RYJ4qk7~@M<`poSEG1SQf=UXJr8Fsyots=NR(~)kTQP)ab?l@jI==q_mAK$l`Z%^BBcEk~ zG(TyQOPmZVa`V>31?zw;d9(wImY4;yidMN8Gg^FH_}AAOjHe3y4!}_B8%-7krr)Gs zu+Gbt4HDk>1mQZnbhn<~L=jv)(ukhhTuBf~LGi$R`bY``+3eR>&Q=K?`hrPZ+`C%O z?xIO9?`b5@?NO6Fa>(iLagc}V!>cK@lhHWSmK|1EOWp*innP4)>g$GKj=l-caYSK! z7X|CqTlc#OHxyF+=@+UQp-sE>FAn@nIe>jfI6q%@bHCLV;QuTN@W!+VvTLUjyv^X| zm+bVj1SFbKP9)gNAUDkXDYd6_ymL_IQ+kU|NozSjOWYwaD1Wft1d%XhtY;%6kf^Q<3@XS zv`uAW6woJo>IRK;7$7QCY+;DzZO6~wyVKjOM386tGtuTYO{be+=K1-#%UjFq$Cm-F z^;PeO-Q}YA~MBee~W~X?cEs={dY;bo4*49`dFGC%hN(HkZ=}iWc0c9zvAA z6M0;t>8qNMH(Od6cMUulokQU*yxBF`@f%T;reNW)O*iCU^x=G*sD_V0`3nhNG{dAY z^M#JdX&t*Hh*7=3N(%IQMFTarOH#xSfet?!-ypIczYGG3uO^@=UK@1cJ22krIy~W< z@hTng`n&qAXAY{!d7RGP>$(D*R*yX7jSL8L2GeK{>V{ycQ!})GFZIk#*YsuH*d_;! zku4m>?vtP=vc(s~O?@-S5;z|{Az^y$&<{lOFHULy4LKt|LlIK+SdQ)^gxjd!F&}(j z0K4R#GcIo=DxH6K2Mv~v1iuuz0<5^75?I*{rvP|7{1I=wLE6~Euy)(h?RqSR#3e;D zIZQ7c42W)iJ$7`!5IVP+-EUAwiqE`IzW zjf7(ov+q1$2TjwmCccD_b|`tzJu4EKkmN`NwBm@Z<1)mh6v-5_o+B`oJ4Fj7bUyIGbaoCk^c= z?Eb5!HiG+FexrgsV+2$9bL8RM;U829w&nqdb-p0?q=Y4^g1Ra9$IPo-h-sBUW~XM#DBI+icJPF1y1SW>`Q zPvrGk-1lA^%1*1~mb@m-(-+SwY4@CErNS9tpM!jRbU+WOFZPv(F>N$0IeX78&VMIG z1a2-aArgLV+7*NTHvWBX4hr1wSNzRa23r6`N1zLMGLjrF>uum)3{We0&$<61*#hMI z$%2~$C)ge*s8wLcs)wf$mcgN*YritS(PT zf~~J@a0d0Zn77hJ5)g4@zxrrLBgkOLvJx<&iaWngci{#WC-c4U*%Np+M<05!)w-tS z)&*ZYtPwTFf#*f$UO1E6vk4TjmQj%}HNPH#0JQFg-g;BPCj%*$80SG0aPIw>um}YW zyd^9Ws8jZBLirs00e=OaElwL2KYDnL8o>Gbg^?xM6I%h{1220k4!*{+)Dj(T2_Av47U+{OoWUku8_MW@jBXJ^T*LB$|HaM@ z0=_Vn$99l=5lYB(CZy!sAgTaru_t0Zv^s8N9my}b8>3(U*5#N|1(Yvf4DmlVfn8EqlL%>&fGWlTz}L6m^Nfy9<+aRWS37&VfgPB|;^L@0zR_LIOl`4&z>0%^!B0K@Cr+MhG}1Tp zhN-Lqe$XsNSdeq-u&&=d-m``5=if2PG;GEFr5KBtX6B*r-P)FIO>8 zWm@W5Uhl>%Dh%5mU#p(p#{Csz%wyh%_kmDGhA@;{&9G;{j<|?Ux}SX&nb@yIs#xsY(GZaVDmwq1w;<5r!s#ss%C1njRFjim_iKe5B~V44CQ@$l zp2WIwtI{<_qn^9DLvN{rci5@CFx3z&QfCQM4p2AauKOa~;@(+^@bQue4xly*xfHm@ zF3!9U;U6>+>Q|8{_EB*>uI{~+<2Ze{7z(E&7*R-M9d@tfM_7u01xYXSw%L1XPNBHr z3roj}XiU@sDJp^Qq7fKfu@(dXBYUhL?+rYE(S6#an#7&3r~o%>Ebpfok7=w1D9G68 zM~tU5Y4p|aZ%pBqP+e1Jssc3j#xN5Hg*D*RhiB@Yb$%(@=`_j}!xq}YdZ5xZ=G{ZF zM_D5HJ*ndmnyW= z-v%2@5{DMLdFgU>LkBQN*@w1Zi+VtpY}grJO4(kQ5)+nARXTKrbQU0e6}zVflO;kNy_#9Prua}Q`%~7u zJw5!_PgrWc?LLU9NFE)j+z~$G=)I`ymiqOtmKTdYO+&3&l63W=75k-XSM%#E+pfxe z<-FH6_bmXmr)kRUsMFeFR_b_lvmINLM!^-8rYE39jjeWiT@|U&sDa@@wHi;I_QzYe<}YRhB#FnDHo9Dnhw0s>sD zSsskIZJLhtd7^JYm=%)-?y{FU4;ufd}zHh!MMi0u7o-I7v_ybN>Zqzuzkl!5tABl5u^~ z?AUN78i^J+(`6W_=ExEIm>TjJwtDqyGL;8RMbk`+epITPd!I0ZfUb^8g(*>9RKk?o zskRz=_#lReiSygOZRS>49u$Rkt<*z9V5dN)(}SqKVcGZw;bA;AgL(7tfzdaN#jXXd zns5HS`K8$yA~i-|ccpGF-|u%mrU>MCJguDfvR>_lOyL3-0#L0(yzQx6g9MHbm#E@B z$F%&pwR*Pc#-+2We?q7vhhAH;emI_yzcw?Kb95We02|qQeOBYgi0=%TRYyqRwH{&> z9JcIesW4##dNq7KzemiKeR{!~9qj9{I z>Bi6Vd9fBRg=&>}Y4IiB_a8yLvYQCdTNPI6HQ$HowMdm3RjC!|s0y64Jii=g_zjv; z;6^`21{=W0e^3Vmk9g&MuJ-GAC~1TV;ou#KlprN}PxS*_)p-6)>9YUtu8-6nfb5Q3PY!b%_JHozCp4ysT#{P`L(7Tl5(w6hbG3 zrlhz5rEbI3NN9#-c{eexFoMGgH!Qv(Oq8i}C|JP!RHbh$Q0=q92qNT*oy-k_&koL} zw`JKyv_n#hJ;Fw$Kw=S}o6Y#pX?$Qf7Nq1>E>H86&LdJYdceCn&QL! zNrB>Ew}=nr^|D+2Lf~OUQJ!7>R=n+HVZ6tXRs7M1H~xz_;#_Xsea}~V0N~Si zokPTLY}rgu6NrkjZGx|$=aKM|gd^n+m4`hFnsieM(HmgC0Frx$a6LR`?f zms1c)SPkZS_N@`AFOxPrHiCN@o<-AzSdx3fq9k^>C2>Y7r*?V3xGtbAuZ?lS7ME_p z298<3a>d-RZt`9KQ)uQeO=&CC6*e~*w@lPmVs0DPbe!>42eb35y+i5;iEd3-|EzAS zzYUzUTu()ipf=X~s%Wj9lHk90ji^cCuCjAXe9u zdv3O_OF7p-kib}Z8gjmT58puF(nNfc&g6T;OzTgb_Gg$!56^*mpK!oj*AzaMw3Q>CZY>K+6MP?iWiuh0w;ki zu5dwkH`m{5)acTeXrJ@n524TkINKO@NpS$K>YT$DA8LA!AeHIrcM_mM9KOAWStD-= zf}unZ6@XIiK+4m^rjE187Dn264mR-q8dGzJe53d9`z)hBRsXu@dpV533G_yIdK}|Q zQdT^?HyWjA;vXIdBqB(I*Ki?ioQz0Nm&my82!*uRpHAF94EnheRpa4IY*i^Aw?wdF zy9a$s=Mr5&u1I2$8xEwMxv{rq&K|kJRC~GdNz05U7GMPVc16JJpM#_l__Y(3OOe2L zf-Ja1OvkSi-1xRQ8oSG6A)>)TT-`pkM#)h-8JM2*p&|B%kRx#ME!NJ2b!HK0I(d_LaBGU*CR6@=cokqvqXyO5w*q_6~}xTgGBjP|i4`{2)mM9A#LIubVr`jguBAVgMh>}hqC>xC8sN)%mq zPSJam8V}ECvy_v6=k?rx6Nl7du*cGPF;1 zTe8jL9Ds5#ImFmq*wL3bLyAJV3ZkPY{1{)JoR4mq23HAvx_&MZD3R1DThDxgP&7MP zdHxjIDZgleTcY5TDQFRPDD6^!5S`eyC=g9k`HdTzpER z{4k4^d@-(cSf*+F9gJ;8G`R+G&rB@9q_&=Vu{6a{!LJq`=#eEOQS}yIcsNfz z;gVefQmDsX1e5Orpz|6UW^#OPD}iFHmt$D`BCv#cS18 zlAb-uj&S+AXb8l8lx;Hk95p1q*-3+2TP^Q>Fn53)tBo#J9YupKx=Y~kpTuG@w>G3u zbr$mZF}@U!hgt8z0<)#QrLpIEptq%{XBUko*;v>>zX5;cs#E1Lu@}@Da)vnx`J`1X z0Vl=?IIzTIEtJR@7!xbrTOcNnyt7uH?@0UdK9mUs#lYflP9+%s8%hMF!&kl!eYUhs zw(`{&?l7?KP{m$Ar4AGcPJwx`&JlSTCAW7Zwr9u--BE*;eQdj!0n~5tDvZKL>I+(U z&^n_B^AMt}9G_rmuSY-esWe<2&OP z0tW!_M*{#L{a>N-f0MD!rYT&^vs2ljq_zmPcPAc)YZZQJ@Bp4Ppy*H@%`!C*{JI`)J zyJN83x^@ECwyAFgkpd4POBn0tgFD{;yFWk_A^4do*Qd{LQ zWk)zcDvusGg*ic#Afb^(=ha4^>=~W;8$rXvCA{2|s7vKlxuyWEabW>y_wPHs7kLNv z+=>mi95{@lf{h9#@CJ09-i+G_Pv=3dE}a(J3f86+v|@SX@5$D0!nw`wFSiPXA>{md z@M5=GSJIJWpQOS%4nNuuJRt0M#*fZWzjil2tFs51L#|=krSkqlb54m+^h63Hm{^c9 zj5{bhxrCZA)93!oFa#hOlebB+(h%1<-DU^G^dlrr&UB~jwp>pIuBrtofq;>plTnHjfmLgh12;^I8`3~%Y=%O>FUVb)0eEz2ZweH-r@e*Y+}mr8RMthBL4CT*TVFa zvj8mN9pQ;tJMiPcQL52IDW#Rk2MyR0OP}mma$dug&wdQ5J*!w!gdT!$F+byk>Xwp~ z*6+h6epbE~ZcYr&VZxFxPG(}klpei##Ppj$s?Nf%7EGWz(sUn%3vgtF=%F$oa$A09 zS}wnY3

b=4DHd4G%5mTKAvMZ0D!r(M&MDH!ZGlvGV4DPd%ZoY$i|-xsre1!++n! zue`W=oF(wDfHhmoOJ_3UKf2;GtC29pMGV$)f?q}_J?=1dRIn4JFml%*#FVaP+Q`+y zG?k2@|ArHCESt4@q(ofrp`yw6|9!#D$T`o*$?Ny2v@F%B-!xZeA$CUP#_lrUaJm;i zEMxBO>Akr6-xH2oNf>nb{?5d^+!$OKJQNLXhu?p^1xQm_;UA_*Ur(*``GCD0WlL4q zInA+H?dLnijf+GT;M~;CzV!&RNAW@3RwFXU@EESj{oA*^a?Y<)qc#dtYRkAOTJ;k? zV3baa2zzOAAc^-CGqv)y`yJ=%%W?VL{J2N2oVM$F*$_&7ut$t`{KJ3ynON??hi?R# z>nI$~!F;j9?xKAHLfjk<{$-3XO`-+877B*$TCuhM2(OzQKJIdwc)j0*QY!aZ)mhu& zTTb;n%c0st%)3zY<_^F}QN5nwI)l#R@PKE3+WW`$@t~^fp%ZImfD&bPL zf6&Q)JH*8x4n-G!N67pqfs12rl@@Mww60-)y_Oc~(iI{mS}ZG1kXt~l)a*v zKwr(Y+)z)5eo;{>+R!T}Q)U*oZ4*|u$bOtq%%U7mF7v*AnvrsiD2fH>k)D4xSm2t| zBDw_EoB>Pe(%Yt{_Y?Vudg!H{ht(3)`%&gK&q=Nob?#@+jKpPKxoYmIF^Ps*<7O`1 zl|-JkUJ^OmL43FGkPWc*V@fwga<3W# zjPC1k5v>0exozdvXGXyFhV&;7*h+21_=PFWGw#d)KZIMZ3U85=nK1C9_ zxBd#qSy%gDo1YxbF1`Ul=QUiy@{iSZZhL?o`{(hB z3;sEYIo?>h!H!7%>c1}jZpx1EI7@sV&wD9?8oe6s*Cx=Wm|j=N?M+cBIy8vSc;waf zyO4Z#)YehHNKs#2Z+EBraN)lfu7}h~|IHOwi>4hNcS*(Vlp%_VXxQN7vFmykDwVTD zm;&+-ms4o;R!0~E-nvHuIlOFthIJdaeW3MVb&`sA&3N@Ttc0a0aX8nKn$o{&iTRe9 z7F<*DMLR0JN9~6XtEy>WQO|}x)^J>zT5))Wp6<>I`F*o{UwrifBeiBYg-g&h98=4N z8!VSIH-^jtyY?Hn3sJ;$b#~Da5@Eg+c~=!+PVCn75M*| z=QEmD&Re61e>A_S*_ko|ohX*tiRF=tn-L(|ISEAJ05?`#v|vPW$15JF?g@jIkA3cU zZ~*Z1QkBWA%)bVPZ?7L+zBv9K+1E+C?<3K8-2v2%g@}gram1rN5zO~Q_^pCIXP^#u zrORE=3DfR);VtL`xPk9^C6q6|NU(;|L`hzP_25_o!cI{}Y%bhFpu{P3DBaTCFXr~r z`^q_=(J2gJ`eQwveprffil!5;_5TotAp}ut8nut)hW;H8jaS3zdQ=*8(vpJmZ% zIAcR4?dUdWPhJcG{w{Nm`TTs*hqco`(R+3$JYZrRAS5x$y&)_l6u%&M1n_$wOAGz> z-kTlFS8aN`UCWaSaV+-|9#XDBdRZr>j%XjmgsM`0|GAIFx=oZoKvUO{sK|k+MPVq1w%?%5U@*a| zQ~t<3RzMRJ=?eREr2WcZ6wN5;+@;&I8M^@^QtW#LNBOW=1KcB|1*tzuSdKpcySd3c zZhH#!gZl+clrYHTn?^4Pm*I7uHvxP&`y8vW$9l48U`Z9i!{l&-K8kx7a;-4}3+Xt> z5z#3CW5iH^<$19pOzQiMy9h@KAqXDc;|x#h8FGTioLX{>3ZT1*?4trC2jcOGQ1zDH z1c&}oUyd$;u?Ci63dDvLOUEPNNsvgPd?u6nw}iU|i#c?SWgnVU)=!eXk%lEB%;GnL z3SC%+6wY@&4$a``I$?(;Hliy$wHewpvkGAxIZ+rG>7vp~F~DR<(9`S=o9~B4u&~Ra zZqMTh2yLF?DZXo;Gv0UfQo~$5$}#DPe6}Ypy0apA?ib1Wy@~8iF4_bpG*&MW7vnN0 zhSjF4tfz%H;Y^+$H?8p0^IwWZ8MRBE@van3F4KX`S67Bza!W1s*Gw)`h|xCIo=Tbj z(~}Ew`@Q>dd|MZTlL>|~4tJNC%!meF*oBQGB0wKk1gIU^cozLzA=HbLdZU|UohnLU z`hWO3$L7r1E= ztkls-s<8AywRnz!odeIteXXC?q38mpB8|QcpITUR2j!AY8k{d!)S^n2R5iq87~s{s zXz*x7$F5nB->sxj}qoZT>aioVf58bJuu&O8w;{s_{*J3?4THld9Bbcb@1Y$_5LkxYdpI; zcA!nl4)U&lo^kNbf9F6=NPWCI{_5tXz3hvhzz<{9U`h=d=GU}uwpytB0+5=lYmIQl z@gp5gV%YQH?smJZx(Pq_Pw(cGh&GJT-_dc{pT&y{!e@Ij)}09H_^4kfrMbGMNax66 zac)w>>+Jy(*=lBR)LuGCZSUz9kLjkvvn&WJ9QR6man=r4bN>5nEx+;(9Syzo^kZgt z8$7skzuD?*hH;ebLiK@{n5hJFF2nkwz|e-riE4#Nx>xA+1}#+nkXgYM+$GEUJvU)2n7S?XOV&k|~ZTvt*!$XTDZ=T4T~SMtlYN22=}$a@7p%(BiP zxftzzyos1-#1b9rhf73PlXTDa#zGe$m>>9DuTo5LHP@EsRrOY=M6$_hPzrcaPe#^$ zx*}E)hif3_lsX%(yLHNC7o5xRjpP*FcS)DFJJoEso?++$lO9~<@Y5cb=AAm1T9{Ot zj0bwBz;sjvG}M1Cf2(~WI*E2_Nf0)#hPb(g! znmyJ?9lKp{^_1fxribac`wo&}X|2!+`Ls3@=A;*uzhP{Gk0!wX`Kpb9Urz zQA1Vi9n?i*MYGE3kNSN&ce~}VDuA~|LeNu%YrO^6S^!Uwf94uEDLvVISx$$pbzdyU z@8L|Q?^WcKzUvqBn0_jdHG<|cgdl3m4qmA|j4-~A_e|!cC-nLyJ*bcRW z+BzMFrKUfs<;PYU^V&Sl9Ky-STlcP8N@m^SV7Ek`;BC6Sj>wM~Mw)eGrL_#?UcM-P zbTpDb=5)J{sT5<>JJy;XfSnP@@iF`u$ReO{r8?wCgxO#{OzzA|(>}5X)6Ccx2H_eR z-_wUB3&$*}>><`#wP9w@E^vy<(1GFZ0z5+h$>LwY8hIY;B@b!MRP6z`Fk73sTx_Ui zn4Cl4g*juJ9;ud?s(eF<`W_uuyYx)P>RR;{*S zw;_h&%h78j4WThnFR}*Ex6nOXm(V5wjUEz0g#ZOOhm$2xrmj&Io?P=b>gW}%mMN+* zqNM_-($lk})HZl(yKg==je!?~qjBmN3;_nn3d<~(0j5%{ia0)87)v$3Ht7~{Qb_Fr z>B+v-s83f+pfBu;hr6MSZ`dBX2+%-zc3Uf~@~n=L!|}*Q)&?35ns{UJ`H8*uLH(1husc(I-1_mh1}@gURcR4zrhnG*BhTwF_pE=> zP`)Frlh|MC|4b1Grd0(a*L?T6?V5vpZuRNsJQ;R7@T7CGZE_BE>tbcoO&=4jdm6u` zK{!{N44v;p!6k(YD@Ln^K<6>wVtQWlGq?mu$+*B8A;+coRZgJoaX$OU{DXbblh312 zpd=su6nB^}b870{VSKWu-?M7}VDIWr1)nGQ+VXZT6G@;-u238p8#-j%MT^#;qh+U3 z$tu#FLG{E`5BqDA^5d@us4ApW@NS6(g$)mq?!N_yR!pp~vIt`T;(RseqP)2tju&hG z$Cm`wl6s2u*s`DbSiqDK&*hE40?CR%_FMFChf8W#hIfg%D{F)$b5c!;^`tL@U5$n! zJ5m@-10~(n39sLK^4sr(&J!fnLu|dRp&0I~!80M%r*{TD<8*>!V787Ki{l2Soq6Nn(S2 zoFmpVd^(|ZX_(o6S@I8QlHy+!1ZXM~a?~*35CYo=REW5oOXR0zF}JN=mW>#R^=J|w zJ?7g#G>w{`b+YGaod2Amym!T;)bYK>0%j!;%viDNsji8FiFDW$_MaUk(XEua#fQCB ztd|K+Sn?ZTSC`h;XfMS=9bdlYQaojhTdre3C8|1nKjNB2>+{bk3k0So+fPU~r}qxf z&Q&E8ixewB-<9Oaq}Qp`*F)I=D25=0yaRHlzgFyA@LP8Hz%JK?>jpNJ!?q2Ftar}d z(Gi0lxbt@KYrWM?=(!lKmxT}nm1f!PKs%;wf$vTE{;xjX?)MJ&o+=K}du}~G+_sjf zW)BzNjh-A~{W67=Dxlt?t*kq%yiRoC)2m?&YdF!oaTl}@x5*y8X|}J?xUB+N^WK87 zLEeEQNuUDO1kdtj@23yA!w!GMYT5*GSQ#v3)T3D`ap2u8kl&$)YJw{M+yy-+g)|2aJjUF>abERFtic1&y8+HY{7eRaKJ>I~yc zYL2=sbc3I4!az= z?x*4>Ce=@Aw{Wkouj761!YHksJc<7f_L&=^CAmwsJmI!`_ycAJHIL1og~F0+l?B^w zQfDUc#zyq)QJR zWus>N(bH}A@&qg!ljk~On08{bV0nw_1sW14IB|I)*&k%je@Ulcg3_@_t-?*s0AMKd zd=ayJY_DmulcMM)Ek}ei+!@Wf&_(=m?onqR>h95LUn8w0XJ?%?Y-gbLcHVGr8>f1) zYyD6Zc4eb9F`&30;KPWO5NE}?xv>soy@$-(USBFhdLMChsc>5rWoV=(5=w}eE6U(# zaVrFTaZ8yGtPD=Zqw<5)F?&yU5PIOt?!Lx1NZP(~pZfDmCS}XIDOP9+ocGMRr^hm* z8ZULoPKn*De2EzWaSTZ}S66l}&pyc}lec>&cX7;jtK#gpnU(UyU9GtSdf9$mcXEH_ z1^d2J|75$x4B!m-+xyZdc~ZnJR?Yj;7YK%lJ&waB+qnvdRRNHcQ)QDeS+ZNhVJOf{G1;Do1EOABkw~TJiP&30@Z8`A|Le_PB8#?o1dEVTH7-W< zLCex~%p^=OVq*{fQ95OkWB=Iy`M}|b>mJdbN1`m-sSUV7F%Rew_KIj|2k-iIw{bWusLOw@ zotKvmB{3xWBTS+tx6)UA07Ej|1ds%I=JHPjg09|jg6*7YoEqo8q9^$4Y!iVAimrSo zEtl6ixJcbQWt&PqRYzH|37=3GpljIW;$Waz%$0+k1t2V}*+ zpzB%Ykoi%3W)G$9ut2bV(Ugk?NX}#IxBcDt=P;?jILHhE;;2 zPk2o(+V&+*UAmg+eX;>~Gfxp}8!b$Ot1Rure#6)cuUY3b6oQ2sn7hDok~d0#>it`F zJEx_)O5MHq$Lhp6l&Z&U+m4v}n$yi-kZ}a4>`qDcr9xt68G ztx|`Jp)VXSWlRw|6v6YA*)Y2! zp0R?>LbBF6k|5>2Pad=}gqa5-;{zN8iR?>4*dim6A@c_^p3UfLS1N>o!xbC7^W={j z?c7Cx&gmc>ua1*2l^AkGiEvW1r5fTRqZ9m&b2OXE2G0O9{|ADck?RCkjBh}2$haNs zvS^PJkCUB*3-{+FYBdYMxMV*o2FW3Q3w8iF$1CpGHIjsiU3tD~)B8yvyKkHk2 zY{b6?kH@``4x#6&RqS+Y6ZM${Nh(F{0iNC~=4-4GHGO3D`E zA0)lDtXp+vqWXU!y7^_W8AA@ZBYrCE8S@NywML6z<8vq`sXDrs_NGXS7%$<5eZC#7 zD}N|uQ_K^KV=aw?_Q=>YEF!qO?9}n=%VW^CSIbk-xb*qKhWUmj!dgRjR^Op?iyN*) z10Yg9x}xehbPuI%F+)s1=-5|7dgV+M>1RoseXUOSuGy=$9H2{(jIE8|yJxA_F0#bE zP(S$VKir>0j*Uo;QUdvs3G?_>Qq1l&YD;-s(nSQ9V}9%t*-NTitTZYH9ribt9s~|_ zQ2u;~7VDJwnUsyd|y1fSa!_WQP<~2D;PNwg@67>^0 z;$-YnXGE^OA=@@6UD<~ZI_Id0CvA4sUd&|>9yH!ToRsI{kJ_SiUjCPl8Ca6D3byT?RbJ~A?OO{2vQm#wR_0Y|(X3>%-_#MiD$yBB&{Q0y@Z@@*7BHO3 zOR?!CCxoHHt}YYqo{F=wbe{Ekcjf)m6Y@xKLC-O9m3vUt)OTJ^*kwN#`&-o`rpUwRXNCYaLyvf|W7vo3jedG_q}die@pdbRrA=G?icv|qG0 z{nJz7qFbpyp|e8!L+O!1ld@DZhdsTflnG|^vrX#wI*Ij?YIdQ6pPljF9Wu!L`RP6H z7ITnuS1;FEwI5uyCZmd8MXi!YyT*xM5wWWxvm%?*w)j?5Gn-QMNsvdi)H+9nLK^WP z5eh2hk5~X#6p?vohr}Hg3FFBgOm6I=cX!Twh4ZxoZ8=-8gldp^IJ9bmm|Uqp%a$YH%>XHao^nj>k@(V)f_I(1z9635OI z?-l&hjogAA610FTqMDBIUSycNIY0mLk%rOJ-iNNWH6zx*QX<@@5w%vnmQGh#EuW=a zO|S@0Y*W#XG)(iZD1w#;*i4XDP?T<6kiTzq-)=RabAPO)mXkd%%YJK zT%VCL?yGvd`6ho?0obm6ANsy4@Rw>%vZkP|RR7TFhF;jHq8mg#piO}x>{WSct9JBR zdL?|yaSi-~vC?tH26RnjI0vx?8LP1x-6lw>(dicPWLE&;SS{4S~Mr$+-hnT1fwxE+I*|q+mYV zy9e@~K^Iw%+CUX3VFnbjAVk1>#?pC{xLQ#T+HW|Y_4%U4zJ$WIJ^Ni+Jg;Ys2sT8R zK-Pv(yh>gvM)hg0&8@rqeN*2ycJNDj8!-(#Jqpk2+iCIQy;>TazN6@IC^~mHKMCjO zX{6~dACNj;2)Lj%HApErhmQy+cxW7k!(M2rw_goWX!Z+zfw%X@&kC z(%bS#P3N5tS(RhW;-*DcW-FCM@T>Xe`Ce#+0y{CdO^pDq2;+L1`>rk#eq;!ZAnJSh z64)`A0E)r5byTK1`7q4^S~`VF&7@jTje0d$dn!lk>ZJ~w>ZbbZ0Vz1F8?pZONX=SP z&6iu+^2Fj*?7e7xgs{?jQcJbkI}_QE!~DAYT5?wigpCaVlkzV z88>c0{N|(&vB*BlM+13NKywXgwdR4ix!6}CZTV5{0?JLpf1G3Y2f;#+5bk!a6L~u_ zxK$*$uAEQEHI^XTP$@%ZDtNdm(QfWn+2!wGt*(ov@fWenQc9QIIkZBMl9bC}Y7i^P zb*2fKDC`j4-ON9v&h~u21Ds=oD*F_JjqqO>unEv6- zU0UH-hA2hV0eRk;Qse8QdS~FcUAeo0=+=mHwfPc3gc-4OMUGJo4D&?uy<)v?Lc_Ys z{kCey-Y1&g!M7;CJf`ijW}vx@S4>C%yT)Ls0DB6bNP^#b?i_?==rhJkRGSd~@;-#l z1&3tgPD-4Z)Jtv?42M{$N8T`0zeaBNJ-oN8kWPDgf!RF5Z#kfEZQsm^%tg}*R#qJc z7^%5?aFB;3Kd{`S-cE~{4w?SxNAwvKbZ&`8cj`D}rDdH|pN^tuiL=Z! z&E^gti;i`XhP1*&{@tuGqh+bkpIZftSe0$fsSk*@OVaO6Qk{X!F zM6>AN53lMsN(#M3Gv6r~&)9_uZx$`!gh-UG;)w67Jg(<9ojs5Q6RD?nL60EHI-@a} zHOLI(T2x#cavU-O_8JxOGzRa`D?xtML#(8gEwljIX znc~y{VFd=KM7506if60f4M26dL)+1NPu7WwoC)m%*M#la2AsnQ&EQ*>k6MXxZR0x; z$7xBX;b?-{xN0Y!E;ftp%t0WqiOWS(z#ZEPTE;3mNHs#Nw_r;5o17oW8<_H!8^djK zK{+xJmAuku#dn*bp5*z*z-)-n=HBS*m}Dsw0`h-5A4egq-v9pG5=e#2N%lhg9qnT^ zMdyB6m}3|etCwj*p1y;KT8u(%u&&2r)jYAnTB65)rQnKoAW}KWS9ly$z)K}fXuLgJ zeH|C^a!(bGWJBN#UmoA(+!~+fWk>p1qSLC{P1r3%nW`*XzFhR=^Wy-nKB*azJn%CZ z$0^u39RD_(CmHTAO|d%XA6S9?CmkN~$Nj&-{=NmN)LkLOT&Uh+SuLAW0S$&?b@OpU zT7}d0GrKf_!OYSoN;4toJidiwg+IoK@=V1#V!Q!f_hRfX5zRi@WPp`qgsqhN{FbB% z=((G9Yl+lpb}EK@D6N}$^XrQtF%Vw?iMBEgX#4y3EIBHzpWEJqyF!ndPsP=aKZBnT58q@v*+B_|ZEy@9^X_}tI< z<%M2O6MB|yX=~MevIS4PjVX6^%NCpri*E76ku{XIWo?Wr+5OR5a$AjoSz!YBo3cP( z$Y(YXiYT95HgI3c*r|A7=*ApiGccs_so*#J`Yhh(feC0ST5YSP0!q+yFpKL+G~r=} z9<;?I^2q&|#9Bj73RM8y_!jQpak$K#oD9j}LHYYT8>qf%ghzJ|5bM<`F2mUe@!gZz zJyaRn*s?|!GW=i1S#7Gf)ZA=a>s(#DD*FDm{*CVQm8lwxzG_XiiG1OCpj#ukc%v411zj`CeQQp{L=z0}8hRTZ^5eLTg{By12Po2oZB; zBqpv*xKu`f+&7BYB~Wv-fuJwqmnU+v;B75}G3$ZokI#=GY3n{HGl|-I@(rQy7+{Be z{PE80@b5nj?a0WN`709p%(=G8mQ25B_oJ&x(0_C|lN+X8<=%M}Q6B@nzH&Cynvy?# zi|fM5TGDe1+d?zfvxv`CQ21RBcn^W4@|nr~=m)x|gjwNoYgX0+ zD}UXe@D5c2kvQ2H?9?9gyWDjrKRVt-skZbVrT#XGab=wsW7jD`fSzK*-kLXFQDIv$?K}rVx zVNr)8<1ioww>(<;()n>=C5QN77r8ik2haa!W;61J4dyrZs7Oo^ZLqMd-0d^Rq%x3w zBbq$hvS0#U*HAfD#2e#`>qq3v`i6Tf_xpe?%Gun?#H8h;RJb3qhWQ?@qrW`>m;E;P zUMt(BvuX7bq^nSnC)-$N+@kR{e#M<`dZ?6#plr+ z4c0|2PC>%=62v6+yeJ`#hBm@0L6(yEJ9*1&o@q|TfLE5diO_8IqY%FrgrbkOiC$ZZW-#Rn6Evi+vzRTHHmWBT zpCCg8GLR*wBAccMfp3COHE^&!2rfx%Vts_}iXIV_Sox{{6E!ztpM9fP zX!ewwn95Lac}wACXc3|Cu~<~5-2tw&QY1oz(PGs{`4y(0OayOzf!$|Hsp%C zmj4|B?$t)Do}THk`}^4P0Qy<5tK0v%(>)yexglXHg9HW#doynLfNx+LByq%TYy-L^ zPTvi_a)bY-DCZ;-4;A5e({1Ac#u&1q^r3JA*x=0a*!W|F`MS(!TGCPnhr1V^GCKA> zx*593BIEu!p_zg2m(^g0;CN|@ES&;@pwS)jmb5YXq&e$jLeXUCOe0^uAP9sShe z#Zbpw5UigQo!mSHRGjPhi^ERlVIOH>xZTBjCZSNF4V&EuhD9UOB>k_!(HTROvL0b);|Bf}YiDw6he$pi9f1!J9W zYDq;PejhEll^KoPixYy_Qy`2MlZKNP71VvEXI&zMpas`o3$J*9=~*b6 zmlEwUnIecnueD=Ywcy^eGq+Gj*p6d*`%NaHu_EtyTqT!+Z4B;));(&RmK2wVMe?ip zK0@UeIC+?_=-s%_Mx2g&nIvCazzq~am{&s=fums3c(2QQ>;*XbgkMuQE8=XNeiz8} z`?cCi+75^3Jl$IrOlr3PU8V+K{C8-w!=)1WZ&fjl5w*I)QtS?`RLC8}K`$6 zlU7la^4N#7=&~0Jlum;FcZZ1e{ zsJ%dN*1Jt!1x4~~vzSlPnv&Ocu-@K>kqMOt=#yU@SFjo?@X`92#CK5k+L@enp06>C z&{}-Ytq4RsA2N6v>&9j2bLbj9sCR9_mLkM&4y4_umH$o<3`y@Ca~bN5IF4^_E${Y2 z)(KdHZ!FdlalFm^qah+fN#P?Ny`uPgy++4^kWD>;EUe&nt|f2RM$UxVd?u4GIJR+z z7yTba9;Kz_u00M^S>QkUeiWzwfVEW!@w9k{I$EF)ugj%eOa|DVbR#aBLI1^`c!Qxq zX2)hP7qg}})(q&H1G;9}E7{+$Ts>?eh$~mdLzo8o&#AJrjBK!L+rOp-OKB6H#fdr` zBR%;7yjOiAgnuo{tREA&*mp6E=LEYD3nwzal*&`7gX0*UmXxR{26b>gX>DSRA*XwV^o8ENs%H#!6U2J|lJM|&#?dFNe+Sq5rG|Fy z$LpK-6M&m)n-di7j{P|&)P;Fs;lhca=3|6nWZ`({5uGI1R(IsIVgQwLD;J?#VjQru zCblki?514pu%9bMX#+3{=Wm2)%+GZLTm_T>2dhbhSj zCnJR2&eG)Wtbw!|5zSvR*11=_>7VMXLE|>#0ex--#I`{h__o?Di{d6)lu=^wZPRc_ zcDa!H@AQh*<>_+K;<`WC!`Qj}R5A$$Ip|VOM3%M(8WiHtsZc0Eks_;^lP76oxmpin z@EyVq;4R~NZpjcv7;YT}+47g~l^!s*W+w+oGD~F-uN`_%Vm(QG4xvi8nnY(>-zU+0 z1*8vQZc_<=Z;;M7L4X9_6KPRp)uqILnwyYTmI8ea)Tpcb4!y$&nQWk^|p4LfDeKA)6`d>_R%q9HT1Fm!r44Yc+G)k zbLN|TqlNdpfl}{%E#_pl2SyxC^4=*@lv`5x78%g~0Y}M9tILA6d@QIDbR!}j=mYz^ zhR%$NdS(2<73f|)ICRfY<$1sm8esungC59ZtL~Xz6oN=r>BHv2=k>8a{I_>{`{Uu_ zHEKoP-_wi5`~GbBZ=AdzA*yZo_I@XGal^;OayarQUPkJs62BOVWsFI)S9&c>q);w9hFy4B$W^?DhkE}rv)@2s*kqaEsL zcE5WGGs=>uJRGiiUNl3S3bu!Tn$yS!!-ED|yT6M(+4t?+Q4|swkG*?b*bErq*S|i3 z?Lo#=^{*HEcLHankG9)yQ(K#IXd1 zar*g;ruBZ2d&(+xFL=U}{vaFsm_2%zi8^sDb`zANXclu30Xc!JYRJ{QRo|;%_?^gu zX$A5SW7;Kiym9-PcxoI%H*~gu=aBM3{l+-TF)i%kVYO*>KkA7G`d!^GTHeV+tSc8m zVR{JDvnT+kg#By#B`B;9)F!6Q#5+=KawPZ)^ESDA^?G^wyGhwn&B87wmXIlD^s%Q> zGYY8ZM#P@heWhqZm1NB+zCL(zW*5tH_Ltw7xKxH_q3`=)RSj z!{2K_=l8}-IYhYd{T`@Q_2@{!jq#PE$-4A6zX=uCzh7nZ2Dv}W;~Oga8DPX|y%ERu z%SM1d6VJ^#bawpnds+}1eLXJo!RU-z#EzjZGl~w4s%T(V9nX%qzy4357Gpi}DB=RmV2+=3?&Pf!eDm8Z+38f7~%Z{5xit(wM~qo9kz`Ce`MW<#G(rAFLYHT`f=kO9cV)8*AF}=Rej@Ctm3I?O*1|Yf^r7zPpd+D zJ0v~ptB+sG3UrQ_N|q=jNvf&N>N4jXEjV(>yy-ZqQKfn&B8DH?3iRo(8O&lL#Ma83 zD{_yOu2s>DN-9#S3V;j2K7cHV54V+>ebfh=8bg?iEdV4IK6o;b!nh{x;Lb4?Ox!pF zj}Jh1wWjV!`y}k(EnrSae1wi@@zp%B=lXI+?&m0@%esUE28|HLfcEd60%bS}irmDE zV(@~qb)ZhnRWME*J-lJpAMEGyG?SD`FxR z15-Uh_+bG4R`NaRJcTPOO~p76cgH>-fMuy(UQ+5wVc?lH&`hp#%x0KX2k#Yz+lQqkb#HZz4)Ub*Zk>otXJsYbu2OHz0DAy4k(1gzV(RCBs%wI#1* zZB5mf4a)O|EC;7!>*6aT5*_~EMp7383p3=_lbafMRfIrdmFl4fmdTwNr6`+uu^|wS z@u)-e%}9k{QSjRz0B_&q?n~x_yV=%w*-$pn562I>^S*nTLRhA6BIY8ZI&h1&SKE}V z@B7unA%XdBnpSyfHf=xO-UY4^-Eit;LLVM^ze+fkX+`pBH3VBFoDiQ5WG z_4Ea5CX~kO#yE;r>#`qiZNG;MW0M=*SRm`}U3JkP+0r##-h?pCVSi>esM54sXsftN z|2Mog==?y|cy$e#Hdrf!u#xT{pE8`k&I>On9!}g7NnK~=ZP|fDwNV1e{ZCV7l5di5 zy!4rBWZOlm?4Yp&5l8`t=HrwI;4iO;LS=3`A(0M#*{O|LsHY?n{l315)A3sQ>+94H zk4Z+hD|z;oHO1__6Z?)C!J;~=zuWqM;e#6TH$~1q1bZ8mJOHL6f`_$w%m>82NInK& z95qU^-!(GI5fUpwSrzHG@ItD-FLSPK5joRpA?(g=F5hO2j~Nf!J%0@ zcI{QCRQGF-!2C6$i3ds8szn&yRQTI4ea8pdGtTglN;+4fwmX4-`7SU;r8_`3XXzho zZinIz*_pH2*fkltJL^8Dl&S-N?_rYJE1}j-@y_6bSj(&|0QG3Nm~EJn`a21g)mTlz zI(xDYBv_`c|G_KghYuTi)3UY* zDs^5C6a)UxM?eLDa_)X)AWOnix`B=lsB=tXhfrt9-P;2its!_42Ax*0-@Qw~;Gue= zL;1(xFZS9I6Q>4^|c1Czj!iH4xx}_)^ zIUGNYHu`L94*L5{*w*3e&NpEs(z5gSaMWk6_rD;3xd%$Q8Loo<$`(fuelrzDx)J2`bh@=1y-AY-J%QK~U&8yG>qXYR`U%X!3SoV z3Hv;!9VoF@3)2Nq`e)ds;!%xFu0pqZqfvv-Oio9$euzhI3?RJnwBGL_{alWjB$(WY zGm4%-SM}quN+Flh&Dy95&`v!{B4sYpnu(g;efiB(2}BLz@Cz(0<^cc{`d@Kp($g*&0#7ii{@--6 zK#L>{9H5O}|9Xjo%6Mt2dpRXq;z0K~Dm}mO0p3eCL-^v!8Jru(N2o9}re*dr#fbiO z0#4yR1I(0bU$s-(m%tAJ3kJh_kV1pdoGH6J0hv+{528bLTr1kGj`;@)mW99!lP2=h zZQ9H8-kJMT!n^qo4o}y4^tGjTd3rY$s*0A|v@b=PoE{^FQ`#>Wk@;|EA4oe4= z&?QWiKdd?MSm3`Na38}*dFG9__nCd5bVD>;5(~e1yytj7;||c7nfom>p3@!1Ht=^< z`jC0@HW05BVvd6G)j$d073Swwjb|aBKu=^`uKRA$#F4-I0>p#uwep^V%=qZPsO=R+ zhoVFwb40YwHfg3E_V4YJV2H$<~6I7Ivso>A%QMtQ#E0#N(^G4j@pejo%^SOH)ewRQp^Sgovm zR<>Gmg-=*S&6!AhwtB~|MkxwVtC!%lGOIMKbigD@0oz-1owe)3_gE&?PP4efv7{<^ z)|TWx$|cG~!Yqk2bPM(n%Z!Vhx%HMs_f_n5p)q4lGk_*@!)Gz|$h}zWzj|~?2G}d3xDCUN! zlgo7~A}ZAyCPo@^^WyNTcQ^J0hVFqDzI+8`5wtx~G?{gG!x4-)@v3e%!EP1{&H*cX z8Uo~;TPf2Hp!c?Fq*-w~yLBYp$O&pv6HZgR$3A@8#8`zv7&*!EZkF@xsvS&NZ_^Gw zlcrt8)u%D*%gwv>a#^s_(1y4T{CP^1|~PAlB`gWj_G^k`U% zT9Xx<&{_sQ$5*7aG@#bC&VvlXF~=M#zaxxubjpNCf^l;sJ}RKBI+rQ`D8Sk@)CzB< zuK`Loc*2UdLQW@N{gcPW(zft$xkyZ-0IX1LhI5n|HgS;xf^JT%ltnvJlq}P^iq_h} z`7d+!5O>cBGA3-KyT)8DJ!pg)f#@+$O!dJ;BBGa`PlL7pDPVD06tsR1h>&WdnH(;Ra!v@(k@aZM9 zC>m#mcn0iCx*Pf!+t}PtAa??^P;hF@4-MzEYcNGlS)O)dFh$dQxMB+y$>3>QuW}b+ zK3Dkt&RG7UJ+i>1X6dIyk@#eTnjB};7sm){io&@3 zZ5rl)rlRKhPkDij%mluG4a!>bCW4$VAUb=kZh}4<3**P1$5K;ON^%@8X50cpCobX` zI%}DUH(xf(Kr5y~>r2W@Iggos|1HMjFy|Bed>h#nFjZiiO7$Sf;sjmyWj;2{3O-it zJ<)5(VM)SKCc@lW^+#S`6{A_0234PU~=Urh$@Htw#P>U-$j7f-Uo&lyhLs3Wo+{MGYl z-Zi@y8suwjbq!zz`774NjHAa>DE$3R#MnFFh|=?Tkb^oMK|%^I9RFo5TV)bn&Z zvt%Qv9yP{|D{cTn+!O>I+$Dzp5((PUxmzU7b9b*TA_A2+$E3so;antJQQQEW!8G8N+yzT0>{QIp293o)sM*|_GtV9iJv z{nmBToUvOJXGV!tou3Fx^$hGMSAbQZq#E@*Rqd26`*{M3QMaa}6X%#ZU>U~i0oW$`FOohmWr{`M_JCQ5UliUM|N$T`@Rtq)J9DA!1+-uhu zM37TW&9Xzjf?WpaTPSKq0}>h1Me=m;vTH%|Bv^p@s{F!U>wY=RdnBe48708788eIH zTnUtI1&u*;MLEaU<+Z2+xFhQ2WQW*#GA&)2d?%N}RV;jcF|6)dc)!NnjtKhu+K7b@r2bycXn45mM0MNpa^*B1h&1T>s`qm~cK z4q4L6lI170HEGBn>n^(Nrh65nLmW&NYu#2cb`jsR1W}dABo^`CF_+H5JoG8_MKW<6 z`?~E%dEFdzOYRr1`E(oZtHWl_>0ZM3NT17i{p#B&A%R*~A?csT6$hXK6XxlLk(hoe zmUV(SH|kCY6u-bl(aw;{>Zkpk*Qh4gZDL}|lRX}%Z8+A}HZKMbyDkg-zaiq-x17AX zUxRmNz4PHNsRk52P}M@<&&_u^cnS^%)08P%O5rz3gD^q^+S!L=!e|?qCsf#DW3^I^ zGM0e{`|4#SXnBR|hbM186l3i+l|$XwL;%8>LJtbb#|C}ju!2Ts&`xJ!jbLI^)1@F6 zHax&YE4ky~fcEf(B`32|WAnU&*m`5J`cayNCpGTFs(e^*2QcrHK>Qb?I0JJkxFm2q zN6+00-e0AGhgMp#XB1D)+|=ffNdJ77v$V>wOYZ?>e;xD`KW>#AN{5||)Cxo7SHmk&4> zIRJqvfZ@j~B85T9&M)7_aKBOpljg!zvo|iUxM(}vL~7k(%6o$bVu@2lpqF>-4B|C~ z{oqj=^%*O1=Tl9^bNv)LHsO*Y9^#k9jgWZ@%&!ijlGH~jqn!`C_g_QFJ4zqW1Lwr$(C?S5<9=BaJlw(XwUJnennU*F{3 zWd4B3>`5kj?KPjZCU@eR9h^|+3j8#F2|aNms3f1*HRqxo-~|#UUa4W^QdLr@k1)hJ zR2rq6ZhD%6U+h5k$(0i;w~(A26yiC-8ZzqJ;bCO#`*p;I8}jolIA&(h$KVoMa#(>$ zS7P*R2le;%Kmj_I3xt~yL1v~%$he$~lmUrj&s8+jd;`n>9rxy4W*sW~?29^=cN5ix zs8JeY0yYJ99}aAK zhL9VMjy-1V-|0`M8e=Hr3r-f{@@a9@sSIomr+m})GjPQkWv(s1(boAgIVFC`TSk_P zG<<_!VB^Qp9EJkNm>*+qy^dniW-!lS-ihG-5>iKk{9n;AY4qCr@|0dku)kEeBO9{M zV^N3)dvI+jpa4zsAGxYOWSzharIa)-f=#dczQj1F?F2bKOnK|;Ui+m+e_&*y>s%+4 z6Fec)bGl1B+392F+^9qyq?3kF_;o7mwgcj7Orlr<}cf zudZs!M_;h$FVj$Oa^YW8np$5RzVNq)w))6A@}8~2?8{If)3n@5yWYEB@XiC||2aoz z9Cx}#{^8cQk1Rr@t8az2&ov%z5K~aQSxs}lVD-#ZZ5eww94^jVMyh5b`1d{G<Sm*AFXaa3UKfx_!A#7N4NzpP3q`F@?EO11dAmd7e#h+pRS`v zNR74rL$ny)Z}rNJry97$(XBHLF=bp=Rv3J2)$xp8zCE_TKXBX2FGamKfP>lE6|cXp&DjAALR`~eN9##g`IW6Hav-T9TL}Y1 zP{$NkNe&Ou5#ahvQLtA;3W8C_0a@@L7RfCLQf(7ec&;MiQHb{RD)vFZC8jK=Dy-3t zbF|7X%O5^xx-{%+5%BXJB*tWUSkCD+7s2$Us>XV$1^Edjx-5%uW%|3Pm}Qkpd&)cl za^a*!Zr(3gpl}*HTU3_WX~jdBl7}H^g1VJ&=RdX+k0ZWalqyB8`w&5X&gbg#FKwBL z=Vkg<6LEc=Z;!k{buwyjEw|c4#=wY{b`3-9tSbJlJ2W1oFfEn>--NyO$d`>35wYaZ zym*F)q|BFt6Awq=6 zJgyogVlKuYEB*O2W@VcA-J*J3SWY+2O@TY98MwJ6BWJ}S<7Am#tuRAi)FY@um zm`?EvliC>=B^9+27#pxxT=cJcO!!CK;oxE%JD?;hZQlM$8TFF*xpEQvZ-;HFmb9n< zYaJ&%MBScxKSIA5VnYTFX!Hw@$=5DBe2`PCehu-@B|Azo_2XwJM^`s*m%pu-P15K< zmAe9`i@2kw^YE>HTf}PGm%3y%?~ysag`|)=;PzGReQt{7!`%Q7+I2-SNuBEt7;_xg zFCp;xJcI;X8pXDC=$2N{4~!il-PO1E+2kbRykP}IKP!woxtx&*sH!sb=wdHi(Db~uk?mOJ($w-*$7s)~7NB4TYXx=?4gv6WmtpH+{$pv=s z89Q?{9a6ehqiNgW&i(Z9jW>=bOj=}rsHD2Vty$jh+EKg!f_?8pc3KjvZ2X3dxn!L0 ztJk1WwXQEz@UY9oKEzNwsOM@o!99zDPdrV;^0#(YRM=LXw|1FO&8ulzlq{m~yJC2p za;l2$li~k9l=xFOkEbcfG|t!txT zT8H|sL{mzG+?6Q&f&K)tRs}DAt8@6lA0Wp5F&`vY@=e{!Pn%IkZwMEqGzN~W&M(Dz z@W{JbC>LdIkaxU~vS97Gnh9dB2?-4!wi0mKj#Gu~@ORy8`IrYBrF;kI(gwGoD%WbnOcY#@JlqH-~YfdTcZ?&__ z(vXWYXhWC#Z(Bs9=S>4Cb+zKK_X04=Xp@N; znO-BSn{lSTt2GT?%FMa1PKR^JGev!G%$D&t>oSCC0Q%c#Nn-@cwp%_(lF@q}^l? z^MW%)yCvzf)XtBHgU~s}!OoXa$wEYZ`;bDU2ojXJYjKf_yLR1A@IhTrrKa!S?$ju|AkR&E7dNxPkQ8DeSo$% zR|?FkSrZ?tUTMG&h=fzOZuLPkf|#26uA5o?6cK?|^rFboT6Rk#33_uG8Ja9kjb|ph z9Vo_akDF%VYMs$@qBpOWJLF0PZeR7n__Vtwl;2CWe_^q52=zrOa0~a}e z!H&LHgapJOeHW2JFdV6HNalfV*oqyKd>I_h4gSE+&7vyOHim19W3+_L+bT&9w@yy` z2;^(?H{l^%6m#M}Ev1_hg}c*)@d%$hi*&<5vS`IOt0k(KiWsMmnAj@k8^5J=B7AU2 z3)XsB?6_ZyRFL(UwiI07M0*b%Xj3o$3Hd;%hZI6MP$1g-o%C2&_Cc{E7`{oczJc|j zHCj~RDz~kEbe(vk+lh|9XO;n@C7{PlVoby&&p~E5_2$P4X+Kog#rSB+zuWoia|a8Zex>>pprBtk*)HZLlCHEoWnqppd;w$z^Na)e-es-qtzg>2=?C3}Ju>XjMP`-tc@ zJBYA5$}Z)IlUXR}-^lRuAdx`O>HGq>6jp&n@A~z})b&G7C;s^fBu5azf5IGxRQ0Vp z;~lH9DHUy*HyW|fpBgPxN+bWK&N)`OEq#781|wjI$-7HZAN3Y22;n>5t-J712NE$l(7aQTr|3h z2ZV#+>T`&}bw*vko(HXgwoJ&}RH|gYm&WhaMs6j-tAb=hyO4m>4sW+zzrB!&V#LP~jv8Vx zT&vqQ4+8R!!|i9<>P#U?`=*=;`xBxt!{%BwIWEdIw^;9XH&hs^NDq+4k%JCcvR% zRJfw-aJxiSA!Y()nBspJpsR(IlZ-({V;_-uC7Xeepe53%5!~?4Itt#fGI2l6&0H?M zN}1GiAoZv!%#A=LN2ad&lA=^DAz-Dh8waGCI16ux!Vw=A;&T_j6UVYaTgS{990ash z434xbC{AMs3enaXp9mCB-27{}60g1UrW7E8T#Zniji$&2E65T#`R-_oX zA{~Gkur8As>c{U6hHe4()?vyFqN?fP{WzmoE-H5HR{Y4DE#MiQk={B$Eg?TY_gAOq ztI2=e%--S8e7PH{RxEonp^?En+u4gbDgY;IEV=$BYc0&7Du-&QJD=65qrFFnot=k& z^#1uro*7Th70zYY%+bo}rr4oqG~Z{DF@l|T7m{b-zZsaVfQz*JA632U<7BWbY%SW0 za?}p5j(TdgO_%Lyw&eCv4UJDPR0q*5r2{T5osw5#)kx?My~E4_6Qy0jN{PS}ibm=` zTIzus1IUKk#o;OGT z@l|Xim}Z(we8bCA0MgOB@!Ph8wkWmPYLO<6em#Wb0zAaloTlyHwDNMx?lB5x-3S=h zn&(ifR(5rHoD0(Z8k<$ezAoNivE-3C=;!2babaAWoGgVMQ1BoY>P~Ii-nQw{I?NUd z_1$v3drOD5aT8B?_zK5%((|q&gW~wEZp@OyF&EBnWF1ayaEa!XGn%cL&p4c9y>8$u%OMhM_t-#SqJ-)?2DJO-Qp+(1WSEy`CI#;$XT~a zHT^U%_!Z8O?oF@EsMK}2?#{*8EtX}`T59$ME0?)id&7mr8P)D-2woO(HA6+~vk@`Z z5hX?u%3WDb3H0rX07!Aq=v2lXT9xuX-JY>PtQW`%&ILi;VLs*FOo?Ias0rwluC~#3 z?i=6aKsJ@a>xM0A|GIpOvT`?C{|SgjC9RhZ#%B4{?5s$_Ej0+tTL4d^-wc6Qw!C3C zFA%~)X7-zKX#ykwXV>)5ig;Buj%St^{+B7*li7jjZ9hob_vsOtFFPdlR|x~(i2w7L z`#Pl3P9S~>80^B2&~(KNB25;;G^j*BBfPi?rz&7Bq7 zJg)I9Ln|Z8Ks|YtW){kGIwvvu0)I-}Qikz1WGqmpFX(35qSY?9Yr5}js*KUlw~Lb# zt6c4yvor&!S#I*(@_l`rOxX}#=?lGDD~s5(Gv`&FrEmMjm~-Q3M^?>PmNT`&#hIXw z-VTl_mA3cGFL+9<>F_J@^F8hbVFa^QEW%^6HIyJaZm{3msAIWn?=~(_sXd@G$u>;7 z?f!u9E|zZk#`vWAvZwa11}FTyYCvR%7@fKi-tvl6*ffcyqBd%wzuI>&V4Knp&OsxN ze`;ri_rDoNJID({CH?xIJiOfe*_>Y9tGVXq^%)gZ5t;ce?S_VEM}UHoP!QmZ18^=h zfPbd1R;dhy=FAK{IeF9x)WJN~tR?DaHeLGJiIgrz=x7WU+~n4ux_i&iK@sWkQxR-D z^ziUf5LlGuvWXl`h+g)$$a4nwG80(b3ML?| zwxqbq<<09%t*)4$+#FK%rE&sAJhtv%Y)1ilOw_wL!PMiO?=eOes?wTlvr!beb{i1P zvBPXv*56J}eB-MaEgl`bTg`*w;*4QBttm8tfq%iI zc~`w~mcRO*6!mjA?A3n&?bVM7bI~7Y%F_!W90fNS>LHrX%VG}Ouu+Hl%`bwZQTL{B zWtAKBc@=+OM5-{TQv?=L01q{oq(m>6f#bO`Pf6_9?3TkwNsD^5i@OhFt8?p?o~w=p zv32xbN*9}WSZ}O1}hBZ{n5EwV{W`GP9LSr&uxfL3;ITq zVus@e-dlPfZF(1PFs+ytb;eWpOW>%CBYpW9w0H8=!AY{chapHX{F)=~AgbhNYGI(6 z$6`R3Pa%TsoZ$ zOVB|=sPpf}VBuMS>o_l`ppkRpDQcfZE|@YsUdSQ)BO&GbA*vnGX4Y9dI6d{zeE!6v zs5&%tDQF|HoeEEH4~h;3a5&8Ly($XcIsW!RfD%`DdbS5?C+dr{jg6|$#2oNi>80z_ z%xP6o|GDPNwz*i*=P%lZ&6zVcNSoX`G$5l;uVD&twtFM^4zIm87}H+w9kqioiF>pN zkKb400DCgI0cE)GPm#FDkA6O<_7+Y=b*zkc{ojT?nZtx|@yIFTWQh2E{wVY;zunn? zwrPKXpf0n+eRJL4ks;a77tm>Vj||SrQd7uL)ws4-FVCr9NPf-P5XzGI z9US~jCdv(R!Vc~{JZ*Xz%A#u5WDE2&7R44w@0v*gp&-CJDFN@SDJqPy80HaHy#|P- z;mkSaNr1XYrT1-CBt^8D3qE|t1eq-;-7Tn{XleSK%2jE#1B3v^@Zyq@{9k#_w_0>V z2e8c$i=s@rfyeg~(eQY`3T%p84gs(VGdg>)D{{rJU3Ulw=V0WkwXw67+A9RUGK*be z7mYE;^BEjr6tJ$Ur^bW!ViNB1m*xWBg|JH;b6nqXgn+v}=(AfJphZl4%(2f#s-m`L zZ{B#seHY9iQ* zw6WAqRMhHIe?Rx#Ru7fBp6uLRgqx{rIt3>=!IZ=AE-cqv01kaAX#zHnre|wvs3nCq z1&-SeU-mt4%Rvw1&M4$6u^AX3GiA+m|dwjaJ#_f5738U)XZT z9w6#cAypq8+08thDOWT;d64iBV=aH?v(Q1EMTER+uz5d_xW$VuIpo%(aXJeAsBbrh zNBDF4g`_QSZGs|82_8uD#7my_TYaW!oM^ zV#^#7L+&lc)K12fR4jOM?PWxXM#e*1?hzcmP8iqB#LO+bVd)=?rN(~!daV;Z6`A4N zgi1Q=HcC*B*23R22FO5?(m5#kGA0gj0@@AH*LNppOGQP2wNwF*Wtr)w&2b8@Paw74 z4OZEnizdi?I&8FnP|KX(*Hg{?9>lwcer*MN#PhCK3K02fS9giOX>!f_Q5|Y5ilu|cd6c;;wJdE=94slSOLIrFA&7^2?As;{8)VFcH2XEjhqiwjMNLKzR>+XUxEbuyt0fu?-K7B`+mJffl0N>#2i_9IXTJN zkHtmSl$&)gGuFTu_&u02O$dP zVR+;$Byy)io0b#k!6>e3?>%@I80yS3)Cl3L9?52^2XiL|^}>(3avN{2q|%M!r!^g2 z%bb5?&$Stu>s;v2%FxPU?e9I81Ju{H%f7ksw&xF&6_%W&cBviXn;Uu*afpM#Edp9o0$+(mA9icBp0@5o}{ zzP7dA=FyHXFKtwM1QK$93bzx%ju0=2l^*9(#5B^53kEizN!ohh%}v_{0`0OfffN}} z{UnZ&N0)ty*tsTt?w}bHywg7-#da2XVAmv20Rw#tAJu}Ru%P9B6^r9uhI!BN7bWjC z4_$KBvn>A|aMR)S8ve#f_yS(@8${Fo)!odW^#qUBa7+-|PPV=|_Fod!?Gimpl(v@S+LI~UP1n9E$}FIo!(uA3X2 zRmD-60mSCS3O#B<51KGPpB?vx(whY1I%iAs^&1#V{hsfG9xSM5eeCeNWk7Te0Z@^f zNuRTQkve0Ge{9qGMO`>u1L79#nWih9ZykMtCVx7ypYm9ypnUwt8tnUv@EB}bfEB2V z%hi3%5|Kiiw9lbtH{v&ruDkLfqu=x(GYtq;+9O&T%FI#pPo0S@b@?d!$M6%(ZZ~UT zh-(J3UM84fHs1-9Di=#5Sqe9`tr->Xx9@sLe8SUEQuS$)+m0`1nV4-=vR`yU5{;nO2|uL1}z#7fr&JljB7!9WsaTZ z!rE;xwzGvA^owGrb>;5k)f#j>t$)s^9@#jI#J+-1&Gp*sO-#geAmqA1E) z^8RNLY3ZXQ;yL-cmKn%VIuq`+=r?J@<(GfStTbdfJ=ZU>(W+S8SfjM1-&4$8%UZkT z$c`7YzCNeB@jR>Titu zmu60qSpL&6GE{{O;LlU9X0ojF)mB3YCxa`IDR?v=A&~JQ{!{oByQ-_r>*7Z*KQBCx z<@MCJN$1@+!XX6tYbog8uO1Z&xUF*?p<3_Kl#G z@p1jou_JoAAF`6=$GWxOGU5B!)c*racxbIk+NjG8>42EC8LNblf=iaMDZ%AhIT}a& z6LPM^rWdSgIjKmRe1ri`8pCQFz37s*+5fC_r5G{}cLB#ZWk%jpX^zbOfIyu6+ehUS zsN7Z=A90b-?)9GI_m?cyoxs{<{KDR~Jit+a0g$Ns3X9K?7y73S+JcV$LT`t4({od= z(F$MQyp3yS+%AIM=mEM1tahnjSZ{7hcyjXn-8uZDW@sH(%w4m_iBjH`%m9-2ZBSyC z4aSw8QE;mi7~ZZ$KZnGpYTm*!-VC8#dGp6_qeXtU`A81NsGaU>nSPJTGku103y|&l z&ygA_9u3bfSZ7S6q7-yd^w?bpP8e&FrJLQxY6KQd755C(!jOxgq2O5b$pWO{qWdtQ z=S~e#5H21cKfa;@7)9H^$|4$jD`S+Wd zz;B18+4q}C?)A;6jU|o%|eEHBJ5x4LhB0C zW1_K>qB2G5pwNON(^N)7JW8txoQlh{E-%ofJ!ma{q;>4~*X7M+%J6Nur^CJMU|rdX zJ7{L_ZsX66!E&JT%*!A``l4;@*HLDpzpLcxpieG%Y>+9-{%Nz-HQbPXR=_G3SrW!5 zR*ypWc#IGGPto*9aHgS^#9=~nA_UzyCk=6*rT_Rq4MKioTc?veLFjr& zFRd6KO+bF4s+T89A;ee5onPE~_zhIKL^0|86GjKE68_c8pAjll9IG2+EH{(Cd+p@X zbNB8cG8W+H;tK|@T@6NkPv07snp$Uk)JjMG zD!*=xkRjOCPAO?`_LJ+&&olwkXvX74^sh+0OU^Vb*Sv>737%3s8r-M%aVW*W&*WO2 zU&h@@aLdR|+=Z!3euWtSisU`y8qaeJnHPxfM#kvv^wvtgu6(qExmbLXY0ZlaNwR(Y zFw?Ry3rg+x2@$!r)dTeF4#E~N{TZOsX}VPyenR8q;%c7Kf$;Y-)t=QVIZ1$K+|VS&*qH}~3O+6#INY~H*V7$K zTj3TE9US3OS_W#{Z*n%F!u9o!1C3kv;=`W@G$GTIF7CTVZoJtGjy{A4@m>Ezs|Z@7 zlUm&~^ocsg8T&q^fH2CYi>bmn;(l|O@d`MasNx?SK8=?&hkk6>BjCz1 zooezJUcG=L%r|UfbbhOtcU4eXWWOCZVOeGd^kALcP_T5C$v;`DOm@vkpB@@pJT&3$ zcnkRvgt=5{8t5Owryr_!d7`nv?D44D-f;j|rGu+s3%T%V0Wdmy=q}{r$+z5Xk(u0# zq}NrRRf%7_Pza%diXeP_mGX8BFp4^wkwp7*a;yWwU=W@k{Qa|4zI!q}j)1n2m7JFH zmZlk63Hsh;OML_gMtsj6JVdy_1TNMm){Pw}toN_{?ZklD2c7YNP037wz5b(g8Smlw zrcsj4yecOiom>iMxSH4vV6demBne>Ab)cx2GA)dMTPP3Z>6N(7UnjYq;@NiCB5ueF zqf&mLIU;PfkRdG$o9_^&Ped_QXH>N&`&CbIORS;hiwizh{qwlqxw26t_aREYRcp;= zfI+lZB#Lu%1Rzfdz~-X`yA~1T3cM9S6)(?x#lPXYLiJ^^rW)4EmRIQP))8>uJE{N5 za6>asgI%bwk-){S(p}jfqLR+V5aj+8b3f-ewU%%1TcL0e5EAxL=3ARO75YfLvGvot#)&6rF^knM%~TwF0qu9KTFj z$ub7Kn`C|{2jYuj5_{={Mv6hO(OTP5>@Vpaa=nE{xX)$JFh+>Gr_^y<&zwYIlsm3X z;fXecVCV$bQU@~x8o~U>JXF}mi`!_*%7vlb|7IpUUoKW0gU5Ph|0Ubey~zY>yvOVh z!kzR$ZDv_IwY(IPw>dl?EX5Ed(nfTg`k$0_Pz2<52yxeG9Jazo~a4XKTJ<;4P0gY#I&}su6 z_;jtncVtHUz!FksbAqsUT{&hKAnWb$iv5Ac#4OOC_h|I)fzMUFpZSBN`w0!o*Ef=3 zxa82Dv&AWAF>04NuKY(4xL9p%4_-F~QrU9g>s_%W&VU5GIcC8phKhYn-LFNDD&Oc$E~exy`XdIDX1( z{HmaqM4@RKvRcW*wtaJAdrU9XW%P>H?mx&ChgxD2i%un+s(da-Dg7?nT*oYBHW^_n z!JWc0oJf1%qSrG7bB#KVB+y|^cELMkDhnNdV(wMUAH6+l>k8a`HB(lMC26~V?>Bfx z2p1Q~AHA9XyX`T=IY;4I${vhL!rt9tut25!ZfoPNFFA;ANMTq^Jx0YMWSNEdNbpJ1 z^7ye?a8~YrW@Pzb{v}fZhLhNYjS6+1uB5`$fRvhllaA-ua9(VMD&T9kKi( zgE3#Np{BRSGg<#UXM5kMdKKLkX|&nH_NLvC0otW0CHFX2kIc|7qor><#E=UeQ>gX) z_XP1S`Q`PiJvV-}L>foe5rRi_JFkne`}wWf?mhe5fya}hEDxqnx9bm3u$j(6PKlnS z3WnREqVUl~6;JLzoB;X90B3L*Y8(-6!N?K$j%Qh_9?ZHDE|E}qE{IR zuFObmrj5MSE;-J9Ua_flw1;((669!UfHqvNjQvq>c)e2#868-0)No0!){I;+q6|Jj zSmK@e_)ApWFDAX;t>q`>4T8faQFIc5xfeUkKC?kRo~zD0`7a>NlQ71 z7G}(3>?BNsii3JTplKQsJ_nNC^Ri{g7TaRgk_EHFK1s}Wf^&ar3GkUO!!|L+ zhMqLr!Dt=}W+;3aBIMC%UGpMzTxvv#YzICKwAbYNZ$vB>*`mwVV+oTwGv6{4Z>Dvf z;ClrQ4m%SpqPe%FK0&|>_{RyExN9O3$WypWwx4)L zu2p(GM&~Cas*b8Jh>v##Y}35Q2ud1o@`#iGX!;QNwku3`MAyU(MA>;*vK&OkJ#~5} zKRwy}MNa7*Ywom;tAYQ z@yx|ZPt-84+ANuhKoK>49IYkdR%c6~p}^a&dfM+Qqs>LDTS?-Fu|K*7S`gixg5cAaItV+??qG)VZc4n<4eoQzew{))VHSeC#SnL3 z#xV1-6R$L{SrIHuTy*{2cIkd( z*iuiv8$=|H4)%XxXTkepU_AOk#?*PGt6!ijJTen>?Lvkst(zqPG`y6I#l?4IU`CR% z9-28Vt(jx3nyQ^$d$IKasmUv)B(*jBsibWU=HL{&h3|4|1&z51(zl|2i%3S<$dc=0 zEaD!B2y+`WRtJ_*{w52WGKb@~FIlVmPtLPfbd4l25HYbVASe2xAlLK!H9(7+M9FK% zPuK=^1M%RueW{gxnbZWWIxkO%v-w=nY&xbKKrjNn)^Vx*_!Dp-AgX)E8#OtGxs7Od z{)ghrl_kT(3xWJoNDaHUZ@|sNiwz>#pzN34Cx1Ae`q{K_a=$W;PkOf)?dETPo=v8J zrtm7)A3lhGIdIy&-rk#zE{gA;Qq{yhR#iB1~I z@W^P)LbfWgq`RoQ=*?Poq}g` z(g`mO$-ju1<%3vVq5)Io1q&a$u*LSJB+JOj$*+fts53fb6RYxP>XbNJ)#IlBS@*VI zfEbVI*$dZi5=A>`+=KdY_T1$*D6<`?N%*$Pf-r7Zx$ zQ`reE-e*wKy}Ye30ElxUYG*q}#o{a`Dv?4hFRE8!GDS#Hv~nn>-l=nQ?F_k@2(GqL z_?(9v6Sr0QxGc>^EjsJoJ)><2!R0cK!QT*7TFuD;t4JJ`;9HZX(G#i-1(b#X@V_6^ z7{B8?L))(b&zx2Ip|3(cJobWa=NOe}dv@x3R|Ty%Nt^gbi@jN8F3GMclwISc1%xf= zTtCT$_?bTsn4j;cuZVF7q(;+@nHZc6ob3)Rp+;v6yciom!H7E?FeeE`a-jOTN`HmT z1JC01UD|z~wmNbM`cg>xP69F-;QM@gKL7s|9h20*n%;y!K=CR6C&t^(*!92MZ3jn3 zC-4827IDr0rMW$}B)A32>bF z{h6J)m8p)vPd;Mf=X_4x=w@yHFG*!<6LP+N*jcN-T~qVQF74mUa3tbQC@%(Y9QW6a z)BWekNn+M988kh>uCd5+{2}{u&#aD+a>s*C$Z;J~LB@#5h2NnGmiMfWKS(iTu)6o( z?jV3&x2DnB9fzK%|Lv8$S*xV>f?cawv%Z_uq6uok5iel4Cb-3WnPpInLL0r0`FZVASCN zw5-*bzm9ZRam-PFWAkhf`o8-$JHrEN=>|c&A zCS`=eb!!!FuDXAS3{QW!NM^sJn7%yd9yrK3$j9UkaA`v<+3?+&SDvfpB3j5uAV2AUxxME8T4P?=Olh-4_#c#~( z7--plgNJ|9!~f9>Il$DeG+p08bgCed=^imSL9(rAvEW&HZ}E0UAUQdC7+=(psG)w%!&;W6{{H^<{>@LM zrsdR`K#cxIYg8~4yF6RT4&C^uvFIV+@Z9(Rl1nh!uU_Wc@BpH1QXIO!O7%$} z$|=6)l6C%v51GD zaU~3xO+5&3gh7-LU!@IjrtU6?njU0QNg`RgKQx7IgQCn3dX}0Hq*|4@fZX-_JT+BR z2t>S+EiE$PL&XZeHcXiXnvw2Cot-Tf*qy$@uBa_DYYu;q=)MvbxmbAlKcL)VCyRr7 zXM?yW`r`xuF8?a!mk%5R+K8_(Ezk%VS{sk2=6Fqg12N}$;M=sSd z!vg6|1XGYPJQgD!JV~j2VHT=-GV!1lT1Xi5p6Ph9)f76l4eOjcg3&q>7w$3@2*GkD z%W5IZU+Af^a>x-!k^9E{tNsL7eI)kSDkqYGe_pJw=PR!}$e*dpCH@V6!?K8Z@!o-~ zA})NuC=|m@i%mIVpdOx0jwqU%!hQ@e4%tXL76_0y$qPOVOyDP^l3~un`27%f0S6~8 zxsUZ^)sBb?9^J+5!`5iP^@Y<4K<@`!Oo`CI)sZKK-VVSUp%&P&zE+f`M!~uA#t4rv zlIcKs#L&2(U{=%k$=gX*LsV!r!A+1)N>`OY+rz{&ETRvZRdmr{@}3|T#r~J^I&ywJ z+TEQ_DN*=U!Ga!k*(>A{B%LE5wE3(lZuxLyu4*(PnOw(#H;|D4jnVmur2oYRS zQ!Yn9xSL82dIYf7>mZYp*P>GtO}P3!eU`)&GD|cMskCWbkTS;~nD!M^CG3Q+jLA$o z3CO_I5#hAbAP{3#;PIK5fh=~_^vyXUXG*-{#$2B%7A53xCM3q-%`s^3&ft5-vjMqs zvf2kWF-$Ojiq&ZSK&qq9@oP$``i)~05X!*SK|`5C^=%oc`)bw!1QA5ZHq3G!@WT}S z3j*R{&rHL?LaxS?N~CRt#lm1lkP=FwR4y_kO?V+}X`-!3GPzocH83;;Sbg~7tjGZ6 zwz`k7?A>puajZ$v_q#DPnn5o02F)gElivHBD_$cNU6D(3C>Z9|X$L~zLN~0MAWorH z4E($?`*oTU~MnVv-%@Rew&x+FX4<8-2djhMp0Wb=}1NJP6~^ouT-@pX}P=u;$A3-pMv-YTzv=lx=Z zjN%N$fUo;secqZ}w3DAM7tBj3fyTp@nJ-$K-Q)K6N9VC8fKSvjIw$PFzYKRmdVHegZ9k|TNsZ^Q?Za^lA z3>G-P>|j(_aQBVr33^1dFQK0?1W8E;ZmVga=JsNaAD#JsA)E zY|R#OS&XDmU)#56h!PCGBHq}Jb_kIU&FkNn2~jqM`7f9~YBvJu2M{|`n(+wZpq+7; z^Vb}o?>c|r3K(xf!Pfoab^Z(fyXR_)Mozl~Y~$rR(6Y$5yc=LsQ%eOvATk3HOp7z* zBWEW7)Sf*v1E)p@7xzR_3qs~gCA4Q^UIA{##KVwS8uLvlM-A>Bh-6*(3F(MB3C;+?nz%{JokCIDCJ_>2 zL?N3{(sF|vm;5ywqm{En^AdNWCWq!q#Br#L6_Gv;DJ&h7(k0DFd@;EU(Fmu}ZHcw) z2mlTX@gPqv4k}4gm_j?^fcdjyjWh(#ZVvRS{5{N%o>oz&Nfk;n1)>nG&i-qcgS{QD zuD%RTS(-hJ{2}bXg%%473)JR07}?M_>Lj;9{oZS&)>#>x$h}5cq{;YT_~tw+ttIX` zRCl8#E8Kz=iC2>(TvhLV3^T;1IkJV-5E%-*@gI38i!E%(puuE1v{d7@%KikC*$Qpp zuPCr-x5E}8tf4V zNA=(3*QHXiEzgtOYfcx68{er+yI>bNujdL)Fe;1KwyG}mp=6J48!+k`HK3Qf@g^&? z2T zl`46l6OMT9D{<-4Tb`C^=-DTB`_>V!xCV}_=+*4jpaNJe(*8SiOX9CQkZFgBnxM!D zHZE-i>sp_Dr!zQ{OZbJk>Ao`C)ib_Npc)b2)_$vwj@5|>RUIVkN8+~!Vgl^nX`2UwNy-#~e=?awAm>-@%~#-{@%aucMP44%vvqw}0WTQ_6EFiVncglKih z%QyUu+3`-JmZfV=VURVRhkKWw=6Nqn9#D%J4>SqamuY7bM|Lon`pJ+&36*Gum)RT> z+2Lq?mk*|=n<7(!5iUbrk^_l%myQBsMp5lT9!;Ykwz38du1~e7SS<^fS$q?UNW2qq zT&~Z)4H<;Li9~F$0q9a$$mo^RLHo_~{J%9@Bg!CZKsPGpDvRm7yYXAHjPhZO8DqUu zV{+hq_iuhyuTbgyShQrz5C@5M52qGI8%N1wrKn1WHE0VtR%Wf`tS#>@ePP-z?;k(t zlQ=dO7A+_kl4G-riEc$ktcY$IzGbIq!|aKG0}s~D2tmC4Z!&L_$o?g20Do%4DucHN z0eME45hFuNC8$M6UE{hPJ9i&i&UsgzI-{ba#S%X(it0HHhdFloaa||lxn^r8kt8W_ z75Yih-LPafL~K_!&n-Q<=AnoGB)rQ=1dJBcuj(${g^W|1(1~bGDliSE+sWn-StYo` z;(OMiBXYc?V#8twqJKNU?c!Yz?b2-*r~FVJ;KbDH1?2wIXo5T06=?m}8>STQ^b*4` zmp}PUn{VXNAFk<@g^bELmuo6>N`XTPf&R*9`aO`!HAK&|8^Sj_SrpM3N&ZO*FcTyw zPIL-mj7WUmj5kliptYm*O|ltbu%4S$(_(7-$JGYNe%r`n5#3b-M_i`Hk@wJ#PoUsn zcIJ)23oW@_{_l?+XR3KW$paKuSL2Q{m9V#AZaQytvdWkBxAHBr4dCKq#~|G5Wx>Dt z<^~t@edhZ4SAzZ2>IT^?Ph|42)zf;}I)qPTx=m(VxqCSyxs6>E+RoV50<9{lQ_%uB zDo->nTNRn;{;cUZ!M6U-4& zaJ0iA;q-^&tSIyf!$X3uCTHL@=w@a#9V_Bj+qLR=h+CBDT+~5E_@jx534+~cdRD@9 zeDWUDFTq1Esv3JXCOI32_P$rqq0_MO&j>g}j=@<5#a1ZL(UC*4%g7 z&)wHSFKu4)KHM0I}k~~TNqH@A++5ae9u3;5|D-+ z6d^>ubo&ycK#=YTHdqqm4$&(I523PFLa*%(MmEZcu5SGXSpNwly4RCzyQ%05(K@06;g$p5D-0h|545SBYiX zE(}k#9-RuT0k?XSLM7yUgVC}nCIy6<`eU^+@B<_&A1|#6d*OjZ#X;D#*;xC(gI~a^ zHeRM+|2eogO%|t=x?m(Nk7K!LmbDn+=JjEkcek9a=NLZl4MRC5U~;_3am?j30e_O5 zH$xHkd)blpQ9sNDB3YTduoR6#@QOG<_noEtEdTkX{rM&MIn_8j=wMt3g961G37Rz= zXchvLzAMs%J;Tbd z4Cc#@YK(%dq{o^9bIiMqU(pxUAq{K5A_IN8 zX5#gcUi^<5T`o;y)z184ca?jD9Q(}EIS(MWRFXquZf?xLRyO;W5G_s~A?-1vh+2D- z+z_I43N_o=WJ&Q^Ug}?^DtuI{-k_BEm-nJpPrKlWGEC_U@i?wXeJ2iUhlPx*IljRM#TQhlZgR8Ma6uXYQlHb7c zP#*1Q%k-&szm8!uU%19 zOVTQh*(i#_vXYsDt-TcgQgX@9vYDoHxDjc$k;c?C)<=Khxiw@`Is0*c7xL722$5t>zl9< zOZG*TCw%jtaN8Sorc=CvH<~$P*8vtg>{vI#m#{WSTERwC$mDr5xo7{amoLUGDv8Vb&iu^Lnq~t&8y0!2xBhXl736w{VV&XSQL+busjmM3nP9(>L0yLaL z9!`mIMH_Wq#7_ zQMyYo1K(csVOhj`R-;EkdwKdQG&M0=+d_$kda_?ol+|aHpOd$uxW`(_P(;+Ct^$gI5GGoLE_tsE ze(1v0jMnT4A(WQ>yn7yAsoXv^S7S$0>(==MXZklC&x_VsRi<3t;F>bP6Ic@_UFS~9 z`!@S$Zsf1GW>FNEE&`#8RwhpQtE?1yz{c$q$~{^`rp;8#=|@pq%!4c>ZOpkHoq3$i zMa&W!o5RQq{yuW*+LAp^aL7H|aVK5RSs)!;kXHe^Y}eCN1q0$ZY-H)Vgb7UW z*{oW-L+0fl$r3GtZ(3?Ohxw9BTRAmLr^|MNhKjt>SuTu@9Fz^zs#09iCAdth`IX$6GO}jHQ;Xtjr z9)~3r#wE(qunAQSP;xV;?L2Sx2wnJ zJ^nALmpuxe;m(P1JSr&>GnN&@WO*swY_3VS)e-JaDKxOJcnhH`Mw2LiQjq3$Bz(6T zG8Ae#9Hfp7lNo1?kVh7vv3?v5D;;F|ILZo_I0p^UWKz_xcBCA2TPP22j!iYJI|mK? zBA$pf;1bQw_OP+&4r1=^f;UUo4xd;^4=^V%Z9kCKpilGOs7EbTlUGXo)|>Yl^LVc3 z>=1m2P^ZD@aWSS$y@SNxBG~Q>-Jx`%s$_3m5|SGl(FY2rpL2+qeNM8P+}HkS%P1Ac zcGnjnZK-k5A100(&3-zwyDU5DOJ1SNEi&a_i5@oN!_qo%?*+h6T!0J41vPCJ+4cS8 zYrLXGkfxJ#-iP0pFo`LD_jLvJh$;!F?Px*XpiMO_dJpHvnU3xKy5}8n2f{7)--{5o zPu@9>0^BtgNwfvJ*I;3PG}aVtKPbIUW-+uCqB%FEz06DvbL+eCLKp3sVKGaaL`4IO{_ zn^9E`xM8W%YA;}>cK<=UqHiW$0LZQ;RwkF^-$lyt3Ui@R{*lKe26Xfj=sgpAC%hU{ittuZDCuFKHcS z!6TvU9?_HIGP2>e;ag{6k%JfK=?<4y+g`bnA>`tq-5Y=P{RkOb-&05iTV*Cux~TLz zd*>`QhGp5r@>2?jQ!(C*183d`PDdR9an6fyf*ZArYG~ghVYAX&pReHSMJmNV51ISd*1zF=@~J6e)r{}Lhhd@4YpIc zqp9UgClIdg%pm~iN=Szt^KWnUzP^uPnxxZrPKO!WNz}LXroz5NDkKVnwi z-1pqinr-J0Y=UfbW*r+XT(}5LXnmr~T!Y6}^+iSjtO?b*!IGMDxM{n zD{QmSGB9PLtMV!2gqumYMis`C#dF5Fn3&N(=z5hI9GTV_1UN?_sx?a@Z%Lx!s8xt! zGMKK=rl{9#S_ayyOxd|)J2+_n>$Gbh(=rzM(SaF%Mm@d3Sey2*Z@L4w&cItoCJ&?Y zpua3boDdUOm66UA422XH$#5E>3l3P%U?q!4QZzBS>J4bw7}$Uk)@79zmY&iw=~MS} zt2sF3_M9Iu012|OT=*rASKU1tM}DUoUb%6rQpq#d?5?~q_*cdv5)1Y~MA6PxksX6k zZTUacQP~3ge3iIC<=Sod25p}`KlyS)t%%Oksvan6Z+KfZz;1SaE!QQbX_+ZW3zRWfe=L#+$(T)X2MF%HPRGPGsuX%3{9I^iv(e?fEvOdpkih%Yzfg7Ycq{PJm$x7 z<1NM8?;a&=!=5f|0%rDzGW9dq{Y%JE6Kro6-|ohsm>9%sepzihrfvutVn=xMQ|2yw zKpgWJaQ=9f?tJ=6Vu0(ln7HKGpxt9$BX6kwY~Va*HQDV8;iBpjf1x^?%l2&jnK@mn zTYHNB`8iM$@V0SJJml;M^#3bTF+v}f0So{z4GsW+{ojgMTi9AT(b(DBSpUz0)F|)T z9kRms#{NR(&I`!SkE~nyy7bw!!?qvX5Dv0h2NkGGQ!k}*OZ+8ezw*PU*pyf)ga<|= zX`oKTf4?tk_B5|z9k;VXZV!>uG4I+VREEg=m(Uihciz@kn-G9+--po5A?#H%odh1@ zWg{QJdMX2!SUE5Hxo14LGNrF&0bjygFLcKJ4i4>ZT>}j~v$GCXEwHxy0`LOO=@=nC zf>fW?KYB)ni-j1fKCqr+xT9CCl!xodr+(A-&)>YzQ;SGxp&XNYFZgFL8m)UL7xzrU zquhGg2#IEWIbgDzU#SqRAO-yCPP+gQdvh4qpqWR}+L$RQ4~YA+vvf!=ULf2xZd-hD zypwm>^(Ncr82?AtJIvS-i_5k^QS`5f0i) za%za$&-T`eYB|~&ZP6rAnH;rKy1R`uAM$lmDGD0G9p=5EB28X(!2`w$kO{53p2jL2 zQneH#+Rzic-$mS=O}c};VvYr(LHY@g(LGECTXtRMen0H`*6<0zPu2iRFKOImiYm{9 z@tmQVqSz@>U-S_72|G}e{DyyOI2qv|cMjlq#tNBn%=}9{)8f=Jq(sHNzaZb_!7Wi= zLj$1-`~a5OG1t9z(a!AgNnmPW8lO~$6h6z?WHaqWhEc--|C~bu6xVXA`i($9ieivA zsBlb}uYvlBEf+iVFSRiQ?P0AWTg&>UG{!nXlEOw?3%7`*l>1us175lkIp$rD(1)5( zq54OGfl#WiA2<}=KHER^8#-^y{@uPq*F+sKCiw`Z)>tEYN(Jha@DM>^3VgRJSCy`uR{aRg7$B<3dSw(WJLz zr~dW5A9$&Z%|xdX#x5Pnn{d1^`D7&d%iAJv$5S6P*1CuuJk>DpO6zk)J~E~`Nu%2O z`lIjQ-)P*^GUy{=bikZu7tYR7glC;HwZL34V`+312{BAkHZH3?tn=KFmF(TH8SMh5 zX?3WSbrem8<#DS@bm0@Ozt6>FYz;$f>|)r+ctJO84u1J~W#`g4wP|eWqUpJ(bA+N2 z0dU8&wZ6n>B9f=y{_-Ke2%>6(2rDh#ic1(HkF+OG9dUZ;v*`C!d)ptVyM(SAWL|?C zW#hAwg$hAvQe%%&$#KX@@IKhvdY+HoFR_CZ)9(a!KmTFgY}tIC^dJKOtcU{up#S%p zJ6V|7y4e5EE55D$>9i@D_@nVbHPUP?Pm!3|J!7j1--$Hpp?ytSyXID#t!5A~6h8zt zqz^cUvbyr?tM|%H4eLcnWRmOrD&e0) zo~rZpcVjz;R!KEBd`Y~@xVYq+kwM#KqH5bzMB8TBHYsx@E6ZBw-IJ9ggKC~bXN(br zWJe>us)3U5Sh(a5^&YjjO19`jV_Ic}BogQ!T$tYkS9LVqR5A6mVMYq01+0j!0%TRP zb0U4CjA4qJD`=V#4O%k?g}}qoQpyX$RI7hc>M=>WADa3`03l~ zlfpMQ0T;cgjC!wO>5uRGP7b7{28!Z(aaGn0&5^VdE<{ls!7&VKbfH~bW!?(Om(sZ| zk{%j((vgKh*j&Ke<|3&0!<4ZT?+tI4`$@eZ-#Xy~^ti z?xg56z~GFts0w+8&mUBnvnR**dT{V^1ZF71=T~oM^j+Nj2c(pIzF%ZN9EgYZjtrB_ zj4`qJey`hAcDgR z%vP;UaVh0WpE^D=tfpn?kI9}(qfhX7*GOd?j^nm&LU}(m|2j_NzCQ=FgV?~tajR_| z4ST5>_Ko&#bV*!``5T8Lbp>aUSClg#r%#tFdJm2$W`=t>!D*NnEaI>dkRv|UqFs#3 zG_iH(EbNxPKM^#uY&pa#o#gyltuP=3qVHG7Xy+BeX4JpC#y5q;0*Bndrg6gYW)KI~ z3u5;Kn``ph)peMS=c-t|_Bd>z5DF=VR87)#wWq9wtj=+%F3ULxfat+|0cOXq@f9pJ z3J89_2#m)IL!T2Y)&-qmmk}W&7^;%!s4zuPlF-IiynHZAJTwUe*NUya0mx-9kn4EL z+~j%MpF>EcO>dNX5w(9VU>XDd;_UT}qLHro@!V5$Tva3JS1w_rJ3HW53rZF^sPy8( zsjLe1xaAW@Q``ASD4p7l3KL9CT2xQ{IN_K-pC5GXlQHJ3Iy1}Z$9qN4o*V1*)!U)` zn%ik|@)F^bv%IZi#!gUT(7}<4ZIc6O?i$Ji?8Zb0@Os|1Z2275Pqs1B46NxQO}b~X zBzZ|g!{t)XnS_Y8`p>JI<{Q>Qtkk`DFt7w^)h`ww!l+tb>4xGFU5ae}qd~~x(!9V| zfkuz*3J4ESV`d#7k~(U^as8nBsY2sqU^EF8t`uG3t_TzOotryEA%nbz9&r41J6Tvf zZ$N>BdGP4OkP*hgO`@+0zbg4bFu;s-?#NI&ODVGgd~ZZSYLH3kixpQq=LXM=%_h^DY9m17S;N1jx}QGLC;4cV|=Ft&8$69 z5wr{E4HgBj#Jm-%s#ON~B6SaF4W2W)p1&6>ujRztz&=M06RUi^9-q8-xe(+%Ur!d3 zG{!Og3i{P4CGiP}VxqW4aqY_}c_H-JyEQowzQ@*2!D{PUHC8n)*LF1%=TCn-hmuyw zAL~n}u$?26eY$Aj@nzHaD!M8b+T($(Ep|4dQG1TIPi}^ogA~KSu~h)b|HKM{BtU68 zHg6UYjIG@d36HGwLFAc<0ZAt1H4}!{GHULOn{-UcTxjOWGOa(eOflSbtF3mvG&!e~ zvy$lRPi0%^YnK>V1Kje`FhxTR7EhSXfQ^d$^BHrK@h7;qc#~T>A5XXW5 z3)%09^tX;FG;|`ecWc?y&u#xjL~k5+y~TcgWf__$tf(;7EsgDE(w$E!J8vJ8{k!sZ zl-{~+26}5*ISaG%wO9Jnf^rS5f0Kba=lp~dQ?eI8Vs1l|i|ZMs0J`9Y1c;oeiyXTs zK@uWn4R7-XQG){oI|Q8kquQS`&g(_}osMTAkS}Z90f$~DHKa_v^*2?GD~s#Qi&QCN z&}PT@2*d!kA8X61N>Z@OgFSPEF#^g?&d$j$B}gAl(+4Te;;q;+%u{x}DetkAZDA|K zzr_iL==IsZ<0JQ0r|z)>i#&dI1c7v?jbNplQ8^UisVNwvXQc4{BS``5Z?>z}|| z6AIa5LvvboW)z^VO87l`mK zm6x>`H{!>BT?CeDGb0FR5*k4h1?DsF&G^-O(y)Vlzg%|@qQo2%Qmn2uq0ooQjrW*m z_a9@B5!abpnT4b39SsR%khGag>O;%YAb(jAV-5MknX9Q_(&~|ajISajQCjZ}NXkD5 zxa;{ycAit?oE?nHD1V0s7v-lCPJyE#Vnm;cV#%@7B4BTbHnqeN2uzCx<6?*RKJ_z} zfS+uI{_x34;F}5*pj7ftp=c1O;!Fv0F*O3%=y$dYx`Uk%>WeJ3LatjR>I2^+yMkoE z0T#4-A5}dj%VY@hB}SWw?jlT?aHu7RQ~|a3F&A*Qq$09eTUN|)#}b`84iyTkyI>fi z(V;C^LoG0s)wu$0et1YvhRWu+w%>0~O!ahLx{M1Wb7p`|)sOUan0K)4UdSyWCJYO9 z>(f2^k|?cgn1C2F5*RMh-P(ozXs$8r_n;Z8X)xbJU<(g}TS0l1*1Jxcd+Qh=b~5=0 z#4j3v1aBlVR*oVaWhCn`+5fKS{%XoM+L+vD3rLhgkGJd3qG-+tqx<^w@^F!E+sm~@ zfMmm3qE{UkCBQ+36F@3CqT(#aAsoRfz&)5cT9!i*B#WDd%Mqa1 zeVyJf*ibtvvAMY6h=r=lZN|gRj7$>BN*{X9Tl%!j}^- zeli`=+gmZ(JlXnFjr#H@rtZc0SL;yv%T6&+(1GF5aj`;xJT^|n!o%@mh1T*i3aRzq z6^$;SzW>DDH>F46c0cO3aOgNQ1n1#gqvjNRKUmihD5he&UJUK?L%i-K@y#Rq2@ORl z;YCA;Hyp0-k0+gaf%(%-er-w~C!j5aGuKnr`nABglFz)i-Sr&e zYn{D86G@Az9v9biAQ8S9(iY`s;AMPbS#1^BFQk_0V@&_{vx->Nq@@0{IA|A_h^s}E zIQry=TAW4QayU;-ia1Wc{rhbenV+_F<1oBf^}m3VD|miBw(&*r-jPm`D>jM)^Mg~M zgOCw{ws(qNz&iDvq6UZ@saQc!68D9mciGa;P*yaa4cTnS^n<`@-Yb|D5L9~i7GG1YFO zPf$i!pt5c!eh4Zcz&EIZy}a0xV8KnbJQy345X zZkNRa(ig}a{wBBStwek~Ze1F#JMjdV1RNHo-o~!Y43s-zeQHgEmE!K;#>0m-C$M?8 z)duO;f8}{=CmZ<8y|pgRR8_x66>w)}I|k#E)!CMR5>?!_1IRTdj=m`qys@atZ>u9`lW(rX>Ox#W&RmWc{8()?Me4nZ&@*jZR&*w zU|jSbCH4q?z3p{WIq z+bXi3ZPnC@akohP995Kt^>eH9RL8RBHQkC!c2C2OKZXvl`k`K%)cdW-oy7O~GIPoC z8nGHC3DmoL&vb7vS^qYKk3}voj%#?j?-4#IM|=N=d+a<_)y-bY(-w6^TdDNM$VKxs z#LK=2=7vc!skC%oqKY>mp6x;IyZTRR)ln?RYeWwz2RdC9tw*u+sC!!0a5SOfu=0mV z_IcX0YkL!Pj!mw!H~2r{H9~4Y5b{P5`8g)gWfWQiAc9n%R&Q}BlP%MQ`dqXfZ1s>O zM=5=*u+O}OI*L7!IX$@G#Jd*BjM~-nEX8Y>*9ui?!+s3orz4nwe^3OCHvfWTf$|Oo zbZ{SCiRK@QKDLkq%*^JR2gDz@0R{@+jP3-_*nI~ z8jG*iDQhIDuL-*u=!il2bEkbinh{6bGAPhAZr}+yhVRzj5uBDmrJ{JZ^9`(NPK26x zH^exJ0R$qO5FywCa8(L(N#Bi*_k$95of6$aYWREJB#rO&Y#Q=$rP7sU9WNGyC zT_(0JBDNJT#i`ur)P(YWT+^)ch{a}brsdMRi3;qXhLJ9Rj#A7)09u_-ltbx;TYecU zxal(kwqp<7gMu{k`{dFUKfufCRvh%7t&s2emAB`&2LI*v+vT?x{?m_#ul`o*UHD%-N+5sY zTyz`PX?@MqOlu_rb=Rhzch8IvrzNFQm5XiaK!mnd`)bHYnOvQR)})5E!S2k4&{7}L zfrB7BC_(J*UDY=8>r4B&Wh`q)+L*{UjpHZLTe-5CaRUaC(#Un_34o{1<3-x9=kw&} zURax*UYsvL;|Lm~Uw8gXA^RzK^PdaX-zpJNfRwjhQ~!ud=}R|*y(C5S>S>AA`U`8T z$7&F#&J!Z0vRhs7g%yYM#&dpKZEm!H3cQ3FD1Lk&UFpSzipgMEWH6hY3Vs|V@vYW{ zBZ?k$&CHsuOa^O~v ziA}rnRF1QEelXbu|A~{Ttzc-z6a~>gRfiRe+BEgoymRLhc(-||fW7FpH5)j{)>pYv z=BW+OIBDo`m8jbjgBkBdNUsJXFH%-h^{?o>=&bvs!_+$0PIvn zYw-3ssUOqeK$kPlm!ft7K_?NMpC{SWxHn5=EPJEdd31Zp*9kwsWVTix0_%7&E$BT( zJtxS^AE z5_#^n!e~d16`DK;z*pWt*@ICjo7pce8@>c1p0G1utFnH_pXpS^WKV6FPf<=UtD-J! z*{L(5YPtTgEN2bP*-9mnV7$)Xe*c+&ph~O{C;R~bV9EgiK>4o>Xkh=pHNYz#zkeEF zt)Et&Vbw>9GLe+*hVCiOX2fNAgc;7J8Q1D6x)*zLd!l=RcuH~M*@pKkxW1o#8quF& zhlRhFm(n&)=+OFr)M$OQ8Q*1#_s#P@clrHz^+ntn^-&spP)!aPacd%(N8a1C^ zNz7)0Bqn@h7WN4b)Io^sXX{+KrUpn&VmaG0uU!2ASY5Coib75FMn-&aM8a32&&`TI zm(gY(Vnwe?D{_h9b70;WBU>)9w6xumJAAsYwY52{lZ%*kJcOB7k*C(IEN2gII_aeM z!J{08{7(iGJtTMlxw3A&+Yv~7XZ{#CAw{WehhyN;Ce&hlx;i*Iy~emNkHh2Z3}3FD zy!qh+e`8qFgBiFo-iT*nX=TMTk#j!-@;>{Rz61@Q*Kmzj#7MU3@r0ZF&9)I5EGRd3 zRBj*gdM4T6;O=E-d^z20*8#Iiy^l(~vEKa=?ws+q5Ngk#z(!pKLgBvjVA2|&b@g%q zfH(jbPSa0~avQk;`#-+JSD`PNF=O%ts2E?!vH>ONkZ?7-46=V~S-Nfb0ZzM8ioeZo z=on9C^9g4L1M-|$C*3y;(7AKo7??$&Qv)af=rzS6AhB*T2CLEyW*#ndPyKYfp7PA841vK!Z~3+HQX z4pM~MrAvFjtWd(V03(=}{s=WY`$GoDiy?mj_xY}8T!CC2>$azHMDvF_C3ixvZB%<8 z?+zJG#i9Ul13R%fC;`A1k`U{Af6cw+ySyr494}l2`pYCHH(4Ye6HxGp!7i8A36>f& zTwUOoF{dU;0W}K|%@qJr%$iwLi$W}LlgDI)y<=nqz#R=CXUFp)l7J<^XQwbTz48Rl za0lKOL*EB3;R_b&51?`m9`R>IBXJ&9T9X&}iJ>tzhHg8)d{ncJAL3YtuHJ%URZ0snmwKl+;Cb7! zu{IcFExe1JovrmUTito4L+44RsIG+YL6r`EsS3L#OL!b2@P+|nlUzXPp5wW*_jca) za`5$7_(v>){OTBjfg%Or%(8#Dwv@F`wl!J&=?OHHz^`o%sZaUBIYZ`A9vu) zI91NfL*Qa!jA9grv7SX*Ufvb~9!V}A9-$XS3Hb> ze#VJG39NY{V=H;9v4mEb5?-X9yn|M=o}JC=U?uQ_LrGh-Dmnur1>i0(0+&AS#r1_^OdZUgh@&W15a^>y8h8b&wRT{kChZD zzt4<8IJgEIDb1Ov9TrvwvmwGaBzf5?nlMyem+3K}IpRenh`Az{?W{cmD_9^9XLA&| zZg-k4{`HdD)1Jj07r7@edL0A=Ky{L)8zrI-XW+^VftN2yS2%)2jR9+G0PF)g(P{!i z0G0R)!@unb5Qz1n!LDi{5RmziAEd!lW)_KcK;`;{)DQ`&s8(Np(309+O**ZW+lr@K zq(aDV#u;kII9)VHctBf=1AD!=Fi$-a#JAHdb4hkbKIn+&g)Ns+a)AL10xIN7=>n3SAlLE zAViRJ^^Xv8D)h#(G7CTtZNUctNRh6i6gGOF4d8(ap;(TKgLwg(38W*Uf@u!iH+MK= za7ALOU{qv-6-KCJz@rTY2fX}1S5esj3OhN1*sa5(iSKqm{mr(}!Ir|MMF;18ue|Gm)~$I_6`YfZVqO)zT~h^p>ZX(SXu{1#655AP1kv zG)HLx5^urPo2py^ROJQg`Ac(S9t2~8K^1<1!U-)Q7r4+%DPa^RgijDpOR=XWPY;qC z0^;*Sgl~v2mTPLPfmW31JDgQBx9L@U@9d4yn35DwQpM0fHkjn!p-`-Hgyum&TM0AG zA&NB9bZ{n9y*4_qgJe(yNTvtii{Q;H2pM<|Tt?;XB22q#OoS?u!2R$}>Ac?s6l^Ln z0Yj29d<2n8o>=pO5obBYA92+VNtD#cibYDzARV2~BcvDU|Ip|eEAG;WR1o@+lf{!P zR>w4!X|m8fhlV6(ZatVfjWd9P#nS(ZhLyJBc9gSjy27{-yy9F}p~4)&q9uoKmPCjT zB3JsiMEn4J)xl^>{`9p1?L*ZjGV3(26J;0(!!4p3iWbQZ&Zlb^@$s+PvV)4%9ox`S z0=D1u4?bA?cR5>nasdyZO0KaM_J26A#$!=B)_y36!kEGhQb-ftJ`TC3;BhqLnxm84 zD<8X@Mdj<*u(P~XZgN$3&~d_L-TAwh*HmE*=LVZIgaNm)!tCNR-xs_Kv%U5+8UqC& z4~ua#+v8d%quRGLfs6z6y}Z79oz7x^TABroam~PGI;M*3mr;1WSU-Sa4B)V0Z03=j zYgIDsBXegFzdX>#y%|KT=PieS+k)2jF^Us8zoUc-(8aS_ms0q%61fJb>d8Uai$`QR zF-iH#$s2%+`xLYkg`&Nbw>Q%?k9RuqZW{`=FfF-$F+3I-PF23EZ0P+_`qU9h`=os1 zux9QvoSKsZQLeSnuxU|JLzS`GE++g-KII70RD2q2W8h?FL6&IcZHoCed(1fsNn?6F zJf(77qH)5hj~5Gr0Bbb(prQ0WFWnhbsAW4i!yYXD2RE9KD4aZI!-mNmrdEb}Bm9NcWKf zwf%F-OjPsL834-L+X?nbACe<|4d}2;Dq*wYo%4>0y4F<%@0H4p^Xx-y)fT;>*0Fd0 ztL>3zg0|YU5>0<~5iVt?rn-z|OCqc#tVlbZN_kv16`8maa@f)^!V!D_@^K(x+f|Ab zK(m!mA33PxtR3Dq8o~v8zJCG@8VZ`~LIq^XG$}Hlj(NETAN;T`LnXay$p1WFEonE>KgYX~Vf4lKUEb~3(z^vk= z2<=C;#4h1s@1a}I#Ej-V1Z|xH6H0tZaFMzlq0T|{z~AJ5>he@jblJ_;Kz*KuGMy5u zT)oH~Le1dZ`Ji6GUT_GgPs>I%;1IONE&J_)g9WWo|1c{4;PFG^PcMmk*#Oeyj`)%k zki<`I)k6}EQ$LDnt5h!S5F{)YHLhAvc5{`(*~#ulUPnnWai7&!fmDHzM|x!T%`!lQ zk18k4{UO#54`z8?#PC~`LFt9ZX384(R2F>3;O026AQgRn2e|E-yQUT(j20ON>!uq8 zf{DQ9y3@sAel{B<#JiT4h)vHqyvDp4b=Lj#>rJtQjWA_+B}4I0EH9=ZR8F|1fZ6kNlK$sxeQ*CIt_9;}uHePhw33Q9-70EpOyyRn}@*Ni8<4n2Pm{AXZYUD{JQ2s>@x9 z_(wlh!4D%xw6eMVB8ORuc#kb_Y`@U&`m-khTVE=yf@{^HZu`X~JmbSh9-9G^+)pMv zQ%9F8B>K=z6o^(njVp}L0wXf6k;W}$Wk7sbrAPnbS>RxYvsP($OV!G>8nuH%HK0iW zgxRbr++yP272*p^ZGK7-`p2-<6fJ*{N5s;kyUc$D#2e~r7UAATT&+P`ZIh-ki3B2y zkS5S_0VUK2{XV=26h!Kl-TKEDhb-#g!?jCY!?iuMY6fDWvM~C97i<%4KEmGS z*1d}2_^>p*aZ22%Gv#tc5{)m;0~<8ev{FTp^}!lmi{sEXA+Tdxy8z|FKbOu z>S$w?POJ&wW%e{3et{cmEGFGGbD2@MI^GCDsc9C=;@_vo@A!!-^ZGY#d|)VJx3MI` z9jtc7`*iK6fFsSs=Sz)@Wh9q4maO`vfxN zXN6I0Hr(Iu0^&FWOULK{ez)9bopxV2ez!MY-!BH2ZZJBn_!@4C(@AjmQ2G5q_+cJz zb`A>hmIky|ie}*FEPt3^D$7Hy;aw=rwoJ|H6#4u9{!4_znntdNZ8%2O{E~W#H8mjE z;I~{WTpXc7)zJshRElEeF}-g~&2kj0^nVMv2yK}y zlmvzTJ&mN2YC+|SBu7 z(baSl`u89g2i0jfLHHL6cQYTK6*s(tdxq1=qs}p328j@I;Ek<{ zEs3!iC;xFmfhm<&%(Zl4iHY2jciYeLtb(~;7BFc6>Jwh8w)pGNH=5#OJ}h{?uSbm; zKL<>T1n+3YoA^+XSgH7Ho z+L2E-KUl<iUmN&gDB{W~7r>k3G-63yEadT@!sMbWrUlA4#37{vf@Govba4 za*a-`y0f1?!`*LA6{R$!0Jwpr%D~>bNlNS^^pHO3_=z1@lpT)uBF>M!EuXXBqCS46 z$e+_6+}pJKE^L)D2W90$>Qi`7`JPS1ysSj^4HIxxolaW3WA<@6l?`d+w@Lh0x@~Y4 z#cw&j0=TE+AvE6nmXr3shIU&7#c8OlFCPz2 zMy!G#%4k3FoBHQL<|+j|Y&+~I5UFs&C5xU8olkotbGO!^sy@V*A6IW5M_*HqeN;R*-gJDL<;rc=7*ce^ z5?Ymtb-suuCCw8XRK3Ak70rxuU=rV_Za~NA0ckdMzWpjShRPQcEoE>-lxVwQF=%_= z5oOiG&yD0&&5pt~hRe_+%hrBYjXkP%E29kIZ7wf%z9ZJlCrV}?eAc-^Htp}!#Z#4b zhsihn;#~?B2(6LW|GH1_2#7p4xM3|}d@O8?`uqEKxOHMe>y?{p)=wJY7&`Jc)?L0E zfgzPou^#TK7kKE-71QCcU0%n6?Qx=~svW;>5o*84xD34$PDjl2Ypj-IV3vl zG0Xc@SYyaeYXY?wGM!?LNvPO^eckjrI(y}wOvRcMPn_u$#Yo#MwYI9GMrU)~?`LES zL+!uEQW>CcRv*m8E~fLmo!#6Y!(5st{5YIO7j`XUO1G-G7B+?~DAb+5ki)x%Tb(2pgS{^ z4@f=~h_{SukQ}Y$gu~$zT+tAky0EAXQenlHPeksEJl7TT&Pb~U@dxsN!~_y+FG`_(G_+7 z;yNPnf9;hsMy*Hh!JX%bM%>aLWf*aQ@Ru$oPQaz>TOP~*@Gtn6eGdoFdS=`r9bQpm zyGBxKw=QLj@4PQvWXid8%_&u=Fs`QqG|E{vA!L9h@&MIJE(!~NjMZWKh6?M! z(Nu>`9Ad!w)v%6HDtjb;CWsAyD0{xm><{_f4mUwk5EA=8alwTyIir=F$bw^FTW`HGBPJD3lY(CrQ@Bh3~@ED85F?2jh6rU!oSKf-E+Hiv< zEhcsDZGW9CD#&I0<|UyW+Vx_7kvKfx=j9-O&q?+9DlRr=-1V#gOU|Q6 ztM^L4kE51%V(3SDK+p%f>eDO~09tB4ivo1aj<9uITZ0c00wj(|y;LJe9{i@|XL&J^ z_?#o)(=hH8jXU4XMfiOhnr8XlL}vRvY>r?{CfF#`46A)SSZ-OgoSY5iCcJ`jFw)Z= zE22|maq1SPiCEu-K-$I4FL+Rr|HNFGV8hr%`3(e@sHTuFFYpJYYp72a1DD}cvX-=F z;cVv3jvGMR?a-u>{jf~+XQZN@SkS8B0btDNucgm0$qT>_s-DJ-6EKkbX=^jGktC7u zUC~omG|(P|og?5x5373yQ8N^IMR7YYWrhIL*hk3(SjyRc?$tXk()|W<=!ww?xT&n3 zs;sW8uJ$G%QjmU*jy2*G9enM@lUg*UOa+77>v-iK(5=CMTqLK4yPYrBb(Su2-{y2; z|0d7&F4I!4vdK;5on@>n^`vbi@vi_tZ63k4bNBF?NB6$CpgZ5j%8wf*N^EVRDHjf# zwVVh9`~k1luQ_6+DNvXoD>wP$1pN}72!HJEMo%v?!x1c0BaJ#uRWeMHGpa{JM;iHv z`1z&m!Jw34vi@o&3cxxRDLAQv*rE7&O2Awq zCT?ukC8U?WMLxMHR5zOC6GS4n{1wRR$krrep|r3B!3it$e|&vIkZ8fSW!biE+qP}n zHg4IrZQHhO+qZ02^__M6_xtr=N8~gk<7}OU2bzk}I?1aa1i$@4!E_qpCx`7(_cWiE zwY6v$U|?uHz6EKyU$Eqez_jrKtw;tv;%wUJE-(@1!^Bh+3`i6=YZGmEBz0JT`twa1f1^+hSg?e_%Ss! zBNDyvZ=jG~LE4fki>3(57>H;@cLRgSat%3DW1AVyC_3vdw^4L=GLoVqS}Me0n@#1E zr{G!W?CXGn^eY0|Xj>4+kg%ulJFqwqNTQB?|5r;5N-Be+@|r%+n*Bzz7Kz)Ek~Qd` zT(a3d5?G5;kq=(3 zo38Pd2*00yGDBG>PPt8lPBcv?GI0IA<0%((8=%lvan?dWbM-NyaL~tcd^pM#EYPPQ z!g?a#G$`VeD{6`LEl7|@^Yso?l-jI@tS@MZ>#3Mw%hn+XFjjbxFU{Q8$=xVMDcwix z8+@`3k%GgXR4woe^JV|Ns2cJ;G22*U8SbjtOi*=(9G&K zA2YCKcfn2@55^c9zbCu=dwbWSt>PZ+v0*PVv%-qAB7KcwC11vwJL3W`@`&Nu4X8{E28scD=GIcE1@ z*svEiiK`DgEjOCai9n1*?$XUk8B#dC7XH%pOx~oQV5VmktS1!^kp*2;KPpe7?1u+U z3E_eF-xeyfDV)7AtCYqKSiO@P)ZrMcf7Y7UbnSC1+@nqy3CQV)>LT5<#XjpNMf?F@ zXf-N9AJIuSxIf+^5UfctMbT4H-20(tT})9*xmgCME*+?+7V5(E;`S&*u)G04pp6&|E8+lH$`i?MxDC~ z_?Uy5D7>ns*c&CoK$XD=9FTe(BsnsdnR%b#`G$eWL7HSnvjHuKpT;)DjSWOs{6*k~ z;mG?9p!C6$`cN6gyvPm5h``|vV%?-#_vh!U!^7gl64=w1?J9u#XUJmC`Ee>Luk3*5 zDg<6Hvs=BEprO`99Aov477h`i;YsLoHw)Rom6Z&1`|j2E6i>8Er5nsvqumtH5&9+1 z6hmPGF+N@b64t6EIcnHog5_0m`fcl6Flg+PC+oQ|#5=>yA-lDMB$k$AV%1^NMJAP= zq8@VNiW2q-$labqP;HmjpZ*~j)~?rEuSDfV#BUqgKFk3Xu$pWlJ&fQ%k&f6EHz1X} z2k;GOas^j5u{+48?^rjk2T5QrqFTi9_O3VuO5WcIlZq0Q)PIuRMe!E%bIgJgqs)P= zxOGOWI|!~ge`YsGj{3WlEDB6vtb>NJK>M^Jk|wg!G&ZZ!DM@J(?NCb8dl0ttuH56= z3ua`!pV{*Mc-%Xau>S~E=hH#iGk6(x%8@2?G%=CG*P{FhnQTPD>9F2|J6Sg{cK3~J z)D!38+#Wky0?I=g^C=)FE$cf}J7}5x6~pOfVs?!)yW)ynesXZOGxRuKO5^ZylouRR zq4rlN59v=AK%jvefA)F^s|9Q{Oov@xhFdPm*Rw|WoN(mc-jXJ32?r}I{w>&H1vjWR zYKkiEr{iLt&?0j{Do0dkXdP{h%-O8o3cID?we6(yp697p>k`Lj2z_cZHg71T|Fbzt zAR3fU>WR=#6c6yzO$Ee1Y6w4nTJN)YA{qoOuqLxvi5>@3r}D2HVoOw z?oK^OR0Fk7yCVa9-6r`N`V4*8{u>zEz70@}mQ&LETdN3FlTL(920ZAlqQ2W)Z>Y4CAI7|}?A{hZu^58|zHn;cdx945l z-?GWyj-^D)w$2#Os(0!rjK(`l%la`it_uOJ?N^~iVo%Er0_p1M~KC@LT~`^2HB4evDVBw!8wA;H#nUVzBk zjX4Z2@Km&JjecZdHZCSnq#^dZycAl+3*V2cky_&$i?vyl1;m^al}{Uxy1qc>+^*$sB#pi*B+%@Vl^RldEshJD+nA;-<+gai`}VQKnNJXw-}Jr0|u`s zf7r@TXLMuGudbcVRn_~qB(gqSGsKEWr8Zda^?q*oPW9sW_Uh#x?PTppD;l4rUNI&> zHvv)gg2+kD?oXI*Se63taZvqC1}B1WAz=>Q+$5MmA2pprJ4=$OkOLPQ43Dcd2MSan zaB(csu{Wb4y+*WVe|=WkZQQkBJ3v=BX9as4H!axzC{HbBtUL6j+S|-XPS3|I<1yNc zUHir#OPu!CQEb53TrS)#L*XZy$ttIfkuM@$WSjNqp*9jN%DYI9$e8J_a8eHi2R z8Y?A;OtyMLs!K(fgohc6%+I!|IjH;C?(F8fdfp7TB~HFMAWtbD0ihFThExG)!a7wO zH|CBiI|Mp}z18W7h)XtWfN5Res%MYKj_v9Y#cSn2P11SSp%Y2VkpsnpEYbmDUjm@+ zZ%ouJ46ev=FzDk((Fqi^GTl`a5t1-e@P_o_FX94!&LC^(k|=d7Dx17=*G$3J4G4V% zf@mhzf41Zc-)c}fAsDal73e58JYmHh(Bm=uPX(Ufb=^1#9lTM9E^Ptw^O*G??zli> zJ7IU}Dg)fRXhksSNE+;1q$RvOwJq2gC9cF9VoctLQ<*L{u5#rszoQHazF?@}%1&aXleiS=?&Ke*@ zbED-uy5JJmfmF5C)F6<4RkN_qy`?B4e8_JD&F>>^o?%v2g~17!o1+Wj5qVYv`AU{b znzZeqWDxX$i{^kh=ZrpkGnm#^{bXaJ6UlaJ?Cps0xL{K>1`fU>H(5HCiE3OKfU#gD zhO1tIELt01M-nM7tx7hs3l7RnI-XX~q8p@5er7878AX%8t_m>yOre)x8MI{al?j5O}T*r z0NB9-0O0*6uFKfo&dk#MAGOKW!N&BzvOHVVr<|}wQFM#y+96dY*k)l21r;IVDPD%< z3f2b`r&3ZXS(g$wEoJ3D2*nlNG5i3aBXv{H$2i)=?XlPQV`yhw^1N?5>Wc97RE{bW z@Ng7@;LgXBg;}B0j;(&oC4=5;lsoc;7E>BT$E41XvX6=~9utFS#;mL;*h|zKlZ!)$ z!9o7qFWx_r=2Dh;iyd-t_yP{MHQmr(3s+X-R9X+ocVq1T5Eh+j$v93=Y)i$N7ekqn zZRO5KYt?n;sNJ#@#MTE+_YZ+fBe%;|;$U%C07t|tpCqH-#aF&xOQgV*B03WC|GX$w zJ@Cf#)a8~~&c-ETr&k#DkH#)mE9j*Z{m4ES$5H~?HhWB-Yt!>73fUgrh)Czl9C@0` zn$kEEU45ng*(X<~gf@P!ocOxjL6Tn*BbJ3!UEeIADX3kbI-8a}8_*?u zt9z4Q#GsKiHZ{+bV#d_KjG~zrXn$)6-K3)AP|C-X?pWjTUE#OxnaK=WuC_;C1n<=v z_h{(&?M6KCHU#EtC#Yt+OtvT1b8Cu{9Ui%trMV%6W`5)!<}Yy3+PPVIA7Lc6#nCUw z#wxaQb%%G68;rid${!-}fk47jrgWa56w8X75P+zIW5rjOH`;H&Aespu-8o|tw= zt?RXanm;~*^%>qI|MbTXEUxF5q&6#P9X+SzYdweMbuzaEu?LARo$uV1a@(j43L-wg zr;^3XDSu`>p;|nc**#QKMF|-v#-1_hERTE<3j&YUvs(B_Kt`07tX39@`;~fCvJwB< zkK`jElU=p%{SWG5R+p0Hn78dJQBCe@i-Xp!pa;x{)k4Z0&`iw8Kk!PqJ#EU~mh-47 zX^AN()S*@&Hm4G(GFN|Eqn^U*{aJ|00cMufz?papLp~f5SsiIPLzpxXqur+_dq#b4 z_3{@QFmi5`x1fNEE{DsCW!tQr1L$ieV!;I1UxpeAp;|U#)Nt8;to@{z0SWIJtnes# zF0l=LWtqh-UVx{{&iiP~V$SB)&I$V$O}9 z^5~d4ItSGJe>8vO)|$H4u?H*Rq(t$!bHho;Vpm4x?G`Ad1fNsS*W%d2JI{fN~z z9Uk7p4ie4v^Jm>&bCa(hzEw{~Er^7=SM{0I5IV`2sA3dqCGfF6N?*%t{e!SSy-(0} zXIuS%N4X+7?=P1FO(f>`h5}1zo{-tqk`2S}bx3x93b8)71uy=O(|D1euVxSfpl*Jdr7A)8ok_@K%c4p(o@+rUDj40%>*abCJ z;^6)1jN9!#=J$i@?6if0A77A92gxWM2H4wUqX8)3HYIEZq@Q@IK2;fO0ZV&didS`!)Tsiqs)Fb=gvVu7`lG?c48d;>nsC9z?+8gaz?tDt84EVE;jiN4YOUyt z;x-@SE1=Q-)-y7V;x^UzhpV1nj3LYt9)?QissY9vjq7Uu{>-OyiLH#6{#D@G$)}u- zA3;l6lGs*MIUiidiSyGAnk3ZDJmeuPCR9~KaqtGv9>f)4)bv1hiGzvIh9h({q^hk^ zUxYFxKvpoNQ$l|Yo6+IKaBHCAte5Ilbz3_%0#z=zq z&SGf7)qPvwtj~AE8o|m;pZ$km?01__BKbEE{YI>6&zJvHsJg2u)ueGKlSIq^&?m-% zsjo?s!m2g5fyrLda+okK1`kVb3F=`1OHq@cgZ?lNTCklh<8R%|0Fp0L^h&V&&_xt5 z@2E;UN<>M8C$)kOq9sSsqGj`7l+(J*eh5&LwsyumU^N0`&2q(OoGtXqfUv@E1=?h< z)Td(Cmc{~8&7cGZ#5ZBag3}lBl4AkFCF7n~E2WZ#r)Yh+=$^QMm5t}r+F}K(;h*Rb zFYqHvFP0~ZadT_Si3ytdA-e>iuZ#Me>}jXI5A7#kM5oeh1g5&t*HLvnH!@$cwCdJe zuKA&|UWuanGRu<`tv{$To(wYJurskkBZgr<{!QPJVa#?Rc_K2Fy$)ExTb>U+M#n zE}^k<0MMdO^rbo18@0$5Ps0u=+JHGmS)vxn`Tm7@DBzXV92Kw4@vW&=U+yr*SMNHv zDW0U=-F*6$xq)qBbO#x@5`E+a&zb{0e7-sE4g$pCw7Yn*H$+(~8*%zz)tUuADZcdg z#7)Jxq?jud>9JOqDP+oOW{JX(Xf0l&53au`Y~5`&E5zEqeJp1!rjTovJA|Cd<3<)> z#`*J0%Y1=;Y$o1HPO3?#+vD#(sT2->{&x(E!6EJenvLe19T0W`%gT^) zm6}cd^4GTAme|ZOvAM_{CG#J{vw+kR54{=p?V|8pKj&lq*5`UPJwnT}(Z!XntgO7c z(X_MIv`g4N-y^RP;QIPEqHnB^Y;FjFwzH(E4|^v^XCL3^A6I;xjox+Sx*xxfpzFnZ zu(pU4@*cg7ork=f#xL?a>UdJlYS*_}L^6nXP)@QTvlQP!EZLB^ks~ql0}tCCi#~TB zRq%#}Y7gH=!=AFGZGqMJ7g-H`&9rGYemU`){yxq*xuXAMOPub%3*JKk0O;WX z{OhSv0o?7KOdOm{ot^339cXP0E&sbJQVgcGGcxCc^B1)U-BdL4mSc9$5u4*Q7=(1I zM=^vqWu&z11l|VPv_uoJY&7S?UY+(L&oOv#B!L4>9}+EOjIj{vqLLHw;~Nz?R-$By_i>DHmIUFt zh%+Swx^hO@GEZ5^qRDhT8bj$HwPPBxkZ?`8+Kg45X%x(atn4G=e8SUP%$z@hIaG%A zUh6`@0=wv9C=P(S6>LyzR52yXQfDm0&Xp2+5D2iH49T!x&V8oq*E7?$um!=NC1&tvg;vs5Mt62 z?#)!NEUV$UM9x5oZ5QpXX&Na`X-E`7n(38f57Gf8EFtotP&;B;upj-`x1QjZ5kyz#5!Oie_? z0MjFe~(Y5C$jbzK8lHrmeyRaR$lUQ=GCK>^mb5rXZRUBQ;T? z)4&B~Rh`egpIn|lT!%%y{&M=^VuWemfmwv%ynbFQJ9$X_NcN9}m{qQ90-v~;H2WiD zCtxliw(C*M2Eze2qp*Q-uv!tVLLM%y0fu>iuVK_`(1H9zex^>rAtF@+@i>&Rb~hrQ zAdnKeWJZV!VuO~4T^KFZ2&>VGp?PPP!JuTyY0eS|%?f2~h@_X?@#F*&IPCIq{;2oG ziEQXV*$LQYeOAm}OT$|TnBl7KDab{HXe5n*Yedm=S+Z{=r9D@L)s|MVP& zi&|25i44*)pv3r$E|X+lvILB4prPOH^?Bd2E$oV*2?fEzr3xC^na1_^FWy^9l%fC} zU%`aariDR?9`=e${H$#{hS$5Za5ZX@=gSDx6F861#75r zE;V88wrQnH666KBikH1{(|{gs4Fn)UJ53Gha{^Aozj9c0HnFGPE8S=K<9e9U^08Ja zbXfKd>p(adGL>;2%Y4JRrbe{9O3*X6_J(7^USJ6FO=4I%hZtH>(LUkG2vQqN^olAk z=T|6Y1GRMol4hQ{V1oH6Rd)?YvyJAlvyA0E(zMx2f4w&$ypS{28-?<((G2Ce|Klgx zpWyy<8z65VaC?L+l=~Wc3tY&hL*VYl;}}<7Rdb-X zU0F&lfN0LP$a|Zs5fSYnhe}!?z!;`BX@Z#FnBakh&C!a!0(*Q1<2cn1U+jC-f{LB- zxO(NX z3H^Qu>bLFJi#nu|3xmnEfw-W;8g;)rCPZoj@s2qF*02Sy{q!ca%|A~hphcQt&b$%?ITT%ky~Y_J5N9=j?u zmg)x^{)_oA-?k`Sd1>^88LLAdLRFFsYPVbwnzC`A#&z7rg}RLe_QNg?$$HB znJtp(vjWn!z{z%=T4CMS!xvadCe?FP7Q&!wIovC>R5j=?3~^hy{6q^wG!uBbTKB9s zWS!1%*A>m!43)68R@%bE-Ki+UJL-VqOd3#;dCU^B+U+K{MGeL(iMd)jf&iCS8KBR% zO1a%w+vBF&&J7A3l9ivkX+Xk^EdPcy#wOq~XTWvg8;=_lY)c5|3!(zW-ovsbA1`m+CeD*g7PXz#cFqgO)yg+Wxh z`J%H;Dew6d1)So$F@R7*R736zs-)5{@*cC%K;zJ)0i~ajH%(c-cTSAv>5KHxiG`E?-J;yE6yWn3h9!L z4KV@8Svgghviwp7SSvao!&b$kxiV#Rps*^!&1ez(vvgl$IZ91iq>iy1S-*)5H|cYp z0I$mD;&9m{N6jFmR}jOyAGscf=dkZ@2lWoq|3mo$H?aVKzYU;N=34{s&~W`#)-%^O zLpwiz|2UA4S33*CyyuJTfd}CuZkVOY_3dSCt|fon=U`uYfnE$P{hKNn>G51#S=Q_o zSydKy&04x*oR%!biPOZb+c~532O=nLrx`m*o%~Bgl@h2K+{D$uzK$uv!0eZ@$ZdtG zAHQ=Fmo_zKQ3X9Rnlc+j1nSV?Km4Rkv8P`}y*^}l zxDxbxBFenpZva$|AbK&jTU_c-W`BFw5f0wqVs2uOt1NE^2W#Dn=5vGo$N7P7g`+;N zygF&&7Oa=5yvFPDY7(pO`#BrQ+hDR8M3#{*9SZV1fIr3IU8kw~4sF-p)sK5QUyklC zU5S~)T2A_Vq9rxIF??mDtb&(Koh^$@7_j9u)F!q~Q|aX%d)8&sT+z%~6%A;(P@bHa zeGdHC$A$QzISY;GP#RoVK>f&!_Y?hf3l2~$kEwDDSYuyyrlH>+_l5(rAt~N%CBJ;) z`@)t_n~fIqnt7P5V~4b6sE;j@iW|8SPB2__6UTuDVdg4M-DHHTE3EL7d&|u(Rd?am z%%6>=)xKu9{36!1Wu~)yWY*V}a7+(8_ldtTBHK8@{1`ay>dzatb>b8JureU7SGY#>|-W zNKLuBZ+Emw;Uy=C-Ltz6Aj1J;+SFj?iI9z{Y6xRz>h(GplcMbFWC72JSDPUV7q!QhgPZ|`V*jq56e*0LmESL2ByMG0idyWu`o7&3wn-9aPbxJX6f zd5*H2I#b=sxcBCJ>Znl$RM>CtS+kax0dKTO=s_jGMkby~fCK-!~t131%czF~qj9hnosB$5N}Ag1O~7-%zF48OEv)3wSa z+?tfiv4xlSqQ9vn>qF!tF@8oEfI}6&c<0m%?mCp*Q5(P8B4lQ>-#~Re4bWGzZDS$6 z%19pP;whls?u_MqIE!9hlt2H+I$EYp$5!N@#Olqz_+O2)!#}&!|GK_#P1utjVn7(n zo6&cK7h2-nf+8AR{?`Wzn+C!DL4efswjF9ElUAzw?MdVG*}6P&-osDpDyV>!_T~lS z#n4X1!+paVkT~PAg&uF&r2yGLF=$XgbG|j8eT4OZ)r~;|#$V-6QP$HwCjr#3ih_(8 znkpjHQ-iQCZm&PbkyS?fbD(O6pyM5%@U#CdKcHoO+noYth16o}j8du+qb^&ONd+l| z_DU;yBmjurAxt;CbY)5;0s|>xX-?Osg$C&wa|mc$2?B@e)sU1jInukLqOC%9#yEU+ zr9*Q%wc>5k{CIeaumHXdY^peFTT-=fkF3EUq1-;1AHNsN`P4^#j5q>eBOod=F#7oZ zXv2g{Tjs+-xC&lZE(e3|;O(4as`=aAf>BdCP{BMnfi$wW=YSP#h9>=iHDw%lC;bkH z%~y~AKYtCJmeL0F{@W?J!2tkZ{pS$l;$&!SZS*hx>w~nYf7)-cA^dRuP}7NNNrm7` z1{i66k4G-+>OLiG$T1Vpf@l>I6DF1?xZo7c{Pq%4YW_3v#I6U8FxNpXXXPfm0wnUj-~o1rakQ zAP3PAI1#RbP(elX^3WJnp1?uxWMGa0U`v1sfE)nbuhaSD3kC7>^?--;9T1pm2bCp| zT6rZsW5m(Ss*10Ohn&ZUVN*#P=&Zt!B(10Gh)DYkiEvb?X80XMYQL=uF$k!bw#xaS zIt>L%*Pd}*p+9`w{MeA5h)I9R_WzJ0WJAuOyN8~ug zcJGl#Ssw?XgC18w@AVBC>VlPeikpS}toxun0zj^kLlD{XW%%Sy*G||xjGchYwP(vN z%;X#SqqG+_0INB`^68g()M{Fq<@B#*2WYjTFlxTA0uyb_J~} z!u5);f>JC9TlOHIu6EW&#Tyo>QeX@T4#2=OV=7}d0>BuOinFR__G;fH_)CLj>|-L| zqoqGthH_s>5e_AloIRo_7Ip*S#70qyL5=1AY``yBO#U-RojT9V{VqmO_3RKan$@+Bk1)Ei13X1oK?c4Hn;^eF`9^ilU6Y{v(hC7Z?TLc#qt7 z05`IRnYtl(CoXw0E@v-0pDF!d<;$1jw(oRb>b)6o@umFw^fXeplLXhDHOtM=!E@W& zb>5Go?)k{?B#=&Iw3aBTage?|+NaT2U5*DBMvQDTdO`;fJ!i9oTvsA4CRk?#<9)@K zD8*F_2)_x@3yAjv7AKs`kf3BMa+G+aq+9`%Nv5*_o0B(fTx_MtG&4hGf`xmE{Sz|v z@1T3b_GMfK?`h1I>Jk$jh;TbkYD~E;;{GNnXs56c02`D{h7*QdqJ>NAe{6`RE z>So<;D(d0}(b`_V*6FpqvCX>730gyBF$qJj8XuLz$}!_W^cdsmitH4TNM_>lsBY)} z>G`L7_N+8_>3ITbRC1^$E}vW(A$pXfSVq>tK~^6-x(cBVfo35zY738Ya2j8&72)oQ z5(S7kuPTvA*jd`3tCTt%Wmih3R77z4opyME7H)a6C1hsUz^fBkZEi z7;>?pm$pgeKnRW!7+fn-ToGrr_!mCE$(1x19P?H7un)~n3n2ARQQ}<3KbzB#@l&~b zW4Z?5u1)bs($+iB8F2uOWChZOv?3Yzb)>KNC}Rh25Nh#C7CcssD~zwNk;g?bdC6Q7 z4S4yWX<>}$enEl`&PcEnT$dW5M;)52FOBPlV6g^Iem06{SH8e*Rn;E*uE5C`1am5R z`%$(DLwL9xG&ZYeFEpqJG`f;);fV_c&f+T%>!ruE=*-h7_?ocjAg zpEFlWVM1A5X%5eBOj-R$OuUf$D`RW(=?BOgt3_3I$_dF?Q)P_n@qR!B)Wx#V!?3L! zr#CENEFgxY9!BDaCs#g@q&`-FC12bARFMk@P`@!sa2wDH`i;*J_|i6h*vB8=stKpC zHIXhwHark>$+q1(2P#9%AO7CUZBNwF1wqU9GF!P2QGrSLlI#}QPGhHo9N53G|Faa} z8MB|9kcO$}2wT zVlyRtOaK6QF#rIx|4{{PER9X=j4ci6Ts&M@x@%+THOVI+FBa@Y~J6jwLSix&iSX? zljkXEQu+BjzZSmc+O;_9@7D(V9N(wwwz%X@hpZfX_17T24vvz!-uKo+`zQEat?$Jh z*k8l$75?@H`+vTrDj$_~bIba_FX-RX!TED-t&8YpK9^f&qWpZ^Yx?}YPv%;u4-e1Q zC3;#t4Zb^Yt!p_8EnCfEw=PSe1OH&vJ2(6YyY z=7(bMVwB~Saf=M@iE`KxQ)<%t!4kZ zjC#5R27M?Mk!om&6+9wVUV-fRB2H8-Ie4#|I>fbOyd#y1rQda`D2Z?ed2o;<4S z`#DYC`x^MzeJTd2vsuIZ_?_S+VQt2n)9tdArXe<*klxF!{H2GUXWzZqtFs@QJ(wu7 z=_v+cy~1Fs5-*IZ@wIg$0a1YEf`%n-xY>K17w-B^dE%x}8_XMZW9SX~BmMvgyL!H< zeF?r4-lPEy%_Y7q4d?I6y~JMa8i|tJJknMy@pQ8!k=DEMJDQpt6N?sPWYcZxvp~Js zi@)jK?QOoipgYA|)-+#~i$j3l57LEY>9?>WhYFs0cHA()THI?$Qimv}fIZxgN2Za` zk^$>y#5bk+^?)f};2xQMZ^326su_VT;mN*RGk&=5oKD6JHyagjbiP|NKr(J(!EKhn zsZ5?`uib8`SFrxwlqDXu+ZPr){}U9{rl3zkd3XJp+Up!tBg+x8HU9_7=tm%+eCKz& zYQ`dKn6fY_d^F-52HVJq&(gr&fw9r2;nTmb06k48Tw2oPKFSQ z6>JJ9TGn+`Uf>I5j{0X_+j-?;s2Yi77wX9Mcp4AQvGmY!@!MTw=KQ-21(=?$Oiwbe z8C2;cqOH;qV2!}-J&DD!rQ_}-S9*5h3<(orw0VA3m_R(IVmfN#xx0*p%bXf;qKNg} z;J&7$JMzyumqb~lAO=vbyU|*9T+UH&G(wOgq7SMN!8z@s^E1HN3}GHN!qfiK?C$YN z!LW_};K1>G)VAU(5|`N3;p9!b;imB4ODV9%#x@f|^AE^f=~e`rMZnWysZ=^DYw!6% zsRj8DP1MM0(S*6DK1f~?ZxDz^Ayaq)*lU-tcpAfKnQvX#QgkkoZIo**as1pl0egs5 zQY7yrLb};bvTFj{Z@Q6H@o)`ZdPT2W?Z;6;BE+oQ!=<>ne2^PBnqzeYYNh!a7Zs#_ zk^ZB7ke`S-llKp+$cvEIb)OTn(@e+%X*oK-YGgbL@-0|chP)#bIov2r2cWM{U zdGF=@XtTP)#JiWA3zGp^;_%j|d!F zi0th+pdly-WDlu{xEZtNs7POXKH^K3ipBu3q`>8NaW~8-?Uaj9uXD|0L)xtPx~Hv* zbn4MKEW@EYQZg`_QB@n#UC&PRP_c4-4ocaQ9Gi*u-tQ{xb*7C^YmSI#1Uw^5(gaNZ zEYObO?r9Dp7epd#s-dgHmskN_up_ZG#0*>^H@38|bbWn2C|O=gjiJ(pCXJ+H8_r35 z_%Q4MD3T=X5-X~}PV2LQ!_d@ThL^#~1oVbp@+_QyvN;k6lI8InmCsz{`Z_y@?hfW{ z>S6rMh&0HbezL5lB1E$ls6)DBh@Y@$)}DSQ52#C0R6tsKlfLEKi;LCV$tX7@^o}{c>794 z&QHHaIF$;b&e+w@Qhc4BA6BBOZuOnzMB@0oe~$l#RYg5!6Z`at)RAiN{`1hzA1&Ca z=a?|%4ro)Y?s1%3lyVE4A@Fxk#^Ocm}$pp9t z!8v~t=0>z5OXPB8zE-l!T`kOCwu@PZHbC>-|F*};B?O^65=U2tmX4zY9^BBD^5jcfMyUM2+axOlNd<(8K-;>cP*4Z zxIndkSf-EhvT!M-n|y&>;lbOiU09M~v^KB4!uY8aAd<17lR=%RW6W++Q8S|$2FPp5j$2l!NDGi2om_WpBDq7R zdb~82oQN2tfdO*G~nhKm})-!MbFg!Lh-W(*7n7j>SbFPfDDp=kdn|586|c%ga>gC*I<6b><*+bjdA??j>gS; zz)=Nn1rMn>1A>hl8ACHl+TXpEmCz03of3FWGMhyqEa!=7Oh7Cz7-V~F_eUW_4YM)=U&o zmM@{!Qm=py^O1K7 zULkSf%`y%^RD6F4b9D$2y23}ZBF*&JQ&dU<5$p(6v8nZ}nqo#{!3%|73=v%+9Rh+O zB-8vlZMRKE0e$ZTg1}SftusU$c~()libll6VrIBqv8488oQGj`g3FCeo=z|6*^JN|T)P0`0=;aIj#Ds?*?JsvubXrjwR3#}e=^Bbc% zRsZrvEwn4$b)+@45q%|TFZ|cM?Tyx{N~oo~PvcdHANUW_fa+wHJBXknc>Ew%A{qdd z*6w4J;|K$|T)nyq0gtyZ$)yhN(j}WhCUi3+LoYAHO21u_4|EhWFakt7au96cLPFL> z6iejeT1(dWq>4haaF&{$a)|nHp$x`XpX`Xd9;qFvD&R{Z&{?EJDPFjV$;yd%o%&cZc#|b!has$}W z;dNfdb|ZwO;>-eMOR~zWY>GkZg^l74R#OorqrdGA!LLLt`$ihEQ^x{aM#=Qj%dioL zwX9K<9O~{WXcYF;3JwxvkwKChS*Xzg?Dl*lYcU2u{!Um=2r)QFRVsX+7$0J;%U$jjk{kQrtYYB@tXJzrIBnPVfoKm1!ksS6wmW z01nCU6pR1D8Z99V@$e2H{MN7Sa>Lmma{AvCpFOdyrS`L`ou(hnXqk!+I)=CMcfuAQ`QzyO8AcCgR9c2pg69wYq zgU41FA<3G@;y){XdCc}~e%GBtmXR3d)|v*D;PaUFW25U@rOa#bK=nvXo=aLJGpjI) zcJb0s^Y(K_q=bp{R&%C&B+gHO#2d}EICdaR0J=(XMvBEujX(Rt?-z7YL&4Y_r~K>8 z-OGzuiq34Zwz00SG3a2**Nv=1$=D*jy7SVqL8QbyxC%nYFCb<=ilTWF74V@#57e)P zO#Y3aZG9!wB&qi8%(%`xNo4x5!w?%HAB2gUP8DbQ3Lf)VMyZ%?lF%JuE-&fKgixs4 zU4Im+!-!%ir|`pD_=r~FD!3n2;nKZ37PG*kqg5ZTkVUZkhF$WxEh@H-H=Xf%HvO)) zgFE5Buooo22ey~!_@vhr3d7=Ce>sNA?>HG`5sRQACSlpzUr9@uT@RyB%ZpV^;U*mM zo0l(<+c^9*iVse}_u&TmTRcd+shAQA>A|#;E@O?XvoreF!T5HwcP1g@`7TxtnQFw| z*!7{)22|5k*oqEK5D%qIcUgo+1Zw#tRaJdBl-Vahz{vRr!G|2|1P)Fs)9hBo>TnFJ zevNlOMWa!ZhldoCTu18YE(J%RT0=JyhqoN-B};|AI9!o(Q1D(wX^vm2%w)-f%vY7COmzsLkbC}{X z&x5Xs21Q+&7yj;qjTBn13mhTc$Oqp@PLj{G>lYK3cQF&A{`6cWIxm|SW^^09mA z9O#1zxGR-Ckm^x+LKFtFnNT`mt>+Wv)gK{YW(0Cjg=~*fo7An6&%JgS`B+u64z7TC zKf?p5Jdsj+1th`}QcKLf>3{TCRnPImn}`D1e>H(MBc_3A9$Y_5!y{4{%aoNz*1BF( z<{>-Tmr#iO;#2T%@@SNdRIM>Mc`TFTDjs0qW6o|9$PS6-9oi}_uEqNG{Jr)*T>hv_l&+%}5rV?Je! zi7rgbvvzPyt+$@kqj>Qv$>S=O&FLiDyT$5TPmACxVB6}r+3oOm%WXde&!<$@3|Ph? zQGmt%1#0>4h%)xjCRO?6oTr+Yt{8F)5=G(nQ&eZiR0%8xtM=xn|60#gcyE zpNH8j%QwoIC<#5iIq$*U?jd7x2c+$s(R`EwIuXq15tnELS)07mfwUzEvXG^3nFe{c zP((O4;aBhtH=>S1d1NR)DMi~+fpf9~VS9?fjNC22D9Cox$BxVP*hRySVqI-Z>2Me{ z$waPmbpLms#k}ldS;lXNzjPX?5R4(*O^2Ri&+7we8_T|UXTXV~4(Fv*XUl8{O=alq z+5+(+T%wq5Dq$arrj_^)BQq+i=7)1|W;C8ML{yM~UCDg+G;263#SKKdqkI`vSuMdP z6x1*N!>Eank|*w&hu6;X4bSOVE3x0Szc^#v3fIJUj3etn!-zhMxAGE#jZ#h{csWrN zIJteI@d{C%Xl5n4GQjs)jyTk+ph}UxAP1-?d>FSZ8ph>wY52hj%U{e21|z_(RZ!(L-k$682j)Aj`me%WabKiiJ)}nokuvRLIU4I*yTV zEVW(}N3ABMu%O*SBiI#c4v&odohEDH1 zQw?7{iT!Y2Ex;qw$}|hbWVncVPOg zD9rVcPZi|$+EWlJ*+cY0eq>C@tr*=BAo&57WNOb-2Jnw!19UT(v&FnSc>@L~i>;=U zOmh4ELXNZ~>>kltAjc*;;#sqM4iuacj*L>F+jSYjiznkr6OYeu*JTe=k=MI8E(XvR)b1({kHV+&DwzgHQsY~)ZNCa_L7Z23 z)igDoe)OcLZRaxD7rD;7WO&rTJhL3BI8z}!$WhMeeM^gf&Pz?-*bcPu8mTkQn9K(^ zaG!J@I^Pc{u-$!w-q8~U*!i)>z*r)O80@sCNS)~_PydELXMv;aZ!v#AF|$Vnm)-Xk zi+^&3v;K43J*v)g5j`l4&~bY!;ub$18wV0d|8gnK3kOanU2XOy8V-ZZ`UdCP zC_mcfNwiXe_Kl(!zspg(0HU^}+)jXOLUYo$WYA?VVPDE8WTq_Lcl~&B&`xRle&}kw2o+>BuK0QV zst|eGws)o0-gjlaKaP?-bR4aVqIL|ymD7D$6n<$K>*;n8C9r%IM-TOECcLypSm32-5#Qsac9Gy6ZRT?KR#%Nh{(A468p3H{E$`n){zm zw^uh7H$CNFbY1C{?W4|AJUI8`!9m0NMl~zCaCjxnsSIN)t;-c;=x!dpW^m7~BMXl^ ze7f48rjM0-t`}c%?P1EL4^GdW9h#?c#@@yWo%Bndjx1fZnYzjy1Zy&0mRZlB% zx!~@t|NQ#?`0?k%m;HVGe)s$W!J<(d|AJ8vAbc=Yud6%Xb*Rkh{D5zP)ZxNW|WG;h{Z zX{w~(->7msMQpl<+H=X;yg2xE#*~+R!_O@Lm|=T`CsEnz#k7g;sC>73-@+3KuWv5y zSfXlFmK*aw%v?NiZR#V#r%id8e6rVvjx~NP-4Za*=Uv@HZ^M^#E;06H@8IB`H;z?N zw%ei~m1b4X7DLmUXOw!MFaN}(ceYjdbY#Gx+C3+fxZ5)&4t+<7E+UGHQyTCVtzw&U)%k9wbI(DK>VF{?TzzomKqaZL8k(WQ)4FEqGZ zO09{_(eiQd_%1DX%?z5}HA9)PajF?xh83^%-^Twv4C{UGjQRH9$cw8kjr`cL&yb4= zP4Yb()ak>DR!2vbyU;S_s>#zwMvQtf@mH3N7j-R6JuZ}gF?i1IS|cw6{@T|1M@($` zyFYvUUT}0>)T-aO!IC6t&SW?xjX$!}V)j@I}@nxl2H;w$d+IRC_y3dPq<3Po;)-)_11^uVt= z)U55LHe2t7I>=C5uN=<`1<`9jK>dYp;M+* zlw?3sjFk|FeflmT{P^@W;kjO+z^=KC4eA4tBa;e@)+%s2f{l$Bc{VPl2!7e3LQ=)W z>}hOlP>^+Boq|v{L=mW-i7QXm)<28;6S$U42H*EOlu04ZhE^Y@=`G+20hzf zKAQ%JK^~JLY>w1KbJo+6i524WEzZn0r?

tz_Mwc4=nX$mM?BwF-I>clC? zivw^AwE}}y7nf7nY-tTVRu5qGsEu}owaJanl`ue*E0H)^qY0|x2AIug%xZJ2^?0ca zi{;OiD^(9HjslB;42yXhcz_zA*6B3Hc&B=7m{UJ$9c*VQ7-sc&wuu|CvYsKHVL3FK zu^%>b1I?aPWE0|wTuXX{OW@Mc*8YO7jELbVz589vY>RKDZ*#29c83C8=sAL(!iiK}MC6JJ>? zI@Rl{Np7I`u$EC`N#uOORMo39$LeN9&^eb%p{T?#nR>E&Fr;3s?9;AIGYt~O>qN`3*$Pi-g+cmB8X@4 zpQbADGvll#P*`USF1}IUe>U9>OzWb`a{LcypRPLEC#hqvyzdmc9&5;pNE>WcoHN4> zG`S*?8jAn=JF2jft9^IFU8H{RwTTY{XV_^Aqa5oW{F4Iie=Cx~w2Yj++(d&9{fV$Z9iF=c# zbsVI*8X<{ozf=x(1I<>m$3(_hN@%fGe%_@oRgE?sFWUgE?I~G>ayO-P!B0wa3at z)`0q=;r_mi&5Ro62AE78X2)t0^)hHULd@PQLQ_$Wa04q6+Y&DH2fuqoPrL)JBA`Cj zFmq3E1I?r%?kBM#5id))wH7T)x=eNhO}ZqZP>pw-P_10q{Pa9{8yU5jw7lN~s8EBY z6R8Y|4GAIrPiuVXP`D34RJQ^3txZ7OO%xR1XiGTJedxU%d| zClL})9v!6pW7lUiIKM`b1R^1$B{QRLEB@+?_&SmjPygxjyxu}IWHeh z;FA(_n=!+^15hPQzMxRlV~p(ZlhkgkSjg6isT{{{Xe8d83o)pTVNNFy*DNIOikS+< zF^sy*1md@+@pu9;TD?YzD%80EmTby9Gw&ybA{mZGaGh~#XER%*^%&o5G+=`zUY2{! z`V*??8BuA9;FfP72Ad5^*YoliJuXs%Z@-x%W1~a#9X4xVV> z`<16(F6F{WAdDsq{OddEJ%+dH-whq~9C6{@?F9-&iiN_Oq~?E~&m&T;H)x&8AVt)K zPm|G|+KJJOk-_Ad89bJO%?I6(Lc!>r(JNjn6pu03P`G@B=QFYRgHtJVzSrxl39W=F z7_2WIn3mCFDOkd=ixMFAShd}3|7F;zJC4zq(Z$9D&u0;5@kKYL5%xaSuK&R$vLP@v zXQpvwujkXS=LI*W5>V??o)eiBif0(CURq!Cd@2^taAOudJEZ$Qp^!qc5reJ9=DzTJ z7F?KeIuU#6-cM02CL<~_GT4N<)+>|SX38y}XzA{(EF}w=EL&?-_<{v78EnN+F}>&b z)&&fI0#a)ipDT@TB0MO_XvLW3;%uHzfC|82*&tCb+H>doft3a#Z7Moru;R#`<4>C+UEyADrA6h$6WPHZr;D9CJZ+J}aji6X05QYSL+z=v7dz3Fx{$suZL%QWHkN z^(rW6t-Nl4Rw`df7K-dF{@h+;)=ThH6ZE--0EHS-zzryV|ID&P=6YyS+l&QM9y(zF z&{MF<%Joh`H*h(*YW1iIWSJ#$?Q<|D$4@9T8fU{;(4B=n0PPuzb8t>U@3a_rs|+}8 z0ZzGN1ysVtO1J?^7k1$WW3&XK_#%rlAG*leUeXQ3P=n53lv!L6^Evm%x7Jc1H?1h# zU(8#|eJG1ZI6$;P4<(L7i-+wnm#OFuBn~-87+g4{^&;}?xkhN(8&JNndj!|3 zxPwQJ#<``u61MnDjrhtA0_^J{0h;`x2QtlV+El0_{e1doxuWDjK+>bnYQ&Dl~L-FE(7 zym<5T2n=yIz*s{}+1OPuB1l(Hw(6hOc^eMA`7nIWt*JaKHFp)y#Ur1+N9*g6o|HFY z77O*Wm8(!5oJ!=NXs}w@##Ja6k0h2Fz4piR^a{oHB6fpB>O(H~YU@6fOXm?s@5`HV z3m|8gwL?;!bqn(pQsyvXuc*_iAkF)(gRuiwy09>#4=}n9X|^0PM^LdHLu{7m3$OKV zcZWd3iWeDSFT>$~>~>DizAobucW}B@^)AE7z+c(M)o3(Ap@Ws{d#dhJ+eR*e?4aMyPgWL%vs>hirGrO=XAW_+sV|uE6u?5-!<1S8>vAcbfQ@e^| zJIo-nbxNwCjMK*b?=6@xA*PgL5jH0BWZQ;96HJoTRUFsODx@D=KahV`L7=OWuA&JKDs+6RZzN`a zmtHIPriGpsBbTyR!&Rd%z$|_AD-z zBUU|ftfG?=s_vx`X_ZP%B5`x0`FoF}ReHi+Xi_DA^7e2NF=}(9Z6`qr_gRW>2iKyK zIETTWa4GWT4{+V!{7TaE6$<}EhQweu)f%ME>Y4b_*wL8G;fRVxrvf;=W&iJdIC@(h zgKd`IOOfr5;oXo!lilt1e5js85sL$AtS0&u@^B*9!!R1-Lv#j{$q;SdUzDeza0FAV-lQ?RA%z8TZGI$ekCcl9&z?ZPrv0Ni zI5mX2%g$Gd&yLk41}p!@2R%d%$F{B;ym!sLp}v% z-4lXF69(7Arh&-x%)?0#F*p_fl{?<^(@jSLz+e-=!bUkf^FwPCb_$)Rbo2^81pjUh z383Hu51~Wgcv_9g4Y@!3b}iG{R|-Wg>=m*6U;6LQCgGI-zW#%UM&?#1#$&W#{65E% zoF0mvi99ZffmFkl^JZ;J4sQjc*x`yQ{1bIRQbjHo=i+Rurs9rDs@ol2HBo@@k)-yb zisIx=>M9O@<-+XKB<}YUT~mC{n{~w#pezJ)Y)5ruGFL%E?-AI&UQX5Nj;=}~_k6N$* z{n9!Ckn5m`ONM)eg4VX5oB^n#w5Di{=<6%Ad3P;gVo@|rFp2`-&}nA5^RcuN=MtUR;Y;8Mw971uGi zr6SFA3mUnI#HlGl8*W+MT-y4oj?icF_bsDRZ9lr4oZvnOi{PNB&!lYYCKT7UTV2B2 zfh*!YX%Z{8XpEMOKkjg_@(XR}A{4!x=(LH@$ouoR(>Q?iqp^^w%w1eW;^ZfHF@-So zxK#3rxA4f#`6%**5o`hAkIJuRtN==9KnQa>cjMBZ>J1=r42gmzALxK7&tBE{@VTN4Vbnt;SIDI!p>U5IehBGx^l;5|+-OcK%Y=Lq%l6m#D!i z1PbZZo5!ao?DMjjipKeOm>(Fm{c+sVI3K^6PmjFRMWP_x>TM;F_ol7OI^;d%mI@qm zZ)#B;?-Qp+PW3DG8r-uGZ6w*{xT=KqeFa?cY7!=V#VP4F(Ru1MW^{7oFYyxvo!HS} z-FMU)TMC}Hw606M=$lLoi3qphFdma%&;-${x0ps~UYu|>w%)3qz20HkEX zlSjsANW7O?AL_!j$X$#dw3X4NWeq%_fGFwccDHO?t#S#j{t zJmm9+EftC)%%qPL6Qvv*6NWMur{Zxfz?t_9Et{@cFQkOdz6u5RR2j98?bXDIn>0q} zb3Slu)vGt~o9S>&_Gz_#4MfS}r4ksobHXv>LXUPw3<sU7tXq8J5l1+lHaM6U%l7wn2l(PyB7lE*c~NG7?0$|x+LgL6E$gH!{qj0 zSHCD@94mFAl<8$}y7+QB?>@c<<|*JW7s?5}`{h5P)CpauR10o>ytoUDjO;Y9bM_x2 zO4a(d1!9tuJV<ZYc_iC&tb;vplPuIa?h(9`=y*6>^^M_cy-Nt&K z^_YTFMCn^1lmuDvbjt-&nr>Un6(ws;WAbTt_3gwC^I#r@%L`M?0(q)L6fTIG~*>b=YDx2bk6!M5P2aaF&5$MPI&~vg)2owU3I-CUND*= zs4G~LymLqv!KHL|;m4M*C!y-ch=$y=STx91KQ2q%q6L@5)NgItwx#I5K&C7|Q; zM~Kd2Y733_$1_!*a;dC!Xv)>15r0H3{)yavgyU+PeI*8Npx|?1MTmnbNdeC6>{0Nmq^y!l^=eBvO4fCY{7_+y^-uQis1O4GeCaAhJPM2^6w2L4Ev*G>bA}RXZYv8=; z_dUA8f&BV)J%WBz`(MIj6oj80)B1D`7H&ck zd$~F%UD3rL*@}pqv6oB#N|CkOi&d9mwlc4VQZ@c`(cdFLydWHvZE&1CDn(pS(^wJ8 zZ1izZ=e^l&gTkw|>-PW%6EJ-?Wvo3Rg+RljmGIO@2OL!SqEe@zGy0^dJ3-u$@Fn&z z^xe}^gk#hu6R{xlWsMqrggH`)Qvuj);F)Ev<3}CfNbC%)v*zBvfV%_JWJ|L}XQkjA zW2coTvAF3!_?GHNr*Z!nA*>`0u6yvj6o{pW91ejH^RLpj&eHpZP~Mn? zp<(PLDf)VKFGvY{Cp;mExj@L?K>-d+2+QeuTs>>F-FUd9`CIh`uMY0Y8f(hw5oncruM{GKV%V>XUV=v zp^yTW99pH6r~S9c!4*m=PN?GQ*7uHq`CLR~V;6RheoIl->XBD8N^6DOo3DgZUEe#v zJjy&@mDp@Rz;=k~9UOzT)J@6rN(4}=rG{%Yx-ce?u8rB{08(}P300C?8P6X_sq(zA za7A=1r4$IC7hzECu-Nh8pehwMsG9ZYG^!SuN$y}#?=wr`SUfxwwTdmajy!PAfeYdf zXI5VxlniC(^P)m~9hFszy5*>>MIoHN#k_&YsL;|O&qI(TyVn*f;z2J~+FhYk4J z786h-zsIV#+5U}t1cPdTb`V=mEUF|0f)-^{@@A&yw3sV-EqwxbkvR{lH?F&z*)J$V1( z^Rn=Q>hJ<~`*@X33Z!>9Gk-B7CDGz;`=)z}f-L#E4O`8X(o2!H+9zK;VsV0OiuDeU zDvO5=6&;}f);t%-NRcN?026sCS=mE=#ZE+1GlTEXWDw0U47Tc8+*=BOh{kG>Vqzh2 zXH-C*URyyj8?2Hoj6TInk>$l5o=(ML52uM`5UbFEVst8sHB zJFUu7|M9n(NHZ@H62x3M`5OS#wdDVfKR279? zlMnNy5G;vT#`sAY_kG&sEQyfOW(VURzFvwhuZ-i(T&$EMYsj3w-50NhlHWo;tc^}e zltSRvkk-kItsk?Dt)SXJ^;&~(n0yP6XLHH;ZBnEyy$60c+jOR~g9DIgd1L0AUVA}2 z68^=``_>LA;#{<}&RZ-}l05rgv0|6DLg2}8dWCJ2zuqN9nxALQYMc9trCE{*JABcG zmj-z)E={qW$6x!TAgr0tI(e}yICS9rpnFr3W+;Kl<9%~MX&!%Ein3rG$+MccgnSOt zueW4L;KNhhyvqQkCs5eR_U9=n6t=Cz0}1uL>)^IT#k+1~E|?tZO@yG>-p|l;k|5-u z7LT@=j(3kds4BVi%;FvBosLopv*E2vQncBM(5i=z2cJ4fsL{}r=&U_6qM+5|q$ewyv~Q)T+m?^knTy3T zvYe00lcvs1bi{kXyV$eV(aG{jtXia&^HwOar99Da%6lJXgaC$ox`?ew)+CpLVi!nO z05LUdqsvws9h3A(WdH;@lxyKBB>~V0;#tt=22l>(pg24>b$;gI$P93St_~UaO)4qU zOoxDnabD!}N2Ix0?ZNa>1K?uYaO#B(a_zmOFu3NbRWeeI)w*dfcK#Pq8IGcdJzrTS zs}yNVV^zj_NYI~g`oBOWBu;u+Y?n!uLy9g9`c}eX0iSdOvIVSL(HgQohLFiR)b5;8 zgst5Go}|S(0>lzuC11MvE~ebfK^)ZjXa`R)u4+LHJWkNenK^@R_LE`n7|s)~z|Ls@;B1Te4pM=unc}XfFw1Wg;9q z#*xh3K)=r~9Z*L0KdHL7v133dXk%arVSI?|B#C0niJXwiP59_QJ@t&2s^J+8V~%3} zH*kKB^|MkMN$L?gLx|e`P*Ah_j$d#&^3Tb@;bTX~9EHhd#>$+fT{~KmwpPPPWoX+h z4uwM2=rbzgmp8}iL-r=bHP++0_LQVe7mDPKBffgCgne}o4Y5%}wSQtRLoD}jyqR5~ zE6kD*eD%s&XffZ~)k0Q&Y}gJ#E*67b?3SA-iC{0L7(orWJHjEIYi7SxP5ZWJvp3d2 z-vfkPJdnoVP6#px>l!<%S($iP^2r36lt%!<*5v5v0~fgk!(v;lZ$C={(2J3L?_kMObv)kND)7+$2Dgy3 z(FGNHhxwZ%c?WfHW_7#R00&jPuY60j96NkjBE?}AB54eha>(=nqO?034-N#2gu~; zll9rY$$86^f~Bs7h}f*UJe?$cJo3UF)LgCuRvK;Xn$zv+rl`wZr_s!e-f2G$gwugurz8auPG2 z9m+&ikoiZ~mSDx#ft6~xC2`m)nPX*~*9C{_W9G`kfgjWzdmMwGg+bM9Kzf>262htq zhk*2MS6YWEilkH@#i@Fak?ML!2pu|Ien}9fIN(c5EUA*PvAURI!UwRj2ohtp(#%&9 zh1H6MBTi&ufrI3u6x!Xoeek^3MTMTXsDdPpwU*`c!Db`s*+eC+ho;NA9ej{|GB$i~ z50s?OR|&^}m^z62eVcQqUPctOTXBAf4d2IuBmwNZlpJ}n$V3X-)0cvO*Ff9u)<&VW z%hi!2&o4We7$Uap+TZ^`VEZX)r`&*)2180L6Q@HYQ7k!#QF1P23I~%V%b`3W6}m1* zcxqT)SkL|nl_bwqXbb~lOQJD5PO5Hp8PeAPQ@sOCu;%*9AcQ-V1*q0WV;6UdP&lEWQBtfW5c-kWMGLR$G;Cn{WJ*c8J3O0y(M9+3rfC&x0~&_ zs3iXPY1zrfRggN$loYNoe)g55Z`V9yU1Cm1f>iXQ^gmLN-L&t*<@|&Zk{DdbwXG<{ zLR8GeQU32TFB|+8iXdeyE1?%VC8^t2ls5VwH>w;~lO*vCT~N96FeKRW*b`*e#J;;F z>2u!4__tWzBPD;1~zuWWDaHcoB0P-k0<6|z79ML0uQW|HXf9u%deAd2t^K3BOJAgRm^oR?KPft|#&}4BG@MxJzdR*LS7a^Em%i9~ zp75}J-PLBpQ9zZ?FDztlpOwS{4}98Ue2^p*+Pr(f8))`8w7}My+pbB{wkIJzgjgaX z!Qw{CD?5KcR64LASVG*8hp=f^EJlz-eQayqO8+8JAJ{C+K+SGTl4iBQNJ%VJlP21# z9#?`>frTingxFMV`XPy9Z=!K-Al5)5Yihrk_F}ZIYdwV zZ0wcRMa~cnBPX!OHPd2`M&uwj2-24+mAoAk4n@q@NIg*d?#dMfAf=&@65DsGl2j7K zo)ws=CsqrP4TK*#isv|sdP9wVBdduG$t5vt3ksV-iESQ`-I^=8H%uyur1_(QkcBH= zqU5=2Bw<<;_9e+tDT!Sb`;N`T{r#7{LgA_j7WzY*Jfaw`-{!o0ZFcpQc*UdNZegUD zT3(d2<({rm-2(>}oV^m#aaHls^APRAarlspq!U9#X=|fn3`XZ0SohkcIno7vB6m9B`d+W@W`Zt1pom~Yn|Hh%VI|(YiB?;-I-SWRW&cwFr(lgwk>%MF zZ_`JJLb!HocE{p`<&%)KYGTF7l1&^hN|r8doXys+=FcSEkO!wk3k`1)F7b&(0j?gA zKl(@f=J$UYa?U^myMn>?T54|)C5_8^uIll9z{>Sx&+sE$h%ME85=CiSj%g76xps;1 z$_`_r?=Zl3-olV_ZM!sm>ro=-qPgDTbE*fJz87}a*poh`kBE}z&RjY*@Ub(#|2G}6 zwm&A%Zisg|BTCsK6YMPG^Swr=)ElT(*Crxg^hBM{&O7*$D0S@AX~M`W$#Qo13C7Z; z;k*yz*y3qqZtj^ABqzL3>W!<(B6eswD92IlB=Wi#p?bOc#y-nH<|Q%^JKyjJqEs!? zP>0!HRgW8x>ZFB*GXhq5t=5AHC&!RKt?)o}@Aw>$}#rO*y%OQgmKpo9yu$o^)AvC?23?@al z_OYs|t~otuj;ji&AG=G`0Z9k{9>R zT#R?VQ;Cu%6`;IxF1Y?;S6#Rcxt_?zl7Q;cB$=0s*xA}WbMVPKyYaDl1=)yYbNj^_ z(xllJV5DgGsW-LyAb9;Y3^uoSsU=O@u^^VBzdhsX!NWj%2L?O$Dz&BQvsIcD?a-73 z4bwsQI0oCi$XLe-ZNc*pQV5aD7M31tojvQJzhw}(3y9(_ByNRy7%RM5S9Jc?FB4ea z>1E&eq(tW>tWmA%6xpx>x;bQUVH_MFw->7?N7TLyw0(rPV=~7Z?TWPV{tfyW*Low= z`Xd){ZD$IR7%T@t-Vwmd3d)$+5S`W(>BBuae6EEzuZ2fh=`wFbkS^}s-n@v9WN;fx z6eqB`91eZ4KxsL+WMii0_+JiP`spP?f@!?uN2u3 z^36KyfKX^+PygFL9@jhsk|epZ8tK|r4k0d*Je@iNHs ztAENw-*$2k;p$$t>2J;Uy@CDCHPynTU29YqB7A$3&%%+xH5DlBW$oo?TR!oOSN+uF zl~;X)#b_7hb+jm=gz1A*yv>GizY>Gh^t+C77$kfuL-1s!vX{wbPGWkPICXg7$9XH4 zRKZ@%TMTZ?m@=a7?hM4nLAe3Dct-)Kl#Y+u5!hhP_wuJfjSOy!gc5%>QJy$?VZ^7WAHsxmCR5^&=czBYV{*-{e_3idVX-Bu~>|dyAiGlS% ztUd;p+9~bD)8uI57^1e1#zubpyOa*D5aZJ`D9ee>wleOrodQwkurU+ypTdC|5&=6lNHvVSbF#4j9MxOqX|=nMDS(Bx*nBPbd6sA z!3zc^y9FT4n6jU=acm*h#zj`U8qK65^>K?duG%U8%D zSv`tP>uHx%d&q{A@Spb_hl`e~hW;wIXD`YGGT1;eaDyBI_V_HZga>ha z(*Yg?b@ol!PN)(}hyRmU7{|?v2q9)|mV>a+x9oD*xac|Ly#oZ1)BBmnvgCxExOR)(_(#P=Viy9Lc9z@6;G1Y+viEH ze8%L-V4Y-0(n4Y@T5I7++aFd}F<{AMv@ygcD+={4VMyTrl8t!y5in%14Bbp72ZhQ+ zY0(fPHuJV^4h)eRW%cXO4VB=AWUxWMYzjFPOVFn<;YM||J-mn&D*30+sh06z^o!A8 zWjqG!^9NGN0TFh1MwaK-XP)}0vQXHXCMVPsyLHS=z5= znPzhXAR;o@GV5ttS@JqAt%dy zl9%o&TB(WCgNp3f7gib6t6;FzV~vcmXk-h9bNiQpSsY^6l>#FIpWgQyk)ayyK4Gwt z_=GHRi@R5>z&EXANq0NA2+{qq1NvfzVOC_Y5EUEB%^&+P(7hgC)wP+InC1z@ojHpl z8^N^5U?EyHb`GJ_gxd>KF^FmfUif_&mvvt*q$@JGE(_K9x2AFsdc2%z&A0c4$2#O& zQaJAH(|gxd&>}&RwcD_ka-=OWgsgH%q~aGtVud5&;pBx+r@|m2GT7pJZYw#Uc=BGV z3=?FHGhRDy%1A#f&He4|94epIZRKcN4ar8IUFJ|PAal=IKA=w^2&ypHO0m)eIr>IT z&sZ(KE@1NnRtq$Gkkq8#p6&M-5GR98O~+*cnAFru8>TVXpu|#B-4rJSPc&`x%7ns! z47R}9Hc^fj+e*QPpdQZuN<3wzvDYa7j2k+5H3xMv*qAYNnj8YUBX(D)aXiQ&R}gQz z{bpI+vM?bs*!4&0*>c3GLmRabk#-E$-Ke_DZA|b>QFVJR@|x@eH0`bev z!`kVw2`D~m83&&ut&!_R)VZI79;psk9Z6+($8zDJ$(a0xB<3WFj14f6X zau^mhnUL~mrE;n|rM>^D!w)Z>1pUhxtSR{{lf%GrBcAQ>l*yWur)`Q* zWyZ2% z)6*m z32mIgU@L|pH{?-xoma~O*CsW#VxUl@OfUAvSXf(5p*V`cro)9d<)P4~<}Lr&8lBQ7 z;W4)Akgt8f#sCbqx>b7>mRXmZ?6tXAaO^xQZ^c`^hV0yic$FE2GwX^z>EuX<<1-AF z_OvYr?%$cIwlI5;c38>bd6Pdvh9ZNFiq$j9Aw;W9_6-8DW*BK2kGUP!d=I3u7lYe~ z!%w(i@0@bPEgedmUfG^8HPjll^nUxjpEfao8X0VI9g|Cry5$RBv=*^pY^!vG7YnIw z^<_=|7wTpGPD&lJykHg3Hn$vx&Esqc3zrpjC=u$_Z0PsDV=M2>0QLD8+=*!Xgp6k8 zkwdT^q(U8{iHE95yUM2Q(8P5P+*GL?=XaxNiZmy!?Jb5Y}~B)-(v>^ zvdi)FqizoIgJBqKgld#u4nb`UjYOkZNskX&>o#_ugDSpQ`H-N1{;lfG1OORTY&)<- zWF-s8frz#c_-nsntN43?6tHKGe*W>LqZG)P!2Fcqt_U*H^gO+%InJW zY=F`yPT2pnwU={H?L=M8* z`?iTntnob#?%sRU^lBuHlUK~x+&4X3j=s&^87^*!xI8(t6;r!$&8f()zfi|<%W;6h zet$=ZqHw3BV~pBf{7)H69e{YB)VJP$I9q!LXP?+JeXn$)0G5*>(g);dJhU7)JHPu- z228ygbi!FGoqCo2qLk@31VfG57~U5OrRIHj<)Wx}NJJ;|*pm^ZK6|hzb&K4|r|ozL zGo^_82JK$a3e#?Z+vV)k?~WEFPLG?pNPW`l_d6bD#6t)bg*qKMO_VyPQ%j7%V<+Or zPVADOygXt43V4>iuBuZYZ57otnX{@g~wUjt=JMwDVbcuXL6loJGh^3fktyveMICVb%| zLr&e{Yze*Z{vvqXNiPgVIkL!u@=kI~aTGXv?ByAVb4Hjhw_!we<6YSaasDTOrO5Ys z6LX<51a`4FTFQ*TatFziw+W0S1QV(;d`Q}?wv?9EPf1H*4(+h}VcRAOMGW4s6Ea8;AhTKF9ov6xfB?igjw+qZW57F8(D%@YRN_D|%o z@lg$&?=tk}ee6z3n9+GQ_go7GyB8J;^GTYbvMQs(B!Sjs2#wOXP$22L&kkM(&%RI= zPjfQD{F2!fEQCVbAhO8QEhqT6xcb`K2v)g5go4agP#%}}9JI4!Uiam_*r71PYY-+| z;cTud58~RP=@pq0?)F7S?3ly8KA~1W(O;fE9ws*E4bkyVL)4Y__b1Q6^lKsMvXM8U zhCGDLvB(P8E#0)(bv<^a7p{-OCj1zi&^K@qlb0S%rpO9T+5C|7Znhd3aDUiGsHs7% z;2m_n z-5glRaV&>eN62-@RahL2Qo9rF)8sC(`8S+zJMJl|7*-47#U8obX_GI{5fGMLjmnAI zYK_05p6_2-Sk6uOEDucN>eSnMl^M5oELsI^QO>dT@9h-D+~z9`8~UNn>))(vp6ULF zF33WM9>tZ6@}PqI%TnGj;;`55UI<$c!4(^}%4CxV5YtwOnsn2h)Tle&=1u5ZALs48 zlL!)wS0Q;w_M)&9OA}iTSWmth`VofD?P<^ib2mbsJ}wbzjC!@s(*NXt#!?Du=gW+* zzaUy&c_%cv9|$jUw(in`{Z82%72167%i|bU|9pAoQ-x|g>Y?~0G+(CH=?*6t@hVRKeMj=SQc4)^Ql=~+>$eVX=1V1=e7_?H)Px8#Ru?9nPU)OL;F%Yv8d|nz zZRjB^GKWUm_j9R+J{FKCPX&jH&4$rgqV+mv&HZn!yA%!vO z(UL+<(5u|HSSY5#J>)S+`RSB}ROvQ0%7-nOFUZf_7AqCg;i>ZEMY4<(4<9z(m~sG_ zZAt~95vyj&gV>B1G0yVMZ!sg5g7q3Z_*Y>>(-}xW+y*t}O~1kkEIxOKlkQHXxA3U4qt$Ci{1c7`OK#3q{UGLcocPVb(W`4eQ1On>ixa7Yc=~fWp{cT6?l^>`2yso@l<~E2>MM(>< z-b>9naOA7@cTqZ~L50E+o{>V7ur-l7o$;oBzr6bw%aL4Y^t0Y`G@~eC%eAd=gE1OU zW4IQ0@=thIatefU0E69=f09!a0`g}2no?3})y)5S76i@RaDQ%>l4|l~E>X&6g8|*VjP3`8HU1u3=xK6!}m!t_EpCdB+Z?VqHc=B?Ws_FFG)(+_BBVQ;M&Req260*5XxpDvNY4junC*Eo!X*I zr}lBH?4oVt@jZMcR}e+FzLz3zT{A_JPqR4%7#CAUF%M~L5Sfai?X}k`6(1RZVHX3yq7G9GSciqF~9Il)*l%lnwLtUc;f0vk=Geu_0Egz z-<^jwZim&>R4jMcgmA5?6lq)Kt1%k!DRpNW_?oFjldh=aPa|xz$!v6MDTrS9#+g&X z(>LY%^rIfKOwlB^bFnlZ_;-*ZY%}_3HP#?flNS$?oZZtPIccF325qiT`=qZjNkz<= z{R0=Ig>lY96Nh_vfO7EEHR{%+>|9pYGoN@u-km57B(^KiYK2RDm~d$=gxsNVQi+x? zu)fY*6wZgBakf`fH^C(!!Lw&lF86U%VEaA@86{B7usAh0xP&7(8YP8u$oOUMm()08 zf>>Ue$>e!AyM)83NEu^@iFLkk-}d}d-f_s#8!_14di)+KJX)5}kM`kn@p`;PVYz4T zL{XWMPsy;4vp*1|O5>R6qboHarz(uGYtEwwbJzH3z7`IF)`_5yeh;xo5Z2wEi zzIu54x!G70oJT8!U1^O-kirO6<1C`n*&FB1=%E8;tW^YOWKBDzC_^;FW}MP~oO9&G zBFIGlq2gczcg3SpwCypC6lLak9CCDu^T7CD^V?bR_HrGedbgaC!r>|#3F6{q0k>wP zWx>;XQp9^$Ps_FtY1xubHV0wWiEcv zDerqOLq61Kh@nM{*t~PBTUw=f{e8Rj5VWR-u!PL?!Wm&g9nWcVa}QV@P|tpOi>{uU ztPSzIUhtOb95NO8oE96&uK#ouf_t4_o&Ti6jh-$^MpmA(eCFUiNV*z?1g=8DKXF+h zMba`7@f|9)$OrqhJ!3VR1_qXJh0GA3{;!MeKMumN0OA~g0u@c>B2Zfm z@6`@5oLlBCsuAUGC0z`GjV&Y8OXK7+IPfsiKW9FYKJd&{-c@6&m;CWXss)^SUx#Fu zeo#Mmjf7^H;7l?Qk%nFxV=#^appQ+y5Mj04v_4&Vw}vQ+acr>4D^sbbsSq)iVFAHv zKV2>v6xt{xH7gGz@?1+%PHO$CQ!_m>O%>p<4S7R;84NxrqFjjkABRBw?@B=#1iA!O zhsNp*u`&VV_NF-j<$ir#w*y`>6A6tiw8|H98Np!=+Y&)c@Cwi!sRh z&GB*pcjcJsy-_ijk;07Xh%orSGqA1MpWgY6R9b(!aCf0lEtkPG;o&$9WO9aesa@`v z%0+QlXM~WkAz?0K;gKt|k#rud79l0Y>gMl#y2C&=BFnO+e*TdzgPC+#nArlT6jYum zFGm%CqmD$)nuOp|EvJ>%*HI9(kE@L$bZmnz_T)S@5R&^~s zM=8b{zUjaI0(^D=0v&s1tjj!?!EBu#tD8AfT*+ER1|I`xZ-7>1)`WAHxD3iTwll=H zvqzj-hameNd+n@D&#ZD8F;=fNo5?rhMeR~NQn5Xc`+MZT;=<{}j$-8krM@RLv0AxK zBf5OV&NLaE)zkD>b+1d*O&pF7ep!s8Ub0LM2R#VXix;Jq-9^XTe~K_5j(g`OlvQM6 zNMEz;Rh6qYE;n8`RdnttygYFxr?+(RU}L46?Uz!m({Tz){QbZoS)Hr5UX|f#jo=0d z^hHTuld-=eRb4{UY4KVb4icJsn=Jx7HubCn5GhILr5+yE3#uDeL1!f1ohT=~ zJh8LATm0FPO);dCVa3gx_pXDx5hvI)d(+sW2#ameC1G#CM1^^Z8y9W}=|Rr%ay*N; z1abB7V`oRKgiBOKjmTaYN!r6hY*h5IwpA7D_~N$2-6o~Blt(XviygZ7=unNc1(9=V z2fxpF^Cq)G(YT^LQqn3*?+R^XH9#mMH9GmOTC+p?1AeL>abpF zeW)f(-T=ei){c&WGd)I~&0Z7TnUfGuPF+LUB#px5PidZ|P z$B5QWuNbmj(&JL@pVkU#yft35tjkDx%bz31YHi;-l+yH1KId(AK&<95=zC zM>+&^c|N^B;pzadhtZgs%k~0)MH2X=2%Z(--Uno-L4A@;I9cvFHXnHla}xLb1;!-J63+=EGC| zhtZ4?%1Gs3nF|gt;teirtT|K95L5G|K3E5k(TJJJ%1VD_CU~hqeilNntznx*CdKQT zt*d!Fi@2C>mK-AOvRwwa(1!!LAp48OK;p@}8mK;?r zS$U>@U6chE;4_>C=mhQt|2gl%*j;P%8;9cV+i*j*n+sz`?1VKAN9<-3$l|7dJ_|wc z&R%g3Z!s*Mzw0n&aJ|i+PeL|&x0_VmFSO*!mPf$(6fK!~OfvnQdEjkky&$u)y0K4YbG{zMDq|x4 z7_6N%HUFK-nDCuV91%i^&&6-4x$qz3WapA9_V3Ka@!3vxF0Qz5t==BbB@(X?TQ+Ib zChIp%+4US%3t0wt`sbcjiS;QS-4lec9e)X)7tO^M$z&33_K)xP72!J_B087ZX*3TV z_;+L=jObD``CjefnPiCQTJ$}*!i&!2*5JQ06G2pGCn9bZ+-ncCB=0`T}2sT3C|h!x=F4=IGf!gyorm*iwjqkGRrG*&gdL6V_w(nW|#=v_IonsD7y# zR4hJn@EoZBA`%)~*R-GYXEP9}U1|b*3XQvv2!or6Ni<+Ypj-H76NuGz3(=`jW{WRK z#VwC5D`zhLvnj~d5@gxKuO-;T>9yp~p&jc8cGW{g@MMe5FU1A_<8Kfn$!N_a&K5iV z;yk*Uv^tyr!Bg3W#iQGQHXE3zRU+=#XeFCO$kHbQ4_$~~Ho;LQuFWp&lF1!hBP@UGF{#EQ zuzVRTvwJURJcP6MB1QYTRMfq9%~W}{{E#gc$vFWB=C~w4vr&-;p0P<^ZL-3CO5E(Q ztRd`r?KGEohrVk|#91|3??FH**rtH+~<|CY+_<58YW~K z09_XbGFxYK%i{qmt7vB({{1bB3@ipC8;cOj9;s=S-ve-J+|ED;ENohL1~_i);8c$a zdjQJWmN=|ttPd%@>c)qQ4ZmP49=n`u&I@Y!1!cVXp~ut&k}OrtP@cw6Y!1|cJ!Ci+m9xZv$UyYB(73u)n1?J?||SH#>ZcJUBjOTR?v z40-#nk++I~Rc{O~T~N-~ck>Y0Y*gdpq0WH&EWR2-K9)Yj!PaVZ_YfG@d_$w+$Ps%v z@H#^_sfy+(IqYEz# zZ}c9_ zlEE6=(1RX=hvN~HNLhUot{*QRmo7his|^MV{N#{_!0g8X*`Q{3>?7qe)Ea^ueF7C3 zo1@J~JOV~ImEHO$eW(w^O5S-6PM2f#&2bBL!@9#xdH_mq&&T3WHkYN@ZjYVY-zBGK zSWDJZP&xbj+}<-D09z_B4pU0Pb5Bh;Rs<3r2Y=$y24(ij1rIQpno}HGyei=?JkY8{ zchv=Knd6D#80;GHm^&EZu{s_7+>CtZY{?_9x_MB|7R4f+3r|#><*vEG5)aOLa>V*7 znv;ThQ=LgYLBXCxqn8rfJBcM5w3*Cc!ow<opaUm2O7wBW)JX$h#T}JYZ5Fi~XGY+A zh8eJCJIg~j9;;jzDRIA_gP1Fioe?y)MzMRTA=h3A`7HS0RG#rl!7ZN-;=n(T$m#%2 zI3HVM`J=kvJPLQ2*j)2F^`C&-`nytG-%h4Fmls^$2G?wldrP`M0k&{WEKHnpS4=E8 zgZmSZSdmh=*|9T%b_aDGN-hzT!3AboH*W9{j`?^cw?Yc-F0SX`@m)Ifg1E_(5v(sC z$m>40qB%iK)5OI340~~?Buwlj${CJx8b(&<|5IpQC}H8n^=$vR8wu473cCTX)gvot zEazWEgNZmG*SDlqMWV-mZXTfI_G~C@p(390Nnt~E8nsb}I}xS|(qVLGhP5iih9+B@ zLd)54Ws%$Ir<$Jg7pFj1<~ILcA9Ruz*~HagKZQZ`t}p%fXv4^8mG9r35uR$|-RNfLLnTC7Sxwe%SjHU^VK?4FEC1d3kh{4y zg|Xc&yTUU3JTv<{;&u{r+RbZ{_T+Xp9x@s1nUf)SGu(OC)qE)BE5xpQH( zWhS-U|L;zUZkRfqP{G=3leI!d?Tpc$nNZDuzdIppmYOYZ-HFSH+BLDGcNaSN+=kM~ zV12(};NP7Rm66@kL`?~el$mSGd|8caV>QqhXREH^H9Vb>XfeR9(X6(N3Cy3KTICCI z+$t|Dc2_m`bON?Z4eqS>*;QM!)^32u#n59EZqxy6;jzUtG`VFWDYVl2zqnTw%54Va zvI~gtz5f8f@9-$@#)K8$;1Ry4FR!e;kyl|+$rJRa(;Ds}8}tgC4PXySt?T(0(0Tl` zGZ3%wxNB{+=FJuB#td+rHr#;stEH=3(u96DrFY*`V0Wa$W^q4{z(i%u#!Ycfxf`97 z)4jdj;MCIR7h_W#iIr)gc(;+{LKbOtD@GS9FdQr5#ifM(^~I;(l!e!E><@8{21jnsBA-vu-GyL;^zYgz13 zJ+7?JdjmHkNC<%xk1* z9iu`mHyL#@+cZnv;%`jB8X{SEaiMcNfmG;wx_byO8?$QtbJZ_b$e5yS;k2U>n%Qei zrPY6cX%jos4A&YK&qDMI6vx zCXm+b1&;wOPl}2^8$qQ_-bLyDrCOFvD2v{pEMo7~)JC9ndSIK|R%AHkfLjsvYm+O) z&2keFw@NPM(wwJT@~0DtHEVS; z%S&RL>yP(%l>ixZz@;Bn4iEnld}BjIgbTL0JlndbPaqZz+DP2S2{nw&YyOTL8n$ZI z)Tw>edvkVvTO1|vN9D=dXRob)It}U~t?*=%PGTP7X2Go%saZ7Mc?g7i4$qYZ z4lDA7`#eRLD1vBiAR^yaG4nq-F^-4+>@4Fa)~@OI{|RUu**BKmy&&G-v31%qSXM@M+#u)oI62;y&Crz!ZiTQG6gt4E=Bdm989`TfG(E^BVY}r$CSfW8+7N(U7 zRX=+$;rKaECt%qL#XWt|BrNXP_EX!W42itpDYWgQLY6hH*mY;3?W>o9+dYMQ`QjD^ zyVSYy=g1KnY`RK*iAkJ&c44i$;s*Ql```EwhFYgJ$BPwyRN3UEidw)hoLu(ZST9|V@aisN=+DD2Q19*LDODpZB^&_!ux6=(e1uQE4(3lTy{1e@KcJrrH$G?EiTefD|{)G1os<>~l zp1il4J2NmC!(zyLOJbo*9F6tlV%psTR;=ysGbJM2_ZYR&W~^G?2u5 z1ZLsStm$ogl;qU;Jq|Sj0e+c1=d`2%4Mc;O1)iVE6D}>lWWR$u;U)%5`a?nK#-%EY zj&vwq1>y1q$!^ zOsY_1#oC62y;8(8Sc`t;VEb*ERIN(RsuSyhy~h|_Glp`TP~2@;yr86yvR#){rhM+O zek6gy|G#`uZ*@r&_b_~!1Jhkgx&X=hNI(x9Jnmy@c)1b}*v|wcPOa!X9yr-PA?C6q zxTpFj!rnA&+;cYusQ|sExr{)*1m4X8#`%SqnUDuY_O|d#_7!F_2asHbqi}|KF2fOj zP>1L=-Avf5=6yAbeO!d*7Q&-CKv`@e?6L|DhHw{LDd@$8E`vsgT3!!za*=nNNzK}3nM0w$sD2I}scHo6bE$q~oikEPQ z>kevlR{25yI)z|(;gt$vf(uV97nr%AY2S44G7)i}3qw>zy&lMbkuPlE^NC8MrkB=a z`3y4;OYy8Z?<^U0Ao3l>UUxF|-daeZ*x6I~9mSYOGFbcvI(R5z-%%uux#aCC=RFAx zRRSA@n9MaaMJ4HAr}HguJ1!#Db!%L6vFhO57WtRMae85=syIV>aY`A|^a&w#gzb|? zZ^QRG7}vUu(^M(Tr>H?bE##YC_(9r*nPuqrFd6g}I4^&i;P_FRRIN+_KItQRldqMR zNhge6IdjU;hN9Iy)V-l-Qw$zx(eS@Ac_v>92R#!uYAA{x_CnQ?qK;5ZLHT5$C>uNt zi?NcV(TsraUR|m*gmyb4tSA{ZEcBJ3?`X4DUr)U6>%a%G*Z2(a14aWU3w(onpaTDd zuQ#kHgJb;^Iz$$ui|5oLWv%MiQRT9N=v9nj3@_y?%V1cnl_x4Oi*1ljsj4(Cd{Z+_ zzaNqbYq7Jd$dI>xRMaY>8EyIDP&{`Ou}+_E&)2LbL*E>UN3}u>y~WnCG+s37=2xwK zyY`WJVY0c9aD5orOm~SmhhobfU6TI8i@21Fvo%Zm9lJau)psa>3=Rl-hN81ncZCac zh%!`XfOBxoM$O=%yhl7KN6izm`4?-OZ164+K8wLcTM86i(-oj-b!feMwIUjjCtNwK zqZ8Khx{DNxFg52~iwrGMKm5Y5w;c#mV{5sBMLu(_)koCSqp@a2h_|(v#F!%wRs{Fc z{$7Gk%K{vlW!ayA#`#Oa^jjZUuXvQp<1$ktpC}S24Bjs@7lqMoKD|Io4 zB;OMrIwgJAo>HZQ8MpBAJVAbHR~eZtm#kp7_B!ob*QrVNBV z5Ara?av=%6YVFIk&oJ*J&@^jJ;VWb?*x<{JmB^|#A3#F2& z$F#)s$tNG#S2dHYc23$_$yt^t%1DDbN)yj~t(s+sDrcH9K~?vwSE&prBFJZB$};Y8 zV4ZVRywDw|4U5p&dLj)EpK_>G#wFwoy4UBzVjcP+r@$Or+xu*G4r67GmiShK-tp4t za7g#MF;SIm-K%|9a7;4F+a8^%LI2q4G7?!^a<0E~=miIsh`#1_h<U z1*&+;Wgs^+wb>APZZ}H37?hJ`7)^D)SfxnR#muu zy5LugF_&&PY$Vm5V3z3FLJ4b>QVrii5LmDX@ zl9(xy$kgId%BX)3nF=FhaAg*ipZ6e_kYWrbT$w^CVileg(6=*J>y`!31w;+DQtiILOVHMVI9mr_v%j_kAezUj4q(d?umQQFB zT{k<2F~#CYHNN!C<7a=7yAEqPVtf8?`x}qJpGsmQlKUDmwY`&jodbcNXhSRtd>M8K z%AWEY^S%FnWmg{ERI$cG0a?n9Y-OuRLBtfwT9&dLXa!kC1quSDZPEs^k)%xv53z{s z_~?_ZEDFkE5v3rT>`M``f(Vqysvy3C+6Mv_c&zU?ncO6Eb0>4tbLO1ppYM0)n{U2- zX6oS%fHCsv+&-iV#bLF()m|_lViPOI97~Li#K9S~DYH4EJ{QG69$|3XL_gjs*+nv| zQ>{7;EeoAD7m)<3i>^EpgArLk3eP5zaf0+w&vV7&fiwsGu&nPAU$&DPsq@@cB3Pzj z$(xAbbT?1M-Ch~Hk6X?)8Eb!GXkR5%U>_=*7Hu>mb}S0AJHsKmQ09j z90Uw6>N%~>ESr~O&8~C~*rRT*A-UC{QgDpCyCan;=pKC`Hwb;FC$RIAWY*RxJNps> zb@pwa1VKReln(dwQmerC`6n&d)T7G}7bbRt-dqtSFBN{T9>KFN46LLPX4W|w;Jn_> zf4SQ@!>-S!Ak4dnA(gQ3FT%czuT)Ph2{lQ*U8_UPul3yvyf!m0pe#z}nsDgRC@0ox z`!IQn+}KU3ArYmk=bPb8a45}}uz38J$G$8Jfvk-UC$X5y zXPW}mknEyLNBWf@mwd3K+v>`Z2gyV8B`xLoyOl?RK;pnY>!?5N*Dheok*sjHlkwji z#dOl(X0i%*Kv59-0a;;>no`OLlaBkYyBFp*gqIZgs@(ccJkNu%=rXkAVNk92f}v1O z6hwI9DZ0D=_>+g??Q0pfyHP+x$Em!tJ)&+ot&Naq?g0+5jzi~?U_`wsROaAw_t9Yi zD7|JJ>{0JX^`@N>O_#v%u_&8wszP!5K$0}=G#3Zx2oej<4=?lW7f`Sz*tD#*NGJ`4 zLieaP-Kh0=b!2}^U`nZH0ycK<-Mf8|{fH0n_J=A9m~@&5Y(nQk(X zs7E(WBPXcoR-n-|Ve%+9YV+vBnHQfEzOdlXKXN0{<3Crv-dFnZ2;-V?qs^%$*>e>L zZGP_RI@npG$;YQlwRb8}r;R)W+FTrr>4Yg^1?~EthUJLuBWFtSY93{GRY^p6eY>+I z6JOS7!t&&wTzLzRFziK2QcyV|pWG#-cytFuw-&_G>^dI5#G`E1J9Qkw%5Gmn#xM-K z$s=sDnyq|Sk9=;eev2ojz`5@NX1u_N-KyYJZC1_~`}Sr=!`C0og2mA^l+zyhDCifP z#k5a0_+SFL5A`7EvlWgGzi?&|+jqJBG=MSosk=@`iLvGD&}lKmI`cp3Lb8 zZXp{E|96 z3}RTlAFsp}^6@hctSEC9F4Xxp@*bd(F+9TQHg~g}NO-KhI&JL>kEuhnMk94RP>Y=% z$0MDD+q=y=J8Jd_-Kb>wM~^e` z=t}XIkoe5ejtx;@!DIN~tR1XBg-0Bh_>#6UFYU1kYQAvyw76q+yPUjGsf=boNqLzR z=Df?JO|`JYXttU3Hu8L#hv`*cc@R)vB*IeR@AqBgU4ZCTa#M12R<~f1uC>y;2PFWW zG!8C2e{Uip-xd?f$eg@gi+BLEGAg26Nw;cKG{VLPkQsLOPr1yaoaS`eygcE3@>xTe zbu2c}(kQtRe|(KcSdwz}YW`gA^@;~u<1p45xqrR$77v9+J9;cGX>AoTXosu9Z!P>%Qi97)8*boqQw$8XS8vfKCC`#6l%pS!< zpj&`sX;REai#AE;i*w8l(3+MtXuTf${|am>6~ zD41cv?J>IuFSGz_E}`xxL;i ztcL1apES9jTe6c!nX-xWYYNHNsJs4~6u8l^L4sLx`FatLyxR@3rx=99>pXk3uTgWH z_WDR}c`Bdh5vScPV(~fDvY_h#)QA?L8HC-~lb-NsyR##z*YsKQgq-aVo`vux*eZ3? z@^Kv9mVulVV`x2oBp)T-hB`rG9=YU$(Pg@e74I5#b?wenbLh- znU9~W@^b(vjAhOIxDL%GZodlWg$ya_Mqw&77QlG*tJYz&8~tuPT=4#LekoYxm5_2_ zbR`By3b2yxSxC5&fjtuD_4xP(7we&F)y)MO(rbiQ))MR>f z!%@GIAe|0@TXeEh%Ln*L1`D^PwaV!jEl}q=1h#m2R0L-!_}ADsfV9cRGm`h0ObF z&=OZ);E=&GFMWtgEPCKuG^q;n;}agj@{%DbHp;w+M3q1~dvY3IAZVU!(8i?LU%qd; z9$jCWg%}bPjmBJhl~5*QvYs4lkgi43H7-;X_2IwXO?(Shj0{#Jh8t8uC0kR(GM+bK zN$I=LL}W-)qTCC&s>JcQNW&}{(WE##m;5tcFYwDp2_NaIEjZ< zF}D7Xe*)_P274-^c~&S`h|e9&sR$n6y`K3E$-;ew!A>r7QYe6Cq`gG)KXd!C@&&-T ziNP-1^vR)MIbAs0hp0q^m$nQ2b*Zz3R+V=!1wR+$kBnAx6c*XzX=wQ7T6 z*Kjx@b1+!E4`+sgXV<3~bjiMpSb5rVRO2&geK9xktP-m&2hIrv53!PP&mA6ruO87{ zL^HGA!rya4!6L4ZcxEdW>#pT_(4->~_z7>J{QQv6((Q;e`MVC05&lS6TQsE7qDxpe zGT61N|Dga;9@e^hm?XDfO=v6C0cdFZc8&lK-5&g~cGIW*I>&5izdanW7#VCPAYTn_ zWI~A}>2-+v=Tr{x@d?bzfpx=1MxySB!HQqRA{A2rj0@>JJFWG2k{diM$DOj}K1KS6 z4A##-yGgA|kc#E_7qWM8w*ZP>W+IudD-Rp{b>L7@ zYc@{T{iWaI--yQ2kRc_@C_v&K0YJKqR`fhm_~#dM0~!@ck)~e8Cqp9YYcx6IPo`yde*hAQ5ObkG#3_?@d_4&iT;%bd`nb z%8c{rCUU(^%rr4fyamt5crHQXv8|of8S^|Q(hi)IG&yD4T=fXZxB5MYz$-YFnON;= zB3hn)LrqgMP!uX`w(7}P&|^iCt%@7aCk>^J&-apE)U`->vD4bWOf^I>lH559#a9@FNT1#r~tF#gIih6D3HS>Y%cv!fDNL=c=Rdw6q`LG*X zFeEEW*QWng9$~va6`{7BUa%lqkVdsqBXaQNN6^(GsQ?PlW*ZLx$NKTCwEB{K^QvJZ zOz70F^1830Lopg1=3!9dfwyYg3z={F_aCQfzks6bLU~`oFGXDPaH&$Q_AK?2X!1h- z;5T8-uVINLPn1q#=zSgv?6@jX-IaE~_PQ$Y4&Y3&1mhbOzAAU9xCQ)z+8xWt4x|lk!6WW@%^;BVN)0>2`4|*+ z=IT?Jk1OxU<>x0m4}{8(!|d0W!Xv-1Rr-886vb3DGf5e1y0R^1^T>li4!zR}-QeR9 zkN(+r3k}CWe>E!NZ1d`03wZRU#)QCzcpl2^maCSLQ+pRtiD7Rrsh7(`p+#{xf?grw zQMX2X(!DiYocx#N(*M><9(B@mXfpa*w0X4ersr;rN3+prmt4o4`J6{PS%y&f!aqi2HPvW7M7sd1pqH2H#oM~1rBUm! zSgkhS_T_P>ZSTYV4nzCbf=D)E+V{-OWdLN$YSU0>_4BfMWb?jlJ2MyJavXvwdBRla zr$))hk~Uk1)@n2RURL5!y<~n=ycfFWY(LmS=3@=5WK> zUx^1<8H(mO8AY8Igq{;EuP=BpY@UgQa&S zOGXb@tco{R@j7kxK1@6Vwoy7DM+NDf$ufHINpM4#`<^L}o5-7Vqm>0YTOssUFxXX} zkS!zX-_xT+?lufa_!`5orqD3e6EvE-3=a*{{K>h?w#i1Fw{AP!+d^6%zBt;X$~7%l Ng6o1$EboP1{|91DIT-)| literal 0 HcmV?d00001 diff --git a/src/index.php b/src/index.php new file mode 100644 index 0000000..49403ec --- /dev/null +++ b/src/index.php @@ -0,0 +1,18 @@ + \ No newline at end of file diff --git a/src/licencia.txt b/src/licencia.txt new file mode 100644 index 0000000..c87e954 --- /dev/null +++ b/src/licencia.txt @@ -0,0 +1,322 @@ + + GNU GENERAL PUBLIC LICENSE + Version 2, Junio 1991 + +Copyright (C) 1989, 1991 Free Software Foundation, Inc. +675 Mass Ave, Cambridge, MA 02139, EEUU + +Se permiten la copia y distribución de copias literales de este documento, +pero no se permite su modificación. + +----------------------------------------------------------------------- + + NOTA IMPORTANTE + +Esta es una traducción no oficial al español de la GNU General Public +License. No ha sido publicada por la Free Software Foundation, y no +establece legalmente las condiciones de distribución para el software que +usa la GNU GPL. Estas condiciones se establecen solamente por el texto +original, en inglés, de la GNU GPL. Sin embargo, esperamos que esta +traducción ayude a los hispanohablantes a entender mejor la GNU GPL. + + AUTORES DE LA TRADUCCIÓN + + * Jesús González Barahona + * Pedro de las Heras Quirós + * Jordi J. Canals (Revisión y Formato. Junio de 2008) + * Fernando Tellado (A partir de Noviembre de 2009) + + +----------------------------------------------------------------------- + + Preámbulo + + Las licencias que cubren la mayor parte del software están diseñadas +para quitarle a usted la libertad de compartirlo y modificarlo. Por el +contrario, la Licencia Pública General de GNU pretende garantizarle la +libertad de compartir y modificar software libre, para asegurar que el +software es libre para todos sus usuarios. Esta Licencia Pública General +se aplica a la mayor parte del software del la Free Software Foundation y +a cualquier otro programa si sus autores se comprometen a utilizarla. +(Existe otro software de la Free Software Foundation que está cubierto por +la Licencia Pública General de GNU para Bibliotecas). Si quiere, también +puede aplicarla a sus propios programas. + + Cuando hablamos de software libre, estamos refiriéndonos a libertad, no +a precio. Nuestras Licencias Públicas Generales están diseñadas para +asegurarnos de que tenga la libertad de distribuir copias de software +libre (y cobrar por ese servicio si quiere), de que reciba el código +fuente o que pueda conseguirlo si lo quiere, de que pueda modificar el +software o usar fragmentos de él en nuevos programas libres, y de que sepa +que puede hacer todas estas cosas. + + Para proteger sus derechos necesitamos algunas restricciones que +prohiban a cualquiera negarle a usted estos derechos o pedirle que +renuncie a ellos. Estas restricciones se traducen en ciertas obligaciones +que le afectan si distribuye copias del software, o si lo modifica. + + Por ejemplo, si distribuye copias de uno de estos programas, sea +gratuitamente, o a cambio de una contraprestación, debe dar a los +receptores todos los derechos que tiene. Debe asegurarse de que ellos +también reciben, o pueden conseguir, el código fuente. Y debe mostrarles +estas condiciones de forma que conozcan sus derechos. + + Protegemos sus derechos con la combinación de dos medidas: + + 1. Ponemos el software bajo copyright y + 2. le ofrecemos esta licencia, que le da permiso legal para copiar, + distribuir y/o modificar el software. + + También, para la protección de cada autor y la nuestra propia, queremos +asegurarnos de que todo el mundo comprende que no se proporciona ninguna +garantía para este software libre. Si el software se modifica por +cualquiera y éste a su vez lo distribuye, queremos que sus receptores +sepan que lo que tienen no es el original, de forma que cualquier problema +introducido por otros no afecte a la reputación de los autores originales. + + Por último, cualquier programa libre está constantemente amenazado por +patentes sobre el software. Queremos evitar el peligro de que los +redistribuidores de un programa libre obtengan patentes por su cuenta, +convirtiendo de facto el programa en propietario. Para evitar esto, hemos +dejado claro que cualquier patente debe ser pedida para el uso libre de +cualquiera, o no ser pedida. + + Los términos exactos y las condiciones para la copia, distribución y +modificación se exponen a continuación. + + + GNU GENERAL PUBLIC LICENSE + TERMINOS Y CONDICIONES PARA LA COPIA, DISTRIBUCIÓN Y MODIFICACIÓN + + 0. Esta Licencia se aplica a cualquier programa u otro tipo de trabajo +que contenga una nota colocada por el tenedor del copyright diciendo que +puede ser distribuido bajo los términos de esta Licencia Pública General. +En adelante, «Programa» se referirá a cualquier programa o trabajo que +cumpla esa condición y «trabajo basado en el Programa» se referirá bien al +Programa o a cualquier trabajo derivado de él según la ley de copyright. +Esto es, un trabajo que contenga el programa o una proción de él, bien en +forma literal o con modificaciones y/o traducido en otro lenguaje. Por +lo tanto, la traducción está incluida sin limitaciones en el término +«modificación». Cada concesionario (licenciatario) será denominado «usted». + +Cualquier otra actividad que no sea la copia, distribución o modificación +no está cubierta por esta Licencia, está fuera de su ámbito. El acto de +ejecutar el Programa no está restringido, y los resultados del Programa +están cubiertos únicamente si sus contenidos constituyen un trabajo basado +en el Programa, independientemente de haberlo producido mediante la +ejecución del programa. El que esto se cumpla, depende de lo que haga el +programa. + + 1. Usted puede copiar y distribuir copias literales del código fuente +del Programa, según lo has recibido, en cualquier medio, supuesto que de +forma adecuada y bien visible publique en cada copia un anuncio de +copyright adecuado y un repudio de garantía, mantenga intactos todos los +anuncios que se refieran a esta Licencia y a la ausencia de garantía, y +proporcione a cualquier otro receptor del programa una copia de esta +Licencia junto con el Programa. + +Puede cobrar un precio por el acto físico de transferir una copia, y +puede, según su libre albedrío, ofrecer garantía a cambio de unos +honorarios. + + 3. Puede modificar su copia o copias del Programa o de cualquier +porción de él, formando de esta manera un trabajo basado en el Programa, y +copiar y distribuir esa modificación o trabajo bajo los términos del +apartado 1, antedicho, supuesto que además cumpla las siguientes +condiciones: + + a) Debe hacer que los ficheros modificados lleven anuncios prominentes + indicando que los ha cambiado y la fecha de cualquier cambio. + + b) Debe hacer que cualquier trabajo que distribuya o publique y que en + todo o en parte contenga o sea derivado del Programa o de cualquier + parte de él sea licenciada como un todo, sin carga alguna, a todas las + terceras partes y bajo los términos de esta Licencia. + + c) Si el programa modificado lee normalmente órdenes interactivamente + cuando es ejecutado, debe hacer que, cuando comience su ejecución para + ese uso interactivo de la forma más habitual, muestre o escriba un + mensaje que incluya un anuncio de copyright y un anuncio de que no se + ofrece ninguna garantía (o por el contrario que sí se ofrece garantía) + y que los usuarios pueden redistribuir el programa bajo estas + condiciones, e indicando al usuario cómo ver una copia de esta + licencia. (Excepción: si el propio programa es interactivo pero + normalmente no muestra ese anuncio, no se requiere que su trabajo + basado en el Programa muestre ningún anuncio). + + +Estos requisitos se aplican al trabajo modificado como un todo. Si partes +identificables de ese trabajo no son derivadas del Programa, y pueden, +razonablemente, ser consideradas trabajos independientes y separados por +ellos mismos, entonces esta Licencia y sus términos no se aplican a esas +partes cuando sean distribuidas como trabajos separados. Pero cuando +distribuya esas mismas secciones como partes de un todo que es un trabajo +basado en el Programa, la distribución del todo debe ser según los +términos de esta licencia, cuyos permisos para otros licenciatarios se +extienden al todo completo, y por lo tanto a todas y cada una de sus +partes, con independencia de quién la escribió. Por lo tanto, no es la +intención de este apartado reclamar derechos o desafiar sus derechos sobre +trabajos escritos totalmente por usted mismo. El intento es ejercer el +derecho a controlar la distribución de trabajos derivados o colectivos +basados en el Programa. + +Además, el simple hecho de reunir un trabajo no basado en el Programa con +el Programa (o con un trabajo basado en el Programa) en un volumen de +almacenamiento o en un medio de distribución no hace que dicho trabajo +entre dentro del ámbito cubierto por esta Licencia. + + 3. Puede copiar y distribuir el Programa (o un trabajo basado en él, +según se especifica en el apartado 2, como código objeto o en formato +ejecutable según los términos de los apartados 1 y 2, supuesto que además +cumpla una de las siguientes condiciones: + + a) Acompañarlo con el código fuente completo correspondiente, en + formato electrónico, que debe ser distribuido según se especifica en + los apartados 1 y 2 de esta Licencia en un medio habitualmente + utilizado para el intercambio de programas, o + + b) Acompañarlo con una oferta por escrito, válida durante al menos + tres años, de proporcionar a cualquier tercera parte una copia completa + en formato electrónico del código fuente correspondiente, a un coste + no mayor que el de realizar físicamente la distribución del fuente, + que será distribuido bajo las condiciones descritas en los apartados 1 + y 2 anteriores, en un medio habitualmente utilizado para el + intercambio de programas, o + + c) Acompañarlo con la información que recibiste ofreciendo distribuir + el código fuente correspondiente. (Esta opción se permite sólo para + distribución no comercial y sólo si usted recibió el programa como + código objeto o en formato ejecutable con tal oferta, de acuerdo con + el apartado b anterior). + +Por código fuente de un trabajo se entiende la forma preferida del trabajo +cuando se le hacen modificaciones. Para un trabajo ejecutable, se entiende +por código fuente completo todo el código fuente para todos los módulos +que contiene, más cualquier fichero asociado de definición de interfaces, +más los guiones utilizados para controlar la compilación e instalación del +ejecutable. Como excepción especial el código fuente distribuido no +necesita incluir nada que sea distribuido normalmente (bien como fuente, +bien en forma binaria) con los componentes principales (compilador, kernel +y similares) del sistema operativo en el cual funciona el ejecutable, a no +ser que el propio componente acompañe al ejecutable. + +Si la distribución del ejecutable o del código objeto se hace mediante la +oferta acceso para copiarlo de un cierto lugar, entonces se considera la +oferta de acceso para copiar el código fuente del mismo lugar como +distribución del código fuente, incluso aunque terceras partes no estén +forzadas a copiar el fuente junto con el código objeto. + + 4. No puede copiar, modificar, sublicenciar o distribuir el Programa +excepto como prevé expresamente esta Licencia. Cualquier intento de +copiar, modificar sublicenciar o distribuir el Programa de otra forma es +inválida, y hará que cesen automáticamente los derechos que te proporciona +esta Licencia. En cualquier caso, las partes que hayan recibido copias o +derechos de usted bajo esta Licencia no cesarán en sus derechos mientras +esas partes continúen cumpliéndola. + + 5. No está obligado a aceptar esta licencia, ya que no la ha firmado. +Sin embargo, no hay hada más que le proporcione permiso para modificar o +distribuir el Programa o sus trabajos derivados. Estas acciones están +prohibidas por la ley si no acepta esta Licencia. Por lo tanto, si +modifica o distribuye el Programa (o cualquier trabajo basado en el +Programa), está indicando que acepta esta Licencia para poder hacerlo, y +todos sus términos y condiciones para copiar, distribuir o modificar el +Programa o trabajos basados en él. + + 6. Cada vez que redistribuya el Programa (o cualquier trabajo basado en +el Programa), el receptor recibe automáticamente una licencia del +licenciatario original para copiar, distribuir o modificar el Programa, de +forma sujeta a estos términos y condiciones. No puede imponer al receptor +ninguna restricción más sobre el ejercicio de los derechos aquí +garantizados. No es usted responsable de hacer cumplir esta licencia por +terceras partes. + + 7. Si como consecuencia de una resolución judicial o de una alegación de +infracción de patente o por cualquier otra razón (no limitada a asuntos +relacionados con patentes) se le imponen condiciones (ya sea por mandato +judicial, por acuerdo o por cualquier otra causa) que contradigan las +condiciones de esta Licencia, ello no le exime de cumplir las condiciones +de esta Licencia. Si no puede realizar distribuciones de forma que se +satisfagan simultáneamente sus obligaciones bajo esta licencia y cualquier +otra obligación pertinente entonces, como consecuencia, no puede +distribuir el Programa de ninguna forma. Por ejemplo, si una patente no +permite la redistribución libre de derechos de autor del Programa por +parte de todos aquellos que reciban copias directa o indirectamente a +través de usted, entonces la única forma en que podría satisfacer tanto +esa condición como esta Licencia sería evitar completamente la +distribución del Programa. + +Si cualquier porción de este apartado se considera inválida o imposible de +cumplir bajo cualquier circunstancia particular ha de cumplirse el resto y +la sección por entero ha de cumplirse en cualquier otra circunstancia + +No es el propósito de este apartado inducirle a infringir ninguna +reivindicación de patente ni de ningún otro derecho de propiedad o +impugnar la validez de ninguna de dichas reivindicaciones. Este apartado +tiene el único propósito de proteger la integridad del sistema de +distribución de software libre, que se realiza mediante prácticas de +licencia pública. Mucha gente ha hecho contribuciones generosas a la gran +variedad de software distribuido mediante ese sistema con la confianza de +que el sistema se aplicará consistentemente. Será el autor/donante quien +decida si quiere distribuir software mediante cualquier otro sistema y una +licencia no puede imponer esa elección. + +Este apartado pretende dejar completamente claro lo que se cree que es una +consecuencia del resto de esta Licencia. + + 8. Si la distribución y/o uso de el Programa está restringida en ciertos +países, bien por patentes o por interfaces bajo copyright, el tenedor del +copyright que coloca este Programa bajo esta Licencia puede añadir una +limitación explícita de distribución geográfica excluyendo esos países, de +forma que la distribución se permita sólo en o entre los países no +excluidos de esta manera. En ese caso, esta Licencia incorporará la +limitación como si estuviese escrita en el cuerpo de esta Licencia. + + 9. La Free Software Foundation puede publicar versiones revisadas y/o +nuevas de la Licencia Pública General de tiempo en tiempo. Dichas nuevas +versiones serán similares en espíritu a la presente versión, pero pueden +ser diferentes en detalles para considerar nuevos problemas o situaciones. + +Cada versión recibe un número de versión que la distingue de otras. Si el +Programa especifica un número de versión de esta Licencia que se refiere a +ella y a «cualquier versión posterior», tienes la opción de seguir los +términos y condiciones, bien de esa versión, bien de cualquier versión +posterior publicada por la Free Software Foundation. Si el Programa no +especifica un número de versión de esta Licencia, puedes escoger cualquier +versión publicada por la Free Software Foundation. + + 10. Si quiere incorporar partes del Programa en otros programas libres +cuyas condiciones de distribución son diferentes, escribe al autor para +pedirle permiso. Si el software tiene copyright de la Free Software +Foundation, escribe a la Free Software Foundation: algunas veces hacemos +excepciones en estos casos. Nuestra decisión estará guiada por el doble +objetivo de de preservar la libertad de todos los derivados de nuestro +software libre y promover el que se comparta y reutilice el software en +general. + + + AUSENCIA DE GARANTÃA + + 11. Como el programa se licencia libre de cargas, no se ofrece ninguna +garantía sobre el programa, en todas la extensión permitida por la +legislación aplicable. Excepto cuando se indique de otra forma por +escrito, los tenedores del copyright y/u otras partes proporcionan el +programa «tal cual», sin garantía de ninguna clase, bien expresa o +implícita, con inclusión, pero sin limitación a las garantías mercantiles +implícitas o a la conveniencia para un propósito particular. Cualquier +riesgo referente a la calidad y prestaciones del programa es asumido por +usted. Si se probase que el Programa es defectuoso, asume el coste de +cualquier servicio, reparación o corrección. + + 12. En ningún caso, salvo que lo requiera la legislación aplicable o +haya sido acordado por escrito, ningún tenedor del copyright ni ninguna +otra parte que modifique y/o redistribuya el Programa según se permite en +esta Licencia será responsable ante usted por daños, incluyendo cualquier +daño general, especial, incidental o resultante producido por el uso o la +imposibilidad de uso del Programa (con inclusión, pero sin limitación a la +pérdida de datos o a la generación incorrecta de datos o a pérdidas +sufridas por usted o por terceras partes o a un fallo del Programa al +funcionar en combinación con cualquier otro programa), incluso si dicho +tenedor u otra parte ha sido advertido de la posibilidad de dichos daños. + + FIN DE TÉRMINOS Y CONDICIONES diff --git a/src/license.txt b/src/license.txt new file mode 100644 index 0000000..d31195a --- /dev/null +++ b/src/license.txt @@ -0,0 +1,281 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 51 Franklin St, Fifth Floor, Boston, MA 02110, USA + + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + diff --git a/src/wp-activate.php b/src/wp-activate.php new file mode 100644 index 0000000..1ec4028 --- /dev/null +++ b/src/wp-activate.php @@ -0,0 +1,102 @@ +cache_enabled = false; + +do_action( 'activate_header' ); + +function do_activate_header() { + do_action( 'activate_wp_head' ); +} +add_action( 'wp_head', 'do_activate_header' ); + +function wpmu_activate_stylesheet() { + ?> + + + +

+ + +

+
+

+ +
+

+

+ +

+
+ + get_error_code() || 'blog_taken' == $result->get_error_code() ) { + $signup = $result->get_error_data(); + ?> +

+ '; + if ( $signup->domain . $signup->path == '' ) { + printf( __('Your account has been activated. You may now
log in to the site using your chosen username of “%2$s”. Please check your email inbox at %3$s for your password and login instructions. If you do not receive an email, please check your junk or spam folder. If you still do not receive an email within an hour, you can reset your password.'), network_site_url( 'wp-login.php', 'login' ), $signup->user_login, $signup->user_email, network_site_url( 'wp-login.php?action=lostpassword', 'login' ) ); + } else { + printf( __('Your site at %2$s is active. You may now log in to your site using your chosen username of “%3$s”. Please check your email inbox at %4$s for your password and login instructions. If you do not receive an email, please check your junk or spam folder. If you still do not receive an email within an hour, you can reset your password.'), 'http://' . $signup->domain, $signup->domain, $signup->user_login, $signup->user_email, network_site_url( 'wp-login.php?action=lostpassword' ) ); + } + echo '

'; + } else { + ?> +

+ '.$result->get_error_message().'

'; + } + } else { + extract($result); + $url = get_blogaddress_by_id( (int) $blog_id); + $user = new WP_User( (int) $user_id); + ?> +

+ +
+

user_login ?>

+

+
+ + +

View your site or Log in'), $url, $url . 'wp-login.php' ); ?>

+ +

Log in or go back to the homepage.' ), network_site_url('wp-login.php', 'login'), network_home_url() ); ?>

+ +
+ + \ No newline at end of file diff --git a/src/wp-admin/admin-ajax.php b/src/wp-admin/admin-ajax.php new file mode 100644 index 0000000..18a853b --- /dev/null +++ b/src/wp-admin/admin-ajax.php @@ -0,0 +1,1555 @@ +ALERT: You are logged out! Could not save draft. Please log in again.'), wp_login_url() ); + $x = new WP_Ajax_Response( array( + 'what' => 'autosave', + 'id' => $id, + 'data' => $message + ) ); + $x->send(); + } + + if ( !empty( $_REQUEST['action'] ) ) + do_action( 'wp_ajax_nopriv_' . $_REQUEST['action'] ); + + die('-1'); +} + +if ( isset( $_GET['action'] ) ) : +switch ( $action = $_GET['action'] ) : +case 'fetch-list' : + + $list_class = $_GET['list_args']['class']; + check_ajax_referer( "fetch-list-$list_class", '_ajax_fetch_list_nonce' ); + + $current_screen = (object) $_GET['list_args']['screen']; + //TODO fix this in a better way see #15336 + $current_screen->is_network = 'false' === $current_screen->is_network ? false : true; + $current_screen->is_user = 'false' === $current_screen->is_user ? false : true; + + define( 'WP_NETWORK_ADMIN', $current_screen->is_network ); + define( 'WP_USER_ADMIN', $current_screen->is_user ); + + $wp_list_table = _get_list_table( $list_class ); + if ( ! $wp_list_table ) + die( '0' ); + + if ( ! $wp_list_table->ajax_user_can() ) + die( '-1' ); + + $wp_list_table->ajax_response(); + + die( '0' ); + break; +case 'ajax-tag-search' : + if ( isset( $_GET['tax'] ) ) { + $taxonomy = sanitize_key( $_GET['tax'] ); + $tax = get_taxonomy( $taxonomy ); + if ( ! $tax ) + die( '0' ); + if ( ! current_user_can( $tax->cap->assign_terms ) ) + die( '-1' ); + } else { + die('0'); + } + + $s = stripslashes( $_GET['q'] ); + + if ( false !== strpos( $s, ',' ) ) { + $s = explode( ',', $s ); + $s = $s[count( $s ) - 1]; + } + $s = trim( $s ); + if ( strlen( $s ) < 2 ) + die; // require 2 chars for matching + + $results = $wpdb->get_col( $wpdb->prepare( "SELECT t.name FROM $wpdb->term_taxonomy AS tt INNER JOIN $wpdb->terms AS t ON tt.term_id = t.term_id WHERE tt.taxonomy = %s AND t.name LIKE (%s)", $taxonomy, '%' . like_escape( $s ) . '%' ) ); + + echo join( $results, "\n" ); + die; + break; +case 'wp-compression-test' : + if ( !current_user_can( 'manage_options' ) ) + die('-1'); + + if ( ini_get('zlib.output_compression') || 'ob_gzhandler' == ini_get('output_handler') ) { + update_site_option('can_compress_scripts', 0); + die('0'); + } + + if ( isset($_GET['test']) ) { + header( 'Expires: Wed, 11 Jan 1984 05:00:00 GMT' ); + header( 'Last-Modified: ' . gmdate( 'D, d M Y H:i:s' ) . ' GMT' ); + header( 'Cache-Control: no-cache, must-revalidate, max-age=0' ); + header( 'Pragma: no-cache' ); + header('Content-Type: application/x-javascript; charset=UTF-8'); + $force_gzip = ( defined('ENFORCE_GZIP') && ENFORCE_GZIP ); + $test_str = '"wpCompressionTest Lorem ipsum dolor sit amet consectetuer mollis sapien urna ut a. Eu nonummy condimentum fringilla tempor pretium platea vel nibh netus Maecenas. Hac molestie amet justo quis pellentesque est ultrices interdum nibh Morbi. Cras mattis pretium Phasellus ante ipsum ipsum ut sociis Suspendisse Lorem. Ante et non molestie. Porta urna Vestibulum egestas id congue nibh eu risus gravida sit. Ac augue auctor Ut et non a elit massa id sodales. Elit eu Nulla at nibh adipiscing mattis lacus mauris at tempus. Netus nibh quis suscipit nec feugiat eget sed lorem et urna. Pellentesque lacus at ut massa consectetuer ligula ut auctor semper Pellentesque. Ut metus massa nibh quam Curabitur molestie nec mauris congue. Volutpat molestie elit justo facilisis neque ac risus Ut nascetur tristique. Vitae sit lorem tellus et quis Phasellus lacus tincidunt nunc Fusce. Pharetra wisi Suspendisse mus sagittis libero lacinia Integer consequat ac Phasellus. Et urna ac cursus tortor aliquam Aliquam amet tellus volutpat Vestibulum. Justo interdum condimentum In augue congue tellus sollicitudin Quisque quis nibh."'; + + if ( 1 == $_GET['test'] ) { + echo $test_str; + die; + } elseif ( 2 == $_GET['test'] ) { + if ( !isset($_SERVER['HTTP_ACCEPT_ENCODING']) ) + die('-1'); + if ( false !== stripos( $_SERVER['HTTP_ACCEPT_ENCODING'], 'deflate') && function_exists('gzdeflate') && ! $force_gzip ) { + header('Content-Encoding: deflate'); + $out = gzdeflate( $test_str, 1 ); + } elseif ( false !== stripos( $_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip') && function_exists('gzencode') ) { + header('Content-Encoding: gzip'); + $out = gzencode( $test_str, 1 ); + } else { + die('-1'); + } + echo $out; + die; + } elseif ( 'no' == $_GET['test'] ) { + update_site_option('can_compress_scripts', 0); + } elseif ( 'yes' == $_GET['test'] ) { + update_site_option('can_compress_scripts', 1); + } + } + + die('0'); + break; +case 'imgedit-preview' : + $post_id = intval($_GET['postid']); + if ( empty($post_id) || !current_user_can('edit_post', $post_id) ) + die('-1'); + + check_ajax_referer( "image_editor-$post_id" ); + + include_once( ABSPATH . 'wp-admin/includes/image-edit.php' ); + if ( ! stream_preview_image($post_id) ) + die('-1'); + + die(); + break; +case 'menu-quick-search': + if ( ! current_user_can( 'edit_theme_options' ) ) + die('-1'); + + require_once ABSPATH . 'wp-admin/includes/nav-menu.php'; + + _wp_ajax_menu_quick_search( $_REQUEST ); + + exit; + break; +case 'oembed-cache' : + $return = ( $wp_embed->cache_oembed( $_GET['post'] ) ) ? '1' : '0'; + die( $return ); + break; +default : + do_action( 'wp_ajax_' . $_GET['action'] ); + die('0'); + break; +endswitch; +endif; + +/** + * Sends back current comment total and new page links if they need to be updated. + * + * Contrary to normal success AJAX response ("1"), die with time() on success. + * + * @since 2.7 + * + * @param int $comment_id + * @return die + */ +function _wp_ajax_delete_comment_response( $comment_id, $delta = -1 ) { + $total = (int) @$_POST['_total']; + $per_page = (int) @$_POST['_per_page']; + $page = (int) @$_POST['_page']; + $url = esc_url_raw( @$_POST['_url'] ); + // JS didn't send us everything we need to know. Just die with success message + if ( !$total || !$per_page || !$page || !$url ) + die( (string) time() ); + + $total += $delta; + if ( $total < 0 ) + $total = 0; + + // Only do the expensive stuff on a page-break, and about 1 other time per page + if ( 0 == $total % $per_page || 1 == mt_rand( 1, $per_page ) ) { + $post_id = 0; + $status = 'total_comments'; // What type of comment count are we looking for? + $parsed = parse_url( $url ); + if ( isset( $parsed['query'] ) ) { + parse_str( $parsed['query'], $query_vars ); + if ( !empty( $query_vars['comment_status'] ) ) + $status = $query_vars['comment_status']; + if ( !empty( $query_vars['p'] ) ) + $post_id = (int) $query_vars['p']; + } + + $comment_count = wp_count_comments($post_id); + + if ( isset( $comment_count->$status ) ) // We're looking for a known type of comment count + $total = $comment_count->$status; + // else use the decremented value from above + } + + $time = time(); // The time since the last comment count + + $x = new WP_Ajax_Response( array( + 'what' => 'comment', + 'id' => $comment_id, // here for completeness - not used + 'supplemental' => array( + 'total_items_i18n' => sprintf( _n( '1 item', '%s items', $total ), number_format_i18n( $total ) ), + 'total_pages' => ceil( $total / $per_page ), + 'total_pages_i18n' => number_format_i18n( ceil( $total / $per_page ) ), + 'total' => $total, + 'time' => $time + ) + ) ); + $x->send(); +} + +function _wp_ajax_add_hierarchical_term() { + $action = $_POST['action']; + $taxonomy = get_taxonomy(substr($action, 4)); + check_ajax_referer( $action, '_ajax_nonce-add-' . $taxonomy->name ); + if ( !current_user_can( $taxonomy->cap->edit_terms ) ) + die('-1'); + $names = explode(',', $_POST['new'.$taxonomy->name]); + $parent = isset($_POST['new'.$taxonomy->name.'_parent']) ? (int) $_POST['new'.$taxonomy->name.'_parent'] : 0; + if ( 0 > $parent ) + $parent = 0; + if ( $taxonomy->name == 'category' ) + $post_category = isset($_POST['post_category']) ? (array) $_POST['post_category'] : array(); + else + $post_category = ( isset($_POST['tax_input']) && isset($_POST['tax_input'][$taxonomy->name]) ) ? (array) $_POST['tax_input'][$taxonomy->name] : array(); + $checked_categories = array_map( 'absint', (array) $post_category ); + $popular_ids = wp_popular_terms_checklist($taxonomy->name, 0, 10, false); + + foreach ( $names as $cat_name ) { + $cat_name = trim($cat_name); + $category_nicename = sanitize_title($cat_name); + if ( '' === $category_nicename ) + continue; + if ( !($cat_id = term_exists($cat_name, $taxonomy->name, $parent)) ) { + $new_term = wp_insert_term($cat_name, $taxonomy->name, array('parent' => $parent)); + $cat_id = $new_term['term_id']; + } + $checked_categories[] = $cat_id; + if ( $parent ) // Do these all at once in a second + continue; + $category = get_term( $cat_id, $taxonomy->name ); + ob_start(); + wp_terms_checklist( 0, array( 'taxonomy' => $taxonomy->name, 'descendants_and_self' => $cat_id, 'selected_cats' => $checked_categories, 'popular_cats' => $popular_ids )); + $data = ob_get_contents(); + ob_end_clean(); + $add = array( + 'what' => $taxonomy->name, + 'id' => $cat_id, + 'data' => str_replace( array("\n", "\t"), '', $data), + 'position' => -1 + ); + } + + if ( $parent ) { // Foncy - replace the parent and all its children + $parent = get_term( $parent, $taxonomy->name ); + $term_id = $parent->term_id; + + while ( $parent->parent ) { // get the top parent + $parent = &get_term( $parent->parent, $taxonomy->name ); + if ( is_wp_error( $parent ) ) + break; + $term_id = $parent->term_id; + } + + ob_start(); + wp_terms_checklist( 0, array('taxonomy' => $taxonomy->name, 'descendants_and_self' => $term_id, 'selected_cats' => $checked_categories, 'popular_cats' => $popular_ids)); + $data = ob_get_contents(); + ob_end_clean(); + $add = array( + 'what' => $taxonomy->name, + 'id' => $term_id, + 'data' => str_replace( array("\n", "\t"), '', $data), + 'position' => -1 + ); + } + + ob_start(); + wp_dropdown_categories( array( + 'taxonomy' => $taxonomy->name, 'hide_empty' => 0, 'name' => 'new'.$taxonomy->name.'_parent', 'orderby' => 'name', + 'hierarchical' => 1, 'show_option_none' => '— '.$taxonomy->labels->parent_item.' —' + ) ); + $sup = ob_get_contents(); + ob_end_clean(); + $add['supplemental'] = array( 'newcat_parent' => $sup ); + + $x = new WP_Ajax_Response( $add ); + $x->send(); +} + +$id = isset($_POST['id'])? (int) $_POST['id'] : 0; +switch ( $action = $_POST['action'] ) : +case 'delete-comment' : // On success, die with time() instead of 1 + if ( !$comment = get_comment( $id ) ) + die( (string) time() ); + if ( !current_user_can( 'edit_post', $comment->comment_post_ID ) ) + die('-1'); + + check_ajax_referer( "delete-comment_$id" ); + $status = wp_get_comment_status( $comment->comment_ID ); + + $delta = -1; + if ( isset($_POST['trash']) && 1 == $_POST['trash'] ) { + if ( 'trash' == $status ) + die( (string) time() ); + $r = wp_trash_comment( $comment->comment_ID ); + } elseif ( isset($_POST['untrash']) && 1 == $_POST['untrash'] ) { + if ( 'trash' != $status ) + die( (string) time() ); + $r = wp_untrash_comment( $comment->comment_ID ); + if ( ! isset( $_POST['comment_status'] ) || $_POST['comment_status'] != 'trash' ) // undo trash, not in trash + $delta = 1; + } elseif ( isset($_POST['spam']) && 1 == $_POST['spam'] ) { + if ( 'spam' == $status ) + die( (string) time() ); + $r = wp_spam_comment( $comment->comment_ID ); + } elseif ( isset($_POST['unspam']) && 1 == $_POST['unspam'] ) { + if ( 'spam' != $status ) + die( (string) time() ); + $r = wp_unspam_comment( $comment->comment_ID ); + if ( ! isset( $_POST['comment_status'] ) || $_POST['comment_status'] != 'spam' ) // undo spam, not in spam + $delta = 1; + } elseif ( isset($_POST['delete']) && 1 == $_POST['delete'] ) { + $r = wp_delete_comment( $comment->comment_ID ); + } else { + die('-1'); + } + + if ( $r ) // Decide if we need to send back '1' or a more complicated response including page links and comment counts + _wp_ajax_delete_comment_response( $comment->comment_ID, $delta ); + die( '0' ); + break; +case 'delete-tag' : + $tag_id = (int) $_POST['tag_ID']; + check_ajax_referer( "delete-tag_$tag_id" ); + + $taxonomy = !empty($_POST['taxonomy']) ? $_POST['taxonomy'] : 'post_tag'; + $tax = get_taxonomy($taxonomy); + + if ( !current_user_can( $tax->cap->delete_terms ) ) + die('-1'); + + $tag = get_term( $tag_id, $taxonomy ); + if ( !$tag || is_wp_error( $tag ) ) + die('1'); + + if ( wp_delete_term($tag_id, $taxonomy)) + die('1'); + else + die('0'); + break; +case 'delete-link' : + check_ajax_referer( "delete-bookmark_$id" ); + if ( !current_user_can( 'manage_links' ) ) + die('-1'); + + $link = get_bookmark( $id ); + if ( !$link || is_wp_error( $link ) ) + die('1'); + + if ( wp_delete_link( $id ) ) + die('1'); + else + die('0'); + break; +case 'delete-meta' : + check_ajax_referer( "delete-meta_$id" ); + if ( !$meta = get_post_meta_by_id( $id ) ) + die('1'); + + if ( !current_user_can( 'edit_post', $meta->post_id ) || is_protected_meta( $meta->meta_key ) ) + die('-1'); + if ( delete_meta( $meta->meta_id ) ) + die('1'); + die('0'); + break; +case 'delete-post' : + check_ajax_referer( "{$action}_$id" ); + if ( !current_user_can( 'delete_post', $id ) ) + die('-1'); + + if ( !get_post( $id ) ) + die('1'); + + if ( wp_delete_post( $id ) ) + die('1'); + else + die('0'); + break; +case 'trash-post' : +case 'untrash-post' : + check_ajax_referer( "{$action}_$id" ); + if ( !current_user_can( 'delete_post', $id ) ) + die('-1'); + + if ( !get_post( $id ) ) + die('1'); + + if ( 'trash-post' == $action ) + $done = wp_trash_post( $id ); + else + $done = wp_untrash_post( $id ); + + if ( $done ) + die('1'); + + die('0'); + break; +case 'delete-page' : + check_ajax_referer( "{$action}_$id" ); + if ( !current_user_can( 'delete_page', $id ) ) + die('-1'); + + if ( !get_page( $id ) ) + die('1'); + + if ( wp_delete_post( $id ) ) + die('1'); + else + die('0'); + break; +case 'dim-comment' : // On success, die with time() instead of 1 + + if ( !$comment = get_comment( $id ) ) { + $x = new WP_Ajax_Response( array( + 'what' => 'comment', + 'id' => new WP_Error('invalid_comment', sprintf(__('Comment %d does not exist'), $id)) + ) ); + $x->send(); + } + + if ( !current_user_can( 'edit_post', $comment->comment_post_ID ) && !current_user_can( 'moderate_comments' ) ) + die('-1'); + + $current = wp_get_comment_status( $comment->comment_ID ); + if ( $_POST['new'] == $current ) + die( (string) time() ); + + check_ajax_referer( "approve-comment_$id" ); + if ( in_array( $current, array( 'unapproved', 'spam' ) ) ) + $result = wp_set_comment_status( $comment->comment_ID, 'approve', true ); + else + $result = wp_set_comment_status( $comment->comment_ID, 'hold', true ); + + if ( is_wp_error($result) ) { + $x = new WP_Ajax_Response( array( + 'what' => 'comment', + 'id' => $result + ) ); + $x->send(); + } + + // Decide if we need to send back '1' or a more complicated response including page links and comment counts + _wp_ajax_delete_comment_response( $comment->comment_ID ); + die( '0' ); + break; +case 'add-link-category' : // On the Fly + check_ajax_referer( $action ); + if ( !current_user_can( 'manage_categories' ) ) + die('-1'); + $names = explode(',', $_POST['newcat']); + $x = new WP_Ajax_Response(); + foreach ( $names as $cat_name ) { + $cat_name = trim($cat_name); + $slug = sanitize_title($cat_name); + if ( '' === $slug ) + continue; + if ( !$cat_id = term_exists( $cat_name, 'link_category' ) ) { + $cat_id = wp_insert_term( $cat_name, 'link_category' ); + } + $cat_id = $cat_id['term_id']; + $cat_name = esc_html(stripslashes($cat_name)); + $x->add( array( + 'what' => 'link-category', + 'id' => $cat_id, + 'data' => "", + 'position' => -1 + ) ); + } + $x->send(); + break; +case 'add-tag' : + check_ajax_referer( 'add-tag', '_wpnonce_add-tag' ); + $post_type = !empty($_POST['post_type']) ? $_POST['post_type'] : 'post'; + $taxonomy = !empty($_POST['taxonomy']) ? $_POST['taxonomy'] : 'post_tag'; + $tax = get_taxonomy($taxonomy); + + if ( !current_user_can( $tax->cap->edit_terms ) ) + die('-1'); + + $x = new WP_Ajax_Response(); + + $tag = wp_insert_term($_POST['tag-name'], $taxonomy, $_POST ); + + if ( !$tag || is_wp_error($tag) || (!$tag = get_term( $tag['term_id'], $taxonomy )) ) { + $message = __('An error has occurred. Please reload the page and try again.'); + if ( is_wp_error($tag) && $tag->get_error_message() ) + $message = $tag->get_error_message(); + + $x->add( array( + 'what' => 'taxonomy', + 'data' => new WP_Error('error', $message ) + ) ); + $x->send(); + } + + set_current_screen( $_POST['screen'] ); + + $wp_list_table = _get_list_table('WP_Terms_List_Table'); + + $level = 0; + if ( is_taxonomy_hierarchical($taxonomy) ) { + $level = count( get_ancestors( $tag->term_id, $taxonomy ) ); + ob_start(); + $wp_list_table->single_row( $tag, $level ); + $noparents = ob_get_clean(); + } + + ob_start(); + $wp_list_table->single_row( $tag ); + $parents = ob_get_clean(); + + $x->add( array( + 'what' => 'taxonomy', + 'supplemental' => compact('parents', 'noparents') + ) ); + $x->add( array( + 'what' => 'term', + 'position' => $level, + 'supplemental' => (array) $tag + ) ); + $x->send(); + break; +case 'get-tagcloud' : + if ( isset( $_POST['tax'] ) ) { + $taxonomy = sanitize_key( $_POST['tax'] ); + $tax = get_taxonomy( $taxonomy ); + if ( ! $tax ) + die( '0' ); + if ( ! current_user_can( $tax->cap->assign_terms ) ) + die( '-1' ); + } else { + die('0'); + } + + $tags = get_terms( $taxonomy, array( 'number' => 45, 'orderby' => 'count', 'order' => 'DESC' ) ); + + if ( empty( $tags ) ) + die( isset( $tax->no_tagcloud ) ? $tax->no_tagcloud : __('No tags found!') ); + + if ( is_wp_error( $tags ) ) + die( $tags->get_error_message() ); + + foreach ( $tags as $key => $tag ) { + $tags[ $key ]->link = '#'; + $tags[ $key ]->id = $tag->term_id; + } + + // We need raw tag names here, so don't filter the output + $return = wp_generate_tag_cloud( $tags, array('filter' => 0) ); + + if ( empty($return) ) + die('0'); + + echo $return; + + exit; + break; +case 'get-comments' : + check_ajax_referer( $action ); + + set_current_screen( 'edit-comments' ); + + $wp_list_table = _get_list_table('WP_Post_Comments_List_Table'); + + if ( !current_user_can( 'edit_post', $post_id ) ) + die('-1'); + + $wp_list_table->prepare_items(); + + if ( !$wp_list_table->has_items() ) + die('1'); + + $x = new WP_Ajax_Response(); + ob_start(); + foreach ( $wp_list_table->items as $comment ) { + get_comment( $comment ); + $wp_list_table->single_row( $comment ); + } + $comment_list_item = ob_get_contents(); + ob_end_clean(); + + $x->add( array( + 'what' => 'comments', + 'data' => $comment_list_item + ) ); + $x->send(); + break; +case 'replyto-comment' : + check_ajax_referer( $action, '_ajax_nonce-replyto-comment' ); + + set_current_screen( 'edit-comments' ); + + $comment_post_ID = (int) $_POST['comment_post_ID']; + if ( !current_user_can( 'edit_post', $comment_post_ID ) ) + die('-1'); + + $status = $wpdb->get_var( $wpdb->prepare("SELECT post_status FROM $wpdb->posts WHERE ID = %d", $comment_post_ID) ); + + if ( empty($status) ) + die('1'); + elseif ( in_array($status, array('draft', 'pending', 'trash') ) ) + die( __('Error: you are replying to a comment on a draft post.') ); + + $user = wp_get_current_user(); + if ( $user->ID ) { + $comment_author = $wpdb->escape($user->display_name); + $comment_author_email = $wpdb->escape($user->user_email); + $comment_author_url = $wpdb->escape($user->user_url); + $comment_content = trim($_POST['content']); + if ( current_user_can('unfiltered_html') ) { + if ( wp_create_nonce('unfiltered-html-comment_' . $comment_post_ID) != $_POST['_wp_unfiltered_html_comment'] ) { + kses_remove_filters(); // start with a clean slate + kses_init_filters(); // set up the filters + } + } + } else { + die( __('Sorry, you must be logged in to reply to a comment.') ); + } + + if ( '' == $comment_content ) + die( __('Error: please type a comment.') ); + + $comment_parent = absint($_POST['comment_ID']); + $comment_auto_approved = false; + $commentdata = compact('comment_post_ID', 'comment_author', 'comment_author_email', 'comment_author_url', 'comment_content', 'comment_type', 'comment_parent', 'user_ID'); + + $comment_id = wp_new_comment( $commentdata ); + $comment = get_comment($comment_id); + if ( ! $comment ) die('1'); + + $position = ( isset($_POST['position']) && (int) $_POST['position'] ) ? (int) $_POST['position'] : '-1'; + + + // automatically approve parent comment + if ( !empty($_POST['approve_parent']) ) { + $parent = get_comment( $comment_parent ); + + if ( $parent && $parent->comment_approved === '0' && $parent->comment_post_ID == $comment_post_ID ) { + if ( wp_set_comment_status( $parent->comment_ID, 'approve' ) ) + $comment_auto_approved = true; + } + } + + ob_start(); + if ( 'dashboard' == $_REQUEST['mode'] ) { + require_once( ABSPATH . 'wp-admin/includes/dashboard.php' ); + _wp_dashboard_recent_comments_row( $comment ); + } else { + if ( 'single' == $_REQUEST['mode'] ) { + $wp_list_table = _get_list_table('WP_Post_Comments_List_Table'); + } else { + $wp_list_table = _get_list_table('WP_Comments_List_Table'); + } + $wp_list_table->single_row( $comment ); + } + $comment_list_item = ob_get_contents(); + ob_end_clean(); + + $response = array( + 'what' => 'comment', + 'id' => $comment->comment_ID, + 'data' => $comment_list_item, + 'position' => $position + ); + + if ( $comment_auto_approved ) + $response['supplemental'] = array( 'parent_approved' => $parent->comment_ID ); + + $x = new WP_Ajax_Response(); + $x->add( $response ); + $x->send(); + break; +case 'edit-comment' : + check_ajax_referer( 'replyto-comment', '_ajax_nonce-replyto-comment' ); + + set_current_screen( 'edit-comments' ); + + $comment_post_ID = (int) $_POST['comment_post_ID']; + if ( ! current_user_can( 'edit_post', $comment_post_ID ) ) + die('-1'); + + if ( '' == $_POST['content'] ) + die( __('Error: please type a comment.') ); + + $comment_id = (int) $_POST['comment_ID']; + $_POST['comment_status'] = $_POST['status']; + edit_comment(); + + $position = ( isset($_POST['position']) && (int) $_POST['position']) ? (int) $_POST['position'] : '-1'; + $comments_status = isset($_POST['comments_listing']) ? $_POST['comments_listing'] : ''; + + $checkbox = ( isset($_POST['checkbox']) && true == $_POST['checkbox'] ) ? 1 : 0; + $wp_list_table = _get_list_table( $checkbox ? 'WP_Comments_List_Table' : 'WP_Post_Comments_List_Table' ); + + ob_start(); + $wp_list_table->single_row( get_comment( $comment_id ) ); + $comment_list_item = ob_get_contents(); + ob_end_clean(); + + $x = new WP_Ajax_Response(); + + $x->add( array( + 'what' => 'edit_comment', + 'id' => $comment->comment_ID, + 'data' => $comment_list_item, + 'position' => $position + )); + + $x->send(); + break; +case 'add-menu-item' : + if ( ! current_user_can( 'edit_theme_options' ) ) + die('-1'); + + check_ajax_referer( 'add-menu_item', 'menu-settings-column-nonce' ); + + require_once ABSPATH . 'wp-admin/includes/nav-menu.php'; + + // For performance reasons, we omit some object properties from the checklist. + // The following is a hacky way to restore them when adding non-custom items. + + $menu_items_data = array(); + foreach ( (array) $_POST['menu-item'] as $menu_item_data ) { + if ( + ! empty( $menu_item_data['menu-item-type'] ) && + 'custom' != $menu_item_data['menu-item-type'] && + ! empty( $menu_item_data['menu-item-object-id'] ) + ) { + switch( $menu_item_data['menu-item-type'] ) { + case 'post_type' : + $_object = get_post( $menu_item_data['menu-item-object-id'] ); + break; + + case 'taxonomy' : + $_object = get_term( $menu_item_data['menu-item-object-id'], $menu_item_data['menu-item-object'] ); + break; + } + + $_menu_items = array_map( 'wp_setup_nav_menu_item', array( $_object ) ); + $_menu_item = array_shift( $_menu_items ); + + // Restore the missing menu item properties + $menu_item_data['menu-item-description'] = $_menu_item->description; + } + + $menu_items_data[] = $menu_item_data; + } + + $item_ids = wp_save_nav_menu_items( 0, $menu_items_data ); + if ( is_wp_error( $item_ids ) ) + die('-1'); + + foreach ( (array) $item_ids as $menu_item_id ) { + $menu_obj = get_post( $menu_item_id ); + if ( ! empty( $menu_obj->ID ) ) { + $menu_obj = wp_setup_nav_menu_item( $menu_obj ); + $menu_obj->label = $menu_obj->title; // don't show "(pending)" in ajax-added items + $menu_items[] = $menu_obj; + } + } + + if ( ! empty( $menu_items ) ) { + $args = array( + 'after' => '', + 'before' => '', + 'link_after' => '', + 'link_before' => '', + 'walker' => new Walker_Nav_Menu_Edit, + ); + echo walk_nav_menu_tree( $menu_items, 0, (object) $args ); + } + break; +case 'add-meta' : + check_ajax_referer( 'add-meta', '_ajax_nonce-add-meta' ); + $c = 0; + $pid = (int) $_POST['post_id']; + $post = get_post( $pid ); + + if ( isset($_POST['metakeyselect']) || isset($_POST['metakeyinput']) ) { + if ( !current_user_can( 'edit_post', $pid ) ) + die('-1'); + if ( isset($_POST['metakeyselect']) && '#NONE#' == $_POST['metakeyselect'] && empty($_POST['metakeyinput']) ) + die('1'); + if ( $post->post_status == 'auto-draft' ) { + $save_POST = $_POST; // Backup $_POST + $_POST = array(); // Make it empty for edit_post() + $_POST['action'] = 'draft'; // Warning fix + $_POST['post_ID'] = $pid; + $_POST['post_type'] = $post->post_type; + $_POST['post_status'] = 'draft'; + $now = current_time('timestamp', 1); + $_POST['post_title'] = sprintf('Draft created on %s at %s', date(get_option('date_format'), $now), date(get_option('time_format'), $now)); + + if ( $pid = edit_post() ) { + if ( is_wp_error( $pid ) ) { + $x = new WP_Ajax_Response( array( + 'what' => 'meta', + 'data' => $pid + ) ); + $x->send(); + } + $_POST = $save_POST; // Now we can restore original $_POST again + if ( !$mid = add_meta( $pid ) ) + die(__('Please provide a custom field value.')); + } else { + die('0'); + } + } else if ( !$mid = add_meta( $pid ) ) { + die(__('Please provide a custom field value.')); + } + + $meta = get_post_meta_by_id( $mid ); + $pid = (int) $meta->post_id; + $meta = get_object_vars( $meta ); + $x = new WP_Ajax_Response( array( + 'what' => 'meta', + 'id' => $mid, + 'data' => _list_meta_row( $meta, $c ), + 'position' => 1, + 'supplemental' => array('postid' => $pid) + ) ); + } else { // Update? + $mid = (int) array_pop( array_keys($_POST['meta']) ); + $key = $_POST['meta'][$mid]['key']; + $value = $_POST['meta'][$mid]['value']; + if ( '' == trim($key) ) + die(__('Please provide a custom field name.')); + if ( '' == trim($value) ) + die(__('Please provide a custom field value.')); + if ( !$meta = get_post_meta_by_id( $mid ) ) + die('0'); // if meta doesn't exist + if ( !current_user_can( 'edit_post', $meta->post_id ) ) + die('-1'); + if ( is_protected_meta( $meta->meta_key ) ) + die('-1'); + if ( $meta->meta_value != stripslashes($value) || $meta->meta_key != stripslashes($key) ) { + if ( !$u = update_meta( $mid, $key, $value ) ) + die('0'); // We know meta exists; we also know it's unchanged (or DB error, in which case there are bigger problems). + } + + $key = stripslashes($key); + $value = stripslashes($value); + $x = new WP_Ajax_Response( array( + 'what' => 'meta', + 'id' => $mid, 'old_id' => $mid, + 'data' => _list_meta_row( array( + 'meta_key' => $key, + 'meta_value' => $value, + 'meta_id' => $mid + ), $c ), + 'position' => 0, + 'supplemental' => array('postid' => $meta->post_id) + ) ); + } + $x->send(); + break; +case 'add-user' : + check_ajax_referer( $action ); + if ( !current_user_can('create_users') ) + die('-1'); + if ( !$user_id = add_user() ) + die('0'); + elseif ( is_wp_error( $user_id ) ) { + $x = new WP_Ajax_Response( array( + 'what' => 'user', + 'id' => $user_id + ) ); + $x->send(); + } + $user_object = new WP_User( $user_id ); + + $wp_list_table = _get_list_table('WP_Users_List_Table'); + + $x = new WP_Ajax_Response( array( + 'what' => 'user', + 'id' => $user_id, + 'data' => $wp_list_table->single_row( $user_object, '', $user_object->roles[0] ), + 'supplemental' => array( + 'show-link' => sprintf(__( 'User %s added' ), "user-$user_id", $user_object->user_login), + 'role' => $user_object->roles[0] + ) + ) ); + $x->send(); + break; +case 'autosave' : // The name of this action is hardcoded in edit_post() + define( 'DOING_AUTOSAVE', true ); + + $nonce_age = check_ajax_referer( 'autosave', 'autosavenonce' ); + + $_POST['post_category'] = explode(",", $_POST['catslist']); + if ( $_POST['post_type'] == 'page' || empty($_POST['post_category']) ) + unset($_POST['post_category']); + + $do_autosave = (bool) $_POST['autosave']; + $do_lock = true; + + $data = $alert = ''; + /* translators: draft saved date format, see http://php.net/date */ + $draft_saved_date_format = __('g:i:s a'); + /* translators: %s: date and time */ + $message = sprintf( __('Draft saved at %s.'), date_i18n( $draft_saved_date_format ) ); + + $supplemental = array(); + if ( isset($login_grace_period) ) + $alert .= sprintf( __('Your login has expired. Please open a new browser window and log in again. '), add_query_arg( 'interim-login', 1, wp_login_url() ) ); + + $id = $revision_id = 0; + + $post_ID = (int) $_POST['post_ID']; + $_POST['ID'] = $post_ID; + $post = get_post($post_ID); + if ( 'auto-draft' == $post->post_status ) + $_POST['post_status'] = 'draft'; + + if ( $last = wp_check_post_lock( $post->ID ) ) { + $do_autosave = $do_lock = false; + + $last_user = get_userdata( $last ); + $last_user_name = $last_user ? $last_user->display_name : __( 'Someone' ); + $data = __( 'Autosave disabled.' ); + + $supplemental['disable_autosave'] = 'disable'; + $alert .= sprintf( __( '%s is currently editing this article. If you update it, you will overwrite the changes.' ), esc_html( $last_user_name ) ); + } + + if ( 'page' == $post->post_type ) { + if ( !current_user_can('edit_page', $post_ID) ) + die(__('You are not allowed to edit this page.')); + } else { + if ( !current_user_can('edit_post', $post_ID) ) + die(__('You are not allowed to edit this post.')); + } + + if ( $do_autosave ) { + // Drafts and auto-drafts are just overwritten by autosave + if ( 'auto-draft' == $post->post_status || 'draft' == $post->post_status ) { + $id = edit_post(); + } else { // Non drafts are not overwritten. The autosave is stored in a special post revision. + $revision_id = wp_create_post_autosave( $post->ID ); + if ( is_wp_error($revision_id) ) + $id = $revision_id; + else + $id = $post->ID; + } + $data = $message; + } else { + if ( isset( $_POST['auto_draft'] ) && '1' == $_POST['auto_draft'] ) + $id = 0; // This tells us it didn't actually save + else + $id = $post->ID; + } + + if ( $do_lock && ( isset( $_POST['auto_draft'] ) && ( $_POST['auto_draft'] != '1' ) ) && $id && is_numeric($id) ) + wp_set_post_lock( $id ); + + if ( $nonce_age == 2 ) { + $supplemental['replace-autosavenonce'] = wp_create_nonce('autosave'); + $supplemental['replace-getpermalinknonce'] = wp_create_nonce('getpermalink'); + $supplemental['replace-samplepermalinknonce'] = wp_create_nonce('samplepermalink'); + $supplemental['replace-closedpostboxesnonce'] = wp_create_nonce('closedpostboxes'); + if ( $id ) { + if ( $_POST['post_type'] == 'post' ) + $supplemental['replace-_wpnonce'] = wp_create_nonce('update-post_' . $id); + elseif ( $_POST['post_type'] == 'page' ) + $supplemental['replace-_wpnonce'] = wp_create_nonce('update-page_' . $id); + } + } + + if ( ! empty($alert) ) + $supplemental['alert'] = $alert; + + $x = new WP_Ajax_Response( array( + 'what' => 'autosave', + 'id' => $id, + 'data' => $id ? $data : '', + 'supplemental' => $supplemental + ) ); + $x->send(); + break; +case 'closed-postboxes' : + check_ajax_referer( 'closedpostboxes', 'closedpostboxesnonce' ); + $closed = isset( $_POST['closed'] ) ? explode( ',', $_POST['closed']) : array(); + $closed = array_filter($closed); + + $hidden = isset( $_POST['hidden'] ) ? explode( ',', $_POST['hidden']) : array(); + $hidden = array_filter($hidden); + + $page = isset( $_POST['page'] ) ? $_POST['page'] : ''; + + if ( !preg_match( '/^[a-z_-]+$/', $page ) ) + die('-1'); + + if ( ! $user = wp_get_current_user() ) + die('-1'); + + if ( is_array($closed) ) + update_user_option($user->ID, "closedpostboxes_$page", $closed, true); + + if ( is_array($hidden) ) { + $hidden = array_diff( $hidden, array('submitdiv', 'linksubmitdiv', 'manage-menu', 'create-menu') ); // postboxes that are always shown + update_user_option($user->ID, "metaboxhidden_$page", $hidden, true); + } + + die('1'); + break; +case 'hidden-columns' : + check_ajax_referer( 'screen-options-nonce', 'screenoptionnonce' ); + $hidden = isset( $_POST['hidden'] ) ? $_POST['hidden'] : ''; + $hidden = explode( ',', $_POST['hidden'] ); + $page = isset( $_POST['page'] ) ? $_POST['page'] : ''; + + if ( !preg_match( '/^[a-z_-]+$/', $page ) ) + die('-1'); + + if ( ! $user = wp_get_current_user() ) + die('-1'); + + if ( is_array($hidden) ) + update_user_option($user->ID, "manage{$page}columnshidden", $hidden, true); + + die('1'); + break; +case 'menu-get-metabox' : + if ( ! current_user_can( 'edit_theme_options' ) ) + die('-1'); + + require_once ABSPATH . 'wp-admin/includes/nav-menu.php'; + + if ( isset( $_POST['item-type'] ) && 'post_type' == $_POST['item-type'] ) { + $type = 'posttype'; + $callback = 'wp_nav_menu_item_post_type_meta_box'; + $items = (array) get_post_types( array( 'show_in_nav_menus' => true ), 'object' ); + } elseif ( isset( $_POST['item-type'] ) && 'taxonomy' == $_POST['item-type'] ) { + $type = 'taxonomy'; + $callback = 'wp_nav_menu_item_taxonomy_meta_box'; + $items = (array) get_taxonomies( array( 'show_ui' => true ), 'object' ); + } + + if ( ! empty( $_POST['item-object'] ) && isset( $items[$_POST['item-object']] ) ) { + $item = apply_filters( 'nav_menu_meta_box_object', $items[ $_POST['item-object'] ] ); + ob_start(); + call_user_func_array($callback, array( + null, + array( + 'id' => 'add-' . $item->name, + 'title' => $item->labels->name, + 'callback' => $callback, + 'args' => $item, + ) + )); + + $markup = ob_get_clean(); + + echo json_encode(array( + 'replace-id' => $type . '-' . $item->name, + 'markup' => $markup, + )); + } + + exit; + break; +case 'menu-quick-search': + if ( ! current_user_can( 'edit_theme_options' ) ) + die('-1'); + + require_once ABSPATH . 'wp-admin/includes/nav-menu.php'; + + _wp_ajax_menu_quick_search( $_REQUEST ); + + exit; + break; +case 'wp-link-ajax': + require_once ABSPATH . 'wp-admin/includes/internal-linking.php'; + + check_ajax_referer( 'internal-linking', '_ajax_linking_nonce' ); + + $args = array(); + + if ( isset( $_POST['search'] ) ) + $args['s'] = stripslashes( $_POST['search'] ); + $args['pagenum'] = ! empty( $_POST['page'] ) ? absint( $_POST['page'] ) : 1; + + $results = wp_link_query( $args ); + + if ( ! isset( $results ) ) + die( '0' ); + + echo json_encode( $results ); + echo "\n"; + + exit; + break; +case 'menu-locations-save': + if ( ! current_user_can( 'edit_theme_options' ) ) + die('-1'); + check_ajax_referer( 'add-menu_item', 'menu-settings-column-nonce' ); + if ( ! isset( $_POST['menu-locations'] ) ) + die('0'); + set_theme_mod( 'nav_menu_locations', array_map( 'absint', $_POST['menu-locations'] ) ); + die('1'); + break; +case 'meta-box-order': + check_ajax_referer( 'meta-box-order' ); + $order = isset( $_POST['order'] ) ? (array) $_POST['order'] : false; + $page_columns = isset( $_POST['page_columns'] ) ? (int) $_POST['page_columns'] : 0; + $page = isset( $_POST['page'] ) ? $_POST['page'] : ''; + + if ( !preg_match( '/^[a-z_-]+$/', $page ) ) + die('-1'); + + if ( ! $user = wp_get_current_user() ) + die('-1'); + + if ( $order ) + update_user_option($user->ID, "meta-box-order_$page", $order, true); + + if ( $page_columns ) + update_user_option($user->ID, "screen_layout_$page", $page_columns, true); + + die('1'); + break; +case 'get-permalink': + check_ajax_referer( 'getpermalink', 'getpermalinknonce' ); + $post_id = isset($_POST['post_id'])? intval($_POST['post_id']) : 0; + die(add_query_arg(array('preview' => 'true'), get_permalink($post_id))); +break; +case 'sample-permalink': + check_ajax_referer( 'samplepermalink', 'samplepermalinknonce' ); + $post_id = isset($_POST['post_id'])? intval($_POST['post_id']) : 0; + $title = isset($_POST['new_title'])? $_POST['new_title'] : ''; + $slug = isset($_POST['new_slug'])? $_POST['new_slug'] : null; + die(get_sample_permalink_html($post_id, $title, $slug)); +break; +case 'inline-save': + check_ajax_referer( 'inlineeditnonce', '_inline_edit' ); + + if ( ! isset($_POST['post_ID']) || ! ( $post_ID = (int) $_POST['post_ID'] ) ) + exit; + + if ( 'page' == $_POST['post_type'] ) { + if ( ! current_user_can( 'edit_page', $post_ID ) ) + die( __('You are not allowed to edit this page.') ); + } else { + if ( ! current_user_can( 'edit_post', $post_ID ) ) + die( __('You are not allowed to edit this post.') ); + } + + set_current_screen( $_POST['screen'] ); + + if ( $last = wp_check_post_lock( $post_ID ) ) { + $last_user = get_userdata( $last ); + $last_user_name = $last_user ? $last_user->display_name : __( 'Someone' ); + printf( $_POST['post_type'] == 'page' ? __( 'Saving is disabled: %s is currently editing this page.' ) : __( 'Saving is disabled: %s is currently editing this post.' ), esc_html( $last_user_name ) ); + exit; + } + + $data = &$_POST; + + $post = get_post( $post_ID, ARRAY_A ); + $post = add_magic_quotes($post); //since it is from db + + $data['content'] = $post['post_content']; + $data['excerpt'] = $post['post_excerpt']; + + // rename + $data['user_ID'] = $GLOBALS['user_ID']; + + if ( isset($data['post_parent']) ) + $data['parent_id'] = $data['post_parent']; + + // status + if ( isset($data['keep_private']) && 'private' == $data['keep_private'] ) + $data['post_status'] = 'private'; + else + $data['post_status'] = $data['_status']; + + if ( empty($data['comment_status']) ) + $data['comment_status'] = 'closed'; + if ( empty($data['ping_status']) ) + $data['ping_status'] = 'closed'; + + // update the post + edit_post(); + + $wp_list_table = _get_list_table('WP_Posts_List_Table'); + + $mode = $_POST['post_view']; + $wp_list_table->display_rows( array( get_post( $_POST['post_ID'] ) ) ); + + exit; + break; +case 'inline-save-tax': + check_ajax_referer( 'taxinlineeditnonce', '_inline_edit' ); + + $taxonomy = sanitize_key( $_POST['taxonomy'] ); + $tax = get_taxonomy( $taxonomy ); + if ( ! $tax ) + die( '0' ); + + if ( ! current_user_can( $tax->cap->edit_terms ) ) + die( '-1' ); + + set_current_screen( 'edit-' . $taxonomy ); + + $wp_list_table = _get_list_table('WP_Terms_List_Table'); + + if ( ! isset($_POST['tax_ID']) || ! ( $id = (int) $_POST['tax_ID'] ) ) + die(-1); + + $tag = get_term( $id, $taxonomy ); + $_POST['description'] = $tag->description; + + $updated = wp_update_term($id, $taxonomy, $_POST); + if ( $updated && !is_wp_error($updated) ) { + $tag = get_term( $updated['term_id'], $taxonomy ); + if ( !$tag || is_wp_error( $tag ) ) { + if ( is_wp_error($tag) && $tag->get_error_message() ) + die( $tag->get_error_message() ); + die( __('Item not updated.') ); + } + + echo $wp_list_table->single_row( $tag ); + } else { + if ( is_wp_error($updated) && $updated->get_error_message() ) + die( $updated->get_error_message() ); + die( __('Item not updated.') ); + } + + exit; + break; +case 'find_posts': + check_ajax_referer( 'find-posts' ); + + if ( empty($_POST['ps']) ) + exit; + + if ( !empty($_POST['post_type']) && in_array( $_POST['post_type'], get_post_types() ) ) + $what = $_POST['post_type']; + else + $what = 'post'; + + $s = stripslashes($_POST['ps']); + preg_match_all('/".*?("|$)|((?<=[\\s",+])|^)[^\\s",+]+/', $s, $matches); + $search_terms = array_map('_search_terms_tidy', $matches[0]); + + $searchand = $search = ''; + foreach ( (array) $search_terms as $term ) { + $term = esc_sql( like_escape( $term ) ); + $search .= "{$searchand}(($wpdb->posts.post_title LIKE '%{$term}%') OR ($wpdb->posts.post_content LIKE '%{$term}%'))"; + $searchand = ' AND '; + } + $term = esc_sql( like_escape( $s ) ); + if ( count($search_terms) > 1 && $search_terms[0] != $s ) + $search .= " OR ($wpdb->posts.post_title LIKE '%{$term}%') OR ($wpdb->posts.post_content LIKE '%{$term}%')"; + + $posts = $wpdb->get_results( "SELECT ID, post_title, post_status, post_date FROM $wpdb->posts WHERE post_type = '$what' AND post_status IN ('draft', 'publish') AND ($search) ORDER BY post_date_gmt DESC LIMIT 50" ); + + if ( ! $posts ) { + $posttype = get_post_type_object($what); + exit($posttype->labels->not_found); + } + + $html = ''; + foreach ( $posts as $post ) { + + switch ( $post->post_status ) { + case 'publish' : + case 'private' : + $stat = __('Published'); + break; + case 'future' : + $stat = __('Scheduled'); + break; + case 'pending' : + $stat = __('Pending Review'); + break; + case 'draft' : + $stat = __('Draft'); + break; + } + + if ( '0000-00-00 00:00:00' == $post->post_date ) { + $time = ''; + } else { + /* translators: date format in table columns, see http://php.net/date */ + $time = mysql2date(__('Y/m/d'), $post->post_date); + } + + $html .= ''; + $html .= ''."\n\n"; + } + $html .= '

'.__('Title').''.__('Date').''.__('Status').'
'.esc_html( $time ).''.esc_html( $stat ).'
'; + + $x = new WP_Ajax_Response(); + $x->add( array( + 'what' => $what, + 'data' => $html + )); + $x->send(); + + break; +case 'widgets-order' : + check_ajax_referer( 'save-sidebar-widgets', 'savewidgets' ); + + if ( !current_user_can('edit_theme_options') ) + die('-1'); + + unset( $_POST['savewidgets'], $_POST['action'] ); + + // save widgets order for all sidebars + if ( is_array($_POST['sidebars']) ) { + $sidebars = array(); + foreach ( $_POST['sidebars'] as $key => $val ) { + $sb = array(); + if ( !empty($val) ) { + $val = explode(',', $val); + foreach ( $val as $k => $v ) { + if ( strpos($v, 'widget-') === false ) + continue; + + $sb[$k] = substr($v, strpos($v, '_') + 1); + } + } + $sidebars[$key] = $sb; + } + wp_set_sidebars_widgets($sidebars); + die('1'); + } + + die('-1'); + break; +case 'save-widget' : + check_ajax_referer( 'save-sidebar-widgets', 'savewidgets' ); + + if ( !current_user_can('edit_theme_options') || !isset($_POST['id_base']) ) + die('-1'); + + unset( $_POST['savewidgets'], $_POST['action'] ); + + do_action('load-widgets.php'); + do_action('widgets.php'); + do_action('sidebar_admin_setup'); + + $id_base = $_POST['id_base']; + $widget_id = $_POST['widget-id']; + $sidebar_id = $_POST['sidebar']; + $multi_number = !empty($_POST['multi_number']) ? (int) $_POST['multi_number'] : 0; + $settings = isset($_POST['widget-' . $id_base]) && is_array($_POST['widget-' . $id_base]) ? $_POST['widget-' . $id_base] : false; + $error = '

' . __('An error has occurred. Please reload the page and try again.') . '

'; + + $sidebars = wp_get_sidebars_widgets(); + $sidebar = isset($sidebars[$sidebar_id]) ? $sidebars[$sidebar_id] : array(); + + // delete + if ( isset($_POST['delete_widget']) && $_POST['delete_widget'] ) { + + if ( !isset($wp_registered_widgets[$widget_id]) ) + die($error); + + $sidebar = array_diff( $sidebar, array($widget_id) ); + $_POST = array('sidebar' => $sidebar_id, 'widget-' . $id_base => array(), 'the-widget-id' => $widget_id, 'delete_widget' => '1'); + } elseif ( $settings && preg_match( '/__i__|%i%/', key($settings) ) ) { + if ( !$multi_number ) + die($error); + + $_POST['widget-' . $id_base] = array( $multi_number => array_shift($settings) ); + $widget_id = $id_base . '-' . $multi_number; + $sidebar[] = $widget_id; + } + $_POST['widget-id'] = $sidebar; + + foreach ( (array) $wp_registered_widget_updates as $name => $control ) { + + if ( $name == $id_base ) { + if ( !is_callable( $control['callback'] ) ) + continue; + + ob_start(); + call_user_func_array( $control['callback'], $control['params'] ); + ob_end_clean(); + break; + } + } + + if ( isset($_POST['delete_widget']) && $_POST['delete_widget'] ) { + $sidebars[$sidebar_id] = $sidebar; + wp_set_sidebars_widgets($sidebars); + echo "deleted:$widget_id"; + die(); + } + + if ( !empty($_POST['add_new']) ) + die(); + + if ( $form = $wp_registered_widget_controls[$widget_id] ) + call_user_func_array( $form['callback'], $form['params'] ); + + die(); + break; +case 'image-editor': + $attachment_id = intval($_POST['postid']); + if ( empty($attachment_id) || !current_user_can('edit_post', $attachment_id) ) + die('-1'); + + check_ajax_referer( "image_editor-$attachment_id" ); + include_once( ABSPATH . 'wp-admin/includes/image-edit.php' ); + + $msg = false; + switch ( $_POST['do'] ) { + case 'save' : + $msg = wp_save_image($attachment_id); + $msg = json_encode($msg); + die($msg); + break; + case 'scale' : + $msg = wp_save_image($attachment_id); + break; + case 'restore' : + $msg = wp_restore_image($attachment_id); + break; + } + + wp_image_editor($attachment_id, $msg); + die(); + break; +case 'set-post-thumbnail': + $post_ID = intval( $_POST['post_id'] ); + if ( !current_user_can( 'edit_post', $post_ID ) ) + die( '-1' ); + $thumbnail_id = intval( $_POST['thumbnail_id'] ); + + check_ajax_referer( "set_post_thumbnail-$post_ID" ); + + if ( $thumbnail_id == '-1' ) { + delete_post_meta( $post_ID, '_thumbnail_id' ); + die( _wp_post_thumbnail_html() ); + } + + if ( set_post_thumbnail( $post_ID, $thumbnail_id ) ) + die( _wp_post_thumbnail_html( $thumbnail_id ) ); + die( '0' ); + break; +case 'date_format' : + die( date_i18n( sanitize_option( 'date_format', $_POST['date'] ) ) ); + break; +case 'time_format' : + die( date_i18n( sanitize_option( 'time_format', $_POST['date'] ) ) ); + break; +case 'wp-fullscreen-save-post' : + if ( isset($_POST['post_ID']) ) + $post_id = (int) $_POST['post_ID']; + else + $post_id = 0; + + $post = null; + $post_type_object = null; + $post_type = null; + if ( $post_id ) { + $post = get_post($post_id); + if ( $post ) { + $post_type_object = get_post_type_object($post->post_type); + if ( $post_type_object ) { + $post_type = $post->post_type; + $current_screen->post_type = $post->post_type; + $current_screen->id = $current_screen->post_type; + } + } + } elseif ( isset($_POST['post_type']) ) { + $post_type_object = get_post_type_object($_POST['post_type']); + if ( $post_type_object ) { + $post_type = $post_type_object->name; + $current_screen->post_type = $post_type; + $current_screen->id = $current_screen->post_type; + } + } + + check_ajax_referer('update-' . $post_type . '_' . $post_id, '_wpnonce'); + + $post_id = edit_post(); + + if ( is_wp_error($post_id) ) { + if ( $post_id->get_error_message() ) + $message = $post_id->get_error_message(); + else + $message = __('Save failed'); + + echo json_encode( array( 'message' => $message, 'last_edited' => '' ) ); + die(); + } else { + $message = __('Saved.'); + } + + if ( $post ) { + $last_date = mysql2date( get_option('date_format'), $post->post_modified ); + $last_time = mysql2date( get_option('time_format'), $post->post_modified ); + } else { + $last_date = date_i18n( get_option('date_format') ); + $last_time = date_i18n( get_option('time_format') ); + } + + if ( $last_id = get_post_meta($post_id, '_edit_last', true) ) { + $last_user = get_userdata($last_id); + $last_edited = sprintf( __('Last edited by %1$s on %2$s at %3$s'), esc_html( $last_user->display_name ), $last_date, $last_time ); + } else { + $last_edited = sprintf( __('Last edited on %1$s at %2$s'), $last_date, $last_time ); + } + + echo json_encode( array( 'message' => $message, 'last_edited' => $last_edited ) ); + die(); + break; +default : + do_action( 'wp_ajax_' . $_POST['action'] ); + die('0'); + break; +endswitch; +?> diff --git a/src/wp-admin/admin-footer.php b/src/wp-admin/admin-footer.php new file mode 100644 index 0000000..04d7315 --- /dev/null +++ b/src/wp-admin/admin-footer.php @@ -0,0 +1,51 @@ + + +
+
+
+ + + + +
+ + + diff --git a/src/wp-admin/admin-functions.php b/src/wp-admin/admin-functions.php new file mode 100644 index 0000000..b8c84fd --- /dev/null +++ b/src/wp-admin/admin-functions.php @@ -0,0 +1,16 @@ + \ No newline at end of file diff --git a/src/wp-admin/admin-header.php b/src/wp-admin/admin-header.php new file mode 100644 index 0000000..18b5ff3 --- /dev/null +++ b/src/wp-admin/admin-header.php @@ -0,0 +1,219 @@ + + + > + + +<?php echo $admin_title; ?> + + + + + + +"> + + +
+ +
+ + +
+parent_file = $parent_file; +$current_screen->parent_base = preg_replace('/\?.*$/', '', $parent_file); +$current_screen->parent_base = str_replace('.php', '', $current_screen->parent_base); +?> + +
+ \ No newline at end of file diff --git a/src/wp-admin/admin.php b/src/wp-admin/admin.php new file mode 100644 index 0000000..ce1227d --- /dev/null +++ b/src/wp-admin/admin.php @@ -0,0 +1,238 @@ +flush_rules(); + update_option( 'db_upgraded', false ); + + /** + * Runs on the next page load after successful upgrade + * + * @since 2.8 + */ + do_action('after_db_upgrade'); +} elseif ( get_option('db_version') != $wp_db_version ) { + if ( !is_multisite() ) { + wp_redirect(admin_url('upgrade.php?_wp_http_referer=' . urlencode(stripslashes($_SERVER['REQUEST_URI'])))); + exit; + } elseif ( apply_filters( 'do_mu_upgrade', true ) ) { + /** + * On really small MU installs run the upgrader every time, + * else run it less often to reduce load. + * + * @since 2.8.4b + */ + $c = get_blog_count(); + if ( $c <= 50 || ( $c > 50 && mt_rand( 0, (int)( $c / 50 ) ) == 1 ) ) { + require_once( ABSPATH . WPINC . '/http.php' ); + $response = wp_remote_get( admin_url( 'upgrade.php?step=1' ), array( 'timeout' => 120, 'httpversion' => '1.1' ) ); + do_action( 'after_mu_upgrade', $response ); + unset($response); + } + unset($c); + } +} + +require_once(ABSPATH . 'wp-admin/includes/admin.php'); + +auth_redirect(); + +nocache_headers(); + +// Schedule trash collection +if ( !wp_next_scheduled('wp_scheduled_delete') && !defined('WP_INSTALLING') ) + wp_schedule_event(time(), 'daily', 'wp_scheduled_delete'); + +set_screen_options(); + +$date_format = get_option('date_format'); +$time_format = get_option('time_format'); + +wp_reset_vars(array('profile', 'redirect', 'redirect_url', 'a', 'text', 'trackback', 'pingback')); + +wp_enqueue_script( 'common' ); +wp_enqueue_script( 'jquery-color' ); + +$editing = false; + +if ( isset($_GET['page']) ) { + $plugin_page = stripslashes($_GET['page']); + $plugin_page = plugin_basename($plugin_page); +} + +if ( isset($_GET['post_type']) ) + $typenow = sanitize_key($_GET['post_type']); +else + $typenow = ''; + +if ( isset($_GET['taxonomy']) ) + $taxnow = sanitize_key($_GET['taxonomy']); +else + $taxnow = ''; + +if ( WP_NETWORK_ADMIN ) + require(ABSPATH . 'wp-admin/network/menu.php'); +elseif ( WP_USER_ADMIN ) + require(ABSPATH . 'wp-admin/user/menu.php'); +else + require(ABSPATH . 'wp-admin/menu.php'); + +if ( current_user_can( 'manage_options' ) ) + @ini_set( 'memory_limit', apply_filters( 'admin_memory_limit', WP_MAX_MEMORY_LIMIT ) ); + +do_action('admin_init'); + +if ( isset($plugin_page) ) { + if ( !empty($typenow) ) + $the_parent = $pagenow . '?post_type=' . $typenow; + else + $the_parent = $pagenow; + if ( ! $page_hook = get_plugin_page_hook($plugin_page, $the_parent) ) { + $page_hook = get_plugin_page_hook($plugin_page, $plugin_page); + // backwards compatibility for plugins using add_management_page + if ( empty( $page_hook ) && 'edit.php' == $pagenow && '' != get_plugin_page_hook($plugin_page, 'tools.php') ) { + // There could be plugin specific params on the URL, so we need the whole query string + if ( !empty($_SERVER[ 'QUERY_STRING' ]) ) + $query_string = $_SERVER[ 'QUERY_STRING' ]; + else + $query_string = 'page=' . $plugin_page; + wp_redirect( admin_url('tools.php?' . $query_string) ); + exit; + } + } + unset($the_parent); +} + +$hook_suffix = ''; +if ( isset($page_hook) ) + $hook_suffix = $page_hook; +else if ( isset($plugin_page) ) + $hook_suffix = $plugin_page; +else if ( isset($pagenow) ) + $hook_suffix = $pagenow; + +set_current_screen(); + +// Handle plugin admin pages. +if ( isset($plugin_page) ) { + if ( $page_hook ) { + do_action('load-' . $page_hook); + if (! isset($_GET['noheader'])) + require_once(ABSPATH . 'wp-admin/admin-header.php'); + + do_action($page_hook); + } else { + if ( validate_file($plugin_page) ) + wp_die(__('Invalid plugin page')); + + + if ( !( file_exists(WP_PLUGIN_DIR . "/$plugin_page") && is_file(WP_PLUGIN_DIR . "/$plugin_page") ) && !( file_exists(WPMU_PLUGIN_DIR . "/$plugin_page") && is_file(WPMU_PLUGIN_DIR . "/$plugin_page") ) ) + wp_die(sprintf(__('Cannot load %s.'), htmlentities($plugin_page))); + + do_action('load-' . $plugin_page); + + if ( !isset($_GET['noheader'])) + require_once(ABSPATH . 'wp-admin/admin-header.php'); + + if ( file_exists(WPMU_PLUGIN_DIR . "/$plugin_page") ) + include(WPMU_PLUGIN_DIR . "/$plugin_page"); + else + include(WP_PLUGIN_DIR . "/$plugin_page"); + } + + include(ABSPATH . 'wp-admin/admin-footer.php'); + + exit(); +} else if (isset($_GET['import'])) { + + $importer = $_GET['import']; + + if ( ! current_user_can('import') ) + wp_die(__('You are not allowed to import.')); + + if ( validate_file($importer) ) { + wp_redirect( admin_url( 'import.php?invalid=' . $importer ) ); + exit; + } + + // Allow plugins to define importers as well + if ( !isset($wp_importers) || !isset($wp_importers[$importer]) || ! is_callable($wp_importers[$importer][2])) { + if (! file_exists(ABSPATH . "wp-admin/import/$importer.php")) { + wp_redirect( admin_url( 'import.php?invalid=' . $importer ) ); + exit; + } + include(ABSPATH . "wp-admin/import/$importer.php"); + } + + $parent_file = 'tools.php'; + $submenu_file = 'import.php'; + $title = __('Import'); + + if (! isset($_GET['noheader'])) + require_once(ABSPATH . 'wp-admin/admin-header.php'); + + require_once(ABSPATH . 'wp-admin/includes/upgrade.php'); + + define('WP_IMPORTING', true); + + if ( apply_filters( 'force_filtered_html_on_import', false ) ) + kses_init_filters(); // Always filter imported data with kses on multisite. + + call_user_func($wp_importers[$importer][2]); + + include(ABSPATH . 'wp-admin/admin-footer.php'); + + // Make sure rules are flushed + global $wp_rewrite; + $wp_rewrite->flush_rules(false); + + exit(); +} else { + do_action("load-$pagenow"); + // Backwards compatibility with old load-page-new.php, load-page.php, + // and load-categories.php actions. + if ( $typenow == 'page' ) { + if ( $pagenow == 'post-new.php' ) + do_action( 'load-page-new.php' ); + elseif ( $pagenow == 'post.php' ) + do_action( 'load-page.php' ); + } elseif ( $pagenow == 'edit-tags.php' ) { + if ( $taxnow == 'category' ) + do_action( 'load-categories.php' ); + elseif ( $taxnow == 'link_category' ) + do_action( 'load-edit-link-categories.php' ); + } +} + +if ( !empty($_REQUEST['action']) ) + do_action('admin_action_' . $_REQUEST['action']); + +?> diff --git a/src/wp-admin/async-upload.php b/src/wp-admin/async-upload.php new file mode 100644 index 0000000..6fa6518 --- /dev/null +++ b/src/wp-admin/async-upload.php @@ -0,0 +1,70 @@ +post_type ) + wp_die( __( 'Unknown post type.' ) ); + $post_type_object = get_post_type_object( 'attachment' ); + if ( ! current_user_can( $post_type_object->cap->edit_post, $id ) ) + wp_die( __( 'You are not allowed to edit this item.' ) ); + + if ( 2 == $_REQUEST['fetch'] ) { + add_filter('attachment_fields_to_edit', 'media_single_attachment_fields_to_edit', 10, 2); + echo get_media_item($id, array( 'send' => false, 'delete' => true )); + } else { + add_filter('attachment_fields_to_edit', 'media_post_single_attachment_fields_to_edit', 10, 2); + echo get_media_item($id); + } + exit; +} + +check_admin_referer('media-form'); + +$id = media_handle_upload('async-upload', $_REQUEST['post_id']); +if ( is_wp_error($id) ) { + echo '
+ ' . __('Dismiss') . ' + ' . sprintf(__('“%s” has failed to upload due to an error'), esc_html($_FILES['async-upload']['name']) ) . '
' . + esc_html($id->get_error_message()) . '
'; + exit; +} + +if ( $_REQUEST['short'] ) { + // short form response - attachment ID only + echo $id; +} else { + // long form response - big chunk o html + $type = $_REQUEST['type']; + echo apply_filters("async_upload_{$type}", $id); +} + +?> diff --git a/src/wp-admin/comment.php b/src/wp-admin/comment.php new file mode 100644 index 0000000..a26ed5c --- /dev/null +++ b/src/wp-admin/comment.php @@ -0,0 +1,289 @@ +

$msg

"; + include('./admin-footer.php'); + die; +} + +switch( $action ) { + +case 'editcomment' : + $title = __('Edit Comment'); + + add_contextual_help( $current_screen, '

' . __( 'You can edit the information left in a comment if needed. This is often useful when you notice that a commenter has made a typographical error.' ) . '

' . + '

' . __( 'You can also moderate the comment from this screen using the Status box, where you can also change the timestamp of the comment.' ) . '

' . + '

' . __( 'For more information:' ) . '

' . + '

' . __( 'Documentation on Comments' ) . '

' . + '

' . __( 'Support Forums' ) . '

' + ); + + wp_enqueue_script('comment'); + require_once('./admin-header.php'); + + $comment_id = absint( $_GET['c'] ); + + if ( !$comment = get_comment( $comment_id ) ) + comment_footer_die( __('Oops, no comment with this ID.') . sprintf(' '.__('Go back').'!', 'javascript:history.go(-1)') ); + + if ( !current_user_can( 'edit_comment', $comment_id ) ) + comment_footer_die( __('You are not allowed to edit this comment.') ); + + if ( 'trash' == $comment->comment_approved ) + comment_footer_die( __('This comment is in the Trash. Please move it out of the Trash if you want to edit it.') ); + + $comment = get_comment_to_edit( $comment_id ); + + include('./edit-form-comment.php'); + + break; + +case 'delete' : +case 'approve' : +case 'trash' : +case 'spam' : + + $title = __('Moderate Comment'); + + $comment_id = absint( $_GET['c'] ); + + if ( !$comment = get_comment_to_edit( $comment_id ) ) { + wp_redirect( admin_url('edit-comments.php?error=1') ); + die(); + } + + if ( !current_user_can( 'edit_comment', $comment->comment_ID ) ) { + wp_redirect( admin_url('edit-comments.php?error=2') ); + die(); + } + + // No need to re-approve/re-trash/re-spam a comment. + if ( $action == str_replace( '1', 'approve', $comment->comment_approved ) ) { + wp_redirect( admin_url( 'edit-comments.php?same=' . $comment_id ) ); + die(); + } + + require_once('./admin-header.php'); + + $formaction = $action . 'comment'; + $nonce_action = 'approve' == $action ? 'approve-comment_' : 'delete-comment_'; + $nonce_action .= $comment_id; + +?> +
+ +
+ + +

+ +comment_approved != '0' ) { // if not unapproved + $message = ''; + switch ( $comment->comment_approved ) { + case '1' : + $message = __('This comment is currently approved.'); + break; + case 'spam' : + $message = __('This comment is currently marked as spam.'); + break; + case 'trash' : + $message = __('This comment is currently in the Trash.'); + break; + } + if ( $message ) + echo '

' . $message . '

'; +} +?> +

+ + + + + + +comment_author_email ) { ?> + + + + + +comment_author_url ) { ?> + + + + + + + + + +
comment_author; ?>
comment_author_email; ?>
comment_author_url; ?>
comment_content; ?>
+ +

+ +
+ + + + + + +
+ + + + + +
+ +
+
+'.__('Go back').'!', 'edit-comments.php') ); + if ( !current_user_can( 'edit_comment', $comment->comment_ID ) ) + comment_footer_die( __('You are not allowed to edit comments on this post.') ); + + if ( '' != wp_get_referer() && ! $noredir && false === strpos(wp_get_referer(), 'comment.php') ) + $redir = wp_get_referer(); + elseif ( '' != wp_get_original_referer() && ! $noredir ) + $redir = wp_get_original_referer(); + elseif ( in_array( $action, array( 'approvecomment', 'unapprovecomment' ) ) ) + $redir = admin_url('edit-comments.php?p=' . absint( $comment->comment_post_ID ) ); + else + $redir = admin_url('edit-comments.php'); + + $redir = remove_query_arg( array('spammed', 'unspammed', 'trashed', 'untrashed', 'deleted', 'ids', 'approved', 'unapproved'), $redir ); + + switch ( $action ) { + case 'deletecomment' : + wp_delete_comment( $comment_id ); + $redir = add_query_arg( array('deleted' => '1'), $redir ); + break; + case 'trashcomment' : + wp_trash_comment($comment_id); + $redir = add_query_arg( array('trashed' => '1', 'ids' => $comment_id), $redir ); + break; + case 'untrashcomment' : + wp_untrash_comment($comment_id); + $redir = add_query_arg( array('untrashed' => '1'), $redir ); + break; + case 'spamcomment' : + wp_spam_comment($comment_id); + $redir = add_query_arg( array('spammed' => '1', 'ids' => $comment_id), $redir ); + break; + case 'unspamcomment' : + wp_unspam_comment($comment_id); + $redir = add_query_arg( array('unspammed' => '1'), $redir ); + break; + case 'approvecomment' : + wp_set_comment_status( $comment_id, 'approve' ); + $redir = add_query_arg( array( 'approved' => 1 ), $redir ); + break; + case 'unapprovecomment' : + wp_set_comment_status( $comment_id, 'hold' ); + $redir = add_query_arg( array( 'unapproved' => 1 ), $redir ); + break; + } + + wp_redirect( $redir ); + die; + break; + +case 'editedcomment' : + + $comment_id = absint( $_POST['comment_ID'] ); + $comment_post_id = absint( $_POST['comment_post_ID'] ); + + check_admin_referer( 'update-comment_' . $comment_id ); + + edit_comment(); + + $location = ( empty( $_POST['referredby'] ) ? "edit-comments.php?p=$comment_post_id" : $_POST['referredby'] ) . '#comment-' . $comment_id; + $location = apply_filters( 'comment_edit_redirect', $location, $comment_id ); + wp_redirect( $location ); + + exit(); + break; + +default: + wp_die( __('Unknown action.') ); + break; + +} // end switch + +include('./admin-footer.php'); + +?> diff --git a/src/wp-admin/credits.php b/src/wp-admin/credits.php new file mode 100644 index 0000000..773053a --- /dev/null +++ b/src/wp-admin/credits.php @@ -0,0 +1,176 @@ +' . __('Each name or handle is a link to that person’s profile in the WordPress.org community directory.') . '

' . + '

' . __('You can register your own profile at this link to start contributing.') . '

' . + '

' . __('WordPress always needs more people to report bugs, patch bugs, test betas, work on UI design, translate strings, write documentation, and add questions/answers/suggestions to the Support Forums. Join in!') . '

' . + '

' . __('For more information:') . '

' . + '

' . __('Documentation on Contributing to WordPress') . '

' . + '

' . __('Support Forums') . '

' +); + +add_action( 'admin_head', '_wp_credits_add_css' ); +function _wp_credits_add_css() { ?> + +' . esc_html( $display_name ) . ''; +} + +function _wp_credits_build_object_link( &$data ) { + $data = '' . $data[0] . ''; +} + +include( './admin-header.php' ); +?> +
+ +

+ +' . sprintf( __( 'WordPress is created by a worldwide team of passionate individuals. Get involved in WordPress.' ), + 'http://wordpress.org/about/', + /* translators: Url to the codex documentation on contributing to WordPress used on the credits page */ + __( 'http://codex.wordpress.org/Contributing_to_WordPress' ) ) . '

'; + include( './admin-footer.php' ); + exit; +} + +echo '

' . __( 'WordPress is created by a worldwide team of passionate individuals. We couldn’t possibly list them all, but here some of the most influential people currently involved with the project:' ) . "

\n"; + +$gravatar = is_ssl() ? 'https://secure.gravatar.com/avatar/' : 'http://0.gravatar.com/avatar/'; + +foreach ( $credits['groups'] as $group_slug => $group_data ) { + if ( $group_data['name'] ) { + if ( 'Translators' == $group_data['name'] ) { + // Considered a special slug in the API response. (Also, will never be returned for en_US.) + $title = _x( 'Translators', 'Translate this to be the equivalent of English Translators in your language for the credits page Translators section' ); + } elseif ( isset( $group_data['placeholders'] ) ) { + $title = vsprintf( translate( $group_data['name'] ), $group_data['placeholders'] ); + } else { + $title = translate( $group_data['name'] ); + } + + echo '

' . $title . "

\n"; + } + + if ( ! empty( $group_data['shuffle'] ) ) + shuffle( $group_data['data'] ); // We were going to sort by ability to pronounce "hierarchical," but that wouldn't be fair to Matt. + + switch ( $group_data['type'] ) { + case 'list' : + array_walk( $group_data['data'], '_wp_credits_add_profile_link', $credits['data']['profiles'] ); + echo '

' . wp_sprintf( '%l.', $group_data['data'] ) . "

\n\n"; + break; + case 'libraries' : + array_walk( $group_data['data'], '_wp_credits_build_object_link' ); + echo '

' . wp_sprintf( '%l.', $group_data['data'] ) . "

\n\n"; + break; + default: + $compact = 'compact' == $group_data['type']; + $classes = 'wp-people-group ' . ( $compact ? 'compact' : '' ); + echo '\n"; + break; + } +} + +?> +

Get involved in WordPress.' ), + /* translators: Url to the codex documentation on contributing to WordPress used on the credits page */ + __( 'http://codex.wordpress.org/Contributing_to_WordPress' ) ); ?>

+ +
+ diff --git a/src/wp-admin/css/colors-classic-rtl.css b/src/wp-admin/css/colors-classic-rtl.css new file mode 100644 index 0000000..268fa9e --- /dev/null +++ b/src/wp-admin/css/colors-classic-rtl.css @@ -0,0 +1 @@ +.bar{border-right-color:none;border-left-color:#99d;}.post-com-count{background-image:url(../images/bubble_bg-rtl.gif);}#user_info_arrow{background:transparent url(../images/arrows-vs.png) no-repeat 0 5px;}#user_info:hover #user_info_arrow,#user_info.active #user_info_arrow{background:transparent url(../images/arrows-dark-vs.png) no-repeat 0 5px;}#adminmenushadow,#adminmenuback{background-image:url(../images/menu-shadow-rtl.png);background-position:top left;}#adminmenu li.wp-has-current-submenu.wp-menu-open .wp-menu-toggle,#adminmenu li.wp-has-current-submenu:hover .wp-menu-toggle{background:transparent url(../images/arrows-dark-vs.png) no-repeat 8px 6px;}#adminmenu .wp-has-submenu:hover .wp-menu-toggle,#adminmenu .wp-menu-open .wp-menu-toggle{background:transparent url(../images/arrows-vs.png) no-repeat 8px 6px;}#adminmenu .wp-submenu .wp-submenu-head{border-right-color:none;border-left-color:#d1e5ee;}.folded #adminmenu .wp-submenu-wrap{-moz-box-shadow:-2px 2px 5px rgba(0,0,0,0.4);-webkit-box-shadow:-2px 2px 5px rgba(0,0,0,0.4);box-shadow:-2px 2px 5px rgba(0,0,0,0.4);}#collapse-button div{background-position:0 -108px;}.folded #collapse-button div{background-position:0 -72px;}.meta-box-sortables .postbox:hover .handlediv{background:transparent url(../images/arrows-vs.png) no-repeat 6px 7px;}.tablenav .tablenav-pages a{border-color:#d1e5ee;background:#eee url('../images/menu-bits-rtl-vs.gif?ver=20100610') repeat-x scroll right -379px;}#post-body .misc-pub-section{border-right-color:none;border-left-color:#d1e5ee;}#favorite-toggle{background:transparent url(../images/arrows-vs.png) no-repeat 4px 2px;}#screen-meta a.show-settings,.toggle-arrow{background:transparent url(../images/arrows-vs.png) no-repeat left 3px;}#screen-meta .screen-meta-active a.show-settings{background:transparent url(../images/arrows-vs.png) no-repeat left -33px;}.sidebar-name-arrow{background:transparent url(../images/arrows-vs.png) no-repeat 5px 9px;}.sidebar-name:hover .sidebar-name-arrow{background:transparent url(../images/arrows-dark-vs.png) no-repeat 5px 9px;} \ No newline at end of file diff --git a/src/wp-admin/css/colors-classic-rtl.dev.css b/src/wp-admin/css/colors-classic-rtl.dev.css new file mode 100644 index 0000000..8a56444 --- /dev/null +++ b/src/wp-admin/css/colors-classic-rtl.dev.css @@ -0,0 +1,98 @@ +.bar { + border-right-color: none; + border-left-color: #99d; +} + +.post-com-count { + background-image: url(../images/bubble_bg-rtl.gif); +} + +#user_info_arrow { + background: transparent url(../images/arrows-vs.png) no-repeat 0 5px; +} + +#user_info:hover #user_info_arrow, +#user_info.active #user_info_arrow { + background: transparent url(../images/arrows-dark-vs.png) no-repeat 0 5px; +} + +/* editors */ + +/* menu */ + +#adminmenushadow, +#adminmenuback { + background-image: url(../images/menu-shadow-rtl.png); + background-position: top left; +} + +#adminmenu li.wp-has-current-submenu.wp-menu-open .wp-menu-toggle, +#adminmenu li.wp-has-current-submenu:hover .wp-menu-toggle { + background: transparent url(../images/arrows-dark-vs.png) no-repeat 8px 6px; +} + +#adminmenu .wp-has-submenu:hover .wp-menu-toggle, +#adminmenu .wp-menu-open .wp-menu-toggle { + background: transparent url(../images/arrows-vs.png) no-repeat 8px 6px; +} + + +#adminmenu .wp-submenu .wp-submenu-head { + border-right-color: none; + border-left-color: #d1e5ee; +} + +.folded #adminmenu .wp-submenu-wrap { + -moz-box-shadow: -2px 2px 5px rgba( 0, 0, 0, 0.4 ); + -webkit-box-shadow: -2px 2px 5px rgba( 0, 0, 0, 0.4 ); + box-shadow: -2px 2px 5px rgba( 0, 0, 0, 0.4 ); +} + +/* collapse menu button */ +#collapse-button div { + background-position: 0 -108px; +} +.folded #collapse-button div { + background-position: 0 -72px; +} + +/* edit image */ + +.meta-box-sortables .postbox:hover .handlediv { + background: transparent url(../images/arrows-vs.png) no-repeat 6px 7px; +} + +.tablenav .tablenav-pages a { + border-color: #d1e5ee; + background: #eee url('../images/menu-bits-rtl-vs.gif?ver=20100610') repeat-x scroll right -379px; +} + +#post-body .misc-pub-section { + border-right-color: none; + border-left-color: #d1e5ee; +} + +#favorite-toggle { + background: transparent url(../images/arrows-vs.png) no-repeat 4px 2px; +} + +#screen-meta a.show-settings, +.toggle-arrow { + background: transparent url(../images/arrows-vs.png) no-repeat left 3px; +} + +#screen-meta .screen-meta-active a.show-settings { + background: transparent url(../images/arrows-vs.png) no-repeat left -33px; +} + +.sidebar-name-arrow { + background: transparent url(../images/arrows-vs.png) no-repeat 5px 9px; +} +.sidebar-name:hover .sidebar-name-arrow { + background: transparent url(../images/arrows-dark-vs.png) no-repeat 5px 9px; +} + + +/* custom header & background pages */ + +/* custom header & background pages */ \ No newline at end of file diff --git a/src/wp-admin/css/colors-classic.css b/src/wp-admin/css/colors-classic.css new file mode 100644 index 0000000..d5d4ebe --- /dev/null +++ b/src/wp-admin/css/colors-classic.css @@ -0,0 +1 @@ +html,.wp-dialog{background-color:#fff;}* html input,* html .widget{border-color:#dfdfdf;}textarea,input[type="text"],input[type="password"],input[type="file"],input[type="button"],input[type="submit"],input[type="reset"],select{border-color:#dfdfdf;background-color:#fff;}kbd,code{background:#eaeaea;}input[readonly]{background-color:#eee;}.find-box-search{border-color:#dfdfdf;background-color:#f1f1f1;}.find-box{background-color:#f1f1f1;}.find-box-inside{background-color:#fff;}a.page-numbers:hover{border-color:#999;}body,#wpbody,.form-table .pre{color:#333;}body>#upload-menu{border-bottom-color:#fff;}#postcustomstuff table,#your-profile fieldset,#rightnow,div.dashboard-widget,#dashboard-widgets p.dashboard-widget-links,#replyrow #ed_reply_toolbar input{border-color:#D1E5EE;}#poststuff .inside label.spam,#poststuff .inside label.deleted{color:red;}#poststuff .inside label.waiting{color:orange;}#poststuff .inside label.approved{color:green;}#postcustomstuff table{border-color:#dfdfdf;background-color:#F9F9F9;}#postcustomstuff thead th{background-color:#F1F1F1;}#postcustomstuff table input,#postcustomstuff table textarea{border-color:#dfdfdf;background-color:#fff;}.widefat{border-color:#D1E5EE;background-color:#fff;}div.dashboard-widget-error{background-color:#c43;}div.dashboard-widget-notice{background-color:#cfe1ef;}div.dashboard-widget-submit{border-top-color:#ccc;}div.tabs-panel,.wp-tab-panel,ul.category-tabs li.tabs,ul.add-menu-item-tabs li.tabs,.wp-tab-active{border-color:#dfdfdf;background-color:#fff;}ul.category-tabs li.tabs,ul.add-menu-item-tabs li.tabs,.wp-tab-active{background-color:#fff;}input.disabled,textarea.disabled{background-color:#ccc;}#plugin-information .action-button a,#plugin-information .action-button a:hover,#plugin-information .action-button a:visited{color:#fff;}.widget .widget-top,.postbox h3,.stuffbox h3,.widefat thead tr th,.widefat tfoot tr th,h3.dashboard-widget-title,h3.dashboard-widget-title span,h3.dashboard-widget-title small,.find-box-head,.sidebar-name,#nav-menu-header,#nav-menu-footer,.menu-item-handle,#fullscreen-topbar{background-color:#f5fafd;background-image:-ms-linear-gradient(top,#f7fcfe,#eff8ff);background-image:-moz-linear-gradient(top,#f7fcfe,#eff8ff);background-image:-o-linear-gradient(top,#f7fcfe,#eff8ff);background-image:-webkit-gradient(linear,left top,left bottom,from(#f7fcfe),to(#eff8ff));background-image:-webkit-linear-gradient(top,#f7fcfe,#eff8ff);background-image:linear-gradient(top,#f7fcfe,#eff8ff);}.widget .widget-top,.postbox h3,.stuffbox h3{border-bottom-color:#D1E5EE;text-shadow:#fff 0 1px 0;-moz-box-shadow:0 1px 0 #fff;-webkit-box-shadow:0 1px 0 #fff;box-shadow:0 1px 0 #fff;}.form-table th,.form-wrap label{color:#222;text-shadow:#fff 0 1px 0;}.description,.form-wrap p{color:#666;}strong .post-com-count span{background-color:#21759b;}.sorthelper{background-color:#ccf3fa;}.ac_match,.subsubsub a.current{color:#000;}.wrap h2{color:#174f69;}.wrap .add-new-h2{background:#f1f1f1;}.subtitle{color:#777;}.ac_over{background-color:#f0f0b8;}.ac_results{background-color:#fff;border-color:#808080;}.ac_results li{color:#101010;}.alternate,.alt{background-color:#f7fcfe;}.available-theme a.screenshot{background-color:#f1f1f1;border-color:#ddd;}.bar{background-color:#e8e8e8;border-right-color:#99d;}#media-upload,#media-upload .media-item .slidetoggle{background:#fff;}#media-upload .slidetoggle{border-top-color:#dfdfdf;}div.error,.login #login_error{background-color:#ffebe8;border-color:#c00;}div.error a{color:#c00;}.form-invalid{background-color:#ffebe8!important;}.form-invalid input,.form-invalid select{border-color:#c00!important;}.submit{border-color:#DFDFDF;}.highlight{background-color:#e4f2fd;color:#000;}.howto,.nonessential,#edit-slug-box,.form-input-tip,.subsubsub{color:#666;}.media-item{border-bottom-color:#dfdfdf;}#wpbody-content #media-items .describe{border-top-color:#dfdfdf;}.media-upload-form label.form-help,td.help{color:#9a9a9a;}.post-com-count{background-image:url(../images/bubble_bg.gif);color:#fff;}.post-com-count span{background-color:#bbb;color:#fff;}.post-com-count:hover span{background-color:#d54e21;}.quicktags,.search{background-color:#ccc;color:#000;}.side-info h5{border-bottom-color:#dadada;}.side-info ul{color:#666;}.button,.button-secondary,.submit input,input[type=button],input[type=submit]{border-color:#bbb;color:#464646;}.button:hover,.button-secondary:hover,.submit input:hover,input[type=button]:hover,input[type=submit]:hover{color:#000;border-color:#666;}.button,.submit input,.button-secondary{background:#f2f2f2 url(../images/white-grad.png) repeat-x scroll left top;text-shadow:rgba(255,255,255,1) 0 1px 0;}.button:active,.submit input:active,.button-secondary:active{background:#eee url(../images/white-grad-active.png) repeat-x scroll left top;}input.button-primary,button.button-primary,a.button-primary{border-color:#298cba;font-weight:bold;color:#fff;background:#21759B url(../images/button-grad.png) repeat-x scroll left top;text-shadow:rgba(0,0,0,0.3) 0 -1px 0;}input.button-primary:active,button.button-primary:active,a.button-primary:active{background:#21759b url(../images/button-grad-active.png) repeat-x scroll left top;color:#eaf2fa;}input.button-primary:hover,button.button-primary:hover,a.button-primary:hover,a.button-primary:focus,a.button-primary:active{border-color:#13455b;color:#eaf2fa;}.button-disabled,.button[disabled],.button:disabled,.button-secondary[disabled],.button-secondary:disabled,a.button.disabled{color:#aaa!important;border-color:#ddd!important;}.button-primary-disabled,.button-primary[disabled],.button-primary:disabled{color:#9FD0D5!important;background:#298CBA!important;}a:hover,a:active,a:focus{color:#d54e21;}#wphead #viewsite a:hover,#adminmenu a:hover,#adminmenu ul.wp-submenu a:hover,#the-comment-list .comment a:hover,#rightnow a:hover,#media-upload a.del-link:hover,div.dashboard-widget-submit input:hover,.subsubsub a:hover,.subsubsub a.current:hover,.ui-tabs-nav a:hover,.plugins .inactive a:hover,#all-plugins-table .plugins .inactive a:hover,#search-plugins-table .plugins .inactive a:hover{color:#d54e21;}#the-comment-list .comment-item,#dashboard-widgets #dashboard_quick_press form p.submit{border-color:#dfdfdf;}#side-sortables .category-tabs .tabs a,#side-sortables .add-menu-item-tabs .tabs a,.wp-tab-bar .wp-tab-active a{color:#333;}#rightnow .rbutton{background-color:#ebebeb;color:#264761;}.submitbox .submit{background-color:#464646;color:#ccc;}.plugins a.delete:hover,#all-plugins-table .plugins a.delete:hover,#search-plugins-table .plugins a.delete:hover,.submitbox .submitdelete{color:#f00;border-bottom-color:#f00;}.submitbox .submitdelete:hover,#media-items a.delete:hover{color:#fff;background-color:#f00;border-bottom-color:#f00;}#normal-sortables .submitbox .submitdelete:hover{color:#000;background-color:#f00;border-bottom-color:#f00;}.tablenav .dots{border-color:transparent;}.tablenav .next,.tablenav .prev{border-color:transparent;color:#21759b;}.tablenav .next:hover,.tablenav .prev:hover{border-color:transparent;color:#d54e21;}div.updated,.login .message{background-color:#ffffe0;border-color:#e6db55;}.update-message{color:#000;}a.page-numbers{border-bottom-color:#B8D3E2;}.commentlist li{border-bottom-color:#ccc;}.widefat td,.widefat th{border-top-color:#fff;border-bottom-color:#D0DFE9;}.widefat th{text-shadow:rgba(255,255,255,0.8) 0 1px 0;}.widefat td{color:#555;}.widefat p,.widefat ol,.widefat ul{color:#333;}.widefat thead tr th,.widefat tfoot tr th,h3.dashboard-widget-title,h3.dashboard-widget-title span,h3.dashboard-widget-title small,.find-box-head{color:#333;}th.sortable a:hover,th.sortable a:active,th.sortable a:focus{color:#333;}h3.dashboard-widget-title small a{color:#d7d7d7;}h3.dashboard-widget-title small a:hover{color:#fff;}a,#adminmenu a,#poststuff #edButtonPreview,#poststuff #edButtonHTML,#the-comment-list p.comment-author strong a,#media-upload a.del-link,#media-items a.delete,.plugins a.delete,.ui-tabs-nav a{color:#21759b;}#adminmenu .awaiting-mod,#adminmenu .update-plugins,#sidemenu a .update-plugins,#rightnow .reallynow{background-color:#464646;color:#fff;-moz-box-shadow:rgba(255,255,255,0.5) 0 1px 0;-khtml-box-shadow:rgba(255,255,255,0.5) 0 1px 0;-webkit-box-shadow:rgba(255,255,255,0.5) 0 1px 0;box-shadow:rgba(255,255,255,0.5) 0 1px 0;}#plugin-information .action-button{background-color:#d54e21;color:#fff;}#adminmenu li.current a .awaiting-mod,#adminmenu li a.wp-has-current-submenu .update-plugins{background-color:#464646;color:#fff;-moz-box-shadow:rgba(255,255,255,0.5) 0 1px 0;-khtml-box-shadow:rgba(255,255,255,0.5) 0 1px 0;-webkit-box-shadow:rgba(255,255,255,0.5) 0 1px 0;box-shadow:rgba(255,255,255,0.5) 0 1px 0;}div#media-upload-header,div#plugin-information-header{background-color:#f9f9f9;border-bottom-color:#dfdfdf;}#currenttheme img{border-color:#666;}#dashboard_secondary div.dashboard-widget-content ul li a{background-color:#f9f9f9;}input.readonly,textarea.readonly{background-color:#ddd;}#ed_toolbar input,#ed_reply_toolbar input{background:#fff url("../images/fade-butt.png") repeat-x 0 -2px;}#editable-post-name{background-color:#fffbcc;}#edit-slug-box strong,.tablenav .displaying-num,#submitted-on,.submitted-on{color:#777;}.login #nav a,.login #backtoblog a{color:#21759b!important;}.login #nav a:hover,.login #backtoblog a:hover{color:#d54e21!important;}#footer{color:#777;border-color:#b0c8d7;}#media-items,.imgedit-group{border-color:#dfdfdf;}.checkbox,.side-info,.plugins tr,#your-profile #rich_editing{background-color:#fcfcfc;}.plugins .inactive,.plugins .inactive th,.plugins .inactive td,tr.inactive+tr.plugin-update-tr .plugin-update{background-color:#efede7;}.plugin-update-tr .update-message{background-color:#fffbe4;border-color:#dfdfdf;}.plugins .active,.plugins .active th,.plugins .active td{color:#000;}.plugins .inactive a{color:#579;}#the-comment-list tr.undo,#the-comment-list div.undo{background-color:#f4f4f4;}#the-comment-list .unapproved{background-color:#ffffe0;}#the-comment-list .approve a{color:#006505;}#the-comment-list .unapprove a{color:#d98500;}table.widefat span.delete a,table.widefat span.trash a,table.widefat span.spam a,#dashboard_recent_comments .delete a,#dashboard_recent_comments .trash a,#dashboard_recent_comments .spam a{color:#bc0b0b;}.widget,#widget-list .widget-top,.postbox,#titlediv,#poststuff .postarea,.stuffbox{border-color:#d1e5ee;-moz-box-shadow:inset 0 1px 0 #fff;-webkit-box-shadow:inset 0 1px 0 #fff;box-shadow:inset 0 1px 0 #fff;-moz-border-radius:3px;-khtml-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;}.widget,#widget-list .widget-top,.postbox,.menu-item-settings{background-color:#f7fcfe;}.postbox h3{color:#174f69;}.widget .widget-top{color:#174f69;}.sidebar-name:hover h3,.postbox h3:hover{color:#000;}.curtime #timestamp{background-image:url(../images/date-button.gif);}#quicktags #ed_link{color:#00f;}#rightnow .youhave{background-color:#f0f6fb;}#rightnow a{color:#448abd;}.tagchecklist span a,#bulk-titles div a{background:url(../images/xit.gif) no-repeat;}.tagchecklist span a:hover,#bulk-titles div a:hover{background:url(../images/xit.gif) no-repeat -10px 0;}#update-nag,.update-nag{background-color:#fffbcc;border-color:#e6db55;color:#555;}.login #backtoblog a{color:#464646;}#wphead{border-bottom:#d0dfe9 1px solid;}#wphead h1 a{color:#174f69;}#user_info{color:#777;}#user_info:hover,#user_info.active{color:#185069;}#user_info.active{background-color:#f7fcfe;background-image:-ms-linear-gradient(bottom,#f7fcfe,#f9f9f9);background-image:-moz-linear-gradient(bottom,#f7fcfe,#f9f9f9);background-image:-o-linear-gradient(bottom,#f7fcfe,#f9f9f9);background-image:-webkit-gradient(linear,left bottom,left top,from(#f7fcfe),to(#f9f9f9));background-image:-webkit-linear-gradient(bottom,#f7fcfe,#f9f9f9);background-image:linear-gradient(bottom,#f7fcfe,#f9f9f9);border-color:#d0dfe9 #d0dfe9 #d0dfe9;}#user_info_arrow{background:transparent url(../images/arrows-vs.png) no-repeat 6px 5px;}#user_info:hover #user_info_arrow,#user_info.active #user_info_arrow{background:transparent url(../images/arrows-dark-vs.png) no-repeat 6px 5px;}#user_info_links{-moz-box-shadow:0 3px 2px -2px rgba(0,0,0,0.2);-webkit-box-shadow:0 3px 2px -2px rgba(0,0,0,0.2);box-shadow:0 3px 2px -2px rgba(0,0,0,0.2);}#user_info_links ul{background:#f7fcfe;border-color:#d0dfe9 #d0dfe9 #d0dfe9;-moz-box-shadow:inset 0 1px 0 #f9f9f9;-webkit-box-shadow:inset 0 1px 0 #f9f9f9;box-shadow:inset 0 1px 0 #f9f9f9;}#user_info_links li:hover{background-color:#ECF8FE;}#user_info_links li:hover a,#user_info_links li a:hover{text-decoration:none;}#user_info a:link,#user_info a:visited,#footer a:link,#footer a:visited{text-decoration:none;}#footer a:hover{color:#000;text-decoration:underline;}div#media-upload-error,.file-error,abbr.required,.widget-control-remove:hover,table.widefat .delete a:hover,table.widefat .trash a:hover,table.widefat .spam a:hover,#dashboard_recent_comments .delete a:hover,#dashboard_recent_comments .trash a:hover #dashboard_recent_comments .spam a:hover{color:#f00;}#pass-strength-result{background-color:#eee;border-color:#ddd!important;}#pass-strength-result.bad{background-color:#ffb78c;border-color:#ff853c!important;}#pass-strength-result.good{background-color:#ffec8b;border-color:#fc0!important;}#pass-strength-result.short{background-color:#ffa0a0;border-color:#f04040!important;}#pass-strength-result.strong{background-color:#c3ff88;border-color:#8dff1c!important;}#quicktags{border-color:#cfdfe9;background-color:#cfdfe9;background-image:url("../images/ed-bg-vs.gif?ver=20101102");}#ed_toolbar input{border-color:#C3C3C3;}#ed_toolbar input:hover{border-color:#aaa;background:#ddd;}#poststuff .wp_themeSkin .mceStatusbar{border-color:#d0dfe9;}#poststuff .wp_themeSkin .mceStatusbar *{color:#555;}#poststuff #edButtonPreview,#poststuff #edButtonHTML{background-color:#f7fcfe;border-color:#d0dfe9 #d0dfe9 #d0dfe9;color:#999;}#poststuff #editor-toolbar .active{border-color:#d0dfe9 #d0dfe9 #eff8ff;background-color:#eff8ff;color:#333;}#post-status-info{background-color:#eff8ff;}.wp_themeSkin *,.wp_themeSkin a:hover,.wp_themeSkin a:link,.wp_themeSkin a:visited,.wp_themeSkin a:active{color:#000;}.wp_themeSkin table.mceLayout{border-color:#bed1dd #bed1dd #d0dfe9;}#editorcontainer #content,#editorcontainer .wp_themeSkin .mceIframeContainer{-moz-box-shadow:inset 1px 1px 2px rgba(0,0,0,0.1);-webkit-box-shadow:inset 1px 1px 2px rgba(0,0,0,0.1);box-shadow:inset 1px 1px 2px rgba(0,0,0,0.1);}.wp_themeSkin iframe{background:transparent;}.wp_themeSkin .mceStatusbar{color:#000;background-color:#f5f5f5;}.wp_themeSkin .mceButton{border-color:#B0C8D7;background-color:#cfdfe9;background-image:-ms-linear-gradient(bottom,#cfdfe9,#fff);background-image:-moz-linear-gradient(bottom,#cfdfe9,#fff);background-image:-o-linear-gradient(bottom,#cfdfe9,#fff);background-image:-webkit-gradient(linear,left bottom,left top,from(#cfdfe9),to(#fff));background-image:-webkit-linear-gradient(bottom,#cfdfe9,#fff)!important;background-image:linear-gradient(bottom,#cfdfe9,#fff);}.wp_themeSkin a.mceButtonEnabled:hover{border-color:#5589AA!important;background-color:#c9c9c9;background-image:-ms-linear-gradient(bottom,#bdccd5,#fff);background-image:-moz-linear-gradient(bottom,#bdccd5,#fff));background-image:-o-linear-gradient(bottom,#bdccd5,#fff));background-image:-webkit-gradient(linear,left bottom,left top,from(#bdccd5),to(#fff));background-image:-webkit-linear-gradient(bottom,#bdccd5,#fff)!important;background-image:linear-gradient(bottom,#bdccd5,#fff);}.wp_themeSkin a.mceButton:active,.wp_themeSkin a.mceButtonEnabled:active,.wp_themeSkin a.mceButtonSelected:active,.wp_themeSkin a.mceButtonActive,.wp_themeSkin a.mceButtonActive:active,.wp_themeSkin a.mceButtonActive:hover{background:#B0C8D7!important;background-image:-ms-linear-gradient(bottom,#fff,#cfdfe9);background-image:-moz-linear-gradient(bottom,#fff,#cfdfe9));background-image:-o-linear-gradient(bottom,#fff,#cfdfe9));background-image:-webkit-gradient(linear,left bottom,left top,from(#fff),to(#cfdfe9));background-image:-webkit-linear-gradient(bottom,#fff,#cfdfe9)!important;background-image:linear-gradient(bottom,#fff,#cfdfe9);border-color:#5589AA!important;}.wp_themeSkin .mceButtonDisabled{border-color:#B0C8D7!important;}.wp_themeSkin .mceListBox .mceText,.wp_themeSkin .mceListBox .mceOpen{border-color:#B0C8D7;background-color:#cfdfe9;background-image:-ms-linear-gradient(bottom,#cfdfe9,#fff);background-image:-moz-linear-gradient(bottom,#cfdfe9,#fff);background-image:-o-linear-gradient(bottom,#cfdfe9,#fff);background-image:-webkit-gradient(linear,left bottom,left top,from(#cfdfe9),to(#fff));background-image:-webkit-linear-gradient(bottom,#cfdfe9,#fff)!important;background-image:linear-gradient(bottom,#cfdfe9,#fff);}.wp_themeSkin .mceListBox .mceOpen{border-left:0!important;}.wp_themeSkin table.mceListBoxEnabled:hover .mceOpen,.wp_themeSkin .mceListBoxHover .mceOpen,.wp_themeSkin .mceListBoxHover:active .mceOpen,.wp_themeSkin .mceListBoxSelected .mceOpen,.wp_themeSkin .mceListBoxSelected .mceText,.wp_themeSkin table.mceListBoxEnabled:active .mceText{background:#B0C8D7;border-color:#5589AA!important;}.wp_themeSkin table.mceListBoxEnabled:hover .mceText,.wp_themeSkin .mceListBoxHover .mceText,.wp_themeSkin table.mceListBoxEnabled:hover .mceOpen,.wp_themeSkin .mceListBoxHover .mceOpen{border-color:#5589AA!important;background-color:#c9c9c9;background-image:-ms-linear-gradient(bottom,#cfdfe9,#fff);background-image:-moz-linear-gradient(bottom,#cfdfe9,#fff);background-image:-o-linear-gradient(bottom,#cfdfe9,#fff);background-image:-webkit-gradient(linear,left bottom,left top,from(#cfdfe9),to(#fff));background-image:-webkit-linear-gradient(bottom,#cfdfe9,#fff)!important;background-image:linear-gradient(bottom,#cfdfe9,#fff);}.wp_themeSkin select.mceListBox{border-color:#B2B2B2;background-color:#fff;}.wp_themeSkin .mceSplitButton a.mceAction,.wp_themeSkin .mceSplitButton a.mceOpen{border-color:#B0C8D7;}.wp_themeSkin .mceSplitButton a.mceOpen:hover,.wp_themeSkin .mceSplitButtonSelected a.mceOpen,.wp_themeSkin table.mceSplitButtonEnabled:hover a.mceAction,.wp_themeSkin .mceSplitButton a.mceAction:hover{border-color:#5589AA!important;}.wp_themeSkin table.mceSplitButton td{background-color:#cfdfe9;background-image:-ms-linear-gradient(bottom,#cfdfe9,#fff);background-image:-moz-linear-gradient(bottom,#cfdfe9,#fff);background-image:-o-linear-gradient(bottom,#cfdfe9,#fff);background-image:-webkit-gradient(linear,left bottom,left top,from(#cfdfe9),to(#fff));background-image:-webkit-linear-gradient(bottom,#cfdfe9,#fff)!important;background-image:linear-gradient(bottom,#cfdfe9,#fff);}.wp_themeSkin table.mceSplitButton:hover td{background-image:-ms-linear-gradient(bottom,#cfdfe9,#fff);background-image:-moz-linear-gradient(bottom,#cfdfe9,#fff);background-image:-o-linear-gradient(bottom,#cfdfe9,#fff);background-image:-webkit-gradient(linear,left bottom,left top,from(#cfdfe9),to(#fff));background-image:-webkit-linear-gradient(bottom,#cfdfe9,#fff)!important;background-image:linear-gradient(bottom,#cfdfe9,#fff);}.wp_themeSkin .mceSplitButtonActive{background-color:#B0C8D7;}.wp_themeSkin div.mceColorSplitMenu table{background-color:#ebebeb;border-color:#B2B2B2;}.wp_themeSkin .mceColorSplitMenu a{border-color:#B2B2B2;}.wp_themeSkin .mceColorSplitMenu a.mceMoreColors{border-color:#fff;}.wp_themeSkin .mceColorSplitMenu a.mceMoreColors:hover{border-color:#0A246A;background-color:#B6BDD2;}.wp_themeSkin a.mceMoreColors:hover{border-color:#0A246A;}.wp_themeSkin .mceMenu{border-color:#ddd;}.wp_themeSkin .mceMenu table{background-color:#ebeaeb;}.wp_themeSkin .mceMenu .mceText{color:#000;}.wp_themeSkin .mceMenu .mceMenuItemEnabled a:hover,.wp_themeSkin .mceMenu .mceMenuItemActive{background-color:#f5f5f5;}.wp_themeSkin td.mceMenuItemSeparator{background-color:#aaa;}.wp_themeSkin .mceMenuItemTitle a{background-color:#ccc;border-bottom-color:#aaa;}.wp_themeSkin .mceMenuItemTitle span.mceText{color:#000;}.wp_themeSkin .mceMenuItemDisabled .mceText{color:#888;}.wp_themeSkin tr.mceFirst td.mceToolbar{background:#cfdfe9 url("../images/ed-bg-vs.gif?ver=20101102") repeat-x scroll left top;border-color:#cfdfe9;}.wp-admin #mceModalBlocker{background:#000;}.wp-admin .clearlooks2 .mceFocus .mceTop .mceLeft{background:#444;border-left:1px solid #999;border-top:1px solid #999;-moz-border-radius:3px 0 0 0;-webkit-border-top-left-radius:3px;-khtml-border-top-left-radius:3px;border-top-left-radius:3px;}.wp-admin .clearlooks2 .mceFocus .mceTop .mceRight{background:#444;border-right:1px solid #999;border-top:1px solid #999;border-top-right-radius:3px;-khtml-border-top-right-radius:3px;-webkit-border-top-right-radius:3px;-moz-border-radius:0 3px 0 0;}.wp-admin .clearlooks2 .mceMiddle .mceLeft{background:#f1f1f1;border-left:1px solid #999;}.wp-admin .clearlooks2 .mceMiddle .mceRight{background:#f1f1f1;border-right:1px solid #999;}.wp-admin .clearlooks2 .mceBottom{background:#f1f1f1;border-bottom:1px solid #999;}.wp-admin .clearlooks2 .mceBottom .mceLeft{background:#f1f1f1;border-bottom:1px solid #999;border-left:1px solid #999;}.wp-admin .clearlooks2 .mceBottom .mceCenter{background:#f1f1f1;border-bottom:1px solid #999;}.wp-admin .clearlooks2 .mceBottom .mceRight{background:#f1f1f1;border-bottom:1px solid #999;border-right:1px solid #999;}.wp-admin .clearlooks2 .mceFocus .mceTop span{color:#e5e5e5;}#titlediv #title{border-color:#bdccd5;}#editorcontainer{border-color:#bdccd5 #bdccd5 #d0dfe9;}#post-status-info{border-color:#d0dfe9 #bdccd5 #bdccd5;}.editwidget .widget-inside{border-color:#d0dfe9;}#titlediv #title{background-color:#fff;}#tTips p#tTips_inside{background-color:#ddd;color:#333;}#timestampdiv input,#namediv input,#poststuff .inside .the-tagcloud{border-color:#ddd;}#adminmenuback,#adminmenuwrap{background-color:#EFF8FF;border-color:#D1E5EE;}#adminmenushadow,#adminmenuback{background-image:url(../images/menu-shadow.png);background-position:top right;background-repeat:repeat-y;}#adminmenu li.wp-menu-separator{background:#D1E5EE;border-color:#bed1dd;}#adminmenu div.separator{border-color:#D1E5EE;}#adminmenu li.wp-has-current-submenu.wp-menu-open .wp-menu-toggle,#adminmenu li.wp-has-current-submenu:hover .wp-menu-toggle{background:transparent url(../images/arrows-dark-vs.png) no-repeat -1px 6px;}#adminmenu .wp-has-submenu:hover .wp-menu-toggle,#adminmenu .wp-menu-open .wp-menu-toggle{background:transparent url(../images/arrows-vs.png) no-repeat -2px 6px;}#adminmenu a.menu-top,.folded #adminmenu li.menu-top,#adminmenu .wp-submenu .wp-submenu-head{border-top-color:#fff;border-bottom-color:#d1e5ee;}#adminmenu li.wp-menu-open{border-color:#d1e5ee;}#adminmenu li.wp-has-current-submenu a.wp-has-current-submenu,#adminmenu li.current a.menu-top,.folded #adminmenu li.wp-has-current-submenu,.folded #adminmenu li.current.menu-top,#adminmenu .wp-menu-arrow,#adminmenu .wp-has-current-submenu .wp-submenu .wp-submenu-head{background-color:#5589AA;background-image:-ms-linear-gradient(bottom,#5589AA,#5A8FAD);background-image:-moz-linear-gradient(bottom,#5589AA,#5A8FAD);background-image:-o-linear-gradient(bottom,#5589AA,#5A8FAD);background-image:-webkit-gradient(linear,left bottom,left top,from(#5589AA),to(#5A8FAD));background-image:-webkit-linear-gradient(bottom,#5589AA,#5A8FAD);background-image:linear-gradient(bottom,#5589AA,#5A8FAD);}#adminmenu li.wp-has-current-submenu a.wp-has-current-submenu,#adminmenu li.current a.menu-top,#adminmenu .wp-has-current-submenu .wp-submenu .wp-submenu-head{text-shadow:0 -1px 0 #333;color:#fff;border-top-color:#5A8FAD;border-bottom-color:#5589AA;}.folded #adminmenu li.wp-has-current-submenu,.folded #adminmenu li.current.menu-top{border-top-color:#5A8FAD;border-bottom-color:#5589AA;}#adminmenu .wp-submenu a:hover{background-color:#EAF2FA!important;color:#333!important;}#adminmenu .wp-submenu li.current,#adminmenu .wp-submenu li.current a,#adminmenu .wp-submenu li.current a:hover{color:#333;}#adminmenu .wp-submenu ul{background-color:#fff;}.folded #adminmenu .wp-submenu-wrap,.folded #adminmenu .wp-submenu ul{border-color:#d0dfe9;}.folded #adminmenu .wp-submenu-wrap{-moz-box-shadow:2px 2px 5px rgba(0,0,0,0.4);-webkit-box-shadow:2px 2px 5px rgba(0,0,0,0.4);box-shadow:2px 2px 5px rgba(0,0,0,0.4);}#adminmenu .wp-submenu .wp-submenu-head{border-right-color:#d0dfe9;background-color:#EFF8FF;}#adminmenu div.wp-submenu{background-color:transparent;}#collapse-menu{color:#A0C3D5;}#collapse-menu:hover{color:#5A8FAD;}#collapse-button{border-color:#d0dfe9;background-color:#eff8ff;background-image:-ms-linear-gradient(bottom,#eff8ff,#fff);background-image:-moz-linear-gradient(bottom,#eff8ff,#fff);background-image:-o-linear-gradient(bottom,#eff8ff,#fff);background-image:-webkit-gradient(linear,left bottom,left top,from(#eff8ff),to(#fff));background-image:-webkit-linear-gradient(bottom,#eff8ff,#fff);background-image:linear-gradient(bottom,#eff8ff,#fff);}#collapse-menu:hover #collapse-button{border-color:#A0C3D5;}#collapse-button div{background:transparent url(../images/arrows-vs.png) no-repeat 0 -72px;}.folded #collapse-button div{background-position:0 -108px;}#adminmenu .menu-icon-dashboard div.wp-menu-image{background:transparent url('../images/menu-vs.png?ver=20100531') no-repeat scroll -60px -33px;}#adminmenu .menu-icon-dashboard:hover div.wp-menu-image,#adminmenu .menu-icon-dashboard.wp-has-current-submenu div.wp-menu-image,#adminmenu .menu-icon-dashboard.current div.wp-menu-image{background:transparent url('../images/menu-vs.png?ver=20100531') no-repeat scroll -60px -1px;}#adminmenu .menu-icon-post div.wp-menu-image{background:transparent url('../images/menu-vs.png?ver=20100531') no-repeat scroll -271px -33px;}#adminmenu .menu-icon-post:hover div.wp-menu-image,#adminmenu .menu-icon-post.wp-has-current-submenu div.wp-menu-image{background:transparent url('../images/menu-vs.png?ver=20100531') no-repeat scroll -271px -1px;}#adminmenu .menu-icon-media div.wp-menu-image{background:transparent url('../images/menu-vs.png?ver=20100531') no-repeat scroll -120px -33px;}#adminmenu .menu-icon-media:hover div.wp-menu-image,#adminmenu .menu-icon-media.wp-has-current-submenu div.wp-menu-image{background:transparent url('../images/menu-vs.png?ver=20100531') no-repeat scroll -120px -1px;}#adminmenu .menu-icon-links div.wp-menu-image{background:transparent url('../images/menu-vs.png?ver=20100531') no-repeat scroll -90px -33px;}#adminmenu .menu-icon-links:hover div.wp-menu-image,#adminmenu .menu-icon-links.wp-has-current-submenu div.wp-menu-image{background:transparent url('../images/menu-vs.png?ver=20100531') no-repeat scroll -90px -1px;}#adminmenu .menu-icon-page div.wp-menu-image{background:transparent url('../images/menu-vs.png?ver=20100531') no-repeat scroll -150px -33px;}#adminmenu .menu-icon-page:hover div.wp-menu-image,#adminmenu .menu-icon-page.wp-has-current-submenu div.wp-menu-image{background:transparent url('../images/menu-vs.png?ver=20100531') no-repeat scroll -150px -1px;}#adminmenu .menu-icon-comments div.wp-menu-image{background:transparent url('../images/menu-vs.png?ver=20100531') no-repeat scroll -30px -33px;}#adminmenu .menu-icon-comments:hover div.wp-menu-image,#adminmenu .menu-icon-comments.wp-has-current-submenu div.wp-menu-image,#adminmenu .menu-icon-comments.current div.wp-menu-image{background:transparent url('../images/menu-vs.png?ver=20100531') no-repeat scroll -30px -1px;}#adminmenu .menu-icon-appearance div.wp-menu-image{background:transparent url('../images/menu-vs.png?ver=20100531') no-repeat scroll 0 -33px;}#adminmenu .menu-icon-appearance:hover div.wp-menu-image,#adminmenu .menu-icon-appearance.wp-has-current-submenu div.wp-menu-image{background:transparent url('../images/menu-vs.png?ver=20100531') no-repeat scroll 0 -1px;}#adminmenu .menu-icon-plugins div.wp-menu-image{background:transparent url('../images/menu-vs.png?ver=20100531') no-repeat scroll -180px -33px;}#adminmenu .menu-icon-plugins:hover div.wp-menu-image,#adminmenu .menu-icon-plugins.wp-has-current-submenu div.wp-menu-image{background:transparent url('../images/menu-vs.png?ver=20100531') no-repeat scroll -180px -1px;}#adminmenu .menu-icon-users div.wp-menu-image{background:transparent url('../images/menu-vs.png?ver=20100531') no-repeat scroll -300px -33px;}#adminmenu .menu-icon-users:hover div.wp-menu-image,#adminmenu .menu-icon-users.wp-has-current-submenu div.wp-menu-image,#adminmenu .menu-icon-users.current div.wp-menu-image{background:transparent url('../images/menu-vs.png?ver=20100531') no-repeat scroll -300px -1px;}#adminmenu .menu-icon-tools div.wp-menu-image{background:transparent url('../images/menu-vs.png?ver=20100531') no-repeat scroll -210px -33px;}#adminmenu .menu-icon-tools:hover div.wp-menu-image,#adminmenu .menu-icon-tools.wp-has-current-submenu div.wp-menu-image,#adminmenu .menu-icon-tools.current div.wp-menu-image{background:transparent url('../images/menu-vs.png?ver=20100531') no-repeat scroll -210px -1px;}#icon-options-general,#adminmenu .menu-icon-settings div.wp-menu-image{background:transparent url('../images/menu-vs.png?ver=20100531') no-repeat scroll -240px -33px;}#adminmenu .menu-icon-settings:hover div.wp-menu-image,#adminmenu .menu-icon-settings.wp-has-current-submenu div.wp-menu-image{background:transparent url('../images/menu-vs.png?ver=20100531') no-repeat scroll -240px -1px;}#adminmenu .menu-icon-site div.wp-menu-image{background:transparent url('../images/menu-vs.png?ver=20100531') no-repeat scroll -360px -33px;}#adminmenu .menu-icon-site:hover div.wp-menu-image,#adminmenu .menu-icon-site.wp-has-current-submenu div.wp-menu-image{background:transparent url('../images/menu-vs.png?ver=20100531') no-repeat scroll -360px -1px;}#icon-edit,#icon-post{background:transparent url(../images/icons32-vs.png?ver=20100531) no-repeat -552px -5px;}#icon-index{background:transparent url(../images/icons32-vs.png?ver=20100531) no-repeat -137px -5px;}#icon-upload{background:transparent url(../images/icons32-vs.png?ver=20100531) no-repeat -251px -5px;}#icon-link-manager,#icon-link,#icon-link-category{background:transparent url(../images/icons32-vs.png?ver=20100531) no-repeat -190px -5px;}#icon-edit-pages,#icon-page{background:transparent url(../images/icons32-vs.png?ver=20100531) no-repeat -312px -5px;}#icon-edit-comments{background:transparent url(../images/icons32-vs.png?ver=20100531) no-repeat -72px -5px;}#icon-themes{background:transparent url(../images/icons32-vs.png?ver=20100531) no-repeat -11px -5px;}#icon-plugins{background:transparent url(../images/icons32-vs.png?ver=20100531) no-repeat -370px -5px;}#icon-users,#icon-profile,#icon-user-edit{background:transparent url(../images/icons32-vs.png?ver=20100531) no-repeat -600px -5px;}#icon-tools,#icon-admin{background:transparent url(../images/icons32-vs.png?ver=20100531) no-repeat -432px -5px;}#icon-options-general{background:transparent url(../images/icons32-vs.png?ver=20100531) no-repeat -492px -5px;}#icon-ms-admin{background:transparent url(../images/icons32-vs.png?ver=20100531) no-repeat -659px -5px;}table.diff .diff-deletedline{background-color:#fdd;}table.diff .diff-deletedline del{background-color:#f99;}table.diff .diff-addedline{background-color:#dfd;}table.diff .diff-addedline ins{background-color:#9f9;}#att-info{background-color:#E4F2FD;}#sidemenu a{background-color:#f9f9f9;border-color:#f9f9f9;border-bottom-color:#dfdfdf;}#sidemenu a.current{background-color:#fff;border-color:#dfdfdf #dfdfdf #fff;color:#D54E21;}#screen-options-wrap,#contextual-help-wrap{background-color:#f7fcfe;border-color:#D1e5ee;}#screen-options-link-wrap,#contextual-help-link-wrap{background-color:#eff8ff;border-right:1px solid #D1E5EE;border-left:1px solid #D1E5EE;border-bottom:1px solid #D1E5EE;background-image:-ms-linear-gradient(bottom,#eff8ff,#fff);background-image:-moz-linear-gradient(bottom,#eff8ff,#fff);background-image:-o-linear-gradient(bottom,#eff8ff,#fff);background-image:-webkit-gradient(linear,left bottom,left top,from(#eff8ff),to(#fff));background-image:-webkit-linear-gradient(bottom,#eff8ff,#fff);background-image:linear-gradient(bottom,#eff8ff,#fff);}#screen-meta-links a.show-settings{color:#606060;}#screen-meta-links a.show-settings:hover{color:#000;}#replysubmit{background-color:#f1f1f1;border-top-color:#ddd;}#replyerror{border-color:#ddd;background-color:#f9f9f9;}#edithead,#replyhead{background-color:#f1f1f1;}#ed_reply_toolbar{background-color:#e9e9e9;}.vim-current,.vim-current th,.vim-current td{background-color:#E4F2FD!important;}.star-average,.star.star-rating{background-color:#fc0;}div.star.select:hover{background-color:#d00;}div.star img{border-left:1px solid #fff;border-right:1px solid #fff;}#plugin-information .fyi ul{background-color:#eaf3fa;}#plugin-information .fyi h2.mainheader{background-color:#cee1ef;}#plugin-information pre,#plugin-information code{background-color:#ededff;}#plugin-information pre{border:1px solid #ccc;}.inline-edit-row fieldset input[type="text"],.inline-edit-row fieldset textarea,#bulk-titles,#replyrow input{border-color:#ddd;}.inline-editor div.title{background-color:#EAF3FA;}.inline-editor ul.cat-checklist{background-color:#fff;border-color:#ddd;}.inline-editor .categories .catshow,.inline-editor .categories .cathide{color:#21759b;}.inline-editor .quick-edit-save{background-color:#f1f1f1;}#replyrow #ed_reply_toolbar input:hover{border-color:#aaa;background:#ddd;}fieldset.inline-edit-col-right .inline-edit-col{border-color:#dfdfdf;}.attention{color:#D54E21;}.meta-box-sortables .postbox:hover .handlediv{background:transparent url(../images/arrows-vs.png) no-repeat 6px 7px;}.tablenav .tablenav-pages{color:#555;}.tablenav .tablenav-pages a{border-color:#d1e5ee;background:#eee url('../images/menu-bits-vs.gif?ver=20101102') repeat-x scroll left -379px;}.tablenav .tablenav-pages a:hover,.tablenav .tablenav-pages a:focus{color:#d54e21;}.tablenav .tablenav-pages a.disabled,.tablenav .tablenav-pages a.disabled:hover,.tablenav .tablenav-pages a.disabled:focus{color:#aaa;}.tablenav .tablenav-pages .current{background:#dfdfdf;border-color:#d3d3d3;}#availablethemes,#availablethemes td{border-color:#ddd;}#current-theme img{border-color:#999;}#TB_window #TB_title a.tb-theme-preview-link,#TB_window #TB_title a.tb-theme-preview-link:visited{color:#999;}#TB_window #TB_title a.tb-theme-preview-link:hover,#TB_window #TB_title a.tb-theme-preview-link:focus{color:#ccc;}.misc-pub-section{border-top-color:#fff;border-bottom-color:#eee;}#minor-publishing{border-bottom-color:#ddd;}#post-body .misc-pub-section{border-right-color:#eee;}.post-com-count span{background-color:#bbb;}.form-table .color-palette td{border-color:#fff;}.sortable-placeholder{border-color:#bbb;background-color:#f5f5f5;}#post-body ul.category-tabs li.tabs a,#post-body ul.add-menu-item-tabs li.tabs a,body.press-this ul.category-tabs li.tabs a{color:#333;}#wp_editimgbtn,#wp_delimgbtn,#wp_editgallery,#wp_delgallery{border-color:#999;background-color:#eee;}#wp_editimgbtn:hover,#wp_delimgbtn:hover,#wp_editgallery:hover,#wp_delgallery:hover{border-color:#555;background-color:#ccc;}#favorite-first{border-color:#c0c0c0;background:#f1f1f1;background:-moz-linear-gradient(bottom,#e7e7e7,#fff);background:-webkit-gradient(linear,left bottom,left top,from(#e7e7e7),to(#fff));}#favorite-inside{border-color:#c0c0c0;background-color:#fff;}#favorite-toggle{background:transparent url(../images/fav-arrow.gif?ver=20100531) no-repeat 0 -4px;border-color:#d0dfe9;-moz-box-shadow:inset 1px 0 0 #fff;-webkit-box-shadow:inset 1px 0 0 #fff;box-shadow:inset 1px 0 0 #fff;}#favorite-actions a{color:#464646;}#favorite-actions a:hover{color:#000;}#favorite-inside a:hover{text-decoration:underline;}#screen-meta a.show-settings,.toggle-arrow{background:transparent url(../images/arrows-vs.png) no-repeat right 3px;}#screen-meta .screen-meta-active a.show-settings{background:transparent url(../images/arrows-vs.png) no-repeat right -33px;}.view-switch #view-switch-list{background:transparent url(../images/list.png) no-repeat 0 0;}.view-switch .current #view-switch-list{background:transparent url(../images/list.png) no-repeat -40px 0;}.view-switch #view-switch-excerpt{background:transparent url(../images/list.png) no-repeat -20px 0;}.view-switch .current #view-switch-excerpt{background:transparent url(../images/list.png) no-repeat -60px 0;}#header-logo{background:transparent url(../images/wp-logo-vs.png?ver=20101102) no-repeat scroll center center;}.popular-tags,.feature-filter{background-color:#fff;border-color:#DFDFDF;}#theme-information .action-button{border-top-color:#DFDFDF;}.theme-listing br.line{border-bottom-color:#ccc;}div.widgets-sortables,#widgets-left .inactive{background-color:#f7fcfe;border-color:#d0dfe9;}#available-widgets .widget-holder{background-color:#f7fcfe;border-color:#d0dfe9;}#available-widgets .widget-description{color:#555;}.sidebar-name{color:#464646;background-color:#f7fcfe;background-image:-ms-linear-gradient(top,#ECF8FE,#f7fcfe);background-image:-moz-linear-gradient(top,#ECF8FE,#f7fcfe);background-image:-o-linear-gradient(top,#ECF8FE,#f7fcfe);background-image:-webkit-gradient(linear,left top,left bottom,from(#ECF8FE),to(#f7fcfe));background-image:-webkit-linear-gradient(top,#ECF8FE,#f7fcfe);background-image:linear-gradient(top,#ECF8FE,#f7fcfe);text-shadow:#fff 0 1px 0;border-color:#d0dfe9;-moz-box-shadow:inset 0 1px 0 #fff;-webkit-box-shadow:inset 0 1px 0 #fff;box-shadow:inset 0 1px 0 #fff;}.sidebar-name:hover,#removing-widget{color:#d54e21;}#removing-widget span{color:black;}.sidebar-name-arrow{background:transparent url(../images/arrows-vs.png) no-repeat 5px 9px;}.sidebar-name:hover .sidebar-name-arrow{background:transparent url(../images/arrows-dark-vs.png) no-repeat 5px 9px;}.in-widget-title{color:#606060;}.deleting .widget-title *{color:#aaa;}.imgedit-menu div{border-color:#d5d5d5;background-color:#f1f1f1;}.imgedit-menu div:hover{border-color:#c1c1c1;background-color:#eaeaea;}.imgedit-menu div.disabled{border-color:#ccc;background-color:#ddd;filter:alpha(opacity=50);opacity:.5;}#dashboard_recent_comments div.undo{border-top-color:#dfdfdf;}.comment-ays,.comment-ays th{border-color:#ddd;}.comment-ays th{background-color:#f1f1f1;}#menu-management .menu-edit{border-color:#d0dfe9;}#post-body{background:#fff;border-top-color:#fff;border-bottom-color:#d0dfe9;}#nav-menu-header{border-bottom-color:#d0dfe9;}#nav-menu-footer{border-top-color:#fff;}#menu-management .nav-tabs-arrow a{color:#C1C1C1;}#menu-management .nav-tabs-arrow a:hover{color:#D54E21;}#menu-management .nav-tabs-arrow a:active{color:#464646;}#menu-management .nav-tab-active{border-color:#dfdfdf;}#menu-management .nav-tab{background:#f7fcfe;border-color:#d0dfe9;}.js .input-with-default-title{color:#aaa;}#cancel-save{color:#f00;}#cancel-save:hover{background-color:#F00;color:#fff;}.list-container{border-color:#dfdfdf;}.menu-item-handle{border-color:#d0dfe9;}.menu li.deleting .menu-item-handle{background-color:#f66;text-shadow:#ccc;}.item-type{color:#999;}.item-controls .menu-item-delete:hover{color:#f00;}.item-edit{background:transparent url(../images/arrows-vs.png) no-repeat 8px 10px;border-bottom-color:#eee;}.item-edit:hover{background:transparent url(../images/arrows-dark-vs.png) no-repeat 8px 10px;}.menu-item-settings{border-color:#d0dfe9;}.link-to-original{color:#777;border-color:#d0dfe9;}#cancel-save:hover{color:#fff!important;}#update-menu-item{color:#fff!important;}#update-menu-item:hover,#update-menu-item:active,#update-menu-item:focus{color:#eaf2fa!important;border-color:#13455b!important;}.submitbox .submitcancel{color:#21759B;border-bottom-color:#21759B;}.submitbox .submitcancel:hover{background:#21759B;color:#fff;}#menu-management .nav-tab-active,.menu-item-handle,.menu-item-settings{-moz-box-shadow:inset 0 1px 0 #fff;-webkit-box-shadow:inset 0 1px 0 #fff;box-shadow:inset 0 1px 0 #fff;}#menu-management .nav-tab-active{background:#eff8ff;border-bottom-color:#eff8ff;}#upload-form label{color:#777;}.fullscreen-overlay{background:#fff;}.wp-fullscreen-focus #wp-fullscreen-title,.wp-fullscreen-focus #wp-fullscreen-container{border-color:#BED1DD;}#fullscreen-topbar{border-bottom-color:#D1E5EE;} \ No newline at end of file diff --git a/src/wp-admin/css/colors-classic.dev.css b/src/wp-admin/css/colors-classic.dev.css new file mode 100644 index 0000000..329d32e --- /dev/null +++ b/src/wp-admin/css/colors-classic.dev.css @@ -0,0 +1,2087 @@ +html, +.wp-dialog { + background-color: #fff; +} + +* html input, +* html .widget { + border-color: #dfdfdf; +} + +textarea, +input[type="text"], +input[type="password"], +input[type="file"], +input[type="button"], +input[type="submit"], +input[type="reset"], +select { + border-color: #dfdfdf; + background-color: #fff; +} + +kbd, +code { + background: #eaeaea; +} + +input[readonly] { + background-color: #eee; +} + +.find-box-search { + border-color: #dfdfdf; + background-color: #f1f1f1; +} + +.find-box { + background-color: #f1f1f1; +} + +.find-box-inside { + background-color: #fff; +} + +a.page-numbers:hover { + border-color: #999; +} + +body, +#wpbody, +.form-table .pre { + color: #333; +} + +body > #upload-menu { + border-bottom-color: #fff; +} + +#postcustomstuff table, +#your-profile fieldset, +#rightnow, +div.dashboard-widget, +#dashboard-widgets p.dashboard-widget-links, +#replyrow #ed_reply_toolbar input { + border-color: #D1E5EE +} + +#poststuff .inside label.spam, +#poststuff .inside label.deleted { + color: red; +} + +#poststuff .inside label.waiting { + color: orange; +} + +#poststuff .inside label.approved { + color: green; +} + +#postcustomstuff table { + border-color: #dfdfdf; + background-color: #F9F9F9; +} + +#postcustomstuff thead th { + background-color: #F1F1F1; +} + +#postcustomstuff table input, +#postcustomstuff table textarea { + border-color: #dfdfdf; + background-color: #fff; +} + +.widefat { + border-color: #D1E5EE; + background-color: #fff; +} + +div.dashboard-widget-error { + background-color: #c43; +} + +div.dashboard-widget-notice { + background-color: #cfe1ef; +} + +div.dashboard-widget-submit { + border-top-color: #ccc; +} + +div.tabs-panel, +.wp-tab-panel, +ul.category-tabs li.tabs, +ul.add-menu-item-tabs li.tabs, +.wp-tab-active { + border-color: #dfdfdf; + background-color: #fff; +} + +ul.category-tabs li.tabs, +ul.add-menu-item-tabs li.tabs, +.wp-tab-active { + background-color: #fff; +} + +input.disabled, +textarea.disabled { + background-color: #ccc; +} +/* #upload-menu li a.upload-tab-link, */ +#plugin-information .action-button a, +#plugin-information .action-button a:hover, +#plugin-information .action-button a:visited { + color: #fff; +} + +.widget .widget-top, +.postbox h3, +.stuffbox h3, +.widefat thead tr th, +.widefat tfoot tr th, +h3.dashboard-widget-title, +h3.dashboard-widget-title span, +h3.dashboard-widget-title small, +.find-box-head, +.sidebar-name, +#nav-menu-header, +#nav-menu-footer, +.menu-item-handle, +#fullscreen-topbar { + background-color: #f5fafd; /* Fallback */ + background-image: -ms-linear-gradient(top, #f7fcfe, #eff8ff); /* IE10 */ + background-image: -moz-linear-gradient(top, #f7fcfe, #eff8ff); /* Firefox */ + background-image: -o-linear-gradient(top, #f7fcfe, #eff8ff); /* Opera */ + background-image: -webkit-gradient(linear, left top, left bottom, from(#f7fcfe), to(#eff8ff)); /* old Webkit */ + background-image: -webkit-linear-gradient(top, #f7fcfe, #eff8ff); /* new Webkit */ + background-image: linear-gradient(top, #f7fcfe, #eff8ff); /* proposed W3C Markup */ +} + +.widget .widget-top, +.postbox h3, +.stuffbox h3 { + border-bottom-color: #D1E5EE; + text-shadow: #fff 0 1px 0; + -moz-box-shadow: 0 1px 0 #fff; + -webkit-box-shadow: 0 1px 0 #fff; + box-shadow: 0 1px 0 #fff; +} + +.form-table th, +.form-wrap label { + color: #222; + text-shadow: #fff 0 1px 0; +} + +.description, +.form-wrap p { + color: #666; +} + +strong .post-com-count span { + background-color: #21759b; +} + +.sorthelper { + background-color: #ccf3fa; +} + +.ac_match, +.subsubsub a.current { + color: #000; +} + +.wrap h2 { + color: #174f69; +} + +.wrap .add-new-h2 { + background: #f1f1f1; +} + +.subtitle { + color: #777; +} + +.ac_over { + background-color: #f0f0b8; +} + +.ac_results { + background-color: #fff; + border-color: #808080; +} + +.ac_results li { + color: #101010; +} + +.alternate, +.alt { + background-color: #f7fcfe; +} + +.available-theme a.screenshot { + background-color: #f1f1f1; + border-color: #ddd; +} + +.bar { + background-color: #e8e8e8; + border-right-color: #99d; +} + +#media-upload, +#media-upload .media-item .slidetoggle { + background: #fff; +} + +#media-upload .slidetoggle { + border-top-color: #dfdfdf; +} + +div.error, +.login #login_error { + background-color: #ffebe8; + border-color: #c00; +} + +div.error a { + color: #c00; +} + +.form-invalid { + background-color: #ffebe8 !important; +} + +.form-invalid input, +.form-invalid select { + border-color: #c00 !important; +} + +.submit { + border-color: #DFDFDF; +} + +.highlight { + background-color: #e4f2fd; + color: #000; +} + +.howto, +.nonessential, +#edit-slug-box, +.form-input-tip, +.subsubsub { + color: #666; +} + +.media-item { + border-bottom-color: #dfdfdf; +} + +#wpbody-content #media-items .describe { + border-top-color: #dfdfdf; +} + +.media-upload-form label.form-help, +td.help { + color: #9a9a9a; +} + +.post-com-count { + background-image: url(../images/bubble_bg.gif); + color: #fff; +} + +.post-com-count span { + background-color: #bbb; + color: #fff; +} + +.post-com-count:hover span { + background-color: #d54e21; +} + +.quicktags, .search { + background-color: #ccc; + color: #000; +} + +.side-info h5 { + border-bottom-color: #dadada; +} + +.side-info ul { + color: #666; +} + +.button, +.button-secondary, +.submit input, +input[type=button], +input[type=submit] { + border-color: #bbb; + color: #464646; +} + +.button:hover, +.button-secondary:hover, +.submit input:hover, +input[type=button]:hover, +input[type=submit]:hover { + color: #000; + border-color: #666; +} + +.button, +.submit input, +.button-secondary { + background: #f2f2f2 url(../images/white-grad.png) repeat-x scroll left top; + text-shadow: rgba(255,255,255,1) 0 1px 0; +} + +.button:active, +.submit input:active, +.button-secondary:active { + background: #eee url(../images/white-grad-active.png) repeat-x scroll left top; +} + +input.button-primary, +button.button-primary, +a.button-primary { + border-color: #298cba; + font-weight: bold; + color: #fff; + background: #21759B url(../images/button-grad.png) repeat-x scroll left top; + text-shadow: rgba(0,0,0,0.3) 0 -1px 0; +} + +input.button-primary:active, +button.button-primary:active, +a.button-primary:active { + background: #21759b url(../images/button-grad-active.png) repeat-x scroll left top; + color: #eaf2fa; +} + +input.button-primary:hover, +button.button-primary:hover, +a.button-primary:hover, +a.button-primary:focus, +a.button-primary:active { + border-color: #13455b; + color: #eaf2fa; +} + +.button-disabled, +.button[disabled], +.button:disabled, +.button-secondary[disabled], +.button-secondary:disabled, +a.button.disabled { + color: #aaa !important; + border-color: #ddd !important; +} + +.button-primary-disabled, +.button-primary[disabled], +.button-primary:disabled { + color: #9FD0D5 !important; + background: #298CBA !important; +} + +a:hover, +a:active, +a:focus { + color: #d54e21; +} + +#wphead #viewsite a:hover, +#adminmenu a:hover, +#adminmenu ul.wp-submenu a:hover, +#the-comment-list .comment a:hover, +#rightnow a:hover, +#media-upload a.del-link:hover, +div.dashboard-widget-submit input:hover, +.subsubsub a:hover, +.subsubsub a.current:hover, +.ui-tabs-nav a:hover, +.plugins .inactive a:hover, +#all-plugins-table .plugins .inactive a:hover, +#search-plugins-table .plugins .inactive a:hover { + color: #d54e21; +} + +#the-comment-list .comment-item, +#dashboard-widgets #dashboard_quick_press form p.submit { + border-color: #dfdfdf; +} + +#side-sortables .category-tabs .tabs a, +#side-sortables .add-menu-item-tabs .tabs a, +.wp-tab-bar .wp-tab-active a { + color: #333; +} + +#rightnow .rbutton { + background-color: #ebebeb; + color: #264761; +} + +.submitbox .submit { + background-color: #464646; + color: #ccc; +} + +.plugins a.delete:hover, +#all-plugins-table .plugins a.delete:hover, +#search-plugins-table .plugins a.delete:hover, +.submitbox .submitdelete { + color: #f00; + border-bottom-color: #f00; +} + +.submitbox .submitdelete:hover, +#media-items a.delete:hover { + color: #fff; + background-color: #f00; + border-bottom-color: #f00; +} + +#normal-sortables .submitbox .submitdelete:hover { + color: #000; + background-color: #f00; + border-bottom-color: #f00; +} + +.tablenav .dots { + border-color: transparent; +} + +.tablenav .next, +.tablenav .prev { + border-color: transparent; + color: #21759b; +} + +.tablenav .next:hover, +.tablenav .prev:hover { + border-color: transparent; + color: #d54e21; +} + +div.updated, +.login .message { + background-color: #ffffe0; + border-color: #e6db55; +} + +.update-message { + color: #000; +} + +a.page-numbers { + border-bottom-color: #B8D3E2; +} + +.commentlist li { + border-bottom-color: #ccc; +} + +.widefat td, +.widefat th { + border-top-color: #fff; + border-bottom-color: #D0DFE9; +} + +.widefat th { + text-shadow: rgba(255,255,255,0.8) 0 1px 0; +} + +.widefat td { + color: #555; +} +.widefat p, +.widefat ol, +.widefat ul { + color: #333; +} + +.widefat thead tr th, +.widefat tfoot tr th, +h3.dashboard-widget-title, +h3.dashboard-widget-title span, +h3.dashboard-widget-title small, +.find-box-head { + color: #333; +} + +th.sortable a:hover, th.sortable a:active, th.sortable a:focus { + color: #333; +} + +h3.dashboard-widget-title small a { + color: #d7d7d7; +} + +h3.dashboard-widget-title small a:hover { + color: #fff; +} + +a, +#adminmenu a, +#poststuff #edButtonPreview, +#poststuff #edButtonHTML, +#the-comment-list p.comment-author strong a, +#media-upload a.del-link, +#media-items a.delete, +.plugins a.delete, +.ui-tabs-nav a { + color: #21759b; +} + +#adminmenu .awaiting-mod, +#adminmenu .update-plugins, +#sidemenu a .update-plugins, +#rightnow .reallynow { + background-color: #464646; + color: #fff; + -moz-box-shadow: rgba(255,255,255,0.5) 0 1px 0; + -khtml-box-shadow: rgba(255,255,255,0.5) 0 1px 0; + -webkit-box-shadow: rgba(255,255,255,0.5) 0 1px 0; + box-shadow: rgba(255,255,255,0.5) 0 1px 0; +} +#plugin-information .action-button { + background-color: #d54e21; + color: #fff; +} + +#adminmenu li.current a .awaiting-mod, +#adminmenu li a.wp-has-current-submenu .update-plugins{ + background-color: #464646; + color: #fff; + -moz-box-shadow: rgba(255,255,255,0.5) 0 1px 0; + -khtml-box-shadow: rgba(255,255,255,0.5) 0 1px 0; + -webkit-box-shadow: rgba(255,255,255,0.5) 0 1px 0; + box-shadow: rgba(255,255,255,0.5) 0 1px 0; +} + +div#media-upload-header, +div#plugin-information-header { + background-color: #f9f9f9; + border-bottom-color: #dfdfdf; +} + +#currenttheme img { + border-color: #666; +} + +#dashboard_secondary div.dashboard-widget-content ul li a { + background-color: #f9f9f9; +} + +input.readonly, textarea.readonly { + background-color: #ddd; +} + +#ed_toolbar input, +#ed_reply_toolbar input { + background: #fff url("../images/fade-butt.png") repeat-x 0 -2px; +} + +#editable-post-name { + background-color: #fffbcc; +} + +#edit-slug-box strong, +.tablenav .displaying-num, +#submitted-on, +.submitted-on { + color: #777; +} + +.login #nav a, +.login #backtoblog a { + color: #21759b !important; +} + +.login #nav a:hover, +.login #backtoblog a:hover { + color: #d54e21 !important; +} + +#footer { + color: #777; + border-color: #b0c8d7; +} + +#media-items, +.imgedit-group { + border-color: #dfdfdf; +} + +.checkbox, +.side-info, +.plugins tr, +#your-profile #rich_editing { + background-color: #fcfcfc; +} + +.plugins .inactive, +.plugins .inactive th, +.plugins .inactive td, +tr.inactive + tr.plugin-update-tr .plugin-update { + background-color: #efede7; +} + +.plugin-update-tr .update-message { + background-color: #fffbe4; + border-color: #dfdfdf; +} + +.plugins .active, +.plugins .active th, +.plugins .active td { + color: #000; +} + +.plugins .inactive a { + color: #557799; +} + +#the-comment-list tr.undo, +#the-comment-list div.undo { + background-color: #f4f4f4; +} + +#the-comment-list .unapproved { + background-color: #ffffe0; +} + +#the-comment-list .approve a { + color: #006505; +} + +#the-comment-list .unapprove a { + color: #d98500; +} + +table.widefat span.delete a, +table.widefat span.trash a, +table.widefat span.spam a, +#dashboard_recent_comments .delete a, +#dashboard_recent_comments .trash a, +#dashboard_recent_comments .spam a { + color: #bc0b0b; +} + +.widget, +#widget-list .widget-top, +.postbox, +#titlediv, +#poststuff .postarea, +.stuffbox { + border-color: #d1e5ee; + -moz-box-shadow: inset 0 1px 0 #fff; + -webkit-box-shadow: inset 0 1px 0 #fff; + box-shadow: inset 0 1px 0 #fff; + -moz-border-radius: 3px; + -khtml-border-radius: 3px; + -webkit-border-radius: 3px; + border-radius: 3px; +} + +.widget, +#widget-list .widget-top, +.postbox, +.menu-item-settings { + background-color: #f7fcfe; +} + +.postbox h3 { + color: #174f69; +} + +.widget .widget-top { + color: #174f69; +} + +.sidebar-name:hover h3, +.postbox h3:hover { + color: #000; +} + +.curtime #timestamp { + background-image: url(../images/date-button.gif); +} + +#quicktags #ed_link { + color: #00f; +} + +#rightnow .youhave { + background-color: #f0f6fb; +} + +#rightnow a { + color: #448abd; +} + +.tagchecklist span a, +#bulk-titles div a { + background: url(../images/xit.gif) no-repeat; +} + +.tagchecklist span a:hover, +#bulk-titles div a:hover { + background: url(../images/xit.gif) no-repeat -10px 0; +} + +#update-nag, .update-nag { + background-color: #fffbcc; + border-color: #e6db55; + color: #555; +} + +.login #backtoblog a { + color: #464646; +} + +#wphead { + border-bottom:#d0dfe9 1px solid; +} + +#wphead h1 a { + color: #174f69; +} + +#user_info { + color: #777; +} + +#user_info:hover, +#user_info.active { + color: #185069; +} + +#user_info.active { + background-color: #f7fcfe; /* Fallback */ + background-image: -ms-linear-gradient(bottom, #f7fcfe, #f9f9f9); /* IE10 */ + background-image: -moz-linear-gradient(bottom, #f7fcfe, #f9f9f9); /* Firefox */ + background-image: -o-linear-gradient(bottom, #f7fcfe, #f9f9f9); /* Opera */ + background-image: -webkit-gradient(linear, left bottom, left top, from(#f7fcfe), to(#f9f9f9)); /* old Webkit */ + background-image: -webkit-linear-gradient(bottom, #f7fcfe, #f9f9f9); /* new Webkit */ + background-image: linear-gradient(bottom, #f7fcfe, #f9f9f9); /* proposed W3C Markup */ + border-color: #d0dfe9 #d0dfe9 #d0dfe9; +} + +#user_info_arrow { + background: transparent url(../images/arrows-vs.png) no-repeat 6px 5px; +} + +#user_info:hover #user_info_arrow, +#user_info.active #user_info_arrow { + background: transparent url(../images/arrows-dark-vs.png) no-repeat 6px 5px; +} + +#user_info_links { + -moz-box-shadow: 0 3px 2px -2px rgba( 0, 0, 0, 0.2 ); + -webkit-box-shadow: 0 3px 2px -2px rgba( 0, 0, 0, 0.2 ); + box-shadow: 0 3px 2px -2px rgba( 0, 0, 0, 0.2 ); +} + +#user_info_links ul { + background: #f7fcfe; + border-color: #d0dfe9 #d0dfe9 #d0dfe9; + -moz-box-shadow: inset 0 1px 0 #f9f9f9; + -webkit-box-shadow: inset 0 1px 0 #f9f9f9; + box-shadow: inset 0 1px 0 #f9f9f9; +} + +#user_info_links li:hover { + background-color: #ECF8FE; +} + +#user_info_links li:hover a, +#user_info_links li a:hover { + text-decoration: none; +} + +#user_info a:link, +#user_info a:visited, +#footer a:link, +#footer a:visited { + text-decoration: none; +} + +#footer a:hover { + color: #000; + text-decoration: underline; +} + +div#media-upload-error, +.file-error, +abbr.required, +.widget-control-remove:hover, +table.widefat .delete a:hover, +table.widefat .trash a:hover, +table.widefat .spam a:hover, +#dashboard_recent_comments .delete a:hover, +#dashboard_recent_comments .trash a:hover +#dashboard_recent_comments .spam a:hover { + color: #f00; +} + +#pass-strength-result { + background-color: #eee; + border-color: #ddd !important; +} + +#pass-strength-result.bad { + background-color: #ffb78c; + border-color: #ff853c !important; +} + +#pass-strength-result.good { + background-color: #ffec8b; + border-color: #fc0 !important; +} + +#pass-strength-result.short { + background-color: #ffa0a0; + border-color: #f04040 !important; +} + +#pass-strength-result.strong { + background-color: #c3ff88; + border-color: #8dff1c !important; +} + +/* editors */ +#quicktags { + border-color: #cfdfe9; + background-color: #cfdfe9; + background-image: url("../images/ed-bg-vs.gif?ver=20101102"); +} + +#ed_toolbar input { + border-color: #C3C3C3; +} + +#ed_toolbar input:hover { + border-color: #aaa; + background: #ddd; +} + +#poststuff .wp_themeSkin .mceStatusbar { + border-color: #d0dfe9; +} + +#poststuff .wp_themeSkin .mceStatusbar * { + color: #555; +} + +#poststuff #edButtonPreview, +#poststuff #edButtonHTML { + background-color: #f7fcfe; + border-color: #d0dfe9 #d0dfe9 #d0dfe9; + color: #999; +} + +#poststuff #editor-toolbar .active { + border-color: #d0dfe9 #d0dfe9 #eff8ff; + background-color: #eff8ff; + color: #333; +} + +/* TinyMCE */ +#post-status-info { + background-color: #eff8ff; +} + +.wp_themeSkin *, +.wp_themeSkin a:hover, +.wp_themeSkin a:link, +.wp_themeSkin a:visited, +.wp_themeSkin a:active { + color: #000; +} + +/* Containers */ +.wp_themeSkin table.mceLayout { + border-color: #bed1dd #bed1dd #d0dfe9; +} + +#editorcontainer #content, +#editorcontainer .wp_themeSkin .mceIframeContainer { + -moz-box-shadow: inset 1px 1px 2px rgba( 0, 0, 0, 0.1 ); + -webkit-box-shadow: inset 1px 1px 2px rgba( 0, 0, 0, 0.1 ); + box-shadow: inset 1px 1px 2px rgba( 0, 0, 0, 0.1 ); +} +.wp_themeSkin iframe { + background: transparent; +} + +/* Layout */ +.wp_themeSkin .mceStatusbar { + color: #000; + background-color: #f5f5f5; +} + +/* Button */ +.wp_themeSkin .mceButton { + border-color: #B0C8D7; + background-color: #cfdfe9; /* Fallback */ + background-image: -ms-linear-gradient(bottom, #cfdfe9, #fff); /* IE10 */ + background-image: -moz-linear-gradient(bottom, #cfdfe9, #fff); /* Firefox */ + background-image: -o-linear-gradient(bottom, #cfdfe9, #fff); /* Opera */ + background-image: -webkit-gradient(linear, left bottom, left top, from(#cfdfe9), to(#fff)); /* old Webkit */ + background-image: -webkit-linear-gradient(bottom, #cfdfe9, #fff) !important; /* new Webkit */ + background-image: linear-gradient(bottom, #cfdfe9, #fff); /* proposed W3C Markup */ +} + +.wp_themeSkin a.mceButtonEnabled:hover { + border-color: #5589AA !important; + background-color: #c9c9c9; /* Fallback */ + background-image: -ms-linear-gradient(bottom, #bdccd5, #fff); /* IE10 */ + background-image: -moz-linear-gradient(bottom, #bdccd5, #fff)); /* Firefox */ + background-image: -o-linear-gradient(bottom, #bdccd5, #fff)); /* Opera */ + background-image: -webkit-gradient(linear, left bottom, left top, from(#bdccd5), to(#fff)); /* old Webkit */ + background-image: -webkit-linear-gradient(bottom, #bdccd5, #fff) !important; /* new Webkit */ + background-image: linear-gradient(bottom, #bdccd5, #fff); /* proposed W3C Markup */ +} + +.wp_themeSkin a.mceButton:active, +.wp_themeSkin a.mceButtonEnabled:active, +.wp_themeSkin a.mceButtonSelected:active, +.wp_themeSkin a.mceButtonActive, +.wp_themeSkin a.mceButtonActive:active, +.wp_themeSkin a.mceButtonActive:hover { + background: #B0C8D7 !important; + background-image: -ms-linear-gradient(bottom, #fff, #cfdfe9); /* IE10 */ + background-image: -moz-linear-gradient(bottom, #fff, #cfdfe9)); /* Firefox */ + background-image: -o-linear-gradient(bottom, #fff, #cfdfe9)); /* Opera */ + background-image: -webkit-gradient(linear, left bottom, left top, from(#fff), to(#cfdfe9)); /* old Webkit */ + background-image: -webkit-linear-gradient(bottom, #fff, #cfdfe9) !important; /* new Webkit */ + background-image: linear-gradient(bottom, #fff, #cfdfe9); /* proposed W3C Markup */ + border-color: #5589AA !important; +} + +.wp_themeSkin .mceButtonDisabled { + border-color: #B0C8D7 !important; +} + +/* ListBox */ +.wp_themeSkin .mceListBox .mceText, +.wp_themeSkin .mceListBox .mceOpen { + border-color: #B0C8D7; + background-color: #cfdfe9; /* Fallback */ + background-image: -ms-linear-gradient(bottom, #cfdfe9, #fff); /* IE10 */ + background-image: -moz-linear-gradient(bottom, #cfdfe9, #fff); /* Firefox */ + background-image: -o-linear-gradient(bottom, #cfdfe9, #fff); /* Opera */ + background-image: -webkit-gradient(linear, left bottom, left top, from(#cfdfe9), to(#fff)); /* old Webkit */ + background-image: -webkit-linear-gradient(bottom, #cfdfe9, #fff) !important; /* new Webkit */ + background-image: linear-gradient(bottom, #cfdfe9, #fff); /* proposed W3C Markup */ +} + +.wp_themeSkin .mceListBox .mceOpen { + border-left: 0px !important; +} + +.wp_themeSkin table.mceListBoxEnabled:hover .mceOpen, +.wp_themeSkin .mceListBoxHover .mceOpen, +.wp_themeSkin .mceListBoxHover:active .mceOpen, +.wp_themeSkin .mceListBoxSelected .mceOpen, +.wp_themeSkin .mceListBoxSelected .mceText, +.wp_themeSkin table.mceListBoxEnabled:active .mceText { + background: #B0C8D7; + border-color: #5589AA !important; +} + +/* List Box Hover */ +.wp_themeSkin table.mceListBoxEnabled:hover .mceText, +.wp_themeSkin .mceListBoxHover .mceText, +.wp_themeSkin table.mceListBoxEnabled:hover .mceOpen, +.wp_themeSkin .mceListBoxHover .mceOpen { + border-color: #5589AA !important; + background-color: #c9c9c9; /* Fallback */ + background-image: -ms-linear-gradient(bottom, #cfdfe9, #fff); /* IE10 */ + background-image: -moz-linear-gradient(bottom, #cfdfe9, #fff); /* Firefox */ + background-image: -o-linear-gradient(bottom, #cfdfe9, #fff); /* Opera */ + background-image: -webkit-gradient(linear, left bottom, left top, from(#cfdfe9), to(#fff)); /* old Webkit */ + background-image: -webkit-linear-gradient(bottom, #cfdfe9, #fff) !important; /* new Webkit */ + background-image: linear-gradient(bottom, #cfdfe9, #fff); /* proposed W3C Markup */ +} + +.wp_themeSkin select.mceListBox { + border-color: #B2B2B2; + background-color: #fff; +} + +/* SplitButton */ +.wp_themeSkin .mceSplitButton a.mceAction, +.wp_themeSkin .mceSplitButton a.mceOpen { + border-color: #B0C8D7; +} + +.wp_themeSkin .mceSplitButton a.mceOpen:hover, +.wp_themeSkin .mceSplitButtonSelected a.mceOpen, +.wp_themeSkin table.mceSplitButtonEnabled:hover a.mceAction, +.wp_themeSkin .mceSplitButton a.mceAction:hover { + border-color: #5589AA !important; +} + + +.wp_themeSkin table.mceSplitButton td { + background-color: #cfdfe9; /* Fallback */ + background-image: -ms-linear-gradient(bottom, #cfdfe9, #fff); /* IE10 */ + background-image: -moz-linear-gradient(bottom, #cfdfe9, #fff); /* Firefox */ + background-image: -o-linear-gradient(bottom, #cfdfe9, #fff); /* Opera */ + background-image: -webkit-gradient(linear, left bottom, left top, from(#cfdfe9), to(#fff)); /* old Webkit */ + background-image: -webkit-linear-gradient(bottom, #cfdfe9, #fff) !important; /* new Webkit */ + background-image: linear-gradient(bottom, #cfdfe9, #fff); /* proposed W3C Markup */ +} + +.wp_themeSkin table.mceSplitButton:hover td { + background-image: -ms-linear-gradient(bottom, #cfdfe9, #fff); /* IE10 */ + background-image: -moz-linear-gradient(bottom, #cfdfe9, #fff); /* Firefox */ + background-image: -o-linear-gradient(bottom, #cfdfe9, #fff); /* Opera */ + background-image: -webkit-gradient(linear, left bottom, left top, from(#cfdfe9), to(#fff)); /* old Webkit */ + background-image: -webkit-linear-gradient(bottom, #cfdfe9, #fff) !important; /* new Webkit */ + background-image: linear-gradient(bottom, #cfdfe9, #fff); /* proposed W3C Markup */ +} + +.wp_themeSkin .mceSplitButtonActive { + background-color: #B0C8D7; +} + +/* ColorSplitButton */ +.wp_themeSkin div.mceColorSplitMenu table { + background-color: #ebebeb; + border-color: #B2B2B2; +} + +.wp_themeSkin .mceColorSplitMenu a { + border-color: #B2B2B2; +} + +.wp_themeSkin .mceColorSplitMenu a.mceMoreColors { + border-color: #fff; +} + +.wp_themeSkin .mceColorSplitMenu a.mceMoreColors:hover { + border-color: #0A246A; + background-color: #B6BDD2; +} + +.wp_themeSkin a.mceMoreColors:hover { + border-color: #0A246A; +} + +/* Menu */ +.wp_themeSkin .mceMenu { + border-color: #ddd; +} + +.wp_themeSkin .mceMenu table { + background-color: #ebeaeb; +} + +.wp_themeSkin .mceMenu .mceText { + color: #000; +} + +.wp_themeSkin .mceMenu .mceMenuItemEnabled a:hover, +.wp_themeSkin .mceMenu .mceMenuItemActive { + background-color: #f5f5f5; +} +.wp_themeSkin td.mceMenuItemSeparator { + background-color: #aaa; +} +.wp_themeSkin .mceMenuItemTitle a { + background-color: #ccc; + border-bottom-color: #aaa; +} +.wp_themeSkin .mceMenuItemTitle span.mceText { + color: #000; +} +.wp_themeSkin .mceMenuItemDisabled .mceText { + color: #888; +} + +.wp_themeSkin tr.mceFirst td.mceToolbar { + background: #cfdfe9 url("../images/ed-bg-vs.gif?ver=20101102") repeat-x scroll left top; + border-color: #cfdfe9; +} + +.wp-admin #mceModalBlocker { + background: #000; +} + +.wp-admin .clearlooks2 .mceFocus .mceTop .mceLeft { + background: #444444; + border-left: 1px solid #999; + border-top: 1px solid #999; + -moz-border-radius: 3px 0 0 0; + -webkit-border-top-left-radius: 3px; + -khtml-border-top-left-radius: 3px; + border-top-left-radius: 3px; +} + +.wp-admin .clearlooks2 .mceFocus .mceTop .mceRight { + background: #444444; + border-right: 1px solid #999; + border-top: 1px solid #999; + border-top-right-radius: 3px; + -khtml-border-top-right-radius: 3px; + -webkit-border-top-right-radius: 3px; + -moz-border-radius: 0 3px 0 0; +} + +.wp-admin .clearlooks2 .mceMiddle .mceLeft { + background: #f1f1f1; + border-left: 1px solid #999; +} + +.wp-admin .clearlooks2 .mceMiddle .mceRight { + background: #f1f1f1; + border-right: 1px solid #999; +} + +.wp-admin .clearlooks2 .mceBottom { + background: #f1f1f1; + border-bottom: 1px solid #999; +} + +.wp-admin .clearlooks2 .mceBottom .mceLeft { + background: #f1f1f1; + border-bottom: 1px solid #999; + border-left: 1px solid #999; +} + +.wp-admin .clearlooks2 .mceBottom .mceCenter { + background: #f1f1f1; + border-bottom: 1px solid #999; +} + +.wp-admin .clearlooks2 .mceBottom .mceRight { + background: #f1f1f1; + border-bottom: 1px solid #999; + border-right: 1px solid #999; +} + +.wp-admin .clearlooks2 .mceFocus .mceTop span { + color: #e5e5e5; +} +/* end TinyMCE */ + +#titlediv #title { + border-color: #bdccd5; +} + +#editorcontainer { + border-color: #bdccd5 #bdccd5 #d0dfe9; +} + +#post-status-info { + border-color: #d0dfe9 #bdccd5 #bdccd5; +} + +.editwidget .widget-inside { + border-color: #d0dfe9; +} + +#titlediv #title { + background-color: #fff; +} + +#tTips p#tTips_inside { + background-color: #ddd; + color: #333; +} + +#timestampdiv input, +#namediv input, +#poststuff .inside .the-tagcloud { + border-color: #ddd; +} + +/* menu */ +#adminmenuback, +#adminmenuwrap { + background-color: #EFF8FF; + border-color: #D1E5EE; +} + +#adminmenushadow, +#adminmenuback { + background-image: url(../images/menu-shadow.png); + background-position: top right; + background-repeat: repeat-y; +} + +#adminmenu li.wp-menu-separator { + background: #D1E5EE; + border-color: #bed1dd; +} + +#adminmenu div.separator { + border-color: #D1E5EE; +} + +#adminmenu li.wp-has-current-submenu.wp-menu-open .wp-menu-toggle, +#adminmenu li.wp-has-current-submenu:hover .wp-menu-toggle { + background: transparent url(../images/arrows-dark-vs.png) no-repeat -1px 6px; +} + +#adminmenu .wp-has-submenu:hover .wp-menu-toggle, +#adminmenu .wp-menu-open .wp-menu-toggle { + background: transparent url(../images/arrows-vs.png) no-repeat -2px 6px; +} + +#adminmenu a.menu-top, +.folded #adminmenu li.menu-top, +#adminmenu .wp-submenu .wp-submenu-head { + border-top-color: #ffffff; + border-bottom-color: #d1e5ee; +} + +#adminmenu li.wp-menu-open { + border-color: #d1e5ee; +} + +#adminmenu li.wp-has-current-submenu a.wp-has-current-submenu, +#adminmenu li.current a.menu-top, +.folded #adminmenu li.wp-has-current-submenu, +.folded #adminmenu li.current.menu-top, +#adminmenu .wp-menu-arrow, +#adminmenu .wp-has-current-submenu .wp-submenu .wp-submenu-head { + background-color: #5589AA; /* Fallback */ + background-image: -ms-linear-gradient(bottom, #5589AA, #5A8FAD); /* IE10 */ + background-image: -moz-linear-gradient(bottom, #5589AA, #5A8FAD); /* Firefox */ + background-image: -o-linear-gradient(bottom, #5589AA, #5A8FAD); /* Opera */ + background-image: -webkit-gradient(linear, left bottom, left top, from(#5589AA), to(#5A8FAD)); /* old Webkit */ + background-image: -webkit-linear-gradient(bottom, #5589AA, #5A8FAD); /* new Webkit */ + background-image: linear-gradient(bottom, #5589AA, #5A8FAD); /* proposed W3C Markup */ +} + +#adminmenu li.wp-has-current-submenu a.wp-has-current-submenu, +#adminmenu li.current a.menu-top, +#adminmenu .wp-has-current-submenu .wp-submenu .wp-submenu-head { + text-shadow: 0 -1px 0 #333; + color: #fff; + border-top-color: #5A8FAD; + border-bottom-color: #5589AA; +} + +.folded #adminmenu li.wp-has-current-submenu, +.folded #adminmenu li.current.menu-top { + border-top-color: #5A8FAD; + border-bottom-color: #5589AA; +} + +#adminmenu .wp-submenu a:hover { + background-color: #EAF2FA !important; + color: #333 !important; +} + +#adminmenu .wp-submenu li.current, +#adminmenu .wp-submenu li.current a, +#adminmenu .wp-submenu li.current a:hover { + color: #333; +} + +#adminmenu .wp-submenu ul { + background-color: #fff; +} + +.folded #adminmenu .wp-submenu-wrap, +.folded #adminmenu .wp-submenu ul { + border-color: #d0dfe9; +} + +.folded #adminmenu .wp-submenu-wrap { + -moz-box-shadow: 2px 2px 5px rgba( 0, 0, 0, 0.4 ); + -webkit-box-shadow: 2px 2px 5px rgba( 0, 0, 0, 0.4 ); + box-shadow: 2px 2px 5px rgba( 0, 0, 0, 0.4 ); +} + +#adminmenu .wp-submenu .wp-submenu-head { + border-right-color: #d0dfe9; + background-color: #EFF8FF; +} + +#adminmenu div.wp-submenu { + background-color: transparent; +} + +/* collapse menu button */ +#collapse-menu { + color: #A0C3D5; +} + +#collapse-menu:hover { + color: #5A8FAD; +} + +#collapse-button { + border-color: #d0dfe9; + background-color: #eff8ff; /* Fallback */ + background-image: -ms-linear-gradient(bottom, #eff8ff, #fff); /* IE10 */ + background-image: -moz-linear-gradient(bottom, #eff8ff, #fff); /* Firefox */ + background-image: -o-linear-gradient(bottom, #eff8ff, #fff); /* Opera */ + background-image: -webkit-gradient(linear, left bottom, left top, from(#eff8ff), to(#fff)); /* old Webkit */ + background-image: -webkit-linear-gradient(bottom, #eff8ff, #fff); /* new Webkit */ + background-image: linear-gradient(bottom, #eff8ff, #fff); /* proposed W3C Markup */ +} +#collapse-menu:hover #collapse-button { + border-color: #A0C3D5; +} +#collapse-button div { + background: transparent url(../images/arrows-vs.png) no-repeat 0 -72px; +} +.folded #collapse-button div { + background-position: 0 -108px; +} + +/* menu and screen icons */ +#adminmenu .menu-icon-dashboard div.wp-menu-image { + background: transparent url('../images/menu-vs.png?ver=20100531') no-repeat scroll -60px -33px; +} + +#adminmenu .menu-icon-dashboard:hover div.wp-menu-image, +#adminmenu .menu-icon-dashboard.wp-has-current-submenu div.wp-menu-image, +#adminmenu .menu-icon-dashboard.current div.wp-menu-image { + background: transparent url('../images/menu-vs.png?ver=20100531') no-repeat scroll -60px -1px; +} + +#adminmenu .menu-icon-post div.wp-menu-image { + background: transparent url('../images/menu-vs.png?ver=20100531') no-repeat scroll -271px -33px; +} + +#adminmenu .menu-icon-post:hover div.wp-menu-image, +#adminmenu .menu-icon-post.wp-has-current-submenu div.wp-menu-image { + background: transparent url('../images/menu-vs.png?ver=20100531') no-repeat scroll -271px -1px; +} + +#adminmenu .menu-icon-media div.wp-menu-image { + background: transparent url('../images/menu-vs.png?ver=20100531') no-repeat scroll -120px -33px; +} + +#adminmenu .menu-icon-media:hover div.wp-menu-image, +#adminmenu .menu-icon-media.wp-has-current-submenu div.wp-menu-image { + background: transparent url('../images/menu-vs.png?ver=20100531') no-repeat scroll -120px -1px; +} + +#adminmenu .menu-icon-links div.wp-menu-image { + background: transparent url('../images/menu-vs.png?ver=20100531') no-repeat scroll -90px -33px; +} + +#adminmenu .menu-icon-links:hover div.wp-menu-image, +#adminmenu .menu-icon-links.wp-has-current-submenu div.wp-menu-image { + background: transparent url('../images/menu-vs.png?ver=20100531') no-repeat scroll -90px -1px; +} + +#adminmenu .menu-icon-page div.wp-menu-image { + background: transparent url('../images/menu-vs.png?ver=20100531') no-repeat scroll -150px -33px; +} + +#adminmenu .menu-icon-page:hover div.wp-menu-image, +#adminmenu .menu-icon-page.wp-has-current-submenu div.wp-menu-image { + background: transparent url('../images/menu-vs.png?ver=20100531') no-repeat scroll -150px -1px; +} + +#adminmenu .menu-icon-comments div.wp-menu-image { + background: transparent url('../images/menu-vs.png?ver=20100531') no-repeat scroll -30px -33px; +} + +#adminmenu .menu-icon-comments:hover div.wp-menu-image, +#adminmenu .menu-icon-comments.wp-has-current-submenu div.wp-menu-image, +#adminmenu .menu-icon-comments.current div.wp-menu-image { + background: transparent url('../images/menu-vs.png?ver=20100531') no-repeat scroll -30px -1px; +} + +#adminmenu .menu-icon-appearance div.wp-menu-image { + background: transparent url('../images/menu-vs.png?ver=20100531') no-repeat scroll 0 -33px; +} + +#adminmenu .menu-icon-appearance:hover div.wp-menu-image, +#adminmenu .menu-icon-appearance.wp-has-current-submenu div.wp-menu-image { + background: transparent url('../images/menu-vs.png?ver=20100531') no-repeat scroll 0 -1px; +} + +#adminmenu .menu-icon-plugins div.wp-menu-image { + background: transparent url('../images/menu-vs.png?ver=20100531') no-repeat scroll -180px -33px; +} + +#adminmenu .menu-icon-plugins:hover div.wp-menu-image, +#adminmenu .menu-icon-plugins.wp-has-current-submenu div.wp-menu-image { + background: transparent url('../images/menu-vs.png?ver=20100531') no-repeat scroll -180px -1px; +} + +#adminmenu .menu-icon-users div.wp-menu-image { + background: transparent url('../images/menu-vs.png?ver=20100531') no-repeat scroll -300px -33px; +} + +#adminmenu .menu-icon-users:hover div.wp-menu-image, +#adminmenu .menu-icon-users.wp-has-current-submenu div.wp-menu-image, +#adminmenu .menu-icon-users.current div.wp-menu-image { + background: transparent url('../images/menu-vs.png?ver=20100531') no-repeat scroll -300px -1px; +} + +#adminmenu .menu-icon-tools div.wp-menu-image { + background: transparent url('../images/menu-vs.png?ver=20100531') no-repeat scroll -210px -33px; +} + +#adminmenu .menu-icon-tools:hover div.wp-menu-image, +#adminmenu .menu-icon-tools.wp-has-current-submenu div.wp-menu-image, +#adminmenu .menu-icon-tools.current div.wp-menu-image { + background: transparent url('../images/menu-vs.png?ver=20100531') no-repeat scroll -210px -1px; +} + +#icon-options-general, +#adminmenu .menu-icon-settings div.wp-menu-image { + background: transparent url('../images/menu-vs.png?ver=20100531') no-repeat scroll -240px -33px; +} + +#adminmenu .menu-icon-settings:hover div.wp-menu-image, +#adminmenu .menu-icon-settings.wp-has-current-submenu div.wp-menu-image { + background: transparent url('../images/menu-vs.png?ver=20100531') no-repeat scroll -240px -1px; +} + +#adminmenu .menu-icon-site div.wp-menu-image { + background: transparent url('../images/menu-vs.png?ver=20100531') no-repeat scroll -360px -33px; +} + +#adminmenu .menu-icon-site:hover div.wp-menu-image, +#adminmenu .menu-icon-site.wp-has-current-submenu div.wp-menu-image { + background: transparent url('../images/menu-vs.png?ver=20100531') no-repeat scroll -360px -1px; +} +/* end menu and screen icons */ + +/* Screen Icons */ +#icon-edit, +#icon-post { + background: transparent url(../images/icons32-vs.png?ver=20100531) no-repeat -552px -5px; +} + +#icon-index { + background: transparent url(../images/icons32-vs.png?ver=20100531) no-repeat -137px -5px; +} + +#icon-upload { + background: transparent url(../images/icons32-vs.png?ver=20100531) no-repeat -251px -5px; +} + +#icon-link-manager, +#icon-link, +#icon-link-category { + background: transparent url(../images/icons32-vs.png?ver=20100531) no-repeat -190px -5px; +} + +#icon-edit-pages, +#icon-page { + background: transparent url(../images/icons32-vs.png?ver=20100531) no-repeat -312px -5px; +} + +#icon-edit-comments { + background: transparent url(../images/icons32-vs.png?ver=20100531) no-repeat -72px -5px; +} + +#icon-themes { + background: transparent url(../images/icons32-vs.png?ver=20100531) no-repeat -11px -5px; +} + +#icon-plugins { + background: transparent url(../images/icons32-vs.png?ver=20100531) no-repeat -370px -5px; +} + +#icon-users, +#icon-profile, +#icon-user-edit { + background: transparent url(../images/icons32-vs.png?ver=20100531) no-repeat -600px -5px; +} + +#icon-tools, +#icon-admin { + background: transparent url(../images/icons32-vs.png?ver=20100531) no-repeat -432px -5px; +} + +#icon-options-general { + background: transparent url(../images/icons32-vs.png?ver=20100531) no-repeat -492px -5px; +} + +#icon-ms-admin { + background: transparent url(../images/icons32-vs.png?ver=20100531) no-repeat -659px -5px; +} +/* end screen icons */ + + +/* Diff */ +table.diff .diff-deletedline { + background-color: #fdd; +} + +table.diff .diff-deletedline del { + background-color: #f99; +} + +table.diff .diff-addedline { + background-color: #dfd; +} + +table.diff .diff-addedline ins { + background-color: #9f9; +} + +#att-info { + background-color: #E4F2FD; +} + +/* edit image */ +#sidemenu a { + background-color: #f9f9f9; + border-color: #f9f9f9; + border-bottom-color: #dfdfdf; +} + +#sidemenu a.current { + background-color: #fff; + border-color: #dfdfdf #dfdfdf #fff; + color: #D54E21; +} + +#screen-options-wrap, +#contextual-help-wrap { + background-color: #f7fcfe; + border-color: #D1e5ee; +} + +#screen-options-link-wrap, +#contextual-help-link-wrap { + background-color: #eff8ff; /* Fallback */ + border-right: 1px solid #D1E5EE; + border-left: 1px solid #D1E5EE; + border-bottom: 1px solid #D1E5EE; + background-image: -ms-linear-gradient(bottom, #eff8ff, #fff); /* IE10 */ + background-image: -moz-linear-gradient(bottom, #eff8ff, #fff); /* Firefox */ + background-image: -o-linear-gradient(bottom, #eff8ff, #fff); /* Opera */ + background-image: -webkit-gradient(linear, left bottom, left top, from(#eff8ff), to(#fff)); /* old Webkit */ + background-image: -webkit-linear-gradient(bottom, #eff8ff, #fff); /* new Webkit */ + background-image: linear-gradient(bottom, #eff8ff, #fff); /* proposed W3C Markup */ +} + +#screen-meta-links a.show-settings { + color: #606060; +} + +#screen-meta-links a.show-settings:hover { + color: #000; +} + +#replysubmit { + background-color: #f1f1f1; + border-top-color: #ddd; +} + +#replyerror { + border-color: #ddd; + background-color: #f9f9f9; +} + +#edithead, +#replyhead { + background-color: #f1f1f1; +} + +#ed_reply_toolbar { + background-color: #e9e9e9; +} + +/* table vim shortcuts */ +.vim-current, +.vim-current th, +.vim-current td { + background-color: #E4F2FD !important; +} + +/* Install Plugins */ +.star-average, +.star.star-rating { + background-color: #fc0; +} + +div.star.select:hover { + background-color: #d00; +} + +div.star img { + border-left: 1px solid #fff; + border-right: 1px solid #fff; +} + +#plugin-information .fyi ul { + background-color: #eaf3fa; +} + +#plugin-information .fyi h2.mainheader { + background-color: #cee1ef; +} + +#plugin-information pre, +#plugin-information code { + background-color: #ededff; +} + +#plugin-information pre { + border: 1px solid #ccc; +} + +/* inline editor */ +.inline-edit-row fieldset input[type="text"], +.inline-edit-row fieldset textarea, +#bulk-titles, +#replyrow input { + border-color: #ddd; +} + +.inline-editor div.title { + background-color: #EAF3FA; +} + +.inline-editor ul.cat-checklist { + background-color: #fff; + border-color: #ddd; +} + +.inline-editor .categories .catshow, +.inline-editor .categories .cathide { + color: #21759b; +} + +.inline-editor .quick-edit-save { + background-color: #f1f1f1; +} + +#replyrow #ed_reply_toolbar input:hover { + border-color: #aaa; + background: #ddd; +} + +fieldset.inline-edit-col-right .inline-edit-col { + border-color: #dfdfdf; +} + +.attention { + color: #D54E21; +} + +.meta-box-sortables .postbox:hover .handlediv { + background: transparent url(../images/arrows-vs.png) no-repeat 6px 7px; +} + +.tablenav .tablenav-pages { + color: #555; +} + +.tablenav .tablenav-pages a { + border-color: #d1e5ee; + background: #eee url('../images/menu-bits-vs.gif?ver=20101102') repeat-x scroll left -379px; +} + +.tablenav .tablenav-pages a:hover, +.tablenav .tablenav-pages a:focus { + color: #d54e21; +} + +.tablenav .tablenav-pages a.disabled, +.tablenav .tablenav-pages a.disabled:hover, +.tablenav .tablenav-pages a.disabled:focus { + color: #aaa; +} + +.tablenav .tablenav-pages .current { + background: #dfdfdf; + border-color: #d3d3d3; +} + +#availablethemes, +#availablethemes td { + border-color: #ddd; +} + +#current-theme img { + border-color: #999; +} + +#TB_window #TB_title a.tb-theme-preview-link, +#TB_window #TB_title a.tb-theme-preview-link:visited { + color: #999; +} + +#TB_window #TB_title a.tb-theme-preview-link:hover, +#TB_window #TB_title a.tb-theme-preview-link:focus { + color: #ccc; +} + +.misc-pub-section { + border-top-color: #fff; + border-bottom-color: #eee; +} + +#minor-publishing { + border-bottom-color: #ddd; +} + +#post-body .misc-pub-section { + border-right-color: #eee; +} + +.post-com-count span { + background-color: #bbb; +} + +.form-table .color-palette td { + border-color: #fff; +} + +.sortable-placeholder { + border-color: #bbb; + background-color: #f5f5f5; +} + +#post-body ul.category-tabs li.tabs a, +#post-body ul.add-menu-item-tabs li.tabs a, +body.press-this ul.category-tabs li.tabs a { + color: #333; +} + +#wp_editimgbtn, +#wp_delimgbtn, +#wp_editgallery, +#wp_delgallery { + border-color: #999; + background-color: #eee; +} + +#wp_editimgbtn:hover, +#wp_delimgbtn:hover, +#wp_editgallery:hover, +#wp_delgallery:hover { + border-color: #555; + background-color: #ccc; +} + +#favorite-first { + border-color: #c0c0c0; + background: #f1f1f1; /* fallback color */ + background:-moz-linear-gradient(bottom, #e7e7e7, #fff); + background:-webkit-gradient(linear, left bottom, left top, from(#e7e7e7), to(#fff)); +} + +#favorite-inside { + border-color: #c0c0c0; + background-color: #fff; +} + +#favorite-toggle { + background: transparent url(../images/fav-arrow.gif?ver=20100531) no-repeat 0 -4px; + border-color: #d0dfe9; + -moz-box-shadow: inset 1px 0 0 #fff; + -webkit-box-shadow: inset 1px 0 0 #fff; + box-shadow: inset 1px 0 0 #fff; +} + +#favorite-actions a { + color: #464646; +} + +#favorite-actions a:hover { + color: #000; +} + +#favorite-inside a:hover { + text-decoration: underline; +} + +#screen-meta a.show-settings, +.toggle-arrow { + background: transparent url(../images/arrows-vs.png) no-repeat right 3px; +} + +#screen-meta .screen-meta-active a.show-settings { + background: transparent url(../images/arrows-vs.png) no-repeat right -33px; +} + +.view-switch #view-switch-list { + background: transparent url(../images/list.png) no-repeat 0 0; +} + +.view-switch .current #view-switch-list { + background: transparent url(../images/list.png) no-repeat -40px 0; +} + +.view-switch #view-switch-excerpt { + background: transparent url(../images/list.png) no-repeat -20px 0; +} + +.view-switch .current #view-switch-excerpt { + background: transparent url(../images/list.png) no-repeat -60px 0; +} + +#header-logo { + background: transparent url(../images/wp-logo-vs.png?ver=20101102) no-repeat scroll center center; +} + +.popular-tags, +.feature-filter { + background-color: #fff; + border-color: #DFDFDF; +} + +#theme-information .action-button { + border-top-color: #DFDFDF; +} + +.theme-listing br.line { + border-bottom-color: #ccc; +} + +div.widgets-sortables, +#widgets-left .inactive { + background-color: #f7fcfe; + border-color: #d0dfe9; +} + +#available-widgets .widget-holder { + background-color: #f7fcfe; + border-color: #d0dfe9; +} + +#available-widgets .widget-description { + color: #555; +} + +.sidebar-name { + color: #464646; + background-color: #f7fcfe; /* Fallback */ + background-image: -ms-linear-gradient(top, #ECF8FE, #f7fcfe); /* IE10 */ + background-image: -moz-linear-gradient(top, #ECF8FE, #f7fcfe); /* Firefox */ + background-image: -o-linear-gradient(top, #ECF8FE, #f7fcfe); /* Opera */ + background-image: -webkit-gradient(linear, left top, left bottom, from(#ECF8FE), to(#f7fcfe)); /* old Webkit */ + background-image: -webkit-linear-gradient(top, #ECF8FE, #f7fcfe); /* new Webkit */ + background-image: linear-gradient(top, #ECF8FE, #f7fcfe); /* proposed W3C Markup */ + text-shadow: #fff 0 1px 0; + border-color: #d0dfe9; + -moz-box-shadow: inset 0 1px 0 #fff; + -webkit-box-shadow: inset 0 1px 0 #fff; + box-shadow: inset 0 1px 0 #fff; +} + +.sidebar-name:hover, +#removing-widget { + color: #d54e21; +} + +#removing-widget span { + color: black; +} + +.sidebar-name-arrow { + background: transparent url(../images/arrows-vs.png) no-repeat 5px 9px; +} + +.sidebar-name:hover .sidebar-name-arrow { + background: transparent url(../images/arrows-dark-vs.png) no-repeat 5px 9px; +} + +.in-widget-title { + color: #606060; +} + +.deleting .widget-title * { + color: #aaa; +} + +.imgedit-menu div { + border-color: #d5d5d5; + background-color: #f1f1f1; +} + +.imgedit-menu div:hover { + border-color: #c1c1c1; + background-color: #eaeaea; +} + +.imgedit-menu div.disabled { + border-color: #ccc; + background-color: #ddd; + filter: alpha(opacity=50); + opacity: 0.5; +} + +#dashboard_recent_comments div.undo { + border-top-color: #dfdfdf; +} + +.comment-ays, +.comment-ays th { + border-color: #ddd; +} + +.comment-ays th { + background-color: #f1f1f1; +} + +/* added from nav-menu.css */ +#menu-management .menu-edit { + border-color: #d0dfe9; +} + +#post-body { + background: #ffffff; + border-top-color: #fff; + border-bottom-color: #d0dfe9; +} + +#nav-menu-header { + border-bottom-color: #d0dfe9; +} + +#nav-menu-footer { + border-top-color: #fff; +} + +#menu-management .nav-tabs-arrow a { + color: #C1C1C1; +} + +#menu-management .nav-tabs-arrow a:hover { + color: #D54E21; +} + +#menu-management .nav-tabs-arrow a:active { + color: #464646; +} + +#menu-management .nav-tab-active { + border-color: #dfdfdf; +} + +#menu-management .nav-tab { + background: #f7fcfe; + border-color: #d0dfe9; +} + +.js .input-with-default-title { + color: #aaa; +} + +#cancel-save { + color: #ff0000; +} + +#cancel-save:hover { + background-color: #FF0000; + color: #fff; +} + +.list-container { + border-color: #dfdfdf; +} + +.menu-item-handle { + border-color: #d0dfe9; +} + +.menu li.deleting .menu-item-handle { + background-color: #f66; + text-shadow: #ccc; +} + +.item-type { /* Menu item controls */ + color: #999999; +} + +.item-controls .menu-item-delete:hover { + color: #ff0000; +} + +.item-edit { + background: transparent url(../images/arrows-vs.png) no-repeat 8px 10px; + border-bottom-color: #eee; +} + +.item-edit:hover { + background: transparent url(../images/arrows-dark-vs.png) no-repeat 8px 10px; +} + +.menu-item-settings { /* Menu editing */ + border-color: #d0dfe9; +} + +.link-to-original { + color: #777; + border-color: #d0dfe9; +} + +#cancel-save:hover { + color: #fff !important; +} + +#update-menu-item { + color: #fff !important; +} + +#update-menu-item:hover, +#update-menu-item:active, +#update-menu-item:focus { + color: #eaf2fa !important; + border-color: #13455b !important; +} + +.submitbox .submitcancel { + color: #21759B; + border-bottom-color: #21759B; +} + +.submitbox .submitcancel:hover { + background: #21759B; + color: #fff; +} +/* end added from nav-menu.css */ + +#menu-management .nav-tab-active, +.menu-item-handle, +.menu-item-settings { + -moz-box-shadow: inset 0 1px 0 #fff; + -webkit-box-shadow: inset 0 1px 0 #fff; + box-shadow: inset 0 1px 0 #fff; +} + +#menu-management .nav-tab-active { + background: #eff8ff; + border-bottom-color: #eff8ff; +} + +/* custom header & background pages */ +#upload-form label { + color: #777; +} +/* custom header & background pages */ + +/* full screen */ +.fullscreen-overlay { + background: #fff; +} + +.wp-fullscreen-focus #wp-fullscreen-title, +.wp-fullscreen-focus #wp-fullscreen-container { + border-color: #BED1DD; +} + +#fullscreen-topbar { + border-bottom-color: #D1E5EE; +} diff --git a/src/wp-admin/css/colors-fresh-rtl.css b/src/wp-admin/css/colors-fresh-rtl.css new file mode 100644 index 0000000..bd5b114 --- /dev/null +++ b/src/wp-admin/css/colors-fresh-rtl.css @@ -0,0 +1 @@ +.bar{border-right-color:none;border-left-color:#99d;}.post-com-count{background-image:url(../images/bubble_bg-rtl.gif);}#user_info_arrow{background:transparent url(../images/arrows.png) no-repeat 0 5px;}#user_info:hover #user_info_arrow,#user_info.active #user_info_arrow{background:transparent url(../images/arrows-dark.png) no-repeat 0 5px;}#adminmenushadow,#adminmenuback{background-image:url(../images/menu-shadow-rtl.png);background-position:top left;}#adminmenu li.wp-has-current-submenu.wp-menu-open .wp-menu-toggle,#adminmenu li.wp-has-current-submenu:hover .wp-menu-toggle{background:transparent url(../images/arrows-dark.png) no-repeat 8px 6px;}#adminmenu .wp-has-submenu:hover .wp-menu-toggle,#adminmenu .wp-menu-open .wp-menu-toggle{background:transparent url(../images/arrows.png) no-repeat 8px 6px;}#adminmenu .wp-submenu .wp-submenu-head{border-right-color:none;border-left-color:#dfdfdf;}.folded #adminmenu .wp-submenu-wrap{-moz-box-shadow:-2px 2px 5px rgba(0,0,0,0.4);-webkit-box-shadow:-2px 2px 5px rgba(0,0,0,0.4);box-shadow:-2px 2px 5px rgba(0,0,0,0.4);}#collapse-button div{background-position:0 -108px;}.folded #collapse-button div{background-position:0 -72px;}.meta-box-sortables .postbox:hover .handlediv{background:transparent url(../images/arrows.png) no-repeat 6px 7px;}.tablenav .tablenav-pages a{border-color:#e3e3e3;background:#eee url('../images/menu-bits-rtl.gif?ver=20100610') repeat-x scroll right -379px;}#post-body .misc-pub-section{border-right-color:none;border-left-color:#eee;}#favorite-toggle{background:transparent url(../images/arrows.png) no-repeat 4px 2px;}#screen-meta a.show-settings,.toggle-arrow{background:transparent url(../images/arrows.png) no-repeat left 3px;}#screen-meta .screen-meta-active a.show-settings{background:transparent url(../images/arrows.png) no-repeat left -33px;}.sidebar-name-arrow{background:transparent url(../images/arrows.png) no-repeat 5px 9px;}.sidebar-name:hover .sidebar-name-arrow{background:transparent url(../images/arrows-dark.png) no-repeat 5px 9px;} \ No newline at end of file diff --git a/src/wp-admin/css/colors-fresh-rtl.dev.css b/src/wp-admin/css/colors-fresh-rtl.dev.css new file mode 100644 index 0000000..58ffe59 --- /dev/null +++ b/src/wp-admin/css/colors-fresh-rtl.dev.css @@ -0,0 +1,98 @@ +.bar { + border-right-color: none; + border-left-color: #99d; +} + +.post-com-count { + background-image: url(../images/bubble_bg-rtl.gif); +} + +#user_info_arrow { + background: transparent url(../images/arrows.png) no-repeat 0 5px; +} + +#user_info:hover #user_info_arrow, +#user_info.active #user_info_arrow { + background: transparent url(../images/arrows-dark.png) no-repeat 0 5px; +} + +/* editors */ + +/* menu */ + +#adminmenushadow, +#adminmenuback { + background-image: url(../images/menu-shadow-rtl.png); + background-position: top left; +} + +#adminmenu li.wp-has-current-submenu.wp-menu-open .wp-menu-toggle, +#adminmenu li.wp-has-current-submenu:hover .wp-menu-toggle { + background: transparent url(../images/arrows-dark.png) no-repeat 8px 6px; +} + +#adminmenu .wp-has-submenu:hover .wp-menu-toggle, +#adminmenu .wp-menu-open .wp-menu-toggle { + background: transparent url(../images/arrows.png) no-repeat 8px 6px; +} + + +#adminmenu .wp-submenu .wp-submenu-head { + border-right-color: none; + border-left-color: #dfdfdf; +} + +.folded #adminmenu .wp-submenu-wrap { + -moz-box-shadow: -2px 2px 5px rgba( 0, 0, 0, 0.4 ); + -webkit-box-shadow: -2px 2px 5px rgba( 0, 0, 0, 0.4 ); + box-shadow: -2px 2px 5px rgba( 0, 0, 0, 0.4 ); +} + +/* collapse menu button */ +#collapse-button div { + background-position: 0 -108px; +} +.folded #collapse-button div { + background-position: 0 -72px; +} + +/* edit image */ + +.meta-box-sortables .postbox:hover .handlediv { + background: transparent url(../images/arrows.png) no-repeat 6px 7px; +} + +.tablenav .tablenav-pages a { + border-color: #e3e3e3; + background: #eee url('../images/menu-bits-rtl.gif?ver=20100610') repeat-x scroll right -379px; +} + +#post-body .misc-pub-section { + border-right-color: none; + border-left-color: #eee; +} + +#favorite-toggle { + background: transparent url(../images/arrows.png) no-repeat 4px 2px; +} + +#screen-meta a.show-settings, +.toggle-arrow { + background: transparent url(../images/arrows.png) no-repeat left 3px; +} + +#screen-meta .screen-meta-active a.show-settings { + background: transparent url(../images/arrows.png) no-repeat left -33px; +} + +.sidebar-name-arrow { + background: transparent url(../images/arrows.png) no-repeat 5px 9px; +} +.sidebar-name:hover .sidebar-name-arrow { + background: transparent url(../images/arrows-dark.png) no-repeat 5px 9px; +} + + +/* custom header & background pages */ + +/* custom header & background pages */ diff --git a/src/wp-admin/css/colors-fresh.css b/src/wp-admin/css/colors-fresh.css new file mode 100644 index 0000000..760faee --- /dev/null +++ b/src/wp-admin/css/colors-fresh.css @@ -0,0 +1 @@ +html,.wp-dialog{background-color:#fff;}* html input,* html .widget{border-color:#dfdfdf;}textarea,input[type="text"],input[type="password"],input[type="file"],input[type="button"],input[type="submit"],input[type="reset"],select{border-color:#dfdfdf;background-color:#fff;}kbd,code{background:#eaeaea;}input[readonly]{background-color:#eee;}.find-box-search{border-color:#dfdfdf;background-color:#f1f1f1;}.find-box{background-color:#f1f1f1;}.find-box-inside{background-color:#fff;}a.page-numbers:hover{border-color:#999;}body,#wpbody,.form-table .pre{color:#333;}body>#upload-menu{border-bottom-color:#fff;}#postcustomstuff table,#your-profile fieldset,#rightnow,div.dashboard-widget,#dashboard-widgets p.dashboard-widget-links,#replyrow #ed_reply_toolbar input{border-color:#ccc;}#poststuff .inside label.spam,#poststuff .inside label.deleted{color:red;}#poststuff .inside label.waiting{color:orange;}#poststuff .inside label.approved{color:green;}#postcustomstuff table{border-color:#dfdfdf;background-color:#F9F9F9;}#postcustomstuff thead th{background-color:#F1F1F1;}#postcustomstuff table input,#postcustomstuff table textarea{border-color:#dfdfdf;background-color:#fff;}.widefat{border-color:#dfdfdf;background-color:#f9f9f9;}div.dashboard-widget-error{background-color:#c43;}div.dashboard-widget-notice{background-color:#cfe1ef;}div.dashboard-widget-submit{border-top-color:#ccc;}div.tabs-panel,.wp-tab-panel,ul.category-tabs li.tabs,ul.add-menu-item-tabs li.tabs,.wp-tab-active{border-color:#dfdfdf;background-color:#fff;}ul.category-tabs li.tabs,ul.add-menu-item-tabs li.tabs,.wp-tab-active{background-color:#fff;}input.disabled,textarea.disabled{background-color:#ccc;}#plugin-information .action-button a,#plugin-information .action-button a:hover,#plugin-information .action-button a:visited{color:#fff;}.widget .widget-top,.postbox h3,.stuffbox h3,.widefat thead tr th,.widefat tfoot tr th,h3.dashboard-widget-title,h3.dashboard-widget-title span,h3.dashboard-widget-title small,.find-box-head,.sidebar-name,#nav-menu-header,#nav-menu-footer,.menu-item-handle,#fullscreen-topbar{background-color:#f1f1f1;background-image:-ms-linear-gradient(top,#f9f9f9,#ececec);background-image:-moz-linear-gradient(top,#f9f9f9,#ececec);background-image:-o-linear-gradient(top,#f9f9f9,#ececec);background-image:-webkit-gradient(linear,left top,left bottom,from(#f9f9f9),to(#ececec));background-image:-webkit-linear-gradient(top,#f9f9f9,#ececec);background-image:linear-gradient(top,#f9f9f9,#ececec);}.widget .widget-top,.postbox h3,.stuffbox h3{border-bottom-color:#dfdfdf;text-shadow:#fff 0 1px 0;-moz-box-shadow:0 1px 0 #fff;-webkit-box-shadow:0 1px 0 #fff;box-shadow:0 1px 0 #fff;}.form-table th,.form-wrap label{color:#222;text-shadow:#fff 0 1px 0;}.description,.form-wrap p{color:#666;}strong .post-com-count span{background-color:#21759b;}.sorthelper{background-color:#ccf3fa;}.ac_match,.subsubsub a.current{color:#000;}.wrap h2{color:#464646;}.wrap .add-new-h2{background:#f1f1f1;}.subtitle{color:#777;}.ac_over{background-color:#f0f0b8;}.ac_results{background-color:#fff;border-color:#808080;}.ac_results li{color:#101010;}.alternate,.alt{background-color:#fcfcfc;}.available-theme a.screenshot{background-color:#f1f1f1;border-color:#ddd;}.bar{background-color:#e8e8e8;border-right-color:#99d;}#media-upload,#media-upload .media-item .slidetoggle{background:#fff;}#media-upload .slidetoggle{border-top-color:#dfdfdf;}div.error,.login #login_error{background-color:#ffebe8;border-color:#c00;}div.error a{color:#c00;}.form-invalid{background-color:#ffebe8!important;}.form-invalid input,.form-invalid select{border-color:#c00!important;}.submit{border-color:#DFDFDF;}.highlight{background-color:#e4f2fd;color:#000;}.howto,.nonessential,#edit-slug-box,.form-input-tip,.subsubsub{color:#666;}.media-item{border-bottom-color:#dfdfdf;}#wpbody-content #media-items .describe{border-top-color:#dfdfdf;}.media-upload-form label.form-help,td.help{color:#9a9a9a;}.post-com-count{background-image:url(../images/bubble_bg.gif);color:#fff;}.post-com-count span{background-color:#bbb;color:#fff;}.post-com-count:hover span{background-color:#d54e21;}.quicktags,.search{background-color:#ccc;color:#000;}.side-info h5{border-bottom-color:#dadada;}.side-info ul{color:#666;}.button,.button-secondary,.submit input,input[type=button],input[type=submit]{border-color:#bbb;color:#464646;}.button:hover,.button-secondary:hover,.submit input:hover,input[type=button]:hover,input[type=submit]:hover{color:#000;border-color:#666;}.button,.submit input,.button-secondary{background:#f2f2f2 url(../images/white-grad.png) repeat-x scroll left top;text-shadow:rgba(255,255,255,1) 0 1px 0;}.button:active,.submit input:active,.button-secondary:active{background:#eee url(../images/white-grad-active.png) repeat-x scroll left top;}input.button-primary,button.button-primary,a.button-primary{border-color:#298cba;font-weight:bold;color:#fff;background:#21759B url(../images/button-grad.png) repeat-x scroll left top;text-shadow:rgba(0,0,0,0.3) 0 -1px 0;}input.button-primary:active,button.button-primary:active,a.button-primary:active{background:#21759b url(../images/button-grad-active.png) repeat-x scroll left top;color:#eaf2fa;}input.button-primary:hover,button.button-primary:hover,a.button-primary:hover,a.button-primary:focus,a.button-primary:active{border-color:#13455b;color:#eaf2fa;}.button-disabled,.button[disabled],.button:disabled,.button-secondary[disabled],.button-secondary:disabled,a.button.disabled{color:#aaa!important;border-color:#ddd!important;}.button-primary-disabled,.button-primary[disabled],.button-primary:disabled{color:#9FD0D5!important;background:#298CBA!important;}a:hover,a:active,a:focus{color:#d54e21;}#wphead #viewsite a:hover,#adminmenu a:hover,#adminmenu ul.wp-submenu a:hover,#the-comment-list .comment a:hover,#rightnow a:hover,#media-upload a.del-link:hover,div.dashboard-widget-submit input:hover,.subsubsub a:hover,.subsubsub a.current:hover,.ui-tabs-nav a:hover,.plugins .inactive a:hover,#all-plugins-table .plugins .inactive a:hover,#search-plugins-table .plugins .inactive a:hover{color:#d54e21;}#the-comment-list .comment-item,#dashboard-widgets #dashboard_quick_press form p.submit{border-color:#dfdfdf;}#side-sortables .category-tabs .tabs a,#side-sortables .add-menu-item-tabs .tabs a,.wp-tab-bar .wp-tab-active a{color:#333;}#rightnow .rbutton{background-color:#ebebeb;color:#264761;}.submitbox .submit{background-color:#464646;color:#ccc;}.plugins a.delete:hover,#all-plugins-table .plugins a.delete:hover,#search-plugins-table .plugins a.delete:hover,.submitbox .submitdelete{color:#f00;border-bottom-color:#f00;}.submitbox .submitdelete:hover,#media-items a.delete:hover{color:#fff;background-color:#f00;border-bottom-color:#f00;}#normal-sortables .submitbox .submitdelete:hover{color:#000;background-color:#f00;border-bottom-color:#f00;}.tablenav .dots{border-color:transparent;}.tablenav .next,.tablenav .prev{border-color:transparent;color:#21759b;}.tablenav .next:hover,.tablenav .prev:hover{border-color:transparent;color:#d54e21;}div.updated,.login .message{background-color:#ffffe0;border-color:#e6db55;}.update-message{color:#000;}a.page-numbers{border-bottom-color:#B8D3E2;}.commentlist li{border-bottom-color:#ccc;}.widefat td,.widefat th{border-top-color:#fff;border-bottom-color:#dfdfdf;}.widefat th{text-shadow:rgba(255,255,255,0.8) 0 1px 0;}.widefat td{color:#555;}.widefat p,.widefat ol,.widefat ul{color:#333;}.widefat thead tr th,.widefat tfoot tr th,h3.dashboard-widget-title,h3.dashboard-widget-title span,h3.dashboard-widget-title small,.find-box-head{color:#333;}th.sortable a:hover,th.sortable a:active,th.sortable a:focus{color:#333;}h3.dashboard-widget-title small a{color:#d7d7d7;}h3.dashboard-widget-title small a:hover{color:#fff;}a,#adminmenu a,#poststuff #edButtonPreview,#poststuff #edButtonHTML,#the-comment-list p.comment-author strong a,#media-upload a.del-link,#media-items a.delete,.plugins a.delete,.ui-tabs-nav a{color:#21759b;}#adminmenu .awaiting-mod,#adminmenu .update-plugins,#sidemenu a .update-plugins,#rightnow .reallynow{background-color:#464646;color:#fff;-moz-box-shadow:rgba(255,255,255,0.5) 0 1px 0;-khtml-box-shadow:rgba(255,255,255,0.5) 0 1px 0;-webkit-box-shadow:rgba(255,255,255,0.5) 0 1px 0;box-shadow:rgba(255,255,255,0.5) 0 1px 0;}#plugin-information .action-button{background-color:#d54e21;color:#fff;}#adminmenu li.current a .awaiting-mod,#adminmenu li a.wp-has-current-submenu .update-plugins{background-color:#464646;color:#fff;-moz-box-shadow:rgba(255,255,255,0.5) 0 1px 0;-khtml-box-shadow:rgba(255,255,255,0.5) 0 1px 0;-webkit-box-shadow:rgba(255,255,255,0.5) 0 1px 0;box-shadow:rgba(255,255,255,0.5) 0 1px 0;}div#media-upload-header,div#plugin-information-header{background-color:#f9f9f9;border-bottom-color:#dfdfdf;}#currenttheme img{border-color:#666;}#dashboard_secondary div.dashboard-widget-content ul li a{background-color:#f9f9f9;}input.readonly,textarea.readonly{background-color:#ddd;}#ed_toolbar input,#ed_reply_toolbar input{background:#fff url("../images/fade-butt.png") repeat-x 0 -2px;}#editable-post-name{background-color:#fffbcc;}#edit-slug-box strong,.tablenav .displaying-num,#submitted-on,.submitted-on{color:#777;}.login #nav a,.login #backtoblog a{color:#21759b!important;}.login #nav a:hover,.login #backtoblog a:hover{color:#d54e21!important;}#footer{color:#777;border-color:#dfdfdf;}#media-items,.imgedit-group{border-color:#dfdfdf;}.checkbox,.side-info,.plugins tr,#your-profile #rich_editing{background-color:#fcfcfc;}.plugins .inactive,.plugins .inactive th,.plugins .inactive td,tr.inactive+tr.plugin-update-tr .plugin-update{background-color:#f4f4f4;}.plugin-update-tr .update-message{background-color:#fffbe4;border-color:#dfdfdf;}.plugins .active,.plugins .active th,.plugins .active td{color:#000;}.plugins .inactive a{color:#579;}#the-comment-list tr.undo,#the-comment-list div.undo{background-color:#f4f4f4;}#the-comment-list .unapproved{background-color:#ffffe0;}#the-comment-list .approve a{color:#006505;}#the-comment-list .unapprove a{color:#d98500;}table.widefat span.delete a,table.widefat span.trash a,table.widefat span.spam a,#dashboard_recent_comments .delete a,#dashboard_recent_comments .trash a,#dashboard_recent_comments .spam a{color:#bc0b0b;}.widget,#widget-list .widget-top,.postbox,#titlediv,#poststuff .postarea,.stuffbox{border-color:#dfdfdf;-moz-box-shadow:inset 0 1px 0 #fff;-webkit-box-shadow:inset 0 1px 0 #fff;box-shadow:inset 0 1px 0 #fff;-moz-border-radius:3px;-khtml-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;}.widget,#widget-list .widget-top,.postbox,.menu-item-settings{background-color:#f5f5f5;background-image:-ms-linear-gradient(top,#f9f9f9,#f5f5f5);background-image:-moz-linear-gradient(top,#f9f9f9,#f5f5f5);background-image:-o-linear-gradient(top,#f9f9f9,#f5f5f5);background-image:-webkit-gradient(linear,left top,left bottom,from(#f9f9f9),to(#f5f5f5));background-image:-webkit-linear-gradient(top,#f9f9f9,#f5f5f5);background-image:linear-gradient(top,#f9f9f9,#f5f5f5);}.postbox h3{color:#464646;}.widget .widget-top{color:#222;}.sidebar-name:hover h3,.postbox h3:hover{color:#000;}.curtime #timestamp{background-image:url(../images/date-button.gif);}#quicktags #ed_link{color:#00f;}#rightnow .youhave{background-color:#f0f6fb;}#rightnow a{color:#448abd;}.tagchecklist span a,#bulk-titles div a{background:url(../images/xit.gif) no-repeat;}.tagchecklist span a:hover,#bulk-titles div a:hover{background:url(../images/xit.gif) no-repeat -10px 0;}#update-nag,.update-nag{background-color:#FFFBCC;border-color:#E6DB55;color:#555;}.login #backtoblog a{color:#464646;}#wphead{border-bottom:#dfdfdf 1px solid;}#wphead h1 a{color:#464646;}#user_info{color:#555;}#user_info:hover,#user_info.active{color:#222;}#user_info.active{background-color:#f1f1f1;background-image:-ms-linear-gradient(bottom,#e9e9e9,#f9f9f9);background-image:-moz-linear-gradient(bottom,#e9e9e9,#f9f9f9);background-image:-o-linear-gradient(bottom,#e9e9e9,#f9f9f9);background-image:-webkit-gradient(linear,left bottom,left top,from(#e9e9e9),to(#f9f9f9));background-image:-webkit-linear-gradient(bottom,#e9e9e9,#f9f9f9);background-image:linear-gradient(bottom,#e9e9e9,#f9f9f9);border-color:#aaa #aaa #dfdfdf;}#user_info_arrow{background:transparent url(../images/arrows.png) no-repeat 6px 5px;}#user_info:hover #user_info_arrow,#user_info.active #user_info_arrow{background:transparent url(../images/arrows-dark.png) no-repeat 6px 5px;}#user_info_links{-moz-box-shadow:0 3px 2px -2px rgba(0,0,0,0.2);-webkit-box-shadow:0 3px 2px -2px rgba(0,0,0,0.2);box-shadow:0 3px 2px -2px rgba(0,0,0,0.2);}#user_info_links ul{background:#f1f1f1;border-color:#ccc #aaa #aaa;-moz-box-shadow:inset 0 1px 0 #f9f9f9;-webkit-box-shadow:inset 0 1px 0 #f9f9f9;box-shadow:inset 0 1px 0 #f9f9f9;}#user_info_links li:hover{background-color:#dfdfdf;}#user_info_links li:hover a,#user_info_links li a:hover{text-decoration:none;}#user_info a:link,#user_info a:visited,#footer a:link,#footer a:visited{text-decoration:none;}#footer a:hover{color:#000;text-decoration:underline;}div#media-upload-error,.file-error,abbr.required,.widget-control-remove:hover,table.widefat .delete a:hover,table.widefat .trash a:hover,table.widefat .spam a:hover,#dashboard_recent_comments .delete a:hover,#dashboard_recent_comments .trash a:hover #dashboard_recent_comments .spam a:hover{color:#f00;}#pass-strength-result{background-color:#eee;border-color:#ddd!important;}#pass-strength-result.bad{background-color:#ffb78c;border-color:#ff853c!important;}#pass-strength-result.good{background-color:#ffec8b;border-color:#fc0!important;}#pass-strength-result.short{background-color:#ffa0a0;border-color:#f04040!important;}#pass-strength-result.strong{background-color:#c3ff88;border-color:#8dff1c!important;}#quicktags{border-color:#ccc;background-color:#dfdfdf;background-image:url("../images/ed-bg.gif");}#ed_toolbar input{border-color:#C3C3C3;}#ed_toolbar input:hover{border-color:#aaa;background:#ddd;}#poststuff .wp_themeSkin .mceStatusbar{border-color:#dfdfdf;}#poststuff .wp_themeSkin .mceStatusbar *{color:#555;}#poststuff #edButtonPreview,#poststuff #edButtonHTML{background-color:#f1f1f1;border-color:#dfdfdf #dfdfdf #ccc;color:#999;}#poststuff #editor-toolbar .active{border-color:#ccc #ccc #e9e9e9;background-color:#e9e9e9;color:#333;}#post-status-info{background-color:#EDEDED;}.wp_themeSkin *,.wp_themeSkin a:hover,.wp_themeSkin a:link,.wp_themeSkin a:visited,.wp_themeSkin a:active{color:#000;}.wp_themeSkin table.mceLayout{border-color:#ccc #ccc #dfdfdf;}#editorcontainer #content,#editorcontainer .wp_themeSkin .mceIframeContainer{-moz-box-shadow:inset 1px 1px 2px rgba(0,0,0,0.1);-webkit-box-shadow:inset 1px 1px 2px rgba(0,0,0,0.1);box-shadow:inset 1px 1px 2px rgba(0,0,0,0.1);}.wp_themeSkin iframe{background:transparent;}.wp_themeSkin .mceStatusbar{color:#000;background-color:#f5f5f5;}.wp_themeSkin .mceButton{border-color:#ccc;background-color:#eee;background-image:-ms-linear-gradient(bottom,#ddd,#fff);background-image:-moz-linear-gradient(bottom,#ddd,#fff);background-image:-o-linear-gradient(bottom,#ddd,#fff);background-image:-webkit-gradient(linear,left bottom,left top,from(#ddd),to(#fff));background-image:-webkit-linear-gradient(bottom,#ddd,#fff);background-image:linear-gradient(bottom,#ddd,#fff);}.wp_themeSkin a.mceButtonEnabled:hover{border-color:#a0a0a0;background:#ddd;background-image:-ms-linear-gradient(bottom,#ccc,#fff);background-image:-moz-linear-gradient(bottom,#ccc,#fff);background-image:-o-linear-gradient(bottom,#ccc,#fff);background-image:-webkit-gradient(linear,left bottom,left top,from(#ccc),to(#fff));background-image:-webkit-linear-gradient(bottom,#ccc,#fff);background-image:linear-gradient(bottom,#ccc,#fff);}.wp_themeSkin a.mceButton:active,.wp_themeSkin a.mceButtonEnabled:active,.wp_themeSkin a.mceButtonSelected:active,.wp_themeSkin a.mceButtonActive,.wp_themeSkin a.mceButtonActive:active,.wp_themeSkin a.mceButtonActive:hover{background-color:#ddd;background-image:-ms-linear-gradient(bottom,#eee,#bbb);background-image:-moz-linear-gradient(bottom,#eee,#bbb);background-image:-o-linear-gradient(bottom,#eee,#bbb);background-image:-webkit-gradient(linear,left bottom,left top,from(#eee),to(#bbb));background-image:-webkit-linear-gradient(bottom,#eee,#bbb);background-image:linear-gradient(bottom,#eee,#bbb);border-color:#909090;}.wp_themeSkin .mceButtonDisabled{border-color:#ccc!important;}.wp_themeSkin .mceListBox .mceText,.wp_themeSkin .mceListBox .mceOpen{border-color:#ccc;background-color:#eee;background-image:-ms-linear-gradient(bottom,#ddd,#fff);background-image:-moz-linear-gradient(bottom,#ddd,#fff);background-image:-o-linear-gradient(bottom,#ddd,#fff);background-image:-webkit-gradient(linear,left bottom,left top,from(#ddd),to(#fff));background-image:-webkit-linear-gradient(bottom,#ddd,#fff);background-image:linear-gradient(bottom,#ddd,#fff);}.wp_themeSkin .mceListBox .mceOpen{border-left:0!important;}.wp_themeSkin table.mceListBoxEnabled:hover .mceOpen,.wp_themeSkin .mceListBoxHover .mceOpen,.wp_themeSkin .mceListBoxHover:active .mceOpen,.wp_themeSkin .mceListBoxSelected .mceOpen,.wp_themeSkin .mceListBoxSelected .mceText,.wp_themeSkin table.mceListBoxEnabled:active .mceText{background:#ccc;border-color:#999;}.wp_themeSkin table.mceListBoxEnabled:hover .mceText,.wp_themeSkin .mceListBoxHover .mceText,.wp_themeSkin table.mceListBoxEnabled:hover .mceOpen,.wp_themeSkin .mceListBoxHover .mceOpen{border-color:#909090;background-color:#eee;background-image:-ms-linear-gradient(bottom,#ccc,#fff);background-image:-moz-linear-gradient(bottom,#ccc,#fff);background-image:-o-linear-gradient(bottom,#ccc,#fff);background-image:-webkit-gradient(linear,left bottom,left top,from(#ccc),to(#fff));background-image:-webkit-linear-gradient(bottom,#ccc,#fff);background-image:linear-gradient(bottom,#ccc,#fff);}.wp_themeSkin select.mceListBox{border-color:#B2B2B2;background-color:#fff;}.wp_themeSkin .mceSplitButton a.mceAction,.wp_themeSkin .mceSplitButton a.mceOpen{border-color:#ccc;}.wp_themeSkin .mceSplitButton a.mceOpen:hover,.wp_themeSkin .mceSplitButtonSelected a.mceOpen,.wp_themeSkin table.mceSplitButtonEnabled:hover a.mceAction,.wp_themeSkin .mceSplitButton a.mceAction:hover{border-color:#909090;}.wp_themeSkin table.mceSplitButton td{background-color:#eee;background-image:-ms-linear-gradient(bottom,#ddd,#fff);background-image:-moz-linear-gradient(bottom,#ddd,#fff);background-image:-o-linear-gradient(bottom,#ddd,#fff);background-image:-webkit-gradient(linear,left bottom,left top,from(#ddd),to(#fff));background-image:-webkit-linear-gradient(bottom,#ddd,#fff);background-image:linear-gradient(bottom,#ddd,#fff);}.wp_themeSkin table.mceSplitButton:hover td{background-image:-ms-linear-gradient(bottom,#ccc,#fff);background-image:-moz-linear-gradient(bottom,#ccc,#fff);background-image:-o-linear-gradient(bottom,#ccc,#fff);background-image:-webkit-gradient(linear,left bottom,left top,from(#ccc),to(#fff));background-image:-webkit-linear-gradient(bottom,#ccc,#fff);background-image:linear-gradient(bottom,#ccc,#fff);}.wp_themeSkin .mceSplitButtonActive{background-color:#B2B2B2;}.wp_themeSkin div.mceColorSplitMenu table{background-color:#ebebeb;border-color:#B2B2B2;}.wp_themeSkin .mceColorSplitMenu a{border-color:#B2B2B2;}.wp_themeSkin .mceColorSplitMenu a.mceMoreColors{border-color:#fff;}.wp_themeSkin .mceColorSplitMenu a.mceMoreColors:hover{border-color:#0A246A;background-color:#B6BDD2;}.wp_themeSkin a.mceMoreColors:hover{border-color:#0A246A;}.wp_themeSkin .mceMenu{border-color:#ddd;}.wp_themeSkin .mceMenu table{background-color:#ebeaeb;}.wp_themeSkin .mceMenu .mceText{color:#000;}.wp_themeSkin .mceMenu .mceMenuItemEnabled a:hover,.wp_themeSkin .mceMenu .mceMenuItemActive{background-color:#f5f5f5;}.wp_themeSkin td.mceMenuItemSeparator{background-color:#aaa;}.wp_themeSkin .mceMenuItemTitle a{background-color:#ccc;border-bottom-color:#aaa;}.wp_themeSkin .mceMenuItemTitle span.mceText{color:#000;}.wp_themeSkin .mceMenuItemDisabled .mceText{color:#888;}.wp_themeSkin tr.mceFirst td.mceToolbar{background:#dfdfdf url("../images/ed-bg.gif") repeat-x scroll left top;border-color:#ccc;}.wp-admin #mceModalBlocker{background:#000;}.wp-admin .clearlooks2 .mceFocus .mceTop .mceLeft{background:#444;border-left:1px solid #999;border-top:1px solid #999;-moz-border-radius:3px 0 0 0;-webkit-border-top-left-radius:3px;-khtml-border-top-left-radius:3px;border-top-left-radius:3px;}.wp-admin .clearlooks2 .mceFocus .mceTop .mceRight{background:#444;border-right:1px solid #999;border-top:1px solid #999;border-top-right-radius:3px;-khtml-border-top-right-radius:3px;-webkit-border-top-right-radius:3px;-moz-border-radius:0 3px 0 0;}.wp-admin .clearlooks2 .mceMiddle .mceLeft{background:#f1f1f1;border-left:1px solid #999;}.wp-admin .clearlooks2 .mceMiddle .mceRight{background:#f1f1f1;border-right:1px solid #999;}.wp-admin .clearlooks2 .mceBottom{background:#f1f1f1;border-bottom:1px solid #999;}.wp-admin .clearlooks2 .mceBottom .mceLeft{background:#f1f1f1;border-bottom:1px solid #999;border-left:1px solid #999;}.wp-admin .clearlooks2 .mceBottom .mceCenter{background:#f1f1f1;border-bottom:1px solid #999;}.wp-admin .clearlooks2 .mceBottom .mceRight{background:#f1f1f1;border-bottom:1px solid #999;border-right:1px solid #999;}.wp-admin .clearlooks2 .mceFocus .mceTop span{color:#e5e5e5;}#titlediv #title{border-color:#ccc;}#editorcontainer{border-color:#ccc #ccc #dfdfdf;}#post-status-info{border-color:#dfdfdf #ccc #ccc;}.editwidget .widget-inside{border-color:#dfdfdf;}#titlediv #title{background-color:#fff;}#tTips p#tTips_inside{background-color:#ddd;color:#333;}#timestampdiv input,#namediv input,#poststuff .inside .the-tagcloud{border-color:#ddd;}#adminmenuback,#adminmenuwrap{background-color:#ececec;border-color:#ccc;}#adminmenushadow,#adminmenuback{background-image:url(../images/menu-shadow.png);background-position:top right;background-repeat:repeat-y;}#adminmenu li.wp-menu-separator{background:#dfdfdf;border-color:#cfcfcf;}#adminmenu div.separator{border-color:#e1e1e1;}#adminmenu li.wp-has-current-submenu.wp-menu-open .wp-menu-toggle,#adminmenu li.wp-has-current-submenu:hover .wp-menu-toggle{background:transparent url(../images/arrows-dark.png) no-repeat -1px 6px;}#adminmenu .wp-has-submenu:hover .wp-menu-toggle,#adminmenu .wp-menu-open .wp-menu-toggle{background:transparent url(../images/arrows.png) no-repeat -2px 6px;}#adminmenu a.menu-top,.folded #adminmenu li.menu-top,#adminmenu .wp-submenu .wp-submenu-head{border-top-color:#f9f9f9;border-bottom-color:#dfdfdf;}#adminmenu li.wp-menu-open{border-color:#dfdfdf;}#adminmenu li.wp-has-current-submenu a.wp-has-current-submenu,#adminmenu li.current a.menu-top,.folded #adminmenu li.wp-has-current-submenu,.folded #adminmenu li.current.menu-top,#adminmenu .wp-menu-arrow,#adminmenu .wp-has-current-submenu .wp-submenu .wp-submenu-head{background-color:#777;background-image:-ms-linear-gradient(bottom,#6d6d6d,#808080);background-image:-moz-linear-gradient(bottom,#6d6d6d,#808080);background-image:-o-linear-gradient(bottom,#6d6d6d,#808080);background-image:-webkit-gradient(linear,left bottom,left top,from(#6d6d6d),to(#808080));background-image:-webkit-linear-gradient(bottom,#6d6d6d,#808080);background-image:linear-gradient(bottom,#6d6d6d,#808080);}#adminmenu li.wp-has-current-submenu a.wp-has-current-submenu,#adminmenu li.current a.menu-top,#adminmenu .wp-has-current-submenu .wp-submenu .wp-submenu-head{text-shadow:0 -1px 0 #333;color:#fff;border-top-color:#808080;border-bottom-color:#6d6d6d;}.folded #adminmenu li.wp-has-current-submenu,.folded #adminmenu li.current.menu-top{border-top-color:#808080;border-bottom-color:#6d6d6d;}#adminmenu .wp-submenu a:hover{background-color:#EAF2FA!important;color:#333!important;}#adminmenu .wp-submenu li.current,#adminmenu .wp-submenu li.current a,#adminmenu .wp-submenu li.current a:hover{color:#333;}#adminmenu .wp-submenu ul{background-color:#fff;}.folded #adminmenu .wp-submenu-wrap,.folded #adminmenu .wp-submenu ul{border-color:#dfdfdf;}.folded #adminmenu .wp-submenu-wrap{-moz-box-shadow:2px 2px 5px rgba(0,0,0,0.4);-webkit-box-shadow:2px 2px 5px rgba(0,0,0,0.4);box-shadow:2px 2px 5px rgba(0,0,0,0.4);}#adminmenu .wp-submenu .wp-submenu-head{border-right-color:#dfdfdf;background-color:#ececec;}#adminmenu div.wp-submenu{background-color:transparent;}#collapse-menu{color:#aaa;}#collapse-menu:hover{color:#999;}#collapse-button{border-color:#ccc;background-color:#f4f4f4;background-image:-ms-linear-gradient(bottom,#dfdfdf,#fff);background-image:-moz-linear-gradient(bottom,#dfdfdf,#fff);background-image:-o-linear-gradient(bottom,#dfdfdf,#fff);background-image:-webkit-gradient(linear,left bottom,left top,from(#dfdfdf),to(#fff));background-image:-webkit-linear-gradient(bottom,#dfdfdf,#fff);background-image:linear-gradient(bottom,#dfdfdf,#fff);}#collapse-menu:hover #collapse-button{border-color:#aaa;}#collapse-button div{background:transparent url(../images/arrows.png) no-repeat 0 -72px;}.folded #collapse-button div{background-position:0 -108px;}#adminmenu .menu-icon-dashboard div.wp-menu-image{background:transparent url('../images/menu.png?ver=20100531') no-repeat scroll -60px -33px;}#adminmenu .menu-icon-dashboard:hover div.wp-menu-image,#adminmenu .menu-icon-dashboard.wp-has-current-submenu div.wp-menu-image,#adminmenu .menu-icon-dashboard.current div.wp-menu-image{background:transparent url('../images/menu.png?ver=20100531') no-repeat scroll -60px -1px;}#adminmenu .menu-icon-post div.wp-menu-image{background:transparent url('../images/menu.png?ver=20100531') no-repeat scroll -271px -33px;}#adminmenu .menu-icon-post:hover div.wp-menu-image,#adminmenu .menu-icon-post.wp-has-current-submenu div.wp-menu-image{background:transparent url('../images/menu.png?ver=20100531') no-repeat scroll -271px -1px;}#adminmenu .menu-icon-media div.wp-menu-image{background:transparent url('../images/menu.png?ver=20100531') no-repeat scroll -120px -33px;}#adminmenu .menu-icon-media:hover div.wp-menu-image,#adminmenu .menu-icon-media.wp-has-current-submenu div.wp-menu-image{background:transparent url('../images/menu.png?ver=20100531') no-repeat scroll -120px -1px;}#adminmenu .menu-icon-links div.wp-menu-image{background:transparent url('../images/menu.png?ver=20100531') no-repeat scroll -90px -33px;}#adminmenu .menu-icon-links:hover div.wp-menu-image,#adminmenu .menu-icon-links.wp-has-current-submenu div.wp-menu-image{background:transparent url('../images/menu.png?ver=20100531') no-repeat scroll -90px -1px;}#adminmenu .menu-icon-page div.wp-menu-image{background:transparent url('../images/menu.png?ver=20100531') no-repeat scroll -150px -33px;}#adminmenu .menu-icon-page:hover div.wp-menu-image,#adminmenu .menu-icon-page.wp-has-current-submenu div.wp-menu-image{background:transparent url('../images/menu.png?ver=20100531') no-repeat scroll -150px -1px;}#adminmenu .menu-icon-comments div.wp-menu-image{background:transparent url('../images/menu.png?ver=20100531') no-repeat scroll -30px -33px;}#adminmenu .menu-icon-comments:hover div.wp-menu-image,#adminmenu .menu-icon-comments.wp-has-current-submenu div.wp-menu-image,#adminmenu .menu-icon-comments.current div.wp-menu-image{background:transparent url('../images/menu.png?ver=20100531') no-repeat scroll -30px -1px;}#adminmenu .menu-icon-appearance div.wp-menu-image{background:transparent url('../images/menu.png?ver=20100531') no-repeat scroll 0 -33px;}#adminmenu .menu-icon-appearance:hover div.wp-menu-image,#adminmenu .menu-icon-appearance.wp-has-current-submenu div.wp-menu-image{background:transparent url('../images/menu.png?ver=20100531') no-repeat scroll 0 -1px;}#adminmenu .menu-icon-plugins div.wp-menu-image{background:transparent url('../images/menu.png?ver=20100531') no-repeat scroll -180px -33px;}#adminmenu .menu-icon-plugins:hover div.wp-menu-image,#adminmenu .menu-icon-plugins.wp-has-current-submenu div.wp-menu-image{background:transparent url('../images/menu.png?ver=20100531') no-repeat scroll -180px -1px;}#adminmenu .menu-icon-users div.wp-menu-image{background:transparent url('../images/menu.png?ver=20100531') no-repeat scroll -300px -33px;}#adminmenu .menu-icon-users:hover div.wp-menu-image,#adminmenu .menu-icon-users.wp-has-current-submenu div.wp-menu-image,#adminmenu .menu-icon-users.current div.wp-menu-image{background:transparent url('../images/menu.png?ver=20100531') no-repeat scroll -300px -1px;}#adminmenu .menu-icon-tools div.wp-menu-image{background:transparent url('../images/menu.png?ver=20100531') no-repeat scroll -210px -33px;}#adminmenu .menu-icon-tools:hover div.wp-menu-image,#adminmenu .menu-icon-tools.wp-has-current-submenu div.wp-menu-image,#adminmenu .menu-icon-tools.current div.wp-menu-image{background:transparent url('../images/menu.png?ver=20100531') no-repeat scroll -210px -1px;}#icon-options-general,#adminmenu .menu-icon-settings div.wp-menu-image{background:transparent url('../images/menu.png?ver=20100531') no-repeat scroll -240px -33px;}#adminmenu .menu-icon-settings:hover div.wp-menu-image,#adminmenu .menu-icon-settings.wp-has-current-submenu div.wp-menu-image{background:transparent url('../images/menu.png?ver=20100531') no-repeat scroll -240px -1px;}#adminmenu .menu-icon-site div.wp-menu-image{background:transparent url('../images/menu.png?ver=20100531') no-repeat scroll -360px -33px;}#adminmenu .menu-icon-site:hover div.wp-menu-image,#adminmenu .menu-icon-site.wp-has-current-submenu div.wp-menu-image{background:transparent url('../images/menu.png?ver=20100531') no-repeat scroll -360px -1px;}#icon-edit,#icon-post{background:transparent url(../images/icons32.png?ver=20100531) no-repeat -552px -5px;}#icon-index{background:transparent url(../images/icons32.png?ver=20100531) no-repeat -137px -5px;}#icon-upload{background:transparent url(../images/icons32.png?ver=20100531) no-repeat -251px -5px;}#icon-link-manager,#icon-link,#icon-link-category{background:transparent url(../images/icons32.png?ver=20100531) no-repeat -190px -5px;}#icon-edit-pages,#icon-page{background:transparent url(../images/icons32.png?ver=20100531) no-repeat -312px -5px;}#icon-edit-comments{background:transparent url(../images/icons32.png?ver=20100531) no-repeat -72px -5px;}#icon-themes{background:transparent url(../images/icons32.png?ver=20100531) no-repeat -11px -5px;}#icon-plugins{background:transparent url(../images/icons32.png?ver=20100531) no-repeat -370px -5px;}#icon-users,#icon-profile,#icon-user-edit{background:transparent url(../images/icons32.png?ver=20100531) no-repeat -600px -5px;}#icon-tools,#icon-admin{background:transparent url(../images/icons32.png?ver=20100531) no-repeat -432px -5px;}#icon-options-general{background:transparent url(../images/icons32.png?ver=20100531) no-repeat -492px -5px;}#icon-ms-admin{background:transparent url(../images/icons32.png?ver=20100531) no-repeat -659px -5px;}table.diff .diff-deletedline{background-color:#fdd;}table.diff .diff-deletedline del{background-color:#f99;}table.diff .diff-addedline{background-color:#dfd;}table.diff .diff-addedline ins{background-color:#9f9;}#att-info{background-color:#E4F2FD;}#sidemenu a{background-color:#f9f9f9;border-color:#f9f9f9;border-bottom-color:#dfdfdf;}#sidemenu a.current{background-color:#fff;border-color:#dfdfdf #dfdfdf #fff;color:#D54E21;}#screen-options-wrap,#contextual-help-wrap{background-color:#f1f1f1;border-color:#dfdfdf;}#screen-options-link-wrap,#contextual-help-link-wrap{background-color:#e3e3e3;border-right:1px solid transparent;border-left:1px solid transparent;border-bottom:1px solid transparent;background-image:-ms-linear-gradient(bottom,#dfdfdf,#f1f1f1);background-image:-moz-linear-gradient(bottom,#dfdfdf,#f1f1f1);background-image:-o-linear-gradient(bottom,#dfdfdf,#f1f1f1);background-image:-webkit-gradient(linear,left bottom,left top,from(#dfdfdf),to(#f1f1f1));background-image:-webkit-linear-gradient(bottom,#dfdfdf,#f1f1f1);background-image:linear-gradient(bottom,#dfdfdf,#f1f1f1);}#screen-meta-links a.show-settings{color:#777;}#screen-meta-links a.show-settings:hover{color:#000;}#replysubmit{background-color:#f1f1f1;border-top-color:#ddd;}#replyerror{border-color:#ddd;background-color:#f9f9f9;}#edithead,#replyhead{background-color:#f1f1f1;}#ed_reply_toolbar{background-color:#e9e9e9;}.vim-current,.vim-current th,.vim-current td{background-color:#E4F2FD!important;}.star-average,.star.star-rating{background-color:#fc0;}div.star.select:hover{background-color:#d00;}div.star img{border-left:1px solid #fff;border-right:1px solid #fff;}.widefat div.star img{border-left:1px solid #f9f9f9;border-right:1px solid #f9f9f9;}#plugin-information .fyi ul{background-color:#eaf3fa;}#plugin-information .fyi h2.mainheader{background-color:#cee1ef;}#plugin-information pre,#plugin-information code{background-color:#ededff;}#plugin-information pre{border:1px solid #ccc;}.inline-edit-row fieldset input[type="text"],.inline-edit-row fieldset textarea,#bulk-titles,#replyrow input{border-color:#ddd;}.inline-editor div.title{background-color:#EAF3FA;}.inline-editor ul.cat-checklist{background-color:#fff;border-color:#ddd;}.inline-editor .categories .catshow,.inline-editor .categories .cathide{color:#21759b;}.inline-editor .quick-edit-save{background-color:#f1f1f1;}#replyrow #ed_reply_toolbar input:hover{border-color:#aaa;background:#ddd;}fieldset.inline-edit-col-right .inline-edit-col{border-color:#dfdfdf;}.attention{color:#D54E21;}.meta-box-sortables .postbox:hover .handlediv{background:transparent url(../images/arrows.png) no-repeat 6px 7px;}.tablenav .tablenav-pages{color:#555;}.tablenav .tablenav-pages a{border-color:#e3e3e3;background:#eee url('../images/menu-bits.gif?ver=20100610') repeat-x scroll left -379px;}.tablenav .tablenav-pages a:hover,.tablenav .tablenav-pages a:focus{color:#d54e21;}.tablenav .tablenav-pages a.disabled,.tablenav .tablenav-pages a.disabled:hover,.tablenav .tablenav-pages a.disabled:focus{color:#aaa;}.tablenav .tablenav-pages .current{background:#dfdfdf;border-color:#d3d3d3;}#availablethemes,#availablethemes td{border-color:#ddd;}#current-theme img{border-color:#999;}#TB_window #TB_title a.tb-theme-preview-link,#TB_window #TB_title a.tb-theme-preview-link:visited{color:#999;}#TB_window #TB_title a.tb-theme-preview-link:hover,#TB_window #TB_title a.tb-theme-preview-link:focus{color:#ccc;}.misc-pub-section{border-top-color:#fff;border-bottom-color:#dfdfdf;}#minor-publishing{border-bottom-color:#dfdfdf;}#post-body .misc-pub-section{border-right-color:#eee;}.post-com-count span{background-color:#bbb;}.form-table .color-palette td{border-color:#fff;}.sortable-placeholder{border-color:#bbb;background-color:#f5f5f5;}#post-body ul.category-tabs li.tabs a,#post-body ul.add-menu-item-tabs li.tabs a,body.press-this ul.category-tabs li.tabs a{color:#333;}#wp_editimgbtn,#wp_delimgbtn,#wp_editgallery,#wp_delgallery{border-color:#999;background-color:#eee;}#wp_editimgbtn:hover,#wp_delimgbtn:hover,#wp_editgallery:hover,#wp_delgallery:hover{border-color:#555;background-color:#ccc;}#favorite-first{border-color:#c0c0c0;background:#f1f1f1;background:-moz-linear-gradient(bottom,#e7e7e7,#fff);background:-webkit-gradient(linear,left bottom,left top,from(#e7e7e7),to(#fff));}#favorite-inside{border-color:#c0c0c0;background-color:#fff;}#favorite-toggle{background:transparent url(../images/arrows.png) no-repeat 4px 2px;border-color:#dfdfdf;-moz-box-shadow:inset 1px 0 0 #fff;-webkit-box-shadow:inset 1px 0 0 #fff;box-shadow:inset 1px 0 0 #fff;}#favorite-actions a{color:#464646;}#favorite-actions a:hover{color:#000;}#favorite-inside a:hover{text-decoration:underline;}#screen-meta a.show-settings,.toggle-arrow{background:transparent url(../images/arrows.png) no-repeat right 3px;}#screen-meta .screen-meta-active a.show-settings{background:transparent url(../images/arrows.png) no-repeat right -33px;}.view-switch #view-switch-list{background:transparent url(../images/list.png) no-repeat 0 0;}.view-switch .current #view-switch-list{background:transparent url(../images/list.png) no-repeat -40px 0;}.view-switch #view-switch-excerpt{background:transparent url(../images/list.png) no-repeat -20px 0;}.view-switch .current #view-switch-excerpt{background:transparent url(../images/list.png) no-repeat -60px 0;}#header-logo{background:transparent url(../images/wp-logo.png?ver=20110504) no-repeat scroll center center;}.popular-tags,.feature-filter{background-color:#fff;border-color:#DFDFDF;}#theme-information .action-button{border-top-color:#DFDFDF;}.theme-listing br.line{border-bottom-color:#ccc;}div.widgets-sortables,#widgets-left .inactive{background-color:#fcfcfc;border-color:#dfdfdf;}#available-widgets .widget-holder{background-color:#fcfcfc;border-color:#dfdfdf;}#available-widgets .widget-description{color:#555;}.sidebar-name{color:#464646;text-shadow:#fff 0 1px 0;border-color:#dfdfdf;-moz-box-shadow:inset 0 1px 0 #fff;-webkit-box-shadow:inset 0 1px 0 #fff;box-shadow:inset 0 1px 0 #fff;}.sidebar-name:hover,#removing-widget{color:#d54e21;}#removing-widget span{color:black;}.sidebar-name-arrow{background:transparent url(../images/arrows.png) no-repeat 5px 9px;}.sidebar-name:hover .sidebar-name-arrow{background:transparent url(../images/arrows-dark.png) no-repeat 5px 9px;}.in-widget-title{color:#606060;}.deleting .widget-title *{color:#aaa;}.imgedit-menu div{border-color:#d5d5d5;background-color:#f1f1f1;}.imgedit-menu div:hover{border-color:#c1c1c1;background-color:#eaeaea;}.imgedit-menu div.disabled{border-color:#ccc;background-color:#ddd;filter:alpha(opacity=50);opacity:.5;}#dashboard_recent_comments div.undo{border-top-color:#dfdfdf;}.comment-ays,.comment-ays th{border-color:#ddd;}.comment-ays th{background-color:#f1f1f1;}#menu-management .menu-edit{border-color:#dfdfdf;}#post-body{background:#fff;border-top-color:#fff;border-bottom-color:#dfdfdf;}#nav-menu-header{border-bottom-color:#dfdfdf;}#nav-menu-footer{border-top-color:#fff;}#menu-management .nav-tabs-arrow a{color:#C1C1C1;}#menu-management .nav-tabs-arrow a:hover{color:#D54E21;}#menu-management .nav-tabs-arrow a:active{color:#464646;}#menu-management .nav-tab-active{border-color:#dfdfdf;}#menu-management .nav-tab{background:#fbfbfb;border-color:#dfdfdf;}.js .input-with-default-title{color:#aaa;}#cancel-save{color:#f00;}#cancel-save:hover{background-color:#F00;color:#fff;}.list-container{border-color:#DFDFDF;}.menu-item-handle{border-color:#dfdfdf;}.menu li.deleting .menu-item-handle{background-color:#f66;text-shadow:#ccc;}.item-type{color:#999;}.item-controls .menu-item-delete:hover{color:#f00;}.item-edit{background:transparent url(../images/arrows.png) no-repeat 8px 10px;border-bottom-color:#eee;}.item-edit:hover{background:transparent url(../images/arrows-dark.png) no-repeat 8px 10px;}.menu-item-settings{border-color:#dfdfdf;}.link-to-original{color:#777;border-color:#dfdfdf;}#cancel-save:hover{color:#fff!important;}#update-menu-item{color:#fff!important;}#update-menu-item:hover,#update-menu-item:active,#update-menu-item:focus{color:#eaf2fa!important;border-color:#13455b!important;}.submitbox .submitcancel{color:#21759B;border-bottom-color:#21759B;}.submitbox .submitcancel:hover{background:#21759B;color:#fff;}#menu-management .nav-tab-active,.menu-item-handle,.menu-item-settings{-moz-box-shadow:inset 0 1px 0 #fff;-webkit-box-shadow:inset 0 1px 0 #fff;box-shadow:inset 0 1px 0 #fff;}#menu-management .nav-tab-active{background:#f9f9f9;border-bottom-color:#f9f9f9;}#upload-form label{color:#777;}.fullscreen-overlay{background:#fff;}.wp-fullscreen-focus #wp-fullscreen-title,.wp-fullscreen-focus #wp-fullscreen-container{border-color:#ccc;}#fullscreen-topbar{border-bottom-color:#DFDFDF;} \ No newline at end of file diff --git a/src/wp-admin/css/colors-fresh.dev.css b/src/wp-admin/css/colors-fresh.dev.css new file mode 100644 index 0000000..eb86042 --- /dev/null +++ b/src/wp-admin/css/colors-fresh.dev.css @@ -0,0 +1,2091 @@ +html, +.wp-dialog { + background-color: #fff; +} + +* html input, +* html .widget { + border-color: #dfdfdf; +} + +textarea, +input[type="text"], +input[type="password"], +input[type="file"], +input[type="button"], +input[type="submit"], +input[type="reset"], +select { + border-color: #dfdfdf; + background-color: #fff; +} + +kbd, +code { + background: #eaeaea; +} + +input[readonly] { + background-color: #eee; +} + +.find-box-search { + border-color: #dfdfdf; + background-color: #f1f1f1; +} + +.find-box { + background-color: #f1f1f1; +} + +.find-box-inside { + background-color: #fff; +} + +a.page-numbers:hover { + border-color: #999; +} + +body, +#wpbody, +.form-table .pre { + color: #333; +} + +body > #upload-menu { + border-bottom-color: #fff; +} + +#postcustomstuff table, +#your-profile fieldset, +#rightnow, +div.dashboard-widget, +#dashboard-widgets p.dashboard-widget-links, +#replyrow #ed_reply_toolbar input { + border-color: #ccc; +} + +#poststuff .inside label.spam, +#poststuff .inside label.deleted { + color: red; +} + +#poststuff .inside label.waiting { + color: orange; +} + +#poststuff .inside label.approved { + color: green; +} + +#postcustomstuff table { + border-color: #dfdfdf; + background-color: #F9F9F9; +} + +#postcustomstuff thead th { + background-color: #F1F1F1; +} + +#postcustomstuff table input, +#postcustomstuff table textarea { + border-color: #dfdfdf; + background-color: #fff; +} + +.widefat { + border-color: #dfdfdf; + background-color: #f9f9f9; +} + +div.dashboard-widget-error { + background-color: #c43; +} + +div.dashboard-widget-notice { + background-color: #cfe1ef; +} + +div.dashboard-widget-submit { + border-top-color: #ccc; +} + +div.tabs-panel, +.wp-tab-panel, +ul.category-tabs li.tabs, +ul.add-menu-item-tabs li.tabs, +.wp-tab-active { + border-color: #dfdfdf; + background-color: #fff; +} + +ul.category-tabs li.tabs, +ul.add-menu-item-tabs li.tabs, +.wp-tab-active { + background-color: #fff; +} + +input.disabled, +textarea.disabled { + background-color: #ccc; +} +/* #upload-menu li a.upload-tab-link, */ +#plugin-information .action-button a, +#plugin-information .action-button a:hover, +#plugin-information .action-button a:visited { + color: #fff; +} + +.widget .widget-top, +.postbox h3, +.stuffbox h3, +.widefat thead tr th, +.widefat tfoot tr th, +h3.dashboard-widget-title, +h3.dashboard-widget-title span, +h3.dashboard-widget-title small, +.find-box-head, +.sidebar-name, +#nav-menu-header, +#nav-menu-footer, +.menu-item-handle, +#fullscreen-topbar { + background-color: #f1f1f1; /* Fallback */ + background-image: -ms-linear-gradient(top, #f9f9f9, #ececec); /* IE10 */ + background-image: -moz-linear-gradient(top, #f9f9f9, #ececec); /* Firefox */ + background-image: -o-linear-gradient(top, #f9f9f9, #ececec); /* Opera */ + background-image: -webkit-gradient(linear, left top, left bottom, from(#f9f9f9), to(#ececec)); /* old Webkit */ + background-image: -webkit-linear-gradient(top, #f9f9f9, #ececec); /* new Webkit */ + background-image: linear-gradient(top, #f9f9f9, #ececec); /* proposed W3C Markup */ +} + +.widget .widget-top, +.postbox h3, +.stuffbox h3 { + border-bottom-color: #dfdfdf; + text-shadow: #fff 0 1px 0; + -moz-box-shadow: 0 1px 0 #fff; + -webkit-box-shadow: 0 1px 0 #fff; + box-shadow: 0 1px 0 #fff; +} + +.form-table th, +.form-wrap label { + color: #222; + text-shadow: #fff 0 1px 0; +} + +.description, +.form-wrap p { + color: #666; +} + +strong .post-com-count span { + background-color: #21759b; +} + +.sorthelper { + background-color: #ccf3fa; +} + +.ac_match, +.subsubsub a.current { + color: #000; +} + +.wrap h2 { + color: #464646; +} + +.wrap .add-new-h2 { + background: #f1f1f1; +} + +.subtitle { + color: #777; +} + +.ac_over { + background-color: #f0f0b8; +} + +.ac_results { + background-color: #fff; + border-color: #808080; +} + +.ac_results li { + color: #101010; +} + +.alternate, +.alt { + background-color: #fcfcfc; +} + +.available-theme a.screenshot { + background-color: #f1f1f1; + border-color: #ddd; +} + +.bar { + background-color: #e8e8e8; + border-right-color: #99d; +} + +#media-upload, +#media-upload .media-item .slidetoggle { + background: #fff; +} + +#media-upload .slidetoggle { + border-top-color: #dfdfdf; +} + +div.error, +.login #login_error { + background-color: #ffebe8; + border-color: #c00; +} + +div.error a { + color: #c00; +} + +.form-invalid { + background-color: #ffebe8 !important; +} + +.form-invalid input, +.form-invalid select { + border-color: #c00 !important; +} + +.submit { + border-color: #DFDFDF; +} + +.highlight { + background-color: #e4f2fd; + color: #000; +} + +.howto, +.nonessential, +#edit-slug-box, +.form-input-tip, +.subsubsub { + color: #666; +} + +.media-item { + border-bottom-color: #dfdfdf; +} + +#wpbody-content #media-items .describe { + border-top-color: #dfdfdf; +} + +.media-upload-form label.form-help, +td.help { + color: #9a9a9a; +} + +.post-com-count { + background-image: url(../images/bubble_bg.gif); + color: #fff; +} + +.post-com-count span { + background-color: #bbb; + color: #fff; +} + +.post-com-count:hover span { + background-color: #d54e21; +} + +.quicktags, .search { + background-color: #ccc; + color: #000; +} + +.side-info h5 { + border-bottom-color: #dadada; +} + +.side-info ul { + color: #666; +} + +.button, +.button-secondary, +.submit input, +input[type=button], +input[type=submit] { + border-color: #bbb; + color: #464646; +} + +.button:hover, +.button-secondary:hover, +.submit input:hover, +input[type=button]:hover, +input[type=submit]:hover { + color: #000; + border-color: #666; +} + +.button, +.submit input, +.button-secondary { + background: #f2f2f2 url(../images/white-grad.png) repeat-x scroll left top; + text-shadow: rgba(255,255,255,1) 0 1px 0; +} + +.button:active, +.submit input:active, +.button-secondary:active { + background: #eee url(../images/white-grad-active.png) repeat-x scroll left top; +} + +input.button-primary, +button.button-primary, +a.button-primary { + border-color: #298cba; + font-weight: bold; + color: #fff; + background: #21759B url(../images/button-grad.png) repeat-x scroll left top; + text-shadow: rgba(0,0,0,0.3) 0 -1px 0; +} + +input.button-primary:active, +button.button-primary:active, +a.button-primary:active { + background: #21759b url(../images/button-grad-active.png) repeat-x scroll left top; + color: #eaf2fa; +} + +input.button-primary:hover, +button.button-primary:hover, +a.button-primary:hover, +a.button-primary:focus, +a.button-primary:active { + border-color: #13455b; + color: #eaf2fa; +} + +.button-disabled, +.button[disabled], +.button:disabled, +.button-secondary[disabled], +.button-secondary:disabled, +a.button.disabled { + color: #aaa !important; + border-color: #ddd !important; +} + +.button-primary-disabled, +.button-primary[disabled], +.button-primary:disabled { + color: #9FD0D5 !important; + background: #298CBA !important; +} + +a:hover, +a:active, +a:focus { + color: #d54e21; +} + +#wphead #viewsite a:hover, +#adminmenu a:hover, +#adminmenu ul.wp-submenu a:hover, +#the-comment-list .comment a:hover, +#rightnow a:hover, +#media-upload a.del-link:hover, +div.dashboard-widget-submit input:hover, +.subsubsub a:hover, +.subsubsub a.current:hover, +.ui-tabs-nav a:hover, +.plugins .inactive a:hover, +#all-plugins-table .plugins .inactive a:hover, +#search-plugins-table .plugins .inactive a:hover { + color: #d54e21; +} + +#the-comment-list .comment-item, +#dashboard-widgets #dashboard_quick_press form p.submit { + border-color: #dfdfdf; +} + +#side-sortables .category-tabs .tabs a, +#side-sortables .add-menu-item-tabs .tabs a, +.wp-tab-bar .wp-tab-active a { + color: #333; +} + +#rightnow .rbutton { + background-color: #ebebeb; + color: #264761; +} + +.submitbox .submit { + background-color: #464646; + color: #ccc; +} + +.plugins a.delete:hover, +#all-plugins-table .plugins a.delete:hover, +#search-plugins-table .plugins a.delete:hover, +.submitbox .submitdelete { + color: #f00; + border-bottom-color: #f00; +} + +.submitbox .submitdelete:hover, +#media-items a.delete:hover { + color: #fff; + background-color: #f00; + border-bottom-color: #f00; +} + +#normal-sortables .submitbox .submitdelete:hover { + color: #000; + background-color: #f00; + border-bottom-color: #f00; +} + +.tablenav .dots { + border-color: transparent; +} + +.tablenav .next, +.tablenav .prev { + border-color: transparent; + color: #21759b; +} + +.tablenav .next:hover, +.tablenav .prev:hover { + border-color: transparent; + color: #d54e21; +} + +div.updated, +.login .message { + background-color: #ffffe0; + border-color: #e6db55; +} + +.update-message { + color: #000; +} + +a.page-numbers { + border-bottom-color: #B8D3E2; +} + +.commentlist li { + border-bottom-color: #ccc; +} + +.widefat td, +.widefat th { + border-top-color: #fff; + border-bottom-color: #dfdfdf; +} + +.widefat th { + text-shadow: rgba(255,255,255,0.8) 0 1px 0; +} + +.widefat td { + color: #555; +} +.widefat p, +.widefat ol, +.widefat ul { + color: #333; +} + +.widefat thead tr th, +.widefat tfoot tr th, +h3.dashboard-widget-title, +h3.dashboard-widget-title span, +h3.dashboard-widget-title small, +.find-box-head { + color: #333; +} + +th.sortable a:hover, th.sortable a:active, th.sortable a:focus { + color: #333; +} + +h3.dashboard-widget-title small a { + color: #d7d7d7; +} + +h3.dashboard-widget-title small a:hover { + color: #fff; +} + +a, +#adminmenu a, +#poststuff #edButtonPreview, +#poststuff #edButtonHTML, +#the-comment-list p.comment-author strong a, +#media-upload a.del-link, +#media-items a.delete, +.plugins a.delete, +.ui-tabs-nav a { + color: #21759b; +} + +#adminmenu .awaiting-mod, +#adminmenu .update-plugins, +#sidemenu a .update-plugins, +#rightnow .reallynow { + background-color: #464646; + color: #fff; + -moz-box-shadow: rgba(255,255,255,0.5) 0 1px 0; + -khtml-box-shadow: rgba(255,255,255,0.5) 0 1px 0; + -webkit-box-shadow: rgba(255,255,255,0.5) 0 1px 0; + box-shadow: rgba(255,255,255,0.5) 0 1px 0; +} +#plugin-information .action-button { + background-color: #d54e21; + color: #fff; +} + +#adminmenu li.current a .awaiting-mod, +#adminmenu li a.wp-has-current-submenu .update-plugins{ + background-color: #464646; + color: #fff; + -moz-box-shadow: rgba(255,255,255,0.5) 0 1px 0; + -khtml-box-shadow: rgba(255,255,255,0.5) 0 1px 0; + -webkit-box-shadow: rgba(255,255,255,0.5) 0 1px 0; + box-shadow: rgba(255,255,255,0.5) 0 1px 0; +} + +div#media-upload-header, +div#plugin-information-header { + background-color: #f9f9f9; + border-bottom-color: #dfdfdf; +} + +#currenttheme img { + border-color: #666; +} + +#dashboard_secondary div.dashboard-widget-content ul li a { + background-color: #f9f9f9; +} + +input.readonly, textarea.readonly { + background-color: #ddd; +} + +#ed_toolbar input, +#ed_reply_toolbar input { + background: #fff url("../images/fade-butt.png") repeat-x 0 -2px; +} + +#editable-post-name { + background-color: #fffbcc; +} + +#edit-slug-box strong, +.tablenav .displaying-num, +#submitted-on, +.submitted-on { + color: #777; +} + +.login #nav a, +.login #backtoblog a { + color: #21759b !important; +} + +.login #nav a:hover, +.login #backtoblog a:hover { + color: #d54e21 !important; +} + +#footer { + color: #777; + border-color: #dfdfdf; +} + +#media-items, +.imgedit-group { + border-color: #dfdfdf; +} + +.checkbox, +.side-info, +.plugins tr, +#your-profile #rich_editing { + background-color: #fcfcfc; +} + +.plugins .inactive, +.plugins .inactive th, +.plugins .inactive td, +tr.inactive + tr.plugin-update-tr .plugin-update { + background-color: #f4f4f4; +} + +.plugin-update-tr .update-message { + background-color: #fffbe4; + border-color: #dfdfdf; +} + +.plugins .active, +.plugins .active th, +.plugins .active td { + color: #000; +} + +.plugins .inactive a { + color: #557799; +} + +#the-comment-list tr.undo, +#the-comment-list div.undo { + background-color: #f4f4f4; +} + +#the-comment-list .unapproved { + background-color: #ffffe0; +} + +#the-comment-list .approve a { + color: #006505; +} + +#the-comment-list .unapprove a { + color: #d98500; +} + +table.widefat span.delete a, +table.widefat span.trash a, +table.widefat span.spam a, +#dashboard_recent_comments .delete a, +#dashboard_recent_comments .trash a, +#dashboard_recent_comments .spam a { + color: #bc0b0b; +} + +.widget, +#widget-list .widget-top, +.postbox, +#titlediv, +#poststuff .postarea, +.stuffbox { + border-color: #dfdfdf; + -moz-box-shadow: inset 0 1px 0 #fff; + -webkit-box-shadow: inset 0 1px 0 #fff; + box-shadow: inset 0 1px 0 #fff; + -moz-border-radius: 3px; + -khtml-border-radius: 3px; + -webkit-border-radius: 3px; + border-radius: 3px; +} + +.widget, +#widget-list .widget-top, +.postbox, +.menu-item-settings { + background-color: #f5f5f5; /* Fallback */ + background-image: -ms-linear-gradient(top, #f9f9f9, #f5f5f5); /* IE10 */ + background-image: -moz-linear-gradient(top, #f9f9f9, #f5f5f5); /* Firefox */ + background-image: -o-linear-gradient(top, #f9f9f9, #f5f5f5); /* Opera */ + background-image: -webkit-gradient(linear, left top, left bottom, from(#f9f9f9), to(#f5f5f5)); /* old Webkit */ + background-image: -webkit-linear-gradient(top, #f9f9f9, #f5f5f5); /* new Webkit */ + background-image: linear-gradient(top, #f9f9f9, #f5f5f5); /* proposed W3C Markup */ +} + +.postbox h3 { + color: #464646; +} + +.widget .widget-top { + color: #222; +} + +.sidebar-name:hover h3, +.postbox h3:hover { + color: #000; +} + +.curtime #timestamp { + background-image: url(../images/date-button.gif); +} + +#quicktags #ed_link { + color: #00f; +} + +#rightnow .youhave { + background-color: #f0f6fb; +} + +#rightnow a { + color: #448abd; +} + +.tagchecklist span a, +#bulk-titles div a { + background: url(../images/xit.gif) no-repeat; +} + +.tagchecklist span a:hover, +#bulk-titles div a:hover { + background: url(../images/xit.gif) no-repeat -10px 0; +} + +#update-nag, .update-nag { + background-color: #FFFBCC; + border-color: #E6DB55; + color: #555; +} + +.login #backtoblog a { + color: #464646; +} + +#wphead { + border-bottom:#dfdfdf 1px solid; +} + +#wphead h1 a { + color: #464646; +} + +#user_info { + color: #555; +} + +#user_info:hover, +#user_info.active { + color: #222; +} + +#user_info.active { + background-color: #f1f1f1; /* Fallback */ + background-image: -ms-linear-gradient(bottom, #e9e9e9, #f9f9f9); /* IE10 */ + background-image: -moz-linear-gradient(bottom, #e9e9e9, #f9f9f9); /* Firefox */ + background-image: -o-linear-gradient(bottom, #e9e9e9, #f9f9f9); /* Opera */ + background-image: -webkit-gradient(linear, left bottom, left top, from(#e9e9e9), to(#f9f9f9)); /* old Webkit */ + background-image: -webkit-linear-gradient(bottom, #e9e9e9, #f9f9f9); /* new Webkit */ + background-image: linear-gradient(bottom, #e9e9e9, #f9f9f9); /* proposed W3C Markup */ + border-color: #aaa #aaa #dfdfdf; +} + +#user_info_arrow { + background: transparent url(../images/arrows.png) no-repeat 6px 5px; +} + +#user_info:hover #user_info_arrow, +#user_info.active #user_info_arrow { + background: transparent url(../images/arrows-dark.png) no-repeat 6px 5px; +} + +#user_info_links { + -moz-box-shadow: 0 3px 2px -2px rgba( 0, 0, 0, 0.2 ); + -webkit-box-shadow: 0 3px 2px -2px rgba( 0, 0, 0, 0.2 ); + box-shadow: 0 3px 2px -2px rgba( 0, 0, 0, 0.2 ); +} + +#user_info_links ul { + background: #f1f1f1; + border-color: #ccc #aaa #aaa; + -moz-box-shadow: inset 0 1px 0 #f9f9f9; + -webkit-box-shadow: inset 0 1px 0 #f9f9f9; + box-shadow: inset 0 1px 0 #f9f9f9; +} + +#user_info_links li:hover { + background-color: #dfdfdf; +} + +#user_info_links li:hover a, +#user_info_links li a:hover { + text-decoration: none; +} + +#user_info a:link, +#user_info a:visited, +#footer a:link, +#footer a:visited { + text-decoration: none; +} + +#footer a:hover { + color: #000; + text-decoration: underline; +} + +div#media-upload-error, +.file-error, +abbr.required, +.widget-control-remove:hover, +table.widefat .delete a:hover, +table.widefat .trash a:hover, +table.widefat .spam a:hover, +#dashboard_recent_comments .delete a:hover, +#dashboard_recent_comments .trash a:hover +#dashboard_recent_comments .spam a:hover { + color: #f00; +} + +#pass-strength-result { + background-color: #eee; + border-color: #ddd !important; +} + +#pass-strength-result.bad { + background-color: #ffb78c; + border-color: #ff853c !important; +} + +#pass-strength-result.good { + background-color: #ffec8b; + border-color: #fc0 !important; +} + +#pass-strength-result.short { + background-color: #ffa0a0; + border-color: #f04040 !important; +} + +#pass-strength-result.strong { + background-color: #c3ff88; + border-color: #8dff1c !important; +} + +/* editors */ +#quicktags { + border-color: #ccc; + background-color: #dfdfdf; + background-image: url("../images/ed-bg.gif"); +} + +#ed_toolbar input { + border-color: #C3C3C3; +} + +#ed_toolbar input:hover { + border-color: #aaa; + background: #ddd; +} + +#poststuff .wp_themeSkin .mceStatusbar { + border-color: #dfdfdf; +} + +#poststuff .wp_themeSkin .mceStatusbar * { + color: #555; +} + +#poststuff #edButtonPreview, +#poststuff #edButtonHTML { + background-color: #f1f1f1; + border-color: #dfdfdf #dfdfdf #ccc; + color: #999; +} + +#poststuff #editor-toolbar .active { + border-color: #ccc #ccc #e9e9e9; + background-color: #e9e9e9; + color: #333; +} + +/* TinyMCE */ +#post-status-info { + background-color: #EDEDED; +} + +.wp_themeSkin *, +.wp_themeSkin a:hover, +.wp_themeSkin a:link, +.wp_themeSkin a:visited, +.wp_themeSkin a:active { + color: #000; +} + +/* Containers */ +.wp_themeSkin table.mceLayout { + border-color: #ccc #ccc #dfdfdf; +} + +#editorcontainer #content, +#editorcontainer .wp_themeSkin .mceIframeContainer { + -moz-box-shadow: inset 1px 1px 2px rgba( 0, 0, 0, 0.1 ); + -webkit-box-shadow: inset 1px 1px 2px rgba( 0, 0, 0, 0.1 ); + box-shadow: inset 1px 1px 2px rgba( 0, 0, 0, 0.1 ); +} +.wp_themeSkin iframe { + background: transparent; +} + +/* Layout */ +.wp_themeSkin .mceStatusbar { + color: #000; + background-color: #f5f5f5; +} + +/* Button */ +.wp_themeSkin .mceButton { + border-color: #ccc; + background-color: #eee; /* Fallback */ + background-image: -ms-linear-gradient(bottom, #ddd, #fff); /* IE10 */ + background-image: -moz-linear-gradient(bottom, #ddd, #fff); /* Firefox */ + background-image: -o-linear-gradient(bottom, #ddd, #fff); /* Opera */ + background-image: -webkit-gradient(linear, left bottom, left top, from(#ddd), to(#fff)); /* old Webkit */ + background-image: -webkit-linear-gradient(bottom, #ddd, #fff); /* new Webkit */ + background-image: linear-gradient(bottom, #ddd, #fff); /* proposed W3C Markup */ +} + +.wp_themeSkin a.mceButtonEnabled:hover { + border-color: #a0a0a0; + background: #ddd; /* Fallback */ + background-image: -ms-linear-gradient(bottom, #ccc, #fff); /* IE10 */ + background-image: -moz-linear-gradient(bottom, #ccc, #fff); /* Firefox */ + background-image: -o-linear-gradient(bottom, #ccc, #fff); /* Opera */ + background-image: -webkit-gradient(linear, left bottom, left top, from(#ccc), to(#fff)); /* old Webkit */ + background-image: -webkit-linear-gradient(bottom, #ccc, #fff); /* new Webkit */ + background-image: linear-gradient(bottom, #ccc, #fff); /* proposed W3C Markup */ +} + +.wp_themeSkin a.mceButton:active, +.wp_themeSkin a.mceButtonEnabled:active, +.wp_themeSkin a.mceButtonSelected:active, +.wp_themeSkin a.mceButtonActive, +.wp_themeSkin a.mceButtonActive:active, +.wp_themeSkin a.mceButtonActive:hover { + background-color: #ddd; /* Fallback */ + background-image: -ms-linear-gradient(bottom, #eee, #bbb); /* IE10 */ + background-image: -moz-linear-gradient(bottom, #eee, #bbb); /* Firefox */ + background-image: -o-linear-gradient(bottom, #eee, #bbb); /* Opera */ + background-image: -webkit-gradient(linear, left bottom, left top, from(#eee), to(#bbb)); /* old Webkit */ + background-image: -webkit-linear-gradient(bottom, #eee, #bbb); /* new Webkit */ + background-image: linear-gradient(bottom, #eee, #bbb); /* proposed W3C Markup */ + border-color: #909090; +} + +.wp_themeSkin .mceButtonDisabled { + border-color: #ccc !important; +} + +/* ListBox */ +.wp_themeSkin .mceListBox .mceText, +.wp_themeSkin .mceListBox .mceOpen { + border-color: #ccc; + background-color: #eee; /* Fallback */ + background-image: -ms-linear-gradient(bottom, #ddd, #fff); /* IE10 */ + background-image: -moz-linear-gradient(bottom, #ddd, #fff); /* Firefox */ + background-image: -o-linear-gradient(bottom, #ddd, #fff); /* Opera */ + background-image: -webkit-gradient(linear, left bottom, left top, from(#ddd), to(#fff)); /* old Webkit */ + background-image: -webkit-linear-gradient(bottom, #ddd, #fff); /* new Webkit */ + background-image: linear-gradient(bottom, #ddd, #fff); /* proposed W3C Markup */ +} + +.wp_themeSkin .mceListBox .mceOpen { + border-left: 0 !important; +} + +.wp_themeSkin table.mceListBoxEnabled:hover .mceOpen, +.wp_themeSkin .mceListBoxHover .mceOpen, +.wp_themeSkin .mceListBoxHover:active .mceOpen, +.wp_themeSkin .mceListBoxSelected .mceOpen, +.wp_themeSkin .mceListBoxSelected .mceText, +.wp_themeSkin table.mceListBoxEnabled:active .mceText { + background: #ccc; + border-color: #999; +} + +/* List Box Hover */ +.wp_themeSkin table.mceListBoxEnabled:hover .mceText, +.wp_themeSkin .mceListBoxHover .mceText, +.wp_themeSkin table.mceListBoxEnabled:hover .mceOpen, +.wp_themeSkin .mceListBoxHover .mceOpen { + border-color: #909090; + background-color: #eee; /* Fallback */ + background-image: -ms-linear-gradient(bottom, #ccc, #fff); /* IE10 */ + background-image: -moz-linear-gradient(bottom, #ccc, #fff); /* Firefox */ + background-image: -o-linear-gradient(bottom, #ccc, #fff); /* Opera */ + background-image: -webkit-gradient(linear, left bottom, left top, from(#ccc), to(#fff)); /* old Webkit */ + background-image: -webkit-linear-gradient(bottom, #ccc, #fff); /* new Webkit */ + background-image: linear-gradient(bottom, #ccc, #fff); /* proposed W3C Markup */ +} + +.wp_themeSkin select.mceListBox { + border-color: #B2B2B2; + background-color: #fff; +} + +/* SplitButton */ +.wp_themeSkin .mceSplitButton a.mceAction, +.wp_themeSkin .mceSplitButton a.mceOpen { + border-color: #ccc; +} + +.wp_themeSkin .mceSplitButton a.mceOpen:hover, +.wp_themeSkin .mceSplitButtonSelected a.mceOpen, +.wp_themeSkin table.mceSplitButtonEnabled:hover a.mceAction, +.wp_themeSkin .mceSplitButton a.mceAction:hover { + border-color: #909090; +} + + +.wp_themeSkin table.mceSplitButton td { + background-color: #eee; /* Fallback */ + background-image: -ms-linear-gradient(bottom, #ddd, #fff); /* IE10 */ + background-image: -moz-linear-gradient(bottom, #ddd, #fff); /* Firefox */ + background-image: -o-linear-gradient(bottom, #ddd, #fff); /* Opera */ + background-image: -webkit-gradient(linear, left bottom, left top, from(#ddd), to(#fff)); /* old Webkit */ + background-image: -webkit-linear-gradient(bottom, #ddd, #fff); /* new Webkit */ + background-image: linear-gradient(bottom, #ddd, #fff); /* proposed W3C Markup */ +} + +.wp_themeSkin table.mceSplitButton:hover td { + background-image: -ms-linear-gradient(bottom, #ccc, #fff); /* IE10 */ + background-image: -moz-linear-gradient(bottom, #ccc, #fff); /* Firefox */ + background-image: -o-linear-gradient(bottom, #ccc, #fff); /* Opera */ + background-image: -webkit-gradient(linear, left bottom, left top, from(#ccc), to(#fff)); /* old Webkit */ + background-image: -webkit-linear-gradient(bottom, #ccc, #fff); /* new Webkit */ + background-image: linear-gradient(bottom, #ccc, #fff); /* proposed W3C Markup */ +} + +.wp_themeSkin .mceSplitButtonActive { + background-color: #B2B2B2; +} + +/* ColorSplitButton */ +.wp_themeSkin div.mceColorSplitMenu table { + background-color: #ebebeb; + border-color: #B2B2B2; +} + +.wp_themeSkin .mceColorSplitMenu a { + border-color: #B2B2B2; +} + +.wp_themeSkin .mceColorSplitMenu a.mceMoreColors { + border-color: #fff; +} + +.wp_themeSkin .mceColorSplitMenu a.mceMoreColors:hover { + border-color: #0A246A; + background-color: #B6BDD2; +} + +.wp_themeSkin a.mceMoreColors:hover { + border-color: #0A246A; +} + +/* Menu */ +.wp_themeSkin .mceMenu { + border-color: #ddd; +} + +.wp_themeSkin .mceMenu table { + background-color: #ebeaeb; +} + +.wp_themeSkin .mceMenu .mceText { + color: #000; +} + +.wp_themeSkin .mceMenu .mceMenuItemEnabled a:hover, +.wp_themeSkin .mceMenu .mceMenuItemActive { + background-color: #f5f5f5; +} +.wp_themeSkin td.mceMenuItemSeparator { + background-color: #aaa; +} +.wp_themeSkin .mceMenuItemTitle a { + background-color: #ccc; + border-bottom-color: #aaa; +} +.wp_themeSkin .mceMenuItemTitle span.mceText { + color: #000; +} +.wp_themeSkin .mceMenuItemDisabled .mceText { + color: #888; +} + +.wp_themeSkin tr.mceFirst td.mceToolbar { + background: #dfdfdf url("../images/ed-bg.gif") repeat-x scroll left top; + border-color: #ccc; +} + +.wp-admin #mceModalBlocker { + background: #000; +} + +.wp-admin .clearlooks2 .mceFocus .mceTop .mceLeft { + background: #444444; + border-left: 1px solid #999; + border-top: 1px solid #999; + -moz-border-radius: 3px 0 0 0; + -webkit-border-top-left-radius: 3px; + -khtml-border-top-left-radius: 3px; + border-top-left-radius: 3px; +} + +.wp-admin .clearlooks2 .mceFocus .mceTop .mceRight { + background: #444444; + border-right: 1px solid #999; + border-top: 1px solid #999; + border-top-right-radius: 3px; + -khtml-border-top-right-radius: 3px; + -webkit-border-top-right-radius: 3px; + -moz-border-radius: 0 3px 0 0; +} + +.wp-admin .clearlooks2 .mceMiddle .mceLeft { + background: #f1f1f1; + border-left: 1px solid #999; +} + +.wp-admin .clearlooks2 .mceMiddle .mceRight { + background: #f1f1f1; + border-right: 1px solid #999; +} + +.wp-admin .clearlooks2 .mceBottom { + background: #f1f1f1; + border-bottom: 1px solid #999; +} + +.wp-admin .clearlooks2 .mceBottom .mceLeft { + background: #f1f1f1; + border-bottom: 1px solid #999; + border-left: 1px solid #999; +} + +.wp-admin .clearlooks2 .mceBottom .mceCenter { + background: #f1f1f1; + border-bottom: 1px solid #999; +} + +.wp-admin .clearlooks2 .mceBottom .mceRight { + background: #f1f1f1; + border-bottom: 1px solid #999; + border-right: 1px solid #999; +} + +.wp-admin .clearlooks2 .mceFocus .mceTop span { + color: #e5e5e5; +} +/* end TinyMCE */ + +#titlediv #title { + border-color: #ccc; +} + +#editorcontainer { + border-color: #ccc #ccc #dfdfdf; +} + +#post-status-info { + border-color: #dfdfdf #ccc #ccc; +} + +.editwidget .widget-inside { + border-color: #dfdfdf; +} + +#titlediv #title { + background-color: #fff; +} + +#tTips p#tTips_inside { + background-color: #ddd; + color: #333; +} + +#timestampdiv input, +#namediv input, +#poststuff .inside .the-tagcloud { + border-color: #ddd; +} + +/* menu */ +#adminmenuback, +#adminmenuwrap { + background-color: #ececec; + border-color: #ccc; +} + +#adminmenushadow, +#adminmenuback { + background-image: url(../images/menu-shadow.png); + background-position: top right; + background-repeat: repeat-y; +} + +#adminmenu li.wp-menu-separator { + background: #dfdfdf; + border-color: #cfcfcf; +} + +#adminmenu div.separator { + border-color: #e1e1e1; +} + +#adminmenu li.wp-has-current-submenu.wp-menu-open .wp-menu-toggle, +#adminmenu li.wp-has-current-submenu:hover .wp-menu-toggle { + background: transparent url(../images/arrows-dark.png) no-repeat -1px 6px; +} + +#adminmenu .wp-has-submenu:hover .wp-menu-toggle, +#adminmenu .wp-menu-open .wp-menu-toggle { + background: transparent url(../images/arrows.png) no-repeat -2px 6px; +} + +#adminmenu a.menu-top, +.folded #adminmenu li.menu-top, +#adminmenu .wp-submenu .wp-submenu-head { + border-top-color: #f9f9f9; + border-bottom-color: #dfdfdf; +} + +#adminmenu li.wp-menu-open { + border-color: #dfdfdf; +} + +#adminmenu li.wp-has-current-submenu a.wp-has-current-submenu, +#adminmenu li.current a.menu-top, +.folded #adminmenu li.wp-has-current-submenu, +.folded #adminmenu li.current.menu-top, +#adminmenu .wp-menu-arrow, +#adminmenu .wp-has-current-submenu .wp-submenu .wp-submenu-head { + background-color: #777; /* Fallback */ + background-image: -ms-linear-gradient(bottom, #6d6d6d, #808080); /* IE10 */ + background-image: -moz-linear-gradient(bottom, #6d6d6d, #808080); /* Firefox */ + background-image: -o-linear-gradient(bottom, #6d6d6d, #808080); /* Opera */ + background-image: -webkit-gradient(linear, left bottom, left top, from(#6d6d6d), to(#808080)); /* old Webkit */ + background-image: -webkit-linear-gradient(bottom, #6d6d6d, #808080); /* new Webkit */ + background-image: linear-gradient(bottom, #6d6d6d, #808080); /* proposed W3C Markup */ +} + +#adminmenu li.wp-has-current-submenu a.wp-has-current-submenu, +#adminmenu li.current a.menu-top, +#adminmenu .wp-has-current-submenu .wp-submenu .wp-submenu-head { + text-shadow: 0 -1px 0 #333; + color: #fff; + border-top-color: #808080; + border-bottom-color: #6d6d6d; +} + +.folded #adminmenu li.wp-has-current-submenu, +.folded #adminmenu li.current.menu-top { + border-top-color: #808080; + border-bottom-color: #6d6d6d; +} + +#adminmenu .wp-submenu a:hover { + background-color: #EAF2FA !important; + color: #333 !important; +} + +#adminmenu .wp-submenu li.current, +#adminmenu .wp-submenu li.current a, +#adminmenu .wp-submenu li.current a:hover { + color: #333; +} + +#adminmenu .wp-submenu ul { + background-color: #fff; +} + +.folded #adminmenu .wp-submenu-wrap, +.folded #adminmenu .wp-submenu ul { + border-color: #dfdfdf; +} + +.folded #adminmenu .wp-submenu-wrap { + -moz-box-shadow: 2px 2px 5px rgba( 0, 0, 0, 0.4 ); + -webkit-box-shadow: 2px 2px 5px rgba( 0, 0, 0, 0.4 ); + box-shadow: 2px 2px 5px rgba( 0, 0, 0, 0.4 ); +} + +#adminmenu .wp-submenu .wp-submenu-head { + border-right-color: #dfdfdf; + background-color: #ececec; +} + +#adminmenu div.wp-submenu { + background-color: transparent; +} + +/* collapse menu button */ +#collapse-menu { + color: #aaa; +} + +#collapse-menu:hover { + color: #999; +} + +#collapse-button { + border-color: #ccc; + background-color: #f4f4f4; /* Fallback */ + background-image: -ms-linear-gradient(bottom, #dfdfdf, #fff); /* IE10 */ + background-image: -moz-linear-gradient(bottom, #dfdfdf, #fff); /* Firefox */ + background-image: -o-linear-gradient(bottom, #dfdfdf, #fff); /* Opera */ + background-image: -webkit-gradient(linear, left bottom, left top, from(#dfdfdf), to(#fff)); /* old Webkit */ + background-image: -webkit-linear-gradient(bottom, #dfdfdf, #fff); /* new Webkit */ + background-image: linear-gradient(bottom, #dfdfdf, #fff); /* proposed W3C Markup */ +} +#collapse-menu:hover #collapse-button { + border-color: #aaa; +} +#collapse-button div { + background: transparent url(../images/arrows.png) no-repeat 0 -72px; +} +.folded #collapse-button div { + background-position: 0 -108px; +} + +/* menu and screen icons */ +#adminmenu .menu-icon-dashboard div.wp-menu-image { + background: transparent url('../images/menu.png?ver=20100531') no-repeat scroll -60px -33px; +} + +#adminmenu .menu-icon-dashboard:hover div.wp-menu-image, +#adminmenu .menu-icon-dashboard.wp-has-current-submenu div.wp-menu-image, +#adminmenu .menu-icon-dashboard.current div.wp-menu-image { + background: transparent url('../images/menu.png?ver=20100531') no-repeat scroll -60px -1px; +} + +#adminmenu .menu-icon-post div.wp-menu-image { + background: transparent url('../images/menu.png?ver=20100531') no-repeat scroll -271px -33px; +} + +#adminmenu .menu-icon-post:hover div.wp-menu-image, +#adminmenu .menu-icon-post.wp-has-current-submenu div.wp-menu-image { + background: transparent url('../images/menu.png?ver=20100531') no-repeat scroll -271px -1px; +} + +#adminmenu .menu-icon-media div.wp-menu-image { + background: transparent url('../images/menu.png?ver=20100531') no-repeat scroll -120px -33px; +} + +#adminmenu .menu-icon-media:hover div.wp-menu-image, +#adminmenu .menu-icon-media.wp-has-current-submenu div.wp-menu-image { + background: transparent url('../images/menu.png?ver=20100531') no-repeat scroll -120px -1px; +} + +#adminmenu .menu-icon-links div.wp-menu-image { + background: transparent url('../images/menu.png?ver=20100531') no-repeat scroll -90px -33px; +} + +#adminmenu .menu-icon-links:hover div.wp-menu-image, +#adminmenu .menu-icon-links.wp-has-current-submenu div.wp-menu-image { + background: transparent url('../images/menu.png?ver=20100531') no-repeat scroll -90px -1px; +} + +#adminmenu .menu-icon-page div.wp-menu-image { + background: transparent url('../images/menu.png?ver=20100531') no-repeat scroll -150px -33px; +} + +#adminmenu .menu-icon-page:hover div.wp-menu-image, +#adminmenu .menu-icon-page.wp-has-current-submenu div.wp-menu-image { + background: transparent url('../images/menu.png?ver=20100531') no-repeat scroll -150px -1px; +} + +#adminmenu .menu-icon-comments div.wp-menu-image { + background: transparent url('../images/menu.png?ver=20100531') no-repeat scroll -30px -33px; +} + +#adminmenu .menu-icon-comments:hover div.wp-menu-image, +#adminmenu .menu-icon-comments.wp-has-current-submenu div.wp-menu-image, +#adminmenu .menu-icon-comments.current div.wp-menu-image { + background: transparent url('../images/menu.png?ver=20100531') no-repeat scroll -30px -1px; +} + +#adminmenu .menu-icon-appearance div.wp-menu-image { + background: transparent url('../images/menu.png?ver=20100531') no-repeat scroll 0 -33px; +} + +#adminmenu .menu-icon-appearance:hover div.wp-menu-image, +#adminmenu .menu-icon-appearance.wp-has-current-submenu div.wp-menu-image { + background: transparent url('../images/menu.png?ver=20100531') no-repeat scroll 0 -1px; +} + +#adminmenu .menu-icon-plugins div.wp-menu-image { + background: transparent url('../images/menu.png?ver=20100531') no-repeat scroll -180px -33px; +} + +#adminmenu .menu-icon-plugins:hover div.wp-menu-image, +#adminmenu .menu-icon-plugins.wp-has-current-submenu div.wp-menu-image { + background: transparent url('../images/menu.png?ver=20100531') no-repeat scroll -180px -1px; +} + +#adminmenu .menu-icon-users div.wp-menu-image { + background: transparent url('../images/menu.png?ver=20100531') no-repeat scroll -300px -33px; +} + +#adminmenu .menu-icon-users:hover div.wp-menu-image, +#adminmenu .menu-icon-users.wp-has-current-submenu div.wp-menu-image, +#adminmenu .menu-icon-users.current div.wp-menu-image { + background: transparent url('../images/menu.png?ver=20100531') no-repeat scroll -300px -1px; +} + +#adminmenu .menu-icon-tools div.wp-menu-image { + background: transparent url('../images/menu.png?ver=20100531') no-repeat scroll -210px -33px; +} + +#adminmenu .menu-icon-tools:hover div.wp-menu-image, +#adminmenu .menu-icon-tools.wp-has-current-submenu div.wp-menu-image, +#adminmenu .menu-icon-tools.current div.wp-menu-image { + background: transparent url('../images/menu.png?ver=20100531') no-repeat scroll -210px -1px; +} + +#icon-options-general, +#adminmenu .menu-icon-settings div.wp-menu-image { + background: transparent url('../images/menu.png?ver=20100531') no-repeat scroll -240px -33px; +} + +#adminmenu .menu-icon-settings:hover div.wp-menu-image, +#adminmenu .menu-icon-settings.wp-has-current-submenu div.wp-menu-image { + background: transparent url('../images/menu.png?ver=20100531') no-repeat scroll -240px -1px; +} + +#adminmenu .menu-icon-site div.wp-menu-image { + background: transparent url('../images/menu.png?ver=20100531') no-repeat scroll -360px -33px; +} + +#adminmenu .menu-icon-site:hover div.wp-menu-image, +#adminmenu .menu-icon-site.wp-has-current-submenu div.wp-menu-image { + background: transparent url('../images/menu.png?ver=20100531') no-repeat scroll -360px -1px; +} +/* end menu and screen icons */ + +/* Screen Icons */ +#icon-edit, +#icon-post { + background: transparent url(../images/icons32.png?ver=20100531) no-repeat -552px -5px; +} + +#icon-index { + background: transparent url(../images/icons32.png?ver=20100531) no-repeat -137px -5px; +} + +#icon-upload { + background: transparent url(../images/icons32.png?ver=20100531) no-repeat -251px -5px; +} + +#icon-link-manager, +#icon-link, +#icon-link-category { + background: transparent url(../images/icons32.png?ver=20100531) no-repeat -190px -5px; +} + +#icon-edit-pages, +#icon-page { + background: transparent url(../images/icons32.png?ver=20100531) no-repeat -312px -5px; +} + +#icon-edit-comments { + background: transparent url(../images/icons32.png?ver=20100531) no-repeat -72px -5px; +} + +#icon-themes { + background: transparent url(../images/icons32.png?ver=20100531) no-repeat -11px -5px; +} + +#icon-plugins { + background: transparent url(../images/icons32.png?ver=20100531) no-repeat -370px -5px; +} + +#icon-users, +#icon-profile, +#icon-user-edit { + background: transparent url(../images/icons32.png?ver=20100531) no-repeat -600px -5px; +} + +#icon-tools, +#icon-admin { + background: transparent url(../images/icons32.png?ver=20100531) no-repeat -432px -5px; +} + +#icon-options-general { + background: transparent url(../images/icons32.png?ver=20100531) no-repeat -492px -5px; +} + +#icon-ms-admin { + background: transparent url(../images/icons32.png?ver=20100531) no-repeat -659px -5px; +} +/* end screen icons */ + + +/* Diff */ +table.diff .diff-deletedline { + background-color: #fdd; +} + +table.diff .diff-deletedline del { + background-color: #f99; +} + +table.diff .diff-addedline { + background-color: #dfd; +} + +table.diff .diff-addedline ins { + background-color: #9f9; +} + +#att-info { + background-color: #E4F2FD; +} + +/* edit image */ +#sidemenu a { + background-color: #f9f9f9; + border-color: #f9f9f9; + border-bottom-color: #dfdfdf; +} + +#sidemenu a.current { + background-color: #fff; + border-color: #dfdfdf #dfdfdf #fff; + color: #D54E21; +} + +#screen-options-wrap, +#contextual-help-wrap { + background-color: #f1f1f1; + border-color: #dfdfdf; +} + +#screen-options-link-wrap, +#contextual-help-link-wrap { + background-color: #e3e3e3; /* Fallback */ + border-right: 1px solid transparent; + border-left: 1px solid transparent; + border-bottom: 1px solid transparent; + background-image: -ms-linear-gradient(bottom, #dfdfdf, #f1f1f1); /* IE10 */ + background-image: -moz-linear-gradient(bottom, #dfdfdf, #f1f1f1); /* Firefox */ + background-image: -o-linear-gradient(bottom, #dfdfdf, #f1f1f1); /* Opera */ + background-image: -webkit-gradient(linear, left bottom, left top, from(#dfdfdf), to(#f1f1f1)); /* old Webkit */ + background-image: -webkit-linear-gradient(bottom, #dfdfdf, #f1f1f1); /* new Webkit */ + background-image: linear-gradient(bottom, #dfdfdf, #f1f1f1); /* proposed W3C Markup */ +} + +#screen-meta-links a.show-settings { + color: #777; +} + +#screen-meta-links a.show-settings:hover { + color: #000; +} + +#replysubmit { + background-color: #f1f1f1; + border-top-color: #ddd; +} + +#replyerror { + border-color: #ddd; + background-color: #f9f9f9; +} + +#edithead, +#replyhead { + background-color: #f1f1f1; +} + +#ed_reply_toolbar { + background-color: #e9e9e9; +} + +/* table vim shortcuts */ +.vim-current, +.vim-current th, +.vim-current td { + background-color: #E4F2FD !important; +} + +/* Install Plugins */ +.star-average, +.star.star-rating { + background-color: #fc0; +} + +div.star.select:hover { + background-color: #d00; +} + +div.star img { + border-left: 1px solid #fff; + border-right: 1px solid #fff; +} + +.widefat div.star img { + border-left: 1px solid #f9f9f9; + border-right: 1px solid #f9f9f9; +} + +#plugin-information .fyi ul { + background-color: #eaf3fa; +} + +#plugin-information .fyi h2.mainheader { + background-color: #cee1ef; +} + +#plugin-information pre, +#plugin-information code { + background-color: #ededff; +} + +#plugin-information pre { + border: 1px solid #ccc; +} + +/* inline editor */ +.inline-edit-row fieldset input[type="text"], +.inline-edit-row fieldset textarea, +#bulk-titles, +#replyrow input { + border-color: #ddd; +} + +.inline-editor div.title { + background-color: #EAF3FA; +} + +.inline-editor ul.cat-checklist { + background-color: #fff; + border-color: #ddd; +} + +.inline-editor .categories .catshow, +.inline-editor .categories .cathide { + color: #21759b; +} + +.inline-editor .quick-edit-save { + background-color: #f1f1f1; +} + +#replyrow #ed_reply_toolbar input:hover { + border-color: #aaa; + background: #ddd; +} + +fieldset.inline-edit-col-right .inline-edit-col { + border-color: #dfdfdf; +} + +.attention { + color: #D54E21; +} + +.meta-box-sortables .postbox:hover .handlediv { + background: transparent url(../images/arrows.png) no-repeat 6px 7px; +} + +.tablenav .tablenav-pages { + color: #555; +} + +.tablenav .tablenav-pages a { + border-color: #e3e3e3; + background: #eee url('../images/menu-bits.gif?ver=20100610') repeat-x scroll left -379px; +} + +.tablenav .tablenav-pages a:hover, +.tablenav .tablenav-pages a:focus { + color: #d54e21; +} + +.tablenav .tablenav-pages a.disabled, +.tablenav .tablenav-pages a.disabled:hover, +.tablenav .tablenav-pages a.disabled:focus { + color: #aaa; +} + +.tablenav .tablenav-pages .current { + background: #dfdfdf; + border-color: #d3d3d3; +} + +#availablethemes, +#availablethemes td { + border-color: #ddd; +} + +#current-theme img { + border-color: #999; +} + +#TB_window #TB_title a.tb-theme-preview-link, +#TB_window #TB_title a.tb-theme-preview-link:visited { + color: #999; +} + +#TB_window #TB_title a.tb-theme-preview-link:hover, +#TB_window #TB_title a.tb-theme-preview-link:focus { + color: #ccc; +} + +.misc-pub-section { + border-top-color: #fff; + border-bottom-color: #dfdfdf; +} + +#minor-publishing { + border-bottom-color: #dfdfdf; +} + +#post-body .misc-pub-section { + border-right-color: #eee; +} + +.post-com-count span { + background-color: #bbb; +} + +.form-table .color-palette td { + border-color: #fff; +} + +.sortable-placeholder { + border-color: #bbb; + background-color: #f5f5f5; +} + +#post-body ul.category-tabs li.tabs a, +#post-body ul.add-menu-item-tabs li.tabs a, +body.press-this ul.category-tabs li.tabs a { + color: #333; +} + +#wp_editimgbtn, +#wp_delimgbtn, +#wp_editgallery, +#wp_delgallery { + border-color: #999; + background-color: #eee; +} + +#wp_editimgbtn:hover, +#wp_delimgbtn:hover, +#wp_editgallery:hover, +#wp_delgallery:hover { + border-color: #555; + background-color: #ccc; +} + +#favorite-first { + border-color: #c0c0c0; + background: #f1f1f1; /* fallback color */ + background:-moz-linear-gradient(bottom, #e7e7e7, #fff); + background:-webkit-gradient(linear, left bottom, left top, from(#e7e7e7), to(#fff)); +} + +#favorite-inside { + border-color: #c0c0c0; + background-color: #fff; +} + +#favorite-toggle { + background: transparent url(../images/arrows.png) no-repeat 4px 2px; + border-color: #dfdfdf; + -moz-box-shadow: inset 1px 0 0 #fff; + -webkit-box-shadow: inset 1px 0 0 #fff; + box-shadow: inset 1px 0 0 #fff; +} + +#favorite-actions a { + color: #464646; +} + +#favorite-actions a:hover { + color: #000; +} + +#favorite-inside a:hover { + text-decoration: underline; +} + +#screen-meta a.show-settings, +.toggle-arrow { + background: transparent url(../images/arrows.png) no-repeat right 3px; +} + +#screen-meta .screen-meta-active a.show-settings { + background: transparent url(../images/arrows.png) no-repeat right -33px; +} + +.view-switch #view-switch-list { + background: transparent url(../images/list.png) no-repeat 0 0; +} + +.view-switch .current #view-switch-list { + background: transparent url(../images/list.png) no-repeat -40px 0; +} + +.view-switch #view-switch-excerpt { + background: transparent url(../images/list.png) no-repeat -20px 0; +} + +.view-switch .current #view-switch-excerpt { + background: transparent url(../images/list.png) no-repeat -60px 0; +} + +#header-logo { + background: transparent url(../images/wp-logo.png?ver=20110504) no-repeat scroll center center; +} + +.popular-tags, +.feature-filter { + background-color: #fff; + border-color: #DFDFDF; +} + +#theme-information .action-button { + border-top-color: #DFDFDF; +} + +.theme-listing br.line { + border-bottom-color: #ccc; +} + +div.widgets-sortables, +#widgets-left .inactive { + background-color: #fcfcfc; + border-color: #dfdfdf; +} + +#available-widgets .widget-holder { + background-color: #fcfcfc; + border-color: #dfdfdf; +} + +#available-widgets .widget-description { + color: #555; +} + +.sidebar-name { + color: #464646; + text-shadow: #fff 0 1px 0; + border-color: #dfdfdf; + -moz-box-shadow: inset 0 1px 0 #fff; + -webkit-box-shadow: inset 0 1px 0 #fff; + box-shadow: inset 0 1px 0 #fff; +} + +.sidebar-name:hover, +#removing-widget { + color: #d54e21; +} + +#removing-widget span { + color: black; +} + +.sidebar-name-arrow { + background: transparent url(../images/arrows.png) no-repeat 5px 9px; +} + +.sidebar-name:hover .sidebar-name-arrow { + background: transparent url(../images/arrows-dark.png) no-repeat 5px 9px; +} + +.in-widget-title { + color: #606060; +} + +.deleting .widget-title * { + color: #aaa; +} + +.imgedit-menu div { + border-color: #d5d5d5; + background-color: #f1f1f1; +} + +.imgedit-menu div:hover { + border-color: #c1c1c1; + background-color: #eaeaea; +} + +.imgedit-menu div.disabled { + border-color: #ccc; + background-color: #ddd; + filter: alpha(opacity=50); + opacity: 0.5; +} + +#dashboard_recent_comments div.undo { + border-top-color: #dfdfdf; +} + +.comment-ays, +.comment-ays th { + border-color: #ddd; +} + +.comment-ays th { + background-color: #f1f1f1; +} + +/* added from nav-menu.css */ +#menu-management .menu-edit { + border-color: #dfdfdf; +} + +#post-body { + background: #fff; + border-top-color: #fff; + border-bottom-color: #dfdfdf; +} + +#nav-menu-header { + border-bottom-color: #dfdfdf; +} + +#nav-menu-footer { + border-top-color: #fff; +} + +#menu-management .nav-tabs-arrow a { + color: #C1C1C1; +} + +#menu-management .nav-tabs-arrow a:hover { + color: #D54E21; +} + +#menu-management .nav-tabs-arrow a:active { + color: #464646; +} + +#menu-management .nav-tab-active { + border-color: #dfdfdf; +} + +#menu-management .nav-tab { + background: #fbfbfb; + border-color: #dfdfdf; +} + +.js .input-with-default-title { + color: #aaa; +} + +#cancel-save { + color: #ff0000; +} + +#cancel-save:hover { + background-color: #FF0000; + color: #fff; +} + +.list-container { + border-color: #DFDFDF; +} + +.menu-item-handle { + border-color: #dfdfdf; +} + +.menu li.deleting .menu-item-handle { + background-color: #f66; + text-shadow: #ccc; +} + +.item-type { /* Menu item controls */ + color: #999999; +} + +.item-controls .menu-item-delete:hover { + color: #ff0000; +} + +.item-edit { + background: transparent url(../images/arrows.png) no-repeat 8px 10px; + border-bottom-color: #eee; +} + +.item-edit:hover { + background: transparent url(../images/arrows-dark.png) no-repeat 8px 10px; +} + +.menu-item-settings { /* Menu editing */ + border-color: #dfdfdf; +} + +.link-to-original { + color: #777; + border-color: #dfdfdf; +} + +#cancel-save:hover { + color: #fff !important; +} + +#update-menu-item { + color: #fff !important; +} + +#update-menu-item:hover, +#update-menu-item:active, +#update-menu-item:focus { + color: #eaf2fa !important; + border-color: #13455b !important; +} + +.submitbox .submitcancel { + color: #21759B; + border-bottom-color: #21759B; +} + +.submitbox .submitcancel:hover { + background: #21759B; + color: #fff; +} +/* end added from nav-menu.css */ + +#menu-management .nav-tab-active, +.menu-item-handle, +.menu-item-settings { + -moz-box-shadow: inset 0 1px 0 #fff; + -webkit-box-shadow: inset 0 1px 0 #fff; + box-shadow: inset 0 1px 0 #fff; +} + +#menu-management .nav-tab-active { + background: #f9f9f9; + border-bottom-color: #f9f9f9; +} + +/* custom header & background pages */ +#upload-form label { + color: #777; +} +/* custom header & background pages */ + +/* full screen */ +.fullscreen-overlay { + background: #fff; +} + +.wp-fullscreen-focus #wp-fullscreen-title, +.wp-fullscreen-focus #wp-fullscreen-container { + border-color: #ccc; +} + +#fullscreen-topbar { + border-bottom-color: #DFDFDF; +} diff --git a/src/wp-admin/css/dashboard-rtl.css b/src/wp-admin/css/dashboard-rtl.css new file mode 100644 index 0000000..14d25ae --- /dev/null +++ b/src/wp-admin/css/dashboard-rtl.css @@ -0,0 +1 @@ +#dashboard-widgets-wrap .has-sidebar{margin-right:0;margin-left:-51%;}#dashboard-widgets-wrap .has-sidebar .has-sidebar-content{margin-right:0;margin-left:51%;}.view-all{right:auto;left:0;}#dashboard_right_now p.sub,#dashboard-widgets h4,#dashboard_quick_press h4,a.rsswidget,#dashboard_plugins h4,#dashboard_plugins h5,#dashboard_recent_comments .comment-meta .approve{font-family:Tahoma,Arial;}#dashboard_right_now p.sub{left:auto;right:15px;}#dashboard_right_now td.b{padding-right:0;padding-left:6px;text-align:left;font-family:Tahoma,Arial;}#dashboard_right_now .t{padding-right:0;padding-left:12px;}#dashboard_right_now .table_content{float:right;}#dashboard_right_now .table_discussion{float:left;}#dashboard_right_now .versions a{font-family:Tahoma,Arial;}#dashboard_right_now a.button{float:left;clear:left;}#dashboard_plugins .inside span{padding-left:0;padding-right:5px;}#dashboard-widgets h3 .postbox-title-action{right:auto;left:30px;}#the-comment-list .pingback{padding-left:0!important;padding-right:9px!important;}#the-comment-list .comment-item{padding:1em 70px 1em 10px;}#the-comment-list .comment-item .avatar{float:right;margin-left:0;margin-right:-60px;}.rss-widget cite{text-align:left;}.rss-widget span.rss-date{font-family:Tahoma,Arial;margin-left:0;margin-right:3px;}#dashboard_quick_press h4{float:right;text-align:left;}#dashboard_quick_press h4 label{margin-right:0;margin-left:10px;}#dashboard_quick_press .input-text-wrap,#dashboard_quick_press .textarea-wrap{margin:0 5em 1em 0;}#dashboard_quick_press #media-buttons{margin:0 5em .5em 0;padding:0 10px 0 0;}#dashboard-widgets #dashboard_quick_press form p.submit{margin-left:0;margin-right:4.6em;}#dashboard-widgets #dashboard_quick_press form p.submit input{float:right;}#dashboard-widgets #dashboard_quick_press form p.submit #save-post{margin:0 10px 0 1em;}#dashboard-widgets #dashboard_quick_press form p.submit #publish{float:left;}#dashboard-widgets #dashboard_quick_press form p.submit img.waiting{margin:4px 0 0 6px;}#dashboard_recent_drafts h4 abbr{font-family:Tahoma,Arial;margin-left:0;margin-right:3px;} \ No newline at end of file diff --git a/src/wp-admin/css/dashboard-rtl.dev.css b/src/wp-admin/css/dashboard-rtl.dev.css new file mode 100644 index 0000000..8617bfa --- /dev/null +++ b/src/wp-admin/css/dashboard-rtl.dev.css @@ -0,0 +1,110 @@ +#dashboard-widgets-wrap .has-sidebar { + margin-right: 0; + margin-left: -51%; +} +#dashboard-widgets-wrap .has-sidebar .has-sidebar-content { + margin-right: 0; + margin-left: 51%; +} +.view-all { + right: auto; + left: 0; +} +#dashboard_right_now p.sub, #dashboard-widgets h4, #dashboard_quick_press h4, a.rsswidget, #dashboard_plugins h4, #dashboard_plugins h5, #dashboard_recent_comments .comment-meta .approve { + font-family: Tahoma, Arial; +} +#dashboard_right_now p.sub { + left:auto; + right:15px; +} +#dashboard_right_now td.b { + padding-right: 0; + padding-left: 6px; + text-align: left; + font-family: Tahoma, Arial; +} +#dashboard_right_now .t { + padding-right: 0; + padding-left: 12px; +} +#dashboard_right_now .table_content { + float:right; +} +#dashboard_right_now .table_discussion { + float:left; +} +#dashboard_right_now .versions a { + font-family: Tahoma, Arial; +} +#dashboard_right_now a.button { + float: left; + clear: left; +} +#dashboard_plugins .inside span { + padding-left: 0; + padding-right: 5px; +} +#dashboard-widgets h3 .postbox-title-action { + right: auto; + left: 30px; +} +#the-comment-list .pingback { + padding-left: 0 !important; + padding-right: 9px !important; +} +/* Recent Comments */ +#the-comment-list .comment-item { + padding: 1em 70px 1em 10px; +} +#the-comment-list .comment-item .avatar { + float: right; + margin-left: 0; + margin-right: -60px; +} +/* Feeds */ +.rss-widget cite { + text-align: left; +} +.rss-widget span.rss-date { + font-family: Tahoma, Arial; + margin-left: 0; + margin-right: 3px; +} +/* QuickPress */ +#dashboard_quick_press h4 { + float: right; + text-align: left; +} +#dashboard_quick_press h4 label { + margin-right: 0; + margin-left: 10px; +} +#dashboard_quick_press .input-text-wrap, #dashboard_quick_press .textarea-wrap { + margin: 0 5em 1em 0; +} +#dashboard_quick_press #media-buttons { + margin: 0 5em .5em 0; + padding: 0 10px 0 0; +} +#dashboard-widgets #dashboard_quick_press form p.submit { + margin-left: 0; + margin-right: 4.6em; +} +#dashboard-widgets #dashboard_quick_press form p.submit input { + float: right; +} +#dashboard-widgets #dashboard_quick_press form p.submit #save-post { + margin: 0 10px 0 1em; +} +#dashboard-widgets #dashboard_quick_press form p.submit #publish { + float: left; +} +#dashboard-widgets #dashboard_quick_press form p.submit img.waiting { + margin: 4px 0 0 6px; +} +/* Recent Drafts */ +#dashboard_recent_drafts h4 abbr { + font-family: Tahoma, Arial; + margin-left:0; + margin-right: 3px; +} \ No newline at end of file diff --git a/src/wp-admin/css/dashboard.css b/src/wp-admin/css/dashboard.css new file mode 100644 index 0000000..e30d686 --- /dev/null +++ b/src/wp-admin/css/dashboard.css @@ -0,0 +1 @@ +.postbox p,.postbox ul,.postbox ol,.postbox blockquote,#wp-version-message{font-size:12px;}.edit-box{display:none;}h3:hover .edit-box{display:inline;}form .input-text-wrap{background:#fff;border-style:solid;border-width:1px;padding:2px 3px;border-color:#ccc;}#dashboard-widgets form .input-text-wrap input{border:0 none;outline:none;margin:0;padding:0;width:99%;color:#333;}form .textarea-wrap{background:#fff;border-style:solid;border-width:1px;padding:2px;border-color:#ccc;}#dashboard-widgets form .textarea-wrap textarea{border:0 none;padding:0;outline:none;width:99%;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;}#dashboard-widgets .postbox form .submit{float:none;margin:.5em 0 0;padding:0;border:none;}#dashboard-widgets-wrap #dashboard-widgets .postbox form .submit input{margin:0;}#dashboard-widgets-wrap #dashboard-widgets .postbox form .submit #publish{min-width:0;}div.postbox div.inside{margin:10px 0;position:relative;}#dashboard-widgets a{text-decoration:none;}#dashboard-widgets h3 a{text-decoration:underline;}#dashboard-widgets h3 .postbox-title-action{position:absolute;right:30px;padding:0;top:8px;}#dashboard-widgets h4{font-family:Georgia,"Times New Roman","Bitstream Charter",Times,serif;font-weight:normal;font-size:13px;margin:0 0 .2em;padding:0;}#dashboard_right_now p.sub,#dashboard_right_now .table,#dashboard_right_now .versions{margin:-12px;}#dashboard_right_now .inside{font-size:12px;padding-top:20px;}#dashboard_right_now p.sub{padding:5px 0 15px;color:#8f8f8f;font-size:14px;position:absolute;top:-17px;left:15px;}#dashboard_right_now .table{margin:0;padding:0;position:relative;}#dashboard_right_now .table_content{float:left;border-top:#ececec 1px solid;width:45%;}#dashboard_right_now .table_discussion{float:right;border-top:#ececec 1px solid;width:45%;}#dashboard_right_now table td{padding:3px 0;white-space:nowrap;}#dashboard_right_now table tr.first td{border-top:none;}#dashboard_right_now td.b{padding-right:6px;text-align:right;font-family:Georgia,"Times New Roman","Bitstream Charter",Times,serif;font-size:14px;width:1%;}#dashboard_right_now td.b a{font-size:18px;}#dashboard_right_now td.b a:hover{color:#d54e21;}#dashboard_right_now .t{font-size:12px;padding-right:12px;padding-top:6px;color:#777;}#dashboard_right_now .t a{white-space:nowrap;}#dashboard_right_now .spam{color:red;}#dashboard_right_now .waiting{color:#e66f00;}#dashboard_right_now .approved{color:green;}#dashboard_right_now .versions{padding:6px 10px 12px;clear:both;}#dashboard_right_now .versions .b{font-weight:bold;}#dashboard_right_now a.button{float:right;clear:right;position:relative;top:-5px;}#dashboard_recent_comments h3{margin-bottom:0;}#dashboard_recent_comments .inside{margin-top:0;}#dashboard_recent_comments .comment-meta .approve{font-style:italic;font-family:sans-serif;font-size:10px;}#dashboard_recent_comments .subsubsub{float:none;}#the-comment-list{position:relative;}#the-comment-list .comment-item{padding:1em 10px;border-top:1px solid;}#the-comment-list .pingback{padding-left:9px!important;}#the-comment-list .comment-item,#the-comment-list #replyrow{margin:0 -10px;}#the-comment-list .comment-item:first-child{border-top:none;}#the-comment-list .comment-item .avatar{float:left;margin:0 10px 5px 0;}#the-comment-list .comment-item h4{line-height:1.7em;margin-top:-0.4em;color:#777;}#the-comment-list .comment-item h4 cite{font-style:normal;font-weight:normal;}#the-comment-list .comment-item blockquote,#the-comment-list .comment-item blockquote p{margin:0;padding:0;display:inline;}#dashboard_recent_comments #the-comment-list .trackback blockquote,#dashboard_recent_comments #the-comment-list .pingback blockquote{display:block;}#the-comment-list .comment-item p.row-actions{margin:3px 0 0;padding:0;font-size:12px;}#dashboard_quick_press h4{font-family:sans-serif;float:left;width:5.5em;clear:both;font-weight:normal;text-align:right;padding-top:5px;font-size:12px;}#dashboard_quick_press h4 label{margin-right:10px;}#dashboard_quick_press .input-text-wrap,#dashboard_quick_press .textarea-wrap{margin:0 0 1em 5em;}#dashboard_quick_press #media-buttons{margin:0 0 .5em 5em;padding:0 0 0 10px;font-size:12px;line-height:17px;color:#777;}#dashboard_quick_press #media-buttons a{vertical-align:bottom;}#dashboard-widgets #dashboard_quick_press form p.submit{margin-left:4.6em;}#dashboard-widgets #dashboard_quick_press form p.submit input{float:left;}#dashboard-widgets #dashboard_quick_press form p.submit #save-post{margin:0 1em 0 10px;}#dashboard-widgets #dashboard_quick_press form p.submit #publish{float:right;}#dashboard-widgets #dashboard_quick_press form p.submit img.waiting{vertical-align:middle;visibility:hidden;margin:4px 6px 0 0;}#dashboard_recent_drafts ul{margin:0;padding:0;list-style:none;}#dashboard_recent_drafts ul li{margin-bottom:1em;}#dashboard_recent_drafts h4{line-height:1.7em;}#dashboard_recent_drafts h4 abbr{font-weight:normal;font-family:sans-serif;font-size:12px;color:#999;margin-left:3px;}#dashboard_recent_drafts p{margin:0;padding:0;}.rss-widget ul{margin:0;padding:0;list-style:none;}a.rsswidget{font-size:13px;font-family:Georgia,"Times New Roman","Bitstream Charter",Times,serif;line-height:1.7em;}.rss-widget ul li{line-height:1.5em;margin-bottom:12px;}.rss-widget span.rss-date{color:#999;font-size:12px;margin-left:3px;}.rss-widget cite{display:block;text-align:right;margin:0 0 1em;padding:0;}.rss-widget cite:before{content:'\2014';}#dashboard_plugins h4{line-height:1.7em;}#dashboard_plugins h5{font-family:Georgia,"Times New Roman","Bitstream Charter",Times,serif;font-weight:normal;font-size:13px;margin:0;display:inline;line-height:1.4em;}#dashboard_plugins h5 a{line-height:1.4em;}#dashboard_plugins .inside span{font-size:12px;padding-left:5px;}#dashboard_plugins p{margin:.3em 0 1.4em;line-height:1.4em;}.dashboard-comment-wrap{overflow:hidden;word-wrap:break-word;}#dashboard_browser_nag a.update-browser-link{font-size:1.2em;font-weight:bold;}#dashboard_browser_nag a{text-decoration:underline;}#dashboard_browser_nag p.browser-update-nag.has-browser-icon{padding-right:125px;}#dashboard_browser_nag .browser-icon{margin-top:-35px;}#dashboard_browser_nag.postbox.browser-insecure{background-color:#ac1b1b;border-color:#ac1b1b;}#dashboard_browser_nag.postbox{background-color:#e29808;background-image:none;border-color:#edc048;-moz-box-shadow:none;-webkit-box-shadow:none;box-shadow:none;color:#fff;}#dashboard_browser_nag.postbox.browser-insecure h3{border-bottom-color:#cd5a5a;color:#fff;}#dashboard_browser_nag.postbox h3{border-bottom-color:#f6e2ac;text-shadow:none;-moz-box-shadow:none;-webkit-box-shadow:none;box-shadow:none;background:transparent none;color:#fff;}#dashboard_browser_nag a{color:#fff;}#dashboard_browser_nag.browser-insecure a.browse-happy-link,#dashboard_browser_nag.browser-insecure a.update-browser-link{text-shadow:#871b15 0 1px 0;}#dashboard_browser_nag a.browse-happy-link,#dashboard_browser_nag a.update-browser-link{text-shadow:#d29a04 0 1px 0;} \ No newline at end of file diff --git a/src/wp-admin/css/dashboard.dev.css b/src/wp-admin/css/dashboard.dev.css new file mode 100644 index 0000000..8371941 --- /dev/null +++ b/src/wp-admin/css/dashboard.dev.css @@ -0,0 +1,486 @@ +.postbox p, +.postbox ul, +.postbox ol, +.postbox blockquote, +#wp-version-message { + font-size: 12px; +} + +.edit-box { + display: none; +} + +h3:hover .edit-box { + display: inline; +} + +form .input-text-wrap { + background: #fff; + border-style: solid; + border-width: 1px; + padding: 2px 3px; + border-color: #ccc; +} + +#dashboard-widgets form .input-text-wrap input { + border: 0 none; + outline: none; + margin: 0; + padding: 0; + width: 99%; + color: #333; +} + +form .textarea-wrap { + background: #fff; + border-style: solid; + border-width: 1px; + padding: 2px; + border-color: #ccc; +} + +#dashboard-widgets form .textarea-wrap textarea { + border: 0 none; + padding: 0; + outline: none; + width: 99%; + -moz-box-sizing: border-box; + -webkit-box-sizing: border-box; + box-sizing: border-box; +} + +#dashboard-widgets .postbox form .submit { + float: none; + margin: .5em 0 0; + padding: 0; + border: none; +} + +#dashboard-widgets-wrap #dashboard-widgets .postbox form .submit input { + margin: 0; +} + +#dashboard-widgets-wrap #dashboard-widgets .postbox form .submit #publish { + min-width: 0; +} + +div.postbox div.inside { + margin: 10px 0; + position: relative; +} + +#dashboard-widgets a { + text-decoration: none; +} + +#dashboard-widgets h3 a { + text-decoration: underline; +} + +#dashboard-widgets h3 .postbox-title-action { + position: absolute; + right: 30px; + padding: 0; + top: 8px; +} + +#dashboard-widgets h4 { + font-family: Georgia, "Times New Roman", "Bitstream Charter", Times, serif; + font-weight: normal; + font-size: 13px; + margin: 0 0 .2em; + padding: 0; +} + +/* Right Now */ + +#dashboard_right_now p.sub, +#dashboard_right_now .table, #dashboard_right_now .versions { + margin: -12px; +} + +#dashboard_right_now .inside { + font-size: 12px; + padding-top: 20px; +} + +#dashboard_right_now p.sub { + padding: 5px 0 15px; + color: #8f8f8f; + font-size: 14px; + position: absolute; + top: -17px; + left: 15px; +} + +#dashboard_right_now .table { + margin: 0; + padding: 0; + position: relative; +} + +#dashboard_right_now .table_content { + float: left; + border-top: #ececec 1px solid; + width: 45%; +} + +#dashboard_right_now .table_discussion { + float: right; + border-top: #ececec 1px solid; + width: 45%; +} + +#dashboard_right_now table td { + padding: 3px 0; + white-space: nowrap; +} + +#dashboard_right_now table tr.first td { + border-top: none; +} + +#dashboard_right_now td.b { + padding-right: 6px; + text-align: right; + font-family: Georgia, "Times New Roman", "Bitstream Charter", Times, serif; + font-size: 14px; + width: 1%; +} + +#dashboard_right_now td.b a { + font-size: 18px; +} + +#dashboard_right_now td.b a:hover { + color: #d54e21; +} + +#dashboard_right_now .t { + font-size: 12px; + padding-right: 12px; + padding-top: 6px; + color: #777; +} + +#dashboard_right_now .t a { + white-space: nowrap; +} + +#dashboard_right_now .spam { + color: red; +} + +#dashboard_right_now .waiting { + color: #e66f00; +} + +#dashboard_right_now .approved { + color: green; +} + +#dashboard_right_now .versions { + padding: 6px 10px 12px; + clear: both; +} + +#dashboard_right_now .versions .b { + font-weight: bold; +} + +#dashboard_right_now a.button { + float: right; + clear: right; + position: relative; + top: -5px; +} + +/* Recent Comments */ + +#dashboard_recent_comments h3 { + margin-bottom: 0; +} + +#dashboard_recent_comments .inside { + margin-top: 0; +} + +#dashboard_recent_comments .comment-meta .approve { + font-style: italic; + font-family: sans-serif; + font-size: 10px; +} + +#dashboard_recent_comments .subsubsub { + float: none; +} + +#the-comment-list { + position: relative; +} + +#the-comment-list .comment-item { + padding: 1em 10px; + border-top: 1px solid; +} + +#the-comment-list .pingback { + padding-left: 9px !important; +} + +#the-comment-list .comment-item, +#the-comment-list #replyrow { + margin: 0 -10px; +} + +#the-comment-list .comment-item:first-child { + border-top: none; +} + +#the-comment-list .comment-item .avatar { + float: left; + margin: 0 10px 5px 0; +} + +#the-comment-list .comment-item h4 { + line-height: 1.7em; + margin-top: -0.4em; + color: #777; +} + +#the-comment-list .comment-item h4 cite { + font-style: normal; + font-weight: normal; +} + +#the-comment-list .comment-item blockquote, +#the-comment-list .comment-item blockquote p { + margin: 0; + padding: 0; + display: inline; +} + +#dashboard_recent_comments #the-comment-list .trackback blockquote, +#dashboard_recent_comments #the-comment-list .pingback blockquote { + display: block; +} + +#the-comment-list .comment-item p.row-actions { + margin: 3px 0 0; + padding: 0; + font-size: 12px; +} + +/* QuickPress */ + +#dashboard_quick_press h4 { + font-family: sans-serif; + float: left; + width: 5.5em; + clear: both; + font-weight: normal; + text-align: right; + padding-top: 5px; + font-size: 12px; +} + +#dashboard_quick_press h4 label { + margin-right: 10px; +} + +#dashboard_quick_press .input-text-wrap, +#dashboard_quick_press .textarea-wrap { + margin: 0 0 1em 5em; +} + +#dashboard_quick_press #media-buttons { + margin: 0 0 .5em 5em; + padding: 0 0 0 10px; + font-size: 12px; + line-height: 17px; + color: #777; +} + +#dashboard_quick_press #media-buttons a { + vertical-align: bottom; +} + +#dashboard-widgets #dashboard_quick_press form p.submit { + margin-left: 4.6em; +} + +#dashboard-widgets #dashboard_quick_press form p.submit input { + float: left; +} + +#dashboard-widgets #dashboard_quick_press form p.submit #save-post { + margin: 0 1em 0 10px; +} + +#dashboard-widgets #dashboard_quick_press form p.submit #publish { + float: right; +} + +#dashboard-widgets #dashboard_quick_press form p.submit img.waiting { + vertical-align: middle; + visibility: hidden; + margin: 4px 6px 0 0; +} + +/* Recent Drafts */ +#dashboard_recent_drafts ul { + margin: 0; + padding: 0; + list-style: none; +} + +#dashboard_recent_drafts ul li { + margin-bottom: 1em; +} + +#dashboard_recent_drafts h4 { + line-height: 1.7em; +} + +#dashboard_recent_drafts h4 abbr { + font-weight: normal; + font-family: sans-serif; + font-size: 12px; + color: #999; + margin-left: 3px; +} + +#dashboard_recent_drafts p { + margin: 0; + padding: 0; +} + +/* Feeds */ + +.rss-widget ul { + margin: 0; + padding: 0; + list-style: none; +} + +a.rsswidget { + font-size: 13px; + font-family: Georgia, "Times New Roman", "Bitstream Charter", Times, serif; + line-height: 1.7em; +} + +.rss-widget ul li { + line-height: 1.5em; + margin-bottom: 12px; +} + +.rss-widget span.rss-date { + color: #999; + font-size: 12px; + margin-left: 3px; +} + +.rss-widget cite { + display: block; + text-align: right; + margin: 0 0 1em; + padding: 0; +} + +.rss-widget cite:before { + content: '\2014'; +} + +/* Plugins */ +#dashboard_plugins h4 { + line-height: 1.7em; +} +#dashboard_plugins h5 { + font-family: Georgia, "Times New Roman", "Bitstream Charter", Times, serif; + font-weight: normal; + font-size: 13px; + margin: 0; + display: inline; + line-height: 1.4em; +} + +#dashboard_plugins h5 a { + line-height: 1.4em; +} + +#dashboard_plugins .inside span { + font-size: 12px; + padding-left: 5px; +} + +#dashboard_plugins p { + margin: 0.3em 0 1.4em; + line-height: 1.4em; +} + +.dashboard-comment-wrap { + overflow: hidden; + word-wrap: break-word; +} + +/* Browser Nag */ +#dashboard_browser_nag a.update-browser-link { + font-size: 1.2em; + font-weight: bold; +} + +#dashboard_browser_nag a { + text-decoration: underline; +} + +#dashboard_browser_nag p.browser-update-nag.has-browser-icon { + padding-right: 125px; +} + +#dashboard_browser_nag .browser-icon { + margin-top: -35px; +} + +#dashboard_browser_nag.postbox.browser-insecure { + background-color: #ac1b1b; + border-color: #ac1b1b; +} + +#dashboard_browser_nag.postbox { + background-color: #e29808; + background-image: none; + border-color: #edc048; + -moz-box-shadow: none; + -webkit-box-shadow: none; + box-shadow: none; + color: #fff; +} + +#dashboard_browser_nag.postbox.browser-insecure h3 { + border-bottom-color: #cd5a5a; + color: #fff; +} + +#dashboard_browser_nag.postbox h3 { + border-bottom-color: #f6e2ac; + text-shadow: none; + -moz-box-shadow: none; + -webkit-box-shadow: none; + box-shadow: none; + background: transparent none; + color: #fff; +} + +#dashboard_browser_nag a { + color: #fff; +} + +#dashboard_browser_nag.browser-insecure a.browse-happy-link, +#dashboard_browser_nag.browser-insecure a.update-browser-link { + text-shadow: #871b15 0 1px 0; +} + +#dashboard_browser_nag a.browse-happy-link, +#dashboard_browser_nag a.update-browser-link { + text-shadow: #d29a04 0 1px 0; +} diff --git a/src/wp-admin/css/farbtastic-rtl.css b/src/wp-admin/css/farbtastic-rtl.css new file mode 100644 index 0000000..7a8badb --- /dev/null +++ b/src/wp-admin/css/farbtastic-rtl.css @@ -0,0 +1,7 @@ +.farbtastic .color, .farbtastic .overlay { + left: 0; + right: 47px; +} +.farbtastic .marker { + margin: -8px -8px 0 0; +} diff --git a/src/wp-admin/css/farbtastic.css b/src/wp-admin/css/farbtastic.css new file mode 100644 index 0000000..71ad3c1 --- /dev/null +++ b/src/wp-admin/css/farbtastic.css @@ -0,0 +1,32 @@ +.farbtastic { + position: relative; +} +.farbtastic * { + position: absolute; + cursor: crosshair; +} +.farbtastic, .farbtastic .wheel { + width: 195px; + height: 195px; +} +.farbtastic .color, .farbtastic .overlay { + top: 47px; + left: 47px; + width: 101px; + height: 101px; +} +.farbtastic .wheel { + background: url(../images/wheel.png) no-repeat; + width: 195px; + height: 195px; +} +.farbtastic .overlay { + background: url(../images/mask.png) no-repeat; +} +.farbtastic .marker { + width: 17px; + height: 17px; + margin: -8px 0 0 -8px; + overflow: hidden; + background: url(../images/marker.png) no-repeat; +} \ No newline at end of file diff --git a/src/wp-admin/css/global-rtl.css b/src/wp-admin/css/global-rtl.css new file mode 100644 index 0000000..0a5a8b7 --- /dev/null +++ b/src/wp-admin/css/global-rtl.css @@ -0,0 +1 @@ +#wpcontent{margin-left:0;margin-right:165px;}.wp-admin #footer{margin-left:15px;margin-right:165px;}.js.folded #wpcontent{margin-left:0;margin-right:52px;}.js.folded.wp-admin #footer{margin-left:15px;margin-right:52px;}#wpbody-content{float:right;}#adminmenuwrap{float:right;}#adminmenu{clear:right;}.inner-sidebar{float:left;clear:left;}.has-right-sidebar #post-body{float:right;clear:right;margin-right:0;margin-left:-340px;}.has-right-sidebar #post-body-content{margin-right:0;margin-left:300px;}#col-right{float:left;clear:left;}.alignleft{float:right;}.alignright{float:left;}.textleft{text-align:right;}.textright{text-align:left;}.screen-reader-text,.screen-reader-text span{left:auto;right:-1000em;}body,td,textarea,input,select{font-family:Tahoma,Arial,sans-serif;}ul.ul-disc,ul.ul-square,ol.ol-decimal{margin-left:0;margin-right:1.8em;}.subsubsub{float:right;}.widefat thead th:first-of-type{-moz-border-radius-topleft:0;-moz-border-radius-topright:3px;-khtml-border-top-left-radius:0;-khtml-border-top-right-radius:3px;-webkit-border-top-left-radius:0;-webkit-border-top-right-radius:3px;border-top-left-radius:0;border-top-right-radius:3px;}.widefat thead th:last-of-type{-moz-border-radius-topright:0;-moz-border-radius-topleft:3px;-khtml-border-top-right-radius:0;-khtml-border-top-left-radius:3px;-webkit-border-top-right-radius:0;-webkit-border-top-left-radius:3px;border-top-right-radius:0;border-top-left-radius:3px;}.widefat tfoot th:first-of-type{-moz-border-radius-bottomleft:0;-moz-border-radius-bottomright:3px;-khtml-border-bottom-left-radius:0;-khtml-border-bottom-right-radius:3px;-webkit-border-bottom-left-radius:0;-webkit-border-bottom-right-radius:3px;border-bottom-left-radius:0;border-bottom-right-radius:3px;}.widefat tfoot th:last-of-type{-moz-border-radius-bottomright:0;-moz-border-radius-bottomleft:3px;-khtml-border-bottom-right-radius:0;-khtml-border-bottom-left-radius:3px;-webkit-border-bottom-right-radius:0;-webkit-border-bottom-left-radius:3px;border-bottom-right-radius:0;border-bottom-left-radius:3px;}.widefat th{text-align:right;}.widefat th input{margin:0 8px 0 0;}.wrap{margin:0 0 0 15px;}.wrap h2,.subtitle{font-family:Tahoma,Arial,sans-serif;}.wrap h2{padding:9px 0 4px 15px;}.subtitle{padding-left:0;padding-right:25px;}.wrap .add-new-h2{font-family:Tahoma,Arial,sans-serif;margin-left:0;margin-right:4px;}.wrap h2.long-header{padding-left:0;} \ No newline at end of file diff --git a/src/wp-admin/css/global-rtl.dev.css b/src/wp-admin/css/global-rtl.dev.css new file mode 100644 index 0000000..7907b6b --- /dev/null +++ b/src/wp-admin/css/global-rtl.dev.css @@ -0,0 +1,181 @@ + +/* 2 column liquid layout */ + +#wpcontent { + margin-left: 0; + margin-right: 165px; +} + +.wp-admin #footer { + margin-left: 15px; + margin-right: 165px; +} + +.js.folded #wpcontent { + margin-left: 0; + margin-right: 52px; +} + +.js.folded.wp-admin #footer { + margin-left: 15px; + margin-right: 52px; +} + +#wpbody-content { + float: right; +} + +#adminmenuwrap { + float: right; +} + +#adminmenu { + clear: right; +} + +/* inner 2 column liquid layout */ +.inner-sidebar { + float: left; + clear: left; +} + +.has-right-sidebar #post-body { + float: right; + clear: right; + margin-right: 0; + margin-left: -340px; +} + +.has-right-sidebar #post-body-content { + margin-right: 0; + margin-left: 300px; +} + +/* 2 columns main area */ + +#col-right { + float: left; + clear: left; +} + +/* utility classes*/ +.alignleft { + float: right; +} + +.alignright { + float: left; +} + +.textleft { + text-align: right; +} + +.textright { + text-align: left; +} + +/* Hide visually but not from screen readers */ +.screen-reader-text, .screen-reader-text span { + left: auto; + right: -1000em; +} + +/* styles for use by people extending the WordPress interface */ + +body, +td, +textarea, +input, +select { + font-family: Tahoma, Arial, sans-serif; +} + +ul.ul-disc, +ul.ul-square, +ol.ol-decimal { + margin-left: 0; + margin-right: 1.8em; +} + +.subsubsub { + float: right; +} + +.widefat thead th:first-of-type { + -moz-border-radius-topleft: 0; + -moz-border-radius-topright: 3px; + -khtml-border-top-left-radius: 0; + -khtml-border-top-right-radius: 3px; + -webkit-border-top-left-radius: 0; + -webkit-border-top-right-radius: 3px; + border-top-left-radius: 0; + border-top-right-radius: 3px; +} + +.widefat thead th:last-of-type { + -moz-border-radius-topright: 0; + -moz-border-radius-topleft: 3px; + -khtml-border-top-right-radius: 0; + -khtml-border-top-left-radius: 3px; + -webkit-border-top-right-radius: 0; + -webkit-border-top-left-radius: 3px; + border-top-right-radius: 0; + border-top-left-radius: 3px; +} +.widefat tfoot th:first-of-type { + -moz-border-radius-bottomleft: 0; + -moz-border-radius-bottomright: 3px; + -khtml-border-bottom-left-radius: 0; + -khtml-border-bottom-right-radius: 3px; + -webkit-border-bottom-left-radius: 0; + -webkit-border-bottom-right-radius: 3px; + border-bottom-left-radius: 0; + border-bottom-right-radius: 3px; +} +.widefat tfoot th:last-of-type { + -moz-border-radius-bottomright: 0; + -moz-border-radius-bottomleft: 3px; + -khtml-border-bottom-right-radius: 0; + -khtml-border-bottom-left-radius: 3px; + -webkit-border-bottom-right-radius: 0; + -webkit-border-bottom-left-radius: 3px; + border-bottom-right-radius: 0; + border-bottom-left-radius: 3px; +} + +.widefat th { + text-align: right; +} + +.widefat th input { + margin: 0 8px 0 0; +} + +.wrap { + margin: 0 0 0 15px; +} + + +.wrap h2, +.subtitle { + font-family: Tahoma, Arial, sans-serif; +} +.wrap h2 { + padding: 9px 0 4px 15px; +} + +.subtitle { + padding-left: 0; + padding-right: 25px; +} + +.wrap .add-new-h2 { + font-family: Tahoma, Arial, sans-serif; + margin-left: 0; + margin-right: 4px; +} + +.wrap h2.long-header { + padding-left: 0; +} diff --git a/src/wp-admin/css/global.css b/src/wp-admin/css/global.css new file mode 100644 index 0000000..739d365 --- /dev/null +++ b/src/wp-admin/css/global.css @@ -0,0 +1 @@ +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,img,ins,kbd,q,s,samp,small,strike,strong,sub,sup,tt,var,b,u,i,center,dl,dt,dd,ol,ul,li,fieldset,form,label,legend,table,caption,tbody,tfoot,thead,tr,th,td{margin:0;padding:0;border:0;outline:0;background:transparent;}body{line-height:1;}ol,ul{list-style:none;}blockquote,q{quotes:none;}blockquote:before,blockquote:after,q:before,q:after{content:'';content:none;}ins{text-decoration:none;}del{text-decoration:line-through;}#wpwrap{height:auto;min-height:100%;width:100%;position:relative;}#wpcontent{height:100%;}#wpcontent,#footer{margin-left:165px;}#wpbody-content{padding-bottom:65px;}.js.folded #wpcontent,.js.folded #footer{margin-left:52px;}#wpbody-content{float:left;width:100%;}#adminmenuback,#adminmenuwrap,#adminmenu,.js.folded #adminmenu .wp-submenu.sub-open,.js.folded #adminmenu .wp-submenu-wrap{width:145px;}#adminmenuback{position:absolute;top:0;bottom:0;z-index:-1;}#adminmenuwrap{float:left;}#adminmenu{clear:left;padding:0;list-style:none;}.js.folded #adminmenuback,.js.folded #adminmenuwrap,.js.folded #adminmenu,.js.folded #adminmenu li.menu-top{width:32px;}#footer{position:relative;}.inner-sidebar{float:right;clear:right;display:none;width:281px;position:relative;}.inner-sidebar #side-sortables{width:280px;min-height:300px;}.has-right-sidebar .inner-sidebar{display:block;}.has-right-sidebar #post-body{float:left;clear:left;width:100%;margin-right:-340px;}.has-right-sidebar #post-body-content{margin-right:300px;}#col-container{overflow:hidden;padding:0;margin:0;}#col-left{padding:0;margin:0;overflow:hidden;width:39%;}#col-right{float:right;clear:right;overflow:hidden;padding:0;margin:0;width:59%;}.alignleft{float:left;}.alignright{float:right;}.textleft{text-align:left;}.textright{text-align:right;}.clear{clear:both;}.screen-reader-text,.screen-reader-text span{position:absolute;left:-1000em;height:1px;width:1px;overflow:hidden;}.hidden,.js .closed .inside,.js .hide-if-js,.no-js .hide-if-no-js{display:none;}input[type="text"],input[type="password"],textarea{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;-ms-box-sizing:border-box;box-sizing:border-box;}input[type="checkbox"],input[type="radio"]{vertical-align:middle;}html,body{height:100%;}body,td,textarea,input,select{font-family:sans-serif;font-size:13px;}body,textarea{line-height:1.4em;}input,select{line-height:15px;}p{margin:1em 0;}blockquote{margin:1em;}label{cursor:pointer;}li,dd{margin-bottom:6px;}p,li,dl,dd,dt{line-height:140%;}textarea,input,select{margin:1px;padding:3px;}h1{display:block;font-size:2em;font-weight:bold;margin:.67em 0;}h2{display:block;font-size:1.5em;font-weight:bold;margin:.83em 0;}h3{display:block;font-size:1.17em;font-weight:bold;margin:1em 0;}h4{display:block;font-size:1em;font-weight:bold;margin:1.33em 0;}h5{display:block;font-size:.83em;font-weight:bold;margin:1.67em 0;}h6{display:block;font-size:.67em;font-weight:bold;margin:2.33em 0;}ul.ul-disc{list-style:disc outside;}ul.ul-square{list-style:square outside;}ol.ol-decimal{list-style:decimal outside;}ul.ul-disc,ul.ul-square,ol.ol-decimal{margin-left:1.8em;}ul.ul-disc>li,ul.ul-square>li,ol.ol-decimal>li{margin:0 0 .5em;}.subsubsub{list-style:none;margin:8px 0 5px;padding:0;white-space:nowrap;font-size:12px;float:left;}.subsubsub a{line-height:2;padding:.2em;text-decoration:none;}.subsubsub a .count,.subsubsub a.current .count{color:#999;font-weight:normal;}.subsubsub a.current{font-weight:bold;background:none;border:none;}.subsubsub li{display:inline;margin:0;padding:0;}.widefat{border-width:1px;border-style:solid;border-spacing:0;width:100%;clear:both;margin:0;-moz-border-radius:3px;-khtml-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;}.widefat *{word-wrap:break-word;}.widefat a{text-decoration:none;}.widefat thead th:first-of-type{-moz-border-radius-topleft:3px;-khtml-border-top-left-radius:3px;-webkit-border-top-left-radius:3px;border-top-left-radius:3px;}.widefat thead th:last-of-type{-moz-border-radius-topright:3px;-khtml-border-top-right-radius:3px;-webkit-border-top-right-radius:3px;border-top-right-radius:3px;}.widefat tfoot th:first-of-type{-moz-border-radius-bottomleft:3px;-khtml-border-bottom-left-radius:3px;-webkit-border-bottom-left-radius:3px;border-bottom-left-radius:3px;}.widefat tfoot th:last-of-type{-moz-border-radius-bottomright:3px;-khtml-border-bottom-right-radius:3px;-webkit-border-bottom-right-radius:3px;border-bottom-right-radius:3px;}.widefat td,.widefat th{border-width:1px 0;border-style:solid;}.widefat tfoot th{border-bottom:none;}.widefat .no-items td{border-bottom-width:0;}.widefat td{font-size:12px;padding:4px 7px 2px;vertical-align:top;}.widefat td p,.widefat td ol,.widefat td ul{font-size:12px;}.widefat th{padding:7px 7px 8px;text-align:left;line-height:1.3em;font-size:14px;}.widefat th input{margin:0 0 0 8px;padding:0;vertical-align:text-top;}.widefat .check-column{width:2.2em;padding:11px 0 0;vertical-align:top;}.widefat tbody th.check-column{padding:9px 0 22px;}.widefat .num,.column-comments,.column-links,.column-posts{text-align:center;}.widefat th#comments{vertical-align:middle;}.wrap{margin:0 15px 0 0;}div.updated,div.error{border-width:1px;border-style:solid;padding:0 .6em;margin:5px 15px 2px;-moz-border-radius:3px;-khtml-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;}div.updated p,div.error p{margin:.5em 0;padding:2px;}.wrap div.updated,.wrap div.error{margin:5px 0 15px;}.wrap h2,.subtitle{font-family:"HelveticaNeue-Light","Helvetica Neue Light","Helvetica Neue",sans-serif;font-weight:normal;margin:0;text-shadow:rgba(255,255,255,1) 0 1px 0;}.wrap h2{font-size:23px;padding:9px 15px 4px 0;line-height:29px;}.subtitle{font-size:14px;padding-left:25px;}.wrap .add-new-h2{font-family:sans-serif;margin-left:4px;padding:3px 8px;position:relative;top:-3px;-moz-border-radius:3px;-khtml-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;text-decoration:none;font-size:12px;}.wrap h2.long-header{padding-right:0;}.fade-1000{opacity:0;-moz-transition-property:opacity;-moz-transition-duration:1s;-webkit-transition-property:opacity;-webkit-transition-duration:1s;-o-transition-property:opacity;-o-transition-duration:1s;transition-property:opacity;transition-duration:1s;}.fade-600{opacity:0;-moz-transition-property:opacity;-moz-transition-duration:.6s;-webkit-transition-property:opacity;-webkit-transition-duration:.6s;-o-transition-property:opacity;-o-transition-duration:.6s;transition-property:opacity;transition-duration:.6s;}.fade-400{opacity:0;-moz-transition-property:opacity;-moz-transition-duration:.4s;-webkit-transition-property:opacity;-webkit-transition-duration:.4s;-o-transition-property:opacity;-o-transition-duration:.4s;transition-property:opacity;transition-duration:.4s;}.fade-300{opacity:0;-moz-transition-property:opacity;-moz-transition-duration:.3s;-webkit-transition-property:opacity;-webkit-transition-duration:.3s;-o-transition-property:opacity;-o-transition-duration:.3s;transition-property:opacity;transition-duration:.3s;}.fade-trigger{opacity:1;} \ No newline at end of file diff --git a/src/wp-admin/css/global.dev.css b/src/wp-admin/css/global.dev.css new file mode 100644 index 0000000..1a74f12 --- /dev/null +++ b/src/wp-admin/css/global.dev.css @@ -0,0 +1,607 @@ +/* http://meyerweb.com/eric/tools/css/reset/ */ +/* v1.0 | 20080212 */ + +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, img, ins, kbd, q, s, samp, +small, strike, strong, sub, sup, tt, var, +b, u, i, center, +dl, dt, dd, ol, ul, li, +fieldset, form, label, legend, +table, caption, tbody, tfoot, thead, tr, th, td { + margin: 0; + padding: 0; + border: 0; + outline: 0; +/* font-size: 100%; + vertical-align: baseline; */ + background: transparent; +} +body { + line-height: 1; +} +ol, ul { + list-style: none; +} +blockquote, q { + quotes: none; +} +blockquote:before, blockquote:after, +q:before, q:after { + content: ''; + content: none; +} + +/* remember to define focus styles! */ +/* +:focus { + outline: 0; +} +*/ +/* remember to highlight inserts somehow! */ +ins { + text-decoration: none; +} +del { + text-decoration: line-through; +} + +/* tables still need 'cellspacing="0"' in the markup */ +/* +table { + border-collapse: collapse; + border-spacing: 0; +} +*/ +/* end reset css */ + + +/* 2 column liquid layout */ +#wpwrap { + height: auto; + min-height: 100%; + width: 100%; + position: relative; +} + +#wpcontent { + height: 100%; +} + +#wpcontent, +#footer { + margin-left: 165px; +} + +#wpbody-content { + padding-bottom: 65px; +} + +.js.folded #wpcontent, +.js.folded #footer { + margin-left: 52px; +} + +#wpbody-content { + float: left; + width: 100%; +} + +#adminmenuback, +#adminmenuwrap, +#adminmenu, +.js.folded #adminmenu .wp-submenu.sub-open, +.js.folded #adminmenu .wp-submenu-wrap { + width: 145px; +} + +#adminmenuback { + position: absolute; + top: 0; + bottom: 0; + z-index: -1; +} + +#adminmenuwrap { + float: left; +} + +#adminmenu { + clear: left; + padding: 0; + list-style: none; +} + +.js.folded #adminmenuback, +.js.folded #adminmenuwrap, +.js.folded #adminmenu, +.js.folded #adminmenu li.menu-top { + width: 32px; +} + +#footer { + position: relative; +} + +/* inner 2 column liquid layout */ +.inner-sidebar { + float: right; + clear: right; + display: none; + width: 281px; + position: relative; +} + +.inner-sidebar #side-sortables { + width: 280px; + min-height: 300px; +} + +.has-right-sidebar .inner-sidebar { + display: block; +} + +.has-right-sidebar #post-body { + float: left; + clear: left; + width: 100%; + margin-right: -340px; +} + +.has-right-sidebar #post-body-content { + margin-right: 300px; +} + +/* 2 columns main area */ + +#col-container { + overflow: hidden; + padding: 0; + margin: 0; +} + +#col-left { + padding: 0; + margin: 0; + overflow: hidden; + width: 39%; +} + +#col-right { + float: right; + clear: right; + overflow: hidden; + padding: 0; + margin: 0; + width: 59%; +} + +/* utility classes */ +.alignleft { + float: left; +} + +.alignright { + float: right; +} + +.textleft { + text-align: left; +} + +.textright { + text-align: right; +} + +.clear { + clear: both; +} + +/* Hide visually but not from screen readers */ +.screen-reader-text, +.screen-reader-text span { + position: absolute; + left: -1000em; + height: 1px; + width: 1px; + overflow: hidden; +} + +.hidden, +.js .closed .inside, +.js .hide-if-js, +.no-js .hide-if-no-js { + display: none; +} + +/* include margin and padding in the width calculation of input and textarea */ +input[type="text"], +input[type="password"], +textarea { + -moz-box-sizing: border-box; + -webkit-box-sizing: border-box; + -ms-box-sizing: border-box; /* ie8 only */ + box-sizing: border-box; +} + +input[type="checkbox"], +input[type="radio"] { + vertical-align: middle; +} + +/* styles for use by people extending the WordPress interface */ +html, +body { + height: 100%; +} + +body, +td, +textarea, +input, +select { + font-family: sans-serif; + font-size: 13px; +} + +body, +textarea { + line-height: 1.4em; +} + +input, +select { + line-height: 15px; +} + +p { + margin: 1em 0; +} + +blockquote { + margin: 1em; +} + +label { + cursor: pointer; +} + +li, +dd { + margin-bottom: 6px; +} + +p, +li, +dl, +dd, +dt { + line-height: 140%; +} + +textarea, +input, +select { + margin: 1px; + padding: 3px; +} + +h1 { + display: block; + font-size: 2em; + font-weight: bold; + margin: .67em 0; +} + +h2 { + display: block; + font-size: 1.5em; + font-weight: bold; + margin: .83em 0; +} + +h3 { + display: block; + font-size: 1.17em; + font-weight: bold; + margin: 1em 0; +} + +h4 { + display: block; + font-size: 1em; + font-weight: bold; + margin: 1.33em 0; +} + +h5 { + display: block; + font-size: 0.83em; + font-weight: bold; + margin: 1.67em 0; +} + +h6 { + display: block; + font-size: 0.67em; + font-weight: bold; + margin: 2.33em 0; +} + +ul.ul-disc { + list-style: disc outside; +} + +ul.ul-square { + list-style: square outside; +} + +ol.ol-decimal { + list-style: decimal outside; +} + +ul.ul-disc, +ul.ul-square, +ol.ol-decimal { + margin-left: 1.8em; +} + +ul.ul-disc > li, +ul.ul-square > li, +ol.ol-decimal > li { + margin: 0 0 0.5em; +} + +.subsubsub { + list-style: none; + margin: 8px 0 5px; + padding: 0; + white-space: nowrap; + font-size: 12px; + float: left; +} + +.subsubsub a { + line-height: 2; + padding: .2em; + text-decoration: none; +} + +.subsubsub a .count, .subsubsub a.current .count { + color: #999; + font-weight: normal; +} + +.subsubsub a.current { + font-weight: bold; + background: none; + border: none; +} + +.subsubsub li { + display: inline; + margin: 0; + padding: 0; +} + +.widefat { + border-width: 1px; + border-style: solid; + border-spacing: 0; + width: 100%; + clear: both; + margin: 0; + -moz-border-radius: 3px; + -khtml-border-radius: 3px; + -webkit-border-radius: 3px; + border-radius: 3px; +} + +.widefat * { + word-wrap: break-word; +} + +.widefat a { + text-decoration: none; +} + +.widefat thead th:first-of-type { + -moz-border-radius-topleft: 3px; + -khtml-border-top-left-radius: 3px; + -webkit-border-top-left-radius: 3px; + border-top-left-radius: 3px; +} +.widefat thead th:last-of-type { + -moz-border-radius-topright: 3px; + -khtml-border-top-right-radius: 3px; + -webkit-border-top-right-radius: 3px; + border-top-right-radius: 3px; +} +.widefat tfoot th:first-of-type { + -moz-border-radius-bottomleft: 3px; + -khtml-border-bottom-left-radius: 3px; + -webkit-border-bottom-left-radius: 3px; + border-bottom-left-radius: 3px; +} +.widefat tfoot th:last-of-type { + -moz-border-radius-bottomright: 3px; + -khtml-border-bottom-right-radius: 3px; + -webkit-border-bottom-right-radius: 3px; + border-bottom-right-radius: 3px; +} + +.widefat td, +.widefat th { + border-width: 1px 0; + border-style: solid; +} +.widefat tfoot th { + border-bottom: none; +} + +.widefat .no-items td { + border-bottom-width: 0; +} + +.widefat td { + font-size: 12px; + padding: 4px 7px 2px; + vertical-align: top; +} + +.widefat td p, +.widefat td ol, +.widefat td ul { + font-size: 12px; +} + +.widefat th { + padding: 7px 7px 8px; + text-align: left; + line-height: 1.3em; + font-size: 14px; +} + +.widefat th input { + margin: 0 0 0 8px; + padding: 0; + vertical-align: text-top; +} + +.widefat .check-column { + width: 2.2em; + padding: 11px 0 0; + vertical-align: top; +} + +.widefat tbody th.check-column { + padding: 9px 0 22px; +} + +.widefat .num, +.column-comments, +.column-links, +.column-posts { + text-align: center; +} + +.widefat th#comments { + vertical-align: middle; +} + +.wrap { + margin: 0 15px 0 0; +} + +div.updated, +div.error { + border-width: 1px; + border-style: solid; + padding: 0 0.6em; + margin: 5px 15px 2px; + -moz-border-radius: 3px; + -khtml-border-radius: 3px; + -webkit-border-radius: 3px; + border-radius: 3px; +} + +div.updated p, +div.error p { + margin: 0.5em 0; + padding: 2px; +} + +.wrap div.updated, +.wrap div.error { + margin: 5px 0 15px; +} + +.wrap h2, +.subtitle { + font-family: "HelveticaNeue-Light", "Helvetica Neue Light", "Helvetica Neue", sans-serif; + font-weight: normal; + margin: 0; + text-shadow: rgba(255,255,255,1) 0 1px 0; +} +.wrap h2 { + font-size: 23px; + padding: 9px 15px 4px 0; + line-height: 29px; +} +.subtitle { + font-size: 14px; + padding-left: 25px; +} +.wrap .add-new-h2 { + font-family: sans-serif; + margin-left: 4px; + padding: 3px 8px; + position: relative; + top: -3px; + -moz-border-radius: 3px; + -khtml-border-radius: 3px; + -webkit-border-radius: 3px; + border-radius: 3px; + text-decoration: none; + font-size: 12px; +} + +.wrap h2.long-header { + padding-right: 0; +} + + +/* =CSS 3 transitions +-------------------------------------------------------------- */ +.fade-1000 { + opacity: 0; + -moz-transition-property: opacity; + -moz-transition-duration: 1s; + -webkit-transition-property: opacity; + -webkit-transition-duration: 1s; + -o-transition-property: opacity; + -o-transition-duration: 1s; + transition-property: opacity; + transition-duration: 1s; +} + +.fade-600 { + opacity: 0; + -moz-transition-property: opacity; + -moz-transition-duration: 0.6s; + -webkit-transition-property: opacity; + -webkit-transition-duration: 0.6s; + -o-transition-property: opacity; + -o-transition-duration: 0.6s; + transition-property: opacity; + transition-duration: 0.6s; +} + +.fade-400 { + opacity: 0; + -moz-transition-property: opacity; + -moz-transition-duration: 0.4s; + -webkit-transition-property: opacity; + -webkit-transition-duration: 0.4s; + -o-transition-property: opacity; + -o-transition-duration: 0.4s; + transition-property: opacity; + transition-duration: 0.4s; +} + +.fade-300 { + opacity: 0; + -moz-transition-property: opacity; + -moz-transition-duration: 0.3s; + -webkit-transition-property: opacity; + -webkit-transition-duration: 0.3s; + -o-transition-property: opacity; + -o-transition-duration: 0.3s; + transition-property: opacity; + transition-duration: 0.3s; +} + +.fade-trigger { + opacity: 1; +} diff --git a/src/wp-admin/css/ie-rtl.css b/src/wp-admin/css/ie-rtl.css new file mode 100644 index 0000000..40f5b76 --- /dev/null +++ b/src/wp-admin/css/ie-rtl.css @@ -0,0 +1 @@ +html{direction:ltr;}body{direction:rtl;}* html #wpcontent #adminmenu .wp-has-submenu .wp-menu-toggle{background:url(../images/menu-bits-rtl.gif?ver=20100531) no-repeat scroll right -109px;}* html #wpcontent #adminmenu li.wp-has-current-submenu .wp-menu-toggle{background:url(../images/menu-bits-rtl.gif?ver=20100531) no-repeat scroll right -206px;}* html #adminmenu{margin-left:0;margin-right:-80px;}* html div.folded #adminmenu{margin-left:0;margin-right:-22px;}#wpcontent #adminmenu .wp-submenu li.wp-submenu-head{padding:3px 10px 4px 4px;}.inline-edit-row fieldset label span.title{float:right;}.inline-edit-row fieldset label span.input-text-wrap{margin-right:0;}p.search-box{float:left;}* html #poststuff h2{margin-right:0;}#bh{margin:7px 10px 0 0;float:left;}#user_info+div#favorite-actions{right:auto;left:15px;}#wphead-info{float:left;}div#dashboard-widgets{padding-right:0;padding-left:1px;}.tagchecklist span a{margin:4px -9px 0 0;}.widefat th input{margin:0 5px 0 0;}#TB_window{width:670px;position:absolute;top:50%;left:50%;margin-right:335px!important;}#dashboard_plugins{direction:ltr;}#dashboard_plugins h3.hndle{direction:rtl;}#dashboard_incoming_links ul li,#dashboard_secondary ul li,#dashboard_primary ul li,p.row-actions{width:100%;}#favorite-inside{position:absolute;right:0;}#post-status-info{height:25px;}#screen-meta{position:static;}p.submit{height:22px;}.inner-sidebar{position:static;}form#widgets-filter{position:static;}* html .meta-box-sortables .postbox .handlediv{background:transparent url(../images/menu-bits-rtl-vs.gif) no-repeat scroll right -111px;}.menu-max-depth-0 #menu-management{width:460px;}.menu-max-depth-1 #menu-management{width:490px;}.menu-max-depth-2 #menu-management{width:520px;}.menu-max-depth-3 #menu-management{width:550px;}.menu-max-depth-4 #menu-management{width:580px;}.menu-max-depth-5 #menu-management{width:610px;}.menu-max-depth-6 #menu-management{width:640px;}.menu-max-depth-7 #menu-management{width:670px;}.menu-max-depth-8 #menu-management{width:700px;}.menu-max-depth-9 #menu-management{width:730px;}.menu-max-depth-10 #menu-management{width:760px;}.menu-max-depth-11 #menu-management{width:790px;}.menu-item-depth-0{margin-left:0;}.menu-item-depth-1{margin-left:-30px;}.menu-item-depth-2{margin-left:-60px;}.menu-item-depth-3{margin-left:-90px;}.menu-item-depth-4{margin-left:-120px;}.menu-item-depth-5{margin-left:-150px;}.menu-item-depth-6{margin-left:-180px;}.menu-item-depth-7{margin-left:-210px;}.menu-item-depth-8{margin-left:-240px;}.menu-item-depth-9{margin-left:-270px;}.menu-item-depth-10{margin-left:-300px;}.menu-item-depth-11{margin-left:-330px;}#menu-to-edit li dl{padding:0!important;margin:0!important;}.ui-sortable-helper .menu-item-transport{margin-top:13px;}.ui-sortable-helper .menu-item-transport .menu-item-transport{margin-top:0;}.sortable-placeholder{margin-top:0!important;margin-left:0!important;margin-bottom:13px!important;padding:0!important;}.auto-add-pages{clear:both;float:none;}#nav-menus-frame .open-label span{float:none;display:inline-block;}#nav-menus-frame .delete-action{float:none;} \ No newline at end of file diff --git a/src/wp-admin/css/ie-rtl.dev.css b/src/wp-admin/css/ie-rtl.dev.css new file mode 100644 index 0000000..c35fc89 --- /dev/null +++ b/src/wp-admin/css/ie-rtl.dev.css @@ -0,0 +1,156 @@ +html { + direction: ltr; +} +body { + direction: rtl; +} +* html #wpcontent #adminmenu .wp-has-submenu .wp-menu-toggle { + background: url(../images/menu-bits-rtl.gif?ver=20100531) no-repeat scroll right -109px; +} + +* html #wpcontent #adminmenu li.wp-has-current-submenu .wp-menu-toggle { + background: url(../images/menu-bits-rtl.gif?ver=20100531) no-repeat scroll right -206px; +} +* html #adminmenu { + margin-left:0; + margin-right: -80px; +} +* html div.folded #adminmenu { + margin-left: 0; + margin-right: -22px; +} +#wpcontent #adminmenu .wp-submenu li.wp-submenu-head { + padding: 3px 10px 4px 4px; +} +.inline-edit-row fieldset label span.title { + float: right; +} +.inline-edit-row fieldset label span.input-text-wrap { + margin-right: 0; +} +p.search-box { + float: left; +} +* html #poststuff h2 { + margin-right: 0; +} +#bh { + margin: 7px 10px 0 0; + float: left; +} +#user_info + div#favorite-actions { + right: auto; + left: 15px; +} +#wphead-info { + float: left; +} +/* without this dashboard widgets appear in one column for some screen widths */ +div#dashboard-widgets { + padding-right: 0; + padding-left: 1px; +} +.tagchecklist span a { + margin: 4px -9px 0 0; +} +.widefat th input { + margin: 0 5px 0 0; +} +/* ---------- add by navid */ +#TB_window { + width: 670px; + position: absolute; + top: 50%; + left: 50%; + margin-right: 335px !important; +} +#dashboard_plugins { + direction: ltr; +} +#dashboard_plugins h3.hndle { + direction: rtl; +} +#dashboard_incoming_links ul li, +#dashboard_secondary ul li, +#dashboard_primary ul li, +p.row-actions { + width: 100%; +} +#favorite-inside { + position: absolute; + right:0; +} +#post-status-info { + height: 25px; +} +#screen-meta { + position: static; +} +p.submit { /* quick edit and reply in edit-comments.php */ + height:22px; +} +.inner-sidebar { /* fix edit single comment */ + position: static; +} +form#widgets-filter { /* fix widget page */ + position: static; +} + +* html .meta-box-sortables .postbox .handlediv { + background: transparent url(../images/menu-bits-rtl-vs.gif) no-repeat scroll right -111px; +} + +/* nav menus */ +.menu-max-depth-0 #menu-management { width: 460px; } +.menu-max-depth-1 #menu-management { width: 490px; } +.menu-max-depth-2 #menu-management { width: 520px; } +.menu-max-depth-3 #menu-management { width: 550px; } +.menu-max-depth-4 #menu-management { width: 580px; } +.menu-max-depth-5 #menu-management { width: 610px; } +.menu-max-depth-6 #menu-management { width: 640px; } +.menu-max-depth-7 #menu-management { width: 670px; } +.menu-max-depth-8 #menu-management { width: 700px; } +.menu-max-depth-9 #menu-management { width: 730px; } +.menu-max-depth-10 #menu-management { width: 760px; } +.menu-max-depth-11 #menu-management { width: 790px; } + +.menu-item-depth-0 { margin-left: 0px; } +.menu-item-depth-1 { margin-left: -30px; } +.menu-item-depth-2 { margin-left: -60px; } +.menu-item-depth-3 { margin-left: -90px; } +.menu-item-depth-4 { margin-left: -120px; } +.menu-item-depth-5 { margin-left: -150px; } +.menu-item-depth-6 { margin-left: -180px; } +.menu-item-depth-7 { margin-left: -210px; } +.menu-item-depth-8 { margin-left: -240px; } +.menu-item-depth-9 { margin-left: -270px; } +.menu-item-depth-10 { margin-left: -300px; } +.menu-item-depth-11 { margin-left: -330px; } + +#menu-to-edit li dl { + padding: 0 !important; + margin: 0 !important; +} +.ui-sortable-helper .menu-item-transport { + margin-top: 13px; +} + .ui-sortable-helper .menu-item-transport .menu-item-transport { + margin-top: 0; + } +.sortable-placeholder { + margin-top: 0 !important; + margin-left: 0 !important; + margin-bottom: 13px !important; + padding: 0 !important; +} +.auto-add-pages { + clear: both; + float: none; +} +#nav-menus-frame .open-label span { + float: none; + display: inline-block; +} +#nav-menus-frame .delete-action { + float: none; +} diff --git a/src/wp-admin/css/ie.css b/src/wp-admin/css/ie.css new file mode 100644 index 0000000..00e1af7 --- /dev/null +++ b/src/wp-admin/css/ie.css @@ -0,0 +1 @@ +#wp-fullscreen-title{width:97%;}#wp_mce_fullscreen_ifr{background-color:#f9f9f9;}#wp-fullscreen-tagline{color:#888;font-size:14px;}#adminmenuback{left:0;}#adminmenu li.wp-menu-separator,#adminmenu li.wp-menu-separator-last{font-size:1px;line-height:1;}#adminmenu a.menu-top{border-bottom:0 none;border-top:1px solid #ddd;}#adminmenu .separator{font-size:1px;line-height:1px;}#wpbody-content input.button,#wpbody-content input.button-primary,#wpbody-content input.button-secondary,#wpbody-content input.button-highlighted{overflow:visible;}#dashboard-widgets #dashboard_quick_press form p.submit #publish{float:none;}#dashboard-widgets h3 a{height:14px;line-height:14px;}.tablenav-pages .current-page{vertical-align:middle;}#wpbody-content .postbox{border:1px solid #dfdfdf;}#wpbody-content .postbox h3{margin-bottom:-1px;}* html .meta-box-sortables .postbox .handlediv{background:transparent url(../images/menu-bits-vs.gif) no-repeat scroll left -111px;}* html .edit-box{display:inline;}* html .inner-sidebar #side-sortables,* html .postbox-container .meta-box-sortables{height:300px;}* html #wpbody-content #screen-options-link-wrap{display:inline-block;width:150px;text-align:center;}* html #wpbody-content #contextual-help-link-wrap{display:inline-block;width:100px;text-align:center;}* html #adminmenu{margin-left:-80px;}* html .folded #adminmenu{margin-left:-22px;}* html #wpcontent #adminmenu li.menu-top{display:inline;padding:0;margin:0;}* html #footer{margin:0;}.js.folded #adminmenu li.menu-top{display:block;zoom:100%;}ul#adminmenu{z-index:99;}#adminmenu li.menu-top a.menu-top{min-width:auto;width:auto;}#wpcontent #adminmenu li.wp-has-current-submenu a.wp-has-submenu{font-style:normal;}* html #wpcontent #adminmenu .wp-menu-open .wp-menu-toggle{background:none;}* html #wpcontent #adminmenu .wp-has-submenu .wp-menu-toggle{background:url(../images/menu-bits.gif?ver=20100610) no-repeat scroll left -109px;}* html #wpcontent #adminmenu li.wp-has-current-submenu .wp-menu-toggle{background:url(../images/menu-bits.gif?ver=20100610) no-repeat scroll left -206px;}* html #adminmenu div.wp-menu-image{height:29px;}#wpcontent #adminmenu .wp-submenu li{padding:0;}#adminmenu,.major-publishing-actions,.wp-submenu,.wp-submenu li,.wp-menu-toggle,#template,#template div,#editcat,#addcat,* html .stuffbox h3{zoom:100%;}#wpcontent #adminmenu .wp-submenu li.wp-submenu-head{padding:3px 4px 4px 10px;zoom:100%;}.js.folded #adminmenu .menu-top{height:30px;}.js.folded #adminmenu .wp-submenu{margin:-1px 0 0 0;}.wp-menu-arrow{height:28px;}.submitbox{margin-top:10px;}#wpbody-content .quick-edit-row-post .inline-edit-col-left{width:39%;}#wpbody-content .inline-edit-row-post .inline-edit-col-center{width:19%;}#wpbody-content .quick-edit-row-page .inline-edit-col-left{width:49%;}#wpbody-content .bulk-edit-row .inline-edit-col-left{width:29%;}.inline-edit-row p.submit{zoom:100%;}.inline-edit-row fieldset label span.title{display:block;float:left;width:5em;}.inline-edit-row fieldset label span.input-text-wrap{margin-left:0;zoom:100%;}#wpbody-content .inline-edit-row fieldset label span.input-text-wrap input{line-height:130%;}#wpbody-content .inline-edit-row .input-text-wrap input{width:95%;}#wpbody-content .inline-edit-row .input-text-wrap input.inline-edit-password-input{width:8em;}* html .row-actions{visibility:visible;}#wphead-info{float:right;}#titlediv #title{width:98%;}a.button{line-height:1.4em;margin:1px;padding:2px 6px;}* html div.widget-liquid-left,* html div.widget-liquid-right{display:block;position:relative;}#screen-options-wrap{overflow:hidden;}#favorite-actions{z-index:12;}#favorite-inside,#favorite-inside a,.favorite-action{zoom:100%;}#the-comment-list .comment-item,#post-status-info,#wpwrap,#wpcontent,#wrap,#postdivrich,#postdiv,#poststuff,.metabox-holder,#titlediv,#post-body,#editorcontainer,.tablenav,.widget-liquid-left,.widget-liquid-right,#widgets-left,.widgets-sortables,#dragHelper,.widget .widget-top,.widget,.widget-control-actions,.tagchecklist,#col-container,#col-left,#col-right,.fileedit-sub{display:block;zoom:100%;}p.search-box{position:static;float:right;margin:-3px 0 4px;}* html #editorcontainer{padding:0;}#editorcontainer #content{overflow:auto;margin:auto;width:98%;}form#template div{width:100%;}#ed_toolbar input,#ed_reply_toolbar input{overflow:visible;padding:0 4px;}#poststuff h2{font-size:1.6em;}* html #poststuff h2{margin-left:0;}#bh{margin:7px 10px 0 0;float:right;}div#dashboard-widgets{padding-right:1px;}.tagchecklist span,.tagchecklist span a{display:inline-block;display:block;}.tagchecklist span a{margin:4px 0 0 -9px;}.tablenav .button-secondary,.nav .button-secondary{padding-top:2px;padding-bottom:2px;}.tablenav select{font-size:13px;display:inline-block;vertical-align:top;margin-top:2px;}.tablenav .actions select{width:155px;}table.ie-fixed{table-layout:fixed;}.widefat tr,.widefat th{margin-bottom:0;border-spacing:0;}.widefat th input{margin:0 0 0 5px;}.widefat .check-column{padding:6px 0 2px;}.widefat tbody th.check-column{padding:4px 0 22px;}.widefat{empty-cells:show;border-collapse:collapse;}.tablenav a.button-secondary{display:inline-block;padding:2px 5px;}* html .stuffbox,* html .stuffbox input,* html .stuffbox textarea{border:1px solid #DFDFDF;}* html .feature-filter .feature-group li{width:145px;}* html .widget-top .widget-title-action a{background:url("../images/menu-bits.gif?ver=20100610") no-repeat scroll 0 -110px;}* html div.widget-liquid-left{width:99%;}#wp_inactive_widgets{padding-bottom:8px;}* html .widgets-sortables{height:50px;}* html a#content_resize{right:-2px;}* html .widget-title h4{width:205px;}* html #removing-widget .in-widget-title{display:none;}#available-widgets .widget-holder{padding-bottom:65px;}#widgets-left .inactive{padding-bottom:10px;}.widget-liquid-right .widget,#wp_inactive_widgets .widget{position:relative;}* html .media-item .pinkynail{height:32px;width:40px;}#wpcontent .button-primary-disabled{color:#9FD0D5;background:#298CBA;}#wpcontent #ajax-loading,#wpcontent .ajax-loading{vertical-align:baseline;}* html .describe .field input.text,* html .describe .field textarea{width:440px;}#the-comment-list .unapproved tr,#the-comment-list .unapproved td{background-color:#ffffe0;}.imgedit-submit{width:300px;}* html input{border:1px solid #dfdfdf;}#nav-menu-header,#nav-menus-frame,#wpbody,.menu li{zoom:100%;}#update-nav-menu #post-body{overflow:hidden;}.menu li{min-width:100%;}.menu li.sortable-placeholder{min-width:400px;} \ No newline at end of file diff --git a/src/wp-admin/css/ie.dev.css b/src/wp-admin/css/ie.dev.css new file mode 100644 index 0000000..a41d08f --- /dev/null +++ b/src/wp-admin/css/ie.dev.css @@ -0,0 +1,494 @@ +/* Fixes for IE bugs */ + +#wp-fullscreen-title { + width: 97%; +} + +#wp_mce_fullscreen_ifr { + background-color: #f9f9f9; +} + +#wp-fullscreen-tagline { + color: #888; + font-size: 14px; +} + +#adminmenuback { + left: 0; +} + +#adminmenu li.wp-menu-separator, +#adminmenu li.wp-menu-separator-last { + font-size: 1px; + line-height: 1; +} + +#adminmenu a.menu-top { + border-bottom: 0 none; + border-top: 1px solid #ddd; +} + +#adminmenu .separator { + font-size: 1px; + line-height: 1px; +} + +#wpbody-content input.button, +#wpbody-content input.button-primary, +#wpbody-content input.button-secondary, +#wpbody-content input.button-highlighted { + overflow: visible; +} + +#dashboard-widgets #dashboard_quick_press form p.submit #publish { + float: none; +} + +#dashboard-widgets h3 a { + height: 14px; + line-height: 14px; +} + +.tablenav-pages .current-page { + vertical-align: middle; +} + +#wpbody-content .postbox { + border: 1px solid #dfdfdf; +} + +#wpbody-content .postbox h3 { + margin-bottom: -1px; +} + +* html .meta-box-sortables .postbox .handlediv { + background: transparent url(../images/menu-bits-vs.gif) no-repeat scroll left -111px; +} + +* html .edit-box { + display: inline; +} + +* html .inner-sidebar #side-sortables, +* html .postbox-container .meta-box-sortables { + height: 300px; +} + +* html #wpbody-content #screen-options-link-wrap { + display: inline-block; + width: 150px; + text-align: center; +} + +* html #wpbody-content #contextual-help-link-wrap { + display: inline-block; + width: 100px; + text-align: center; +} + +* html #adminmenu { + margin-left: -80px; +} + +* html .folded #adminmenu { + margin-left: -22px; +} + +* html #wpcontent #adminmenu li.menu-top { + display: inline; + padding: 0; + margin: 0; +} + +* html #footer { + margin: 0; +} + +.js.folded #adminmenu li.menu-top { + display: block; + zoom: 100%; +} + +ul#adminmenu { + z-index: 99; +} + +#adminmenu li.menu-top a.menu-top { + min-width: auto; + width: auto; +} + +#wpcontent #adminmenu li.wp-has-current-submenu a.wp-has-submenu { + font-style: normal; +} + +* html #wpcontent #adminmenu .wp-menu-open .wp-menu-toggle { + background: none; +} + +* html #wpcontent #adminmenu .wp-has-submenu .wp-menu-toggle { + background: url(../images/menu-bits.gif?ver=20100610) no-repeat scroll left -109px; +} + +* html #wpcontent #adminmenu li.wp-has-current-submenu .wp-menu-toggle { + background: url(../images/menu-bits.gif?ver=20100610) no-repeat scroll left -206px; +} + +* html #adminmenu div.wp-menu-image { + height: 29px; +} + +#wpcontent #adminmenu .wp-submenu li { + padding: 0; +} + +#adminmenu, +.major-publishing-actions, +.wp-submenu, +.wp-submenu li, +.wp-menu-toggle, +#template, +#template div, +#editcat, +#addcat, +* html .stuffbox h3 { + zoom: 100%; +} + +#wpcontent #adminmenu .wp-submenu li.wp-submenu-head { + padding: 3px 4px 4px 10px; + zoom: 100%; +} + +.js.folded #adminmenu .menu-top { + height: 30px; +} + +.js.folded #adminmenu .wp-submenu { + margin: -1px 0 0 0; +} + +.wp-menu-arrow { + height: 28px; +} + +.submitbox { + margin-top: 10px; +} + +/* Inline Editor */ +#wpbody-content .quick-edit-row-post .inline-edit-col-left { + width: 39%; +} + +#wpbody-content .inline-edit-row-post .inline-edit-col-center { + width: 19%; +} + +#wpbody-content .quick-edit-row-page .inline-edit-col-left { + width: 49%; +} + +#wpbody-content .bulk-edit-row .inline-edit-col-left { + width: 29%; +} + +.inline-edit-row p.submit { + zoom: 100%; +} + +.inline-edit-row fieldset label span.title { + display: block; + float: left; + width: 5em; +} + +.inline-edit-row fieldset label span.input-text-wrap { + margin-left: 0; + zoom: 100%; +} + +#wpbody-content .inline-edit-row fieldset label span.input-text-wrap input { + line-height: 130%; +} + +#wpbody-content .inline-edit-row .input-text-wrap input { + width: 95%; +} + +#wpbody-content .inline-edit-row .input-text-wrap input.inline-edit-password-input { + width: 8em; +} +/* end Inline Editor */ + +* html .row-actions { + visibility: visible; +} + +#wphead-info { + float: right; +} + +#titlediv #title { + width: 98%; +} + +a.button { + line-height: 1.4em; + margin: 1px; + padding: 2px 6px; +} + +* html div.widget-liquid-left, +* html div.widget-liquid-right { + display: block; + position: relative; +} + +#screen-options-wrap { + overflow: hidden; +} + +#favorite-actions { + z-index: 12; +} + +#favorite-inside, +#favorite-inside a, +.favorite-action { + zoom: 100%; +} + +#the-comment-list .comment-item, +#post-status-info, +#wpwrap, +#wpcontent, +#wrap, +#postdivrich, +#postdiv, +#poststuff, +.metabox-holder, +#titlediv, +#post-body, +#editorcontainer, +.tablenav, +.widget-liquid-left, +.widget-liquid-right, +#widgets-left, +.widgets-sortables, +#dragHelper, +.widget .widget-top, +.widget, +.widget-control-actions, +.tagchecklist, +#col-container, +#col-left, +#col-right, +.fileedit-sub { + display: block; + zoom: 100%; +} + +p.search-box { + position: static; + float: right; + margin: -3px 0 4px; +} + +* html #editorcontainer { + padding: 0; +} + +#editorcontainer #content { + overflow: auto; + margin: auto; + width: 98%; +} + +form#template div { + width: 100%; +} + +#ed_toolbar input, +#ed_reply_toolbar input { + overflow: visible; + padding: 0 4px; +} + +#poststuff h2 { + font-size: 1.6em; +} + +* html #poststuff h2 { + margin-left: 0; +} + +#bh { + margin: 7px 10px 0 0; + float: right; +} + +/* without this dashboard widgets appear in one column for some screen widths */ +div#dashboard-widgets { + padding-right: 1px; +} + +.tagchecklist span, .tagchecklist span a { + display: inline-block; + display: block; +} + +.tagchecklist span a { + margin: 4px 0 0 -9px; +} + +.tablenav .button-secondary, +.nav .button-secondary { + padding-top: 2px; + padding-bottom: 2px; +} + +.tablenav select { + font-size: 13px; + display: inline-block; + vertical-align: top; + margin-top: 2px; +} + +.tablenav .actions select { + width: 155px; +} + +table.ie-fixed { + table-layout: fixed; +} + +.widefat tr, .widefat th { + margin-bottom: 0; + border-spacing: 0; +} + +.widefat th input { + margin: 0 0 0 5px; +} + +.widefat .check-column { + padding: 6px 0 2px; +} + +.widefat tbody th.check-column { + padding: 4px 0 22px; +} + +.widefat { + empty-cells: show; + border-collapse: collapse; +} + +.tablenav a.button-secondary { + display: inline-block; + padding: 2px 5px; +} + +* html .stuffbox, +* html .stuffbox input, +* html .stuffbox textarea { + border: 1px solid #DFDFDF; +} + +* html .feature-filter .feature-group li { + width: 145px; +} + +* html .widget-top .widget-title-action a { + background: url("../images/menu-bits.gif?ver=20100610") no-repeat scroll 0 -110px; +} + +* html div.widget-liquid-left { + width: 99%; +} + +#wp_inactive_widgets { + padding-bottom: 8px; +} + +* html .widgets-sortables { + height: 50px; +} + +* html a#content_resize { + right: -2px; +} + +* html .widget-title h4 { + width: 205px; +} + +* html #removing-widget .in-widget-title { + display: none; +} + +#available-widgets .widget-holder { + padding-bottom: 65px; +} + +#widgets-left .inactive { + padding-bottom: 10px; +} + +.widget-liquid-right .widget, +#wp_inactive_widgets .widget { + position: relative; +} + +* html .media-item .pinkynail { + height: 32px; + width: 40px; +} + +#wpcontent .button-primary-disabled { + color: #9FD0D5; + background: #298CBA; +} + +#wpcontent #ajax-loading, +#wpcontent .ajax-loading { + vertical-align: baseline; +} + +* html .describe .field input.text, +* html .describe .field textarea { + width: 440px; +} + +#the-comment-list .unapproved tr, +#the-comment-list .unapproved td { + background-color: #ffffe0; +} + +.imgedit-submit { + width: 300px; +} + +* html input { + border: 1px solid #dfdfdf; +} + +#nav-menu-header, +#nav-menus-frame, +#wpbody, +.menu li { + zoom:100%; +} + +#update-nav-menu #post-body { + overflow:hidden; +} + +.menu li { + min-width:100%; +} + +.menu li.sortable-placeholder { + min-width:400px; +} diff --git a/src/wp-admin/css/install-rtl.css b/src/wp-admin/css/install-rtl.css new file mode 100644 index 0000000..e422ece --- /dev/null +++ b/src/wp-admin/css/install-rtl.css @@ -0,0 +1 @@ +body{font-family:Tahoma,arial;}h1{font-family:arial;margin:5px -4px 0 0;}ul,ol{padding:5px 22px 5px 5px;}.step,th{text-align:right;}.submit input,.button,.button-secondary{font-family:Tahoma,arial;margin-right:0;}.form-table th{text-align:right;}#user_login,#admin_email,#pass1,#pass2{direction:ltr;} \ No newline at end of file diff --git a/src/wp-admin/css/install-rtl.dev.css b/src/wp-admin/css/install-rtl.dev.css new file mode 100644 index 0000000..9e0be99 --- /dev/null +++ b/src/wp-admin/css/install-rtl.dev.css @@ -0,0 +1,23 @@ +body { + font-family: Tahoma, arial; +} +h1 { + font-family: arial; + margin: 5px -4px 0 0; +} +ul, ol { + padding: 5px 22px 5px 5px; +} +.step, th { + text-align: right; +} +.submit input, .button, .button-secondary { + font-family: Tahoma, arial; + margin-right: 0; +} +.form-table th { + text-align: right; +} +#user_login, #admin_email, #pass1, #pass2 { + direction: ltr; +} \ No newline at end of file diff --git a/src/wp-admin/css/install.css b/src/wp-admin/css/install.css new file mode 100644 index 0000000..fa76872 --- /dev/null +++ b/src/wp-admin/css/install.css @@ -0,0 +1 @@ +html{background:#f9f9f9;}body{background:#fff;color:#333;font-family:sans-serif;margin:2em auto;width:700px;padding:1em 2em;-moz-border-radius:11px;-khtml-border-radius:11px;-webkit-border-radius:11px;border-radius:11px;border:1px solid #dfdfdf;}a{color:#2583ad;text-decoration:none;}a:hover{color:#d54e21;}h1{border-bottom:1px solid #dadada;clear:both;color:#666;font:24px Georgia,"Times New Roman",Times,serif;margin:5px 0 0 -4px;padding:0;padding-bottom:7px;}h2{font-size:16px;}p,li,dd,dt{padding-bottom:2px;font-size:12px;line-height:18px;}code,.code{font-size:13px;}ul,ol,dl{padding:5px 5px 5px 22px;}a img{border:0;}abbr{border:0;font-variant:normal;}#logo{margin:6px 0 14px 0;border-bottom:none;text-align:center;}.step{margin:20px 0 15px;}.step,th{text-align:left;padding:0;}.submit input,.button,.button-secondary{font-family:sans-serif;text-decoration:none;font-size:14px!important;line-height:16px;padding:6px 12px;cursor:pointer;border:1px solid #bbb;color:#464646;-moz-border-radius:15px;-khtml-border-radius:15px;-webkit-border-radius:15px;border-radius:15px;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;-khtml-box-sizing:content-box;box-sizing:content-box;}.button:hover,.button-secondary:hover,.submit input:hover{color:#000;border-color:#666;}.button,.submit input,.button-secondary{background:#f2f2f2 url(../images/white-grad.png) repeat-x scroll left top;}.button:active,.submit input:active,.button-secondary:active{background:#eee url(../images/white-grad-active.png) repeat-x scroll left top;}textarea{border:1px solid #bbb;-moz-border-radius:3px;-khtml-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;}.form-table{border-collapse:collapse;margin-top:1em;width:100%;}.form-table td{margin-bottom:9px;padding:10px;border-bottom:8px solid #fff;font-size:12px;}.form-table th{font-size:13px;text-align:left;padding:16px 10px 10px 10px;border-bottom:8px solid #fff;width:130px;vertical-align:top;}.form-table tr{background:#f3f3f3;}.form-table code{line-height:18px;font-size:18px;}.form-table p{margin:4px 0 0 0;font-size:11px;}.form-table input{line-height:20px;font-size:15px;padding:2px;}.form-table th p{font-weight:normal;}#error-page{margin-top:50px;}#error-page p{font-size:12px;line-height:18px;margin:25px 0 20px;}#error-page code,.code{font-family:Consolas,Monaco,monospace;}#pass-strength-result{background-color:#eee;border-color:#ddd!important;border-style:solid;border-width:1px;margin:5px 5px 5px 1px;padding:5px;text-align:center;width:200px;display:none;}#pass-strength-result.bad{background-color:#ffb78c;border-color:#ff853c!important;}#pass-strength-result.good{background-color:#ffec8b;border-color:#fc0!important;}#pass-strength-result.short{background-color:#ffa0a0;border-color:#f04040!important;}#pass-strength-result.strong{background-color:#c3ff88;border-color:#8dff1c!important;}.message{border:1px solid #e6db55;padding:.3em .6em;margin:5px 0 15px;background-color:#ffffe0;} \ No newline at end of file diff --git a/src/wp-admin/css/install.dev.css b/src/wp-admin/css/install.dev.css new file mode 100644 index 0000000..d1a389f --- /dev/null +++ b/src/wp-admin/css/install.dev.css @@ -0,0 +1,213 @@ +html { + background: #f9f9f9; +} + +body { + background: #fff; + color: #333; + font-family: sans-serif; + margin: 2em auto; + width: 700px; + padding: 1em 2em; + -moz-border-radius: 11px; + -khtml-border-radius: 11px; + -webkit-border-radius: 11px; + border-radius: 11px; + border: 1px solid #dfdfdf; +} + +a { + color: #2583ad; + text-decoration: none; +} + +a:hover { + color: #d54e21; +} + +h1 { + border-bottom: 1px solid #dadada; + clear: both; + color: #666; + font: 24px Georgia, "Times New Roman", Times, serif; + margin: 5px 0 0 -4px; + padding: 0; + padding-bottom: 7px; +} + +h2 { + font-size: 16px; +} + +p, li, dd, dt { + padding-bottom: 2px; + font-size: 12px; + line-height: 18px; +} + +code, .code { + font-size: 13px; +} + +ul, ol, dl { + padding: 5px 5px 5px 22px; +} + +a img { + border:0 +} +abbr { + border: 0; + font-variant: normal; +} +#logo { + margin: 6px 0 14px 0; + border-bottom: none; + text-align:center +} +.step { + margin: 20px 0 15px; +} +.step, th { + text-align: left; + padding: 0; +} + +.submit input, .button, .button-secondary { + font-family: sans-serif; + text-decoration: none; + font-size: 14px !important; + line-height: 16px; + padding: 6px 12px; + cursor: pointer; + border: 1px solid #bbb; + color: #464646; + -moz-border-radius: 15px; + -khtml-border-radius: 15px; + -webkit-border-radius: 15px; + border-radius: 15px; + -moz-box-sizing: content-box; + -webkit-box-sizing: content-box; + -khtml-box-sizing: content-box; + box-sizing: content-box; +} + +.button:hover, .button-secondary:hover, .submit input:hover { + color: #000; + border-color: #666; +} + +.button, .submit input, .button-secondary { + background: #f2f2f2 url(../images/white-grad.png) repeat-x scroll left top; +} + +.button:active, .submit input:active, .button-secondary:active { + background: #eee url(../images/white-grad-active.png) repeat-x scroll left top; +} + +textarea { + border: 1px solid #bbb; + -moz-border-radius: 3px; + -khtml-border-radius: 3px; + -webkit-border-radius: 3px; + border-radius: 3px; +} + +.form-table { + border-collapse: collapse; + margin-top: 1em; + width: 100%; +} + +.form-table td { + margin-bottom: 9px; + padding: 10px; + border-bottom: 8px solid #fff; + font-size: 12px; +} + +.form-table th { + font-size: 13px; + text-align: left; + padding: 16px 10px 10px 10px; + border-bottom: 8px solid #fff; + width: 130px; + vertical-align: top; +} + +.form-table tr { + background: #f3f3f3; +} + +.form-table code { + line-height: 18px; + font-size: 18px; +} + +.form-table p { + margin: 4px 0 0 0; + font-size: 11px; +} + +.form-table input { + line-height: 20px; + font-size: 15px; + padding: 2px; +} + +.form-table th p { + font-weight: normal; +} + +#error-page { + margin-top: 50px; +} + +#error-page p { + font-size: 12px; + line-height: 18px; + margin: 25px 0 20px; +} + +#error-page code, .code { + font-family: Consolas, Monaco, monospace; +} + +#pass-strength-result { + background-color: #eee; + border-color: #ddd !important; + border-style: solid; + border-width: 1px; + margin: 5px 5px 5px 1px; + padding: 5px; + text-align: center; + width: 200px; + display: none; +} + +#pass-strength-result.bad { + background-color: #ffb78c; + border-color: #ff853c !important; +} + +#pass-strength-result.good { + background-color: #ffec8b; + border-color: #ffcc00 !important; +} + +#pass-strength-result.short { + background-color: #ffa0a0; + border-color: #f04040 !important; +} + +#pass-strength-result.strong { + background-color: #c3ff88; + border-color: #8dff1c !important; +} + +.message { + border: 1px solid #e6db55; + padding: 0.3em 0.6em; + margin: 5px 0 15px; + background-color: #ffffe0; +} diff --git a/src/wp-admin/css/login-rtl.css b/src/wp-admin/css/login-rtl.css new file mode 100644 index 0000000..11040fa --- /dev/null +++ b/src/wp-admin/css/login-rtl.css @@ -0,0 +1 @@ +body{font-family:Tahoma,arial;}form{margin-right:8px;margin-left:0;}form .forgetmenot{float:right;}#login form .submit input{font-family:Tahoma,arial;}form .submit{float:left;}#backtoblog a{padding:8px 15px 0 0;}#login_error,.message{margin:0 8px 16px 0;}#nav{margin:0 8px 0 0;}#user_pass,#user_login,#user_email{margin-left:6px;margin-right:0;direction:ltr;}h1 a{text-decoration:none;} \ No newline at end of file diff --git a/src/wp-admin/css/login-rtl.dev.css b/src/wp-admin/css/login-rtl.dev.css new file mode 100644 index 0000000..954b320 --- /dev/null +++ b/src/wp-admin/css/login-rtl.dev.css @@ -0,0 +1,29 @@ +body { + font-family: Tahoma, arial; +} +form { + margin-right: 8px; + margin-left: 0; +} +form .forgetmenot { + float: right; +} +#login form .submit input { + font-family: Tahoma, arial; +} +form .submit { float: left; } +#backtoblog a { + padding: 8px 15px 0 0; +} +#login_error, .message { + margin: 0 8px 16px 0; +} +#nav { margin: 0 8px 0 0; } +#user_pass, #user_login, #user_email { + margin-left: 6px; + margin-right: 0; + direction:ltr; +} +h1 a { + text-decoration: none; +} diff --git a/src/wp-admin/css/login.css b/src/wp-admin/css/login.css new file mode 100644 index 0000000..d0e6f3d --- /dev/null +++ b/src/wp-admin/css/login.css @@ -0,0 +1 @@ +*{margin:0;padding:0;}html{background:#fbfbfb!important;}body{padding-top:30px;font-family:sans-serif;font-size:12px;}form{margin-left:8px;padding:26px 24px 46px;font-weight:normal;-moz-border-radius:3px;-khtml-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;background:#fff;border:1px solid #e5e5e5;-moz-box-shadow:rgba(200,200,200,0.7) 0 4px 10px -1px;-webkit-box-shadow:rgba(200,200,200,0.7) 0 4px 10px -1px;-khtml-box-shadow:rgba(200,200,200,0.7) 0 4px 10px -1px;box-shadow:rgba(200,200,200,0.7) 0 4px 10px -1px;}form .forgetmenot{font-weight:normal;float:left;margin-bottom:0;}.button-primary{font-family:sans-serif;padding:3px 10px;border:none;font-size:13px;border-width:1px;border-style:solid;-moz-border-radius:11px;-khtml-border-radius:11px;-webkit-border-radius:11px;border-radius:11px;cursor:pointer;text-decoration:none;margin-top:-3px;}#login form p{margin-bottom:0;}label{color:#777;font-size:14px;}form .forgetmenot label{font-size:12px;line-height:19px;}form .submit,.alignright{float:right;}form p{margin-bottom:24px;}h1 a{background:url(../images/logo-login.png) no-repeat top center;width:326px;height:67px;text-indent:-9999px;overflow:hidden;padding-bottom:15px;display:block;}#login{width:320px;margin:7em auto;}#login_error,.message{margin:0 0 16px 8px;border-width:1px;border-style:solid;padding:12px;-moz-border-radius:3px;-khtml-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;}#nav,#backtoblog{text-shadow:rgba(255,255,255,1) 0 1px 0;margin:0 0 0 16px;padding:16px 16px 0;}#backtoblog{padding:12px 16px 0;}body form .input{font-family:"HelveticaNeue-Light","Helvetica Neue Light","Helvetica Neue",sans-serif;font-weight:200;font-size:24px;width:97%;padding:3px;margin-top:2px;margin-right:6px;margin-bottom:16px;border:1px solid #e5e5e5;background:#fbfbfb;outline:none;-moz-box-shadow:inset 1px 1px 2px rgba(200,200,200,0.2);-webkit-box-shadow:inset 1px 1px 2px rgba(200,200,200,0.2);box-shadow:inset 1px 1px 2px rgba(200,200,200,0.2);}input{color:#555;}.clear{clear:both;}#pass-strength-result{font-weight:bold;border-style:solid;border-width:1px;margin:12px 0 6px;padding:6px 5px;text-align:center;} \ No newline at end of file diff --git a/src/wp-admin/css/login.dev.css b/src/wp-admin/css/login.dev.css new file mode 100644 index 0000000..3dc5b79 --- /dev/null +++ b/src/wp-admin/css/login.dev.css @@ -0,0 +1,144 @@ +* { margin: 0; padding: 0; } + +html { + background: #fbfbfb !important; +} + +body { + padding-top: 30px; + font-family: sans-serif; + font-size: 12px; +} + +form { + margin-left: 8px; + padding: 26px 24px 46px; + font-weight: normal; + -moz-border-radius: 3px; + -khtml-border-radius: 3px; + -webkit-border-radius: 3px; + border-radius: 3px; + background: #fff; + border: 1px solid #e5e5e5; + -moz-box-shadow: rgba(200, 200, 200, 0.7) 0px 4px 10px -1px; + -webkit-box-shadow: rgba(200, 200, 200, 0.7) 0px 4px 10px -1px; + -khtml-box-shadow: rgba(200, 200, 200, 0.7) 0px 4px 10px -1px; + box-shadow: rgba(200, 200, 200, 0.7) 0px 4px 10px -1px; +} + +form .forgetmenot { + font-weight: normal; + float: left; + margin-bottom: 0; +} + +.button-primary { + font-family: sans-serif; + padding: 3px 10px; + border: none; + font-size: 13px; + border-width: 1px; + border-style: solid; + -moz-border-radius: 11px; + -khtml-border-radius: 11px; + -webkit-border-radius: 11px; + border-radius: 11px; + cursor: pointer; + text-decoration: none; + margin-top: -3px; +} + +#login form p { + margin-bottom: 0; +} + +label { + color: #777; + font-size: 14px; +} + +form .forgetmenot label { + font-size: 12px; + line-height: 19px; +} + +form .submit, +.alignright { + float: right; +} + +form p { + margin-bottom: 24px; +} + +h1 a { + background: url(../images/logo-login.png) no-repeat top center; + width: 326px; + height: 67px; + text-indent: -9999px; + overflow: hidden; + padding-bottom: 15px; + display: block; +} + +#login { + width: 320px; + margin: 7em auto; +} + +#login_error, +.message { + margin: 0 0 16px 8px; + border-width: 1px; + border-style: solid; + padding: 12px; + -moz-border-radius: 3px; + -khtml-border-radius: 3px; + -webkit-border-radius: 3px; + border-radius: 3px; +} + +#nav, +#backtoblog { + text-shadow: rgba(255,255,255,1) 0 1px 0; + margin: 0 0 0 16px; + padding: 16px 16px 0; +} +#backtoblog { + padding: 12px 16px 0; +} + +body form .input { + font-family: "HelveticaNeue-Light", "Helvetica Neue Light", "Helvetica Neue", sans-serif; + font-weight: 200; + font-size: 24px; + width: 97%; + padding: 3px; + margin-top: 2px; + margin-right: 6px; + margin-bottom: 16px; + border: 1px solid #e5e5e5; + background: #fbfbfb; + outline: none; + -moz-box-shadow: inset 1px 1px 2px rgba(200, 200, 200, 0.2); + -webkit-box-shadow: inset 1px 1px 2px rgba(200, 200, 200, 0.2); + box-shadow: inset 1px 1px 2px rgba(200, 200, 200, 0.2); +} + +input { + color: #555; +} + +.clear { + clear: both; +} + +#pass-strength-result { + font-weight: bold; + border-style: solid; + border-width: 1px; + margin: 12px 0 6px; + padding: 6px 5px; + text-align: center; +} + diff --git a/src/wp-admin/css/media-rtl.css b/src/wp-admin/css/media-rtl.css new file mode 100644 index 0000000..19d7366 --- /dev/null +++ b/src/wp-admin/css/media-rtl.css @@ -0,0 +1 @@ +body#media-upload ul#sidemenu{left:auto;right:0;}#search-filter{text-align:left;}.align .field label{padding:0 28px 0 0;margin:0 0 0 1em;}.image-align-none-label,.image-align-left-label,.image-align-center-label,.image-align-right-label{background-position:center right;}tr.image-size div.image-size-item{float:right;}tr.image-size label{margin:0 1em 0 0;}.crunching{text-align:left;margin-right:0;margin-left:5px;}button.dismiss{right:auto;left:5px;}.file-error{margin:0 50px 5px 0;}.progress{left:auto;right:0;}.describe td{padding:0 0 0 5px;}.bar{border-right-width:0;border-left-width:3px;border-right-style:none;border-left-style:solid;}#media-upload .media-upload-form p{margin:0 0 1em 1em;}#media-upload .describe th.label{text-align:right;}.menu_order{float:left;}.media-upload-form label.form-help,td.help,#media-upload p.help,#media-upload label.help{font-family:Tahoma,Arial;}#gallery-settings #basic th.label{padding:5px 0 5px 5px;}#gallery-settings .title,h3.media-title{font-family:Tahoma,Arial;}#gallery-settings .describe th.label{text-align:right;}#gallery-settings label,#gallery-settings legend{margin-right:0;margin-left:15px;}#gallery-settings .align .field label{margin:0 0 0 1.5em;}#sort-buttons{margin:3px 0 -8px 25px;text-align:left;}#sort-buttons #asc,#sort-buttons #showall{padding-left:0;padding-right:5px;}#sort-buttons span{margin-right:0;margin-left:25px;} \ No newline at end of file diff --git a/src/wp-admin/css/media-rtl.dev.css b/src/wp-admin/css/media-rtl.dev.css new file mode 100644 index 0000000..efa1e2e --- /dev/null +++ b/src/wp-admin/css/media-rtl.dev.css @@ -0,0 +1,92 @@ +body#media-upload ul#sidemenu { + left: auto; + right: 0; +} +#search-filter { + text-align: left; +} +/* specific to the image upload form */ +.align .field label { + padding: 0 28px 0 0; + margin: 0 0 0 1em; +} +.image-align-none-label, .image-align-left-label, .image-align-center-label, .image-align-right-label { + background-position: center right; +} +tr.image-size div.image-size-item { + float: right; +} +tr.image-size label { + margin: 0 1em 0 0; +} +.crunching { + text-align: left; + margin-right: 0; + margin-left: 5px; +} +button.dismiss { + right: auto; + left: 5px; +} +.file-error { + margin: 0 50px 5px 0; +} +.progress { + left: auto; + right: 0; +} +.describe td { + padding: 0 0 0 5px; +} +.bar { + border-right-width: 0; + border-left-width: 3px; + border-right-style: none; + border-left-style: solid; +} + +/* Specific to Uploader */ +#media-upload .media-upload-form p { + margin: 0 0 1em 1em; +} +#media-upload .describe th.label { + text-align: right; +} +.menu_order { + float: left; +} +.media-upload-form label.form-help, td.help, #media-upload p.help, #media-upload label.help { + font-family: Tahoma, Arial; +} +#gallery-settings #basic th.label { + padding: 5px 0 5px 5px; +} +#gallery-settings .title, h3.media-title { + font-family: Tahoma, Arial; +} +#gallery-settings .describe th.label { + text-align: right; +} +#gallery-settings label, +#gallery-settings legend { + margin-right: 0; + margin-left: 15px; +} +#gallery-settings .align .field label { + margin: 0 0 0 1.5em; +} +#sort-buttons { + margin: 3px 0 -8px 25px; + text-align: left; +} + +#sort-buttons #asc, +#sort-buttons #showall { + padding-left: 0; + padding-right: 5px; +} + +#sort-buttons span { + margin-right: 0; + margin-left: 25px; +} diff --git a/src/wp-admin/css/media.css b/src/wp-admin/css/media.css new file mode 100644 index 0000000..157ecdf --- /dev/null +++ b/src/wp-admin/css/media.css @@ -0,0 +1 @@ +div#media-upload-header{margin:0;padding:0 5px;font-weight:bold;position:relative;border-bottom-width:1px;border-bottom-style:solid;}body#media-upload ul#sidemenu{font-weight:normal;margin:0 5px;left:0;bottom:-1px;float:none;overflow:hidden;}div#media-upload-error{margin:1em;font-weight:bold;}form{margin:1em;}#search-filter{text-align:right;}th{position:relative;}.media-upload-form label.form-help,td.help{font-family:sans-serif;font-style:italic;font-weight:normal;}.media-upload-form p.help{margin:0;padding:0;}.media-upload-form fieldset{width:100%;border:none;text-align:justify;margin:0 0 1em 0;padding:0;}.image-align-none-label{background:url(../images/align-none.png) no-repeat center left;}.image-align-left-label{background:url(../images/align-left.png) no-repeat center left;}.image-align-center-label{background:url(../images/align-center.png) no-repeat center left;}.image-align-right-label{background:url(../images/align-right.png) no-repeat center left;}tr.image-size td{width:460px;}tr.image-size div.image-size-item{float:left;width:25%;margin:0;}#library-form .progress,#gallery-form .progress,.insert-gallery,.describe.startopen,.describe.startclosed{display:none;}.media-item .thumbnail{max-width:128px;max-height:128px;}thead.media-item-info tr{background-color:transparent;}thead.media-item-info th,thead.media-item-info td{border:none;margin:0;}.form-table thead.media-item-info{border:8px solid #fff;}abbr.required{text-decoration:none;border:none;}.describe label{display:inline;}.describe td{vertical-align:middle;padding:0 5px 8px 0;}.describe td.error{padding:2px 8px;}.describe td.A1{width:132px;}.describe input[type="text"],.describe textarea{width:460px;border-width:1px;border-style:solid;}.hidden{height:0;width:0;overflow:hidden;border:none;}#media-upload p.ml-submit{padding:1em 0;}#media-upload p.help,#media-upload label.help{font-family:sans-serif;font-style:italic;font-weight:normal;}#media-upload tr.image-size td.field{text-align:center;}#media-upload #media-items{border-width:1px;border-style:solid;border-bottom:none;width:623px;}#media-upload .media-item{border-bottom-width:1px;border-bottom-style:solid;min-height:36px;width:100%;}#media-upload .ui-sortable .media-item{cursor:move;}.filename{line-height:36px;padding:0 10px;overflow:hidden;}#media-upload .describe{width:100%;clear:both;cursor:default;}#media-upload .slidetoggle{border-top-width:1px;border-top-style:solid;}#media-upload .describe th.label{padding-top:.2em;text-align:left;min-width:120px;}#media-upload tr.align td.field{text-align:center;}#media-upload tr.image-size{margin-bottom:1em;height:3em;}#media-upload #filter{width:623px;}#media-upload #filter .subsubsub{margin:8px 0;}#filter .tablenav select{border-style:solid;border-width:1px;padding:2px;vertical-align:top;width:auto;}#media-upload .del-attachment{display:none;margin:5px 0;}.menu_order{float:right;font-size:11px;margin:10px 10px 0;}.menu_order_input{border:1px solid #ddd;font-size:10px;padding:1px;width:23px;}.ui-sortable-helper{background-color:#fff;border:1px solid #aaa;opacity:.6;filter:alpha(opacity=60);}#media-upload th.order-head{width:20%;text-align:center;}#media-upload th.actions-head{width:25%;text-align:center;}#media-upload a.wp-post-thumbnail{margin:0 20px;}#media-items a.delete{display:block;float:right;}#media-upload .widefat{width:626px;border-style:solid solid none;}.sorthelper{height:37px;width:623px;display:block;}#gallery-settings th.label{width:160px;}#gallery-settings #basic th.label{padding:5px 5px 5px 0;}#gallery-settings .title{clear:both;padding:0 0 3px;font-size:1.6em;border-bottom:1px solid #DADADA;}h3.media-title{font-size:1.6em;}h4.media-sub-title{border-bottom:1px solid #DADADA;font-size:1.3em;margin:12px;padding:0 0 3px;}#gallery-settings .title,h3.media-title,h4.media-sub-title{font-family:Georgia,"Times New Roman",Times,serif;font-weight:normal;color:#5A5A5A;}#gallery-settings .describe td{vertical-align:middle;height:3em;}#gallery-settings .describe th.label{padding-top:.5em;text-align:left;}#gallery-settings .describe{padding:5px;width:615px;clear:both;cursor:default;}#gallery-settings .describe select{width:15em;}#gallery-settings .describe select option,#gallery-settings .describe td{padding:0;}#gallery-settings label,#gallery-settings legend{font-size:13px;color:#464646;margin-right:15px;}#gallery-settings .align .field label{margin:0 1.5em 0 0;}#gallery-settings p.ml-submit{border-top:1px solid #dfdfdf;}#gallery-settings select#columns{width:6em;}#sort-buttons{font-size:.8em;margin:3px 25px -8px 0;text-align:right;max-width:625px;}#sort-buttons a{text-decoration:none;}#sort-buttons #asc,#sort-buttons #showall{padding-left:5px;}#sort-buttons span{margin-right:25px;} \ No newline at end of file diff --git a/src/wp-admin/css/media.dev.css b/src/wp-admin/css/media.dev.css new file mode 100644 index 0000000..f439f49 --- /dev/null +++ b/src/wp-admin/css/media.dev.css @@ -0,0 +1,382 @@ +div#media-upload-header { + margin: 0; + padding: 0 5px; + font-weight: bold; + position: relative; + border-bottom-width: 1px; + border-bottom-style: solid; +} + +body#media-upload ul#sidemenu { + font-weight: normal; + margin: 0 5px; + left: 0; + bottom: -1px; + float: none; + overflow: hidden; +} + +div#media-upload-error { + margin: 1em; + font-weight: bold; +} + +form { + margin: 1em; +} + +#search-filter { + text-align: right; +} + +th { + position: relative; +} + +.media-upload-form label.form-help, td.help { + font-family: sans-serif; + font-style: italic; + font-weight: normal; +} + +.media-upload-form p.help { + margin: 0; + padding: 0; +} + +.media-upload-form fieldset { + width: 100%; + border: none; + text-align: justify; + margin: 0 0 1em 0; + padding: 0; +} + +/* specific to the image upload form */ + + +.image-align-none-label { + background: url(../images/align-none.png) no-repeat center left; +} + +.image-align-left-label { + background: url(../images/align-left.png) no-repeat center left; +} + +.image-align-center-label { + background: url(../images/align-center.png) no-repeat center left; +} + +.image-align-right-label { + background: url(../images/align-right.png) no-repeat center left; +} + +tr.image-size td { + width: 460px; +} + +tr.image-size div.image-size-item { + float: left; + width: 25%; + margin: 0; +} + +#library-form .progress, +#gallery-form .progress, +.insert-gallery, +.describe.startopen, +.describe.startclosed { + display: none; +} + +.media-item .thumbnail { + max-width: 128px; + max-height: 128px; +} + +thead.media-item-info tr { + background-color: transparent; +} + +thead.media-item-info th, +thead.media-item-info td { + border: none; + margin: 0; +} + +.form-table thead.media-item-info { + border: 8px solid #fff; +} + +abbr.required { + text-decoration: none; + border: none; +} + +.describe label { + display: inline; +} + +.describe td { + vertical-align: middle; + padding: 0 5px 8px 0; +} + +.describe td.error { + padding: 2px 8px; +} + +.describe td.A1 { + width: 132px; +} + +.describe input[type="text"], +.describe textarea { + width: 460px; + border-width: 1px; + border-style: solid; +} + +.hidden { + height: 0; + width: 0; + overflow: hidden; + border: none; +} + +/* Specific to Uploader */ + +#media-upload p.ml-submit { + padding: 1em 0; +} + +#media-upload p.help, +#media-upload label.help { + font-family: sans-serif; + font-style: italic; + font-weight: normal; +} + +#media-upload tr.image-size td.field { + text-align: center; +} + +#media-upload #media-items { + border-width: 1px; + border-style: solid; + border-bottom: none; + width: 623px; +} + +#media-upload .media-item { + border-bottom-width: 1px; + border-bottom-style: solid; + min-height: 36px; + width: 100%; +} + +#media-upload .ui-sortable .media-item { + cursor: move; +} + +.filename { + line-height: 36px; + padding: 0 10px; + overflow: hidden; +} + +#media-upload .describe { + width: 100%; + clear: both; + cursor: default; +} + +#media-upload .slidetoggle { + border-top-width: 1px; + border-top-style: solid; +} + +#media-upload .describe th.label { + padding-top: .2em; + text-align: left; + min-width: 120px; +} + +#media-upload tr.align td.field { + text-align: center; +} + +#media-upload tr.image-size { + margin-bottom: 1em; + height: 3em; +} + +#media-upload #filter { + width: 623px; +} + +#media-upload #filter .subsubsub { + margin: 8px 0; +} + +#filter .tablenav select { + border-style: solid; + border-width: 1px; + padding: 2px; + vertical-align: top; + width: auto; +} + +#media-upload .del-attachment { + display: none; + margin: 5px 0; +} + +.menu_order { + float: right; + font-size: 11px; + margin: 10px 10px 0; +} + +.menu_order_input { + border: 1px solid #ddd; + font-size: 10px; + padding: 1px; + width: 23px; +} + +.ui-sortable-helper { + background-color: #fff; + border: 1px solid #aaa; + opacity: 0.6; + filter: alpha(opacity=60); +} + +#media-upload th.order-head { + width: 20%; + text-align: center; +} + +#media-upload th.actions-head { + width: 25%; + text-align: center; +} + +#media-upload a.wp-post-thumbnail { + margin: 0 20px; +} + +#media-items a.delete { + display: block; + float: right; +} + +#media-upload .widefat { + width: 626px; + border-style: solid solid none; +} + +.sorthelper { + height: 37px; + width: 623px; + display: block; +} + +#gallery-settings th.label { + width: 160px; +} + +#gallery-settings #basic th.label { + padding: 5px 5px 5px 0; +} + +#gallery-settings .title { + clear: both; + padding: 0 0 3px; + font-size: 1.6em; + border-bottom: 1px solid #DADADA; +} + +h3.media-title { + font-size: 1.6em; +} + +h4.media-sub-title { + border-bottom: 1px solid #DADADA; + font-size: 1.3em; + margin: 12px; + padding: 0 0 3px; +} + +#gallery-settings .title, +h3.media-title, +h4.media-sub-title { + font-family: Georgia,"Times New Roman",Times,serif; + font-weight: normal; + color: #5A5A5A; +} + +#gallery-settings .describe td { + vertical-align: middle; + height: 3em; +} + +#gallery-settings .describe th.label { + padding-top: .5em; + text-align: left; +} + +#gallery-settings .describe { + padding: 5px; + width: 615px; + clear: both; + cursor: default; +} + +#gallery-settings .describe select { + width: 15em; +} + +#gallery-settings .describe select option, +#gallery-settings .describe td { + padding: 0; +} + +#gallery-settings label, +#gallery-settings legend { + font-size: 13px; + color: #464646; + margin-right: 15px; +} + +#gallery-settings .align .field label { + margin: 0 1.5em 0 0; +} + +#gallery-settings p.ml-submit { + border-top: 1px solid #dfdfdf; +} + +#gallery-settings select#columns { + width: 6em; +} + +#sort-buttons { + font-size: 0.8em; + margin: 3px 25px -8px 0; + text-align: right; + max-width: 625px; +} + +#sort-buttons a { + text-decoration: none; +} + +#sort-buttons #asc, +#sort-buttons #showall { + padding-left: 5px; +} + +#sort-buttons span { + margin-right: 25px; +} diff --git a/src/wp-admin/css/ms.css b/src/wp-admin/css/ms.css new file mode 100644 index 0000000..29d9d54 --- /dev/null +++ b/src/wp-admin/css/ms.css @@ -0,0 +1 @@ +#dashboard_right_now p.musub{margin-top:12px;border-top:1px solid #ececec;padding-left:16px;position:static;}.rtl #dashboard_right_now p.musub{padding-left:0;padding-right:16px;}#dashboard_right_now td.b a.musublink{font-size:16px;}#dashboard_right_now div.musubtable{border-top:none;}#dashboard_right_now div.musubtable .t{white-space:normal;}.wp-list-table .site-deleted{background:#ff8573;}.wp-list-table .site-spammed{background:#faafaa;}.wp-list-table .site-archived{background:#ffebe8;}.wp-list-table .site-mature{background:#fecac2;} \ No newline at end of file diff --git a/src/wp-admin/css/ms.dev.css b/src/wp-admin/css/ms.dev.css new file mode 100644 index 0000000..5a5e749 --- /dev/null +++ b/src/wp-admin/css/ms.dev.css @@ -0,0 +1,38 @@ +/* Dashboard: MS Specific Data */ +#dashboard_right_now p.musub { + margin-top: 12px; + border-top: 1px solid #ececec; + padding-left: 16px; + position: static; +} + +.rtl #dashboard_right_now p.musub { + padding-left: 0; + padding-right: 16px; +} + +#dashboard_right_now td.b a.musublink { + font-size: 16px; +} + +#dashboard_right_now div.musubtable { + border-top: none; +} + +#dashboard_right_now div.musubtable .t { + white-space: normal; +} + +/* Background Color for Site Status */ +.wp-list-table .site-deleted { + background: #ff8573; +} +.wp-list-table .site-spammed { + background: #faafaa; +} +.wp-list-table .site-archived { + background: #ffebe8; +} +.wp-list-table .site-mature { + background: #fecac2; +} diff --git a/src/wp-admin/css/nav-menu-rtl.css b/src/wp-admin/css/nav-menu-rtl.css new file mode 100644 index 0000000..639f5e9 --- /dev/null +++ b/src/wp-admin/css/nav-menu-rtl.css @@ -0,0 +1 @@ +#nav-menus-frame{margin-right:300px;margin-left:0;}#wpbody-content #menu-settings-column{margin-right:-300px;margin-left:0;float:right;}#menu-management-liquid{float:right;}#menu-management{margin-left:20px;margin-right:0;}#post-body{padding:0 10px 10px 0;}.post-body-plain{padding:10px 0 0 10px;}#menu-management .nav-tabs-arrow-left{right:0;left:auto;}#menu-management .nav-tabs-arrow-right{left:0;right:auto;text-align:left;font-family:Tahoma,Arial,sans-serif;}#menu-management .nav-tabs{padding-right:20px;padding-left:10px;}.js #menu-management .nav-tabs{float:right;margin-right:0;margin-left:-400px;}#select-nav-menu-container{text-align:left;}#wpbody .open-label{float:right;}#wpbody .open-label span{padding-left:10px;padding-right:0;}.js .input-with-default-title{font-style:normal;font-weight:bold;}.postbox .howto input{float:left;}#nav-menu-theme-locations .button-controls{text-align:left;}.meta-sep,.submitdelete,.submitcancel{float:right;}#cancel-save{margin-left:0;margin-right:20px;}.list-controls{float:right;}.add-to-menu{float:left;}#add-custom-link label span{float:right;padding-left:5px;padding-right:0;}.howto span{float:right;}.list li .menu-item-title input{margin-left:3px;margin-right:0;}.menu-item-handle{padding-right:10px;padding-left:0;}.menu-item-edit-active .menu-item-handle{-moz-border-radius:3px 3px 0 0;-webkit-border-bottom-left-radius:0;-webkit-border-bottom-right-radius:0;-khtml-border-bottom-left-radius:0;-khtml-border-bottom-right-radius:0;border-bottom-left-radius:0;border-bottom-right-radius:0;}.menu-item-handle .item-title{margin-left:13em;margin-right:0;}.menu-item-depth-0{margin-right:0;margin-left:0;}.menu-item-depth-1{margin-right:30px;margin-left:0;}.menu-item-depth-2{margin-right:60px;margin-left:0;}.menu-item-depth-3{margin-right:90px;margin-left:0;}.menu-item-depth-4{margin-right:120px;margin-left:0;}.menu-item-depth-5{margin-right:150px;margin-left:0;}.menu-item-depth-6{margin-right:180px;margin-left:0;}.menu-item-depth-7{margin-right:210px;margin-left:0;}.menu-item-depth-8{margin-right:240px;margin-left:0;}.menu-item-depth-9{margin-right:270px;margin-left:0;}.menu-item-depth-10{margin-right:300px;margin-left:0;}.menu-item-depth-11{margin-right:330px;margin-left:0;}.menu-item-depth-0 .menu-item-transport{margin-right:0;margin-left:0;}.menu-item-depth-1 .menu-item-transport{margin-right:-30px;margin-left:0;}.menu-item-depth-2 .menu-item-transport{margin-right:-60px;margin-left:0;}.menu-item-depth-3 .menu-item-transport{margin-right:-90px;margin-left:0;}.menu-item-depth-4 .menu-item-transport{margin-right:-120px;margin-left:0;}.menu-item-depth-5 .menu-item-transport{margin-right:-150px;margin-left:0;}.menu-item-depth-6 .menu-item-transport{margin-right:-180px;margin-left:0;}.menu-item-depth-7 .menu-item-transport{margin-right:-210px;margin-left:0;}.menu-item-depth-8 .menu-item-transport{margin-right:-240px;margin-left:0;}.menu-item-depth-9 .menu-item-transport{margin-right:-270px;margin-left:0;}.menu-item-depth-10 .menu-item-transport{margin-right:-300px;margin-left:0;}.menu-item-depth-11 .menu-item-transport{margin-right:-330px;margin-left:0;}.item-type{padding-left:10px;padding-right:0;}.item-controls{left:20px;right:auto;}.item-controls .item-order{padding-left:10px;padding-right:0;}.item-edit{left:-20px;right:auto;-moz-border-radius-bottomright:3px;-moz-border-radius-bottomleft:0;-webkit-border-bottom-right-radius:3px;-webkit-border-bottom-left-radius:0;-khtml-border-bottom-right-radius:3px;-khtml-border-bottom-left-radius:0;border-bottom-right-radius:3px;border-bottom-left-radius:0;}.menu-item-settings{padding:10px 10px 10px 0;border-width:0 1px 1px 1px;}.link-to-original{font-style:normal;font-weight:bold;}.link-to-original a{padding-right:4px;padding-left:0;}.menu-item-settings .description-thin,.menu-item-settings .description-wide{margin-left:10px;margin-right:0;float:right;}.major-publishing-actions .publishing-action{text-align:left;float:left;}.major-publishing-actions .delete-action{text-align:right;float:right;padding-left:15px;padding-right:0;}.menu-name-label{margin-left:15px;margin-right:0;}.auto-add-pages{float:right;} \ No newline at end of file diff --git a/src/wp-admin/css/nav-menu-rtl.dev.css b/src/wp-admin/css/nav-menu-rtl.dev.css new file mode 100644 index 0000000..69d8797 --- /dev/null +++ b/src/wp-admin/css/nav-menu-rtl.dev.css @@ -0,0 +1,210 @@ +#nav-menus-frame { + margin-right: 300px; + margin-left: 0; +} + +#wpbody-content #menu-settings-column { + margin-right: -300px; + margin-left: 0; + float: right; +} + +/* Menu Container */ +#menu-management-liquid { + float: right; +} +#menu-management { + margin-left: 20px; + margin-right: 0; +} + + + #post-body { + padding:0 10px 10px 0; + } + + .post-body-plain { + padding: 10px 0 0 10px; + } + +/* Menu Tabs */ + + #menu-management .nav-tabs-arrow-left { + right: 0; + left:auto; + } + #menu-management .nav-tabs-arrow-right { + left: 0; + right:auto; + text-align: left; + font-family: Tahoma, Arial, sans-serif; + } + +#menu-management .nav-tabs { + padding-right: 20px; + padding-left: 10px; +} +.js #menu-management .nav-tabs { + float: right; + margin-right: 0px; + margin-left: -400px; +} + +#select-nav-menu-container { + text-align: left; +} + +#wpbody .open-label { + float:right; +} + +#wpbody .open-label span { + padding-left: 10px; + padding-right:0; +} + + .js .input-with-default-title { + font-style: normal; + font-weight:bold; + } + +/* Add Menu Item Boxes */ +.postbox .howto input { + float: left; +} +#nav-menu-theme-locations .button-controls { + text-align: left; +} + +/* Button Primary Actions */ + +.meta-sep, +.submitdelete, +.submitcancel { + float:right; +} + +#cancel-save { + margin-left: 0; + margin-right: 20px; +} + +/* Button Secondary Actions */ +.list-controls { + float: right; +} +.add-to-menu { + float: left; +} + +/* Custom Links */ +#add-custom-link label span { float: right; padding-left: 5px; padding-right:0;} +.howto span { float: right; } + +.list li .menu-item-title input { margin-left: 3px; margin-right: 0 } + +/* Nav Menu */ +.menu-item-handle { + padding-right: 10px; + padding-left: 0; +} +.menu-item-edit-active .menu-item-handle { + -moz-border-radius: 3px 3px 0 0; + -webkit-border-bottom-left-radius: 0; + -webkit-border-bottom-right-radius: 0; + -khtml-border-bottom-left-radius: 0; + -khtml-border-bottom-right-radius: 0; + border-bottom-left-radius: 0; + border-bottom-right-radius: 0; +} +.menu-item-handle .item-title { + margin-left:13em; + margin-right:0; +} + + +/* WARNING: The factor of 30px is hardcoded into the nav-menus javascript. */ +.menu-item-depth-0 { margin-right: 0px; margin-left:0;} +.menu-item-depth-1 { margin-right: 30px; margin-left:0;} +.menu-item-depth-2 { margin-right: 60px; margin-left:0;} +.menu-item-depth-3 { margin-right: 90px; margin-left:0;} +.menu-item-depth-4 { margin-right: 120px; margin-left:0;} +.menu-item-depth-5 { margin-right: 150px; margin-left:0;} +.menu-item-depth-6 { margin-right: 180px; margin-left:0;} +.menu-item-depth-7 { margin-right: 210px; margin-left:0;} +.menu-item-depth-8 { margin-right: 240px; margin-left:0;} +.menu-item-depth-9 { margin-right: 270px; margin-left:0;} +.menu-item-depth-10 { margin-right: 300px; margin-left:0;} +.menu-item-depth-11 { margin-right: 330px; margin-left:0;} + +.menu-item-depth-0 .menu-item-transport { margin-right: 0px; margin-left:0;} +.menu-item-depth-1 .menu-item-transport { margin-right: -30px; margin-left:0;} +.menu-item-depth-2 .menu-item-transport { margin-right: -60px; margin-left:0;} +.menu-item-depth-3 .menu-item-transport { margin-right: -90px; margin-left:0;} +.menu-item-depth-4 .menu-item-transport { margin-right: -120px; margin-left:0;} +.menu-item-depth-5 .menu-item-transport { margin-right: -150px; margin-left:0;} +.menu-item-depth-6 .menu-item-transport { margin-right: -180px; margin-left:0;} +.menu-item-depth-7 .menu-item-transport { margin-right: -210px; margin-left:0;} +.menu-item-depth-8 .menu-item-transport { margin-right: -240px; margin-left:0;} +.menu-item-depth-9 .menu-item-transport { margin-right: -270px; margin-left:0;} +.menu-item-depth-10 .menu-item-transport { margin-right: -300px; margin-left:0;} +.menu-item-depth-11 .menu-item-transport { margin-right: -330px; margin-left:0;} + +/* Menu item controls */ +.item-type { padding-left: 10px; padding-right:0;} +.item-controls { left: 20px; right: auto;} +.item-controls .item-order { padding-left: 10px; padding-right: 0;} + +.item-edit { + left: -20px; + right:auto; + -moz-border-radius-bottomright: 3px; + -moz-border-radius-bottomleft: 0; + -webkit-border-bottom-right-radius: 3px; + -webkit-border-bottom-left-radius: 0; + -khtml-border-bottom-right-radius: 3px; + -khtml-border-bottom-left-radius: 0; + border-bottom-right-radius: 3px; + border-bottom-left-radius: 0; +} + +/* Menu editing */ +.menu-item-settings { + padding: 10px 10px 10px 0; + border-width: 0 1px 1px 1px; +} + +.link-to-original { + font-style: normal; + font-weight: bold; +} + .link-to-original a { + padding-right: 4px; + padding-left:0; + } + +.menu-item-settings .description-thin, +.menu-item-settings .description-wide { + margin-left: 10px; + margin-right:0; + float: right; +} + +/* Major/minor publishing actions (classes) */ +.major-publishing-actions .publishing-action { + text-align: left; + float: left; +} +.major-publishing-actions .delete-action { + text-align: right; + float: right; + padding-left: 15px; + padding-right:0; +} +.menu-name-label { + margin-left: 15px; + margin-right:0; +} +.auto-add-pages { + float: right; +} \ No newline at end of file diff --git a/src/wp-admin/css/nav-menu.css b/src/wp-admin/css/nav-menu.css new file mode 100644 index 0000000..a1f5677 --- /dev/null +++ b/src/wp-admin/css/nav-menu.css @@ -0,0 +1 @@ +html,body{min-width:950px;}#nav-menus-frame{margin-left:300px;}#wpbody-content #menu-settings-column{display:inline;width:281px;margin-left:-300px;clear:both;float:left;padding-top:24px;}.no-js #wpbody-content #menu-settings-column{padding-top:31px;}#menu-settings-column .inside{clear:both;}.metabox-holder-disabled .postbox{opacity:.5;filter:alpha(opacity=50);}.metabox-holder-disabled .button-controls .select-all{display:none;}#wpbody{position:relative;}#menu-management-liquid{float:left;min-width:100%;}#menu-management{position:relative;margin-right:20px;margin-top:-3px;width:100%;}#menu-management .menu-edit{border:1px solid;-moz-border-radius:3px;-webkit-border-radius:3px;-khtml-border-radius:3px;border-radius:3px;margin-bottom:20px;}#post-body{padding:10px;border-width:1px 0;border-style:solid;}#nav-menu-header,#nav-menu-footer{padding:0 10px;}#nav-menu-header{border-bottom:1px solid;}#nav-menu-footer{border-top:1px solid;}#post-body div.updated,#post-body div.error{margin:0;}#post-body-content{position:relative;}#menu-management .menu-add-new abbr{font-weight:bold;}#menu-management .nav-tabs-nav{margin:0 20px;}#menu-management .nav-tabs-arrow{width:10px;padding:0 5px 4px;cursor:pointer;position:absolute;top:0;line-height:22px;font-size:18px;text-shadow:0 1px 0 #fff;}#menu-management .nav-tabs-arrow-left{left:0;}#menu-management .nav-tabs-arrow-right{right:0;text-align:right;}#menu-management .nav-tabs-wrapper{width:100%;height:28px;margin-bottom:-1px;overflow:hidden;}#menu-management .nav-tabs{padding-left:20px;padding-right:10px;}.js #menu-management .nav-tabs{float:left;margin-left:0;margin-right:-400px;}#menu-management .nav-tab{margin-bottom:0;font-size:14px;font-family:Georgia,"Times New Roman","Bitstream Charter",Times,serif;}#select-nav-menu-container{text-align:right;padding:0 10px 3px 10px;margin-bottom:5px;}#select-nav-menu{width:100px;display:inline;}#menu-name-label{margin-top:-2px;}#wpbody .open-label{display:block;float:left;}#wpbody .open-label span{padding-right:10px;}.js .input-with-default-title{font-style:italic;}#menu-management .inside{padding:0 10px;}.postbox .howto input{width:180px;float:right;}.customlinkdiv .howto input{width:200px;}#nav-menu-theme-locations .howto select{width:100%;}#nav-menu-theme-locations .button-controls{text-align:right;}.add-menu-item-view-all{height:400px;}#menu-container .submit{margin:0 0 10px;padding:0;}.meta-sep,.submitdelete,.submitcancel{display:block;float:left;font-size:12px;margin:4px 0;line-height:15px;}.meta-sep{padding:0 2px;}#cancel-save{text-decoration:underline;font-size:12px;margin-left:20px;margin-top:5px;}.list-controls{float:left;margin-top:5px;}.add-to-menu{float:right;}.postbox img.waiting{display:none;vertical-align:middle;}.button-controls{clear:both;margin:10px 0;}.show-all,.hide-all{cursor:pointer;}.hide-all{display:none;}#menu-name{width:270px;}#manage-menu .inside{padding:0;}#available-links dt{display:block;}#add-custom-link .howto{font-size:12px;}#add-custom-link label span{display:block;float:left;margin-top:5px;padding-right:5px;}.menu-item-textbox{width:180px;}.howto span{margin-top:4px;display:block;float:left;}.quick-search{width:190px;}.list-wrap{display:none;clear:both;margin-bottom:10px;}.list-container{max-height:200px;overflow-y:auto;padding:10px 10px 5px;border:1px solid;-moz-border-radius:3px;}.postbox p.submit{margin-bottom:0;}.list li{display:none;margin:0;margin-bottom:5px;}.list li .menu-item-title{cursor:pointer;display:block;}.list li .menu-item-title input{margin-right:3px;margin-top:-3px;}#menu-container .inside{padding-bottom:10px;}.menu{padding-top:1em;}#menu-to-edit{padding:1em 0;}.menu ul{width:100%;}.menu li{margin-bottom:0;position:relative;}.menu-item-bar{clear:both;line-height:1.5em;position:relative;margin-top:13px;}.menu-item-handle{border:1px solid #dfdfdf;position:relative;padding-left:10px;height:auto;width:400px;line-height:35px;text-shadow:0 1px 0 #FFF;overflow:hidden;word-wrap:break-word;border-radius:3px;-webkit-border-radius:3px;-moz-border-radius:3px;-khtml-border-radius:3px;}#menu-to-edit .menu-item-invalid .menu-item-handle{background-color:#f6c9cc;background-image:-ms-linear-gradient(bottom,#f6c9cc,#fdf8ff);background-image:-moz-linear-gradient(bottom,#f6c9cc,#fdf8ff);background-image:-o-linear-gradient(bottom,#f6c9cc,#fdf8ff);background-image:-webkit-gradient(linear,left bottom,left top,from(#f6c9cc),to(#fdf8ff));background-image:-webkit-linear-gradient(bottom,#f6c9cc,#fdf8ff);background-image:linear-gradient(bottom,#f6c9cc,#fdf8ff);}.menu-item-edit-active .menu-item-handle{-moz-border-radius:3px 3px 0 0;-webkit-border-bottom-right-radius:0;-webkit-border-bottom-left-radius:0;-khtml-border-bottom-right-radius:0;-khtml-border-bottom-left-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:0;}.no-js .menu-item-edit-active .item-edit{display:none;}.js .menu-item-handle{cursor:move;}.menu li.deleting .menu-item-handle{background-image:none;text-shadow:0;}.menu-item-handle .item-title{font-size:12px;font-weight:bold;padding:7px 0;line-height:20px;display:block;margin-right:13em;}li.menu-item.ui-sortable-helper dl{margin-top:0;}li.menu-item.ui-sortable-helper .menu-item-transport dl{margin-top:13px;}.menu .sortable-placeholder{height:35px;width:410px;margin-top:13px;}.menu-item-depth-0{margin-left:0;}.menu-item-depth-1{margin-left:30px;}.menu-item-depth-2{margin-left:60px;}.menu-item-depth-3{margin-left:90px;}.menu-item-depth-4{margin-left:120px;}.menu-item-depth-5{margin-left:150px;}.menu-item-depth-6{margin-left:180px;}.menu-item-depth-7{margin-left:210px;}.menu-item-depth-8{margin-left:240px;}.menu-item-depth-9{margin-left:270px;}.menu-item-depth-10{margin-left:300px;}.menu-item-depth-11{margin-left:330px;}.menu-item-depth-0 .menu-item-transport{margin-left:0;}.menu-item-depth-1 .menu-item-transport{margin-left:-30px;}.menu-item-depth-2 .menu-item-transport{margin-left:-60px;}.menu-item-depth-3 .menu-item-transport{margin-left:-90px;}.menu-item-depth-4 .menu-item-transport{margin-left:-120px;}.menu-item-depth-5 .menu-item-transport{margin-left:-150px;}.menu-item-depth-6 .menu-item-transport{margin-left:-180px;}.menu-item-depth-7 .menu-item-transport{margin-left:-210px;}.menu-item-depth-8 .menu-item-transport{margin-left:-240px;}.menu-item-depth-9 .menu-item-transport{margin-left:-270px;}.menu-item-depth-10 .menu-item-transport{margin-left:-300px;}.menu-item-depth-11 .menu-item-transport{margin-left:-330px;}body.menu-max-depth-0{min-width:950px!important;}body.menu-max-depth-1{min-width:980px!important;}body.menu-max-depth-2{min-width:1010px!important;}body.menu-max-depth-3{min-width:1040px!important;}body.menu-max-depth-4{min-width:1070px!important;}body.menu-max-depth-5{min-width:1100px!important;}body.menu-max-depth-6{min-width:1130px!important;}body.menu-max-depth-7{min-width:1160px!important;}body.menu-max-depth-8{min-width:1190px!important;}body.menu-max-depth-9{min-width:1220px!important;}body.menu-max-depth-10{min-width:1250px!important;}body.menu-max-depth-11{min-width:1280px!important;}.item-type{font-size:12px;padding-right:10px;}.item-controls{font-size:12px;position:absolute;right:20px;top:-1px;}.item-controls a{text-decoration:none;}.item-controls a:hover{cursor:pointer;}.item-controls .item-order{padding-right:10px;}.item-controls .item-order a{font-weight:bold;}body.js .item-order{display:none;}.item-edit{position:absolute;right:-20px;top:0;display:block;width:30px;height:36px;overflow:hidden;text-indent:-999em;border-bottom:1px solid;-moz-border-radius-bottomleft:3px;-webkit-border-bottom-left-radius:3px;-khtml-border-bottom-left-radius:3px;border-bottom-left-radius:3px;}.menu-instructions-inactive{display:none;}.menu-item-settings{display:block;width:400px;padding:10px 0 10px 10px;border:solid;border-width:0 1px 1px 1px;-moz-border-radius:0 0 3px 3px;-webkit-border-bottom-right-radius:3px;-webkit-border-bottom-left-radius:3px;-khtml-border-bottom-right-radius:3px;-khtml-border-bottom-left-radius:3px;}.menu-item-edit-active .menu-item-settings{display:block;}.menu-item-edit-inactive .menu-item-settings{display:none;}.add-menu-item-pagelinks{margin:.5em auto;text-align:center;}.link-to-original{display:block;margin:0 0 10px;padding:3px 5px 5px;font-size:12px;font-style:italic;border:1px solid;border-radius:3px;-webkit-border-radius:3px;-moz-border-radius:3px;-khtml-border-radius:3px;}.link-to-original a{padding-left:4px;font-style:normal;}.hidden-field{display:none;}.menu-item-settings .description-thin,.menu-item-settings .description-wide{margin-right:10px;float:left;}.description-thin{width:190px;height:40px;}.description-wide{width:390px;}.menu-item-actions{padding-top:15px;}#cancel-save{cursor:pointer;}.major-publishing-actions{clear:both;padding:3px 0 5px;}.major-publishing-actions .publishing-action{text-align:right;float:right;line-height:23px;margin:5px 0 1px;}.major-publishing-actions .delete-action{vertical-align:middle;text-align:left;float:left;padding-right:15px;margin-top:5px;}.menu-name-label span,.auto-add-pages label{font-size:12px;font-style:normal;}.menu-name-label{margin-right:15px;}.auto-add-pages input{margin-top:0;}.auto-add-pages{margin-top:4px;float:left;}.submitbox .submitcancel{border-bottom:1px solid;padding:1px 2px;text-decoration:none;}.major-publishing-actions .form-invalid{padding-left:4px;margin-left:-4px;border-radius:3px;-webkit-border-radius:3px;-moz-border-radius:3px;-khtml-border-radius:3px;}#menu-item-name-wrap:after,#menu-item-url-wrap:after,#menu-name-label:after,#menu-settings-column .inside:after,#nav-menus-frame:after,#post-body-content:after,.button-controls:after,.major-publishing-actions:after,.menu-item-settings:after{clear:both;content:".";display:block;height:0;visibility:hidden;}#nav-menus-frame,.button-controls,#menu-item-url-wrap,#menu-item-name-wrap{display:block;} \ No newline at end of file diff --git a/src/wp-admin/css/nav-menu.dev.css b/src/wp-admin/css/nav-menu.dev.css new file mode 100644 index 0000000..7224ee3 --- /dev/null +++ b/src/wp-admin/css/nav-menu.dev.css @@ -0,0 +1,705 @@ +/** + * WordPress Administration Custom Navigation + * Interface CSS + * + * @version 2.0.0 + * + * @package WordPress + * @subpackage Administration + */ + +html, +body { + min-width: 950px; +} + +#nav-menus-frame { + margin-left: 300px; +} + +#wpbody-content #menu-settings-column { + display:inline; + width:281px; + margin-left: -300px; + clear: both; + float: left; + padding-top: 24px; +} + .no-js #wpbody-content #menu-settings-column { + padding-top: 31px; + } + +#menu-settings-column .inside { + clear: both; +} + +.metabox-holder-disabled .postbox { + opacity: 0.5; + filter: alpha(opacity=50); +} + +.metabox-holder-disabled .button-controls .select-all { + display: none; +} +#wpbody { + position: relative; +} + +/* Menu Container */ +#menu-management-liquid { + float: left; + min-width: 100%; +} + +#menu-management { + position: relative; + margin-right: 20px; + margin-top: -3px; + width: 100%; +} + +#menu-management .menu-edit { + border: 1px solid; + -moz-border-radius: 3px; + -webkit-border-radius: 3px; + -khtml-border-radius: 3px; + border-radius: 3px; + margin-bottom: 20px; +} + +#post-body { + padding: 10px; + border-width: 1px 0; + border-style: solid; +} + +#nav-menu-header, +#nav-menu-footer { + padding: 0 10px; +} + +#nav-menu-header { + border-bottom: 1px solid; +} + +#nav-menu-footer { + border-top: 1px solid; +} + +#post-body div.updated, #post-body div.error { + margin: 0; +} + +#post-body-content { + position: relative; +} + +#menu-management .menu-add-new abbr { + font-weight:bold; +} + +/* Menu Tabs */ + +#menu-management .nav-tabs-nav { + margin: 0 20px; +} + +#menu-management .nav-tabs-arrow { + width: 10px; + padding: 0 5px 4px; + cursor: pointer; + position: absolute; + top: 0; + line-height: 22px; + font-size: 18px; + text-shadow: 0 1px 0 #fff; +} + +#menu-management .nav-tabs-arrow a:hover{ +} + +#menu-management .nav-tabs-arrow a:active { +} + +#menu-management .nav-tabs-arrow-left { + left: 0; +} + +#menu-management .nav-tabs-arrow-right { + right: 0; + text-align: right; +} + +#menu-management .nav-tabs-wrapper { + width: 100%; + height: 28px; + margin-bottom: -1px; + overflow: hidden; +} + +#menu-management .nav-tabs { + padding-left: 20px; + padding-right: 10px; +} + +.js #menu-management .nav-tabs { + float: left; + margin-left: 0px; + margin-right: -400px; +} + +#menu-management .nav-tab { + margin-bottom: 0; + font-size: 14px; + font-family: Georgia, "Times New Roman", "Bitstream Charter", Times, serif; +} + + +#select-nav-menu-container { + text-align: right; + padding: 0 10px 3px 10px; + margin-bottom: 5px; +} + +#select-nav-menu { + width: 100px; + display: inline; +} + +#menu-name-label { + margin-top: -2px; +} + +#wpbody .open-label { + display: block; + float:left; +} + +#wpbody .open-label span { + padding-right: 10px; +} + +.js .input-with-default-title { + font-style: italic; +} + +#menu-management .inside { + padding: 0 10px; +} + +/* Add Menu Item Boxes */ +.postbox .howto input { + width: 180px; + float: right; +} + +.customlinkdiv .howto input { + width: 200px; +} + +#nav-menu-theme-locations .howto select { + width: 100%; +} + +#nav-menu-theme-locations .button-controls { + text-align: right; +} + +.add-menu-item-view-all { + height: 400px; +} + +/* Button Primary Actions */ +#menu-container .submit { + margin: 0px 0px 10px; + padding: 0px; +} + +.meta-sep, +.submitdelete, +.submitcancel { + display:block; + float:left; + font-size: 12px; + margin: 4px 0; + line-height: 15px; +} + +.meta-sep { + padding: 0 2px; +} + +#cancel-save { + text-decoration: underline; + font-size: 12px; + margin-left: 20px; + margin-top: 5px; +} + +/* Button Secondary Actions */ +.list-controls { + float: left; + margin-top: 5px; +} + +.add-to-menu { + float: right; +} + +.postbox img.waiting { + display: none; + vertical-align: middle; +} + +.button-controls { + clear:both; + margin: 10px 0; +} + +.show-all, .hide-all { + cursor: pointer; +} + +.hide-all { + display: none; +} + +/* Create Menu */ +#menu-name { + width: 270px; +} + +#manage-menu .inside { + padding: 0px 0px; +} + +/* Custom Links */ +#available-links dt { + display: block; +} + +#add-custom-link .howto { + font-size: 12px; +} + +#add-custom-link label span { + display: block; + float: left; + margin-top: 5px; + padding-right: 5px; +} + +.menu-item-textbox { + width: 180px; +} + +.howto span { + margin-top: 4px; + display: block; + float: left; +} + +/* Menu item types */ +.quick-search { + width: 190px; +} + +.list-wrap { + display: none; + clear: both; + margin-bottom: 10px; +} + +.list-container { + max-height: 200px; + overflow-y: auto; + padding: 10px 10px 5px; + border: 1px solid; + -moz-border-radius: 3px; +} + +.postbox p.submit { + margin-bottom: 0; +} + +/* Listings */ +.list li { + display: none; + margin: 0; + margin-bottom: 5px; +} + +.list li .menu-item-title { + cursor: pointer; + display: block; +} + +.list li .menu-item-title input { + margin-right: 3px; + margin-top: -3px; +} + +/* Nav Menu */ +#menu-container .inside { + padding-bottom: 10px; +} + +.menu { + padding-top:1em; +} + +#menu-to-edit { + padding: 1em 0; +} + +.menu ul { + width: 100%; +} + +.menu ul.sub-menu { +} + +.menu li { + margin-bottom: 0; + position:relative; +} + +.menu-item-bar { + clear:both; + line-height:1.5em; + position:relative; + margin-top: 13px; +} + +.menu-item-handle { + border: 1px solid #dfdfdf; + position: relative; + padding-left: 10px; + height: auto; + width: 400px; + line-height: 35px; + text-shadow: 0 1px 0 #FFFFFF; + overflow: hidden; + word-wrap: break-word; + border-radius: 3px; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + -khtml-border-radius: 3px; +} + +#menu-to-edit .menu-item-invalid .menu-item-handle { + background-color: #f6c9cc; /* Fallback */ + background-image: -ms-linear-gradient(bottom, #f6c9cc, #fdf8ff); /* IE10 */ + background-image: -moz-linear-gradient(bottom, #f6c9cc, #fdf8ff); /* Firefox */ + background-image: -o-linear-gradient(bottom, #f6c9cc, #fdf8ff); /* Opera */ + background-image: -webkit-gradient(linear, left bottom, left top, from(#f6c9cc), to(#fdf8ff)); /* old Webkit */ + background-image: -webkit-linear-gradient(bottom, #f6c9cc, #fdf8ff); /* new Webkit */ + background-image: linear-gradient(bottom, #f6c9cc, #fdf8ff); /* proposed W3C Markup */ +} + +.menu-item-edit-active .menu-item-handle { + -moz-border-radius: 3px 3px 0 0; + -webkit-border-bottom-right-radius: 0; + -webkit-border-bottom-left-radius: 0; + -khtml-border-bottom-right-radius: 0; + -khtml-border-bottom-left-radius: 0; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} + +.no-js .menu-item-edit-active .item-edit { + display: none; +} + +.js .menu-item-handle { + cursor: move; +} + +.menu li.deleting .menu-item-handle { + background-image: none; + text-shadow: 0 0 0; +} + +.menu-item-handle .item-title { + font-size: 12px; + font-weight: bold; + padding: 7px 0; + line-height: 20px; + display:block; + margin-right:13em; +} + +/* Sortables */ +li.menu-item.ui-sortable-helper dl { + margin-top: 0; +} + +li.menu-item.ui-sortable-helper .menu-item-transport dl { + margin-top: 13px; +} + +.menu .sortable-placeholder { + height: 35px; + width: 410px; + margin-top: 13px; +} + +/* WARNING: The factor of 30px is hardcoded into the nav-menus javascript. */ +.menu-item-depth-0 { margin-left: 0px; } +.menu-item-depth-1 { margin-left: 30px; } +.menu-item-depth-2 { margin-left: 60px; } +.menu-item-depth-3 { margin-left: 90px; } +.menu-item-depth-4 { margin-left: 120px; } +.menu-item-depth-5 { margin-left: 150px; } +.menu-item-depth-6 { margin-left: 180px; } +.menu-item-depth-7 { margin-left: 210px; } +.menu-item-depth-8 { margin-left: 240px; } +.menu-item-depth-9 { margin-left: 270px; } +.menu-item-depth-10 { margin-left: 300px; } +.menu-item-depth-11 { margin-left: 330px; } + +.menu-item-depth-0 .menu-item-transport { margin-left: 0px; } +.menu-item-depth-1 .menu-item-transport { margin-left: -30px; } +.menu-item-depth-2 .menu-item-transport { margin-left: -60px; } +.menu-item-depth-3 .menu-item-transport { margin-left: -90px; } +.menu-item-depth-4 .menu-item-transport { margin-left: -120px; } +.menu-item-depth-5 .menu-item-transport { margin-left: -150px; } +.menu-item-depth-6 .menu-item-transport { margin-left: -180px; } +.menu-item-depth-7 .menu-item-transport { margin-left: -210px; } +.menu-item-depth-8 .menu-item-transport { margin-left: -240px; } +.menu-item-depth-9 .menu-item-transport { margin-left: -270px; } +.menu-item-depth-10 .menu-item-transport { margin-left: -300px; } +.menu-item-depth-11 .menu-item-transport { margin-left: -330px; } + +body.menu-max-depth-0 { min-width: 950px !important; } +body.menu-max-depth-1 { min-width: 980px !important; } +body.menu-max-depth-2 { min-width: 1010px !important; } +body.menu-max-depth-3 { min-width: 1040px !important; } +body.menu-max-depth-4 { min-width: 1070px !important; } +body.menu-max-depth-5 { min-width: 1100px !important; } +body.menu-max-depth-6 { min-width: 1130px !important; } +body.menu-max-depth-7 { min-width: 1160px !important; } +body.menu-max-depth-8 { min-width: 1190px !important; } +body.menu-max-depth-9 { min-width: 1220px !important; } +body.menu-max-depth-10 { min-width: 1250px !important; } +body.menu-max-depth-11 { min-width: 1280px !important; } + +/* Menu item controls */ +.item-type { + font-size: 12px; + padding-right: 10px; +} + +.item-controls { + font-size: 12px; + position: absolute; + right: 20px; + top: -1px; +} + +.item-controls a { + text-decoration: none; +} + +.item-controls a:hover { + cursor: pointer; +} + +.item-controls .item-order { + padding-right: 10px; +} + +.item-controls .item-order a { + font-weight:bold; +} + +body.js .item-order { + display:none; +} + +.item-controls .menu-item-delete:hover { +} + +.item-edit { + position: absolute; + right: -20px; + top: 0; + display: block; + width:30px; + height: 36px; + overflow: hidden; + text-indent:-999em; + border-bottom: 1px solid; + -moz-border-radius-bottomleft: 3px; + -webkit-border-bottom-left-radius: 3px; + -khtml-border-bottom-left-radius: 3px; + border-bottom-left-radius: 3px; +} + +.item-edit:hover { +} + +/* Menu editing */ +.menu-instructions-inactive { + display: none; +} + +.menu-item-settings { + display:block; + width: 400px; + padding: 10px 0 10px 10px; + border: solid; + border-width: 0 1px 1px 1px; + -moz-border-radius: 0 0 3px 3px; + -webkit-border-bottom-right-radius: 3px; + -webkit-border-bottom-left-radius: 3px; + -khtml-border-bottom-right-radius: 3px; + -khtml-border-bottom-left-radius: 3px; +} + +.menu-item-edit-active .menu-item-settings { + display:block; +} + +.menu-item-edit-inactive .menu-item-settings { + display:none; +} + +.add-menu-item-pagelinks { + margin:.5em auto; + text-align:center; +} + +.link-to-original { + display: block; + margin: 0 0 10px; + padding: 3px 5px 5px; + font-size: 12px; + font-style: italic; + border: 1px solid; + border-radius: 3px; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + -khtml-border-radius: 3px; +} + +.link-to-original a { + padding-left: 4px; + font-style: normal; +} + +.hidden-field { + display: none; +} + +.menu-item-settings .description-thin, +.menu-item-settings .description-wide { + margin-right: 10px; + float: left; +} + +.description-thin { + width: 190px; + height: 40px; +} + +.description-wide { + width: 390px; +} + +.menu-item-actions { + padding-top: 15px; +} + +#cancel-save { + cursor: pointer; +} + +#cancel-save:hover { +} + +#update-menu-item { +} + +#update-menu-item:hover, +#update-menu-item:active, +#update-menu-item:focus { +} + +/* Major/minor publishing actions (classes) */ +.major-publishing-actions { + clear:both; + padding: 3px 0 5px; +} + +.major-publishing-actions .publishing-action { + text-align: right; + float: right; + line-height: 23px; + margin: 5px 0 1px; +} + +.major-publishing-actions .delete-action { + vertical-align: middle; + text-align: left; + float: left; + padding-right: 15px; + margin-top: 5px; +} + +.menu-name-label span, .auto-add-pages label { + font-size: 12px; + font-style: normal; +} + +.menu-name-label { + margin-right: 15px; +} + +.auto-add-pages input { + margin-top: 0; +} + +.auto-add-pages { + margin-top: 4px; + float: left; +} + +.submitbox .submitcancel { + border-bottom: 1px solid; + padding: 1px 2px; + text-decoration: none; +} + +.submitbox .submitcancel:hover { +} + +.major-publishing-actions .form-invalid { + padding-left: 4px; + margin-left: -4px; + border-radius: 3px; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + -khtml-border-radius: 3px; +} + +/* Clearfix */ +#menu-item-name-wrap:after, +#menu-item-url-wrap:after, +#menu-name-label:after, +#menu-settings-column .inside:after, +#nav-menus-frame:after, +#post-body-content:after, +.button-controls:after, +.major-publishing-actions:after, +.menu-item-settings:after { + clear: both; + content: "."; + display: block; + height: 0; + visibility: hidden; +} + +#nav-menus-frame, .button-controls, #menu-item-url-wrap, #menu-item-name-wrap { + display: block; +} diff --git a/src/wp-admin/css/plugin-install-rtl.css b/src/wp-admin/css/plugin-install-rtl.css new file mode 100644 index 0000000..f1ade77 --- /dev/null +++ b/src/wp-admin/css/plugin-install-rtl.css @@ -0,0 +1 @@ +div.star{left:auto;right:0;letter-spacing:0;}.star img,div.star a,div.star a:hover,div.star a:visited{right:auto;left:0;}#plugin-information ul#sidemenu{left:auto;right:0;}#plugin-information h2{margin-right:0;margin-left:200px;}#plugin-information .fyi{margin-left:5px;margin-right:20px;}#plugin-information .fyi h2{margin-left:0;}#plugin-information .fyi ul{padding:10px 7px 10px 5px;}#plugin-information #section-screenshots li p{padding-left:0;padding-right:20px;}#plugin-information .updated,#plugin-information pre{margin-right:0;margin-left:215px;}#plugin-information .updated,#plugin-information .error{clear:none;direction:rtl;}#section-description{direction:ltr;} \ No newline at end of file diff --git a/src/wp-admin/css/plugin-install-rtl.dev.css b/src/wp-admin/css/plugin-install-rtl.dev.css new file mode 100644 index 0000000..9a6dd11 --- /dev/null +++ b/src/wp-admin/css/plugin-install-rtl.dev.css @@ -0,0 +1,43 @@ +div.star { + left: auto; + right: 0; + letter-spacing: 0; +} +.star img, div.star a, div.star a:hover, div.star a:visited { + right: auto; + left: 0; +} +#plugin-information ul#sidemenu { + left: auto; + right: 0; +} +#plugin-information h2 { + margin-right: 0; + margin-left: 200px; +} +#plugin-information .fyi { + margin-left: 5px; + margin-right: 20px; +} +#plugin-information .fyi h2 { + margin-left: 0; +} +#plugin-information .fyi ul { + padding: 10px 7px 10px 5px; +} +#plugin-information #section-screenshots li p { + padding-left: 0; + padding-right: 20px; +} +#plugin-information .updated, +#plugin-information pre { + margin-right: 0; + margin-left: 215px; +} +#plugin-information .updated, #plugin-information .error { + clear: none; + direction: rtl; +} +#section-description { + direction: ltr; +} diff --git a/src/wp-admin/css/plugin-install.css b/src/wp-admin/css/plugin-install.css new file mode 100644 index 0000000..939408f --- /dev/null +++ b/src/wp-admin/css/plugin-install.css @@ -0,0 +1 @@ +div.star-holder{position:relative;height:19px;width:100px;font-size:19px;}div.action-links{font-weight:normal;margin:6px 0 0;}div.star{height:100%;position:absolute;top:0;left:0;background-color:transparent;letter-spacing:1ex;border:none;}.star1{width:20%;}.star2{width:40%;}.star3{width:60%;}.star4{width:80%;}.star5{width:100%;}.star img,div.star a,div.star a:hover,div.star a:visited{display:block;position:absolute;right:0;border:none;text-decoration:none;}div.star img{width:19px;height:19px;}#plugin-information-header{margin:0;padding:0 5px;font-weight:bold;position:relative;border-bottom-width:1px;border-bottom-style:solid;height:2.5em;}#plugin-information ul#sidemenu{font-weight:normal;margin:0 5px;position:absolute;left:0;bottom:-1px;}#plugin-information p.action-button{width:100%;padding-bottom:0;margin-bottom:0;margin-top:10px;-moz-border-radius:3px 0 0 3px;-webkit-border-top-left-radius:3px;-khtml-border-top-left-radius:3px;border-top-left-radius:3px;-webkit-border-bottom-left-radius:3px;-khtml-border-bottom-left-radius:3px;border-bottom-left-radius:3px;}#plugin-information .action-button a{text-align:center;font-weight:bold;text-decoration:none;display:block;line-height:2em;}#plugin-information h2{clear:none!important;margin-right:200px;}#plugin-information .fyi{margin:0 10px 50px;width:210px;}#plugin-information .fyi h2{font-size:.9em;margin-bottom:0;margin-right:0;}#plugin-information .fyi h2.mainheader{padding:5px;-moz-border-radius-topleft:3px;-webkit-border-top-left-radius:3px;-khtml-border-top-left-radius:3px;border-top-left-radius:3px;}#plugin-information .fyi ul{padding:10px 5px 10px 7px;margin:0;list-style:none;-moz-border-radius-bottomleft:3px;-webkit-border-bottom-left-radius:3px;-khtml-border-bottom-left-radius:3px;border-bottom-left-radius:3px;}#plugin-information .fyi li{margin-right:0;}#plugin-information #section-holder{padding:10px;}#plugin-information .section ul,#plugin-information .section ol{margin-left:16px;list-style-type:square;list-style-image:none;}#plugin-information #section-screenshots li img{vertical-align:text-top;}#plugin-information #section-screenshots li p{font-style:italic;padding-left:20px;padding-bottom:2em;}#plugin-information .updated,#plugin-information pre{margin-right:215px;}#plugin-information pre{padding:7px;} \ No newline at end of file diff --git a/src/wp-admin/css/plugin-install.dev.css b/src/wp-admin/css/plugin-install.dev.css new file mode 100644 index 0000000..2204257 --- /dev/null +++ b/src/wp-admin/css/plugin-install.dev.css @@ -0,0 +1,150 @@ +/* NOTE: the following CSS rules(.star*) are taken more or less straight from the bbPress rating plugin. */ +div.star-holder { + position: relative; + height: 19px; + width: 100px; + font-size: 19px; +} + +div.action-links { + font-weight: normal; + margin: 6px 0 0; +} + +div.star { + height: 100%; + position: absolute; + top: 0; + left: 0; + background-color: transparent; + letter-spacing: 1ex; + border: none; +} + +.star1 { width: 20%; } +.star2 { width: 40%; } +.star3 { width: 60%; } +.star4 { width: 80%; } +.star5 { width: 100%; } + +.star img, div.star a, div.star a:hover, div.star a:visited { + display: block; + position: absolute; + right: 0; + border: none; + text-decoration: none; +} + +div.star img { + width: 19px; + height: 19px; +} + +/* Header on thickbox */ +#plugin-information-header { + margin: 0; + padding: 0 5px; + font-weight: bold; + position: relative; + border-bottom-width: 1px; + border-bottom-style: solid; + height: 2.5em; +} +#plugin-information ul#sidemenu { + font-weight: normal; + margin: 0 5px; + position: absolute; + left: 0; + bottom: -1px; +} + +/* Install sidemenu */ +#plugin-information p.action-button { + width: 100%; + padding-bottom: 0; + margin-bottom: 0; + margin-top: 10px; + -moz-border-radius: 3px 0 0 3px; + -webkit-border-top-left-radius: 3px; + -khtml-border-top-left-radius: 3px; + border-top-left-radius: 3px; + -webkit-border-bottom-left-radius: 3px; + -khtml-border-bottom-left-radius: 3px; + border-bottom-left-radius: 3px; +} + +#plugin-information .action-button a { + text-align: center; + font-weight: bold; + text-decoration: none; + display: block; + line-height: 2em; +} + +#plugin-information h2 { + clear: none !important; + margin-right: 200px; +} + +#plugin-information .fyi { + margin: 0 10px 50px; + width: 210px; +} + +#plugin-information .fyi h2 { + font-size: 0.9em; + margin-bottom: 0; + margin-right: 0; +} + +#plugin-information .fyi h2.mainheader { + padding: 5px; + -moz-border-radius-topleft: 3px; + -webkit-border-top-left-radius: 3px; + -khtml-border-top-left-radius: 3px; + border-top-left-radius: 3px; +} + +#plugin-information .fyi ul { + padding: 10px 5px 10px 7px; + margin: 0; + list-style: none; + -moz-border-radius-bottomleft: 3px; + -webkit-border-bottom-left-radius: 3px; + -khtml-border-bottom-left-radius: 3px; + border-bottom-left-radius: 3px; +} + +#plugin-information .fyi li { + margin-right: 0; +} + +#plugin-information #section-holder { + padding: 10px; +} + +#plugin-information .section ul, +#plugin-information .section ol { + margin-left: 16px; + list-style-type: square; + list-style-image: none; +} + +#plugin-information #section-screenshots li img { + vertical-align: text-top; +} + +#plugin-information #section-screenshots li p { + font-style: italic; + padding-left: 20px; + padding-bottom: 2em; +} + +#plugin-information .updated, +#plugin-information pre { + margin-right: 215px; +} + +#plugin-information pre { + padding: 7px; +} diff --git a/src/wp-admin/css/press-this-rtl.css b/src/wp-admin/css/press-this-rtl.css new file mode 100644 index 0000000..a19d20c --- /dev/null +++ b/src/wp-admin/css/press-this-rtl.css @@ -0,0 +1 @@ +body{font-family:Tahoma,Arial;}#poststuff #edButtonPreview,#poststuff #edButtonHTML{float:left;}#poststuff #edButtonHTML{margin-left:15px;margin-right:5px;}#header-logo,#wphead h1{float:right;}div#poststuff{padding-left:0;padding-right:10px;}.posting{margin-left:212px;margin-right:0;position:relative;}#side-info-column{float:left;right:auto;left:0;}h3.tb{margin-left:0;margin-right:5px;}#publish{float:left;}.postbox .handlediv{float:left;}.actions{float:left;}.actions li{float:right;margin-right:0;margin-left:10px;}#extra-fields .actions{margin:-23px 0 0 -7px;}#img_container a{float:right;}#category-add input,#category-add select{font-family:Tahoma,Arial;}.inline-editor ul.cat-checklist ul,.categorydiv ul.categorychecklist ul,#linkcategorydiv ul.categorychecklist ul{margin-left:0;margin-right:18px;}.category-tabs li{padding-left:0;padding-right:8px;}#tagsdiv #newtag{margin-right:0;margin-left:5px;}#tagadd{margin-left:0;margin-right:3px;}#tagchecklist span{margin-left:.5em;margin-right:10px;float:right;}#tagchecklist span a{margin:6px -9px 0 0;float:right;}#content{margin-left:0;margin-right:1%;}.submit input,.button,.button-primary,.button-secondary,.button-highlighted,#postcustomstuff .submit input{font-family:Tahoma,Arial,sans-serif;}.ac_results li{text-align:right;}#TB_ajaxContent #options{right:auto;left:25px;}#post_status{margin-left:0;margin-right:10px;}#footer{padding:10px 60px 0 0;} \ No newline at end of file diff --git a/src/wp-admin/css/press-this-rtl.dev.css b/src/wp-admin/css/press-this-rtl.dev.css new file mode 100644 index 0000000..fbb1456 --- /dev/null +++ b/src/wp-admin/css/press-this-rtl.dev.css @@ -0,0 +1,140 @@ +body { + font-family: Tahoma, Arial; +} + +#poststuff #edButtonPreview, +#poststuff #edButtonHTML { + float: left; +} + +#poststuff #edButtonHTML { + margin-left: 15px; + margin-right: 5px; +} + +#header-logo, +#wphead h1 { + float: right; +} + +/* Editor/Main Column */ +div#poststuff { + padding-left: 0; + padding-right: 10px; +} + +.posting { + margin-left: 212px; + margin-right: 0; + position: relative; +} + +#side-info-column { + float: left; + right: auto; + left: 0; +} + +h3.tb { + margin-left: 0; + margin-right: 5px; +} + +#publish { + float: left; +} + +.postbox .handlediv { + float: left; +} + +.actions { + float: left; +} + +.actions li { + float: right; + margin-right: 0; + margin-left: 10px; +} + +#extra-fields .actions { + margin: -23px 0 0 -7px; +} + +/* Photo Styles */ +#img_container a { + float: right; +} + +#category-add input, +#category-add select { + font-family: Tahoma, Arial; +} + +.inline-editor ul.cat-checklist ul, +.categorydiv ul.categorychecklist ul, +#linkcategorydiv ul.categorychecklist ul { + margin-left: 0; + margin-right: 18px; +} + +/* Categories */ +.category-tabs li { + padding-left: 0; + padding-right: 8px; +} + +/* Tags */ +#tagsdiv #newtag { + margin-right: 0; + margin-left: 5px; +} + +#tagadd { + margin-left: 0; + margin-right: 3px; +} + +#tagchecklist span { + margin-left: .5em; + margin-right: 10px; + float: right; +} +#tagchecklist span a { + margin: 6px -9px 0 0; + float: right; +} + +#content { + margin-left: 0; + margin-right: 1%; +} + +.submit input, +.button, +.button-primary, +.button-secondary, +.button-highlighted, +#postcustomstuff .submit input { + font-family: Tahoma, Arial, sans-serif; +} + +.ac_results li { + text-align: right; +} + +#TB_ajaxContent #options { + right: auto; + left: 25px; +} + +#post_status { + margin-left: 0; + margin-right: 10px; +} + +/* Footer */ +#footer { + padding: 10px 60px 0 0; +} diff --git a/src/wp-admin/css/press-this.css b/src/wp-admin/css/press-this.css new file mode 100644 index 0000000..fd1970a --- /dev/null +++ b/src/wp-admin/css/press-this.css @@ -0,0 +1 @@ +body{font-size:13px;font-family:sans-serif;color:#333;margin:0;padding:0;min-width:675px;min-height:400px;}img{border:none;}#wphead{height:32px;margin-right:5px;margin-bottom:5px;}#header-logo{float:left;margin:7px 7px 0;-webkit-user-select:none;-moz-user-select:none;-khtml-user-select:none;user-select:none;}#wphead h1{font:normal 16px Georgia,"Times New Roman","Bitstream Charter",Times,serif;padding:6px 0 0;margin:0;float:left;}#wphead h1 a{text-decoration:none;}#wphead h1 a:hover{text-decoration:underline;}.tagchecklist span a{background:transparent url(../images/xit.gif) no-repeat 0 0;}#edButtonPreview,#edButtonHTML{height:18px;margin:5px 5px 0 0;padding:4px 5px 2px;float:right;cursor:pointer;border-width:1px;border-style:solid;-moz-border-radius:3px 3px 0 0;-webkit-border-top-right-radius:3px;-webkit-border-top-left-radius:3px;-khtml-border-top-right-radius:3px;-khtml-border-top-left-radius:3px;border-top-right-radius:3px;border-top-left-radius:3px;}#poststuff #edButtonHTML{margin-right:15px;}#media-buttons{cursor:default;padding:8px 8px 0;}#media-buttons a{cursor:pointer;padding:0 0 5px 10px;}#media-buttons img,#submitpost #ajax-loading,#submitpost .ajax-loading{vertical-align:middle;}.howto{margin-top:2px;margin-bottom:3px;font-size:12px;font-style:italic;display:block;}input.text{outline-color:-moz-use-text-color;outline-style:none;outline-width:medium;width:100%;}#message{-moz-border-radius:3px;-khtml-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;}div#poststuff{margin:0 10px 10px;}#poststuff #editor-toolbar{height:30px;}div.zerosize{border:0 none;height:0;margin:0;overflow:hidden;padding:0;width:0;}.posting{margin-right:212px;position:relative;}#side-info-column{float:right;width:200px;position:relative;right:0;}#side-info-column .sleeve{padding-top:5px;}#poststuff .inside{font-size:12px;margin:8px;}#submitdiv .inside{margin:0;}#submitdiv .inside p{padding:5px 8px;margin:0;}#submitdiv #publishing-actions{padding-left:6px;border-bottom:1px solid #dfdfdf;-webkit-box-shadow:0 1px 0 #fff;-moz-box-shadow:0 1px 0 #fff;box-shadow:0 1px 0 #fff;}#publish{float:right;}#poststuff h2,#poststuff h3{font-size:13px;font-family:Georgia,"Times New Roman","Bitstream Charter",Times,serif;font-weight:normal;line-height:1;margin:0;padding:7px 9px;border-width:0 0 1px 0;border-style:solid;}#poststuff h2{border-color:#dfdfdf;}#tagsdiv-post_tag h3,#categorydiv h3{cursor:pointer;}h3.tb{text-shadow:0 1px 0 #fff;font-weight:bold;font-size:12px;margin-left:5px;}#TB_window{border:1px solid #333;-moz-border-radius:3px;-khtml-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;}.postbox,.stuffbox{margin-bottom:10px;border-width:1px;border-style:solid;line-height:1;-moz-border-radius:3px;-khtml-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;}.postbox:hover .handlediv,.stuffbox:hover .handlediv{background:transparent url(../images/arrows.png) no-repeat 6px 7px;}.postbox .handlediv{float:right;width:27px;height:30px;cursor:pointer;}#title,.tbtitle{font-family:sans-serif;-moz-border-radius:3px;-khtml-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;border-style:solid;border-width:1px;font-size:1.7em;outline:none;padding:3px 4px;border-color:#dfdfdf;}.tbtitle{font-size:12px;padding:3px;}#title{width:97%;}.editor-container{-moz-border-radius:3px;-khtml-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;border:1px solid #ccc;background-color:#fff;}.actions{float:right;margin:-19px 0 0;}#extra-fields .actions{margin:-23px -7px 0 0;}.actions li{float:left;list-style:none;margin-right:10px;}#extra-fields .button{margin-right:5px;padding:3px 6px;border-radius:10px;-webkit-border-radius:10px;-khtml-border-radius:10px;-moz-border-radius:10px;}#photo_saving{margin:0 8px 8px;vertical-align:middle;}#img_container_container{overflow:auto;}#extra-fields{margin-top:10px;position:relative;}#waiting{margin-top:10px;}#extra-fields .postbox{margin-bottom:5px;}#extra-fields .titlewrap{padding:0;overflow:auto;height:100px;}#img_container a{display:block;float:left;overflow:hidden;vertical-align:center;}#img_container img,#img_container a{width:68px;height:68px;}#img_container img{border:none;background-color:#f4f4f4;cursor:pointer;}#img_container a,#img_container a:link,#img_container a:visited{border:1px solid #ccc;display:block;position:relative;}#img_container a:hover,#img_container a:active{border-color:#000;z-index:1000;border-width:2px;margin:-1px;}#embed-code{width:100%;height:98px;}.wp-hidden-children .wp-hidden-child{display:none;}.category-add input{width:94%;font-family:sans-serif;font-size:12px;margin:1px;}select{width:100%;-x-system-font:none;border-style:solid;border-width:1px;font-family:sans-serif;font-size:12px;height:2em;line-height:20px;padding:2px;margin:1px;vertical-align:top;}.category-add input.category-add-sumbit{width:auto;}.categorydiv div.tabs-panel,#linkcategorydiv div.tabs-panel{height:100px;overflow:auto;padding:.5em .9em;border-style:solid;border-width:1px;}.category-tabs li{display:inline;padding-right:8px;}.category-tabs a{text-decoration:none;}.categorydiv ul,#linkcategorydiv ul{list-style:none;padding:0;margin:0;}.inline-editor ul.cat-checklist ul,.categorydiv ul.categorychecklist ul,#linkcategorydiv ul.categorychecklist ul{margin-left:18px;}ul.categorychecklist li{margin:0;padding:0;line-height:19px;}.categorydiv .tabs-panel{border-width:3px;border-style:solid;}ul.category-tabs{margin-top:12px;margin-bottom:5px;}ul.category-tabs li.tabs{border-style:solid solid none;border-width:1px 1px 0;}ul.category-tabs li{padding:5px 8px;-moz-border-radius:3px 3px 0 0;-webkit-border-top-left-radius:3px;-webkit-border-top-right-radius:3px;-khtml-border-top-left-radius:3px;-khtml-border-top-right-radius:3px;border-top-left-radius:3px;border-top-right-radius:3px;}.screen-reader-text{display:none;}.tagsdiv .newtag{margin-right:5px;}.jaxtag{clear:both;margin:0;}.tagadd{margin-left:3px;}.tagchecklist{margin-top:3px;margin-bottom:1em;font-size:12px;overflow:auto;}.tagchecklist strong{position:absolute;font-size:.75em;}.tagchecklist span{margin-right:.5em;margin-left:10px;display:block;float:left;font-size:12px;line-height:1.8em;white-space:nowrap;cursor:default;}.tagchecklist span a{margin:6px 0 0 -9px;cursor:pointer;width:10px;height:10px;display:block;float:left;text-indent:-9999px;overflow:hidden;position:absolute;}#content{margin:5px 0;padding:0 5px;border:0 none;height:365px;width:97%!important;font-family:Consolas,Monaco,monospace;font-size:13px;line-height:19px;background:transparent;}* html .postdivrich{zoom:1;}#saving{display:inline;vertical-align:middle;}.submit input,.button,.button-primary,.button-secondary,.button-highlighted,#postcustomstuff .submit input{font-family:sans-serif;text-decoration:none;font-size:12px!important;line-height:16px;padding:2px 8px;margin:2px;cursor:pointer;border-width:1px;border-style:solid;-moz-border-radius:11px;-khtml-border-radius:11px;-webkit-border-radius:11px;border-radius:11px;}.button-primary{background:#21759B url(../images/button-grad.png) repeat-x scroll left top;border-color:#21759B;color:#fff;}.ac_results{padding:0;margin:0;list-style:none;position:absolute;z-index:10000;display:none;border-width:1px;border-style:solid;}.ac_results li{padding:2px 5px;white-space:nowrap;text-align:left;}.ac_over{cursor:pointer;}.ac_match{text-decoration:underline;}#TB_ajaxContent #options{position:absolute;top:20px;right:25px;padding:5px;}#TB_ajaxContent h3{margin-bottom:.25em;}.updated{margin:10px 0;padding:0;border-width:1px;border-style:solid;width:99%;}.updated p,.error p{margin:.6em 0;padding:0 .6em;}.error a{text-decoration:underline;}.updated a{text-decoration:none;padding-bottom:2px;}#post_status{margin-left:10px;margin-bottom:1em;display:block;}#footer{height:65px;display:block;width:640px;padding:10px 0 0 60px;margin:0;position:absolute;bottom:0;font-size:12px;}#footer p{margin:0;padding:7px 0;}#footer p a{text-decoration:none;}#footer p a:hover{text-decoration:underline;}.centered{text-align:center;}.hidden{display:none;}.postbox input[type="text"],.postbox textarea,.stuffbox input[type="text"],.stuffbox textarea{border-width:1px;border-style:solid;}.taghint{color:#aaa;margin:-17px 0 0 7px;visibility:hidden;}input.newtag ~ div.taghint{visibility:visible;}input.newtag:focus ~ div.taghint{visibility:hidden;}#mce_fullscreen_container{background:#fff;} \ No newline at end of file diff --git a/src/wp-admin/css/press-this.dev.css b/src/wp-admin/css/press-this.dev.css new file mode 100644 index 0000000..416227c --- /dev/null +++ b/src/wp-admin/css/press-this.dev.css @@ -0,0 +1,678 @@ +body { + font-size: 13px; + font-family: sans-serif; + color: #333; + margin: 0; + padding: 0; + min-width: 675px; + min-height: 400px; +} + +img { + border: none; +} + +/* Header */ +#wphead { + height: 32px; + margin-right: 5px; + margin-bottom: 5px; +} + +#header-logo { + float: left; + margin: 7px 7px 0; + -webkit-user-select: none; + -moz-user-select: none; + -khtml-user-select: none; + user-select: none; +} + +#wphead h1 { + font: normal 16px Georgia, "Times New Roman", "Bitstream Charter", Times, serif; + padding: 6px 0 0; + margin: 0; + float: left; +} + +#wphead h1 a { + text-decoration: none; +} +#wphead h1 a:hover { + text-decoration: underline; +} + +.tagchecklist span a { + background: transparent url(../images/xit.gif) no-repeat 0 0; +} + +#edButtonPreview, +#edButtonHTML { + height: 18px; + margin: 5px 5px 0 0; + padding: 4px 5px 2px; + float: right; + cursor: pointer; + border-width: 1px; + border-style: solid; + -moz-border-radius: 3px 3px 0 0; + -webkit-border-top-right-radius: 3px; + -webkit-border-top-left-radius: 3px; + -khtml-border-top-right-radius: 3px; + -khtml-border-top-left-radius: 3px; + border-top-right-radius: 3px; + border-top-left-radius: 3px; +} + +#poststuff #edButtonHTML { + margin-right: 15px; +} + +#media-buttons { + cursor: default; + padding: 8px 8px 0; +} + +#media-buttons a { + cursor: pointer; + padding: 0 0 5px 10px; +} + +#media-buttons img, +#submitpost #ajax-loading, +#submitpost .ajax-loading { + vertical-align: middle; +} + +.howto { + margin-top: 2px; + margin-bottom: 3px; + font-size: 12px; + font-style: italic; + display: block; +} + +input.text { + outline-color: -moz-use-text-color; + outline-style: none; + outline-width: medium; + width: 100%; +} + +#message { + -moz-border-radius: 3px; + -khtml-border-radius: 3px; + -webkit-border-radius: 3px; + border-radius: 3px; +} + +/* Editor/Main Column */ +div#poststuff { + margin: 0 10px 10px; +} + +#poststuff #editor-toolbar { + height: 30px; +} + +div.zerosize { + border: 0 none; + height: 0; + margin: 0; + overflow: hidden; + padding: 0; + width: 0; +} + +.posting { + margin-right: 212px; + position: relative; +} + +#side-info-column { + float: right; + width: 200px; + position: relative; + right: 0; +} + +#side-info-column .sleeve { + padding-top: 5px; +} + +#poststuff .inside { + font-size: 12px; + margin: 8px; +} + +#submitdiv .inside { + margin: 0; +} + +#submitdiv .inside p { + padding: 5px 8px; + margin: 0; +} + +#submitdiv #publishing-actions { + padding-left: 6px; + border-bottom: 1px solid #dfdfdf; + -webkit-box-shadow: 0 1px 0 #fff; + -moz-box-shadow: 0 1px 0 #fff; + box-shadow: 0 1px 0 #fff; +} + +#publish { + float: right; +} + +#poststuff h2,#poststuff h3 { + font-size: 13px; + font-family: Georgia, "Times New Roman", "Bitstream Charter", Times, serif; + font-weight: normal; + line-height: 1; + margin: 0; + padding: 7px 9px; + border-width: 0 0 1px 0; + border-style: solid; +} + +#poststuff h2 { + border-color: #dfdfdf; +} + +#tagsdiv-post_tag h3, +#categorydiv h3 { + cursor: pointer; +} + +h3.tb { + text-shadow: 0 1px 0 #fff; + font-weight: bold; + font-size: 12px; + margin-left: 5px; +} + +#TB_window { + border: 1px solid #333; + -moz-border-radius: 3px; + -khtml-border-radius: 3px; + -webkit-border-radius: 3px; + border-radius: 3px; +} + +.postbox, +.stuffbox { + margin-bottom: 10px; + border-width: 1px; + border-style: solid; + line-height: 1; + -moz-border-radius: 3px; + -khtml-border-radius: 3px; + -webkit-border-radius: 3px; + border-radius: 3px; +} + +.postbox:hover .handlediv, +.stuffbox:hover .handlediv { + background: transparent url(../images/arrows.png) no-repeat 6px 7px; +} + +.postbox .handlediv { + float: right; + width: 27px; + height: 30px; + cursor: pointer; +} + +#title, +.tbtitle { + font-family: sans-serif; + -moz-border-radius: 3px; + -khtml-border-radius: 3px; + -webkit-border-radius: 3px; + border-radius: 3px; + border-style: solid; + border-width: 1px; + font-size: 1.7em; + outline: none; + padding: 3px 4px; + border-color: #dfdfdf; +} + +.tbtitle { + font-size: 12px; + padding: 3px; +} + +#title { + width: 97%; +} + +.editor-container { + -moz-border-radius: 3px; + -khtml-border-radius: 3px; + -webkit-border-radius: 3px; + border-radius: 3px; + border: 1px solid #ccc; + background-color: #fff; +} + +.actions { + float: right; + margin: -19px 0 0; +} + +#extra-fields .actions { + margin: -23px -7px 0 0; +} + +.actions li { + float: left; + list-style: none; + margin-right: 10px; +} + +#extra-fields .button { + margin-right: 5px; + padding: 3px 6px; + border-radius: 10px; + -webkit-border-radius: 10px; + -khtml-border-radius: 10px; + -moz-border-radius: 10px; +} + +/* Photo Styles */ +#photo_saving { + margin: 0 8px 8px; + vertical-align: middle; +} + +#img_container_container { + overflow: auto; +} + +#extra-fields { + margin-top: 10px; + position: relative; +} + +#waiting { + margin-top: 10px; +} + +#extra-fields .postbox { + margin-bottom: 5px; +} + +#extra-fields .titlewrap { + padding: 0; + overflow: auto; + height: 100px; +} + +#img_container a { + display: block; + float: left; + overflow: hidden; + vertical-align: center; +} + +#img_container img, +#img_container a { + width: 68px; + height: 68px; +} + +#img_container img { + border: none; + background-color: #f4f4f4; + cursor: pointer; +} + +#img_container a, +#img_container a:link, +#img_container a:visited { + border: 1px solid #ccc; + display: block; + position: relative; +} + +#img_container a:hover, +#img_container a:active { + border-color: #000; + z-index: 1000; + border-width: 2px; + margin: -1px; +} + +/* Video */ +#embed-code { + width: 100%; + height: 98px; +} + +/* Submit Column */ +.wp-hidden-children +.wp-hidden-child { + display: none; +} + +/* Categories */ + +.category-add input { + width: 94%; + font-family: sans-serif; + font-size: 12px; + margin: 1px; +} + +select { + width: 100%; + -x-system-font: none; + border-style: solid; + border-width: 1px; + font-family: sans-serif; + font-size: 12px; + height: 2em; + line-height: 20px; + padding: 2px; + margin: 1px; + vertical-align: top; +} + +.category-add input.category-add-sumbit { + width: auto; +} + +.categorydiv div.tabs-panel, +#linkcategorydiv div.tabs-panel { + height: 100px; + overflow: auto; + padding: 0.5em 0.9em; + border-style: solid; + border-width: 1px; +} + +.category-tabs li { + display: inline; + padding-right: 8px; +} + +.category-tabs a { + text-decoration: none; +} + +.categorydiv ul, +#linkcategorydiv ul { + list-style: none; + padding: 0; + margin: 0; +} + +.inline-editor ul.cat-checklist ul, +.categorydiv ul.categorychecklist ul, +#linkcategorydiv ul.categorychecklist ul { + margin-left: 18px; +} + +ul.categorychecklist li { + margin: 0; + padding: 0; + line-height: 19px; +} + +.categorydiv .tabs-panel { + border-width: 3px; + border-style: solid; +} + +ul.category-tabs { + margin-top: 12px; + margin-bottom: 5px; +} + +ul.category-tabs li.tabs { + border-style: solid solid none; + border-width: 1px 1px 0; +} + +ul.category-tabs li { + padding: 5px 8px; + -moz-border-radius: 3px 3px 0 0; + -webkit-border-top-left-radius: 3px; + -webkit-border-top-right-radius: 3px; + -khtml-border-top-left-radius: 3px; + -khtml-border-top-right-radius: 3px; + border-top-left-radius: 3px; + border-top-right-radius: 3px; +} + +/* Tags */ +.screen-reader-text { + display: none; +} + +.tagsdiv .newtag { + margin-right: 5px; +} + +.jaxtag { + clear: both; + margin: 0; +} + +.tagadd { + margin-left: 3px; +} + +.tagchecklist { + margin-top: 3px; + margin-bottom: 1em; + font-size: 12px; + overflow: auto; +} + +.tagchecklist strong { + position: absolute; + font-size: .75em; +} + +.tagchecklist span { + margin-right: .5em; + margin-left: 10px; + display: block; + float: left; + font-size: 12px; + line-height: 1.8em; + white-space: nowrap; + cursor: default; +} + +.tagchecklist span a { + margin: 6px 0 0 -9px; + cursor: pointer; + width: 10px; + height: 10px; + display: block; + float: left; + text-indent: -9999px; + overflow: hidden; + position: absolute; +} + +#content { + margin: 5px 0; + padding: 0 5px; + border: 0 none; + height: 365px; + width: 97% !important; + font-family: Consolas, Monaco, monospace; + font-size: 13px; + line-height: 19px; + background: transparent; +} + +* html .postdivrich { + zoom: 1; +} + +/* Submit */ +#saving { + display: inline; + vertical-align: middle; +} + +.submit input, +.button, +.button-primary, +.button-secondary, +.button-highlighted, +#postcustomstuff .submit input { + font-family: sans-serif; + text-decoration: none; + font-size: 12px !important; + line-height: 16px; + padding: 2px 8px; + margin: 2px; + cursor: pointer; + border-width: 1px; + border-style: solid; + -moz-border-radius: 11px; + -khtml-border-radius: 11px; + -webkit-border-radius: 11px; + border-radius: 11px; +} + +.button-primary { + background: #21759B url(../images/button-grad.png) repeat-x scroll left top; + border-color: #21759B; + color: #fff; +} + +.ac_results { + padding: 0; + margin: 0; + list-style: none; + position: absolute; + z-index: 10000; + display: none; + border-width: 1px; + border-style: solid; +} + +.ac_results li { + padding: 2px 5px; + white-space: nowrap; + text-align: left; +} + +.ac_over { + cursor: pointer; +} + +.ac_match { + text-decoration: underline; +} + +#TB_ajaxContent #options { + position: absolute; + top: 20px; + right: 25px; + padding: 5px; +} + +#TB_ajaxContent h3 { + margin-bottom: .25em; +} + +.updated { + margin: 10px 0; + padding: 0; + border-width: 1px; + border-style: solid; + width: 99%; +} + +.updated p, +.error p { + margin: 0.6em 0; + padding: 0 0.6em; +} + +.error a { + text-decoration: underline; +} + +.updated a { + text-decoration: none; + padding-bottom: 2px; +} + +#post_status { + margin-left: 10px; + margin-bottom: 1em; + display: block; +} + +/* Footer */ +#footer { + height: 65px; + display: block; + width: 640px; + padding: 10px 0 0 60px; + margin: 0; + position: absolute; + bottom: 0; + font-size: 12px; +} + +#footer p { + margin: 0; + padding: 7px 0; +} + +#footer p a { + text-decoration: none; +} + +#footer p a:hover { + text-decoration: underline; +} + +/* Utility Classes */ +.centered { + text-align: center; +} + +.hidden { + display: none; +} + +.postbox input[type="text"], +.postbox textarea, +.stuffbox input[type="text"], +.stuffbox textarea { + border-width: 1px; + border-style: solid; +} + +/* tag hints */ +.taghint { + color: #aaa; + margin: -17px 0 0 7px; + visibility: hidden; +} + +input.newtag ~ div.taghint { + visibility: visible; +} + +input.newtag:focus ~ div.taghint { + visibility: hidden; +} + +/* TinyMCE */ +#mce_fullscreen_container { + background: #fff; +} diff --git a/src/wp-admin/css/theme-editor-rtl.css b/src/wp-admin/css/theme-editor-rtl.css new file mode 100644 index 0000000..23023df --- /dev/null +++ b/src/wp-admin/css/theme-editor-rtl.css @@ -0,0 +1 @@ +#templateside{float: left;} diff --git a/src/wp-admin/css/theme-editor-rtl.dev.css b/src/wp-admin/css/theme-editor-rtl.dev.css new file mode 100644 index 0000000..a4dcb46 --- /dev/null +++ b/src/wp-admin/css/theme-editor-rtl.dev.css @@ -0,0 +1,3 @@ +#templateside { + float: left; +} diff --git a/src/wp-admin/css/theme-editor.css b/src/wp-admin/css/theme-editor.css new file mode 100644 index 0000000..fe03629 --- /dev/null +++ b/src/wp-admin/css/theme-editor.css @@ -0,0 +1 @@ +.alignleft h3{margin:0;}h3 span{font-weight:normal;}#template textarea{font-family:Consolas,Monaco,monospace;font-size:12px;width:97%;background:#f9f9f9;outline:none;}#template p{width:97%;}#templateside{float:right;width:190px;word-wrap:break-word;}#templateside h3,#postcustomstuff p.submit{margin:0;}#templateside h4{margin:1em 0 0;}#templateside ol,#templateside ul{margin:.5em;padding:0;}#templateside li{margin:4px 0;}#templateside ul li a span.highlight{display:block;}.nonessential{font-size:11px;font-style:italic;padding-left:12px;}.highlight{padding:3px 3px 3px 12px;margin-left:-12px;font-weight:bold;-moz-border-radius:3px;-khtml-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;}div.tablenav{margin-right:210px;}#documentation{margin-top:10px;}#documentation label{line-height:22px;vertical-align:top;font-weight:bold;}.fileedit-sub{padding:10px 0 8px;line-height:180%;} \ No newline at end of file diff --git a/src/wp-admin/css/theme-editor.dev.css b/src/wp-admin/css/theme-editor.dev.css new file mode 100644 index 0000000..b06837b --- /dev/null +++ b/src/wp-admin/css/theme-editor.dev.css @@ -0,0 +1,82 @@ +.alignleft h3 { + margin: 0; +} + +h3 span { + font-weight: normal; +} + +#template textarea { + font-family: Consolas, Monaco, monospace; + font-size: 12px; + width: 97%; + background: #f9f9f9; + outline: none; +} + +#template p { + width: 97%; +} + +#templateside { + float: right; + width: 190px; + word-wrap: break-word; +} + +#templateside h3, +#postcustomstuff p.submit { + margin: 0; +} + +#templateside h4 { + margin: 1em 0 0; +} + +#templateside ol, +#templateside ul { + margin: .5em; + padding: 0; +} + +#templateside li { + margin: 4px 0; +} + +#templateside ul li a span.highlight { + display:block; +} + +.nonessential { + font-size: 11px; + font-style: italic; + padding-left: 12px; +} + +.highlight { + padding: 3px 3px 3px 12px; + margin-left: -12px; + font-weight: bold; + -moz-border-radius: 3px; + -khtml-border-radius: 3px; + -webkit-border-radius: 3px; + border-radius: 3px; +} + +div.tablenav { + margin-right: 210px; +} + +#documentation { + margin-top: 10px; +} +#documentation label { + line-height: 22px; + vertical-align: top; + font-weight: bold; +} + +.fileedit-sub { + padding: 10px 0 8px; + line-height: 180%; +} diff --git a/src/wp-admin/css/theme-install-rtl.css b/src/wp-admin/css/theme-install-rtl.css new file mode 100644 index 0000000..3dd959c --- /dev/null +++ b/src/wp-admin/css/theme-install-rtl.css @@ -0,0 +1 @@ +div.star{left:auto;right:0;}.star img,div.star a,div.star a:hover,div.star a:visited{right:auto;left:0;}.theme-listing .theme-item h3{font-style:normal;}#theme-information .theme-preview-img{float:right;margin:5px 15px 10px 25px;}#theme-information .action-button #cancel{float:right;}#theme-information .action-button #install{float:left;}.feature-filter .feature-group{float:right;}.feature-filter .feature-name{float:right;text-align:left;}.feature-filter .feature-group li{float:right;padding-right:0;padding-left:25px;} \ No newline at end of file diff --git a/src/wp-admin/css/theme-install-rtl.dev.css b/src/wp-admin/css/theme-install-rtl.dev.css new file mode 100644 index 0000000..1194688 --- /dev/null +++ b/src/wp-admin/css/theme-install-rtl.dev.css @@ -0,0 +1,41 @@ +div.star { + left:auto; + right: 0; +} + +.star img, div.star a, div.star a:hover, div.star a:visited { + right: auto; + left: 0; +} + +.theme-listing .theme-item h3 { + font-style: normal; +} + +#theme-information .theme-preview-img { + float: right; + margin: 5px 15px 10px 25px; +} + +#theme-information .action-button #cancel { + float: right; +} + +#theme-information .action-button #install { + float: left; +} + +.feature-filter .feature-group { + float: right; +} + +.feature-filter .feature-name { + float: right; + text-align: left; +} + +.feature-filter .feature-group li { + float: right; + padding-right: 0; + padding-left: 25px; +} \ No newline at end of file diff --git a/src/wp-admin/css/theme-install.css b/src/wp-admin/css/theme-install.css new file mode 100644 index 0000000..e96844e --- /dev/null +++ b/src/wp-admin/css/theme-install.css @@ -0,0 +1 @@ +div.star-holder{position:relative;height:19px;width:100px;font-size:19px;}div.star{height:100%;position:absolute;top:0;left:0;background-color:transparent;letter-spacing:1ex;border:none;}.star1{width:20%;}.star2{width:40%;}.star3{width:60%;}.star4{width:80%;}.star5{width:100%;}.star img,div.star a,div.star a:hover,div.star a:visited{display:block;position:absolute;right:0;border:none;text-decoration:none;}div.star img{width:19px;height:19px;border-left:1px solid #fff;border-right:1px solid #fff;}.theme-listing .theme-item{display:inline-block;width:200px;border:thin solid #ccc;vertical-align:top;}.theme-listing .theme-item h3{text-align:center;font-size:14px;font-style:italic;margin:0;padding:0;}.theme-listing .theme-item img{max-width:150px;max-height:150px;}.theme-listing .theme-item-info span{display:none;}.theme-listing .theme-item:hover .theme-item-info span{display:inline;}.theme-listing .theme-item:hover .theme-item-info span.dots{display:none;}.theme-listing .theme-item-info span.action-links{font-weight:bold;text-align:center;}.theme-listing br.line{border-bottom-width:1px;border-bottom-style:solid;margin-bottom:3px;}.available-theme{padding:20px 15px;}#theme-information .theme-preview-img{float:left;margin:5px 25px 10px 15px;width:300px;}#theme-information .action-button{border-top-width:1px;border-top-style:solid;margin:10px 5px 0;}#theme-information .action-button #cancel{float:left;margin:10px 15px;}#theme-information .action-button #install{float:right;margin:10px 15px;}#theme-information .available-theme h3{margin:1em 0;}body#theme-information{height:auto;}.feature-filter{-moz-border-radius:3px;-khtml-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;border-width:1px;border-style:solid;padding:8px 12px 0;}.feature-filter .feature-group{float:left;margin-bottom:20px;width:725px;}.feature-filter .feature-name{float:left;text-align:right;width:95px;}.feature-filter .feature-group li{display:inline;float:left;list-style-type:none;padding-right:25px;min-width:145px;}.feature-container{width:100%;overflow:auto;margin-bottom:10px;}.feature-group{margin-bottom:0!important;} \ No newline at end of file diff --git a/src/wp-admin/css/theme-install.dev.css b/src/wp-admin/css/theme-install.dev.css new file mode 100644 index 0000000..70dee71 --- /dev/null +++ b/src/wp-admin/css/theme-install.dev.css @@ -0,0 +1,155 @@ +/* NOTE: the following CSS rules(.star*) are taken more or less straight from the bbPress rating plugin. */ +div.star-holder { + position: relative; + height: 19px; + width: 100px; + font-size: 19px; +} + +div.star { + height: 100%; + position: absolute; + top: 0; + left: 0; + background-color: transparent; + letter-spacing: 1ex; + border: none; +} + +.star1 { width: 20%; } +.star2 { width: 40%; } +.star3 { width: 60%; } +.star4 { width: 80%; } +.star5 { width: 100%; } + +.star img, div.star a, div.star a:hover, div.star a:visited { + display: block; + position: absolute; + right: 0; + border: none; + text-decoration: none; +} + +div.star img { + width: 19px; + height: 19px; + border-left: 1px solid #fff; + border-right: 1px solid #fff; +} + +.theme-listing .theme-item { + display: inline-block; + width: 200px; + border: thin solid #ccc; + vertical-align: top; +} + +.theme-listing .theme-item h3 { + text-align: center; + font-size: 14px; + font-style: italic; + margin: 0; + padding: 0; +} + +.theme-listing .theme-item img { + max-width: 150px; + max-height: 150px; +} + +.theme-listing .theme-item-info span { + display: none; +} + +.theme-listing .theme-item:hover .theme-item-info span { + display: inline; +} + +.theme-listing .theme-item:hover .theme-item-info span.dots { + display: none; +} + +.theme-listing .theme-item-info span.action-links { + font-weight: bold; + text-align: center; +} + +.theme-listing br.line { + border-bottom-width: 1px; + border-bottom-style: solid; + margin-bottom: 3px; +} + +.available-theme { + padding: 20px 15px; +} + +#theme-information .theme-preview-img { + float: left; + margin: 5px 25px 10px 15px; + width: 300px; +} + +#theme-information .action-button { + border-top-width: 1px; + border-top-style: solid; + margin: 10px 5px 0; +} + +#theme-information .action-button #cancel { + float: left; + margin: 10px 15px; +} + +#theme-information .action-button #install { + float: right; + margin: 10px 15px; +} + +#theme-information .available-theme h3 { + margin: 1em 0; +} + +body#theme-information { + height: auto; +} + +.feature-filter { + -moz-border-radius: 3px; + -khtml-border-radius: 3px; + -webkit-border-radius: 3px; + border-radius: 3px; + border-width: 1px; + border-style: solid; + padding: 8px 12px 0; +} + +.feature-filter .feature-group { + float: left; + margin-bottom: 20px; + width: 725px; +} + +.feature-filter .feature-name { + float: left; + text-align: right; + width: 95px; +} + +.feature-filter .feature-group li { + display: inline; + float: left; + list-style-type: none; + padding-right: 25px; + min-width: 145px; +} + +.feature-container { +width: 100%; +overflow: auto; +margin-bottom: 10px; +} + +.feature-group { + margin-bottom: 0px !important; +} \ No newline at end of file diff --git a/src/wp-admin/css/widgets-rtl.css b/src/wp-admin/css/widgets-rtl.css new file mode 100644 index 0000000..1f8b2a5 --- /dev/null +++ b/src/wp-admin/css/widgets-rtl.css @@ -0,0 +1 @@ +div.widget-liquid-left{float:right;clear:right;margin-right:0;margin-left:-325px;}div#widgets-left{margin-right:5px;margin-left:325px;}div.widget-liquid-right{float:left;clear:left;}#wp_inactive_widgets .widget{float:right;}div.sidebar-name h3{font-family:Tahoma,Arial,sans-serif;}#widget-list .widget{float:right;}#wp_inactive_widgets .widget-placeholder{float:right;}.widget-top .widget-title-action{float:left;}.widget-control-edit{padding:0 0 0 8px;}.sidebar-name-arrow{float:left;} \ No newline at end of file diff --git a/src/wp-admin/css/widgets-rtl.dev.css b/src/wp-admin/css/widgets-rtl.dev.css new file mode 100644 index 0000000..672f669 --- /dev/null +++ b/src/wp-admin/css/widgets-rtl.dev.css @@ -0,0 +1,47 @@ +/* 2 column liquid layout */ +div.widget-liquid-left { + float: right; + clear: right; + margin-right: 0; + margin-left: -325px; +} + +div#widgets-left { + margin-right: 5px; + margin-left: 325px; +} + +div.widget-liquid-right { + float: left; + clear: left; +} + +#wp_inactive_widgets .widget { + float: right; +} + +div.sidebar-name h3 { + font-family: Tahoma, Arial, sans-serif; +} + +#widget-list .widget { + float: right; +} + +#wp_inactive_widgets .widget-placeholder { + float: right; +} + +.widget-top .widget-title-action { + float: left; +} + +.widget-control-edit { + padding: 0 0 0 8px; +} + + +.sidebar-name-arrow { + float: left; +} + diff --git a/src/wp-admin/css/widgets.css b/src/wp-admin/css/widgets.css new file mode 100644 index 0000000..729bcaf --- /dev/null +++ b/src/wp-admin/css/widgets.css @@ -0,0 +1 @@ +html,body{min-width:950px;}div.widget-liquid-left{float:left;clear:left;width:100%;margin-right:-325px;}div#widgets-left{margin-left:5px;margin-right:325px;}div#widgets-right{width:285px;margin:0 auto;}div.widget-liquid-right{float:right;clear:right;width:300px;}.widget-liquid-right .widget,#wp_inactive_widgets .widget,.widget-liquid-right .sidebar-description{width:250px;margin:0 auto 20px;overflow:hidden;}.widget-liquid-right .sidebar-description{margin-bottom:10px;}#wp_inactive_widgets .widget{margin:0 10px 20px;float:left;}div.sidebar-name h3{font-family:Georgia,"Times New Roman","Bitstream Charter",Times,serif;font-weight:normal;font-size:15px;margin:0;padding:8px 10px;overflow:hidden;white-space:nowrap;}div.sidebar-name{cursor:pointer;font-size:13px;border-width:1px;border-style:solid;-moz-border-radius-topleft:3px;-moz-border-radius-topright:3px;-webkit-border-top-right-radius:3px;-webkit-border-top-left-radius:3px;-khtml-border-top-right-radius:3px;-khtml-border-top-left-radius:3px;border-top-right-radius:3px;border-top-left-radius:3px;}.js .closed .sidebar-name{-moz-border-radius-bottomleft:3px;-moz-border-radius-bottomright:3px;-webkit-border-bottom-right-radius:3px;-webkit-border-bottom-left-radius:3px;-khtml-border-bottom-right-radius:3px;-khtml-border-bottom-left-radius:3px;border-bottom-right-radius:3px;border-bottom-left-radius:3px;}.widget-liquid-right .widgets-sortables,#widgets-left .widget-holder{border-width:0 1px 1px;border-style:none solid solid;-moz-border-radius-bottomleft:3px;-moz-border-radius-bottomright:3px;-webkit-border-bottom-right-radius:3px;-webkit-border-bottom-left-radius:3px;-khtml-border-bottom-right-radius:3px;-khtml-border-bottom-left-radius:3px;border-bottom-right-radius:3px;border-bottom-left-radius:3px;}.js .closed .widgets-sortables,.js .closed .widget-holder{display:none;}.widget-liquid-right .widgets-sortables{padding:15px 0 0;}#available-widgets .widget-holder{padding:7px 5px 0;}#available-widgets .widget{-moz-box-shadow:none;-webkit-box-shadow:none;box-shadow:none;}#wp_inactive_widgets{padding:5px 5px 0;}#widget-list .widget{width:250px;margin:0 10px 15px;border:0 none;background:transparent;float:left;}#widget-list .widget-description{padding:5px 8px;}#widget-list .widget-top{border-width:1px;border-style:solid;-moz-border-radius:3px;-khtml-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;}.widget-placeholder{border-width:1px;border-style:dashed;margin:0 auto 20px;height:26px;width:250px;}#wp_inactive_widgets .widget-placeholder{margin:0 10px 20px;float:left;}div.widgets-holder-wrap{padding:0;margin:10px 0 20px;}#widgets-left #available-widgets{background-color:transparent;border:0 none;}ul#widget-list{list-style:none;margin:0;padding:0;min-height:100px;}.widget .widget-top{margin-bottom:-1px;font-size:12px;font-weight:bold;height:26px;overflow:hidden;}.widget-top .widget-title{padding:7px 9px;}.widget-top .widget-title-action{float:right;}a.widget-action{display:block;width:24px;height:26px;}#available-widgets a.widget-action{display:none;}.widget-top a.widget-action{background:transparent url(../images/arrows.png) no-repeat 4px 6px;}.widget-top a.widget-action:hover{background:transparent url(../images/arrows-dark.png) no-repeat 4px 6px;}.widget .widget-inside,.widget .widget-description{padding:12px 12px 10px;font-size:12px;line-height:16px;}.widget-inside,.widget-description{display:none;}#available-widgets .widget-description{display:block;}.widget .widget-inside p{margin:0 0 1em;padding:0;}.widget-title h4{margin:0;line-height:1;overflow:hidden;white-space:nowrap;}.widgets-sortables{min-height:90px;}.widget-control-actions{margin-top:8px;}.widget-control-actions a{text-decoration:none;}.widget-control-actions a:hover{text-decoration:underline;}.widget-control-actions .ajax-feedback{padding-bottom:3px;}.widget-control-actions div.alignleft{margin-top:6px;}div#sidebar-info{padding:0 1em;margin-bottom:1em;font-size:12px;}.widget-title a,.widget-title a:hover{text-decoration:none;border-bottom:none;}.widget-control-edit{display:block;font-size:12px;font-weight:normal;line-height:26px;padding:0 8px 0 0;}a.widget-control-edit{text-decoration:none;}.widget-control-edit .add,.widget-control-edit .edit{display:none;}#available-widgets .widget-control-edit .add,#widgets-right .widget-control-edit .edit,#wp_inactive_widgets .widget-control-edit .edit{display:inline;}.editwidget{margin:0 auto 15px;}.editwidget .widget-inside{display:block;border-width:1px;border-style:solid;padding:10px;-moz-border-radius:3px;-khtml-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;}.inactive p.description{margin:5px 15px 8px;}#available-widgets p.description{margin:0 12px 12px;}.widget-position{margin-top:8px;}.inactive{padding-top:2px;}.sidebar-name-arrow{float:right;height:29px;width:26px;}.widget-title .in-widget-title{font-size:12px;white-space:nowrap;}#removing-widget{display:none;font-weight:normal;padding-left:15px;font-size:12px;line-height:1;}.widget-control-noform,#access-off,.widgets_access .widget-action,.widgets_access .sidebar-name-arrow,.widgets_access #access-on,.widgets_access .widget-holder .description{display:none;}.widgets_access .widget-holder,.widgets_access #widget-list{padding-top:10px;}.widgets_access #access-off{display:inline;}.widgets_access #wpbody-content .widget-title-action,.widgets_access #wpbody-content .widget-control-edit,.widgets_access .closed .widgets-sortables,.widgets_access .closed .widget-holder{display:block;}.widgets_access .closed .sidebar-name{-moz-border-radius-bottomleft:0;-moz-border-radius-bottomright:0;-webkit-border-bottom-right-radius:0;-webkit-border-bottom-left-radius:0;-khtml-border-bottom-right-radius:0;-khtml-border-bottom-left-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:0;}.widgets_access .sidebar-name,.widgets_access .widget .widget-top{cursor:default;} \ No newline at end of file diff --git a/src/wp-admin/css/widgets.dev.css b/src/wp-admin/css/widgets.dev.css new file mode 100644 index 0000000..8b4736f --- /dev/null +++ b/src/wp-admin/css/widgets.dev.css @@ -0,0 +1,382 @@ +html, +body { + min-width: 950px; +} + +/* 2 column liquid layout */ +div.widget-liquid-left { + float: left; + clear: left; + width: 100%; + margin-right: -325px; +} + +div#widgets-left { + margin-left: 5px; + margin-right: 325px; +} + +div#widgets-right { + width: 285px; + margin: 0 auto; +} + +div.widget-liquid-right { + float: right; + clear: right; + width: 300px; +} + +.widget-liquid-right .widget, +#wp_inactive_widgets .widget, +.widget-liquid-right .sidebar-description { + width: 250px; + margin: 0 auto 20px; + overflow: hidden; +} + +.widget-liquid-right .sidebar-description { + margin-bottom: 10px; +} + +#wp_inactive_widgets .widget { + margin: 0 10px 20px; + float: left; +} + +div.sidebar-name h3 { + font-family: Georgia, "Times New Roman", "Bitstream Charter", Times, serif; + font-weight: normal; + font-size: 15px; + margin: 0; + padding: 8px 10px; + overflow: hidden; + white-space: nowrap; +} + +div.sidebar-name { + cursor: pointer; + font-size: 13px; + border-width: 1px; + border-style: solid; + -moz-border-radius-topleft: 3px; + -moz-border-radius-topright: 3px; + -webkit-border-top-right-radius: 3px; + -webkit-border-top-left-radius: 3px; + -khtml-border-top-right-radius: 3px; + -khtml-border-top-left-radius: 3px; + border-top-right-radius: 3px; + border-top-left-radius: 3px; +} + +.js .closed .sidebar-name { + -moz-border-radius-bottomleft: 3px; + -moz-border-radius-bottomright: 3px; + -webkit-border-bottom-right-radius: 3px; + -webkit-border-bottom-left-radius: 3px; + -khtml-border-bottom-right-radius: 3px; + -khtml-border-bottom-left-radius: 3px; + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; +} + +.widget-liquid-right .widgets-sortables, +#widgets-left .widget-holder { + border-width: 0 1px 1px; + border-style: none solid solid; + -moz-border-radius-bottomleft: 3px; + -moz-border-radius-bottomright: 3px; + -webkit-border-bottom-right-radius: 3px; + -webkit-border-bottom-left-radius: 3px; + -khtml-border-bottom-right-radius: 3px; + -khtml-border-bottom-left-radius: 3px; + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; +} + +.js .closed .widgets-sortables, +.js .closed .widget-holder { + display: none; +} + +.widget-liquid-right .widgets-sortables { + padding: 15px 0 0; +} + +#available-widgets .widget-holder { + padding: 7px 5px 0; +} + +#available-widgets .widget { + -moz-box-shadow: none; + -webkit-box-shadow: none; + box-shadow: none; +} + +#wp_inactive_widgets { + padding: 5px 5px 0; +} + +#widget-list .widget { + width: 250px; + margin: 0 10px 15px; + border: 0 none; + background: transparent; + float: left; +} + +#widget-list .widget-description { + padding: 5px 8px; +} + +#widget-list .widget-top { + border-width: 1px; + border-style: solid; + -moz-border-radius: 3px; + -khtml-border-radius: 3px; + -webkit-border-radius: 3px; + border-radius: 3px; +} + +.widget-placeholder { + border-width: 1px; + border-style: dashed; + margin: 0 auto 20px; + height: 26px; + width: 250px; +} + +#wp_inactive_widgets .widget-placeholder { + margin: 0 10px 20px; + float: left; +} + +div.widgets-holder-wrap { + padding: 0; + margin: 10px 0 20px; +} + +#widgets-left #available-widgets { + background-color: transparent; + border: 0 none; +} + +ul#widget-list { + list-style: none; + margin: 0; + padding: 0; + min-height: 100px; +} + +.widget .widget-top { + margin-bottom: -1px; + font-size: 12px; + font-weight: bold; + height: 26px; + overflow: hidden; +} + +.widget-top .widget-title { + padding: 7px 9px; +} + +.widget-top .widget-title-action { + float: right; +} + +a.widget-action { + display: block; + width: 24px; + height: 26px; +} + +#available-widgets a.widget-action { + display: none; +} + +.widget-top a.widget-action { + background: transparent url(../images/arrows.png) no-repeat 4px 6px; +} + +.widget-top a.widget-action:hover { + background: transparent url(../images/arrows-dark.png) no-repeat 4px 6px; +} + +.widget .widget-inside, +.widget .widget-description { + padding: 12px 12px 10px; + font-size: 12px; + line-height: 16px; +} + +.widget-inside, +.widget-description { + display: none; +} + +#available-widgets .widget-description { + display: block; +} + +.widget .widget-inside p { + margin: 0 0 1em; + padding: 0; +} + +.widget-title h4 { + margin: 0; + line-height: 1; + overflow: hidden; + white-space: nowrap; +} + +.widgets-sortables { + min-height: 90px; +} + +.widget-control-actions { + margin-top: 8px; +} + +.widget-control-actions a { + text-decoration: none; +} + +.widget-control-actions a:hover { + text-decoration: underline; +} + +.widget-control-actions .ajax-feedback { + padding-bottom: 3px; +} + +.widget-control-actions div.alignleft { + margin-top: 6px; +} + +div#sidebar-info { + padding: 0 1em; + margin-bottom: 1em; + font-size: 12px; +} + +.widget-title a, +.widget-title a:hover { + text-decoration: none; + border-bottom: none; +} + +.widget-control-edit { + display: block; + font-size: 12px; + font-weight: normal; + line-height: 26px; + padding: 0 8px 0 0; +} + +a.widget-control-edit { + text-decoration: none; +} + +.widget-control-edit .add, +.widget-control-edit .edit { + display: none; +} + +#available-widgets .widget-control-edit .add, +#widgets-right .widget-control-edit .edit, +#wp_inactive_widgets .widget-control-edit .edit { + display: inline; +} + +.editwidget { + margin: 0 auto 15px; +} + +.editwidget .widget-inside { + display: block; + border-width: 1px; + border-style: solid; + padding: 10px; + -moz-border-radius: 3px; + -khtml-border-radius: 3px; + -webkit-border-radius: 3px; + border-radius: 3px; +} + +.inactive p.description { + margin: 5px 15px 8px; +} + +#available-widgets p.description { + margin: 0 12px 12px; +} + +.widget-position { + margin-top: 8px; +} + +.inactive { + padding-top: 2px; +} + +.sidebar-name-arrow { + float: right; + height: 29px; + width: 26px; +} + +.widget-title .in-widget-title { + font-size: 12px; + white-space: nowrap; +} + +#removing-widget { + display: none; + font-weight: normal; + padding-left: 15px; + font-size: 12px; + line-height: 1; +} + +.widget-control-noform, +#access-off, +.widgets_access .widget-action, +.widgets_access .sidebar-name-arrow, +.widgets_access #access-on, +.widgets_access .widget-holder .description { + display: none; +} + +.widgets_access .widget-holder, +.widgets_access #widget-list { + padding-top: 10px; +} + +.widgets_access #access-off { + display: inline; +} + +.widgets_access #wpbody-content .widget-title-action, +.widgets_access #wpbody-content .widget-control-edit, +.widgets_access .closed .widgets-sortables, +.widgets_access .closed .widget-holder { + display: block; +} + +.widgets_access .closed .sidebar-name { + -moz-border-radius-bottomleft: 0; + -moz-border-radius-bottomright: 0; + -webkit-border-bottom-right-radius: 0; + -webkit-border-bottom-left-radius: 0; + -khtml-border-bottom-right-radius: 0; + -khtml-border-bottom-left-radius: 0; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} + +.widgets_access .sidebar-name, +.widgets_access .widget .widget-top { + cursor: default; +} + diff --git a/src/wp-admin/css/wp-admin-rtl.css b/src/wp-admin/css/wp-admin-rtl.css new file mode 100644 index 0000000..f9ea458 --- /dev/null +++ b/src/wp-admin/css/wp-admin-rtl.css @@ -0,0 +1 @@ +ol{margin-left:0;margin-right:2em;}.code,code{font-family:Tahoma,Arial,sans-serif;}.quicktags,.search{font:12px Tahoma,Arial,sans-serif;}.icon32{float:right;margin:7px 0 0 8px;}.howto{font-style:normal;font-family:Tahoma,Arial,sans-serif;}p.install-help{font-style:normal;}#doaction,#doaction2,#post-query-submit{margin-right:0;margin-left:8px;}#timezone_string option{margin-left:0;margin-right:1em;}#pass-strength-result{float:right;margin:13px 1px 5px 5px;}p.search-box{float:left;}#delete-action{text-align:right;float:right;}#publishing-action{text-align:left;float:left;}#post-body .misc-pub-section{border-right:0;border-left-width:1px;border-left-style:solid;float:right;}#post-body .misc-pub-section-last{border-left:0;}#minor-publishing-actions{padding:10px 8px 2px 10px;text-align:left;}#save-post{float:right;}#minor-publishing .ajax-loading{padding:3px 4px 0 0;float:right;}.preview{float:left;}#sticky-span{margin-left:0;margin-right:18px;}.side-info ul{padding-left:0;padding-right:18px;}td.action-links,th.action-links{text-align:left;}.describe .del-link{padding-left:0;padding-right:5px;}.plugin-update .update-message{margin:0 31px 8px 10px;}form.upgrade .hint{font-style:normal;}#ajax-response.alignleft{margin-left:0;margin-right:2em;}#quicktags{background-position:right top;}#ed_reply_toolbar input{margin:1px 1px 1px 2px;}#wp-fullscreen-body{right:0;left:auto;}#wp-fullscreen-tagline{float:left;}#fullscreen-topbar{left:auto;right:0;}#wp-fullscreen-mode-bar,#wp-fullscreen-button-bar,#wp-fullscreen-close,#wp-fullscreen-count{float:right;}#wp-fullscreen-save{float:left;}#wp-fullscreen-save{padding:2px 5px 0 2px;}#wp-fullscreen-buttons>div{float:right;}#wp-fullscreen-mode-bar{padding:1px 0 0 14px;}#wp-fullscreen-modes a{float:right;border-width:1px 0 1px 1px;}#wp-fullscreen-modes a:first-child{border-width:1px;-moz-border-radius:3px 3px 0 0;-webkit-border-top-left-radius:0;-webkit-border-top-right-radius:3px;-webkit-border-bottom-left-radius:0;-webkit-border-bottom-right-radius:3px;-khtml-border-top-left-radius:0;-khtml-border-top-right-radius:3px;-khtml-border-bottom-left-radius:0;-khtml-border-bottom-right-radius:3px;border-top-left-radius:0;border-top-right-radius:3px;border-bottom-right-left:0;border-bottom-right-radius:3px;}#wp-fullscreen-modes a:last-child{-moz-border-radius:0 0 3px 3px;-webkit-border-top-right-radius:0;-webkit-border-top-left-radius:3px;-webkit-border-bottom-right-radius:0;-webkit-border-bottom-left-radius:3px;-khtml-border-top-right-radius:0;-khtml-border-top-left-radius:3px;-khtml-border-bottom-right-radius:0;-khtml-border-bottom-left-radius:3px;border-top-right-radius:0;border-top-left-radius:3px;border-bottom-right-radius:0;border-bottom-left-radius:3px;}#wp-fullscreen-save img,#wp-fullscreen-save span{padding-right:0;padding-left:4px;}#wphead-info{margin:0 15px 0 0;}#user_info{float:left;padding:0 6px 0 2px;}#user_info.active{margin-right:0;margin-left:-1px;}#user_info .hide-if-no-js p{margin:0 0 0 20px;}#user_info_arrow{right:auto;left:3px;}#user_info_links_wrap{right:auto;left:0;}#wphead{height:32px;margin-left:15px;margin-right:2px;}#header-logo{float:right;}#wphead h1{font:Tahoma,Arial,sans-serif;float:right;}#favorite-actions{margin:0 15px 0 12px;}#favorite-first a{padding:2px 12px 2px 0;}#favorite-inside a{padding:3px 10px 3px 5px;}#favorite-toggle{right:auto;left:0;}#screen-meta-links{margin:0 0 0 19px;}#screen-meta .screen-reader-text{visibility:hidden;}#screen-options-link-wrap,#contextual-help-link-wrap{float:left;margin:0 6px 0 0;font-family:Tahoma,Arial,sans-serif;}#contextual-help-wrap li{list-style-type:disc;margin-left:auto;margin-right:18px;}.toggle-arrow{background-position:top right;}.toggle-arrow-active{background-position:bottom right;}#screen-meta a.show-settings{padding:0 6px 0 16px;}#screen-options-wrap,#contextual-help-wrap{margin:0 0 0 15px;}.metabox-prefs label{padding-right:auto;padding-left:15px;}.metabox-prefs label input{margin:0 2px 0 5px;}#adminmenushadow{right:auto;left:0;}#adminmenu div.wp-menu-image{float:right;}#adminmenu .wp-submenu a{padding-left:0;padding-right:12px;}#adminmenu li.wp-has-current-submenu .wp-menu-arrow,#adminmenu li.menu-top.current .wp-menu-arrow{right:auto;left:-9px;}#adminmenu .wp-menu-arrow div{background:url(../images/menu-arrow-frame-rtl.png) top left no-repeat;}#adminmenu .wp-menu-image img{float:right;}.js.folded #adminmenu .wp-submenu{display:block;left:auto;right:26px;}.js.folded #adminmenu .wp-submenu.sub-open{padding:0 0 8px 8px;}#adminmenu .wp-submenu .wp-submenu-head{padding:6px 10px 5px 4px;}.js.folded #adminmenu .wp-submenu-wrap{-webkit-border-bottom-right-radius:0;-webkit-border-bottom-left-radius:3px;-webkit-border-top-right-radius:0;-webkit-border-top-left-radius:3px;-khtml-border-bottom-right-radius:0;-khtml-border-bottom-left-radius:3px;-khtml-border-top-left-radius:0;-khtml-border-top-left-radius:3px;-moz-border-radius-bottomright:0;-moz-border-radius-bottomleft:3px;-moz-border-radius-topright:0;-moz-border-radius-topleft:3px;border-bottom-right-radius:0;border-bottom-left-radius:3px;border-top-right-radius:0;border-top-left-radius:3px;border-width:0 0 1px 1px;}.js.folded #adminmenu .wp-submenu ul{border-width:0 1px 0 0;}.js.folded #adminmenu .wp-submenu a{padding-left:0;padding-right:10px;}.js.folded #adminmenu a.wp-has-submenu{margin-left:0;margin-right:40px;}#adminmenu .wp-menu-toggle{clear:left;float:left;padding:1px 0 0 2px;}#adminmenu .wp-menu-image img{padding:6px 1px 0 0;}#adminmenu .awaiting-mod,#adminmenu span.update-plugins,#sidemenu li a span.update-plugins{font-family:Tahoma,Arial,sans-serif;margin-left:0;margin-right:7px;}.post-com-count-wrapper{font-family:Tahoma,Arial,sans-serif;}.column-response .post-com-count{float:right;margin-right:0;margin-left:5px;}.response-links{float:right;}#collapse-button{float:right;}.widefat th{font-family:Tahoma,Arial,sans-serif;}.widefat td p{margin:2px 0 .8em;}.postbox-container{float:right;padding-right:0;padding-left:.5%;}.postbox .handlediv{float:left;}#the-comment-list p.comment-author img{float:right;margin-right:0;margin-left:8px;}.fixed .column-comments{text-align:right;}.fixed .column-comments .vers{padding-left:0;padding-right:3px;}.fixed .column-comments a{float:right;}.sorting-indicator{margin-left:0;margin-right:7px;}th.sortable a span,th.sorted a span{float:right;}.tablenav-pages a{margin-right:0;margin-left:1px;}.tablenav-pages .next-page{margin-left:0;margin-right:2px;}.tablenav a.button-secondary{margin:3px 0 0 8px;}.tablenav .tablenav-pages{float:left;}.tablenav .displaying-num{margin-right:0;margin-left:10px;font-family:Tahoma,Arial,sans-serif;font-style:bold;}.tablenav .actions{padding:2px 0 0 8px;}.tablenav .delete{margin-right:0;margin-left:20px;}.view-switch{float:left;}.filter{float:right;margin:-5px 10px 0 0;}.filter .subsubsub{margin-left:0;margin-right:-10px;}#posts-filter fieldset{float:right;margin:0 0 1em 1.5ex;}#posts-filter fieldset legend{padding:0 1px .2em 0;}#wpbody-content .inline-edit-row fieldset{float:right;}#wpbody-content .quick-edit-row-page fieldset.inline-edit-col-right .inline-edit-col{border-width:0 1px 0 0;}#wpbody-content .bulk-edit-row .inline-edit-col-bottom{float:left;}.inline-edit-row fieldset label span.title{float:right;}.inline-edit-row fieldset label span.input-text-wrap{margin-left:0;margin-right:5em;}.quick-edit-row-post fieldset.inline-edit-col-right label span.title{padding-right:0;padding-left:.5em;}#wpbody-content .quick-edit-row fieldset .inline-edit-group label.alignleft:first-child{margin-right:0;margin-left:.5em;}.inline-edit-row fieldset span.title,.inline-edit-row fieldset span.checkbox-title{font-family:Tahoma,Arial,sans-serif;font-style:normal;}.inline-edit-row fieldset .inline-edit-date{float:right;}.inline-edit-row fieldset ul.cat-checklist label,.inline-edit-row .catshow,.inline-edit-row .cathide,.inline-edit-row #bulk-titles div{font-family:Tahoma,Arial,sans-serif;}.quick-edit-row-post fieldset label.inline-edit-status{float:right;}#bulk-titles div a{float:right;margin:3px -2px 0 3px;overflow:hidden;text-indent:-9999px;}#titlediv #title-prompt-text,#wp-fullscreen-title-prompt-text{right:0;}#sample-permalink{direction:ltr;}#sample-permalink #editable-post-name{unicode-bidi:embed;}#wp-fullscreen-title-prompt-text{left:auto;right:0;}.postarea h3 label{float:right;}.postarea #add-media-button{float:left;right:auto;left:10px;}#edButtonPreview,#edButtonHTML{margin:5px 0 0 5px;float:left;}#poststuff #edButtonHTML{margin-right:0;margin-left:15px;}#media-buttons a{padding:0 10px 5px 0;}.submitbox .submit{text-align:right;}.inside-submitbox #post_status{margin:2px -2px 2px 0;}.submitbox .submit input{margin-right:0;margin-left:4px;}#normal-sortables .postbox .submit{float:left;}#post-body ul.category-tabs,#post-body ul.add-menu-item-tabs{float:right;text-align:left;margin:0 5px 0 -120px;}#post-body ul.category-tabs li.tabs,#post-body ul.add-menu-item-tabs li.tabs{-moz-border-radius:3px 3px 0 0;-webkit-border-top-left-radius:0;-webkit-border-top-right-radius:3px;-webkit-border-bottom-left-radius:0;-webkit-border-bottom-right-radius:3px;-khtml-border-top-left-radius:0;-khtml-border-top-right-radius:3px;-khtml-border-bottom-left-radius:0;-khtml-border-bottom-right-radius:3px;border-top-left-radius:0;border-top-right-radius:3px;border-bottom-left-radius:0;border-bottom-right-radius:3px;}#post-body .categorydiv div.tabs-panel,.taxonomy div.tabs-panel,#post-body #linkcategorydiv div.tabs-panel{margin:0 125px 0 5px;}#side-sortables .comments-box thead th,#normal-sortables .comments-box thead th{font-style:normal;}#commentsdiv img.waiting{padding-left:0;padding-right:5px;}#post-body .category-tabs li.tabs,#post-body .add-menu-item-tabs li.tabs{border-width:1px 1px 1px 0;margin-right:0;margin-left:-1px;}#posts-filter fieldset{float:right;margin:0 0 1em 1.5ex;}#posts-filter fieldset legend{padding:0 1px .2em 0;}#post-body .tagsdiv #newtag{margin-right:0;margin-left:5px;}.autosave-info{padding:2px 2px 2px 15px;text-align:left;}#post-body .wp_themeSkin .mceStatusbar a.mceResize{background:transparent url(../images/resize-rtl.gif) no-repeat scroll left bottom;cursor:sw-resize;}.curtime #timestamp{background-position:right top;padding-left:0;padding-right:18px;}#postcustomstuff table input,#postcustomstuff table select,#postcustomstuff table textarea{margin:8px 8px 8px 0;}table.diff td,table.diff th{font-family:Consolas,Monaco,monospace;}.category-adder{margin-left:0;margin-right:120px;}#post-body ul.category-tabs,#post-body ul.add-menu-item-tabs{float:right;text-align:left;margin:0 5px 0 -120px;}#post-body ul.category-tabs li.tabs,#post-body ul.add-menu-item-tabs li.tabs{-moz-border-radius:3px 3px 0 0;-webkit-border-top-left-radius:0;-webkit-border-top-right-radius:3px;-webkit-border-bottom-left-radius:0;-webkit-border-bottom-right-radius:3px;-khtml-border-top-left-radius:0;-khtml-border-top-right-radius:3px;-khtml-border-bottom-left-radius:0;-khtml-border-bottom-right-radius:3px;border-top-left-radius:0;border-top-right-radius:3px;border-bottom-left-radius:0;border-bottom-right-radius:3px;}#front-page-warning,#front-static-pages ul,ul.export-filters,.inline-editor ul.cat-checklist ul,.categorydiv ul.categorychecklist ul,.customlinkdiv ul.categorychecklist ul,.posttypediv ul.categorychecklist ul,.taxonomydiv ul.categorychecklist ul,#linkcategorydiv ul.categorychecklist ul{margin-left:0;margin-right:18px;}#post-body .category-tabs li.tabs,#post-body .add-menu-item-tabs li.tabs{border-style:solid solid solid none;border-width:1px 1px 1px 0;margin-right:0;margin-left:-1px;}p.help,p.description,span.description,.form-wrap p{font-style:normal;font-family:Tahoma,Arial,sans-serif;}.taghint{margin:15px 12px -24px 0;}#poststuff .tagsdiv .howto{margin:0 8px 6px 0;}.ac_results li{text-align:right;}#wpbody-content .describe th{text-align:right;}.describe .media-item-info .A1B1{padding:0 10px 0 0;}.media-upload-form td label{margin-left:6px;margin-right:2px;}.media-upload-form .align .field label{padding:0 22px 0 0;margin:0 0 0 1em;}.media-upload-form tr.image-size label{margin:0 3px 0 0;}#wpbody-content .describe p.help{padding:0 5px 0 0;}.media-item .error-div a.dismiss,.describe-toggle-on,.describe-toggle-off{float:left;margin-right:0;margin-left:20px;}.media-item .error-div{padding-left:0;padding-right:10px;}.media-item .pinkynail{float:right;}.crunching{text-align:left;margin-right:0;margin-left:5px;}.bar{border-right-width:0;border-left-width:3px;border-right-style:none;border-left-style:solid;}#find-posts-response .found-radio{padding:5px 8px 0 0;}.find-box-search label{padding-right:0;padding-left:6px;}.find-box #resize-se{right:auto;left:1px;}form.upgrade .hint{font-style:normal;}.imgedit-menu div{float:right;}.imgedit-help{font-style:normal;}.imgedit-submit-btn{margin-left:0;margin-right:20px;}.form-table th{text-align:right;}.form-table input.tog{margin-right:0;margin-left:2px;float:right;}.form-table table.color-palette{float:right;}#replysubmit img.waiting,.inline-edit-save img.waiting{float:left;}#replysubmit .button{margin-right:0;margin-left:5px;}#edithead .inside{float:right;padding:3px 5px 2px 0;}.comment-ays th{border-right-style:none;border-left-style:solid;border-right-width:0;border-left-width:1px;}.spam-undo-inside .avatar,.trash-undo-inside .avatar{margin-left:8px;}#comment-status-radio input{margin:2px 0 5px 3px;}td.available-theme{text-align:right;}#current-theme img{float:right;margin-right:0;margin-left:1em;}#broken-themes{text-align:right;}.appearance_page_custom-header .available-headers .default-header{float:right;margin:0 0 20px 20px;}.appearance_page_custom-header .random-header{margin:0 0 20px 20px;}.appearance_page_custom-header .available-headers label input,.appearance_page_custom-header .random-header label input{margin-right:0;margin-left:10px;}.nav-tab{margin:0 0 -1px 6px;}h2 .nav-tab{font-family:Tahoma,Arial,sans-serif;}.plugins .desc ul,.plugins .desc ol{margin:0 2em 0 0;}#wpbody-content .plugins .plugin-title,#wpbody-content .plugins .theme-title{padding-right:0;padding-left:12px;}#profile-page .form-table #rich_editing{margin-right:0;margin-left:5px;}#your-profile legend{font-family:Tahoma,Arial,sans-serif;}#utc-time,#local-time{padding-left:0;padding-right:25px;font-style:normal;font-family:Tahoma,Arial,sans-serif;}#footer{margin-right:0;margin-left:15px;}#template div{margin-right:0;margin-left:190px;}.column-author img,.column-username img{float:right;margin-right:0;margin-left:10px;}.tagchecklist{margin-left:0;margin-right:14px;}.tagchecklist strong{margin-left:0;margin-right:-8px;}.tagchecklist span{margin-right:0;margin-left:25px;float:right;}.tagchecklist span a{margin:6px -9px 0 0;float:right;}#poststuff h2{clear:right;}#poststuff h3,.metabox-holder h3{font-family:Tahoma,Arial,sans-serif;}.tool-box .title{font-family:Tahoma,Arial,sans-serif;}#sidemenu{margin:-30px 315px 0 15px;float:left;padding-left:0;padding-right:10px;}#sidemenu a{float:right;}table .vers,table .column-visible,table .column-rating{text-align:right;}* html #template div{margin-left:0;}.list-ajax-loading{float:left;margin-right:0;margin-left:9px;}#editorcontainer .wp_themeSkin .mceStatusbar{padding-left:0;padding-right:5px;}#editorcontainer .wp_themeSkin .mceStatusbar div{float:right;}#editorcontainer .wp_themeSkin .mceStatusbar a.mceResize{float:left;} \ No newline at end of file diff --git a/src/wp-admin/css/wp-admin-rtl.dev.css b/src/wp-admin/css/wp-admin-rtl.dev.css new file mode 100644 index 0000000..e208a16 --- /dev/null +++ b/src/wp-admin/css/wp-admin-rtl.dev.css @@ -0,0 +1,1336 @@ +/*------------------------------------------------------------------------------ + + +Hello, this is the RTL version of the main WordPress admin CSS file. +All the important stuff is in here. + + +TABLE OF CONTENTS: +------------------ + 1.0 - Text Elements + 2.0 - Forms + 3.0 - Actions + 4.0 - Notifications + 5.0 - TinyMCE + 6.0 - Admin Header + 6.1 - Favorites Menu + 6.2 - Screen Options Tabs + 7.0 - Main Navigation + 8.0 - Layout Blocks + 9.0 - Dashboard +10.0 - List Posts + 10.1 - Inline Editing +11.0 - Write/Edit Post Screen + 11.1 - Custom Fields + 11.2 - Post Revisions +12.0 - Categories +13.0 - Tags +14.0 - Media Screen + 14.1 - Media Uploader + 14.2 - Image Editor +15.0 - Comments Screen +16.0 - Themes + 16.1 - Custom Header + 16.2 - Custom Background + 16.3 - Tabbed Admin Screen Interface +17.0 - Plugins +18.0 - Users +19.0 - Tools +20.0 - Settings +21.0 - Admin Footer +22.0 - Misc +23.0 - Dead +24.0 - TinyMCE tweaks + + +------------------------------------------------------------------------------*/ + + + + +/*------------------------------------------------------------------------------ + 1.0 - Text Styles +------------------------------------------------------------------------------*/ + +ol { + margin-left: 0; + margin-right: 2em; +} + +.code, code { + font-family: Tahoma, Arial, sans-serif; +} + + +.quicktags, .search { + font: 12px Tahoma, Arial, sans-serif; +} + +.icon32 { + float: right; + margin: 7px 0 0 8px; +} + +.howto { + font-style: normal; + font-family: Tahoma, Arial, sans-serif; +} + +p.install-help { + font-style: normal; +} + + +/*------------------------------------------------------------------------------ + 2.0 - Forms +------------------------------------------------------------------------------*/ + +#doaction, +#doaction2, +#post-query-submit { + margin-right: 0; + margin-left: 8px; +} + +#timezone_string option { + margin-left: 0; + margin-right: 1em; +} + +#pass-strength-result { + float: right; + margin: 13px 1px 5px 5px; +} + +p.search-box { + float: left; +} + + +/*------------------------------------------------------------------------------ + 3.0 - Actions +------------------------------------------------------------------------------*/ + +#delete-action { + text-align: right; + float: right; +} + +#publishing-action { + text-align: left; + float: left; +} + +#post-body .misc-pub-section { + border-right:0; + border-left-width: 1px; + border-left-style: solid; + float: right; +} + +#post-body .misc-pub-section-last { + border-left: 0; +} + +#minor-publishing-actions { + padding: 10px 8px 2px 10px; + text-align: left; +} + +#save-post { + float: right; +} + +#minor-publishing .ajax-loading { + padding: 3px 4px 0 0; + float: right; +} + +.preview { + float: left; +} + +#sticky-span { + margin-left: 0; + margin-right: 18px; +} + +.side-info ul { + padding-left: 0; + padding-right: 18px; +} + +td.action-links, +th.action-links { + text-align: left; +} + +.describe .del-link { + padding-left: 0; + padding-right: 5px; +} + + +/*------------------------------------------------------------------------------ + 4.0 - Notifications +------------------------------------------------------------------------------*/ + +.plugin-update .update-message { + margin: 0 31px 8px 10px; +} + +form.upgrade .hint { + font-style: normal; +} + +#ajax-response.alignleft { + margin-left: 0; + margin-right: 2em; +} + + +/*------------------------------------------------------------------------------ + 5.0 - TinyMCE +------------------------------------------------------------------------------*/ + +#quicktags { + background-position: right top; +} + +#ed_reply_toolbar input { + margin: 1px 1px 1px 2px; +} + +/* Distraction Free Writing mode + * =Overlay Styles +-------------------------------------------------------------- */ + +/* No RTL for now, this space intentionally left blank */ + +/* =Overlay Body +-------------------------------------------------------------- */ +#wp-fullscreen-body { + right: 0; + left:auto; +} + +#wp-fullscreen-tagline { + float: left; +} + +/* =Top bar +-------------------------------------------------------------- */ +#fullscreen-topbar { + left:auto; + right: 0; +} + +#wp-fullscreen-mode-bar, +#wp-fullscreen-button-bar, +#wp-fullscreen-close, +#wp-fullscreen-count { + float: right; +} + +#wp-fullscreen-save { + float: left; +} + +#wp-fullscreen-save { + padding: 2px 5px 0 2px; +} + +#wp-fullscreen-buttons > div { + float: right; +} + +#wp-fullscreen-mode-bar { + padding: 1px 0 0 14px; +} + +#wp-fullscreen-modes a { + float: right; + border-width: 1px 0 1px 1px; +} + +#wp-fullscreen-modes a:first-child { + border-width: 1px; + -moz-border-radius: 3px 3px 0 0; + -webkit-border-top-left-radius: 0; + -webkit-border-top-right-radius: 3px; + -webkit-border-bottom-left-radius: 0; + -webkit-border-bottom-right-radius: 3px; + -khtml-border-top-left-radius: 0; + -khtml-border-top-right-radius: 3px; + -khtml-border-bottom-left-radius: 0; + -khtml-border-bottom-right-radius: 3px; + border-top-left-radius: 0; + border-top-right-radius: 3px; + border-bottom-right-left: 0; + border-bottom-right-radius: 3px; +} + +#wp-fullscreen-modes a:last-child { + -moz-border-radius: 0 0 3px 3px; + -webkit-border-top-right-radius: 0; + -webkit-border-top-left-radius: 3px; + -webkit-border-bottom-right-radius: 0; + -webkit-border-bottom-left-radius: 3px; + -khtml-border-top-right-radius: 0; + -khtml-border-top-left-radius: 3px; + -khtml-border-bottom-right-radius: 0; + -khtml-border-bottom-left-radius: 3px; + border-top-right-radius: 0; + border-top-left-radius: 3px; + border-bottom-right-radius: 0; + border-bottom-left-radius: 3px; +} + +#wp-fullscreen-save img, +#wp-fullscreen-save span { + padding-right: 0; + padding-left: 4px; +} + +/* =Thickbox Adjustments +-------------------------------------------------------------- */ +/* No RTL for now, this space intentionally left blank */ + + +/* =TinyMCE Adjustments +-------------------------------------------------------------- */ +/* No RTL for now, this space intentionally left blank */ + + + +/*------------------------------------------------------------------------------ + 6.0 - Admin Header +------------------------------------------------------------------------------*/ +#wphead-info { + margin: 0 15px 0 0; +} + +#user_info { + float: left; + padding: 0 6px 0 2px; +} + +#user_info.active { + margin-right: 0; + margin-left: -1px; +} + +#user_info .hide-if-no-js p { + margin: 0 0 0 20px; +} + +#user_info_arrow { + right: auto; + left: 3px; +} + +#user_info_links_wrap { + right: auto; + left: 0; +} + +#wphead { + height: 32px; + margin-left: 15px; + margin-right: 2px; +} + +#header-logo { + float: right; +} + +#wphead h1 { + font: Tahoma, Arial, sans-serif; + float: right; +} + +/*------------------------------------------------------------------------------ + 6.1 - Favorites Menu +------------------------------------------------------------------------------*/ + +#favorite-actions { + margin: 0 15px 0 12px; +} + +#favorite-first a { + padding: 2px 12px 2px 0; +} + +#favorite-inside a { + padding: 3px 10px 3px 5px; +} + +#favorite-toggle { + right: auto; + left: 0; +} + + +/*------------------------------------------------------------------------------ + 6.2 - Screen Options Tabs +------------------------------------------------------------------------------*/ + +#screen-meta-links { + margin: 0 0 0 19px; +} + +#screen-meta .screen-reader-text { + visibility: hidden; +} + +#screen-options-link-wrap, +#contextual-help-link-wrap { + float: left; + margin: 0 6px 0 0; + font-family: Tahoma, Arial, sans-serif; +} + +#contextual-help-wrap li { + list-style-type: disc; + margin-left: auto; + margin-right: 18px; +} +.toggle-arrow { + background-position: top right; +} +.toggle-arrow-active { + background-position: bottom right; +} +#screen-meta a.show-settings { + padding: 0 6px 0 16px; +} + +#screen-options-wrap, +#contextual-help-wrap { + margin: 0 0 0 15px; +} + +.metabox-prefs label { + padding-right: auto; + padding-left: 15px; +} + +.metabox-prefs label input { + margin: 0 2px 0 5px; +} + +/*------------------------------------------------------------------------------ + 7.0 - Main Navigation (Right Menu) (RTL: Left Menu) +------------------------------------------------------------------------------*/ + +#adminmenushadow { + right: auto; + left: 0; +} + +#adminmenu div.wp-menu-image { + float: right; +} + +#adminmenu .wp-submenu a { + padding-left: 0; + padding-right: 12px; +} + +#adminmenu li.wp-has-current-submenu .wp-menu-arrow, +#adminmenu li.menu-top.current .wp-menu-arrow { + right: auto; + left: -9px; +} +#adminmenu .wp-menu-arrow div { + background: url(../images/menu-arrow-frame-rtl.png) top left no-repeat; +} + +#adminmenu .wp-menu-image img { + float: right; +} + +.js.folded #adminmenu .wp-submenu { + display: block; + left: auto; + right: 26px; +} + +.js.folded #adminmenu .wp-submenu.sub-open { + padding: 0 0 8px 8px; +} + +#adminmenu .wp-submenu .wp-submenu-head { + padding: 6px 10px 5px 4px; +} + +.js.folded #adminmenu .wp-submenu-wrap { + -webkit-border-bottom-right-radius: 0; + -webkit-border-bottom-left-radius: 3px; + -webkit-border-top-right-radius: 0; + -webkit-border-top-left-radius: 3px; + -khtml-border-bottom-right-radius: 0; + -khtml-border-bottom-left-radius: 3px; + -khtml-border-top-left-radius: 0; + -khtml-border-top-left-radius: 3px; + -moz-border-radius-bottomright: 0; + -moz-border-radius-bottomleft: 3px; + -moz-border-radius-topright: 0; + -moz-border-radius-topleft: 3px; + border-bottom-right-radius: 0; + border-bottom-left-radius: 3px; + border-top-right-radius: 0; + border-top-left-radius: 3px; + border-width: 0 0 1px 1px; +} + +.js.folded #adminmenu .wp-submenu ul { + border-width: 0 1px 0 0; +} + +.js.folded #adminmenu .wp-submenu a { + padding-left: 0; + padding-right: 10px; +} + +.js.folded #adminmenu a.wp-has-submenu { + margin-left: 0; + margin-right: 40px; +} + +#adminmenu .wp-menu-toggle { + clear: left; + float: left; + padding: 1px 0 0 2px; +} + +#adminmenu .wp-menu-image img { + padding: 6px 1px 0 0; +} + +#adminmenu .awaiting-mod, +#adminmenu span.update-plugins, +#sidemenu li a span.update-plugins { + font-family: Tahoma, Arial, sans-serif; + margin-left: 0; + margin-right: 7px; +} + +.post-com-count-wrapper { + font-family: Tahoma, Arial, sans-serif; +} + +.column-response .post-com-count { + float: right; + margin-right: 0; + margin-left: 5px; +} + +.response-links { + float: right; +} + +#collapse-button { + float: right; +} + +/*------------------------------------------------------------------------------ + 8.0 - Layout Blocks +------------------------------------------------------------------------------*/ + +.widefat th { + font-family: Tahoma, Arial, sans-serif; +} + +.widefat td p { + margin: 2px 0 0.8em; +} + +.postbox-container { + float: right; + padding-right: 0; + padding-left: 0.5%; +} + +.postbox .handlediv { + float: left; +} + +/*------------------------------------------------------------------------------ + 9.0 - Dashboard +------------------------------------------------------------------------------*/ + +#the-comment-list p.comment-author img { + float: right; + margin-right: 0; + margin-left: 8px; +} + +/*------------------------------------------------------------------------------ + 10.0 - List Posts (/Pages/etc) +------------------------------------------------------------------------------*/ + +.fixed .column-comments { + text-align: right; +} +.fixed .column-comments .vers { + padding-left: 0; + padding-right: 3px; +} +.fixed .column-comments a { + float: right; +} +.sorting-indicator { + margin-left: 0; + margin-right: 7px; +} +th.sortable a span, +th.sorted a span { + float: right; +} + +/* Bulk Actions */ + +.tablenav-pages a { + margin-right: 0; + margin-left: 1px; +} +.tablenav-pages .next-page { + margin-left: 0; + margin-right: 2px; +} + +.tablenav a.button-secondary { + margin: 3px 0 0 8px; +} + +.tablenav .tablenav-pages { + float: left; +} + +.tablenav .displaying-num { + margin-right: 0; + margin-left: 10px; + font-family: Tahoma, Arial, sans-serif; + font-style: bold; +} + +.tablenav .actions { + padding: 2px 0 0 8px; +} + +.tablenav .delete { + margin-right: 0; + margin-left: 20px; +} + +.view-switch { + float: left; +} + +.filter { + float: right; + margin: -5px 10px 0 0; +} + +.filter .subsubsub { + margin-left: 0; + margin-right: -10px; +} + +#posts-filter fieldset { + float: right; + margin: 0 0 1em 1.5ex; +} + +#posts-filter fieldset legend { + padding: 0 1px .2em 0; +} + +/*------------------------------------------------------------------------------ + 10.1 - Inline Editing +------------------------------------------------------------------------------*/ + +#wpbody-content .inline-edit-row fieldset { + float: right; +} + +#wpbody-content .quick-edit-row-page fieldset.inline-edit-col-right .inline-edit-col { + border-width: 0 1px 0 0; +} + +#wpbody-content .bulk-edit-row .inline-edit-col-bottom { + float: left; +} + +.inline-edit-row fieldset label span.title { + float: right; +} + +.inline-edit-row fieldset label span.input-text-wrap { + margin-left: 0; + margin-right: 5em; +} + +.quick-edit-row-post fieldset.inline-edit-col-right label span.title { + padding-right: 0; + padding-left: 0.5em; +} + +#wpbody-content .quick-edit-row fieldset .inline-edit-group label.alignleft:first-child { + margin-right: 0; + margin-left: 0.5em +} + +/* Styling */ + +.inline-edit-row fieldset span.title, +.inline-edit-row fieldset span.checkbox-title { + font-family: Tahoma, Arial, sans-serif; + font-style: normal; +} + +.inline-edit-row fieldset .inline-edit-date { + float: right; +} + +.inline-edit-row fieldset ul.cat-checklist label, +.inline-edit-row .catshow, +.inline-edit-row .cathide, +.inline-edit-row #bulk-titles div { + font-family: Tahoma, Arial, sans-serif; +} + +.quick-edit-row-post fieldset label.inline-edit-status { + float: right; +} + +#bulk-titles div a { + float: right; + margin: 3px -2px 0 3px; + overflow: hidden; + text-indent: -9999px; +} + + +/*------------------------------------------------------------------------------ + 11.0 - Write/Edit Post Screen +------------------------------------------------------------------------------*/ + +#titlediv #title-prompt-text, +#wp-fullscreen-title-prompt-text { + right:0; +} + +#sample-permalink { + direction:ltr; +} + +#sample-permalink #editable-post-name { + unicode-bidi:embed; +} +#wp-fullscreen-title-prompt-text { + left: auto; + right: 0; +} + +.postarea h3 label { + float: right; +} + +.postarea #add-media-button { + float: left; + right: auto; + left: 10px; +} + + +#edButtonPreview, +#edButtonHTML { + margin: 5px 0 0 5px; + float: left; +} + +#poststuff #edButtonHTML { + margin-right: 0; + margin-left: 15px; +} + +#media-buttons a { + padding: 0 10px 5px 0; +} + +.submitbox .submit { + text-align: right; +} + +.inside-submitbox #post_status { + margin: 2px -2px 2px 0; +} + +.submitbox .submit input { + margin-right: 0; + margin-left: 4px; +} + +#normal-sortables .postbox .submit { + float: left; +} + + +#post-body ul.category-tabs, +#post-body ul.add-menu-item-tabs { + float: right; + text-align: left; + /* Negative margin for the sake of those without JS: all tabs display */ + margin: 0 5px 0 -120px; +} + + +#post-body ul.category-tabs li.tabs, +#post-body ul.add-menu-item-tabs li.tabs { + -moz-border-radius: 3px 3px 0 0; + -webkit-border-top-left-radius: 0; + -webkit-border-top-right-radius: 3px; + -webkit-border-bottom-left-radius: 0; + -webkit-border-bottom-right-radius: 3px; + -khtml-border-top-left-radius: 0; + -khtml-border-top-right-radius: 3px; + -khtml-border-bottom-left-radius: 0; + -khtml-border-bottom-right-radius: 3px; + border-top-left-radius: 0; + border-top-right-radius: 3px; + border-bottom-left-radius: 0; + border-bottom-right-radius: 3px; +} + +#post-body .categorydiv div.tabs-panel, +.taxonomy div.tabs-panel, +#post-body #linkcategorydiv div.tabs-panel { + margin: 0 125px 0 5px; +} + +#side-sortables .comments-box thead th, +#normal-sortables .comments-box thead th { + font-style: normal; +} + +#commentsdiv img.waiting { + padding-left: 0; + padding-right: 5px; +} + +#post-body .category-tabs li.tabs, +#post-body .add-menu-item-tabs li.tabs { + border-width: 1px 1px 1px 0; + margin-right: 0; + margin-left: -1px; +} + +/* positioning etc. */ + +#posts-filter fieldset { + float: right; + margin: 0 0 1em 1.5ex; +} + +#posts-filter fieldset legend { + padding: 0 1px .2em 0; +} + +/* Global classes */ + +#post-body .tagsdiv #newtag { + margin-right: 0; + margin-left: 5px; +} + +.autosave-info { + padding: 2px 2px 2px 15px; + text-align: left; +} + +#post-body .wp_themeSkin .mceStatusbar a.mceResize { + background: transparent url(../images/resize-rtl.gif) no-repeat scroll left bottom; + cursor: sw-resize; +} + +.curtime #timestamp { + background-position: right top; + padding-left: 0; + padding-right: 18px; +} + +/*------------------------------------------------------------------------------ + 11.1 - Custom Fields +------------------------------------------------------------------------------*/ + +#postcustomstuff table input, +#postcustomstuff table select, +#postcustomstuff table textarea { + margin: 8px 8px 8px 0; +} + +/*------------------------------------------------------------------------------ + 11.2 - Post Revisions +------------------------------------------------------------------------------*/ + +table.diff td, table.diff th { + font-family: Consolas, Monaco, monospace; +} + +/*------------------------------------------------------------------------------ + 12.0 - Categories +------------------------------------------------------------------------------*/ + +.category-adder { + margin-left: 0; + margin-right: 120px; +} + + +#post-body ul.category-tabs, +#post-body ul.add-menu-item-tabs { + float: right; + text-align: left; + /* Negative margin for the sake of those without JS: all tabs display */ + margin: 0 5px 0 -120px; +} + +#post-body ul.category-tabs li.tabs, +#post-body ul.add-menu-item-tabs li.tabs { + -moz-border-radius: 3px 3px 0 0; + -webkit-border-top-left-radius: 0; + -webkit-border-top-right-radius: 3px; + -webkit-border-bottom-left-radius: 0; + -webkit-border-bottom-right-radius: 3px; + -khtml-border-top-left-radius: 0; + -khtml-border-top-right-radius: 3px; + -khtml-border-bottom-left-radius: 0; + -khtml-border-bottom-right-radius: 3px; + border-top-left-radius: 0; + border-top-right-radius: 3px; + border-bottom-left-radius: 0; + border-bottom-right-radius: 3px; +} + +#front-page-warning, +#front-static-pages ul, +ul.export-filters, +.inline-editor ul.cat-checklist ul, +.categorydiv ul.categorychecklist ul, +.customlinkdiv ul.categorychecklist ul, +.posttypediv ul.categorychecklist ul, +.taxonomydiv ul.categorychecklist ul, +#linkcategorydiv ul.categorychecklist ul { + margin-left: 0; + margin-right: 18px; +} + +#post-body .category-tabs li.tabs, +#post-body .add-menu-item-tabs li.tabs { + border-style: solid solid solid none; + border-width: 1px 1px 1px 0; + margin-right: 0; + margin-left: -1px; +} + +p.help, +p.description, +span.description, +.form-wrap p { + font-style: normal; + font-family: Tahoma, Arial, sans-serif; +} + +/*------------------------------------------------------------------------------ + 13.0 - Tags +------------------------------------------------------------------------------*/ + +.taghint { + margin: 15px 12px -24px 0; +} + +#poststuff .tagsdiv .howto { + margin: 0 8px 6px 0; +} + +.ac_results li { + text-align: right; +} + +/*------------------------------------------------------------------------------ + 14.0 - Media Screen +------------------------------------------------------------------------------*/ + +#wpbody-content .describe th { + text-align: right; + +} + +.describe .media-item-info .A1B1 { + padding: 0 10px 0 0; +} + +.media-upload-form td label { + margin-left: 6px; + margin-right: 2px; +} + +.media-upload-form .align .field label { + padding: 0 22px 0 0; + margin: 0 0 0 1em; +} + +.media-upload-form tr.image-size label { + margin: 0 3px 0 0; +} + +#wpbody-content .describe p.help { + padding: 0 5px 0 0; +} + +.media-item .error-div a.dismiss, +.describe-toggle-on, +.describe-toggle-off { + float: left; + margin-right: 0; + margin-left: 20px; +} + +.media-item .error-div { + padding-left: 0; + padding-right: 10px; +} + +.media-item .pinkynail { + float: right; +} + +.crunching { + text-align: left; + margin-right: 0; + margin-left: 5px; +} + +.bar { + border-right-width: 0; + border-left-width: 3px; + border-right-style: none; + border-left-style: solid; +} + +/*------------------------------------------------------------------------------ + 14.1 - Media Uploader +------------------------------------------------------------------------------*/ + +#find-posts-response .found-radio { + padding: 5px 8px 0 0; +} + + +.find-box-search label { + padding-right: 0; + padding-left: 6px; +} + +.find-box #resize-se { + right: auto; + left: 1px; +} + + +form.upgrade .hint { + font-style: normal; +} + + +/*------------------------------------------------------------------------------ + 14.2 - Image Editor +------------------------------------------------------------------------------*/ + +.imgedit-menu div { + float: right; +} + +.imgedit-help { + font-style: normal; +} + +.imgedit-submit-btn { + margin-left: 0; + margin-right: 20px; +} + + +/*------------------------------------------------------------------------------ + 15.0 - Comments Screen +------------------------------------------------------------------------------*/ + +.form-table th { + text-align: right; +} + +.form-table input.tog { + margin-right: 0; + margin-left: 2px; + float: right; +} + +.form-table table.color-palette { + float: right; +} + +/* reply to comments */ + +#replysubmit img.waiting, +.inline-edit-save img.waiting { + float: left; +} + +#replysubmit .button { + margin-right: 0; + margin-left: 5px; +} + +#edithead .inside { + float: right; + padding: 3px 5px 2px 0; +} + +.comment-ays th { + border-right-style: none; + border-left-style: solid; + border-right-width: 0; + border-left-width: 1px; +} + +.spam-undo-inside .avatar, +.trash-undo-inside .avatar { + margin-left: 8px; +} + +#comment-status-radio input { + margin: 2px 0 5px 3px; +} + + + +/*------------------------------------------------------------------------------ + 16.0 - Themes +------------------------------------------------------------------------------*/ + +td.available-theme { + text-align: right; +} + +#current-theme img { + float: right; + margin-right: 0; + margin-left: 1em; +} + +#broken-themes { + text-align: right; +} + +/*------------------------------------------------------------------------------ + 16.1 - Custom Header Screen +------------------------------------------------------------------------------*/ + +.appearance_page_custom-header .available-headers .default-header { + float: right; + margin: 0 0 20px 20px; +} + +.appearance_page_custom-header .random-header { + margin: 0 0 20px 20px; +} + +.appearance_page_custom-header .available-headers label input, +.appearance_page_custom-header .random-header label input { + margin-right: 0; + margin-left: 10px; +} + +/*------------------------------------------------------------------------------ + 16.2 - Custom Background Screen +------------------------------------------------------------------------------*/ + +/* No RTL for now, this space intentionally left blank */ + + +/*------------------------------------------------------------------------------ + 16.3 - Tabbed Admin Screen Interface (Experimental) +------------------------------------------------------------------------------*/ + +.nav-tab { + margin: 0 0 -1px 6px; +} + +h2 .nav-tab { + font-family: Tahoma, Arial, sans-serif; +} + + +/*------------------------------------------------------------------------------ + 17.0 - Plugins +------------------------------------------------------------------------------*/ + +.plugins .desc ul, +.plugins .desc ol { + margin: 0 2em 0 0; +} + +#wpbody-content .plugins .plugin-title, #wpbody-content .plugins .theme-title { + padding-right: 0; + padding-left: 12px; +} + + +/*------------------------------------------------------------------------------ + 18.0 - Users +------------------------------------------------------------------------------*/ + +#profile-page .form-table #rich_editing { + margin-right: 0; + margin-left: 5px +} + +#your-profile legend { + font-family: Tahoma, Arial, sans-serif; +} + +/*------------------------------------------------------------------------------ + 19.0 - Tools +------------------------------------------------------------------------------*/ + +/* Intentionally didn't RTLized the new press-this button; + +/*------------------------------------------------------------------------------ + 20.0 - Settings +------------------------------------------------------------------------------*/ + +#utc-time, #local-time { + padding-left: 0; + padding-right: 25px; + font-style: normal; + font-family: Tahoma, Arial, sans-serif; +} + +/*------------------------------------------------------------------------------ + 21.0 - Admin Footer +------------------------------------------------------------------------------*/ + +#footer { + margin-right: 0; + margin-left: 15px; +} + +/*------------------------------------------------------------------------------ + 22.0 - Misc +------------------------------------------------------------------------------*/ + +#template div { + margin-right: 0; + margin-left: 190px; +} + +.column-author img, .column-username img { + float: right; + margin-right: 0; + margin-left: 10px; +} + +.tagchecklist { + margin-left: 0; + margin-right: 14px; +} + +.tagchecklist strong { + margin-left: 0; + margin-right: -8px; +} + +.tagchecklist span { + margin-right: 0; + margin-left: 25px; + float: right; + +} +.tagchecklist span a { + margin: 6px -9px 0pt 0pt; + float: right; +} + +#poststuff h2 { + clear: right; +} + +#poststuff h3, +.metabox-holder h3 { + font-family: Tahoma, Arial, sans-serif; +} + +.tool-box .title { + font-family: Tahoma, Arial, sans-serif; +} + +#sidemenu { + margin: -30px 315px 0 15px; + float: left; + padding-left: 0; + padding-right: 10px; +} +#sidemenu a { + float: right; +} + +table .vers, +table .column-visible, +table .column-rating { + text-align: right; +} + + +/*------------------------------------------------------------------------------ + 23.0 - Dead +------------------------------------------------------------------------------*/ + +/* - Not used anywhere in WordPress - verify and then deprecate +------------------------------------------------------------------------------*/ + +/* No RTL for now, this space intentionally left blank */ + + +/* - Only used once or twice in all of WP - deprecate for global style +------------------------------------------------------------------------------*/ + +* html #template div {margin-left: 0;} + +.list-ajax-loading { + float: left; + margin-right: 0; + margin-left: 9px; +} + +/* - Used - but could/should be deprecated with a CSS reset +------------------------------------------------------------------------------*/ +/* No RTL for now, this space intentionally left blank */ + + +/*------------------------------------------------------------------------------ + 24.0 - TinyMCE tweaks + Small tweaks for until tinymce css files are proprely RTLized +------------------------------------------------------------------------------*/ +#editorcontainer .wp_themeSkin .mceStatusbar { + padding-left: 0; + padding-right: 5px; +} +#editorcontainer .wp_themeSkin .mceStatusbar div { + float: right; +} + +#editorcontainer .wp_themeSkin .mceStatusbar a.mceResize { + float: left; +} diff --git a/src/wp-admin/css/wp-admin.css b/src/wp-admin/css/wp-admin.css new file mode 100644 index 0000000..3468a62 --- /dev/null +++ b/src/wp-admin/css/wp-admin.css @@ -0,0 +1 @@ +p,ul,ol,blockquote,input,select{font-size:12px;}ol{list-style-type:decimal;margin-left:2em;}.code,code{font-family:Consolas,Monaco,monospace;}kbd,code{padding:1px 3px;margin:0 1px;font-size:11px;}.quicktags,.search{font:12px Georgia,"Times New Roman","Bitstream Charter",Times,serif;}.icon32{float:left;height:34px;margin:7px 8px 0 0;width:36px;}.key-labels label{line-height:24px;}.pre{white-space:pre-wrap;white-space:-moz-pre-wrap!important;white-space:-pre-wrap;white-space:-o-pre-wrap;word-wrap:break-word;}.howto{font-style:italic;display:block;font-family:sans-serif;}p.install-help{margin:8px 0;font-style:italic;}textarea,input[type="text"],input[type="password"],input[type="file"],input[type="button"],input[type="submit"],input[type="reset"],select{border-width:1px;border-style:solid;-moz-border-radius:3px;-khtml-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;}select option{padding:2px;}.submit{padding:1.5em 0;margin:5px 0;-moz-border-radius:0 0 3px 3px;-webkit-border-bottom-left-radius:3px;-webkit-border-bottom-right-radius:3px;-khtml-border-bottom-left-radius:3px;-khtml-border-bottom-right-radius:3px;border-bottom-left-radius:3px;border-bottom-right-radius:3px;}form p.submit a.cancel:hover{text-decoration:none;}.submit input,.button,input.button,.button-primary,input.button-primary,.button-secondary,input.button-secondary,.button-highlighted,input.button-highlighted,#postcustomstuff .submit input{text-decoration:none;font-size:12px!important;line-height:13px;padding:3px 8px;cursor:pointer;border-width:1px;border-style:solid;-moz-border-radius:11px;-khtml-border-radius:11px;-webkit-border-radius:11px;border-radius:11px;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;-khtml-box-sizing:content-box;box-sizing:content-box;}#minor-publishing-actions input,#major-publishing-actions input,#minor-publishing-actions .preview{min-width:80px;text-align:center;}textarea.all-options,input.all-options{width:250px;}input.large-text,textarea.large-text{width:99%;}input.regular-text,#adduser .form-field input{width:25em;}input.small-text{width:50px;}#doaction,#doaction2,#post-query-submit{margin-right:8px;}.tablenav select[name="action"],.tablenav select[name="action2"]{width:130px;}.tablenav select[name="m"]{width:155px;}.tablenav select#cat{width:170px;}#wpcontent select{padding:2px;height:2em;font-size:12px;}#wpcontent option{padding:2px;}#timezone_string option{margin-left:1em;}label,#your-profile label+a{vertical-align:middle;}#misc-publishing-actions label{vertical-align:baseline;}#pass-strength-result{border-style:solid;border-width:1px;float:left;margin:13px 5px 5px 1px;padding:3px 5px;text-align:center;width:200px;display:none;}.indicator-hint{padding-top:8px;}p.search-box{float:right;margin:0;}#major-publishing-actions{padding:10px 10px 8px;clear:both;border-top:none;}#delete-action{line-height:25px;vertical-align:middle;text-align:left;float:left;}#publishing-action{text-align:right;float:right;line-height:23px;}#post-body #minor-publishing{padding-bottom:10px;}#post-body #misc-publishing-actions{padding:0;}#post-body .misc-pub-section{border-right-width:1px;border-right-style:solid;border-bottom:0 none;min-height:30px;float:left;max-width:32%;}#post-body .misc-pub-section-last{border-right:0;}#misc-publishing-actions{padding:6px 0 16px 0;}.misc-pub-section{padding:6px 10px;border-width:1px 0;border-style:solid;}.misc-pub-section:first-child{border-top-width:0;}.misc-pub-section-last{border-bottom-width:0;}#minor-publishing-actions{padding:10px 10px 2px 8px;text-align:right;}#minor-publishing{border-bottom-width:1px;border-bottom-style:solid;-webkit-box-shadow:0 1px 0 #fff;-moz-box-shadow:0 1px 0 #fff;box-shadow:0 1px 0 #fff;}#save-post{float:left;}#minor-publishing .ajax-loading{padding:3px 0 0 4px;float:left;}.preview{float:right;}#sticky-span{margin-left:18px;}#post-status-display,#post-visibility-display{font-weight:bold;}.side-info{margin:0;padding:4px;font-size:11px;}.side-info h5{padding-bottom:7px;font-size:14px;margin:12px 2px 5px;border-bottom-width:1px;border-bottom-style:solid;}.side-info ul{margin:0;padding-left:18px;list-style:square;}a.button,a.button-primary,a.button-secondary{line-height:15px;padding:3px 10px;white-space:nowrap;-webkit-border-radius:10px;}.approve{display:none;}.unapproved .approve,.spam .approve,.trash .approve{display:inline;}.unapproved .unapprove{display:none;}td.action-links,th.action-links{text-align:right;}.describe .del-link{padding-left:5px;}#update-nag,.update-nag{line-height:19px;padding:5px 0;font-size:12px;text-align:center;margin:0 15px;border-width:1px;border-style:solid;border-top-width:0;border-top-style:none;-moz-border-radius:0 0 3px 3px;-webkit-border-bottom-right-radius:3px;-webkit-border-bottom-left-radius:3px;-khtml-border-bottom-right-radius:3px;-khtml-border-bottom-left-radius:3px;border-bottom-right-radius:3px;border-bottom-left-radius:3px;}.plugins .plugin-update{padding:0;}.plugin-update .update-message{margin:0 10px 8px 31px;font-weight:bold;}ul#dismissed-updates{display:none;}form.upgrade{margin-top:8px;}form.upgrade .hint{font-style:italic;font-size:85%;margin:-0.5em 0 2em 0;}.ajax-feedback{visibility:hidden;vertical-align:bottom;}#ajax-response.alignleft{margin-left:2em;}#editorcontainer #content{font-family:Consolas,Monaco,monospace;padding:6px;line-height:150%;border:0 none;outline:none;resize:vertical;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;-khtml-box-sizing:border-box;box-sizing:border-box;}#editorcontainer,#quicktags{border-style:solid;border-width:1px;border-collapse:separate;-moz-border-radius:3px 3px 0 0;-webkit-border-top-right-radius:3px;-webkit-border-top-left-radius:3px;-khtml-border-top-right-radius:3px;-khtml-border-top-left-radius:3px;border-top-right-radius:3px;border-top-left-radius:3px;}#quicktags{padding:0;margin-bottom:-3px;border-bottom-width:3px;background-image:url("../images/ed-bg.gif");background-position:left top;background-repeat:repeat-x;}#quicktags #ed_toolbar{padding:2px 4px 0;}#ed_toolbar input,#ed_reply_toolbar input{margin:3px 1px 4px;line-height:18px;display:inline-block;min-width:26px;padding:2px 4px;font-size:12px;}#ed_reply_toolbar input{margin:1px 2px 1px 1px;}#quicktags #ed_link,#ed_reply_toolbar #ed_reply_link{text-decoration:underline;}#quicktags #ed_del,#ed_reply_toolbar #ed_reply_del{text-decoration:line-through;}#quicktags #ed_em,#ed_reply_toolbar #ed_reply_em{font-style:italic;}#wp_editbtns,#wp_gallerybtns{padding:2px;position:absolute;display:none;z-index:999998;}#wp_editimgbtn,#wp_delimgbtn,#wp_editgallery,#wp_delgallery{margin:2px;padding:2px;border-width:1px;border-style:solid;-moz-border-radius:3px;-khtml-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;}.fullscreen-overlay{z-index:149999;display:none;position:fixed;top:0;bottom:0;left:0;right:0;filter:inherit;}.fullscreen-active .fullscreen-overlay,.fullscreen-active #wp-fullscreen-body{display:block;}.fullscreen-fader{z-index:200000;}.fullscreen-active .fullscreen-fader{display:none;}#wp-fullscreen-body{width:100%;z-index:150005;display:none;position:absolute;top:0;left:0;}#wp-fullscreen-wrap{margin:0 auto 50px;position:relative;padding-top:60px;}#wp-fullscreen-title{font-size:1.7em;line-height:100%;outline:medium none;padding:6px 7px;width:100%;margin-bottom:30px;}#wp-fullscreen-container{padding:4px 10px 50px;}#wp-fullscreen-title,#wp-fullscreen-container{-moz-border-radius:0;-khtml-border-radius:0;-webkit-border-radius:0;border-radius:0;border:1px dashed transparent;background:transparent;-moz-transition-property:border-color;-moz-transition-duration:.6s;-webkit-transition-property:border-color;-webkit-transition-duration:.6s;-o-transition-property:border-color;-o-transition-duration:.6s;transition-property:border-color;transition-duration:.6s;}#wp_mce_fullscreen{width:100%;min-height:300px;border:0;background:transparent;font-family:Consolas,Monaco,monospace;line-height:1.6em;padding:0;overflow-y:hidden;outline:none;resize:none;}#wp-fullscreen-tagline{color:#BBB;font-size:18px;float:right;padding-top:5px;}#fullscreen-topbar{position:fixed;top:0;left:0;z-index:150050;border-bottom-style:solid;border-bottom-width:1px;min-width:800px;width:100%;height:40px;}#wp-fullscreen-toolbar{padding:6px 10px 0;clear:both;max-width:1100px;min-width:820px;margin:0 auto;}#wp-fullscreen-mode-bar,#wp-fullscreen-button-bar,#wp-fullscreen-close,#wp-fullscreen-count{float:left;}#wp-fullscreen-save{float:right;}#wp-fullscreen-save{padding:2px 2px 0 5px;}#wp-fullscreen-count,#wp-fullscreen-close{padding-top:5px;}#wp-fullscreen-central-toolbar{margin:auto;padding:0;}#wp-fullscreen-buttons>div{float:left;}#wp-fullscreen-mode-bar{padding:1px 14px 0 0;}#wp-fullscreen-modes a{display:block;font-size:11px;text-decoration:none;float:left;margin:1px 0 0 0;padding:2px 6px 2px;border-width:1px 1px 1px 0;border-style:solid;border-color:#bbb;color:#777;text-shadow:0 1px 0 #fff;background-color:#f4f4f4;background-image:-moz-linear-gradient(bottom,#e4e4e4,#f9f9f9);background-image:-webkit-gradient(linear,left bottom,left top,from(#e4e4e4),to(#f9f9f9));}#wp-fullscreen-modes a:hover,.wp-html-mode #wp-fullscreen-modes a:last-child,.wp-tmce-mode #wp-fullscreen-modes a:first-child{color:#333;border-color:#999;background-color:#eee;background-image:-moz-linear-gradient(bottom,#f9f9f9,#e0e0e0);background-image:-webkit-gradient(linear,left bottom,left top,from(#f9f9f9),to(#e0e0e0));}#wp-fullscreen-modes a:first-child{border-width:1px;-moz-border-radius:3px 0 0 3px;-webkit-border-top-left-radius:3px;-webkit-border-bottom-left-radius:3px;-khtml-border-top-left-radius:3px;-khtml-border-bottom-left-radius:3px;border-top-left-radius:3px;border-bottom-left-radius:3px;}#wp-fullscreen-modes a:last-child{-moz-border-radius:0 3px 3px 0;-webkit-border-top-right-radius:3px;-webkit-border-bottom-right-radius:3px;-khtml-border-top-right-radius:3px;-khtml-border-bottom-right-radius:3px;border-top-right-radius:3px;border-bottom-right-radius:3px;}#wp-fullscreen-buttons .active a{background:inherit;}#wp-fullscreen-buttons .hidden{display:none;}#wp-fullscreen-buttons .disabled{opacity:.5;}.wp-html-mode #wp-fullscreen-buttons div{display:none;}.wp-html-mode #wp-fullscreen-buttons div.wp-fullscreen-both{display:block;}#fullscreen-topbar.fullscreen-make-sticky{display:block!important;}#wp-fullscreen-save img{vertical-align:middle;}#wp-fullscreen-save img,#wp-fullscreen-save span{padding-right:4px;display:none;}#wp-fullscreen-buttons .mce_image .mce_image{background-image:url("../images/menu.png?ver=20100531");background-position:-124px -38px;}#wp-fullscreen-buttons .mce_image .mce_image:hover{background-position:-124px -6px;}.fullscreen-active #TB_overlay{z-index:150100;}.fullscreen-active #TB_window{z-index:150102;}#wp_mce_fullscreen_ifr{background:transparent;}#wp_mce_fullscreen_parent #wp_mce_fullscreen_tbl tr.mceFirst{display:none;}#wp-fullscreen-container .wp_themeSkin table td{vertical-align:top;}#wphead-info{margin:0 0 0 15px;}#user_info{float:right;font-size:12px;line-height:26px;height:25px;position:relative;z-index:49;border-style:solid;border-width:0;margin-top:3px;padding:0 2px 0 6px;}#user_info.active{border-width:1px;margin-right:-1px;margin-top:2px;-moz-border-radius:3px 3px 0 0;-webkit-border-top-right-radius:3px;-webkit-border-top-left-radius:3px;-khtml-border-top-right-radius:3px;-khtml-border-top-left-radius:3px;border-top-right-radius:3px;border-top-left-radius:3px;}#user_info p{margin:0;padding:0;line-height:25px;cursor:pointer;}#user_info .hide-if-no-js p{margin:0 20px 0 0;}#user_info:hover .hide-if-no-js p{text-decoration:underline;}#user_info.active .hide-if-no-js p{text-decoration:none;}#user_info_arrow{height:22px;width:22px;position:absolute;right:3px;top:0;cursor:pointer;}#user_info_links_wrap{min-width:100px;width:100%;position:absolute;top:25px;right:0;padding:0;text-shadow:rgba(255,255,255,0.7) 0 1px 0;}#user_info_links{position:absolute;left:-1px;right:-1px;overflow:hidden;}#user_info.active #user_info_links ul{margin-top:0;-moz-transition:margin-top 200ms;-webkit-transition:margin-top 200ms;-o-transition:margin-top 200ms;transition:margin-top 200ms;}#user_info_links ul{border-width:1px;border-style:solid;margin-top:-1000px;-moz-transition:margin-top 500ms ease-in;-webkit-transition:margin-top 500ms ease-in;-o-transition:margin-top 500ms ease-in;transition:margin-top 500ms ease-in;}#user_info_links,#user_info_links ul,#user_info_links li:last-child{-moz-border-radius:0 0 3px 3px;-webkit-border-bottom-right-radius:3px;-webkit-border-bottom-left-radius:3px;-khtml-border-bottom-right-radius:3px;-khtml-border-bottom-left-radius:3px;border-bottom-right-radius:3px;border-bottom-left-radius:3px;}#user_info_links li{display:block;margin:0;}#user_info_links a{display:block;padding:6px 8px;}#wphead{height:32px;margin-right:20px;margin-left:2px;}#wphead a,#adminmenu a,#sidemenu a,#taglist a,#catlist a,#show-settings a{text-decoration:none;}#header-logo{float:left;margin:7px 0;-webkit-user-select:none;-moz-user-select:none;-khtml-user-select:none;user-select:none;}#wphead h1{font:normal 16px Georgia,"Times New Roman","Bitstream Charter",Times,serif;padding:6px 8px 5px;margin:0;float:left;}#wphead h1 a:hover{text-decoration:none;}#wphead h1 a:hover #site-title{text-decoration:underline;}#favorite-actions{margin:0 12px 0 15px;min-width:130px;position:relative;display:inline-block;top:-1px;}#favorite-first{-moz-border-radius:12px;-khtml-border-radius:12px;-webkit-border-radius:12px;border-radius:12px;line-height:15px;padding:0 30px 0 0;border-width:1px;border-style:solid;}#favorite-inside{margin:0;padding:2px 1px;border-width:1px;border-style:solid;position:absolute;z-index:11;display:none;-moz-border-radius:0 0 12px 12px;-webkit-border-bottom-right-radius:12px;-webkit-border-bottom-left-radius:12px;-khtml-border-bottom-right-radius:12px;-khtml-border-bottom-left-radius:12px;border-bottom-right-radius:12px;border-bottom-left-radius:12px;}#favorite-first a{padding:2px 0 2px 12px;}#favorite-actions a{display:block;text-decoration:none;font-size:11px;}#favorite-inside a{padding:3px 5px 3px 10px;line-height:20px;}#favorite-toggle{height:18px;position:absolute;right:0;top:1px;width:28px;border-width:0 0 0 1px;border-style:solid;}#favorite-actions .slide-down{-moz-border-radius:12px 12px 0 0;-webkit-border-bottom-right-radius:0;-webkit-border-bottom-left-radius:0;-khtml-border-bottom-right-radius:0;-khtml-border-bottom-left-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:0;border-bottom:none;}#screen-meta{position:relative;clear:both;}#screen-meta-links{margin:0 24px 0 0;}#screen-meta .screen-reader-text{visibility:hidden;}#screen-options-link-wrap,#contextual-help-link-wrap{float:right;height:22px;padding:0;margin:0 0 0 6px;font-family:sans-serif;-moz-border-radius-bottomleft:3px;-moz-border-radius-bottomright:3px;-webkit-border-bottom-left-radius:3px;-webkit-border-bottom-right-radius:3px;border-bottom-left-radius:3px;border-bottom-right-radius:3px;}#contextual-help-wrap li{list-style-type:disc;margin-left:18px;}.toggle-arrow{background-repeat:no-repeat;background-position:top left;background-color:transparent;height:22px;line-height:22px;display:block;}.toggle-arrow-active{background-position:bottom left;}#screen-meta a.show-settings{text-decoration:none;z-index:1;padding:0 16px 0 6px;height:22px;line-height:22px;font-size:12px;display:block;text-shadow:rgba(255,255,255,0.7) 0 1px 0;}#screen-meta a.show-settings:hover{text-decoration:none;}#screen-options-wrap h5,#contextual-help-wrap h5{margin:8px 0;font-size:13px;}#screen-options-wrap,#contextual-help-wrap{border-style:none solid solid;border-top:0 none;border-width:0 1px 1px;margin:0 20px 0 0;padding:8px 12px 12px;}.metabox-prefs label{display:inline-block;padding-right:15px;white-space:nowrap;line-height:30px;}.metabox-prefs label input{margin:0 5px 0 2px;}.metabox-prefs label a{display:none;}#adminmenuback,#adminmenuwrap{border-width:0 1px 0 0;border-style:solid;}#adminmenuwrap{position:relative;}#adminmenushadow{position:absolute;top:0;right:0;bottom:0;width:6px;z-index:20;}#adminmenu *{-webkit-user-select:none;-moz-user-select:none;-khtml-user-select:none;user-select:none;}#adminmenu .wp-submenu{display:none;list-style:none;padding:0;margin:0;position:relative;z-index:2;}#adminmenu .wp-submenu a{font-size:12px;line-height:18px;}#adminmenu .wp-submenu li.current,#adminmenu .wp-submenu li.current a,#adminmenu .wp-submenu li.current a:hover{font-weight:bold;}#adminmenu a.menu-top,#adminmenu .wp-submenu-head{font-size:13px;line-height:18px;}#adminmenu div.wp-submenu-head{display:none;}.js.folded #adminmenu div.wp-submenu-head{display:block;}.js.folded #adminmenu a.menu-top,body.no-js #adminmenu .wp-menu-toggle,.js.folded #adminmenu div.wp-menu-toggle{display:none;}body.js #adminmenu li.wp-menu-open .wp-submenu,body.no-js #adminmenu .open-if-no-js .wp-submenu,body.no-js #adminmenu li.wp-has-current-submenu .wp-submenu{display:block;}#adminmenu div.wp-menu-image{float:left;width:28px;height:28px;}.js.folded #adminmenu div.wp-menu-image{width:32px;}#adminmenu li{margin:0;padding:0;cursor:pointer;}#adminmenu a{display:block;line-height:18px;padding:2px 5px;}#adminmenu li.menu-top{min-height:26px;position:relative;}#adminmenu a.menu-top{font-weight:bold;line-height:18px;min-width:10em;padding:5px 5px;border-width:1px 0 1px;border-style:solid;}#adminmenu li.wp-menu-open{border-width:0 0 1px;border-style:solid;}#adminmenu .wp-submenu a{margin:0;padding-left:12px;}.wp-menu-arrow{display:none;}#adminmenu li.wp-has-current-submenu .wp-menu-arrow,#adminmenu li.menu-top.current .wp-menu-arrow{display:block;position:absolute;right:-9px;top:0;cursor:auto;z-index:25;}#adminmenu .wp-menu-arrow div{width:15px;height:30px;background:url(../images/menu-arrow-frame.png) top right no-repeat;}#adminmenu .wp-submenu li{padding:0;margin:0;}.js.folded #adminmenu li.menu-top{width:32px;height:29px;border-width:1px 0;border-style:solid;}#adminmenu .wp-menu-image img{float:left;padding:8px 6px 0;opacity:.6;filter:alpha(opacity=60);}#adminmenu li.menu-top:hover .wp-menu-image img,#adminmenu li.wp-has-current-submenu .wp-menu-image img{opacity:1;filter:alpha(opacity=100);}#adminmenu li.wp-menu-separator{height:3px;padding:0;margin:0;border-width:1px 0;border-style:solid;cursor:inherit;}#adminmenu div.separator{height:1px;padding:0;border-width:1px 0 0 0;border-style:solid;}.js.folded #adminmenu .wp-submenu{display:block;position:absolute;top:-5px;left:26px;z-index:999;width:0;padding:0;overflow:hidden;-moz-transition:width 200ms ease-out;-webkit-transition:width 200ms ease-out;-o-transition:width 200ms ease-out;transition:width 200ms ease-out;}.js.folded #adminmenu .wp-submenu.sub-open{padding:0 8px 8px 0;}#adminmenu .wp-submenu .wp-submenu-head{padding:6px 4px 5px 10px;cursor:default;border-width:1px 0;border-style:solid;}.js.folded #adminmenu .wp-submenu-wrap{margin-top:4px;border-width:0 1px 1px 0;border-style:solid;position:relative;-webkit-border-bottom-right-radius:3px;-webkit-border-top-right-radius:3px;-khtml-border-bottom-right-radius:3px;-khtml-border-top-right-radius:3px;-moz-border-radius-bottomright:3px;-moz-border-radius-topright:3px;border-bottom-right-radius:3px;border-top-right-radius:3px;}.js.folded #adminmenu .wp-submenu ul{border-width:0 0 0 1px;border-style:solid;}.js.folded #adminmenu .wp-submenu a{padding-left:10px;}.js.folded #adminmenu a.wp-has-submenu{margin-left:40px;}#adminmenu .wp-menu-toggle{width:18px;clear:right;float:right;margin:1px 0 0;height:27px;padding:1px 2px 0 0;cursor:pointer;}#adminmenu .wp-menu-image a{height:24px;}#adminmenu .wp-menu-image img{padding:6px 0 0 1px;}#adminmenu .awaiting-mod,#adminmenu span.update-plugins,#sidemenu li a span.update-plugins{position:absolute;font-family:sans-serif;font-size:9px;line-height:17px;font-weight:bold;margin-top:1px;margin-left:7px;-moz-border-radius:10px;-khtml-border-radius:10px;-webkit-border-radius:10px;border-radius:10px;}#adminmenu li .awaiting-mod span,#adminmenu li span.update-plugins span,#sidemenu li a span.update-plugins span{display:block;padding:0 6px;}#adminmenu li span.count-0,#sidemenu li a .count-0{display:none;}.post-com-count-wrapper{min-width:22px;font-family:sans-serif;}.post-com-count{height:1.3em;line-height:1.1em;display:block;text-decoration:none;padding:0 0 6px;cursor:pointer;background-position:center -80px;background-repeat:no-repeat;}.post-com-count span{font-size:11px;font-weight:bold;height:1.4em;line-height:1.4em;min-width:.7em;padding:0 6px;display:inline-block;cursor:pointer;-moz-border-radius:5px;-khtml-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;}strong .post-com-count{background-position:center -55px;}.post-com-count:hover{background-position:center -3px;}.column-response .post-com-count{float:left;margin-right:5px;text-align:center;}.response-links{float:left;}#the-comment-list .attachment-80x60{padding:4px 8px;}#collapse-menu{font-size:12px;line-height:34px;}.js.folded #collapse-menu span{display:none;}#collapse-button,#collapse-button div{width:15px;height:15px;}#collapse-button{float:left;margin:8px 6px;border-width:1px;border-style:solid;-moz-border-radius:10px;-khtml-border-radius:10px;-webkit-border-radius:10px;border-radius:10px;}body.wp-admin{min-width:785px;}body.admin-bar #wphead,body.admin-bar #adminmenu{padding-top:28px;}.narrow{width:70%;margin-bottom:40px;}.narrow p{line-height:150%;}.widefat th,.widefat td{overflow:hidden;}.widefat th{font-family:Georgia,"Times New Roman","Bitstream Charter",Times,serif;font-weight:normal;}.widefat td p{margin:2px 0 .8em;}.widefat .column-comment p{margin:.6em 0;}.postbox-container{float:left;padding-right:.5%;}.postbox-container .meta-box-sortables{min-height:300px;}.postbox .hndle{cursor:move;}.hndle a{font-size:11px;font-weight:normal;}.postbox .handlediv{float:right;width:27px;height:30px;cursor:pointer;}.sortable-placeholder{border-width:1px;border-style:dashed;margin-bottom:20px;}.widget,.postbox,.stuffbox{margin-bottom:20px;padding:0;border-width:1px;border-style:solid;line-height:1;}.widget .widget-top,.postbox h3,.stuffbox h3{margin-top:1px;border-bottom-width:1px;border-style:solid;cursor:move;-webkit-user-select:none;-moz-user-select:none;-khtml-user-select:none;user-select:none;}.postbox .inside,.stuffbox .inside{padding:0 10px;}.postbox.closed h3{border:none;-moz-box-shadow:none;-webkit-box-shadow:none;box-shadow:none;}.postbox table.form-table{margin-bottom:0;}.postbox input[type="text"],.postbox textarea,.stuffbox input[type="text"],.stuffbox textarea{border-width:1px;border-style:solid;}.temp-border{border:1px dotted #ccc;}.columns-prefs label{padding:0 5px;}#wpbody-content .metabox-holder{padding-top:10px;}#dashboard-widgets .meta-box-sortables{margin:0 5px;}#dashboard_recent_comments div.undo{border-top-style:solid;border-top-width:1px;margin:0 -10px;padding:3px 8px;font-size:11px;}#the-comment-list td.comment p.comment-author{margin-top:0;margin-left:0;}#the-comment-list p.comment-author img{float:left;margin-right:8px;}#the-comment-list p.comment-author strong a{border:none;}#the-comment-list td{vertical-align:top;}#the-comment-list td.comment{word-wrap:break-word;}table.fixed{table-layout:fixed;}.fixed .column-rating,.fixed .column-visible{width:8%;}.fixed .column-date,.fixed .column-parent,.fixed .column-links{width:10%;}.fixed .column-response,.fixed .column-author,.fixed .column-categories,.fixed .column-tags,.fixed .column-rel,.fixed .column-role{width:15%;}.fixed .column-comments{width:4em;padding:8px 0;text-align:left;}.fixed .column-comments .vers{padding-left:3px;}.fixed .column-comments a{float:left;}.fixed .column-slug{width:25%;}.fixed .column-posts{width:10%;}.fixed .column-icon{width:80px;}#commentsdiv .fixed .column-author,#comments-form .fixed .column-author{width:20%;}#commentsdiv.postbox .inside{line-height:1.4em;margin:0;padding:0;}#commentsdiv.postbox .inside .row-actions{line-height:18px;}#commentsdiv.postbox .inside td{padding:1em 10px;}#commentsdiv.postbox .inside .column-author{width:33%;}#commentsdiv.postbox .inside p{margin:6px 10px 8px;}#commentsdiv.postbox .column-comment p{margin:.6em 0;}#commentsdiv.postbox #replyrow td{padding:0;}.sorting-indicator{display:none;width:7px;height:4px;margin-top:8px;margin-left:7px;background-image:url(../images/sort.gif);background-repeat:no-repeat;}.fixed .column-comments .sorting-indicator{margin-top:3px;}.widefat th.sortable,.widefat th.sorted{padding:0;}th.sortable a,th.sorted a{display:block;overflow:hidden;padding:7px 7px 8px;}.fixed .column-comments.sortable a,.fixed .column-comments.sorted a{padding:8px 0;}th.sortable a span,th.sorted a span{float:left;cursor:pointer;}th.sorted.asc .sorting-indicator,th.desc:hover span.sorting-indicator{display:block;background-position:0 0;}th.sorted.desc .sorting-indicator,th.asc:hover span.sorting-indicator{display:block;background-position:-7px 0;}.tablenav-pages a{border-bottom-style:solid;border-bottom-width:2px;font-weight:bold;margin-right:1px;padding:0 2px;}.tablenav-pages .current-page{text-align:center;}.tablenav-pages .next-page{margin-left:2px;}.tablenav a.button-secondary{display:block;margin:3px 8px 0 0;}.tablenav{clear:both;height:30px;margin:6px 0 4px;vertical-align:middle;}.tablenav .tablenav-pages{float:right;display:block;cursor:default;height:30px;line-height:30px;font-size:12px;}.tablenav .no-pages,.tablenav .one-page .pagination-links{display:none;}.tablenav .tablenav-pages a,.tablenav-pages span.current{text-decoration:none;border:none;padding:3px 6px;border-width:1px;border-style:solid;-moz-border-radius:3px;-khtml-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;}.tablenav .tablenav-pages a.disabled:hover{cursor:default;}.tablenav .tablenav-pages a.disabled:active{cursor:default;}.tablenav .displaying-num{margin-right:10px;font-size:12px;font-family:Georgia,"Times New Roman","Bitstream Charter",Times,serif;font-style:italic;}.tablenav .actions{padding:2px 8px 0 0;}.tablenav .delete{margin-right:20px;}.view-switch{float:right;margin:6px 8px 0;}.view-switch a{text-decoration:none;}.filter{float:left;margin:-5px 0 0 10px;}.filter .subsubsub{margin-left:-10px;margin-top:13px;}.screen-per-page{width:3em;}#posts-filter fieldset{float:left;margin:0 1.5ex 1em 0;padding:0;}#posts-filter fieldset legend{padding:0 0 .2em 1px;}span.post-state-format{font-weight:normal;}tr.inline-edit-row td{padding:0 .5em;}#wpbody-content .inline-edit-row fieldset{font-size:12px;float:left;margin:0;padding:0;width:100%;}#wpbody-content .inline-edit-row fieldset .inline-edit-col{padding:0 .5em;}#wpbody-content .quick-edit-row-page fieldset.inline-edit-col-right .inline-edit-col{border-width:0 0 0 1px;border-style:none none none solid;}#wpbody-content .quick-edit-row-post .inline-edit-col-left{width:40%;}#wpbody-content .quick-edit-row-post .inline-edit-col-right{width:39%;}#wpbody-content .inline-edit-row-post .inline-edit-col-center{width:20%;}#wpbody-content .quick-edit-row-page .inline-edit-col-left{width:50%;}#wpbody-content .quick-edit-row-page .inline-edit-col-right,#wpbody-content .bulk-edit-row-post .inline-edit-col-right{width:49%;}#wpbody-content .bulk-edit-row .inline-edit-col-left{width:30%;}#wpbody-content .bulk-edit-row-page .inline-edit-col-right{width:69%;}#wpbody-content .bulk-edit-row .inline-edit-col-bottom{float:right;width:69%;}#wpbody-content .inline-edit-row-page .inline-edit-col-right{margin-top:27px;}.inline-edit-row fieldset .inline-edit-group{clear:both;}.inline-edit-row fieldset .inline-edit-group:after{content:".";display:block;height:0;clear:both;visibility:hidden;}.inline-edit-row p.submit{clear:both;padding:.5em;margin:.5em 0 0;}.inline-edit-row span.error{line-height:22px;margin:0 15px;padding:3px 5px;}.inline-edit-row h4{margin:.2em 0;padding:0;line-height:23px;}.inline-edit-row fieldset span.title,.inline-edit-row fieldset span.checkbox-title{margin:0;padding:0;line-height:27px;}.inline-edit-row fieldset label,.inline-edit-row fieldset span.inline-edit-categories-label{display:block;margin:.2em 0;}.inline-edit-row fieldset label.inline-edit-tags{margin-top:0;}.inline-edit-row fieldset label.inline-edit-tags span.title{margin:.2em 0;}.inline-edit-row fieldset label span.title{display:block;float:left;width:5em;}.inline-edit-row fieldset label span.input-text-wrap{display:block;margin-left:5em;}.quick-edit-row-post fieldset.inline-edit-col-right label span.title{width:auto;padding-right:.5em;}.inline-edit-row .input-text-wrap input[type=text]{width:100%;}.inline-edit-row fieldset label input[type=checkbox]{vertical-align:text-bottom;}.inline-edit-row fieldset label textarea{width:100%;height:4em;}#wpbody-content .bulk-edit-row fieldset .inline-edit-group label{max-width:50%;}#wpbody-content .quick-edit-row fieldset .inline-edit-group label.alignleft:first-child{margin-right:.5em;}.inline-edit-col-right .input-text-wrap input.inline-edit-menu-order-input{width:6em;}.inline-edit-row h4{text-transform:uppercase;}.inline-edit-row fieldset span.title,.inline-edit-row fieldset span.checkbox-title{font-family:Georgia,"Times New Roman","Bitstream Charter",Times,serif;font-style:italic;line-height:1.8em;}.inline-edit-row fieldset input[type="text"],.inline-edit-row fieldset textarea{border-style:solid;border-width:1px;}.inline-edit-row fieldset .inline-edit-date{float:left;}.inline-edit-row fieldset input[name=jj],.inline-edit-row fieldset input[name=hh],.inline-edit-row fieldset input[name=mn]{font-size:12px;width:2.1em;}.inline-edit-row fieldset input[name=aa]{font-size:12px;width:3.5em;}.inline-edit-row fieldset label input.inline-edit-password-input{width:8em;}.inline-edit-row .catshow,.inline-edit-row .cathide{cursor:pointer;}ul.cat-checklist{height:12em;border-style:solid;border-width:1px;overflow-y:scroll;padding:0 5px;margin:0;}#bulk-titles{display:block;height:12em;border-style:solid;border-width:1px;overflow-y:scroll;padding:0 5px;margin:0 0 5px;}.inline-edit-row fieldset ul.cat-checklist li,.inline-edit-row fieldset ul.cat-checklist input{margin:0;}.inline-edit-row fieldset ul.cat-checklist label,.inline-edit-row .catshow,.inline-edit-row .cathide,.inline-edit-row #bulk-titles div{font-family:sans-serif;font-style:normal;font-size:11px;}table .inline-edit-row fieldset ul.cat-hover{height:auto;max-height:30em;overflow-y:auto;position:absolute;}.inline-edit-row fieldset label input.inline-edit-menu-order-input{width:3em;}.inline-edit-row fieldset label input.inline-edit-slug-input{width:75%;}.quick-edit-row-post fieldset label.inline-edit-status{float:left;}#bulk-titles{line-height:140%;}#bulk-titles div{margin:.2em .3em;}#bulk-titles div a{cursor:pointer;display:block;float:left;height:10px;margin:3px 3px 0 -2px;overflow:hidden;position:relative;text-indent:-9999px;width:10px;}#titlediv{position:relative;margin-bottom:20px;}#titlediv label{cursor:text;}#titlediv div.inside{margin:0;}#poststuff #titlewrap{border:0;padding:0;}#titlediv #title{padding:3px 4px;border-width:1px;border-style:solid;-moz-border-radius:3px;-khtml-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;font-size:1.7em;line-height:100%;width:100%;outline:none;}#titlediv #title-prompt-text,#wp-fullscreen-title-prompt-text{color:#bbb;position:absolute;font-size:1.7em;padding:8px;}#wp-fullscreen-title-prompt-text{left:0;padding:11px;}#poststuff .inside-submitbox,#side-sortables .inside-submitbox{margin:0 3px;font-size:11px;}input#link_description,input#link_url{width:98%;}#pending{background:0 none;border:0 none;padding:0;font-size:11px;margin-top:-1px;}#edit-slug-box{height:1em;margin-top:8px;padding:0 7px;}#editable-post-name-full{display:none;}#editable-post-name input{width:16em;}.postarea h3 label{float:left;}.postarea #add-media-button{float:right;margin:7px 0 0;position:relative;right:10px;}#poststuff #editor-toolbar{height:30px;}.wp_themeSkin tr.mceFirst td.mceToolbar{border-width:0 0 1px;border-style:none none solid;}#edButtonPreview,#edButtonHTML{height:18px;margin:5px 5px 0 0;padding:4px 5px 2px;float:right;cursor:pointer;border-width:1px;border-style:solid;-moz-border-radius:3px 3px 0 0;-webkit-border-top-right-radius:3px;-webkit-border-top-left-radius:3px;-khtml-border-top-right-radius:3px;-khtml-border-top-left-radius:3px;border-top-right-radius:3px;border-top-left-radius:3px;}.js .theEditor{color:white;}#poststuff #edButtonHTML{margin-right:15px;}#media-buttons{cursor:default;padding:8px 8px 0;}#media-buttons a{cursor:pointer;padding:0 0 5px 10px;}#media-buttons img,#submitpost #ajax-loading,#submitpost .ajax-loading{vertical-align:middle;}#wpcontent .ajax-loading{visibility:hidden;}.submitbox .submit{text-align:left;padding:12px 10px 10px;font-size:11px;}.submitbox .submitdelete{border-bottom-width:1px;border-bottom-style:solid;text-decoration:none;padding:1px 2px;}.inside-submitbox #post_status{margin:2px 0 2px -2px;}.submitbox .submit a:hover{border-bottom-width:1px;border-bottom-style:solid;}.submitbox .submit input{margin-bottom:8px;margin-right:4px;padding:6px;}#post-status-select,#post-format{line-height:2.5em;margin-top:3px;}#post-body #normal-sortables{min-height:50px;}#post-body #advanced-sortables{min-height:20px;}.postbox{-moz-border-radius:3px;-webkit-border-radius:3px;-khtml-border-radius:3px;border-radius:3px;position:relative;min-width:255px;}#trackback_url{width:99%;}#normal-sortables .postbox .submit{background:transparent none;border:0 none;float:right;padding:0 12px;margin:0;}#side-sortables .category-add input{width:94%;}#side-sortables .category-add select{width:100%;}#side-sortables .category-add input.category-add-sumbit,#post-body .category-add input.category-add input.category-add-sumbit{width:auto;}#post-body ul.category-tabs,#post-body ul.add-menu-item-tabs{float:left;width:120px;text-align:right;margin:0 -120px 0 5px;padding:0;}#post-body ul.category-tabs li,#post-body ul.add-menu-item-tabs li{padding:8px;}#post-body ul.category-tabs li.tabs,#post-body ul.add-menu-item-tabs li.tabs{-moz-border-radius:3px 0 0 3px;-webkit-border-top-left-radius:3px;-webkit-border-bottom-left-radius:3px;-khtml-border-top-left-radius:3px;-khtml-border-bottom-left-radius:3px;border-top-left-radius:3px;border-bottom-left-radius:3px;}#post-body ul.category-tabs li.tabs a,#post-body ul.add-menu-item-tabs li.tabs a{font-weight:bold;text-decoration:none;}.wp-tab-panel,.categorydiv div.tabs-panel,.customlinkdiv div.tabs-panel,.posttypediv div.tabs-panel,.taxonomydiv div.tabs-panel,#linkcategorydiv div.tabs-panel{height:200px;overflow:auto;padding:.5em .9em;border-style:solid;border-width:1px;}.nav-menus-php .customlinkdiv div.tabs-panel,.nav-menus-php .posttypediv div.tabs-panel,.nav-menus-php .taxonomydiv div.tabs-panel{height:auto;max-height:205px;}div.tabs-panel-active{display:block;}div.tabs-panel-inactive{display:none;}#post-body .categorydiv div.tabs-panel,.taxonomy div.tabs-panel,#post-body #linkcategorydiv div.tabs-panel{margin:0 5px 0 125px;}#side-sortables .category-tabs li,#side-sortables .add-menu-item-tabs li,.wp-tab-bar li{display:inline;line-height:1.35em;}#side-sortables .category-tabs a,#side-sortables .add-menu-item-tabs a,.wp-tab-bar a{text-decoration:none;}#side-sortables .category-tabs,#side-sortables .add-menu-item-tabs,.wp-tab-bar{margin-bottom:3px;}.categorydiv ul,.customlinkdiv ul,.posttypediv ul,.taxonomydiv ul,#linkcategorydiv ul{list-style:none;padding:0;margin:0;}#normal-sortables .postbox #replyrow .submit{float:none;margin:0;padding:3px 7px;}#side-sortables .submitbox .submit input,#side-sortables .submitbox .submit .preview,#side-sortables .submitbox .submit a.preview:hover{border:0 none;}#side-sortables .inside-submitbox .insidebox,.stuffbox .insidebox{margin:11px 0;}#side-sortables .comments-box,#normal-sortables .comments-box{border:0 none;}ul.category-tabs,ul.add-menu-item-tabs,ul.wp-tab-bar{margin-top:12px;}#side-sortables .comments-box thead th,#normal-sortables .comments-box thead th{background:transparent;padding:0 7px 4px;font-style:italic;}ul.category-tabs li.tabs,ul.add-menu-item-tabs li.tabs,.wp-tab-active{border-style:solid solid none;border-width:1px 1px 0;}#commentsdiv img.waiting{padding-left:5px;}#post-body .category-tabs li.tabs,#post-body .add-menu-item-tabs li.tabs{border-style:solid none solid solid;border-width:1px 0 1px 1px;margin-right:-1px;}ul.category-tabs li,ul.add-menu-item-tabs li,ul.wp-tab-bar li{padding:5px;-moz-border-radius:3px 3px 0 0;-webkit-border-top-left-radius:3px;-webkit-border-top-right-radius:3px;-khtml-border-top-left-radius:3px;-khtml-border-top-right-radius:3px;border-top-left-radius:3px;border-top-right-radius:3px;}form#tags-filter{position:relative;}.screen-per-page{width:3em;}#posts-filter fieldset{float:left;margin:0 1.5ex 1em 0;padding:0;}#posts-filter fieldset legend{padding:0 0 .2em 1px;}td.post-title strong,td.plugin-title strong{display:block;margin-bottom:.2em;}td.post-title p,td.plugin-title p{margin:6px 0;}.wp-hidden-children .wp-hidden-child,.ui-tabs-hide{display:none;}.commentlist .avatar{vertical-align:text-top;}#post-body .tagsdiv #newtag{margin-right:5px;width:16em;}#side-sortables input#post_password{width:94%;}#side-sortables .tagsdiv #newtag{width:68%;}#post-status-info{border-width:0 1px 1px;border-style:none solid solid;width:100%;-moz-border-radius:0 0 3px 3px;-webkit-border-bottom-left-radius:3px;-webkit-border-bottom-right-radius:3px;-khtml-border-bottom-left-radius:3px;-khtml-border-bottom-right-radius:3px;border-bottom-left-radius:3px;border-bottom-right-radius:3px;}#post-status-info td{font-size:12px;}.autosave-info{padding:2px 15px 2px 2px;text-align:right;}#editorcontent #post-status-info{border:none;}#post-body .wp_themeSkin .mceStatusbar a.mceResize{display:block;background:transparent url(../images/resize.gif) no-repeat scroll right bottom;width:12px;cursor:se-resize;margin:0 2px;position:relative;top:22px;}#wp-word-count{display:block;padding:2px 7px;}#timestampdiv select{height:20px;line-height:14px;padding:0;vertical-align:top;}#jj,#hh,#mn{width:2em;padding:1px;font-size:12px;}#aa{width:3.4em;padding:1px;font-size:12px;}.curtime #timestamp{background-repeat:no-repeat;background-position:left top;padding-left:18px;}#timestampdiv{padding-top:5px;line-height:23px;}#timestampdiv p{margin:8px 0 6px;}#timestampdiv input{border-width:1px;border-style:solid;}#postcustomstuff table,#postcustomstuff input,#postcustomstuff textarea{border-width:1px;border-style:solid;-moz-border-radius:3px;-khtml-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;}#postcustomstuff .updatemeta,#postcustomstuff .deletemeta{margin:auto;}#postcustomstuff thead th{padding:5px 8px 8px;}#postcustom #postcustomstuff .submit{border:0 none;float:none;padding:5px 8px;}#side-sortables #postcustom #postcustomstuff .submit{padding:0 5px;}#side-sortables #postcustom #postcustomstuff td.left input{margin:3px 3px 0;}#side-sortables #postcustom #postcustomstuff #the-list textarea{height:85px;margin:3px;}#postcustomstuff table{margin:0;width:100%;border-width:1px;border-style:solid;border-spacing:0;}#postcustomstuff table input,#postcustomstuff table select,#postcustomstuff table textarea{width:95%;margin:8px 0 8px 8px;}#postcustomstuff th.left,#postcustomstuff td.left{width:38%;}#postcustomstuff .submit input{width:auto;}#postcustomstuff #newmeta .submit{padding:0 8px;}#postcustomstuff table #addmetasub{width:auto;}#postcustomstuff #newmetaleft{vertical-align:top;}#postcustomstuff #newmetaleft a{padding:0 10px;text-decoration:none;}table.diff{width:100%;}table.diff col.content{width:50%;}table.diff tr{background-color:transparent;}table.diff td,table.diff th{padding:.5em;font-family:Consolas,Monaco,monospace;border:none;}table.diff .diff-deletedline del,table.diff .diff-addedline ins{text-decoration:none;}.category-adder{margin-left:120px;padding:4px 0;}.category-adder h4{margin:0 0 8px;}#side-sortables .category-adder{margin:0;}#post-body .category-add input,.category-add select{width:30%;}#side-sortables .category-add select{width:100%;}#side-sortables .category-add input.category-add-sumbit,#post-body .category-add input.category-add input.category-add-sumbit{width:auto;}#post-body ul.category-tabs,#post-body ul.add-menu-item-tabs{float:left;width:120px;text-align:right;margin:0 -120px 0 5px;padding:0;}#post-body ul.category-tabs li,#post-body ul.add-menu-item-tabs li{padding:8px;}#post-body ul.category-tabs li.tabs,#post-body ul.add-menu-item-tabs li.tabs{-moz-border-radius:3px 0 0 3px;-webkit-border-top-left-radius:3px;-webkit-border-bottom-left-radius:3px;-khtml-border-top-left-radius:3px;-khtml-border-bottom-left-radius:3px;border-top-left-radius:3px;border-bottom-left-radius:3px;}#post-body ul.category-tabs li.tabs a,#post-body ul.add-menu-item-tabs li.tabs a{font-weight:bold;text-decoration:none;}.categorydiv div.tabs-panel,.customlinkdiv div.tabs-panel,.posttypediv div.tabs-panel,.taxonomydiv div.tabs-panel,#linkcategorydiv div.tabs-panel{height:200px;overflow:auto;padding:.5em .9em;border-style:solid;border-width:1px;}.nav-menus-php .customlinkdiv div.tabs-panel,.nav-menus-php .posttypediv div.tabs-panel,.nav-menus-php .taxonomydiv div.tabs-panel{height:auto;max-height:205px;}div.tabs-panel-active{display:block;}div.tabs-panel-inactive{display:none;}#post-body .categorydiv div.tabs-panel,.taxonomy div.tabs-panel,#post-body #linkcategorydiv div.tabs-panel{margin:0 5px 0 125px;}.categorydiv ul,.customlinkdiv ul,.posttypediv ul,.taxonomydiv ul,#linkcategorydiv ul{list-style:none;padding:0;margin:0;}#front-page-warning,#front-static-pages ul,ul.export-filters,.inline-editor ul.cat-checklist ul,.categorydiv ul.categorychecklist ul,.customlinkdiv ul.categorychecklist ul,.posttypediv ul.categorychecklist ul,.taxonomydiv ul.categorychecklist ul,#linkcategorydiv ul.categorychecklist ul{margin-left:18px;}ul.categorychecklist li{margin:0;padding:0;line-height:19px;word-wrap:break-word;}.categorydiv .tabs-panel,.customlinkdiv .tabs-panel,.posttypediv .tabs-panel,.taxonomydiv .tabs-panel{border-width:3px;border-style:solid;}ul.category-tabs,ul.add-menu-item-tabs{margin-top:12px;}ul.category-tabs li.tabs,ul.add-menu-item-tabs li.tabs{border-style:solid solid none;border-width:1px 1px 0;}#post-body .category-tabs li.tabs,#post-body .add-menu-item-tabs li.tabs{border-style:solid none solid solid;border-width:1px 0 1px 1px;margin-right:-1px;}ul.category-tabs li,ul.add-menu-item-tabs li{padding:5px;-moz-border-radius:3px 3px 0 0;-webkit-border-top-left-radius:3px;-webkit-border-top-right-radius:3px;-khtml-border-top-left-radius:3px;-khtml-border-top-right-radius:3px;border-top-left-radius:3px;border-top-right-radius:3px;}.form-wrap{margin:10px 0;width:97%;}.form-wrap p,.form-wrap label{font-size:11px;}.form-wrap label{display:block;padding:2px;font-size:12px;}.form-field input,.form-field textarea{border-style:solid;border-width:1px;width:95%;}p.description,.form-wrap p{margin:2px 0 5px;}p.help,p.description,span.description,.form-wrap p{font-size:12px;font-style:italic;font-family:sans-serif;}.form-wrap .form-field{margin:0 0 10px;padding:8px;}.col-wrap h3{margin:12px 0;font-size:1.1em;}.col-wrap p.submit{margin-top:-10px;}.taghint{color:#aaa;margin:15px 0 -24px 12px;}#poststuff .tagsdiv .howto{margin:0 0 6px 8px;}.ajaxtag .newtag{position:relative;}.tagsdiv .newtag{width:180px;}.tagsdiv .the-tags{display:block;height:60px;margin:0 auto;overflow:auto;width:260px;}#post-body-content .tagsdiv .the-tags{margin:0 5px;}p.popular-tags{-moz-border-radius:8px;-khtml-border-radius:8px;-webkit-border-radius:8px;border-radius:8px;border-width:1px;border-style:solid;line-height:2em;padding:8px 12px 12px;text-align:justify;}p.popular-tags a{padding:0 3px;}.tagcloud{width:97%;margin:0 0 40px;text-align:justify;}.tagcloud h3{margin:2px 0 12px;}.ac_results{padding:0;margin:0;list-style:none;position:absolute;z-index:10000;display:none;border-width:1px;border-style:solid;}.ac_results li{padding:2px 5px;white-space:nowrap;text-align:left;}.ac_over{cursor:pointer;}.ac_match{text-decoration:underline;}#wpbody-content #media-items .describe{border-collapse:collapse;width:100%;border-top-style:solid;border-top-width:1px;clear:both;cursor:default;padding:5px;}#wpbody-content .describe th{vertical-align:top;text-align:left;padding:10px;width:140px;}#wpbody-content .describe .media-item-info tr{background-color:transparent;}#wpbody-content .describe .media-item-info td{padding:4px 10px 0;}.describe .media-item-info .A1B1{padding:0 0 0 10px;}#wpbody-content .filename{padding:0 10px;}#wpbody-content .media-item .thumbnail{max-height:128px;max-width:128px;}#wpbody-content #async-upload-wrap a{display:none;}.media-upload-form td label{margin-right:6px;margin-left:2px;}.media-upload-form .align .field label{display:inline;padding:0 0 0 22px;margin:0 1em 0 0;font-weight:bold;}.media-upload-form tr.image-size label{margin:0 0 0 3px;font-weight:bold;}.media-upload-form th.label label{font-weight:bold;margin:.5em;font-size:13px;}.media-upload-form th.label label span{padding:0 5px;}abbr.required{border:medium none;text-decoration:none;}#wpbody-content .describe input[type="text"],#wpbody-content .describe textarea{width:460px;}#wpbody-content .describe p.help{margin:0;padding:0 0 0 5px;}.media-item .error-div a.dismiss,.describe-toggle-on,.describe-toggle-off{display:block;line-height:36px;float:right;margin-right:20px;}.describe-toggle-off{display:none;}#wpbody-content .media-item{border-bottom-style:solid;border-bottom-width:1px;min-height:36px;position:relative;width:100%;}#wpbody-content .media-single .media-item{border-bottom-style:none;border-bottom-width:0;}#wpbody-content #media-items{border-style:solid solid none;border-width:1px;width:670px;}#wpbody-content #media-items .filename{line-height:36px;overflow:hidden;}.media-item .error-div{padding-left:10px;}.media-item .pinkynail{float:left;margin:2px;max-width:40px;max-height:32px;}.media-item .startopen,.media-item .startclosed{display:none;}.media-item .original{position:relative;height:34px;width:503px;}.media-item .percent{font-weight:bold;}.crunching{display:block;line-height:32px;text-align:right;margin-right:5px;}.progress{position:relative;margin-bottom:-36px;height:36px;}.bar{width:0;height:100%;border-right-width:3px;border-right-style:solid;}.upload-php .fixed .column-parent{width:25%;}.find-box{width:500px;height:300px;overflow:hidden;padding:33px 5px 40px;position:absolute;z-index:1000;}.find-box-head{cursor:move;font-weight:bold;height:2em;line-height:2em;padding:1px 12px;position:absolute;top:5px;width:100%;}.find-box-inside{overflow:auto;width:100%;height:100%;}.find-box-search{padding:12px;border-width:1px;border-style:none none solid;}#find-posts-response{margin:8px 0;padding:0 1px;}#find-posts-response table{width:100%;}#find-posts-response .found-radio{padding:5px 0 0 8px;width:15px;}.find-box-buttons{width:480px;margin:8px;}.find-box-search label{padding-right:6px;}.find-box #resize-se{position:absolute;right:1px;bottom:1px;}ul#dismissed-updates{display:none;}form.upgrade{margin-top:8px;}form.upgrade .hint{font-style:italic;font-size:85%;margin:-0.5em 0 2em 0;}#poststuff .inside .the-tagcloud{margin:5px 0 10px;padding:8px;border-width:1px;border-style:solid;line-height:1.8em;word-spacing:3px;-moz-border-radius:6px;-khtml-border-radius:6px;-webkit-border-radius:6px;border-radius:6px;}br.clear{height:2px;line-height:2px;}.swfupload{margin:5px 10px;vertical-align:middle;}.describe .image-editor{vertical-align:top;}.imgedit-wrap{position:relative;}.imgedit-settings p{margin:8px 0;}.describe .imgedit-wrap table td{vertical-align:top;padding-top:0;}.imgedit-wrap p,.describe .imgedit-wrap table td{font-size:11px;line-height:18px;}.describe .imgedit-wrap table td.imgedit-settings{padding:0 5px;}td.imgedit-settings input{vertical-align:middle;}.imgedit-wait{position:absolute;top:0;background:#FFF url(../images/wpspin_light.gif) no-repeat scroll 22px 10px;opacity:.7;filter:alpha(opacity=70);width:100%;height:500px;display:none;}.media-disabled,.imgedit-settings .disabled{color:grey;}.imgedit-wait-spin{padding:0 4px 4px;vertical-align:bottom;visibility:hidden;}.imgedit-menu{margin:0 0 12px;min-width:300px;}.imgedit-menu div{float:left;width:32px;height:32px;-moz-border-radius:3px;-khtml-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;border-width:1px;border-style:solid;}.imgedit-crop-wrap{position:relative;}.imgedit-crop{background:transparent url(../images/imgedit-icons.png) no-repeat scroll -9px -31px;margin:0 8px 0 0;}.imgedit-crop.disabled:hover{background-position:-9px -31px;}.imgedit-crop:hover{background-position:-9px -1px;}.imgedit-rleft{background:transparent url(../images/imgedit-icons.png) no-repeat scroll -46px -31px;margin:0 3px;}.imgedit-rleft.disabled:hover{background-position:-46px -31px;}.imgedit-rleft:hover{background-position:-46px -1px;}.imgedit-rright{background:transparent url(../images/imgedit-icons.png) no-repeat scroll -77px -31px;margin:0 8px 0 3px;}.imgedit-rright.disabled:hover{background-position:-77px -31px;}.imgedit-rright:hover{background-position:-77px -1px;}.imgedit-flipv{background:transparent url(../images/imgedit-icons.png) no-repeat scroll -115px -31px;margin:0 3px;}.imgedit-flipv.disabled:hover{background-position:-115px -31px;}.imgedit-flipv:hover{background-position:-115px -1px;}.imgedit-fliph{background:transparent url(../images/imgedit-icons.png) no-repeat scroll -147px -31px;margin:0 8px 0 3px;}.imgedit-fliph.disabled:hover{background-position:-147px -31px;}.imgedit-fliph:hover{background-position:-147px -1px;}.imgedit-undo{background:transparent url(../images/imgedit-icons.png) no-repeat scroll -184px -31px;margin:0 3px;}.imgedit-undo.disabled:hover{background-position:-184px -31px;}.imgedit-undo:hover{background-position:-184px -1px;}.imgedit-redo{background:transparent url(../images/imgedit-icons.png) no-repeat scroll -215px -31px;margin:0 8px 0 3px;}.imgedit-redo.disabled:hover{background-position:-215px -31px;}.imgedit-redo:hover{background-position:-215px -1px;}.imgedit-applyto img{margin:0 8px 0 0;}.imgedit-group-top{margin:5px 0;}.imgedit-applyto .imgedit-label{padding:2px 0 0;display:block;}.imgedit-help{display:none;font-style:italic;margin-bottom:8px;}.imgedit-help ul li{font-size:11px;}a.imgedit-help-toggle{text-decoration:none;}#wpbody-content .imgedit-response div{width:600px;margin:8px;}.form-table td.imgedit-response{padding:0;}.imgedit-submit{margin:8px 0;}.imgedit-submit-btn{margin-left:20px;}.imgedit-wrap .nowrap{white-space:nowrap;}span.imgedit-scale-warn{color:red;font-size:20px;font-style:normal;visibility:hidden;vertical-align:middle;}.imgedit-group{border-width:1px;border-style:solid;-moz-border-radius:8px;-khtml-border-radius:8px;-webkit-border-radius:8px;border-radius:8px;margin-bottom:8px;padding:2px 10px;}.form-table{border-collapse:collapse;margin-top:.5em;width:100%;margin-bottom:-8px;clear:both;}.form-table td{margin-bottom:9px;padding:8px 10px;line-height:20px;font-size:12px;}.form-table th,.form-wrap label{font-weight:normal;text-shadow:rgba(255,255,255,1) 0 1px 0;}.form-table th{vertical-align:top;text-align:left;padding:10px;width:200px;}.form-table th.th-full{width:auto;}.form-table div.color-option{display:block;clear:both;margin-top:12px;}.form-table input.tog{margin-top:2px;margin-right:2px;float:left;}.form-table td p{margin-top:4px;}.form-table table.color-palette{vertical-align:bottom;float:left;margin:-12px 3px 11px;}.form-table .color-palette td{border-width:1px 1px 0;border-style:solid solid none;height:10px;line-height:20px;width:10px;}.commentlist li{padding:1em 1em .2em;margin:0;border-bottom-width:1px;border-bottom-style:solid;}.commentlist li li{border-bottom:0;padding:0;}.commentlist p{padding:0;margin:0 0 .8em;}#replyrow{font-size:11px;}#replyrow input{border-width:1px;border-style:solid;}#replyrow td{padding:2px;}#replyrow #editorcontainer{border:0 none;}#replysubmit{margin:0;padding:3px 7px;text-align:center;}#replysubmit img.waiting,.inline-edit-save img.waiting{padding:4px 10px 0;vertical-align:top;float:right;}#replysubmit .button{margin-right:5px;}#replysubmit .error{color:red;line-height:21px;text-align:center;vertical-align:center;}#replyrow #editor-toolbar{display:none;}#replyhead{font-size:12px;font-weight:bold;padding:2px 10px 4px;}#edithead .inside{float:left;padding:3px 0 2px 5px;margin:0;text-align:center;font-size:11px;}#edithead .inside input{width:180px;font-size:11px;}#edithead label{padding:2px 0;}#replycontainer{padding:5px;border:0 none;height:120px;overflow:hidden;position:relative;}#replycontent{resize:none;margin:0;width:100%;height:100%;padding:0;line-height:150%;border:0 none;outline:none;font-size:12px;}#replyrow #ed_reply_toolbar{margin:0;padding:2px 3px;}.comment-ays{margin-bottom:0;border-style:solid;border-width:1px;}.comment-ays th{border-right-style:solid;border-right-width:1px;}.trash-undo-inside,.spam-undo-inside{margin:1px 8px 1px 0;line-height:16px;}.spam-undo-inside .avatar,.trash-undo-inside .avatar{height:20px;width:20px;margin-right:8px;vertical-align:middle;}.stuffbox .editcomment{clear:none;}#comment-status-radio p{margin:3px 0 5px;}#comment-status-radio input{margin:2px 3px 5px 0;vertical-align:middle;}#comment-status-radio label{padding:5px 0;}.commentlist .avatar{vertical-align:text-top;}.theme-install-php .tablenav{height:auto;}table#availablethemes{border-spacing:0;border-width:1px 0;border-style:solid none;margin:10px auto;width:100%;}table#availablethemes .no-items td{border-width:0;padding:5px;}td.available-theme{vertical-align:top;width:240px;margin:0;padding:20px;text-align:left;}table#availablethemes td{border-width:0 1px 1px;border-style:none solid solid;}table#availablethemes td.right,table#availablethemes td.left{border-right:0 none;border-left:0 none;}table#availablethemes td.bottom{border-bottom:0 none;}.available-theme a.screenshot{width:240px;height:180px;display:block;border-width:1px;border-style:solid;margin-bottom:10px;overflow:hidden;}.available-theme img{width:240px;}.available-theme h3{margin:15px 0 5px;}#current-theme{margin:1em 0 1.5em;}#current-theme a{border-bottom:none;}#current-theme h3{font-size:17px;font-weight:normal;margin:0;}#current-theme .theme-description{margin-top:5px;}#current-theme img{float:left;border-width:1px;border-style:solid;margin-right:1em;margin-bottom:1.5em;width:150px;}.theme-options span{text-transform:uppercase;font-size:13px;}.theme-options a{font-size:15px;}#TB_window #TB_title a.tb-theme-preview-link,#TB_window #TB_title a.tb-theme-preview-link:visited{font-weight:bold;text-decoration:none;}#TB_window #TB_title{background-color:#222;color:#cfcfcf;}#broken-themes{text-align:left;width:50%;border-spacing:3px;padding:3px;}.theme-install-php h4{margin:2.5em 0 8px;}.appearance_page_custom-header #headimg{border:1px solid #DFDFDF;min-height:100px;width:100%;}.appearance_page_custom-header #upload-form p label{font-size:12px;}.appearance_page_custom-header .available-headers .default-header{float:left;margin:0 20px 20px 0;}.appearance_page_custom-header .random-header{clear:both;margin:0 20px 20px 0;vertical-align:middle;}.appearance_page_custom-header .available-headers label input,.appearance_page_custom-header .random-header label input{margin-right:10px;}.appearance_page_custom-header .available-headers label img{vertical-align:middle;}div#custom-background-image{min-height:100px;border:1px solid #dfdfdf;}div#custom-background-image img{max-width:400px;max-height:300px;}.nav-tab{border-style:solid;border-color:#dfdfdf #dfdfdf #fff;border-width:1px 1px 0;color:#aaa;text-shadow:rgba(255,255,255,1) 0 1px 0;font-size:12px;line-height:16px;display:inline-block;padding:4px 14px 6px;text-decoration:none;margin:0 6px -1px 0;-moz-border-radius:3px 3px 0 0;-webkit-border-top-left-radius:3px;-webkit-border-top-right-radius:3px;-khtml-border-top-left-radius:3px;-khtml-border-top-right-radius:3px;border-top-left-radius:3px;border-top-right-radius:3px;}.nav-tab-active{border-width:1px;color:#464646;}.nav-tab:hover,.nav-tab-active{border-color:#ccc #ccc #fff;}h2.nav-tab-wrapper,h3.nav-tab-wrapper{border-bottom:1px solid #ccc;padding-bottom:0;}h2 .nav-tab{padding:4px 10px 6px;font-family:"HelveticaNeue-Light","Helvetica Neue Light","Helvetica Neue",sans-serif;font-weight:200;font-size:20px;line-height:24px;}.plugins .name,#pass-strength-result.strong,#pass-strength-result.short,.button-highlighted,input.button-highlighted,#quicktags #ed_strong,#ed_reply_toolbar #ed_reply_strong{font-weight:bold;}.plugins p{margin:0 4px;padding:0;}.plugins .desc p{margin:0 0 8px;}.plugins td.desc{line-height:1.5em;}.plugins .desc ul,.plugins .desc ol{margin:0 0 0 2em;}.plugins .desc ul{list-style-type:disc;}.plugins .row-actions-visible{padding:0;}.plugins tbody th.check-column{padding:7px 0;}.plugins .inactive td,.plugins .inactive th,.plugins .active td,.plugins .active th{border-top-style:solid;border-top-width:1px;padding:5px 7px 0;}#wpbody-content .plugins .plugin-title,#wpbody-content .plugins .theme-title{padding-right:12px;white-space:nowrap;}.plugins .second,.plugins .row-actions-visible{padding:0 0 5px;}.plugins-php .widefat tfoot th,.plugins-php .widefat tfoot td{border-top-style:solid;border-top-width:1px;}.plugin-update-tr .update-message{margin:5px;padding:3px 5px;border-width:1px;border-style:solid;-moz-border-radius:3px;-khtml-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;}.plugin-install-php h4{margin:2.5em 0 8px;}#profile-page .form-table textarea{width:500px;margin-bottom:6px;}#profile-page .form-table #rich_editing{margin-right:5px;}#your-profile legend{font-family:Georgia,"Times New Roman","Bitstream Charter",Times,serif;font-size:22px;}#your-profile #rich_editing{border:none;}#display_name{width:15em;}#createuser .form-field input{width:25em;}.pressthis{margin:20px 0;}.pressthis a{display:inline-block;width:113px;position:relative;cursor:move;color:#333;background:#dfdfdf;-webkit-gradient(linear,left bottom,left top,color-stop(0.07,#e6e6e6),color-stop(0.77,#d8d8d8));-moz-linear-gradient(center bottom,#e6e6e6 7%,#d8d8d8 77%);background-repeat:no-repeat;background-image-position:10px 8px;border-radius:5px;-webkit-border-radius:5px;-moz-border-radius:5px;-o-border-radius:5px;border:1px #b4b4b4 solid;font:normal normal normal 14px/16px Georgia,"Times New Roman","Bitstream Charter",Times,serif;text-decoration:none;text-shadow:#fff 0 1px 0;-webkit-text-shadow:#fff 0 1px 0;-moz-text-shadow:#fff 0 1px 0;-o-text-shadow:#fff 0 1px 0;}.pressthis a:hover,.pressthis a:active{color:#333;}.pressthis a:hover:after{transform:skew(20deg) rotate(9deg);-webkit-transform:skew(20deg) rotate(9deg);-moz-transform:skew(20deg) rotate(9deg);box-shadow:0 10px 8px rgba(0,0,0,0.7);-webkit-box-shadow:0 10px 8px rgba(0,0,0,0.7);-moz-box-shadow:0 10px 8px rgba(0,0,0,0.7);}.pressthis a span{background:url(../images/press-this.png) no-repeat -45px 5px;padding:8px 0 8px 32px;display:inline-block;}.pressthis a:after{content:'';width:70%;height:55%;z-index:-1;position:absolute;right:10px;bottom:9px;background:transparent;transform:skew(20deg) rotate(6deg);-webkit-transform:skew(20deg) rotate(6deg);-moz-transform:skew(20deg) rotate(6deg);box-shadow:0 10px 8px rgba(0,0,0,0.6);-webkit-box-shadow:0 10px 8px rgba(0,0,0,0.6);-moz-box-shadow:0 10px 8px rgba(0,0,0,0.6);}#utc-time,#local-time{padding-left:25px;font-style:italic;font-family:sans-serif;}.defaultavatarpicker .avatar{margin:2px 0;vertical-align:middle;}#footer{position:absolute;bottom:0;left:0;right:0;padding:10px 0;margin-right:20px;border-top:1px;border-style:solid;}#footer,#footer a{font-size:12px;}#footer p{margin:0;line-height:20px;}#footer a{text-decoration:none;}#footer a:hover{text-decoration:underline;}#excerpt,.attachmentlinks{margin:0;height:4em;width:98%;}#template div{margin-right:190px;}p.pagenav{margin:0;display:inline;}.pagenav span{font-weight:bold;margin:0 6px;}.row-title{font-size:13px!important;font-weight:bold;}.column-author img,.column-username img{float:left;margin-right:10px;margin-top:1px;}.row-actions{visibility:hidden;padding:2px 0 0;}tr:hover .row-actions,div.comment-item:hover .row-actions{visibility:visible;}.row-actions-visible{padding:2px 0 0;}.form-table .pre{padding:8px;margin:0;}table.form-table td .updated{font-size:13px;}.tagchecklist{margin-left:14px;font-size:12px;overflow:auto;}.tagchecklist strong{margin-left:-8px;position:absolute;}.tagchecklist span{margin-right:25px;display:block;float:left;font-size:11px;line-height:1.8em;white-space:nowrap;cursor:default;}.tagchecklist span a{margin:6px 0 0 -9px;cursor:pointer;width:10px;height:10px;display:block;float:left;text-indent:-9999px;overflow:hidden;position:absolute;}#poststuff h2{margin-top:20px;font-size:1.5em;margin-bottom:15px;padding:0 0 3px;clear:left;}#poststuff h3,.metabox-holder h3{font-size:15px;font-family:Georgia,"Times New Roman","Bitstream Charter",Times,serif;font-weight:normal;padding:7px 10px;margin:0;line-height:1;}#poststuff .inside,#poststuff .inside p{font-size:12px;margin:6px 0 8px;}#poststuff .inside .submitbox p{margin:1em 0;}#post-visibility-select,#post-formats-select{line-height:1.5em;margin-top:3px;}#poststuff #submitdiv .inside{margin:0;padding:0;}#titlediv,#poststuff .postarea{margin-bottom:20px;}td.post-title strong,td.plugin-title strong{display:block;margin-bottom:.2em;}td.post-title p,td.plugin-title p{margin:6px 0;}.wp-hidden-children .wp-hidden-child,.ui-tabs-hide{display:none;}#templateside ul li a{text-decoration:none;}.tool-box{margin:15px 0 35px;}.tool-box .buttons{margin:15px 0;}.tool-box .title{margin:8px 0;font:18px/24px Georgia,"Times New Roman","Bitstream Charter",Times,serif;}.pressthis a{font-size:1.2em;}#sidemenu{margin:-30px 15px 0 315px;list-style:none;position:relative;float:right;padding-left:10px;font-size:12px;}#sidemenu a{padding:0 7px;display:block;float:left;line-height:28px;border-top-width:1px;border-top-style:solid;border-bottom-width:1px;border-bottom-style:solid;}#sidemenu li{display:inline;line-height:200%;list-style:none;text-align:center;white-space:nowrap;margin:0;padding:0;}#sidemenu a.current{font-weight:normal;padding-left:6px;padding-right:6px;-moz-border-radius:3px 3px 0 0;-webkit-border-top-left-radius:3px;-webkit-border-top-right-radius:3px;-khtml-border-top-left-radius:3px;-khtml-border-top-right-radius:3px;border-top-left-radius:3px;border-top-right-radius:3px;border-width:1px;border-style:solid;}#sidemenu li a .count-0{display:none;}#poststuff .inside .the-tagcloud{margin:5px 0 10px;padding:8px;border-width:1px;border-style:solid;line-height:1.8em;word-spacing:3px;-moz-border-radius:3px;-khtml-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;}.plugin-install #description,.plugin-install-network #description{width:60%;}table .vers,table .column-visible,table .column-rating{text-align:left;}body.iframe{height:98%;}.anchors{margin:10px 20px 10px 20px;}div.nav{height:2em;padding:7px 10px;vertical-align:text-top;margin:5px 0;}.nav .button-secondary{padding:2px 4px;}.settings-toggle{text-align:right;margin:5px 7px 15px 0;font-size:12px;}.settings-toggle h3{margin:0;}form#tags-filter{position:relative;}td.media-icon{text-align:center;width:80px;padding-top:8px;padding-bottom:8px;}td.media-icon img{max-width:80px;max-height:60px;}.screen-per-page{width:3em;}.list-ajax-loading{float:right;margin-right:9px;margin-top:-1px;}.tablenav .list-ajax-loading{margin-top:7px;}#howto{font-size:11px;margin:0 5px;display:block;}.import-system{font-size:16px;}#namediv table{width:100%;}#namediv td.first{width:10px;white-space:nowrap;}#namediv input{width:98%;}#namediv p{margin:10px 0;}#submitdiv h3{margin-bottom:0!important;}.zerosize{height:0;width:0;margin:0;border:0;padding:0;overflow:hidden;position:absolute;}br.clear{height:2px;line-height:2px;}.checkbox{border:none;margin:0;padding:0;}#content{margin:0;width:100%;}fieldset{border:0;padding:0;margin:0;}.post-categories{display:inline;margin:0;padding:0;}.post-categories li{display:inline;} \ No newline at end of file diff --git a/src/wp-admin/css/wp-admin.dev.css b/src/wp-admin/css/wp-admin.dev.css new file mode 100644 index 0000000..82a0c68 --- /dev/null +++ b/src/wp-admin/css/wp-admin.dev.css @@ -0,0 +1,4709 @@ +/*------------------------------------------------------------------------------ + + +Hello, this is the main WordPress admin CSS file. +All the important stuff is in here. + + +TABLE OF CONTENTS: +------------------ + 1.0 - Text Elements + 2.0 - Forms + 3.0 - Actions + 4.0 - Notifications + 5.0 - TinyMCE + 6.0 - Admin Header + 6.1 - Favorites Menu + 6.2 - Screen Options Tabs + 7.0 - Main Navigation + 8.0 - Layout Blocks + 9.0 - Dashboard +10.0 - List Posts + 10.1 - Inline Editing +11.0 - Write/Edit Post Screen + 11.1 - Custom Fields + 11.2 - Post Revisions +12.0 - Categories +13.0 - Tags +14.0 - Media Screen + 14.1 - Media Uploader + 14.2 - Image Editor +15.0 - Comments Screen +16.0 - Themes + 16.1 - Custom Header + 16.2 - Custom Background + 16.3 - Tabbed Admin Screen Interface +17.0 - Plugins +18.0 - Users +19.0 - Tools +20.0 - Settings +21.0 - Admin Footer +22.0 - Misc +23.0 - Dead + + +------------------------------------------------------------------------------*/ + + + + +/*------------------------------------------------------------------------------ + 1.0 - Text Styles +------------------------------------------------------------------------------*/ + +p, +ul, +ol, +blockquote, +input, +select { + font-size: 12px; +} + +ol { + list-style-type: decimal; + margin-left: 2em; +} + +.code, code { + font-family: Consolas, Monaco, monospace; +} + +kbd, code { + padding: 1px 3px; + margin: 0 1px; + font-size: 11px; +} + +.quicktags, .search { + font: 12px Georgia, "Times New Roman", "Bitstream Charter", Times, serif; +} + +.icon32 { + float: left; + height: 34px; + margin: 7px 8px 0 0; + width: 36px; +} + +.key-labels label { + line-height: 24px; +} + +.pre { + /* http://www.longren.org/2006/09/27/wrapping-text-inside-pre-tags/ */ + white-space: pre-wrap; /* css-3 */ + white-space: -moz-pre-wrap !important; /* Mozilla, since 1999 */ + white-space: -pre-wrap; /* Opera 4-6 */ + white-space: -o-pre-wrap; /* Opera 7 */ + word-wrap: break-word; /* Internet Explorer 5.5+ */ +} + +.howto { + font-style: italic; + display: block; + font-family: sans-serif; +} + +p.install-help { + margin: 8px 0; + font-style: italic; +} + + +/*------------------------------------------------------------------------------ + 2.0 - Forms +------------------------------------------------------------------------------*/ + +textarea, +input[type="text"], +input[type="password"], +input[type="file"], +input[type="button"], +input[type="submit"], +input[type="reset"], +select { + border-width: 1px; + border-style: solid; + -moz-border-radius: 3px; + -khtml-border-radius: 3px; + -webkit-border-radius: 3px; + border-radius: 3px; +} + +select option { + padding: 2px; +} + +.submit { + padding: 1.5em 0; + margin: 5px 0; + -moz-border-radius: 0 0 3px 3px; + -webkit-border-bottom-left-radius: 3px; + -webkit-border-bottom-right-radius: 3px; + -khtml-border-bottom-left-radius: 3px; + -khtml-border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; + border-bottom-right-radius: 3px; +} + +form p.submit a.cancel:hover { + text-decoration: none; +} + +.submit input, +.button, +input.button, +.button-primary, +input.button-primary, +.button-secondary, +input.button-secondary, +.button-highlighted, +input.button-highlighted, +#postcustomstuff .submit input { + text-decoration: none; + font-size: 12px !important; + line-height: 13px; + padding: 3px 8px; + cursor: pointer; + border-width: 1px; + border-style: solid; + -moz-border-radius: 11px; + -khtml-border-radius: 11px; + -webkit-border-radius: 11px; + border-radius: 11px; + -moz-box-sizing: content-box; + -webkit-box-sizing: content-box; + -khtml-box-sizing: content-box; + box-sizing: content-box; +} + +#minor-publishing-actions input, +#major-publishing-actions input, +#minor-publishing-actions .preview { + min-width: 80px; + text-align: center; +} + +textarea.all-options, input.all-options { + width: 250px; +} + +input.large-text, +textarea.large-text { + width: 99%; +} + +input.regular-text, +#adduser .form-field input { + width: 25em; +} + +input.small-text { + width: 50px; +} + +#doaction, +#doaction2, +#post-query-submit { + margin-right: 8px; +} + +.tablenav select[name="action"], +.tablenav select[name="action2"] { + width: 130px; +} + +.tablenav select[name="m"] { + width: 155px; +} + +.tablenav select#cat { + width: 170px; +} + +#wpcontent select { + padding: 2px; + height: 2em; + font-size: 12px; +} + +#wpcontent option { + padding: 2px; +} + +#timezone_string option { + margin-left: 1em; +} + +label, +#your-profile label + a { + vertical-align: middle; +} + +#misc-publishing-actions label { + vertical-align: baseline; +} + +#pass-strength-result { + border-style: solid; + border-width: 1px; + float: left; + margin: 13px 5px 5px 1px; + padding: 3px 5px; + text-align: center; + width: 200px; + display: none; +} +.indicator-hint { + padding-top: 8px; +} + +p.search-box { + float: right; + margin: 0; +} + + +/*------------------------------------------------------------------------------ + 3.0 - Actions +------------------------------------------------------------------------------*/ + +#major-publishing-actions { + padding: 10px 10px 8px; + clear: both; + border-top: none; +} + +#delete-action { + line-height: 25px; + vertical-align: middle; + text-align: left; + float: left; +} + +#publishing-action { + text-align: right; + float: right; + line-height: 23px; +} + +#post-body #minor-publishing { + padding-bottom: 10px; +} + +#post-body #misc-publishing-actions { + padding: 0; +} + +#post-body .misc-pub-section { + border-right-width: 1px; + border-right-style: solid; + border-bottom: 0 none; + min-height: 30px; + float: left; + max-width: 32%; +} + +#post-body .misc-pub-section-last { + border-right: 0; +} + +#misc-publishing-actions { + padding: 6px 0 16px 0; +} + +.misc-pub-section { + padding: 6px 10px; + border-width: 1px 0; + border-style: solid; +} + +.misc-pub-section:first-child { + border-top-width: 0; +} +.misc-pub-section-last { + border-bottom-width: 0; +} + +#minor-publishing-actions { + padding: 10px 10px 2px 8px; + text-align: right; +} + +#minor-publishing { + border-bottom-width: 1px; + border-bottom-style: solid; + -webkit-box-shadow: 0 1px 0 #fff; + -moz-box-shadow: 0 1px 0 #fff; + box-shadow: 0 1px 0 #fff; +} + +#save-post { + float: left; +} + +#minor-publishing .ajax-loading { + padding: 3px 0 0 4px; + float: left; +} + +.preview { + float: right; +} + + + +#sticky-span { + margin-left: 18px; +} + +#post-status-display, +#post-visibility-display { + font-weight: bold; +} + +.side-info { + margin: 0; + padding: 4px; + font-size: 11px; +} + +.side-info h5 { + padding-bottom: 7px; + font-size: 14px; + margin: 12px 2px 5px; + border-bottom-width: 1px; + border-bottom-style: solid; +} + +.side-info ul { + margin: 0; + padding-left: 18px; + list-style: square; +} + +a.button, +a.button-primary, +a.button-secondary { + line-height: 15px; + padding: 3px 10px; + white-space: nowrap; + -webkit-border-radius: 10px; +} + +.approve { + display: none; +} + +.unapproved .approve, +.spam .approve, +.trash .approve { + display: inline; +} + +.unapproved .unapprove { + display: none; +} + +td.action-links, +th.action-links { + text-align: right; +} + +.describe .del-link { + padding-left: 5px; +} + + +/*------------------------------------------------------------------------------ + 4.0 - Notifications +------------------------------------------------------------------------------*/ + +#update-nag, .update-nag { + line-height: 19px; + padding: 5px 0; + font-size: 12px; + text-align: center; + margin: 0 15px; + border-width: 1px; + border-style: solid; + border-top-width: 0; + border-top-style: none; + -moz-border-radius: 0 0 3px 3px; + -webkit-border-bottom-right-radius: 3px; + -webkit-border-bottom-left-radius: 3px; + -khtml-border-bottom-right-radius: 3px; + -khtml-border-bottom-left-radius: 3px; + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; +} + +.plugins .plugin-update { + padding: 0; +} + +.plugin-update .update-message { + margin: 0 10px 8px 31px; + font-weight: bold; +} + +ul#dismissed-updates { + display: none; +} +form.upgrade { + margin-top: 8px; +} + +form.upgrade .hint { + font-style: italic; + font-size: 85%; + margin: -0.5em 0 2em 0; +} + +.ajax-feedback { + visibility: hidden; + vertical-align: bottom; +} + +#ajax-response.alignleft { + margin-left: 2em; +} + + +/*------------------------------------------------------------------------------ + 5.0 - TinyMCE +------------------------------------------------------------------------------*/ + +#editorcontainer #content { + font-family: Consolas, Monaco, monospace; + padding: 6px; + line-height: 150%; + border: 0 none; + outline: none; + resize: vertical; + -moz-box-sizing: border-box; + -webkit-box-sizing: border-box; + -khtml-box-sizing: border-box; + box-sizing: border-box; +} + +#editorcontainer, +#quicktags { + border-style: solid; + border-width: 1px; + border-collapse: separate; + -moz-border-radius: 3px 3px 0 0; + -webkit-border-top-right-radius: 3px; + -webkit-border-top-left-radius: 3px; + -khtml-border-top-right-radius: 3px; + -khtml-border-top-left-radius: 3px; + border-top-right-radius: 3px; + border-top-left-radius: 3px; +} + +#quicktags { + padding: 0; + margin-bottom: -3px; + border-bottom-width: 3px; + background-image: url("../images/ed-bg.gif"); + background-position: left top; + background-repeat: repeat-x; +} + +#quicktags #ed_toolbar { + padding: 2px 4px 0; +} + +#ed_toolbar input, +#ed_reply_toolbar input { + margin: 3px 1px 4px; + line-height: 18px; + display: inline-block; + min-width: 26px; + padding: 2px 4px; + font-size: 12px; +} + +#ed_reply_toolbar input { + margin: 1px 2px 1px 1px; +} + +#quicktags #ed_link, +#ed_reply_toolbar #ed_reply_link { + text-decoration: underline; +} + +#quicktags #ed_del, +#ed_reply_toolbar #ed_reply_del { + text-decoration: line-through; +} + +#quicktags #ed_em, +#ed_reply_toolbar #ed_reply_em { + font-style: italic; +} + +#wp_editbtns, +#wp_gallerybtns { + padding: 2px; + position: absolute; + display: none; + z-index: 999998; +} + +#wp_editimgbtn, +#wp_delimgbtn, +#wp_editgallery, +#wp_delgallery { + margin: 2px; + padding: 2px; + border-width: 1px; + border-style: solid; + -moz-border-radius: 3px; + -khtml-border-radius: 3px; + -webkit-border-radius: 3px; + border-radius: 3px; +} + +/* Distraction Free Writing mode + * =Overlay Styles +-------------------------------------------------------------- */ +.fullscreen-overlay { + z-index: 149999; + display: none; + position: fixed; + top: 0; + bottom: 0; + left: 0; + right: 0; + filter: inherit; +} + +.fullscreen-active .fullscreen-overlay, +.fullscreen-active #wp-fullscreen-body { + display: block; +} + +.fullscreen-fader { + z-index: 200000; +} + +.fullscreen-active .fullscreen-fader { + display: none; +} + +/* =Overlay Body +-------------------------------------------------------------- */ +#wp-fullscreen-body { + width: 100%; + z-index: 150005; + display: none; + position: absolute; + top: 0; + left: 0; +} + +#wp-fullscreen-wrap { + margin: 0 auto 50px; + position: relative; + padding-top: 60px; +} + +#wp-fullscreen-title { + font-size: 1.7em; + line-height: 100%; + outline: medium none; + padding: 6px 7px; + width: 100%; + margin-bottom: 30px; +} + +#wp-fullscreen-container { + padding: 4px 10px 50px; +} + +#wp-fullscreen-title, +#wp-fullscreen-container { + -moz-border-radius: 0; + -khtml-border-radius: 0; + -webkit-border-radius: 0; + border-radius: 0; + border: 1px dashed transparent; + background: transparent; + -moz-transition-property: border-color; + -moz-transition-duration: 0.6s; + -webkit-transition-property: border-color; + -webkit-transition-duration: 0.6s; + -o-transition-property: border-color; + -o-transition-duration: 0.6s; + transition-property: border-color; + transition-duration: 0.6s; +} + + +#wp_mce_fullscreen { + width: 100%; + min-height: 300px; + border: 0; + background: transparent; + font-family: Consolas, Monaco, monospace; + line-height: 1.6em; + padding: 0; + overflow-y: hidden; + outline: none; + resize: none; +} + +#wp-fullscreen-tagline { + color: #BBBBBB; + font-size: 18px; + float: right; + padding-top: 5px; +} + +/* =Top bar +-------------------------------------------------------------- */ +#fullscreen-topbar { + position: fixed; + top: 0; + left: 0; + z-index: 150050; + border-bottom-style: solid; + border-bottom-width: 1px; + min-width: 800px; + width: 100%; + height: 40px; +} + +#wp-fullscreen-toolbar { + padding: 6px 10px 0; + clear: both; + max-width: 1100px; + min-width: 820px; + margin: 0 auto; +} + +#wp-fullscreen-mode-bar, +#wp-fullscreen-button-bar, +#wp-fullscreen-close, +#wp-fullscreen-count { + float: left; +} + +#wp-fullscreen-save { + float: right; +} + +#wp-fullscreen-save { + padding: 2px 2px 0 5px; +} + +#wp-fullscreen-count, +#wp-fullscreen-close { + padding-top: 5px; +} + +#wp-fullscreen-central-toolbar { + margin: auto; + padding: 0; +} + +#wp-fullscreen-buttons > div { + float: left; +} + +#wp-fullscreen-mode-bar { + padding: 1px 14px 0 0; +} + +#wp-fullscreen-modes a { + display: block; + font-size: 11px; + text-decoration: none; + float: left; + margin: 1px 0 0 0; + padding: 2px 6px 2px; + border-width: 1px 1px 1px 0; + border-style: solid; + border-color: #bbb; + color: #777; + text-shadow: 0 1px 0 #fff; + background-color: #f4f4f4; + background-image: -moz-linear-gradient(bottom, #e4e4e4, #f9f9f9); + background-image: -webkit-gradient(linear, left bottom, left top, from(#e4e4e4), to(#f9f9f9)); +} + +#wp-fullscreen-modes a:hover, +.wp-html-mode #wp-fullscreen-modes a:last-child, +.wp-tmce-mode #wp-fullscreen-modes a:first-child { + color: #333; + border-color: #999; + background-color: #eee; + background-image: -moz-linear-gradient(bottom, #f9f9f9, #e0e0e0); + background-image: -webkit-gradient(linear, left bottom, left top, from(#f9f9f9), to(#e0e0e0)); +} + +#wp-fullscreen-modes a:first-child { + border-width: 1px; + -moz-border-radius: 3px 0 0 3px; + -webkit-border-top-left-radius: 3px; + -webkit-border-bottom-left-radius: 3px; + -khtml-border-top-left-radius: 3px; + -khtml-border-bottom-left-radius: 3px; + border-top-left-radius: 3px; + border-bottom-left-radius: 3px; +} + +#wp-fullscreen-modes a:last-child { + -moz-border-radius: 0 3px 3px 0; + -webkit-border-top-right-radius: 3px; + -webkit-border-bottom-right-radius: 3px; + -khtml-border-top-right-radius: 3px; + -khtml-border-bottom-right-radius: 3px; + border-top-right-radius: 3px; + border-bottom-right-radius: 3px; +} + +#wp-fullscreen-buttons .active a { + background: inherit; +} + +#wp-fullscreen-buttons .hidden { + display: none; +} + +#wp-fullscreen-buttons .disabled { + opacity: 0.5; +} + +.wp-html-mode #wp-fullscreen-buttons div { + display: none; +} + +.wp-html-mode #wp-fullscreen-buttons div.wp-fullscreen-both { + display: block; +} + +#fullscreen-topbar.fullscreen-make-sticky { + display: block !important; +} + +#wp-fullscreen-save img { + vertical-align: middle; +} + +#wp-fullscreen-save img, +#wp-fullscreen-save span { + padding-right: 4px; + display: none; +} + +#wp-fullscreen-buttons .mce_image .mce_image { + background-image: url("../images/menu.png?ver=20100531"); + background-position: -124px -38px; +} + +#wp-fullscreen-buttons .mce_image .mce_image:hover { + background-position: -124px -6px; +} + +/* =Thickbox Adjustments +-------------------------------------------------------------- */ +.fullscreen-active #TB_overlay { + z-index: 150100; +} + +.fullscreen-active #TB_window { + z-index: 150102; +} + +/* =TinyMCE Adjustments +-------------------------------------------------------------- */ +#wp_mce_fullscreen_ifr { + background: transparent; +} + +#wp_mce_fullscreen_parent #wp_mce_fullscreen_tbl tr.mceFirst { + display : none; +} + +#wp-fullscreen-container .wp_themeSkin table td { + vertical-align: top; +} + + +/*------------------------------------------------------------------------------ + 6.0 - Admin Header +------------------------------------------------------------------------------*/ +#wphead-info { + margin: 0 0 0 15px; +} + +#user_info { + float: right; + font-size: 12px; + line-height: 26px; + height: 25px; + position: relative; + z-index: 49; + border-style: solid; + border-width: 0; + margin-top: 3px; + padding: 0 2px 0 6px; +} + +#user_info.active { + border-width: 1px; + margin-right: -1px; + margin-top: 2px; + -moz-border-radius: 3px 3px 0 0; + -webkit-border-top-right-radius: 3px; + -webkit-border-top-left-radius: 3px; + -khtml-border-top-right-radius: 3px; + -khtml-border-top-left-radius: 3px; + border-top-right-radius: 3px; + border-top-left-radius: 3px; +} + +#user_info p { + margin: 0; + padding: 0; + line-height: 25px; + cursor: pointer; +} + +#user_info .hide-if-no-js p { + margin: 0 20px 0 0; +} + +#user_info:hover .hide-if-no-js p { + text-decoration: underline; +} +#user_info.active .hide-if-no-js p { + text-decoration: none; +} + +#user_info_arrow { + height: 22px; + width: 22px; + position: absolute; + right: 3px; + top: 0; + cursor: pointer; +} + +#user_info_links_wrap { + min-width: 100px; + width: 100%; + position: absolute; + top: 25px; + right: 0; + padding: 0; + text-shadow: rgba(255,255,255,0.7) 0 1px 0; +} + +#user_info_links { + position: absolute; + left: -1px; + right: -1px; + overflow: hidden; +} + +#user_info.active #user_info_links ul { + margin-top: 0; + -moz-transition: margin-top 200ms; + -webkit-transition: margin-top 200ms; + -o-transition: margin-top 200ms; + transition: margin-top 200ms; +} + +#user_info_links ul { + border-width: 1px; + border-style: solid; + margin-top: -1000px; + -moz-transition: margin-top 500ms ease-in; + -webkit-transition: margin-top 500ms ease-in; + -o-transition: margin-top 500ms ease-in; + transition: margin-top 500ms ease-in; +} + +#user_info_links, +#user_info_links ul, +#user_info_links li:last-child { + -moz-border-radius: 0 0 3px 3px; + -webkit-border-bottom-right-radius: 3px; + -webkit-border-bottom-left-radius: 3px; + -khtml-border-bottom-right-radius: 3px; + -khtml-border-bottom-left-radius: 3px; + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; +} + +#user_info_links li { + display: block; + margin: 0; +} + +#user_info_links a { + display: block; + padding: 6px 8px; +} + +#wphead { + height: 32px; + margin-right: 20px; + margin-left: 2px; +} + +#wphead a, +#adminmenu a, +#sidemenu a, +#taglist a, +#catlist a, +#show-settings a { + text-decoration: none; +} + +#header-logo { + float: left; + margin: 7px 0; + -webkit-user-select: none; + -moz-user-select: none; + -khtml-user-select: none; + user-select: none; +} + +#wphead h1 { + font: normal 16px Georgia, "Times New Roman", "Bitstream Charter", Times, serif; + padding: 6px 8px 5px; + margin: 0; + float: left; +} + +#wphead h1 a:hover { + text-decoration:none; +} +#wphead h1 a:hover #site-title { + text-decoration:underline; +} + + +/*------------------------------------------------------------------------------ + 6.1 - Favorites Menu +------------------------------------------------------------------------------*/ + +#favorite-actions { + margin: 0 12px 0 15px; + min-width: 130px; + position: relative; + display: inline-block; + top: -1px; +} + +#favorite-first { + -moz-border-radius: 12px; + -khtml-border-radius: 12px; + -webkit-border-radius: 12px; + border-radius: 12px; + line-height: 15px; + padding: 0 30px 0 0; + border-width: 1px; + border-style: solid; +} + +#favorite-inside { + margin: 0; + padding: 2px 1px; + border-width: 1px; + border-style: solid; + position: absolute; + z-index: 11; + display: none; + -moz-border-radius: 0 0 12px 12px; + -webkit-border-bottom-right-radius: 12px; + -webkit-border-bottom-left-radius: 12px; + -khtml-border-bottom-right-radius: 12px; + -khtml-border-bottom-left-radius: 12px; + border-bottom-right-radius: 12px; + border-bottom-left-radius: 12px; +} + +#favorite-first a { + padding: 2px 0 2px 12px; +} + +#favorite-actions a { + display: block; + text-decoration: none; + font-size: 11px; +} + +#favorite-inside a { + padding: 3px 5px 3px 10px; + line-height: 20px; +} + +#favorite-toggle { + height: 18px; + position: absolute; + right: 0; + top: 1px; + width: 28px; + border-width: 0 0 0 1px; + border-style: solid; +} + +#favorite-actions .slide-down { + -moz-border-radius: 12px 12px 0 0; + -webkit-border-bottom-right-radius: 0; + -webkit-border-bottom-left-radius: 0; + -khtml-border-bottom-right-radius: 0; + -khtml-border-bottom-left-radius: 0; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; + border-bottom: none; +} + + +/*------------------------------------------------------------------------------ + 6.2 - Screen Options Tabs +------------------------------------------------------------------------------*/ + +#screen-meta { + position: relative; + clear: both; +} + +#screen-meta-links { + margin: 0 24px 0 0; +} + +#screen-meta .screen-reader-text { + visibility: hidden; +} + +#screen-options-link-wrap, +#contextual-help-link-wrap { + float: right; + height: 22px; + padding: 0; + margin: 0 0 0 6px; + font-family: sans-serif; + -moz-border-radius-bottomleft: 3px; + -moz-border-radius-bottomright: 3px; + -webkit-border-bottom-left-radius: 3px; + -webkit-border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; + border-bottom-right-radius: 3px; +} + +#contextual-help-wrap li { + list-style-type: disc; + margin-left: 18px; +} +.toggle-arrow { + background-repeat: no-repeat; + background-position: top left; + background-color: transparent; + height: 22px; + line-height: 22px; + display: block; +} +.toggle-arrow-active { + background-position: bottom left; +} +#screen-meta a.show-settings { + text-decoration: none; + z-index: 1; + padding: 0 16px 0 6px; + height: 22px; + line-height: 22px; + font-size: 12px; + display: block; + text-shadow: rgba(255,255,255,0.7) 0 1px 0; +} + +#screen-meta a.show-settings:hover { + text-decoration: none; +} + +#screen-options-wrap h5, +#contextual-help-wrap h5 { + margin: 8px 0; + font-size: 13px; +} + +#screen-options-wrap, +#contextual-help-wrap { + border-style: none solid solid; + border-top: 0 none; + border-width: 0 1px 1px; + margin: 0 20px 0 0; + padding: 8px 12px 12px; +} + +.metabox-prefs label { + display: inline-block; + padding-right: 15px; + white-space: nowrap; + line-height: 30px; +} + +.metabox-prefs label input { + margin: 0 5px 0 2px; +} + +.metabox-prefs label a { + display: none; +} + + +/*------------------------------------------------------------------------------ + 7.0 - Main Navigation (Left Menu) +------------------------------------------------------------------------------*/ + +#adminmenuback, +#adminmenuwrap { + border-width: 0 1px 0 0; + border-style: solid; +} +#adminmenuwrap { + position: relative; +} + +#adminmenushadow { + position: absolute; + top: 0; + right: 0; + bottom: 0; + width: 6px; + z-index: 20; +} + +/* side admin menu */ +#adminmenu * { + -webkit-user-select: none; + -moz-user-select: none; + -khtml-user-select: none; + user-select: none; +} + +#adminmenu .wp-submenu { + display: none; + list-style: none; + padding: 0; + margin: 0; + position: relative; + z-index: 2; +} + +#adminmenu .wp-submenu a { + font-size: 12px; + line-height: 18px; +} + +#adminmenu .wp-submenu li.current, +#adminmenu .wp-submenu li.current a, +#adminmenu .wp-submenu li.current a:hover { + font-weight: bold; +} + +#adminmenu a.menu-top, +#adminmenu .wp-submenu-head { + font-size: 13px; + line-height: 18px; +} + +#adminmenu div.wp-submenu-head { + display: none; +} + +.js.folded #adminmenu div.wp-submenu-head { + display: block; +} + +.js.folded #adminmenu a.menu-top, +body.no-js #adminmenu .wp-menu-toggle, +.js.folded #adminmenu div.wp-menu-toggle { + display: none; +} + +body.js #adminmenu li.wp-menu-open .wp-submenu, +body.no-js #adminmenu .open-if-no-js .wp-submenu, +body.no-js #adminmenu li.wp-has-current-submenu .wp-submenu { + display: block; +} + +#adminmenu div.wp-menu-image { + float: left; + width: 28px; + height: 28px; +} +.js.folded #adminmenu div.wp-menu-image { + width: 32px; +} + +#adminmenu li { + margin: 0; + padding: 0; + cursor: pointer; +} + +#adminmenu a { + display: block; + line-height: 18px; + padding: 2px 5px; +} + +#adminmenu li.menu-top { + min-height: 26px; + position: relative; +} + +#adminmenu a.menu-top { + font-weight: bold; + line-height: 18px; + min-width: 10em; + padding: 5px 5px; + border-width: 1px 0 1px; + border-style: solid; +} + +#adminmenu li.wp-menu-open { + border-width: 0 0 1px; + border-style: solid; +} + +#adminmenu .wp-submenu a { + margin: 0; + padding-left: 12px; +} + +.wp-menu-arrow { + display: none; +} +#adminmenu li.wp-has-current-submenu .wp-menu-arrow, +#adminmenu li.menu-top.current .wp-menu-arrow { + display: block; + position: absolute; + right: -9px; + top: 0; + cursor: auto; + z-index: 25; +} +#adminmenu .wp-menu-arrow div { + width: 15px; + height: 30px; + background: url(../images/menu-arrow-frame.png) top right no-repeat; +} + +#adminmenu .wp-submenu li { + padding: 0; + margin: 0; +} + +.js.folded #adminmenu li.menu-top { + width: 32px; + height: 29px; + border-width: 1px 0; + border-style: solid; +} + +#adminmenu .wp-menu-image img { + float: left; + padding: 8px 6px 0; + opacity: 0.6; + filter: alpha(opacity=60); +} + +#adminmenu li.menu-top:hover .wp-menu-image img, +#adminmenu li.wp-has-current-submenu .wp-menu-image img { + opacity: 1; + filter: alpha(opacity=100); +} + +#adminmenu li.wp-menu-separator { + height: 3px; + padding: 0; + margin: 0; + border-width: 1px 0; + border-style: solid; + cursor: inherit; +} + +#adminmenu div.separator { + height: 1px; + padding: 0; + border-width: 1px 0 0 0; + border-style: solid; +} + +.js.folded #adminmenu .wp-submenu { + display: block; + position: absolute; + top: -5px; + left: 26px; + z-index: 999; + width: 0; + padding: 0; + overflow: hidden; + -moz-transition: width 200ms ease-out; + -webkit-transition: width 200ms ease-out; + -o-transition: width 200ms ease-out; + transition: width 200ms ease-out; +} +.js.folded #adminmenu .wp-submenu.sub-open { + padding: 0 8px 8px 0; +} + +#adminmenu .wp-submenu .wp-submenu-head { + padding: 6px 4px 5px 10px; + cursor: default; + border-width: 1px 0; + border-style: solid; +} + +.js.folded #adminmenu .wp-submenu-wrap { + margin-top: 4px; + border-width: 0 1px 1px 0; + border-style: solid; + position: relative; + -webkit-border-bottom-right-radius: 3px; + -webkit-border-top-right-radius: 3px; + -khtml-border-bottom-right-radius: 3px; + -khtml-border-top-right-radius: 3px; + -moz-border-radius-bottomright: 3px; + -moz-border-radius-topright: 3px; + border-bottom-right-radius: 3px; + border-top-right-radius: 3px; +} + +.js.folded #adminmenu .wp-submenu ul { + border-width: 0 0 0 1px; + border-style: solid; +} + +.js.folded #adminmenu .wp-submenu a { + padding-left: 10px; +} + +.js.folded #adminmenu a.wp-has-submenu { + margin-left: 40px; +} + +#adminmenu .wp-menu-toggle { + width: 18px; + clear: right; + float: right; + margin: 1px 0 0; + height: 27px; + padding: 1px 2px 0 0; + cursor: pointer; +} + +#adminmenu .wp-menu-image a { + height: 24px; +} + +#adminmenu .wp-menu-image img { + padding: 6px 0 0 1px; +} + +#adminmenu .awaiting-mod, +#adminmenu span.update-plugins, +#sidemenu li a span.update-plugins { + position: absolute; + font-family: sans-serif; + font-size: 9px; + line-height: 17px; + font-weight: bold; + margin-top: 1px; + margin-left: 7px; + -moz-border-radius: 10px; + -khtml-border-radius: 10px; + -webkit-border-radius: 10px; + border-radius: 10px; +} + +#adminmenu li .awaiting-mod span, +#adminmenu li span.update-plugins span, +#sidemenu li a span.update-plugins span { + display: block; + padding: 0 6px; +} + +#adminmenu li span.count-0, +#sidemenu li a .count-0 { + display: none; +} + +.post-com-count-wrapper { + min-width: 22px; + font-family: sans-serif; +} + +.post-com-count { + height: 1.3em; + line-height: 1.1em; + display: block; + text-decoration: none; + padding: 0 0 6px; + cursor: pointer; + background-position: center -80px; + background-repeat: no-repeat; +} + +.post-com-count span { + font-size: 11px; + font-weight: bold; + height: 1.4em; + line-height: 1.4em; + min-width: 0.7em; + padding: 0 6px; + display: inline-block; + cursor: pointer; + -moz-border-radius: 5px; + -khtml-border-radius: 5px; + -webkit-border-radius: 5px; + border-radius: 5px; +} + +strong .post-com-count { + background-position: center -55px; +} + +.post-com-count:hover { + background-position: center -3px; +} + +.column-response .post-com-count { + float: left; + margin-right: 5px; + text-align: center; +} + +.response-links { + float: left; +} + +#the-comment-list .attachment-80x60 { + padding: 4px 8px; +} + +#collapse-menu { + font-size: 12px; + line-height: 34px; +} + +.js.folded #collapse-menu span { + display: none; +} + +#collapse-button, +#collapse-button div { + width: 15px; + height: 15px; +} + +#collapse-button { + float: left; + margin: 8px 6px; + border-width: 1px; + border-style: solid; + -moz-border-radius: 10px; + -khtml-border-radius: 10px; + -webkit-border-radius: 10px; + border-radius: 10px; +} + + +/*------------------------------------------------------------------------------ + 8.0 - Layout Blocks +------------------------------------------------------------------------------*/ + +body.wp-admin { + min-width: 785px; +} + +body.admin-bar #wphead, +body.admin-bar #adminmenu { + padding-top: 28px; +} + +.narrow { + width: 70%; + margin-bottom: 40px; +} + +.narrow p { + line-height: 150%; +} + +.widefat th, +.widefat td { + overflow: hidden; +} + +.widefat th { + font-family: Georgia, "Times New Roman", "Bitstream Charter", Times, serif; + font-weight: normal; +} + +.widefat td p { + margin: 2px 0 0.8em; +} + +.widefat .column-comment p { + margin: 0.6em 0; +} + +.postbox-container { + float: left; + padding-right: 0.5%; +} + +.postbox-container .meta-box-sortables { + min-height: 300px; +} + +.postbox .hndle { + cursor: move; +} + +.hndle a { + font-size: 11px; + font-weight: normal; +} + +.postbox .handlediv { + float: right; + width: 27px; + height: 30px; + cursor: pointer; +} + +.sortable-placeholder { + border-width: 1px; + border-style: dashed; + margin-bottom: 20px; +} + +.widget, +.postbox, +.stuffbox { + margin-bottom: 20px; + padding: 0; + border-width: 1px; + border-style: solid; + line-height: 1; +} + +.widget .widget-top, +.postbox h3, +.stuffbox h3 { + margin-top: 1px; + border-bottom-width: 1px; + border-style: solid; + cursor: move; + -webkit-user-select: none; + -moz-user-select: none; + -khtml-user-select: none; + user-select: none; +} + +.postbox .inside, +.stuffbox .inside { + padding: 0 10px; +} + +.postbox.closed h3 { + border: none; + -moz-box-shadow: none; + -webkit-box-shadow: none; + box-shadow: none; +} + +.postbox table.form-table { + margin-bottom: 0; +} + +.postbox input[type="text"], +.postbox textarea, +.stuffbox input[type="text"], +.stuffbox textarea { + border-width: 1px; + border-style: solid; +} + +.temp-border { + border: 1px dotted #ccc; +} + +.columns-prefs label { + padding: 0 5px; +} + + +/*------------------------------------------------------------------------------ + 9.0 - Dashboard +------------------------------------------------------------------------------*/ + +#wpbody-content .metabox-holder { + padding-top: 10px; +} + +#dashboard-widgets .meta-box-sortables { + margin: 0 5px; +} + +#dashboard_recent_comments div.undo { + border-top-style: solid; + border-top-width: 1px; + margin: 0 -10px; + padding: 3px 8px; + font-size: 11px; +} + +#the-comment-list td.comment p.comment-author { + margin-top: 0; + margin-left: 0; +} + +#the-comment-list p.comment-author img { + float: left; + margin-right: 8px; +} + +#the-comment-list p.comment-author strong a { + border: none; +} + +#the-comment-list td { + vertical-align: top; +} + +#the-comment-list td.comment { + word-wrap: break-word; +} + + +/*------------------------------------------------------------------------------ + 10.0 - List Posts (/Pages/etc) +------------------------------------------------------------------------------*/ + +table.fixed { + table-layout: fixed; +} +.fixed .column-rating, +.fixed .column-visible { + width: 8%; +} +.fixed .column-date, +.fixed .column-parent, +.fixed .column-links { + width: 10%; +} +.fixed .column-response, +.fixed .column-author, +.fixed .column-categories, +.fixed .column-tags, +.fixed .column-rel, +.fixed .column-role { + width: 15%; +} +.fixed .column-comments { + width: 4em; + padding: 8px 0; + text-align: left; +} +.fixed .column-comments .vers { + padding-left: 3px; +} +.fixed .column-comments a { + float: left; +} +.fixed .column-slug { + width: 25%; +} +.fixed .column-posts { + width: 10%; +} +.fixed .column-icon { + width: 80px; +} +#commentsdiv .fixed .column-author, +#comments-form .fixed .column-author { + width: 20%; +} +#commentsdiv.postbox .inside { + line-height: 1.4em; + margin: 0; + padding: 0; +} +#commentsdiv.postbox .inside .row-actions { + line-height:18px; +} +#commentsdiv.postbox .inside td { + padding:1em 10px; +} +#commentsdiv.postbox .inside .column-comment p { +} +#commentsdiv.postbox .inside .column-author { + width:33%; +} +#commentsdiv.postbox .inside p { + margin:6px 10px 8px; +} +#commentsdiv.postbox .column-comment p { + margin:0.6em 0; +} +#commentsdiv.postbox #replyrow td { + padding:0; +} +.sorting-indicator { + display: none; + width: 7px; + height: 4px; + margin-top: 8px; + margin-left: 7px; + background-image: url(../images/sort.gif); + background-repeat: no-repeat; +} +.fixed .column-comments .sorting-indicator { + margin-top: 3px; +} +.widefat th.sortable, +.widefat th.sorted { + padding: 0; +} +th.sortable a, +th.sorted a { + display: block; + overflow: hidden; + padding: 7px 7px 8px; +} +.fixed .column-comments.sortable a, +.fixed .column-comments.sorted a { + padding: 8px 0; +} +th.sortable a span, +th.sorted a span { + float: left; + cursor: pointer; +} +th.sorted.asc .sorting-indicator, +th.desc:hover span.sorting-indicator { + display: block; + background-position: 0 0; +} +th.sorted.desc .sorting-indicator, +th.asc:hover span.sorting-indicator { + display: block; + background-position: -7px 0; +} + +/* Bulk Actions */ + +.tablenav-pages a { + border-bottom-style: solid; + border-bottom-width: 2px; + font-weight: bold; + margin-right: 1px; + padding: 0 2px; +} +.tablenav-pages .current-page { + text-align: center; +} +.tablenav-pages .next-page { + margin-left: 2px; +} + +.tablenav a.button-secondary { + display: block; + margin: 3px 8px 0 0; +} + +.tablenav { + clear: both; + height: 30px; + margin: 6px 0 4px; + vertical-align: middle; +} + +.tablenav .tablenav-pages { + float: right; + display: block; + cursor: default; + height: 30px; + line-height: 30px; + font-size: 12px; +} + +.tablenav .no-pages, +.tablenav .one-page .pagination-links { + display: none; +} + +.tablenav .tablenav-pages a, +.tablenav-pages span.current { + text-decoration: none; + border: none; + padding: 3px 6px; + border-width: 1px; + border-style: solid; + -moz-border-radius: 3px; + -khtml-border-radius: 3px; + -webkit-border-radius: 3px; + border-radius: 3px; +} + +.tablenav .tablenav-pages a.disabled:hover { + cursor: default; +} + +.tablenav .tablenav-pages a.disabled:active { + cursor: default; +} + +.tablenav .displaying-num { + margin-right: 10px; + font-size: 12px; + font-family: Georgia, "Times New Roman", "Bitstream Charter", Times, serif; + font-style: italic; +} + +.tablenav .actions { + padding: 2px 8px 0 0; +} + +.tablenav .delete { + margin-right: 20px; +} + +.view-switch { + float: right; + margin: 6px 8px 0; +} + +.view-switch a { + text-decoration: none; +} + +.filter { + float: left; + margin: -5px 0 0 10px; +} + +.filter .subsubsub { + margin-left: -10px; + margin-top: 13px; +} +.screen-per-page { + width: 3em; +} + +#posts-filter fieldset { + float: left; + margin: 0 1.5ex 1em 0; + padding: 0; +} + +#posts-filter fieldset legend { + padding: 0 0 .2em 1px; +} + +span.post-state-format { + font-weight: normal; +} + + +/*------------------------------------------------------------------------------ + 10.1 - Inline Editing +------------------------------------------------------------------------------*/ + +/* +.quick-edit* is for Quick Edit +.bulk-edit* is for Bulk Edit +.inline-edit* is for everything +*/ + +/* Layout */ +tr.inline-edit-row td { + padding: 0 0.5em; +} + +#wpbody-content .inline-edit-row fieldset { + font-size: 12px; + float: left; + margin: 0; + padding: 0; + width: 100%; +} + +#wpbody-content .inline-edit-row fieldset .inline-edit-col { + padding: 0 0.5em; +} + +#wpbody-content .quick-edit-row-page fieldset.inline-edit-col-right .inline-edit-col { + border-width: 0 0 0 1px; + border-style: none none none solid; +} + +#wpbody-content .quick-edit-row-post .inline-edit-col-left { + width: 40%; +} + +#wpbody-content .quick-edit-row-post .inline-edit-col-right { + width: 39%; +} + +#wpbody-content .inline-edit-row-post .inline-edit-col-center { + width: 20%; +} + +#wpbody-content .quick-edit-row-page .inline-edit-col-left { + width: 50%; +} + +#wpbody-content .quick-edit-row-page .inline-edit-col-right, +#wpbody-content .bulk-edit-row-post .inline-edit-col-right { + width: 49%; +} + +#wpbody-content .bulk-edit-row .inline-edit-col-left { + width: 30%; +} + +#wpbody-content .bulk-edit-row-page .inline-edit-col-right { + width: 69%; +} + +#wpbody-content .bulk-edit-row .inline-edit-col-bottom { + float: right; + width: 69%; +} + +#wpbody-content .inline-edit-row-page .inline-edit-col-right { + margin-top: 27px; +} + +.inline-edit-row fieldset .inline-edit-group { + clear: both; +} + +.inline-edit-row fieldset .inline-edit-group:after { + content: "."; + display: block; + height: 0; + clear: both; + visibility: hidden; +} + +.inline-edit-row p.submit { + clear: both; + padding: 0.5em; + margin: 0.5em 0 0; +} + +.inline-edit-row span.error { + line-height: 22px; + margin: 0 15px; + padding: 3px 5px; +} + +/* Positioning */ +.inline-edit-row h4 { + margin: .2em 0; + padding: 0; + line-height: 23px; +} +.inline-edit-row fieldset span.title, +.inline-edit-row fieldset span.checkbox-title { + margin: 0; + padding: 0; + line-height: 27px; +} + +.inline-edit-row fieldset label, +.inline-edit-row fieldset span.inline-edit-categories-label { + display: block; + margin: .2em 0; +} + +.inline-edit-row fieldset label.inline-edit-tags { + margin-top: 0; +} + +.inline-edit-row fieldset label.inline-edit-tags span.title { + margin: .2em 0; +} + +.inline-edit-row fieldset label span.title { + display: block; + float: left; + width: 5em; +} + +.inline-edit-row fieldset label span.input-text-wrap { + display: block; + margin-left: 5em; +} + +.quick-edit-row-post fieldset.inline-edit-col-right label span.title { + width: auto; + padding-right: 0.5em; +} + +.inline-edit-row .input-text-wrap input[type=text] { + width: 100%; +} + +.inline-edit-row fieldset label input[type=checkbox] { + vertical-align: text-bottom; +} + +.inline-edit-row fieldset label textarea { + width: 100%; + height: 4em; +} + +#wpbody-content .bulk-edit-row fieldset .inline-edit-group label { + max-width: 50%; +} + +#wpbody-content .quick-edit-row fieldset .inline-edit-group label.alignleft:first-child { + margin-right: 0.5em +} + +.inline-edit-col-right .input-text-wrap input.inline-edit-menu-order-input { + width: 6em; +} + + +/* Styling */ +.inline-edit-row h4 { + text-transform: uppercase; +} + +.inline-edit-row fieldset span.title, +.inline-edit-row fieldset span.checkbox-title { + font-family: Georgia, "Times New Roman", "Bitstream Charter", Times, serif; + font-style: italic; + line-height: 1.8em; +} + +/* Specific Elements */ +.inline-edit-row fieldset input[type="text"], +.inline-edit-row fieldset textarea { + border-style: solid; + border-width: 1px; +} + +.inline-edit-row fieldset .inline-edit-date { + float: left; +} + +.inline-edit-row fieldset input[name=jj], +.inline-edit-row fieldset input[name=hh], +.inline-edit-row fieldset input[name=mn] { + font-size: 12px; + width: 2.1em; +} + +.inline-edit-row fieldset input[name=aa] { + font-size: 12px; + width: 3.5em; +} + +.inline-edit-row fieldset label input.inline-edit-password-input { + width: 8em; +} + +.inline-edit-row .catshow, +.inline-edit-row .cathide { + cursor: pointer; +} + +ul.cat-checklist { + height: 12em; + border-style: solid; + border-width: 1px; + overflow-y: scroll; + padding: 0 5px; + margin: 0; +} + +#bulk-titles { + display: block; + height: 12em; + border-style: solid; + border-width: 1px; + overflow-y: scroll; + padding: 0 5px; + margin: 0 0 5px; +} + +.inline-edit-row fieldset ul.cat-checklist li, +.inline-edit-row fieldset ul.cat-checklist input { + margin: 0; +} + +.inline-edit-row fieldset ul.cat-checklist label, +.inline-edit-row .catshow, +.inline-edit-row .cathide, +.inline-edit-row #bulk-titles div { + font-family: sans-serif; + font-style: normal; + font-size: 11px; +} + +table .inline-edit-row fieldset ul.cat-hover { + height: auto; + max-height: 30em; + overflow-y: auto; + position: absolute; +} + +.inline-edit-row fieldset label input.inline-edit-menu-order-input { + width: 3em; +} + +.inline-edit-row fieldset label input.inline-edit-slug-input { + width: 75%; +} + +.quick-edit-row-post fieldset label.inline-edit-status { + float: left; +} + +#bulk-titles { + line-height: 140%; +} +#bulk-titles div { + margin: 0.2em 0.3em; +} + +#bulk-titles div a { + cursor: pointer; + display: block; + float: left; + height: 10px; + margin: 3px 3px 0 -2px; + overflow: hidden; + position: relative; + text-indent: -9999px; + width: 10px; +} + + +/*------------------------------------------------------------------------------ + 11.0 - Write/Edit Post Screen +------------------------------------------------------------------------------*/ + +#titlediv { + position: relative; + margin-bottom: 20px; +} +#titlediv label { cursor: text; } + +#titlediv div.inside { + margin: 0; +} + +#poststuff #titlewrap { + border: 0; + padding: 0; + +} + +#titlediv #title { + padding: 3px 4px; + border-width: 1px; + border-style: solid; + -moz-border-radius: 3px; + -khtml-border-radius: 3px; + -webkit-border-radius: 3px; + border-radius: 3px; + font-size: 1.7em; + line-height: 100%; + width: 100%; + outline: none; +} + +#titlediv #title-prompt-text, +#wp-fullscreen-title-prompt-text { + color: #bbb; + position: absolute; + font-size: 1.7em; + padding: 8px; +} + +#wp-fullscreen-title-prompt-text { + left: 0; + padding: 11px; +} + +#poststuff .inside-submitbox, +#side-sortables .inside-submitbox { + margin: 0 3px; + font-size: 11px; +} + +input#link_description, +input#link_url { + width: 98%; +} + +#pending { + background: 0 none; + border: 0 none; + padding: 0; + font-size: 11px; + margin-top: -1px; +} + +#edit-slug-box { + height: 1em; + margin-top: 8px; + padding: 0 7px; +} + +#editable-post-name-full { + display: none; +} + +#editable-post-name input { + width: 16em; +} + +.postarea h3 label { + float: left; +} + +.postarea #add-media-button { + float: right; + margin: 7px 0pt 0pt; + position: relative; + right: 10px; +} + +#poststuff #editor-toolbar { + height: 30px; +} + +.wp_themeSkin tr.mceFirst td.mceToolbar { + border-width: 0 0 1px; + border-style: none none solid; +} + +#edButtonPreview, +#edButtonHTML { + height: 18px; + margin: 5px 5px 0 0; + padding: 4px 5px 2px; + float: right; + cursor: pointer; + border-width: 1px; + border-style: solid; + -moz-border-radius: 3px 3px 0 0; + -webkit-border-top-right-radius: 3px; + -webkit-border-top-left-radius: 3px; + -khtml-border-top-right-radius: 3px; + -khtml-border-top-left-radius: 3px; + border-top-right-radius: 3px; + border-top-left-radius: 3px; +} + +.js .theEditor { + color: white; +} + +#poststuff #edButtonHTML { + margin-right: 15px; +} + +#media-buttons { + cursor: default; + padding: 8px 8px 0; +} + +#media-buttons a { + cursor: pointer; + padding: 0 0 5px 10px; +} + +#media-buttons img, +#submitpost #ajax-loading, +#submitpost .ajax-loading { + vertical-align: middle; +} + +#wpcontent .ajax-loading { + visibility: hidden; +} + +.submitbox .submit { + text-align: left; + padding: 12px 10px 10px; + font-size: 11px; +} + +.submitbox .submitdelete { + border-bottom-width: 1px; + border-bottom-style: solid; + text-decoration: none; + padding: 1px 2px; +} + +.inside-submitbox #post_status { + margin: 2px 0 2px -2px; +} + +.submitbox .submit a:hover { + border-bottom-width: 1px; + border-bottom-style: solid; +} + +.submitbox .submit input { + margin-bottom: 8px; + margin-right: 4px; + padding: 6px; +} + +#post-status-select, #post-format { + line-height: 2.5em; + margin-top: 3px; +} + +/* Post Screen */ +#post-body #normal-sortables { + min-height: 50px; +} + +#post-body #advanced-sortables { + min-height: 20px; +} + +.postbox { + -moz-border-radius: 3px; + -webkit-border-radius: 3px; + -khtml-border-radius: 3px; + border-radius: 3px; + position: relative; + min-width: 255px; +} + +#trackback_url { + width: 99%; +} + +#normal-sortables .postbox .submit { + background: transparent none; + border: 0 none; + float: right; + padding: 0 12px; + margin:0; +} + +#side-sortables .category-add input { + width: 94%; +} + +#side-sortables .category-add select { + width: 100%; +} + +#side-sortables .category-add input.category-add-sumbit, +#post-body .category-add input.category-add input.category-add-sumbit { + width: auto; +} + +#post-body ul.category-tabs, +#post-body ul.add-menu-item-tabs { + float: left; + width: 120px; + text-align: right; + /* Negative margin for the sake of those without JS: all tabs display */ + margin: 0 -120px 0 5px; + padding: 0; +} + +#post-body ul.category-tabs li, +#post-body ul.add-menu-item-tabs li { + padding: 8px; +} + +#post-body ul.category-tabs li.tabs, +#post-body ul.add-menu-item-tabs li.tabs { + -moz-border-radius: 3px 0 0 3px; + -webkit-border-top-left-radius: 3px; + -webkit-border-bottom-left-radius: 3px; + -khtml-border-top-left-radius: 3px; + -khtml-border-bottom-left-radius: 3px; + border-top-left-radius: 3px; + border-bottom-left-radius: 3px; +} + +#post-body ul.category-tabs li.tabs a, +#post-body ul.add-menu-item-tabs li.tabs a { + font-weight: bold; + text-decoration: none; +} + +.wp-tab-panel, +.categorydiv div.tabs-panel, +.customlinkdiv div.tabs-panel, +.posttypediv div.tabs-panel, +.taxonomydiv div.tabs-panel, +#linkcategorydiv div.tabs-panel { + height: 200px; + overflow: auto; + padding: 0.5em 0.9em; + border-style: solid; + border-width: 1px; +} + +.nav-menus-php .customlinkdiv div.tabs-panel, +.nav-menus-php .posttypediv div.tabs-panel, +.nav-menus-php .taxonomydiv div.tabs-panel { + height: auto; + max-height: 205px; +} + +div.tabs-panel-active { + display:block; +} + +div.tabs-panel-inactive { + display:none; +} + +#post-body .categorydiv div.tabs-panel, +.taxonomy div.tabs-panel, +#post-body #linkcategorydiv div.tabs-panel { + margin: 0 5px 0 125px; +} + +#side-sortables .category-tabs li, +#side-sortables .add-menu-item-tabs li, +.wp-tab-bar li { + display: inline; + line-height: 1.35em; +} + +#side-sortables .category-tabs a, +#side-sortables .add-menu-item-tabs a, +.wp-tab-bar a { + text-decoration: none; +} + +#side-sortables .category-tabs, +#side-sortables .add-menu-item-tabs, +.wp-tab-bar { + margin-bottom: 3px; +} + +.categorydiv ul, +.customlinkdiv ul, +.posttypediv ul, +.taxonomydiv ul, +#linkcategorydiv ul { + list-style: none; + padding: 0; + margin: 0; +} + +#normal-sortables .postbox #replyrow .submit { + float: none; + margin: 0; + padding: 3px 7px; +} + +#side-sortables .submitbox .submit input, +#side-sortables .submitbox .submit .preview, +#side-sortables .submitbox .submit a.preview:hover { + border: 0 none; +} + +#side-sortables .inside-submitbox .insidebox, +.stuffbox .insidebox { + margin: 11px 0; +} + +#side-sortables .comments-box, +#normal-sortables .comments-box { + border: 0 none; +} +ul.category-tabs, +ul.add-menu-item-tabs, +ul.wp-tab-bar { + margin-top: 12px; +} + +#side-sortables .comments-box thead th, +#normal-sortables .comments-box thead th { + background: transparent; + padding: 0 7px 4px; + font-style: italic; +} + +ul.category-tabs li.tabs, +ul.add-menu-item-tabs li.tabs, +.wp-tab-active { + border-style: solid solid none; + border-width: 1px 1px 0; +} + +#commentsdiv img.waiting { + padding-left: 5px; +} + +#post-body .category-tabs li.tabs, +#post-body .add-menu-item-tabs li.tabs { + border-style: solid none solid solid; + border-width: 1px 0 1px 1px; + margin-right: -1px; +} + +ul.category-tabs li, +ul.add-menu-item-tabs li, +ul.wp-tab-bar li { + padding: 5px; + -moz-border-radius: 3px 3px 0 0; + -webkit-border-top-left-radius: 3px; + -webkit-border-top-right-radius: 3px; + -khtml-border-top-left-radius: 3px; + -khtml-border-top-right-radius: 3px; + border-top-left-radius: 3px; + border-top-right-radius: 3px; +} + +/* positioning etc. */ + +form#tags-filter { + position: relative; +} + +.screen-per-page { + width: 3em; +} + +#posts-filter fieldset { + float: left; + margin: 0 1.5ex 1em 0; + padding: 0; +} + +#posts-filter fieldset legend { + padding: 0 0 .2em 1px; +} + +/* Edit posts */ + +td.post-title strong, td.plugin-title strong { + display: block; + margin-bottom: .2em; +} + +td.post-title p, td.plugin-title p { + margin: 6px 0; +} + +/* Global classes */ + +.wp-hidden-children .wp-hidden-child, +.ui-tabs-hide { + display: none; +} + +.commentlist .avatar { + vertical-align: text-top; +} + +#post-body .tagsdiv #newtag { + margin-right: 5px; + width: 16em; +} + +#side-sortables input#post_password { + width: 94% +} + +#side-sortables .tagsdiv #newtag { + width: 68%; +} + +#post-status-info { + border-width: 0 1px 1px; + border-style: none solid solid; + width: 100%; + -moz-border-radius: 0 0 3px 3px; + -webkit-border-bottom-left-radius: 3px; + -webkit-border-bottom-right-radius: 3px; + -khtml-border-bottom-left-radius: 3px; + -khtml-border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; + border-bottom-right-radius: 3px; +} + +#post-status-info td { + font-size: 12px; +} + +.autosave-info { + padding: 2px 15px 2px 2px; + text-align: right; +} + +#editorcontent #post-status-info { + border: none; +} + +#post-body .wp_themeSkin .mceStatusbar a.mceResize { + display: block; + background: transparent url(../images/resize.gif) no-repeat scroll right bottom; + width: 12px; + cursor: se-resize; + margin: 0 2px; + position: relative; + top: 22px; +} + +#wp-word-count { + display: block; + padding: 2px 7px; +} + +#timestampdiv select { + height: 20px; + line-height: 14px; + padding: 0; + vertical-align: top; +} + +#jj, #hh, #mn { + width: 2em; + padding: 1px; + font-size: 12px; +} + +#aa { + width: 3.4em; + padding: 1px; + font-size: 12px; +} + +.curtime #timestamp { + background-repeat: no-repeat; + background-position: left top; + padding-left: 18px; +} + +#timestampdiv { + padding-top: 5px; + line-height: 23px; +} + +#timestampdiv p { + margin: 8px 0 6px; +} + +#timestampdiv input { + border-width: 1px; + border-style: solid; +} + + +/*------------------------------------------------------------------------------ + 11.1 - Custom Fields +------------------------------------------------------------------------------*/ + +#postcustomstuff table, +#postcustomstuff input, +#postcustomstuff textarea { + border-width: 1px; + border-style: solid; + -moz-border-radius: 3px; + -khtml-border-radius: 3px; + -webkit-border-radius: 3px; + border-radius: 3px; +} + +#postcustomstuff .updatemeta, +#postcustomstuff .deletemeta { + margin: auto; +} + +#postcustomstuff thead th { + padding: 5px 8px 8px; +} + +#postcustom #postcustomstuff .submit { + border: 0 none; + float: none; + padding: 5px 8px; +} + +#side-sortables #postcustom #postcustomstuff .submit { + padding: 0 5px; +} + +#side-sortables #postcustom #postcustomstuff td.left input { + margin: 3px 3px 0; +} + +#side-sortables #postcustom #postcustomstuff #the-list textarea { + height: 85px; + margin: 3px; +} + +#postcustomstuff table { + margin: 0; + width: 100%; + border-width: 1px; + border-style: solid; + border-spacing: 0; +} + +#postcustomstuff table input, +#postcustomstuff table select, +#postcustomstuff table textarea { + width: 95%; + margin: 8px 0 8px 8px; +} + +#postcustomstuff th.left, +#postcustomstuff td.left { + width: 38%; +} + +#postcustomstuff .submit input { + width: auto; +} + +#postcustomstuff #newmeta .submit { + padding: 0 8px; +} + +#postcustomstuff table #addmetasub { + width: auto; +} + +#postcustomstuff #newmetaleft { + vertical-align: top; +} + +#postcustomstuff #newmetaleft a { + padding: 0 10px; + text-decoration: none; +} + + +/*------------------------------------------------------------------------------ + 11.2 - Post Revisions +------------------------------------------------------------------------------*/ + +table.diff { + width: 100%; +} + +table.diff col.content { + width: 50%; +} + +table.diff tr { + background-color: transparent; +} + +table.diff td, table.diff th { + padding: .5em; + font-family: Consolas, Monaco, monospace; + border: none; +} + +table.diff .diff-deletedline del, table.diff .diff-addedline ins { + text-decoration: none; +} + + +/*------------------------------------------------------------------------------ + 12.0 - Categories +------------------------------------------------------------------------------*/ + +.category-adder { + margin-left: 120px; + padding: 4px 0; +} + +.category-adder h4 { + margin: 0 0 8px; +} + +#side-sortables .category-adder { + margin: 0; +} + +#post-body .category-add input, .category-add select { + width: 30%; +} + +#side-sortables .category-add select { + width: 100%; +} + +#side-sortables .category-add input.category-add-sumbit, #post-body .category-add input.category-add input.category-add-sumbit { + width: auto; +} + +#post-body ul.category-tabs, +#post-body ul.add-menu-item-tabs { + float: left; + width: 120px; + text-align: right; + /* Negative margin for the sake of those without JS: all tabs display */ + margin: 0 -120px 0 5px; + padding: 0; +} + +#post-body ul.category-tabs li, +#post-body ul.add-menu-item-tabs li { + padding: 8px; +} + +#post-body ul.category-tabs li.tabs, +#post-body ul.add-menu-item-tabs li.tabs { + -moz-border-radius: 3px 0 0 3px; + -webkit-border-top-left-radius: 3px; + -webkit-border-bottom-left-radius: 3px; + -khtml-border-top-left-radius: 3px; + -khtml-border-bottom-left-radius: 3px; + border-top-left-radius: 3px; + border-bottom-left-radius: 3px; +} + +#post-body ul.category-tabs li.tabs a, +#post-body ul.add-menu-item-tabs li.tabs a { + font-weight: bold; + text-decoration: none; +} + +.categorydiv div.tabs-panel, +.customlinkdiv div.tabs-panel, +.posttypediv div.tabs-panel, +.taxonomydiv div.tabs-panel, +#linkcategorydiv div.tabs-panel { + height: 200px; + overflow: auto; + padding: 0.5em 0.9em; + border-style: solid; + border-width: 1px; +} + +.nav-menus-php .customlinkdiv div.tabs-panel, +.nav-menus-php .posttypediv div.tabs-panel, +.nav-menus-php .taxonomydiv div.tabs-panel { + height: auto; + max-height: 205px; +} + +div.tabs-panel-active { + display:block; +} + +div.tabs-panel-inactive { + display:none; +} + +#post-body .categorydiv div.tabs-panel, +.taxonomy div.tabs-panel, +#post-body #linkcategorydiv div.tabs-panel { + margin: 0 5px 0 125px; +} + +.categorydiv ul, +.customlinkdiv ul, +.posttypediv ul, +.taxonomydiv ul, +#linkcategorydiv ul { + list-style: none; + padding: 0; + margin: 0; +} + +#front-page-warning, +#front-static-pages ul, +ul.export-filters, +.inline-editor ul.cat-checklist ul, +.categorydiv ul.categorychecklist ul, +.customlinkdiv ul.categorychecklist ul, +.posttypediv ul.categorychecklist ul, +.taxonomydiv ul.categorychecklist ul, +#linkcategorydiv ul.categorychecklist ul { + margin-left: 18px; +} + +ul.categorychecklist li { + margin: 0; + padding: 0; + line-height: 19px; + word-wrap: break-word; +} + +.categorydiv .tabs-panel, +.customlinkdiv .tabs-panel, +.posttypediv .tabs-panel, +.taxonomydiv .tabs-panel { + border-width: 3px; + border-style: solid; +} + +ul.category-tabs, +ul.add-menu-item-tabs { + margin-top: 12px; +} + +ul.category-tabs li.tabs, +ul.add-menu-item-tabs li.tabs { + border-style: solid solid none; + border-width: 1px 1px 0; +} + +#post-body .category-tabs li.tabs, +#post-body .add-menu-item-tabs li.tabs { + border-style: solid none solid solid; + border-width: 1px 0 1px 1px; + margin-right: -1px; +} + +ul.category-tabs li, +ul.add-menu-item-tabs li { + padding: 5px; + -moz-border-radius: 3px 3px 0 0; + -webkit-border-top-left-radius: 3px; + -webkit-border-top-right-radius: 3px; + -khtml-border-top-left-radius: 3px; + -khtml-border-top-right-radius: 3px; + border-top-left-radius: 3px; + border-top-right-radius: 3px; +} + +.form-wrap { + margin: 10px 0; + width: 97%; +} + +.form-wrap p, +.form-wrap label { + font-size: 11px; +} + +.form-wrap label { + display: block; + padding: 2px; + font-size: 12px; +} + +.form-field input, +.form-field textarea { + border-style: solid; + border-width: 1px; + width: 95%; +} + +p.description, +.form-wrap p { + margin: 2px 0 5px; +} + +p.help, +p.description, +span.description, +.form-wrap p { + font-size: 12px; + font-style: italic; + font-family: sans-serif; +} + +.form-wrap .form-field { + margin: 0 0 10px; + padding: 8px; +} + +.col-wrap h3 { + margin: 12px 0; + font-size: 1.1em; +} + +.col-wrap p.submit { + margin-top: -10px; +} + + +/*------------------------------------------------------------------------------ + 13.0 - Tags +------------------------------------------------------------------------------*/ + +.taghint { + color: #aaa; + margin: 15px 0 -24px 12px; +} + +#poststuff .tagsdiv .howto { + margin: 0 0 6px 8px; +} + +.ajaxtag .newtag { + position: relative; +} + +.tagsdiv .newtag { + width: 180px; +} + +.tagsdiv .the-tags { + display: block; + height: 60px; + margin: 0 auto; + overflow: auto; + width: 260px; +} + +#post-body-content .tagsdiv .the-tags { + margin: 0 5px; +} + +p.popular-tags { + -moz-border-radius: 8px; + -khtml-border-radius: 8px; + -webkit-border-radius: 8px; + border-radius: 8px; + border-width: 1px; + border-style: solid; + line-height: 2em; + padding: 8px 12px 12px; + text-align: justify; +} + +p.popular-tags a { + padding: 0 3px; +} + +.tagcloud { + width: 97%; + margin: 0 0 40px; + text-align: justify; +} + +.tagcloud h3 { + margin: 2px 0 12px; +} + +.ac_results { + padding: 0; + margin: 0; + list-style: none; + position: absolute; + z-index: 10000; + display: none; + border-width: 1px; + border-style: solid; +} + +.ac_results li { + padding: 2px 5px; + white-space: nowrap; + text-align: left; +} + +.ac_over { + cursor: pointer; +} + +.ac_match { + text-decoration: underline; +} + + +/*------------------------------------------------------------------------------ + 14.0 - Media Screen +------------------------------------------------------------------------------*/ + +#wpbody-content #media-items .describe { + border-collapse: collapse; + width: 100%; + border-top-style: solid; + border-top-width: 1px; + clear: both; + cursor: default; + padding: 5px; +} + +#wpbody-content .describe th { + vertical-align: top; + text-align: left; + padding: 10px; + width: 140px; +} + +#wpbody-content .describe .media-item-info tr { + background-color: transparent; +} + +#wpbody-content .describe .media-item-info td { + padding: 4px 10px 0; +} + +.describe .media-item-info .A1B1 { + padding: 0 0 0 10px; +} + +#wpbody-content .filename { + padding: 0 10px; +} + +#wpbody-content .media-item .thumbnail { + max-height: 128px; + max-width: 128px; +} + +#wpbody-content #async-upload-wrap a { + display: none; +} + +.media-upload-form td label { + margin-right: 6px; + margin-left: 2px; +} + +.media-upload-form .align .field label { + display: inline; + padding: 0 0 0 22px; + margin: 0 1em 0 0; + font-weight: bold; +} + +.media-upload-form tr.image-size label { + margin: 0 0 0 3px; + font-weight: bold; +} + +.media-upload-form th.label label { + font-weight: bold; + margin: 0.5em; + font-size: 13px; +} + +.media-upload-form th.label label span { + padding: 0 5px; +} + +abbr.required { + border: medium none; + text-decoration: none; +} + +#wpbody-content .describe input[type="text"], +#wpbody-content .describe textarea { + width: 460px; +} + +#wpbody-content .describe p.help { + margin: 0; + padding: 0 0 0 5px; +} + +.media-item .error-div a.dismiss, +.describe-toggle-on, +.describe-toggle-off { + display: block; + line-height: 36px; + float: right; + margin-right: 20px; +} + +.describe-toggle-off { + display: none; +} + +#wpbody-content .media-item { + border-bottom-style: solid; + border-bottom-width: 1px; + min-height: 36px; + position: relative; + width: 100%; +} + +#wpbody-content .media-single .media-item { + border-bottom-style: none; + border-bottom-width: 0; +} + +#wpbody-content #media-items { + border-style: solid solid none; + border-width: 1px; + width: 670px; +} + +#wpbody-content #media-items .filename { + line-height: 36px; + overflow: hidden; +} + +.media-item .error-div { + padding-left: 10px; +} + +.media-item .pinkynail { + float: left; + margin: 2px; + max-width: 40px; + max-height: 32px; +} + +.media-item .startopen, +.media-item .startclosed { + display: none; +} + +.media-item .original { + position: relative; + height: 34px; + width: 503px; +} + +.media-item .percent { + font-weight: bold; +} + +.crunching { + display: block; + line-height: 32px; + text-align: right; + margin-right: 5px; +} + +.progress { + position: relative; + margin-bottom: -36px; + height: 36px; +} + +.bar { + width: 0; + height: 100%; + border-right-width: 3px; + border-right-style: solid; +} + +.upload-php .fixed .column-parent { + width: 25%; +} + + +/*------------------------------------------------------------------------------ + 14.1 - Media Uploader +------------------------------------------------------------------------------*/ + +.find-box { + width: 500px; + height: 300px; + overflow: hidden; + padding: 33px 5px 40px; + position: absolute; + z-index: 1000; +} + +.find-box-head { + cursor: move; + font-weight: bold; + height: 2em; + line-height: 2em; + padding: 1px 12px; + position: absolute; + top: 5px; + width: 100%; +} + +.find-box-inside { + overflow: auto; + width: 100%; + height: 100%; +} + +.find-box-search { + padding: 12px; + border-width: 1px; + border-style: none none solid; +} + +#find-posts-response { + margin: 8px 0; + padding: 0 1px; +} + +#find-posts-response table { + width: 100%; +} + +#find-posts-response .found-radio { + padding: 5px 0 0 8px; + width: 15px; +} + +.find-box-buttons { + width: 480px; + margin: 8px; +} + +.find-box-search label { + padding-right: 6px; +} + +.find-box #resize-se { + position: absolute; + right: 1px; + bottom: 1px; +} + +ul#dismissed-updates { + display: none; +} + +form.upgrade { + margin-top: 8px; +} + +form.upgrade .hint { + font-style: italic; + font-size: 85%; + margin: -0.5em 0 2em 0; +} + +#poststuff .inside .the-tagcloud { + margin: 5px 0 10px; + padding: 8px; + border-width: 1px; + border-style: solid; + line-height: 1.8em; + word-spacing: 3px; + -moz-border-radius: 6px; + -khtml-border-radius: 6px; + -webkit-border-radius: 6px; + border-radius: 6px; +} + +br.clear { + height: 2px; + line-height: 2px; +} + +.swfupload { + margin: 5px 10px; + vertical-align: middle; +} + + +/*------------------------------------------------------------------------------ + 14.2 - Image Editor +------------------------------------------------------------------------------*/ + +.describe .image-editor { + vertical-align: top; +} + +.imgedit-wrap { + position: relative; +} + +.imgedit-settings p { + margin: 8px 0; +} + +.describe .imgedit-wrap table td { + vertical-align: top; + padding-top: 0; +} + +.imgedit-wrap p, +.describe .imgedit-wrap table td { + font-size: 11px; + line-height: 18px; +} + +.describe .imgedit-wrap table td.imgedit-settings { + padding: 0 5px; +} + +td.imgedit-settings input { + vertical-align: middle; +} + +.imgedit-wait { + position: absolute; + top: 0; + background: #FFFFFF url(../images/wpspin_light.gif) no-repeat scroll 22px 10px; + opacity: 0.7; + filter: alpha(opacity=70); + width: 100%; + height: 500px; + display: none; +} + +.media-disabled, +.imgedit-settings .disabled { + color: grey; +} + +.imgedit-wait-spin { + padding: 0 4px 4px; + vertical-align: bottom; + visibility: hidden; +} + +.imgedit-menu { + margin: 0 0 12px; + min-width: 300px; +} + +.imgedit-menu div { + float: left; + width: 32px; + height: 32px; + -moz-border-radius: 3px; + -khtml-border-radius: 3px; + -webkit-border-radius: 3px; + border-radius: 3px; + border-width: 1px; + border-style: solid; +} + +.imgedit-crop-wrap { + position: relative; +} + +.imgedit-crop { + background: transparent url(../images/imgedit-icons.png) no-repeat scroll -9px -31px; + margin: 0 8px 0 0; +} + +.imgedit-crop.disabled:hover { + background-position: -9px -31px; +} + +.imgedit-crop:hover { + background-position: -9px -1px; +} + +.imgedit-rleft { + background: transparent url(../images/imgedit-icons.png) no-repeat scroll -46px -31px; + margin: 0 3px; +} + +.imgedit-rleft.disabled:hover { + background-position: -46px -31px; +} + +.imgedit-rleft:hover { + background-position: -46px -1px; +} + +.imgedit-rright { + background: transparent url(../images/imgedit-icons.png) no-repeat scroll -77px -31px; + margin: 0 8px 0 3px; +} + +.imgedit-rright.disabled:hover { + background-position: -77px -31px; +} + +.imgedit-rright:hover { + background-position: -77px -1px; +} + +.imgedit-flipv { + background: transparent url(../images/imgedit-icons.png) no-repeat scroll -115px -31px; + margin: 0 3px; +} + +.imgedit-flipv.disabled:hover { + background-position: -115px -31px; +} + +.imgedit-flipv:hover { + background-position: -115px -1px; +} + +.imgedit-fliph { + background: transparent url(../images/imgedit-icons.png) no-repeat scroll -147px -31px; + margin: 0 8px 0 3px; +} + +.imgedit-fliph.disabled:hover { + background-position: -147px -31px; +} + +.imgedit-fliph:hover { + background-position: -147px -1px; +} + +.imgedit-undo { + background: transparent url(../images/imgedit-icons.png) no-repeat scroll -184px -31px; + margin: 0 3px; +} + +.imgedit-undo.disabled:hover { + background-position: -184px -31px; +} + +.imgedit-undo:hover { + background-position: -184px -1px; +} + +.imgedit-redo { + background: transparent url(../images/imgedit-icons.png) no-repeat scroll -215px -31px; + margin: 0 8px 0 3px; +} + +.imgedit-redo.disabled:hover { + background-position: -215px -31px; +} + +.imgedit-redo:hover { + background-position: -215px -1px; +} + +.imgedit-applyto img { + margin: 0 8px 0 0; +} + +.imgedit-group-top { + margin: 5px 0; +} + +.imgedit-applyto .imgedit-label { + padding: 2px 0 0; + display: block; +} + +.imgedit-help { + display: none; + font-style: italic; + margin-bottom: 8px; +} + +.imgedit-help ul li { + font-size: 11px; +} + +a.imgedit-help-toggle { + text-decoration: none; +} + +#wpbody-content .imgedit-response div { + width: 600px; + margin: 8px; +} + +.form-table td.imgedit-response { + padding: 0; +} + +.imgedit-submit { + margin: 8px 0; +} + +.imgedit-submit-btn { + margin-left: 20px; +} + +.imgedit-wrap .nowrap { + white-space: nowrap; +} + +span.imgedit-scale-warn { + color: red; + font-size: 20px; + font-style: normal; + visibility: hidden; + vertical-align: middle; +} + +.imgedit-group { + border-width: 1px; + border-style: solid; + -moz-border-radius: 8px; + -khtml-border-radius: 8px; + -webkit-border-radius: 8px; + border-radius: 8px; + margin-bottom: 8px; + padding: 2px 10px; +} + + +/*------------------------------------------------------------------------------ + 15.0 - Comments Screen +------------------------------------------------------------------------------*/ + +.form-table { + border-collapse: collapse; + margin-top: 0.5em; + width: 100%; + margin-bottom: -8px; + clear: both; +} + +.form-table td { + margin-bottom: 9px; + padding: 8px 10px; + line-height: 20px; + font-size: 12px; +} + +.form-table th, +.form-wrap label { + font-weight: normal; + text-shadow: rgba(255,255,255,1) 0 1px 0; +} + +.form-table th { + vertical-align: top; + text-align: left; + padding: 10px; + width: 200px; +} + +.form-table th.th-full { + width: auto; +} + +.form-table div.color-option { + display: block; + clear: both; + margin-top: 12px; +} + +.form-table input.tog { + margin-top: 2px; + margin-right: 2px; + float: left; +} + +.form-table td p { + margin-top: 4px; +} + +.form-table table.color-palette { + vertical-align: bottom; + float: left; + margin: -12px 3px 11px; +} + +.form-table .color-palette td { + border-width: 1px 1px 0; + border-style: solid solid none; + height: 10px; + line-height: 20px; + width: 10px; +} + +.commentlist li { + padding: 1em 1em .2em; + margin: 0; + border-bottom-width: 1px; + border-bottom-style: solid; +} + +.commentlist li li { + border-bottom: 0; + padding: 0; +} + +.commentlist p { + padding: 0; + margin: 0 0 .8em; +} + +/* reply to comments */ +#replyrow { + font-size: 11px; +} + +#replyrow input { + border-width: 1px; + border-style: solid; +} + +#replyrow td { + padding: 2px; +} + +#replyrow #editorcontainer { + border: 0 none; +} + +#replysubmit { + margin: 0; + padding: 3px 7px; + text-align:center; +} + +#replysubmit img.waiting, +.inline-edit-save img.waiting { + padding: 4px 10px 0; + vertical-align: top; + float: right; +} + +#replysubmit .button { + margin-right: 5px; +} + +#replysubmit .error { + color:red; + line-height:21px; + text-align:center; + vertical-align:center; +} + +#replyrow #editor-toolbar { + display: none; +} + +#replyhead { + font-size: 12px; + font-weight: bold; + padding: 2px 10px 4px; +} + +#edithead .inside { + float: left; + padding: 3px 0 2px 5px; + margin: 0; + text-align: center; + font-size: 11px; +} + +#edithead .inside input { + width: 180px; + font-size: 11px; +} + +#edithead label { + padding: 2px 0; +} + +#replycontainer { + padding: 5px; + border: 0 none; + height: 120px; + overflow: hidden; + position: relative; +} + +#replycontent { + resize: none; + margin: 0; + width: 100%; + height: 100%; + padding: 0; + line-height: 150%; + border: 0 none; + outline: none; + font-size: 12px; +} + +#replyrow #ed_reply_toolbar { + margin: 0; + padding: 2px 3px; +} + +.comment-ays { + margin-bottom: 0; + border-style: solid; + border-width: 1px; +} + +.comment-ays th { + border-right-style: solid; + border-right-width: 1px; +} + +.trash-undo-inside, +.spam-undo-inside { + margin: 1px 8px 1px 0; + line-height: 16px; +} + +.spam-undo-inside .avatar, +.trash-undo-inside .avatar { + height: 20px; + width: 20px; + margin-right: 8px; + vertical-align: middle; +} + +.stuffbox .editcomment { + clear: none; +} + +#comment-status-radio p { + margin: 3px 0 5px; +} + +#comment-status-radio input { + margin: 2px 3px 5px 0; + vertical-align: middle; +} + +#comment-status-radio label { + padding: 5px 0; +} + +.commentlist .avatar { + vertical-align: text-top; +} + + +/*------------------------------------------------------------------------------ + 16.0 - Themes +------------------------------------------------------------------------------*/ + +.theme-install-php .tablenav { + height:auto; +} + +table#availablethemes { + border-spacing: 0; + border-width: 1px 0; + border-style: solid none; + margin: 10px auto; + width: 100%; +} + +table#availablethemes .no-items td{ + border-width:0; + padding:5px; +} + +td.available-theme { + vertical-align: top; + width: 240px; + margin: 0; + padding: 20px; + text-align: left; +} + +table#availablethemes td { + border-width: 0 1px 1px; + border-style: none solid solid; +} + +table#availablethemes td.right, +table#availablethemes td.left { + border-right: 0 none; + border-left: 0 none; +} + +table#availablethemes td.bottom { + border-bottom: 0 none; +} + +.available-theme a.screenshot { + width: 240px; + height: 180px; + display: block; + border-width: 1px; + border-style: solid; + margin-bottom: 10px; + overflow: hidden; +} + +.available-theme img { + width: 240px; +} + +.available-theme h3 { + margin: 15px 0 5px; +} + +#current-theme { + margin: 1em 0 1.5em; +} + +#current-theme a { + border-bottom: none; +} + +#current-theme h3 { + font-size: 17px; + font-weight: normal; + margin: 0; +} + +#current-theme .theme-description { + margin-top: 5px; +} + +#current-theme img { + float: left; + border-width: 1px; + border-style: solid; + margin-right: 1em; + margin-bottom: 1.5em; + width: 150px; +} + +.theme-options span { + text-transform: uppercase; + font-size: 13px; +} + +.theme-options a { + font-size: 15px; +} + +#TB_window #TB_title a.tb-theme-preview-link, +#TB_window #TB_title a.tb-theme-preview-link:visited { + font-weight: bold; + text-decoration: none; +} + +#TB_window #TB_title { + background-color: #222; + color: #cfcfcf; +} + +#broken-themes { + text-align: left; + width: 50%; + border-spacing: 3px; + padding: 3px; +} + +.theme-install-php h4 { + margin: 2.5em 0 8px; +} + + +/*------------------------------------------------------------------------------ + 16.1 - Custom Header Screen +------------------------------------------------------------------------------*/ + +.appearance_page_custom-header #headimg { + border: 1px solid #DFDFDF; + min-height: 100px; + width: 100%; +} + +.appearance_page_custom-header #upload-form p label { + font-size: 12px; +} + +.appearance_page_custom-header .available-headers .default-header { + float: left; + margin: 0 20px 20px 0; +} + +.appearance_page_custom-header .random-header { + clear: both; + margin: 0 20px 20px 0; + vertical-align: middle; +} + +.appearance_page_custom-header .available-headers label input, +.appearance_page_custom-header .random-header label input { + margin-right: 10px; +} + +.appearance_page_custom-header .available-headers label img { + vertical-align: middle; +} + + +/*------------------------------------------------------------------------------ + 16.2 - Custom Background Screen +------------------------------------------------------------------------------*/ + +div#custom-background-image { + min-height: 100px; + border: 1px solid #dfdfdf; +} + +div#custom-background-image img { + max-width: 400px; + max-height: 300px; +} + + +/*------------------------------------------------------------------------------ + 16.3 - Tabbed Admin Screen Interface (Experimental) +------------------------------------------------------------------------------*/ + +.nav-tab { + border-style: solid; + border-color: #dfdfdf #dfdfdf #fff; + border-width: 1px 1px 0; + color: #aaa; + text-shadow: rgba(255,255,255,1) 0 1px 0; + font-size: 12px; + line-height: 16px; + display: inline-block; + padding: 4px 14px 6px; + text-decoration: none; + margin: 0 6px -1px 0; + -moz-border-radius: 3px 3px 0 0; + -webkit-border-top-left-radius: 3px; + -webkit-border-top-right-radius: 3px; + -khtml-border-top-left-radius: 3px; + -khtml-border-top-right-radius: 3px; + border-top-left-radius: 3px; + border-top-right-radius: 3px; +} + +.nav-tab-active { + border-width: 1px; + color: #464646; +} + +.nav-tab:hover, +.nav-tab-active { + border-color: #ccc #ccc #fff; +} + +h2.nav-tab-wrapper, h3.nav-tab-wrapper { + border-bottom: 1px solid #ccc; + padding-bottom: 0; +} + +h2 .nav-tab { + padding: 4px 10px 6px; + font-family: "HelveticaNeue-Light", "Helvetica Neue Light", "Helvetica Neue", sans-serif; + font-weight: 200; + font-size: 20px; + line-height: 24px; + +} + + +/*------------------------------------------------------------------------------ + 17.0 - Plugins +------------------------------------------------------------------------------*/ + +.plugins .name, +#pass-strength-result.strong, +#pass-strength-result.short, +.button-highlighted, +input.button-highlighted, +#quicktags #ed_strong, +#ed_reply_toolbar #ed_reply_strong { + font-weight: bold; +} + +.plugins p { + margin: 0 4px; + padding: 0; +} + +.plugins .desc p { + margin: 0 0 8px; +} + +.plugins td.desc { + line-height: 1.5em; +} + +.plugins .desc ul, +.plugins .desc ol { + margin: 0 0 0 2em; +} + +.plugins .desc ul { + list-style-type: disc; +} + +.plugins .row-actions-visible { + padding: 0; +} + +.plugins tbody th.check-column { + padding: 7px 0; +} + +.plugins .inactive td, +.plugins .inactive th, +.plugins .active td, +.plugins .active th { + border-top-style: solid; + border-top-width: 1px; + padding: 5px 7px 0; +} + +#wpbody-content .plugins .plugin-title, #wpbody-content .plugins .theme-title { + padding-right: 12px; + white-space:nowrap; +} + +.plugins .second, .plugins .row-actions-visible { + padding: 0 0 5px; +} + +.plugins-php .widefat tfoot th, +.plugins-php .widefat tfoot td { + border-top-style: solid; + border-top-width: 1px; +} + +.plugin-update-tr .update-message { + margin: 5px; + padding: 3px 5px; + border-width: 1px; + border-style: solid; + -moz-border-radius: 3px; + -khtml-border-radius: 3px; + -webkit-border-radius: 3px; + border-radius: 3px; +} + +.plugin-install-php h4 { + margin: 2.5em 0 8px; +} + + +/*------------------------------------------------------------------------------ + 18.0 - Users +------------------------------------------------------------------------------*/ + +#profile-page .form-table textarea { + width: 500px; + margin-bottom: 6px; +} + +#profile-page .form-table #rich_editing { + margin-right: 5px +} + +#your-profile legend { + font-family: Georgia, "Times New Roman", "Bitstream Charter", Times, serif; + font-size: 22px; +} + +#your-profile #rich_editing { + border: none; +} + +#display_name { + width: 15em; +} + +#createuser .form-field input { + width: 25em; +} + +/*------------------------------------------------------------------------------ + 19.0 - Tools +------------------------------------------------------------------------------*/ + +.pressthis { + margin: 20px 0; +} + +.pressthis a { + display: inline-block; + width: 113px; + position: relative; + cursor: move; + color: #333; + background: #dfdfdf; + -webkit-gradient( + linear, + left bottom, + left top, + color-stop(0.07, rgb(230,230,230)), + color-stop(0.77, rgb(216,216,216)) + ); + -moz-linear-gradient( + center bottom, + rgb(230,230,230) 7%, + rgb(216,216,216) 77% + ); + background-repeat: no-repeat; + background-image-position: 10px 8px; + border-radius: 5px; + -webkit-border-radius: 5px; + -moz-border-radius: 5px; + -o-border-radius: 5px; + border: 1px #b4b4b4 solid; + font: normal normal normal 14px/16px Georgia, "Times New Roman", "Bitstream Charter", Times, serif; + text-decoration: none; + text-shadow: #fff 0 1px 0px; + -webkit-text-shadow: #fff 0 1px 0px; + -moz-text-shadow: #fff 0 1px 0px; + -o-text-shadow: #fff 0 1px 0px; +} + +.pressthis a:hover, +.pressthis a:active { + color: #333 +} + +.pressthis a:hover:after { + transform: skew(20deg) rotate(9deg); + -webkit-transform: skew(20deg) rotate(9deg); + -moz-transform: skew(20deg) rotate(9deg); + box-shadow: 0 10px 8px rgba(0, 0, 0, 0.7); + -webkit-box-shadow: 0 10px 8px rgba(0, 0, 0, 0.7); + -moz-box-shadow: 0 10px 8px rgba(0, 0, 0, 0.7); +} + +.pressthis a span { + background: url(../images/press-this.png) no-repeat -45px 5px ; + padding: 8px 0 8px 32px; + display: inline-block; +} + +.pressthis a:after { + content: ''; + width: 70%; + height: 55%; + z-index: -1; + position: absolute; + right: 10px; + bottom: 9px; + background: transparent; + transform: skew(20deg) rotate(6deg); + -webkit-transform: skew(20deg) rotate(6deg); + -moz-transform: skew(20deg) rotate(6deg); + box-shadow: 0 10px 8px rgba(0, 0, 0, 0.6); + -webkit-box-shadow: 0 10px 8px rgba(0, 0, 0, 0.6); + -moz-box-shadow: 0 10px 8px rgba(0, 0, 0, 0.6); +} + + +/*------------------------------------------------------------------------------ + 20.0 - Settings +------------------------------------------------------------------------------*/ + +#utc-time, #local-time { + padding-left: 25px; + font-style: italic; + font-family: sans-serif; +} + +.defaultavatarpicker .avatar { + margin: 2px 0; + vertical-align: middle; +} + + +/*------------------------------------------------------------------------------ + 21.0 - Admin Footer +------------------------------------------------------------------------------*/ + +#footer { + position: absolute; + bottom: 0; + left: 0; + right: 0; + padding: 10px 0; + margin-right: 20px; + border-top: 1px; + border-style: solid; +} + +#footer, +#footer a { + font-size: 12px; +} + +#footer p { + margin: 0; + line-height: 20px; +} + +#footer a { + text-decoration: none; +} + +#footer a:hover { + text-decoration: underline; +} + + +/*------------------------------------------------------------------------------ + 22.0 - Misc +------------------------------------------------------------------------------*/ + +#excerpt, .attachmentlinks { + margin: 0; + height: 4em; + width: 98%; +} + +#template div { + margin-right: 190px; +} + +p.pagenav { + margin: 0; + display: inline; +} + +.pagenav span { + font-weight: bold; + margin: 0 6px; +} + +.row-title { + font-size: 13px !important; + font-weight: bold; +} + +.column-author img, .column-username img { + float: left; + margin-right: 10px; + margin-top: 1px; +} + +.row-actions { + visibility: hidden; + padding: 2px 0 0; +} + +tr:hover .row-actions, +div.comment-item:hover .row-actions { + visibility: visible; +} + +.row-actions-visible { + padding: 2px 0 0; +} + +.form-table .pre { + padding: 8px; + margin: 0; +} + +table.form-table td .updated { + font-size: 13px; +} + + +.tagchecklist { + margin-left: 14px; + font-size: 12px; + overflow: auto; +} +.tagchecklist strong { + margin-left: -8px; + position: absolute; +} +.tagchecklist span { + margin-right: 25px; + display: block; + float: left; + font-size: 11px; + line-height: 1.8em; + white-space: nowrap; + cursor: default; +} +.tagchecklist span a { + margin: 6px 0pt 0pt -9px; + cursor: pointer; + width: 10px; + height: 10px; + display: block; + float: left; + text-indent: -9999px; + overflow: hidden; + position: absolute; +} + +#poststuff h2 { + margin-top: 20px; + font-size: 1.5em; + margin-bottom: 15px; + padding: 0 0 3px; + clear: left; +} + +#poststuff h3, +.metabox-holder h3 { + font-size: 15px; + font-family: Georgia, "Times New Roman", "Bitstream Charter", Times, serif; + font-weight: normal; + padding: 7px 10px; + margin: 0; + line-height: 1; +} + +#poststuff .inside, +#poststuff .inside p { + font-size: 12px; + margin: 6px 0 8px; +} + +#poststuff .inside .submitbox p { + margin: 1em 0; +} + +#post-visibility-select, #post-formats-select { + line-height: 1.5em; + margin-top: 3px; +} + +#poststuff #submitdiv .inside { + margin: 0; + padding: 0; +} + +#titlediv, #poststuff .postarea { + margin-bottom: 20px; +} + +td.post-title strong, td.plugin-title strong { + display: block; + margin-bottom: .2em; +} + +td.post-title p, td.plugin-title p { + margin: 6px 0; +} + +.wp-hidden-children .wp-hidden-child, +.ui-tabs-hide { + display: none; +} + +#templateside ul li a { + text-decoration: none; +} + +.tool-box { + margin: 15px 0 35px; +} +.tool-box .buttons { + margin: 15px 0; +} +.tool-box .title { + margin: 8px 0; + font: 18px/24px Georgia, "Times New Roman", "Bitstream Charter", Times, serif; +} + +.pressthis a { + font-size: 1.2em; +} + +#sidemenu { + margin: -30px 15px 0 315px; + list-style: none; + position: relative; + float: right; + padding-left: 10px; + font-size: 12px; +} + +#sidemenu a { + padding: 0 7px; + display: block; + float: left; + line-height: 28px; + border-top-width: 1px; + border-top-style: solid; + border-bottom-width: 1px; + border-bottom-style: solid; +} + +#sidemenu li { + display: inline; + line-height: 200%; + list-style: none; + text-align: center; + white-space: nowrap; + margin: 0; + padding: 0; +} + +#sidemenu a.current { + font-weight: normal; + padding-left: 6px; + padding-right: 6px; + -moz-border-radius: 3px 3px 0 0; + -webkit-border-top-left-radius: 3px; + -webkit-border-top-right-radius: 3px; + -khtml-border-top-left-radius: 3px; + -khtml-border-top-right-radius: 3px; + border-top-left-radius: 3px; + border-top-right-radius: 3px; + border-width: 1px; + border-style: solid; +} + +#sidemenu li a .count-0 { + display: none; +} + +#poststuff .inside .the-tagcloud { + margin: 5px 0 10px; + padding: 8px; + border-width: 1px; + border-style: solid; + line-height: 1.8em; + word-spacing: 3px; + -moz-border-radius: 3px; + -khtml-border-radius: 3px; + -webkit-border-radius: 3px; + border-radius: 3px; +} + +.plugin-install #description, .plugin-install-network #description { + width: 60%; +} + +table .vers, +table .column-visible, +table .column-rating { + text-align: left; +} + + +/* Scrollbar fix for bulk upgrade iframe */ +body.iframe { + height: 98%; +} + + +/*------------------------------------------------------------------------------ + 23.0 - Dead +------------------------------------------------------------------------------*/ + +/* - Not used anywhere in WordPress - verify and then deprecate +------------------------------------------------------------------------------*/ +.anchors { + margin: 10px 20px 10px 20px; +} + +div.nav { + height: 2em; + padding: 7px 10px; + vertical-align: text-top; + margin: 5px 0; +} + +.nav .button-secondary { + padding: 2px 4px; +} + +.settings-toggle { + text-align: right; + margin: 5px 7px 15px 0; + font-size: 12px; +} + +.settings-toggle h3 { + margin: 0; +} + +form#tags-filter { + position: relative; +} + +/* - Only used once or twice in all of WP - deprecate for global style +------------------------------------------------------------------------------*/ +td.media-icon { + text-align: center; + width: 80px; + padding-top: 8px; + padding-bottom: 8px; +} + +td.media-icon img { + max-width: 80px; + max-height: 60px; +} + +.screen-per-page { + width: 3em; +} + +.list-ajax-loading { + float: right; + margin-right: 9px; + margin-top: -1px; +} + +.tablenav .list-ajax-loading { + margin-top: 7px; +} + +#howto { + font-size: 11px; + margin: 0 5px; + display: block; +} + +.import-system {font-size: 16px;} +#namediv table { + width: 100%; +} + +#namediv td.first { + width: 10px; + white-space: nowrap; +} + +#namediv input { + width: 98%; +} + +#namediv p { + margin: 10px 0; +} + +#submitdiv h3 { + margin-bottom: 0 !important; +} + +/* - Used - but could/should be deprecated with a CSS reset +------------------------------------------------------------------------------*/ +.zerosize { + height: 0; + width: 0; + margin: 0; + border: 0; + padding: 0; + overflow: hidden; + position: absolute; +} + +br.clear { + height: 2px; + line-height: 2px; +} + +.checkbox { + border: none; + margin: 0; + padding: 0; +} + +#content { + margin: 0; + width: 100%; +} + +fieldset { + border: 0; + padding: 0; + margin: 0; +} + +.post-categories { + display: inline; + margin: 0; + padding: 0; +} + +.post-categories li { + display: inline; +} diff --git a/src/wp-admin/custom-background.php b/src/wp-admin/custom-background.php new file mode 100644 index 0000000..62ebacf --- /dev/null +++ b/src/wp-admin/custom-background.php @@ -0,0 +1,361 @@ +admin_header_callback = $admin_header_callback; + $this->admin_image_div_callback = $admin_image_div_callback; + } + + /** + * Set up the hooks for the Custom Background admin page. + * + * @since 3.0.0 + */ + function init() { + if ( ! current_user_can('edit_theme_options') ) + return; + + $this->page = $page = add_theme_page(__('Background'), __('Background'), 'edit_theme_options', 'custom-background', array(&$this, 'admin_page')); + + add_action("load-$page", array(&$this, 'admin_load')); + add_action("load-$page", array(&$this, 'take_action'), 49); + add_action("load-$page", array(&$this, 'handle_upload'), 49); + + if ( $this->admin_header_callback ) + add_action("admin_head-$page", $this->admin_header_callback, 51); + } + + /** + * Set up the enqueue for the CSS & JavaScript files. + * + * @since 3.0.0 + */ + function admin_load() { + add_contextual_help( $this->page, '

' . __( 'You can customize the look of your site without touching any of your theme’s code by using a custom background. Your background can be an image or a color.' ) . '

' . + '

' . __( 'To use a background image, simply upload it, then choose your display options below. You can display a single instance of your image, or tile it to fill the screen. You can have your background fixed in place, so your site content moves on top of it, or you can have it scroll with your site.' ) . '

' . + '

' . __( 'You can also choose a background color. If you know the hexadecimal code for the color you want, enter it in the Color field. If not, click on the Select a Color link, and a color picker will allow you to choose the exact shade you want.' ) . '

' . + '

' . __( 'Don’t forget to click on the Save Changes button when you are finished.' ) . '

' . + '

' . __( 'For more information:' ) . '

' . + '

' . __( 'Documentation on Custom Background' ) . '

' . + '

' . __( 'Support Forums' ) . '

' ); + wp_enqueue_script('custom-background'); + wp_enqueue_style('farbtastic'); + } + + /** + * Execute custom background modification. + * + * @since 3.0.0 + */ + function take_action() { + + if ( empty($_POST) ) + return; + + if ( isset($_POST['reset-background']) ) { + check_admin_referer('custom-background-reset', '_wpnonce-custom-background-reset'); + remove_theme_mod('background_image'); + remove_theme_mod('background_image_thumb'); + $this->updated = true; + return; + } + + if ( isset($_POST['remove-background']) ) { + // @TODO: Uploaded files are not removed here. + check_admin_referer('custom-background-remove', '_wpnonce-custom-background-remove'); + set_theme_mod('background_image', ''); + set_theme_mod('background_image_thumb', ''); + $this->updated = true; + return; + } + + if ( isset($_POST['background-repeat']) ) { + check_admin_referer('custom-background'); + if ( in_array($_POST['background-repeat'], array('repeat', 'no-repeat', 'repeat-x', 'repeat-y')) ) + $repeat = $_POST['background-repeat']; + else + $repeat = 'repeat'; + set_theme_mod('background_repeat', $repeat); + } + + if ( isset($_POST['background-position-x']) ) { + check_admin_referer('custom-background'); + if ( in_array($_POST['background-position-x'], array('center', 'right', 'left')) ) + $position = $_POST['background-position-x']; + else + $position = 'left'; + set_theme_mod('background_position_x', $position); + } + + if ( isset($_POST['background-attachment']) ) { + check_admin_referer('custom-background'); + if ( in_array($_POST['background-attachment'], array('fixed', 'scroll')) ) + $attachment = $_POST['background-attachment']; + else + $attachment = 'fixed'; + set_theme_mod('background_attachment', $attachment); + } + + if ( isset($_POST['background-color']) ) { + check_admin_referer('custom-background'); + $color = preg_replace('/[^0-9a-fA-F]/', '', $_POST['background-color']); + if ( strlen($color) == 6 || strlen($color) == 3 ) + set_theme_mod('background_color', $color); + else + set_theme_mod('background_color', ''); + } + + $this->updated = true; + } + + /** + * Display the custom background page. + * + * @since 3.0.0 + */ + function admin_page() { +?> +
+ +

+updated) ) { ?> +
+

Visit your site to see how it looks.' ), home_url( '/' ) ); ?>

+
+admin_image_div_callback ) { + call_user_func($this->admin_image_div_callback); + } else { +?> +

+ + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+ + +
+ +
+
+ +
+ +
+
+
+ +
+ +
+
+
+ + + +
+
+ +

+
+ + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + + +
+ + +
+ + + class="hide-if-no-js" id="clearcolor"> () + +
+ + + +
+ +
+ false); + $file = wp_handle_upload($_FILES['import'], $overrides); + + if ( isset($file['error']) ) + wp_die( $file['error'] ); + + $url = $file['url']; + $type = $file['type']; + $file = $file['file']; + $filename = basename($file); + + // Construct the object array + $object = array( + 'post_title' => $filename, + 'post_content' => $url, + 'post_mime_type' => $type, + 'guid' => $url, + 'context' => 'custom-background' + ); + + // Save the data + $id = wp_insert_attachment($object, $file); + + // Add the meta-data + wp_update_attachment_metadata( $id, wp_generate_attachment_metadata( $id, $file ) ); + update_post_meta( $id, '_wp_attachment_is_custom_background', get_option('stylesheet' ) ); + + set_theme_mod('background_image', esc_url($url)); + + $thumbnail = wp_get_attachment_image_src( $id, 'thumbnail' ); + set_theme_mod('background_image_thumb', esc_url( $thumbnail[0] ) ); + + do_action('wp_create_file_in_uploads', $file, $id); // For replication + $this->updated = true; + } + +} +?> diff --git a/src/wp-admin/custom-header.php b/src/wp-admin/custom-header.php new file mode 100644 index 0000000..24ec9b8 --- /dev/null +++ b/src/wp-admin/custom-header.php @@ -0,0 +1,791 @@ +admin_header_callback = $admin_header_callback; + $this->admin_image_div_callback = $admin_image_div_callback; + } + + /** + * Set up the hooks for the Custom Header admin page. + * + * @since 2.1.0 + */ + function init() { + if ( ! current_user_can('edit_theme_options') ) + return; + + $this->page = $page = add_theme_page(__('Header'), __('Header'), 'edit_theme_options', 'custom-header', array(&$this, 'admin_page')); + + add_action("admin_print_scripts-$page", array(&$this, 'js_includes')); + add_action("admin_print_styles-$page", array(&$this, 'css_includes')); + add_action("admin_head-$page", array(&$this, 'help') ); + add_action("admin_head-$page", array(&$this, 'take_action'), 50); + add_action("admin_head-$page", array(&$this, 'js'), 50); + add_action("admin_head-$page", $this->admin_header_callback, 51); + } + + /** + * Adds contextual help. + * + * @since 3.0.0 + */ + function help() { + add_contextual_help( $this->page, '

' . __( 'You can set a custom image header for your site. Simply upload the image and crop it, and the new header will go live immediately.' ) . '

' . + '

' . __( 'If you want to discard your custom header and go back to the default included in your theme, click on the buttons to remove the custom image and restore the original header image.' ) . '

' . + '

' . __( 'Some themes come with additional header images bundled. If you see multiple images displayed, select the one you’d like and click the Save Changes button.' ) . '

' . + '

' . __( 'For more information:' ) . '

' . + '

' . __( 'Documentation on Custom Header' ) . '

' . + '

' . __( 'Support Forums' ) . '

' ); + } + + /** + * Get the current step. + * + * @since 2.6.0 + * + * @return int Current step + */ + function step() { + if ( ! isset( $_GET['step'] ) ) + return 1; + + $step = (int) $_GET['step']; + if ( $step < 1 || 3 < $step ) + $step = 1; + + return $step; + } + + /** + * Set up the enqueue for the JavaScript files. + * + * @since 2.1.0 + */ + function js_includes() { + $step = $this->step(); + + if ( ( 1 == $step || 3 == $step ) && $this->header_text() ) + wp_enqueue_script('farbtastic'); + elseif ( 2 == $step ) + wp_enqueue_script('imgareaselect'); + } + + /** + * Set up the enqueue for the CSS files + * + * @since 2.7 + */ + function css_includes() { + $step = $this->step(); + + if ( ( 1 == $step || 3 == $step ) && $this->header_text() ) + wp_enqueue_style('farbtastic'); + elseif ( 2 == $step ) + wp_enqueue_style('imgareaselect'); + } + + /** + * Check if header text is allowed + * + * @since 3.0.0 + */ + function header_text() { + if ( defined( 'NO_HEADER_TEXT' ) && NO_HEADER_TEXT ) + return false; + + return true; + } + + /** + * Execute custom header modification. + * + * @since 2.6.0 + */ + function take_action() { + if ( ! current_user_can('edit_theme_options') ) + return; + + if ( empty( $_POST ) ) + return; + + $this->updated = true; + + if ( isset( $_POST['resetheader'] ) ) { + check_admin_referer( 'custom-header-options', '_wpnonce-custom-header-options' ); + remove_theme_mod( 'header_image' ); + return; + } + + if ( isset( $_POST['resettext'] ) ) { + check_admin_referer( 'custom-header-options', '_wpnonce-custom-header-options' ); + remove_theme_mod('header_textcolor'); + return; + } + + if ( isset( $_POST['removeheader'] ) ) { + check_admin_referer( 'custom-header-options', '_wpnonce-custom-header-options' ); + set_theme_mod( 'header_image', 'remove-header' ); + return; + } + + if ( isset( $_POST['text-color'] ) ) { + check_admin_referer( 'custom-header-options', '_wpnonce-custom-header-options' ); + $_POST['text-color'] = str_replace( '#', '', $_POST['text-color'] ); + if ( 'blank' == $_POST['text-color'] ) { + set_theme_mod( 'header_textcolor', 'blank' ); + } else { + $color = preg_replace('/[^0-9a-fA-F]/', '', $_POST['text-color']); + if ( strlen($color) == 6 || strlen($color) == 3 ) + set_theme_mod('header_textcolor', $color); + } + } + + if ( isset( $_POST['default-header'] ) ) { + check_admin_referer( 'custom-header-options', '_wpnonce-custom-header-options' ); + if ( 'random-default-image' == $_POST['default-header'] ) { + set_theme_mod( 'header_image', 'random-default-image' ); + } elseif ( 'random-uploaded-image' == $_POST['default-header'] ) { + set_theme_mod( 'header_image', 'random-uploaded-image' ); + } else { + $this->process_default_headers(); + $uploaded = get_uploaded_header_images(); + if ( isset( $uploaded[$_POST['default-header']] ) ) + set_theme_mod( 'header_image', esc_url( $uploaded[$_POST['default-header']]['url'] ) ); + elseif ( isset( $this->default_headers[$_POST['default-header']] ) ) + set_theme_mod( 'header_image', esc_url( $this->default_headers[$_POST['default-header']]['url'] ) ); + } + } + } + + /** + * Process the default headers + * + * @since 3.0.0 + */ + function process_default_headers() { + global $_wp_default_headers; + + if ( !empty($this->headers) ) + return; + + if ( !isset($_wp_default_headers) ) + return; + + $this->default_headers = $_wp_default_headers; + foreach ( array_keys($this->default_headers) as $header ) { + $this->default_headers[$header]['url'] = sprintf( $this->default_headers[$header]['url'], get_template_directory_uri(), get_stylesheet_directory_uri() ); + $this->default_headers[$header]['thumbnail_url'] = sprintf( $this->default_headers[$header]['thumbnail_url'], get_template_directory_uri(), get_stylesheet_directory_uri() ); + } + + } + + /** + * Display UI for selecting one of several default headers. + * + * Show the random image option if this theme has multiple header images. + * Random image option is on by default if no header has been set. + * + * @since 3.0.0 + */ + function show_header_selector( $type = 'default' ) { + if ( 'default' == $type ) { + $headers = $this->default_headers; + } else { + $headers = get_uploaded_header_images(); + $type = 'uploaded'; + } + + if ( 1 < count( $headers ) ) { + echo '
'; + echo ''; + echo '
'; + } + + echo '
'; + foreach ( $headers as $header_key => $header ) { + $header_thumbnail = $header['thumbnail_url']; + $header_url = $header['url']; + $header_desc = empty( $header['description'] ) ? '' : $header['description']; + echo '
'; + echo ''; + echo '
'; + } + echo '
'; + } + + /** + * Execute Javascript depending on step. + * + * @since 2.1.0 + */ + function js() { + $step = $this->step(); + if ( ( 1 == $step || 3 == $step ) && $this->header_text() ) + $this->js_1(); + elseif ( 2 == $step ) + $this->js_2(); + } + + /** + * Display Javascript based on Step 1 and 3. + * + * @since 2.6.0 + */ + function js_1() { ?> + + + +process_default_headers(); +?> + +
+ +

+ +updated ) ) { ?> +
+

Visit your site to see how it looks.' ), home_url( '/' ) ); ?>

+
+ + + + + + + + + + + + + + + + + +
+ admin_image_div_callback ) { + call_user_func( $this->admin_image_div_callback ); + } else { + ?> +
+ header_text() ) + $style = ' style="display:none;"'; + else + $style = ' style="color:#' . get_theme_mod( 'header_textcolor', HEADER_TEXTCOLOR ) . ';"'; + ?> +

onclick="return false;" href="">

+
>
+
+ +
+


+ %1$d × %2$d pixels will be used as-is.' ), HEADER_IMAGE_WIDTH, HEADER_IMAGE_HEIGHT ); ?>

+
+

+
+ + + + +

+
+
+ +
+ + + + + + + + default_headers ) ) : ?> + + + + + + + + + + + + + + + + +
+

+ show_header_selector( 'uploaded' ); + ?> +
+ +

+ +

+ + show_header_selector( 'default' ); + ?> +
+

+ +
+

+ +
+ + header_text() ) : ?> + + + + + + + + + + + + + + + + + + + + +
+

+ + + +

+
+

+ + #blank as text color.' );?> + +

+ +
+

+ +
+ + + +
+
+ + false); + $file = wp_handle_upload($_FILES['import'], $overrides); + + if ( isset($file['error']) ) + wp_die( $file['error'], __( 'Image Upload Error' ) ); + + $url = $file['url']; + $type = $file['type']; + $file = $file['file']; + $filename = basename($file); + + // Construct the object array + $object = array( + 'post_title' => $filename, + 'post_content' => $url, + 'post_mime_type' => $type, + 'guid' => $url, + 'context' => 'custom-header' + ); + + // Save the data + $id = wp_insert_attachment($object, $file); + + list($width, $height, $type, $attr) = getimagesize( $file ); + + if ( $width == HEADER_IMAGE_WIDTH && $height == HEADER_IMAGE_HEIGHT ) { + // Add the meta-data + wp_update_attachment_metadata( $id, wp_generate_attachment_metadata( $id, $file ) ); + update_post_meta( $id, '_wp_attachment_is_custom_header', get_option('stylesheet' ) ); + + set_theme_mod('header_image', esc_url($url)); + do_action('wp_create_file_in_uploads', $file, $id); // For replication + return $this->finished(); + } elseif ( $width > HEADER_IMAGE_WIDTH ) { + $oitar = $width / HEADER_IMAGE_WIDTH; + $image = wp_crop_image($file, 0, 0, $width, $height, HEADER_IMAGE_WIDTH, $height / $oitar, false, str_replace(basename($file), 'midsize-'.basename($file), $file)); + if ( is_wp_error( $image ) ) + wp_die( __( 'Image could not be processed. Please go back and try again.' ), __( 'Image Processing Error' ) ); + + $image = apply_filters('wp_create_file_in_uploads', $image, $id); // For replication + + $url = str_replace(basename($url), basename($image), $url); + $width = $width / $oitar; + $height = $height / $oitar; + } else { + $oitar = 1; + } + ?> + +
+ +

+ +
+

+

+ +
+ +
+ + + + + + + + + + +

+
+
+ 1 ) { + $_POST['x1'] = $_POST['x1'] * $_POST['oitar']; + $_POST['y1'] = $_POST['y1'] * $_POST['oitar']; + $_POST['width'] = $_POST['width'] * $_POST['oitar']; + $_POST['height'] = $_POST['height'] * $_POST['oitar']; + } + + $attachment_id = absint( $_POST['attachment_id'] ); + $original = get_attached_file($attachment_id); + + $cropped = wp_crop_image( $attachment_id, (int) $_POST['x1'], (int) $_POST['y1'], (int) $_POST['width'], (int) $_POST['height'], HEADER_IMAGE_WIDTH, HEADER_IMAGE_HEIGHT ); + if ( is_wp_error( $cropped ) ) + wp_die( __( 'Image could not be processed. Please go back and try again.' ), __( 'Image Processing Error' ) ); + + $cropped = apply_filters('wp_create_file_in_uploads', $cropped, $attachment_id); // For replication + + $parent = get_post($attachment_id); + $parent_url = $parent->guid; + $url = str_replace(basename($parent_url), basename($cropped), $parent_url); + + // Construct the object array + $object = array( + 'ID' => $attachment_id, + 'post_title' => basename($cropped), + 'post_content' => $url, + 'post_mime_type' => 'image/jpeg', + 'guid' => $url, + 'context' => 'custom-header' + ); + + // Update the attachment + wp_insert_attachment($object, $cropped); + wp_update_attachment_metadata( $attachment_id, wp_generate_attachment_metadata( $attachment_id, $cropped ) ); + update_post_meta( $attachment_id, '_wp_attachment_is_custom_header', get_option('stylesheet' ) ); + + set_theme_mod('header_image', $url); + + // cleanup + $medium = str_replace(basename($original), 'midsize-'.basename($original), $original); + @unlink( apply_filters( 'wp_delete_file', $medium ) ); + @unlink( apply_filters( 'wp_delete_file', $original ) ); + + return $this->finished(); + } + + /** + * Display last step of custom header image page. + * + * @since 2.1.0 + */ + function finished() { + $this->updated = true; + $this->step_1(); + } + + /** + * Display the page based on the current step. + * + * @since 2.1.0 + */ + function admin_page() { + if ( ! current_user_can('edit_theme_options') ) + wp_die(__('You do not have permission to customize headers.')); + $step = $this->step(); + if ( 1 == $step ) + $this->step_1(); + elseif ( 2 == $step ) + $this->step_2(); + elseif ( 3 == $step ) + $this->step_3(); + } + +} +?> diff --git a/src/wp-admin/edit-comments.php b/src/wp-admin/edit-comments.php new file mode 100644 index 0000000..cce196b --- /dev/null +++ b/src/wp-admin/edit-comments.php @@ -0,0 +1,242 @@ +get_pagenum(); + +$doaction = $wp_list_table->current_action(); + +if ( $doaction ) { + check_admin_referer( 'bulk-comments' ); + + if ( 'delete_all' == $doaction && !empty( $_REQUEST['pagegen_timestamp'] ) ) { + $comment_status = $wpdb->escape( $_REQUEST['comment_status'] ); + $delete_time = $wpdb->escape( $_REQUEST['pagegen_timestamp'] ); + $comment_ids = $wpdb->get_col( "SELECT comment_ID FROM $wpdb->comments WHERE comment_approved = '$comment_status' AND '$delete_time' > comment_date_gmt" ); + $doaction = 'delete'; + } elseif ( isset( $_REQUEST['delete_comments'] ) ) { + $comment_ids = $_REQUEST['delete_comments']; + $doaction = ( $_REQUEST['action'] != -1 ) ? $_REQUEST['action'] : $_REQUEST['action2']; + } elseif ( isset( $_REQUEST['ids'] ) ) { + $comment_ids = array_map( 'absint', explode( ',', $_REQUEST['ids'] ) ); + } elseif ( wp_get_referer() ) { + wp_redirect( wp_get_referer() ); + exit; + } + + $approved = $unapproved = $spammed = $unspammed = $trashed = $untrashed = $deleted = 0; + + $redirect_to = remove_query_arg( array( 'trashed', 'untrashed', 'deleted', 'spammed', 'unspammed', 'approved', 'unapproved', 'ids' ), wp_get_referer() ); + $redirect_to = add_query_arg( 'paged', $pagenum, $redirect_to ); + + foreach ( $comment_ids as $comment_id ) { // Check the permissions on each + if ( !current_user_can( 'edit_comment', $comment_id ) ) + continue; + + switch ( $doaction ) { + case 'approve' : + wp_set_comment_status( $comment_id, 'approve' ); + $approved++; + break; + case 'unapprove' : + wp_set_comment_status( $comment_id, 'hold' ); + $unapproved++; + break; + case 'spam' : + wp_spam_comment( $comment_id ); + $spammed++; + break; + case 'unspam' : + wp_unspam_comment( $comment_id ); + $unspammed++; + break; + case 'trash' : + wp_trash_comment( $comment_id ); + $trashed++; + break; + case 'untrash' : + wp_untrash_comment( $comment_id ); + $untrashed++; + break; + case 'delete' : + wp_delete_comment( $comment_id ); + $deleted++; + break; + } + } + + if ( $approved ) + $redirect_to = add_query_arg( 'approved', $approved, $redirect_to ); + if ( $unapproved ) + $redirect_to = add_query_arg( 'unapproved', $unapproved, $redirect_to ); + if ( $spammed ) + $redirect_to = add_query_arg( 'spammed', $spammed, $redirect_to ); + if ( $unspammed ) + $redirect_to = add_query_arg( 'unspammed', $unspammed, $redirect_to ); + if ( $trashed ) + $redirect_to = add_query_arg( 'trashed', $trashed, $redirect_to ); + if ( $untrashed ) + $redirect_to = add_query_arg( 'untrashed', $untrashed, $redirect_to ); + if ( $deleted ) + $redirect_to = add_query_arg( 'deleted', $deleted, $redirect_to ); + if ( $trashed || $spammed ) + $redirect_to = add_query_arg( 'ids', join( ',', $comment_ids ), $redirect_to ); + + wp_redirect( $redirect_to ); + exit; +} elseif ( ! empty( $_GET['_wp_http_referer'] ) ) { + wp_redirect( remove_query_arg( array( '_wp_http_referer', '_wpnonce' ), stripslashes( $_SERVER['REQUEST_URI'] ) ) ); + exit; +} + +$wp_list_table->prepare_items(); + +wp_enqueue_script('admin-comments'); +enqueue_comment_hotkeys_js(); + +if ( $post_id ) + $title = sprintf(__('Comments on “%s”'), wp_html_excerpt(_draft_or_post_title($post_id), 50)); +else + $title = __('Comments'); + +add_screen_option( 'per_page', array('label' => _x( 'Comments', 'comments per page (screen options)' )) ); + +add_contextual_help( $current_screen, '

' . __( 'You can manage comments made on your site similar to the way you manage Posts and other content. This screen is customizable in the same ways as other management screens, and you can act on comments using the on-hover action links or the Bulk Actions.' ) . '

' . + '

' . __( 'A yellow row means the comment is waiting for you to moderate it.' ) . '

' . + '

' . __( 'In the Author column, in addition to the author’s name, email address, and blog URL, the commenter’s IP address is shown. Clicking on this link will show you all the comments made from this IP address.' ) . '

' . + '

' . __( 'In the Comment column, above each comment it says “Submitted on,” followed by the date and time the comment was left on your site. Clicking on the date/time link will take you to that comment on your live site. Hovering over any comment gives you options to approve, reply (and approve), quick edit, edit, spam mark, or trash that comment.' ) . '

' . + '

' . __( 'In the In Response To column, there are three elements. The text is the name of the post that inspired the comment, and links to the post editor for that entry. The “#” permalink symbol below leads to that post on your live site. The small bubble with the number in it shows how many comments that post has received. If the bubble is gray, you have moderated all comments for that post. If it is blue, there are pending comments. Clicking the bubble will filter the comments screen to show only comments on that post.' ) . '

' . + '

' . __( 'Many people take advantage of keyboard shortcuts to moderate their comments more quickly. Use the link below to learn more.' ) . '

' . + '

' . __( 'For more information:' ) . '

' . + '

' . __( 'Documentation on Comments' ) . '

' . + '

' . __( 'Documentation on Comment Spam' ) . '

' . + '

' . __( 'Documentation on Keyboard Shortcuts' ) . '

' . + '

' . __( 'Support Forums' ) . '

' +); +require_once('./admin-header.php'); +?> + +
+ +

%s', + get_edit_post_link($post_id), + wp_html_excerpt(_draft_or_post_title($post_id), 50) + ) + ); +else + echo __('Comments'); + +if ( isset($_REQUEST['s']) && $_REQUEST['s'] ) + printf( '' . sprintf( __( 'Search results for “%s”' ), wp_html_excerpt( esc_html( stripslashes( $_REQUEST['s'] ) ), 50 ) ) . '' ); ?> +

+ +

' . $error_msg . '

'; +} + +if ( isset($_REQUEST['approved']) || isset($_REQUEST['deleted']) || isset($_REQUEST['trashed']) || isset($_REQUEST['untrashed']) || isset($_REQUEST['spammed']) || isset($_REQUEST['unspammed']) || isset($_REQUEST['same']) ) { + $approved = isset( $_REQUEST['approved'] ) ? (int) $_REQUEST['approved'] : 0; + $deleted = isset( $_REQUEST['deleted'] ) ? (int) $_REQUEST['deleted'] : 0; + $trashed = isset( $_REQUEST['trashed'] ) ? (int) $_REQUEST['trashed'] : 0; + $untrashed = isset( $_REQUEST['untrashed'] ) ? (int) $_REQUEST['untrashed'] : 0; + $spammed = isset( $_REQUEST['spammed'] ) ? (int) $_REQUEST['spammed'] : 0; + $unspammed = isset( $_REQUEST['unspammed'] ) ? (int) $_REQUEST['unspammed'] : 0; + $same = isset( $_REQUEST['same'] ) ? (int) $_REQUEST['same'] : 0; + + if ( $approved > 0 || $deleted > 0 || $trashed > 0 || $untrashed > 0 || $spammed > 0 || $unspammed > 0 || $same > 0 ) { + if ( $approved > 0 ) + $messages[] = sprintf( _n( '%s comment approved', '%s comments approved', $approved ), $approved ); + + if ( $spammed > 0 ) { + $ids = isset($_REQUEST['ids']) ? $_REQUEST['ids'] : 0; + $messages[] = sprintf( _n( '%s comment marked as spam.', '%s comments marked as spam.', $spammed ), $spammed ) . ' ' . __('Undo') . '
'; + } + + if ( $unspammed > 0 ) + $messages[] = sprintf( _n( '%s comment restored from the spam', '%s comments restored from the spam', $unspammed ), $unspammed ); + + if ( $trashed > 0 ) { + $ids = isset($_REQUEST['ids']) ? $_REQUEST['ids'] : 0; + $messages[] = sprintf( _n( '%s comment moved to the Trash.', '%s comments moved to the Trash.', $trashed ), $trashed ) . ' ' . __('Undo') . '
'; + } + + if ( $untrashed > 0 ) + $messages[] = sprintf( _n( '%s comment restored from the Trash', '%s comments restored from the Trash', $untrashed ), $untrashed ); + + if ( $deleted > 0 ) + $messages[] = sprintf( _n( '%s comment permanently deleted', '%s comments permanently deleted', $deleted ), $deleted ); + + if ( $same > 0 && $comment = get_comment( $same ) ) { + switch ( $comment->comment_approved ) { + case '1' : + $messages[] = __('This comment is already approved.') . ' ' . __( 'Edit comment' ) . ''; + break; + case 'trash' : + $messages[] = __( 'This comment is already in the Trash.' ) . ' ' . __( 'View Trash' ) . ''; + break; + case 'spam' : + $messages[] = __( 'This comment is already marked as spam.' ) . ' ' . __( 'Edit comment' ) . ''; + break; + } + } + + echo '

' . implode( "
\n", $messages ) . '

'; + } +} +?> + +views(); ?> + +
+ +search_box( __( 'Search Comments' ), 'comment' ); ?> + + + + + + + + + + + + + + + +display(); ?> +
+
+ +
+ + diff --git a/src/wp-admin/edit-form-advanced.php b/src/wp-admin/edit-form-advanced.php new file mode 100644 index 0000000..aed7b64 --- /dev/null +++ b/src/wp-admin/edit-form-advanced.php @@ -0,0 +1,315 @@ + '', // Unused. Messages start at index 1. + 1 => sprintf( __('Post updated. View post'), esc_url( get_permalink($post_ID) ) ), + 2 => __('Custom field updated.'), + 3 => __('Custom field deleted.'), + 4 => __('Post updated.'), + /* translators: %s: date and time of the revision */ + 5 => isset($_GET['revision']) ? sprintf( __('Post restored to revision from %s'), wp_post_revision_title( (int) $_GET['revision'], false ) ) : false, + 6 => sprintf( __('Post published. View post'), esc_url( get_permalink($post_ID) ) ), + 7 => __('Post saved.'), + 8 => sprintf( __('Post submitted. Preview post'), esc_url( add_query_arg( 'preview', 'true', get_permalink($post_ID) ) ) ), + 9 => sprintf( __('Post scheduled for: %1$s. Preview post'), + // translators: Publish box date format, see http://php.net/date + date_i18n( __( 'M j, Y @ G:i' ), strtotime( $post->post_date ) ), esc_url( get_permalink($post_ID) ) ), + 10 => sprintf( __('Post draft updated. Preview post'), esc_url( add_query_arg( 'preview', 'true', get_permalink($post_ID) ) ) ), +); +$messages['page'] = array( + 0 => '', // Unused. Messages start at index 1. + 1 => sprintf( __('Page updated. View page'), esc_url( get_permalink($post_ID) ) ), + 2 => __('Custom field updated.'), + 3 => __('Custom field deleted.'), + 4 => __('Page updated.'), + 5 => isset($_GET['revision']) ? sprintf( __('Page restored to revision from %s'), wp_post_revision_title( (int) $_GET['revision'], false ) ) : false, + 6 => sprintf( __('Page published. View page'), esc_url( get_permalink($post_ID) ) ), + 7 => __('Page saved.'), + 8 => sprintf( __('Page submitted. Preview page'), esc_url( add_query_arg( 'preview', 'true', get_permalink($post_ID) ) ) ), + 9 => sprintf( __('Page scheduled for: %1$s. Preview page'), date_i18n( __( 'M j, Y @ G:i' ), strtotime( $post->post_date ) ), esc_url( get_permalink($post_ID) ) ), + 10 => sprintf( __('Page draft updated. Preview page'), esc_url( add_query_arg( 'preview', 'true', get_permalink($post_ID) ) ) ), +); + +$messages = apply_filters( 'post_updated_messages', $messages ); + +$message = false; +if ( isset($_GET['message']) ) { + $_GET['message'] = absint( $_GET['message'] ); + if ( isset($messages[$post_type][$_GET['message']]) ) + $message = $messages[$post_type][$_GET['message']]; + elseif ( !isset($messages[$post_type]) && isset($messages['post'][$_GET['message']]) ) + $message = $messages['post'][$_GET['message']]; +} + +$notice = false; +$form_extra = ''; +if ( 'auto-draft' == $post->post_status ) { + if ( 'edit' == $action ) + $post->post_title = ''; + $autosave = false; + $form_extra .= ""; +} else { + $autosave = wp_get_post_autosave( $post_ID ); +} + +$form_action = 'editpost'; +$nonce_action = 'update-' . $post_type . '_' . $post_ID; +$form_extra .= ""; + +// Detect if there exists an autosave newer than the post and if that autosave is different than the post +if ( $autosave && mysql2date( 'U', $autosave->post_modified_gmt, false ) > mysql2date( 'U', $post->post_modified_gmt, false ) ) { + foreach ( _wp_post_revision_fields() as $autosave_field => $_autosave_field ) { + if ( normalize_whitespace( $autosave->$autosave_field ) != normalize_whitespace( $post->$autosave_field ) ) { + $notice = sprintf( __( 'There is an autosave of this post that is more recent than the version below. View the autosave' ), get_edit_post_link( $autosave->ID ) ); + break; + } + } + unset($autosave_field, $_autosave_field); +} + +$post_type_object = get_post_type_object($post_type); + +// All meta boxes should be defined and added before the first do_meta_boxes() call (or potentially during the do_meta_boxes action). +require_once('./includes/meta-boxes.php'); + +add_meta_box('submitdiv', __('Publish'), 'post_submit_meta_box', $post_type, 'side', 'core'); + +if ( current_theme_supports( 'post-formats' ) && post_type_supports( $post_type, 'post-formats' ) ) + add_meta_box( 'formatdiv', _x( 'Format', 'post format' ), 'post_format_meta_box', $post_type, 'side', 'core' ); + +// all taxonomies +foreach ( get_object_taxonomies($post_type) as $tax_name ) { + $taxonomy = get_taxonomy($tax_name); + if ( ! $taxonomy->show_ui ) + continue; + + $label = $taxonomy->labels->name; + + if ( !is_taxonomy_hierarchical($tax_name) ) + add_meta_box('tagsdiv-' . $tax_name, $label, 'post_tags_meta_box', $post_type, 'side', 'core', array( 'taxonomy' => $tax_name )); + else + add_meta_box($tax_name . 'div', $label, 'post_categories_meta_box', $post_type, 'side', 'core', array( 'taxonomy' => $tax_name )); +} + +if ( post_type_supports($post_type, 'page-attributes') ) + add_meta_box('pageparentdiv', 'page' == $post_type ? __('Page Attributes') : __('Attributes'), 'page_attributes_meta_box', $post_type, 'side', 'core'); + +if ( current_theme_supports( 'post-thumbnails', $post_type ) && post_type_supports( $post_type, 'thumbnail' ) + && ( ! is_multisite() || ( ( $mu_media_buttons = get_site_option( 'mu_media_buttons', array() ) ) && ! empty( $mu_media_buttons['image'] ) ) ) ) + add_meta_box('postimagediv', __('Featured Image'), 'post_thumbnail_meta_box', $post_type, 'side', 'low'); + +if ( post_type_supports($post_type, 'excerpt') ) + add_meta_box('postexcerpt', __('Excerpt'), 'post_excerpt_meta_box', $post_type, 'normal', 'core'); + +if ( post_type_supports($post_type, 'trackbacks') ) + add_meta_box('trackbacksdiv', __('Send Trackbacks'), 'post_trackback_meta_box', $post_type, 'normal', 'core'); + +if ( post_type_supports($post_type, 'custom-fields') ) + add_meta_box('postcustom', __('Custom Fields'), 'post_custom_meta_box', $post_type, 'normal', 'core'); + +do_action('dbx_post_advanced'); +if ( post_type_supports($post_type, 'comments') ) + add_meta_box('commentstatusdiv', __('Discussion'), 'post_comment_status_meta_box', $post_type, 'normal', 'core'); + +if ( ('publish' == $post->post_status || 'private' == $post->post_status) && post_type_supports($post_type, 'comments') ) + add_meta_box('commentsdiv', __('Comments'), 'post_comment_meta_box', $post_type, 'normal', 'core'); + +if ( !( 'pending' == $post->post_status && !current_user_can( $post_type_object->cap->publish_posts ) ) ) + add_meta_box('slugdiv', __('Slug'), 'post_slug_meta_box', $post_type, 'normal', 'core'); + +if ( post_type_supports($post_type, 'author') ) { + if ( is_super_admin() || current_user_can( $post_type_object->cap->edit_others_posts ) ) + add_meta_box('authordiv', __('Author'), 'post_author_meta_box', $post_type, 'normal', 'core'); +} + +if ( post_type_supports($post_type, 'revisions') && 0 < $post_ID && wp_get_post_revisions( $post_ID ) ) + add_meta_box('revisionsdiv', __('Revisions'), 'post_revisions_meta_box', $post_type, 'normal', 'core'); + +do_action('add_meta_boxes', $post_type, $post); +do_action('add_meta_boxes_' . $post_type, $post); + +do_action('do_meta_boxes', $post_type, 'normal', $post); +do_action('do_meta_boxes', $post_type, 'advanced', $post); +do_action('do_meta_boxes', $post_type, 'side', $post); + +add_screen_option('layout_columns', array('max' => 2) ); + +if ( 'post' == $post_type ) { + add_contextual_help($current_screen, + '

' . __('The title field and the big Post Editing Area are fixed in place, but you can reposition all the other boxes using drag and drop, and can minimize or expand them by clicking the title bar of each box. Use the Screen Options tab to unhide more boxes (Excerpt, Send Trackbacks, Custom Fields, Discussion, Slug, Author) or to choose a 1- or 2-column layout for this screen.') . '

' . + '

' . __('Title - Enter a title for your post. After you enter a title, you’ll see the permalink below, which you can edit.') . '

' . + '

' . __('Post editor - Enter the text for your post. There are two modes of editing: Visual and HTML. Choose the mode by clicking on the appropriate tab. Visual mode gives you a WYSIWYG editor. Click the last icon in the row to get a second row of controls. The HTML mode allows you to enter raw HTML along with your post text. You can insert media files by clicking the icons above the post editor and following the directions. You can go the distraction-free writing screen, new in 3.2, via the Fullscreen icon in Visual mode (second to last in the top row) or the Fullscreen button in HTML mode (last in the row). Once there, you can make buttons visible by hovering over the top area. Exit Fullscreen back to the regular post editor.') . '

' . + '

' . __('Publish - You can set the terms of publishing your post in the Publish box. For Status, Visibility, and Publish (immediately), click on the Edit link to reveal more options. Visibility includes options for password-protecting a post or making it stay at the top of your blog indefinitely (sticky). Publish (immediately) allows you to set a future or past date and time, so you can schedule a post to be published in the future or backdate a post.') . '

' . + ( ( current_theme_supports( 'post-formats' ) && post_type_supports( 'post', 'post-formats' ) ) ? '

' . __( 'Post Format - This designates how your theme will display a specific post. For example, you could have a standard blog post with a title and paragraphs, or a short aside that omits the title and contains a short text blurb. Please refer to the Codex for descriptions of each post format. Your theme could enable all or some of 10 possible formats.' ) . '

' : '' ) . + '

' . __('Featured Image - This allows you to associate an image with your post without inserting it. This is usually useful only if your theme makes use of the featured image as a post thumbnail on the home page, a custom header, etc.') . '

' . + '

' . __('Send Trackbacks - Trackbacks are a way to notify legacy blog systems that you’ve linked to them. Enter the URL(s) you want to send trackbacks. If you link to other WordPress sites they’ll be notified automatically using pingbacks, and this field is unnecessary.') . '

' . + '

' . __('Discussion - You can turn comments and pings on or off, and if there are comments on the post, you can see them here and moderate them.') . '

' . + '

' . sprintf(__('You can also create posts with the Press This bookmarklet.'), 'options-writing.php') . '

' . + '

' . __('For more information:') . '

' . + '

' . __('Documentation on Writing and Editing Posts') . '

' . + '

' . __('Support Forums') . '

' + ); +} elseif ( 'page' == $post_type ) { + add_contextual_help($current_screen, '

' . __('Pages are similar to Posts in that they have a title, body text, and associated metadata, but they are different in that they are not part of the chronological blog stream, kind of like permanent posts. Pages are not categorized or tagged, but can have a hierarchy. You can nest Pages under other Pages by making one the “Parent” of the other, creating a group of Pages.') . '

' . + '

' . __('Creating a Page is very similar to creating a Post, and the screens can be customized in the same way using drag and drop, the Screen Options tab, and expanding/collapsing boxes as you choose. This screen also has the new in 3.2 distraction-free writing space, available in both the Visual and HTML modes via the Fullscreen buttons. The Page editor mostly works the same as the Post editor, but there are some Page-specific features in the Page Attributes box:') . '

' . + '

' . __('Parent - You can arrange your pages in hierarchies. For example, you could have an “About” page that has “Life Story” and “My Dog” pages under it. There are no limits to how many levels you can nest pages.') . '

' . + '

' . __('Template - Some themes have custom templates you can use for certain pages that might have additional features or custom layouts. If so, you’ll see them in this dropdown menu.') . '

' . + '

' . __('Order - Pages are usually ordered alphabetically, but you can choose your own order by entering a number (1 for first, etc.) in this field.') . '

' . + '

' . __('For more information:') . '

' . + '

' . __('Documentation on Adding New Pages') . '

' . + '

' . __('Documentation on Editing Pages') . '

' . + '

' . __('Support Forums') . '

' + ); +} + +require_once('./admin-header.php'); +?> + +
+ +

labels->add_new); ?>

+ +

+ + +

+ +
> + + + + + + + + +post_status ) + wp_original_referer_field(true, 'previous'); + +echo $form_extra; + +wp_nonce_field( 'autosave', 'autosavenonce', false ); +wp_nonce_field( 'meta-box-order', 'meta-box-order-nonce', false ); +wp_nonce_field( 'closedpostboxes', 'closedpostboxesnonce', false ); +?> + +
+
+ + +
+ +
+
+ +
+
+ + +
+
+public ? get_sample_permalink_html($post->ID) : ''; +$shortlink = wp_get_shortlink($post->ID, 'post'); +if ( !empty($shortlink) ) + $sample_permalink_html .= '' . __('Get Shortlink') . ''; + +if ( $post_type_object->public && ! ( 'pending' == $post->post_status && !current_user_can( $post_type_object->cap->publish_posts ) ) ) { ?> +
+ ID) && ! empty($sample_permalink_html) && 'auto-draft' != $post->post_status ) + echo $sample_permalink_html; + ?> +
+ +
+ +
+ + + +
+ +post_content); ?> + + + + +
0' ); ?> +   +post_status ) { + echo ''; + if ( $last_id = get_post_meta($post_ID, '_edit_last', true) ) { + $last_user = get_userdata($last_id); + printf(__('Last edited by %1$s on %2$s at %3$s'), esc_html( $last_user->display_name ), mysql2date(get_option('date_format'), $post->post_modified), mysql2date(get_option('time_format'), $post->post_modified)); + } else { + printf(__('Last edited on %1$s at %2$s'), mysql2date(get_option('date_format'), $post->post_modified), mysql2date(get_option('time_format'), $post->post_modified)); + } + echo ''; + } ?> +
+ +
+ + + +
+
+
+
+
+
+ + + +post_title) && '' == $post->post_title) || (isset($_GET['message']) && 2 > $_GET['message'])) : ?> + + diff --git a/src/wp-admin/edit-form-comment.php b/src/wp-admin/edit-form-comment.php new file mode 100644 index 0000000..6767ffe --- /dev/null +++ b/src/wp-admin/edit-form-comment.php @@ -0,0 +1,147 @@ +comment_ID); +$form_action = 'editedcomment'; +$form_extra = "' />\n\ncomment_ID) ?> +
+ +

+ +
+ + + +
+
+

+
+
+
+ +
+
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+%1$s'); +$date = date_i18n( $datef, strtotime( $comment->comment_date ) ); +?> +  +
+
+
+
+
+ +
+
+comment_ID&_wp_original_http_referer=" . urlencode(wp_get_referer()), 'delete-comment_' . $comment->comment_ID) . "'>" . ( !EMPTY_TRASH_DAYS ? __('Delete Permanently') : __('Move to Trash') ) . "\n"; ?> +
+
+ '4' ) ); ?> +
+
+
+
+
+
+
+ +
+
+
+

+
+ + + + + + + + + + + + + + + +
+ comment_author_email ) { + printf( __( 'E-mail (%s):' ), get_comment_author_email_link( __( 'send e-mail' ), '', '' ) ); + } else { + _e( 'E-mail:' ); + } +?>
+ comment_author_url ) && 'http://' != $comment->comment_author_url ) { + $link = '' . __('visit site') . ''; + printf( __( 'URL (%s):' ), apply_filters('get_comment_author_link', $link ) ); + } else { + _e( 'URL:' ); + } ?>
+
+
+
+ +
+comment_content, 'content', 'newcomment_author_url', false, 4, false); ?> + +
+ + + + + + + + +
+
+
+
+ + + diff --git a/src/wp-admin/edit-link-form.php b/src/wp-admin/edit-link-form.php new file mode 100644 index 0000000..2835787 --- /dev/null +++ b/src/wp-admin/edit-link-form.php @@ -0,0 +1,129 @@ +Links / Edit Link' ), 'link-manager.php' ); + $submit_text = __('Update Link'); + $form = ' diff --git a/src/wp-admin/edit-tag-form.php b/src/wp-admin/edit-tag-form.php new file mode 100644 index 0000000..92f074a --- /dev/null +++ b/src/wp-admin/edit-tag-form.php @@ -0,0 +1,93 @@ + +

+ + +
+ +

labels->edit_item; ?>

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+

+

+ 0, 'hide_if_empty' => false, 'name' => 'parent', 'orderby' => 'name', 'taxonomy' => $taxonomy, 'selected' => $tag->parent, 'exclude_tree' => $tag->term_id, 'hierarchical' => true, 'show_option_none' => __('None'))); ?>
+ + + +

+
+ +
+
diff --git a/src/wp-admin/edit-tags.php b/src/wp-admin/edit-tags.php new file mode 100644 index 0000000..12867a2 --- /dev/null +++ b/src/wp-admin/edit-tags.php @@ -0,0 +1,394 @@ +cap->manage_terms ) ) + wp_die( __( 'Cheatin’ uh?' ) ); + +$wp_list_table = _get_list_table('WP_Terms_List_Table'); +$pagenum = $wp_list_table->get_pagenum(); + +$title = $tax->labels->name; + +if ( 'post' != $post_type ) { + $parent_file = "edit.php?post_type=$post_type"; + $submenu_file = "edit-tags.php?taxonomy=$taxonomy&post_type=$post_type"; +} else if ( 'link_category' == $tax->name ) { + $parent_file = 'link-manager.php'; + $submenu_file = 'edit-tags.php?taxonomy=link_category'; +} else { + $parent_file = 'edit.php'; + $submenu_file = "edit-tags.php?taxonomy=$taxonomy"; +} + +add_screen_option( 'per_page', array('label' => $title, 'default' => 20, 'option' => 'edit_' . $tax->name . '_per_page') ); + +switch ( $wp_list_table->current_action() ) { + +case 'add-tag': + + check_admin_referer( 'add-tag', '_wpnonce_add-tag' ); + + if ( !current_user_can( $tax->cap->edit_terms ) ) + wp_die( __( 'Cheatin’ uh?' ) ); + + $ret = wp_insert_term( $_POST['tag-name'], $taxonomy, $_POST ); + $location = 'edit-tags.php?taxonomy=' . $taxonomy; + if ( 'post' != $post_type ) + $location .= '&post_type=' . $post_type; + + if ( $referer = wp_get_original_referer() ) { + if ( false !== strpos( $referer, 'edit-tags.php' ) ) + $location = $referer; + } + + if ( $ret && !is_wp_error( $ret ) ) + $location = add_query_arg( 'message', 1, $location ); + else + $location = add_query_arg( 'message', 4, $location ); + wp_redirect( $location ); + exit; +break; + +case 'delete': + $location = 'edit-tags.php?taxonomy=' . $taxonomy; + if ( 'post' != $post_type ) + $location .= '&post_type=' . $post_type; + if ( $referer = wp_get_referer() ) { + if ( false !== strpos( $referer, 'edit-tags.php' ) ) + $location = $referer; + } + + if ( !isset( $_REQUEST['tag_ID'] ) ) { + wp_redirect( $location ); + exit; + } + + $tag_ID = (int) $_REQUEST['tag_ID']; + check_admin_referer( 'delete-tag_' . $tag_ID ); + + if ( !current_user_can( $tax->cap->delete_terms ) ) + wp_die( __( 'Cheatin’ uh?' ) ); + + wp_delete_term( $tag_ID, $taxonomy ); + + $location = add_query_arg( 'message', 2, $location ); + wp_redirect( $location ); + exit; + +break; + +case 'bulk-delete': + check_admin_referer( 'bulk-tags' ); + + if ( !current_user_can( $tax->cap->delete_terms ) ) + wp_die( __( 'Cheatin’ uh?' ) ); + + $tags = (array) $_REQUEST['delete_tags']; + foreach ( $tags as $tag_ID ) { + wp_delete_term( $tag_ID, $taxonomy ); + } + + $location = 'edit-tags.php?taxonomy=' . $taxonomy; + if ( 'post' != $post_type ) + $location .= '&post_type=' . $post_type; + if ( $referer = wp_get_referer() ) { + if ( false !== strpos( $referer, 'edit-tags.php' ) ) + $location = $referer; + } + + $location = add_query_arg( 'message', 6, $location ); + wp_redirect( $location ); + exit; + +break; + +case 'edit': + $title = $tax->labels->edit_item; + + require_once ( 'admin-header.php' ); + $tag_ID = (int) $_REQUEST['tag_ID']; + + $tag = get_term( $tag_ID, $taxonomy, OBJECT, 'edit' ); + include( './edit-tag-form.php' ); + +break; + +case 'editedtag': + $tag_ID = (int) $_POST['tag_ID']; + check_admin_referer( 'update-tag_' . $tag_ID ); + + if ( !current_user_can( $tax->cap->edit_terms ) ) + wp_die( __( 'Cheatin’ uh?' ) ); + + $ret = wp_update_term( $tag_ID, $taxonomy, $_POST ); + + $location = 'edit-tags.php?taxonomy=' . $taxonomy; + if ( 'post' != $post_type ) + $location .= '&post_type=' . $post_type; + + if ( $referer = wp_get_original_referer() ) { + if ( false !== strpos( $referer, 'edit-tags.php' ) ) + $location = $referer; + } + + if ( $ret && !is_wp_error( $ret ) ) + $location = add_query_arg( 'message', 3, $location ); + else + $location = add_query_arg( 'message', 5, $location ); + + wp_redirect( $location ); + exit; +break; + +default: +if ( ! empty($_REQUEST['_wp_http_referer']) ) { + $location = remove_query_arg( array('_wp_http_referer', '_wpnonce'), stripslashes($_SERVER['REQUEST_URI']) ); + + if ( ! empty( $_REQUEST['paged'] ) ) + $location = add_query_arg( 'paged', (int) $_REQUEST['paged'] ); + + wp_redirect( $location ); + exit; +} + +$wp_list_table->prepare_items(); +$total_pages = $wp_list_table->get_pagination_arg( 'total_pages' ); + +if ( $pagenum > $total_pages && $total_pages > 0 ) { + wp_redirect( add_query_arg( 'paged', $total_pages ) ); + exit; +} + +wp_enqueue_script('admin-tags'); +if ( current_user_can($tax->cap->edit_terms) ) + wp_enqueue_script('inline-edit-tax'); + +if ( 'category' == $taxonomy || 'link_category' == $taxonomy || 'post_tag' == $taxonomy ) { + $help =''; + if ( 'category' == $taxonomy ) + $help = '

' . sprintf(__( 'You can use categories to define sections of your site and group related posts. The default category is “Uncategorized” until you change it in your writing settings.' ) , 'options-writing.php' ) . '

'; + elseif ( 'link_category' == $taxonomy ) + $help = '

' . __( 'You can create groups of links by using link categories. Link category names must be unique and link categories are separate from the categories you use for posts.' ) . '

'; + else + $help = '

' . __( 'You can assign keywords to your posts using Post Tags. Unlike categories, tags have no hierarchy, meaning there’s no relationship from one tag to another.' ) . '

'; + + if ( 'link_category' == $taxonomy ) + $help .= '

' . __( 'You can delete link categories in the Bulk Action pulldown, but that action does not delete the links within the category. Instead, it moves them to the default link category.' ) . '

'; + else + $help .='

' . __( 'What’s the difference between categories and tags? Normally, tags are ad-hoc keywords that identify important information in your post (names, subjects, etc) that may or may not recur in other posts, while categories are pre-determined sections. If you think of your site like a book, the categories are like the Table of Contents and the tags are like the terms in the index.' ) . '

'; + + if ( 'category' == $taxonomy ) + $help .= '

' . __( 'When adding a new category on this screen, you’ll fill in the following fields:' ) . '

'; + elseif ( 'post_tag' == $taxonomy ) + $help .= '

' . __( 'When adding a new tag on this screen, you’ll fill in the following fields:' ) . '

'; + + if ( 'category' == $taxonomy || 'post_tag' == $taxonomy ) + + $help .= '
    ' . + '
  • ' . __( 'Name - The name is how it appears on your site.' ) . '
  • '; + + if ( ! global_terms_enabled() ) + if ( 'category' == $taxonomy || 'post_tag' == $taxonomy ) + $help .= '
  • ' . __( 'Slug - The “slug” is the URL-friendly version of the name. It is usually all lowercase and contains only letters, numbers, and hyphens.' ) . '
  • '; + + if ( 'category' == $taxonomy ) + $help .= '
  • ' . __( 'Parent - Categories, unlike tags, can have a hierarchy. You might have a Jazz category, and under that have children categories for Bebop and Big Band. Totally optional. To create a subcategory, just choose another category from the Parent dropdown.' ) . '
  • '; + + if ( 'category' == $taxonomy || 'post_tag' == $taxonomy ) + $help .= '
  • ' . __( 'Description - The description is not prominent by default; however, some themes may display it.' ) . '
  • ' . + '
' . + '

' . __( 'You can change the display of this screen using the Screen Options tab to set how many items are displayed per screen and to display/hide columns in the table.' ) . '

' . + '

' . __( 'For more information:' ) . '

'; + + if ( 'category' == $taxonomy ) + $help .= '

' . __( 'Documentation on Categories' ) . '

'; + elseif ( 'link_category' == $taxonomy ) + $help .= '

' . __( 'Documentation on Link Categories' ) . '

'; + else + $help .= '

' . __( 'Documentation on Post Tags' ) . '

'; + + $help .= '

' . __('Support Forums') . '

'; + + add_contextual_help($current_screen, $help); + unset($help); +} + +require_once ('admin-header.php'); + +if ( !current_user_can($tax->cap->edit_terms) ) + wp_die( __('You are not allowed to edit this item.') ); + +$messages[1] = __('Item added.'); +$messages[2] = __('Item deleted.'); +$messages[3] = __('Item updated.'); +$messages[4] = __('Item not added.'); +$messages[5] = __('Item not updated.'); +$messages[6] = __('Items deleted.'); + +?> + +
+ +

' . __('Search results for “%s”') . '', esc_html( stripslashes($_REQUEST['s']) ) ); ?> +

+ + +

+ +
+ +
+ + + +search_box( $tax->labels->search_items, 'tag' ); ?> + +
+
+ +
+ +
+
+
+ + + +display(); ?> + +
+
+ + +
+

Note:
Deleting a category does not delete the posts in that category. Instead, posts that were only assigned to the deleted category are set to the category %s.'), apply_filters('the_category', get_cat_name(get_option('default_category')))) ?>

+ +

category to tag converter.'), 'import.php') ?>

+ +
+ +
+

tag to category converter'), 'import.php') ;?>.

+
+ + +
+
+ +
+
+ +labels->popular_items ) ) { + if ( current_user_can( $tax->cap->edit_terms ) ) + $tag_cloud = wp_tag_cloud( array( 'taxonomy' => $taxonomy, 'echo' => false, 'link' => 'edit' ) ); + else + $tag_cloud = wp_tag_cloud( array( 'taxonomy' => $taxonomy, 'echo' => false ) ); + + if ( $tag_cloud ) : + ?> +
+

labels->popular_items; ?>

+ +
+cap->edit_terms) ) { + // Back compat hooks. Deprecated in preference to {$taxonomy}_pre_add_form + if ( 'category' == $taxonomy ) + do_action('add_category_form_pre', (object)array('parent' => 0) ); + elseif ( 'link_category' == $taxonomy ) + do_action('add_link_category_form_pre', (object)array('parent' => 0) ); + else + do_action('add_tag_form_pre', $taxonomy); + + do_action($taxonomy . '_pre_add_form', $taxonomy); +?> + +
+

labels->add_new_item; ?>

+
+ + + + + + +
+ + +

+
+ +
+ + +

+
+ + +
+ + 0, 'hide_if_empty' => false, 'taxonomy' => $taxonomy, 'name' => 'parent', 'orderby' => 'name', 'hierarchical' => true, 'show_option_none' => __('None'))); ?> + +

+ +
+ +
+ + +

+
+ +labels->add_new_item, 'button' ); + +// Back compat hooks. Deprecated in preference to {$taxonomy}_add_form +if ( 'category' == $taxonomy ) + do_action('edit_category_form', (object)array('parent' => 0) ); +elseif ( 'link_category' == $taxonomy ) + do_action('edit_link_category_form', (object)array('parent' => 0) ); +else + do_action('add_tag_form', $taxonomy); + +do_action($taxonomy . '_add_form', $taxonomy); +?> +
+ + +
+
+ +
+
+ +inline_edit(); ?> + + diff --git a/src/wp-admin/edit.php b/src/wp-admin/edit.php new file mode 100644 index 0000000..933219e --- /dev/null +++ b/src/wp-admin/edit.php @@ -0,0 +1,263 @@ + true ) ) ) ) + $post_type = $_GET['post_type']; +else + wp_die( __('Invalid post type') ); + +$_GET['post_type'] = $post_type; + +$post_type_object = get_post_type_object( $post_type ); + +if ( !current_user_can($post_type_object->cap->edit_posts) ) + wp_die(__('Cheatin’ uh?')); + +$wp_list_table = _get_list_table('WP_Posts_List_Table'); +$pagenum = $wp_list_table->get_pagenum(); + +// Back-compat for viewing comments of an entry +foreach ( array( 'p', 'attachment_id', 'page_id' ) as $_redirect ) { + if ( ! empty( $_REQUEST[ $_redirect ] ) ) { + wp_redirect( admin_url( 'edit-comments.php?p=' . absint( $_REQUEST[ $_redirect ] ) ) ); + exit; + } +} +unset( $_redirect ); + +if ( 'post' != $post_type ) { + $parent_file = "edit.php?post_type=$post_type"; + $submenu_file = "edit.php?post_type=$post_type"; + $post_new_file = "post-new.php?post_type=$post_type"; +} else { + $parent_file = 'edit.php'; + $submenu_file = 'edit.php'; + $post_new_file = 'post-new.php'; +} + +$doaction = $wp_list_table->current_action(); + +if ( $doaction ) { + check_admin_referer('bulk-posts'); + + $sendback = remove_query_arg( array('trashed', 'untrashed', 'deleted', 'ids'), wp_get_referer() ); + $sendback = add_query_arg( 'paged', $pagenum, $sendback ); + if ( strpos($sendback, 'post.php') !== false ) + $sendback = admin_url($post_new_file); + + if ( 'delete_all' == $doaction ) { + $post_status = preg_replace('/[^a-z0-9_-]+/i', '', $_REQUEST['post_status']); + if ( get_post_status_object($post_status) ) // Check the post status exists first + $post_ids = $wpdb->get_col( $wpdb->prepare( "SELECT ID FROM $wpdb->posts WHERE post_type=%s AND post_status = %s", $post_type, $post_status ) ); + $doaction = 'delete'; + } elseif ( isset( $_REQUEST['media'] ) ) { + $post_ids = $_REQUEST['media']; + } elseif ( isset( $_REQUEST['ids'] ) ) { + $post_ids = explode( ',', $_REQUEST['ids'] ); + } elseif ( !empty( $_REQUEST['post'] ) ) { + $post_ids = array_map('intval', $_REQUEST['post']); + } + + if ( !isset( $post_ids ) ) { + wp_redirect( $sendback ); + exit; + } + + switch ( $doaction ) { + case 'trash': + $trashed = 0; + foreach( (array) $post_ids as $post_id ) { + if ( !current_user_can($post_type_object->cap->delete_post, $post_id) ) + wp_die( __('You are not allowed to move this item to the Trash.') ); + + if ( !wp_trash_post($post_id) ) + wp_die( __('Error in moving to Trash.') ); + + $trashed++; + } + $sendback = add_query_arg( array('trashed' => $trashed, 'ids' => join(',', $post_ids) ), $sendback ); + break; + case 'untrash': + $untrashed = 0; + foreach( (array) $post_ids as $post_id ) { + if ( !current_user_can($post_type_object->cap->delete_post, $post_id) ) + wp_die( __('You are not allowed to restore this item from the Trash.') ); + + if ( !wp_untrash_post($post_id) ) + wp_die( __('Error in restoring from Trash.') ); + + $untrashed++; + } + $sendback = add_query_arg('untrashed', $untrashed, $sendback); + break; + case 'delete': + $deleted = 0; + foreach( (array) $post_ids as $post_id ) { + $post_del = & get_post($post_id); + + if ( !current_user_can($post_type_object->cap->delete_post, $post_id) ) + wp_die( __('You are not allowed to delete this item.') ); + + if ( $post_del->post_type == 'attachment' ) { + if ( ! wp_delete_attachment($post_id) ) + wp_die( __('Error in deleting...') ); + } else { + if ( !wp_delete_post($post_id) ) + wp_die( __('Error in deleting...') ); + } + $deleted++; + } + $sendback = add_query_arg('deleted', $deleted, $sendback); + break; + case 'edit': + if ( isset($_REQUEST['bulk_edit']) ) { + $done = bulk_edit_posts($_REQUEST); + + if ( is_array($done) ) { + $done['updated'] = count( $done['updated'] ); + $done['skipped'] = count( $done['skipped'] ); + $done['locked'] = count( $done['locked'] ); + $sendback = add_query_arg( $done, $sendback ); + } + } + break; + } + + $sendback = remove_query_arg( array('action', 'action2', 'tags_input', 'post_author', 'comment_status', 'ping_status', '_status', 'post', 'bulk_edit', 'post_view'), $sendback ); + + wp_redirect($sendback); + exit(); +} elseif ( ! empty($_REQUEST['_wp_http_referer']) ) { + wp_redirect( remove_query_arg( array('_wp_http_referer', '_wpnonce'), stripslashes($_SERVER['REQUEST_URI']) ) ); + exit; +} + +$wp_list_table->prepare_items(); + +wp_enqueue_script('inline-edit-post'); + +$title = $post_type_object->labels->name; + +if ( 'post' == $post_type ) { + add_contextual_help($current_screen, + '

' . __('You can customize the display of this screen in a number of ways:') . '

' . + '
    ' . + '
  • ' . __('You can hide/display columns based on your needs and decide how many posts to list per screen using the Screen Options tab.') . '
  • ' . + '
  • ' . __('You can filter the list of posts by post status using the text links in the upper left to show All, Published, Draft, or Trashed posts. The default view is to show all posts.') . '
  • ' . + '
  • ' . __('You can view posts in a simple title list or with an excerpt. Choose the view you prefer by clicking on the icons at the top of the list on the right.') . '
  • ' . + '
  • ' . __('You can refine the list to show only posts in a specific category or from a specific month by using the dropdown menus above the posts list. Click the Filter button after making your selection. You also can refine the list by clicking on the post author, category or tag in the posts list.') . '
  • ' . + '
' . + '

' . __('Hovering over a row in the posts list will display action links that allow you to manage your post. You can perform the following actions:') . '

' . + '
    ' . + '
  • ' . __('Edit takes you to the editing screen for that post. You can also reach that screen by clicking on the post title.') . '
  • ' . + '
  • ' . __('Quick Edit provides inline access to the metadata of your post, allowing you to update post details without leaving this screen.') . '
  • ' . + '
  • ' . __('Trash removes your post from this list and places it in the trash, from which you can permanently delete it.') . '
  • ' . + '
  • ' . __('Preview will show you what your draft post will look like if you publish it. View will take you to your live site to view the post. Which link is available depends on your post’s status.') . '
  • ' . + '
' . + '

' . __('You can also edit multiple posts at once. Select the posts you want to edit using the checkboxes, select Edit from the Bulk Actions menu and click Apply. You will be able to change the metadata (categories, author, etc.) for all selected posts at once. To remove a post from the grouping, just click the x next to its name in the Bulk Edit area that appears.') . '

' . + '

' . __('For more information:') . '

' . + '

' . __('Documentation on Managing Posts') . '

' . + '

' . __('Support Forums') . '

' + ); +} elseif ( 'page' == $post_type ) { + add_contextual_help($current_screen, + '

' . __('Pages are similar to Posts in that they have a title, body text, and associated metadata, but they are different in that they are not part of the chronological blog stream, kind of like permanent posts. Pages are not categorized or tagged, but can have a hierarchy. You can nest Pages under other Pages by making one the “Parent” of the other, creating a group of Pages.') . '

' . + '

' . __('Managing Pages is very similar to managing Posts, and the screens can be customized in the same way.') . '

' . + '

' . __('You can also perform the same types of actions, including narrowing the list by using the filters, acting on a Page using the action links that appear when you hover over a row, or using the Bulk Actions menu to edit the metadata for multiple Pages at once.') . '

' . + '

' . __('For more information:') . '

' . + '

' . __('Documentation on Managing Pages') . '

' . + '

' . __('Support Forums') . '

' + ); +} + +add_screen_option( 'per_page', array('label' => $title, 'default' => 20) ); + +require_once('./admin-header.php'); +?> +
+ +

labels->name ); ?> labels->add_new); ?> ' . __('Search results for “%s”') . '', get_search_query() ); ?> +

+ + +

|

+ + + +

+' . __('Undo') . '
'; + unset($_REQUEST['trashed']); +} + +if ( isset($_REQUEST['untrashed']) && (int) $_REQUEST['untrashed'] ) { + printf( _n( 'Item restored from the Trash.', '%s items restored from the Trash.', $_REQUEST['untrashed'] ), number_format_i18n( $_REQUEST['untrashed'] ) ); + unset($_REQUEST['undeleted']); +} + +$_SERVER['REQUEST_URI'] = remove_query_arg( array('locked', 'skipped', 'updated', 'deleted', 'trashed', 'untrashed'), $_SERVER['REQUEST_URI'] ); +?> +

+ + +views(); ?> + +
+ +search_box( $post_type_object->labels->search_items, 'post' ); ?> + + + + + + + +display(); ?> + +
+ +has_items() ) + $wp_list_table->inline_edit(); +?> + +
+
+
+ + + +' . __('You can export a file of your site’s content in order to import it into another installation or platform. The export file will be an XML file format called WXR. Posts, pages, comments, custom fields, categories, and tags can be included. You can choose for the WXR file to include only certain posts or pages by setting the dropdown filters to limit the export by category, author, date range by month, or publishing status.') . '

' . + '

' . __('Once generated, your WXR file can be imported by another WordPress site or by another blogging platform able to access this format.') . '

' . + '

' . __('For more information:') . '

' . + '

' . __('Documentation on Export') . '

' . + '

' . __('Support Forums') . '

' +); + +if ( isset( $_GET['download'] ) ) { + $args = array(); + + if ( ! isset( $_GET['content'] ) || 'all' == $_GET['content'] ) { + $args['content'] = 'all'; + } else if ( 'posts' == $_GET['content'] ) { + $args['content'] = 'post'; + + if ( $_GET['cat'] ) + $args['category'] = (int) $_GET['cat']; + + if ( $_GET['post_author'] ) + $args['author'] = (int) $_GET['post_author']; + + if ( $_GET['post_start_date'] || $_GET['post_end_date'] ) { + $args['start_date'] = $_GET['post_start_date']; + $args['end_date'] = $_GET['post_end_date']; + } + + if ( $_GET['post_status'] ) + $args['status'] = $_GET['post_status']; + } else if ( 'pages' == $_GET['content'] ) { + $args['content'] = 'page'; + + if ( $_GET['page_author'] ) + $args['author'] = (int) $_GET['page_author']; + + if ( $_GET['page_start_date'] || $_GET['page_end_date'] ) { + $args['start_date'] = $_GET['page_start_date']; + $args['end_date'] = $_GET['page_end_date']; + } + + if ( $_GET['page_status'] ) + $args['status'] = $_GET['page_status']; + } else { + $args['content'] = $_GET['content']; + } + + export_wp( $args ); + die(); +} + +require_once ('admin-header.php'); + +function export_date_options() { + global $wpdb, $wp_locale; + + $months = $wpdb->get_results( " + SELECT DISTINCT YEAR( post_date ) AS year, MONTH( post_date ) AS month + FROM $wpdb->posts + WHERE post_type = 'post' AND post_status != 'auto-draft' + ORDER BY post_date DESC + " ); + + $month_count = count( $months ); + if ( !$month_count || ( 1 == $month_count && 0 == $months[0]->month ) ) + return; + + foreach ( $months as $date ) { + if ( 0 == $date->year ) + continue; + + $month = zeroise( $date->month, 2 ); + echo ''; + } +} +?> + +
+ +

+ +

+

+

+ +

+
+ +

+

+ +

+
    +
  • + + __('All') ) ); ?> +
  • +
  • + +get_col( "SELECT DISTINCT post_author FROM {$wpdb->posts} WHERE post_type = 'post'" ); + wp_dropdown_users( array( 'include' => $authors, 'name' => 'post_author', 'multi' => true, 'show_option_all' => __('All') ) ); +?> +
  • +
  • + + + +
  • +
  • + + +
  • +
+ +

+
    +
  • + +get_col( "SELECT DISTINCT post_author FROM {$wpdb->posts} WHERE post_type = 'page'" ); + wp_dropdown_users( array( 'include' => $authors, 'name' => 'page_author', 'multi' => true, 'show_option_all' => __('All') ) ); +?> +
  • +
  • + + + +
  • +
  • + + +
  • +
+ + false, 'can_export' => true ), 'objects' ) as $post_type ) : ?> +

+ + + +
+
+ + diff --git a/src/wp-admin/freedoms.php b/src/wp-admin/freedoms.php new file mode 100644 index 0000000..cf7309a --- /dev/null +++ b/src/wp-admin/freedoms.php @@ -0,0 +1,42 @@ + +
+ +

+ +

license, the GPL.' ), 'http://wordpress.org/about/license/' ); ?>

+ +
    +
  1. +
  2. +
  3. +
  4. +
+ +

check out our trademark guidelines first.' ), 'http://wordpressfoundation.org/trademark-policy/' ); ?>

+ +

plugins and themes there. If you get a plugin or theme from another source, make sure to ask them if it’s GPL first. If they don’t respect the WordPress license, we don’t recommend them.' ), $plugins_url, $themes_url, 'http://wordpress.org/about/license/' ); ?>

+ +

Free Software Foundation.' ); ?>

+ +
+ diff --git a/src/wp-admin/gears-manifest.php b/src/wp-admin/gears-manifest.php new file mode 100644 index 0000000..8feb485 --- /dev/null +++ b/src/wp-admin/gears-manifest.php @@ -0,0 +1,51 @@ + +{ +"betaManifestVersion" : 1, +"version" : "", +"entries" : [ + + +]} diff --git a/src/wp-admin/images/align-center.png b/src/wp-admin/images/align-center.png new file mode 100644 index 0000000000000000000000000000000000000000..a41222687508d27e34408a55f758ee5a7c7e87b5 GIT binary patch literal 571 zcmV-B0>u4^P)+l22fn_=%Z0Zt$l>hXZBPAuASQ=9On+Ja+>?&+J4ME6zIdtX*h zZg4rfN`48em{K3A2OWuX!U0Woy+zN9aLXIKeTDg9rZ{KjB0d}rJ*o8WX83R?Q&VLk zrcbOA(C7x)X6JN3IrjBe*L0zO@~C#SO+-28^Ye2e@?8i*6_J16?$@q*{^A+&&IaTb zU$%Hl$izSc-ZBf-rc<{!-HS2q?(Uiy5qXf@V-oQA<%mE;7XX4>RI$13yQ&&ciX1z> zUVMv@yiFz(0JH*v!`WwG`L=!iZg0N_pjaZAEul~V8EV&x1au3aZQHhO0nF!f0F-k+ zIXS_v4^zr@l!oKuV*s9+%kII!K}w04%Xq4)qQ6lZMx)V>I;C`Wc6L`k=ll=-mBHfL zhY-51BckbaDk4qOlq-tPpO_glkH_OOe*$oHbaXels^UMG&1L`?KnS5^F80zwToKw})(^Cw1-Zo&VAwLdZE2k-PgDim`Pke*=JX?mMd669~tvV$}cu002ov JPDHLkV1ln<0GR*) literal 0 HcmV?d00001 diff --git a/src/wp-admin/images/align-left.png b/src/wp-admin/images/align-left.png new file mode 100644 index 0000000000000000000000000000000000000000..2e433fc3e3d227013516a83c51cfeb267f048d9d GIT binary patch literal 587 zcmV-R0<`^!P)sQax`IK@^;~AHK6q5&=SrWNJDp{)CYtl!k&|NI?OL zWC=Qc04+UI967S32#9^>yWRJOV&O;;=M}Hno!Ob4K}(YRq?zQFWRnxgp3G#^s4|mG zOe7Okl_W_s8@6!2{r>KiXe(%}nuKJH`I?j8=&R}U<@;|mC(b)S2nYa}nTUu8Nf8PA zYC7%QR;p?=P7S-z*5bwe93dZXw?9@lPuglX&FtG4HRm8A-g{LQ5mlYdW}zl_?lx3a z_v_Y;Pohd1#iLy>^`kWEUz{Ebs;RgPOwa=3^0Ju$*lacc0%U7Gs%bbH3q(2|bzL_( z(Ugp1F~Z~XhfiTLNzz1&a?TF=T3 z147E>LCf{^HOWwzN=O$M7bIhhB=41AW+4Ps_1@3t^PID)qEIfE%fV_9a%fa_5VBk@ zNxHwm{3~oq$$Nk3BS<>u2Gs=;hR(0o>zs24q3gPbS;}cqWM)!q7a?UI0{`!lNO`yv Z><_up5e&-FS?>S<002ovPDHLkV1iJT2eAME literal 0 HcmV?d00001 diff --git a/src/wp-admin/images/align-none.png b/src/wp-admin/images/align-none.png new file mode 100644 index 0000000000000000000000000000000000000000..5fb9af2e0c6cc72482867a84a1c62c8f2e682ddc GIT binary patch literal 453 zcmV;$0XqJPP)+kv(n{K@f#s{qzjGA-l2`B2o_FEBK0>fkSWxGK&OD z_JBly&CYaJJ%U-yCT+>3N?NL~-s@LFGBZi4s)zsxH1sOqhS@H!f>f}1W=_+zZ2{o4 zE}v1v{>~*-95Y?V4U0rVF_P>5zu$f8>i^oGZohov&VU*yZC)0nU+swi$js2b|C{F@7&EH5HJE_2 v|8@dI|9&qf`$`s(z-&1p+RAsQ-&p?vA$H`g`ToR900000NkvXXu0mjfmh8)_ literal 0 HcmV?d00001 diff --git a/src/wp-admin/images/align-right.png b/src/wp-admin/images/align-right.png new file mode 100644 index 0000000000000000000000000000000000000000..9b92578fb5867463d5a88a0d8a072a62e772749a GIT binary patch literal 556 zcmV+{0@MA8P)+lR<71K@df&s;fPd*hv&AQdTTD0t?QNERq$6AMMgqk#9OqwM^p3v{HkVmXJ&c<01+|sw0S0))xz4PN}kEM z<*J^INW@E%o&m($Q9!=~fceMAcW-9}b1yp;$>fJa*8ZTarS8r94+`Mv>4}I$#LTAR zlv1sgnRz_D9LjLP`{$wKc`JrKd(9_EYoa#K&<|Rc2=9o12>iK2M8krJYDKKP6=Go$YwP z;O?A-baH-we@{eamQsq<-9?1RzZ;#Ey`S}T=rJop8RoMSrD5j_!Z!x6-EOb1ub0bZ zY5rEZd1;CGBW&m1icp;u_Hk&vq z5vi(~Etg9=LPT3@O(}^8GvD6cipZ}&ZLMv$+kdzSso2C?YYi81)Ra<0@c8)nR}0KM zj$_~V;lkag?4z4xX6yAD$C>oaEK-O#!aD#Jkr<(4#MH+GPF)v~T5CAcP}poXe_oKl u-9y97V&0;p>$>@)2@Oj(-0000{( zJaZG%Q-e|yQz{EjrrH1%u?6^qxc>kD|K7cOYgq5F0YyYTT^vIyZY3qSF!J>9Xe4kH cF*5Nm2;M1& literal 0 HcmV?d00001 diff --git a/src/wp-admin/images/arrows-dark-vs.png b/src/wp-admin/images/arrows-dark-vs.png new file mode 100644 index 0000000000000000000000000000000000000000..0d1dc7adaddcae26915f927c0a6bd6a435ad9ad8 GIT binary patch literal 1376 zcmeAS@N?(olHy`uVBq!ia0vp^{6JjI!3HE(r{0|6H_V+Po~;1FfgZOhD4M^`1)8S=jZArg4F0$^BXQ!4Z zB&DWj=GiK}-@RW+Av48RDcsc8z_-9TH6zobswg$M$}c3jDm&RSMakYy!KT6rXh3di zNuokUZcbjYRfVk**jy_h8zii+qySb@l5ML5aa4qFfP!;=QL2Keo`G(%fti7VnW3Jc zv5C34xsHO7fuVuEfswwUk*=Y+m9dePfq?=PC;@FNN=dT{a&d#&1?1T(Wt5Z@Sn2DR zmzV368|&p4rRy77T3Uk4Ff!5ws?aU2%qvN((9J7WhMC}!TAW;zSx}OhpQivaF)=B> zw8T~k=u(ImatnNY;RfdwLjwvJWcn3}1^R}12Ku?VAb){X7ncO3BAkI$b#X{#L8^XG zYH@yPQ8F+-(v)GEfnkT=B9KC$Ypnc>GJ%njnB$V4T$-DjSK{ens|1wMOUX>Ja&t6y zGc+_eF)%kWFtac;bTYHFbTYRza&t2^aC9*;hM9p)udAV{p@pNVlevL0&eeb6IW9MS65exAZ!`CVki~RNfjFwL<5krs#ZGensu{1hr=eH;R4a0^8*fxc?W5QkaclXuSr@Ii6xM!-OMA_RLtL9rg!|eyT{-jV?X$>zOD@d*vMbln zm^~)JdHp1o-EuBIXJevl>(*-k*-MtWOJ3Z3q*kK6Vp8gh+rAujPOJ-JZ%_TdSpBD1 Z0)xW5(--Ed@9+kdd7iF*F6*2UngIEM^4$Oc literal 0 HcmV?d00001 diff --git a/src/wp-admin/images/arrows-dark.png b/src/wp-admin/images/arrows-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..29f814d2982a8925ab0ec46d171a2f95239f99f1 GIT binary patch literal 495 zcmVdKT6w)|Qy|2w^fkMVpU2)< zny+zYtu+KSDf%*c9)u!m0R46eEgd?<58&@fg>w~eez&&K#7Ja6K=peLtKVw@IF|AvWSgYLyX@h;4$RtMW1OQ_LShr$Xgtgylgv&c7HJ%ZHC z^6lnXzNFBbjJj|6H_V+Po~;1FfgZOhD4M^`1)8S=jZArg4F0$^BXQ!4Z zB&DWj=GiK}-@RW+Av48RDcsc8z_-9TH6zobswg$M$}c3jDm&RSMakYy!KT6rXh3di zNuokUZcbjYRfVk**jy_h8zii+qySb@l5ML5aa4qFfP!;=QL2Keo`G(%fti7VnW3Jc zv5C34xsHO7fuVuEfswwUk*=Y+m9dePfq?=PC;@FNN=dT{a&d#&1?1T(Wt5Z@Sn2DR zmzV368|&p4rRy77T3Uk4Ff!5ws?aU2%qvN((9J7WhMC}!TAW;zSx}OhpQivaF)=B> zw8T~k=u(ImatnNY;RfdwLjwvJWcn3}1^R}12Ku?VAb){X7ncO3BAkI$b#X{#L8^XG zYH@yPQ8F+-(v)GEfnkT=B9KC$Ypnc>GJ%njnB$V4T$-DjSK{ens|1wMOUX>Ja&t6y zGc+_eF)%kWFtac;bTYHFbTYRza&t2^aC9*;hM9p)udAD>tE;(-nVGARv7wT~doO%TiO^it=+6z~O6^iN$^cLkk0Be_I+FSh|>+ zyEvL#IJr4G8Yw~brjQe6`as9%gAxZ)Vu1+(Qy_>5Px?R(JoBXH0dq_dFl(H$$~(fq zz&Od%#WAGf)|;7zeuo_dT(3LGF40hT2oYJigQ07Z-E@a0ty+!8_e4D`S-!ZmaPK(C z8v1~RL-WhEPwu~tWdlQZ`no4NJc7g_da?2r2ox&Lc?{%Ws_ z#nU2&+QNOiCFajLZuI}R66M^^=>rPw;JSm12cTo~NQpQ^_pbxi5ywuzDqwo^F&3^^oPp-JOC}H9KCWh1dwsw?fyx474;`mO&WxizJbI%&_ zlILGMdoDl9yl-Hbb7AWZ^?R)^uf9syoy<4&)~f)Zt3XZ@`?+bQ`-EAM`|jR3Jzb<~ za@=;^v}K1_^InEdO1R$Kv2y36u>SknTnE>&uY4Kk_C=>q{+Qyt6v1C*!cFA?d@mNh gJ@xV!Z literal 0 HcmV?d00001 diff --git a/src/wp-admin/images/arrows.png b/src/wp-admin/images/arrows.png new file mode 100644 index 0000000000000000000000000000000000000000..775a7a0329ea8be6b070b9491f3b4acaaac653f8 GIT binary patch literal 494 zcmVIgLeA?vW(qBo;jqds^)#aXZmg{tgylgEBwna>h!$t z_h798I7Rq?W+<_rLo;t^D>j2NBkLu?9y+BnxaunKq0A*g!&oNWHnJ`~Gb3ZcSYd?~RycNo)Md6m;(Zd&T9hpG$J8dvlqTlZu@>bAwq>~VoddX*&D^&nzu?xfY@_liQW>p@z2lo>rs+=p?9Cs~EQ-Gtx+ kQ~-MEyYheZB;NuI0Le(%7<(?}lK=n!07*qoM6N<$g7DGi(EtDd literal 0 HcmV?d00001 diff --git a/src/wp-admin/images/blue-grad.png b/src/wp-admin/images/blue-grad.png new file mode 100644 index 0000000000000000000000000000000000000000..868a657cca2e16c23e59c0b5050d49c817c9cff3 GIT binary patch literal 337 zcmeAS@N?(olHy`uVBq!ia0vp^tUxT!!3-oN{(RR0Qq09po*^6@9Je3(KLB!L1AIbU z-~agk4v4=0d;9I*n{R(#fBp0F%kNiT{=E47>-nc&&p!Tq`r*gp_un7A`}Xkd*9ULD z+f| zw`*NMi#Q8BB8wRqxP?HN@zUM8KR`jz64!_l=c3falFa-(g^SG zFdW$M@ZGxq^F7_T_dB#G32pRnQ45;b?KEYP(AEqWZL5pjjy*|2niAVZMb+lDua-}^{^G;_{rhjF*cx|lI&f``~Uxc28w~= zPZmZ722BPXkVzmvF|e&YFr~mlN2>qClA@D2R`V~cDDhe=$KRAQjq_68bcyv1k((-J zPbr?fpw?`kpN>g#XV;n^d+N@=|NXySkfFKRhr6ZKo2!GtN4=@Vm%qc0Z=zp&ufOap zKOw?6mq*;jgxujqPz#w~v0JN#KW0u@)E vJAdKgr5YZ#Yu9{KuHW$1xXtDxbKh6}w%@%wzML<8uLcM|2$1q{WUvMR|7)rM literal 0 HcmV?d00001 diff --git a/src/wp-admin/images/bubble_bg.gif b/src/wp-admin/images/bubble_bg.gif new file mode 100644 index 0000000000000000000000000000000000000000..315ab527fa270f2b4ffdc10f7fc80d692a763d03 GIT binary patch literal 395 zcmZ?wbhEHb6kiAVZMb+lDua-}^{^G;_{rhjF*cx|lI&f``~Uxc28w~= zPZm}Y22BPXkVzmvF|e&TFr~mlN2>qClA@D2R`V~cDDhgW#~Sgbapuvc9kDzT*_yqq zQ_`kAIAS)h>Fwo7ja_Sg?5R8d{`da|7l!6$L7$dp?)DC@?pF0a27ccbKEF8U}fi7AzZCsS>Jijo6-LR^(A7b=&{RVtpT*|STdYr8`3B(;WBa;fc#1=Cb( zmnoOeSFKy2QnN(8ZIed(W{r-m@)=#~EgKZ`r>Hfrlh5ptO>R{zny%KkMzedTQps$E zoC)$-eJWLp<=Dgtl~wT^I6WDD%_T#_W#x#DQ*eP@m>i-dZ2bgr-Hj;3=*6-!(rN`mv#O3D+9QW<;`lZ*0mQ&Tb%72Gn5Qp@v;vWpc=^bB69 zsh0v3i-8n77o{eaWaj57gk|<;~5n^BH+J z82mXdkeu-I|9|;q3Wx1;nr?*rJD#Q%_I65?OVi{HQ7v!I{ck?+8M5Vt{Vp$|8kWny e=P&T`ab$Sa{( zJaZG%Q-e|yQz{EjrrH1%u?6^qxVpKy6%`ddyzBc0D8g7064+e@qSr{1@*co&ffB>YH zf!U-&Yr*a19*Wvi8wD0xt55n?8Fgds+|GHE9`4(4QR?u6YwvybZ(IG{I{snX>aQgm NV^UA*s4y^C0{~v-E<^&p!UV{`CE;FTZa*dw=Ee+lvog-FyAz=JOBd@4tNb_UomGudh6Q^W^>aTQ5Go z`ts+^x4(B^eZKJE)uVUcEMS_LF8UXK^jxy)rl9Mwn%LP*puyzuCjPMwJ95JKF>j+PKsXg_GsnhtD8 zh=^TCB+KZ+w1O@i>_T)@BanhF!iyL+Vms&T{MtEZJ7;Iq>;Dih&-?H^?}zX6eBpgE zG}u$CKdlD<)Vh0}!!XywXhAgaPSf^0Oxh{bg97mO^W~b@aosrU8k@a3GdX+De+L6- za3+9R-8cPH*f8b~KDeF6Iv|7(4UD)7Bq<02RVXNmg6H!LO&2+?R4U1`OcDggapiKE zFY+wIunf!d#VW*b2^}-T9V2H+?-(*rOF(SfEtt}NrEU;s|w4ql}aU_%l$QMw*#Qsc019L z`$qxet-2wzufeA~GdF29GQ(3k#HwpP=Tp5>sTUs~bbFp^79H8|jwMGn{Nu=E4WHV@ z<`Pj1OGKNZ!frxXz@l>r$fB|FiN4r)-$3m7_{6|c6Ou{+s8EME>s@=BuaUFM*eAr; zY2XyDLos!9uJm+8Ui3todx6%dF|QjeX0yfetkJS=SZ+O-Jgk9eC?1L*hC<0?DEZSH ziYJrFcpRuw8!vzFO2-wvIO)u`0SmbDZ3PihhCn+Q-Xj2f-scY3wf=tci0 Zqyhce4|i>ku8hL(3f!(i=T4U|@(=9Ekd*)c literal 0 HcmV?d00001 diff --git a/src/wp-admin/images/fav-arrow-rtl.gif b/src/wp-admin/images/fav-arrow-rtl.gif new file mode 100644 index 0000000000000000000000000000000000000000..e9aeba050766144782ae9eee56a70346df262d62 GIT binary patch literal 243 zcmV}Nk%w1VG#fz0K^{v=H}+)(;^N%g+<}3C>FMds&CTE6-;gwuUU0vPX-PF|7 zo}QkMkB{Ty(;^N%g+<}3C>FMds&CTE6-;gwuUU0vPX-PF|7 zo}QkMkB{TyF!Nj4FkwPVOG{&8V_jWcZEbB^TU&W~c}Yo0QBhHTetvFlZdO)SMn*KLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=00004XF*Lt006O$eEU(80000WV@Og>004R=004l4008;_004mL004C` z008P>0026e000+nl3&F}0009QNkl&jz|)ZgZ0JtH*VkC8s4$DH6&JSu9=A^ki_(P zeNT(E=kI=Xwt4n>r?Q@%~4#t zy~ycKg!T`T}gaFvI~@jBg!ib0fcK3v6X|pMQJ9 z?+fZY)q0OZqj7fi_|va6ob_ift*sHg6T_9q57t@%ngYQX;&ByWC4rwWx1D6@{x6&u zJbkjIy=B<_5GhqdEUv+9&NiL+Y@1bpSShMnED?$(k=BW{P7uI?dHJYb^1LJCa^$5-M2A#>HPHO9n*Ajz!l?{jlFb_YixCT*wN+XtveC! zKk_F#yS(fj2s5|3{&40lD`T^wbjhn(B2Xwlf#sD&a9$q)X#fDmA4E~M(1zl<`7jIv z$<_R5*c%C7Qy8SLJ$Pltr859s+y+7k|Tzd$ngKFEC@oL z)v>EF;BsDqm~FYz()mTMG%Lp-kW8f~9h+8v2r-*-@eAvN*N?qPGBQ==$DwxjPj~+s zQrLGl%K2*#T%CzGqX2*>i);3^7uW1-2T(8*@6iC8LI*&2pDh6Z0000QK$!8;-MT+OLB$f+h?3y^w370~qErUo#N?v<+|-oJLS?6Fq}h zYU-sx#bO}E&PAz-C7Jno3L%-fsSJh&`bH-D1{RuptA7JkXnMLhhE&W+uKE2FVdQ&MBb@00ad; Aj{pDw literal 0 HcmV?d00001 diff --git a/src/wp-admin/images/gray-star.png b/src/wp-admin/images/gray-star.png new file mode 100644 index 0000000000000000000000000000000000000000..a32b058bab68d77648dc1d8189b0d459b43dfc6c GIT binary patch literal 625 zcmV-%0*?KOP)J;xrTZQ^}xFMK%n-1FtD=iZ|`%jHr7!NNM^^LfZ-vtY4UL{iw%Gpkf88`D%O zB{VaF&Z^hzT?|p=1DYL)w7a6>cs!<{BA;n9olfDu&04J%g)2_q%d-4$W~ z+wBhW@%enPD@hVqt=4ZIkB2V#K4L{&NZ=16;QS%ii9?sm^$5FBZ8qD_(HM91yA7b7EQt{x7&S|PNxkUvvrS}_C1ryoO25&$X9{U9z9Gj7<`aSCbti5wOWN* ztyaeEV}aRaI2=yIVlnY+dc9r>l1_^f>%?a5cAJ8%V#x(=MJ3-BpO5S2&00000 LNkvXXu0mjfO&A>k literal 0 HcmV?d00001 diff --git a/src/wp-admin/images/icons32-vs.png b/src/wp-admin/images/icons32-vs.png new file mode 100644 index 0000000000000000000000000000000000000000..d910bc1b499c0d05d9d8f70573a4ab88401e5ece GIT binary patch literal 14927 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 D`A)G& literal 0 HcmV?d00001 diff --git a/src/wp-admin/images/icons32.png b/src/wp-admin/images/icons32.png new file mode 100644 index 0000000000000000000000000000000000000000..d94e38af1dcd961531b5f8cfc53b66c680f59469 GIT binary patch literal 14649 zcmb`ts%45tF20aOM?pl0D-!il0E>Sp&sA!V1pmeitv!% zj~5(IHB)Z@z$5+d1p=}^Pyqn0jS#JF}Ru?vYx|)!l2m-%Cfr0pU zWIw8Jb%Pfcj?3%`K(OmyFnZrHfq<(}X=$#fU0B}$kpDCuHqfP&)5T90^FXwxko6pd zcmwM4c_*%kjUWSHfk_Ib089mh$jxLm017Yw>tQ?FbwHN~ux1O}ng$TLS6M+Iz&wqS z98~ZQfRfrHl>jFxpmO|KoHAg-50E)%q9lMh9)Mrn*g*~W(hPKsLGbDTY+ zPw3=5H(xysLJEvQ6qr%p6(9<@FA#LEtT`$p6xgFjztD49^ZkI)3wP-` zMW=ca@_sjJA(ZhXy0O8|>t=5c$H9;vz$Ud}TtI?s<4l;6uqm^mt{A)3Fi7H=p@T>= zy{DS*MAQWI;|!rjYV@Zvuh1l7o~wL)Cp7>FM%+fXs|uur*Xhapz;9G+Ef=GCqw*1N z;)Rbub}~gl&cv$*8kq#q!tIIAPDBgIvWoruT{~1*La3MgynQ_iwc^}3sdmG)Pb=|1 z_tAWLR*Bvgdu}&g>xV%SuH1zqis7dKwPBD~Gl83E F|>6nFy7jVRI(BJ5NXM37j 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 Wsp literal 0 HcmV?d00001 diff --git a/src/wp-admin/images/imgedit-icons.png b/src/wp-admin/images/imgedit-icons.png new file mode 100644 index 0000000000000000000000000000000000000000..5f1f5851199320cccc0f6187155706a84eeeeb76 GIT binary patch literal 9607 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 literal 0 HcmV?d00001 diff --git a/src/wp-admin/images/loading.gif b/src/wp-admin/images/loading.gif new file mode 100644 index 0000000000000000000000000000000000000000..85b99d46b9911ba53a792d716d9f688f3bb3c784 GIT binary patch literal 2530 zcmb8xdrVVT90%}oAH9#>bK6p?cF>G=h0@JhTLdf!(gIdN1QeV+L;)2XD9^zNN@xod zwcvQjRvj8}y3J)yFv=3A2@i*l5Fc|hs2f3R;^QAN{$aL%*eO}IEP(~izxV$0$@lmB zp0hT=YKq8{00}@xHO(cjNl%Njq^=3k8whNA8mRstISPn@&imc_Tf_3@%d4xaj~qF2 z`t<3uXU|@|c=5`WE2E>Mw{G3KfB*i(#Kf~_&tAQH_4e)C>6t?woVxLBCtLOMhuB(t zGPLP@xf$T%5Zyz3iOuKI^?SO*zNFJ?wrL@=YKNznIpw!L(PPjKYQ7%}eBCama_c91pIJ1~(b1Kal`fZSz8V+OJY|r^QHxE6+WMoDB(^~{XdW=!#+uo_ zaF>U{k0Hho~yN%NrSyV`soxiBvd>cj#}5&$KDA)3{S^?ffCPkeDi5Vo>T8sy}Wj_Hf}N$J0Hz& zv|)_<-f+~-Hi-jgzIkG5vY*T|>7-8J0U*@$d8~ScFqA)f4R7yaDBs3j(<2>@V?*ZD zy6{Vy+~KLc_m5He=9(fsy~0c&4a-*{&i)i(02j`@8?In8dBM!Y(Znu4jtn@VMj|y5 zrTNa5ki}vtEiGN(#07>Rk#HaVI5ZB4@@yk%765mBN(yieTXgm{oK}vXn!h0oZG3gj;>>W?MbZnG6Q_cX~h&<^+R)8g9 zSd!4lZEm4K#ma0{aTpMHv%wr`1VF@rrKl5H7Hyn$;=;nh3JVMEcKbqhXnqO(3z}-# zu=v1OV7q%OY`*dVI>Y}97i4s2yl$S zmSto?fO|=u8h;vSPKY2zqaEs;LlhJgv~%aqwzjtUie_4FUNiT>r-& zOO#{4cBb6f^ zov;AUp?UAne>@_GHz5+(221Xlve$OHK)tvvi!~l<%)zr4PhU@ z(CY^us$O5!${6Pje5gy?*WtA2j>{<;$_PvVQNKa&69IX)a|Fw5>C&=WQ6s37gabVh SjHs`-`=fdj^ILtus=om5Wbpz3 literal 0 HcmV?d00001 diff --git a/src/wp-admin/images/logo-ghost.png b/src/wp-admin/images/logo-ghost.png new file mode 100644 index 0000000000000000000000000000000000000000..58335f7f58627d214ae9723f6e9827eb8bf2c57b GIT binary patch literal 559 zcmeAS@N?(olHy`uVBq!ia0vp^k|4~%3?x6Bmj;43C9V-A!TD(=<%vb942~)JNvR5+ zxryniL8*x;m4zo$ZGeir1AIbUSFT*SYSk(qAD_s`$oTm92@@t%R8&lxHf{0Z#a&%p zsi~=Tb#*N*EpzA2U9x0JP*6~IcJ{=H6Q@s~URYRIR8-X6-5nepoRgE|=H_OgCYA)Y zJIF8iKMugaXu`Fffq^m9)5S5Q;#SC{?n#FgI9w}#n7K_hdHeUje(afLw{?yAn%#G5 z2-qz8^W>n!3Lywjtj;^O?m*A9_KJ5)sX=W6~uTRmUHXQE7xjnSG_y%pDNB&_>#i`L`m!a$NmWHQeC5RITa98DPi)~oB$T51<% zDycHU==Lj?>jE>Fe{D1fwOBjl$<#H!w0BJ}$2~8_D literal 0 HcmV?d00001 diff --git a/src/wp-admin/images/logo-login.png b/src/wp-admin/images/logo-login.png new file mode 100644 index 0000000000000000000000000000000000000000..497f683cf239c7f52f09d8270352bca2f84a4aea GIT binary patch literal 8891 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 literal 0 HcmV?d00001 diff --git a/src/wp-admin/images/logo.gif b/src/wp-admin/images/logo.gif new file mode 100644 index 0000000000000000000000000000000000000000..8024d4807622702e0e65f4234d1822be138bc332 GIT binary patch literal 1289 zcma)#|2xxp0Kng$Py5RFeCB)^q0QG}9I5C$vCY~zt=Lx5Mf21db%d5&SJ&p447J3G zdV1O_DVJ`m>``5U0)h10w)jF1Mqj zBO@b2qtPrbF3Mywi^bB~+A0tT>gwtS1_q>3snu#VnM|pvsTCC!&CSjKYT$oEo5x@s z0U0p7YZaLV#uo}*dBoU=hCJvA6VaLD-njyrM zBP6-M4GahcRcL*M`r9Qq36x@QQ!9?fl0-N}bCr!%2uV7CZzAJkP*LkOBO5s{#77f% zr`;jwF?P|Wz8J#YjnPPFT$iBj=}1iTbAUWLIeg~TE7)ukeJkz_cs(^`A10cU6{X}5 zLdB(5-1IB#R;AovS%wWoBQ}#XW}K!HY)>O+!aZ)fHT7=&-BMdNZyqZZ3)>oEi7T^dd!~M6h zMCbyU*m)TO)anyL=g!Ss2f$HW2 zl98q8f)AZa+N)&31<0BxbD`d7kPI@UTI*8i&s4>xMKo=$^w;dGhy9ivcm(AR7cskQ zJc8{ME;J{~ERR{@Vj~B|)?zko!CV}e|F;Q^8FtM*_G(~B()@`7t zNOkzDs&fO2(vEmbVe*7y`q%^Wm#1&w3<-CN;TP56U(F3Q_Eu&s%e}-=nIsxYz(rx= z!Q=+*I8pn&%qtWpr0bijX^n5BWbP z)Kk4175zD0==b+w!&=?5{lBDF-jVX3c@};aad9Co=HEl?8 z_;Dm*Qe#^q@)P-H2a8V=>gfe7G&^re%H~+-;P5IfjPG*jcO_Qqg2Bunc9uv?=jGj; z$l)a1bJGUB4T)F*4aKUb^JWH|V-RL^?;L-|f@r3L=)o)Ht=!d)jp}E|ND^!q~f1PjbsE zcOYiUf>b4=+bEv33JAL}zE7sABO6xzWUOaygAQE#z`$J4QeQUpTJZxTqTBEN3g2s% z@UV^z24G9L5x+jo#J(^3`Dm{4?r_#Ao@ZZF40ood7Ug=QjuB+9a%w1eJE-Sq0nxpi sCdB&~jsWYqqs0(PI>@*6Xo_H7dG}qLlS4NgMm>W?WbnrjG7O^r0emP8LI3~& literal 0 HcmV?d00001 diff --git a/src/wp-admin/images/marker.png b/src/wp-admin/images/marker.png new file mode 100644 index 0000000000000000000000000000000000000000..3929bbb51dd950802bb9bf12a397d1ac1e140610 GIT binary patch literal 652 zcmV;70(1R|P)WdL?^ATcx`YISTNGB7YUATcvKGch_cGaxH4F)%P5@Y>T zK`Rsr}kV+VsK4r03&T_dN z37_`#A}MZSsZ=7H&Gr{5`4jIqW3d>C;2mRQVuQC)s?}<&*X!MgmKw!nwOZ}3XY?Yx z1ZKC}8S0jW4@NQJa5(yFMK4kTYB(HbPN(w+)?NbvF1{X#MEdVndQW6J-p7BJ3*__perLFn{87XL ziu@ni?KWkzS&BxZ!L_t(|+U;H2Qsg=eY^etR|BH|J2?_?=>XzhWIK@;^%f>gUTQ@tI z0Q`Mk?qh%Y{3&r#4*S0lYA-a`9pmlA`d)U0-b2PdfxGLy%k402=K1` zO42&VT(L&GlDj^3aQzI3W72MiWRd2z24Jhgv2#||?&@>Nwa0-(p8?<`XeY@%qSsvl z+F|9N!xN+D%jk0__^$#&)Mif=S7ZRQv64)x1!a}BWPb#6DBzBbOoN=)ipEEcS4g=+ zpsUxYjJLpmRz_h9ud`jES2jg<(eEaBO&0;I94z_H%J4X_Pq3o5F?~BiW5yHg0J)}+ zf{q0WN_MVU0oe{1Uzrpmgk``~fmaF2w9RB3n?5R0mg$q(Jem-?T7*o@o0;DhzoT)@ z6e*RX{FA`F!rUk2{PwRkS$vnGmIyt+`QK^VS5H~(SkblEi;T?}%1N2Gq%cPf3{h8u z81*%x*sw&TI7Zfrl;>lI5hz$COG&y$&hd4_7F~YB2790h>7tw|*&@=AqBBZ?BM7+G}o#g@yeCqM*xRV8|ogsk!G`m4rCkrL$z zRv0Cuu^TystOy{VkUGmJ9*|!F-ZJ6Kf}`mH?FN}Dyd^_{CoH)lBMQGS=V8N_5ocLe zXv?&-WbP^~-;g@kIv-O> zv<6Z<0LTmEsbon+t&Ulk$_Wk0_zFNWq_A>kJR_9<5mZfsC<2%qf&+y3Q^k}`tW{FF zLNA@@cb1?WT|`PiAP!9)Myo_IcT|7Au44^rNe@m8ajKL~JCFG3P<~P z3mWH(@d)!)#U{D*)vUVZ;M4PUzVYCO`KnZ;J`OS~ikkIa%4Lm5vk1IjVRn z`J~H0rv=K6l+y_iA~25pe!__pVHQwNmeVZR6e%cL#;(N7l$Mziw(A(h3vvU(G0U3> zuCka1)sjO$pXw$OjgbJtn!Y3Dov0MhY!!~$IZ<`|>a475?^2TK!&54!n%&3UD}!*M zfA=Y`H|w{{XVdV7CQv(%yE8}cND$Tuc2?dIc?zRwbX1ZB0mS+!kapK?WiWRh-!6FK zUS5y`n@4nK zFHiW9=(}E*F{?%xQXtAuB`#y>o_s=-^`hm`J%})dCO1aG{UHEe@&1lBcD-r%LeiR4 zC9x?JJJtkISg7+V4=4KO8Ms~B4^KhCk~_y%f$x0N5Q_S#vQ10k>_PzlPOXlYq$%T& z2!9=h7J1ClQ{EE-DFU!BX{!K%q7KR!CIptQt-_a`TvTYgLLQa~yGX{NogKYZXowc-J_)7z+Bz)UiOOgM4ylp6c*|RMh!vi*o+J(^&hiDpP3j9Aa_}6=e!kz z%o@PdQ@R1|0)x#V9mGF>&vOU{QN;q!`xKB$caeev#?Vc^8ZoM}eG6Y1r5Q_$#_n8x z)qf-uA7YqRfsb+!{Wk=@dP>G>x~#9;iZkt_7#6$6e0oZkVjb}?dyleMou9&y|fee8ossFdLuV^6Sir6Gr zrHvs4g|Teg9czqdQX=J}3TD?=8H)k|RiIVl+f6 z;w#!ujokq}uE6E%=CLAtRNAuh@50__Ao=coOy3ca66FtO!9kXxAl6{zr~-HAI4XQy zDbUIJtYPf9K;N<2r@Z3FZZL*BKEnX~hriEDef|N;IdkP@&ox^B0000({UH^75LRnn#Zw-Mo3Tu(0s!*RLNxe*E#{$G30aK7amv z{`~n>t5)sXx9`}oW81cE+puB7zkmPUy?giP&!6n<>^E=TG&D3Y;0B66S-_GyAQEIJ z1FQD})xMO-xfxYmL9h3%t&s7_y}o&cM!@^;)`3bNHKe+o1(_~pSk3nCW?(3YSRb}Z j!Qf@p{<{u}PI|LXvUXLSO_SDQK9uCA&ZE^Pz+epkWp`Pm literal 0 HcmV?d00001 diff --git a/src/wp-admin/images/media-button-music.gif b/src/wp-admin/images/media-button-music.gif new file mode 100644 index 0000000000000000000000000000000000000000..0254a0881101b767577c82b30a7f6a7f522e6dad GIT binary patch literal 205 zcmV;;05bnaNk%w1VGIBa0K^{vm6et1>gt!5m#?p{v9YoH`}_3t^w-zdd3kxXw6ueR zgUZUvfq{Xir>C>Cv(nPiSy@@XzrU)gs)>n-`T6V!YA^8LW0018VEC2ui01N;O000F_;3s|sc6f=@ZR5AS@Y`-q`?j{W z@$vEO?Cj^~=l}ozA^8LW0018VEC2ui01W^Q000GY;3tY2F`lPjLFh+q0b~IVv~83q zT*w1(fXC&M5Cs^TLIqGMWFi=mN3!r(tpmqE^e`+sU~oqDQCt=Wj#@pKToeKaK{F`W vHJ*f{$Wcu)fEo@41t$^>8xb2A5iJM^3;>T8BL@ut1O^zJ1_S^d1t9=C?A334 literal 0 HcmV?d00001 diff --git a/src/wp-admin/images/media-button-video.gif b/src/wp-admin/images/media-button-video.gif new file mode 100644 index 0000000000000000000000000000000000000000..50ac6e0283a959c8afe2d49dcc04ce12f5be6015 GIT binary patch literal 139 zcmZ?wbhEHblp9uU@UGsd@0=!TIy&>+0&V zv$K~kU*6Er@c;jR1_lPjpDaL4Tx0C)j~RL^S@K@|QrZmG~B2wH0nvUrdpNm;9CMbtL^5n^i$+aIn^?(HA4aZWV5ov6ELTdbo0FI&wK{O>*+w4vx20?>!`FrQsdJlnHR>OPy zcd~b_n$otK2Za4V;76L-DzNVtaSB-y0*E}{p()372;bw_^6ZZ}PI-92wGS&j#91PI zKs7DSe@(bk%_Y-7gGe}(^>I=@oY#w#*Bu9GZf3^F5WP>3rn}7Ut74&?PWBFvy`A)a zPP5)V!Xd&78LdA?xQ(9mjMYElVd13a#D+Z_7&Y|xU=_C-srWU*6kiZcC!$nw*)9$7 zn6CX+@=AhmkT}X@VSsa5NKe;HZuq)~1$`#h6R+ZTR#D-3j}vF!)ZOnz+5)dI4jl{{ z44Mr{P!L4~VVJN`K!!XTF*LGrKO?IK8z<8w`3e3jI8lUGNUta*C8 zn(P`s>{pjD=7Kek#B;Fw@hxAK%$F&Q6vg9J^Xf~4by_hu-=A!MJ3Znq&n~srbFGPs zH&&aMXZ>nO`|hf|ljc?VPhR!${AbO?W8x_>CU%PFA&Hm8F7cAsOREdwU~R_;ot1_u z(ruCYB-LPGn!NQdT|ZlRy+(fw^-+`=%+gee_kY4FWHg<*4sZI8+sFJD270UUORdLHO0nA4V) z%{fwsET5CQ>B?eK%uw4yQc~9?*JVo2}ze(;aRcp*ceL#HUJSllrgm5wQKR zQu+C;QrUh^8rFfA`ftFz{YAidi-`aL010qNS#tmY3ljhU3ljkVnw%H_00JjTL_t(I z5v7$qj}lQ7hOf)2>j!?U9}ALQ;|DR?Y-3`9|3EFM{25zP*|E`TYuY6gG}}^;&|48B zoymrT20~#7tUzSg@p(t?2n;)$b#C%xX5gH2?|t7pXN(&%CXR=F;5@~_aF`% z5F^!?kbJk*YJHE#<1YwK!2`Gh*Wof;Qh_yYR*vy_Y>LI={$MZ|6EL0O%&w=J*h@TX z1&v1Ih=6DC2=2pexCZOs&FZWHY_P@voGwi1cND}p85L%0hP?h5!zw*?kN#5Pl{Ru4Lz&XC|!ka$+O zDM^2Y<41q!M?0F$=2!lB4qCcwlW+^R5$o??_x=h-qtUcbDD0E)8|>`XzSXl6=xb1~ z*AIC-*S6&qcm;aB-p@=X^O^$IHVG%&B;0~+fdaA(;l2BES*mO;*I-30ogT~T|Mgvl$fEzcOf(??9ZrMFcPs+seEFR{}YjYx{+*D z0gXrpNd<<(p_9wyKCqP?NPv34O$hV=!u|KbKguc+>1ARjlS-xDluD)d-0BFcb%_|r z?$wrS=J`QGIlf3kS=fRKMQ&*-5~-=GfJUUYt^#x@H=oacM7+naY^(QKBkW&CQquC^ x)Ao&I^~j5V+DJ0=iCtdxcidWAWvRup^$%HPF5Qg1(2f8A002ovPDHLkV1j2lpA-N9 literal 0 HcmV?d00001 diff --git a/src/wp-admin/images/menu-arrow-frame.png b/src/wp-admin/images/menu-arrow-frame.png new file mode 100644 index 0000000000000000000000000000000000000000..33d19d8547050470dfea18c81469816b60807abf GIT binary patch literal 564 zcmV-40?Yl0P)m~si4bLP?ANsP$=9C27{?0j+Y`*L05qw5mZr>!)CMj#!|w#sFt9uR%@v1 z`g=GWKEW6>2|BXXPi-Zo>{YAP2i6RJWI7%zi7Ibv%x8m(gV58+sXYY}s~ z+%=1cnD&K__Js`W7>1#>+wJDGX8P5SH0$&^U=dgYHUK4+N}ct3J#*Fu%*})yPRDdA z@f0zW$(#m*!DANNrVW%b%S8IqNE->~qrzFXC6h_L)9HLTT`aE0x_tv~f^DI6I-ThE z`|hqbVq2|NdvvM)j$~<` zXsT+4}mD7t=sRRqTrZZ;{SkkEo41`hKECgJcx{qKNKz)j+2y?mY0~Bnwy-R zo}ZwhqNAjxrl+W>s;jK6uCK7Mva__cwzs&sy1Tr+zQ4f1!o$SH#>dFX%FE2n&d<=% z($mx`kQas3n~E>l+Lzpm-X_`@_4D`7 cQn_;j0~E9ruG>O}W4t|VbWMOH1rY!MJ3-d0FaQ7m literal 0 HcmV?d00001 diff --git a/src/wp-admin/images/menu-bits-rtl-vs.gif b/src/wp-admin/images/menu-bits-rtl-vs.gif new file mode 100644 index 0000000000000000000000000000000000000000..422cc8df25c6ff1ba125c941ea1aa5999dcbf720 GIT binary patch literal 1555 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 F^narM@oWG9 literal 0 HcmV?d00001 diff --git a/src/wp-admin/images/menu-bits.gif b/src/wp-admin/images/menu-bits.gif new file mode 100644 index 0000000000000000000000000000000000000000..218e184d350fd762ddd69933bdb35ec066ee0a88 GIT binary patch literal 1139 zcmV-(1dRJfNk%w1VLSkQ0o5`9;Naln+0(2<>lq=?d|F5 z>Ehzz=H}+As;c+*_vGZ{=;-L*-`~v4%$S&%`T6p;_4W1e@bK^N@297y z)6>(=&d&7o^qHBN{r&x&ot@3i&Ck!z@$vDxy1Lld*z)r7yu7^g^Yh-`-onDd`uh5| zwzjaau-)C={QUge+uQ&D{{R300000000000000000000000000000000000000000 z00000A^8LW001%oEC2ui06YME0RRU7K!I>bEE41e3XP7Bkdcy;l$Dm3 zn3&YwMR1wC4{R???UXGOhQHCEQIEt`-)yS9W5 z7p7vyAi_570#rGx@Xf(OaLp__*v>%MbAj41tb(?{L4t@1(nV*GK;SCs7rC>?H16GX z`NZfOr;oh8a{J8hJI4<_zjXc7_gm+Wz5l%W|Lg(io`CQXD4&7!A!wh1_%W!TgZx40 zUw{-2IM{_4W~kwY9CqmcVN?wWAXbPYiWnA&Cz=QriYu!46^k#r=oO4J%Gec+H`>S* zjyvkO6^}pqs1=Yy3Yis=M;eJ0l1nOi6_ZaoX%&qwOkm}e6NG@BR5T9o0hU&dKoyQC zfVlw(W7_CJ2v~NP=1U`7*}{}Mg0R5^A23%HkOWMyLXZquYk}9dGl%i^>s+h8>sjHmA>S?GS)@tjm zG6gV}u43^Tmakv|`<1X>5!;oqTp_!avRW~lm9tnudzG|SQCpR@R24vhSQPATVfG3#8ENt_UBj z@UICoyl}7$L;Uct5mP*Iu@z%{@v#|mym7J}gZ%NbA(K3Evn8W^^0O(kymGWH!~F8J zG1EMAwKd~>^R+qiyfanUP8GCNLq}CKR7XFRv{Oqr)ihI2<0|#kR99Wq5?E)gwGu%9 F06RqDYEJ+F literal 0 HcmV?d00001 diff --git a/src/wp-admin/images/menu-dark-rtl-vs.gif b/src/wp-admin/images/menu-dark-rtl-vs.gif new file mode 100644 index 0000000000000000000000000000000000000000..14ed2ab4f1a2fcce547e62b0ee92a0f6846ca508 GIT binary patch literal 245 zcmZ?wbhEHbCMAjqHt(gCuQfwd?>rBBeY?^)!k z)wAZkKXGKDgT!Jd5pEGvb|)q$78VW;rNA#YzSbzuPAo{W$WY4RK6a^UcS86KZN16o zm#nw6Op#`T6a6TVnE`KmK0X*w9?t)Y?+t-qqQYRoB>c~iBXk=oR_Aw|>Xkg{yR`B3( zFk)h2=kb^%67i7n_*7FxY53B=i5(T51hI3{`0q!*Y2IU@nF~S^X*G_ z>^yev#oG_3uHWlewrl&5)1jTK{{R2aKr~SN$->CMAjqHt(gCuQfwf3Mq&G!n+T+eu zs@}Ua8{L>g7BmPruyg+5>}V4F`BzM!{o(Rv6St0AZ@*61nx>|sV|}}7>w~-s(|uj% zQ?^*1joTfcx+Ch|vi-q@e`4aF-``o=P#<62RMuYC(bn11-Ph7Mp}Deu%A~I8y)&n_ M&Ym}IiXwwG0FC8n_y7O^ literal 0 HcmV?d00001 diff --git a/src/wp-admin/images/menu-dark.gif b/src/wp-admin/images/menu-dark.gif new file mode 100644 index 0000000000000000000000000000000000000000..739b888f32573b02c0e4535df814bf949f068745 GIT binary patch literal 245 zcmZ?wbhEHb|{~2%t#h)yU3=Con zIv^z=I~iDu6cT!us7`y_xk}Z0*UE+{R>K7c6Mc9k{|KFEO8WU%g3sm2^6C(`u3K-X zPS~2JrlVthyK3u$yb9BOUFTD_Se}jB9iO@*>fW;b!G(Wf;-BB&S=&$_U)@yJUf0pq e+0)(E(m0{HvVY2?uIarqr?$?XH*Ja{gEas%y?Uzv literal 0 HcmV?d00001 diff --git a/src/wp-admin/images/menu-shadow-rtl.png b/src/wp-admin/images/menu-shadow-rtl.png new file mode 100644 index 0000000000000000000000000000000000000000..a7507719fc9580fdc7c4edf06eddd97ff471aa24 GIT binary patch literal 891 zcmV->1BCpEP)4Tx0C)j~RL^S@K@|QrZmG~B2wH0nvUrdpNm;9CMbtL^5n^i$+aIn^?(HA4aZWV5ov6ELTdbo0FI&wK{O>*+w4vx20?>!`FrQsdJlnHR>OPy zcd~b_n$otK2Za4V;76L-DzNVtaSB-y0*E}{p()372;bw_^6ZZ}PI-92wGS&j#91PI zKs7DSe@(bk%_Y-7gGe}(^>I=@oY#w#*Bu9GZf3^F5WP>3rn}7Ut74&?PWBFvy`A)a zPP5)V!Xd&78LdA?xQ(9mjMYElVd13a#D+Z_7&Y|xU=_C-srWU*6kiZcC!$nw*)9$7 zn6CX+@=AhmkT}X@VSsa5NKe;HZuq)~1$`#h6R+ZTR#D-3j}vF!)ZOnz+5)dI4jl{{ z44Mr{P!L4~VVJN`K!!XTF*LGrKO?IK8z<8w`3e3jI8lUGNUta*C8 zn(P`s>{pjD=7Kek#B;Fw@hxAK%$F&Q6vg9J^Xf~4by_hu-=A!MJ3Znq&n~srbFGPs zH&&aMXZ>nO`|hf|ljc?VPhR!${AbO?W8x_>CU%PFA&Hm8F7cAsOREdwU~R_;ot1_u z(ruCYB-LPGn!NQdT|ZlRy+(fw^-+`=%+gee_kY4FWHg<*4sZI8+sFJD270UUORdLHO0nA4V) z%{fwsET5CQ>B?eK%uw4yQc~9?*JVo2}ze(;aRcp*ceL#HUJSllrgm5wQKR zQu+C;QrUh^8rFfA`ftFz{YAidi-`aL010qNS#tmY3ljhU3ljkVnw%H_001*dL_t(I z5o2axU=RmlP9SClViq7~1Y!mz5P=PhN??S_XpoEs2|NTw69YUbV2l9`5&+J*0FWo) R!BYSL002ovPDHLkV1f=gnf?F( literal 0 HcmV?d00001 diff --git a/src/wp-admin/images/menu-shadow.png b/src/wp-admin/images/menu-shadow.png new file mode 100644 index 0000000000000000000000000000000000000000..b0883a8cb7309236dc8d403bf87618be8478c17b GIT binary patch literal 131 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 e_<>~v(J_V+5Elus>=4@@}UQaQ%J;BX+^ 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 literal 0 HcmV?d00001 diff --git a/src/wp-admin/images/no.png b/src/wp-admin/images/no.png new file mode 100644 index 0000000000000000000000000000000000000000..e2db55f22d6752e10a57f07e286081ebebacfea5 GIT binary patch literal 792 zcmV+z1LypSP)AsU_?Zci9d!A_6x~Insr^bw(It`ecQh8*8@Fx_eq|^b9kOS$wyR`|06NPhocs8 zU?v>-=-EnfdDG!10kVJ}=mfmL3x4C3JD#r5^Se7=<^gXYh=3bt;e*loYJQ%@zqp#o zc)ieEZw~|j12}i_vg*D#!8fNTYH-)p(SZRifR{fXpPVOOg5)8_Pfax}pxL$sOiaI_ z9663WbAXxGGQR;QY}-bF{nj_X{Nr6+f*aSdgArUWy~x7#3tYQ*U;M!9W0N|Xd56Y> zdw6NVP@4PMEslKs#fSj7!@bq{RDZ|F(lUi+9ee>|JyA+;y-hurBRMxmp;CdWNzChE zEgUAbv5jI00Q-_DfCrBwQLTgC1pOJbJebx(GO4#fZ-Z7r7eRrwu3!}WegvSSe~?;s zg&54uc6CmaclX!;Ty0b?pa&4c#fOgla1%y+p#)Z=f~-xR;Wr)XE6PJrdB<@ zkX^(65AWw<3BGfCZc8qEVwk5llHC!E4clf5C;=vLa<_ciGWRF}HJ|~Mfr?dU+T}WK zwsR5K0^D`Sq1rBg5bskfzs`!nAt2Vip96}O9S)jR-j65r$IZL|SSUu*ZczvKR4}MU zA;+G=VV*iLHje+;F`frfK+$f}Su8OX4QUMmEk`k$jYjm7Pd{sRn(48RUTuLs23_h7>hH;3oe{xsP*g;=fdj*7t_=_KYN7DNh9L(*MX+IPs+eE= zDxM&f=%ZXQal{bBz)%Dm!3LQf+RwS^Q`pLYql&h1ISRI;>9a!ve49Rq1EL~0BK!+x WVm^3T=Dr&M0000TFc>z(#^19x7NJRw-;!TiYWnT&-4jbvoVqbzKLLohrK zX+ED1Mxzm3WMqxg>7*?(i7*R@rYwNs^?K*P=motHtItRBBLR^$cfB0vaygnpE|&|= z&dw-%5EO^Qu{PdhGR=WOrd&vbHLxdJfaTI12m~lYkTH1O@Aqk+=lQ+%F>6 zzhTCt|38z-P_adpkkSmrVi6{j3Ao+voxtEj9iWJcOxQDRnBMG#!{LQK(G=Q}GQIIT z3P~DNg^Khy_ht?h>B1(HN$B-@5RFD55{b}?gst2oL3iJB%W4`erxI2rl}ZK2$H#OJ zgL7DUa7?botfZ6-yJVd)sZ@%#p->3Y=`^iMD7@lMR}L^@O6>%PWwuDI(P+TY(b4Q- z2^h#4(ORw6#zQB+K`*M(9q?ThU1Fchi5p_D6sL0N@(g$clwe*#H0l07*qoM6N<$g0pad1poj5 literal 0 HcmV?d00001 diff --git a/src/wp-admin/images/required.gif b/src/wp-admin/images/required.gif new file mode 100644 index 0000000000000000000000000000000000000000..119350fc3abe01785061fbbc3db359a4acc1c4a4 GIT binary patch literal 62 zcmZ?wbhEHb6krfwXkcLY4@Cd}EB<6*6=7gx&|v@qkPHKpXixvj({I@iaBuWVPp_-~ N#ozYGLyeWe8UP0l5)S|X literal 0 HcmV?d00001 diff --git a/src/wp-admin/images/resize-rtl.gif b/src/wp-admin/images/resize-rtl.gif new file mode 100644 index 0000000000000000000000000000000000000000..95e7b32a4ae89140c2fa2001deb443dc402f1d5e GIT binary patch literal 1418 zcmah}QD_ub6g{&}v9h61(8T0J#!^ZsNtoDT6GcsSlPp`)?Xo7ZicmJQZ^QR< zO$bF|OTXGCrT8nge&nOzU&x1oU)q8aLDNzQ{#&t#0YMrW&zsroP9*4qd3)yG^X@(O z&EA_z4|H|sYe+5cl5mDSTPNlu*)v( z+E*t|YTN%IwV6>`5YHQ))0@o>$}o}}gxj<|{|kyV+;897zlr?%OT6G26M*tA5PMb- zo&juIC#f_>A%H6L?L1d@%ET8Wc0>Cw5|4&>A+QhSlH^<`e$Q}R$-hI~WsK(wtWza! z8}lQi(FmTfDoh-#_qjI+d-xcCKcc8_gx6oi%4{Luca-)H3jVhs`ud66h!=|HK$^If z&uY;f7!I-Wu~|+Jg*Y~1TbaQs-ffR&z9eRRMRm%FTouoHlgDJtzW}AIDy?_%J@=K7~i1UUV1Hz(K^8=D2iG)`0Y`3MSHHL z=Fwyh;eVfb9w}2qQnh200cF{;{7GVqZz4#zkxojfr>b8cxwmJo@2>f@6?N&<{f65! zQ8^U9adxAu@Tz55(W^Hiyy#^Mb&uMqrqwRB8=87V?NJY_eSABp4%SW#Q=y4-)a_Dz zo;BE*qPMEm-*meO`;C7Z_EJjN!Zi&|&Va02Dw>uE9O3pBcZB&SC}&IPKUo2O_kgBP z>$bIAFh`We<+`o>1#sv;&V+k)TPs^)*JWU7zfo}~tN9e=E>ITd+4n%Qx_t)5i+kXaL&inrV xSA75FZxpc#+_YrJgR?Qt=4$%($L32nez29uw#Izd`QmhQt09M@?LjV8( literal 0 HcmV?d00001 diff --git a/src/wp-admin/images/screen-options-toggle-vs.gif b/src/wp-admin/images/screen-options-toggle-vs.gif new file mode 100644 index 0000000000000000000000000000000000000000..3b9b8af34ff9141d9498c77e879a1ca3a10b26b2 GIT binary patch literal 152 zcmV;J0B8S4Nk%w1VG{r@0J8u9|NsBO!ot43zPh@)uCA`Cs;Zuzo|>APl9G~+j*g0o zih_cId3kwtb#-xZaR2}SA^8LW2LJ#7EC2ui022T%000C<5XecZy*TU5yZ>M)j+Ww_ z=Mro~gE~Zapou3iPBVOkV}ytmX-F&@kI1BQ$!t0SK~V2!!|6P;Q;pMl#Wtpw>Paq} GBLF)FctMQ- literal 0 HcmV?d00001 diff --git a/src/wp-admin/images/screen-options-toggle.gif b/src/wp-admin/images/screen-options-toggle.gif new file mode 100644 index 0000000000000000000000000000000000000000..ed0a5fd373f283a2bdfe038db842375ef2ce9780 GIT binary patch literal 205 zcmZ?wbhEHb6lTz4IKsg2=+UD+d-gnh`0)Dm>lZFuICt*c!Gj0y-Me?-z=7k(k3V?u zVDH|&ckkZaw{PFIYu8SnK7IA-)srVro;`c^#EBCOL;%H~EQ}y!Iv@gMCj+aOfvCT2E6_QgCUj@J;+iu}?9E|}=7pL9jmI9catb8%%jSBmjaq+WP1)(URg6L_ cPd}`Yo$Rfscj?vNChgn)-`C!LugG8x0KEZN(EtDd literal 0 HcmV?d00001 diff --git a/src/wp-admin/images/se.png b/src/wp-admin/images/se.png new file mode 100644 index 0000000000000000000000000000000000000000..c9d8fdd0bb2734fbb717405a43fbab9c5a89ad46 GIT binary patch literal 127 zcmeAS@N?(olHy`uVBq!ia0vp^AT}2xGmzZ=C-xtZVhivIasB`Qe{*x&q9e1dfFg_~ zL4Lsu4$p3+0XgcPE{-7;ajXX%IT;iLSPlptoX)CuywvFUwGEROwn!L8zFCpMr=MqM XsmH3P(RWoFsD;7P)z4*}Q$iB}ibN&J literal 0 HcmV?d00001 diff --git a/src/wp-admin/images/sort.gif b/src/wp-admin/images/sort.gif new file mode 100644 index 0000000000000000000000000000000000000000..2a5a6e8ceb3bbeef9993896ee8ed3b787823a1a7 GIT binary patch literal 54 zcmZ?wbhEHb-!L- z=z77M@Y?J3K1-!i_Frb)0ew#syA0Q7J;yjLg`960bj|e9eUZa zIwFw>+3j}Xo8ugHKkx>4EA)S_27j;8=`<;dLV-YlVzJnj2Ue+6sMqV!bULM6E=NwM x^JnAYm$F%?$4G)kq?AGIF>3;<0oQa>Q4jOPFV002ovPDHLkV1k Z#k2O7)%uN-lirtHGA#4X&|+n<1_0g~6@LH# literal 0 HcmV?d00001 diff --git a/src/wp-admin/images/upload-classic.png b/src/wp-admin/images/upload-classic.png new file mode 100644 index 0000000000000000000000000000000000000000..beda3e4369ac07423c2afb1b678cc42a057066fb GIT binary patch literal 1631 zcmZXVdpy%?9LLv5+sJayt*u;&txlM&R4x_EWk}}Q787#Gbvvt7+e9u!7nF9KLoUS> zW-&11@8|vfe4cY&p3X280~HVm1aoz9 z@&?XSV3D9;V6Q>KKY&2sO|DLReCTf{3tjOf5AAe$P2L8V1e3ViIoazs1fEqvMW<+{ zyyKnI0%x4o?>60AfNh_&J?hE0b+f&nx#}u6!0fDvDvzQE@ozJ zcX&MVdIwg0ZLO7bafRE8l*6v1v^@FBKURqADfA5*dszx%g4t`1rU~-X>9VZ8hr?>h)M!M4r8V-SO0d zA~xY7_+)4D?dzTg#9{#40@uf65ky{fiNdG-bDE@;+>)yI`t7)5XCEZ9Lfw(g`I4H%n z-g_Safk3ulFk#9#6-AkW_R!8Zr!E zBJw53-ZHcTy~)fBYvYNFOs(+}8slmJ}d$ipZ-&16mdl`OnvfFL2_BXw0nl)GZeXW9nyp9=`R zv$L}bNejdf4);B|<3ozkmXNQ-BAQ4njx!IpPx?M^&7K*331N3TH&+vxmI4Qg34P*z z^}C!05Bd=fteEQRYQ=aL=N+ol@9T}(mAmwWn&rH-#1b>yHK6s_Qwmvr1E1gD({nZV z84mS}TXnTZWmQ#ud%Gv>FRf++pdD+ajrf7r-Q8u{x2>DkDd-y_pre=B7Qv{P2_IhD z%4T&4WWg^e2+{s6DuJP*po1(-0g3(m{WXU zS1>y0x$3z&T4hBAFV%R}7#d^Vh>N~eUoX;h``ZnUhgzhXrF!>j);R?R1|Ea$DJ1S8 z3@syj{5$s4AmC5e>A9h*$Z!PnOp`KW->tbWy!={0fC ziqSf?q~8)B8Oh7Z$w`o9u^@ACNahbxU68h^z=VVosiWdy?U<3$nRdPJmHsuDNKYjx zF?1f~{$-21&Up#peh=u2wk-bf6wkjQub3HRJz5tB|Uq&ckvAm-Seom z^03_3o0rEhO?-KJzaxoMkg=WnN^@vnK(+cn^x)SU3tB_s)r93yqB=05(lA z3P`;Dl-yb3&E5YaO;YWUHB((pA9a*tT(uPC1>ysSef%jttpjO>B*ZZ^pxYrmN{Hw&&oMu*~?@_G1-} zQ@Alh=203AOUyW%=cXvxxoQ%i<%h($ literal 0 HcmV?d00001 diff --git a/src/wp-admin/images/upload-fresh.png b/src/wp-admin/images/upload-fresh.png new file mode 100644 index 0000000000000000000000000000000000000000..92fd355c82ed81690fdc75dec27e0ddeeaa1a361 GIT binary patch literal 1051 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 literal 0 HcmV?d00001 diff --git a/src/wp-admin/images/white-grad-active.png b/src/wp-admin/images/white-grad-active.png new file mode 100644 index 0000000000000000000000000000000000000000..04780150b1687255e4f6c7a58184ce0f29e1b4b4 GIT binary patch literal 223 zcmV<503iQ~P);3=*6-!(rN`mv#O3D+9QW<;`lZ*0mQ&Tb%72Gn5Qp@v;vWpc=^bB69 zsh0v3i-8n77o{eaWaj57gklFzshE@e=l}oz^=u{w sTJ#QpK$ELt*};X2YFF$i{?RJL(9C0{cF)_y5vYN|)78&qol`;+0C9#ulK=n! literal 0 HcmV?d00001 diff --git a/src/wp-admin/images/widgets-arrow-vs.gif b/src/wp-admin/images/widgets-arrow-vs.gif new file mode 100644 index 0000000000000000000000000000000000000000..c6398e6775b2e9cfd8a9561f77a7d5f9316ed131 GIT binary patch literal 213 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 Ef*Kab<^TWy literal 0 HcmV?d00001 diff --git a/src/wp-admin/images/wp-logo-vs.png b/src/wp-admin/images/wp-logo-vs.png new file mode 100644 index 0000000000000000000000000000000000000000..13f3fa64dd7aee3835861516bd4a5e51de297ac7 GIT binary patch literal 958 zcmV;v13~$dbKQO*@ZEgH%pcb<}T*4%`BNe6J0dK zFh~cw0i`ieDg8CpgV1)grBK>)_I^h$%ue#0obUaf=Q;2DeecWJ&-CGcPcz{o!d}9b zwb%qL}N`Q_PZT$+iPaJ`)(=mR5nQb zw+VT{xa%!u@Rg(5@XD2s4_nV)9X1a>3}YdagRB4?$0LfYI^|7O6aZfZ+Quu9^QpoGy`NsSrGUV=cTzuuo!*W=N7Fb&f(1G~Gf+CCDRM|2^B z7PAq$GA%ek1J6txilSiOCJP+~k60?J8Vm>K(6phlfj(>1BB>@$)U3n6^b=?V9($V1 zfFi?IrBwxO^(K@H3f5O>5t&aTG?#?Hb8Jgs2GK`SB4{<~;fW;a^AYD;R&AqV)85)n>v(AcEhA z{sH^f8(SQ3+AJ6to5G$}E0~7DcbP%&ZC}XUUSIjhT2&5DIH9Kf$?I+SJ2Z!2VhPD? z4x6nT@GP5$QLn>+t*w5hA=)Ko;G?_$`TgFTnKS#EGV#S_S$7w^56InmdjCC!ga%dgEu&y19sJNEU}*vV~{KtTqkrA6qC>rrE=gOrn5OQOSW z3LO9TW`uD`bCwC!SzyETQ}=c>oc&H6rh`tK_ucju-A>2LHb(LUo`ioHonE}{3%l7c z1uuMf@%ZHj&xeWi4xya&3&B|7-0iAxbsiB7CRZVyu&5(jQTe!#dN!G!9J-eF4Np>t gwPcEr`A>iW0C727`Ns`5r2qf`07*qoM6N<$fB zoSc-AcqJST)A8{!l}aUQZEYnGlHG2PEG;cna=Ba#`8R>zs^Q^bCU|HvncP!TQ=O}; ztLEL^T~ZWo?f*KjQp zbVGLc!NCEg(`n)s>g(&pi7-=;xm+$P6^oQPJrxAeZ&7M)ZnojpB3H*G)zs7wJI^O^ z8(auuML}0r7uD%>)SzpiR4OH=!)@VGF+u#~NHCCzvIxIn zf{O@9z(D4bq-4!Dp=Jb8MJ0I5?%;R(z&Vkie-sTU%Q%VB!u!ybu{c b`6IvpNzqsrv0+8800000NkvXXu0mjf%yy4m literal 0 HcmV?d00001 diff --git a/src/wp-admin/images/wpspin_dark.gif b/src/wp-admin/images/wpspin_dark.gif new file mode 100644 index 0000000000000000000000000000000000000000..daebe0dbefc8ff3e9ed10f0eb2e0c671a0aabaef GIT binary patch literal 2547 zcmcJQ{Zkb89mn@}ZwAK3kNZ=b&FnzYtVh=YbvOKb=CJVcJ;F4jRfrcRZEFzTd4 ze28tQMLZ5gOau&qfD(&U6HIbyo0!H_gC=7&TBA9EBqo@SHf^WYeQ*N-r6|bsV zx^!ttNr~&a1qB7OXU|68$Nrx){XSO~TK1#h!dPg|tUSVp{x$tyekKcZuw3uI9wtT| zE!-s~N7w&w|0U{)wW|wur_Q|Iy*@v3VZ-dl0YxnOO?A#Q`HcVF&q>Z7TJ?1Minb@a z&;GvgvkJfnC8}D)_>V%?dM6V6d-2KA z;KHd0j!zKOFR&*F=7YufmF~6q5$?NJi%WA-E{;OO~OkhRG1PWI{>c^@^YYd_D%+q9DN9U>w7UKJmy)mC%Rb5GqHE7v1dyM#Hcq zDKNFo)>x`sgR&%p7v9zb3V@}{Wm&lj)PSa!xN#GV0jFj2fj6M8-qwsWkzi=?l5k{7 zj`U=Xt`>KEz~fl_bw#N{CvoCiD2D%tvmI*Dsi33AHO{I$h!Qa+OEH`3c#C ziYOY0LL~?m+EO1>D=h*i_sTgr`v!2FfDp)So$dolQ&$ufzL+v;%qN9kQ-HejEfyh% z9n%EBQ8i6wa9_C_k2MEA22x`G?$g?>sC_(wD6USe#;cPlv?W{b4%FvIcE~sD@>MqU zsHeu>_lL)S(y09Nk@TZm7C4DIVoNM{o}MEq%T+bXQRy9p;!*=T{HdI>l0ocq_TD$vz&on5EKB=~t9F?VnEfV#LQ>C&b#e|*Jz6`P* zLH;Sw;KWsGWR&nT<@=7AIqVoKpPayWh?QQSjIsAZ!aZNus|s1cmrB2#v+ZnMPRE56 zjQ^|W>gJvmYJWMpen4*dBK_&w8IEClv9?g@s2dfUH;ppARf0B&;TGy9$Z`B09K-r5 zAj@)_XrB*sAfa9np(*)rroH*6JQ6T$lK830DvqYvDyN?C5J(D17;-CBIx{lHYKKpl zGCRg8?f)y)liR5v%$@t{TK?mfKvnymnxV9&xv>Q3$o~4V_QHJgW(s>QF~9%$TKvmR zt*D&2pQ+0%l;;qneHbVY8ipXq&?a!7m2g$qCHC~<`<6qV7d9jRFDuizY$+z=1Z$#5 zSR%)%VUr^KY@kx(S(cC2sAL8q&`3u8S*Jo{$dNII-?ZPUSNJgjSRIjd4{fIhcj7-S zJ6HW9*?9%s3GV%+bbem<;f;@d62lv@(C}bvMlb*DRZ<&*e@T4yJ=c%ZCK96@1zI;D z)0iqVyy~?51d%{eh@D+zPp{iA?1zvg$pCVk2f0}u;3JReRO;Ma?S-P0bi&m)_ zIEx67a2&tm;AQSwW<<~johT48qGP=lY4|Sz`Hf3AITdrIMFWMS69lVhi0bA0+U*|@Li-7o8J0tbd@u|dt3uy0%$5(G;g(bS+XdFLM+YjdW|j#@BPXNBN03X;lt>VrSqd7^Sord z;`|kepGff&Uco-(Otcp6sxQtpzSFwJ@r`N=wPc}$_TTn=Ixp5VgbgQyivZ1Vb=5t^ zx!vP~u^9M)d9mirJnd%4QtMqhi;6k`tacch-o694sH&o-qU;2Fgb*rSMRzTZWd|H+ zDAHiu)x8yYK@`(vA>qxp-j@GRq)LLIXveo-cBZ^y-|$IiXyw2z?}}x0b_@Qd#)WHg zX7SDVxGDH&nm3D9=FL1|NjRphod;-|^ZK9h5vB=+CJkA^5=9-_EW>!QMVZ!m&~p1K zA$n!;u-@TDQwJM4PPBgAG6bBcW(nEo5g}|;PQy}DM~e%hgwCC!!M!Mq24^54Dqc(VWi literal 0 HcmV?d00001 diff --git a/src/wp-admin/images/wpspin_light.gif b/src/wp-admin/images/wpspin_light.gif new file mode 100644 index 0000000000000000000000000000000000000000..e10b97ff9d84d7ff8d7efe5c4c09783dd390e338 GIT binary patch literal 2193 zcmai#eNYtl8ON7(yJ6M6J=n0lMb_k8_Sd=PxP4*6q$V@fTkd$f1L8|!_`^Xw3?Nkk zC~rnNUV;$tr4l4p@CCR74h~C3V$$*262*vAVuOO9F=^{`jLEdlbka`yN0YrH{R4+i zKYO$L&)&@Qd4Au0p44>vi$C3^hxE`L2>MRrpJD#C#9u-@(0)tI%{|brFf(B$XJ#ff z!neubWH8KlFgU(MU_3BB9$3Qb4TP?MS0jA$c6+;*=;+X%9bwwSG`6)hhN%rx9zrV( z`hOU|Ta#tmwpHDnW0Ni7stE0U8AyT5q5p<7A@qYyo)eU5%q72Sl1mQe^)ydB z`SS9{o7alJO>^Lgb;EdZWTwCI-|IkR2DcbLR~R4Xo1bpfM@9-Z_5djw3Bo8~hYg%S z9p#NqBNqW-7U?J<>6|(Vf?!D^_2uVOT@nGE5ey`m(4iVdp5iSW7^kII2u23Llu=I2 z(B=VwodQXuV*iw881{Dcn@X+_N8f*NTPnzsc=mIUkhH^TwOP`B>rgj`RDSf7%7tYr z`F-gdqQ3f_rqcRCk=ci;YFH(8H?AWcno4r@%NtC0r&Cz{TEX@TL5aqLMgc!ea{^70 zAr%0_nhJF?tkQ)@-4u29d>`x;)(x693l4%j9H8lJ<{*O+&r&I$o#^b`3DC}rZepD^l?;g@|32TV~aZNyQ4R*PCVW$pR6*xek#2p z*6)7>ix2yhh<$SUE+A zJl3Gd%yTT8f;Zg12&+D=Wo@O?_OKlFLm$VxKvIE2x{Qamm{6^{srfOJ~YD>iv@x*qQU^lWMR*DmuX zE&U%?6pY@QdN{${*!bnzL~uWOy=!rh%>N9u+wUo{!TT5O`MsmlPcRHuKvR|C)_Pr~ zDJbS9z8z((6%5H$au|ZPT15qcA$SNG&e%yngMQ4kPc&dd4VlZj`rkq-wXTA`cDZw= zH2t0SjXi5WtAA5U{q)h~miHX5s^84Uyb~}#Xelj_qfSfHf0jy;n*YA~W`EfiML1qz zQp`u{+zL-tRGKiX*n&Wjf`d3=l~!qn2XOR+Xk{bdp;ZWijyeE3G!np%oW@6#IInfZ zyp=8G?KNN48~w7**>_St^~V>TIYrIIW6zG|{K zZbu^wLFIOWIHF)s#J(n?zyQN`k;HM``?RN%jhu2b@%myx*{&)`BK5&5RgB z=vj^w(2o=#ioCu#YDnP#g3fDaevjZwm0S~kcL668Tv=jpfn-~qsy2Z3|Br-)4wl;b z2M37RdtIT|5;4*A?oI@%vlYj-zkKD#5qtA$e#X#=tp53(j)lQlDS46e-5Q^&D@5Ei zD&3@@?(H=)^)_DLpgAzsY+a3HASqzQvK5m`dSe_Y=Ere@@Fvs{!vTV7uo}scOO6#o zwqL8|A2;Hm_VZi1dNC*`v%IKmHC)$x~ecdHdeT3e3rlgwcr^{9j zSJe;040k{8u4am``YjNoxURu&F$eBo@9H~6eKfbYciUHOjw{C|Zi)UJ(D_6<;`xsi zt3Ol^7sNilPG+n>l94Kf+|CaF+O#SYFRF?pxPGi!S4i=)hq2#6@klklFH%S%)2*P)EP^gW#~vR42A literal 0 HcmV?d00001 diff --git a/src/wp-admin/images/xit.gif b/src/wp-admin/images/xit.gif new file mode 100644 index 0000000000000000000000000000000000000000..6f1cc4f4eb88426e7a54d185c0fbd3772aeb0163 GIT binary patch literal 181 zcmZ?wbhEHb6k*_E*v!E2;K73*Cr*6ZzWv0B6TfcUc=__>wQJWt&ztw`*|VRQFMpam z`Ou+5|NsAIfC0syEMTS%hy+j!W707LS1+Y=f-P)1DV!dSi`E_7V!+X9;O(g4 zvq-JSNupcQX@>!a$R3vrBUO4f*s#JWo)C=2NW(z=Pj2y|)=wUAF^X9) z4JKxy1u6j0)RIi|M|)sH*wG=?lkGp?mG>pB_MOq^I)2;MG~R$-+5s)qA?%3_N2eo} zXv=IwoqbWvE*4At)uq*@s1n7bC*oOgSF=+RwLNr5*I9GqvaR{^Jq*&<5EDB1n?fTb zm9i$Dus8s4icGE-l{gAN2=9q38c~p!Py4(B*$}~^&cCXrMFSPUdx{aWOhk+U~sJy}m-eUU844&0=2l-7&OZcb~TiB5r z0AlWV30J0SgN!1!`5SNM*CEVJV1gTiG6i&8eG$y5$Xq{AJQ~MOnYT)Dr*_ais&-j# z+G5;h%n*ox)FklyQdiJ%!fJW6w(}QwQIRtCsoTnXOA{Bur&;c)oZ*vSD>X|Aw&+rK yNc65bzq+rET@n6d=x-0l;`?bjil?RWQuz-0He^X1)ISyg0000' . __('This screen lists links to plugins to import data from blogging/content management platforms. Choose the platform you want to import from, and click Install Now when you are prompted in the popup window. If your platform is not listed, click the link to search the plugin directory for other importer plugins to see if there is one for your platform.') . '

' . + '

' . __('In previous versions of WordPress, all the importers were built-in, but they have been turned into plugins as of version 3.0 since most people only use them once or infrequently.') . '

' . + '

' . __('For more information:') . '

' . + '

' . __('Documentation on Import') . '

' . + '

' . __('Support Forums') . '

' +); + +$popular_importers = array(); +if ( current_user_can('install_plugins') ) + $popular_importers = array( + 'blogger' => array( __('Blogger'), __('Install the Blogger importer to import posts, comments, and users from a Blogger blog.'), 'install' ), + 'wpcat2tag' => array(__('Categories and Tags Converter'), __('Install the category/tag converter to convert existing categories to tags or tags to categories, selectively.'), 'install', 'wp-cat2tag' ), + 'livejournal' => array( __( 'LiveJournal' ), __( 'Install the LiveJournal importer to import posts from LiveJournal using their API.' ), 'install' ), + 'movabletype' => array( __('Movable Type and TypePad'), __('Install the Movable Type importer to import posts and comments from a Movable Type or TypePad blog.'), 'install', 'mt' ), + 'opml' => array( __('Blogroll'), __('Install the blogroll importer to import links in OPML format.'), 'install' ), + 'rss' => array( __('RSS'), __('Install the RSS importer to import posts from an RSS feed.'), 'install' ), + 'wordpress' => array( 'WordPress', __('Install the WordPress importer to import posts, pages, comments, custom fields, categories, and tags from a WordPress export file.'), 'install' ) + ); + +if ( ! empty( $_GET['invalid'] ) && !empty($popular_importers[$_GET['invalid']][3]) ) { + wp_redirect( admin_url('import.php?import=' . $popular_importers[$_GET['invalid']][3]) ); + exit; +} + +add_thickbox(); +wp_enqueue_script( 'plugin-install' ); +wp_admin_css( 'plugin-install' ); + +require_once ('admin-header.php'); +$parent_file = 'tools.php'; +?> + +
+ +

+ +

%s importer is invalid or is not installed.'), esc_html( $_GET['invalid'] ) ); ?>

+ +

+ + $pop_data ) { + if ( isset($importers[$pop_importer] ) ) + continue; + if ( isset( $pop_data[3] ) && isset( $importers[ $pop_data[3] ] ) ) + continue; + + $importers[$pop_importer] = $popular_importers[$pop_importer]; +} + +if (empty ($importers)) { + echo '

'.__('No importers are available.').'

'; // TODO: make more helpful +} else { + uasort($importers, create_function('$a, $b', 'return strcmp($a[0], $b[0]);')); +?> + + + $data) { + $style = ('class="alternate"' == $style || 'class="alternate active"' == $style) ? '' : 'alternate'; + $action = ''; + if ( 'install' == $data[2] ) { + $plugin_slug = $id . '-importer'; + if ( file_exists( WP_PLUGIN_DIR . '/' . $plugin_slug ) ) { + // Looks like Importer is installed, But not active + $plugins = get_plugins( '/' . $plugin_slug ); + if ( !empty($plugins) ) { + $keys = array_keys($plugins); + $plugin_file = $plugin_slug . '/' . $keys[0]; + $action = '' . $data[0] . ''; + } + } + if ( empty($action) ) + $action = '' . $data[0] . ''; + } else { + $action = "{$data[0]}"; + } + + if ($style != '') + $style = 'class="'.$style.'"'; + echo " + + + + "; + } +?> + +
$action{$data[1]}
+' . sprintf( __('If the importer you need is not listed, search the plugins directory to see if an importer is available.'), esc_url( network_admin_url( 'plugin-install.php?tab=search&type=tag&s=importer' ) ) ) . '

'; +?> + +
+ + diff --git a/src/wp-admin/includes/admin.php b/src/wp-admin/includes/admin.php new file mode 100644 index 0000000..37f5c8e --- /dev/null +++ b/src/wp-admin/includes/admin.php @@ -0,0 +1,64 @@ + diff --git a/src/wp-admin/includes/bookmark.php b/src/wp-admin/includes/bookmark.php new file mode 100644 index 0000000..0ed560c --- /dev/null +++ b/src/wp-admin/includes/bookmark.php @@ -0,0 +1,269 @@ +link_url = esc_url( $_GET['linkurl'] ); + else + $link->link_url = ''; + + if ( isset( $_GET['name'] ) ) + $link->link_name = esc_attr( $_GET['name'] ); + else + $link->link_name = ''; + + $link->link_visible = 'Y'; + + return $link; +} + +/** + * Delete link specified from database + * + * @since 2.0.0 + * + * @param int $link_id ID of the link to delete + * @return bool True + */ +function wp_delete_link( $link_id ) { + global $wpdb; + + do_action( 'delete_link', $link_id ); + + wp_delete_object_term_relationships( $link_id, 'link_category' ); + + $wpdb->query( $wpdb->prepare( "DELETE FROM $wpdb->links WHERE link_id = %d", $link_id ) ); + + do_action( 'deleted_link', $link_id ); + + clean_bookmark_cache( $link_id ); + + return true; +} + +/** + * Retrieves the link categories associated with the link specified. + * + * @since 2.1.0 + * + * @param int $link_id Link ID to look up + * @return array The requested link's categories + */ +function wp_get_link_cats( $link_id = 0 ) { + + $cats = wp_get_object_terms( $link_id, 'link_category', array('fields' => 'ids') ); + + return array_unique( $cats ); +} + +/** + * Retrieve link data based on ID. + * + * @since 2.0.0 + * + * @param int $link_id ID of link to retrieve + * @return object Link for editing + */ +function get_link_to_edit( $link_id ) { + return get_bookmark( $link_id, OBJECT, 'edit' ); +} + +/** + * This function inserts/updates links into/in the database. + * + * @since 2.0.0 + * + * @param array $linkdata Elements that make up the link to insert. + * @param bool $wp_error Optional. If true return WP_Error object on failure. + * @return int|WP_Error Value 0 or WP_Error on failure. The link ID on success. + */ +function wp_insert_link( $linkdata, $wp_error = false ) { + global $wpdb; + + $defaults = array( 'link_id' => 0, 'link_name' => '', 'link_url' => '', 'link_rating' => 0 ); + + $linkdata = wp_parse_args( $linkdata, $defaults ); + $linkdata = sanitize_bookmark( $linkdata, 'db' ); + + extract( stripslashes_deep( $linkdata ), EXTR_SKIP ); + + $update = false; + + if ( !empty( $link_id ) ) + $update = true; + + if ( trim( $link_name ) == '' ) { + if ( trim( $link_url ) != '' ) { + $link_name = $link_url; + } else { + return 0; + } + } + + if ( trim( $link_url ) == '' ) + return 0; + + if ( empty( $link_rating ) ) + $link_rating = 0; + + if ( empty( $link_image ) ) + $link_image = ''; + + if ( empty( $link_target ) ) + $link_target = ''; + + if ( empty( $link_visible ) ) + $link_visible = 'Y'; + + if ( empty( $link_owner ) ) + $link_owner = get_current_user_id(); + + if ( empty( $link_notes ) ) + $link_notes = ''; + + if ( empty( $link_description ) ) + $link_description = ''; + + if ( empty( $link_rss ) ) + $link_rss = ''; + + if ( empty( $link_rel ) ) + $link_rel = ''; + + // Make sure we set a valid category + if ( ! isset( $link_category ) || 0 == count( $link_category ) || !is_array( $link_category ) ) { + $link_category = array( get_option( 'default_link_category' ) ); + } + + if ( $update ) { + if ( false === $wpdb->update( $wpdb->links, compact('link_url', 'link_name', 'link_image', 'link_target', 'link_description', 'link_visible', 'link_rating', 'link_rel', 'link_notes', 'link_rss'), compact('link_id') ) ) { + if ( $wp_error ) + return new WP_Error( 'db_update_error', __( 'Could not update link in the database' ), $wpdb->last_error ); + else + return 0; + } + } else { + if ( false === $wpdb->insert( $wpdb->links, compact('link_url', 'link_name', 'link_image', 'link_target', 'link_description', 'link_visible', 'link_owner', 'link_rating', 'link_rel', 'link_notes', 'link_rss') ) ) { + if ( $wp_error ) + return new WP_Error( 'db_insert_error', __( 'Could not insert link into the database' ), $wpdb->last_error ); + else + return 0; + } + $link_id = (int) $wpdb->insert_id; + } + + wp_set_link_cats( $link_id, $link_category ); + + if ( $update ) + do_action( 'edit_link', $link_id ); + else + do_action( 'add_link', $link_id ); + + clean_bookmark_cache( $link_id ); + + return $link_id; +} + +/** + * Update link with the specified link categories. + * + * @since 2.1.0 + * + * @param int $link_id ID of link to update + * @param array $link_categories Array of categories to + */ +function wp_set_link_cats( $link_id = 0, $link_categories = array() ) { + // If $link_categories isn't already an array, make it one: + if ( !is_array( $link_categories ) || 0 == count( $link_categories ) ) + $link_categories = array( get_option( 'default_link_category' ) ); + + $link_categories = array_map( 'intval', $link_categories ); + $link_categories = array_unique( $link_categories ); + + wp_set_object_terms( $link_id, $link_categories, 'link_category' ); + + clean_bookmark_cache( $link_id ); +} + +/** + * Update a link in the database. + * + * @since 2.0.0 + * + * @param array $linkdata Link data to update. + * @return int|WP_Error Value 0 or WP_Error on failure. The updated link ID on success. + */ +function wp_update_link( $linkdata ) { + $link_id = (int) $linkdata['link_id']; + + $link = get_bookmark( $link_id, ARRAY_A ); + + // Escape data pulled from DB. + $link = add_magic_quotes( $link ); + + // Passed link category list overwrites existing category list if not empty. + if ( isset( $linkdata['link_category'] ) && is_array( $linkdata['link_category'] ) + && 0 != count( $linkdata['link_category'] ) ) + $link_cats = $linkdata['link_category']; + else + $link_cats = $link['link_category']; + + // Merge old and new fields with new fields overwriting old ones. + $linkdata = array_merge( $link, $linkdata ); + $linkdata['link_category'] = $link_cats; + + return wp_insert_link( $linkdata ); +} + +?> diff --git a/src/wp-admin/includes/class-ftp-pure.php b/src/wp-admin/includes/class-ftp-pure.php new file mode 100644 index 0000000..c947f44 --- /dev/null +++ b/src/wp-admin/includes/class-ftp-pure.php @@ -0,0 +1,190 @@ +__construct($verb, $le); + } + + function __construct($verb=FALSE, $le=FALSE) { + parent::__construct(false, $verb, $le); + } + +// +// +// + + function _settimeout($sock) { + if(!@stream_set_timeout($sock, $this->_timeout)) { + $this->PushError('_settimeout','socket set send timeout'); + $this->_quit(); + return FALSE; + } + return TRUE; + } + + function _connect($host, $port) { + $this->SendMSG("Creating socket"); + $sock = @fsockopen($host, $port, $errno, $errstr, $this->_timeout); + if (!$sock) { + $this->PushError('_connect','socket connect failed', $errstr." (".$errno.")"); + return FALSE; + } + $this->_connected=true; + return $sock; + } + + function _readmsg($fnction="_readmsg"){ + if(!$this->_connected) { + $this->PushError($fnction, 'Connect first'); + return FALSE; + } + $result=true; + $this->_message=""; + $this->_code=0; + $go=true; + do { + $tmp=@fgets($this->_ftp_control_sock, 512); + if($tmp===false) { + $go=$result=false; + $this->PushError($fnction,'Read failed'); + } else { + $this->_message.=$tmp; + if(preg_match("/^([0-9]{3})(-(.*[".CRLF."]{1,2})+\\1)? [^".CRLF."]+[".CRLF."]{1,2}$/", $this->_message, $regs)) $go=false; + } + } while($go); + if($this->LocalEcho) echo "GET < ".rtrim($this->_message, CRLF).CRLF; + $this->_code=(int)$regs[1]; + return $result; + } + + function _exec($cmd, $fnction="_exec") { + if(!$this->_ready) { + $this->PushError($fnction,'Connect first'); + return FALSE; + } + if($this->LocalEcho) echo "PUT > ",$cmd,CRLF; + $status=@fputs($this->_ftp_control_sock, $cmd.CRLF); + if($status===false) { + $this->PushError($fnction,'socket write failed'); + return FALSE; + } + $this->_lastaction=time(); + if(!$this->_readmsg($fnction)) return FALSE; + return TRUE; + } + + function _data_prepare($mode=FTP_ASCII) { + if(!$this->_settype($mode)) return FALSE; + if($this->_passive) { + if(!$this->_exec("PASV", "pasv")) { + $this->_data_close(); + return FALSE; + } + if(!$this->_checkCode()) { + $this->_data_close(); + return FALSE; + } + $ip_port = explode(",", ereg_replace("^.+ \\(?([0-9]{1,3},[0-9]{1,3},[0-9]{1,3},[0-9]{1,3},[0-9]+,[0-9]+)\\)?.*".CRLF."$", "\\1", $this->_message)); + $this->_datahost=$ip_port[0].".".$ip_port[1].".".$ip_port[2].".".$ip_port[3]; + $this->_dataport=(((int)$ip_port[4])<<8) + ((int)$ip_port[5]); + $this->SendMSG("Connecting to ".$this->_datahost.":".$this->_dataport); + $this->_ftp_data_sock=@fsockopen($this->_datahost, $this->_dataport, $errno, $errstr, $this->_timeout); + if(!$this->_ftp_data_sock) { + $this->PushError("_data_prepare","fsockopen fails", $errstr." (".$errno.")"); + $this->_data_close(); + return FALSE; + } + else $this->_ftp_data_sock; + } else { + $this->SendMSG("Only passive connections available!"); + return FALSE; + } + return TRUE; + } + + function _data_read($mode=FTP_ASCII, $fp=NULL) { + if(is_resource($fp)) $out=0; + else $out=""; + if(!$this->_passive) { + $this->SendMSG("Only passive connections available!"); + return FALSE; + } + while (!feof($this->_ftp_data_sock)) { + $block=fread($this->_ftp_data_sock, $this->_ftp_buff_size); + if($mode!=FTP_BINARY) $block=preg_replace("/\r\n|\r|\n/", $this->_eol_code[$this->OS_local], $block); + if(is_resource($fp)) $out+=fwrite($fp, $block, strlen($block)); + else $out.=$block; + } + return $out; + } + + function _data_write($mode=FTP_ASCII, $fp=NULL) { + if(is_resource($fp)) $out=0; + else $out=""; + if(!$this->_passive) { + $this->SendMSG("Only passive connections available!"); + return FALSE; + } + if(is_resource($fp)) { + while(!feof($fp)) { + $block=fread($fp, $this->_ftp_buff_size); + if(!$this->_data_write_block($mode, $block)) return false; + } + } elseif(!$this->_data_write_block($mode, $fp)) return false; + return TRUE; + } + + function _data_write_block($mode, $block) { + if($mode!=FTP_BINARY) $block=preg_replace("/\r\n|\r|\n/", $this->_eol_code[$this->OS_remote], $block); + do { + if(($t=@fwrite($this->_ftp_data_sock, $block))===FALSE) { + $this->PushError("_data_write","Can't write to socket"); + return FALSE; + } + $block=substr($block, $t); + } while(!empty($block)); + return true; + } + + function _data_close() { + @fclose($this->_ftp_data_sock); + $this->SendMSG("Disconnected data from remote host"); + return TRUE; + } + + function _quit($force=FALSE) { + if($this->_connected or $force) { + @fclose($this->_ftp_control_sock); + $this->_connected=false; + $this->SendMSG("Socket closed"); + } + } +} + +?> diff --git a/src/wp-admin/includes/class-ftp-sockets.php b/src/wp-admin/includes/class-ftp-sockets.php new file mode 100644 index 0000000..4026dd0 --- /dev/null +++ b/src/wp-admin/includes/class-ftp-sockets.php @@ -0,0 +1,250 @@ +__construct($verb, $le); + } + + function __construct($verb=FALSE, $le=FALSE) { + parent::__construct(true, $verb, $le); + } + +// +// +// + + function _settimeout($sock) { + if(!@socket_set_option($sock, SOL_SOCKET, SO_RCVTIMEO, array("sec"=>$this->_timeout, "usec"=>0))) { + $this->PushError('_connect','socket set receive timeout',socket_strerror(socket_last_error($sock))); + @socket_close($sock); + return FALSE; + } + if(!@socket_set_option($sock, SOL_SOCKET , SO_SNDTIMEO, array("sec"=>$this->_timeout, "usec"=>0))) { + $this->PushError('_connect','socket set send timeout',socket_strerror(socket_last_error($sock))); + @socket_close($sock); + return FALSE; + } + return true; + } + + function _connect($host, $port) { + $this->SendMSG("Creating socket"); + if(!($sock = @socket_create(AF_INET, SOCK_STREAM, SOL_TCP))) { + $this->PushError('_connect','socket create failed',socket_strerror(socket_last_error($sock))); + return FALSE; + } + if(!$this->_settimeout($sock)) return FALSE; + $this->SendMSG("Connecting to \"".$host.":".$port."\""); + if (!($res = @socket_connect($sock, $host, $port))) { + $this->PushError('_connect','socket connect failed',socket_strerror(socket_last_error($sock))); + @socket_close($sock); + return FALSE; + } + $this->_connected=true; + return $sock; + } + + function _readmsg($fnction="_readmsg"){ + if(!$this->_connected) { + $this->PushError($fnction,'Connect first'); + return FALSE; + } + $result=true; + $this->_message=""; + $this->_code=0; + $go=true; + do { + $tmp=@socket_read($this->_ftp_control_sock, 4096, PHP_BINARY_READ); + if($tmp===false) { + $go=$result=false; + $this->PushError($fnction,'Read failed', socket_strerror(socket_last_error($this->_ftp_control_sock))); + } else { + $this->_message.=$tmp; + $go = !preg_match("/^([0-9]{3})(-.+\\1)? [^".CRLF."]+".CRLF."$/Us", $this->_message, $regs); + } + } while($go); + if($this->LocalEcho) echo "GET < ".rtrim($this->_message, CRLF).CRLF; + $this->_code=(int)$regs[1]; + return $result; + } + + function _exec($cmd, $fnction="_exec") { + if(!$this->_ready) { + $this->PushError($fnction,'Connect first'); + return FALSE; + } + if($this->LocalEcho) echo "PUT > ",$cmd,CRLF; + $status=@socket_write($this->_ftp_control_sock, $cmd.CRLF); + if($status===false) { + $this->PushError($fnction,'socket write failed', socket_strerror(socket_last_error($this->stream))); + return FALSE; + } + $this->_lastaction=time(); + if(!$this->_readmsg($fnction)) return FALSE; + return TRUE; + } + + function _data_prepare($mode=FTP_ASCII) { + if(!$this->_settype($mode)) return FALSE; + $this->SendMSG("Creating data socket"); + $this->_ftp_data_sock = @socket_create(AF_INET, SOCK_STREAM, SOL_TCP); + if ($this->_ftp_data_sock < 0) { + $this->PushError('_data_prepare','socket create failed',socket_strerror(socket_last_error($this->_ftp_data_sock))); + return FALSE; + } + if(!$this->_settimeout($this->_ftp_data_sock)) { + $this->_data_close(); + return FALSE; + } + if($this->_passive) { + if(!$this->_exec("PASV", "pasv")) { + $this->_data_close(); + return FALSE; + } + if(!$this->_checkCode()) { + $this->_data_close(); + return FALSE; + } + $ip_port = explode(",", ereg_replace("^.+ \\(?([0-9]{1,3},[0-9]{1,3},[0-9]{1,3},[0-9]{1,3},[0-9]+,[0-9]+)\\)?.*".CRLF."$", "\\1", $this->_message)); + $this->_datahost=$ip_port[0].".".$ip_port[1].".".$ip_port[2].".".$ip_port[3]; + $this->_dataport=(((int)$ip_port[4])<<8) + ((int)$ip_port[5]); + $this->SendMSG("Connecting to ".$this->_datahost.":".$this->_dataport); + if(!@socket_connect($this->_ftp_data_sock, $this->_datahost, $this->_dataport)) { + $this->PushError("_data_prepare","socket_connect", socket_strerror(socket_last_error($this->_ftp_data_sock))); + $this->_data_close(); + return FALSE; + } + else $this->_ftp_temp_sock=$this->_ftp_data_sock; + } else { + if(!@socket_getsockname($this->_ftp_control_sock, $addr, $port)) { + $this->PushError("_data_prepare","can't get control socket information", socket_strerror(socket_last_error($this->_ftp_control_sock))); + $this->_data_close(); + return FALSE; + } + if(!@socket_bind($this->_ftp_data_sock,$addr)){ + $this->PushError("_data_prepare","can't bind data socket", socket_strerror(socket_last_error($this->_ftp_data_sock))); + $this->_data_close(); + return FALSE; + } + if(!@socket_listen($this->_ftp_data_sock)) { + $this->PushError("_data_prepare","can't listen data socket", socket_strerror(socket_last_error($this->_ftp_data_sock))); + $this->_data_close(); + return FALSE; + } + if(!@socket_getsockname($this->_ftp_data_sock, $this->_datahost, $this->_dataport)) { + $this->PushError("_data_prepare","can't get data socket information", socket_strerror(socket_last_error($this->_ftp_data_sock))); + $this->_data_close(); + return FALSE; + } + if(!$this->_exec('PORT '.str_replace('.',',',$this->_datahost.'.'.($this->_dataport>>8).'.'.($this->_dataport&0x00FF)), "_port")) { + $this->_data_close(); + return FALSE; + } + if(!$this->_checkCode()) { + $this->_data_close(); + return FALSE; + } + } + return TRUE; + } + + function _data_read($mode=FTP_ASCII, $fp=NULL) { + $NewLine=$this->_eol_code[$this->OS_local]; + if(is_resource($fp)) $out=0; + else $out=""; + if(!$this->_passive) { + $this->SendMSG("Connecting to ".$this->_datahost.":".$this->_dataport); + $this->_ftp_temp_sock=socket_accept($this->_ftp_data_sock); + if($this->_ftp_temp_sock===FALSE) { + $this->PushError("_data_read","socket_accept", socket_strerror(socket_last_error($this->_ftp_temp_sock))); + $this->_data_close(); + return FALSE; + } + } + + while(($block=@socket_read($this->_ftp_temp_sock, $this->_ftp_buff_size, PHP_BINARY_READ))!==false) { + if($block==="") break; + if($mode!=FTP_BINARY) $block=preg_replace("/\r\n|\r|\n/", $this->_eol_code[$this->OS_local], $block); + if(is_resource($fp)) $out+=fwrite($fp, $block, strlen($block)); + else $out.=$block; + } + return $out; + } + + function _data_write($mode=FTP_ASCII, $fp=NULL) { + $NewLine=$this->_eol_code[$this->OS_local]; + if(is_resource($fp)) $out=0; + else $out=""; + if(!$this->_passive) { + $this->SendMSG("Connecting to ".$this->_datahost.":".$this->_dataport); + $this->_ftp_temp_sock=socket_accept($this->_ftp_data_sock); + if($this->_ftp_temp_sock===FALSE) { + $this->PushError("_data_write","socket_accept", socket_strerror(socket_last_error($this->_ftp_temp_sock))); + $this->_data_close(); + return false; + } + } + if(is_resource($fp)) { + while(!feof($fp)) { + $block=fread($fp, $this->_ftp_buff_size); + if(!$this->_data_write_block($mode, $block)) return false; + } + } elseif(!$this->_data_write_block($mode, $fp)) return false; + return true; + } + + function _data_write_block($mode, $block) { + if($mode!=FTP_BINARY) $block=preg_replace("/\r\n|\r|\n/", $this->_eol_code[$this->OS_remote], $block); + do { + if(($t=@socket_write($this->_ftp_temp_sock, $block))===FALSE) { + $this->PushError("_data_write","socket_write", socket_strerror(socket_last_error($this->_ftp_temp_sock))); + $this->_data_close(); + return FALSE; + } + $block=substr($block, $t); + } while(!empty($block)); + return true; + } + + function _data_close() { + @socket_close($this->_ftp_temp_sock); + @socket_close($this->_ftp_data_sock); + $this->SendMSG("Disconnected data from remote host"); + return TRUE; + } + + function _quit() { + if($this->_connected) { + @socket_close($this->_ftp_control_sock); + $this->_connected=false; + $this->SendMSG("Socket closed"); + } + } +} +?> diff --git a/src/wp-admin/includes/class-ftp.php b/src/wp-admin/includes/class-ftp.php new file mode 100644 index 0000000..1e35e74 --- /dev/null +++ b/src/wp-admin/includes/class-ftp.php @@ -0,0 +1,906 @@ +__construct($port_mode); + } + + function __construct($port_mode=FALSE, $verb=FALSE, $le=FALSE) { + $this->LocalEcho=$le; + $this->Verbose=$verb; + $this->_lastaction=NULL; + $this->_error_array=array(); + $this->_eol_code=array(FTP_OS_Unix=>"\n", FTP_OS_Mac=>"\r", FTP_OS_Windows=>"\r\n"); + $this->AuthorizedTransferMode=array(FTP_AUTOASCII, FTP_ASCII, FTP_BINARY); + $this->OS_FullName=array(FTP_OS_Unix => 'UNIX', FTP_OS_Windows => 'WINDOWS', FTP_OS_Mac => 'MACOS'); + $this->AutoAsciiExt=array("ASP","BAT","C","CPP","CSS","CSV","JS","H","HTM","HTML","SHTML","INI","LOG","PHP3","PHTML","PL","PERL","SH","SQL","TXT"); + $this->_port_available=($port_mode==TRUE); + $this->SendMSG("Staring FTP client class".($this->_port_available?"":" without PORT mode support")); + $this->_connected=FALSE; + $this->_ready=FALSE; + $this->_can_restore=FALSE; + $this->_code=0; + $this->_message=""; + $this->_ftp_buff_size=4096; + $this->_curtype=NULL; + $this->SetUmask(0022); + $this->SetType(FTP_AUTOASCII); + $this->SetTimeout(30); + $this->Passive(!$this->_port_available); + $this->_login="anonymous"; + $this->_password="anon@ftp.com"; + $this->_features=array(); + $this->OS_local=FTP_OS_Unix; + $this->OS_remote=FTP_OS_Unix; + $this->features=array(); + if(strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') $this->OS_local=FTP_OS_Windows; + elseif(strtoupper(substr(PHP_OS, 0, 3)) === 'MAC') $this->OS_local=FTP_OS_Mac; + } + +// +// +// + + function parselisting($line) { + $is_windows = ($this->OS_remote == FTP_OS_Windows); + if ($is_windows && preg_match("/([0-9]{2})-([0-9]{2})-([0-9]{2}) +([0-9]{2}):([0-9]{2})(AM|PM) +([0-9]+|) +(.+)/",$line,$lucifer)) { + $b = array(); + if ($lucifer[3]<70) { $lucifer[3]+=2000; } else { $lucifer[3]+=1900; } // 4digit year fix + $b['isdir'] = ($lucifer[7]==""); + if ( $b['isdir'] ) + $b['type'] = 'd'; + else + $b['type'] = 'f'; + $b['size'] = $lucifer[7]; + $b['month'] = $lucifer[1]; + $b['day'] = $lucifer[2]; + $b['year'] = $lucifer[3]; + $b['hour'] = $lucifer[4]; + $b['minute'] = $lucifer[5]; + $b['time'] = @mktime($lucifer[4]+(strcasecmp($lucifer[6],"PM")==0?12:0),$lucifer[5],0,$lucifer[1],$lucifer[2],$lucifer[3]); + $b['am/pm'] = $lucifer[6]; + $b['name'] = $lucifer[8]; + } else if (!$is_windows && $lucifer=preg_split("/[ ]/",$line,9,PREG_SPLIT_NO_EMPTY)) { + //echo $line."\n"; + $lcount=count($lucifer); + if ($lcount<8) return ''; + $b = array(); + $b['isdir'] = $lucifer[0]{0} === "d"; + $b['islink'] = $lucifer[0]{0} === "l"; + if ( $b['isdir'] ) + $b['type'] = 'd'; + elseif ( $b['islink'] ) + $b['type'] = 'l'; + else + $b['type'] = 'f'; + $b['perms'] = $lucifer[0]; + $b['number'] = $lucifer[1]; + $b['owner'] = $lucifer[2]; + $b['group'] = $lucifer[3]; + $b['size'] = $lucifer[4]; + if ($lcount==8) { + sscanf($lucifer[5],"%d-%d-%d",$b['year'],$b['month'],$b['day']); + sscanf($lucifer[6],"%d:%d",$b['hour'],$b['minute']); + $b['time'] = @mktime($b['hour'],$b['minute'],0,$b['month'],$b['day'],$b['year']); + $b['name'] = $lucifer[7]; + } else { + $b['month'] = $lucifer[5]; + $b['day'] = $lucifer[6]; + if (preg_match("/([0-9]{2}):([0-9]{2})/",$lucifer[7],$l2)) { + $b['year'] = date("Y"); + $b['hour'] = $l2[1]; + $b['minute'] = $l2[2]; + } else { + $b['year'] = $lucifer[7]; + $b['hour'] = 0; + $b['minute'] = 0; + } + $b['time'] = strtotime(sprintf("%d %s %d %02d:%02d",$b['day'],$b['month'],$b['year'],$b['hour'],$b['minute'])); + $b['name'] = $lucifer[8]; + } + } + + return $b; + } + + function SendMSG($message = "", $crlf=true) { + if ($this->Verbose) { + echo $message.($crlf?CRLF:""); + flush(); + } + return TRUE; + } + + function SetType($mode=FTP_AUTOASCII) { + if(!in_array($mode, $this->AuthorizedTransferMode)) { + $this->SendMSG("Wrong type"); + return FALSE; + } + $this->_type=$mode; + $this->SendMSG("Transfer type: ".($this->_type==FTP_BINARY?"binary":($this->_type==FTP_ASCII?"ASCII":"auto ASCII") ) ); + return TRUE; + } + + function _settype($mode=FTP_ASCII) { + if($this->_ready) { + if($mode==FTP_BINARY) { + if($this->_curtype!=FTP_BINARY) { + if(!$this->_exec("TYPE I", "SetType")) return FALSE; + $this->_curtype=FTP_BINARY; + } + } elseif($this->_curtype!=FTP_ASCII) { + if(!$this->_exec("TYPE A", "SetType")) return FALSE; + $this->_curtype=FTP_ASCII; + } + } else return FALSE; + return TRUE; + } + + function Passive($pasv=NULL) { + if(is_null($pasv)) $this->_passive=!$this->_passive; + else $this->_passive=$pasv; + if(!$this->_port_available and !$this->_passive) { + $this->SendMSG("Only passive connections available!"); + $this->_passive=TRUE; + return FALSE; + } + $this->SendMSG("Passive mode ".($this->_passive?"on":"off")); + return TRUE; + } + + function SetServer($host, $port=21, $reconnect=true) { + if(!is_long($port)) { + $this->verbose=true; + $this->SendMSG("Incorrect port syntax"); + return FALSE; + } else { + $ip=@gethostbyname($host); + $dns=@gethostbyaddr($host); + if(!$ip) $ip=$host; + if(!$dns) $dns=$host; + // Validate the IPAddress PHP4 returns -1 for invalid, PHP5 false + // -1 === "255.255.255.255" which is the broadcast address which is also going to be invalid + $ipaslong = ip2long($ip); + if ( ($ipaslong == false) || ($ipaslong === -1) ) { + $this->SendMSG("Wrong host name/address \"".$host."\""); + return FALSE; + } + $this->_host=$ip; + $this->_fullhost=$dns; + $this->_port=$port; + $this->_dataport=$port-1; + } + $this->SendMSG("Host \"".$this->_fullhost."(".$this->_host."):".$this->_port."\""); + if($reconnect){ + if($this->_connected) { + $this->SendMSG("Reconnecting"); + if(!$this->quit(FTP_FORCE)) return FALSE; + if(!$this->connect()) return FALSE; + } + } + return TRUE; + } + + function SetUmask($umask=0022) { + $this->_umask=$umask; + umask($this->_umask); + $this->SendMSG("UMASK 0".decoct($this->_umask)); + return TRUE; + } + + function SetTimeout($timeout=30) { + $this->_timeout=$timeout; + $this->SendMSG("Timeout ".$this->_timeout); + if($this->_connected) + if(!$this->_settimeout($this->_ftp_control_sock)) return FALSE; + return TRUE; + } + + function connect($server=NULL) { + if(!empty($server)) { + if(!$this->SetServer($server)) return false; + } + if($this->_ready) return true; + $this->SendMsg('Local OS : '.$this->OS_FullName[$this->OS_local]); + if(!($this->_ftp_control_sock = $this->_connect($this->_host, $this->_port))) { + $this->SendMSG("Error : Cannot connect to remote host \"".$this->_fullhost." :".$this->_port."\""); + return FALSE; + } + $this->SendMSG("Connected to remote host \"".$this->_fullhost.":".$this->_port."\". Waiting for greeting."); + do { + if(!$this->_readmsg()) return FALSE; + if(!$this->_checkCode()) return FALSE; + $this->_lastaction=time(); + } while($this->_code<200); + $this->_ready=true; + $syst=$this->systype(); + if(!$syst) $this->SendMSG("Can't detect remote OS"); + else { + if(preg_match("/win|dos|novell/i", $syst[0])) $this->OS_remote=FTP_OS_Windows; + elseif(preg_match("/os/i", $syst[0])) $this->OS_remote=FTP_OS_Mac; + elseif(preg_match("/(li|u)nix/i", $syst[0])) $this->OS_remote=FTP_OS_Unix; + else $this->OS_remote=FTP_OS_Mac; + $this->SendMSG("Remote OS: ".$this->OS_FullName[$this->OS_remote]); + } + if(!$this->features()) $this->SendMSG("Can't get features list. All supported - disabled"); + else $this->SendMSG("Supported features: ".implode(", ", array_keys($this->_features))); + return TRUE; + } + + function quit($force=false) { + if($this->_ready) { + if(!$this->_exec("QUIT") and !$force) return FALSE; + if(!$this->_checkCode() and !$force) return FALSE; + $this->_ready=false; + $this->SendMSG("Session finished"); + } + $this->_quit(); + return TRUE; + } + + function login($user=NULL, $pass=NULL) { + if(!is_null($user)) $this->_login=$user; + else $this->_login="anonymous"; + if(!is_null($pass)) $this->_password=$pass; + else $this->_password="anon@anon.com"; + if(!$this->_exec("USER ".$this->_login, "login")) return FALSE; + if(!$this->_checkCode()) return FALSE; + if($this->_code!=230) { + if(!$this->_exec((($this->_code==331)?"PASS ":"ACCT ").$this->_password, "login")) return FALSE; + if(!$this->_checkCode()) return FALSE; + } + $this->SendMSG("Authentication succeeded"); + if(empty($this->_features)) { + if(!$this->features()) $this->SendMSG("Can't get features list. All supported - disabled"); + else $this->SendMSG("Supported features: ".implode(", ", array_keys($this->_features))); + } + return TRUE; + } + + function pwd() { + if(!$this->_exec("PWD", "pwd")) return FALSE; + if(!$this->_checkCode()) return FALSE; + return ereg_replace("^[0-9]{3} \"(.+)\".+", "\\1", $this->_message); + } + + function cdup() { + if(!$this->_exec("CDUP", "cdup")) return FALSE; + if(!$this->_checkCode()) return FALSE; + return true; + } + + function chdir($pathname) { + if(!$this->_exec("CWD ".$pathname, "chdir")) return FALSE; + if(!$this->_checkCode()) return FALSE; + return TRUE; + } + + function rmdir($pathname) { + if(!$this->_exec("RMD ".$pathname, "rmdir")) return FALSE; + if(!$this->_checkCode()) return FALSE; + return TRUE; + } + + function mkdir($pathname) { + if(!$this->_exec("MKD ".$pathname, "mkdir")) return FALSE; + if(!$this->_checkCode()) return FALSE; + return TRUE; + } + + function rename($from, $to) { + if(!$this->_exec("RNFR ".$from, "rename")) return FALSE; + if(!$this->_checkCode()) return FALSE; + if($this->_code==350) { + if(!$this->_exec("RNTO ".$to, "rename")) return FALSE; + if(!$this->_checkCode()) return FALSE; + } else return FALSE; + return TRUE; + } + + function filesize($pathname) { + if(!isset($this->_features["SIZE"])) { + $this->PushError("filesize", "not supported by server"); + return FALSE; + } + if(!$this->_exec("SIZE ".$pathname, "filesize")) return FALSE; + if(!$this->_checkCode()) return FALSE; + return ereg_replace("^[0-9]{3} ([0-9]+)".CRLF, "\\1", $this->_message); + } + + function abort() { + if(!$this->_exec("ABOR", "abort")) return FALSE; + if(!$this->_checkCode()) { + if($this->_code!=426) return FALSE; + if(!$this->_readmsg("abort")) return FALSE; + if(!$this->_checkCode()) return FALSE; + } + return true; + } + + function mdtm($pathname) { + if(!isset($this->_features["MDTM"])) { + $this->PushError("mdtm", "not supported by server"); + return FALSE; + } + if(!$this->_exec("MDTM ".$pathname, "mdtm")) return FALSE; + if(!$this->_checkCode()) return FALSE; + $mdtm = ereg_replace("^[0-9]{3} ([0-9]+)".CRLF, "\\1", $this->_message); + $date = sscanf($mdtm, "%4d%2d%2d%2d%2d%2d"); + $timestamp = mktime($date[3], $date[4], $date[5], $date[1], $date[2], $date[0]); + return $timestamp; + } + + function systype() { + if(!$this->_exec("SYST", "systype")) return FALSE; + if(!$this->_checkCode()) return FALSE; + $DATA = explode(" ", $this->_message); + return array($DATA[1], $DATA[3]); + } + + function delete($pathname) { + if(!$this->_exec("DELE ".$pathname, "delete")) return FALSE; + if(!$this->_checkCode()) return FALSE; + return TRUE; + } + + function site($command, $fnction="site") { + if(!$this->_exec("SITE ".$command, $fnction)) return FALSE; + if(!$this->_checkCode()) return FALSE; + return TRUE; + } + + function chmod($pathname, $mode) { + if(!$this->site( sprintf('CHMOD %o %s', $mode, $pathname), "chmod")) return FALSE; + return TRUE; + } + + function restore($from) { + if(!isset($this->_features["REST"])) { + $this->PushError("restore", "not supported by server"); + return FALSE; + } + if($this->_curtype!=FTP_BINARY) { + $this->PushError("restore", "can't restore in ASCII mode"); + return FALSE; + } + if(!$this->_exec("REST ".$from, "resore")) return FALSE; + if(!$this->_checkCode()) return FALSE; + return TRUE; + } + + function features() { + if(!$this->_exec("FEAT", "features")) return FALSE; + if(!$this->_checkCode()) return FALSE; + $f=preg_split("/[".CRLF."]+/", preg_replace("/[0-9]{3}[ -].*[".CRLF."]+/", "", $this->_message), -1, PREG_SPLIT_NO_EMPTY); + $this->_features=array(); + foreach($f as $k=>$v) { + $v=explode(" ", trim($v)); + $this->_features[array_shift($v)]=$v; + } + return true; + } + + function rawlist($pathname="", $arg="") { + return $this->_list(($arg?" ".$arg:"").($pathname?" ".$pathname:""), "LIST", "rawlist"); + } + + function nlist($pathname="") { + return $this->_list(($arg?" ".$arg:"").($pathname?" ".$pathname:""), "NLST", "nlist"); + } + + function is_exists($pathname) { + return $this->file_exists($pathname); + } + + function file_exists($pathname) { + $exists=true; + if(!$this->_exec("RNFR ".$pathname, "rename")) $exists=FALSE; + else { + if(!$this->_checkCode()) $exists=FALSE; + $this->abort(); + } + if($exists) $this->SendMSG("Remote file ".$pathname." exists"); + else $this->SendMSG("Remote file ".$pathname." does not exist"); + return $exists; + } + + function fget($fp, $remotefile,$rest=0) { + if($this->_can_restore and $rest!=0) fseek($fp, $rest); + $pi=pathinfo($remotefile); + if($this->_type==FTP_ASCII or ($this->_type==FTP_AUTOASCII and in_array(strtoupper($pi["extension"]), $this->AutoAsciiExt))) $mode=FTP_ASCII; + else $mode=FTP_BINARY; + if(!$this->_data_prepare($mode)) { + return FALSE; + } + if($this->_can_restore and $rest!=0) $this->restore($rest); + if(!$this->_exec("RETR ".$remotefile, "get")) { + $this->_data_close(); + return FALSE; + } + if(!$this->_checkCode()) { + $this->_data_close(); + return FALSE; + } + $out=$this->_data_read($mode, $fp); + $this->_data_close(); + if(!$this->_readmsg()) return FALSE; + if(!$this->_checkCode()) return FALSE; + return $out; + } + + function get($remotefile, $localfile=NULL, $rest=0) { + if(is_null($localfile)) $localfile=$remotefile; + if (@file_exists($localfile)) $this->SendMSG("Warning : local file will be overwritten"); + $fp = @fopen($localfile, "w"); + if (!$fp) { + $this->PushError("get","can't open local file", "Cannot create \"".$localfile."\""); + return FALSE; + } + if($this->_can_restore and $rest!=0) fseek($fp, $rest); + $pi=pathinfo($remotefile); + if($this->_type==FTP_ASCII or ($this->_type==FTP_AUTOASCII and in_array(strtoupper($pi["extension"]), $this->AutoAsciiExt))) $mode=FTP_ASCII; + else $mode=FTP_BINARY; + if(!$this->_data_prepare($mode)) { + fclose($fp); + return FALSE; + } + if($this->_can_restore and $rest!=0) $this->restore($rest); + if(!$this->_exec("RETR ".$remotefile, "get")) { + $this->_data_close(); + fclose($fp); + return FALSE; + } + if(!$this->_checkCode()) { + $this->_data_close(); + fclose($fp); + return FALSE; + } + $out=$this->_data_read($mode, $fp); + fclose($fp); + $this->_data_close(); + if(!$this->_readmsg()) return FALSE; + if(!$this->_checkCode()) return FALSE; + return $out; + } + + function fput($remotefile, $fp) { + if($this->_can_restore and $rest!=0) fseek($fp, $rest); + $pi=pathinfo($remotefile); + if($this->_type==FTP_ASCII or ($this->_type==FTP_AUTOASCII and in_array(strtoupper($pi["extension"]), $this->AutoAsciiExt))) $mode=FTP_ASCII; + else $mode=FTP_BINARY; + if(!$this->_data_prepare($mode)) { + return FALSE; + } + if($this->_can_restore and $rest!=0) $this->restore($rest); + if(!$this->_exec("STOR ".$remotefile, "put")) { + $this->_data_close(); + return FALSE; + } + if(!$this->_checkCode()) { + $this->_data_close(); + return FALSE; + } + $ret=$this->_data_write($mode, $fp); + $this->_data_close(); + if(!$this->_readmsg()) return FALSE; + if(!$this->_checkCode()) return FALSE; + return $ret; + } + + function put($localfile, $remotefile=NULL, $rest=0) { + if(is_null($remotefile)) $remotefile=$localfile; + if (!file_exists($localfile)) { + $this->PushError("put","can't open local file", "No such file or directory \"".$localfile."\""); + return FALSE; + } + $fp = @fopen($localfile, "r"); + + if (!$fp) { + $this->PushError("put","can't open local file", "Cannot read file \"".$localfile."\""); + return FALSE; + } + if($this->_can_restore and $rest!=0) fseek($fp, $rest); + $pi=pathinfo($localfile); + if($this->_type==FTP_ASCII or ($this->_type==FTP_AUTOASCII and in_array(strtoupper($pi["extension"]), $this->AutoAsciiExt))) $mode=FTP_ASCII; + else $mode=FTP_BINARY; + if(!$this->_data_prepare($mode)) { + fclose($fp); + return FALSE; + } + if($this->_can_restore and $rest!=0) $this->restore($rest); + if(!$this->_exec("STOR ".$remotefile, "put")) { + $this->_data_close(); + fclose($fp); + return FALSE; + } + if(!$this->_checkCode()) { + $this->_data_close(); + fclose($fp); + return FALSE; + } + $ret=$this->_data_write($mode, $fp); + fclose($fp); + $this->_data_close(); + if(!$this->_readmsg()) return FALSE; + if(!$this->_checkCode()) return FALSE; + return $ret; + } + + function mput($local=".", $remote=NULL, $continious=false) { + $local=realpath($local); + if(!@file_exists($local)) { + $this->PushError("mput","can't open local folder", "Cannot stat folder \"".$local."\""); + return FALSE; + } + if(!is_dir($local)) return $this->put($local, $remote); + if(empty($remote)) $remote="."; + elseif(!$this->file_exists($remote) and !$this->mkdir($remote)) return FALSE; + if($handle = opendir($local)) { + $list=array(); + while (false !== ($file = readdir($handle))) { + if ($file != "." && $file != "..") $list[]=$file; + } + closedir($handle); + } else { + $this->PushError("mput","can't open local folder", "Cannot read folder \"".$local."\""); + return FALSE; + } + if(empty($list)) return TRUE; + $ret=true; + foreach($list as $el) { + if(is_dir($local."/".$el)) $t=$this->mput($local."/".$el, $remote."/".$el); + else $t=$this->put($local."/".$el, $remote."/".$el); + if(!$t) { + $ret=FALSE; + if(!$continious) break; + } + } + return $ret; + + } + + function mget($remote, $local=".", $continious=false) { + $list=$this->rawlist($remote, "-lA"); + if($list===false) { + $this->PushError("mget","can't read remote folder list", "Can't read remote folder \"".$remote."\" contents"); + return FALSE; + } + if(empty($list)) return true; + if(!@file_exists($local)) { + if(!@mkdir($local)) { + $this->PushError("mget","can't create local folder", "Cannot create folder \"".$local."\""); + return FALSE; + } + } + foreach($list as $k=>$v) { + $list[$k]=$this->parselisting($v); + if($list[$k]["name"]=="." or $list[$k]["name"]=="..") unset($list[$k]); + } + $ret=true; + foreach($list as $el) { + if($el["type"]=="d") { + if(!$this->mget($remote."/".$el["name"], $local."/".$el["name"], $continious)) { + $this->PushError("mget", "can't copy folder", "Can't copy remote folder \"".$remote."/".$el["name"]."\" to local \"".$local."/".$el["name"]."\""); + $ret=false; + if(!$continious) break; + } + } else { + if(!$this->get($remote."/".$el["name"], $local."/".$el["name"])) { + $this->PushError("mget", "can't copy file", "Can't copy remote file \"".$remote."/".$el["name"]."\" to local \"".$local."/".$el["name"]."\""); + $ret=false; + if(!$continious) break; + } + } + @chmod($local."/".$el["name"], $el["perms"]); + $t=strtotime($el["date"]); + if($t!==-1 and $t!==false) @touch($local."/".$el["name"], $t); + } + return $ret; + } + + function mdel($remote, $continious=false) { + $list=$this->rawlist($remote, "-la"); + if($list===false) { + $this->PushError("mdel","can't read remote folder list", "Can't read remote folder \"".$remote."\" contents"); + return false; + } + + foreach($list as $k=>$v) { + $list[$k]=$this->parselisting($v); + if($list[$k]["name"]=="." or $list[$k]["name"]=="..") unset($list[$k]); + } + $ret=true; + + foreach($list as $el) { + if ( empty($el) ) + continue; + + if($el["type"]=="d") { + if(!$this->mdel($remote."/".$el["name"], $continious)) { + $ret=false; + if(!$continious) break; + } + } else { + if (!$this->delete($remote."/".$el["name"])) { + $this->PushError("mdel", "can't delete file", "Can't delete remote file \"".$remote."/".$el["name"]."\""); + $ret=false; + if(!$continious) break; + } + } + } + + if(!$this->rmdir($remote)) { + $this->PushError("mdel", "can't delete folder", "Can't delete remote folder \"".$remote."/".$el["name"]."\""); + $ret=false; + } + return $ret; + } + + function mmkdir($dir, $mode = 0777) { + if(empty($dir)) return FALSE; + if($this->is_exists($dir) or $dir == "/" ) return TRUE; + if(!$this->mmkdir(dirname($dir), $mode)) return false; + $r=$this->mkdir($dir, $mode); + $this->chmod($dir,$mode); + return $r; + } + + function glob($pattern, $handle=NULL) { + $path=$output=null; + if(PHP_OS=='WIN32') $slash='\\'; + else $slash='/'; + $lastpos=strrpos($pattern,$slash); + if(!($lastpos===false)) { + $path=substr($pattern,0,-$lastpos-1); + $pattern=substr($pattern,$lastpos); + } else $path=getcwd(); + if(is_array($handle) and !empty($handle)) { + while($dir=each($handle)) { + if($this->glob_pattern_match($pattern,$dir)) + $output[]=$dir; + } + } else { + $handle=@opendir($path); + if($handle===false) return false; + while($dir=readdir($handle)) { + if($this->glob_pattern_match($pattern,$dir)) + $output[]=$dir; + } + closedir($handle); + } + if(is_array($output)) return $output; + return false; + } + + function glob_pattern_match($pattern,$string) { + $out=null; + $chunks=explode(';',$pattern); + foreach($chunks as $pattern) { + $escape=array('$','^','.','{','}','(',')','[',']','|'); + while(strpos($pattern,'**')!==false) + $pattern=str_replace('**','*',$pattern); + foreach($escape as $probe) + $pattern=str_replace($probe,"\\$probe",$pattern); + $pattern=str_replace('?*','*', + str_replace('*?','*', + str_replace('*',".*", + str_replace('?','.{1,1}',$pattern)))); + $out[]=$pattern; + } + if(count($out)==1) return($this->glob_regexp("^$out[0]$",$string)); + else { + foreach($out as $tester) + if($this->my_regexp("^$tester$",$string)) return true; + } + return false; + } + + function glob_regexp($pattern,$probe) { + $sensitive=(PHP_OS!='WIN32'); + return ($sensitive? + ereg($pattern,$probe): + eregi($pattern,$probe) + ); + } + + function dirlist($remote) { + $list=$this->rawlist($remote, "-la"); + if($list===false) { + $this->PushError("dirlist","can't read remote folder list", "Can't read remote folder \"".$remote."\" contents"); + return false; + } + + $dirlist = array(); + foreach($list as $k=>$v) { + $entry=$this->parselisting($v); + if ( empty($entry) ) + continue; + + if($entry["name"]=="." or $entry["name"]=="..") + continue; + + $dirlist[$entry['name']] = $entry; + } + + return $dirlist; + } +// +// +// + function _checkCode() { + return ($this->_code<400 and $this->_code>0); + } + + function _list($arg="", $cmd="LIST", $fnction="_list") { + if(!$this->_data_prepare()) return false; + if(!$this->_exec($cmd.$arg, $fnction)) { + $this->_data_close(); + return FALSE; + } + if(!$this->_checkCode()) { + $this->_data_close(); + return FALSE; + } + $out=""; + if($this->_code<200) { + $out=$this->_data_read(); + $this->_data_close(); + if(!$this->_readmsg()) return FALSE; + if(!$this->_checkCode()) return FALSE; + if($out === FALSE ) return FALSE; + $out=preg_split("/[".CRLF."]+/", $out, -1, PREG_SPLIT_NO_EMPTY); +// $this->SendMSG(implode($this->_eol_code[$this->OS_local], $out)); + } + return $out; + } + +// +// +// +// Gnre une erreur pour traitement externe la classe + function PushError($fctname,$msg,$desc=false){ + $error=array(); + $error['time']=time(); + $error['fctname']=$fctname; + $error['msg']=$msg; + $error['desc']=$desc; + if($desc) $tmp=' ('.$desc.')'; else $tmp=''; + $this->SendMSG($fctname.': '.$msg.$tmp); + return(array_push($this->_error_array,$error)); + } + +// Rcupre une erreur externe + function PopError(){ + if(count($this->_error_array)) return(array_pop($this->_error_array)); + else return(false); + } +} + +$mod_sockets=TRUE; +if (!extension_loaded('sockets')) { + $prefix = (PHP_SHLIB_SUFFIX == 'dll') ? 'php_' : ''; + if(!@dl($prefix . 'sockets.' . PHP_SHLIB_SUFFIX)) $mod_sockets=FALSE; +} + +require_once "class-ftp-".($mod_sockets?"sockets":"pure").".php"; +?> diff --git a/src/wp-admin/includes/class-pclzip.php b/src/wp-admin/includes/class-pclzip.php new file mode 100644 index 0000000..5e6a619 --- /dev/null +++ b/src/wp-admin/includes/class-pclzip.php @@ -0,0 +1,5687 @@ +zipname = $p_zipname; + $this->zip_fd = 0; + $this->magic_quotes_status = -1; + + // ----- Return + return; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : + // create($p_filelist, $p_add_dir="", $p_remove_dir="") + // create($p_filelist, $p_option, $p_option_value, ...) + // Description : + // This method supports two different synopsis. The first one is historical. + // This method creates a Zip Archive. The Zip file is created in the + // filesystem. The files and directories indicated in $p_filelist + // are added in the archive. See the parameters description for the + // supported format of $p_filelist. + // When a directory is in the list, the directory and its content is added + // in the archive. + // In this synopsis, the function takes an optional variable list of + // options. See bellow the supported options. + // Parameters : + // $p_filelist : An array containing file or directory names, or + // a string containing one filename or one directory name, or + // a string containing a list of filenames and/or directory + // names separated by spaces. + // $p_add_dir : A path to add before the real path of the archived file, + // in order to have it memorized in the archive. + // $p_remove_dir : A path to remove from the real path of the file to archive, + // in order to have a shorter path memorized in the archive. + // When $p_add_dir and $p_remove_dir are set, $p_remove_dir + // is removed first, before $p_add_dir is added. + // Options : + // PCLZIP_OPT_ADD_PATH : + // PCLZIP_OPT_REMOVE_PATH : + // PCLZIP_OPT_REMOVE_ALL_PATH : + // PCLZIP_OPT_COMMENT : + // PCLZIP_CB_PRE_ADD : + // PCLZIP_CB_POST_ADD : + // Return Values : + // 0 on failure, + // The list of the added files, with a status of the add action. + // (see PclZip::listContent() for list entry format) + // -------------------------------------------------------------------------------- + function create($p_filelist) + { + $v_result=1; + + // ----- Reset the error handler + $this->privErrorReset(); + + // ----- Set default values + $v_options = array(); + $v_options[PCLZIP_OPT_NO_COMPRESSION] = FALSE; + + // ----- Look for variable options arguments + $v_size = func_num_args(); + + // ----- Look for arguments + if ($v_size > 1) { + // ----- Get the arguments + $v_arg_list = func_get_args(); + + // ----- Remove from the options list the first argument + array_shift($v_arg_list); + $v_size--; + + // ----- Look for first arg + if ((is_integer($v_arg_list[0])) && ($v_arg_list[0] > 77000)) { + + // ----- Parse the options + $v_result = $this->privParseOptions($v_arg_list, $v_size, $v_options, + array (PCLZIP_OPT_REMOVE_PATH => 'optional', + PCLZIP_OPT_REMOVE_ALL_PATH => 'optional', + PCLZIP_OPT_ADD_PATH => 'optional', + PCLZIP_CB_PRE_ADD => 'optional', + PCLZIP_CB_POST_ADD => 'optional', + PCLZIP_OPT_NO_COMPRESSION => 'optional', + PCLZIP_OPT_COMMENT => 'optional', + PCLZIP_OPT_TEMP_FILE_THRESHOLD => 'optional', + PCLZIP_OPT_TEMP_FILE_ON => 'optional', + PCLZIP_OPT_TEMP_FILE_OFF => 'optional' + //, PCLZIP_OPT_CRYPT => 'optional' + )); + if ($v_result != 1) { + return 0; + } + } + + // ----- Look for 2 args + // Here we need to support the first historic synopsis of the + // method. + else { + + // ----- Get the first argument + $v_options[PCLZIP_OPT_ADD_PATH] = $v_arg_list[0]; + + // ----- Look for the optional second argument + if ($v_size == 2) { + $v_options[PCLZIP_OPT_REMOVE_PATH] = $v_arg_list[1]; + } + else if ($v_size > 2) { + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, + "Invalid number / type of arguments"); + return 0; + } + } + } + + // ----- Look for default option values + $this->privOptionDefaultThreshold($v_options); + + // ----- Init + $v_string_list = array(); + $v_att_list = array(); + $v_filedescr_list = array(); + $p_result_list = array(); + + // ----- Look if the $p_filelist is really an array + if (is_array($p_filelist)) { + + // ----- Look if the first element is also an array + // This will mean that this is a file description entry + if (isset($p_filelist[0]) && is_array($p_filelist[0])) { + $v_att_list = $p_filelist; + } + + // ----- The list is a list of string names + else { + $v_string_list = $p_filelist; + } + } + + // ----- Look if the $p_filelist is a string + else if (is_string($p_filelist)) { + // ----- Create a list from the string + $v_string_list = explode(PCLZIP_SEPARATOR, $p_filelist); + } + + // ----- Invalid variable type for $p_filelist + else { + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid variable type p_filelist"); + return 0; + } + + // ----- Reformat the string list + if (sizeof($v_string_list) != 0) { + foreach ($v_string_list as $v_string) { + if ($v_string != '') { + $v_att_list[][PCLZIP_ATT_FILE_NAME] = $v_string; + } + else { + } + } + } + + // ----- For each file in the list check the attributes + $v_supported_attributes + = array ( PCLZIP_ATT_FILE_NAME => 'mandatory' + ,PCLZIP_ATT_FILE_NEW_SHORT_NAME => 'optional' + ,PCLZIP_ATT_FILE_NEW_FULL_NAME => 'optional' + ,PCLZIP_ATT_FILE_MTIME => 'optional' + ,PCLZIP_ATT_FILE_CONTENT => 'optional' + ,PCLZIP_ATT_FILE_COMMENT => 'optional' + ); + foreach ($v_att_list as $v_entry) { + $v_result = $this->privFileDescrParseAtt($v_entry, + $v_filedescr_list[], + $v_options, + $v_supported_attributes); + if ($v_result != 1) { + return 0; + } + } + + // ----- Expand the filelist (expand directories) + $v_result = $this->privFileDescrExpand($v_filedescr_list, $v_options); + if ($v_result != 1) { + return 0; + } + + // ----- Call the create fct + $v_result = $this->privCreate($v_filedescr_list, $p_result_list, $v_options); + if ($v_result != 1) { + return 0; + } + + // ----- Return + return $p_result_list; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : + // add($p_filelist, $p_add_dir="", $p_remove_dir="") + // add($p_filelist, $p_option, $p_option_value, ...) + // Description : + // This method supports two synopsis. The first one is historical. + // This methods add the list of files in an existing archive. + // If a file with the same name already exists, it is added at the end of the + // archive, the first one is still present. + // If the archive does not exist, it is created. + // Parameters : + // $p_filelist : An array containing file or directory names, or + // a string containing one filename or one directory name, or + // a string containing a list of filenames and/or directory + // names separated by spaces. + // $p_add_dir : A path to add before the real path of the archived file, + // in order to have it memorized in the archive. + // $p_remove_dir : A path to remove from the real path of the file to archive, + // in order to have a shorter path memorized in the archive. + // When $p_add_dir and $p_remove_dir are set, $p_remove_dir + // is removed first, before $p_add_dir is added. + // Options : + // PCLZIP_OPT_ADD_PATH : + // PCLZIP_OPT_REMOVE_PATH : + // PCLZIP_OPT_REMOVE_ALL_PATH : + // PCLZIP_OPT_COMMENT : + // PCLZIP_OPT_ADD_COMMENT : + // PCLZIP_OPT_PREPEND_COMMENT : + // PCLZIP_CB_PRE_ADD : + // PCLZIP_CB_POST_ADD : + // Return Values : + // 0 on failure, + // The list of the added files, with a status of the add action. + // (see PclZip::listContent() for list entry format) + // -------------------------------------------------------------------------------- + function add($p_filelist) + { + $v_result=1; + + // ----- Reset the error handler + $this->privErrorReset(); + + // ----- Set default values + $v_options = array(); + $v_options[PCLZIP_OPT_NO_COMPRESSION] = FALSE; + + // ----- Look for variable options arguments + $v_size = func_num_args(); + + // ----- Look for arguments + if ($v_size > 1) { + // ----- Get the arguments + $v_arg_list = func_get_args(); + + // ----- Remove form the options list the first argument + array_shift($v_arg_list); + $v_size--; + + // ----- Look for first arg + if ((is_integer($v_arg_list[0])) && ($v_arg_list[0] > 77000)) { + + // ----- Parse the options + $v_result = $this->privParseOptions($v_arg_list, $v_size, $v_options, + array (PCLZIP_OPT_REMOVE_PATH => 'optional', + PCLZIP_OPT_REMOVE_ALL_PATH => 'optional', + PCLZIP_OPT_ADD_PATH => 'optional', + PCLZIP_CB_PRE_ADD => 'optional', + PCLZIP_CB_POST_ADD => 'optional', + PCLZIP_OPT_NO_COMPRESSION => 'optional', + PCLZIP_OPT_COMMENT => 'optional', + PCLZIP_OPT_ADD_COMMENT => 'optional', + PCLZIP_OPT_PREPEND_COMMENT => 'optional', + PCLZIP_OPT_TEMP_FILE_THRESHOLD => 'optional', + PCLZIP_OPT_TEMP_FILE_ON => 'optional', + PCLZIP_OPT_TEMP_FILE_OFF => 'optional' + //, PCLZIP_OPT_CRYPT => 'optional' + )); + if ($v_result != 1) { + return 0; + } + } + + // ----- Look for 2 args + // Here we need to support the first historic synopsis of the + // method. + else { + + // ----- Get the first argument + $v_options[PCLZIP_OPT_ADD_PATH] = $v_add_path = $v_arg_list[0]; + + // ----- Look for the optional second argument + if ($v_size == 2) { + $v_options[PCLZIP_OPT_REMOVE_PATH] = $v_arg_list[1]; + } + else if ($v_size > 2) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid number / type of arguments"); + + // ----- Return + return 0; + } + } + } + + // ----- Look for default option values + $this->privOptionDefaultThreshold($v_options); + + // ----- Init + $v_string_list = array(); + $v_att_list = array(); + $v_filedescr_list = array(); + $p_result_list = array(); + + // ----- Look if the $p_filelist is really an array + if (is_array($p_filelist)) { + + // ----- Look if the first element is also an array + // This will mean that this is a file description entry + if (isset($p_filelist[0]) && is_array($p_filelist[0])) { + $v_att_list = $p_filelist; + } + + // ----- The list is a list of string names + else { + $v_string_list = $p_filelist; + } + } + + // ----- Look if the $p_filelist is a string + else if (is_string($p_filelist)) { + // ----- Create a list from the string + $v_string_list = explode(PCLZIP_SEPARATOR, $p_filelist); + } + + // ----- Invalid variable type for $p_filelist + else { + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid variable type '".gettype($p_filelist)."' for p_filelist"); + return 0; + } + + // ----- Reformat the string list + if (sizeof($v_string_list) != 0) { + foreach ($v_string_list as $v_string) { + $v_att_list[][PCLZIP_ATT_FILE_NAME] = $v_string; + } + } + + // ----- For each file in the list check the attributes + $v_supported_attributes + = array ( PCLZIP_ATT_FILE_NAME => 'mandatory' + ,PCLZIP_ATT_FILE_NEW_SHORT_NAME => 'optional' + ,PCLZIP_ATT_FILE_NEW_FULL_NAME => 'optional' + ,PCLZIP_ATT_FILE_MTIME => 'optional' + ,PCLZIP_ATT_FILE_CONTENT => 'optional' + ,PCLZIP_ATT_FILE_COMMENT => 'optional' + ); + foreach ($v_att_list as $v_entry) { + $v_result = $this->privFileDescrParseAtt($v_entry, + $v_filedescr_list[], + $v_options, + $v_supported_attributes); + if ($v_result != 1) { + return 0; + } + } + + // ----- Expand the filelist (expand directories) + $v_result = $this->privFileDescrExpand($v_filedescr_list, $v_options); + if ($v_result != 1) { + return 0; + } + + // ----- Call the create fct + $v_result = $this->privAdd($v_filedescr_list, $p_result_list, $v_options); + if ($v_result != 1) { + return 0; + } + + // ----- Return + return $p_result_list; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : listContent() + // Description : + // This public method, gives the list of the files and directories, with their + // properties. + // The properties of each entries in the list are (used also in other functions) : + // filename : Name of the file. For a create or add action it is the filename + // given by the user. For an extract function it is the filename + // of the extracted file. + // stored_filename : Name of the file / directory stored in the archive. + // size : Size of the stored file. + // compressed_size : Size of the file's data compressed in the archive + // (without the headers overhead) + // mtime : Last known modification date of the file (UNIX timestamp) + // comment : Comment associated with the file + // folder : true | false + // index : index of the file in the archive + // status : status of the action (depending of the action) : + // Values are : + // ok : OK ! + // filtered : the file / dir is not extracted (filtered by user) + // already_a_directory : the file can not be extracted because a + // directory with the same name already exists + // write_protected : the file can not be extracted because a file + // with the same name already exists and is + // write protected + // newer_exist : the file was not extracted because a newer file exists + // path_creation_fail : the file is not extracted because the folder + // does not exist and can not be created + // write_error : the file was not extracted because there was a + // error while writing the file + // read_error : the file was not extracted because there was a error + // while reading the file + // invalid_header : the file was not extracted because of an archive + // format error (bad file header) + // Note that each time a method can continue operating when there + // is an action error on a file, the error is only logged in the file status. + // Return Values : + // 0 on an unrecoverable failure, + // The list of the files in the archive. + // -------------------------------------------------------------------------------- + function listContent() + { + $v_result=1; + + // ----- Reset the error handler + $this->privErrorReset(); + + // ----- Check archive + if (!$this->privCheckFormat()) { + return(0); + } + + // ----- Call the extracting fct + $p_list = array(); + if (($v_result = $this->privList($p_list)) != 1) + { + unset($p_list); + return(0); + } + + // ----- Return + return $p_list; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : + // extract($p_path="./", $p_remove_path="") + // extract([$p_option, $p_option_value, ...]) + // Description : + // This method supports two synopsis. The first one is historical. + // This method extract all the files / directories from the archive to the + // folder indicated in $p_path. + // If you want to ignore the 'root' part of path of the memorized files + // you can indicate this in the optional $p_remove_path parameter. + // By default, if a newer file with the same name already exists, the + // file is not extracted. + // + // If both PCLZIP_OPT_PATH and PCLZIP_OPT_ADD_PATH aoptions + // are used, the path indicated in PCLZIP_OPT_ADD_PATH is append + // at the end of the path value of PCLZIP_OPT_PATH. + // Parameters : + // $p_path : Path where the files and directories are to be extracted + // $p_remove_path : First part ('root' part) of the memorized path + // (if any similar) to remove while extracting. + // Options : + // PCLZIP_OPT_PATH : + // PCLZIP_OPT_ADD_PATH : + // PCLZIP_OPT_REMOVE_PATH : + // PCLZIP_OPT_REMOVE_ALL_PATH : + // PCLZIP_CB_PRE_EXTRACT : + // PCLZIP_CB_POST_EXTRACT : + // Return Values : + // 0 or a negative value on failure, + // The list of the extracted files, with a status of the action. + // (see PclZip::listContent() for list entry format) + // -------------------------------------------------------------------------------- + function extract() + { + $v_result=1; + + // ----- Reset the error handler + $this->privErrorReset(); + + // ----- Check archive + if (!$this->privCheckFormat()) { + return(0); + } + + // ----- Set default values + $v_options = array(); +// $v_path = "./"; + $v_path = ''; + $v_remove_path = ""; + $v_remove_all_path = false; + + // ----- Look for variable options arguments + $v_size = func_num_args(); + + // ----- Default values for option + $v_options[PCLZIP_OPT_EXTRACT_AS_STRING] = FALSE; + + // ----- Look for arguments + if ($v_size > 0) { + // ----- Get the arguments + $v_arg_list = func_get_args(); + + // ----- Look for first arg + if ((is_integer($v_arg_list[0])) && ($v_arg_list[0] > 77000)) { + + // ----- Parse the options + $v_result = $this->privParseOptions($v_arg_list, $v_size, $v_options, + array (PCLZIP_OPT_PATH => 'optional', + PCLZIP_OPT_REMOVE_PATH => 'optional', + PCLZIP_OPT_REMOVE_ALL_PATH => 'optional', + PCLZIP_OPT_ADD_PATH => 'optional', + PCLZIP_CB_PRE_EXTRACT => 'optional', + PCLZIP_CB_POST_EXTRACT => 'optional', + PCLZIP_OPT_SET_CHMOD => 'optional', + PCLZIP_OPT_BY_NAME => 'optional', + PCLZIP_OPT_BY_EREG => 'optional', + PCLZIP_OPT_BY_PREG => 'optional', + PCLZIP_OPT_BY_INDEX => 'optional', + PCLZIP_OPT_EXTRACT_AS_STRING => 'optional', + PCLZIP_OPT_EXTRACT_IN_OUTPUT => 'optional', + PCLZIP_OPT_REPLACE_NEWER => 'optional' + ,PCLZIP_OPT_STOP_ON_ERROR => 'optional' + ,PCLZIP_OPT_EXTRACT_DIR_RESTRICTION => 'optional', + PCLZIP_OPT_TEMP_FILE_THRESHOLD => 'optional', + PCLZIP_OPT_TEMP_FILE_ON => 'optional', + PCLZIP_OPT_TEMP_FILE_OFF => 'optional' + )); + if ($v_result != 1) { + return 0; + } + + // ----- Set the arguments + if (isset($v_options[PCLZIP_OPT_PATH])) { + $v_path = $v_options[PCLZIP_OPT_PATH]; + } + if (isset($v_options[PCLZIP_OPT_REMOVE_PATH])) { + $v_remove_path = $v_options[PCLZIP_OPT_REMOVE_PATH]; + } + if (isset($v_options[PCLZIP_OPT_REMOVE_ALL_PATH])) { + $v_remove_all_path = $v_options[PCLZIP_OPT_REMOVE_ALL_PATH]; + } + if (isset($v_options[PCLZIP_OPT_ADD_PATH])) { + // ----- Check for '/' in last path char + if ((strlen($v_path) > 0) && (substr($v_path, -1) != '/')) { + $v_path .= '/'; + } + $v_path .= $v_options[PCLZIP_OPT_ADD_PATH]; + } + } + + // ----- Look for 2 args + // Here we need to support the first historic synopsis of the + // method. + else { + + // ----- Get the first argument + $v_path = $v_arg_list[0]; + + // ----- Look for the optional second argument + if ($v_size == 2) { + $v_remove_path = $v_arg_list[1]; + } + else if ($v_size > 2) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid number / type of arguments"); + + // ----- Return + return 0; + } + } + } + + // ----- Look for default option values + $this->privOptionDefaultThreshold($v_options); + + // ----- Trace + + // ----- Call the extracting fct + $p_list = array(); + $v_result = $this->privExtractByRule($p_list, $v_path, $v_remove_path, + $v_remove_all_path, $v_options); + if ($v_result < 1) { + unset($p_list); + return(0); + } + + // ----- Return + return $p_list; + } + // -------------------------------------------------------------------------------- + + + // -------------------------------------------------------------------------------- + // Function : + // extractByIndex($p_index, $p_path="./", $p_remove_path="") + // extractByIndex($p_index, [$p_option, $p_option_value, ...]) + // Description : + // This method supports two synopsis. The first one is historical. + // This method is doing a partial extract of the archive. + // The extracted files or folders are identified by their index in the + // archive (from 0 to n). + // Note that if the index identify a folder, only the folder entry is + // extracted, not all the files included in the archive. + // Parameters : + // $p_index : A single index (integer) or a string of indexes of files to + // extract. The form of the string is "0,4-6,8-12" with only numbers + // and '-' for range or ',' to separate ranges. No spaces or ';' + // are allowed. + // $p_path : Path where the files and directories are to be extracted + // $p_remove_path : First part ('root' part) of the memorized path + // (if any similar) to remove while extracting. + // Options : + // PCLZIP_OPT_PATH : + // PCLZIP_OPT_ADD_PATH : + // PCLZIP_OPT_REMOVE_PATH : + // PCLZIP_OPT_REMOVE_ALL_PATH : + // PCLZIP_OPT_EXTRACT_AS_STRING : The files are extracted as strings and + // not as files. + // The resulting content is in a new field 'content' in the file + // structure. + // This option must be used alone (any other options are ignored). + // PCLZIP_CB_PRE_EXTRACT : + // PCLZIP_CB_POST_EXTRACT : + // Return Values : + // 0 on failure, + // The list of the extracted files, with a status of the action. + // (see PclZip::listContent() for list entry format) + // -------------------------------------------------------------------------------- + //function extractByIndex($p_index, options...) + function extractByIndex($p_index) + { + $v_result=1; + + // ----- Reset the error handler + $this->privErrorReset(); + + // ----- Check archive + if (!$this->privCheckFormat()) { + return(0); + } + + // ----- Set default values + $v_options = array(); +// $v_path = "./"; + $v_path = ''; + $v_remove_path = ""; + $v_remove_all_path = false; + + // ----- Look for variable options arguments + $v_size = func_num_args(); + + // ----- Default values for option + $v_options[PCLZIP_OPT_EXTRACT_AS_STRING] = FALSE; + + // ----- Look for arguments + if ($v_size > 1) { + // ----- Get the arguments + $v_arg_list = func_get_args(); + + // ----- Remove form the options list the first argument + array_shift($v_arg_list); + $v_size--; + + // ----- Look for first arg + if ((is_integer($v_arg_list[0])) && ($v_arg_list[0] > 77000)) { + + // ----- Parse the options + $v_result = $this->privParseOptions($v_arg_list, $v_size, $v_options, + array (PCLZIP_OPT_PATH => 'optional', + PCLZIP_OPT_REMOVE_PATH => 'optional', + PCLZIP_OPT_REMOVE_ALL_PATH => 'optional', + PCLZIP_OPT_EXTRACT_AS_STRING => 'optional', + PCLZIP_OPT_ADD_PATH => 'optional', + PCLZIP_CB_PRE_EXTRACT => 'optional', + PCLZIP_CB_POST_EXTRACT => 'optional', + PCLZIP_OPT_SET_CHMOD => 'optional', + PCLZIP_OPT_REPLACE_NEWER => 'optional' + ,PCLZIP_OPT_STOP_ON_ERROR => 'optional' + ,PCLZIP_OPT_EXTRACT_DIR_RESTRICTION => 'optional', + PCLZIP_OPT_TEMP_FILE_THRESHOLD => 'optional', + PCLZIP_OPT_TEMP_FILE_ON => 'optional', + PCLZIP_OPT_TEMP_FILE_OFF => 'optional' + )); + if ($v_result != 1) { + return 0; + } + + // ----- Set the arguments + if (isset($v_options[PCLZIP_OPT_PATH])) { + $v_path = $v_options[PCLZIP_OPT_PATH]; + } + if (isset($v_options[PCLZIP_OPT_REMOVE_PATH])) { + $v_remove_path = $v_options[PCLZIP_OPT_REMOVE_PATH]; + } + if (isset($v_options[PCLZIP_OPT_REMOVE_ALL_PATH])) { + $v_remove_all_path = $v_options[PCLZIP_OPT_REMOVE_ALL_PATH]; + } + if (isset($v_options[PCLZIP_OPT_ADD_PATH])) { + // ----- Check for '/' in last path char + if ((strlen($v_path) > 0) && (substr($v_path, -1) != '/')) { + $v_path .= '/'; + } + $v_path .= $v_options[PCLZIP_OPT_ADD_PATH]; + } + if (!isset($v_options[PCLZIP_OPT_EXTRACT_AS_STRING])) { + $v_options[PCLZIP_OPT_EXTRACT_AS_STRING] = FALSE; + } + else { + } + } + + // ----- Look for 2 args + // Here we need to support the first historic synopsis of the + // method. + else { + + // ----- Get the first argument + $v_path = $v_arg_list[0]; + + // ----- Look for the optional second argument + if ($v_size == 2) { + $v_remove_path = $v_arg_list[1]; + } + else if ($v_size > 2) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid number / type of arguments"); + + // ----- Return + return 0; + } + } + } + + // ----- Trace + + // ----- Trick + // Here I want to reuse extractByRule(), so I need to parse the $p_index + // with privParseOptions() + $v_arg_trick = array (PCLZIP_OPT_BY_INDEX, $p_index); + $v_options_trick = array(); + $v_result = $this->privParseOptions($v_arg_trick, sizeof($v_arg_trick), $v_options_trick, + array (PCLZIP_OPT_BY_INDEX => 'optional' )); + if ($v_result != 1) { + return 0; + } + $v_options[PCLZIP_OPT_BY_INDEX] = $v_options_trick[PCLZIP_OPT_BY_INDEX]; + + // ----- Look for default option values + $this->privOptionDefaultThreshold($v_options); + + // ----- Call the extracting fct + if (($v_result = $this->privExtractByRule($p_list, $v_path, $v_remove_path, $v_remove_all_path, $v_options)) < 1) { + return(0); + } + + // ----- Return + return $p_list; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : + // delete([$p_option, $p_option_value, ...]) + // Description : + // This method removes files from the archive. + // If no parameters are given, then all the archive is emptied. + // Parameters : + // None or optional arguments. + // Options : + // PCLZIP_OPT_BY_INDEX : + // PCLZIP_OPT_BY_NAME : + // PCLZIP_OPT_BY_EREG : + // PCLZIP_OPT_BY_PREG : + // Return Values : + // 0 on failure, + // The list of the files which are still present in the archive. + // (see PclZip::listContent() for list entry format) + // -------------------------------------------------------------------------------- + function delete() + { + $v_result=1; + + // ----- Reset the error handler + $this->privErrorReset(); + + // ----- Check archive + if (!$this->privCheckFormat()) { + return(0); + } + + // ----- Set default values + $v_options = array(); + + // ----- Look for variable options arguments + $v_size = func_num_args(); + + // ----- Look for arguments + if ($v_size > 0) { + // ----- Get the arguments + $v_arg_list = func_get_args(); + + // ----- Parse the options + $v_result = $this->privParseOptions($v_arg_list, $v_size, $v_options, + array (PCLZIP_OPT_BY_NAME => 'optional', + PCLZIP_OPT_BY_EREG => 'optional', + PCLZIP_OPT_BY_PREG => 'optional', + PCLZIP_OPT_BY_INDEX => 'optional' )); + if ($v_result != 1) { + return 0; + } + } + + // ----- Magic quotes trick + $this->privDisableMagicQuotes(); + + // ----- Call the delete fct + $v_list = array(); + if (($v_result = $this->privDeleteByRule($v_list, $v_options)) != 1) { + $this->privSwapBackMagicQuotes(); + unset($v_list); + return(0); + } + + // ----- Magic quotes trick + $this->privSwapBackMagicQuotes(); + + // ----- Return + return $v_list; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : deleteByIndex() + // Description : + // ***** Deprecated ***** + // delete(PCLZIP_OPT_BY_INDEX, $p_index) should be prefered. + // -------------------------------------------------------------------------------- + function deleteByIndex($p_index) + { + + $p_list = $this->delete(PCLZIP_OPT_BY_INDEX, $p_index); + + // ----- Return + return $p_list; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : properties() + // Description : + // This method gives the properties of the archive. + // The properties are : + // nb : Number of files in the archive + // comment : Comment associated with the archive file + // status : not_exist, ok + // Parameters : + // None + // Return Values : + // 0 on failure, + // An array with the archive properties. + // -------------------------------------------------------------------------------- + function properties() + { + + // ----- Reset the error handler + $this->privErrorReset(); + + // ----- Magic quotes trick + $this->privDisableMagicQuotes(); + + // ----- Check archive + if (!$this->privCheckFormat()) { + $this->privSwapBackMagicQuotes(); + return(0); + } + + // ----- Default properties + $v_prop = array(); + $v_prop['comment'] = ''; + $v_prop['nb'] = 0; + $v_prop['status'] = 'not_exist'; + + // ----- Look if file exists + if (@is_file($this->zipname)) + { + // ----- Open the zip file + if (($this->zip_fd = @fopen($this->zipname, 'rb')) == 0) + { + $this->privSwapBackMagicQuotes(); + + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open archive \''.$this->zipname.'\' in binary read mode'); + + // ----- Return + return 0; + } + + // ----- Read the central directory informations + $v_central_dir = array(); + if (($v_result = $this->privReadEndCentralDir($v_central_dir)) != 1) + { + $this->privSwapBackMagicQuotes(); + return 0; + } + + // ----- Close the zip file + $this->privCloseFd(); + + // ----- Set the user attributes + $v_prop['comment'] = $v_central_dir['comment']; + $v_prop['nb'] = $v_central_dir['entries']; + $v_prop['status'] = 'ok'; + } + + // ----- Magic quotes trick + $this->privSwapBackMagicQuotes(); + + // ----- Return + return $v_prop; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : duplicate() + // Description : + // This method creates an archive by copying the content of an other one. If + // the archive already exist, it is replaced by the new one without any warning. + // Parameters : + // $p_archive : The filename of a valid archive, or + // a valid PclZip object. + // Return Values : + // 1 on success. + // 0 or a negative value on error (error code). + // -------------------------------------------------------------------------------- + function duplicate($p_archive) + { + $v_result = 1; + + // ----- Reset the error handler + $this->privErrorReset(); + + // ----- Look if the $p_archive is a PclZip object + if ((is_object($p_archive)) && (get_class($p_archive) == 'pclzip')) + { + + // ----- Duplicate the archive + $v_result = $this->privDuplicate($p_archive->zipname); + } + + // ----- Look if the $p_archive is a string (so a filename) + else if (is_string($p_archive)) + { + + // ----- Check that $p_archive is a valid zip file + // TBC : Should also check the archive format + if (!is_file($p_archive)) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_MISSING_FILE, "No file with filename '".$p_archive."'"); + $v_result = PCLZIP_ERR_MISSING_FILE; + } + else { + // ----- Duplicate the archive + $v_result = $this->privDuplicate($p_archive); + } + } + + // ----- Invalid variable + else + { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid variable type p_archive_to_add"); + $v_result = PCLZIP_ERR_INVALID_PARAMETER; + } + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : merge() + // Description : + // This method merge the $p_archive_to_add archive at the end of the current + // one ($this). + // If the archive ($this) does not exist, the merge becomes a duplicate. + // If the $p_archive_to_add archive does not exist, the merge is a success. + // Parameters : + // $p_archive_to_add : It can be directly the filename of a valid zip archive, + // or a PclZip object archive. + // Return Values : + // 1 on success, + // 0 or negative values on error (see below). + // -------------------------------------------------------------------------------- + function merge($p_archive_to_add) + { + $v_result = 1; + + // ----- Reset the error handler + $this->privErrorReset(); + + // ----- Check archive + if (!$this->privCheckFormat()) { + return(0); + } + + // ----- Look if the $p_archive_to_add is a PclZip object + if ((is_object($p_archive_to_add)) && (get_class($p_archive_to_add) == 'pclzip')) + { + + // ----- Merge the archive + $v_result = $this->privMerge($p_archive_to_add); + } + + // ----- Look if the $p_archive_to_add is a string (so a filename) + else if (is_string($p_archive_to_add)) + { + + // ----- Create a temporary archive + $v_object_archive = new PclZip($p_archive_to_add); + + // ----- Merge the archive + $v_result = $this->privMerge($v_object_archive); + } + + // ----- Invalid variable + else + { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid variable type p_archive_to_add"); + $v_result = PCLZIP_ERR_INVALID_PARAMETER; + } + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + + + // -------------------------------------------------------------------------------- + // Function : errorCode() + // Description : + // Parameters : + // -------------------------------------------------------------------------------- + function errorCode() + { + if (PCLZIP_ERROR_EXTERNAL == 1) { + return(PclErrorCode()); + } + else { + return($this->error_code); + } + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : errorName() + // Description : + // Parameters : + // -------------------------------------------------------------------------------- + function errorName($p_with_code=false) + { + $v_name = array ( PCLZIP_ERR_NO_ERROR => 'PCLZIP_ERR_NO_ERROR', + PCLZIP_ERR_WRITE_OPEN_FAIL => 'PCLZIP_ERR_WRITE_OPEN_FAIL', + PCLZIP_ERR_READ_OPEN_FAIL => 'PCLZIP_ERR_READ_OPEN_FAIL', + PCLZIP_ERR_INVALID_PARAMETER => 'PCLZIP_ERR_INVALID_PARAMETER', + PCLZIP_ERR_MISSING_FILE => 'PCLZIP_ERR_MISSING_FILE', + PCLZIP_ERR_FILENAME_TOO_LONG => 'PCLZIP_ERR_FILENAME_TOO_LONG', + PCLZIP_ERR_INVALID_ZIP => 'PCLZIP_ERR_INVALID_ZIP', + PCLZIP_ERR_BAD_EXTRACTED_FILE => 'PCLZIP_ERR_BAD_EXTRACTED_FILE', + PCLZIP_ERR_DIR_CREATE_FAIL => 'PCLZIP_ERR_DIR_CREATE_FAIL', + PCLZIP_ERR_BAD_EXTENSION => 'PCLZIP_ERR_BAD_EXTENSION', + PCLZIP_ERR_BAD_FORMAT => 'PCLZIP_ERR_BAD_FORMAT', + PCLZIP_ERR_DELETE_FILE_FAIL => 'PCLZIP_ERR_DELETE_FILE_FAIL', + PCLZIP_ERR_RENAME_FILE_FAIL => 'PCLZIP_ERR_RENAME_FILE_FAIL', + PCLZIP_ERR_BAD_CHECKSUM => 'PCLZIP_ERR_BAD_CHECKSUM', + PCLZIP_ERR_INVALID_ARCHIVE_ZIP => 'PCLZIP_ERR_INVALID_ARCHIVE_ZIP', + PCLZIP_ERR_MISSING_OPTION_VALUE => 'PCLZIP_ERR_MISSING_OPTION_VALUE', + PCLZIP_ERR_INVALID_OPTION_VALUE => 'PCLZIP_ERR_INVALID_OPTION_VALUE', + PCLZIP_ERR_UNSUPPORTED_COMPRESSION => 'PCLZIP_ERR_UNSUPPORTED_COMPRESSION', + PCLZIP_ERR_UNSUPPORTED_ENCRYPTION => 'PCLZIP_ERR_UNSUPPORTED_ENCRYPTION' + ,PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE => 'PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE' + ,PCLZIP_ERR_DIRECTORY_RESTRICTION => 'PCLZIP_ERR_DIRECTORY_RESTRICTION' + ); + + if (isset($v_name[$this->error_code])) { + $v_value = $v_name[$this->error_code]; + } + else { + $v_value = 'NoName'; + } + + if ($p_with_code) { + return($v_value.' ('.$this->error_code.')'); + } + else { + return($v_value); + } + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : errorInfo() + // Description : + // Parameters : + // -------------------------------------------------------------------------------- + function errorInfo($p_full=false) + { + if (PCLZIP_ERROR_EXTERNAL == 1) { + return(PclErrorString()); + } + else { + if ($p_full) { + return($this->errorName(true)." : ".$this->error_string); + } + else { + return($this->error_string." [code ".$this->error_code."]"); + } + } + } + // -------------------------------------------------------------------------------- + + +// -------------------------------------------------------------------------------- +// ***** UNDER THIS LINE ARE DEFINED PRIVATE INTERNAL FUNCTIONS ***** +// ***** ***** +// ***** THESES FUNCTIONS MUST NOT BE USED DIRECTLY ***** +// -------------------------------------------------------------------------------- + + + + // -------------------------------------------------------------------------------- + // Function : privCheckFormat() + // Description : + // This method check that the archive exists and is a valid zip archive. + // Several level of check exists. (futur) + // Parameters : + // $p_level : Level of check. Default 0. + // 0 : Check the first bytes (magic codes) (default value)) + // 1 : 0 + Check the central directory (futur) + // 2 : 1 + Check each file header (futur) + // Return Values : + // true on success, + // false on error, the error code is set. + // -------------------------------------------------------------------------------- + function privCheckFormat($p_level=0) + { + $v_result = true; + + // ----- Reset the file system cache + clearstatcache(); + + // ----- Reset the error handler + $this->privErrorReset(); + + // ----- Look if the file exits + if (!is_file($this->zipname)) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_MISSING_FILE, "Missing archive file '".$this->zipname."'"); + return(false); + } + + // ----- Check that the file is readeable + if (!is_readable($this->zipname)) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, "Unable to read archive '".$this->zipname."'"); + return(false); + } + + // ----- Check the magic code + // TBC + + // ----- Check the central header + // TBC + + // ----- Check each file header + // TBC + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privParseOptions() + // Description : + // This internal methods reads the variable list of arguments ($p_options_list, + // $p_size) and generate an array with the options and values ($v_result_list). + // $v_requested_options contains the options that can be present and those that + // must be present. + // $v_requested_options is an array, with the option value as key, and 'optional', + // or 'mandatory' as value. + // Parameters : + // See above. + // Return Values : + // 1 on success. + // 0 on failure. + // -------------------------------------------------------------------------------- + function privParseOptions(&$p_options_list, $p_size, &$v_result_list, $v_requested_options=false) + { + $v_result=1; + + // ----- Read the options + $i=0; + while ($i<$p_size) { + + // ----- Check if the option is supported + if (!isset($v_requested_options[$p_options_list[$i]])) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid optional parameter '".$p_options_list[$i]."' for this method"); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Look for next option + switch ($p_options_list[$i]) { + // ----- Look for options that request a path value + case PCLZIP_OPT_PATH : + case PCLZIP_OPT_REMOVE_PATH : + case PCLZIP_OPT_ADD_PATH : + // ----- Check the number of parameters + if (($i+1) >= $p_size) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'"); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Get the value + $v_result_list[$p_options_list[$i]] = PclZipUtilTranslateWinPath($p_options_list[$i+1], FALSE); + $i++; + break; + + case PCLZIP_OPT_TEMP_FILE_THRESHOLD : + // ----- Check the number of parameters + if (($i+1) >= $p_size) { + PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'"); + return PclZip::errorCode(); + } + + // ----- Check for incompatible options + if (isset($v_result_list[PCLZIP_OPT_TEMP_FILE_OFF])) { + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Option '".PclZipUtilOptionText($p_options_list[$i])."' can not be used with option 'PCLZIP_OPT_TEMP_FILE_OFF'"); + return PclZip::errorCode(); + } + + // ----- Check the value + $v_value = $p_options_list[$i+1]; + if ((!is_integer($v_value)) || ($v_value<0)) { + PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, "Integer expected for option '".PclZipUtilOptionText($p_options_list[$i])."'"); + return PclZip::errorCode(); + } + + // ----- Get the value (and convert it in bytes) + $v_result_list[$p_options_list[$i]] = $v_value*1048576; + $i++; + break; + + case PCLZIP_OPT_TEMP_FILE_ON : + // ----- Check for incompatible options + if (isset($v_result_list[PCLZIP_OPT_TEMP_FILE_OFF])) { + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Option '".PclZipUtilOptionText($p_options_list[$i])."' can not be used with option 'PCLZIP_OPT_TEMP_FILE_OFF'"); + return PclZip::errorCode(); + } + + $v_result_list[$p_options_list[$i]] = true; + break; + + case PCLZIP_OPT_TEMP_FILE_OFF : + // ----- Check for incompatible options + if (isset($v_result_list[PCLZIP_OPT_TEMP_FILE_ON])) { + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Option '".PclZipUtilOptionText($p_options_list[$i])."' can not be used with option 'PCLZIP_OPT_TEMP_FILE_ON'"); + return PclZip::errorCode(); + } + // ----- Check for incompatible options + if (isset($v_result_list[PCLZIP_OPT_TEMP_FILE_THRESHOLD])) { + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Option '".PclZipUtilOptionText($p_options_list[$i])."' can not be used with option 'PCLZIP_OPT_TEMP_FILE_THRESHOLD'"); + return PclZip::errorCode(); + } + + $v_result_list[$p_options_list[$i]] = true; + break; + + case PCLZIP_OPT_EXTRACT_DIR_RESTRICTION : + // ----- Check the number of parameters + if (($i+1) >= $p_size) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'"); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Get the value + if ( is_string($p_options_list[$i+1]) + && ($p_options_list[$i+1] != '')) { + $v_result_list[$p_options_list[$i]] = PclZipUtilTranslateWinPath($p_options_list[$i+1], FALSE); + $i++; + } + else { + } + break; + + // ----- Look for options that request an array of string for value + case PCLZIP_OPT_BY_NAME : + // ----- Check the number of parameters + if (($i+1) >= $p_size) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'"); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Get the value + if (is_string($p_options_list[$i+1])) { + $v_result_list[$p_options_list[$i]][0] = $p_options_list[$i+1]; + } + else if (is_array($p_options_list[$i+1])) { + $v_result_list[$p_options_list[$i]] = $p_options_list[$i+1]; + } + else { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, "Wrong parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'"); + + // ----- Return + return PclZip::errorCode(); + } + $i++; + break; + + // ----- Look for options that request an EREG or PREG expression + case PCLZIP_OPT_BY_EREG : + // ereg() is deprecated starting with PHP 5.3. Move PCLZIP_OPT_BY_EREG + // to PCLZIP_OPT_BY_PREG + $p_options_list[$i] = PCLZIP_OPT_BY_PREG; + case PCLZIP_OPT_BY_PREG : + //case PCLZIP_OPT_CRYPT : + // ----- Check the number of parameters + if (($i+1) >= $p_size) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'"); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Get the value + if (is_string($p_options_list[$i+1])) { + $v_result_list[$p_options_list[$i]] = $p_options_list[$i+1]; + } + else { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, "Wrong parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'"); + + // ----- Return + return PclZip::errorCode(); + } + $i++; + break; + + // ----- Look for options that takes a string + case PCLZIP_OPT_COMMENT : + case PCLZIP_OPT_ADD_COMMENT : + case PCLZIP_OPT_PREPEND_COMMENT : + // ----- Check the number of parameters + if (($i+1) >= $p_size) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, + "Missing parameter value for option '" + .PclZipUtilOptionText($p_options_list[$i]) + ."'"); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Get the value + if (is_string($p_options_list[$i+1])) { + $v_result_list[$p_options_list[$i]] = $p_options_list[$i+1]; + } + else { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, + "Wrong parameter value for option '" + .PclZipUtilOptionText($p_options_list[$i]) + ."'"); + + // ----- Return + return PclZip::errorCode(); + } + $i++; + break; + + // ----- Look for options that request an array of index + case PCLZIP_OPT_BY_INDEX : + // ----- Check the number of parameters + if (($i+1) >= $p_size) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'"); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Get the value + $v_work_list = array(); + if (is_string($p_options_list[$i+1])) { + + // ----- Remove spaces + $p_options_list[$i+1] = strtr($p_options_list[$i+1], ' ', ''); + + // ----- Parse items + $v_work_list = explode(",", $p_options_list[$i+1]); + } + else if (is_integer($p_options_list[$i+1])) { + $v_work_list[0] = $p_options_list[$i+1].'-'.$p_options_list[$i+1]; + } + else if (is_array($p_options_list[$i+1])) { + $v_work_list = $p_options_list[$i+1]; + } + else { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, "Value must be integer, string or array for option '".PclZipUtilOptionText($p_options_list[$i])."'"); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Reduce the index list + // each index item in the list must be a couple with a start and + // an end value : [0,3], [5-5], [8-10], ... + // ----- Check the format of each item + $v_sort_flag=false; + $v_sort_value=0; + for ($j=0; $j= $p_size) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'"); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Get the value + $v_result_list[$p_options_list[$i]] = $p_options_list[$i+1]; + $i++; + break; + + // ----- Look for options that request a call-back + case PCLZIP_CB_PRE_EXTRACT : + case PCLZIP_CB_POST_EXTRACT : + case PCLZIP_CB_PRE_ADD : + case PCLZIP_CB_POST_ADD : + /* for futur use + case PCLZIP_CB_PRE_DELETE : + case PCLZIP_CB_POST_DELETE : + case PCLZIP_CB_PRE_LIST : + case PCLZIP_CB_POST_LIST : + */ + // ----- Check the number of parameters + if (($i+1) >= $p_size) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'"); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Get the value + $v_function_name = $p_options_list[$i+1]; + + // ----- Check that the value is a valid existing function + if (!function_exists($v_function_name)) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, "Function '".$v_function_name."()' is not an existing function for option '".PclZipUtilOptionText($p_options_list[$i])."'"); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Set the attribute + $v_result_list[$p_options_list[$i]] = $v_function_name; + $i++; + break; + + default : + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, + "Unknown parameter '" + .$p_options_list[$i]."'"); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Next options + $i++; + } + + // ----- Look for mandatory options + if ($v_requested_options !== false) { + for ($key=reset($v_requested_options); $key=key($v_requested_options); $key=next($v_requested_options)) { + // ----- Look for mandatory option + if ($v_requested_options[$key] == 'mandatory') { + // ----- Look if present + if (!isset($v_result_list[$key])) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Missing mandatory parameter ".PclZipUtilOptionText($key)."(".$key.")"); + + // ----- Return + return PclZip::errorCode(); + } + } + } + } + + // ----- Look for default values + if (!isset($v_result_list[PCLZIP_OPT_TEMP_FILE_THRESHOLD])) { + + } + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privOptionDefaultThreshold() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function privOptionDefaultThreshold(&$p_options) + { + $v_result=1; + + if (isset($p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD]) + || isset($p_options[PCLZIP_OPT_TEMP_FILE_OFF])) { + return $v_result; + } + + // ----- Get 'memory_limit' configuration value + $v_memory_limit = ini_get('memory_limit'); + $v_memory_limit = trim($v_memory_limit); + $last = strtolower(substr($v_memory_limit, -1)); + + if($last == 'g') + //$v_memory_limit = $v_memory_limit*1024*1024*1024; + $v_memory_limit = $v_memory_limit*1073741824; + if($last == 'm') + //$v_memory_limit = $v_memory_limit*1024*1024; + $v_memory_limit = $v_memory_limit*1048576; + if($last == 'k') + $v_memory_limit = $v_memory_limit*1024; + + $p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD] = floor($v_memory_limit*PCLZIP_TEMPORARY_FILE_RATIO); + + + // ----- Sanity check : No threshold if value lower than 1M + if ($p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD] < 1048576) { + unset($p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD]); + } + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privFileDescrParseAtt() + // Description : + // Parameters : + // Return Values : + // 1 on success. + // 0 on failure. + // -------------------------------------------------------------------------------- + function privFileDescrParseAtt(&$p_file_list, &$p_filedescr, $v_options, $v_requested_options=false) + { + $v_result=1; + + // ----- For each file in the list check the attributes + foreach ($p_file_list as $v_key => $v_value) { + + // ----- Check if the option is supported + if (!isset($v_requested_options[$v_key])) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid file attribute '".$v_key."' for this file"); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Look for attribute + switch ($v_key) { + case PCLZIP_ATT_FILE_NAME : + if (!is_string($v_value)) { + PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid type ".gettype($v_value).". String expected for attribute '".PclZipUtilOptionText($v_key)."'"); + return PclZip::errorCode(); + } + + $p_filedescr['filename'] = PclZipUtilPathReduction($v_value); + + if ($p_filedescr['filename'] == '') { + PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid empty filename for attribute '".PclZipUtilOptionText($v_key)."'"); + return PclZip::errorCode(); + } + + break; + + case PCLZIP_ATT_FILE_NEW_SHORT_NAME : + if (!is_string($v_value)) { + PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid type ".gettype($v_value).". String expected for attribute '".PclZipUtilOptionText($v_key)."'"); + return PclZip::errorCode(); + } + + $p_filedescr['new_short_name'] = PclZipUtilPathReduction($v_value); + + if ($p_filedescr['new_short_name'] == '') { + PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid empty short filename for attribute '".PclZipUtilOptionText($v_key)."'"); + return PclZip::errorCode(); + } + break; + + case PCLZIP_ATT_FILE_NEW_FULL_NAME : + if (!is_string($v_value)) { + PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid type ".gettype($v_value).". String expected for attribute '".PclZipUtilOptionText($v_key)."'"); + return PclZip::errorCode(); + } + + $p_filedescr['new_full_name'] = PclZipUtilPathReduction($v_value); + + if ($p_filedescr['new_full_name'] == '') { + PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid empty full filename for attribute '".PclZipUtilOptionText($v_key)."'"); + return PclZip::errorCode(); + } + break; + + // ----- Look for options that takes a string + case PCLZIP_ATT_FILE_COMMENT : + if (!is_string($v_value)) { + PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid type ".gettype($v_value).". String expected for attribute '".PclZipUtilOptionText($v_key)."'"); + return PclZip::errorCode(); + } + + $p_filedescr['comment'] = $v_value; + break; + + case PCLZIP_ATT_FILE_MTIME : + if (!is_integer($v_value)) { + PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid type ".gettype($v_value).". Integer expected for attribute '".PclZipUtilOptionText($v_key)."'"); + return PclZip::errorCode(); + } + + $p_filedescr['mtime'] = $v_value; + break; + + case PCLZIP_ATT_FILE_CONTENT : + $p_filedescr['content'] = $v_value; + break; + + default : + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, + "Unknown parameter '".$v_key."'"); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Look for mandatory options + if ($v_requested_options !== false) { + for ($key=reset($v_requested_options); $key=key($v_requested_options); $key=next($v_requested_options)) { + // ----- Look for mandatory option + if ($v_requested_options[$key] == 'mandatory') { + // ----- Look if present + if (!isset($p_file_list[$key])) { + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Missing mandatory parameter ".PclZipUtilOptionText($key)."(".$key.")"); + return PclZip::errorCode(); + } + } + } + } + + // end foreach + } + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privFileDescrExpand() + // Description : + // This method look for each item of the list to see if its a file, a folder + // or a string to be added as file. For any other type of files (link, other) + // just ignore the item. + // Then prepare the information that will be stored for that file. + // When its a folder, expand the folder with all the files that are in that + // folder (recursively). + // Parameters : + // Return Values : + // 1 on success. + // 0 on failure. + // -------------------------------------------------------------------------------- + function privFileDescrExpand(&$p_filedescr_list, &$p_options) + { + $v_result=1; + + // ----- Create a result list + $v_result_list = array(); + + // ----- Look each entry + for ($i=0; $iprivCalculateStoredFilename($v_descr, $p_options); + + // ----- Add the descriptor in result list + $v_result_list[sizeof($v_result_list)] = $v_descr; + + // ----- Look for folder + if ($v_descr['type'] == 'folder') { + // ----- List of items in folder + $v_dirlist_descr = array(); + $v_dirlist_nb = 0; + if ($v_folder_handler = @opendir($v_descr['filename'])) { + while (($v_item_handler = @readdir($v_folder_handler)) !== false) { + + // ----- Skip '.' and '..' + if (($v_item_handler == '.') || ($v_item_handler == '..')) { + continue; + } + + // ----- Compose the full filename + $v_dirlist_descr[$v_dirlist_nb]['filename'] = $v_descr['filename'].'/'.$v_item_handler; + + // ----- Look for different stored filename + // Because the name of the folder was changed, the name of the + // files/sub-folders also change + if (($v_descr['stored_filename'] != $v_descr['filename']) + && (!isset($p_options[PCLZIP_OPT_REMOVE_ALL_PATH]))) { + if ($v_descr['stored_filename'] != '') { + $v_dirlist_descr[$v_dirlist_nb]['new_full_name'] = $v_descr['stored_filename'].'/'.$v_item_handler; + } + else { + $v_dirlist_descr[$v_dirlist_nb]['new_full_name'] = $v_item_handler; + } + } + + $v_dirlist_nb++; + } + + @closedir($v_folder_handler); + } + else { + // TBC : unable to open folder in read mode + } + + // ----- Expand each element of the list + if ($v_dirlist_nb != 0) { + // ----- Expand + if (($v_result = $this->privFileDescrExpand($v_dirlist_descr, $p_options)) != 1) { + return $v_result; + } + + // ----- Concat the resulting list + $v_result_list = array_merge($v_result_list, $v_dirlist_descr); + } + else { + } + + // ----- Free local array + unset($v_dirlist_descr); + } + } + + // ----- Get the result list + $p_filedescr_list = $v_result_list; + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privCreate() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function privCreate($p_filedescr_list, &$p_result_list, &$p_options) + { + $v_result=1; + $v_list_detail = array(); + + // ----- Magic quotes trick + $this->privDisableMagicQuotes(); + + // ----- Open the file in write mode + if (($v_result = $this->privOpenFd('wb')) != 1) + { + // ----- Return + return $v_result; + } + + // ----- Add the list of files + $v_result = $this->privAddList($p_filedescr_list, $p_result_list, $p_options); + + // ----- Close + $this->privCloseFd(); + + // ----- Magic quotes trick + $this->privSwapBackMagicQuotes(); + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privAdd() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function privAdd($p_filedescr_list, &$p_result_list, &$p_options) + { + $v_result=1; + $v_list_detail = array(); + + // ----- Look if the archive exists or is empty + if ((!is_file($this->zipname)) || (filesize($this->zipname) == 0)) + { + + // ----- Do a create + $v_result = $this->privCreate($p_filedescr_list, $p_result_list, $p_options); + + // ----- Return + return $v_result; + } + // ----- Magic quotes trick + $this->privDisableMagicQuotes(); + + // ----- Open the zip file + if (($v_result=$this->privOpenFd('rb')) != 1) + { + // ----- Magic quotes trick + $this->privSwapBackMagicQuotes(); + + // ----- Return + return $v_result; + } + + // ----- Read the central directory informations + $v_central_dir = array(); + if (($v_result = $this->privReadEndCentralDir($v_central_dir)) != 1) + { + $this->privCloseFd(); + $this->privSwapBackMagicQuotes(); + return $v_result; + } + + // ----- Go to beginning of File + @rewind($this->zip_fd); + + // ----- Creates a temporay file + $v_zip_temp_name = PCLZIP_TEMPORARY_DIR.uniqid('pclzip-').'.tmp'; + + // ----- Open the temporary file in write mode + if (($v_zip_temp_fd = @fopen($v_zip_temp_name, 'wb')) == 0) + { + $this->privCloseFd(); + $this->privSwapBackMagicQuotes(); + + PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open temporary file \''.$v_zip_temp_name.'\' in binary write mode'); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Copy the files from the archive to the temporary file + // TBC : Here I should better append the file and go back to erase the central dir + $v_size = $v_central_dir['offset']; + while ($v_size != 0) + { + $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); + $v_buffer = fread($this->zip_fd, $v_read_size); + @fwrite($v_zip_temp_fd, $v_buffer, $v_read_size); + $v_size -= $v_read_size; + } + + // ----- Swap the file descriptor + // Here is a trick : I swap the temporary fd with the zip fd, in order to use + // the following methods on the temporary fil and not the real archive + $v_swap = $this->zip_fd; + $this->zip_fd = $v_zip_temp_fd; + $v_zip_temp_fd = $v_swap; + + // ----- Add the files + $v_header_list = array(); + if (($v_result = $this->privAddFileList($p_filedescr_list, $v_header_list, $p_options)) != 1) + { + fclose($v_zip_temp_fd); + $this->privCloseFd(); + @unlink($v_zip_temp_name); + $this->privSwapBackMagicQuotes(); + + // ----- Return + return $v_result; + } + + // ----- Store the offset of the central dir + $v_offset = @ftell($this->zip_fd); + + // ----- Copy the block of file headers from the old archive + $v_size = $v_central_dir['size']; + while ($v_size != 0) + { + $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); + $v_buffer = @fread($v_zip_temp_fd, $v_read_size); + @fwrite($this->zip_fd, $v_buffer, $v_read_size); + $v_size -= $v_read_size; + } + + // ----- Create the Central Dir files header + for ($i=0, $v_count=0; $iprivWriteCentralFileHeader($v_header_list[$i])) != 1) { + fclose($v_zip_temp_fd); + $this->privCloseFd(); + @unlink($v_zip_temp_name); + $this->privSwapBackMagicQuotes(); + + // ----- Return + return $v_result; + } + $v_count++; + } + + // ----- Transform the header to a 'usable' info + $this->privConvertHeader2FileInfo($v_header_list[$i], $p_result_list[$i]); + } + + // ----- Zip file comment + $v_comment = $v_central_dir['comment']; + if (isset($p_options[PCLZIP_OPT_COMMENT])) { + $v_comment = $p_options[PCLZIP_OPT_COMMENT]; + } + if (isset($p_options[PCLZIP_OPT_ADD_COMMENT])) { + $v_comment = $v_comment.$p_options[PCLZIP_OPT_ADD_COMMENT]; + } + if (isset($p_options[PCLZIP_OPT_PREPEND_COMMENT])) { + $v_comment = $p_options[PCLZIP_OPT_PREPEND_COMMENT].$v_comment; + } + + // ----- Calculate the size of the central header + $v_size = @ftell($this->zip_fd)-$v_offset; + + // ----- Create the central dir footer + if (($v_result = $this->privWriteCentralHeader($v_count+$v_central_dir['entries'], $v_size, $v_offset, $v_comment)) != 1) + { + // ----- Reset the file list + unset($v_header_list); + $this->privSwapBackMagicQuotes(); + + // ----- Return + return $v_result; + } + + // ----- Swap back the file descriptor + $v_swap = $this->zip_fd; + $this->zip_fd = $v_zip_temp_fd; + $v_zip_temp_fd = $v_swap; + + // ----- Close + $this->privCloseFd(); + + // ----- Close the temporary file + @fclose($v_zip_temp_fd); + + // ----- Magic quotes trick + $this->privSwapBackMagicQuotes(); + + // ----- Delete the zip file + // TBC : I should test the result ... + @unlink($this->zipname); + + // ----- Rename the temporary file + // TBC : I should test the result ... + //@rename($v_zip_temp_name, $this->zipname); + PclZipUtilRename($v_zip_temp_name, $this->zipname); + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privOpenFd() + // Description : + // Parameters : + // -------------------------------------------------------------------------------- + function privOpenFd($p_mode) + { + $v_result=1; + + // ----- Look if already open + if ($this->zip_fd != 0) + { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Zip file \''.$this->zipname.'\' already open'); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Open the zip file + if (($this->zip_fd = @fopen($this->zipname, $p_mode)) == 0) + { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open archive \''.$this->zipname.'\' in '.$p_mode.' mode'); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privCloseFd() + // Description : + // Parameters : + // -------------------------------------------------------------------------------- + function privCloseFd() + { + $v_result=1; + + if ($this->zip_fd != 0) + @fclose($this->zip_fd); + $this->zip_fd = 0; + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privAddList() + // Description : + // $p_add_dir and $p_remove_dir will give the ability to memorize a path which is + // different from the real path of the file. This is usefull if you want to have PclTar + // running in any directory, and memorize relative path from an other directory. + // Parameters : + // $p_list : An array containing the file or directory names to add in the tar + // $p_result_list : list of added files with their properties (specially the status field) + // $p_add_dir : Path to add in the filename path archived + // $p_remove_dir : Path to remove in the filename path archived + // Return Values : + // -------------------------------------------------------------------------------- +// function privAddList($p_list, &$p_result_list, $p_add_dir, $p_remove_dir, $p_remove_all_dir, &$p_options) + function privAddList($p_filedescr_list, &$p_result_list, &$p_options) + { + $v_result=1; + + // ----- Add the files + $v_header_list = array(); + if (($v_result = $this->privAddFileList($p_filedescr_list, $v_header_list, $p_options)) != 1) + { + // ----- Return + return $v_result; + } + + // ----- Store the offset of the central dir + $v_offset = @ftell($this->zip_fd); + + // ----- Create the Central Dir files header + for ($i=0,$v_count=0; $iprivWriteCentralFileHeader($v_header_list[$i])) != 1) { + // ----- Return + return $v_result; + } + $v_count++; + } + + // ----- Transform the header to a 'usable' info + $this->privConvertHeader2FileInfo($v_header_list[$i], $p_result_list[$i]); + } + + // ----- Zip file comment + $v_comment = ''; + if (isset($p_options[PCLZIP_OPT_COMMENT])) { + $v_comment = $p_options[PCLZIP_OPT_COMMENT]; + } + + // ----- Calculate the size of the central header + $v_size = @ftell($this->zip_fd)-$v_offset; + + // ----- Create the central dir footer + if (($v_result = $this->privWriteCentralHeader($v_count, $v_size, $v_offset, $v_comment)) != 1) + { + // ----- Reset the file list + unset($v_header_list); + + // ----- Return + return $v_result; + } + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privAddFileList() + // Description : + // Parameters : + // $p_filedescr_list : An array containing the file description + // or directory names to add in the zip + // $p_result_list : list of added files with their properties (specially the status field) + // Return Values : + // -------------------------------------------------------------------------------- + function privAddFileList($p_filedescr_list, &$p_result_list, &$p_options) + { + $v_result=1; + $v_header = array(); + + // ----- Recuperate the current number of elt in list + $v_nb = sizeof($p_result_list); + + // ----- Loop on the files + for ($j=0; ($jprivAddFile($p_filedescr_list[$j], $v_header, + $p_options); + if ($v_result != 1) { + return $v_result; + } + + // ----- Store the file infos + $p_result_list[$v_nb++] = $v_header; + } + } + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privAddFile() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function privAddFile($p_filedescr, &$p_header, &$p_options) + { + $v_result=1; + + // ----- Working variable + $p_filename = $p_filedescr['filename']; + + // TBC : Already done in the fileAtt check ... ? + if ($p_filename == "") { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid file list parameter (invalid or empty list)"); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Look for a stored different filename + /* TBC : Removed + if (isset($p_filedescr['stored_filename'])) { + $v_stored_filename = $p_filedescr['stored_filename']; + } + else { + $v_stored_filename = $p_filedescr['stored_filename']; + } + */ + + // ----- Set the file properties + clearstatcache(); + $p_header['version'] = 20; + $p_header['version_extracted'] = 10; + $p_header['flag'] = 0; + $p_header['compression'] = 0; + $p_header['crc'] = 0; + $p_header['compressed_size'] = 0; + $p_header['filename_len'] = strlen($p_filename); + $p_header['extra_len'] = 0; + $p_header['disk'] = 0; + $p_header['internal'] = 0; + $p_header['offset'] = 0; + $p_header['filename'] = $p_filename; +// TBC : Removed $p_header['stored_filename'] = $v_stored_filename; + $p_header['stored_filename'] = $p_filedescr['stored_filename']; + $p_header['extra'] = ''; + $p_header['status'] = 'ok'; + $p_header['index'] = -1; + + // ----- Look for regular file + if ($p_filedescr['type']=='file') { + $p_header['external'] = 0x00000000; + $p_header['size'] = filesize($p_filename); + } + + // ----- Look for regular folder + else if ($p_filedescr['type']=='folder') { + $p_header['external'] = 0x00000010; + $p_header['mtime'] = filemtime($p_filename); + $p_header['size'] = filesize($p_filename); + } + + // ----- Look for virtual file + else if ($p_filedescr['type'] == 'virtual_file') { + $p_header['external'] = 0x00000000; + $p_header['size'] = strlen($p_filedescr['content']); + } + + + // ----- Look for filetime + if (isset($p_filedescr['mtime'])) { + $p_header['mtime'] = $p_filedescr['mtime']; + } + else if ($p_filedescr['type'] == 'virtual_file') { + $p_header['mtime'] = time(); + } + else { + $p_header['mtime'] = filemtime($p_filename); + } + + // ------ Look for file comment + if (isset($p_filedescr['comment'])) { + $p_header['comment_len'] = strlen($p_filedescr['comment']); + $p_header['comment'] = $p_filedescr['comment']; + } + else { + $p_header['comment_len'] = 0; + $p_header['comment'] = ''; + } + + // ----- Look for pre-add callback + if (isset($p_options[PCLZIP_CB_PRE_ADD])) { + + // ----- Generate a local information + $v_local_header = array(); + $this->privConvertHeader2FileInfo($p_header, $v_local_header); + + // ----- Call the callback + // Here I do not use call_user_func() because I need to send a reference to the + // header. + $v_result = $p_options[PCLZIP_CB_PRE_ADD](PCLZIP_CB_PRE_ADD, $v_local_header); + if ($v_result == 0) { + // ----- Change the file status + $p_header['status'] = "skipped"; + $v_result = 1; + } + + // ----- Update the informations + // Only some fields can be modified + if ($p_header['stored_filename'] != $v_local_header['stored_filename']) { + $p_header['stored_filename'] = PclZipUtilPathReduction($v_local_header['stored_filename']); + } + } + + // ----- Look for empty stored filename + if ($p_header['stored_filename'] == "") { + $p_header['status'] = "filtered"; + } + + // ----- Check the path length + if (strlen($p_header['stored_filename']) > 0xFF) { + $p_header['status'] = 'filename_too_long'; + } + + // ----- Look if no error, or file not skipped + if ($p_header['status'] == 'ok') { + + // ----- Look for a file + if ($p_filedescr['type'] == 'file') { + // ----- Look for using temporary file to zip + if ( (!isset($p_options[PCLZIP_OPT_TEMP_FILE_OFF])) + && (isset($p_options[PCLZIP_OPT_TEMP_FILE_ON]) + || (isset($p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD]) + && ($p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD] <= $p_header['size'])) ) ) { + $v_result = $this->privAddFileUsingTempFile($p_filedescr, $p_header, $p_options); + if ($v_result < PCLZIP_ERR_NO_ERROR) { + return $v_result; + } + } + + // ----- Use "in memory" zip algo + else { + + // ----- Open the source file + if (($v_file = @fopen($p_filename, "rb")) == 0) { + PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, "Unable to open file '$p_filename' in binary read mode"); + return PclZip::errorCode(); + } + + // ----- Read the file content + $v_content = @fread($v_file, $p_header['size']); + + // ----- Close the file + @fclose($v_file); + + // ----- Calculate the CRC + $p_header['crc'] = @crc32($v_content); + + // ----- Look for no compression + if ($p_options[PCLZIP_OPT_NO_COMPRESSION]) { + // ----- Set header parameters + $p_header['compressed_size'] = $p_header['size']; + $p_header['compression'] = 0; + } + + // ----- Look for normal compression + else { + // ----- Compress the content + $v_content = @gzdeflate($v_content); + + // ----- Set header parameters + $p_header['compressed_size'] = strlen($v_content); + $p_header['compression'] = 8; + } + + // ----- Call the header generation + if (($v_result = $this->privWriteFileHeader($p_header)) != 1) { + @fclose($v_file); + return $v_result; + } + + // ----- Write the compressed (or not) content + @fwrite($this->zip_fd, $v_content, $p_header['compressed_size']); + + } + + } + + // ----- Look for a virtual file (a file from string) + else if ($p_filedescr['type'] == 'virtual_file') { + + $v_content = $p_filedescr['content']; + + // ----- Calculate the CRC + $p_header['crc'] = @crc32($v_content); + + // ----- Look for no compression + if ($p_options[PCLZIP_OPT_NO_COMPRESSION]) { + // ----- Set header parameters + $p_header['compressed_size'] = $p_header['size']; + $p_header['compression'] = 0; + } + + // ----- Look for normal compression + else { + // ----- Compress the content + $v_content = @gzdeflate($v_content); + + // ----- Set header parameters + $p_header['compressed_size'] = strlen($v_content); + $p_header['compression'] = 8; + } + + // ----- Call the header generation + if (($v_result = $this->privWriteFileHeader($p_header)) != 1) { + @fclose($v_file); + return $v_result; + } + + // ----- Write the compressed (or not) content + @fwrite($this->zip_fd, $v_content, $p_header['compressed_size']); + } + + // ----- Look for a directory + else if ($p_filedescr['type'] == 'folder') { + // ----- Look for directory last '/' + if (@substr($p_header['stored_filename'], -1) != '/') { + $p_header['stored_filename'] .= '/'; + } + + // ----- Set the file properties + $p_header['size'] = 0; + //$p_header['external'] = 0x41FF0010; // Value for a folder : to be checked + $p_header['external'] = 0x00000010; // Value for a folder : to be checked + + // ----- Call the header generation + if (($v_result = $this->privWriteFileHeader($p_header)) != 1) + { + return $v_result; + } + } + } + + // ----- Look for post-add callback + if (isset($p_options[PCLZIP_CB_POST_ADD])) { + + // ----- Generate a local information + $v_local_header = array(); + $this->privConvertHeader2FileInfo($p_header, $v_local_header); + + // ----- Call the callback + // Here I do not use call_user_func() because I need to send a reference to the + // header. + $v_result = $p_options[PCLZIP_CB_POST_ADD](PCLZIP_CB_POST_ADD, $v_local_header); + if ($v_result == 0) { + // ----- Ignored + $v_result = 1; + } + + // ----- Update the informations + // Nothing can be modified + } + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privAddFileUsingTempFile() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function privAddFileUsingTempFile($p_filedescr, &$p_header, &$p_options) + { + $v_result=PCLZIP_ERR_NO_ERROR; + + // ----- Working variable + $p_filename = $p_filedescr['filename']; + + + // ----- Open the source file + if (($v_file = @fopen($p_filename, "rb")) == 0) { + PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, "Unable to open file '$p_filename' in binary read mode"); + return PclZip::errorCode(); + } + + // ----- Creates a compressed temporary file + $v_gzip_temp_name = PCLZIP_TEMPORARY_DIR.uniqid('pclzip-').'.gz'; + if (($v_file_compressed = @gzopen($v_gzip_temp_name, "wb")) == 0) { + fclose($v_file); + PclZip::privErrorLog(PCLZIP_ERR_WRITE_OPEN_FAIL, 'Unable to open temporary file \''.$v_gzip_temp_name.'\' in binary write mode'); + return PclZip::errorCode(); + } + + // ----- Read the file by PCLZIP_READ_BLOCK_SIZE octets blocks + $v_size = filesize($p_filename); + while ($v_size != 0) { + $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); + $v_buffer = @fread($v_file, $v_read_size); + //$v_binary_data = pack('a'.$v_read_size, $v_buffer); + @gzputs($v_file_compressed, $v_buffer, $v_read_size); + $v_size -= $v_read_size; + } + + // ----- Close the file + @fclose($v_file); + @gzclose($v_file_compressed); + + // ----- Check the minimum file size + if (filesize($v_gzip_temp_name) < 18) { + PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, 'gzip temporary file \''.$v_gzip_temp_name.'\' has invalid filesize - should be minimum 18 bytes'); + return PclZip::errorCode(); + } + + // ----- Extract the compressed attributes + if (($v_file_compressed = @fopen($v_gzip_temp_name, "rb")) == 0) { + PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open temporary file \''.$v_gzip_temp_name.'\' in binary read mode'); + return PclZip::errorCode(); + } + + // ----- Read the gzip file header + $v_binary_data = @fread($v_file_compressed, 10); + $v_data_header = unpack('a1id1/a1id2/a1cm/a1flag/Vmtime/a1xfl/a1os', $v_binary_data); + + // ----- Check some parameters + $v_data_header['os'] = bin2hex($v_data_header['os']); + + // ----- Read the gzip file footer + @fseek($v_file_compressed, filesize($v_gzip_temp_name)-8); + $v_binary_data = @fread($v_file_compressed, 8); + $v_data_footer = unpack('Vcrc/Vcompressed_size', $v_binary_data); + + // ----- Set the attributes + $p_header['compression'] = ord($v_data_header['cm']); + //$p_header['mtime'] = $v_data_header['mtime']; + $p_header['crc'] = $v_data_footer['crc']; + $p_header['compressed_size'] = filesize($v_gzip_temp_name)-18; + + // ----- Close the file + @fclose($v_file_compressed); + + // ----- Call the header generation + if (($v_result = $this->privWriteFileHeader($p_header)) != 1) { + return $v_result; + } + + // ----- Add the compressed data + if (($v_file_compressed = @fopen($v_gzip_temp_name, "rb")) == 0) + { + PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open temporary file \''.$v_gzip_temp_name.'\' in binary read mode'); + return PclZip::errorCode(); + } + + // ----- Read the file by PCLZIP_READ_BLOCK_SIZE octets blocks + fseek($v_file_compressed, 10); + $v_size = $p_header['compressed_size']; + while ($v_size != 0) + { + $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); + $v_buffer = @fread($v_file_compressed, $v_read_size); + //$v_binary_data = pack('a'.$v_read_size, $v_buffer); + @fwrite($this->zip_fd, $v_buffer, $v_read_size); + $v_size -= $v_read_size; + } + + // ----- Close the file + @fclose($v_file_compressed); + + // ----- Unlink the temporary file + @unlink($v_gzip_temp_name); + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privCalculateStoredFilename() + // Description : + // Based on file descriptor properties and global options, this method + // calculate the filename that will be stored in the archive. + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function privCalculateStoredFilename(&$p_filedescr, &$p_options) + { + $v_result=1; + + // ----- Working variables + $p_filename = $p_filedescr['filename']; + if (isset($p_options[PCLZIP_OPT_ADD_PATH])) { + $p_add_dir = $p_options[PCLZIP_OPT_ADD_PATH]; + } + else { + $p_add_dir = ''; + } + if (isset($p_options[PCLZIP_OPT_REMOVE_PATH])) { + $p_remove_dir = $p_options[PCLZIP_OPT_REMOVE_PATH]; + } + else { + $p_remove_dir = ''; + } + if (isset($p_options[PCLZIP_OPT_REMOVE_ALL_PATH])) { + $p_remove_all_dir = $p_options[PCLZIP_OPT_REMOVE_ALL_PATH]; + } + else { + $p_remove_all_dir = 0; + } + + + // ----- Look for full name change + if (isset($p_filedescr['new_full_name'])) { + // ----- Remove drive letter if any + $v_stored_filename = PclZipUtilTranslateWinPath($p_filedescr['new_full_name']); + } + + // ----- Look for path and/or short name change + else { + + // ----- Look for short name change + // Its when we cahnge just the filename but not the path + if (isset($p_filedescr['new_short_name'])) { + $v_path_info = pathinfo($p_filename); + $v_dir = ''; + if ($v_path_info['dirname'] != '') { + $v_dir = $v_path_info['dirname'].'/'; + } + $v_stored_filename = $v_dir.$p_filedescr['new_short_name']; + } + else { + // ----- Calculate the stored filename + $v_stored_filename = $p_filename; + } + + // ----- Look for all path to remove + if ($p_remove_all_dir) { + $v_stored_filename = basename($p_filename); + } + // ----- Look for partial path remove + else if ($p_remove_dir != "") { + if (substr($p_remove_dir, -1) != '/') + $p_remove_dir .= "/"; + + if ( (substr($p_filename, 0, 2) == "./") + || (substr($p_remove_dir, 0, 2) == "./")) { + + if ( (substr($p_filename, 0, 2) == "./") + && (substr($p_remove_dir, 0, 2) != "./")) { + $p_remove_dir = "./".$p_remove_dir; + } + if ( (substr($p_filename, 0, 2) != "./") + && (substr($p_remove_dir, 0, 2) == "./")) { + $p_remove_dir = substr($p_remove_dir, 2); + } + } + + $v_compare = PclZipUtilPathInclusion($p_remove_dir, + $v_stored_filename); + if ($v_compare > 0) { + if ($v_compare == 2) { + $v_stored_filename = ""; + } + else { + $v_stored_filename = substr($v_stored_filename, + strlen($p_remove_dir)); + } + } + } + + // ----- Remove drive letter if any + $v_stored_filename = PclZipUtilTranslateWinPath($v_stored_filename); + + // ----- Look for path to add + if ($p_add_dir != "") { + if (substr($p_add_dir, -1) == "/") + $v_stored_filename = $p_add_dir.$v_stored_filename; + else + $v_stored_filename = $p_add_dir."/".$v_stored_filename; + } + } + + // ----- Filename (reduce the path of stored name) + $v_stored_filename = PclZipUtilPathReduction($v_stored_filename); + $p_filedescr['stored_filename'] = $v_stored_filename; + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privWriteFileHeader() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function privWriteFileHeader(&$p_header) + { + $v_result=1; + + // ----- Store the offset position of the file + $p_header['offset'] = ftell($this->zip_fd); + + // ----- Transform UNIX mtime to DOS format mdate/mtime + $v_date = getdate($p_header['mtime']); + $v_mtime = ($v_date['hours']<<11) + ($v_date['minutes']<<5) + $v_date['seconds']/2; + $v_mdate = (($v_date['year']-1980)<<9) + ($v_date['mon']<<5) + $v_date['mday']; + + // ----- Packed data + $v_binary_data = pack("VvvvvvVVVvv", 0x04034b50, + $p_header['version_extracted'], $p_header['flag'], + $p_header['compression'], $v_mtime, $v_mdate, + $p_header['crc'], $p_header['compressed_size'], + $p_header['size'], + strlen($p_header['stored_filename']), + $p_header['extra_len']); + + // ----- Write the first 148 bytes of the header in the archive + fputs($this->zip_fd, $v_binary_data, 30); + + // ----- Write the variable fields + if (strlen($p_header['stored_filename']) != 0) + { + fputs($this->zip_fd, $p_header['stored_filename'], strlen($p_header['stored_filename'])); + } + if ($p_header['extra_len'] != 0) + { + fputs($this->zip_fd, $p_header['extra'], $p_header['extra_len']); + } + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privWriteCentralFileHeader() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function privWriteCentralFileHeader(&$p_header) + { + $v_result=1; + + // TBC + //for(reset($p_header); $key = key($p_header); next($p_header)) { + //} + + // ----- Transform UNIX mtime to DOS format mdate/mtime + $v_date = getdate($p_header['mtime']); + $v_mtime = ($v_date['hours']<<11) + ($v_date['minutes']<<5) + $v_date['seconds']/2; + $v_mdate = (($v_date['year']-1980)<<9) + ($v_date['mon']<<5) + $v_date['mday']; + + + // ----- Packed data + $v_binary_data = pack("VvvvvvvVVVvvvvvVV", 0x02014b50, + $p_header['version'], $p_header['version_extracted'], + $p_header['flag'], $p_header['compression'], + $v_mtime, $v_mdate, $p_header['crc'], + $p_header['compressed_size'], $p_header['size'], + strlen($p_header['stored_filename']), + $p_header['extra_len'], $p_header['comment_len'], + $p_header['disk'], $p_header['internal'], + $p_header['external'], $p_header['offset']); + + // ----- Write the 42 bytes of the header in the zip file + fputs($this->zip_fd, $v_binary_data, 46); + + // ----- Write the variable fields + if (strlen($p_header['stored_filename']) != 0) + { + fputs($this->zip_fd, $p_header['stored_filename'], strlen($p_header['stored_filename'])); + } + if ($p_header['extra_len'] != 0) + { + fputs($this->zip_fd, $p_header['extra'], $p_header['extra_len']); + } + if ($p_header['comment_len'] != 0) + { + fputs($this->zip_fd, $p_header['comment'], $p_header['comment_len']); + } + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privWriteCentralHeader() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function privWriteCentralHeader($p_nb_entries, $p_size, $p_offset, $p_comment) + { + $v_result=1; + + // ----- Packed data + $v_binary_data = pack("VvvvvVVv", 0x06054b50, 0, 0, $p_nb_entries, + $p_nb_entries, $p_size, + $p_offset, strlen($p_comment)); + + // ----- Write the 22 bytes of the header in the zip file + fputs($this->zip_fd, $v_binary_data, 22); + + // ----- Write the variable fields + if (strlen($p_comment) != 0) + { + fputs($this->zip_fd, $p_comment, strlen($p_comment)); + } + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privList() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function privList(&$p_list) + { + $v_result=1; + + // ----- Magic quotes trick + $this->privDisableMagicQuotes(); + + // ----- Open the zip file + if (($this->zip_fd = @fopen($this->zipname, 'rb')) == 0) + { + // ----- Magic quotes trick + $this->privSwapBackMagicQuotes(); + + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open archive \''.$this->zipname.'\' in binary read mode'); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Read the central directory informations + $v_central_dir = array(); + if (($v_result = $this->privReadEndCentralDir($v_central_dir)) != 1) + { + $this->privSwapBackMagicQuotes(); + return $v_result; + } + + // ----- Go to beginning of Central Dir + @rewind($this->zip_fd); + if (@fseek($this->zip_fd, $v_central_dir['offset'])) + { + $this->privSwapBackMagicQuotes(); + + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_ARCHIVE_ZIP, 'Invalid archive size'); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Read each entry + for ($i=0; $i<$v_central_dir['entries']; $i++) + { + // ----- Read the file header + if (($v_result = $this->privReadCentralFileHeader($v_header)) != 1) + { + $this->privSwapBackMagicQuotes(); + return $v_result; + } + $v_header['index'] = $i; + + // ----- Get the only interesting attributes + $this->privConvertHeader2FileInfo($v_header, $p_list[$i]); + unset($v_header); + } + + // ----- Close the zip file + $this->privCloseFd(); + + // ----- Magic quotes trick + $this->privSwapBackMagicQuotes(); + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privConvertHeader2FileInfo() + // Description : + // This function takes the file informations from the central directory + // entries and extract the interesting parameters that will be given back. + // The resulting file infos are set in the array $p_info + // $p_info['filename'] : Filename with full path. Given by user (add), + // extracted in the filesystem (extract). + // $p_info['stored_filename'] : Stored filename in the archive. + // $p_info['size'] = Size of the file. + // $p_info['compressed_size'] = Compressed size of the file. + // $p_info['mtime'] = Last modification date of the file. + // $p_info['comment'] = Comment associated with the file. + // $p_info['folder'] = true/false : indicates if the entry is a folder or not. + // $p_info['status'] = status of the action on the file. + // $p_info['crc'] = CRC of the file content. + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function privConvertHeader2FileInfo($p_header, &$p_info) + { + $v_result=1; + + // ----- Get the interesting attributes + $v_temp_path = PclZipUtilPathReduction($p_header['filename']); + $p_info['filename'] = $v_temp_path; + $v_temp_path = PclZipUtilPathReduction($p_header['stored_filename']); + $p_info['stored_filename'] = $v_temp_path; + $p_info['size'] = $p_header['size']; + $p_info['compressed_size'] = $p_header['compressed_size']; + $p_info['mtime'] = $p_header['mtime']; + $p_info['comment'] = $p_header['comment']; + $p_info['folder'] = (($p_header['external']&0x00000010)==0x00000010); + $p_info['index'] = $p_header['index']; + $p_info['status'] = $p_header['status']; + $p_info['crc'] = $p_header['crc']; + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privExtractByRule() + // Description : + // Extract a file or directory depending of rules (by index, by name, ...) + // Parameters : + // $p_file_list : An array where will be placed the properties of each + // extracted file + // $p_path : Path to add while writing the extracted files + // $p_remove_path : Path to remove (from the file memorized path) while writing the + // extracted files. If the path does not match the file path, + // the file is extracted with its memorized path. + // $p_remove_path does not apply to 'list' mode. + // $p_path and $p_remove_path are commulative. + // Return Values : + // 1 on success,0 or less on error (see error code list) + // -------------------------------------------------------------------------------- + function privExtractByRule(&$p_file_list, $p_path, $p_remove_path, $p_remove_all_path, &$p_options) + { + $v_result=1; + + // ----- Magic quotes trick + $this->privDisableMagicQuotes(); + + // ----- Check the path + if ( ($p_path == "") + || ( (substr($p_path, 0, 1) != "/") + && (substr($p_path, 0, 3) != "../") + && (substr($p_path,1,2)!=":/"))) + $p_path = "./".$p_path; + + // ----- Reduce the path last (and duplicated) '/' + if (($p_path != "./") && ($p_path != "/")) + { + // ----- Look for the path end '/' + while (substr($p_path, -1) == "/") + { + $p_path = substr($p_path, 0, strlen($p_path)-1); + } + } + + // ----- Look for path to remove format (should end by /) + if (($p_remove_path != "") && (substr($p_remove_path, -1) != '/')) + { + $p_remove_path .= '/'; + } + $p_remove_path_size = strlen($p_remove_path); + + // ----- Open the zip file + if (($v_result = $this->privOpenFd('rb')) != 1) + { + $this->privSwapBackMagicQuotes(); + return $v_result; + } + + // ----- Read the central directory informations + $v_central_dir = array(); + if (($v_result = $this->privReadEndCentralDir($v_central_dir)) != 1) + { + // ----- Close the zip file + $this->privCloseFd(); + $this->privSwapBackMagicQuotes(); + + return $v_result; + } + + // ----- Start at beginning of Central Dir + $v_pos_entry = $v_central_dir['offset']; + + // ----- Read each entry + $j_start = 0; + for ($i=0, $v_nb_extracted=0; $i<$v_central_dir['entries']; $i++) + { + + // ----- Read next Central dir entry + @rewind($this->zip_fd); + if (@fseek($this->zip_fd, $v_pos_entry)) + { + // ----- Close the zip file + $this->privCloseFd(); + $this->privSwapBackMagicQuotes(); + + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_ARCHIVE_ZIP, 'Invalid archive size'); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Read the file header + $v_header = array(); + if (($v_result = $this->privReadCentralFileHeader($v_header)) != 1) + { + // ----- Close the zip file + $this->privCloseFd(); + $this->privSwapBackMagicQuotes(); + + return $v_result; + } + + // ----- Store the index + $v_header['index'] = $i; + + // ----- Store the file position + $v_pos_entry = ftell($this->zip_fd); + + // ----- Look for the specific extract rules + $v_extract = false; + + // ----- Look for extract by name rule + if ( (isset($p_options[PCLZIP_OPT_BY_NAME])) + && ($p_options[PCLZIP_OPT_BY_NAME] != 0)) { + + // ----- Look if the filename is in the list + for ($j=0; ($j strlen($p_options[PCLZIP_OPT_BY_NAME][$j])) + && (substr($v_header['stored_filename'], 0, strlen($p_options[PCLZIP_OPT_BY_NAME][$j])) == $p_options[PCLZIP_OPT_BY_NAME][$j])) { + $v_extract = true; + } + } + // ----- Look for a filename + elseif ($v_header['stored_filename'] == $p_options[PCLZIP_OPT_BY_NAME][$j]) { + $v_extract = true; + } + } + } + + // ----- Look for extract by ereg rule + // ereg() is deprecated with PHP 5.3 + /* + else if ( (isset($p_options[PCLZIP_OPT_BY_EREG])) + && ($p_options[PCLZIP_OPT_BY_EREG] != "")) { + + if (ereg($p_options[PCLZIP_OPT_BY_EREG], $v_header['stored_filename'])) { + $v_extract = true; + } + } + */ + + // ----- Look for extract by preg rule + else if ( (isset($p_options[PCLZIP_OPT_BY_PREG])) + && ($p_options[PCLZIP_OPT_BY_PREG] != "")) { + + if (preg_match($p_options[PCLZIP_OPT_BY_PREG], $v_header['stored_filename'])) { + $v_extract = true; + } + } + + // ----- Look for extract by index rule + else if ( (isset($p_options[PCLZIP_OPT_BY_INDEX])) + && ($p_options[PCLZIP_OPT_BY_INDEX] != 0)) { + + // ----- Look if the index is in the list + for ($j=$j_start; ($j=$p_options[PCLZIP_OPT_BY_INDEX][$j]['start']) && ($i<=$p_options[PCLZIP_OPT_BY_INDEX][$j]['end'])) { + $v_extract = true; + } + if ($i>=$p_options[PCLZIP_OPT_BY_INDEX][$j]['end']) { + $j_start = $j+1; + } + + if ($p_options[PCLZIP_OPT_BY_INDEX][$j]['start']>$i) { + break; + } + } + } + + // ----- Look for no rule, which means extract all the archive + else { + $v_extract = true; + } + + // ----- Check compression method + if ( ($v_extract) + && ( ($v_header['compression'] != 8) + && ($v_header['compression'] != 0))) { + $v_header['status'] = 'unsupported_compression'; + + // ----- Look for PCLZIP_OPT_STOP_ON_ERROR + if ( (isset($p_options[PCLZIP_OPT_STOP_ON_ERROR])) + && ($p_options[PCLZIP_OPT_STOP_ON_ERROR]===true)) { + + $this->privSwapBackMagicQuotes(); + + PclZip::privErrorLog(PCLZIP_ERR_UNSUPPORTED_COMPRESSION, + "Filename '".$v_header['stored_filename']."' is " + ."compressed by an unsupported compression " + ."method (".$v_header['compression'].") "); + + return PclZip::errorCode(); + } + } + + // ----- Check encrypted files + if (($v_extract) && (($v_header['flag'] & 1) == 1)) { + $v_header['status'] = 'unsupported_encryption'; + + // ----- Look for PCLZIP_OPT_STOP_ON_ERROR + if ( (isset($p_options[PCLZIP_OPT_STOP_ON_ERROR])) + && ($p_options[PCLZIP_OPT_STOP_ON_ERROR]===true)) { + + $this->privSwapBackMagicQuotes(); + + PclZip::privErrorLog(PCLZIP_ERR_UNSUPPORTED_ENCRYPTION, + "Unsupported encryption for " + ." filename '".$v_header['stored_filename'] + ."'"); + + return PclZip::errorCode(); + } + } + + // ----- Look for real extraction + if (($v_extract) && ($v_header['status'] != 'ok')) { + $v_result = $this->privConvertHeader2FileInfo($v_header, + $p_file_list[$v_nb_extracted++]); + if ($v_result != 1) { + $this->privCloseFd(); + $this->privSwapBackMagicQuotes(); + return $v_result; + } + + $v_extract = false; + } + + // ----- Look for real extraction + if ($v_extract) + { + + // ----- Go to the file position + @rewind($this->zip_fd); + if (@fseek($this->zip_fd, $v_header['offset'])) + { + // ----- Close the zip file + $this->privCloseFd(); + + $this->privSwapBackMagicQuotes(); + + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_ARCHIVE_ZIP, 'Invalid archive size'); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Look for extraction as string + if ($p_options[PCLZIP_OPT_EXTRACT_AS_STRING]) { + + $v_string = ''; + + // ----- Extracting the file + $v_result1 = $this->privExtractFileAsString($v_header, $v_string, $p_options); + if ($v_result1 < 1) { + $this->privCloseFd(); + $this->privSwapBackMagicQuotes(); + return $v_result1; + } + + // ----- Get the only interesting attributes + if (($v_result = $this->privConvertHeader2FileInfo($v_header, $p_file_list[$v_nb_extracted])) != 1) + { + // ----- Close the zip file + $this->privCloseFd(); + $this->privSwapBackMagicQuotes(); + + return $v_result; + } + + // ----- Set the file content + $p_file_list[$v_nb_extracted]['content'] = $v_string; + + // ----- Next extracted file + $v_nb_extracted++; + + // ----- Look for user callback abort + if ($v_result1 == 2) { + break; + } + } + // ----- Look for extraction in standard output + elseif ( (isset($p_options[PCLZIP_OPT_EXTRACT_IN_OUTPUT])) + && ($p_options[PCLZIP_OPT_EXTRACT_IN_OUTPUT])) { + // ----- Extracting the file in standard output + $v_result1 = $this->privExtractFileInOutput($v_header, $p_options); + if ($v_result1 < 1) { + $this->privCloseFd(); + $this->privSwapBackMagicQuotes(); + return $v_result1; + } + + // ----- Get the only interesting attributes + if (($v_result = $this->privConvertHeader2FileInfo($v_header, $p_file_list[$v_nb_extracted++])) != 1) { + $this->privCloseFd(); + $this->privSwapBackMagicQuotes(); + return $v_result; + } + + // ----- Look for user callback abort + if ($v_result1 == 2) { + break; + } + } + // ----- Look for normal extraction + else { + // ----- Extracting the file + $v_result1 = $this->privExtractFile($v_header, + $p_path, $p_remove_path, + $p_remove_all_path, + $p_options); + if ($v_result1 < 1) { + $this->privCloseFd(); + $this->privSwapBackMagicQuotes(); + return $v_result1; + } + + // ----- Get the only interesting attributes + if (($v_result = $this->privConvertHeader2FileInfo($v_header, $p_file_list[$v_nb_extracted++])) != 1) + { + // ----- Close the zip file + $this->privCloseFd(); + $this->privSwapBackMagicQuotes(); + + return $v_result; + } + + // ----- Look for user callback abort + if ($v_result1 == 2) { + break; + } + } + } + } + + // ----- Close the zip file + $this->privCloseFd(); + $this->privSwapBackMagicQuotes(); + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privExtractFile() + // Description : + // Parameters : + // Return Values : + // + // 1 : ... ? + // PCLZIP_ERR_USER_ABORTED(2) : User ask for extraction stop in callback + // -------------------------------------------------------------------------------- + function privExtractFile(&$p_entry, $p_path, $p_remove_path, $p_remove_all_path, &$p_options) + { + $v_result=1; + + // ----- Read the file header + if (($v_result = $this->privReadFileHeader($v_header)) != 1) + { + // ----- Return + return $v_result; + } + + + // ----- Check that the file header is coherent with $p_entry info + if ($this->privCheckFileHeaders($v_header, $p_entry) != 1) { + // TBC + } + + // ----- Look for all path to remove + if ($p_remove_all_path == true) { + // ----- Look for folder entry that not need to be extracted + if (($p_entry['external']&0x00000010)==0x00000010) { + + $p_entry['status'] = "filtered"; + + return $v_result; + } + + // ----- Get the basename of the path + $p_entry['filename'] = basename($p_entry['filename']); + } + + // ----- Look for path to remove + else if ($p_remove_path != "") + { + if (PclZipUtilPathInclusion($p_remove_path, $p_entry['filename']) == 2) + { + + // ----- Change the file status + $p_entry['status'] = "filtered"; + + // ----- Return + return $v_result; + } + + $p_remove_path_size = strlen($p_remove_path); + if (substr($p_entry['filename'], 0, $p_remove_path_size) == $p_remove_path) + { + + // ----- Remove the path + $p_entry['filename'] = substr($p_entry['filename'], $p_remove_path_size); + + } + } + + // ----- Add the path + if ($p_path != '') { + $p_entry['filename'] = $p_path."/".$p_entry['filename']; + } + + // ----- Check a base_dir_restriction + if (isset($p_options[PCLZIP_OPT_EXTRACT_DIR_RESTRICTION])) { + $v_inclusion + = PclZipUtilPathInclusion($p_options[PCLZIP_OPT_EXTRACT_DIR_RESTRICTION], + $p_entry['filename']); + if ($v_inclusion == 0) { + + PclZip::privErrorLog(PCLZIP_ERR_DIRECTORY_RESTRICTION, + "Filename '".$p_entry['filename']."' is " + ."outside PCLZIP_OPT_EXTRACT_DIR_RESTRICTION"); + + return PclZip::errorCode(); + } + } + + // ----- Look for pre-extract callback + if (isset($p_options[PCLZIP_CB_PRE_EXTRACT])) { + + // ----- Generate a local information + $v_local_header = array(); + $this->privConvertHeader2FileInfo($p_entry, $v_local_header); + + // ----- Call the callback + // Here I do not use call_user_func() because I need to send a reference to the + // header. + $v_result = $p_options[PCLZIP_CB_PRE_EXTRACT](PCLZIP_CB_PRE_EXTRACT, $v_local_header); + if ($v_result == 0) { + // ----- Change the file status + $p_entry['status'] = "skipped"; + $v_result = 1; + } + + // ----- Look for abort result + if ($v_result == 2) { + // ----- This status is internal and will be changed in 'skipped' + $p_entry['status'] = "aborted"; + $v_result = PCLZIP_ERR_USER_ABORTED; + } + + // ----- Update the informations + // Only some fields can be modified + $p_entry['filename'] = $v_local_header['filename']; + } + + + // ----- Look if extraction should be done + if ($p_entry['status'] == 'ok') { + + // ----- Look for specific actions while the file exist + if (file_exists($p_entry['filename'])) + { + + // ----- Look if file is a directory + if (is_dir($p_entry['filename'])) + { + + // ----- Change the file status + $p_entry['status'] = "already_a_directory"; + + // ----- Look for PCLZIP_OPT_STOP_ON_ERROR + // For historical reason first PclZip implementation does not stop + // when this kind of error occurs. + if ( (isset($p_options[PCLZIP_OPT_STOP_ON_ERROR])) + && ($p_options[PCLZIP_OPT_STOP_ON_ERROR]===true)) { + + PclZip::privErrorLog(PCLZIP_ERR_ALREADY_A_DIRECTORY, + "Filename '".$p_entry['filename']."' is " + ."already used by an existing directory"); + + return PclZip::errorCode(); + } + } + // ----- Look if file is write protected + else if (!is_writeable($p_entry['filename'])) + { + + // ----- Change the file status + $p_entry['status'] = "write_protected"; + + // ----- Look for PCLZIP_OPT_STOP_ON_ERROR + // For historical reason first PclZip implementation does not stop + // when this kind of error occurs. + if ( (isset($p_options[PCLZIP_OPT_STOP_ON_ERROR])) + && ($p_options[PCLZIP_OPT_STOP_ON_ERROR]===true)) { + + PclZip::privErrorLog(PCLZIP_ERR_WRITE_OPEN_FAIL, + "Filename '".$p_entry['filename']."' exists " + ."and is write protected"); + + return PclZip::errorCode(); + } + } + + // ----- Look if the extracted file is older + else if (filemtime($p_entry['filename']) > $p_entry['mtime']) + { + // ----- Change the file status + if ( (isset($p_options[PCLZIP_OPT_REPLACE_NEWER])) + && ($p_options[PCLZIP_OPT_REPLACE_NEWER]===true)) { + } + else { + $p_entry['status'] = "newer_exist"; + + // ----- Look for PCLZIP_OPT_STOP_ON_ERROR + // For historical reason first PclZip implementation does not stop + // when this kind of error occurs. + if ( (isset($p_options[PCLZIP_OPT_STOP_ON_ERROR])) + && ($p_options[PCLZIP_OPT_STOP_ON_ERROR]===true)) { + + PclZip::privErrorLog(PCLZIP_ERR_WRITE_OPEN_FAIL, + "Newer version of '".$p_entry['filename']."' exists " + ."and option PCLZIP_OPT_REPLACE_NEWER is not selected"); + + return PclZip::errorCode(); + } + } + } + else { + } + } + + // ----- Check the directory availability and create it if necessary + else { + if ((($p_entry['external']&0x00000010)==0x00000010) || (substr($p_entry['filename'], -1) == '/')) + $v_dir_to_check = $p_entry['filename']; + else if (!strstr($p_entry['filename'], "/")) + $v_dir_to_check = ""; + else + $v_dir_to_check = dirname($p_entry['filename']); + + if (($v_result = $this->privDirCheck($v_dir_to_check, (($p_entry['external']&0x00000010)==0x00000010))) != 1) { + + // ----- Change the file status + $p_entry['status'] = "path_creation_fail"; + + // ----- Return + //return $v_result; + $v_result = 1; + } + } + } + + // ----- Look if extraction should be done + if ($p_entry['status'] == 'ok') { + + // ----- Do the extraction (if not a folder) + if (!(($p_entry['external']&0x00000010)==0x00000010)) + { + // ----- Look for not compressed file + if ($p_entry['compression'] == 0) { + + // ----- Opening destination file + if (($v_dest_file = @fopen($p_entry['filename'], 'wb')) == 0) + { + + // ----- Change the file status + $p_entry['status'] = "write_error"; + + // ----- Return + return $v_result; + } + + + // ----- Read the file by PCLZIP_READ_BLOCK_SIZE octets blocks + $v_size = $p_entry['compressed_size']; + while ($v_size != 0) + { + $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); + $v_buffer = @fread($this->zip_fd, $v_read_size); + /* Try to speed up the code + $v_binary_data = pack('a'.$v_read_size, $v_buffer); + @fwrite($v_dest_file, $v_binary_data, $v_read_size); + */ + @fwrite($v_dest_file, $v_buffer, $v_read_size); + $v_size -= $v_read_size; + } + + // ----- Closing the destination file + fclose($v_dest_file); + + // ----- Change the file mtime + touch($p_entry['filename'], $p_entry['mtime']); + + + } + else { + // ----- TBC + // Need to be finished + if (($p_entry['flag'] & 1) == 1) { + PclZip::privErrorLog(PCLZIP_ERR_UNSUPPORTED_ENCRYPTION, 'File \''.$p_entry['filename'].'\' is encrypted. Encrypted files are not supported.'); + return PclZip::errorCode(); + } + + + // ----- Look for using temporary file to unzip + if ( (!isset($p_options[PCLZIP_OPT_TEMP_FILE_OFF])) + && (isset($p_options[PCLZIP_OPT_TEMP_FILE_ON]) + || (isset($p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD]) + && ($p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD] <= $p_entry['size'])) ) ) { + $v_result = $this->privExtractFileUsingTempFile($p_entry, $p_options); + if ($v_result < PCLZIP_ERR_NO_ERROR) { + return $v_result; + } + } + + // ----- Look for extract in memory + else { + + + // ----- Read the compressed file in a buffer (one shot) + $v_buffer = @fread($this->zip_fd, $p_entry['compressed_size']); + + // ----- Decompress the file + $v_file_content = @gzinflate($v_buffer); + unset($v_buffer); + if ($v_file_content === FALSE) { + + // ----- Change the file status + // TBC + $p_entry['status'] = "error"; + + return $v_result; + } + + // ----- Opening destination file + if (($v_dest_file = @fopen($p_entry['filename'], 'wb')) == 0) { + + // ----- Change the file status + $p_entry['status'] = "write_error"; + + return $v_result; + } + + // ----- Write the uncompressed data + @fwrite($v_dest_file, $v_file_content, $p_entry['size']); + unset($v_file_content); + + // ----- Closing the destination file + @fclose($v_dest_file); + + } + + // ----- Change the file mtime + @touch($p_entry['filename'], $p_entry['mtime']); + } + + // ----- Look for chmod option + if (isset($p_options[PCLZIP_OPT_SET_CHMOD])) { + + // ----- Change the mode of the file + @chmod($p_entry['filename'], $p_options[PCLZIP_OPT_SET_CHMOD]); + } + + } + } + + // ----- Change abort status + if ($p_entry['status'] == "aborted") { + $p_entry['status'] = "skipped"; + } + + // ----- Look for post-extract callback + elseif (isset($p_options[PCLZIP_CB_POST_EXTRACT])) { + + // ----- Generate a local information + $v_local_header = array(); + $this->privConvertHeader2FileInfo($p_entry, $v_local_header); + + // ----- Call the callback + // Here I do not use call_user_func() because I need to send a reference to the + // header. + $v_result = $p_options[PCLZIP_CB_POST_EXTRACT](PCLZIP_CB_POST_EXTRACT, $v_local_header); + + // ----- Look for abort result + if ($v_result == 2) { + $v_result = PCLZIP_ERR_USER_ABORTED; + } + } + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privExtractFileUsingTempFile() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function privExtractFileUsingTempFile(&$p_entry, &$p_options) + { + $v_result=1; + + // ----- Creates a temporary file + $v_gzip_temp_name = PCLZIP_TEMPORARY_DIR.uniqid('pclzip-').'.gz'; + if (($v_dest_file = @fopen($v_gzip_temp_name, "wb")) == 0) { + fclose($v_file); + PclZip::privErrorLog(PCLZIP_ERR_WRITE_OPEN_FAIL, 'Unable to open temporary file \''.$v_gzip_temp_name.'\' in binary write mode'); + return PclZip::errorCode(); + } + + + // ----- Write gz file format header + $v_binary_data = pack('va1a1Va1a1', 0x8b1f, Chr($p_entry['compression']), Chr(0x00), time(), Chr(0x00), Chr(3)); + @fwrite($v_dest_file, $v_binary_data, 10); + + // ----- Read the file by PCLZIP_READ_BLOCK_SIZE octets blocks + $v_size = $p_entry['compressed_size']; + while ($v_size != 0) + { + $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); + $v_buffer = @fread($this->zip_fd, $v_read_size); + //$v_binary_data = pack('a'.$v_read_size, $v_buffer); + @fwrite($v_dest_file, $v_buffer, $v_read_size); + $v_size -= $v_read_size; + } + + // ----- Write gz file format footer + $v_binary_data = pack('VV', $p_entry['crc'], $p_entry['size']); + @fwrite($v_dest_file, $v_binary_data, 8); + + // ----- Close the temporary file + @fclose($v_dest_file); + + // ----- Opening destination file + if (($v_dest_file = @fopen($p_entry['filename'], 'wb')) == 0) { + $p_entry['status'] = "write_error"; + return $v_result; + } + + // ----- Open the temporary gz file + if (($v_src_file = @gzopen($v_gzip_temp_name, 'rb')) == 0) { + @fclose($v_dest_file); + $p_entry['status'] = "read_error"; + PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open temporary file \''.$v_gzip_temp_name.'\' in binary read mode'); + return PclZip::errorCode(); + } + + + // ----- Read the file by PCLZIP_READ_BLOCK_SIZE octets blocks + $v_size = $p_entry['size']; + while ($v_size != 0) { + $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); + $v_buffer = @gzread($v_src_file, $v_read_size); + //$v_binary_data = pack('a'.$v_read_size, $v_buffer); + @fwrite($v_dest_file, $v_buffer, $v_read_size); + $v_size -= $v_read_size; + } + @fclose($v_dest_file); + @gzclose($v_src_file); + + // ----- Delete the temporary file + @unlink($v_gzip_temp_name); + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privExtractFileInOutput() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function privExtractFileInOutput(&$p_entry, &$p_options) + { + $v_result=1; + + // ----- Read the file header + if (($v_result = $this->privReadFileHeader($v_header)) != 1) { + return $v_result; + } + + + // ----- Check that the file header is coherent with $p_entry info + if ($this->privCheckFileHeaders($v_header, $p_entry) != 1) { + // TBC + } + + // ----- Look for pre-extract callback + if (isset($p_options[PCLZIP_CB_PRE_EXTRACT])) { + + // ----- Generate a local information + $v_local_header = array(); + $this->privConvertHeader2FileInfo($p_entry, $v_local_header); + + // ----- Call the callback + // Here I do not use call_user_func() because I need to send a reference to the + // header. +// eval('$v_result = '.$p_options[PCLZIP_CB_PRE_EXTRACT].'(PCLZIP_CB_PRE_EXTRACT, $v_local_header);'); + $v_result = $p_options[PCLZIP_CB_PRE_EXTRACT](PCLZIP_CB_PRE_EXTRACT, $v_local_header); + if ($v_result == 0) { + // ----- Change the file status + $p_entry['status'] = "skipped"; + $v_result = 1; + } + + // ----- Look for abort result + if ($v_result == 2) { + // ----- This status is internal and will be changed in 'skipped' + $p_entry['status'] = "aborted"; + $v_result = PCLZIP_ERR_USER_ABORTED; + } + + // ----- Update the informations + // Only some fields can be modified + $p_entry['filename'] = $v_local_header['filename']; + } + + // ----- Trace + + // ----- Look if extraction should be done + if ($p_entry['status'] == 'ok') { + + // ----- Do the extraction (if not a folder) + if (!(($p_entry['external']&0x00000010)==0x00000010)) { + // ----- Look for not compressed file + if ($p_entry['compressed_size'] == $p_entry['size']) { + + // ----- Read the file in a buffer (one shot) + $v_buffer = @fread($this->zip_fd, $p_entry['compressed_size']); + + // ----- Send the file to the output + echo $v_buffer; + unset($v_buffer); + } + else { + + // ----- Read the compressed file in a buffer (one shot) + $v_buffer = @fread($this->zip_fd, $p_entry['compressed_size']); + + // ----- Decompress the file + $v_file_content = gzinflate($v_buffer); + unset($v_buffer); + + // ----- Send the file to the output + echo $v_file_content; + unset($v_file_content); + } + } + } + + // ----- Change abort status + if ($p_entry['status'] == "aborted") { + $p_entry['status'] = "skipped"; + } + + // ----- Look for post-extract callback + elseif (isset($p_options[PCLZIP_CB_POST_EXTRACT])) { + + // ----- Generate a local information + $v_local_header = array(); + $this->privConvertHeader2FileInfo($p_entry, $v_local_header); + + // ----- Call the callback + // Here I do not use call_user_func() because I need to send a reference to the + // header. + $v_result = $p_options[PCLZIP_CB_POST_EXTRACT](PCLZIP_CB_POST_EXTRACT, $v_local_header); + + // ----- Look for abort result + if ($v_result == 2) { + $v_result = PCLZIP_ERR_USER_ABORTED; + } + } + + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privExtractFileAsString() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function privExtractFileAsString(&$p_entry, &$p_string, &$p_options) + { + $v_result=1; + + // ----- Read the file header + $v_header = array(); + if (($v_result = $this->privReadFileHeader($v_header)) != 1) + { + // ----- Return + return $v_result; + } + + + // ----- Check that the file header is coherent with $p_entry info + if ($this->privCheckFileHeaders($v_header, $p_entry) != 1) { + // TBC + } + + // ----- Look for pre-extract callback + if (isset($p_options[PCLZIP_CB_PRE_EXTRACT])) { + + // ----- Generate a local information + $v_local_header = array(); + $this->privConvertHeader2FileInfo($p_entry, $v_local_header); + + // ----- Call the callback + // Here I do not use call_user_func() because I need to send a reference to the + // header. + $v_result = $p_options[PCLZIP_CB_PRE_EXTRACT](PCLZIP_CB_PRE_EXTRACT, $v_local_header); + if ($v_result == 0) { + // ----- Change the file status + $p_entry['status'] = "skipped"; + $v_result = 1; + } + + // ----- Look for abort result + if ($v_result == 2) { + // ----- This status is internal and will be changed in 'skipped' + $p_entry['status'] = "aborted"; + $v_result = PCLZIP_ERR_USER_ABORTED; + } + + // ----- Update the informations + // Only some fields can be modified + $p_entry['filename'] = $v_local_header['filename']; + } + + + // ----- Look if extraction should be done + if ($p_entry['status'] == 'ok') { + + // ----- Do the extraction (if not a folder) + if (!(($p_entry['external']&0x00000010)==0x00000010)) { + // ----- Look for not compressed file + // if ($p_entry['compressed_size'] == $p_entry['size']) + if ($p_entry['compression'] == 0) { + + // ----- Reading the file + $p_string = @fread($this->zip_fd, $p_entry['compressed_size']); + } + else { + + // ----- Reading the file + $v_data = @fread($this->zip_fd, $p_entry['compressed_size']); + + // ----- Decompress the file + if (($p_string = @gzinflate($v_data)) === FALSE) { + // TBC + } + } + + // ----- Trace + } + else { + // TBC : error : can not extract a folder in a string + } + + } + + // ----- Change abort status + if ($p_entry['status'] == "aborted") { + $p_entry['status'] = "skipped"; + } + + // ----- Look for post-extract callback + elseif (isset($p_options[PCLZIP_CB_POST_EXTRACT])) { + + // ----- Generate a local information + $v_local_header = array(); + $this->privConvertHeader2FileInfo($p_entry, $v_local_header); + + // ----- Swap the content to header + $v_local_header['content'] = $p_string; + $p_string = ''; + + // ----- Call the callback + // Here I do not use call_user_func() because I need to send a reference to the + // header. + $v_result = $p_options[PCLZIP_CB_POST_EXTRACT](PCLZIP_CB_POST_EXTRACT, $v_local_header); + + // ----- Swap back the content to header + $p_string = $v_local_header['content']; + unset($v_local_header['content']); + + // ----- Look for abort result + if ($v_result == 2) { + $v_result = PCLZIP_ERR_USER_ABORTED; + } + } + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privReadFileHeader() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function privReadFileHeader(&$p_header) + { + $v_result=1; + + // ----- Read the 4 bytes signature + $v_binary_data = @fread($this->zip_fd, 4); + $v_data = unpack('Vid', $v_binary_data); + + // ----- Check signature + if ($v_data['id'] != 0x04034b50) + { + + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, 'Invalid archive structure'); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Read the first 42 bytes of the header + $v_binary_data = fread($this->zip_fd, 26); + + // ----- Look for invalid block size + if (strlen($v_binary_data) != 26) + { + $p_header['filename'] = ""; + $p_header['status'] = "invalid_header"; + + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, "Invalid block size : ".strlen($v_binary_data)); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Extract the values + $v_data = unpack('vversion/vflag/vcompression/vmtime/vmdate/Vcrc/Vcompressed_size/Vsize/vfilename_len/vextra_len', $v_binary_data); + + // ----- Get filename + $p_header['filename'] = fread($this->zip_fd, $v_data['filename_len']); + + // ----- Get extra_fields + if ($v_data['extra_len'] != 0) { + $p_header['extra'] = fread($this->zip_fd, $v_data['extra_len']); + } + else { + $p_header['extra'] = ''; + } + + // ----- Extract properties + $p_header['version_extracted'] = $v_data['version']; + $p_header['compression'] = $v_data['compression']; + $p_header['size'] = $v_data['size']; + $p_header['compressed_size'] = $v_data['compressed_size']; + $p_header['crc'] = $v_data['crc']; + $p_header['flag'] = $v_data['flag']; + $p_header['filename_len'] = $v_data['filename_len']; + + // ----- Recuperate date in UNIX format + $p_header['mdate'] = $v_data['mdate']; + $p_header['mtime'] = $v_data['mtime']; + if ($p_header['mdate'] && $p_header['mtime']) + { + // ----- Extract time + $v_hour = ($p_header['mtime'] & 0xF800) >> 11; + $v_minute = ($p_header['mtime'] & 0x07E0) >> 5; + $v_seconde = ($p_header['mtime'] & 0x001F)*2; + + // ----- Extract date + $v_year = (($p_header['mdate'] & 0xFE00) >> 9) + 1980; + $v_month = ($p_header['mdate'] & 0x01E0) >> 5; + $v_day = $p_header['mdate'] & 0x001F; + + // ----- Get UNIX date format + $p_header['mtime'] = @mktime($v_hour, $v_minute, $v_seconde, $v_month, $v_day, $v_year); + + } + else + { + $p_header['mtime'] = time(); + } + + // TBC + //for(reset($v_data); $key = key($v_data); next($v_data)) { + //} + + // ----- Set the stored filename + $p_header['stored_filename'] = $p_header['filename']; + + // ----- Set the status field + $p_header['status'] = "ok"; + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privReadCentralFileHeader() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function privReadCentralFileHeader(&$p_header) + { + $v_result=1; + + // ----- Read the 4 bytes signature + $v_binary_data = @fread($this->zip_fd, 4); + $v_data = unpack('Vid', $v_binary_data); + + // ----- Check signature + if ($v_data['id'] != 0x02014b50) + { + + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, 'Invalid archive structure'); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Read the first 42 bytes of the header + $v_binary_data = fread($this->zip_fd, 42); + + // ----- Look for invalid block size + if (strlen($v_binary_data) != 42) + { + $p_header['filename'] = ""; + $p_header['status'] = "invalid_header"; + + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, "Invalid block size : ".strlen($v_binary_data)); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Extract the values + $p_header = unpack('vversion/vversion_extracted/vflag/vcompression/vmtime/vmdate/Vcrc/Vcompressed_size/Vsize/vfilename_len/vextra_len/vcomment_len/vdisk/vinternal/Vexternal/Voffset', $v_binary_data); + + // ----- Get filename + if ($p_header['filename_len'] != 0) + $p_header['filename'] = fread($this->zip_fd, $p_header['filename_len']); + else + $p_header['filename'] = ''; + + // ----- Get extra + if ($p_header['extra_len'] != 0) + $p_header['extra'] = fread($this->zip_fd, $p_header['extra_len']); + else + $p_header['extra'] = ''; + + // ----- Get comment + if ($p_header['comment_len'] != 0) + $p_header['comment'] = fread($this->zip_fd, $p_header['comment_len']); + else + $p_header['comment'] = ''; + + // ----- Extract properties + + // ----- Recuperate date in UNIX format + //if ($p_header['mdate'] && $p_header['mtime']) + // TBC : bug : this was ignoring time with 0/0/0 + if (1) + { + // ----- Extract time + $v_hour = ($p_header['mtime'] & 0xF800) >> 11; + $v_minute = ($p_header['mtime'] & 0x07E0) >> 5; + $v_seconde = ($p_header['mtime'] & 0x001F)*2; + + // ----- Extract date + $v_year = (($p_header['mdate'] & 0xFE00) >> 9) + 1980; + $v_month = ($p_header['mdate'] & 0x01E0) >> 5; + $v_day = $p_header['mdate'] & 0x001F; + + // ----- Get UNIX date format + $p_header['mtime'] = @mktime($v_hour, $v_minute, $v_seconde, $v_month, $v_day, $v_year); + + } + else + { + $p_header['mtime'] = time(); + } + + // ----- Set the stored filename + $p_header['stored_filename'] = $p_header['filename']; + + // ----- Set default status to ok + $p_header['status'] = 'ok'; + + // ----- Look if it is a directory + if (substr($p_header['filename'], -1) == '/') { + //$p_header['external'] = 0x41FF0010; + $p_header['external'] = 0x00000010; + } + + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privCheckFileHeaders() + // Description : + // Parameters : + // Return Values : + // 1 on success, + // 0 on error; + // -------------------------------------------------------------------------------- + function privCheckFileHeaders(&$p_local_header, &$p_central_header) + { + $v_result=1; + + // ----- Check the static values + // TBC + if ($p_local_header['filename'] != $p_central_header['filename']) { + } + if ($p_local_header['version_extracted'] != $p_central_header['version_extracted']) { + } + if ($p_local_header['flag'] != $p_central_header['flag']) { + } + if ($p_local_header['compression'] != $p_central_header['compression']) { + } + if ($p_local_header['mtime'] != $p_central_header['mtime']) { + } + if ($p_local_header['filename_len'] != $p_central_header['filename_len']) { + } + + // ----- Look for flag bit 3 + if (($p_local_header['flag'] & 8) == 8) { + $p_local_header['size'] = $p_central_header['size']; + $p_local_header['compressed_size'] = $p_central_header['compressed_size']; + $p_local_header['crc'] = $p_central_header['crc']; + } + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privReadEndCentralDir() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function privReadEndCentralDir(&$p_central_dir) + { + $v_result=1; + + // ----- Go to the end of the zip file + $v_size = filesize($this->zipname); + @fseek($this->zip_fd, $v_size); + if (@ftell($this->zip_fd) != $v_size) + { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, 'Unable to go to the end of the archive \''.$this->zipname.'\''); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- First try : look if this is an archive with no commentaries (most of the time) + // in this case the end of central dir is at 22 bytes of the file end + $v_found = 0; + if ($v_size > 26) { + @fseek($this->zip_fd, $v_size-22); + if (($v_pos = @ftell($this->zip_fd)) != ($v_size-22)) + { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, 'Unable to seek back to the middle of the archive \''.$this->zipname.'\''); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Read for bytes + $v_binary_data = @fread($this->zip_fd, 4); + $v_data = @unpack('Vid', $v_binary_data); + + // ----- Check signature + if ($v_data['id'] == 0x06054b50) { + $v_found = 1; + } + + $v_pos = ftell($this->zip_fd); + } + + // ----- Go back to the maximum possible size of the Central Dir End Record + if (!$v_found) { + $v_maximum_size = 65557; // 0xFFFF + 22; + if ($v_maximum_size > $v_size) + $v_maximum_size = $v_size; + @fseek($this->zip_fd, $v_size-$v_maximum_size); + if (@ftell($this->zip_fd) != ($v_size-$v_maximum_size)) + { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, 'Unable to seek back to the middle of the archive \''.$this->zipname.'\''); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Read byte per byte in order to find the signature + $v_pos = ftell($this->zip_fd); + $v_bytes = 0x00000000; + while ($v_pos < $v_size) + { + // ----- Read a byte + $v_byte = @fread($this->zip_fd, 1); + + // ----- Add the byte + //$v_bytes = ($v_bytes << 8) | Ord($v_byte); + // Note we mask the old value down such that once shifted we can never end up with more than a 32bit number + // Otherwise on systems where we have 64bit integers the check below for the magic number will fail. + $v_bytes = ( ($v_bytes & 0xFFFFFF) << 8) | Ord($v_byte); + + // ----- Compare the bytes + if ($v_bytes == 0x504b0506) + { + $v_pos++; + break; + } + + $v_pos++; + } + + // ----- Look if not found end of central dir + if ($v_pos == $v_size) + { + + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, "Unable to find End of Central Dir Record signature"); + + // ----- Return + return PclZip::errorCode(); + } + } + + // ----- Read the first 18 bytes of the header + $v_binary_data = fread($this->zip_fd, 18); + + // ----- Look for invalid block size + if (strlen($v_binary_data) != 18) + { + + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, "Invalid End of Central Dir Record size : ".strlen($v_binary_data)); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Extract the values + $v_data = unpack('vdisk/vdisk_start/vdisk_entries/ventries/Vsize/Voffset/vcomment_size', $v_binary_data); + + // ----- Check the global size + if (($v_pos + $v_data['comment_size'] + 18) != $v_size) { + + // ----- Removed in release 2.2 see readme file + // The check of the file size is a little too strict. + // Some bugs where found when a zip is encrypted/decrypted with 'crypt'. + // While decrypted, zip has training 0 bytes + if (0) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, + 'The central dir is not at the end of the archive.' + .' Some trailing bytes exists after the archive.'); + + // ----- Return + return PclZip::errorCode(); + } + } + + // ----- Get comment + if ($v_data['comment_size'] != 0) { + $p_central_dir['comment'] = fread($this->zip_fd, $v_data['comment_size']); + } + else + $p_central_dir['comment'] = ''; + + $p_central_dir['entries'] = $v_data['entries']; + $p_central_dir['disk_entries'] = $v_data['disk_entries']; + $p_central_dir['offset'] = $v_data['offset']; + $p_central_dir['size'] = $v_data['size']; + $p_central_dir['disk'] = $v_data['disk']; + $p_central_dir['disk_start'] = $v_data['disk_start']; + + // TBC + //for(reset($p_central_dir); $key = key($p_central_dir); next($p_central_dir)) { + //} + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privDeleteByRule() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function privDeleteByRule(&$p_result_list, &$p_options) + { + $v_result=1; + $v_list_detail = array(); + + // ----- Open the zip file + if (($v_result=$this->privOpenFd('rb')) != 1) + { + // ----- Return + return $v_result; + } + + // ----- Read the central directory informations + $v_central_dir = array(); + if (($v_result = $this->privReadEndCentralDir($v_central_dir)) != 1) + { + $this->privCloseFd(); + return $v_result; + } + + // ----- Go to beginning of File + @rewind($this->zip_fd); + + // ----- Scan all the files + // ----- Start at beginning of Central Dir + $v_pos_entry = $v_central_dir['offset']; + @rewind($this->zip_fd); + if (@fseek($this->zip_fd, $v_pos_entry)) + { + // ----- Close the zip file + $this->privCloseFd(); + + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_ARCHIVE_ZIP, 'Invalid archive size'); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Read each entry + $v_header_list = array(); + $j_start = 0; + for ($i=0, $v_nb_extracted=0; $i<$v_central_dir['entries']; $i++) + { + + // ----- Read the file header + $v_header_list[$v_nb_extracted] = array(); + if (($v_result = $this->privReadCentralFileHeader($v_header_list[$v_nb_extracted])) != 1) + { + // ----- Close the zip file + $this->privCloseFd(); + + return $v_result; + } + + + // ----- Store the index + $v_header_list[$v_nb_extracted]['index'] = $i; + + // ----- Look for the specific extract rules + $v_found = false; + + // ----- Look for extract by name rule + if ( (isset($p_options[PCLZIP_OPT_BY_NAME])) + && ($p_options[PCLZIP_OPT_BY_NAME] != 0)) { + + // ----- Look if the filename is in the list + for ($j=0; ($j strlen($p_options[PCLZIP_OPT_BY_NAME][$j])) + && (substr($v_header_list[$v_nb_extracted]['stored_filename'], 0, strlen($p_options[PCLZIP_OPT_BY_NAME][$j])) == $p_options[PCLZIP_OPT_BY_NAME][$j])) { + $v_found = true; + } + elseif ( (($v_header_list[$v_nb_extracted]['external']&0x00000010)==0x00000010) /* Indicates a folder */ + && ($v_header_list[$v_nb_extracted]['stored_filename'].'/' == $p_options[PCLZIP_OPT_BY_NAME][$j])) { + $v_found = true; + } + } + // ----- Look for a filename + elseif ($v_header_list[$v_nb_extracted]['stored_filename'] == $p_options[PCLZIP_OPT_BY_NAME][$j]) { + $v_found = true; + } + } + } + + // ----- Look for extract by ereg rule + // ereg() is deprecated with PHP 5.3 + /* + else if ( (isset($p_options[PCLZIP_OPT_BY_EREG])) + && ($p_options[PCLZIP_OPT_BY_EREG] != "")) { + + if (ereg($p_options[PCLZIP_OPT_BY_EREG], $v_header_list[$v_nb_extracted]['stored_filename'])) { + $v_found = true; + } + } + */ + + // ----- Look for extract by preg rule + else if ( (isset($p_options[PCLZIP_OPT_BY_PREG])) + && ($p_options[PCLZIP_OPT_BY_PREG] != "")) { + + if (preg_match($p_options[PCLZIP_OPT_BY_PREG], $v_header_list[$v_nb_extracted]['stored_filename'])) { + $v_found = true; + } + } + + // ----- Look for extract by index rule + else if ( (isset($p_options[PCLZIP_OPT_BY_INDEX])) + && ($p_options[PCLZIP_OPT_BY_INDEX] != 0)) { + + // ----- Look if the index is in the list + for ($j=$j_start; ($j=$p_options[PCLZIP_OPT_BY_INDEX][$j]['start']) && ($i<=$p_options[PCLZIP_OPT_BY_INDEX][$j]['end'])) { + $v_found = true; + } + if ($i>=$p_options[PCLZIP_OPT_BY_INDEX][$j]['end']) { + $j_start = $j+1; + } + + if ($p_options[PCLZIP_OPT_BY_INDEX][$j]['start']>$i) { + break; + } + } + } + else { + $v_found = true; + } + + // ----- Look for deletion + if ($v_found) + { + unset($v_header_list[$v_nb_extracted]); + } + else + { + $v_nb_extracted++; + } + } + + // ----- Look if something need to be deleted + if ($v_nb_extracted > 0) { + + // ----- Creates a temporay file + $v_zip_temp_name = PCLZIP_TEMPORARY_DIR.uniqid('pclzip-').'.tmp'; + + // ----- Creates a temporary zip archive + $v_temp_zip = new PclZip($v_zip_temp_name); + + // ----- Open the temporary zip file in write mode + if (($v_result = $v_temp_zip->privOpenFd('wb')) != 1) { + $this->privCloseFd(); + + // ----- Return + return $v_result; + } + + // ----- Look which file need to be kept + for ($i=0; $izip_fd); + if (@fseek($this->zip_fd, $v_header_list[$i]['offset'])) { + // ----- Close the zip file + $this->privCloseFd(); + $v_temp_zip->privCloseFd(); + @unlink($v_zip_temp_name); + + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_ARCHIVE_ZIP, 'Invalid archive size'); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Read the file header + $v_local_header = array(); + if (($v_result = $this->privReadFileHeader($v_local_header)) != 1) { + // ----- Close the zip file + $this->privCloseFd(); + $v_temp_zip->privCloseFd(); + @unlink($v_zip_temp_name); + + // ----- Return + return $v_result; + } + + // ----- Check that local file header is same as central file header + if ($this->privCheckFileHeaders($v_local_header, + $v_header_list[$i]) != 1) { + // TBC + } + unset($v_local_header); + + // ----- Write the file header + if (($v_result = $v_temp_zip->privWriteFileHeader($v_header_list[$i])) != 1) { + // ----- Close the zip file + $this->privCloseFd(); + $v_temp_zip->privCloseFd(); + @unlink($v_zip_temp_name); + + // ----- Return + return $v_result; + } + + // ----- Read/write the data block + if (($v_result = PclZipUtilCopyBlock($this->zip_fd, $v_temp_zip->zip_fd, $v_header_list[$i]['compressed_size'])) != 1) { + // ----- Close the zip file + $this->privCloseFd(); + $v_temp_zip->privCloseFd(); + @unlink($v_zip_temp_name); + + // ----- Return + return $v_result; + } + } + + // ----- Store the offset of the central dir + $v_offset = @ftell($v_temp_zip->zip_fd); + + // ----- Re-Create the Central Dir files header + for ($i=0; $iprivWriteCentralFileHeader($v_header_list[$i])) != 1) { + $v_temp_zip->privCloseFd(); + $this->privCloseFd(); + @unlink($v_zip_temp_name); + + // ----- Return + return $v_result; + } + + // ----- Transform the header to a 'usable' info + $v_temp_zip->privConvertHeader2FileInfo($v_header_list[$i], $p_result_list[$i]); + } + + + // ----- Zip file comment + $v_comment = ''; + if (isset($p_options[PCLZIP_OPT_COMMENT])) { + $v_comment = $p_options[PCLZIP_OPT_COMMENT]; + } + + // ----- Calculate the size of the central header + $v_size = @ftell($v_temp_zip->zip_fd)-$v_offset; + + // ----- Create the central dir footer + if (($v_result = $v_temp_zip->privWriteCentralHeader(sizeof($v_header_list), $v_size, $v_offset, $v_comment)) != 1) { + // ----- Reset the file list + unset($v_header_list); + $v_temp_zip->privCloseFd(); + $this->privCloseFd(); + @unlink($v_zip_temp_name); + + // ----- Return + return $v_result; + } + + // ----- Close + $v_temp_zip->privCloseFd(); + $this->privCloseFd(); + + // ----- Delete the zip file + // TBC : I should test the result ... + @unlink($this->zipname); + + // ----- Rename the temporary file + // TBC : I should test the result ... + //@rename($v_zip_temp_name, $this->zipname); + PclZipUtilRename($v_zip_temp_name, $this->zipname); + + // ----- Destroy the temporary archive + unset($v_temp_zip); + } + + // ----- Remove every files : reset the file + else if ($v_central_dir['entries'] != 0) { + $this->privCloseFd(); + + if (($v_result = $this->privOpenFd('wb')) != 1) { + return $v_result; + } + + if (($v_result = $this->privWriteCentralHeader(0, 0, 0, '')) != 1) { + return $v_result; + } + + $this->privCloseFd(); + } + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privDirCheck() + // Description : + // Check if a directory exists, if not it creates it and all the parents directory + // which may be useful. + // Parameters : + // $p_dir : Directory path to check. + // Return Values : + // 1 : OK + // -1 : Unable to create directory + // -------------------------------------------------------------------------------- + function privDirCheck($p_dir, $p_is_dir=false) + { + $v_result = 1; + + + // ----- Remove the final '/' + if (($p_is_dir) && (substr($p_dir, -1)=='/')) + { + $p_dir = substr($p_dir, 0, strlen($p_dir)-1); + } + + // ----- Check the directory availability + if ((is_dir($p_dir)) || ($p_dir == "")) + { + return 1; + } + + // ----- Extract parent directory + $p_parent_dir = dirname($p_dir); + + // ----- Just a check + if ($p_parent_dir != $p_dir) + { + // ----- Look for parent directory + if ($p_parent_dir != "") + { + if (($v_result = $this->privDirCheck($p_parent_dir)) != 1) + { + return $v_result; + } + } + } + + // ----- Create the directory + if (!@mkdir($p_dir, 0777)) + { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_DIR_CREATE_FAIL, "Unable to create directory '$p_dir'"); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privMerge() + // Description : + // If $p_archive_to_add does not exist, the function exit with a success result. + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function privMerge(&$p_archive_to_add) + { + $v_result=1; + + // ----- Look if the archive_to_add exists + if (!is_file($p_archive_to_add->zipname)) + { + + // ----- Nothing to merge, so merge is a success + $v_result = 1; + + // ----- Return + return $v_result; + } + + // ----- Look if the archive exists + if (!is_file($this->zipname)) + { + + // ----- Do a duplicate + $v_result = $this->privDuplicate($p_archive_to_add->zipname); + + // ----- Return + return $v_result; + } + + // ----- Open the zip file + if (($v_result=$this->privOpenFd('rb')) != 1) + { + // ----- Return + return $v_result; + } + + // ----- Read the central directory informations + $v_central_dir = array(); + if (($v_result = $this->privReadEndCentralDir($v_central_dir)) != 1) + { + $this->privCloseFd(); + return $v_result; + } + + // ----- Go to beginning of File + @rewind($this->zip_fd); + + // ----- Open the archive_to_add file + if (($v_result=$p_archive_to_add->privOpenFd('rb')) != 1) + { + $this->privCloseFd(); + + // ----- Return + return $v_result; + } + + // ----- Read the central directory informations + $v_central_dir_to_add = array(); + if (($v_result = $p_archive_to_add->privReadEndCentralDir($v_central_dir_to_add)) != 1) + { + $this->privCloseFd(); + $p_archive_to_add->privCloseFd(); + + return $v_result; + } + + // ----- Go to beginning of File + @rewind($p_archive_to_add->zip_fd); + + // ----- Creates a temporay file + $v_zip_temp_name = PCLZIP_TEMPORARY_DIR.uniqid('pclzip-').'.tmp'; + + // ----- Open the temporary file in write mode + if (($v_zip_temp_fd = @fopen($v_zip_temp_name, 'wb')) == 0) + { + $this->privCloseFd(); + $p_archive_to_add->privCloseFd(); + + PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open temporary file \''.$v_zip_temp_name.'\' in binary write mode'); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Copy the files from the archive to the temporary file + // TBC : Here I should better append the file and go back to erase the central dir + $v_size = $v_central_dir['offset']; + while ($v_size != 0) + { + $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); + $v_buffer = fread($this->zip_fd, $v_read_size); + @fwrite($v_zip_temp_fd, $v_buffer, $v_read_size); + $v_size -= $v_read_size; + } + + // ----- Copy the files from the archive_to_add into the temporary file + $v_size = $v_central_dir_to_add['offset']; + while ($v_size != 0) + { + $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); + $v_buffer = fread($p_archive_to_add->zip_fd, $v_read_size); + @fwrite($v_zip_temp_fd, $v_buffer, $v_read_size); + $v_size -= $v_read_size; + } + + // ----- Store the offset of the central dir + $v_offset = @ftell($v_zip_temp_fd); + + // ----- Copy the block of file headers from the old archive + $v_size = $v_central_dir['size']; + while ($v_size != 0) + { + $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); + $v_buffer = @fread($this->zip_fd, $v_read_size); + @fwrite($v_zip_temp_fd, $v_buffer, $v_read_size); + $v_size -= $v_read_size; + } + + // ----- Copy the block of file headers from the archive_to_add + $v_size = $v_central_dir_to_add['size']; + while ($v_size != 0) + { + $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); + $v_buffer = @fread($p_archive_to_add->zip_fd, $v_read_size); + @fwrite($v_zip_temp_fd, $v_buffer, $v_read_size); + $v_size -= $v_read_size; + } + + // ----- Merge the file comments + $v_comment = $v_central_dir['comment'].' '.$v_central_dir_to_add['comment']; + + // ----- Calculate the size of the (new) central header + $v_size = @ftell($v_zip_temp_fd)-$v_offset; + + // ----- Swap the file descriptor + // Here is a trick : I swap the temporary fd with the zip fd, in order to use + // the following methods on the temporary fil and not the real archive fd + $v_swap = $this->zip_fd; + $this->zip_fd = $v_zip_temp_fd; + $v_zip_temp_fd = $v_swap; + + // ----- Create the central dir footer + if (($v_result = $this->privWriteCentralHeader($v_central_dir['entries']+$v_central_dir_to_add['entries'], $v_size, $v_offset, $v_comment)) != 1) + { + $this->privCloseFd(); + $p_archive_to_add->privCloseFd(); + @fclose($v_zip_temp_fd); + $this->zip_fd = null; + + // ----- Reset the file list + unset($v_header_list); + + // ----- Return + return $v_result; + } + + // ----- Swap back the file descriptor + $v_swap = $this->zip_fd; + $this->zip_fd = $v_zip_temp_fd; + $v_zip_temp_fd = $v_swap; + + // ----- Close + $this->privCloseFd(); + $p_archive_to_add->privCloseFd(); + + // ----- Close the temporary file + @fclose($v_zip_temp_fd); + + // ----- Delete the zip file + // TBC : I should test the result ... + @unlink($this->zipname); + + // ----- Rename the temporary file + // TBC : I should test the result ... + //@rename($v_zip_temp_name, $this->zipname); + PclZipUtilRename($v_zip_temp_name, $this->zipname); + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privDuplicate() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function privDuplicate($p_archive_filename) + { + $v_result=1; + + // ----- Look if the $p_archive_filename exists + if (!is_file($p_archive_filename)) + { + + // ----- Nothing to duplicate, so duplicate is a success. + $v_result = 1; + + // ----- Return + return $v_result; + } + + // ----- Open the zip file + if (($v_result=$this->privOpenFd('wb')) != 1) + { + // ----- Return + return $v_result; + } + + // ----- Open the temporary file in write mode + if (($v_zip_temp_fd = @fopen($p_archive_filename, 'rb')) == 0) + { + $this->privCloseFd(); + + PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open archive file \''.$p_archive_filename.'\' in binary write mode'); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Copy the files from the archive to the temporary file + // TBC : Here I should better append the file and go back to erase the central dir + $v_size = filesize($p_archive_filename); + while ($v_size != 0) + { + $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); + $v_buffer = fread($v_zip_temp_fd, $v_read_size); + @fwrite($this->zip_fd, $v_buffer, $v_read_size); + $v_size -= $v_read_size; + } + + // ----- Close + $this->privCloseFd(); + + // ----- Close the temporary file + @fclose($v_zip_temp_fd); + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privErrorLog() + // Description : + // Parameters : + // -------------------------------------------------------------------------------- + function privErrorLog($p_error_code=0, $p_error_string='') + { + if (PCLZIP_ERROR_EXTERNAL == 1) { + PclError($p_error_code, $p_error_string); + } + else { + $this->error_code = $p_error_code; + $this->error_string = $p_error_string; + } + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privErrorReset() + // Description : + // Parameters : + // -------------------------------------------------------------------------------- + function privErrorReset() + { + if (PCLZIP_ERROR_EXTERNAL == 1) { + PclErrorReset(); + } + else { + $this->error_code = 0; + $this->error_string = ''; + } + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privDisableMagicQuotes() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function privDisableMagicQuotes() + { + $v_result=1; + + // ----- Look if function exists + if ( (!function_exists("get_magic_quotes_runtime")) + || (!function_exists("set_magic_quotes_runtime"))) { + return $v_result; + } + + // ----- Look if already done + if ($this->magic_quotes_status != -1) { + return $v_result; + } + + // ----- Get and memorize the magic_quote value + $this->magic_quotes_status = @get_magic_quotes_runtime(); + + // ----- Disable magic_quotes + if ($this->magic_quotes_status == 1) { + @set_magic_quotes_runtime(0); + } + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privSwapBackMagicQuotes() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function privSwapBackMagicQuotes() + { + $v_result=1; + + // ----- Look if function exists + if ( (!function_exists("get_magic_quotes_runtime")) + || (!function_exists("set_magic_quotes_runtime"))) { + return $v_result; + } + + // ----- Look if something to do + if ($this->magic_quotes_status != -1) { + return $v_result; + } + + // ----- Swap back magic_quotes + if ($this->magic_quotes_status == 1) { + @set_magic_quotes_runtime($this->magic_quotes_status); + } + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + } + // End of class + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : PclZipUtilPathReduction() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function PclZipUtilPathReduction($p_dir) + { + $v_result = ""; + + // ----- Look for not empty path + if ($p_dir != "") { + // ----- Explode path by directory names + $v_list = explode("/", $p_dir); + + // ----- Study directories from last to first + $v_skip = 0; + for ($i=sizeof($v_list)-1; $i>=0; $i--) { + // ----- Look for current path + if ($v_list[$i] == ".") { + // ----- Ignore this directory + // Should be the first $i=0, but no check is done + } + else if ($v_list[$i] == "..") { + $v_skip++; + } + else if ($v_list[$i] == "") { + // ----- First '/' i.e. root slash + if ($i == 0) { + $v_result = "/".$v_result; + if ($v_skip > 0) { + // ----- It is an invalid path, so the path is not modified + // TBC + $v_result = $p_dir; + $v_skip = 0; + } + } + // ----- Last '/' i.e. indicates a directory + else if ($i == (sizeof($v_list)-1)) { + $v_result = $v_list[$i]; + } + // ----- Double '/' inside the path + else { + // ----- Ignore only the double '//' in path, + // but not the first and last '/' + } + } + else { + // ----- Look for item to skip + if ($v_skip > 0) { + $v_skip--; + } + else { + $v_result = $v_list[$i].($i!=(sizeof($v_list)-1)?"/".$v_result:""); + } + } + } + + // ----- Look for skip + if ($v_skip > 0) { + while ($v_skip > 0) { + $v_result = '../'.$v_result; + $v_skip--; + } + } + } + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : PclZipUtilPathInclusion() + // Description : + // This function indicates if the path $p_path is under the $p_dir tree. Or, + // said in an other way, if the file or sub-dir $p_path is inside the dir + // $p_dir. + // The function indicates also if the path is exactly the same as the dir. + // This function supports path with duplicated '/' like '//', but does not + // support '.' or '..' statements. + // Parameters : + // Return Values : + // 0 if $p_path is not inside directory $p_dir + // 1 if $p_path is inside directory $p_dir + // 2 if $p_path is exactly the same as $p_dir + // -------------------------------------------------------------------------------- + function PclZipUtilPathInclusion($p_dir, $p_path) + { + $v_result = 1; + + // ----- Look for path beginning by ./ + if ( ($p_dir == '.') + || ((strlen($p_dir) >=2) && (substr($p_dir, 0, 2) == './'))) { + $p_dir = PclZipUtilTranslateWinPath(getcwd(), FALSE).'/'.substr($p_dir, 1); + } + if ( ($p_path == '.') + || ((strlen($p_path) >=2) && (substr($p_path, 0, 2) == './'))) { + $p_path = PclZipUtilTranslateWinPath(getcwd(), FALSE).'/'.substr($p_path, 1); + } + + // ----- Explode dir and path by directory separator + $v_list_dir = explode("/", $p_dir); + $v_list_dir_size = sizeof($v_list_dir); + $v_list_path = explode("/", $p_path); + $v_list_path_size = sizeof($v_list_path); + + // ----- Study directories paths + $i = 0; + $j = 0; + while (($i < $v_list_dir_size) && ($j < $v_list_path_size) && ($v_result)) { + + // ----- Look for empty dir (path reduction) + if ($v_list_dir[$i] == '') { + $i++; + continue; + } + if ($v_list_path[$j] == '') { + $j++; + continue; + } + + // ----- Compare the items + if (($v_list_dir[$i] != $v_list_path[$j]) && ($v_list_dir[$i] != '') && ( $v_list_path[$j] != '')) { + $v_result = 0; + } + + // ----- Next items + $i++; + $j++; + } + + // ----- Look if everything seems to be the same + if ($v_result) { + // ----- Skip all the empty items + while (($j < $v_list_path_size) && ($v_list_path[$j] == '')) $j++; + while (($i < $v_list_dir_size) && ($v_list_dir[$i] == '')) $i++; + + if (($i >= $v_list_dir_size) && ($j >= $v_list_path_size)) { + // ----- There are exactly the same + $v_result = 2; + } + else if ($i < $v_list_dir_size) { + // ----- The path is shorter than the dir + $v_result = 0; + } + } + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : PclZipUtilCopyBlock() + // Description : + // Parameters : + // $p_mode : read/write compression mode + // 0 : src & dest normal + // 1 : src gzip, dest normal + // 2 : src normal, dest gzip + // 3 : src & dest gzip + // Return Values : + // -------------------------------------------------------------------------------- + function PclZipUtilCopyBlock($p_src, $p_dest, $p_size, $p_mode=0) + { + $v_result = 1; + + if ($p_mode==0) + { + while ($p_size != 0) + { + $v_read_size = ($p_size < PCLZIP_READ_BLOCK_SIZE ? $p_size : PCLZIP_READ_BLOCK_SIZE); + $v_buffer = @fread($p_src, $v_read_size); + @fwrite($p_dest, $v_buffer, $v_read_size); + $p_size -= $v_read_size; + } + } + else if ($p_mode==1) + { + while ($p_size != 0) + { + $v_read_size = ($p_size < PCLZIP_READ_BLOCK_SIZE ? $p_size : PCLZIP_READ_BLOCK_SIZE); + $v_buffer = @gzread($p_src, $v_read_size); + @fwrite($p_dest, $v_buffer, $v_read_size); + $p_size -= $v_read_size; + } + } + else if ($p_mode==2) + { + while ($p_size != 0) + { + $v_read_size = ($p_size < PCLZIP_READ_BLOCK_SIZE ? $p_size : PCLZIP_READ_BLOCK_SIZE); + $v_buffer = @fread($p_src, $v_read_size); + @gzwrite($p_dest, $v_buffer, $v_read_size); + $p_size -= $v_read_size; + } + } + else if ($p_mode==3) + { + while ($p_size != 0) + { + $v_read_size = ($p_size < PCLZIP_READ_BLOCK_SIZE ? $p_size : PCLZIP_READ_BLOCK_SIZE); + $v_buffer = @gzread($p_src, $v_read_size); + @gzwrite($p_dest, $v_buffer, $v_read_size); + $p_size -= $v_read_size; + } + } + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : PclZipUtilRename() + // Description : + // This function tries to do a simple rename() function. If it fails, it + // tries to copy the $p_src file in a new $p_dest file and then unlink the + // first one. + // Parameters : + // $p_src : Old filename + // $p_dest : New filename + // Return Values : + // 1 on success, 0 on failure. + // -------------------------------------------------------------------------------- + function PclZipUtilRename($p_src, $p_dest) + { + $v_result = 1; + + // ----- Try to rename the files + if (!@rename($p_src, $p_dest)) { + + // ----- Try to copy & unlink the src + if (!@copy($p_src, $p_dest)) { + $v_result = 0; + } + else if (!@unlink($p_src)) { + $v_result = 0; + } + } + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : PclZipUtilOptionText() + // Description : + // Translate option value in text. Mainly for debug purpose. + // Parameters : + // $p_option : the option value. + // Return Values : + // The option text value. + // -------------------------------------------------------------------------------- + function PclZipUtilOptionText($p_option) + { + + $v_list = get_defined_constants(); + for (reset($v_list); $v_key = key($v_list); next($v_list)) { + $v_prefix = substr($v_key, 0, 10); + if (( ($v_prefix == 'PCLZIP_OPT') + || ($v_prefix == 'PCLZIP_CB_') + || ($v_prefix == 'PCLZIP_ATT')) + && ($v_list[$v_key] == $p_option)) { + return $v_key; + } + } + + $v_result = 'Unknown'; + + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : PclZipUtilTranslateWinPath() + // Description : + // Translate windows path by replacing '\' by '/' and optionally removing + // drive letter. + // Parameters : + // $p_path : path to translate. + // $p_remove_disk_letter : true | false + // Return Values : + // The path translated. + // -------------------------------------------------------------------------------- + function PclZipUtilTranslateWinPath($p_path, $p_remove_disk_letter=true) + { + if (stristr(php_uname(), 'windows')) { + // ----- Look for potential disk letter + if (($p_remove_disk_letter) && (($v_position = strpos($p_path, ':')) != false)) { + $p_path = substr($p_path, $v_position+1); + } + // ----- Change potential windows directory separator + if ((strpos($p_path, '\\') > 0) || (substr($p_path, 0,1) == '\\')) { + $p_path = strtr($p_path, '\\', '/'); + } + } + return $p_path; + } + // -------------------------------------------------------------------------------- + + +?> diff --git a/src/wp-admin/includes/class-wp-comments-list-table.php b/src/wp-admin/includes/class-wp-comments-list-table.php new file mode 100644 index 0000000..fd25129 --- /dev/null +++ b/src/wp-admin/includes/class-wp-comments-list-table.php @@ -0,0 +1,559 @@ + 'comments', + 'singular' => 'comment', + 'ajax' => true, + ) ); + } + + function ajax_user_can() { + return current_user_can('edit_posts'); + } + + function prepare_items() { + global $post_id, $comment_status, $search, $comment_type; + + $comment_status = isset( $_REQUEST['comment_status'] ) ? $_REQUEST['comment_status'] : 'all'; + if ( !in_array( $comment_status, array( 'all', 'moderated', 'approved', 'spam', 'trash' ) ) ) + $comment_status = 'all'; + + $comment_type = !empty( $_REQUEST['comment_type'] ) ? $_REQUEST['comment_type'] : ''; + + $search = ( isset( $_REQUEST['s'] ) ) ? $_REQUEST['s'] : ''; + + $user_id = ( isset( $_REQUEST['user_id'] ) ) ? $_REQUEST['user_id'] : ''; + + $orderby = ( isset( $_REQUEST['orderby'] ) ) ? $_REQUEST['orderby'] : ''; + $order = ( isset( $_REQUEST['order'] ) ) ? $_REQUEST['order'] : ''; + + $comments_per_page = $this->get_per_page( $comment_status ); + + $doing_ajax = defined( 'DOING_AJAX' ) && DOING_AJAX; + + if ( isset( $_REQUEST['number'] ) ) { + $number = (int) $_REQUEST['number']; + } + else { + $number = $comments_per_page + min( 8, $comments_per_page ); // Grab a few extra + } + + $page = $this->get_pagenum(); + + if ( isset( $_REQUEST['start'] ) ) { + $start = $_REQUEST['start']; + } else { + $start = ( $page - 1 ) * $comments_per_page; + } + + if ( $doing_ajax && isset( $_REQUEST['offset'] ) ) { + $start += $_REQUEST['offset']; + } + + $status_map = array( + 'moderated' => 'hold', + 'approved' => 'approve' + ); + + $args = array( + 'status' => isset( $status_map[$comment_status] ) ? $status_map[$comment_status] : $comment_status, + 'search' => $search, + 'user_id' => $user_id, + 'offset' => $start, + 'number' => $number, + 'post_id' => $post_id, + 'type' => $comment_type, + 'orderby' => $orderby, + 'order' => $order, + ); + + $_comments = get_comments( $args ); + + update_comment_cache( $_comments ); + + $this->items = array_slice( $_comments, 0, $comments_per_page ); + $this->extra_items = array_slice( $_comments, $comments_per_page ); + + $total_comments = get_comments( array_merge( $args, array('count' => true, 'offset' => 0, 'number' => 0) ) ); + + $_comment_post_ids = array(); + foreach ( $_comments as $_c ) { + $_comment_post_ids[] = $_c->comment_post_ID; + } + + $_comment_post_ids = array_unique( $_comment_post_ids ); + + $this->pending_count = get_pending_comments_num( $_comment_post_ids ); + + $this->set_pagination_args( array( + 'total_items' => $total_comments, + 'per_page' => $comments_per_page, + ) ); + } + + function get_per_page( $comment_status = 'all' ) { + $comments_per_page = $this->get_items_per_page( 'edit_comments_per_page' ); + $comments_per_page = apply_filters( 'comments_per_page', $comments_per_page, $comment_status ); + return $comments_per_page; + } + + function no_items() { + global $comment_status; + + if ( 'moderated' == $comment_status ) + _e( 'No comments awaiting moderation… yet.' ); + else + _e( 'No comments found.' ); + } + + function get_views() { + global $post_id, $comment_status; + + $status_links = array(); + $num_comments = ( $post_id ) ? wp_count_comments( $post_id ) : wp_count_comments(); + //, number_format_i18n($num_comments->moderated) ), "" . number_format_i18n($num_comments->moderated) . ""), + //, number_format_i18n($num_comments->spam) ), "" . number_format_i18n($num_comments->spam) . "") + $stati = array( + 'all' => _nx_noop('All', 'All', 'comments'), // singular not used + 'moderated' => _n_noop('Pending (%s)', 'Pending (%s)'), + 'approved' => _n_noop('Approved', 'Approved'), // singular not used + 'spam' => _n_noop('Spam (%s)', 'Spam (%s)'), + 'trash' => _n_noop('Trash (%s)', 'Trash (%s)') + ); + + if ( !EMPTY_TRASH_DAYS ) + unset($stati['trash']); + + $link = 'edit-comments.php'; + if ( !empty($comment_type) && 'all' != $comment_type ) + $link = add_query_arg( 'comment_type', $comment_type, $link ); + + foreach ( $stati as $status => $label ) { + $class = ( $status == $comment_status ) ? ' class="current"' : ''; + + if ( !isset( $num_comments->$status ) ) + $num_comments->$status = 10; + $link = add_query_arg( 'comment_status', $status, $link ); + if ( $post_id ) + $link = add_query_arg( 'p', absint( $post_id ), $link ); + /* + // I toyed with this, but decided against it. Leaving it in here in case anyone thinks it is a good idea. ~ Mark + if ( !empty( $_REQUEST['s'] ) ) + $link = add_query_arg( 's', esc_attr( stripslashes( $_REQUEST['s'] ) ), $link ); + */ + $status_links[$status] = "" . sprintf( + translate_nooped_plural( $label, $num_comments->$status ), + number_format_i18n( $num_comments->$status ) + ) . ''; + } + + $status_links = apply_filters( 'comment_status_links', $status_links ); + return $status_links; + } + + function get_bulk_actions() { + global $comment_status; + + $actions = array(); + if ( in_array( $comment_status, array( 'all', 'approved' ) ) ) + $actions['unapprove'] = __( 'Unapprove' ); + if ( in_array( $comment_status, array( 'all', 'moderated', 'spam' ) ) ) + $actions['approve'] = __( 'Approve' ); + if ( in_array( $comment_status, array( 'all', 'moderated', 'approved' ) ) ) + $actions['spam'] = _x( 'Mark as Spam', 'comment' ); + + if ( 'trash' == $comment_status ) + $actions['untrash'] = __( 'Restore' ); + elseif ( 'spam' == $comment_status ) + $actions['unspam'] = _x( 'Not Spam', 'comment' ); + + if ( in_array( $comment_status, array( 'trash', 'spam' ) ) || !EMPTY_TRASH_DAYS ) + $actions['delete'] = __( 'Delete Permanently' ); + else + $actions['trash'] = __( 'Move to Trash' ); + + return $actions; + } + + function extra_tablenav( $which ) { + global $comment_status, $comment_type; +?> +
+ + + 'post-query-submit' ) ); + } + + if ( ( 'spam' == $comment_status || 'trash' == $comment_status ) && current_user_can( 'moderate_comments' ) ) { + wp_nonce_field( 'bulk-destroy', '_destroy_nonce' ); + $title = ( 'spam' == $comment_status ) ? esc_attr__( 'Empty Spam' ) : esc_attr__( 'Empty Trash' ); + submit_button( $title, 'button-secondary apply', 'delete_all', false ); + } + do_action( 'manage_comments_nav', $comment_status ); + echo '
'; + } + + function current_action() { + if ( isset( $_REQUEST['delete_all'] ) || isset( $_REQUEST['delete_all2'] ) ) + return 'delete_all'; + + return parent::current_action(); + } + + function get_columns() { + global $post_id; + + $columns = array(); + + if ( $this->checkbox ) + $columns['cb'] = ''; + + $columns['author'] = __( 'Author' ); + $columns['comment'] = _x( 'Comment', 'column name' ); + + if ( !$post_id ) + $columns['response'] = _x( 'In Response To', 'column name' ); + + return $columns; + } + + function get_sortable_columns() { + return array( + 'author' => 'comment_author', + 'response' => 'comment_post_ID' + ); + } + + function display() { + extract( $this->_args ); + + wp_nonce_field( "fetch-list-" . get_class( $this ), '_ajax_fetch_list_nonce' ); + + $this->display_tablenav( 'top' ); + +?> + + + + print_column_headers(); ?> + + + + + + print_column_headers( false ); ?> + + + + + display_rows_or_placeholder(); ?> + + + + items = $this->extra_items; $this->display_rows(); ?> + +
+display_tablenav( 'bottom' ); + } + + function single_row( $a_comment ) { + global $post, $comment, $the_comment_status; + + $comment = $a_comment; + $the_comment_status = wp_get_comment_status( $comment->comment_ID ); + + $post = get_post( $comment->comment_post_ID ); + + $this->user_can = current_user_can( 'edit_comment', $comment->comment_ID ); + + echo ""; + echo $this->single_row_columns( $comment ); + echo ""; + } + + function column_cb( $comment ) { + if ( $this->user_can ) + echo ""; + } + + function column_comment( $comment ) { + global $post, $comment_status, $the_comment_status; + + $user_can = $this->user_can; + + $comment_url = esc_url( get_comment_link( $comment->comment_ID ) ); + + $ptime = date( 'G', strtotime( $comment->comment_date ) ); + if ( ( abs( time() - $ptime ) ) < 86400 ) + $ptime = sprintf( __( '%s ago' ), human_time_diff( $ptime ) ); + else + $ptime = mysql2date( __( 'Y/m/d \a\t g:i A' ), $comment->comment_date ); + + if ( $user_can ) { + $del_nonce = esc_html( '_wpnonce=' . wp_create_nonce( "delete-comment_$comment->comment_ID" ) ); + $approve_nonce = esc_html( '_wpnonce=' . wp_create_nonce( "approve-comment_$comment->comment_ID" ) ); + + $url = "comment.php?c=$comment->comment_ID"; + + $approve_url = esc_url( $url . "&action=approvecomment&$approve_nonce" ); + $unapprove_url = esc_url( $url . "&action=unapprovecomment&$approve_nonce" ); + $spam_url = esc_url( $url . "&action=spamcomment&$del_nonce" ); + $unspam_url = esc_url( $url . "&action=unspamcomment&$del_nonce" ); + $trash_url = esc_url( $url . "&action=trashcomment&$del_nonce" ); + $untrash_url = esc_url( $url . "&action=untrashcomment&$del_nonce" ); + $delete_url = esc_url( $url . "&action=deletecomment&$del_nonce" ); + } + + echo ''; + comment_text(); + if ( $user_can ) { ?> + + '', 'unapprove' => '', + 'reply' => '', + 'quickedit' => '', + 'edit' => '', + 'spam' => '', 'unspam' => '', + 'trash' => '', 'untrash' => '', 'delete' => '' + ); + + if ( $comment_status && 'all' != $comment_status ) { // not looking at all comments + if ( 'approved' == $the_comment_status ) + $actions['unapprove'] = "" . __( 'Unapprove' ) . ''; + else if ( 'unapproved' == $the_comment_status ) + $actions['approve'] = "" . __( 'Approve' ) . ''; + } else { + $actions['approve'] = "" . __( 'Approve' ) . ''; + $actions['unapprove'] = "" . __( 'Unapprove' ) . ''; + } + + if ( 'spam' != $the_comment_status && 'trash' != $the_comment_status ) { + $actions['spam'] = "" . /* translators: mark as spam link */ _x( 'Spam', 'verb' ) . ''; + } elseif ( 'spam' == $the_comment_status ) { + $actions['unspam'] = "" . _x( 'Not Spam', 'comment' ) . ''; + } elseif ( 'trash' == $the_comment_status ) { + $actions['untrash'] = "" . __( 'Restore' ) . ''; + } + + if ( 'spam' == $the_comment_status || 'trash' == $the_comment_status || !EMPTY_TRASH_DAYS ) { + $actions['delete'] = "" . __( 'Delete Permanently' ) . ''; + } else { + $actions['trash'] = "" . _x( 'Trash', 'verb' ) . ''; + } + + if ( 'trash' != $the_comment_status ) { + $actions['edit'] = "". __( 'Edit' ) . ''; + $actions['quickedit'] = '' . __( 'Quick Edit' ) . ''; + if ( 'spam' != $the_comment_status ) + $actions['reply'] = '' . __( 'Reply' ) . ''; + } + + $actions = apply_filters( 'comment_row_actions', array_filter( $actions ), $comment ); + + $i = 0; + echo '
'; + foreach ( $actions as $action => $link ) { + ++$i; + ( ( ( 'approve' == $action || 'unapprove' == $action ) && 2 === $i ) || 1 === $i ) ? $sep = '' : $sep = ' | '; + + // Reply and quickedit need a hide-if-no-js span when not added with ajax + if ( ( 'reply' == $action || 'quickedit' == $action ) && ! defined('DOING_AJAX') ) + $action .= ' hide-if-no-js'; + elseif ( ( $action == 'untrash' && $the_comment_status == 'trash' ) || ( $action == 'unspam' && $the_comment_status == 'spam' ) ) { + if ( '1' == get_comment_meta( $comment->comment_ID, '_wp_trash_meta_status', true ) ) + $action .= ' approve'; + else + $action .= ' unapprove'; + } + + echo "$sep$link"; + } + echo '
'; + } + } + + function column_author( $comment ) { + global $comment_status; + + $author_url = get_comment_author_url(); + if ( 'http://' == $author_url ) + $author_url = ''; + $author_url_display = preg_replace( '|http://(www\.)?|i', '', $author_url ); + if ( strlen( $author_url_display ) > 50 ) + $author_url_display = substr( $author_url_display, 0, 49 ) . '...'; + + echo ""; comment_author(); echo '
'; + if ( !empty( $author_url ) ) + echo "$author_url_display
"; + + if ( $this->user_can ) { + if ( !empty( $comment->comment_author_email ) ) { + comment_author_email_link(); + echo '
'; + } + echo ''; + comment_author_IP(); + echo ''; + } + } + + function column_date( $comment ) { + return get_comment_date( __( 'Y/m/d \a\t g:ia' ) ); + } + + function column_response( $comment ) { + global $post; + + if ( isset( $this->pending_count[$post->ID] ) ) { + $pending_comments = $this->pending_count[$post->ID]; + } else { + $_pending_count_temp = get_pending_comments_num( array( $post->ID ) ); + $pending_comments = $this->pending_count[$post->ID] = $_pending_count_temp[$post->ID]; + } + + if ( current_user_can( 'edit_post', $post->ID ) ) { + $post_link = ""; + $post_link .= get_the_title( $post->ID ) . ''; + } else { + $post_link = get_the_title( $post->ID ); + } + + echo ''; + if ( 'attachment' == $post->post_type && ( $thumb = wp_get_attachment_image( $post->ID, array( 80, 60 ), true ) ) ) + echo $thumb; + } + + function column_default( $comment, $column_name ) { + do_action( 'manage_comments_custom_column', $column_name, $comment->comment_ID ); + } +} + +/** + * Post Comments List Table class. + * + * @package WordPress + * @subpackage List_Table + * @since 3.1.0 + * @access private + * + * @see WP_Comments_Table + */ +class WP_Post_Comments_List_Table extends WP_Comments_List_Table { + + function get_column_info() { + $this->_column_headers = array( + array( + 'author' => __( 'Author' ), + 'comment' => _x( 'Comment', 'column name' ), + ), + array(), + array(), + ); + + return $this->_column_headers; + } + + function get_table_classes() { + $classes = parent::get_table_classes(); + $classes[] = 'comments-box'; + return $classes; + } + + function display( $output_empty = false ) { + extract( $this->_args ); + + wp_nonce_field( "fetch-list-" . get_class( $this ), '_ajax_fetch_list_nonce' ); +?> + + > + display_rows_or_placeholder(); ?> + + + diff --git a/src/wp-admin/includes/class-wp-filesystem-base.php b/src/wp-admin/includes/class-wp-filesystem-base.php new file mode 100644 index 0000000..fd3fdc3 --- /dev/null +++ b/src/wp-admin/includes/class-wp-filesystem-base.php @@ -0,0 +1,332 @@ +find_folder(ABSPATH); + //Perhaps the FTP folder is rooted at the WordPress install, Check for wp-includes folder in root, Could have some false positives, but rare. + if ( ! $folder && $this->is_dir('/wp-includes') ) + $folder = '/'; + return $folder; + } + /** + * Returns the path on the remote filesystem of WP_CONTENT_DIR + * + * @since 2.7 + * @access public + * @return string The location of the remote path. + */ + function wp_content_dir() { + return $this->find_folder(WP_CONTENT_DIR); + } + /** + * Returns the path on the remote filesystem of WP_PLUGIN_DIR + * + * @since 2.7 + * @access public + * + * @return string The location of the remote path. + */ + function wp_plugins_dir() { + return $this->find_folder(WP_PLUGIN_DIR); + } + /** + * Returns the path on the remote filesystem of the Themes Directory + * + * @since 2.7 + * @access public + * + * @return string The location of the remote path. + */ + function wp_themes_dir() { + return $this->wp_content_dir() . 'themes/'; + } + /** + * Returns the path on the remote filesystem of WP_LANG_DIR + * + * @since 3.2.0 + * @access public + * + * @return string The location of the remote path. + */ + function wp_lang_dir() { + return $this->find_folder(WP_LANG_DIR); + } + + /** + * Locates a folder on the remote filesystem. + * + * Deprecated; use WP_Filesystem::abspath() or WP_Filesystem::wp_*_dir() methods instead. + * + * @since 2.5 + * @deprecated 2.7 + * @access public + * + * @param string $base The folder to start searching from + * @param bool $echo True to display debug information + * @return string The location of the remote path. + */ + function find_base_dir($base = '.', $echo = false) { + _deprecated_function(__FUNCTION__, '2.7', 'WP_Filesystem::abspath() or WP_Filesystem::wp_*_dir()' ); + $this->verbose = $echo; + return $this->abspath(); + } + /** + * Locates a folder on the remote filesystem. + * + * Deprecated; use WP_Filesystem::abspath() or WP_Filesystem::wp_*_dir() methods instead. + * + * @since 2.5 + * @deprecated 2.7 + * @access public + * + * @param string $base The folder to start searching from + * @param bool $echo True to display debug information + * @return string The location of the remote path. + */ + function get_base_dir($base = '.', $echo = false) { + _deprecated_function(__FUNCTION__, '2.7', 'WP_Filesystem::abspath() or WP_Filesystem::wp_*_dir()' ); + $this->verbose = $echo; + return $this->abspath(); + } + + /** + * Locates a folder on the remote filesystem. + * + * Assumes that on Windows systems, Stripping off the Drive letter is OK + * Sanitizes \\ to / in windows filepaths. + * + * @since 2.7 + * @access public + * + * @param string $folder the folder to locate + * @return string The location of the remote path. + */ + function find_folder($folder) { + + if ( strpos($this->method, 'ftp') !== false ) { + $constant_overrides = array( 'FTP_BASE' => ABSPATH, 'FTP_CONTENT_DIR' => WP_CONTENT_DIR, 'FTP_PLUGIN_DIR' => WP_PLUGIN_DIR, 'FTP_LANG_DIR' => WP_LANG_DIR ); + foreach ( $constant_overrides as $constant => $dir ) + if ( defined($constant) && $folder === $dir ) + return trailingslashit(constant($constant)); + } elseif ( 'direct' == $this->method ) { + $folder = str_replace('\\', '/', $folder); //Windows path sanitiation + return trailingslashit($folder); + } + + $folder = preg_replace('|^([a-z]{1}):|i', '', $folder); //Strip out windows driveletter if its there. + $folder = str_replace('\\', '/', $folder); //Windows path sanitiation + + if ( isset($this->cache[ $folder ] ) ) + return $this->cache[ $folder ]; + + if ( $this->exists($folder) ) { //Folder exists at that absolute path. + $folder = trailingslashit($folder); + $this->cache[ $folder ] = $folder; + return $folder; + } + if ( $return = $this->search_for_folder($folder) ) + $this->cache[ $folder ] = $return; + return $return; + } + + /** + * Locates a folder on the remote filesystem. + * + * Expects Windows sanitized path + * + * @since 2.7 + * @access private + * + * @param string $folder the folder to locate + * @param string $base the folder to start searching from + * @param bool $loop if the function has recursed, Internal use only + * @return string The location of the remote path. + */ + function search_for_folder($folder, $base = '.', $loop = false ) { + if ( empty( $base ) || '.' == $base ) + $base = trailingslashit($this->cwd()); + + $folder = untrailingslashit($folder); + + $folder_parts = explode('/', $folder); + $last_path = $folder_parts[ count($folder_parts) - 1 ]; + + $files = $this->dirlist( $base ); + + foreach ( $folder_parts as $key ) { + if ( $key == $last_path ) + continue; //We want this to be caught by the next code block. + + //Working from /home/ to /user/ to /wordpress/ see if that file exists within the current folder, + // If its found, change into it and follow through looking for it. + // If it cant find WordPress down that route, it'll continue onto the next folder level, and see if that matches, and so on. + // If it reaches the end, and still cant find it, it'll return false for the entire function. + if ( isset($files[ $key ]) ){ + //Lets try that folder: + $newdir = trailingslashit(path_join($base, $key)); + if ( $this->verbose ) + printf( __('Changing to %s') . '
', $newdir ); + if ( $ret = $this->search_for_folder( $folder, $newdir, $loop) ) + return $ret; + } + } + + //Only check this as a last resort, to prevent locating the incorrect install. All above procedures will fail quickly if this is the right branch to take. + if (isset( $files[ $last_path ] ) ) { + if ( $this->verbose ) + printf( __('Found %s') . '
', $base . $last_path ); + return trailingslashit($base . $last_path); + } + if ( $loop ) + return false; //Prevent this function from looping again. + //As an extra last resort, Change back to / if the folder wasnt found. This comes into effect when the CWD is /home/user/ but WP is at /var/www/.... mainly dedicated setups. + return $this->search_for_folder($folder, '/', true); + + } + + /** + * Returns the *nix style file permissions for a file + * + * From the PHP documentation page for fileperms() + * + * @link http://docs.php.net/fileperms + * @since 2.5 + * @access public + * + * @param string $file string filename + * @return int octal representation of permissions + */ + function gethchmod($file){ + $perms = $this->getchmod($file); + if (($perms & 0xC000) == 0xC000) // Socket + $info = 's'; + elseif (($perms & 0xA000) == 0xA000) // Symbolic Link + $info = 'l'; + elseif (($perms & 0x8000) == 0x8000) // Regular + $info = '-'; + elseif (($perms & 0x6000) == 0x6000) // Block special + $info = 'b'; + elseif (($perms & 0x4000) == 0x4000) // Directory + $info = 'd'; + elseif (($perms & 0x2000) == 0x2000) // Character special + $info = 'c'; + elseif (($perms & 0x1000) == 0x1000) // FIFO pipe + $info = 'p'; + else // Unknown + $info = 'u'; + + // Owner + $info .= (($perms & 0x0100) ? 'r' : '-'); + $info .= (($perms & 0x0080) ? 'w' : '-'); + $info .= (($perms & 0x0040) ? + (($perms & 0x0800) ? 's' : 'x' ) : + (($perms & 0x0800) ? 'S' : '-')); + + // Group + $info .= (($perms & 0x0020) ? 'r' : '-'); + $info .= (($perms & 0x0010) ? 'w' : '-'); + $info .= (($perms & 0x0008) ? + (($perms & 0x0400) ? 's' : 'x' ) : + (($perms & 0x0400) ? 'S' : '-')); + + // World + $info .= (($perms & 0x0004) ? 'r' : '-'); + $info .= (($perms & 0x0002) ? 'w' : '-'); + $info .= (($perms & 0x0001) ? + (($perms & 0x0200) ? 't' : 'x' ) : + (($perms & 0x0200) ? 'T' : '-')); + return $info; + } + + /** + * Converts *nix style file permissions to a octal number. + * + * Converts '-rw-r--r--' to 0644 + * From "info at rvgate dot nl"'s comment on the PHP documentation for chmod() + * + * @link http://docs.php.net/manual/en/function.chmod.php#49614 + * @since 2.5 + * @access public + * + * @param string $mode string *nix style file permission + * @return int octal representation + */ + function getnumchmodfromh($mode) { + $realmode = ''; + $legal = array('', 'w', 'r', 'x', '-'); + $attarray = preg_split('//', $mode); + + for ($i=0; $i < count($attarray); $i++) + if ($key = array_search($attarray[$i], $legal)) + $realmode .= $legal[$key]; + + $mode = str_pad($realmode, 9, '-'); + $trans = array('-'=>'0', 'r'=>'4', 'w'=>'2', 'x'=>'1'); + $mode = strtr($mode,$trans); + + $newmode = ''; + $newmode .= $mode[0] + $mode[1] + $mode[2]; + $newmode .= $mode[3] + $mode[4] + $mode[5]; + $newmode .= $mode[6] + $mode[7] + $mode[8]; + return $newmode; + } + + /** + * Determines if the string provided contains binary characters. + * + * @since 2.7 + * @access private + * + * @param string $text String to test against + * @return bool true if string is binary, false otherwise + */ + function is_binary( $text ) { + return (bool) preg_match('|[^\x20-\x7E]|', $text); //chr(32)..chr(127) + } +} + +?> diff --git a/src/wp-admin/includes/class-wp-filesystem-direct.php b/src/wp-admin/includes/class-wp-filesystem-direct.php new file mode 100644 index 0000000..9703d73 --- /dev/null +++ b/src/wp-admin/includes/class-wp-filesystem-direct.php @@ -0,0 +1,364 @@ +method = 'direct'; + $this->errors = new WP_Error(); + } + /** + * connect filesystem. + * + * @return bool Returns true on success or false on failure (always true for WP_Filesystem_Direct). + */ + function connect() { + return true; + } + /** + * Reads entire file into a string + * + * @param string $file Name of the file to read. + * @return string|bool The function returns the read data or false on failure. + */ + function get_contents($file) { + return @file_get_contents($file); + } + /** + * Reads entire file into an array + * + * @param string $file Path to the file. + * @return array|bool the file contents in an array or false on failure. + */ + function get_contents_array($file) { + return @file($file); + } + /** + * Write a string to a file + * + * @param string $file Remote path to the file where to write the data. + * @param string $contents The data to write. + * @param int $mode (optional) The file permissions as octal number, usually 0644. + * @return bool False upon failure. + */ + function put_contents($file, $contents, $mode = false ) { + if ( ! ($fp = @fopen($file, 'w')) ) + return false; + @fwrite($fp, $contents); + @fclose($fp); + $this->chmod($file, $mode); + return true; + } + /** + * Gets the current working directory + * + * @return string|bool the current working directory on success, or false on failure. + */ + function cwd() { + return @getcwd(); + } + /** + * Change directory + * + * @param string $dir The new current directory. + * @return bool Returns true on success or false on failure. + */ + function chdir($dir) { + return @chdir($dir); + } + /** + * Changes file group + * + * @param string $file Path to the file. + * @param mixed $group A group name or number. + * @param bool $recursive (optional) If set True changes file group recursivly. Defaults to False. + * @return bool Returns true on success or false on failure. + */ + function chgrp($file, $group, $recursive = false) { + if ( ! $this->exists($file) ) + return false; + if ( ! $recursive ) + return @chgrp($file, $group); + if ( ! $this->is_dir($file) ) + return @chgrp($file, $group); + //Is a directory, and we want recursive + $file = trailingslashit($file); + $filelist = $this->dirlist($file); + foreach ($filelist as $filename) + $this->chgrp($file . $filename, $group, $recursive); + + return true; + } + /** + * Changes filesystem permissions + * + * @param string $file Path to the file. + * @param int $mode (optional) The permissions as octal number, usually 0644 for files, 0755 for dirs. + * @param bool $recursive (optional) If set True changes file group recursivly. Defaults to False. + * @return bool Returns true on success or false on failure. + */ + function chmod($file, $mode = false, $recursive = false) { + if ( ! $mode ) { + if ( $this->is_file($file) ) + $mode = FS_CHMOD_FILE; + elseif ( $this->is_dir($file) ) + $mode = FS_CHMOD_DIR; + else + return false; + } + + if ( ! $recursive || ! $this->is_dir($file) ) + return @chmod($file, $mode); + //Is a directory, and we want recursive + $file = trailingslashit($file); + $filelist = $this->dirlist($file); + foreach ( (array)$filelist as $filename => $filemeta) + $this->chmod($file . $filename, $mode, $recursive); + + return true; + } + /** + * Changes file owner + * + * @param string $file Path to the file. + * @param mixed $owner A user name or number. + * @param bool $recursive (optional) If set True changes file owner recursivly. Defaults to False. + * @return bool Returns true on success or false on failure. + */ + function chown($file, $owner, $recursive = false) { + if ( ! $this->exists($file) ) + return false; + if ( ! $recursive ) + return @chown($file, $owner); + if ( ! $this->is_dir($file) ) + return @chown($file, $owner); + //Is a directory, and we want recursive + $filelist = $this->dirlist($file); + foreach ($filelist as $filename) { + $this->chown($file . '/' . $filename, $owner, $recursive); + } + return true; + } + /** + * Gets file owner + * + * @param string $file Path to the file. + * @return string Username of the user. + */ + function owner($file) { + $owneruid = @fileowner($file); + if ( ! $owneruid ) + return false; + if ( ! function_exists('posix_getpwuid') ) + return $owneruid; + $ownerarray = posix_getpwuid($owneruid); + return $ownerarray['name']; + } + /** + * Gets file permissions + * + * FIXME does not handle errors in fileperms() + * + * @param string $file Path to the file. + * @return string Mode of the file (last 4 digits). + */ + function getchmod($file) { + return substr(decoct(@fileperms($file)),3); + } + function group($file) { + $gid = @filegroup($file); + if ( ! $gid ) + return false; + if ( ! function_exists('posix_getgrgid') ) + return $gid; + $grouparray = posix_getgrgid($gid); + return $grouparray['name']; + } + + function copy($source, $destination, $overwrite = false, $mode = false) { + if ( ! $overwrite && $this->exists($destination) ) + return false; + + $rtval = copy($source, $destination); + if ( $mode ) + $this->chmod($destination, $mode); + return $rtval; + } + + function move($source, $destination, $overwrite = false) { + if ( ! $overwrite && $this->exists($destination) ) + return false; + + // try using rename first. if that fails (for example, source is read only) try copy + if ( @rename($source, $destination) ) + return true; + + if ( $this->copy($source, $destination, $overwrite) && $this->exists($destination) ) { + $this->delete($source); + return true; + } else { + return false; + } + } + + function delete($file, $recursive = false, $type = false) { + if ( empty($file) ) //Some filesystems report this as /, which can cause non-expected recursive deletion of all files in the filesystem. + return false; + $file = str_replace('\\', '/', $file); //for win32, occasional problems deleting files otherwise + + if ( 'f' == $type || $this->is_file($file) ) + return @unlink($file); + if ( ! $recursive && $this->is_dir($file) ) + return @rmdir($file); + + //At this point its a folder, and we're in recursive mode + $file = trailingslashit($file); + $filelist = $this->dirlist($file, true); + + $retval = true; + if ( is_array($filelist) ) //false if no files, So check first. + foreach ($filelist as $filename => $fileinfo) + if ( ! $this->delete($file . $filename, $recursive, $fileinfo['type']) ) + $retval = false; + + if ( file_exists($file) && ! @rmdir($file) ) + $retval = false; + return $retval; + } + + function exists($file) { + return @file_exists($file); + } + + function is_file($file) { + return @is_file($file); + } + + function is_dir($path) { + return @is_dir($path); + } + + function is_readable($file) { + return @is_readable($file); + } + + function is_writable($file) { + return @is_writable($file); + } + + function atime($file) { + return @fileatime($file); + } + + function mtime($file) { + return @filemtime($file); + } + function size($file) { + return @filesize($file); + } + + function touch($file, $time = 0, $atime = 0) { + if ($time == 0) + $time = time(); + if ($atime == 0) + $atime = time(); + return @touch($file, $time, $atime); + } + + function mkdir($path, $chmod = false, $chown = false, $chgrp = false) { + // safe mode fails with a trailing slash under certain PHP versions. + $path = untrailingslashit($path); + if ( empty($path) ) + $path = '/'; + + if ( ! $chmod ) + $chmod = FS_CHMOD_DIR; + + if ( ! @mkdir($path) ) + return false; + $this->chmod($path, $chmod); + if ( $chown ) + $this->chown($path, $chown); + if ( $chgrp ) + $this->chgrp($path, $chgrp); + return true; + } + + function rmdir($path, $recursive = false) { + return $this->delete($path, $recursive); + } + + function dirlist($path, $include_hidden = true, $recursive = false) { + if ( $this->is_file($path) ) { + $limit_file = basename($path); + $path = dirname($path); + } else { + $limit_file = false; + } + + if ( ! $this->is_dir($path) ) + return false; + + $dir = @dir($path); + if ( ! $dir ) + return false; + + $ret = array(); + + while (false !== ($entry = $dir->read()) ) { + $struc = array(); + $struc['name'] = $entry; + + if ( '.' == $struc['name'] || '..' == $struc['name'] ) + continue; + + if ( ! $include_hidden && '.' == $struc['name'][0] ) + continue; + + if ( $limit_file && $struc['name'] != $limit_file) + continue; + + $struc['perms'] = $this->gethchmod($path.'/'.$entry); + $struc['permsn'] = $this->getnumchmodfromh($struc['perms']); + $struc['number'] = false; + $struc['owner'] = $this->owner($path.'/'.$entry); + $struc['group'] = $this->group($path.'/'.$entry); + $struc['size'] = $this->size($path.'/'.$entry); + $struc['lastmodunix']= $this->mtime($path.'/'.$entry); + $struc['lastmod'] = date('M j',$struc['lastmodunix']); + $struc['time'] = date('h:i:s',$struc['lastmodunix']); + $struc['type'] = $this->is_dir($path.'/'.$entry) ? 'd' : 'f'; + + if ( 'd' == $struc['type'] ) { + if ( $recursive ) + $struc['files'] = $this->dirlist($path . '/' . $struc['name'], $include_hidden, $recursive); + else + $struc['files'] = array(); + } + + $ret[ $struc['name'] ] = $struc; + } + $dir->close(); + unset($dir); + return $ret; + } +} +?> diff --git a/src/wp-admin/includes/class-wp-filesystem-ftpext.php b/src/wp-admin/includes/class-wp-filesystem-ftpext.php new file mode 100644 index 0000000..ff65d4c --- /dev/null +++ b/src/wp-admin/includes/class-wp-filesystem-ftpext.php @@ -0,0 +1,387 @@ +method = 'ftpext'; + $this->errors = new WP_Error(); + + //Check if possible to use ftp functions. + if ( ! extension_loaded('ftp') ) { + $this->errors->add('no_ftp_ext', __('The ftp PHP extension is not available')); + return false; + } + + // Set defaults: + //This Class uses the timeout on a per-connection basis, Others use it on a per-action basis. + + if ( ! defined('FS_TIMEOUT') ) + define('FS_TIMEOUT', 240); + + if ( empty($opt['port']) ) + $this->options['port'] = 21; + else + $this->options['port'] = $opt['port']; + + if ( empty($opt['hostname']) ) + $this->errors->add('empty_hostname', __('FTP hostname is required')); + else + $this->options['hostname'] = $opt['hostname']; + + if ( ! empty($opt['base']) ) + $this->wp_base = $opt['base']; + + // Check if the options provided are OK. + if ( empty($opt['username']) ) + $this->errors->add('empty_username', __('FTP username is required')); + else + $this->options['username'] = $opt['username']; + + if ( empty($opt['password']) ) + $this->errors->add('empty_password', __('FTP password is required')); + else + $this->options['password'] = $opt['password']; + + $this->options['ssl'] = false; + if ( isset($opt['connection_type']) && 'ftps' == $opt['connection_type'] ) + $this->options['ssl'] = true; + } + + function connect() { + if ( isset($this->options['ssl']) && $this->options['ssl'] && function_exists('ftp_ssl_connect') ) + $this->link = @ftp_ssl_connect($this->options['hostname'], $this->options['port'], FS_CONNECT_TIMEOUT); + else + $this->link = @ftp_connect($this->options['hostname'], $this->options['port'], FS_CONNECT_TIMEOUT); + + if ( ! $this->link ) { + $this->errors->add('connect', sprintf(__('Failed to connect to FTP Server %1$s:%2$s'), $this->options['hostname'], $this->options['port'])); + return false; + } + + if ( ! @ftp_login($this->link,$this->options['username'], $this->options['password']) ) { + $this->errors->add('auth', sprintf(__('Username/Password incorrect for %s'), $this->options['username'])); + return false; + } + + //Set the Connection to use Passive FTP + @ftp_pasv( $this->link, true ); + if ( @ftp_get_option($this->link, FTP_TIMEOUT_SEC) < FS_TIMEOUT ) + @ftp_set_option($this->link, FTP_TIMEOUT_SEC, FS_TIMEOUT); + + return true; + } + + function get_contents($file, $type = '', $resumepos = 0 ) { + if ( empty($type) ) + $type = FTP_BINARY; + + $tempfile = wp_tempnam($file); + $temp = fopen($tempfile, 'w+'); + + if ( ! $temp ) + return false; + + if ( ! @ftp_fget($this->link, $temp, $file, $type, $resumepos) ) + return false; + + fseek($temp, 0); //Skip back to the start of the file being written to + $contents = ''; + + while ( ! feof($temp) ) + $contents .= fread($temp, 8192); + + fclose($temp); + unlink($tempfile); + return $contents; + } + function get_contents_array($file) { + return explode("\n", $this->get_contents($file)); + } + + function put_contents($file, $contents, $mode = false ) { + $tempfile = wp_tempnam($file); + $temp = fopen($tempfile, 'w+'); + if ( ! $temp ) + return false; + + fwrite($temp, $contents); + fseek($temp, 0); //Skip back to the start of the file being written to + + $type = $this->is_binary($contents) ? FTP_BINARY : FTP_ASCII; + $ret = @ftp_fput($this->link, $file, $temp, $type); + + fclose($temp); + unlink($tempfile); + + $this->chmod($file, $mode); + + return $ret; + } + function cwd() { + $cwd = @ftp_pwd($this->link); + if ( $cwd ) + $cwd = trailingslashit($cwd); + return $cwd; + } + function chdir($dir) { + return @ftp_chdir($this->link, $dir); + } + function chgrp($file, $group, $recursive = false ) { + return false; + } + function chmod($file, $mode = false, $recursive = false) { + if ( ! $mode ) { + if ( $this->is_file($file) ) + $mode = FS_CHMOD_FILE; + elseif ( $this->is_dir($file) ) + $mode = FS_CHMOD_DIR; + else + return false; + } + + // chmod any sub-objects if recursive. + if ( $recursive && $this->is_dir($file) ) { + $filelist = $this->dirlist($file); + foreach ( (array)$filelist as $filename => $filemeta ) + $this->chmod($file . '/' . $filename, $mode, $recursive); + } + + // chmod the file or directory + if ( ! function_exists('ftp_chmod') ) + return (bool)@ftp_site($this->link, sprintf('CHMOD %o %s', $mode, $file)); + return (bool)@ftp_chmod($this->link, $mode, $file); + } + function chown($file, $owner, $recursive = false ) { + return false; + } + function owner($file) { + $dir = $this->dirlist($file); + return $dir[$file]['owner']; + } + function getchmod($file) { + $dir = $this->dirlist($file); + return $dir[$file]['permsn']; + } + function group($file) { + $dir = $this->dirlist($file); + return $dir[$file]['group']; + } + function copy($source, $destination, $overwrite = false, $mode = false) { + if ( ! $overwrite && $this->exists($destination) ) + return false; + $content = $this->get_contents($source); + if ( false === $content) + return false; + return $this->put_contents($destination, $content, $mode); + } + function move($source, $destination, $overwrite = false) { + return ftp_rename($this->link, $source, $destination); + } + + function delete($file, $recursive = false, $type = false) { + if ( empty($file) ) + return false; + if ( 'f' == $type || $this->is_file($file) ) + return @ftp_delete($this->link, $file); + if ( !$recursive ) + return @ftp_rmdir($this->link, $file); + + $filelist = $this->dirlist( trailingslashit($file) ); + if ( !empty($filelist) ) + foreach ( $filelist as $delete_file ) + $this->delete( trailingslashit($file) . $delete_file['name'], $recursive, $delete_file['type'] ); + return @ftp_rmdir($this->link, $file); + } + + function exists($file) { + $list = @ftp_nlist($this->link, $file); + return !empty($list); //empty list = no file, so invert. + } + function is_file($file) { + return $this->exists($file) && !$this->is_dir($file); + } + function is_dir($path) { + $cwd = $this->cwd(); + $result = @ftp_chdir($this->link, trailingslashit($path) ); + if ( $result && $path == $this->cwd() || $this->cwd() != $cwd ) { + @ftp_chdir($this->link, $cwd); + return true; + } + return false; + } + function is_readable($file) { + //Get dir list, Check if the file is readable by the current user?? + return true; + } + function is_writable($file) { + //Get dir list, Check if the file is writable by the current user?? + return true; + } + function atime($file) { + return false; + } + function mtime($file) { + return ftp_mdtm($this->link, $file); + } + function size($file) { + return ftp_size($this->link, $file); + } + function touch($file, $time = 0, $atime = 0) { + return false; + } + function mkdir($path, $chmod = false, $chown = false, $chgrp = false) { + if ( !@ftp_mkdir($this->link, $path) ) + return false; + $this->chmod($path, $chmod); + if ( $chown ) + $this->chown($path, $chown); + if ( $chgrp ) + $this->chgrp($path, $chgrp); + return true; + } + function rmdir($path, $recursive = false) { + return $this->delete($path, $recursive); + } + + function parselisting($line) { + static $is_windows; + if ( is_null($is_windows) ) + $is_windows = stripos( ftp_systype($this->link), 'win') !== false; + + if ( $is_windows && preg_match('/([0-9]{2})-([0-9]{2})-([0-9]{2}) +([0-9]{2}):([0-9]{2})(AM|PM) +([0-9]+|) +(.+)/', $line, $lucifer) ) { + $b = array(); + if ( $lucifer[3] < 70 ) + $lucifer[3] +=2000; + else + $lucifer[3] += 1900; // 4digit year fix + $b['isdir'] = ( $lucifer[7] == ''); + if ( $b['isdir'] ) + $b['type'] = 'd'; + else + $b['type'] = 'f'; + $b['size'] = $lucifer[7]; + $b['month'] = $lucifer[1]; + $b['day'] = $lucifer[2]; + $b['year'] = $lucifer[3]; + $b['hour'] = $lucifer[4]; + $b['minute'] = $lucifer[5]; + $b['time'] = @mktime($lucifer[4] + (strcasecmp($lucifer[6], "PM") == 0 ? 12 : 0), $lucifer[5], 0, $lucifer[1], $lucifer[2], $lucifer[3]); + $b['am/pm'] = $lucifer[6]; + $b['name'] = $lucifer[8]; + } elseif ( !$is_windows && $lucifer = preg_split('/[ ]/', $line, 9, PREG_SPLIT_NO_EMPTY)) { + //echo $line."\n"; + $lcount = count($lucifer); + if ( $lcount < 8 ) + return ''; + $b = array(); + $b['isdir'] = $lucifer[0]{0} === 'd'; + $b['islink'] = $lucifer[0]{0} === 'l'; + if ( $b['isdir'] ) + $b['type'] = 'd'; + elseif ( $b['islink'] ) + $b['type'] = 'l'; + else + $b['type'] = 'f'; + $b['perms'] = $lucifer[0]; + $b['number'] = $lucifer[1]; + $b['owner'] = $lucifer[2]; + $b['group'] = $lucifer[3]; + $b['size'] = $lucifer[4]; + if ( $lcount == 8 ) { + sscanf($lucifer[5], '%d-%d-%d', $b['year'], $b['month'], $b['day']); + sscanf($lucifer[6], '%d:%d', $b['hour'], $b['minute']); + $b['time'] = @mktime($b['hour'], $b['minute'], 0, $b['month'], $b['day'], $b['year']); + $b['name'] = $lucifer[7]; + } else { + $b['month'] = $lucifer[5]; + $b['day'] = $lucifer[6]; + if ( preg_match('/([0-9]{2}):([0-9]{2})/', $lucifer[7], $l2) ) { + $b['year'] = date("Y"); + $b['hour'] = $l2[1]; + $b['minute'] = $l2[2]; + } else { + $b['year'] = $lucifer[7]; + $b['hour'] = 0; + $b['minute'] = 0; + } + $b['time'] = strtotime( sprintf('%d %s %d %02d:%02d', $b['day'], $b['month'], $b['year'], $b['hour'], $b['minute']) ); + $b['name'] = $lucifer[8]; + } + } + + return $b; + } + + function dirlist($path = '.', $include_hidden = true, $recursive = false) { + if ( $this->is_file($path) ) { + $limit_file = basename($path); + $path = dirname($path) . '/'; + } else { + $limit_file = false; + } + + $pwd = @ftp_pwd($this->link); + if ( ! @ftp_chdir($this->link, $path) ) // Cant change to folder = folder doesnt exist + return false; + $list = @ftp_rawlist($this->link, '-a', false); + @ftp_chdir($this->link, $pwd); + + if ( empty($list) ) // Empty array = non-existent folder (real folder will show . at least) + return false; + + $dirlist = array(); + foreach ( $list as $k => $v ) { + $entry = $this->parselisting($v); + if ( empty($entry) ) + continue; + + if ( '.' == $entry['name'] || '..' == $entry['name'] ) + continue; + + if ( ! $include_hidden && '.' == $entry['name'][0] ) + continue; + + if ( $limit_file && $entry['name'] != $limit_file) + continue; + + $dirlist[ $entry['name'] ] = $entry; + } + + $ret = array(); + foreach ( (array)$dirlist as $struc ) { + if ( 'd' == $struc['type'] ) { + if ( $recursive ) + $struc['files'] = $this->dirlist($path . '/' . $struc['name'], $include_hidden, $recursive); + else + $struc['files'] = array(); + } + + $ret[ $struc['name'] ] = $struc; + } + return $ret; + } + + function __destruct() { + if ( $this->link ) + ftp_close($this->link); + } +} + +?> diff --git a/src/wp-admin/includes/class-wp-filesystem-ftpsockets.php b/src/wp-admin/includes/class-wp-filesystem-ftpsockets.php new file mode 100644 index 0000000..1dc170a --- /dev/null +++ b/src/wp-admin/includes/class-wp-filesystem-ftpsockets.php @@ -0,0 +1,327 @@ +method = 'ftpsockets'; + $this->errors = new WP_Error(); + + //Check if possible to use ftp functions. + if ( ! @include_once ABSPATH . 'wp-admin/includes/class-ftp.php' ) + return false; + $this->ftp = new ftp(); + + //Set defaults: + if ( empty($opt['port']) ) + $this->options['port'] = 21; + else + $this->options['port'] = $opt['port']; + + if ( empty($opt['hostname']) ) + $this->errors->add('empty_hostname', __('FTP hostname is required')); + else + $this->options['hostname'] = $opt['hostname']; + + if ( ! empty($opt['base']) ) + $this->wp_base = $opt['base']; + + // Check if the options provided are OK. + if ( empty ($opt['username']) ) + $this->errors->add('empty_username', __('FTP username is required')); + else + $this->options['username'] = $opt['username']; + + if ( empty ($opt['password']) ) + $this->errors->add('empty_password', __('FTP password is required')); + else + $this->options['password'] = $opt['password']; + } + + function connect() { + if ( ! $this->ftp ) + return false; + + $this->ftp->setTimeout(FS_CONNECT_TIMEOUT); + + if ( ! $this->ftp->SetServer($this->options['hostname'], $this->options['port']) ) { + $this->errors->add('connect', sprintf(__('Failed to connect to FTP Server %1$s:%2$s'), $this->options['hostname'], $this->options['port'])); + return false; + } + + if ( ! $this->ftp->connect() ) { + $this->errors->add('connect', sprintf(__('Failed to connect to FTP Server %1$s:%2$s'), $this->options['hostname'], $this->options['port'])); + return false; + } + + if ( ! $this->ftp->login($this->options['username'], $this->options['password']) ) { + $this->errors->add('auth', sprintf(__('Username/Password incorrect for %s'), $this->options['username'])); + return false; + } + + $this->ftp->SetType(FTP_AUTOASCII); + $this->ftp->Passive(true); + $this->ftp->setTimeout(FS_TIMEOUT); + return true; + } + + function get_contents($file, $type = '', $resumepos = 0) { + if ( ! $this->exists($file) ) + return false; + + if ( empty($type) ) + $type = FTP_AUTOASCII; + $this->ftp->SetType($type); + + $temp = wp_tempnam( $file ); + + if ( ! $temphandle = fopen($temp, 'w+') ) + return false; + + if ( ! $this->ftp->fget($temphandle, $file) ) { + fclose($temphandle); + unlink($temp); + return ''; //Blank document, File does exist, Its just blank. + } + + fseek($temphandle, 0); //Skip back to the start of the file being written to + $contents = ''; + + while ( ! feof($temphandle) ) + $contents .= fread($temphandle, 8192); + + fclose($temphandle); + unlink($temp); + return $contents; + } + + function get_contents_array($file) { + return explode("\n", $this->get_contents($file) ); + } + + function put_contents($file, $contents, $mode = false ) { + $temp = wp_tempnam( $file ); + if ( ! $temphandle = @fopen($temp, 'w+') ) { + unlink($temp); + return false; + } + + fwrite($temphandle, $contents); + fseek($temphandle, 0); //Skip back to the start of the file being written to + + $type = $this->is_binary($contents) ? FTP_BINARY : FTP_ASCII; + $this->ftp->SetType($type); + + $ret = $this->ftp->fput($file, $temphandle); + + fclose($temphandle); + unlink($temp); + + $this->chmod($file, $mode); + + return $ret; + } + + function cwd() { + $cwd = $this->ftp->pwd(); + if ( $cwd ) + $cwd = trailingslashit($cwd); + return $cwd; + } + + function chdir($file) { + return $this->ftp->chdir($file); + } + + function chgrp($file, $group, $recursive = false ) { + return false; + } + + function chmod($file, $mode = false, $recursive = false ) { + if ( ! $mode ) { + if ( $this->is_file($file) ) + $mode = FS_CHMOD_FILE; + elseif ( $this->is_dir($file) ) + $mode = FS_CHMOD_DIR; + else + return false; + } + + // chmod any sub-objects if recursive. + if ( $recursive && $this->is_dir($file) ) { + $filelist = $this->dirlist($file); + foreach ( (array)$filelist as $filename => $filemeta ) + $this->chmod($file . '/' . $filename, $mode, $recursive); + } + + // chmod the file or directory + return $this->ftp->chmod($file, $mode); + } + + function chown($file, $owner, $recursive = false ) { + return false; + } + + function owner($file) { + $dir = $this->dirlist($file); + return $dir[$file]['owner']; + } + + function getchmod($file) { + $dir = $this->dirlist($file); + return $dir[$file]['permsn']; + } + + function group($file) { + $dir = $this->dirlist($file); + return $dir[$file]['group']; + } + + function copy($source, $destination, $overwrite = false, $mode = false) { + if ( ! $overwrite && $this->exists($destination) ) + return false; + + $content = $this->get_contents($source); + if ( false === $content ) + return false; + + return $this->put_contents($destination, $content, $mode); + } + + function move($source, $destination, $overwrite = false ) { + return $this->ftp->rename($source, $destination); + } + + function delete($file, $recursive = false, $type = false) { + if ( empty($file) ) + return false; + if ( 'f' == $type || $this->is_file($file) ) + return $this->ftp->delete($file); + if ( !$recursive ) + return $this->ftp->rmdir($file); + + return $this->ftp->mdel($file); + } + + function exists($file) { + return $this->ftp->is_exists($file); + } + + function is_file($file) { + if ( $this->is_dir($file) ) + return false; + if ( $this->exists($file) ) + return true; + return false; + } + + function is_dir($path) { + $cwd = $this->cwd(); + if ( $this->chdir($path) ) { + $this->chdir($cwd); + return true; + } + return false; + } + + function is_readable($file) { + //Get dir list, Check if the file is writable by the current user?? + return true; + } + + function is_writable($file) { + //Get dir list, Check if the file is writable by the current user?? + return true; + } + + function atime($file) { + return false; + } + + function mtime($file) { + return $this->ftp->mdtm($file); + } + + function size($file) { + return $this->ftp->filesize($file); + } + + function touch($file, $time = 0, $atime = 0 ) { + return false; + } + + function mkdir($path, $chmod = false, $chown = false, $chgrp = false ) { + if ( ! $this->ftp->mkdir($path) ) + return false; + if ( ! $chmod ) + $chmod = FS_CHMOD_DIR; + $this->chmod($path, $chmod); + if ( $chown ) + $this->chown($path, $chown); + if ( $chgrp ) + $this->chgrp($path, $chgrp); + return true; + } + + function rmdir($path, $recursive = false ) { + $this->delete($path, $recursive); + } + + function dirlist($path = '.', $include_hidden = true, $recursive = false ) { + if ( $this->is_file($path) ) { + $limit_file = basename($path); + $path = dirname($path) . '/'; + } else { + $limit_file = false; + } + + $list = $this->ftp->dirlist($path); + if ( empty($list) && !$this->exists($path) ) + return false; + + $ret = array(); + foreach ( $list as $struc ) { + + if ( '.' == $struc['name'] || '..' == $struc['name'] ) + continue; + + if ( ! $include_hidden && '.' == $struc['name'][0] ) + continue; + + if ( $limit_file && $struc['name'] != $limit_file ) + continue; + + if ( 'd' == $struc['type'] ) { + if ( $recursive ) + $struc['files'] = $this->dirlist($path . '/' . $struc['name'], $include_hidden, $recursive); + else + $struc['files'] = array(); + } + + $ret[ $struc['name'] ] = $struc; + } + return $ret; + } + + function __destruct() { + $this->ftp->quit(); + } +} + +?> diff --git a/src/wp-admin/includes/class-wp-filesystem-ssh2.php b/src/wp-admin/includes/class-wp-filesystem-ssh2.php new file mode 100644 index 0000000..b809f45 --- /dev/null +++ b/src/wp-admin/includes/class-wp-filesystem-ssh2.php @@ -0,0 +1,383 @@ +method = 'ssh2'; + $this->errors = new WP_Error(); + + //Check if possible to use ssh2 functions. + if ( ! extension_loaded('ssh2') ) { + $this->errors->add('no_ssh2_ext', __('The ssh2 PHP extension is not available')); + return false; + } + if ( !function_exists('stream_get_contents') ) { + $this->errors->add('ssh2_php_requirement', __('The ssh2 PHP extension is available, however, we require the PHP5 function stream_get_contents()')); + return false; + } + + // Set defaults: + if ( empty($opt['port']) ) + $this->options['port'] = 22; + else + $this->options['port'] = $opt['port']; + + if ( empty($opt['hostname']) ) + $this->errors->add('empty_hostname', __('SSH2 hostname is required')); + else + $this->options['hostname'] = $opt['hostname']; + + if ( ! empty($opt['base']) ) + $this->wp_base = $opt['base']; + + // Check if the options provided are OK. + if ( !empty ($opt['public_key']) && !empty ($opt['private_key']) ) { + $this->options['public_key'] = $opt['public_key']; + $this->options['private_key'] = $opt['private_key']; + + $this->options['hostkey'] = array('hostkey' => 'ssh-rsa'); + + $this->keys = true; + } elseif ( empty ($opt['username']) ) { + $this->errors->add('empty_username', __('SSH2 username is required')); + } + + if ( !empty($opt['username']) ) + $this->options['username'] = $opt['username']; + + if ( empty ($opt['password']) ) { + if ( !$this->keys ) //password can be blank if we are using keys + $this->errors->add('empty_password', __('SSH2 password is required')); + } else { + $this->options['password'] = $opt['password']; + } + + } + + function connect() { + if ( ! $this->keys ) { + $this->link = @ssh2_connect($this->options['hostname'], $this->options['port']); + } else { + $this->link = @ssh2_connect($this->options['hostname'], $this->options['port'], $this->options['hostkey']); + } + + if ( ! $this->link ) { + $this->errors->add('connect', sprintf(__('Failed to connect to SSH2 Server %1$s:%2$s'), $this->options['hostname'], $this->options['port'])); + return false; + } + + if ( !$this->keys ) { + if ( ! @ssh2_auth_password($this->link, $this->options['username'], $this->options['password']) ) { + $this->errors->add('auth', sprintf(__('Username/Password incorrect for %s'), $this->options['username'])); + return false; + } + } else { + if ( ! @ssh2_auth_pubkey_file($this->link, $this->options['username'], $this->options['public_key'], $this->options['private_key'], $this->options['password'] ) ) { + $this->errors->add('auth', sprintf(__('Public and Private keys incorrect for %s'), $this->options['username'])); + return false; + } + } + + $this->sftp_link = ssh2_sftp($this->link); + + return true; + } + + function run_command( $command, $returnbool = false) { + + if ( ! $this->link ) + return false; + + if ( ! ($stream = ssh2_exec($this->link, $command)) ) { + $this->errors->add('command', sprintf(__('Unable to perform command: %s'), $command)); + } else { + stream_set_blocking( $stream, true ); + stream_set_timeout( $stream, FS_TIMEOUT ); + $data = stream_get_contents( $stream ); + fclose( $stream ); + + if ( $returnbool ) + return ( $data === false ) ? false : '' != trim($data); + else + return $data; + } + return false; + } + + function get_contents($file, $type = '', $resumepos = 0 ) { + $file = ltrim($file, '/'); + return file_get_contents('ssh2.sftp://' . $this->sftp_link . '/' . $file); + } + + function get_contents_array($file) { + $file = ltrim($file, '/'); + return file('ssh2.sftp://' . $this->sftp_link . '/' . $file); + } + + function put_contents($file, $contents, $mode = false ) { + $file = ltrim($file, '/'); + $ret = file_put_contents('ssh2.sftp://' . $this->sftp_link . '/' . $file, $contents); + + $this->chmod($file, $mode); + + return false !== $ret; + } + + function cwd() { + $cwd = $this->run_command('pwd'); + if ( $cwd ) + $cwd = trailingslashit($cwd); + return $cwd; + } + + function chdir($dir) { + return $this->run_command('cd ' . $dir, true); + } + + function chgrp($file, $group, $recursive = false ) { + if ( ! $this->exists($file) ) + return false; + if ( ! $recursive || ! $this->is_dir($file) ) + return $this->run_command(sprintf('chgrp %o %s', $mode, escapeshellarg($file)), true); + return $this->run_command(sprintf('chgrp -R %o %s', $mode, escapeshellarg($file)), true); + } + + function chmod($file, $mode = false, $recursive = false) { + if ( ! $this->exists($file) ) + return false; + + if ( ! $mode ) { + if ( $this->is_file($file) ) + $mode = FS_CHMOD_FILE; + elseif ( $this->is_dir($file) ) + $mode = FS_CHMOD_DIR; + else + return false; + } + + if ( ! $recursive || ! $this->is_dir($file) ) + return $this->run_command(sprintf('chmod %o %s', $mode, escapeshellarg($file)), true); + return $this->run_command(sprintf('chmod -R %o %s', $mode, escapeshellarg($file)), true); + } + + function chown($file, $owner, $recursive = false ) { + if ( ! $this->exists($file) ) + return false; + if ( ! $recursive || ! $this->is_dir($file) ) + return $this->run_command(sprintf('chown %o %s', $mode, escapeshellarg($file)), true); + return $this->run_command(sprintf('chown -R %o %s', $mode, escapeshellarg($file)), true); + } + + function owner($file) { + $owneruid = @fileowner('ssh2.sftp://' . $this->sftp_link . '/' . ltrim($file, '/')); + if ( ! $owneruid ) + return false; + if ( ! function_exists('posix_getpwuid') ) + return $owneruid; + $ownerarray = posix_getpwuid($owneruid); + return $ownerarray['name']; + } + + function getchmod($file) { + return substr(decoct(@fileperms( 'ssh2.sftp://' . $this->sftp_link . '/' . ltrim($file, '/') )),3); + } + + function group($file) { + $gid = @filegroup('ssh2.sftp://' . $this->sftp_link . '/' . ltrim($file, '/')); + if ( ! $gid ) + return false; + if ( ! function_exists('posix_getgrgid') ) + return $gid; + $grouparray = posix_getgrgid($gid); + return $grouparray['name']; + } + + function copy($source, $destination, $overwrite = false, $mode = false) { + if ( ! $overwrite && $this->exists($destination) ) + return false; + $content = $this->get_contents($source); + if ( false === $content) + return false; + return $this->put_contents($destination, $content, $mode); + } + + function move($source, $destination, $overwrite = false) { + return @ssh2_sftp_rename($this->link, $source, $destination); + } + + function delete($file, $recursive = false, $type = false) { + if ( 'f' == $type || $this->is_file($file) ) + return ssh2_sftp_unlink($this->sftp_link, $file); + if ( ! $recursive ) + return ssh2_sftp_rmdir($this->sftp_link, $file); + $filelist = $this->dirlist($file); + if ( is_array($filelist) ) { + foreach ( $filelist as $filename => $fileinfo) { + $this->delete($file . '/' . $filename, $recursive, $fileinfo['type']); + } + } + return ssh2_sftp_rmdir($this->sftp_link, $file); + } + + function exists($file) { + $file = ltrim($file, '/'); + return file_exists('ssh2.sftp://' . $this->sftp_link . '/' . $file); + } + + function is_file($file) { + $file = ltrim($file, '/'); + return is_file('ssh2.sftp://' . $this->sftp_link . '/' . $file); + } + + function is_dir($path) { + $path = ltrim($path, '/'); + return is_dir('ssh2.sftp://' . $this->sftp_link . '/' . $path); + } + + function is_readable($file) { + $file = ltrim($file, '/'); + return is_readable('ssh2.sftp://' . $this->sftp_link . '/' . $file); + } + + function is_writable($file) { + $file = ltrim($file, '/'); + return is_writable('ssh2.sftp://' . $this->sftp_link . '/' . $file); + } + + function atime($file) { + $file = ltrim($file, '/'); + return fileatime('ssh2.sftp://' . $this->sftp_link . '/' . $file); + } + + function mtime($file) { + $file = ltrim($file, '/'); + return filemtime('ssh2.sftp://' . $this->sftp_link . '/' . $file); + } + + function size($file) { + $file = ltrim($file, '/'); + return filesize('ssh2.sftp://' . $this->sftp_link . '/' . $file); + } + + function touch($file, $time = 0, $atime = 0) { + //Not implmented. + } + + function mkdir($path, $chmod = false, $chown = false, $chgrp = false) { + $path = untrailingslashit($path); + if ( ! $chmod ) + $chmod = FS_CHMOD_DIR; + if ( ! ssh2_sftp_mkdir($this->sftp_link, $path, $chmod, true) ) + return false; + if ( $chown ) + $this->chown($path, $chown); + if ( $chgrp ) + $this->chgrp($path, $chgrp); + return true; + } + + function rmdir($path, $recursive = false) { + return $this->delete($path, $recursive); + } + + function dirlist($path, $include_hidden = true, $recursive = false) { + if ( $this->is_file($path) ) { + $limit_file = basename($path); + $path = dirname($path); + } else { + $limit_file = false; + } + + if ( ! $this->is_dir($path) ) + return false; + + $ret = array(); + $dir = @dir('ssh2.sftp://' . $this->sftp_link .'/' . ltrim($path, '/') ); + + if ( ! $dir ) + return false; + + while (false !== ($entry = $dir->read()) ) { + $struc = array(); + $struc['name'] = $entry; + + if ( '.' == $struc['name'] || '..' == $struc['name'] ) + continue; //Do not care about these folders. + + if ( ! $include_hidden && '.' == $struc['name'][0] ) + continue; + + if ( $limit_file && $struc['name'] != $limit_file ) + continue; + + $struc['perms'] = $this->gethchmod($path.'/'.$entry); + $struc['permsn'] = $this->getnumchmodfromh($struc['perms']); + $struc['number'] = false; + $struc['owner'] = $this->owner($path.'/'.$entry); + $struc['group'] = $this->group($path.'/'.$entry); + $struc['size'] = $this->size($path.'/'.$entry); + $struc['lastmodunix']= $this->mtime($path.'/'.$entry); + $struc['lastmod'] = date('M j',$struc['lastmodunix']); + $struc['time'] = date('h:i:s',$struc['lastmodunix']); + $struc['type'] = $this->is_dir($path.'/'.$entry) ? 'd' : 'f'; + + if ( 'd' == $struc['type'] ) { + if ( $recursive ) + $struc['files'] = $this->dirlist($path . '/' . $struc['name'], $include_hidden, $recursive); + else + $struc['files'] = array(); + } + + $ret[ $struc['name'] ] = $struc; + } + $dir->close(); + unset($dir); + return $ret; + } +} diff --git a/src/wp-admin/includes/class-wp-importer.php b/src/wp-admin/includes/class-wp-importer.php new file mode 100644 index 0000000..2b4774b --- /dev/null +++ b/src/wp-admin/includes/class-wp-importer.php @@ -0,0 +1,307 @@ +prepare( "SELECT post_id, meta_value FROM $wpdb->postmeta WHERE meta_key = '%s' LIMIT %d,%d", $meta_key, $offset, $limit ); + $results = $wpdb->get_results( $sql ); + + // Increment offset + $offset = ( $limit + $offset ); + + if ( !empty( $results ) ) { + foreach ( $results as $r ) { + // Set permalinks into array + $hashtable[$r->meta_value] = intval( $r->post_id ); + } + } + } while ( count( $results ) == $limit ); + + // unset to save memory + unset( $results, $r ); + + return $hashtable; + } + + /** + * Return count of imported permalinks from WordPress database + * + * @param string $bid + * @return int + */ + function count_imported_posts( $importer_name, $bid ) { + global $wpdb; + + $count = 0; + + // Get count of permalinks + $meta_key = $importer_name . '_' . $bid . '_permalink'; + $sql = $wpdb->prepare( "SELECT COUNT( post_id ) AS cnt FROM $wpdb->postmeta WHERE meta_key = '%s'", $meta_key ); + + $result = $wpdb->get_results( $sql ); + + if ( !empty( $result ) ) + $count = intval( $result[0]->cnt ); + + // unset to save memory + unset( $results ); + + return $count; + } + + /** + * Set array with imported comments from WordPress database + * + * @param string $bid + * @return array + */ + function get_imported_comments( $bid ) { + global $wpdb; + + $hashtable = array(); + + $limit = 100; + $offset = 0; + + // Grab all comments in chunks + do { + $sql = $wpdb->prepare( "SELECT comment_ID, comment_agent FROM $wpdb->comments LIMIT %d,%d", $offset, $limit ); + $results = $wpdb->get_results( $sql ); + + // Increment offset + $offset = ( $limit + $offset ); + + if ( !empty( $results ) ) { + foreach ( $results as $r ) { + // Explode comment_agent key + list ( $ca_bid, $source_comment_id ) = explode( '-', $r->comment_agent ); + $source_comment_id = intval( $source_comment_id ); + + // Check if this comment came from this blog + if ( $bid == $ca_bid ) { + $hashtable[$source_comment_id] = intval( $r->comment_ID ); + } + } + } + } while ( count( $results ) == $limit ); + + // unset to save memory + unset( $results, $r ); + + return $hashtable; + } + + function set_blog( $blog_id ) { + if ( is_numeric( $blog_id ) ) { + $blog_id = (int) $blog_id; + } else { + $blog = 'http://' . preg_replace( '#^https?://#', '', $blog_id ); + if ( ( !$parsed = parse_url( $blog ) ) || empty( $parsed['host'] ) ) { + fwrite( STDERR, "Error: can not determine blog_id from $blog_id\n" ); + exit(); + } + if ( empty( $parsed['path'] ) ) + $parsed['path'] = '/'; + $blog = get_blog_details( array( 'domain' => $parsed['host'], 'path' => $parsed['path'] ) ); + if ( !$blog ) { + fwrite( STDERR, "Error: Could not find blog\n" ); + exit(); + } + $blog_id = (int) $blog->blog_id; + // Restore global $current_blog + global $current_blog; + $current_blog = $blog; + } + + if ( function_exists( 'is_multisite' ) ) { + if ( is_multisite() ) + switch_to_blog( $blog_id ); + } + + return $blog_id; + } + + function set_user( $user_id ) { + if ( is_numeric( $user_id ) ) { + $user_id = (int) $user_id; + } else { + $user_id = (int) username_exists( $user_id ); + } + + if ( !$user_id || !wp_set_current_user( $user_id ) ) { + fwrite( STDERR, "Error: can not find user\n" ); + exit(); + } + + return $user_id; + } + + /** + * Sort by strlen, longest string first + * + * @param string $a + * @param string $b + * @return int + */ + function cmpr_strlen( $a, $b ) { + return strlen( $b ) - strlen( $a ); + } + + /** + * GET URL + * + * @param string $url + * @param string $username + * @param string $password + * @param bool $head + * @return array + */ + function get_page( $url, $username = '', $password = '', $head = false ) { + // Increase the timeout + add_filter( 'http_request_timeout', array( &$this, 'bump_request_timeout' ) ); + + $headers = array(); + $args = array(); + if ( true === $head ) + $args['method'] = 'HEAD'; + if ( !empty( $username ) && !empty( $password ) ) + $headers['Authorization'] = 'Basic ' . base64_encode( "$username:$password" ); + + $args['headers'] = $headers; + + return wp_remote_request( $url, $args ); + } + + /** + * Bump up the request timeout for http requests + * + * @param int $val + * @return int + */ + function bump_request_timeout( $val ) { + return 60; + } + + /** + * Check if user has exceeded disk quota + * + * @return bool + */ + function is_user_over_quota() { + global $current_blog; + + if ( function_exists( 'upload_is_user_over_quota' ) ) { + if ( upload_is_user_over_quota( 1 ) ) { + echo "Sorry, you have used your upload quota.\n"; + return true; + } + } + + return false; + } + + /** + * Replace newlines, tabs, and multiple spaces with a single space + * + * @param string $string + * @return string + */ + function min_whitespace( $string ) { + return preg_replace( '|[\r\n\t ]+|', ' ', $string ); + } + + /** + * Reset global variables that grow out of control during imports + * + * @return void + */ + function stop_the_insanity() { + global $wpdb, $wp_actions; + // Or define( 'WP_IMPORTING', true ); + $wpdb->queries = array(); + // Reset $wp_actions to keep it from growing out of control + $wp_actions = array(); + } +} + +/** + * Returns value of command line params. + * Exits when a required param is not set. + * + * @param string $param + * @param bool $required + * @return mixed + */ +function get_cli_args( $param, $required = false ) { + $args = $_SERVER['argv']; + + $out = array(); + + $last_arg = null; + $return = null; + + $il = sizeof( $args ); + + for ( $i = 1, $il; $i < $il; $i++ ) { + if ( (bool) preg_match( "/^--(.+)/", $args[$i], $match ) ) { + $parts = explode( "=", $match[1] ); + $key = preg_replace( "/[^a-z0-9]+/", "", $parts[0] ); + + if ( isset( $parts[1] ) ) { + $out[$key] = $parts[1]; + } else { + $out[$key] = true; + } + + $last_arg = $key; + } else if ( (bool) preg_match( "/^-([a-zA-Z0-9]+)/", $args[$i], $match ) ) { + for ( $j = 0, $jl = strlen( $match[1] ); $j < $jl; $j++ ) { + $key = $match[1]{$j}; + $out[$key] = true; + } + + $last_arg = $key; + } else if ( $last_arg !== null ) { + $out[$last_arg] = $args[$i]; + } + } + + // Check array for specified param + if ( isset( $out[$param] ) ) { + // Set return value + $return = $out[$param]; + } + + // Check for missing required param + if ( !isset( $out[$param] ) && $required ) { + // Display message and exit + echo "\"$param\" parameter is required but was not specified\n"; + exit(); + } + + return $return; +} diff --git a/src/wp-admin/includes/class-wp-links-list-table.php b/src/wp-admin/includes/class-wp-links-list-table.php new file mode 100644 index 0000000..cbe3ed5 --- /dev/null +++ b/src/wp-admin/includes/class-wp-links-list-table.php @@ -0,0 +1,186 @@ + 'bookmarks', + ) ); + } + + function ajax_user_can() { + return current_user_can( 'manage_links' ); + } + + function prepare_items() { + global $cat_id, $s, $orderby, $order; + + wp_reset_vars( array( 'action', 'cat_id', 'linkurl', 'name', 'image', 'description', 'visible', 'target', 'category', 'link_id', 'submit', 'orderby', 'order', 'links_show_cat_id', 'rating', 'rel', 'notes', 'linkcheck[]', 's' ) ); + + $args = array( 'hide_invisible' => 0, 'hide_empty' => 0 ); + + if ( 'all' != $cat_id ) + $args['category'] = $cat_id; + if ( !empty( $s ) ) + $args['search'] = $s; + if ( !empty( $orderby ) ) + $args['orderby'] = $orderby; + if ( !empty( $order ) ) + $args['order'] = $order; + + $this->items = get_bookmarks( $args ); + } + + function no_items() { + _e( 'No links found.' ); + } + + function get_bulk_actions() { + $actions = array(); + $actions['delete'] = __( 'Delete' ); + + return $actions; + } + + function extra_tablenav( $which ) { + global $cat_id; + + if ( 'top' != $which ) + return; +?> +
+ $cat_id, + 'name' => 'cat_id', + 'taxonomy' => 'link_category', + 'show_option_all' => __( 'View all categories' ), + 'hide_empty' => true, + 'hierarchical' => 1, + 'show_count' => 0, + 'orderby' => 'name', + ); + wp_dropdown_categories( $dropdown_options ); + submit_button( __( 'Filter' ), 'secondary', false, false, array( 'id' => 'post-query-submit' ) ); +?> +
+ '', + 'name' => _x( 'Name', 'link name' ), + 'url' => __( 'URL' ), + 'categories' => __( 'Categories' ), + 'rel' => __( 'Relationship' ), + 'visible' => __( 'Visible' ), + 'rating' => __( 'Rating' ) + ); + } + + function get_sortable_columns() { + return array( + 'name' => 'name', + 'url' => 'url', + 'visible' => 'visible', + 'rating' => 'rating' + ); + } + + function display_rows() { + global $cat_id; + + $alt = 0; + + foreach ( $this->items as $link ) { + $link = sanitize_bookmark( $link ); + $link->link_name = esc_attr( $link->link_name ); + $link->link_category = wp_get_link_cats( $link->link_id ); + + $short_url = url_shorten( $link->link_url ); + + $visible = ( $link->link_visible == 'Y' ) ? __( 'Yes' ) : __( 'No' ); + $rating = $link->link_rating; + $style = ( $alt++ % 2 ) ? '' : ' class="alternate"'; + + $edit_link = get_edit_bookmark_link( $link ); +?> + > +get_column_info(); + + foreach ( $columns as $column_name => $column_display_name ) { + $class = "class='column-$column_name'"; + + $style = ''; + if ( in_array( $column_name, $hidden ) ) + $style = ' style="display:none;"'; + + $attributes = $class . $style; + + switch ( $column_name ) { + case 'cb': + echo ''; + break; + + case 'name': + echo "link_name ) ) . "'>$link->link_name
"; + + $actions = array(); + $actions['edit'] = '' . __( 'Edit' ) . ''; + $actions['delete'] = "link_id ) . "' onclick=\"if ( confirm( '" . esc_js( sprintf( __( "You are about to delete this link '%s'\n 'Cancel' to stop, 'OK' to delete." ), $link->link_name ) ) . "' ) ) { return true;}return false;\">" . __( 'Delete' ) . ""; + echo $this->row_actions( $actions ); + + echo ''; + break; + case 'url': + echo "link_name ) )."'>$short_url"; + break; + case 'categories': + ?>>link_category as $category ) { + $cat = get_term( $category, 'link_category', OBJECT, 'display' ); + if ( is_wp_error( $cat ) ) + echo $cat->get_error_message(); + $cat_name = $cat->name; + if ( $cat_id != $category ) + $cat_name = "$cat_name"; + $cat_names[] = $cat_name; + } + echo implode( ', ', $cat_names ); + ?>>link_rel ) ? '
' : $link->link_rel; ?>>> + >link_id ); ?> + + + diff --git a/src/wp-admin/includes/class-wp-list-table.php b/src/wp-admin/includes/class-wp-list-table.php new file mode 100644 index 0000000..6420ee7 --- /dev/null +++ b/src/wp-admin/includes/class-wp-list-table.php @@ -0,0 +1,908 @@ + '', + 'singular' => '', + 'ajax' => false + ) ); + + $screen = get_current_screen(); + + add_filter( "manage_{$screen->id}_columns", array( &$this, 'get_columns' ), 0 ); + + if ( !$args['plural'] ) + $args['plural'] = $screen->base; + + $this->_args = $args; + + if ( $args['ajax'] ) { + // wp_enqueue_script( 'list-table' ); + add_action( 'admin_footer', array( &$this, '_js_vars' ) ); + } + } + + /** + * Checks the current user's permissions + * @uses wp_die() + * + * @since 3.1.0 + * @access public + * @abstract + */ + function ajax_user_can() { + die( 'function WP_List_Table::ajax_user_can() must be over-ridden in a sub-class.' ); + } + + /** + * Prepares the list of items for displaying. + * @uses WP_List_Table::set_pagination_args() + * + * @since 3.1.0 + * @access public + * @abstract + */ + function prepare_items() { + die( 'function WP_List_Table::prepare_items() must be over-ridden in a sub-class.' ); + } + + /** + * An internal method that sets all the necessary pagination arguments + * + * @param array $args An associative array with information about the pagination + * @access protected + */ + function set_pagination_args( $args ) { + $args = wp_parse_args( $args, array( + 'total_items' => 0, + 'total_pages' => 0, + 'per_page' => 0, + ) ); + + if ( !$args['total_pages'] && $args['per_page'] > 0 ) + $args['total_pages'] = ceil( $args['total_items'] / $args['per_page'] ); + + // redirect if page number is invalid and headers are not already sent + if ( ! headers_sent() && ( ! defined( 'DOING_AJAX' ) || ! DOING_AJAX ) && $args['total_pages'] > 0 && $this->get_pagenum() > $args['total_pages'] ) { + wp_redirect( add_query_arg( 'paged', $args['total_pages'] ) ); + exit; + } + + $this->_pagination_args = $args; + } + + /** + * Access the pagination args + * + * @since 3.1.0 + * @access public + * + * @param string $key + * @return array + */ + function get_pagination_arg( $key ) { + if ( 'page' == $key ) + return $this->get_pagenum(); + + if ( isset( $this->_pagination_args[$key] ) ) + return $this->_pagination_args[$key]; + } + + /** + * Whether the table has items to display or not + * + * @since 3.1.0 + * @access public + * + * @return bool + */ + function has_items() { + return !empty( $this->items ); + } + + /** + * Message to be displayed when there are no items + * + * @since 3.1.0 + * @access public + */ + function no_items() { + _e( 'No items found.' ); + } + + /** + * Display the search box. + * + * @since 3.1.0 + * @access public + * + * @param string $text The search button text + * @param string $input_id The search input id + */ + function search_box( $text, $input_id ) { + if ( empty( $_REQUEST['s'] ) && !$this->has_items() ) + return; + + $input_id = $input_id . '-search-input'; + + if ( ! empty( $_REQUEST['orderby'] ) ) + echo ''; + if ( ! empty( $_REQUEST['order'] ) ) + echo ''; +?> + + link ) with the list + * of views available on this table. + * + * @since 3.1.0 + * @access protected + * + * @return array + */ + function get_views() { + return array(); + } + + /** + * Display the bulk actions dropdown. + * + * @since 3.1.0 + * @access public + */ + function views() { + $screen = get_current_screen(); + + $views = $this->get_views(); + $views = apply_filters( 'views_' . $screen->id, $views ); + + if ( empty( $views ) ) + return; + + echo "
    \n"; + foreach ( $views as $class => $view ) { + $views[ $class ] = "\t
  • $view"; + } + echo implode( " |
  • \n", $views ) . "\n"; + echo "
"; + } + + /** + * Get an associative array ( option_name => option_title ) with the list + * of bulk actions available on this table. + * + * @since 3.1.0 + * @access protected + * + * @return array + */ + function get_bulk_actions() { + return array(); + } + + /** + * Display the bulk actions dropdown. + * + * @since 3.1.0 + * @access public + */ + function bulk_actions() { + $screen = get_current_screen(); + + if ( is_null( $this->_actions ) ) { + $no_new_actions = $this->_actions = $this->get_bulk_actions(); + // This filter can currently only be used to remove actions. + $this->_actions = apply_filters( 'bulk_actions-' . $screen->id, $this->_actions ); + $this->_actions = array_intersect_assoc( $this->_actions, $no_new_actions ); + $two = ''; + } else { + $two = '2'; + } + + if ( empty( $this->_actions ) ) + return; + + echo "\n"; + + submit_button( __( 'Apply' ), 'button-secondary action', false, false, array( 'id' => "doaction$two" ) ); + echo "\n"; + } + + /** + * Get the current action selected from the bulk actions dropdown. + * + * @since 3.1.0 + * @access public + * + * @return string|bool The action name or False if no action was selected + */ + function current_action() { + if ( isset( $_REQUEST['action'] ) && -1 != $_REQUEST['action'] ) + return $_REQUEST['action']; + + if ( isset( $_REQUEST['action2'] ) && -1 != $_REQUEST['action2'] ) + return $_REQUEST['action2']; + + return false; + } + + /** + * Generate row actions div + * + * @since 3.1.0 + * @access protected + * + * @param array $actions The list of actions + * @param bool $always_visible Wether the actions should be always visible + * @return string + */ + function row_actions( $actions, $always_visible = false ) { + $action_count = count( $actions ); + $i = 0; + + if ( !$action_count ) + return ''; + + $out = '
'; + foreach ( $actions as $action => $link ) { + ++$i; + ( $i == $action_count ) ? $sep = '' : $sep = ' | '; + $out .= "$link$sep"; + } + $out .= '
'; + + return $out; + } + + /** + * Display a monthly dropdown for filtering items + * + * @since 3.1.0 + * @access protected + */ + function months_dropdown( $post_type ) { + global $wpdb, $wp_locale; + + $months = $wpdb->get_results( $wpdb->prepare( " + SELECT DISTINCT YEAR( post_date ) AS year, MONTH( post_date ) AS month + FROM $wpdb->posts + WHERE post_type = %s + ORDER BY post_date DESC + ", $post_type ) ); + + $month_count = count( $months ); + + if ( !$month_count || ( 1 == $month_count && 0 == $months[0]->month ) ) + return; + + $m = isset( $_GET['m'] ) ? (int) $_GET['m'] : 0; +?> + + __( 'List View' ), + 'excerpt' => __( 'Excerpt View' ) + ); + +?> + +
+ $title ) { + $class = ( $current_mode == $mode ) ? 'class="current"' : ''; + echo "$title\n"; + } + ?> +
+'; + + echo "" . number_format_i18n( get_comments_number() ) . ""; + + if ( $pending_comments ) + echo ''; + } + + /** + * Get the current page number + * + * @since 3.1.0 + * @access protected + * + * @return int + */ + function get_pagenum() { + $pagenum = isset( $_REQUEST['paged'] ) ? absint( $_REQUEST['paged'] ) : 0; + + if( isset( $this->_pagination_args['total_pages'] ) && $pagenum > $this->_pagination_args['total_pages'] ) + $pagenum = $this->_pagination_args['total_pages']; + + return max( 1, $pagenum ); + } + + /** + * Get number of items to display on a single page + * + * @since 3.1.0 + * @access protected + * + * @return int + */ + function get_items_per_page( $option, $default = 20 ) { + $per_page = (int) get_user_option( $option ); + if ( empty( $per_page ) || $per_page < 1 ) + $per_page = $default; + + return (int) apply_filters( $option, $per_page ); + } + + /** + * Display the pagination. + * + * @since 3.1.0 + * @access protected + */ + function pagination( $which ) { + if ( empty( $this->_pagination_args ) ) + return; + + extract( $this->_pagination_args ); + + $output = '' . sprintf( _n( '1 item', '%s items', $total_items ), number_format_i18n( $total_items ) ) . ''; + + $current = $this->get_pagenum(); + + $current_url = ( is_ssl() ? 'https://' : 'http://' ) . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']; + + $current_url = remove_query_arg( array( 'hotkeys_highlight_last', 'hotkeys_highlight_first' ), $current_url ); + + $page_links = array(); + + $disable_first = $disable_last = ''; + if ( $current == 1 ) + $disable_first = ' disabled'; + if ( $current == $total_pages ) + $disable_last = ' disabled'; + + $page_links[] = sprintf( "%s", + 'first-page' . $disable_first, + esc_attr__( 'Go to the first page' ), + esc_url( remove_query_arg( 'paged', $current_url ) ), + '«' + ); + + $page_links[] = sprintf( "%s", + 'prev-page' . $disable_first, + esc_attr__( 'Go to the previous page' ), + esc_url( add_query_arg( 'paged', max( 1, $current-1 ), $current_url ) ), + '‹' + ); + + if ( 'bottom' == $which ) + $html_current_page = $current; + else + $html_current_page = sprintf( "", + esc_attr__( 'Current page' ), + esc_attr( 'paged' ), + $current, + strlen( $total_pages ) + ); + + $html_total_pages = sprintf( "%s", number_format_i18n( $total_pages ) ); + $page_links[] = '' . sprintf( _x( '%1$s of %2$s', 'paging' ), $html_current_page, $html_total_pages ) . ''; + + $page_links[] = sprintf( "%s", + 'next-page' . $disable_last, + esc_attr__( 'Go to the next page' ), + esc_url( add_query_arg( 'paged', min( $total_pages, $current+1 ), $current_url ) ), + '›' + ); + + $page_links[] = sprintf( "%s", + 'last-page' . $disable_last, + esc_attr__( 'Go to the last page' ), + esc_url( add_query_arg( 'paged', $total_pages, $current_url ) ), + '»' + ); + + $output .= "\n" . join( "\n", $page_links ) . ''; + + if ( $total_pages ) + $page_class = $total_pages < 2 ? ' one-page' : ''; + else + $page_class = ' no-pages'; + + $this->_pagination = "
$output
"; + + echo $this->_pagination; + } + + /** + * Get a list of columns. The format is: + * 'internal-name' => 'Title' + * + * @since 3.1.0 + * @access protected + * @abstract + * + * @return array + */ + function get_columns() { + die( 'function WP_List_Table::get_columns() must be over-ridden in a sub-class.' ); + } + + /** + * Get a list of sortable columns. The format is: + * 'internal-name' => 'orderby' + * or + * 'internal-name' => array( 'orderby', true ) + * + * The second format will make the initial sorting order be descending + * + * @since 3.1.0 + * @access protected + * + * @return array + */ + function get_sortable_columns() { + return array(); + } + + /** + * Get a list of all, hidden and sortable columns, with filter applied + * + * @since 3.1.0 + * @access protected + * + * @return array + */ + function get_column_info() { + if ( isset( $this->_column_headers ) ) + return $this->_column_headers; + + $screen = get_current_screen(); + + $columns = get_column_headers( $screen ); + $hidden = get_hidden_columns( $screen ); + + $_sortable = apply_filters( "manage_{$screen->id}_sortable_columns", $this->get_sortable_columns() ); + + $sortable = array(); + foreach ( $_sortable as $id => $data ) { + if ( empty( $data ) ) + continue; + + $data = (array) $data; + if ( !isset( $data[1] ) ) + $data[1] = false; + + $sortable[$id] = $data; + } + + $this->_column_headers = array( $columns, $hidden, $sortable ); + + return $this->_column_headers; + } + + /** + * Return number of visible columns + * + * @since 3.1.0 + * @access public + * + * @return int + */ + function get_column_count() { + list ( $columns, $hidden ) = $this->get_column_info(); + $hidden = array_intersect( array_keys( $columns ), array_filter( $hidden ) ); + return count( $columns ) - count( $hidden ); + } + + /** + * Print column headers, accounting for hidden and sortable columns. + * + * @since 3.1.0 + * @access protected + * + * @param bool $with_id Whether to set the id attribute or not + */ + function print_column_headers( $with_id = true ) { + $screen = get_current_screen(); + + list( $columns, $hidden, $sortable ) = $this->get_column_info(); + + $current_url = ( is_ssl() ? 'https://' : 'http://' ) . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']; + $current_url = remove_query_arg( 'paged', $current_url ); + + if ( isset( $_GET['orderby'] ) ) + $current_orderby = $_GET['orderby']; + else + $current_orderby = ''; + + if ( isset( $_GET['order'] ) && 'desc' == $_GET['order'] ) + $current_order = 'desc'; + else + $current_order = 'asc'; + + foreach ( $columns as $column_key => $column_display_name ) { + $class = array( 'manage-column', "column-$column_key" ); + + $style = ''; + if ( in_array( $column_key, $hidden ) ) + $style = 'display:none;'; + + $style = ' style="' . $style . '"'; + + if ( 'cb' == $column_key ) + $class[] = 'check-column'; + elseif ( in_array( $column_key, array( 'posts', 'comments', 'links' ) ) ) + $class[] = 'num'; + + if ( isset( $sortable[$column_key] ) ) { + list( $orderby, $desc_first ) = $sortable[$column_key]; + + if ( $current_orderby == $orderby ) { + $order = 'asc' == $current_order ? 'desc' : 'asc'; + $class[] = 'sorted'; + $class[] = $current_order; + } else { + $order = $desc_first ? 'desc' : 'asc'; + $class[] = 'sortable'; + $class[] = $desc_first ? 'asc' : 'desc'; + } + + $column_display_name = '' . $column_display_name . ''; + } + + $id = $with_id ? "id='$column_key'" : ''; + + if ( !empty( $class ) ) + $class = "class='" . join( ' ', $class ) . "'"; + + echo "$column_display_name"; + } + } + + /** + * Display the table + * + * @since 3.1.0 + * @access public + */ + function display() { + extract( $this->_args ); + + $this->display_tablenav( 'top' ); + +?> + + + + print_column_headers(); ?> + + + + + + print_column_headers( false ); ?> + + + + > + display_rows_or_placeholder(); ?> + +
+display_tablenav( 'bottom' ); + } + + /** + * Get a list of CSS classes for the tag + * + * @since 3.1.0 + * @access protected + * + * @return array + */ + function get_table_classes() { + return array( 'widefat', 'fixed', $this->_args['plural'] ); + } + + /** + * Generate the table navigation above or below the table + * + * @since 3.1.0 + * @access protected + */ + function display_tablenav( $which ) { + if ( 'top' == $which ) + wp_nonce_field( 'bulk-' . $this->_args['plural'] ); +?> +
+ +
+ bulk_actions( $which ); ?> +
+extra_tablenav( $which ); + $this->pagination( $which ); +?> + +
+
+ part of the table + * + * @since 3.1.0 + * @access protected + */ + function display_rows_or_placeholder() { + if ( $this->has_items() ) { + $this->display_rows(); + } else { + list( $columns, $hidden ) = $this->get_column_info(); + echo ''; + } + } + + /** + * Generate the table rows + * + * @since 3.1.0 + * @access protected + */ + function display_rows() { + foreach ( $this->items as $item ) + $this->single_row( $item ); + } + + /** + * Generates content for a single row of the table + * + * @since 3.1.0 + * @access protected + * + * @param object $item The current item + */ + function single_row( $item ) { + static $row_class = ''; + $row_class = ( $row_class == '' ? ' class="alternate"' : '' ); + + echo ''; + echo $this->single_row_columns( $item ); + echo ''; + } + + /** + * Generates the columns for a single row of the table + * + * @since 3.1.0 + * @access protected + * + * @param object $item The current item + */ + function single_row_columns( $item ) { + list( $columns, $hidden ) = $this->get_column_info(); + + foreach ( $columns as $column_name => $column_display_name ) { + $class = "class='$column_name column-$column_name'"; + + $style = ''; + if ( in_array( $column_name, $hidden ) ) + $style = ' style="display:none;"'; + + $attributes = "$class$style"; + + if ( 'cb' == $column_name ) { + echo ''; + } + elseif ( method_exists( $this, 'column_' . $column_name ) ) { + echo ""; + } + else { + echo ""; + } + } + } + + /** + * Handle an incoming ajax request (called from admin-ajax.php) + * + * @since 3.1.0 + * @access public + */ + function ajax_response() { + $this->prepare_items(); + + extract( $this->_args ); + extract( $this->_pagination_args ); + + ob_start(); + if ( ! empty( $_REQUEST['no_placeholder'] ) ) + $this->display_rows(); + else + $this->display_rows_or_placeholder(); + + $rows = ob_get_clean(); + + $response = array( 'rows' => $rows ); + + if ( isset( $total_items ) ) + $response['total_items_i18n'] = sprintf( _n( '1 item', '%s items', $total_items ), number_format_i18n( $total_items ) ); + + if ( isset( $total_pages ) ) { + $response['total_pages'] = $total_pages; + $response['total_pages_i18n'] = number_format_i18n( $total_pages ); + } + + die( json_encode( $response ) ); + } + + /** + * Send required variables to JavaScript land + * + * @access private + */ + function _js_vars() { + $args = array( + 'class' => get_class( $this ), + 'screen' => get_current_screen() + ); + + printf( "\n", json_encode( $args ) ); + } +} +?> diff --git a/src/wp-admin/includes/class-wp-media-list-table.php b/src/wp-admin/includes/class-wp-media-list-table.php new file mode 100644 index 0000000..531fe60 --- /dev/null +++ b/src/wp-admin/includes/class-wp-media-list-table.php @@ -0,0 +1,374 @@ +detached = isset( $_REQUEST['detached'] ) || isset( $_REQUEST['find_detached'] ); + + parent::__construct( array( + 'plural' => 'media' + ) ); + } + + function ajax_user_can() { + return current_user_can('upload_files'); + } + + function prepare_items() { + global $lost, $wpdb, $wp_query, $post_mime_types, $avail_post_mime_types; + + $q = $_REQUEST; + + if ( !empty( $lost ) ) + $q['post__in'] = implode( ',', $lost ); + + list( $post_mime_types, $avail_post_mime_types ) = wp_edit_attachments_query( $q ); + + $this->is_trash = isset( $_REQUEST['status'] ) && 'trash' == $_REQUEST['status']; + + $this->set_pagination_args( array( + 'total_items' => $wp_query->found_posts, + 'total_pages' => $wp_query->max_num_pages, + 'per_page' => $wp_query->query_vars['posts_per_page'], + ) ); + } + + function get_views() { + global $wpdb, $post_mime_types, $avail_post_mime_types; + + $type_links = array(); + $_num_posts = (array) wp_count_attachments(); + $_total_posts = array_sum($_num_posts) - $_num_posts['trash']; + if ( !isset( $total_orphans ) ) + $total_orphans = $wpdb->get_var( "SELECT COUNT( * ) FROM $wpdb->posts WHERE post_type = 'attachment' AND post_status != 'trash' AND post_parent < 1" ); + $matches = wp_match_mime_types(array_keys($post_mime_types), array_keys($_num_posts)); + foreach ( $matches as $type => $reals ) + foreach ( $reals as $real ) + $num_posts[$type] = ( isset( $num_posts[$type] ) ) ? $num_posts[$type] + $_num_posts[$real] : $_num_posts[$real]; + + $class = ( empty($_GET['post_mime_type']) && !$this->detached && !isset($_GET['status']) ) ? ' class="current"' : ''; + $type_links['all'] = "" . sprintf( _nx( 'All (%s)', 'All (%s)', $_total_posts, 'uploaded files' ), number_format_i18n( $_total_posts ) ) . ''; + foreach ( $post_mime_types as $mime_type => $label ) { + $class = ''; + + if ( !wp_match_mime_types($mime_type, $avail_post_mime_types) ) + continue; + + if ( !empty($_GET['post_mime_type']) && wp_match_mime_types($mime_type, $_GET['post_mime_type']) ) + $class = ' class="current"'; + if ( !empty( $num_posts[$mime_type] ) ) + $type_links[$mime_type] = "" . sprintf( translate_nooped_plural( $label[2], $num_posts[$mime_type] ), number_format_i18n( $num_posts[$mime_type] )) . ''; + } + $type_links['detached'] = 'detached ? ' class="current"' : '' ) . '>' . sprintf( _nx( 'Unattached (%s)', 'Unattached (%s)', $total_orphans, 'detached files' ), number_format_i18n( $total_orphans ) ) . ''; + + if ( !empty($_num_posts['trash']) ) + $type_links['trash'] = '' . sprintf( _nx( 'Trash (%s)', 'Trash (%s)', $_num_posts['trash'], 'uploaded files' ), number_format_i18n( $_num_posts['trash'] ) ) . ''; + + return $type_links; + } + + function get_bulk_actions() { + $actions = array(); + $actions['delete'] = __( 'Delete Permanently' ); + if ( $this->detached ) + $actions['attach'] = __( 'Attach to a post' ); + + return $actions; + } + + function extra_tablenav( $which ) { + global $post_type; + $post_type_obj = get_post_type_object( $post_type ); +?> +
+detached && !$this->is_trash ) { + $this->months_dropdown( $post_type ); + + do_action( 'restrict_manage_posts' ); + submit_button( __( 'Filter' ), 'secondary', false, false, array( 'id' => 'post-query-submit' ) ); + } + + if ( $this->detached ) { + submit_button( __( 'Scan for lost attachments' ), 'secondary', 'find_detached', false ); + } elseif ( $this->is_trash && current_user_can( 'edit_others_posts' ) ) { + submit_button( __( 'Empty Trash' ), 'button-secondary apply', 'delete_all', false ); + } ?> +
+'; + $posts_columns['icon'] = ''; + /* translators: column name */ + $posts_columns['title'] = _x( 'File', 'column name' ); + $posts_columns['author'] = __( 'Author' ); + //$posts_columns['tags'] = _x( 'Tags', 'column name' ); + /* translators: column name */ + if ( !$this->detached ) { + $posts_columns['parent'] = _x( 'Attached to', 'column name' ); + $posts_columns['comments'] = 'Comments'; + } + /* translators: column name */ + $posts_columns['date'] = _x( 'Date', 'column name' ); + $posts_columns = apply_filters( 'manage_media_columns', $posts_columns, $this->detached ); + + return $posts_columns; + } + + function get_sortable_columns() { + return array( + 'title' => 'title', + 'author' => 'author', + 'parent' => 'parent', + 'comments' => 'comment_count', + 'date' => array( 'date', true ), + ); + } + + function display_rows() { + global $post, $id; + + add_filter( 'the_title','esc_html' ); + $alt = ''; + + while ( have_posts() ) : the_post(); + + if ( $this->is_trash && $post->post_status != 'trash' + || !$this->is_trash && $post->post_status == 'trash' ) + continue; + + $alt = ( 'alternate' == $alt ) ? '' : 'alternate'; + $post_owner = ( get_current_user_id() == $post->post_author ) ? 'self' : 'other'; + $att_title = _draft_or_post_title(); +?> + post_status ); ?>' valign="top"> +get_column_info(); +foreach ( $columns as $column_name => $column_display_name ) { + $class = "class='$column_name column-$column_name'"; + + $style = ''; + if ( in_array( $column_name, $hidden ) ) + $style = ' style="display:none;"'; + + $attributes = $class . $style; + + switch ( $column_name ) { + + case 'cb': +?> + + + + + + + + + + + +post_date && 'date' == $column_name ) { + $t_time = $h_time = __( 'Unpublished' ); + } else { + $t_time = get_the_time( __( 'Y/m/d g:i:s A' ) ); + $m_time = $post->post_date; + $time = get_post_time( 'G', true, $post, false ); + if ( ( abs( $t_diff = time() - $time ) ) < 86400 ) { + if ( $t_diff < 0 ) + $h_time = sprintf( __( '%s from now' ), human_time_diff( $time ) ); + else + $h_time = sprintf( __( '%s ago' ), human_time_diff( $time ) ); + } else { + $h_time = mysql2date( __( 'Y/m/d' ), $m_time ); + } + } +?> + +post_parent > 0 ) { + if ( get_post( $post->post_parent ) ) { + $title =_draft_or_post_title( $post->post_parent ); + } +?> + + + + + + + + + +detached ) { + if ( current_user_can( 'edit_post', $post->ID ) ) + $actions['edit'] = '' . __( 'Edit' ) . ''; + if ( current_user_can( 'delete_post', $post->ID ) ) + if ( EMPTY_TRASH_DAYS && MEDIA_TRASH ) { + $actions['trash'] = "ID ) . "'>" . __( 'Trash' ) . ""; + } else { + $delete_ays = !MEDIA_TRASH ? " onclick='return showNotice.warn();'" : ''; + $actions['delete'] = "ID ) . "'>" . __( 'Delete Permanently' ) . ""; + } + $actions['view'] = '' . __( 'View' ) . ''; + if ( current_user_can( 'edit_post', $post->ID ) ) + $actions['attach'] = ''.__( 'Attach' ).''; + } + else { + if ( current_user_can( 'edit_post', $post->ID ) && !$this->is_trash ) + $actions['edit'] = '' . __( 'Edit' ) . ''; + if ( current_user_can( 'delete_post', $post->ID ) ) { + if ( $this->is_trash ) + $actions['untrash'] = "ID ) . "'>" . __( 'Restore' ) . ""; + elseif ( EMPTY_TRASH_DAYS && MEDIA_TRASH ) + $actions['trash'] = "ID ) . "'>" . __( 'Trash' ) . ""; + if ( $this->is_trash || !EMPTY_TRASH_DAYS || !MEDIA_TRASH ) { + $delete_ays = ( !$this->is_trash && !MEDIA_TRASH ) ? " onclick='return showNotice.warn();'" : ''; + $actions['delete'] = "ID ) . "'>" . __( 'Delete Permanently' ) . ""; + } + } + if ( !$this->is_trash ) { + $title =_draft_or_post_title( $post->post_parent ); + $actions['view'] = '' . __( 'View' ) . ''; + } + } + + $actions = apply_filters( 'media_row_actions', $actions, $post, $this->detached ); + + return $actions; + } +} + +?> diff --git a/src/wp-admin/includes/class-wp-ms-sites-list-table.php b/src/wp-admin/includes/class-wp-ms-sites-list-table.php new file mode 100644 index 0000000..baefc82 --- /dev/null +++ b/src/wp-admin/includes/class-wp-ms-sites-list-table.php @@ -0,0 +1,340 @@ + 'sites', + ) ); + } + + function ajax_user_can() { + return current_user_can( 'manage_sites' ); + } + + function prepare_items() { + global $s, $mode, $wpdb, $current_site; + + $mode = ( empty( $_REQUEST['mode'] ) ) ? 'list' : $_REQUEST['mode']; + + $per_page = $this->get_items_per_page( 'sites_network_per_page' ); + + $pagenum = $this->get_pagenum(); + + $s = isset( $_REQUEST['s'] ) ? stripslashes( trim( $_REQUEST[ 's' ] ) ) : ''; + $wild = ''; + if ( false !== strpos($s, '*') ) { + $wild = '%'; + $s = trim($s, '*'); + } + + $like_s = esc_sql( like_escape( $s ) ); + + $large_network = false; + // If the network is large and a search is not being performed, show only the latest blogs with no paging in order + // to avoid expensive count queries. + if ( !$s && ( get_blog_count() >= 10000 ) ) { + if ( !isset($_REQUEST['orderby']) ) + $_GET['orderby'] = $_REQUEST['orderby'] = ''; + if ( !isset($_REQUEST['order']) ) + $_GET['order'] = $_REQUEST['order'] = 'DESC'; + $large_network = true; + } + + $query = "SELECT * FROM {$wpdb->blogs} WHERE site_id = '{$wpdb->siteid}' "; + + if ( empty($s) ) { + // Nothing to do. + } elseif ( preg_match('/^[0-9]+\./', $s) ) { + // IP address + $reg_blog_ids = $wpdb->get_col( "SELECT blog_id FROM {$wpdb->registration_log} WHERE {$wpdb->registration_log}.IP LIKE ( '{$like_s}$wild' )" ); + + if ( !$reg_blog_ids ) + $reg_blog_ids = array( 0 ); + + $query = "SELECT * + FROM {$wpdb->blogs} + WHERE site_id = '{$wpdb->siteid}' + AND {$wpdb->blogs}.blog_id IN (" . implode( ', ', $reg_blog_ids ) . ")"; + } else { + if ( is_numeric($s) ) { + $query .= " AND ( {$wpdb->blogs}.blog_id = '{$like_s}' )"; + } elseif ( is_subdomain_install() ) { + $blog_s = str_replace( '.' . $current_site->domain, '', $like_s ); + $blog_s .= $wild . '.' . $current_site->domain; + $query .= " AND ( {$wpdb->blogs}.domain LIKE '$blog_s' ) "; + } else { + if ( $like_s != trim('/', $current_site->path) ) + $blog_s = $current_site->path . $like_s . $wild . '/'; + else + $blog_s = $like_s; + $query .= " AND ( {$wpdb->blogs}.path LIKE '$blog_s' )"; + } + } + + $order_by = isset( $_REQUEST['orderby'] ) ? $_REQUEST['orderby'] : ''; + if ( $order_by == 'registered' ) { + $query .= ' ORDER BY registered '; + } elseif ( $order_by == 'lastupdated' ) { + $query .= ' ORDER BY last_updated '; + } elseif ( $order_by == 'blogname' ) { + if ( is_subdomain_install() ) + $query .= ' ORDER BY domain '; + else + $query .= ' ORDER BY path '; + } elseif ( $order_by == 'blog_id' ) { + $query .= ' ORDER BY blog_id '; + } else { + $order_by = null; + } + + if ( isset( $order_by ) ) { + $order = ( isset( $_REQUEST['order'] ) && 'DESC' == strtoupper( $_REQUEST['order'] ) ) ? "DESC" : "ASC"; + $query .= $order; + } + + // Don't do an unbounded count on large networks + if ( ! $large_network ) + $total = $wpdb->get_var( str_replace( 'SELECT *', 'SELECT COUNT( blog_id )', $query ) ); + + $query .= " LIMIT " . intval( ( $pagenum - 1 ) * $per_page ) . ", " . intval( $per_page ); + $this->items = $wpdb->get_results( $query, ARRAY_A ); + + if ( $large_network ) + $total = count($this->items); + + $this->set_pagination_args( array( + 'total_items' => $total, + 'per_page' => $per_page, + ) ); + } + + function no_items() { + _e( 'No sites found.' ); + } + + function get_bulk_actions() { + $actions = array(); + if ( current_user_can( 'delete_sites' ) ) + $actions['delete'] = __( 'Delete' ); + $actions['spam'] = _x( 'Mark as Spam', 'site' ); + $actions['notspam'] = _x( 'Not Spam', 'site' ); + + return $actions; + } + + function pagination( $which ) { + global $mode; + + parent::pagination( $which ); + + if ( 'top' == $which ) + $this->view_switcher( $mode ); + } + + function get_columns() { + $blogname_columns = ( is_subdomain_install() ) ? __( 'Domain' ) : __( 'Path' ); + $sites_columns = array( + 'cb' => '', + 'blogname' => $blogname_columns, + 'lastupdated' => __( 'Last Updated' ), + 'registered' => _x( 'Registered', 'site' ), + 'users' => __( 'Users' ) + ); + + if ( has_filter( 'wpmublogsaction' ) ) + $sites_columns['plugins'] = __( 'Actions' ); + + $sites_columns = apply_filters( 'wpmu_blogs_columns', $sites_columns ); + + return $sites_columns; + } + + function get_sortable_columns() { + return array( + 'blogname' => 'blogname', + 'lastupdated' => 'lastupdated', + 'registered' => 'blog_id', + ); + } + + function display_rows() { + global $current_site, $mode; + + $status_list = array( + 'archived' => array( 'site-archived', __( 'Archived' ) ), + 'spam' => array( 'site-spammed', _x( 'Spam', 'site' ) ), + 'deleted' => array( 'site-deleted', __( 'Deleted' ) ), + 'mature' => array( 'site-mature', __( 'Mature' ) ) + ); + + $class = ''; + foreach ( $this->items as $blog ) { + $class = ( 'alternate' == $class ) ? '' : 'alternate'; + reset( $status_list ); + + $blog_states = array(); + foreach ( $status_list as $status => $col ) { + if ( get_blog_status( $blog['blog_id'], $status ) == 1 ) { + $class = $col[0]; + $blog_states[] = $col[1]; + } + } + $blog_state = ''; + if ( ! empty( $blog_states ) ) { + $state_count = count( $blog_states ); + $i = 0; + $blog_state .= ' - '; + foreach ( $blog_states as $state ) { + ++$i; + ( $i == $state_count ) ? $sep = '' : $sep = ', '; + $blog_state .= "$state$sep"; + } + } + echo ""; + + $blogname = ( is_subdomain_install() ) ? str_replace( '.'.$current_site->domain, '', $blog['domain'] ) : $blog['path']; + + list( $columns, $hidden ) = $this->get_column_info(); + + foreach ( $columns as $column_name => $column_display_name ) { + $style = ''; + if ( in_array( $column_name, $hidden ) ) + $style = ' style="display:none;"'; + + switch ( $column_name ) { + case 'cb': ?> + + + + "; ?> + + ' . sprintf( _x( '%1$s – %2$s', '%1$s: site name. %2$s: site tagline.' ), get_blog_option( $blog['blog_id'], 'blogname' ), get_blog_option( $blog['blog_id'], 'blogdescription ' ) ) . '

'; + + // Preordered. + $actions = array( + 'edit' => '', 'backend' => '', + 'activate' => '', 'deactivate' => '', + 'archive' => '', 'unarchive' => '', + 'spam' => '', 'unspam' => '', + 'delete' => '', + 'visit' => '', + ); + + $actions['edit'] = '' . __( 'Edit' ) . ''; + $actions['backend'] = "" . __( 'Dashboard' ) . ''; + if ( $current_site->blog_id != $blog['blog_id'] ) { + if ( get_blog_status( $blog['blog_id'], 'deleted' ) == '1' ) + $actions['activate'] = '' . __( 'Activate' ) . ''; + else + $actions['deactivate'] = '' . __( 'Deactivate' ) . ''; + + if ( get_blog_status( $blog['blog_id'], 'archived' ) == '1' ) + $actions['unarchive'] = '' . __( 'Unarchive' ) . ''; + else + $actions['archive'] = '' . _x( 'Archive', 'verb; site' ) . ''; + + if ( get_blog_status( $blog['blog_id'], 'spam' ) == '1' ) + $actions['unspam'] = '' . _x( 'Not Spam', 'site' ) . ''; + else + $actions['spam'] = '' . _x( 'Spam', 'site' ) . ''; + + if ( current_user_can( 'delete_site', $blog['blog_id'] ) ) + $actions['delete'] = '' . __( 'Delete' ) . ''; + } + + $actions['visit'] = "" . __( 'Visit' ) . ''; + + $actions = apply_filters( 'manage_sites_action_links', array_filter( $actions ), $blog['blog_id'], $blogname ); + echo $this->row_actions( $actions ); + ?> + + "; + if ( 'list' == $mode ) + $date = 'Y/m/d'; + else + $date = 'Y/m/d \<\b\r \/\> g:i:s a'; + echo ( $blog['last_updated'] == '0000-00-00 00:00:00' ) ? __( 'Never' ) : mysql2date( $date, $blog['last_updated'] ); ?> + + "; + if ( $blog['registered'] == '0000-00-00 00:00:00' ) + echo '—'; + else + echo mysql2date( $date, $blog['registered'] ); + ?> + + "; + $blogusers = get_users( array( 'blog_id' => $blog['blog_id'], 'number' => 6) ); + if ( is_array( $blogusers ) ) { + $blogusers_warning = ''; + if ( count( $blogusers ) > 5 ) { + $blogusers = array_slice( $blogusers, 0, 5 ); + $blogusers_warning = __( 'Only showing first 5 users.' ) . ' ' . __( 'More' ) . ''; + } + foreach ( $blogusers as $user_object ) { + echo '' . esc_html( $user_object->user_login ) . ' '; + if ( 'list' != $mode ) + echo '( ' . $user_object->user_email . ' )'; + echo '
'; + } + if ( $blogusers_warning != '' ) + echo '' . $blogusers_warning . '
'; + } + ?> + + + "; + do_action( 'wpmublogsaction', $blog['blog_id'] ); ?> + + "; + do_action( 'manage_sites_custom_column', $column_name, $blog['blog_id'] ); + echo ""; + break; + } + } + ?> + + diff --git a/src/wp-admin/includes/class-wp-ms-themes-list-table.php b/src/wp-admin/includes/class-wp-ms-themes-list-table.php new file mode 100644 index 0000000..cd9841d --- /dev/null +++ b/src/wp-admin/includes/class-wp-ms-themes-list-table.php @@ -0,0 +1,361 @@ +get_pagenum(); + + $screen = get_current_screen(); + $this->is_site_themes = ( 'site-themes-network' == $screen->id ) ? true : false; + + if ( $this->is_site_themes ) + $this->site_id = isset( $_REQUEST['id'] ) ? intval( $_REQUEST['id'] ) : 0; + + parent::__construct( array( + 'plural' => 'themes' + ) ); + } + + function get_table_classes() { + return array( 'widefat', 'plugins' ); // todo: remove and add CSS for .themes + } + + function ajax_user_can() { + $menu_perms = get_site_option( 'menu_items', array() ); + + if ( empty( $menu_perms['themes'] ) && ! is_super_admin() ) + return false; + + if ( $this->is_site_themes && !current_user_can('manage_sites') ) + return false; + elseif ( !$this->is_site_themes && !current_user_can('manage_network_themes') ) + return false; + return true; + } + + function prepare_items() { + global $status, $themes, $totals, $page, $orderby, $order, $s; + + wp_reset_vars( array( 'orderby', 'order', 's' ) ); + + $themes = array( + 'all' => apply_filters( 'all_themes', get_themes() ), + 'search' => array(), + 'enabled' => array(), + 'disabled' => array(), + 'upgrade' => array() + ); + + $site_allowed_themes = get_site_allowed_themes(); + if ( !$this->is_site_themes ) { + $allowed_themes = $site_allowed_themes; + $themes_per_page = $this->get_items_per_page( 'themes_network_per_page' ); + } else { + $allowed_themes = wpmu_get_blog_allowedthemes( $this->site_id ); + $themes_per_page = $this->get_items_per_page( 'site_themes_network_per_page' ); + } + + $current = get_site_transient( 'update_themes' ); + + foreach ( (array) $themes['all'] as $key => $theme ) { + $theme_key = $theme['Stylesheet']; + + if ( isset( $allowed_themes [ $theme_key ] ) ) { + $themes['all'][$key]['enabled'] = true; + $themes['enabled'][$key] = $themes['all'][$key]; + } + else { + $themes['all'][$key]['enabled'] = false; + $themes['disabled'][$key] = $themes['all'][$key]; + } + if ( isset( $current->response[ $theme['Template'] ] ) ) + $themes['upgrade'][$key] = $themes['all'][$key]; + + if ( $this->is_site_themes && isset( $site_allowed_themes[$theme_key] ) ) { + unset( $themes['all'][$key] ); + unset( $themes['enabled'][$key] ); + unset( $themes['disabled'][$key] ); + } + } + + if ( !current_user_can( 'update_themes' ) || $this->is_site_themes ) + $themes['upgrade'] = array(); + + if ( $s ) { + $status = 'search'; + $themes['search'] = array_filter( $themes['all'], array( &$this, '_search_callback' ) ); + } + + $totals = array(); + foreach ( $themes as $type => $list ) + $totals[ $type ] = count( $list ); + + if ( empty( $themes[ $status ] ) && !in_array( $status, array( 'all', 'search' ) ) ) + $status = 'all'; + + $this->items = $themes[ $status ]; + $total_this_page = $totals[ $status ]; + + if ( $orderby ) { + $orderby = ucfirst( $orderby ); + $order = strtoupper( $order ); + + uasort( $this->items, array( &$this, '_order_callback' ) ); + } + + $start = ( $page - 1 ) * $themes_per_page; + + if ( $total_this_page > $themes_per_page ) + $this->items = array_slice( $this->items, $start, $themes_per_page ); + + $this->set_pagination_args( array( + 'total_items' => $total_this_page, + 'per_page' => $themes_per_page, + ) ); + } + + function _search_callback( $theme ) { + static $term; + if ( is_null( $term ) ) + $term = stripslashes( $_REQUEST['s'] ); + + $search_fields = array( 'Name', 'Title', 'Description', 'Author', 'Author Name', 'Author URI', 'Template', 'Stylesheet' ); + foreach ( $search_fields as $field ) + if ( stripos( $theme[ $field ], $term ) !== false ) + return true; + + return false; + } + + function _order_callback( $theme_a, $theme_b ) { + global $orderby, $order; + + $a = $theme_a[$orderby]; + $b = $theme_b[$orderby]; + + if ( $a == $b ) + return 0; + + if ( 'DESC' == $order ) + return ( $a < $b ) ? 1 : -1; + else + return ( $a < $b ) ? -1 : 1; + } + + function no_items() { + global $themes; + + if ( !empty( $themes['all'] ) ) + _e( 'No themes found.' ); + else + _e( 'You do not appear to have any themes available at this time.' ); + } + + function get_columns() { + global $status; + + return array( + 'cb' => '', + 'name' => __( 'Theme' ), + 'description' => __( 'Description' ), + ); + } + + function get_sortable_columns() { + return array( + 'name' => 'name', + ); + } + + function get_views() { + global $totals, $status; + + $status_links = array(); + foreach ( $totals as $type => $count ) { + if ( !$count ) + continue; + + switch ( $type ) { + case 'all': + $text = _nx( 'All (%s)', 'All (%s)', $count, 'themes' ); + break; + case 'enabled': + $text = _n( 'Enabled (%s)', 'Enabled (%s)', $count ); + break; + case 'disabled': + $text = _n( 'Disabled (%s)', 'Disabled (%s)', $count ); + break; + case 'upgrade': + $text = _n( 'Update Available (%s)', 'Update Available (%s)', $count ); + break; + } + + if ( $this->is_site_themes ) + $url = 'site-themes.php?id=' . $this->site_id; + else + $url = 'themes.php'; + + if ( 'search' != $type ) { + $status_links[$type] = sprintf( "%s", + esc_url( add_query_arg('theme_status', $type, $url) ), + ( $type == $status ) ? ' class="current"' : '', + sprintf( $text, number_format_i18n( $count ) ) + ); + } + } + + return $status_links; + } + + function get_bulk_actions() { + global $status; + + $actions = array(); + if ( 'enabled' != $status ) + $actions['enable-selected'] = $this->is_site_themes ? __( 'Enable' ) : __( 'Network Enable' ); + if ( 'disabled' != $status ) + $actions['disable-selected'] = $this->is_site_themes ? __( 'Disable' ) : __( 'Network Disable' ); + if ( ! $this->is_site_themes ) { + if ( current_user_can( 'delete_themes' ) ) + $actions['delete-selected'] = __( 'Delete' ); + if ( current_user_can( 'update_themes' ) ) + $actions['update-selected'] = __( 'Update' ); + } + return $actions; + } + + function bulk_actions( $which ) { + global $status; + parent::bulk_actions( $which ); + } + + function current_action() { + return parent::current_action(); + } + + function display_rows() { + foreach ( $this->items as $key => $theme ) + $this->single_row( $key, $theme ); + } + + function single_row( $key, $theme ) { + global $status, $page, $s; + + $context = $status; + + if ( $this->is_site_themes ) + $url = "site-themes.php?id={$this->site_id}&"; + else + $url = 'themes.php?'; + + // preorder + $actions = array( + 'enable' => '', + 'disable' => '', + 'edit' => '', + 'delete' => '' + ); + + $theme_key = $theme['Stylesheet']; + + if ( empty( $theme['enabled'] ) ) + $actions['enable'] = '' . ( $this->is_site_themes ? __( 'Enable' ) : __( 'Network Enable' ) ) . ''; + else + $actions['disable'] = '' . ( $this->is_site_themes ? __( 'Disable' ) : __( 'Network Disable' ) ) . ''; + + if ( current_user_can('edit_themes') ) + $actions['edit'] = '' . __('Edit') . ''; + + if ( empty( $theme['enabled'] ) && current_user_can( 'delete_themes' ) && ! $this->is_site_themes && $theme_key != get_option( 'stylesheet' ) && $theme_key != get_option( 'template' ) ) + $actions['delete'] = '' . __( 'Delete' ) . ''; + + $actions = apply_filters( 'theme_action_links', array_filter( $actions ), $theme_key, $theme, $context ); + $actions = apply_filters( "theme_action_links_$theme_key", $actions, $theme_key, $theme, $context ); + + $class = empty( $theme['enabled'] ) ? 'inactive' : 'active'; + $checkbox_id = "checkbox_" . md5($theme['Name']); + $checkbox = ""; + + $description = '

' . $theme['Description'] . '

'; + $theme_name = $theme['Name']; + + $id = sanitize_title( $theme_name ); + + echo ""; + + list( $columns, $hidden ) = $this->get_column_info(); + + foreach ( $columns as $column_name => $column_display_name ) { + $style = ''; + if ( in_array( $column_name, $hidden ) ) + $style = ' style="display:none;"'; + + switch ( $column_name ) { + case 'cb': + echo ""; + break; + case 'name': + echo ""; + break; + case 'description': + echo ""; + break; + + default: + echo ""; + } + } + + echo ""; + + if ( $this->is_site_themes ) + remove_action( "after_theme_row_$theme_key", 'wp_theme_update_row' ); + do_action( 'after_theme_row', $theme_key, $theme, $status ); + do_action( "after_theme_row_$theme_key", $theme_key, $theme, $status ); + } +} + +?> diff --git a/src/wp-admin/includes/class-wp-ms-users-list-table.php b/src/wp-admin/includes/class-wp-ms-users-list-table.php new file mode 100644 index 0000000..66c41c4 --- /dev/null +++ b/src/wp-admin/includes/class-wp-ms-users-list-table.php @@ -0,0 +1,277 @@ +get_items_per_page( 'users_network_per_page' ); + + $role = isset( $_REQUEST['role'] ) ? $_REQUEST['role'] : ''; + + $paged = $this->get_pagenum(); + + $args = array( + 'number' => $users_per_page, + 'offset' => ( $paged-1 ) * $users_per_page, + 'search' => $usersearch, + 'blog_id' => 0, + 'fields' => 'all_with_meta' + ); + + $args['search'] = ltrim($args['search'], '*'); + + if ( $role == 'super' ) { + $logins = implode( "', '", get_super_admins() ); + $args['include'] = $wpdb->get_col( "SELECT ID FROM $wpdb->users WHERE user_login IN ('$logins')" ); + } + + // If the network is large and a search is not being performed, show only the latest users with no paging in order + // to avoid expensive count queries. + if ( !$usersearch && ( get_blog_count() >= 10000 ) ) { + if ( !isset($_REQUEST['orderby']) ) + $_GET['orderby'] = $_REQUEST['orderby'] = 'id'; + if ( !isset($_REQUEST['order']) ) + $_GET['order'] = $_REQUEST['order'] = 'DESC'; + $args['count_total'] = false; + } + + if ( isset( $_REQUEST['orderby'] ) ) + $args['orderby'] = $_REQUEST['orderby']; + + if ( isset( $_REQUEST['order'] ) ) + $args['order'] = $_REQUEST['order']; + + $mode = empty( $_REQUEST['mode'] ) ? 'list' : $_REQUEST['mode']; + + // Query the user IDs for this page + $wp_user_search = new WP_User_Query( $args ); + + $this->items = $wp_user_search->get_results(); + + $this->set_pagination_args( array( + 'total_items' => $wp_user_search->get_total(), + 'per_page' => $users_per_page, + ) ); + } + + function get_bulk_actions() { + $actions = array(); + if ( current_user_can( 'delete_users' ) ) + $actions['delete'] = __( 'Delete' ); + $actions['spam'] = _x( 'Mark as Spam', 'user' ); + $actions['notspam'] = _x( 'Not Spam', 'user' ); + + return $actions; + } + + function no_items() { + _e( 'No users found.' ); + } + + function get_views() { + global $wp_roles, $role; + + $total_users = get_user_count(); + $super_admins = get_super_admins(); + $total_admins = count( $super_admins ); + + $current_role = false; + $class = $role != 'super' ? ' class="current"' : ''; + $role_links = array(); + $role_links['all'] = "" . sprintf( _nx( 'All (%s)', 'All (%s)', $total_users, 'users' ), number_format_i18n( $total_users ) ) . ''; + $class = $role == 'super' ? ' class="current"' : ''; + $role_links['super'] = "" . sprintf( _n( 'Super Admin (%s)', 'Super Admins (%s)', $total_admins ), number_format_i18n( $total_admins ) ) . ''; + + return $role_links; + } + + function pagination( $which ) { + global $mode; + + parent::pagination ( $which ); + + if ( 'top' == $which ) + $this->view_switcher( $mode ); + } + + function get_columns() { + $users_columns = array( + 'cb' => '', + 'username' => __( 'Username' ), + 'name' => __( 'Name' ), + 'email' => __( 'E-mail' ), + 'registered' => _x( 'Registered', 'user' ), + 'blogs' => __( 'Sites' ) + ); + $users_columns = apply_filters( 'wpmu_users_columns', $users_columns ); + + return $users_columns; + } + + function get_sortable_columns() { + return array( + 'username' => 'login', + 'name' => 'name', + 'email' => 'email', + 'registered' => 'id', + ); + } + + function display_rows() { + global $current_site, $mode; + + $alt = ''; + $super_admins = get_super_admins(); + foreach ( $this->items as $user ) { + $alt = ( 'alternate' == $alt ) ? '' : 'alternate'; + + $status_list = array( 'spam' => 'site-spammed', 'deleted' => 'site-deleted' ); + + foreach ( $status_list as $status => $col ) { + if ( $user->$status ) + $alt .= " $col"; + } + + ?> + + get_column_info(); + + foreach ( $columns as $column_name => $column_display_name ) : + $class = "class='$column_name column-$column_name'"; + + $style = ''; + if ( in_array( $column_name, $hidden ) ) + $style = ' style="display:none;"'; + + $attributes = "$class$style"; + + + switch ( $column_name ) { + case 'cb': ?> + + user_email, 32 ); + if ( get_current_user_id() == $user->ID ) { + $edit_link = esc_url( network_admin_url( 'profile.php' ) ); + } else { + $edit_link = esc_url( network_admin_url( add_query_arg( 'wp_http_referer', urlencode( stripslashes( $_SERVER['REQUEST_URI'] ) ), 'user-edit.php?user_id=' . $user->ID ) ) ); + } + + echo " + $user->first_name $user->last_name"; + break; + + case 'email': + echo ""; + break; + + case 'registered': + if ( 'list' == $mode ) + $date = 'Y/m/d'; + else + $date = 'Y/m/d \<\b\r \/\> g:i:s a'; + + echo ""; + break; + + case 'blogs': + $blogs = get_blogs_of_user( $user->ID, true ); + echo " + "; + echo apply_filters( 'manage_users_custom_column', '', $column_name, $user->ID ); + echo ""; + break; + } + endforeach + ?> + + diff --git a/src/wp-admin/includes/class-wp-plugin-install-list-table.php b/src/wp-admin/includes/class-wp-plugin-install-list-table.php new file mode 100644 index 0000000..1f809b3 --- /dev/null +++ b/src/wp-admin/includes/class-wp-plugin-install-list-table.php @@ -0,0 +1,244 @@ +get_pagenum(); + + $per_page = 30; + + // These are the tabs which are shown on the page + $tabs = array(); + $tabs['dashboard'] = __( 'Search' ); + if ( 'search' == $tab ) + $tabs['search'] = __( 'Search Results' ); + $tabs['upload'] = __( 'Upload' ); + $tabs['featured'] = _x( 'Featured','Plugin Installer' ); + $tabs['popular'] = _x( 'Popular','Plugin Installer' ); + $tabs['new'] = _x( 'Newest','Plugin Installer' ); + $tabs['updated'] = _x( 'Recently Updated','Plugin Installer' ); + + $nonmenu_tabs = array( 'plugin-information' ); //Valid actions to perform which do not have a Menu item. + + $tabs = apply_filters( 'install_plugins_tabs', $tabs ); + $nonmenu_tabs = apply_filters( 'install_plugins_nonmenu_tabs', $nonmenu_tabs ); + + // If a non-valid menu tab has been selected, And its not a non-menu action. + if ( empty( $tab ) || ( !isset( $tabs[ $tab ] ) && !in_array( $tab, (array) $nonmenu_tabs ) ) ) + $tab = key( $tabs ); + + $args = array( 'page' => $paged, 'per_page' => $per_page ); + + switch ( $tab ) { + case 'search': + $type = isset( $_REQUEST['type'] ) ? stripslashes( $_REQUEST['type'] ) : ''; + $term = isset( $_REQUEST['s'] ) ? stripslashes( $_REQUEST['s'] ) : ''; + + switch ( $type ) { + case 'tag': + $args['tag'] = sanitize_title_with_dashes( $term ); + break; + case 'term': + $args['search'] = $term; + break; + case 'author': + $args['author'] = $term; + break; + } + + add_action( 'install_plugins_table_header', 'install_search_form' ); + break; + + case 'featured': + case 'popular': + case 'new': + case 'updated': + $args['browse'] = $tab; + break; + + default: + $args = false; + } + + if ( !$args ) + return; + + $api = plugins_api( 'query_plugins', $args ); + + if ( is_wp_error( $api ) ) + wp_die( $api->get_error_message() . '

' . __( 'Try again' ) . '' ); + + $this->items = $api->plugins; + + $this->set_pagination_args( array( + 'total_items' => $api->info['results'], + 'per_page' => $per_page, + ) ); + } + + function no_items() { + _e( 'No plugins match your request.' ); + } + + function get_views() { + global $tabs, $tab; + + $display_tabs = array(); + foreach ( (array) $tabs as $action => $text ) { + $class = ( $action == $tab ) ? ' class="current"' : ''; + $href = self_admin_url('plugin-install.php?tab=' . $action); + $display_tabs['plugin-install-'.$action] = "$text"; + } + + return $display_tabs; + } + + function display_tablenav( $which ) { + if ( 'top' == $which ) { ?> +

+
+ +
+ pagination( $which ); ?> + +
+
+ +
+ pagination( $which ); ?> + +
+
+ _args ); + + return array( 'widefat', $plural ); + } + + function get_columns() { + return array( + 'name' => _x( 'Name', 'plugin name' ), + 'version' => __( 'Version' ), + 'rating' => __( 'Rating' ), + 'description' => __( 'Description' ), + ); + } + + function display_rows() { + $plugins_allowedtags = array( + 'a' => array( 'href' => array(),'title' => array(), 'target' => array() ), + 'abbr' => array( 'title' => array() ),'acronym' => array( 'title' => array() ), + 'code' => array(), 'pre' => array(), 'em' => array(),'strong' => array(), + 'ul' => array(), 'ol' => array(), 'li' => array(), 'p' => array(), 'br' => array() + ); + + list( $columns, $hidden ) = $this->get_column_info(); + + $style = array(); + foreach ( $columns as $column_name => $column_display_name ) { + $style[ $column_name ] = in_array( $column_name, $hidden ) ? 'style="display:none;"' : ''; + } + + foreach ( (array) $this->items as $plugin ) { + if ( is_object( $plugin ) ) + $plugin = (array) $plugin; + + $title = wp_kses( $plugin['name'], $plugins_allowedtags ); + //Limit description to 400char, and remove any HTML. + $description = strip_tags( $plugin['description'] ); + if ( strlen( $description ) > 400 ) + $description = mb_substr( $description, 0, 400 ) . '…'; + //remove any trailing entities + $description = preg_replace( '/&[^;\s]{0,6}$/', '', $description ); + //strip leading/trailing & multiple consecutive lines + $description = trim( $description ); + $description = preg_replace( "|(\r?\n)+|", "\n", $description ); + //\n =>
+ $description = nl2br( $description ); + $version = wp_kses( $plugin['version'], $plugins_allowedtags ); + + $name = strip_tags( $title . ' ' . $version ); + + $author = $plugin['author']; + if ( ! empty( $plugin['author'] ) ) + $author = ' ' . sprintf( __( 'By %s' ), $author ) . '.'; + + $author = wp_kses( $author, $plugins_allowedtags ); + + $action_links = array(); + $action_links[] = '' . __( 'Details' ) . ''; + + if ( current_user_can( 'install_plugins' ) || current_user_can( 'update_plugins' ) ) { + $status = install_plugin_install_status( $plugin ); + + switch ( $status['status'] ) { + case 'install': + if ( $status['url'] ) + $action_links[] = '' . __( 'Install Now' ) . ''; + break; + case 'update_available': + if ( $status['url'] ) + $action_links[] = '' . sprintf( __( 'Update Now' ), $status['version'] ) . ''; + break; + case 'latest_installed': + case 'newer_installed': + $action_links[] = '' . __( 'Installed' ) . ''; + break; + } + } + + $action_links = apply_filters( 'plugin_install_action_links', $action_links, $plugin ); + ?> + + + + + + + diff --git a/src/wp-admin/includes/class-wp-plugins-list-table.php b/src/wp-admin/includes/class-wp-plugins-list-table.php new file mode 100644 index 0000000..99ce212 --- /dev/null +++ b/src/wp-admin/includes/class-wp-plugins-list-table.php @@ -0,0 +1,458 @@ +get_pagenum(); + + parent::__construct( array( + 'plural' => 'plugins', + ) ); + } + + function get_table_classes() { + return array( 'widefat', $this->_args['plural'] ); + } + + function ajax_user_can() { + if ( is_multisite() ) { + $menu_perms = get_site_option( 'menu_items', array() ); + + if ( empty( $menu_perms['plugins'] ) && ! is_super_admin() ) + return false; + } + + return current_user_can('activate_plugins'); + } + + function prepare_items() { + global $status, $plugins, $totals, $page, $orderby, $order, $s; + + wp_reset_vars( array( 'orderby', 'order', 's' ) ); + + $plugins = array( + 'all' => apply_filters( 'all_plugins', get_plugins() ), + 'search' => array(), + 'active' => array(), + 'inactive' => array(), + 'recently_activated' => array(), + 'upgrade' => array(), + 'mustuse' => array(), + 'dropins' => array() + ); + + $screen = get_current_screen(); + + if ( ! is_multisite() || ( $screen->is_network && current_user_can('manage_network_plugins') ) ) { + if ( apply_filters( 'show_advanced_plugins', true, 'mustuse' ) ) + $plugins['mustuse'] = get_mu_plugins(); + if ( apply_filters( 'show_advanced_plugins', true, 'dropins' ) ) + $plugins['dropins'] = get_dropins(); + + $current = get_site_transient( 'update_plugins' ); + foreach ( (array) $plugins['all'] as $plugin_file => $plugin_data ) { + if ( isset( $current->response[ $plugin_file ] ) ) + $plugins['upgrade'][ $plugin_file ] = $plugin_data; + } + } + + set_transient( 'plugin_slugs', array_keys( $plugins['all'] ), 86400 ); + + $recently_activated = get_option( 'recently_activated', array() ); + + $one_week = 7*24*60*60; + foreach ( $recently_activated as $key => $time ) + if ( $time + $one_week < time() ) + unset( $recently_activated[$key] ); + update_option( 'recently_activated', $recently_activated ); + + foreach ( (array) $plugins['all'] as $plugin_file => $plugin_data ) { + // Filter into individual sections + if ( is_multisite() && is_network_only_plugin( $plugin_file ) && !$screen->is_network ) { + unset( $plugins['all'][ $plugin_file] ); + } elseif ( is_plugin_active_for_network($plugin_file) && !$screen->is_network ) { + unset( $plugins['all'][ $plugin_file ] ); + } elseif ( is_multisite() && is_network_only_plugin( $plugin_file ) && !current_user_can( 'manage_network_plugins' ) ) { + $plugins['network'][ $plugin_file ] = $plugin_data; + } elseif ( ( !$screen->is_network && is_plugin_active( $plugin_file ) ) + || ( $screen->is_network && is_plugin_active_for_network( $plugin_file ) ) ) { + $plugins['active'][ $plugin_file ] = $plugin_data; + } else { + if ( !$screen->is_network && isset( $recently_activated[ $plugin_file ] ) ) // Was the plugin recently activated? + $plugins['recently_activated'][ $plugin_file ] = $plugin_data; + $plugins['inactive'][ $plugin_file ] = $plugin_data; + } + } + + if ( !current_user_can( 'update_plugins' ) ) + $plugins['upgrade'] = array(); + + if ( $s ) { + $status = 'search'; + $plugins['search'] = array_filter( $plugins['all'], array( &$this, '_search_callback' ) ); + } + + $totals = array(); + foreach ( $plugins as $type => $list ) + $totals[ $type ] = count( $list ); + + if ( empty( $plugins[ $status ] ) && !in_array( $status, array( 'all', 'search' ) ) ) + $status = 'all'; + + $this->items = array(); + foreach ( $plugins[ $status ] as $plugin_file => $plugin_data ) { + // Translate, Don't Apply Markup, Sanitize HTML + $this->items[$plugin_file] = _get_plugin_data_markup_translate( $plugin_file, $plugin_data, false, true ); + } + + $total_this_page = $totals[ $status ]; + + if ( $orderby ) { + $orderby = ucfirst( $orderby ); + $order = strtoupper( $order ); + + uasort( $this->items, array( &$this, '_order_callback' ) ); + } + + $plugins_per_page = $this->get_items_per_page( str_replace( '-', '_', $screen->id . '_per_page' ), 999 ); + + $start = ( $page - 1 ) * $plugins_per_page; + + if ( $total_this_page > $plugins_per_page ) + $this->items = array_slice( $this->items, $start, $plugins_per_page ); + + $this->set_pagination_args( array( + 'total_items' => $total_this_page, + 'per_page' => $plugins_per_page, + ) ); + } + + function _search_callback( $plugin ) { + static $term; + if ( is_null( $term ) ) + $term = stripslashes( $_REQUEST['s'] ); + + foreach ( $plugin as $value ) + if ( stripos( $value, $term ) !== false ) + return true; + + return false; + } + + function _order_callback( $plugin_a, $plugin_b ) { + global $orderby, $order; + + $a = $plugin_a[$orderby]; + $b = $plugin_b[$orderby]; + + if ( $a == $b ) + return 0; + + if ( 'DESC' == $order ) + return ( $a < $b ) ? 1 : -1; + else + return ( $a < $b ) ? -1 : 1; + } + + function no_items() { + global $plugins; + + if ( !empty( $plugins['all'] ) ) + _e( 'No plugins found.' ); + else + _e( 'You do not appear to have any plugins available at this time.' ); + } + + function get_columns() { + global $status; + + return array( + 'cb' => !in_array( $status, array( 'mustuse', 'dropins' ) ) ? '' : '', + 'name' => __( 'Plugin' ), + 'description' => __( 'Description' ), + ); + } + + function get_sortable_columns() { + return array(); + } + + function get_views() { + global $totals, $status; + + $status_links = array(); + foreach ( $totals as $type => $count ) { + if ( !$count ) + continue; + + switch ( $type ) { + case 'all': + $text = _nx( 'All (%s)', 'All (%s)', $count, 'plugins' ); + break; + case 'active': + $text = _n( 'Active (%s)', 'Active (%s)', $count ); + break; + case 'recently_activated': + $text = _n( 'Recently Active (%s)', 'Recently Active (%s)', $count ); + break; + case 'inactive': + $text = _n( 'Inactive (%s)', 'Inactive (%s)', $count ); + break; + case 'network': + $text = _n( 'Network (%s)', 'Network (%s)', $count ); + break; + case 'mustuse': + $text = _n( 'Must-Use (%s)', 'Must-Use (%s)', $count ); + break; + case 'dropins': + $text = _n( 'Drop-ins (%s)', 'Drop-ins (%s)', $count ); + break; + case 'upgrade': + $text = _n( 'Update Available (%s)', 'Update Available (%s)', $count ); + break; + } + + if ( 'search' != $type ) { + $status_links[$type] = sprintf( "%s", + add_query_arg('plugin_status', $type, 'plugins.php'), + ( $type == $status ) ? ' class="current"' : '', + sprintf( $text, number_format_i18n( $count ) ) + ); + } + } + + return $status_links; + } + + function get_bulk_actions() { + global $status; + + $actions = array(); + + $screen = get_current_screen(); + + if ( 'active' != $status ) { + $action = $screen->is_network ? 'network-activate-selected' : 'activate-selected'; + $actions[ $action ] = __( 'Activate' ); + } + + if ( 'inactive' != $status && 'recent' != $status ) + $actions['deactivate-selected'] = __( 'Deactivate' ); + + if ( !is_multisite() || $screen->is_network ) { + if ( current_user_can( 'update_plugins' ) ) + $actions['update-selected'] = __( 'Update' ); + if ( current_user_can( 'delete_plugins' ) && ( 'active' != $status ) ) + $actions['delete-selected'] = __( 'Delete' ); + } + + return $actions; + } + + function bulk_actions( $which ) { + global $status; + + if ( in_array( $status, array( 'mustuse', 'dropins' ) ) ) + return; + + parent::bulk_actions( $which ); + } + + function extra_tablenav( $which ) { + global $status; + + if ( ! in_array($status, array('recently_activated', 'mustuse', 'dropins') ) ) + return; + + echo '
'; + + if ( 'recently_activated' == $status ) + submit_button( __( 'Clear List' ), 'secondary', 'clear-recent-list', false ); + elseif ( 'top' == $which && 'mustuse' == $status ) + echo '

' . sprintf( __( 'Files in the %s directory are executed automatically.' ), str_replace( ABSPATH, '/', WPMU_PLUGIN_DIR ) ) . '

'; + elseif ( 'top' == $which && 'dropins' == $status ) + echo '

' . sprintf( __( 'Drop-ins are advanced plugins in the %s directory that replace WordPress functionality when present.' ), str_replace( ABSPATH, '', WP_CONTENT_DIR ) ) . '

'; + + echo '
'; + } + + function current_action() { + if ( isset($_POST['clear-recent-list']) ) + return 'clear-recent-list'; + + return parent::current_action(); + } + + function display_rows() { + global $status; + + $screen = get_current_screen(); + + if ( is_multisite() && !$screen->is_network && in_array( $status, array( 'mustuse', 'dropins' ) ) ) + return; + + foreach ( $this->items as $plugin_file => $plugin_data ) + $this->single_row( $plugin_file, $plugin_data ); + } + + function single_row( $plugin_file, $plugin_data ) { + global $status, $page, $s; + + $context = $status; + + $screen = get_current_screen(); + + // preorder + $actions = array( + 'network_deactivate' => '', 'deactivate' => '', + 'network_only' => '', 'activate' => '', + 'network_activate' => '', + 'edit' => '', + 'delete' => '', + ); + + if ( 'mustuse' == $context ) { + $is_active = true; + } elseif ( 'dropins' == $context ) { + $dropins = _get_dropins(); + $plugin_name = $plugin_file; + if ( $plugin_file != $plugin_data['Name'] ) + $plugin_name .= '
' . $plugin_data['Name']; + if ( true === ( $dropins[ $plugin_file ][1] ) ) { // Doesn't require a constant + $is_active = true; + $description = '

' . $dropins[ $plugin_file ][0] . '

'; + } elseif ( constant( $dropins[ $plugin_file ][1] ) ) { // Constant is true + $is_active = true; + $description = '

' . $dropins[ $plugin_file ][0] . '

'; + } else { + $is_active = false; + $description = '

' . $dropins[ $plugin_file ][0] . ' ' . __('Inactive:') . ' ' . sprintf( __( 'Requires %s in wp-config.php.' ), "define('" . $dropins[ $plugin_file ][1] . "', true);" ) . '

'; + } + if ( $plugin_data['Description'] ) + $description .= '

' . $plugin_data['Description'] . '

'; + } else { + $is_active_for_network = is_plugin_active_for_network($plugin_file); + if ( $screen->is_network ) + $is_active = $is_active_for_network; + else + $is_active = is_plugin_active( $plugin_file ); + + if ( $is_active_for_network && !is_super_admin() && !$screen->is_network ) + return; + + if ( $screen->is_network ) { + if ( $is_active_for_network ) { + if ( current_user_can( 'manage_network_plugins' ) ) + $actions['network_deactivate'] = '' . __('Network Deactivate') . ''; + } else { + if ( current_user_can( 'manage_network_plugins' ) ) + $actions['network_activate'] = '' . __('Network Activate') . ''; + if ( current_user_can( 'delete_plugins' ) && ! is_plugin_active( $plugin_file ) ) + $actions['delete'] = '' . __('Delete') . ''; + } + } else { + if ( $is_active ) { + $actions['deactivate'] = '' . __('Deactivate') . ''; + } else { + $actions['activate'] = '' . __('Activate') . ''; + + if ( ! is_multisite() && current_user_can('delete_plugins') ) + $actions['delete'] = '' . __('Delete') . ''; + } // end if $is_active + } // end if $screen->is_network + + if ( ( ! is_multisite() || $screen->is_network ) && current_user_can('edit_plugins') && is_writable(WP_PLUGIN_DIR . '/' . $plugin_file) ) + $actions['edit'] = '' . __('Edit') . ''; + } // end if $context + + $prefix = $screen->is_network ? 'network_admin_' : ''; + $actions = apply_filters( $prefix . 'plugin_action_links', array_filter( $actions ), $plugin_file, $plugin_data, $context ); + $actions = apply_filters( $prefix . "plugin_action_links_$plugin_file", $actions, $plugin_file, $plugin_data, $context ); + + $class = $is_active ? 'active' : 'inactive'; + $checkbox_id = "checkbox_" . md5($plugin_data['Name']); + $checkbox = in_array( $status, array( 'mustuse', 'dropins' ) ) ? '' : ""; + if ( 'dropins' != $context ) { + $description = '

' . ( $plugin_data['Description'] ? $plugin_data['Description'] : ' ' ) . '

'; + $plugin_name = $plugin_data['Name']; + } + + $id = sanitize_title( $plugin_name ); + + echo ""; + + list( $columns, $hidden ) = $this->get_column_info(); + + foreach ( $columns as $column_name => $column_display_name ) { + $style = ''; + if ( in_array( $column_name, $hidden ) ) + $style = ' style="display:none;"'; + + switch ( $column_name ) { + case 'cb': + echo ""; + break; + case 'name': + echo ""; + break; + case 'description': + echo ""; + break; + default: + echo ""; + } + } + + echo ""; + + do_action( 'after_plugin_row', $plugin_file, $plugin_data, $status ); + do_action( "after_plugin_row_$plugin_file", $plugin_file, $plugin_data, $status ); + } +} + +?> diff --git a/src/wp-admin/includes/class-wp-posts-list-table.php b/src/wp-admin/includes/class-wp-posts-list-table.php new file mode 100644 index 0000000..bdd24a6 --- /dev/null +++ b/src/wp-admin/includes/class-wp-posts-list-table.php @@ -0,0 +1,1021 @@ + true ) ) ) ) + $post_type = $_REQUEST['post_type']; + else + wp_die( __( 'Invalid post type' ) ); + $_REQUEST['post_type'] = $post_type; + + $post_type_object = get_post_type_object( $post_type ); + + if ( !current_user_can( $post_type_object->cap->edit_others_posts ) ) { + $this->user_posts_count = $wpdb->get_var( $wpdb->prepare( " + SELECT COUNT( 1 ) FROM $wpdb->posts + WHERE post_type = %s AND post_status NOT IN ( 'trash', 'auto-draft' ) + AND post_author = %d + ", $post_type, get_current_user_id() ) ); + + if ( $this->user_posts_count && empty( $_REQUEST['post_status'] ) && empty( $_REQUEST['all_posts'] ) && empty( $_REQUEST['author'] ) && empty( $_REQUEST['show_sticky'] ) ) + $_GET['author'] = get_current_user_id(); + } + + if ( 'post' == $post_type && $sticky_posts = get_option( 'sticky_posts' ) ) { + $sticky_posts = implode( ', ', array_map( 'absint', (array) $sticky_posts ) ); + $this->sticky_posts_count = $wpdb->get_var( $wpdb->prepare( "SELECT COUNT( 1 ) FROM $wpdb->posts WHERE post_type = %s AND post_status != 'trash' AND ID IN ($sticky_posts)", $post_type ) ); + } + + parent::__construct( array( + 'plural' => 'posts', + ) ); + } + + function ajax_user_can() { + global $post_type_object; + + return current_user_can( $post_type_object->cap->edit_posts ); + } + + function prepare_items() { + global $post_type_object, $post_type, $avail_post_stati, $wp_query, $per_page, $mode; + + $avail_post_stati = wp_edit_posts_query(); + + $this->hierarchical_display = ( $post_type_object->hierarchical && 'menu_order title' == $wp_query->query['orderby'] ); + + $total_items = $this->hierarchical_display ? $wp_query->post_count : $wp_query->found_posts; + + $per_page = $this->get_items_per_page( 'edit_' . $post_type . '_per_page' ); + $per_page = apply_filters( 'edit_posts_per_page', $per_page, $post_type ); + + if ( $this->hierarchical_display ) + $total_pages = ceil( $total_items / $per_page ); + else + $total_pages = $wp_query->max_num_pages; + + $mode = empty( $_REQUEST['mode'] ) ? 'list' : $_REQUEST['mode']; + + $this->is_trash = isset( $_REQUEST['post_status'] ) && $_REQUEST['post_status'] == 'trash'; + + $this->set_pagination_args( array( + 'total_items' => $total_items, + 'total_pages' => $total_pages, + 'per_page' => $per_page + ) ); + } + + function has_items() { + return have_posts(); + } + + function no_items() { + global $post_type_object; + + if ( isset( $_REQUEST['post_status'] ) && 'trash' == $_REQUEST['post_status'] ) + echo $post_type_object->labels->not_found_in_trash; + else + echo $post_type_object->labels->not_found; + } + + function get_views() { + global $post_type, $post_type_object, $locked_post_status, $avail_post_stati; + + if ( !empty($locked_post_status) ) + return array(); + + $status_links = array(); + $num_posts = wp_count_posts( $post_type, 'readable' ); + $class = ''; + $allposts = ''; + + $current_user_id = get_current_user_id(); + + if ( $this->user_posts_count ) { + if ( isset( $_GET['author'] ) && ( $_GET['author'] == $current_user_id ) ) + $class = ' class="current"'; + $status_links['mine'] = "" . sprintf( _nx( 'Mine (%s)', 'Mine (%s)', $this->user_posts_count, 'posts' ), number_format_i18n( $this->user_posts_count ) ) . ''; + $allposts = '&all_posts=1'; + } + + $total_posts = array_sum( (array) $num_posts ); + + // Subtract post types that are not included in the admin all list. + foreach ( get_post_stati( array('show_in_admin_all_list' => false) ) as $state ) + $total_posts -= $num_posts->$state; + + $class = empty( $class ) && empty( $_REQUEST['post_status'] ) && empty( $_REQUEST['show_sticky'] ) ? ' class="current"' : ''; + $status_links['all'] = "" . sprintf( _nx( 'All (%s)', 'All (%s)', $total_posts, 'posts' ), number_format_i18n( $total_posts ) ) . ''; + + foreach ( get_post_stati(array('show_in_admin_status_list' => true), 'objects') as $status ) { + $class = ''; + + $status_name = $status->name; + + if ( !in_array( $status_name, $avail_post_stati ) ) + continue; + + if ( empty( $num_posts->$status_name ) ) + continue; + + if ( isset($_REQUEST['post_status']) && $status_name == $_REQUEST['post_status'] ) + $class = ' class="current"'; + + $status_links[$status_name] = "" . sprintf( translate_nooped_plural( $status->label_count, $num_posts->$status_name ), number_format_i18n( $num_posts->$status_name ) ) . ''; + } + + if ( ! empty( $this->sticky_posts_count ) ) { + $class = ! empty( $_REQUEST['show_sticky'] ) ? ' class="current"' : ''; + + $sticky_link = array( 'sticky' => "" . sprintf( _nx( 'Sticky (%s)', 'Sticky (%s)', $this->sticky_posts_count, 'posts' ), number_format_i18n( $this->sticky_posts_count ) ) . '' ); + + // Sticky comes after Publish, or if not listed, after All. + $split = 1 + array_search( ( isset( $status_links['publish'] ) ? 'publish' : 'all' ), array_keys( $status_links ) ); + $status_links = array_merge( array_slice( $status_links, 0, $split ), $sticky_link, array_slice( $status_links, $split ) ); + } + + return $status_links; + } + + function get_bulk_actions() { + $actions = array(); + + if ( $this->is_trash ) + $actions['untrash'] = __( 'Restore' ); + else + $actions['edit'] = __( 'Edit' ); + + if ( $this->is_trash || !EMPTY_TRASH_DAYS ) + $actions['delete'] = __( 'Delete Permanently' ); + else + $actions['trash'] = __( 'Move to Trash' ); + + return $actions; + } + + function extra_tablenav( $which ) { + global $post_type, $post_type_object, $cat; +?> +
+months_dropdown( $post_type ); + + if ( is_object_in_taxonomy( $post_type, 'category' ) ) { + $dropdown_options = array( + 'show_option_all' => __( 'View all categories' ), + 'hide_empty' => 0, + 'hierarchical' => 1, + 'show_count' => 0, + 'orderby' => 'name', + 'selected' => $cat + ); + wp_dropdown_categories( $dropdown_options ); + } + do_action( 'restrict_manage_posts' ); + submit_button( __( 'Filter' ), 'secondary', false, false, array( 'id' => 'post-query-submit' ) ); + } + + if ( $this->is_trash && current_user_can( $post_type_object->cap->edit_others_posts ) ) { + submit_button( __( 'Empty Trash' ), 'button-secondary apply', 'delete_all', false ); + } +?> +
+hierarchical ) + $this->view_switcher( $mode ); + } + + function get_table_classes() { + global $post_type_object; + + return array( 'widefat', 'fixed', $post_type_object->hierarchical ? 'pages' : 'posts' ); + } + + function get_columns() { + $screen = get_current_screen(); + + if ( empty( $screen ) ) + $post_type = 'post'; + else + $post_type = $screen->post_type; + + $posts_columns = array(); + + $posts_columns['cb'] = ''; + + /* translators: manage posts column name */ + $posts_columns['title'] = _x( 'Title', 'column name' ); + + if ( post_type_supports( $post_type, 'author' ) ) + $posts_columns['author'] = __( 'Author' ); + + if ( empty( $post_type ) || is_object_in_taxonomy( $post_type, 'category' ) ) + $posts_columns['categories'] = __( 'Categories' ); + + if ( empty( $post_type ) || is_object_in_taxonomy( $post_type, 'post_tag' ) ) + $posts_columns['tags'] = __( 'Tags' ); + + $post_status = !empty( $_REQUEST['post_status'] ) ? $_REQUEST['post_status'] : 'all'; + if ( post_type_supports( $post_type, 'comments' ) && !in_array( $post_status, array( 'pending', 'draft', 'future' ) ) ) + $posts_columns['comments'] = '' . esc_attr__( 'Comments' ) . ''; + + $posts_columns['date'] = __( 'Date' ); + + if ( 'page' == $post_type ) + $posts_columns = apply_filters( 'manage_pages_columns', $posts_columns ); + else + $posts_columns = apply_filters( 'manage_posts_columns', $posts_columns, $post_type ); + $posts_columns = apply_filters( "manage_{$post_type}_posts_columns", $posts_columns ); + + return $posts_columns; + } + + function get_sortable_columns() { + return array( + 'title' => 'title', + 'author' => 'author', + 'parent' => 'parent', + 'comments' => 'comment_count', + 'date' => array( 'date', true ) + ); + } + + function display_rows( $posts = array() ) { + global $wp_query, $post_type_object, $per_page; + + if ( empty( $posts ) ) + $posts = $wp_query->posts; + + add_filter( 'the_title', 'esc_html' ); + + if ( $this->hierarchical_display ) { + $this->_display_rows_hierarchical( $posts, $this->get_pagenum(), $per_page ); + } else { + $this->_display_rows( $posts ); + } + } + + function _display_rows( $posts ) { + global $post, $mode; + + // Create array of post IDs. + $post_ids = array(); + + foreach ( $posts as $a_post ) + $post_ids[] = $a_post->ID; + + $this->comment_pending_count = get_pending_comments_num( $post_ids ); + + foreach ( $posts as $post ) + $this->single_row( $post ); + } + + function _display_rows_hierarchical( $pages, $pagenum = 1, $per_page = 20 ) { + global $wpdb; + + $level = 0; + + if ( ! $pages ) { + $pages = get_pages( array( 'sort_column' => 'menu_order' ) ); + + if ( ! $pages ) + return false; + } + + /* + * arrange pages into two parts: top level pages and children_pages + * children_pages is two dimensional array, eg. + * children_pages[10][] contains all sub-pages whose parent is 10. + * It only takes O( N ) to arrange this and it takes O( 1 ) for subsequent lookup operations + * If searching, ignore hierarchy and treat everything as top level + */ + if ( empty( $_REQUEST['s'] ) ) { + + $top_level_pages = array(); + $children_pages = array(); + + foreach ( $pages as $page ) { + + // catch and repair bad pages + if ( $page->post_parent == $page->ID ) { + $page->post_parent = 0; + $wpdb->update( $wpdb->posts, array( 'post_parent' => 0 ), array( 'ID' => $page->ID ) ); + clean_page_cache( $page->ID ); + } + + if ( 0 == $page->post_parent ) + $top_level_pages[] = $page; + else + $children_pages[ $page->post_parent ][] = $page; + } + + $pages = &$top_level_pages; + } + + $count = 0; + $start = ( $pagenum - 1 ) * $per_page; + $end = $start + $per_page; + + foreach ( $pages as $page ) { + if ( $count >= $end ) + break; + + if ( $count >= $start ) + echo "\t" . $this->single_row( $page, $level ); + + $count++; + + if ( isset( $children_pages ) ) + $this->_page_rows( $children_pages, $count, $page->ID, $level + 1, $pagenum, $per_page ); + } + + // if it is the last pagenum and there are orphaned pages, display them with paging as well + if ( isset( $children_pages ) && $count < $end ){ + foreach ( $children_pages as $orphans ){ + foreach ( $orphans as $op ) { + if ( $count >= $end ) + break; + if ( $count >= $start ) + echo "\t" . $this->single_row( $op, 0 ); + $count++; + } + } + } + } + + /** + * Given a top level page ID, display the nested hierarchy of sub-pages + * together with paging support + * + * @since 3.1.0 (Standalone function exists since 2.6.0) + * + * @param unknown_type $children_pages + * @param unknown_type $count + * @param unknown_type $parent + * @param unknown_type $level + * @param unknown_type $pagenum + * @param unknown_type $per_page + */ + function _page_rows( &$children_pages, &$count, $parent, $level, $pagenum, $per_page ) { + + if ( ! isset( $children_pages[$parent] ) ) + return; + + $start = ( $pagenum - 1 ) * $per_page; + $end = $start + $per_page; + + foreach ( $children_pages[$parent] as $page ) { + + if ( $count >= $end ) + break; + + // If the page starts in a subtree, print the parents. + if ( $count == $start && $page->post_parent > 0 ) { + $my_parents = array(); + $my_parent = $page->post_parent; + while ( $my_parent ) { + $my_parent = get_post( $my_parent ); + $my_parents[] = $my_parent; + if ( !$my_parent->post_parent ) + break; + $my_parent = $my_parent->post_parent; + } + $num_parents = count( $my_parents ); + while ( $my_parent = array_pop( $my_parents ) ) { + echo "\t" . $this->single_row( $my_parent, $level - $num_parents ); + $num_parents--; + } + } + + if ( $count >= $start ) + echo "\t" . $this->single_row( $page, $level ); + + $count++; + + $this->_page_rows( $children_pages, $count, $page->ID, $level + 1, $pagenum, $per_page ); + } + + unset( $children_pages[$parent] ); //required in order to keep track of orphans + } + + function single_row( $a_post, $level = 0 ) { + global $post, $current_screen, $mode; + static $rowclass; + + $global_post = $post; + $post = $a_post; + setup_postdata( $post ); + + $rowclass = 'alternate' == $rowclass ? '' : 'alternate'; + $post_owner = ( get_current_user_id() == $post->post_author ? 'self' : 'other' ); + $edit_link = get_edit_post_link( $post->ID ); + $title = _draft_or_post_title(); + $post_type_object = get_post_type_object( $post->post_type ); + $can_edit_post = current_user_can( $post_type_object->cap->edit_post, $post->ID ); + $post_format = get_post_format( $post->ID ); + $post_format_class = ( $post_format && !is_wp_error($post_format) ) ? 'format-' . sanitize_html_class( $post_format ) : 'format-default'; + ?> + post_status . ' ' . $post_format_class); ?> iedit' valign="top"> + get_column_info(); + + foreach ( $columns as $column_name => $column_display_name ) { + $class = "class=\"$column_name column-$column_name\""; + + $style = ''; + if ( in_array( $column_name, $hidden ) ) + $style = ' style="display:none;"'; + + $attributes = "$class$style"; + + switch ( $column_name ) { + + case 'cb': + ?> + + hierarchical_display ) { + $attributes = 'class="post-title page-title column-title"' . $style; + + if ( 0 == $level && (int) $post->post_parent > 0 ) { + //sent level 0 by accident, by default, or because we don't know the actual level + $find_main_page = (int) $post->post_parent; + while ( $find_main_page > 0 ) { + $parent = get_page( $find_main_page ); + + if ( is_null( $parent ) ) + break; + + $level++; + $find_main_page = (int) $parent->post_parent; + + if ( !isset( $parent_name ) ) + $parent_name = apply_filters( 'the_title', $parent->post_title, $parent->ID ); + } + } + + $pad = str_repeat( '— ', $level ); +?> + '; + break; + + case 'date': + if ( '0000-00-00 00:00:00' == $post->post_date && 'date' == $column_name ) { + $t_time = $h_time = __( 'Unpublished' ); + $time_diff = 0; + } else { + $t_time = get_the_time( __( 'Y/m/d g:i:s A' ) ); + $m_time = $post->post_date; + $time = get_post_time( 'G', true, $post ); + + $time_diff = time() - $time; + + if ( $time_diff > 0 && $time_diff < 24*60*60 ) + $h_time = sprintf( __( '%s ago' ), human_time_diff( $time ) ); + else + $h_time = mysql2date( __( 'Y/m/d' ), $m_time ); + } + + echo ''; + break; + + case 'categories': + ?> + + + + + + + + + + + + post_type ); + $post_type_object = get_post_type_object( $screen->post_type ); + + $taxonomy_names = get_object_taxonomies( $screen->post_type ); + $hierarchical_taxonomies = array(); + $flat_taxonomies = array(); + foreach ( $taxonomy_names as $taxonomy_name ) { + $taxonomy = get_taxonomy( $taxonomy_name ); + + if ( !$taxonomy->show_ui ) + continue; + + if ( $taxonomy->hierarchical ) + $hierarchical_taxonomies[] = $taxonomy; + else + $flat_taxonomies[] = $taxonomy; + } + + $m = ( isset( $mode ) && 'excerpt' == $mode ) ? 'excerpt' : 'list'; + $can_publish = current_user_can( $post_type_object->cap->publish_posts ); + $core_columns = array( 'cb' => true, 'date' => true, 'title' => true, 'categories' => true, 'tags' => true, 'comments' => true, 'author' => true ); + + ?> + +
'; + $this->no_items(); + echo '
'; + echo $this->column_cb( $item ); + echo '"; + echo call_user_func( array( &$this, 'column_' . $column_name ), $item ); + echo ""; + echo $this->column_default( $item, $column_name ); + echo "
ID ) ) { ?>>ID, array( 80, 60 ), true ) ) { + if ( $this->is_trash ) { + echo $thumb; + } else { +?> + + + + + + >is_trash ) echo $att_title; else { ?> +

+ID ), $matches ) ) + echo esc_html( strtoupper( $matches[1] ) ); + else + echo strtoupper( str_replace( 'image/', '', get_post_mime_type() ) ); +?> +

+row_actions( $this->_get_row_actions( $post, $att_title ) ); +?> +
>>slug'> " . esc_html( sanitize_term_field( 'name', $c->name, $c->term_id, 'post_tag', 'display' ) ) . ""; + echo join( ', ', $out ); + } else { + _e( 'No Tags' ); + } +?> + >post_excerpt : ''; ?>>> + , + + >
+
> +
+ID ); + + $this->comments_bubble( $post->ID, $pending_comments ); +?> +
+
> + +
+ + + +
$checkbox$theme_name"; + echo $this->row_actions( $actions, true ); + echo " +
$description
+
"; + + $theme_meta = array(); + + if ( !empty( $theme['Version'] ) ) + $theme_meta[] = sprintf( __( 'Version %s' ), $theme['Version'] ); + + if ( !empty( $theme['Author'] ) ) + $theme_meta[] = sprintf( __( 'By %s' ), $theme['Author'] ); + + if ( !empty( $theme['Theme URI'] ) ) + $theme_meta[] = '' . __( 'Visit Theme Site' ) . ''; + + $theme_meta = apply_filters( 'theme_row_meta', $theme_meta, $theme_key, $theme, $status ); + echo implode( ' | ', $theme_meta ); + + echo "
"; + do_action( 'manage_themes_custom_column', $column_name, $theme_key, $theme ); + echo "
+ + "; ?> + user_login ); ?>user_login, $super_admins ) ) + echo ' - ' . __( 'Super Admin' ); + ?> +
+ ' . __( 'Edit' ) . ''; + + if ( current_user_can( 'delete_user', $user->ID) && ! in_array( $user->user_login, $super_admins ) ) { + $actions['delete'] = '' . __( 'Delete' ) . ''; + } + + $actions = apply_filters( 'ms_user_row_actions', $actions, $user ); + echo $this->row_actions( $actions ); + ?> +
$user->user_email" . mysql2date( $date, $user->user_registered ) . ""; + if ( is_array( $blogs ) ) { + foreach ( (array) $blogs as $key => $val ) { + if ( !can_edit_network( $val->site_id ) ) + continue; + + $path = ( $val->path == '/' ) ? '' : $val->path; + echo ''; + echo '' . str_replace( '.' . $current_site->domain, '', $val->domain . $path ) . ''; + echo ' '; + $actions = array(); + $actions['edit'] = '' . __( 'Edit' ) . ''; + + $class = ''; + if ( get_blog_status( $val->userblog_id, 'spam' ) == 1 ) + $class .= 'site-spammed '; + if ( get_blog_status( $val->userblog_id, 'mature' ) == 1 ) + $class .= 'site-mature '; + if ( get_blog_status( $val->userblog_id, 'deleted' ) == 1 ) + $class .= 'site-deleted '; + if ( get_blog_status( $val->userblog_id, 'archived' ) == 1 ) + $class .= 'site-archived '; + + $actions['view'] = '' . __( 'View' ) . ''; + + $actions = apply_filters('ms_user_list_site_actions', $actions, $val->userblog_id); + + $i=0; + $action_count = count( $actions ); + foreach ( $actions as $action => $link ) { + ++$i; + ( $i == $action_count ) ? $sep = '' : $sep = ' | '; + echo "$link$sep"; + } + echo '
'; + } + } + ?> +
> + + >> +
+
+ +
<?php _e( '5 stars' ) ?>
+
<?php _e( '4 stars' ) ?>
+
<?php _e( '3 stars' ) ?>
+
<?php _e( '2 stars' ) ?>
+
<?php _e( '1 star' ) ?>
+
+
>
$checkbox$plugin_name"; + echo $this->row_actions( $actions, true ); + echo " +
$description
+
"; + + $plugin_meta = array(); + if ( !empty( $plugin_data['Version'] ) ) + $plugin_meta[] = sprintf( __( 'Version %s' ), $plugin_data['Version'] ); + if ( !empty( $plugin_data['Author'] ) ) { + $author = $plugin_data['Author']; + if ( !empty( $plugin_data['AuthorURI'] ) ) + $author = '' . $plugin_data['Author'] . ''; + $plugin_meta[] = sprintf( __( 'By %s' ), $author ); + } + if ( ! empty( $plugin_data['PluginURI'] ) ) + $plugin_meta[] = '' . __( 'Visit plugin site' ) . ''; + + $plugin_meta = apply_filters( 'plugin_row_meta', $plugin_meta, $plugin_file, $plugin_data, $status ); + echo implode( ' | ', $plugin_meta ); + + echo "
"; + do_action( 'manage_plugins_custom_column', $column_name, $plugin_file, $plugin_data ); + echo "
>post_status != 'trash' ) { ?>labels->parent_item_colon . ' ' . esc_html( $parent_name ) : ''; ?> + + >post_status != 'trash' ) { ?> +post_status ) { + $actions['edit'] = '' . __( 'Edit' ) . ''; + $actions['inline hide-if-no-js'] = '' . __( 'Quick Edit' ) . ''; + } + if ( current_user_can( $post_type_object->cap->delete_post, $post->ID ) ) { + if ( 'trash' == $post->post_status ) + $actions['untrash'] = "ID ) ), 'untrash-' . $post->post_type . '_' . $post->ID ) . "'>" . __( 'Restore' ) . ""; + elseif ( EMPTY_TRASH_DAYS ) + $actions['trash'] = "" . __( 'Trash' ) . ""; + if ( 'trash' == $post->post_status || !EMPTY_TRASH_DAYS ) + $actions['delete'] = "" . __( 'Delete Permanently' ) . ""; + } + if ( $post_type_object->public ) { + if ( in_array( $post->post_status, array( 'pending', 'draft' ) ) ) { + if ( $can_edit_post ) + $actions['view'] = '' . __( 'Preview' ) . ''; + } elseif ( 'trash' != $post->post_status ) { + $actions['view'] = '' . __( 'View' ) . ''; + } + } + + $actions = apply_filters( is_post_type_hierarchical( $post->post_type ) ? 'page_row_actions' : 'post_row_actions', $actions, $post ); + echo $this->row_actions( $actions ); + + get_inline_data( $post ); + echo ''; + if ( 'excerpt' == $mode ) + echo apply_filters( 'post_date_column_time', $t_time, $post, $column_name, $mode ); + else + echo '' . apply_filters( 'post_date_column_time', $h_time, $post, $column_name, $mode ) . ''; + echo '
'; + if ( 'publish' == $post->post_status ) { + _e( 'Published' ); + } elseif ( 'future' == $post->post_status ) { + if ( $time_diff > 0 ) + echo '' . __( 'Missed schedule' ) . ''; + else + _e( 'Scheduled' ); + } else { + _e( 'Last Modified' ); + } + echo '
>%s', + esc_url( add_query_arg( array( 'post_type' => $post->post_type, 'category_name' => $c->slug ), 'edit.php' ) ), + esc_html( sanitize_term_field( 'name', $c->name, $c->term_id, 'category', 'display' ) ) + ); + } + echo join( ', ', $out ); + } else { + _e( 'Uncategorized' ); + } + ?>>ID ); + if ( !empty( $tags ) ) { + $out = array(); + foreach ( $tags as $c ) { + $out[] = sprintf( '%s', + esc_url( add_query_arg( array( 'post_type' => $post->post_type, 'tag' => $c->slug ), 'edit.php' ) ), + esc_html( sanitize_term_field( 'name', $c->name, $c->term_id, 'tag', 'display' ) ) + ); + } + echo join( ', ', $out ); + } else { + _e( 'No Tags' ); + } + ?>>
+ comment_pending_count[$post->ID] ) ? $this->comment_pending_count[$post->ID] : 0; + + $this->comments_bubble( $post->ID, $pending_comments ); + ?> +
>%s', + esc_url( add_query_arg( array( 'post_type' => $post->post_type, 'author' => get_the_author_meta( 'ID' ) ), 'edit.php' )), + get_the_author() + ); + ?>>post_type ) ) + do_action( 'manage_pages_custom_column', $column_name, $post->ID ); + else + do_action( 'manage_posts_custom_column', $column_name, $post->ID ); + do_action( "manage_{$post->post_type}_posts_custom_column", $column_name, $post->ID ); + ?>
+ + + post_type "; + echo $bulk ? "bulk-edit-row bulk-edit-row-$hclass bulk-edit-$screen->post_type" : "quick-edit-row quick-edit-row-$hclass inline-edit-$screen->post_type"; + ?>" style="display: none"> + +
+ +
+

+ post_type, 'title' ) ) : + if ( $bulk ) : ?> +
+
+
+ + + + + + + + + + + +
+ +
+
+ post_type, 'author' ) ) : + $authors_dropdown = ''; + + if ( is_super_admin() || current_user_can( $post_type_object->cap->edit_others_posts ) ) : + $users_opt = array( + 'hide_if_only_one_author' => false, + 'who' => 'authors', + 'name' => 'post_author', + 'class'=> 'authors', + 'multi' => 1, + 'echo' => 0 + ); + if ( $bulk ) + $users_opt['show_option_none'] = __( '— No Change —' ); + + if ( $authors = wp_dropdown_users( $users_opt ) ) : + $authors_dropdown = ''; + endif; + endif; // authors + ?> + + + +
+ + + + + + +
+ + + +
+ + + +
+ + + + labels->name ) ?> + + + + +
    + $taxonomy->name ) ) ?> +
+ + + +
+ + + +
+ + post_type, 'author' ) && $bulk ) + echo $authors_dropdown; + ?> + + hierarchical ) : ?> + + + + post_type, 'page-attributes' ) ) : + if ( !$bulk ) : ?> + + + + + + + + hierarchical ?> + + + + + + + + + + + + post_type, 'comments' ) || post_type_supports( $screen->post_type, 'trackbacks' ) ) : + if ( $bulk ) : ?> + +
+ post_type, 'comments' ) ) : ?> + + post_type, 'trackbacks' ) ) : ?> + + +
+ + + +
+ post_type, 'comments' ) ) : ?> + + post_type, 'trackbacks' ) ) : ?> + + +
+ + + +
+ + + post_type && $can_publish && current_user_can( $post_type_object->cap->edit_others_posts ) ) : ?> + + + + + + + + + + + + + +
+ +
+ + get_column_info(); + + foreach ( $columns as $column_name => $column_display_name ) { + if ( isset( $core_columns[$column_name] ) ) + continue; + do_action( $bulk ? 'bulk_edit_custom_box' : 'quick_edit_custom_box', $column_name, $screen->post_type ); + } + ?> +

+ + + + + 's' ) ); + } ?> + + + +
+

+
+ diff --git a/src/wp-admin/includes/class-wp-terms-list-table.php b/src/wp-admin/includes/class-wp-terms-list-table.php new file mode 100644 index 0000000..7778d88 --- /dev/null +++ b/src/wp-admin/includes/class-wp-terms-list-table.php @@ -0,0 +1,380 @@ + true ) ) ) ) + $post_type = 'post'; + + parent::__construct( array( + 'plural' => 'tags', + 'singular' => 'tag', + ) ); + } + + function ajax_user_can() { + global $tax; + + return current_user_can( $tax->cap->manage_terms ); + } + + function prepare_items() { + global $taxonomy; + + $tags_per_page = $this->get_items_per_page( 'edit_' . $taxonomy . '_per_page' ); + + if ( 'post_tag' == $taxonomy ) { + $tags_per_page = apply_filters( 'edit_tags_per_page', $tags_per_page ); + $tags_per_page = apply_filters( 'tagsperpage', $tags_per_page ); // Old filter + } elseif ( 'category' == $taxonomy ) { + $tags_per_page = apply_filters( 'edit_categories_per_page', $tags_per_page ); // Old filter + } + + $search = !empty( $_REQUEST['s'] ) ? trim( stripslashes( $_REQUEST['s'] ) ) : ''; + + $args = array( + 'search' => $search, + 'page' => $this->get_pagenum(), + 'number' => $tags_per_page, + ); + + if ( !empty( $_REQUEST['orderby'] ) ) + $args['orderby'] = trim( stripslashes( $_REQUEST['orderby'] ) ); + + if ( !empty( $_REQUEST['order'] ) ) + $args['order'] = trim( stripslashes( $_REQUEST['order'] ) ); + + $this->callback_args = $args; + + $this->set_pagination_args( array( + 'total_items' => wp_count_terms( $taxonomy, compact( 'search' ) ), + 'per_page' => $tags_per_page, + ) ); + } + + function has_items() { + // todo: populate $this->items in prepare_items() + return true; + } + + function get_bulk_actions() { + $actions = array(); + $actions['delete'] = __( 'Delete' ); + + return $actions; + } + + function current_action() { + if ( isset( $_REQUEST['action'] ) && isset( $_REQUEST['delete_tags'] ) && ( 'delete' == $_REQUEST['action'] || 'delete' == $_REQUEST['action2'] ) ) + return 'bulk-delete'; + + return parent::current_action(); + } + + function get_columns() { + global $taxonomy, $typenow; + + $columns = array( + 'cb' => '', + 'name' => _x( 'Name', 'term name' ), + 'description' => __( 'Description' ), + 'slug' => __( 'Slug' ), + ); + + if ( 'link_category' == $taxonomy ) { + $columns['links'] = __( 'Links' ); + } else { + $post_type = empty( $typenow ) ? 'post' : $typenow; + $post_type_object = get_post_type_object( $post_type ); + $columns['posts'] = $post_type_object ? $post_type_object->labels->name : __( 'Posts' ); + } + + return $columns; + } + + function get_sortable_columns() { + return array( + 'name' => 'name', + 'description' => 'description', + 'slug' => 'slug', + 'posts' => 'count', + 'links' => 'count' + ); + } + + function display_rows_or_placeholder() { + global $taxonomy; + + $args = wp_parse_args( $this->callback_args, array( + 'page' => 1, + 'number' => 20, + 'search' => '', + 'hide_empty' => 0 + ) ); + + extract( $args, EXTR_SKIP ); + + $args['offset'] = $offset = ( $page - 1 ) * $number; + + // convert it to table rows + $out = ''; + $count = 0; + + $terms = array(); + + if ( is_taxonomy_hierarchical( $taxonomy ) && !isset( $orderby ) ) { + // We'll need the full set of terms then. + $args['number'] = $args['offset'] = 0; + + $terms = get_terms( $taxonomy, $args ); + if ( !empty( $search ) ) // Ignore children on searches. + $children = array(); + else + $children = _get_term_hierarchy( $taxonomy ); + + // Some funky recursion to get the job done( Paging & parents mainly ) is contained within, Skip it for non-hierarchical taxonomies for performance sake + $out .= $this->_rows( $taxonomy, $terms, $children, $offset, $number, $count ); + } else { + $terms = get_terms( $taxonomy, $args ); + foreach ( $terms as $term ) + $out .= $this->single_row( $term, 0, $taxonomy ); + $count = $number; // Only displaying a single page. + } + + if ( empty( $terms ) ) { + list( $columns, $hidden ) = $this->get_column_info(); + echo ''; + $this->no_items(); + echo ''; + } else { + echo $out; + } + } + + function _rows( $taxonomy, $terms, &$children, $start = 0, $per_page = 20, &$count, $parent = 0, $level = 0 ) { + + $end = $start + $per_page; + + $output = ''; + foreach ( $terms as $key => $term ) { + + if ( $count >= $end ) + break; + + if ( $term->parent != $parent && empty( $_REQUEST['s'] ) ) + continue; + + // If the page starts in a subtree, print the parents. + if ( $count == $start && $term->parent > 0 && empty( $_REQUEST['s'] ) ) { + $my_parents = $parent_ids = array(); + $p = $term->parent; + while ( $p ) { + $my_parent = get_term( $p, $taxonomy ); + $my_parents[] = $my_parent; + $p = $my_parent->parent; + if ( in_array( $p, $parent_ids ) ) // Prevent parent loops. + break; + $parent_ids[] = $p; + } + unset( $parent_ids ); + + $num_parents = count( $my_parents ); + while ( $my_parent = array_pop( $my_parents ) ) { + $output .= "\t" . $this->single_row( $my_parent, $level - $num_parents, $taxonomy ); + $num_parents--; + } + } + + if ( $count >= $start ) + $output .= "\t" . $this->single_row( $term, $level, $taxonomy ); + + ++$count; + + unset( $terms[$key] ); + + if ( isset( $children[$term->term_id] ) && empty( $_REQUEST['s'] ) ) + $output .= $this->_rows( $taxonomy, $terms, $children, $start, $per_page, $count, $term->term_id, $level + 1 ); + } + + return $output; + } + + function single_row( $tag, $level = 0 ) { + static $row_class = ''; + $row_class = ( $row_class == '' ? ' class="alternate"' : '' ); + + $this->level = $level; + + echo ''; + echo $this->single_row_columns( $tag ); + echo ''; + } + + function column_cb( $tag ) { + global $taxonomy, $tax; + + $default_term = get_option( 'default_' . $taxonomy ); + + if ( current_user_can( $tax->cap->delete_terms ) && $tag->term_id != $default_term ) + return ''; + else + return ' '; + } + + function column_name( $tag ) { + global $taxonomy, $tax, $post_type; + + $default_term = get_option( 'default_' . $taxonomy ); + + $pad = str_repeat( '— ', max( 0, $this->level ) ); + $name = apply_filters( 'term_name', $pad . ' ' . $tag->name, $tag ); + $qe_data = get_term( $tag->term_id, $taxonomy, OBJECT, 'edit' ); + $edit_link = esc_url( get_edit_term_link( $tag->term_id, $taxonomy, $post_type ) ); + + $out = '' . $name . '
'; + + $actions = array(); + if ( current_user_can( $tax->cap->edit_terms ) ) { + $actions['edit'] = '' . __( 'Edit' ) . ''; + $actions['inline hide-if-no-js'] = '' . __( 'Quick Edit' ) . ''; + } + if ( current_user_can( $tax->cap->delete_terms ) && $tag->term_id != $default_term ) + $actions['delete'] = "term_id ) . "'>" . __( 'Delete' ) . ""; + $actions['view'] = '' . __( 'View' ) . ''; + + $actions = apply_filters( 'tag_row_actions', $actions, $tag ); + $actions = apply_filters( "{$taxonomy}_row_actions", $actions, $tag ); + + $out .= $this->row_actions( $actions ); + $out .= ''; + + return $out; + } + + function column_description( $tag ) { + return $tag->description; + } + + function column_slug( $tag ) { + return apply_filters( 'editable_slug', $tag->slug ); + } + + function column_posts( $tag ) { + global $taxonomy, $post_type; + + $count = number_format_i18n( $tag->count ); + + $tax = get_taxonomy( $taxonomy ); + + if ( ! $tax->public ) + return $count; + + if ( $tax->query_var ) { + $args = array( $tax->query_var => $tag->slug ); + } else { + $args = array( 'taxonomy' => $tax->name, 'term' => $tag->slug ); + } + + $args['post_type'] = $post_type; + + return "$count"; + } + + function column_links( $tag ) { + $count = number_format_i18n( $tag->count ); + if ( $count ) + $count = "$count"; + return $count; + } + + function column_default( $tag, $column_name ) { + $screen = get_current_screen(); + + return apply_filters( "manage_{$screen->taxonomy}_custom_column", '', $column_name, $tag->term_id ); + } + + /** + * Outputs the hidden row displayed when inline editing + * + * @since 3.1.0 + */ + function inline_edit() { + global $tax; + + if ( ! current_user_can( $tax->cap->edit_terms ) ) + return; +?> + +
+ +
+ diff --git a/src/wp-admin/includes/class-wp-theme-install-list-table.php b/src/wp-admin/includes/class-wp-theme-install-list-table.php new file mode 100644 index 0000000..7e44267 --- /dev/null +++ b/src/wp-admin/includes/class-wp-theme-install-list-table.php @@ -0,0 +1,185 @@ +get_pagenum(); + + $per_page = 30; + + // These are the tabs which are shown on the page, + $tabs = array(); + $tabs['dashboard'] = __( 'Search' ); + if ( 'search' == $tab ) + $tabs['search'] = __( 'Search Results' ); + $tabs['upload'] = __( 'Upload' ); + $tabs['featured'] = _x( 'Featured','Theme Installer' ); + //$tabs['popular'] = _x( 'Popular','Theme Installer' ); + $tabs['new'] = _x( 'Newest','Theme Installer' ); + $tabs['updated'] = _x( 'Recently Updated','Theme Installer' ); + + $nonmenu_tabs = array( 'theme-information' ); // Valid actions to perform which do not have a Menu item. + + $tabs = apply_filters( 'install_themes_tabs', $tabs ); + $nonmenu_tabs = apply_filters( 'install_themes_nonmenu_tabs', $nonmenu_tabs ); + + // If a non-valid menu tab has been selected, And its not a non-menu action. + if ( empty( $tab ) || ( ! isset( $tabs[ $tab ] ) && ! in_array( $tab, (array) $nonmenu_tabs ) ) ) + $tab = key( $tabs ); + + $args = array( 'page' => $paged, 'per_page' => $per_page, 'fields' => $theme_field_defaults ); + + switch ( $tab ) { + case 'search': + $type = isset( $_REQUEST['type'] ) ? stripslashes( $_REQUEST['type'] ) : ''; + $term = isset( $_REQUEST['s'] ) ? stripslashes( $_REQUEST['s'] ) : ''; + + switch ( $type ) { + case 'tag': + $terms = explode( ',', $term ); + $terms = array_map( 'trim', $terms ); + $terms = array_map( 'sanitize_title_with_dashes', $terms ); + $args['tag'] = $terms; + break; + case 'term': + $args['search'] = $term; + break; + case 'author': + $args['author'] = $term; + break; + } + + if ( !empty( $_POST['features'] ) ) { + $terms = $_POST['features']; + $terms = array_map( 'trim', $terms ); + $terms = array_map( 'sanitize_title_with_dashes', $terms ); + $args['tag'] = $terms; + $_REQUEST['s'] = implode( ',', $terms ); + $_REQUEST['type'] = 'tag'; + } + + add_action( 'install_themes_table_header', 'install_theme_search_form' ); + break; + + case 'featured': + //case 'popular': + case 'new': + case 'updated': + $args['browse'] = $tab; + break; + + default: + $args = false; + } + + if ( !$args ) + return; + + $api = themes_api( 'query_themes', $args ); + + if ( is_wp_error( $api ) ) + wp_die( $api->get_error_message() . '

' . __( 'Try again' ) . '' ); + + $this->items = $api->themes; + + $this->set_pagination_args( array( + 'total_items' => $api->info['results'], + 'per_page' => $per_page, + ) ); + } + + function no_items() { + _e( 'No themes match your request.' ); + } + + function get_views() { + global $tabs, $tab; + + $display_tabs = array(); + foreach ( (array) $tabs as $action => $text ) { + $class = ( $action == $tab ) ? ' class="current"' : ''; + $href = self_admin_url('theme-install.php?tab=' . $action); + $display_tabs['theme-install-'.$action] = "$text"; + } + + return $display_tabs; + } + + function get_columns() { + return array(); + } + + function display() { + + // wp_nonce_field( "fetch-list-" . get_class( $this ), '_ajax_fetch_list_nonce' ); +?> +

+
+ +
+ pagination( 'top' ); ?> + +
+
+ + + + display_rows_or_placeholder(); ?> + +
+ +
+ pagination( 'bottom' ); ?> + +
+
+items; + + $rows = ceil( count( $themes ) / 3 ); + $table = array(); + $theme_keys = array_keys( $themes ); + for ( $row = 1; $row <= $rows; $row++ ) + for ( $col = 1; $col <= 3; $col++ ) + $table[$row][$col] = array_shift( $theme_keys ); + + foreach ( $table as $row => $cols ) { + echo "\t\n"; + foreach ( $cols as $col => $theme_index ) { + $class = array( 'available-theme' ); + if ( $row == 1 ) $class[] = 'top'; + if ( $col == 1 ) $class[] = 'left'; + if ( $row == $rows ) $class[] = 'bottom'; + if ( $col == 3 ) $class[] = 'right'; + ?> + + \n"; + } // end foreach $table + } +} + +?> diff --git a/src/wp-admin/includes/class-wp-themes-list-table.php b/src/wp-admin/includes/class-wp-themes-list-table.php new file mode 100644 index 0000000..5cb7648 --- /dev/null +++ b/src/wp-admin/includes/class-wp-themes-list-table.php @@ -0,0 +1,240 @@ +search = array_merge( $this->search, array_filter( array_map( 'trim', explode( ',', $search ) ) ) ); + $this->search = array_unique( $this->search ); + } + + if ( !empty( $_REQUEST['features'] ) ) { + $this->features = $_REQUEST['features']; + $this->features = array_map( 'trim', $this->features ); + $this->features = array_map( 'sanitize_title_with_dashes', $this->features ); + $this->features = array_unique( $this->features ); + } + + if ( $this->search || $this->features ) { + foreach ( $themes as $key => $theme ) { + if ( !$this->search_theme( $theme ) ) + unset( $themes[ $key ] ); + } + } + + unset( $themes[$ct->name] ); + uksort( $themes, "strnatcasecmp" ); + + $per_page = 15; + $page = $this->get_pagenum(); + + $start = ( $page - 1 ) * $per_page; + + $this->items = array_slice( $themes, $start, $per_page ); + + $this->set_pagination_args( array( + 'total_items' => count( $themes ), + 'per_page' => $per_page, + ) ); + } + + function no_items() { + if ( $this->search || $this->features ) { + _e( 'No items found.' ); + return; + } + + if ( is_multisite() ) { + if ( current_user_can( 'install_themes' ) && current_user_can( 'manage_network_themes' ) ) { + printf( __( 'You only have one theme enabled for this site right now. Visit the Network Admin to enable or install more themes.' ), network_admin_url( 'site-themes.php?id=' . $GLOBALS['blog_id'] ), network_admin_url( 'theme-install.php' ) ); + + return; + } elseif ( current_user_can( 'manage_network_themes' ) ) { + printf( __( 'You only have one theme enabled for this site right now. Visit the Network Admin to enable more themes.' ), network_admin_url( 'site-themes.php?id=' . $GLOBALS['blog_id'] ) ); + + return; + } + // else, fallthrough. install_themes doesn't help if you can't enable it. + } else { + if ( current_user_can( 'install_themes' ) ) { + printf( __( 'You only have one theme installed right now. Live a little! You can choose from over 1,000 free themes in the WordPress.org Theme Directory at any time: just click on the Install Themes tab above.' ), admin_url( 'theme-install.php' ) ); + + return; + } + } + // Fallthrough. + printf( __( 'Only the current theme is available to you. Contact the %s administrator for information about accessing additional themes.' ), get_site_option( 'site_name' ) ); + } + + function tablenav( $which = 'top' ) { + if ( $this->get_pagination_arg( 'total_pages' ) <= 1 ) + return; + ?> +
+ pagination( $which ); ?> + +
+
+ + tablenav( 'top' ); ?> + + + + display_rows_or_placeholder(); ?> + +
+ + tablenav( 'bottom' ); ?> +items; + $theme_names = array_keys( $themes ); + natcasesort( $theme_names ); + + $table = array(); + $rows = ceil( count( $theme_names ) / 3 ); + for ( $row = 1; $row <= $rows; $row++ ) + for ( $col = 1; $col <= 3; $col++ ) + $table[$row][$col] = array_shift( $theme_names ); + + foreach ( $table as $row => $cols ) { +?> + + $theme_name ) { + $class = array( 'available-theme' ); + if ( $row == 1 ) $class[] = 'top'; + if ( $col == 1 ) $class[] = 'left'; + if ( $row == $rows ) $class[] = 'bottom'; + if ( $col == 3 ) $class[] = 'right'; +?> + + 1, 'template' => $template, 'stylesheet' => $stylesheet, 'preview_iframe' => true, 'TB_iframe' => 'true' ), $preview_link ) ); + $preview_text = esc_attr( sprintf( __( 'Preview of “%s”' ), $title ) ); + $tags = $themes[$theme_name]['Tags']; + $thickbox_class = 'thickbox thickbox-preview'; + $activate_link = wp_nonce_url( "themes.php?action=activate&template=".urlencode( $template )."&stylesheet=".urlencode( $stylesheet ), 'switch-theme_' . $template ); + $activate_text = esc_attr( sprintf( __( 'Activate “%s”' ), $title ) ); + $actions = array(); + $actions[] = '' . __( 'Activate' ) . ''; + $actions[] = '' . __( 'Preview' ) . ''; + if ( ! is_multisite() && current_user_can( 'delete_themes' ) ) + $actions[] = '' . __( 'Delete' ) . ''; + $actions = apply_filters( 'theme_action_links', $actions, $themes[$theme_name] ); + + $actions = implode ( ' | ', $actions ); +?> + + + + + +

+

+ + +

%2$s. The stylesheet files are located in %3$s. %4$s uses templates from %5$s. Changes made to the templates will affect both themes.' ), $title, str_replace( WP_CONTENT_DIR, '', $template_dir ), str_replace( WP_CONTENT_DIR, '', $stylesheet_dir ), $title, $parent_theme ); ?>

+ +

%2$s.' ), $title, str_replace( WP_CONTENT_DIR, '', $template_dir ), str_replace( WP_CONTENT_DIR, '', $stylesheet_dir ) ); ?>

+ + +

+ + + + + + +search ) > 0 ) { + foreach ( $this->search as $word ) { + $matched = 0; + + // In a tag? + if ( in_array( $word, array_map( 'sanitize_title_with_dashes', $theme['Tags'] ) ) ) + $matched = 1; + + // In one of the fields? + foreach ( array( 'Name', 'Title', 'Description', 'Author', 'Template', 'Stylesheet' ) AS $field ) { + if ( stripos( $theme[$field], $word ) !== false ) + $matched++; + } + + if ( $matched == 0 ) + return false; + } + } + + // Now search the features + if ( count( $this->features ) > 0 ) { + foreach ( $this->features as $word ) { + // In a tag? + if ( !in_array( $word, array_map( 'sanitize_title_with_dashes', $theme['Tags'] ) ) ) + return false; + } + } + + // Only get here if each word exists in the tags or one of the fields + return true; + } +} + +?> diff --git a/src/wp-admin/includes/class-wp-upgrader.php b/src/wp-admin/includes/class-wp-upgrader.php new file mode 100644 index 0000000..1cf4c41 --- /dev/null +++ b/src/wp-admin/includes/class-wp-upgrader.php @@ -0,0 +1,1457 @@ +skin = new WP_Upgrader_Skin(); + else + $this->skin = $skin; + } + + function init() { + $this->skin->set_upgrader($this); + $this->generic_strings(); + } + + function generic_strings() { + $this->strings['bad_request'] = __('Invalid Data provided.'); + $this->strings['fs_unavailable'] = __('Could not access filesystem.'); + $this->strings['fs_error'] = __('Filesystem error.'); + $this->strings['fs_no_root_dir'] = __('Unable to locate WordPress Root directory.'); + $this->strings['fs_no_content_dir'] = __('Unable to locate WordPress Content directory (wp-content).'); + $this->strings['fs_no_plugins_dir'] = __('Unable to locate WordPress Plugin directory.'); + $this->strings['fs_no_themes_dir'] = __('Unable to locate WordPress Theme directory.'); + /* translators: %s: directory name */ + $this->strings['fs_no_folder'] = __('Unable to locate needed folder (%s).'); + + $this->strings['download_failed'] = __('Download failed.'); + $this->strings['installing_package'] = __('Installing the latest version…'); + $this->strings['folder_exists'] = __('Destination folder already exists.'); + $this->strings['mkdir_failed'] = __('Could not create directory.'); + $this->strings['bad_package'] = __('Incompatible Archive.'); + + $this->strings['maintenance_start'] = __('Enabling Maintenance mode…'); + $this->strings['maintenance_end'] = __('Disabling Maintenance mode…'); + } + + function fs_connect( $directories = array() ) { + global $wp_filesystem; + + if ( false === ($credentials = $this->skin->request_filesystem_credentials()) ) + return false; + + if ( ! WP_Filesystem($credentials) ) { + $error = true; + if ( is_object($wp_filesystem) && $wp_filesystem->errors->get_error_code() ) + $error = $wp_filesystem->errors; + $this->skin->request_filesystem_credentials($error); //Failed to connect, Error and request again + return false; + } + + if ( ! is_object($wp_filesystem) ) + return new WP_Error('fs_unavailable', $this->strings['fs_unavailable'] ); + + if ( is_wp_error($wp_filesystem->errors) && $wp_filesystem->errors->get_error_code() ) + return new WP_Error('fs_error', $this->strings['fs_error'], $wp_filesystem->errors); + + foreach ( (array)$directories as $dir ) { + switch ( $dir ) { + case ABSPATH: + if ( ! $wp_filesystem->abspath() ) + return new WP_Error('fs_no_root_dir', $this->strings['fs_no_root_dir']); + break; + case WP_CONTENT_DIR: + if ( ! $wp_filesystem->wp_content_dir() ) + return new WP_Error('fs_no_content_dir', $this->strings['fs_no_content_dir']); + break; + case WP_PLUGIN_DIR: + if ( ! $wp_filesystem->wp_plugins_dir() ) + return new WP_Error('fs_no_plugins_dir', $this->strings['fs_no_plugins_dir']); + break; + case WP_CONTENT_DIR . '/themes': + if ( ! $wp_filesystem->find_folder(WP_CONTENT_DIR . '/themes') ) + return new WP_Error('fs_no_themes_dir', $this->strings['fs_no_themes_dir']); + break; + default: + if ( ! $wp_filesystem->find_folder($dir) ) + return new WP_Error('fs_no_folder', sprintf($this->strings['fs_no_folder'], $dir)); + break; + } + } + return true; + } //end fs_connect(); + + function download_package($package) { + + if ( ! preg_match('!^(http|https|ftp)://!i', $package) && file_exists($package) ) //Local file or remote? + return $package; //must be a local file.. + + if ( empty($package) ) + return new WP_Error('no_package', $this->strings['no_package']); + + $this->skin->feedback('downloading_package', $package); + + $download_file = download_url($package); + + if ( is_wp_error($download_file) ) + return new WP_Error('download_failed', $this->strings['download_failed'], $download_file->get_error_message()); + + return $download_file; + } + + function unpack_package($package, $delete_package = true) { + global $wp_filesystem; + + $this->skin->feedback('unpack_package'); + + $upgrade_folder = $wp_filesystem->wp_content_dir() . 'upgrade/'; + + //Clean up contents of upgrade directory beforehand. + $upgrade_files = $wp_filesystem->dirlist($upgrade_folder); + if ( !empty($upgrade_files) ) { + foreach ( $upgrade_files as $file ) + $wp_filesystem->delete($upgrade_folder . $file['name'], true); + } + + //We need a working directory + $working_dir = $upgrade_folder . basename($package, '.zip'); + + // Clean up working directory + if ( $wp_filesystem->is_dir($working_dir) ) + $wp_filesystem->delete($working_dir, true); + + // Unzip package to working directory + $result = unzip_file($package, $working_dir); //TODO optimizations, Copy when Move/Rename would suffice? + + // Once extracted, delete the package if required. + if ( $delete_package ) + unlink($package); + + if ( is_wp_error($result) ) { + $wp_filesystem->delete($working_dir, true); + return $result; + } + + return $working_dir; + } + + function install_package($args = array()) { + global $wp_filesystem; + $defaults = array( 'source' => '', 'destination' => '', //Please always pass these + 'clear_destination' => false, 'clear_working' => false, + 'hook_extra' => array()); + + $args = wp_parse_args($args, $defaults); + extract($args); + + @set_time_limit( 300 ); + + if ( empty($source) || empty($destination) ) + return new WP_Error('bad_request', $this->strings['bad_request']); + + $this->skin->feedback('installing_package'); + + $res = apply_filters('upgrader_pre_install', true, $hook_extra); + if ( is_wp_error($res) ) + return $res; + + //Retain the Original source and destinations + $remote_source = $source; + $local_destination = $destination; + + $source_files = array_keys( $wp_filesystem->dirlist($remote_source) ); + $remote_destination = $wp_filesystem->find_folder($local_destination); + + //Locate which directory to copy to the new folder, This is based on the actual folder holding the files. + if ( 1 == count($source_files) && $wp_filesystem->is_dir( trailingslashit($source) . $source_files[0] . '/') ) //Only one folder? Then we want its contents. + $source = trailingslashit($source) . trailingslashit($source_files[0]); + elseif ( count($source_files) == 0 ) + return new WP_Error('bad_package', $this->strings['bad_package']); //There are no files? + //else //Its only a single file, The upgrader will use the foldername of this file as the destination folder. foldername is based on zip filename. + + //Hook ability to change the source file location.. + $source = apply_filters('upgrader_source_selection', $source, $remote_source, $this); + if ( is_wp_error($source) ) + return $source; + + //Has the source location changed? If so, we need a new source_files list. + if ( $source !== $remote_source ) + $source_files = array_keys( $wp_filesystem->dirlist($source) ); + + //Protection against deleting files in any important base directories. + if ( in_array( $destination, array(ABSPATH, WP_CONTENT_DIR, WP_PLUGIN_DIR, WP_CONTENT_DIR . '/themes') ) ) { + $remote_destination = trailingslashit($remote_destination) . trailingslashit(basename($source)); + $destination = trailingslashit($destination) . trailingslashit(basename($source)); + } + + if ( $clear_destination ) { + //We're going to clear the destination if theres something there + $this->skin->feedback('remove_old'); + $removed = true; + if ( $wp_filesystem->exists($remote_destination) ) + $removed = $wp_filesystem->delete($remote_destination, true); + $removed = apply_filters('upgrader_clear_destination', $removed, $local_destination, $remote_destination, $hook_extra); + + if ( is_wp_error($removed) ) + return $removed; + else if ( ! $removed ) + return new WP_Error('remove_old_failed', $this->strings['remove_old_failed']); + } elseif ( $wp_filesystem->exists($remote_destination) ) { + //If we're not clearing the destination folder and something exists there allready, Bail. + //But first check to see if there are actually any files in the folder. + $_files = $wp_filesystem->dirlist($remote_destination); + if ( ! empty($_files) ) { + $wp_filesystem->delete($remote_source, true); //Clear out the source files. + return new WP_Error('folder_exists', $this->strings['folder_exists'], $remote_destination ); + } + } + + //Create destination if needed + if ( !$wp_filesystem->exists($remote_destination) ) + if ( !$wp_filesystem->mkdir($remote_destination, FS_CHMOD_DIR) ) + return new WP_Error('mkdir_failed', $this->strings['mkdir_failed'], $remote_destination); + + // Copy new version of item into place. + $result = copy_dir($source, $remote_destination); + if ( is_wp_error($result) ) { + if ( $clear_working ) + $wp_filesystem->delete($remote_source, true); + return $result; + } + + //Clear the Working folder? + if ( $clear_working ) + $wp_filesystem->delete($remote_source, true); + + $destination_name = basename( str_replace($local_destination, '', $destination) ); + if ( '.' == $destination_name ) + $destination_name = ''; + + $this->result = compact('local_source', 'source', 'source_name', 'source_files', 'destination', 'destination_name', 'local_destination', 'remote_destination', 'clear_destination', 'delete_source_dir'); + + $res = apply_filters('upgrader_post_install', true, $hook_extra, $this->result); + if ( is_wp_error($res) ) { + $this->result = $res; + return $res; + } + + //Bombard the calling function will all the info which we've just used. + return $this->result; + } + + function run($options) { + + $defaults = array( 'package' => '', //Please always pass this. + 'destination' => '', //And this + 'clear_destination' => false, + 'clear_working' => true, + 'is_multi' => false, + 'hook_extra' => array() //Pass any extra $hook_extra args here, this will be passed to any hooked filters. + ); + + $options = wp_parse_args($options, $defaults); + extract($options); + + //Connect to the Filesystem first. + $res = $this->fs_connect( array(WP_CONTENT_DIR, $destination) ); + if ( ! $res ) //Mainly for non-connected filesystem. + return false; + + if ( is_wp_error($res) ) { + $this->skin->error($res); + return $res; + } + + if ( !$is_multi ) // call $this->header separately if running multiple times + $this->skin->header(); + + $this->skin->before(); + + //Download the package (Note, This just returns the filename of the file if the package is a local file) + $download = $this->download_package( $package ); + if ( is_wp_error($download) ) { + $this->skin->error($download); + $this->skin->after(); + return $download; + } + + $delete_package = ($download != $package); // Do not delete a "local" file + + //Unzip's the file into a temporary directory + $working_dir = $this->unpack_package( $download, $delete_package ); + if ( is_wp_error($working_dir) ) { + $this->skin->error($working_dir); + $this->skin->after(); + return $working_dir; + } + + //With the given options, this installs it to the destination directory. + $result = $this->install_package( array( + 'source' => $working_dir, + 'destination' => $destination, + 'clear_destination' => $clear_destination, + 'clear_working' => $clear_working, + 'hook_extra' => $hook_extra + ) ); + $this->skin->set_result($result); + if ( is_wp_error($result) ) { + $this->skin->error($result); + $this->skin->feedback('process_failed'); + } else { + //Install Suceeded + $this->skin->feedback('process_success'); + } + $this->skin->after(); + + if ( !$is_multi ) + $this->skin->footer(); + + return $result; + } + + function maintenance_mode($enable = false) { + global $wp_filesystem; + $file = $wp_filesystem->abspath() . '.maintenance'; + if ( $enable ) { + $this->skin->feedback('maintenance_start'); + // Create maintenance file to signal that we are upgrading + $maintenance_string = ''; + $wp_filesystem->delete($file); + $wp_filesystem->put_contents($file, $maintenance_string, FS_CHMOD_FILE); + } else if ( !$enable && $wp_filesystem->exists($file) ) { + $this->skin->feedback('maintenance_end'); + $wp_filesystem->delete($file); + } + } + +} + +/** + * Plugin Upgrader class for WordPress Plugins, It is designed to upgrade/install plugins from a local zip, remote zip URL, or uploaded zip file. + * + * @TODO More Detailed docs, for methods as well. + * + * @package WordPress + * @subpackage Upgrader + * @since 2.8.0 + */ +class Plugin_Upgrader extends WP_Upgrader { + + var $result; + var $bulk = false; + var $show_before = ''; + + function upgrade_strings() { + $this->strings['up_to_date'] = __('The plugin is at the latest version.'); + $this->strings['no_package'] = __('Update package not available.'); + $this->strings['downloading_package'] = __('Downloading update from %s…'); + $this->strings['unpack_package'] = __('Unpacking the update…'); + $this->strings['deactivate_plugin'] = __('Deactivating the plugin…'); + $this->strings['remove_old'] = __('Removing the old version of the plugin…'); + $this->strings['remove_old_failed'] = __('Could not remove the old plugin.'); + $this->strings['process_failed'] = __('Plugin update failed.'); + $this->strings['process_success'] = __('Plugin updated successfully.'); + } + + function install_strings() { + $this->strings['no_package'] = __('Install package not available.'); + $this->strings['downloading_package'] = __('Downloading install package from %s…'); + $this->strings['unpack_package'] = __('Unpacking the package…'); + $this->strings['installing_package'] = __('Installing the plugin…'); + $this->strings['process_failed'] = __('Plugin install failed.'); + $this->strings['process_success'] = __('Plugin installed successfully.'); + } + + function install($package) { + + $this->init(); + $this->install_strings(); + + $this->run(array( + 'package' => $package, + 'destination' => WP_PLUGIN_DIR, + 'clear_destination' => false, //Do not overwrite files. + 'clear_working' => true, + 'hook_extra' => array() + )); + + // Force refresh of plugin update information + delete_site_transient('update_plugins'); + + } + + function upgrade($plugin) { + + $this->init(); + $this->upgrade_strings(); + + $current = get_site_transient( 'update_plugins' ); + if ( !isset( $current->response[ $plugin ] ) ) { + $this->skin->before(); + $this->skin->set_result(false); + $this->skin->error('up_to_date'); + $this->skin->after(); + return false; + } + + // Get the URL to the zip file + $r = $current->response[ $plugin ]; + + add_filter('upgrader_pre_install', array(&$this, 'deactivate_plugin_before_upgrade'), 10, 2); + add_filter('upgrader_clear_destination', array(&$this, 'delete_old_plugin'), 10, 4); + //'source_selection' => array(&$this, 'source_selection'), //theres a track ticket to move up the directory for zip's which are made a bit differently, useful for non-.org plugins. + + $this->run(array( + 'package' => $r->package, + 'destination' => WP_PLUGIN_DIR, + 'clear_destination' => true, + 'clear_working' => true, + 'hook_extra' => array( + 'plugin' => $plugin + ) + )); + + // Cleanup our hooks, incase something else does a upgrade on this connection. + remove_filter('upgrader_pre_install', array(&$this, 'deactivate_plugin_before_upgrade')); + remove_filter('upgrader_clear_destination', array(&$this, 'delete_old_plugin')); + + if ( ! $this->result || is_wp_error($this->result) ) + return $this->result; + + // Force refresh of plugin update information + delete_site_transient('update_plugins'); + } + + function bulk_upgrade($plugins) { + + $this->init(); + $this->bulk = true; + $this->upgrade_strings(); + + $current = get_site_transient( 'update_plugins' ); + + add_filter('upgrader_clear_destination', array(&$this, 'delete_old_plugin'), 10, 4); + + $this->skin->header(); + + // Connect to the Filesystem first. + $res = $this->fs_connect( array(WP_CONTENT_DIR, WP_PLUGIN_DIR) ); + if ( ! $res ) { + $this->skin->footer(); + return false; + } + + $this->skin->bulk_header(); + + // Only start maintenance mode if running in Multisite OR the plugin is in use + $maintenance = is_multisite(); // @TODO: This should only kick in for individual sites if at all possible. + foreach ( $plugins as $plugin ) + $maintenance = $maintenance || (is_plugin_active($plugin) && isset($current->response[ $plugin ]) ); // Only activate Maintenance mode if a plugin is active AND has an update available + if ( $maintenance ) + $this->maintenance_mode(true); + + $results = array(); + + $this->update_count = count($plugins); + $this->update_current = 0; + foreach ( $plugins as $plugin ) { + $this->update_current++; + $this->skin->plugin_info = get_plugin_data( WP_PLUGIN_DIR . '/' . $plugin, false, true); + + if ( !isset( $current->response[ $plugin ] ) ) { + $this->skin->set_result(false); + $this->skin->before(); + $this->skin->error('up_to_date'); + $this->skin->after(); + $results[$plugin] = false; + continue; + } + + // Get the URL to the zip file + $r = $current->response[ $plugin ]; + + $this->skin->plugin_active = is_plugin_active($plugin); + + $result = $this->run(array( + 'package' => $r->package, + 'destination' => WP_PLUGIN_DIR, + 'clear_destination' => true, + 'clear_working' => true, + 'is_multi' => true, + 'hook_extra' => array( + 'plugin' => $plugin + ) + )); + + $results[$plugin] = $this->result; + + // Prevent credentials auth screen from displaying multiple times + if ( false === $result ) + break; + } //end foreach $plugins + + $this->maintenance_mode(false); + + $this->skin->bulk_footer(); + + $this->skin->footer(); + + // Cleanup our hooks, incase something else does a upgrade on this connection. + remove_filter('upgrader_clear_destination', array(&$this, 'delete_old_plugin')); + + // Force refresh of plugin update information + delete_site_transient('update_plugins'); + + return $results; + } + + //return plugin info. + function plugin_info() { + if ( ! is_array($this->result) ) + return false; + if ( empty($this->result['destination_name']) ) + return false; + + $plugin = get_plugins('/' . $this->result['destination_name']); //Ensure to pass with leading slash + if ( empty($plugin) ) + return false; + + $pluginfiles = array_keys($plugin); //Assume the requested plugin is the first in the list + + return $this->result['destination_name'] . '/' . $pluginfiles[0]; + } + + //Hooked to pre_install + function deactivate_plugin_before_upgrade($return, $plugin) { + + if ( is_wp_error($return) ) //Bypass. + return $return; + + $plugin = isset($plugin['plugin']) ? $plugin['plugin'] : ''; + if ( empty($plugin) ) + return new WP_Error('bad_request', $this->strings['bad_request']); + + if ( is_plugin_active($plugin) ) { + $this->skin->feedback('deactivate_plugin'); + //Deactivate the plugin silently, Prevent deactivation hooks from running. + deactivate_plugins($plugin, true); + } + } + + //Hooked to upgrade_clear_destination + function delete_old_plugin($removed, $local_destination, $remote_destination, $plugin) { + global $wp_filesystem; + + if ( is_wp_error($removed) ) + return $removed; //Pass errors through. + + $plugin = isset($plugin['plugin']) ? $plugin['plugin'] : ''; + if ( empty($plugin) ) + return new WP_Error('bad_request', $this->strings['bad_request']); + + $plugins_dir = $wp_filesystem->wp_plugins_dir(); + $this_plugin_dir = trailingslashit( dirname($plugins_dir . $plugin) ); + + if ( ! $wp_filesystem->exists($this_plugin_dir) ) //If its already vanished. + return $removed; + + // If plugin is in its own directory, recursively delete the directory. + if ( strpos($plugin, '/') && $this_plugin_dir != $plugins_dir ) //base check on if plugin includes directory separator AND that its not the root plugin folder + $deleted = $wp_filesystem->delete($this_plugin_dir, true); + else + $deleted = $wp_filesystem->delete($plugins_dir . $plugin); + + if ( ! $deleted ) + return new WP_Error('remove_old_failed', $this->strings['remove_old_failed']); + + return true; + } +} + +/** + * Theme Upgrader class for WordPress Themes, It is designed to upgrade/install themes from a local zip, remote zip URL, or uploaded zip file. + * + * @TODO More Detailed docs, for methods as well. + * + * @package WordPress + * @subpackage Upgrader + * @since 2.8.0 + */ +class Theme_Upgrader extends WP_Upgrader { + + var $result; + + function upgrade_strings() { + $this->strings['up_to_date'] = __('The theme is at the latest version.'); + $this->strings['no_package'] = __('Update package not available.'); + $this->strings['downloading_package'] = __('Downloading update from %s…'); + $this->strings['unpack_package'] = __('Unpacking the update…'); + $this->strings['remove_old'] = __('Removing the old version of the theme…'); + $this->strings['remove_old_failed'] = __('Could not remove the old theme.'); + $this->strings['process_failed'] = __('Theme update failed.'); + $this->strings['process_success'] = __('Theme updated successfully.'); + } + + function install_strings() { + $this->strings['no_package'] = __('Install package not available.'); + $this->strings['downloading_package'] = __('Downloading install package from %s…'); + $this->strings['unpack_package'] = __('Unpacking the package…'); + $this->strings['installing_package'] = __('Installing the theme…'); + $this->strings['process_failed'] = __('Theme install failed.'); + $this->strings['process_success'] = __('Theme installed successfully.'); + } + + function install($package) { + + $this->init(); + $this->install_strings(); + + $options = array( + 'package' => $package, + 'destination' => WP_CONTENT_DIR . '/themes', + 'clear_destination' => false, //Do not overwrite files. + 'clear_working' => true + ); + + $this->run($options); + + if ( ! $this->result || is_wp_error($this->result) ) + return $this->result; + + // Force refresh of theme update information + delete_site_transient('update_themes'); + + if ( empty($result['destination_name']) ) + return false; + else + return $result['destination_name']; + } + + function upgrade($theme) { + + $this->init(); + $this->upgrade_strings(); + + // Is an update available? + $current = get_site_transient( 'update_themes' ); + if ( !isset( $current->response[ $theme ] ) ) { + $this->skin->before(); + $this->skin->set_result(false); + $this->skin->error('up_to_date'); + $this->skin->after(); + return false; + } + + $r = $current->response[ $theme ]; + + add_filter('upgrader_pre_install', array(&$this, 'current_before'), 10, 2); + add_filter('upgrader_post_install', array(&$this, 'current_after'), 10, 2); + add_filter('upgrader_clear_destination', array(&$this, 'delete_old_theme'), 10, 4); + + $options = array( + 'package' => $r['package'], + 'destination' => WP_CONTENT_DIR . '/themes', + 'clear_destination' => true, + 'clear_working' => true, + 'hook_extra' => array( + 'theme' => $theme + ) + ); + + $this->run($options); + + if ( ! $this->result || is_wp_error($this->result) ) + return $this->result; + + // Force refresh of theme update information + delete_site_transient('update_themes'); + + return true; + } + + function bulk_upgrade($themes) { + + $this->init(); + $this->bulk = true; + $this->upgrade_strings(); + + $current = get_site_transient( 'update_themes' ); + + add_filter('upgrader_pre_install', array(&$this, 'current_before'), 10, 2); + add_filter('upgrader_post_install', array(&$this, 'current_after'), 10, 2); + add_filter('upgrader_clear_destination', array(&$this, 'delete_old_theme'), 10, 4); + + $this->skin->header(); + + // Connect to the Filesystem first. + $res = $this->fs_connect( array(WP_CONTENT_DIR) ); + if ( ! $res ) { + $this->skin->footer(); + return false; + } + + $this->skin->bulk_header(); + + // Only start maintenance mode if running in Multisite OR the theme is in use + $maintenance = is_multisite(); // @TODO: This should only kick in for individual sites if at all possible. + foreach ( $themes as $theme ) + $maintenance = $maintenance || $theme == get_stylesheet() || $theme == get_template(); + if ( $maintenance ) + $this->maintenance_mode(true); + + $results = array(); + + $this->update_count = count($themes); + $this->update_current = 0; + foreach ( $themes as $theme ) { + $this->update_current++; + + if ( !isset( $current->response[ $theme ] ) ) { + $this->skin->set_result(false); + $this->skin->before(); + $this->skin->error('up_to_date'); + $this->skin->after(); + $results[$theme] = false; + continue; + } + + $this->skin->theme_info = $this->theme_info($theme); + + // Get the URL to the zip file + $r = $current->response[ $theme ]; + + $options = array( + 'package' => $r['package'], + 'destination' => WP_CONTENT_DIR . '/themes', + 'clear_destination' => true, + 'clear_working' => true, + 'hook_extra' => array( + 'theme' => $theme + ) + ); + + $result = $this->run($options); + + $results[$theme] = $this->result; + + // Prevent credentials auth screen from displaying multiple times + if ( false === $result ) + break; + } //end foreach $plugins + + $this->maintenance_mode(false); + + $this->skin->bulk_footer(); + + $this->skin->footer(); + + // Cleanup our hooks, incase something else does a upgrade on this connection. + remove_filter('upgrader_pre_install', array(&$this, 'current_before'), 10, 2); + remove_filter('upgrader_post_install', array(&$this, 'current_after'), 10, 2); + remove_filter('upgrader_clear_destination', array(&$this, 'delete_old_theme'), 10, 4); + + // Force refresh of theme update information + delete_site_transient('update_themes'); + + return $results; + } + + function current_before($return, $theme) { + + if ( is_wp_error($return) ) + return $return; + + $theme = isset($theme['theme']) ? $theme['theme'] : ''; + + if ( $theme != get_stylesheet() ) //If not current + return $return; + //Change to maintenance mode now. + if ( ! $this->bulk ) + $this->maintenance_mode(true); + + return $return; + } + function current_after($return, $theme) { + if ( is_wp_error($return) ) + return $return; + + $theme = isset($theme['theme']) ? $theme['theme'] : ''; + + if ( $theme != get_stylesheet() ) //If not current + return $return; + + //Ensure stylesheet name hasnt changed after the upgrade: + // @TODO: Note, This doesnt handle the Template changing, or the Template name changing. + if ( $theme == get_stylesheet() && $theme != $this->result['destination_name'] ) { + $theme_info = $this->theme_info(); + $stylesheet = $this->result['destination_name']; + $template = !empty($theme_info['Template']) ? $theme_info['Template'] : $stylesheet; + switch_theme($template, $stylesheet, true); + } + + //Time to remove maintenance mode + if ( ! $this->bulk ) + $this->maintenance_mode(false); + return $return; + } + + function delete_old_theme($removed, $local_destination, $remote_destination, $theme) { + global $wp_filesystem; + + $theme = isset($theme['theme']) ? $theme['theme'] : ''; + + if ( is_wp_error($removed) || empty($theme) ) + return $removed; //Pass errors through. + + $themes_dir = $wp_filesystem->wp_themes_dir(); + if ( $wp_filesystem->exists( trailingslashit($themes_dir) . $theme ) ) + if ( ! $wp_filesystem->delete( trailingslashit($themes_dir) . $theme, true ) ) + return false; + return true; + } + + function theme_info($theme = null) { + + if ( empty($theme) ) { + if ( !empty($this->result['destination_name']) ) + $theme = $this->result['destination_name']; + else + return false; + } + return get_theme_data(WP_CONTENT_DIR . '/themes/' . $theme . '/style.css'); + } + +} + +/** + * Core Upgrader class for WordPress. It allows for WordPress to upgrade itself in combiantion with the wp-admin/includes/update-core.php file + * + * @TODO More Detailed docs, for methods as well. + * + * @package WordPress + * @subpackage Upgrader + * @since 2.8.0 + */ +class Core_Upgrader extends WP_Upgrader { + + function upgrade_strings() { + $this->strings['up_to_date'] = __('WordPress is at the latest version.'); + $this->strings['no_package'] = __('Update package not available.'); + $this->strings['downloading_package'] = __('Downloading update from %s…'); + $this->strings['unpack_package'] = __('Unpacking the update…'); + $this->strings['copy_failed'] = __('Could not copy files.'); + } + + function upgrade($current) { + global $wp_filesystem, $wp_version; + + $this->init(); + $this->upgrade_strings(); + + if ( !empty($feedback) ) + add_filter('update_feedback', $feedback); + + // Is an update available? + if ( !isset( $current->response ) || $current->response == 'latest' ) + return new WP_Error('up_to_date', $this->strings['up_to_date']); + + $res = $this->fs_connect( array(ABSPATH, WP_CONTENT_DIR) ); + if ( is_wp_error($res) ) + return $res; + + $wp_dir = trailingslashit($wp_filesystem->abspath()); + + // If partial update is returned from the API, use that, unless we're doing a reinstall. + // If we cross the new_bundled version number, then use the new_bundled zip. + // Don't though if the constant is set to skip bundled items. + // If the API returns a no_content zip, go with it. Finally, default to the full zip. + if ( $current->packages->partial && 'reinstall' != $current->response && $wp_version == $current->partial_version ) + $to_download = 'partial'; + elseif ( $current->packages->new_bundled && version_compare( $wp_version, $current->new_bundled, '<' ) + && ( ! defined( 'CORE_UPGRADE_SKIP_NEW_BUNDLED' ) || ! CORE_UPGRADE_SKIP_NEW_BUNDLED ) ) + $to_download = 'new_bundled'; + elseif ( $current->packages->no_content ) + $to_download = 'no_content'; + else + $to_download = 'full'; + + $download = $this->download_package( $current->packages->$to_download ); + if ( is_wp_error($download) ) + return $download; + + $working_dir = $this->unpack_package( $download ); + if ( is_wp_error($working_dir) ) + return $working_dir; + + // Copy update-core.php from the new version into place. + if ( !$wp_filesystem->copy($working_dir . '/wordpress/wp-admin/includes/update-core.php', $wp_dir . 'wp-admin/includes/update-core.php', true) ) { + $wp_filesystem->delete($working_dir, true); + return new WP_Error('copy_failed', $this->strings['copy_failed']); + } + $wp_filesystem->chmod($wp_dir . 'wp-admin/includes/update-core.php', FS_CHMOD_FILE); + + require(ABSPATH . 'wp-admin/includes/update-core.php'); + + return update_core($working_dir, $wp_dir); + } + +} + +/** + * Generic Skin for the WordPress Upgrader classes. This skin is designed to be extended for specific purposes. + * + * @TODO More Detailed docs, for methods as well. + * + * @package WordPress + * @subpackage Upgrader + * @since 2.8.0 + */ +class WP_Upgrader_Skin { + + var $upgrader; + var $done_header = false; + var $result = false; + + function __construct($args = array()) { + $defaults = array( 'url' => '', 'nonce' => '', 'title' => '', 'context' => false ); + $this->options = wp_parse_args($args, $defaults); + } + + function set_upgrader(&$upgrader) { + if ( is_object($upgrader) ) + $this->upgrader =& $upgrader; + $this->add_strings(); + } + + function add_strings() { + } + + function set_result($result) { + $this->result = $result; + } + + function request_filesystem_credentials($error = false) { + $url = $this->options['url']; + $context = $this->options['context']; + if ( !empty($this->options['nonce']) ) + $url = wp_nonce_url($url, $this->options['nonce']); + return request_filesystem_credentials($url, '', $error, $context); //Possible to bring inline, Leaving as is for now. + } + + function header() { + if ( $this->done_header ) + return; + $this->done_header = true; + echo '
'; + echo screen_icon(); + echo '

' . $this->options['title'] . '

'; + } + function footer() { + echo '
'; + } + + function error($errors) { + if ( ! $this->done_header ) + $this->header(); + if ( is_string($errors) ) { + $this->feedback($errors); + } elseif ( is_wp_error($errors) && $errors->get_error_code() ) { + foreach ( $errors->get_error_messages() as $message ) { + if ( $errors->get_error_data() ) + $this->feedback($message . ' ' . $errors->get_error_data() ); + else + $this->feedback($message); + } + } + } + + function feedback($string) { + if ( isset( $this->upgrader->strings[$string] ) ) + $string = $this->upgrader->strings[$string]; + + if ( strpos($string, '%') !== false ) { + $args = func_get_args(); + $args = array_splice($args, 1); + if ( !empty($args) ) + $string = vsprintf($string, $args); + } + if ( empty($string) ) + return; + show_message($string); + } + function before() {} + function after() {} + +} + +/** + * Plugin Upgrader Skin for WordPress Plugin Upgrades. + * + * @TODO More Detailed docs, for methods as well. + * + * @package WordPress + * @subpackage Upgrader + * @since 2.8.0 + */ +class Plugin_Upgrader_Skin extends WP_Upgrader_Skin { + var $plugin = ''; + var $plugin_active = false; + var $plugin_network_active = false; + + function __construct($args = array()) { + $defaults = array( 'url' => '', 'plugin' => '', 'nonce' => '', 'title' => __('Update Plugin') ); + $args = wp_parse_args($args, $defaults); + + $this->plugin = $args['plugin']; + + $this->plugin_active = is_plugin_active( $this->plugin ); + $this->plugin_network_active = is_plugin_active_for_network( $this->plugin ); + + parent::__construct($args); + } + + function after() { + $this->plugin = $this->upgrader->plugin_info(); + if ( !empty($this->plugin) && !is_wp_error($this->result) && $this->plugin_active ){ + show_message(__('Reactivating the plugin…')); + echo ''; + } + + $update_actions = array( + 'activate_plugin' => '' . __('Activate Plugin') . '', + 'plugins_page' => '' . __('Return to Plugins page') . '' + ); + if ( $this->plugin_active ) + unset( $update_actions['activate_plugin'] ); + if ( ! $this->result || is_wp_error($this->result) ) + unset( $update_actions['activate_plugin'] ); + + $update_actions = apply_filters('update_plugin_complete_actions', $update_actions, $this->plugin); + if ( ! empty($update_actions) ) + $this->feedback(implode(' | ', (array)$update_actions)); + } + + function before() { + if ( $this->upgrader->show_before ) { + echo $this->upgrader->show_before; + $this->upgrader->show_before = ''; + } + } +} + +/** + * Plugin Upgrader Skin for WordPress Plugin Upgrades. + * + * @package WordPress + * @subpackage Upgrader + * @since 3.0.0 + */ +class Bulk_Upgrader_Skin extends WP_Upgrader_Skin { + var $in_loop = false; + var $error = false; + + function __construct($args = array()) { + $defaults = array( 'url' => '', 'nonce' => '' ); + $args = wp_parse_args($args, $defaults); + + parent::__construct($args); + } + + function add_strings() { + $this->upgrader->strings['skin_upgrade_start'] = __('The update process is starting. This process may take a while on some hosts, so please be patient.'); + $this->upgrader->strings['skin_update_failed_error'] = __('An error occurred while updating %1$s: %2$s.'); + $this->upgrader->strings['skin_update_failed'] = __('The update of %1$s failed.'); + $this->upgrader->strings['skin_update_successful'] = __('%1$s updated successfully.').' '.__('Show Details').'.'; + $this->upgrader->strings['skin_upgrade_end'] = __('All updates have been completed.'); + } + + function feedback($string) { + if ( isset( $this->upgrader->strings[$string] ) ) + $string = $this->upgrader->strings[$string]; + + if ( strpos($string, '%') !== false ) { + $args = func_get_args(); + $args = array_splice($args, 1); + if ( !empty($args) ) + $string = vsprintf($string, $args); + } + if ( empty($string) ) + return; + if ( $this->in_loop ) + echo "$string
\n"; + else + echo "

$string

\n"; + } + + function header() { + // Nothing, This will be displayed within a iframe. + } + + function footer() { + // Nothing, This will be displayed within a iframe. + } + function error($error) { + if ( is_string($error) && isset( $this->upgrader->strings[$error] ) ) + $this->error = $this->upgrader->strings[$error]; + + if ( is_wp_error($error) ) { + foreach ( $error->get_error_messages() as $emessage ) { + if ( $error->get_error_data() ) + $messages[] = $emessage . ' ' . $error->get_error_data(); + else + $messages[] = $emessage; + } + $this->error = implode(', ', $messages); + } + echo ''; + } + + function bulk_header() { + $this->feedback('skin_upgrade_start'); + } + + function bulk_footer() { + $this->feedback('skin_upgrade_end'); + } + + function before($title = '') { + $this->in_loop = true; + printf( '

' . $this->upgrader->strings['skin_before_update_header'] . '

', $title, $this->upgrader->update_current, $this->upgrader->update_count); + echo ''; + echo '

'; + $this->flush_output(); + } + + function after($title = '') { + echo '

'; + if ( $this->error || ! $this->result ) { + if ( $this->error ) + echo '

' . sprintf($this->upgrader->strings['skin_update_failed_error'], $title, $this->error) . '

'; + else + echo '

' . sprintf($this->upgrader->strings['skin_update_failed'], $title) . '

'; + + echo ''; + } + if ( !empty($this->result) && !is_wp_error($this->result) ) { + echo '

' . sprintf($this->upgrader->strings['skin_update_successful'], $title, 'jQuery(\'#progress-' . esc_js($this->upgrader->update_current) . '\').toggle();jQuery(\'span\', this).toggle(); return false;') . '

'; + echo ''; + } + + $this->reset(); + $this->flush_output(); + } + + function reset() { + $this->in_loop = false; + $this->error = false; + } + + function flush_output() { + wp_ob_end_flush_all(); + flush(); + } +} + +class Bulk_Plugin_Upgrader_Skin extends Bulk_Upgrader_Skin { + var $plugin_info = array(); // Plugin_Upgrader::bulk() will fill this in. + + function __construct($args = array()) { + parent::__construct($args); + } + + function add_strings() { + parent::add_strings(); + $this->upgrader->strings['skin_before_update_header'] = __('Updating Plugin %1$s (%2$d/%3$d)'); + } + + function before() { + parent::before($this->plugin_info['Title']); + } + + function after() { + parent::after($this->plugin_info['Title']); + } + function bulk_footer() { + parent::bulk_footer(); + $update_actions = array( + 'plugins_page' => '' . __('Return to Plugins page') . '', + 'updates_page' => '' . __('Return to WordPress Updates') . '' + ); + + $update_actions = apply_filters('update_bulk_plugins_complete_actions', $update_actions, $this->plugin_info); + if ( ! empty($update_actions) ) + $this->feedback(implode(' | ', (array)$update_actions)); + } +} + +class Bulk_Theme_Upgrader_Skin extends Bulk_Upgrader_Skin { + var $theme_info = array(); // Theme_Upgrader::bulk() will fill this in. + + function __construct($args = array()) { + parent::__construct($args); + } + + function add_strings() { + parent::add_strings(); + $this->upgrader->strings['skin_before_update_header'] = __('Updating Theme %1$s (%2$d/%3$d)'); + } + + function before() { + parent::before($this->theme_info['Name']); + } + + function after() { + parent::after($this->theme_info['Name']); + } + function bulk_footer() { + parent::bulk_footer(); + $update_actions = array( + 'themes_page' => '' . __('Return to Themes page') . '', + 'updates_page' => '' . __('Return to WordPress Updates') . '' + ); + + $update_actions = apply_filters('update_bulk_theme_complete_actions', $update_actions, $this->theme_info); + if ( ! empty($update_actions) ) + $this->feedback(implode(' | ', (array)$update_actions)); + } +} + +/** + * Plugin Installer Skin for WordPress Plugin Installer. + * + * @TODO More Detailed docs, for methods as well. + * + * @package WordPress + * @subpackage Upgrader + * @since 2.8.0 + */ +class Plugin_Installer_Skin extends WP_Upgrader_Skin { + var $api; + var $type; + + function __construct($args = array()) { + $defaults = array( 'type' => 'web', 'url' => '', 'plugin' => '', 'nonce' => '', 'title' => '' ); + $args = wp_parse_args($args, $defaults); + + $this->type = $args['type']; + $this->api = isset($args['api']) ? $args['api'] : array(); + + parent::__construct($args); + } + + function before() { + if ( !empty($this->api) ) + $this->upgrader->strings['process_success'] = sprintf( __('Successfully installed the plugin %s %s.'), $this->api->name, $this->api->version); + } + + function after() { + + $plugin_file = $this->upgrader->plugin_info(); + + $install_actions = array(); + + $from = isset($_GET['from']) ? stripslashes($_GET['from']) : 'plugins'; + + if ( 'import' == $from ) + $install_actions['activate_plugin'] = '' . __('Activate Plugin & Run Importer') . ''; + else + $install_actions['activate_plugin'] = '' . __('Activate Plugin') . ''; + + if ( is_multisite() && current_user_can( 'manage_network_plugins' ) ) { + $install_actions['network_activate'] = '' . __('Network Activate') . ''; + unset( $install_actions['activate_plugin'] ); + } + + if ( 'import' == $from ) + $install_actions['importers_page'] = '' . __('Return to Importers') . ''; + else if ( $this->type == 'web' ) + $install_actions['plugins_page'] = '' . __('Return to Plugin Installer') . ''; + else + $install_actions['plugins_page'] = '' . __('Return to Plugins page') . ''; + + + if ( ! $this->result || is_wp_error($this->result) ) { + unset( $install_actions['activate_plugin'] ); + unset( $install_actions['network_activate'] ); + } + $install_actions = apply_filters('install_plugin_complete_actions', $install_actions, $this->api, $plugin_file); + if ( ! empty($install_actions) ) + $this->feedback(implode(' | ', (array)$install_actions)); + } +} + +/** + * Theme Installer Skin for the WordPress Theme Installer. + * + * @TODO More Detailed docs, for methods as well. + * + * @package WordPress + * @subpackage Upgrader + * @since 2.8.0 + */ +class Theme_Installer_Skin extends WP_Upgrader_Skin { + var $api; + var $type; + + function __construct($args = array()) { + $defaults = array( 'type' => 'web', 'url' => '', 'theme' => '', 'nonce' => '', 'title' => '' ); + $args = wp_parse_args($args, $defaults); + + $this->type = $args['type']; + $this->api = isset($args['api']) ? $args['api'] : array(); + + parent::__construct($args); + } + + function before() { + if ( !empty($this->api) ) { + /* translators: 1: theme name, 2: version */ + $this->upgrader->strings['process_success'] = sprintf( __('Successfully installed the theme %1$s %2$s.'), $this->api->name, $this->api->version); + } + } + + function after() { + if ( empty($this->upgrader->result['destination_name']) ) + return; + + $theme_info = $this->upgrader->theme_info(); + if ( empty($theme_info) ) + return; + $name = $theme_info['Name']; + $stylesheet = $this->upgrader->result['destination_name']; + $template = !empty($theme_info['Template']) ? $theme_info['Template'] : $stylesheet; + + $preview_link = htmlspecialchars( add_query_arg( array('preview' => 1, 'template' => $template, 'stylesheet' => $stylesheet, 'preview_iframe' => 1, 'TB_iframe' => 'true' ), trailingslashit(esc_url(get_option('home'))) ) ); + $activate_link = wp_nonce_url("themes.php?action=activate&template=" . urlencode($template) . "&stylesheet=" . urlencode($stylesheet), 'switch-theme_' . $template); + + $install_actions = array( + 'preview' => '' . __('Preview') . '', + 'activate' => '' . __('Activate') . '' + ); + + if ( $this->type == 'web' ) + $install_actions['themes_page'] = '' . __('Return to Theme Installer') . ''; + else + $install_actions['themes_page'] = '' . __('Return to Themes page') . ''; + + if ( ! $this->result || is_wp_error($this->result) || is_network_admin() ) + unset( $install_actions['activate'], $install_actions['preview'] ); + + $install_actions = apply_filters('install_theme_complete_actions', $install_actions, $this->api, $stylesheet, $theme_info); + if ( ! empty($install_actions) ) + $this->feedback(implode(' | ', (array)$install_actions)); + } +} + +/** + * Theme Upgrader Skin for WordPress Theme Upgrades. + * + * @TODO More Detailed docs, for methods as well. + * + * @package WordPress + * @subpackage Upgrader + * @since 2.8.0 + */ +class Theme_Upgrader_Skin extends WP_Upgrader_Skin { + var $theme = ''; + + function __construct($args = array()) { + $defaults = array( 'url' => '', 'theme' => '', 'nonce' => '', 'title' => __('Update Theme') ); + $args = wp_parse_args($args, $defaults); + + $this->theme = $args['theme']; + + parent::__construct($args); + } + + function after() { + + $update_actions = array(); + if ( !empty($this->upgrader->result['destination_name']) && + ($theme_info = $this->upgrader->theme_info()) && + !empty($theme_info) ) { + + $name = $theme_info['Name']; + $stylesheet = $this->upgrader->result['destination_name']; + $template = !empty($theme_info['Template']) ? $theme_info['Template'] : $stylesheet; + + $preview_link = htmlspecialchars( add_query_arg( array('preview' => 1, 'template' => $template, 'stylesheet' => $stylesheet, 'TB_iframe' => 'true' ), trailingslashit(esc_url(get_option('home'))) ) ); + $activate_link = wp_nonce_url("themes.php?action=activate&template=" . urlencode($template) . "&stylesheet=" . urlencode($stylesheet), 'switch-theme_' . $template); + + $update_actions['preview'] = '' . __('Preview') . ''; + $update_actions['activate'] = '' . __('Activate') . ''; + + if ( ( ! $this->result || is_wp_error($this->result) ) || $stylesheet == get_stylesheet() ) + unset($update_actions['preview'], $update_actions['activate']); + } + + $update_actions['themes_page'] = '' . __('Return to Themes page') . ''; + + $update_actions = apply_filters('update_theme_complete_actions', $update_actions, $this->theme); + if ( ! empty($update_actions) ) + $this->feedback(implode(' | ', (array)$update_actions)); + } +} + +/** + * Upgrade Skin helper for File uploads. This class handles the upload process and passes it as if its a local file to the Upgrade/Installer functions. + * + * @TODO More Detailed docs, for methods as well. + * + * @package WordPress + * @subpackage Upgrader + * @since 2.8.0 + */ +class File_Upload_Upgrader { + var $package; + var $filename; + + function __construct($form, $urlholder) { + if ( ! ( ( $uploads = wp_upload_dir() ) && false === $uploads['error'] ) ) + wp_die($uploads['error']); + + if ( empty($_FILES[$form]['name']) && empty($_GET[$urlholder]) ) + wp_die(__('Please select a file')); + + if ( !empty($_FILES) ) + $this->filename = $_FILES[$form]['name']; + else if ( isset($_GET[$urlholder]) ) + $this->filename = $_GET[$urlholder]; + + //Handle a newly uploaded file, Else assume its already been uploaded + if ( !empty($_FILES) ) { + $this->filename = wp_unique_filename( $uploads['basedir'], $this->filename ); + $this->package = $uploads['basedir'] . '/' . $this->filename; + + // Move the file to the uploads dir + if ( false === @ move_uploaded_file( $_FILES[$form]['tmp_name'], $this->package) ) + wp_die( sprintf( __('The uploaded file could not be moved to %s.' ), $uploads['path'])); + } else { + $this->package = $uploads['basedir'] . '/' . $this->filename; + } + } +} \ No newline at end of file diff --git a/src/wp-admin/includes/class-wp-users-list-table.php b/src/wp-admin/includes/class-wp-users-list-table.php new file mode 100644 index 0000000..de22748 --- /dev/null +++ b/src/wp-admin/includes/class-wp-users-list-table.php @@ -0,0 +1,320 @@ +is_site_users = 'site-users-network' == $screen->id; + + if ( $this->is_site_users ) + $this->site_id = isset( $_REQUEST['id'] ) ? intval( $_REQUEST['id'] ) : 0; + + parent::__construct( array( + 'singular' => 'user', + 'plural' => 'users' + ) ); + } + + function ajax_user_can() { + if ( $this->is_site_users ) + return current_user_can( 'manage_sites' ); + else + return current_user_can( 'list_users' ); + } + + function prepare_items() { + global $role, $usersearch; + + $usersearch = isset( $_REQUEST['s'] ) ? $_REQUEST['s'] : ''; + + $role = isset( $_REQUEST['role'] ) ? $_REQUEST['role'] : ''; + + $per_page = ( $this->is_site_users ) ? 'site_users_network_per_page' : 'users_per_page'; + $users_per_page = $this->get_items_per_page( $per_page ); + + $paged = $this->get_pagenum(); + + $args = array( + 'number' => $users_per_page, + 'offset' => ( $paged-1 ) * $users_per_page, + 'role' => $role, + 'search' => $usersearch, + 'fields' => 'all_with_meta' + ); + + if ( '' !== $args['search'] ) + $args['search'] = '*' . $args['search'] . '*'; + + if ( $this->is_site_users ) + $args['blog_id'] = $this->site_id; + + if ( isset( $_REQUEST['orderby'] ) ) + $args['orderby'] = $_REQUEST['orderby']; + + if ( isset( $_REQUEST['order'] ) ) + $args['order'] = $_REQUEST['order']; + + // Query the user IDs for this page + $wp_user_search = new WP_User_Query( $args ); + + $this->items = $wp_user_search->get_results(); + + $this->set_pagination_args( array( + 'total_items' => $wp_user_search->get_total(), + 'per_page' => $users_per_page, + ) ); + } + + function no_items() { + _e( 'No matching users were found.' ); + } + + function get_views() { + global $wp_roles, $role; + + if ( $this->is_site_users ) { + $url = 'site-users.php?id=' . $this->site_id; + switch_to_blog( $this->site_id ); + $users_of_blog = count_users(); + restore_current_blog(); + } else { + $url = 'users.php'; + $users_of_blog = count_users(); + } + $total_users = $users_of_blog['total_users']; + $avail_roles =& $users_of_blog['avail_roles']; + unset($users_of_blog); + + $current_role = false; + $class = empty($role) ? ' class="current"' : ''; + $role_links = array(); + $role_links['all'] = "" . sprintf( _nx( 'All (%s)', 'All (%s)', $total_users, 'users' ), number_format_i18n( $total_users ) ) . ''; + foreach ( $wp_roles->get_names() as $this_role => $name ) { + if ( !isset($avail_roles[$this_role]) ) + continue; + + $class = ''; + + if ( $this_role == $role ) { + $current_role = $role; + $class = ' class="current"'; + } + + $name = translate_user_role( $name ); + /* translators: User role name with count */ + $name = sprintf( __('%1$s (%2$s)'), $name, $avail_roles[$this_role] ); + $role_links[$this_role] = "$name"; + } + + return $role_links; + } + + function get_bulk_actions() { + $actions = array(); + + if ( is_multisite() ) { + if ( current_user_can( 'remove_users' ) ) + $actions['remove'] = __( 'Remove' ); + } else { + if ( current_user_can( 'delete_users' ) ) + $actions['delete'] = __( 'Delete' ); + } + + return $actions; + } + + function extra_tablenav( $which ) { + if ( 'top' != $which ) + return; + if ( ! current_user_can( 'promote_users' ) ) + return; +?> +
+ + + +
+ '', + 'username' => __( 'Username' ), + 'name' => __( 'Name' ), + 'email' => __( 'E-mail' ), + 'role' => __( 'Role' ), + 'posts' => __( 'Posts' ) + ); + + if ( $this->is_site_users ) + unset( $c['posts'] ); + + return $c; + } + + function get_sortable_columns() { + $c = array( + 'username' => 'login', + 'name' => 'name', + 'email' => 'email', + ); + + if ( $this->is_site_users ) + unset( $c['posts'] ); + + return $c; + } + + function display_rows() { + // Query the post counts for this page + if ( ! $this->is_site_users ) + $post_counts = count_many_users_posts( array_keys( $this->items ) ); + + $style = ''; + foreach ( $this->items as $userid => $user_object ) { + $role = reset( $user_object->roles ); + + if ( is_multisite() && empty( $role ) ) + continue; + + $style = ( ' class="alternate"' == $style ) ? '' : ' class="alternate"'; + echo "\n\t", $this->single_row( $user_object, $style, $role, isset( $post_counts ) ? $post_counts[ $userid ] : 0 ); + } + } + + /** + * Generate HTML for a single row on the users.php admin panel. + * + * @since 2.1.0 + * + * @param object $user_object + * @param string $style Optional. Attributes added to the TR element. Must be sanitized. + * @param string $role Key for the $wp_roles array. + * @param int $numposts Optional. Post count to display for this user. Defaults to zero, as in, a new user has made zero posts. + * @return string + */ + function single_row( $user_object, $style = '', $role = '', $numposts = 0 ) { + global $wp_roles; + + if ( !( is_object( $user_object ) && is_a( $user_object, 'WP_User' ) ) ) + $user_object = new WP_User( (int) $user_object ); + $user_object = sanitize_user_object( $user_object, 'display' ); + $email = $user_object->user_email; + + if ( $this->is_site_users ) + $url = "site-users.php?id={$this->site_id}&"; + else + $url = 'users.php?'; + + $checkbox = ''; + // Check if the user for this row is editable + if ( current_user_can( 'list_users' ) ) { + // Set up the user editing link + // TODO: make profile/user-edit determination a separate function + if ( get_current_user_id() == $user_object->ID ) { + $edit_link = 'profile.php'; + } else { + $edit_link = esc_url( add_query_arg( 'wp_http_referer', urlencode( stripslashes( $_SERVER['REQUEST_URI'] ) ), "user-edit.php?user_id=$user_object->ID" ) ); + } + + // Set up the hover actions for this user + $actions = array(); + + if ( current_user_can( 'edit_user', $user_object->ID ) ) { + $edit = "$user_object->user_login
"; + $actions['edit'] = '' . __( 'Edit' ) . ''; + } else { + $edit = "$user_object->user_login
"; + } + + if ( !is_multisite() && get_current_user_id() != $user_object->ID && current_user_can( 'delete_user', $user_object->ID ) ) + $actions['delete'] = "" . __( 'Delete' ) . ""; + if ( is_multisite() && get_current_user_id() != $user_object->ID && current_user_can( 'remove_user', $user_object->ID ) ) + $actions['remove'] = "" . __( 'Remove' ) . ""; + $actions = apply_filters( 'user_row_actions', $actions, $user_object ); + $edit .= $this->row_actions( $actions ); + + // Set up the checkbox ( because the user is editable, otherwise its empty ) + $checkbox = ""; + + } else { + $edit = '' . $user_object->user_login . ''; + } + $role_name = isset( $wp_roles->role_names[$role] ) ? translate_user_role( $wp_roles->role_names[$role] ) : __( 'None' ); + $avatar = get_avatar( $user_object->ID, 32 ); + + $r = ""; + + list( $columns, $hidden ) = $this->get_column_info(); + + foreach ( $columns as $column_name => $column_display_name ) { + $class = "class=\"$column_name column-$column_name\""; + + $style = ''; + if ( in_array( $column_name, $hidden ) ) + $style = ' style="display:none;"'; + + $attributes = "$class$style"; + + switch ( $column_name ) { + case 'cb': + $r .= "$checkbox"; + break; + case 'username': + $r .= "$avatar $edit"; + break; + case 'name': + $r .= "$user_object->first_name $user_object->last_name"; + break; + case 'email': + $r .= "$email"; + break; + case 'role': + $r .= "$role_name"; + break; + case 'posts': + $attributes = 'class="posts column-posts num"' . $style; + $r .= ""; + if ( $numposts > 0 ) { + $r .= ""; + $r .= $numposts; + $r .= ''; + } else { + $r .= 0; + } + $r .= ""; + break; + default: + $r .= ""; + $r .= apply_filters( 'manage_users_custom_column', '', $column_name, $user_object->ID ); + $r .= ""; + } + } + $r .= ''; + + return $r; + } +} + +?> diff --git a/src/wp-admin/includes/comment.php b/src/wp-admin/includes/comment.php new file mode 100644 index 0000000..d731130 --- /dev/null +++ b/src/wp-admin/includes/comment.php @@ -0,0 +1,159 @@ +get_var( $wpdb->prepare("SELECT comment_post_ID FROM $wpdb->comments + WHERE comment_author = %s AND comment_date = %s", $comment_author, $comment_date) ); +} + +/** + * Update a comment with values provided in $_POST. + * + * @since 2.0.0 + */ +function edit_comment() { + + if ( ! current_user_can( 'edit_comment', (int) $_POST['comment_ID'] ) ) + wp_die ( __( 'You are not allowed to edit comments on this post.' ) ); + + $_POST['comment_author'] = $_POST['newcomment_author']; + $_POST['comment_author_email'] = $_POST['newcomment_author_email']; + $_POST['comment_author_url'] = $_POST['newcomment_author_url']; + $_POST['comment_approved'] = $_POST['comment_status']; + $_POST['comment_content'] = $_POST['content']; + $_POST['comment_ID'] = (int) $_POST['comment_ID']; + + foreach ( array ('aa', 'mm', 'jj', 'hh', 'mn') as $timeunit ) { + if ( !empty( $_POST['hidden_' . $timeunit] ) && $_POST['hidden_' . $timeunit] != $_POST[$timeunit] ) { + $_POST['edit_date'] = '1'; + break; + } + } + + if ( !empty ( $_POST['edit_date'] ) ) { + $aa = $_POST['aa']; + $mm = $_POST['mm']; + $jj = $_POST['jj']; + $hh = $_POST['hh']; + $mn = $_POST['mn']; + $ss = $_POST['ss']; + $jj = ($jj > 31 ) ? 31 : $jj; + $hh = ($hh > 23 ) ? $hh -24 : $hh; + $mn = ($mn > 59 ) ? $mn -60 : $mn; + $ss = ($ss > 59 ) ? $ss -60 : $ss; + $_POST['comment_date'] = "$aa-$mm-$jj $hh:$mn:$ss"; + } + + wp_update_comment( $_POST ); +} + +/** + * {@internal Missing Short Description}} + * + * @since 2.0.0 + * + * @param int $id ID of comment to retrieve + * @return bool|object Comment if found. False on failure. + */ +function get_comment_to_edit( $id ) { + if ( !$comment = get_comment($id) ) + return false; + + $comment->comment_ID = (int) $comment->comment_ID; + $comment->comment_post_ID = (int) $comment->comment_post_ID; + + $comment->comment_content = format_to_edit( $comment->comment_content ); + $comment->comment_content = apply_filters( 'comment_edit_pre', $comment->comment_content); + + $comment->comment_author = format_to_edit( $comment->comment_author ); + $comment->comment_author_email = format_to_edit( $comment->comment_author_email ); + $comment->comment_author_url = format_to_edit( $comment->comment_author_url ); + $comment->comment_author_url = esc_url($comment->comment_author_url); + + return $comment; +} + +/** + * Get the number of pending comments on a post or posts + * + * @since 2.3.0 + * @uses $wpdb + * + * @param int|array $post_id Either a single Post ID or an array of Post IDs + * @return int|array Either a single Posts pending comments as an int or an array of ints keyed on the Post IDs + */ +function get_pending_comments_num( $post_id ) { + global $wpdb; + + $single = false; + if ( !is_array($post_id) ) { + $post_id_array = (array) $post_id; + $single = true; + } else { + $post_id_array = $post_id; + } + $post_id_array = array_map('intval', $post_id_array); + $post_id_in = "'" . implode("', '", $post_id_array) . "'"; + + $pending = $wpdb->get_results( "SELECT comment_post_ID, COUNT(comment_ID) as num_comments FROM $wpdb->comments WHERE comment_post_ID IN ( $post_id_in ) AND comment_approved = '0' GROUP BY comment_post_ID", ARRAY_A ); + + if ( $single ) { + if ( empty($pending) ) + return 0; + else + return absint($pending[0]['num_comments']); + } + + $pending_keyed = array(); + + // Default to zero pending for all posts in request + foreach ( $post_id_array as $id ) + $pending_keyed[$id] = 0; + + if ( !empty($pending) ) + foreach ( $pending as $pend ) + $pending_keyed[$pend['comment_post_ID']] = absint($pend['num_comments']); + + return $pending_keyed; +} + +/** + * Add avatars to relevant places in admin, or try to. + * + * @since 2.5.0 + * @uses $comment + * + * @param string $name User name. + * @return string Avatar with Admin name. + */ +function floated_admin_avatar( $name ) { + global $comment; + $avatar = get_avatar( $comment, 32 ); + return "$avatar $name"; +} + +function enqueue_comment_hotkeys_js() { + if ( 'true' == get_user_option( 'comment_shortcuts' ) ) + wp_enqueue_script( 'jquery-table-hotkeys' ); +} +?> diff --git a/src/wp-admin/includes/continents-cities.php b/src/wp-admin/includes/continents-cities.php new file mode 100644 index 0000000..0ebc4f3 --- /dev/null +++ b/src/wp-admin/includes/continents-cities.php @@ -0,0 +1,493 @@ + 5, + ); + } + $recent_comments_title = __( 'Recent Comments' ); + wp_add_dashboard_widget( 'dashboard_recent_comments', $recent_comments_title, 'wp_dashboard_recent_comments', 'wp_dashboard_recent_comments_control' ); + } + + // Incoming Links Widget + if ( is_blog_admin() && current_user_can('publish_posts') ) { + if ( !isset( $widget_options['dashboard_incoming_links'] ) || !isset( $widget_options['dashboard_incoming_links']['home'] ) || $widget_options['dashboard_incoming_links']['home'] != get_option('home') ) { + $update = true; + $num_items = isset($widget_options['dashboard_incoming_links']['items']) ? $widget_options['dashboard_incoming_links']['items'] : 10; + $widget_options['dashboard_incoming_links'] = array( + 'home' => get_option('home'), + 'link' => apply_filters( 'dashboard_incoming_links_link', 'http://blogsearch.google.com/blogsearch?scoring=d&partner=wordpress&q=link:' . trailingslashit( get_option('home') ) ), + 'url' => isset($widget_options['dashboard_incoming_links']['url']) ? apply_filters( 'dashboard_incoming_links_feed', $widget_options['dashboard_incoming_links']['url'] ) : apply_filters( 'dashboard_incoming_links_feed', 'http://blogsearch.google.com/blogsearch_feeds?scoring=d&ie=utf-8&num=' . $num_items . '&output=rss&partner=wordpress&q=link:' . trailingslashit( get_option('home') ) ), + 'items' => $num_items, + 'show_date' => isset($widget_options['dashboard_incoming_links']['show_date']) ? $widget_options['dashboard_incoming_links']['show_date'] : false + ); + } + wp_add_dashboard_widget( 'dashboard_incoming_links', __( 'Incoming Links' ), 'wp_dashboard_incoming_links', 'wp_dashboard_incoming_links_control' ); + } + + // WP Plugins Widget + if ( ( ! is_multisite() && is_blog_admin() && current_user_can( 'install_plugins' ) ) || ( is_network_admin() && current_user_can( 'manage_network_plugins' ) && current_user_can( 'install_plugins' ) ) ) + wp_add_dashboard_widget( 'dashboard_plugins', __( 'Plugins' ), 'wp_dashboard_plugins' ); + + // QuickPress Widget + if ( is_blog_admin() && current_user_can('edit_posts') ) + wp_add_dashboard_widget( 'dashboard_quick_press', __( 'QuickPress' ), 'wp_dashboard_quick_press' ); + + // Recent Drafts + if ( is_blog_admin() && current_user_can('edit_posts') ) + wp_add_dashboard_widget( 'dashboard_recent_drafts', __('Recent Drafts'), 'wp_dashboard_recent_drafts' ); + + // Primary feed (Dev Blog) Widget + if ( !isset( $widget_options['dashboard_primary'] ) ) { + $update = true; + $widget_options['dashboard_primary'] = array( + 'link' => apply_filters( 'dashboard_primary_link', __( 'http://wordpress.org/news/' ) ), + 'url' => apply_filters( 'dashboard_primary_feed', __( 'http://wordpress.org/news/feed/' ) ), + 'title' => apply_filters( 'dashboard_primary_title', __( 'WordPress Blog' ) ), + 'items' => 2, + 'show_summary' => 1, + 'show_author' => 0, + 'show_date' => 1, + ); + } + wp_add_dashboard_widget( 'dashboard_primary', $widget_options['dashboard_primary']['title'], 'wp_dashboard_primary', 'wp_dashboard_primary_control' ); + + // Secondary Feed (Planet) Widget + if ( !isset( $widget_options['dashboard_secondary'] ) ) { + $update = true; + $widget_options['dashboard_secondary'] = array( + 'link' => apply_filters( 'dashboard_secondary_link', __( 'http://planet.wordpress.org/' ) ), + 'url' => apply_filters( 'dashboard_secondary_feed', __( 'http://planet.wordpress.org/feed/' ) ), + 'title' => apply_filters( 'dashboard_secondary_title', __( 'Other WordPress News' ) ), + 'items' => 5, + 'show_summary' => 0, + 'show_author' => 0, + 'show_date' => 0, + ); + } + wp_add_dashboard_widget( 'dashboard_secondary', $widget_options['dashboard_secondary']['title'], 'wp_dashboard_secondary', 'wp_dashboard_secondary_control' ); + + // Hook to register new widgets + // Filter widget order + if ( is_network_admin() ) { + do_action( 'wp_network_dashboard_setup' ); + $dashboard_widgets = apply_filters( 'wp_network_dashboard_widgets', array() ); + } elseif ( is_user_admin() ) { + do_action( 'wp_user_dashboard_setup' ); + $dashboard_widgets = apply_filters( 'wp_user_dashboard_widgets', array() ); + } else { + do_action( 'wp_dashboard_setup' ); + $dashboard_widgets = apply_filters( 'wp_dashboard_widgets', array() ); + } + + foreach ( $dashboard_widgets as $widget_id ) { + $name = empty( $wp_registered_widgets[$widget_id]['all_link'] ) ? $wp_registered_widgets[$widget_id]['name'] : $wp_registered_widgets[$widget_id]['name'] . " " . __('View all') . ''; + wp_add_dashboard_widget( $widget_id, $name, $wp_registered_widgets[$widget_id]['callback'], $wp_registered_widget_controls[$widget_id]['callback'] ); + } + + if ( 'POST' == $_SERVER['REQUEST_METHOD'] && isset($_POST['widget_id']) ) { + ob_start(); // hack - but the same hack wp-admin/widgets.php uses + wp_dashboard_trigger_widget_control( $_POST['widget_id'] ); + ob_end_clean(); + wp_redirect( remove_query_arg( 'edit' ) ); + exit; + } + + if ( $update ) + update_option( 'dashboard_widget_options', $widget_options ); + + do_action('do_meta_boxes', $screen->id, 'normal', ''); + do_action('do_meta_boxes', $screen->id, 'side', ''); +} + +function wp_add_dashboard_widget( $widget_id, $widget_name, $callback, $control_callback = null ) { + $screen = get_current_screen(); + global $wp_dashboard_control_callbacks; + + if ( $control_callback && current_user_can( 'edit_dashboard' ) && is_callable( $control_callback ) ) { + $wp_dashboard_control_callbacks[$widget_id] = $control_callback; + if ( isset( $_GET['edit'] ) && $widget_id == $_GET['edit'] ) { + list($url) = explode( '#', add_query_arg( 'edit', false ), 2 ); + $widget_name .= ' ' . __( 'Cancel' ) . ''; + $callback = '_wp_dashboard_control_callback'; + } else { + list($url) = explode( '#', add_query_arg( 'edit', $widget_id ), 2 ); + $widget_name .= ' ' . __( 'Configure' ) . ''; + } + } + + if ( is_blog_admin () ) + $side_widgets = array('dashboard_quick_press', 'dashboard_recent_drafts', 'dashboard_primary', 'dashboard_secondary'); + else if (is_network_admin() ) + $side_widgets = array('dashboard_primary', 'dashboard_secondary'); + else + $side_widgets = array(); + + $location = 'normal'; + if ( in_array($widget_id, $side_widgets) ) + $location = 'side'; + + $priority = 'core'; + if ( 'dashboard_browser_nag' === $widget_id ) + $priority = 'high'; + + add_meta_box( $widget_id, $widget_name, $callback, $screen->id, $location, $priority ); +} + +function _wp_dashboard_control_callback( $dashboard, $meta_box ) { + echo '
'; + wp_dashboard_trigger_widget_control( $meta_box['id'] ); + echo ''; + submit_button( __('Submit') ); + echo '
'; +} + +/** + * Displays the dashboard. + * + * @since 2.5.0 + */ +function wp_dashboard() { + global $screen_layout_columns; + + $screen = get_current_screen(); + + $hide2 = $hide3 = $hide4 = ''; + switch ( $screen_layout_columns ) { + case 4: + $width = 'width:24.5%;'; + break; + case 3: + $width = 'width:32.67%;'; + $hide4 = 'display:none;'; + break; + case 2: + $width = 'width:49%;'; + $hide3 = $hide4 = 'display:none;'; + break; + default: + $width = 'width:98%;'; + $hide2 = $hide3 = $hide4 = 'display:none;'; + } +?> +
+\n"; + do_meta_boxes( $screen->id, 'normal', '' ); + + echo "\t
\n"; + do_meta_boxes( $screen->id, 'side', '' ); + + echo "\t
\n"; + do_meta_boxes( $screen->id, 'column3', '' ); + + echo "\t
\n"; + do_meta_boxes( $screen->id, 'column4', '' ); +?> +
+ +
+

+ +

+
+ +'; + echo "\n\t".'

' . __('Content') . '

'."\n\t".''; + echo "\n\t".''; + + // Posts + $num = number_format_i18n( $num_posts->publish ); + $text = _n( 'Post', 'Posts', intval($num_posts->publish) ); + if ( current_user_can( 'edit_posts' ) ) { + $num = "$num"; + $text = "$text"; + } + echo ''; + echo ''; + + echo ''; + /* TODO: Show status breakdown on hover + if ( $can_edit_pages && !empty($num_pages->publish) ) { // how many pages is not exposed in feeds. Don't show if !current_user_can + $post_type_texts[] = ''.sprintf( _n( '%s page', '%s pages', $num_pages->publish ), number_format_i18n( $num_pages->publish ) ).''; + } + if ( $can_edit_posts && !empty($num_posts->draft) ) { + $post_type_texts[] = ''.sprintf( _n( '%s draft', '%s drafts', $num_posts->draft ), number_format_i18n( $num_posts->draft ) ).''; + } + if ( $can_edit_posts && !empty($num_posts->future) ) { + $post_type_texts[] = ''.sprintf( _n( '%s scheduled post', '%s scheduled posts', $num_posts->future ), number_format_i18n( $num_posts->future ) ).''; + } + if ( current_user_can('publish_posts') && !empty($num_posts->pending) ) { + $pending_text = sprintf( _n( 'There is %2$s post pending your review.', 'There are %2$s posts pending your review.', $num_posts->pending ), 'edit.php?post_status=pending', number_format_i18n( $num_posts->pending ) ); + } else { + $pending_text = ''; + } + */ + + // Pages + $num = number_format_i18n( $num_pages->publish ); + $text = _n( 'Page', 'Pages', $num_pages->publish ); + if ( current_user_can( 'edit_pages' ) ) { + $num = "$num"; + $text = "$text"; + } + echo ''; + echo ''; + + echo ''; + + // Categories + $num = number_format_i18n( $num_cats ); + $text = _n( 'Category', 'Categories', $num_cats ); + if ( current_user_can( 'manage_categories' ) ) { + $num = "$num"; + $text = "$text"; + } + echo ''; + echo ''; + + echo ''; + + // Tags + $num = number_format_i18n( $num_tags ); + $text = _n( 'Tag', 'Tags', $num_tags ); + if ( current_user_can( 'manage_categories' ) ) { + $num = "$num"; + $text = "$text"; + } + echo ''; + echo ''; + + echo ""; + do_action('right_now_content_table_end'); + echo "\n\t
' . $num . '' . $text . '
' . $num . '' . $text . '
' . $num . '' . $text . '
' . $num . '' . $text . '
\n\t
"; + + + echo "\n\t".'
'; + echo "\n\t".'

' . __('Discussion') . '

'."\n\t".''; + echo "\n\t".''; + + // Total Comments + $num = '' . number_format_i18n($num_comm->total_comments) . ''; + $text = _n( 'Comment', 'Comments', $num_comm->total_comments ); + if ( current_user_can( 'moderate_comments' ) ) { + $num = '' . $num . ''; + $text = '' . $text . ''; + } + echo ''; + echo ''; + + echo ''; + + // Approved Comments + $num = '' . number_format_i18n($num_comm->approved) . ''; + $text = _nx( 'Approved', 'Approved', $num_comm->approved, 'Right Now' ); + if ( current_user_can( 'moderate_comments' ) ) { + $num = "$num"; + $text = "$text"; + } + echo ''; + echo ''; + + echo "\n\t"; + + // Pending Comments + $num = '' . number_format_i18n($num_comm->moderated) . ''; + $text = _n( 'Pending', 'Pending', $num_comm->moderated ); + if ( current_user_can( 'moderate_comments' ) ) { + $num = "$num"; + $text = "$text"; + } + echo ''; + echo ''; + + echo "\n\t"; + + // Spam Comments + $num = number_format_i18n($num_comm->spam); + $text = _nx( 'Spam', 'Spam', $num_comm->spam, 'comment' ); + if ( current_user_can( 'moderate_comments' ) ) { + $num = "$num"; + $text = "$text"; + } + echo ''; + echo ''; + + echo ""; + do_action('right_now_table_end'); + do_action('right_now_discussion_table_end'); + echo "\n\t
' . $num . '' . $text . '
' . $num . '' . $text . '
' . $num . '' . $text . '
' . $num . '' . $text . '
\n\t
"; + + echo "\n\t".'
'; + $ct = current_theme_info(); + + echo "\n\t

"; + if ( !empty($wp_registered_sidebars) ) { + $sidebars_widgets = wp_get_sidebars_widgets(); + $num_widgets = 0; + foreach ( (array) $sidebars_widgets as $k => $v ) { + if ( 'wp_inactive_widgets' == $k ) + continue; + if ( is_array($v) ) + $num_widgets = $num_widgets + count($v); + } + $num = number_format_i18n( $num_widgets ); + + $switch_themes = $ct->title; + if ( current_user_can( 'switch_themes') ) + $switch_themes = '' . $switch_themes . ''; + if ( current_user_can( 'edit_theme_options' ) ) { + printf(_n('Theme %1$s with %2$s Widget', 'Theme %1$s with %2$s Widgets', $num_widgets), $switch_themes, $num); + } else { + printf(_n('Theme %1$s with %2$s Widget', 'Theme %1$s with %2$s Widgets', $num_widgets), $switch_themes, $num); + } + } else { + if ( current_user_can( 'switch_themes' ) ) + printf( __('Theme %1$s'), $ct->title ); + else + printf( __('Theme %1$s'), $ct->title ); + } + echo '

'; + + // Check if search engines are blocked. + if ( !is_network_admin() && !is_user_admin() && current_user_can('manage_options') && '1' != get_option('blog_public') ) { + $title = apply_filters('privacy_on_link_title', __('Your site is asking search engines not to index its content') ); + $content = apply_filters('privacy_on_link_text', __('Search Engines Blocked') ); + + echo "

$content

"; + } + + update_right_now_message(); + + echo "\n\t".'
'; + do_action( 'rightnow_end' ); + do_action( 'activity_box_end' ); +} + +function wp_network_dashboard_right_now() { + $actions = array(); + if ( current_user_can('create_sites') ) + $actions['create-site'] = '' . __( 'Create a New Site' ) . ''; + if ( current_user_can('create_users') ) + $actions['create-user'] = '' . __( 'Create a New User' ) . ''; + + $c_users = get_user_count(); + $c_blogs = get_blog_count(); + + $user_text = sprintf( _n( '%s user', '%s users', $c_users ), number_format_i18n( $c_users ) ); + $blog_text = sprintf( _n( '%s site', '%s sites', $c_blogs ), number_format_i18n( $c_blogs ) ); + + $sentence = sprintf( __( 'You have %1$s and %2$s.' ), $blog_text, $user_text ); + + if ( $actions ) { + echo '
    '; + foreach ( $actions as $class => $action ) { + $actions[ $class ] = "\t
  • $action"; + } + echo implode( " |
  • \n", $actions ) . "\n"; + echo '
'; + } +?> +
+ +

+ + +
+

+ + 'submit_users' ) ); ?> +

+
+ +
+

+ + 'submit_sites' ) ); ?> +

+
+

' . __( 'Post published. View post | Edit post' ) . '

', esc_url( $view ), $edit ); + else + printf( '

' . __( 'Post submitted. Preview post | Edit post' ) . '

', esc_url( add_query_arg( 'preview', 1, $view ) ), $edit ); + } else { + printf( '

' . __( 'Draft saved. Preview post | Edit post' ) . '

', esc_url( add_query_arg( 'preview', 1, $view ) ), $edit ); + $drafts_query = new WP_Query( array( + 'post_type' => 'post', + 'post_status' => 'draft', + 'author' => $GLOBALS['current_user']->ID, + 'posts_per_page' => 1, + 'orderby' => 'modified', + 'order' => 'DESC' + ) ); + + if ( $drafts_query->posts ) + $drafts =& $drafts_query->posts; + } + printf('

' . __('You can also try %s, easy blogging from anywhere on the Web.') . '

', '' . __('Press This') . '' ); + $_REQUEST = array(); // hack for get_default_post_to_edit() + } + + /* Check if a new auto-draft (= no new post_ID) is needed or if the old can be used */ + $last_post_id = (int) get_user_option( 'dashboard_quick_press_last_post_id' ); // Get the last post_ID + if ( $last_post_id ) { + $post = get_post( $last_post_id ); + if ( empty( $post ) || $post->post_status != 'auto-draft' ) { // auto-draft doesn't exists anymore + $post = get_default_post_to_edit('post', true); + update_user_option( (int) $GLOBALS['current_user']->ID, 'dashboard_quick_press_last_post_id', (int) $post->ID ); // Save post_ID + } else { + $post->post_title = ''; // Remove the auto draft title + } + } else { + $post = get_default_post_to_edit('post', true); + update_user_option( (int) $GLOBALS['current_user']->ID, 'dashboard_quick_press_last_post_id', (int) $post->ID ); // Save post_ID + } + + $post_ID = (int) $post->ID; +?> + +
+

+
+ +
+ + +
+ +
+ + +

+
+ +
+ + + +

+
+ +
+ +

+ + + + + 'save-post', 'tabindex'=> 4 ) ); ?> + + + + + +
+

+ +
+ + 'post', + 'post_status' => 'draft', + 'author' => $GLOBALS['current_user']->ID, + 'posts_per_page' => 5, + 'orderby' => 'modified', + 'order' => 'DESC' + ) ); + $drafts =& $drafts_query->posts; + } + + if ( $drafts && is_array( $drafts ) ) { + $list = array(); + foreach ( $drafts as $draft ) { + $url = get_edit_post_link( $draft->ID ); + $title = _draft_or_post_title( $draft->ID ); + $item = "

" . esc_html($title) . " " . get_the_time( get_option( 'date_format' ), $draft ) . '

'; + if ( $the_content = preg_split( '#\s#', strip_tags( $draft->post_content ), 11, PREG_SPLIT_NO_EMPTY ) ) + $item .= '

' . join( ' ', array_slice( $the_content, 0, 10 ) ) . ( 10 < count( $the_content ) ? '…' : '' ) . '

'; + $list[] = $item; + } +?> +
    +
  • \n
  • ", $list ); ?>
  • +
+

+get_results( "SELECT * FROM $wpdb->comments c LEFT JOIN $wpdb->posts p ON c.comment_post_ID = p.ID WHERE p.post_status != 'trash' ORDER BY c.comment_date_gmt DESC LIMIT $start, 50" ) ) { + + foreach ( $possible as $comment ) { + if ( count( $comments ) >= $total_items ) + break; + if ( in_array( $comment->comment_approved, $allowed_states ) && current_user_can( 'read_post', $comment->comment_post_ID ) ) + $comments[] = $comment; + } + + $start = $start + 50; + } + + if ( $comments ) : +?> + +
+ + +
+ + + views(); ?> + + +

+ +comment_post_ID ); + $comment_post_title = strip_tags(get_the_title( $comment->comment_post_ID )); + $comment_post_link = "$comment_post_title"; + $comment_link = '#'; + + $actions_string = ''; + if ( current_user_can( 'edit_comment', $comment->comment_ID ) ) { + // preorder it: Approve | Reply | Edit | Spam | Trash + $actions = array( + 'approve' => '', 'unapprove' => '', + 'reply' => '', + 'edit' => '', + 'spam' => '', + 'trash' => '', 'delete' => '' + ); + + $del_nonce = esc_html( '_wpnonce=' . wp_create_nonce( "delete-comment_$comment->comment_ID" ) ); + $approve_nonce = esc_html( '_wpnonce=' . wp_create_nonce( "approve-comment_$comment->comment_ID" ) ); + + $approve_url = esc_url( "comment.php?action=approvecomment&p=$comment->comment_post_ID&c=$comment->comment_ID&$approve_nonce" ); + $unapprove_url = esc_url( "comment.php?action=unapprovecomment&p=$comment->comment_post_ID&c=$comment->comment_ID&$approve_nonce" ); + $spam_url = esc_url( "comment.php?action=spamcomment&p=$comment->comment_post_ID&c=$comment->comment_ID&$del_nonce" ); + $trash_url = esc_url( "comment.php?action=trashcomment&p=$comment->comment_post_ID&c=$comment->comment_ID&$del_nonce" ); + $delete_url = esc_url( "comment.php?action=deletecomment&p=$comment->comment_post_ID&c=$comment->comment_ID&$del_nonce" ); + + $actions['approve'] = "" . __( 'Approve' ) . ''; + $actions['unapprove'] = "" . __( 'Unapprove' ) . ''; + $actions['edit'] = "". __('Edit') . ''; + $actions['reply'] = '' . __('Reply') . ''; + $actions['spam'] = "" . /* translators: mark as spam link */ _x( 'Spam', 'verb' ) . ''; + if ( !EMPTY_TRASH_DAYS ) + $actions['delete'] = "" . __('Delete Permanently') . ''; + else + $actions['trash'] = "" . _x('Trash', 'verb') . ''; + + $actions = apply_filters( 'comment_row_actions', array_filter($actions), $comment ); + + $i = 0; + foreach ( $actions as $action => $link ) { + ++$i; + ( ( ('approve' == $action || 'unapprove' == $action) && 2 === $i ) || 1 === $i ) ? $sep = '' : $sep = ' | '; + + // Reply and quickedit need a hide-if-no-js span + if ( 'reply' == $action || 'quickedit' == $action ) + $action .= ' hide-if-no-js'; + + $actions_string .= "$sep$link"; + } + } + +?> + +
comment_ID) ) ); ?>> + comment_type || 'comment' == $comment->comment_type ) : ?> + + + +
+

+ ' . get_comment_author_link() . '', $comment_post_link.' '.$comment_link, ' ' . __( '[Pending]' ) . '' ); ?> +

+ + comment_type ) : + case 'pingback' : + $type = __( 'Pingback' ); + break; + case 'trackback' : + $type = __( 'Trackback' ); + break; + default : + $type = ucwords( $comment->comment_type ); + endswitch; + $type = esc_html( $type ); + ?> +
+ +

$type", $comment_post_link." ".$comment_link ); ?>

+

+ + +

+

+
+
+'; + echo '

'; +} + +function wp_dashboard_incoming_links() { + wp_dashboard_cached_rss_widget( 'dashboard_incoming_links', 'wp_dashboard_incoming_links_output' ); +} + +/** + * Display incoming links dashboard widget content. + * + * @since 2.5.0 + */ +function wp_dashboard_incoming_links_output() { + $widgets = get_option( 'dashboard_widget_options' ); + @extract( @$widgets['dashboard_incoming_links'], EXTR_SKIP ); + $rss = fetch_feed( $url ); + + if ( is_wp_error($rss) ) { + if ( is_admin() || current_user_can('manage_options') ) { + echo '

'; + printf(__('RSS Error: %s'), $rss->get_error_message()); + echo '

'; + } + return; + } + + if ( !$rss->get_item_quantity() ) { + echo '

' . __('This dashboard widget queries Google Blog Search so that when another blog links to your site it will show up here. It has found no incoming links… yet. It’s okay — there is no rush.') . "

\n"; + $rss->__destruct(); + unset($rss); + return; + } + + echo "
    \n"; + + if ( !isset($items) ) + $items = 10; + + foreach ( $rss->get_items(0, $items) as $item ) { + $publisher = ''; + $site_link = ''; + $link = ''; + $content = ''; + $date = ''; + $link = esc_url( strip_tags( $item->get_link() ) ); + + $author = $item->get_author(); + if ( $author ) { + $site_link = esc_url( strip_tags( $author->get_link() ) ); + + if ( !$publisher = esc_html( strip_tags( $author->get_name() ) ) ) + $publisher = __( 'Somebody' ); + } else { + $publisher = __( 'Somebody' ); + } + if ( $site_link ) + $publisher = "$publisher"; + else + $publisher = "$publisher"; + + $content = $item->get_content(); + $content = wp_html_excerpt($content, 50) . ' ...'; + + if ( $link ) + /* translators: incoming links feed, %1$s is other person, %3$s is content */ + $text = __( '%1$s linked here saying, "%3$s"' ); + else + /* translators: incoming links feed, %1$s is other person, %3$s is content */ + $text = __( '%1$s linked here saying, "%3$s"' ); + + if ( !empty($show_date) ) { + if ( !empty($show_author) || !empty($show_summary) ) + /* translators: incoming links feed, %4$s is the date */ + $text .= ' ' . __( 'on %4$s' ); + $date = esc_html( strip_tags( $item->get_date() ) ); + $date = strtotime( $date ); + $date = gmdate( get_option( 'date_format' ), $date ); + } + + echo "\t
  • " . sprintf( $text, $publisher, $link, $content, $date ) . "
  • \n"; + } + + echo "
\n"; + $rss->__destruct(); + unset($rss); +} + +function wp_dashboard_incoming_links_control() { + wp_dashboard_rss_control( 'dashboard_incoming_links', array( 'title' => false, 'show_summary' => false, 'show_author' => false ) ); +} + +function wp_dashboard_primary() { + wp_dashboard_cached_rss_widget( 'dashboard_primary', 'wp_dashboard_rss_output' ); +} + +function wp_dashboard_primary_control() { + wp_dashboard_rss_control( 'dashboard_primary' ); +} + +/** + * {@internal Missing Short Description}} + * + * @since 2.5.0 + * + * @param string $widget_id + */ +function wp_dashboard_rss_output( $widget_id ) { + $widgets = get_option( 'dashboard_widget_options' ); + echo '
'; + wp_widget_rss_output( $widgets[$widget_id] ); + echo "
"; +} + +function wp_dashboard_secondary() { + wp_dashboard_cached_rss_widget( 'dashboard_secondary', 'wp_dashboard_secondary_output' ); +} + +function wp_dashboard_secondary_control() { + wp_dashboard_rss_control( 'dashboard_secondary' ); +} + +/** + * Display secondary dashboard RSS widget feed. + * + * @since 2.5.0 + * + * @return unknown + */ +function wp_dashboard_secondary_output() { + $widgets = get_option( 'dashboard_widget_options' ); + @extract( @$widgets['dashboard_secondary'], EXTR_SKIP ); + $rss = @fetch_feed( $url ); + + if ( is_wp_error($rss) ) { + if ( is_admin() || current_user_can('manage_options') ) { + echo '

'; + printf(__('RSS Error: %s'), $rss->get_error_message()); + echo '

'; + } + } elseif ( !$rss->get_item_quantity() ) { + $rss->__destruct(); + unset($rss); + return false; + } else { + echo '
'; + wp_widget_rss_output( $rss, $widgets['dashboard_secondary'] ); + echo '
'; + $rss->__destruct(); + unset($rss); + } +} + +function wp_dashboard_plugins() { + wp_dashboard_cached_rss_widget( 'dashboard_plugins', 'wp_dashboard_plugins_output', array( + 'http://wordpress.org/extend/plugins/rss/browse/popular/', + 'http://wordpress.org/extend/plugins/rss/browse/new/', + 'http://wordpress.org/extend/plugins/rss/browse/updated/' + ) ); +} + +/** + * Display plugins most popular, newest plugins, and recently updated widget text. + * + * @since 2.5.0 + */ +function wp_dashboard_plugins_output() { + $popular = fetch_feed( 'http://wordpress.org/extend/plugins/rss/browse/popular/' ); + $new = fetch_feed( 'http://wordpress.org/extend/plugins/rss/browse/new/' ); + $updated = fetch_feed( 'http://wordpress.org/extend/plugins/rss/browse/updated/' ); + + if ( false === $plugin_slugs = get_transient( 'plugin_slugs' ) ) { + $plugin_slugs = array_keys( get_plugins() ); + set_transient( 'plugin_slugs', $plugin_slugs, 86400 ); + } + + foreach ( array( 'popular' => __('Most Popular'), 'new' => __('Newest Plugins'), 'updated' => __('Recently Updated') ) as $feed => $label ) { + if ( is_wp_error($$feed) || !$$feed->get_item_quantity() ) + continue; + + $items = $$feed->get_items(0, 5); + + // Pick a random, non-installed plugin + while ( true ) { + // Abort this foreach loop iteration if there's no plugins left of this type + if ( 0 == count($items) ) + continue 2; + + $item_key = array_rand($items); + $item = $items[$item_key]; + + list($link, $frag) = explode( '#', $item->get_link() ); + + $link = esc_url($link); + if ( preg_match( '|/([^/]+?)/?$|', $link, $matches ) ) + $slug = $matches[1]; + else { + unset( $items[$item_key] ); + continue; + } + + // Is this random plugin's slug already installed? If so, try again. + reset( $plugin_slugs ); + foreach ( $plugin_slugs as $plugin_slug ) { + if ( $slug == substr( $plugin_slug, 0, strlen( $slug ) ) ) { + unset( $items[$item_key] ); + continue 2; + } + } + + // If we get to this point, then the random plugin isn't installed and we can stop the while(). + break; + } + + // Eliminate some common badly formed plugin descriptions + while ( ( null !== $item_key = array_rand($items) ) && false !== strpos( $items[$item_key]->get_description(), 'Plugin Name:' ) ) + unset($items[$item_key]); + + if ( !isset($items[$item_key]) ) + continue; + + // current bbPress feed item titles are: user on "topic title" + if ( preg_match( '/"(.*)"/s', $item->get_title(), $matches ) ) + $title = $matches[1]; + else // but let's make it forward compatible if things change + $title = $item->get_title(); + $title = esc_html( $title ); + + $description = esc_html( strip_tags(@html_entity_decode($item->get_description(), ENT_QUOTES, get_option('blog_charset'))) ); + + $ilink = wp_nonce_url('plugin-install.php?tab=plugin-information&plugin=' . $slug, 'install-plugin_' . $slug) . + '&TB_iframe=true&width=600&height=800'; + + echo "

$label

\n"; + echo "
$title
 (" . __( 'Install' ) . ")\n"; + echo "

$description

\n"; + + $$feed->__destruct(); + unset($$feed); + } +} + +/** + * Checks to see if all of the feed url in $check_urls are cached. + * + * If $check_urls is empty, look for the rss feed url found in the dashboard + * widget optios of $widget_id. If cached, call $callback, a function that + * echoes out output for this widget. If not cache, echo a "Loading..." stub + * which is later replaced by AJAX call (see top of /wp-admin/index.php) + * + * @since 2.5.0 + * + * @param string $widget_id + * @param callback $callback + * @param array $check_urls RSS feeds + * @return bool False on failure. True on success. + */ +function wp_dashboard_cached_rss_widget( $widget_id, $callback, $check_urls = array() ) { + $loading = '

' . __( 'Loading…' ) . '

' . __( 'This widget requires JavaScript.' ) . '

'; + $doing_ajax = ( defined('DOING_AJAX') && DOING_AJAX ); + + if ( empty($check_urls) ) { + $widgets = get_option( 'dashboard_widget_options' ); + if ( empty($widgets[$widget_id]['url']) && ! $doing_ajax ) { + echo $loading; + return false; + } + $check_urls = array( $widgets[$widget_id]['url'] ); + } + + $cache_key = 'dash_' . md5( $widget_id ); + if ( false !== ( $output = get_transient( $cache_key ) ) ) { + echo $output; + return true; + } + + if ( ! $doing_ajax ) { + echo $loading; + return false; + } + + if ( $callback && is_callable( $callback ) ) { + $args = array_slice( func_get_args(), 2 ); + array_unshift( $args, $widget_id ); + ob_start(); + call_user_func_array( $callback, $args ); + set_transient( $cache_key, ob_get_flush(), 43200); // Default lifetime in cache of 12 hours (same as the feeds) + } + + return true; +} + +/* Dashboard Widgets Controls */ + +// Calls widget_control callback +/** + * Calls widget control callback. + * + * @since 2.5.0 + * + * @param int $widget_control_id Registered Widget ID. + */ +function wp_dashboard_trigger_widget_control( $widget_control_id = false ) { + global $wp_dashboard_control_callbacks; + + if ( is_scalar($widget_control_id) && $widget_control_id && isset($wp_dashboard_control_callbacks[$widget_control_id]) && is_callable($wp_dashboard_control_callbacks[$widget_control_id]) ) { + call_user_func( $wp_dashboard_control_callbacks[$widget_control_id], '', array( 'id' => $widget_control_id, 'callback' => $wp_dashboard_control_callbacks[$widget_control_id] ) ); + } +} + +/** + * The RSS dashboard widget control. + * + * Sets up $args to be used as input to wp_widget_rss_form(). Handles POST data + * from RSS-type widgets. + * + * @since 2.5.0 + * + * @param string $widget_id + * @param array $form_inputs + */ +function wp_dashboard_rss_control( $widget_id, $form_inputs = array() ) { + if ( !$widget_options = get_option( 'dashboard_widget_options' ) ) + $widget_options = array(); + + if ( !isset($widget_options[$widget_id]) ) + $widget_options[$widget_id] = array(); + + $number = 1; // Hack to use wp_widget_rss_form() + $widget_options[$widget_id]['number'] = $number; + + if ( 'POST' == $_SERVER['REQUEST_METHOD'] && isset($_POST['widget-rss'][$number]) ) { + $_POST['widget-rss'][$number] = stripslashes_deep( $_POST['widget-rss'][$number] ); + $widget_options[$widget_id] = wp_widget_rss_process( $_POST['widget-rss'][$number] ); + // title is optional. If black, fill it if possible + if ( !$widget_options[$widget_id]['title'] && isset($_POST['widget-rss'][$number]['title']) ) { + $rss = fetch_feed($widget_options[$widget_id]['url']); + if ( is_wp_error($rss) ) { + $widget_options[$widget_id]['title'] = htmlentities(__('Unknown Feed')); + } else { + $widget_options[$widget_id]['title'] = htmlentities(strip_tags($rss->get_title())); + $rss->__destruct(); + unset($rss); + } + } + update_option( 'dashboard_widget_options', $widget_options ); + $cache_key = 'dash_' . md5( $widget_id ); + delete_transient( $cache_key ); + } + + wp_widget_rss_form( $widget_options[$widget_id], $form_inputs ); +} + +// Display File upload quota on dashboard +function wp_dashboard_quota() { + if ( !is_multisite() || !current_user_can('upload_files') || get_site_option( 'upload_space_check_disabled' ) ) + return true; + + $quota = get_space_allowed(); + $used = get_dirsize( BLOGUPLOADDIR ) / 1024 / 1024; + + if ( $used > $quota ) + $percentused = '100'; + else + $percentused = ( $used / $quota ) * 100; + $used_color = ( $percentused >= 70 ) ? ' spam' : ''; + $used = round( $used, 2 ); + $percentused = number_format( $percentused ); + + ?> +

+
+ + + + + +
%2$sMB' ), esc_url( admin_url( 'upload.php' ) ), $quota ); ?>
+
+
+ + + + + +
%2$sMB (%3$s%%)' ), esc_url( admin_url( 'upload.php' ) ), $used, $percentused ); ?>
+
+
+ %s. Using an outdated browser makes your computer unsafe. For the best WordPress experience, please update your browser." ), esc_attr( $response['update_url'] ), esc_html( $response['name'] ) ); + } else { + $msg = sprintf( __( "It looks like you're using an old version of %s. For the best WordPress experience, please update your browser." ), esc_attr( $response['update_url'] ), esc_html( $response['name'] ) ); + } + + $browser_nag_class = ''; + if ( !empty( $response['img_src'] ) ) { + $img_src = ( is_ssl() && ! empty( $response['img_src_ssl'] ) )? $response['img_src_ssl'] : $response['img_src']; + + $notice .= '
'; + $browser_nag_class = ' has-browser-icon'; + } + $notice .= "

{$msg}

"; + $notice .= sprintf( __( '

Update %2$s or learn how to browse happy

' ), esc_attr( $response['update_url'] ), esc_html( $response['name'] ), 'http://browsehappy.com/' ); + $notice .= '

' . __( 'Dismiss' ) . '

'; + $notice .= '
'; + } + + echo apply_filters( 'browse-happy-notice', $notice, $response ); +} + +function dashboard_browser_nag_class( $classes ) { + $response = wp_check_browser_version(); + + if ( $response && $response['insecure'] ) + $classes[] = 'browser-insecure'; + + return $classes; +} + +/** + * Check if the user needs a browser update + * + * @since 3.2.0 + * + * @return array|bool False on failure, array of browser data on success. + */ +function wp_check_browser_version() { + if ( empty( $_SERVER['HTTP_USER_AGENT'] ) ) + return false; + + $key = md5( $_SERVER['HTTP_USER_AGENT'] ); + + if ( false === ($response = get_site_transient('browser_' . $key) ) ) { + global $wp_version; + + $options = array( + 'body' => array( 'useragent' => $_SERVER['HTTP_USER_AGENT'] ), + 'user-agent' => 'WordPress/' . $wp_version . '; ' . get_bloginfo( 'url' ) + ); + + $response = wp_remote_post( 'http://api.wordpress.org/core/browse-happy/1.0/', $options ); + + if ( is_wp_error( $response ) || 200 != wp_remote_retrieve_response_code( $response ) ) + return false; + + /** + * Response should be an array with: + * 'name' - string - A user friendly browser name + * 'version' - string - The most recent version of the browser + * 'current_version' - string - The version of the browser the user is using + * 'upgrade' - boolean - Whether the browser needs an upgrade + * 'insecure' - boolean - Whether the browser is deemed insecure + * 'upgrade_url' - string - The url to visit to upgrade + * 'img_src' - string - An image representing the browser + * 'img_src_ssl' - string - An image (over SSL) representing the browser + */ + $response = unserialize( wp_remote_retrieve_body( $response ) ); + + if ( ! $response ) + return false; + + set_site_transient( 'browser_' . $key, $response, 604800 ); // cache for 1 week + } + + return $response; +} + +/** + * Empty function usable by plugins to output empty dashboard widget (to be populated later by JS). + */ +function wp_dashboard_empty() {} + +?> diff --git a/src/wp-admin/includes/deprecated.php b/src/wp-admin/includes/deprecated.php new file mode 100644 index 0000000..3e02dbc --- /dev/null +++ b/src/wp-admin/includes/deprecated.php @@ -0,0 +1,703 @@ + 0) ); + + if ( $categories ) { + foreach ( $categories as $category ) { + if ( $currentcat != $category->term_id && $parent == $category->parent) { + $pad = str_repeat( '– ', $level ); + $category->name = esc_html( $category->name ); + echo "\n\t"; + wp_dropdown_cats( $currentcat, $currentparent, $category->term_id, $level +1, $categories ); + } + } + } else { + return false; + } +} + +/** + * Register a setting and its sanitization callback + * + * @since 2.7.0 + * @deprecated 3.0.0 + * @deprecated Use register_setting() + * @see register_setting() + * + * @param string $option_group A settings group name. Should correspond to a whitelisted option key name. + * Default whitelisted option key names include "general," "discussion," and "reading," among others. + * @param string $option_name The name of an option to sanitize and save. + * @param unknown_type $sanitize_callback A callback function that sanitizes the option's value. + * @return unknown + */ +function add_option_update_handler( $option_group, $option_name, $sanitize_callback = '' ) { + _deprecated_function( __FUNCTION__, '3.0', 'register_setting()' ); + return register_setting( $option_group, $option_name, $sanitize_callback ); +} + +/** + * Unregister a setting + * + * @since 2.7.0 + * @deprecated 3.0.0 + * @deprecated Use unregister_setting() + * @see unregister_setting() + * + * @param unknown_type $option_group + * @param unknown_type $option_name + * @param unknown_type $sanitize_callback + * @return unknown + */ +function remove_option_update_handler( $option_group, $option_name, $sanitize_callback = '' ) { + _deprecated_function( __FUNCTION__, '3.0', 'unregister_setting()' ); + return unregister_setting( $option_group, $option_name, $sanitize_callback ); +} + +/** + * Determines the language to use for CodePress syntax highlighting. + * + * @since 2.8.0 + * @deprecated 3.0.0 + * + * @param string $filename +**/ +function codepress_get_lang( $filename ) { + _deprecated_function( __FUNCTION__, '3.0' ); + return; +} + +/** + * Adds Javascript required to make CodePress work on the theme/plugin editors. + * + * @since 2.8.0 + * @deprecated 3.0.0 +**/ +function codepress_footer_js() { + _deprecated_function( __FUNCTION__, '3.0' ); + return; +} + +/** + * Determine whether to use CodePress. + * + * @since 2.8 + * @deprecated 3.0.0 +**/ +function use_codepress() { + _deprecated_function( __FUNCTION__, '3.0' ); + return; +} + + +/** + * @deprecated 3.1.0 + * + * @return array List of user IDs. + */ +function get_author_user_ids() { + _deprecated_function( __FUNCTION__, '3.1', 'get_users()' ); + + global $wpdb; + if ( !is_multisite() ) + $level_key = $wpdb->get_blog_prefix() . 'user_level'; + else + $level_key = $wpdb->get_blog_prefix() . 'capabilities'; // wpmu site admins don't have user_levels + + return $wpdb->get_col( $wpdb->prepare("SELECT user_id FROM $wpdb->usermeta WHERE meta_key = %s AND meta_value != '0'", $level_key) ); +} + +/** + * @deprecated 3.1.0 + * + * @param int $user_id User ID. + * @return array|bool List of editable authors. False if no editable users. + */ +function get_editable_authors( $user_id ) { + _deprecated_function( __FUNCTION__, '3.1', 'get_users()' ); + + global $wpdb; + + $editable = get_editable_user_ids( $user_id ); + + if ( !$editable ) { + return false; + } else { + $editable = join(',', $editable); + $authors = $wpdb->get_results( "SELECT * FROM $wpdb->users WHERE ID IN ($editable) ORDER BY display_name" ); + } + + return apply_filters('get_editable_authors', $authors); +} + +/** + * @deprecated 3.1.0 + * + * @param int $user_id User ID. + * @param bool $exclude_zeros Optional, default is true. Whether to exclude zeros. + * @return unknown + */ +function get_editable_user_ids( $user_id, $exclude_zeros = true, $post_type = 'post' ) { + _deprecated_function( __FUNCTION__, '3.1', 'get_users()' ); + + global $wpdb; + + $user = new WP_User( $user_id ); + $post_type_obj = get_post_type_object($post_type); + + if ( ! $user->has_cap($post_type_obj->cap->edit_others_posts) ) { + if ( $user->has_cap($post_type_obj->cap->edit_posts) || ! $exclude_zeros ) + return array($user->id); + else + return array(); + } + + if ( !is_multisite() ) + $level_key = $wpdb->get_blog_prefix() . 'user_level'; + else + $level_key = $wpdb->get_blog_prefix() . 'capabilities'; // wpmu site admins don't have user_levels + + $query = $wpdb->prepare("SELECT user_id FROM $wpdb->usermeta WHERE meta_key = %s", $level_key); + if ( $exclude_zeros ) + $query .= " AND meta_value != '0'"; + + return $wpdb->get_col( $query ); +} + +/** + * @deprecated 3.1.0 + */ +function get_nonauthor_user_ids() { + _deprecated_function( __FUNCTION__, '3.1', 'get_users()' ); + + global $wpdb; + + if ( !is_multisite() ) + $level_key = $wpdb->get_blog_prefix() . 'user_level'; + else + $level_key = $wpdb->get_blog_prefix() . 'capabilities'; // wpmu site admins don't have user_levels + + return $wpdb->get_col( $wpdb->prepare("SELECT user_id FROM $wpdb->usermeta WHERE meta_key = %s AND meta_value = '0'", $level_key) ); +} + +if ( !class_exists('WP_User_Search') ) : +/** + * WordPress User Search class. + * + * @since 2.1.0 + * @deprecated 3.1.0 + */ +class WP_User_Search { + + /** + * {@internal Missing Description}} + * + * @since 2.1.0 + * @access private + * @var unknown_type + */ + var $results; + + /** + * {@internal Missing Description}} + * + * @since 2.1.0 + * @access private + * @var unknown_type + */ + var $search_term; + + /** + * Page number. + * + * @since 2.1.0 + * @access private + * @var int + */ + var $page; + + /** + * Role name that users have. + * + * @since 2.5.0 + * @access private + * @var string + */ + var $role; + + /** + * Raw page number. + * + * @since 2.1.0 + * @access private + * @var int|bool + */ + var $raw_page; + + /** + * Amount of users to display per page. + * + * @since 2.1.0 + * @access public + * @var int + */ + var $users_per_page = 50; + + /** + * {@internal Missing Description}} + * + * @since 2.1.0 + * @access private + * @var unknown_type + */ + var $first_user; + + /** + * {@internal Missing Description}} + * + * @since 2.1.0 + * @access private + * @var int + */ + var $last_user; + + /** + * {@internal Missing Description}} + * + * @since 2.1.0 + * @access private + * @var string + */ + var $query_limit; + + /** + * {@internal Missing Description}} + * + * @since 3.0.0 + * @access private + * @var string + */ + var $query_orderby; + + /** + * {@internal Missing Description}} + * + * @since 3.0.0 + * @access private + * @var string + */ + var $query_from; + + /** + * {@internal Missing Description}} + * + * @since 3.0.0 + * @access private + * @var string + */ + var $query_where; + + /** + * {@internal Missing Description}} + * + * @since 2.1.0 + * @access private + * @var int + */ + var $total_users_for_query = 0; + + /** + * {@internal Missing Description}} + * + * @since 2.1.0 + * @access private + * @var bool + */ + var $too_many_total_users = false; + + /** + * {@internal Missing Description}} + * + * @since 2.1.0 + * @access private + * @var unknown_type + */ + var $search_errors; + + /** + * {@internal Missing Description}} + * + * @since 2.7.0 + * @access private + * @var unknown_type + */ + var $paging_text; + + /** + * PHP4 Constructor - Sets up the object properties. + * + * @since 2.1.0 + * + * @param string $search_term Search terms string. + * @param int $page Optional. Page ID. + * @param string $role Role name. + * @return WP_User_Search + */ + function WP_User_Search ($search_term = '', $page = '', $role = '') { + _deprecated_function( __FUNCTION__, '3.1', 'WP_User_Query' ); + + $this->search_term = stripslashes( $search_term ); + $this->raw_page = ( '' == $page ) ? false : (int) $page; + $this->page = (int) ( '' == $page ) ? 1 : $page; + $this->role = $role; + + $this->prepare_query(); + $this->query(); + $this->prepare_vars_for_template_usage(); + $this->do_paging(); + } + + /** + * {@internal Missing Short Description}} + * + * {@internal Missing Long Description}} + * + * @since 2.1.0 + * @access public + */ + function prepare_query() { + global $wpdb; + $this->first_user = ($this->page - 1) * $this->users_per_page; + + $this->query_limit = $wpdb->prepare(" LIMIT %d, %d", $this->first_user, $this->users_per_page); + $this->query_orderby = ' ORDER BY user_login'; + + $search_sql = ''; + if ( $this->search_term ) { + $searches = array(); + $search_sql = 'AND ('; + foreach ( array('user_login', 'user_nicename', 'user_email', 'user_url', 'display_name') as $col ) + $searches[] = $wpdb->prepare( $col . ' LIKE %s', '%' . like_escape($this->search_term) . '%' ); + $search_sql .= implode(' OR ', $searches); + $search_sql .= ')'; + } + + $this->query_from = " FROM $wpdb->users"; + $this->query_where = " WHERE 1=1 $search_sql"; + + if ( $this->role ) { + $this->query_from .= " INNER JOIN $wpdb->usermeta ON $wpdb->users.ID = $wpdb->usermeta.user_id"; + $this->query_where .= $wpdb->prepare(" AND $wpdb->usermeta.meta_key = '{$wpdb->prefix}capabilities' AND $wpdb->usermeta.meta_value LIKE %s", '%' . $this->role . '%'); + } elseif ( is_multisite() ) { + $level_key = $wpdb->prefix . 'capabilities'; // wpmu site admins don't have user_levels + $this->query_from .= ", $wpdb->usermeta"; + $this->query_where .= " AND $wpdb->users.ID = $wpdb->usermeta.user_id AND meta_key = '{$level_key}'"; + } + + do_action_ref_array( 'pre_user_search', array( &$this ) ); + } + + /** + * {@internal Missing Short Description}} + * + * {@internal Missing Long Description}} + * + * @since 2.1.0 + * @access public + */ + function query() { + global $wpdb; + + $this->results = $wpdb->get_col("SELECT DISTINCT($wpdb->users.ID)" . $this->query_from . $this->query_where . $this->query_orderby . $this->query_limit); + + if ( $this->results ) + $this->total_users_for_query = $wpdb->get_var("SELECT COUNT(DISTINCT($wpdb->users.ID))" . $this->query_from . $this->query_where); // no limit + else + $this->search_errors = new WP_Error('no_matching_users_found', __('No matching users were found!')); + } + + /** + * {@internal Missing Short Description}} + * + * {@internal Missing Long Description}} + * + * @since 2.1.0 + * @access public + */ + function prepare_vars_for_template_usage() { + $this->search_term = stripslashes($this->search_term); // done with DB, from now on we want slashes gone + } + + /** + * {@internal Missing Short Description}} + * + * {@internal Missing Long Description}} + * + * @since 2.1.0 + * @access public + */ + function do_paging() { + if ( $this->total_users_for_query > $this->users_per_page ) { // have to page the results + $args = array(); + if( ! empty($this->search_term) ) + $args['usersearch'] = urlencode($this->search_term); + if( ! empty($this->role) ) + $args['role'] = urlencode($this->role); + + $this->paging_text = paginate_links( array( + 'total' => ceil($this->total_users_for_query / $this->users_per_page), + 'current' => $this->page, + 'base' => 'users.php?%_%', + 'format' => 'userspage=%#%', + 'add_args' => $args + ) ); + if ( $this->paging_text ) { + $this->paging_text = sprintf( '' . __( 'Displaying %s–%s of %s' ) . '%s', + number_format_i18n( ( $this->page - 1 ) * $this->users_per_page + 1 ), + number_format_i18n( min( $this->page * $this->users_per_page, $this->total_users_for_query ) ), + number_format_i18n( $this->total_users_for_query ), + $this->paging_text + ); + } + } + } + + /** + * {@internal Missing Short Description}} + * + * {@internal Missing Long Description}} + * + * @since 2.1.0 + * @access public + * + * @return unknown + */ + function get_results() { + return (array) $this->results; + } + + /** + * Displaying paging text. + * + * @see do_paging() Builds paging text. + * + * @since 2.1.0 + * @access public + */ + function page_links() { + echo $this->paging_text; + } + + /** + * Whether paging is enabled. + * + * @see do_paging() Builds paging text. + * + * @since 2.1.0 + * @access public + * + * @return bool + */ + function results_are_paged() { + if ( $this->paging_text ) + return true; + return false; + } + + /** + * Whether there are search terms. + * + * @since 2.1.0 + * @access public + * + * @return bool + */ + function is_search() { + if ( $this->search_term ) + return true; + return false; + } +} +endif; + +/** + * Retrieve editable posts from other users. + * + * @deprecated 3.1.0 + * + * @param int $user_id User ID to not retrieve posts from. + * @param string $type Optional, defaults to 'any'. Post type to retrieve, can be 'draft' or 'pending'. + * @return array List of posts from others. + */ +function get_others_unpublished_posts($user_id, $type='any') { + _deprecated_function( __FUNCTION__, '3.1' ); + + global $wpdb; + + $editable = get_editable_user_ids( $user_id ); + + if ( in_array($type, array('draft', 'pending')) ) + $type_sql = " post_status = '$type' "; + else + $type_sql = " ( post_status = 'draft' OR post_status = 'pending' ) "; + + $dir = ( 'pending' == $type ) ? 'ASC' : 'DESC'; + + if ( !$editable ) { + $other_unpubs = ''; + } else { + $editable = join(',', $editable); + $other_unpubs = $wpdb->get_results( $wpdb->prepare("SELECT ID, post_title, post_author FROM $wpdb->posts WHERE post_type = 'post' AND $type_sql AND post_author IN ($editable) AND post_author != %d ORDER BY post_modified $dir", $user_id) ); + } + + return apply_filters('get_others_drafts', $other_unpubs); +} + +/** + * Retrieve drafts from other users. + * + * @deprecated 3.1.0 + * + * @param int $user_id User ID. + * @return array List of drafts from other users. + */ +function get_others_drafts($user_id) { + _deprecated_function( __FUNCTION__, '3.1' ); + + return get_others_unpublished_posts($user_id, 'draft'); +} + +/** + * Retrieve pending review posts from other users. + * + * @deprecated 3.1.0 + * + * @param int $user_id User ID. + * @return array List of posts with pending review post type from other users. + */ +function get_others_pending($user_id) { + _deprecated_function( __FUNCTION__, '3.1' ); + + return get_others_unpublished_posts($user_id, 'pending'); +} + +/** + * Output the QuickPress dashboard widget. + * + * @since 3.0.0 + * @deprecated 3.2.0 + * @deprecated Use wp_dashboard_quick_press() + * @see wp_dashboard_quick_press() + */ +function wp_dashboard_quick_press_output() { + _deprecated_function( __FUNCTION__, '3.2', 'wp_dashboard_quick_press()' ); + wp_dashboard_quick_press(); +} diff --git a/src/wp-admin/includes/export.php b/src/wp-admin/includes/export.php new file mode 100644 index 0000000..cfdc3dd --- /dev/null +++ b/src/wp-admin/includes/export.php @@ -0,0 +1,425 @@ + 'all', 'author' => false, 'category' => false, + 'start_date' => false, 'end_date' => false, 'status' => false, + ); + $args = wp_parse_args( $args, $defaults ); + + do_action( 'export_wp' ); + + $sitename = sanitize_key( get_bloginfo( 'name' ) ); + if ( ! empty($sitename) ) $sitename .= '.'; + $filename = $sitename . 'wordpress.' . date( 'Y-m-d' ) . '.xml'; + + header( 'Content-Description: File Transfer' ); + header( 'Content-Disposition: attachment; filename=' . $filename ); + header( 'Content-Type: text/xml; charset=' . get_option( 'blog_charset' ), true ); + + if ( 'all' != $args['content'] && post_type_exists( $args['content'] ) ) { + $ptype = get_post_type_object( $args['content'] ); + if ( ! $ptype->can_export ) + $args['content'] = 'post'; + + $where = $wpdb->prepare( "{$wpdb->posts}.post_type = %s", $args['content'] ); + } else { + $post_types = get_post_types( array( 'can_export' => true ) ); + $esses = array_fill( 0, count($post_types), '%s' ); + $where = $wpdb->prepare( "{$wpdb->posts}.post_type IN (" . implode( ',', $esses ) . ')', $post_types ); + } + + if ( $args['status'] && ( 'post' == $args['content'] || 'page' == $args['content'] ) ) + $where .= $wpdb->prepare( " AND {$wpdb->posts}.post_status = %s", $args['status'] ); + else + $where .= " AND {$wpdb->posts}.post_status != 'auto-draft'"; + + $join = ''; + if ( $args['category'] && 'post' == $args['content'] ) { + if ( $term = term_exists( $args['category'], 'category' ) ) { + $join = "INNER JOIN {$wpdb->term_relationships} ON ({$wpdb->posts}.ID = {$wpdb->term_relationships}.object_id)"; + $where .= $wpdb->prepare( " AND {$wpdb->term_relationships}.term_taxonomy_id = %d", $term['term_taxonomy_id'] ); + } + } + + if ( 'post' == $args['content'] || 'page' == $args['content'] ) { + if ( $args['author'] ) + $where .= $wpdb->prepare( " AND {$wpdb->posts}.post_author = %d", $args['author'] ); + + if ( $args['start_date'] ) + $where .= $wpdb->prepare( " AND {$wpdb->posts}.post_date >= %s", date( 'Y-m-d', strtotime($args['start_date']) ) ); + + if ( $args['end_date'] ) + $where .= $wpdb->prepare( " AND {$wpdb->posts}.post_date < %s", date( 'Y-m-d', strtotime('+1 month', strtotime($args['end_date'])) ) ); + } + + // grab a snapshot of post IDs, just in case it changes during the export + $post_ids = $wpdb->get_col( "SELECT ID FROM {$wpdb->posts} $join WHERE $where" ); + + // get the requested terms ready, empty unless posts filtered by category or all content + $cats = $tags = $terms = array(); + if ( isset( $term ) && $term ) { + $cat = get_term( $term['term_id'], 'category' ); + $cats = array( $cat->term_id => $cat ); + unset( $term, $cat ); + } else if ( 'all' == $args['content'] ) { + $categories = (array) get_categories( array( 'get' => 'all' ) ); + $tags = (array) get_tags( array( 'get' => 'all' ) ); + + $custom_taxonomies = get_taxonomies( array( '_builtin' => false ) ); + $custom_terms = (array) get_terms( $custom_taxonomies, array( 'get' => 'all' ) ); + + // put categories in order with no child going before its parent + while ( $cat = array_shift( $categories ) ) { + if ( $cat->parent == 0 || isset( $cats[$cat->parent] ) ) + $cats[$cat->term_id] = $cat; + else + $categories[] = $cat; + } + + // put terms in order with no child going before its parent + while ( $t = array_shift( $custom_terms ) ) { + if ( $t->parent == 0 || isset( $terms[$t->parent] ) ) + $terms[$t->term_id] = $t; + else + $custom_terms[] = $t; + } + + unset( $categories, $custom_taxonomies, $custom_terms ); + } + + /** + * Wrap given string in XML CDATA tag. + * + * @since 2.1.0 + * + * @param string $str String to wrap in XML CDATA tag. + */ + function wxr_cdata( $str ) { + if ( seems_utf8( $str ) == false ) + $str = utf8_encode( $str ); + + // $str = ent2ncr(esc_html($str)); + $str = "'; + + return $str; + } + + /** + * Return the URL of the site + * + * @since 2.5.0 + * + * @return string Site URL. + */ + function wxr_site_url() { + // ms: the base url + if ( is_multisite() ) + return network_home_url(); + // wp: the blog url + else + return get_bloginfo_rss( 'url' ); + } + + /** + * Output a cat_name XML tag from a given category object + * + * @since 2.1.0 + * + * @param object $category Category Object + */ + function wxr_cat_name( $category ) { + if ( empty( $category->name ) ) + return; + + echo '' . wxr_cdata( $category->name ) . ''; + } + + /** + * Output a category_description XML tag from a given category object + * + * @since 2.1.0 + * + * @param object $category Category Object + */ + function wxr_category_description( $category ) { + if ( empty( $category->description ) ) + return; + + echo '' . wxr_cdata( $category->description ) . ''; + } + + /** + * Output a tag_name XML tag from a given tag object + * + * @since 2.3.0 + * + * @param object $tag Tag Object + */ + function wxr_tag_name( $tag ) { + if ( empty( $tag->name ) ) + return; + + echo '' . wxr_cdata( $tag->name ) . ''; + } + + /** + * Output a tag_description XML tag from a given tag object + * + * @since 2.3.0 + * + * @param object $tag Tag Object + */ + function wxr_tag_description( $tag ) { + if ( empty( $tag->description ) ) + return; + + echo '' . wxr_cdata( $tag->description ) . ''; + } + + /** + * Output a term_name XML tag from a given term object + * + * @since 2.9.0 + * + * @param object $term Term Object + */ + function wxr_term_name( $term ) { + if ( empty( $term->name ) ) + return; + + echo '' . wxr_cdata( $term->name ) . ''; + } + + /** + * Output a term_description XML tag from a given term object + * + * @since 2.9.0 + * + * @param object $term Term Object + */ + function wxr_term_description( $term ) { + if ( empty( $term->description ) ) + return; + + echo '' . wxr_cdata( $term->description ) . ''; + } + + /** + * Output list of authors with posts + * + * @since 3.1.0 + */ + function wxr_authors_list() { + global $wpdb; + + $authors = array(); + $results = $wpdb->get_results( "SELECT DISTINCT post_author FROM $wpdb->posts" ); + foreach ( (array) $results as $result ) + $authors[] = get_userdata( $result->post_author ); + + $authors = array_filter( $authors ); + + foreach( $authors as $author ) { + echo "\t"; + echo '' . $author->ID . ''; + echo '' . $author->user_login . ''; + echo '' . $author->user_email . ''; + echo '' . wxr_cdata( $author->display_name ) . ''; + echo '' . wxr_cdata( $author->user_firstname ) . ''; + echo '' . wxr_cdata( $author->user_lastname ) . ''; + echo "\n"; + } + } + + /** + * Ouput all navigation menu terms + * + * @since 3.1.0 + */ + function wxr_nav_menu_terms() { + $nav_menus = wp_get_nav_menus(); + if ( empty( $nav_menus ) || ! is_array( $nav_menus ) ) + return; + + foreach ( $nav_menus as $menu ) { + echo "\t{$menu->term_id}nav_menu{$menu->slug}"; + wxr_term_name( $menu ); + echo "\n"; + } + } + + /** + * Output list of taxonomy terms, in XML tag format, associated with a post + * + * @since 2.3.0 + */ + function wxr_post_taxonomy() { + global $post; + + $taxonomies = get_object_taxonomies( $post->post_type ); + if ( empty( $taxonomies ) ) + return; + $terms = wp_get_object_terms( $post->ID, $taxonomies ); + + foreach ( (array) $terms as $term ) { + echo "\t\ttaxonomy}\" nicename=\"{$term->slug}\">" . wxr_cdata( $term->name ) . "\n"; + } + } + + echo '\n"; + + ?> + + + + + + + + + + + + + + + + + + + + + + <?php bloginfo_rss( 'name' ); ?> + + + + + + + + + + + + term_id ?>slug; ?>parent ? $cats[$c->parent]->slug : ''; ?> + + + term_id ?>slug; ?> + + + term_id ?>taxonomy; ?>slug; ?>parent ? $terms[$t->parent]->slug : ''; ?> + + + + + +in_the_loop = true; // Fake being in the loop. + + // fetch 20 posts at a time rather than loading the entire table into memory + while ( $next_posts = array_splice( $post_ids, 0, 20 ) ) { + $where = 'WHERE ID IN (' . join( ',', $next_posts ) . ')'; + $posts = $wpdb->get_results( "SELECT * FROM {$wpdb->posts} $where" ); + + // Begin Loop + foreach ( $posts as $post ) { + setup_postdata( $post ); + $is_sticky = is_sticky( $post->ID ) ? 1 : 0; +?> + + <?php echo apply_filters( 'the_title_rss', $post->post_title ); ?> + + + + + + post_content ) ); ?> + post_excerpt ) ); ?> + ID; ?> + post_date; ?> + post_date_gmt; ?> + comment_status; ?> + ping_status; ?> + post_name; ?> + post_status; ?> + post_parent; ?> + menu_order; ?> + post_type; ?> + post_password; ?> + +post_type == 'attachment' ) : ?> + ID ); ?> + + +get_results( $wpdb->prepare( "SELECT * FROM $wpdb->postmeta WHERE post_id = %d", $post->ID ) ); + foreach( $postmeta as $meta ) : if ( $meta->meta_key != '_edit_lock' ) : ?> + + meta_key; ?> + meta_value ); ?> + + +get_results( $wpdb->prepare( "SELECT * FROM $wpdb->comments WHERE comment_post_ID = %d AND comment_approved <> 'spam'", $post->ID ) ); + foreach ( $comments as $c ) : ?> + + comment_ID; ?> + comment_author ); ?> + comment_author_email; ?> + comment_author_url ); ?> + comment_author_IP; ?> + comment_date; ?> + comment_date_gmt; ?> + comment_content ) ?> + comment_approved; ?> + comment_type; ?> + comment_parent; ?> + user_id; ?> +get_results( $wpdb->prepare( "SELECT * FROM $wpdb->commentmeta WHERE comment_id = %d", $c->comment_ID ) ); + foreach ( $c_meta as $meta ) : ?> + + meta_key; ?> + meta_value ); ?> + + + + + + + + + __( 'Main Index Template' ), + 'style.css' => __( 'Stylesheet' ), + 'editor-style.css' => __( 'Visual Editor Stylesheet' ), + 'editor-style-rtl.css' => __( 'Visual Editor RTL Stylesheet' ), + 'rtl.css' => __( 'RTL Stylesheet' ), + 'comments.php' => __( 'Comments' ), + 'comments-popup.php' => __( 'Popup Comments' ), + 'footer.php' => __( 'Footer' ), + 'header.php' => __( 'Header' ), + 'sidebar.php' => __( 'Sidebar' ), + 'archive.php' => __( 'Archives' ), + 'author.php' => __( 'Author Template' ), + 'tag.php' => __( 'Tag Template' ), + 'category.php' => __( 'Category Template' ), + 'page.php' => __( 'Page Template' ), + 'search.php' => __( 'Search Results' ), + 'searchform.php' => __( 'Search Form' ), + 'single.php' => __( 'Single Post' ), + '404.php' => __( '404 Template' ), + 'link.php' => __( 'Links Template' ), + 'functions.php' => __( 'Theme Functions' ), + 'attachment.php' => __( 'Attachment Template' ), + 'image.php' => __('Image Attachment Template'), + 'video.php' => __('Video Attachment Template'), + 'audio.php' => __('Audio Attachment Template'), + 'application.php' => __('Application Attachment Template'), + 'my-hacks.php' => __( 'my-hacks.php (legacy hacks support)' ), + '.htaccess' => __( '.htaccess (for rewrite rules )' ), + // Deprecated files + 'wp-layout.css' => __( 'Stylesheet' ), + 'wp-comments.php' => __( 'Comments Template' ), + 'wp-comments-popup.php' => __( 'Popup Comments Template' ), +); + +/** + * Get the description for standard WordPress theme files and other various standard + * WordPress files + * + * @since 1.5.0 + * + * @uses _cleanup_header_comment + * @uses $wp_file_descriptions + * @param string $file Filesystem path or filename + * @return string Description of file from $wp_file_descriptions or basename of $file if description doesn't exist + */ +function get_file_description( $file ) { + global $wp_file_descriptions; + + if ( isset( $wp_file_descriptions[basename( $file )] ) ) { + return $wp_file_descriptions[basename( $file )]; + } + elseif ( file_exists( $file ) && is_file( $file ) ) { + $template_data = implode( '', file( $file ) ); + if ( preg_match( '|Template Name:(.*)$|mi', $template_data, $name )) + return sprintf( __( '%s Page Template' ), _cleanup_header_comment($name[1]) ); + } + + return basename( $file ); +} + +/** + * Get the absolute filesystem path to the root of the WordPress installation + * + * @since 1.5.0 + * + * @uses get_option + * @return string Full filesystem path to the root of the WordPress installation + */ +function get_home_path() { + $home = get_option( 'home' ); + $siteurl = get_option( 'siteurl' ); + if ( $home != '' && $home != $siteurl ) { + $wp_path_rel_to_home = str_replace($home, '', $siteurl); /* $siteurl - $home */ + $pos = strpos($_SERVER["SCRIPT_FILENAME"], $wp_path_rel_to_home); + $home_path = substr($_SERVER["SCRIPT_FILENAME"], 0, $pos); + $home_path = trailingslashit( $home_path ); + } else { + $home_path = ABSPATH; + } + + return $home_path; +} + +/** + * Get the real file system path to a file to edit within the admin + * + * If the $file is index.php or .htaccess this function will assume it is relative + * to the install root, otherwise it is assumed the file is relative to the wp-content + * directory + * + * @since 1.5.0 + * + * @uses get_home_path + * @uses WP_CONTENT_DIR full filesystem path to the wp-content directory + * @param string $file filesystem path relative to the WordPress install directory or to the wp-content directory + * @return string full file system path to edit + */ +function get_real_file_to_edit( $file ) { + if ('index.php' == $file || '.htaccess' == $file ) { + $real_file = get_home_path() . $file; + } else { + $real_file = WP_CONTENT_DIR . $file; + } + + return $real_file; +} + +/** + * Returns a listing of all files in the specified folder and all subdirectories up to 100 levels deep. + * The depth of the recursiveness can be controlled by the $levels param. + * + * @since 2.6.0 + * + * @param string $folder Full path to folder + * @param int $levels (optional) Levels of folders to follow, Default: 100 (PHP Loop limit). + * @return bool|array False on failure, Else array of files + */ +function list_files( $folder = '', $levels = 100 ) { + if ( empty($folder) ) + return false; + + if ( ! $levels ) + return false; + + $files = array(); + if ( $dir = @opendir( $folder ) ) { + while (($file = readdir( $dir ) ) !== false ) { + if ( in_array($file, array('.', '..') ) ) + continue; + if ( is_dir( $folder . '/' . $file ) ) { + $files2 = list_files( $folder . '/' . $file, $levels - 1); + if ( $files2 ) + $files = array_merge($files, $files2 ); + else + $files[] = $folder . '/' . $file . '/'; + } else { + $files[] = $folder . '/' . $file; + } + } + } + @closedir( $dir ); + return $files; +} + +/** + * Returns a filename of a Temporary unique file. + * Please note that the calling function must unlink() this itself. + * + * The filename is based off the passed parameter or defaults to the current unix timestamp, + * while the directory can either be passed as well, or by leaving it blank, default to a writable temporary directory. + * + * @since 2.6.0 + * + * @param string $filename (optional) Filename to base the Unique file off + * @param string $dir (optional) Directory to store the file in + * @return string a writable filename + */ +function wp_tempnam($filename = '', $dir = '') { + if ( empty($dir) ) + $dir = get_temp_dir(); + $filename = basename($filename); + if ( empty($filename) ) + $filename = time(); + + $filename = preg_replace('|\..*$|', '.tmp', $filename); + $filename = $dir . wp_unique_filename($dir, $filename); + touch($filename); + return $filename; +} + +/** + * Make sure that the file that was requested to edit, is allowed to be edited + * + * Function will die if if you are not allowed to edit the file + * + * @since 1.5.0 + * + * @uses wp_die + * @uses validate_file + * @param string $file file the users is attempting to edit + * @param array $allowed_files Array of allowed files to edit, $file must match an entry exactly + * @return null + */ +function validate_file_to_edit( $file, $allowed_files = '' ) { + $code = validate_file( $file, $allowed_files ); + + if (!$code ) + return $file; + + switch ( $code ) { + case 1 : + wp_die( __('Sorry, can’t edit files with “..” in the name. If you are trying to edit a file in your WordPress home directory, you can just type the name of the file in.' )); + + //case 2 : + // wp_die( __('Sorry, can’t call files with their real path.' )); + + case 3 : + wp_die( __('Sorry, that file cannot be edited.' )); + } +} + +/** + * Handle PHP uploads in WordPress, sanitizing file names, checking extensions for mime type, + * and moving the file to the appropriate directory within the uploads directory. + * + * @since 2.0 + * + * @uses wp_handle_upload_error + * @uses apply_filters + * @uses is_multisite + * @uses wp_check_filetype_and_ext + * @uses current_user_can + * @uses wp_upload_dir + * @uses wp_unique_filename + * @uses delete_transient + * @param array $file Reference to a single element of $_FILES. Call the function once for each uploaded file. + * @param array $overrides Optional. An associative array of names=>values to override default variables with extract( $overrides, EXTR_OVERWRITE ). + * @return array On success, returns an associative array of file attributes. On failure, returns $overrides['upload_error_handler'](&$file, $message ) or array( 'error'=>$message ). + */ +function wp_handle_upload( &$file, $overrides = false, $time = null ) { + // The default error handler. + if ( ! function_exists( 'wp_handle_upload_error' ) ) { + function wp_handle_upload_error( &$file, $message ) { + return array( 'error'=>$message ); + } + } + + $file = apply_filters( 'wp_handle_upload_prefilter', $file ); + + // You may define your own function and pass the name in $overrides['upload_error_handler'] + $upload_error_handler = 'wp_handle_upload_error'; + + // You may have had one or more 'wp_handle_upload_prefilter' functions error out the file. Handle that gracefully. + if ( isset( $file['error'] ) && !is_numeric( $file['error'] ) && $file['error'] ) + return $upload_error_handler( $file, $file['error'] ); + + // You may define your own function and pass the name in $overrides['unique_filename_callback'] + $unique_filename_callback = null; + + // $_POST['action'] must be set and its value must equal $overrides['action'] or this: + $action = 'wp_handle_upload'; + + // Courtesy of php.net, the strings that describe the error indicated in $_FILES[{form field}]['error']. + $upload_error_strings = array( false, + __( "The uploaded file exceeds the upload_max_filesize directive in php.ini." ), + __( "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form." ), + __( "The uploaded file was only partially uploaded." ), + __( "No file was uploaded." ), + '', + __( "Missing a temporary folder." ), + __( "Failed to write file to disk." ), + __( "File upload stopped by extension." )); + + // All tests are on by default. Most can be turned off by $override[{test_name}] = false; + $test_form = true; + $test_size = true; + $test_upload = true; + + // If you override this, you must provide $ext and $type!!!! + $test_type = true; + $mimes = false; + + // Install user overrides. Did we mention that this voids your warranty? + if ( is_array( $overrides ) ) + extract( $overrides, EXTR_OVERWRITE ); + + // A correct form post will pass this test. + if ( $test_form && (!isset( $_POST['action'] ) || ($_POST['action'] != $action ) ) ) + return call_user_func($upload_error_handler, $file, __( 'Invalid form submission.' )); + + // A successful upload will pass this test. It makes no sense to override this one. + if ( $file['error'] > 0 ) + return call_user_func($upload_error_handler, $file, $upload_error_strings[$file['error']] ); + + // A non-empty file will pass this test. + if ( $test_size && !($file['size'] > 0 ) ) { + if ( is_multisite() ) + $error_msg = __( 'File is empty. Please upload something more substantial.' ); + else + $error_msg = __( 'File is empty. Please upload something more substantial. This error could also be caused by uploads being disabled in your php.ini or by post_max_size being defined as smaller than upload_max_filesize in php.ini.' ); + return call_user_func($upload_error_handler, $file, $error_msg); + } + + // A properly uploaded file will pass this test. There should be no reason to override this one. + if ( $test_upload && ! @ is_uploaded_file( $file['tmp_name'] ) ) + return call_user_func($upload_error_handler, $file, __( 'Specified file failed upload test.' )); + + // A correct MIME type will pass this test. Override $mimes or use the upload_mimes filter. + if ( $test_type ) { + $wp_filetype = wp_check_filetype_and_ext( $file['tmp_name'], $file['name'], $mimes ); + + extract( $wp_filetype ); + + // Check to see if wp_check_filetype_and_ext() determined the filename was incorrect + if ( $proper_filename ) + $file['name'] = $proper_filename; + + if ( ( !$type || !$ext ) && !current_user_can( 'unfiltered_upload' ) ) + return call_user_func($upload_error_handler, $file, __( 'Sorry, this file type is not permitted for security reasons.' )); + + if ( !$ext ) + $ext = ltrim(strrchr($file['name'], '.'), '.'); + + if ( !$type ) + $type = $file['type']; + } else { + $type = ''; + } + + // A writable uploads dir will pass this test. Again, there's no point overriding this one. + if ( ! ( ( $uploads = wp_upload_dir($time) ) && false === $uploads['error'] ) ) + return call_user_func($upload_error_handler, $file, $uploads['error'] ); + + $filename = wp_unique_filename( $uploads['path'], $file['name'], $unique_filename_callback ); + + // Move the file to the uploads dir + $new_file = $uploads['path'] . "/$filename"; + if ( false === @ move_uploaded_file( $file['tmp_name'], $new_file ) ) + return $upload_error_handler( $file, sprintf( __('The uploaded file could not be moved to %s.' ), $uploads['path'] ) ); + + // Set correct file permissions + $stat = stat( dirname( $new_file )); + $perms = $stat['mode'] & 0000666; + @ chmod( $new_file, $perms ); + + // Compute the URL + $url = $uploads['url'] . "/$filename"; + + if ( is_multisite() ) + delete_transient( 'dirsize_cache' ); + + return apply_filters( 'wp_handle_upload', array( 'file' => $new_file, 'url' => $url, 'type' => $type ), 'upload' ); +} + +/** + * Handle sideloads, which is the process of retriving a media item from another server instead of + * a traditional media upload. This process involves sanitizing the filename, checking extensions + * for mime type, and moving the file to the appropriate directory within the uploads directory. + * + * @since 2.6.0 + * + * @uses wp_handle_upload_error + * @uses apply_filters + * @uses wp_check_filetype_and_ext + * @uses current_user_can + * @uses wp_upload_dir + * @uses wp_unique_filename + * @param array $file an array similar to that of a PHP $_FILES POST array + * @param array $overrides Optional. An associative array of names=>values to override default variables with extract( $overrides, EXTR_OVERWRITE ). + * @return array On success, returns an associative array of file attributes. On failure, returns $overrides['upload_error_handler'](&$file, $message ) or array( 'error'=>$message ). + */ +function wp_handle_sideload( &$file, $overrides = false ) { + // The default error handler. + if (! function_exists( 'wp_handle_upload_error' ) ) { + function wp_handle_upload_error( &$file, $message ) { + return array( 'error'=>$message ); + } + } + + // You may define your own function and pass the name in $overrides['upload_error_handler'] + $upload_error_handler = 'wp_handle_upload_error'; + + // You may define your own function and pass the name in $overrides['unique_filename_callback'] + $unique_filename_callback = null; + + // $_POST['action'] must be set and its value must equal $overrides['action'] or this: + $action = 'wp_handle_sideload'; + + // Courtesy of php.net, the strings that describe the error indicated in $_FILES[{form field}]['error']. + $upload_error_strings = array( false, + __( "The uploaded file exceeds the upload_max_filesize directive in php.ini." ), + __( "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form." ), + __( "The uploaded file was only partially uploaded." ), + __( "No file was uploaded." ), + '', + __( "Missing a temporary folder." ), + __( "Failed to write file to disk." ), + __( "File upload stopped by extension." )); + + // All tests are on by default. Most can be turned off by $override[{test_name}] = false; + $test_form = true; + $test_size = true; + + // If you override this, you must provide $ext and $type!!!! + $test_type = true; + $mimes = false; + + // Install user overrides. Did we mention that this voids your warranty? + if ( is_array( $overrides ) ) + extract( $overrides, EXTR_OVERWRITE ); + + // A correct form post will pass this test. + if ( $test_form && (!isset( $_POST['action'] ) || ($_POST['action'] != $action ) ) ) + return $upload_error_handler( $file, __( 'Invalid form submission.' )); + + // A successful upload will pass this test. It makes no sense to override this one. + if ( ! empty( $file['error'] ) ) + return $upload_error_handler( $file, $upload_error_strings[$file['error']] ); + + // A non-empty file will pass this test. + if ( $test_size && !(filesize($file['tmp_name']) > 0 ) ) + return $upload_error_handler( $file, __( 'File is empty. Please upload something more substantial. This error could also be caused by uploads being disabled in your php.ini.' )); + + // A properly uploaded file will pass this test. There should be no reason to override this one. + if (! @ is_file( $file['tmp_name'] ) ) + return $upload_error_handler( $file, __( 'Specified file does not exist.' )); + + // A correct MIME type will pass this test. Override $mimes or use the upload_mimes filter. + if ( $test_type ) { + $wp_filetype = wp_check_filetype_and_ext( $file['tmp_name'], $file['name'], $mimes ); + + extract( $wp_filetype ); + + // Check to see if wp_check_filetype_and_ext() determined the filename was incorrect + if ( $proper_filename ) + $file['name'] = $proper_filename; + + if ( ( !$type || !$ext ) && !current_user_can( 'unfiltered_upload' ) ) + return $upload_error_handler( $file, __( 'Sorry, this file type is not permitted for security reasons.' )); + + if ( !$ext ) + $ext = ltrim(strrchr($file['name'], '.'), '.'); + + if ( !$type ) + $type = $file['type']; + } + + // A writable uploads dir will pass this test. Again, there's no point overriding this one. + if ( ! ( ( $uploads = wp_upload_dir() ) && false === $uploads['error'] ) ) + return $upload_error_handler( $file, $uploads['error'] ); + + $filename = wp_unique_filename( $uploads['path'], $file['name'], $unique_filename_callback ); + + // Strip the query strings. + $filename = str_replace('?','-', $filename); + $filename = str_replace('&','-', $filename); + + // Move the file to the uploads dir + $new_file = $uploads['path'] . "/$filename"; + if ( false === @ rename( $file['tmp_name'], $new_file ) ) { + return $upload_error_handler( $file, sprintf( __('The uploaded file could not be moved to %s.' ), $uploads['path'] ) ); + } + + // Set correct file permissions + $stat = stat( dirname( $new_file )); + $perms = $stat['mode'] & 0000666; + @ chmod( $new_file, $perms ); + + // Compute the URL + $url = $uploads['url'] . "/$filename"; + + $return = apply_filters( 'wp_handle_upload', array( 'file' => $new_file, 'url' => $url, 'type' => $type ), 'sideload' ); + + return $return; +} + +/** + * Downloads a url to a local temporary file using the WordPress HTTP Class. + * Please note, That the calling function must unlink() the file. + * + * @since 2.5.0 + * + * @param string $url the URL of the file to download + * @param int $timeout The timeout for the request to download the file default 300 seconds + * @return mixed WP_Error on failure, string Filename on success. + */ +function download_url( $url, $timeout = 300 ) { + //WARNING: The file is not automatically deleted, The script must unlink() the file. + if ( ! $url ) + return new WP_Error('http_no_url', __('Invalid URL Provided.')); + + $tmpfname = wp_tempnam($url); + if ( ! $tmpfname ) + return new WP_Error('http_no_file', __('Could not create Temporary file.')); + + $response = wp_remote_get( $url, array( 'timeout' => $timeout, 'stream' => true, 'filename' => $tmpfname ) ); + + if ( is_wp_error( $response ) ) { + unlink( $tmpfname ); + return $response; + } + + if ( 200 != wp_remote_retrieve_response_code( $response ) ){ + unlink( $tmpfname ); + return new WP_Error( 'http_404', trim( wp_remote_retrieve_response_message( $response ) ) ); + } + + return $tmpfname; +} + +/** + * Unzip's a specified ZIP file to a location on the Filesystem via the WordPress Filesystem Abstraction. + * Assumes that WP_Filesystem() has already been called and set up. Does not extract a root-level __MACOSX directory, if present. + * + * Attempts to increase the PHP Memory limit to 256M before uncompressing, + * However, The most memory required shouldn't be much larger than the Archive itself. + * + * @since 2.5.0 + * + * @param string $file Full path and filename of zip archive + * @param string $to Full path on the filesystem to extract archive to + * @return mixed WP_Error on failure, True on success + */ +function unzip_file($file, $to) { + global $wp_filesystem; + + if ( ! $wp_filesystem || !is_object($wp_filesystem) ) + return new WP_Error('fs_unavailable', __('Could not access filesystem.')); + + // Unzip can use a lot of memory, but not this much hopefully + @ini_set( 'memory_limit', apply_filters( 'admin_memory_limit', WP_MAX_MEMORY_LIMIT ) ); + + $needed_dirs = array(); + $to = trailingslashit($to); + + // Determine any parent dir's needed (of the upgrade directory) + if ( ! $wp_filesystem->is_dir($to) ) { //Only do parents if no children exist + $path = preg_split('![/\\\]!', untrailingslashit($to)); + for ( $i = count($path); $i >= 0; $i-- ) { + if ( empty($path[$i]) ) + continue; + + $dir = implode('/', array_slice($path, 0, $i+1) ); + if ( preg_match('!^[a-z]:$!i', $dir) ) // Skip it if it looks like a Windows Drive letter. + continue; + + if ( ! $wp_filesystem->is_dir($dir) ) + $needed_dirs[] = $dir; + else + break; // A folder exists, therefor, we dont need the check the levels below this + } + } + + if ( class_exists('ZipArchive') && apply_filters('unzip_file_use_ziparchive', true ) ) { + $result = _unzip_file_ziparchive($file, $to, $needed_dirs); + if ( true === $result ) { + return $result; + } elseif ( is_wp_error($result) ) { + if ( 'incompatible_archive' != $result->get_error_code() ) + return $result; + } + } + // Fall through to PclZip if ZipArchive is not available, or encountered an error opening the file. + return _unzip_file_pclzip($file, $to, $needed_dirs); +} + +/** + * This function should not be called directly, use unzip_file instead. Attempts to unzip an archive using the ZipArchive class. + * Assumes that WP_Filesystem() has already been called and set up. + * + * @since 3.0.0 + * @see unzip_file + * @access private + * + * @param string $file Full path and filename of zip archive + * @param string $to Full path on the filesystem to extract archive to + * @param array $needed_dirs A partial list of required folders needed to be created. + * @return mixed WP_Error on failure, True on success + */ +function _unzip_file_ziparchive($file, $to, $needed_dirs = array() ) { + global $wp_filesystem; + + $z = new ZipArchive(); + + // PHP4-compat - php4 classes can't contain constants + $zopen = $z->open($file, /* ZIPARCHIVE::CHECKCONS */ 4); + if ( true !== $zopen ) + return new WP_Error('incompatible_archive', __('Incompatible Archive.')); + + for ( $i = 0; $i < $z->numFiles; $i++ ) { + if ( ! $info = $z->statIndex($i) ) + return new WP_Error('stat_failed', __('Could not retrieve file from archive.')); + + if ( '__MACOSX/' === substr($info['name'], 0, 9) ) // Skip the OS X-created __MACOSX directory + continue; + + if ( '/' == substr($info['name'], -1) ) // directory + $needed_dirs[] = $to . untrailingslashit($info['name']); + else + $needed_dirs[] = $to . untrailingslashit(dirname($info['name'])); + } + + $needed_dirs = array_unique($needed_dirs); + foreach ( $needed_dirs as $dir ) { + // Check the parent folders of the folders all exist within the creation array. + if ( untrailingslashit($to) == $dir ) // Skip over the working directory, We know this exists (or will exist) + continue; + if ( strpos($dir, $to) === false ) // If the directory is not within the working directory, Skip it + continue; + + $parent_folder = dirname($dir); + while ( !empty($parent_folder) && untrailingslashit($to) != $parent_folder && !in_array($parent_folder, $needed_dirs) ) { + $needed_dirs[] = $parent_folder; + $parent_folder = dirname($parent_folder); + } + } + asort($needed_dirs); + + // Create those directories if need be: + foreach ( $needed_dirs as $_dir ) { + if ( ! $wp_filesystem->mkdir($_dir, FS_CHMOD_DIR) && ! $wp_filesystem->is_dir($_dir) ) // Only check to see if the Dir exists upon creation failure. Less I/O this way. + return new WP_Error('mkdir_failed', __('Could not create directory.'), $_dir); + } + unset($needed_dirs); + + for ( $i = 0; $i < $z->numFiles; $i++ ) { + if ( ! $info = $z->statIndex($i) ) + return new WP_Error('stat_failed', __('Could not retrieve file from archive.')); + + if ( '/' == substr($info['name'], -1) ) // directory + continue; + + if ( '__MACOSX/' === substr($info['name'], 0, 9) ) // Don't extract the OS X-created __MACOSX directory files + continue; + + $contents = $z->getFromIndex($i); + if ( false === $contents ) + return new WP_Error('extract_failed', __('Could not extract file from archive.'), $info['name']); + + if ( ! $wp_filesystem->put_contents( $to . $info['name'], $contents, FS_CHMOD_FILE) ) + return new WP_Error('copy_failed', __('Could not copy file.'), $to . $info['filename']); + } + + $z->close(); + + return true; +} + +/** + * This function should not be called directly, use unzip_file instead. Attempts to unzip an archive using the PclZip library. + * Assumes that WP_Filesystem() has already been called and set up. + * + * @since 3.0.0 + * @see unzip_file + * @access private + * + * @param string $file Full path and filename of zip archive + * @param string $to Full path on the filesystem to extract archive to + * @param array $needed_dirs A partial list of required folders needed to be created. + * @return mixed WP_Error on failure, True on success + */ +function _unzip_file_pclzip($file, $to, $needed_dirs = array()) { + global $wp_filesystem; + + // See #15789 - PclZip uses string functions on binary data, If it's overloaded with Multibyte safe functions the results are incorrect. + if ( ini_get('mbstring.func_overload') && function_exists('mb_internal_encoding') ) { + $previous_encoding = mb_internal_encoding(); + mb_internal_encoding('ISO-8859-1'); + } + + require_once(ABSPATH . 'wp-admin/includes/class-pclzip.php'); + + $archive = new PclZip($file); + + $archive_files = $archive->extract(PCLZIP_OPT_EXTRACT_AS_STRING); + + if ( isset($previous_encoding) ) + mb_internal_encoding($previous_encoding); + + // Is the archive valid? + if ( !is_array($archive_files) ) + return new WP_Error('incompatible_archive', __('Incompatible Archive.'), $archive->errorInfo(true)); + + if ( 0 == count($archive_files) ) + return new WP_Error('empty_archive', __('Empty archive.')); + + // Determine any children directories needed (From within the archive) + foreach ( $archive_files as $file ) { + if ( '__MACOSX/' === substr($file['filename'], 0, 9) ) // Skip the OS X-created __MACOSX directory + continue; + + $needed_dirs[] = $to . untrailingslashit( $file['folder'] ? $file['filename'] : dirname($file['filename']) ); + } + + $needed_dirs = array_unique($needed_dirs); + foreach ( $needed_dirs as $dir ) { + // Check the parent folders of the folders all exist within the creation array. + if ( untrailingslashit($to) == $dir ) // Skip over the working directory, We know this exists (or will exist) + continue; + if ( strpos($dir, $to) === false ) // If the directory is not within the working directory, Skip it + continue; + + $parent_folder = dirname($dir); + while ( !empty($parent_folder) && untrailingslashit($to) != $parent_folder && !in_array($parent_folder, $needed_dirs) ) { + $needed_dirs[] = $parent_folder; + $parent_folder = dirname($parent_folder); + } + } + asort($needed_dirs); + + // Create those directories if need be: + foreach ( $needed_dirs as $_dir ) { + if ( ! $wp_filesystem->mkdir($_dir, FS_CHMOD_DIR) && ! $wp_filesystem->is_dir($_dir) ) // Only check to see if the dir exists upon creation failure. Less I/O this way. + return new WP_Error('mkdir_failed', __('Could not create directory.'), $_dir); + } + unset($needed_dirs); + + // Extract the files from the zip + foreach ( $archive_files as $file ) { + if ( $file['folder'] ) + continue; + + if ( '__MACOSX/' === substr($file['filename'], 0, 9) ) // Don't extract the OS X-created __MACOSX directory files + continue; + + if ( ! $wp_filesystem->put_contents( $to . $file['filename'], $file['content'], FS_CHMOD_FILE) ) + return new WP_Error('copy_failed', __('Could not copy file.'), $to . $file['filename']); + } + return true; +} + +/** + * Copies a directory from one location to another via the WordPress Filesystem Abstraction. + * Assumes that WP_Filesystem() has already been called and setup. + * + * @since 2.5.0 + * + * @param string $from source directory + * @param string $to destination directory + * @param array $skip_list a list of files/folders to skip copying + * @return mixed WP_Error on failure, True on success. + */ +function copy_dir($from, $to, $skip_list = array() ) { + global $wp_filesystem; + + $dirlist = $wp_filesystem->dirlist($from); + + $from = trailingslashit($from); + $to = trailingslashit($to); + + $skip_regex = ''; + foreach ( (array)$skip_list as $key => $skip_file ) + $skip_regex .= preg_quote($skip_file, '!') . '|'; + + if ( !empty($skip_regex) ) + $skip_regex = '!(' . rtrim($skip_regex, '|') . ')$!i'; + + foreach ( (array) $dirlist as $filename => $fileinfo ) { + if ( !empty($skip_regex) ) + if ( preg_match($skip_regex, $from . $filename) ) + continue; + + if ( 'f' == $fileinfo['type'] ) { + if ( ! $wp_filesystem->copy($from . $filename, $to . $filename, true, FS_CHMOD_FILE) ) { + // If copy failed, chmod file to 0644 and try again. + $wp_filesystem->chmod($to . $filename, 0644); + if ( ! $wp_filesystem->copy($from . $filename, $to . $filename, true, FS_CHMOD_FILE) ) + return new WP_Error('copy_failed', __('Could not copy file.'), $to . $filename); + } + } elseif ( 'd' == $fileinfo['type'] ) { + if ( !$wp_filesystem->is_dir($to . $filename) ) { + if ( !$wp_filesystem->mkdir($to . $filename, FS_CHMOD_DIR) ) + return new WP_Error('mkdir_failed', __('Could not create directory.'), $to . $filename); + } + $result = copy_dir($from . $filename, $to . $filename, $skip_list); + if ( is_wp_error($result) ) + return $result; + } + } + return true; +} + +/** + * Initialises and connects the WordPress Filesystem Abstraction classes. + * This function will include the chosen transport and attempt connecting. + * + * Plugins may add extra transports, And force WordPress to use them by returning the filename via the 'filesystem_method_file' filter. + * + * @since 2.5.0 + * + * @param array $args (optional) Connection args, These are passed directly to the WP_Filesystem_*() classes. + * @param string $context (optional) Context for get_filesystem_method(), See function declaration for more information. + * @return boolean false on failure, true on success + */ +function WP_Filesystem( $args = false, $context = false ) { + global $wp_filesystem; + + require_once(ABSPATH . 'wp-admin/includes/class-wp-filesystem-base.php'); + + $method = get_filesystem_method($args, $context); + + if ( ! $method ) + return false; + + if ( ! class_exists("WP_Filesystem_$method") ) { + $abstraction_file = apply_filters('filesystem_method_file', ABSPATH . 'wp-admin/includes/class-wp-filesystem-' . $method . '.php', $method); + if ( ! file_exists($abstraction_file) ) + return; + + require_once($abstraction_file); + } + $method = "WP_Filesystem_$method"; + + $wp_filesystem = new $method($args); + + //Define the timeouts for the connections. Only available after the construct is called to allow for per-transport overriding of the default. + if ( ! defined('FS_CONNECT_TIMEOUT') ) + define('FS_CONNECT_TIMEOUT', 30); + if ( ! defined('FS_TIMEOUT') ) + define('FS_TIMEOUT', 30); + + if ( is_wp_error($wp_filesystem->errors) && $wp_filesystem->errors->get_error_code() ) + return false; + + if ( !$wp_filesystem->connect() ) + return false; //There was an erorr connecting to the server. + + // Set the permission constants if not already set. + if ( ! defined('FS_CHMOD_DIR') ) + define('FS_CHMOD_DIR', 0755 ); + if ( ! defined('FS_CHMOD_FILE') ) + define('FS_CHMOD_FILE', 0644 ); + + return true; +} + +/** + * Determines which Filesystem Method to use. + * The priority of the Transports are: Direct, SSH2, FTP PHP Extension, FTP Sockets (Via Sockets class, or fsoxkopen()) + * + * Note that the return value of this function can be overridden in 2 ways + * - By defining FS_METHOD in your wp-config.php file + * - By using the filesystem_method filter + * Valid values for these are: 'direct', 'ssh', 'ftpext' or 'ftpsockets' + * Plugins may also define a custom transport handler, See the WP_Filesystem function for more information. + * + * @since 2.5.0 + * + * @param array $args Connection details. + * @param string $context Full path to the directory that is tested for being writable. + * @return string The transport to use, see description for valid return values. + */ +function get_filesystem_method($args = array(), $context = false) { + $method = defined('FS_METHOD') ? FS_METHOD : false; //Please ensure that this is either 'direct', 'ssh', 'ftpext' or 'ftpsockets' + + if ( ! $method && function_exists('getmyuid') && function_exists('fileowner') ){ + if ( !$context ) + $context = WP_CONTENT_DIR; + $context = trailingslashit($context); + $temp_file_name = $context . 'temp-write-test-' . time(); + $temp_handle = @fopen($temp_file_name, 'w'); + if ( $temp_handle ) { + if ( getmyuid() == @fileowner($temp_file_name) ) + $method = 'direct'; + @fclose($temp_handle); + @unlink($temp_file_name); + } + } + + if ( ! $method && isset($args['connection_type']) && 'ssh' == $args['connection_type'] && extension_loaded('ssh2') && function_exists('stream_get_contents') ) $method = 'ssh2'; + if ( ! $method && extension_loaded('ftp') ) $method = 'ftpext'; + if ( ! $method && ( extension_loaded('sockets') || function_exists('fsockopen') ) ) $method = 'ftpsockets'; //Sockets: Socket extension; PHP Mode: FSockopen / fwrite / fread + return apply_filters('filesystem_method', $method, $args); +} + +/** + * Displays a form to the user to request for their FTP/SSH details in order to connect to the filesystem. + * All chosen/entered details are saved, Excluding the Password. + * + * Hostnames may be in the form of hostname:portnumber (eg: wordpress.org:2467) to specify an alternate FTP/SSH port. + * + * Plugins may override this form by returning true|false via the request_filesystem_credentials filter. + * + * @since 2.5.0 + * + * @param string $form_post the URL to post the form to + * @param string $type the chosen Filesystem method in use + * @param boolean $error if the current request has failed to connect + * @param string $context The directory which is needed access to, The write-test will be performed on this directory by get_filesystem_method() + * @param string $extra_fields Extra POST fields which should be checked for to be included in the post. + * @return boolean False on failure. True on success. + */ +function request_filesystem_credentials($form_post, $type = '', $error = false, $context = false, $extra_fields = null) { + $req_cred = apply_filters( 'request_filesystem_credentials', '', $form_post, $type, $error, $context, $extra_fields ); + if ( '' !== $req_cred ) + return $req_cred; + + if ( empty($type) ) + $type = get_filesystem_method(array(), $context); + + if ( 'direct' == $type ) + return true; + + if ( is_null( $extra_fields ) ) + $extra_fields = array( 'version', 'locale' ); + + $credentials = get_option('ftp_credentials', array( 'hostname' => '', 'username' => '')); + + // If defined, set it to that, Else, If POST'd, set it to that, If not, Set it to whatever it previously was(saved details in option) + $credentials['hostname'] = defined('FTP_HOST') ? FTP_HOST : (!empty($_POST['hostname']) ? stripslashes($_POST['hostname']) : $credentials['hostname']); + $credentials['username'] = defined('FTP_USER') ? FTP_USER : (!empty($_POST['username']) ? stripslashes($_POST['username']) : $credentials['username']); + $credentials['password'] = defined('FTP_PASS') ? FTP_PASS : (!empty($_POST['password']) ? stripslashes($_POST['password']) : ''); + + // Check to see if we are setting the public/private keys for ssh + $credentials['public_key'] = defined('FTP_PUBKEY') ? FTP_PUBKEY : (!empty($_POST['public_key']) ? stripslashes($_POST['public_key']) : ''); + $credentials['private_key'] = defined('FTP_PRIKEY') ? FTP_PRIKEY : (!empty($_POST['private_key']) ? stripslashes($_POST['private_key']) : ''); + + //sanitize the hostname, Some people might pass in odd-data: + $credentials['hostname'] = preg_replace('|\w+://|', '', $credentials['hostname']); //Strip any schemes off + + if ( strpos($credentials['hostname'], ':') ) { + list( $credentials['hostname'], $credentials['port'] ) = explode(':', $credentials['hostname'], 2); + if ( ! is_numeric($credentials['port']) ) + unset($credentials['port']); + } else { + unset($credentials['port']); + } + + if ( (defined('FTP_SSH') && FTP_SSH) || (defined('FS_METHOD') && 'ssh' == FS_METHOD) ) + $credentials['connection_type'] = 'ssh'; + else if ( (defined('FTP_SSL') && FTP_SSL) && 'ftpext' == $type ) //Only the FTP Extension understands SSL + $credentials['connection_type'] = 'ftps'; + else if ( !empty($_POST['connection_type']) ) + $credentials['connection_type'] = stripslashes($_POST['connection_type']); + else if ( !isset($credentials['connection_type']) ) //All else fails (And its not defaulted to something else saved), Default to FTP + $credentials['connection_type'] = 'ftp'; + + if ( ! $error && + ( + ( !empty($credentials['password']) && !empty($credentials['username']) && !empty($credentials['hostname']) ) || + ( 'ssh' == $credentials['connection_type'] && !empty($credentials['public_key']) && !empty($credentials['private_key']) ) + ) ) { + $stored_credentials = $credentials; + if ( !empty($stored_credentials['port']) ) //save port as part of hostname to simplify above code. + $stored_credentials['hostname'] .= ':' . $stored_credentials['port']; + + unset($stored_credentials['password'], $stored_credentials['port'], $stored_credentials['private_key'], $stored_credentials['public_key']); + update_option('ftp_credentials', $stored_credentials); + return $credentials; + } + $hostname = ''; + $username = ''; + $password = ''; + $connection_type = ''; + if ( !empty($credentials) ) + extract($credentials, EXTR_OVERWRITE); + if ( $error ) { + $error_string = __('Error: There was an error connecting to the server, Please verify the settings are correct.'); + if ( is_wp_error($error) ) + $error_string = esc_html( $error->get_error_message() ); + echo '

' . $error_string . '

'; + } + + $types = array(); + if ( extension_loaded('ftp') || extension_loaded('sockets') || function_exists('fsockopen') ) + $types[ 'ftp' ] = __('FTP'); + if ( extension_loaded('ftp') ) //Only this supports FTPS + $types[ 'ftps' ] = __('FTPS (SSL)'); + if ( extension_loaded('ssh2') && function_exists('stream_get_contents') ) + $types[ 'ssh' ] = __('SSH2'); + + $types = apply_filters('fs_ftp_connection_types', $types, $credentials, $type, $error, $context); + +?> + +
+
+ +

+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
" size="40" />
size="40" />
size="40" />
+
+
+ +

size="40" />
size="40" /> +
+
+ $text ) : ?> + + +
+
+ +'; +} +submit_button( __( 'Proceed' ), 'button', 'upgrade' ); +?> +
+
+ diff --git a/src/wp-admin/includes/image-edit.php b/src/wp-admin/includes/image-edit.php new file mode 100644 index 0000000..86cdfe2 --- /dev/null +++ b/src/wp-admin/includes/image-edit.php @@ -0,0 +1,668 @@ + 400 ? 400 / $big : 1; + + $backup_sizes = get_post_meta( $post_id, '_wp_attachment_backup_sizes', true ); + $can_restore = !empty($backup_sizes) && isset($backup_sizes['full-orig']) + && $backup_sizes['full-orig']['file'] != basename($meta['file']); + + if ( $msg ) { + if ( isset($msg->error) ) + $note = "

$msg->error

"; + elseif ( isset($msg->msg) ) + $note = "

$msg->msg

"; + } + + ?> +
+ + + + + +
+
+
, this)" class="imgedit-crop disabled" title="">
+
, this)" title="">
+
, this)" title="">
+ +
+
+ + +
, this)" class="imgedit-flipv" title="">
+
, this)" class="imgedit-fliph" title="">
+ +
, this)" class="imgedit-undo disabled" title="">
+
, this)" class="imgedit-redo disabled" title="">
+
+
+ + + + + + + + + +
+ +
+ +
+ + )" disabled="disabled" class="button-primary imgedit-submit-btn" value="" /> +
+
+
+
+ +
+

+

+
+ × + ! + , 'scale')" class="button-primary" value="" /> +
+
+
+ + + +
+ +
+

+
+ , 'restore')" class="button-primary" value="" /> +
+
+
+ + + +
+ +
+
+ + +
+

+ +
    +
  • +
  • +
  • +
  • +
  • +
+ +


+

+ +


+

+
+
+ +

+ + + + : + + +

+ +

+ + + + : + + +

+
+ + + +
+
+ + +

+
+ +

+
+

+ +

+
+ + + + + + +

+
+ + + +
+
+ + +
+ 400 ? (400 / $max) : 1; +} + +function _rotate_image_resource($img, $angle) { + if ( function_exists('imagerotate') ) { + $rotated = imagerotate($img, $angle, 0); + if ( is_resource($rotated) ) { + imagedestroy($img); + $img = $rotated; + } + } + return $img; +} + + +function _flip_image_resource($img, $horz, $vert) { + $w = imagesx($img); + $h = imagesy($img); + $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, $img, 0, 0, $sx, $sy, $w, $h, $sw, $sh) ) { + imagedestroy($img); + $img = $dst; + } + } + return $img; +} + +function _crop_image_resource($img, $x, $y, $w, $h) { + $dst = wp_imagecreatetruecolor($w, $h); + if ( is_resource($dst) ) { + if ( imagecopy($dst, $img, 0, 0, $x, $y, $w, $h) ) { + imagedestroy($img); + $img = $dst; + } + } + return $img; +} + +function image_edit_apply_changes($img, $changes) { + + if ( !is_array($changes) ) + return $img; + + // expand change operations + foreach ( $changes as $key => $obj ) { + if ( isset($obj->r) ) { + $obj->type = 'rotate'; + $obj->angle = $obj->r; + unset($obj->r); + } elseif ( isset($obj->f) ) { + $obj->type = 'flip'; + $obj->axis = $obj->f; + unset($obj->f); + } elseif ( isset($obj->c) ) { + $obj->type = 'crop'; + $obj->sel = $obj->c; + unset($obj->c); + } + $changes[$key] = $obj; + } + + // combine operations + if ( count($changes) > 1 ) { + $filtered = array($changes[0]); + for ( $i = 0, $j = 1; $j < count($changes); $j++ ) { + $combined = false; + if ( $filtered[$i]->type == $changes[$j]->type ) { + switch ( $filtered[$i]->type ) { + case 'rotate': + $filtered[$i]->angle += $changes[$j]->angle; + $combined = true; + break; + case 'flip': + $filtered[$i]->axis ^= $changes[$j]->axis; + $combined = true; + break; + } + } + if ( !$combined ) + $filtered[++$i] = $changes[$j]; + } + $changes = $filtered; + unset($filtered); + } + + // image resource before applying the changes + $img = apply_filters('image_edit_before_change', $img, $changes); + + foreach ( $changes as $operation ) { + switch ( $operation->type ) { + case 'rotate': + if ( $operation->angle != 0 ) + $img = _rotate_image_resource($img, $operation->angle); + break; + case 'flip': + if ( $operation->axis != 0 ) + $img = _flip_image_resource($img, ($operation->axis & 1) != 0, ($operation->axis & 2) != 0); + break; + case 'crop': + $sel = $operation->sel; + $scale = 1 / _image_get_preview_ratio( imagesx($img), imagesy($img) ); // discard preview scaling + $img = _crop_image_resource($img, $sel->x * $scale, $sel->y * $scale, $sel->w * $scale, $sel->h * $scale); + break; + } + } + + return $img; +} + +function stream_preview_image($post_id) { + $post = get_post($post_id); + @ini_set( 'memory_limit', apply_filters( 'admin_memory_limit', WP_MAX_MEMORY_LIMIT ) ); + $img = load_image_to_edit( $post_id, $post->post_mime_type, array(400, 400) ); + + if ( !is_resource($img) ) + return false; + + $changes = !empty($_REQUEST['history']) ? json_decode( stripslashes($_REQUEST['history']) ) : null; + if ( $changes ) + $img = image_edit_apply_changes($img, $changes); + + // scale the image + $w = imagesx($img); + $h = imagesy($img); + $ratio = _image_get_preview_ratio($w, $h); + $w2 = $w * $ratio; + $h2 = $h * $ratio; + + $preview = wp_imagecreatetruecolor($w2, $h2); + imagecopyresampled( $preview, $img, 0, 0, 0, 0, $w2, $h2, $w, $h ); + wp_stream_image($preview, $post->post_mime_type, $post_id); + + imagedestroy($preview); + imagedestroy($img); + return true; +} + +function wp_restore_image($post_id) { + $meta = wp_get_attachment_metadata($post_id); + $file = get_attached_file($post_id); + $backup_sizes = get_post_meta( $post_id, '_wp_attachment_backup_sizes', true ); + $restored = false; + $msg = new stdClass; + + if ( !is_array($backup_sizes) ) { + $msg->error = __('Cannot load image metadata.'); + return $msg; + } + + $parts = pathinfo($file); + $suffix = time() . rand(100, 999); + $default_sizes = apply_filters( 'intermediate_image_sizes', array('large', 'medium', 'thumbnail') ); + + if ( isset($backup_sizes['full-orig']) && is_array($backup_sizes['full-orig']) ) { + $data = $backup_sizes['full-orig']; + + if ( $parts['basename'] != $data['file'] ) { + if ( defined('IMAGE_EDIT_OVERWRITE') && IMAGE_EDIT_OVERWRITE ) { + // delete only if it's edited image + if ( preg_match('/-e[0-9]{13}\./', $parts['basename']) ) { + $delpath = apply_filters('wp_delete_file', $file); + @unlink($delpath); + } + } else { + $backup_sizes["full-$suffix"] = array('width' => $meta['width'], 'height' => $meta['height'], 'file' => $parts['basename']); + } + } + + $restored_file = path_join($parts['dirname'], $data['file']); + $restored = update_attached_file($post_id, $restored_file); + + $meta['file'] = _wp_relative_upload_path( $restored_file ); + $meta['width'] = $data['width']; + $meta['height'] = $data['height']; + list ( $uwidth, $uheight ) = wp_constrain_dimensions($meta['width'], $meta['height'], 128, 96); + $meta['hwstring_small'] = "height='$uheight' width='$uwidth'"; + } + + foreach ( $default_sizes as $default_size ) { + if ( isset($backup_sizes["$default_size-orig"]) ) { + $data = $backup_sizes["$default_size-orig"]; + if ( isset($meta['sizes'][$default_size]) && $meta['sizes'][$default_size]['file'] != $data['file'] ) { + if ( defined('IMAGE_EDIT_OVERWRITE') && IMAGE_EDIT_OVERWRITE ) { + // delete only if it's edited image + if ( preg_match('/-e[0-9]{13}-/', $meta['sizes'][$default_size]['file']) ) { + $delpath = apply_filters( 'wp_delete_file', path_join($parts['dirname'], $meta['sizes'][$default_size]['file']) ); + @unlink($delpath); + } + } else { + $backup_sizes["$default_size-{$suffix}"] = $meta['sizes'][$default_size]; + } + } + + $meta['sizes'][$default_size] = $data; + } else { + unset($meta['sizes'][$default_size]); + } + } + + if ( !wp_update_attachment_metadata($post_id, $meta) || !update_post_meta( $post_id, '_wp_attachment_backup_sizes', $backup_sizes) ) { + $msg->error = __('Cannot save image metadata.'); + return $msg; + } + + if ( !$restored ) + $msg->error = __('Image metadata is inconsistent.'); + else + $msg->msg = __('Image restored successfully.'); + + return $msg; +} + +function wp_save_image($post_id) { + $return = new stdClass; + $success = $delete = $scaled = $nocrop = false; + $post = get_post($post_id); + @ini_set( 'memory_limit', apply_filters( 'admin_memory_limit', WP_MAX_MEMORY_LIMIT ) ); + $img = load_image_to_edit($post_id, $post->post_mime_type); + + if ( !is_resource($img) ) { + $return->error = esc_js( __('Unable to create new image.') ); + return $return; + } + + $fwidth = !empty($_REQUEST['fwidth']) ? intval($_REQUEST['fwidth']) : 0; + $fheight = !empty($_REQUEST['fheight']) ? intval($_REQUEST['fheight']) : 0; + $target = !empty($_REQUEST['target']) ? preg_replace('/[^a-z0-9_-]+/i', '', $_REQUEST['target']) : ''; + $scale = !empty($_REQUEST['do']) && 'scale' == $_REQUEST['do']; + + if ( $scale && $fwidth > 0 && $fheight > 0 ) { + $sX = imagesx($img); + $sY = imagesy($img); + + // check if it has roughly the same w / h ratio + $diff = round($sX / $sY, 2) - round($fwidth / $fheight, 2); + if ( -0.1 < $diff && $diff < 0.1 ) { + // scale the full size image + $dst = wp_imagecreatetruecolor($fwidth, $fheight); + if ( imagecopyresampled( $dst, $img, 0, 0, 0, 0, $fwidth, $fheight, $sX, $sY ) ) { + imagedestroy($img); + $img = $dst; + $scaled = true; + } + } + + if ( !$scaled ) { + $return->error = esc_js( __('Error while saving the scaled image. Please reload the page and try again.') ); + return $return; + } + } elseif ( !empty($_REQUEST['history']) ) { + $changes = json_decode( stripslashes($_REQUEST['history']) ); + if ( $changes ) + $img = image_edit_apply_changes($img, $changes); + } else { + $return->error = esc_js( __('Nothing to save, the image has not changed.') ); + return $return; + } + + $meta = wp_get_attachment_metadata($post_id); + $backup_sizes = get_post_meta( $post->ID, '_wp_attachment_backup_sizes', true ); + + if ( !is_array($meta) ) { + $return->error = esc_js( __('Image data does not exist. Please re-upload the image.') ); + return $return; + } + + if ( !is_array($backup_sizes) ) + $backup_sizes = array(); + + // generate new filename + $path = get_attached_file($post_id); + $path_parts = pathinfo( $path ); + $filename = $path_parts['filename']; + $suffix = time() . rand(100, 999); + + if ( defined('IMAGE_EDIT_OVERWRITE') && IMAGE_EDIT_OVERWRITE && + isset($backup_sizes['full-orig']) && $backup_sizes['full-orig']['file'] != $path_parts['basename'] ) { + + if ( 'thumbnail' == $target ) + $new_path = "{$path_parts['dirname']}/{$filename}-temp.{$path_parts['extension']}"; + else + $new_path = $path; + } else { + while( true ) { + $filename = preg_replace( '/-e([0-9]+)$/', '', $filename ); + $filename .= "-e{$suffix}"; + $new_filename = "{$filename}.{$path_parts['extension']}"; + $new_path = "{$path_parts['dirname']}/$new_filename"; + if ( file_exists($new_path) ) + $suffix++; + else + break; + } + } + + // save the full-size file, also needed to create sub-sizes + if ( !wp_save_image_file($new_path, $img, $post->post_mime_type, $post_id) ) { + $return->error = esc_js( __('Unable to save the image.') ); + return $return; + } + + if ( 'nothumb' == $target || 'all' == $target || 'full' == $target || $scaled ) { + $tag = false; + if ( isset($backup_sizes['full-orig']) ) { + if ( ( !defined('IMAGE_EDIT_OVERWRITE') || !IMAGE_EDIT_OVERWRITE ) && $backup_sizes['full-orig']['file'] != $path_parts['basename'] ) + $tag = "full-$suffix"; + } else { + $tag = 'full-orig'; + } + + if ( $tag ) + $backup_sizes[$tag] = array('width' => $meta['width'], 'height' => $meta['height'], 'file' => $path_parts['basename']); + + $success = update_attached_file($post_id, $new_path); + + $meta['file'] = _wp_relative_upload_path($new_path); + $meta['width'] = imagesx($img); + $meta['height'] = imagesy($img); + + list ( $uwidth, $uheight ) = wp_constrain_dimensions($meta['width'], $meta['height'], 128, 96); + $meta['hwstring_small'] = "height='$uheight' width='$uwidth'"; + + if ( $success && ('nothumb' == $target || 'all' == $target) ) { + $sizes = apply_filters( 'intermediate_image_sizes', array('large', 'medium', 'thumbnail') ); + if ( 'nothumb' == $target ) + $sizes = array_diff( $sizes, array('thumbnail') ); + } + + $return->fw = $meta['width']; + $return->fh = $meta['height']; + } elseif ( 'thumbnail' == $target ) { + $sizes = array( 'thumbnail' ); + $success = $delete = $nocrop = true; + } + + if ( isset($sizes) ) { + foreach ( $sizes as $size ) { + $tag = false; + if ( isset($meta['sizes'][$size]) ) { + if ( isset($backup_sizes["$size-orig"]) ) { + if ( ( !defined('IMAGE_EDIT_OVERWRITE') || !IMAGE_EDIT_OVERWRITE ) && $backup_sizes["$size-orig"]['file'] != $meta['sizes'][$size]['file'] ) + $tag = "$size-$suffix"; + } else { + $tag = "$size-orig"; + } + + if ( $tag ) + $backup_sizes[$tag] = $meta['sizes'][$size]; + } + + $crop = $nocrop ? false : get_option("{$size}_crop"); + $resized = image_make_intermediate_size($new_path, get_option("{$size}_size_w"), get_option("{$size}_size_h"), $crop ); + + if ( $resized ) + $meta['sizes'][$size] = $resized; + else + unset($meta['sizes'][$size]); + } + } + + if ( $success ) { + wp_update_attachment_metadata($post_id, $meta); + update_post_meta( $post_id, '_wp_attachment_backup_sizes', $backup_sizes); + + if ( $target == 'thumbnail' || $target == 'all' || $target == 'full' ) { + $file_url = wp_get_attachment_url($post_id); + if ( $thumb = $meta['sizes']['thumbnail'] ) + $return->thumbnail = path_join( dirname($file_url), $thumb['file'] ); + else + $return->thumbnail = "$file_url?w=128&h=128"; + } + } else { + $delete = true; + } + + if ( $delete ) { + $delpath = apply_filters('wp_delete_file', $new_path); + @unlink($delpath); + } + + imagedestroy($img); + + $return->msg = esc_js( __('Image saved') ); + return $return; +} + diff --git a/src/wp-admin/includes/image.php b/src/wp-admin/includes/image.php new file mode 100644 index 0000000..44329c0 --- /dev/null +++ b/src/wp-admin/includes/image.php @@ -0,0 +1,341 @@ + '', 'height' => '', 'crop' => FALSE ); + if ( isset( $_wp_additional_image_sizes[$s]['width'] ) ) + $sizes[$s]['width'] = intval( $_wp_additional_image_sizes[$s]['width'] ); // For theme-added sizes + else + $sizes[$s]['width'] = get_option( "{$s}_size_w" ); // For default sizes set in options + if ( isset( $_wp_additional_image_sizes[$s]['height'] ) ) + $sizes[$s]['height'] = intval( $_wp_additional_image_sizes[$s]['height'] ); // For theme-added sizes + else + $sizes[$s]['height'] = get_option( "{$s}_size_h" ); // For default sizes set in options + if ( isset( $_wp_additional_image_sizes[$s]['crop'] ) ) + $sizes[$s]['crop'] = intval( $_wp_additional_image_sizes[$s]['crop'] ); // For theme-added sizes + else + $sizes[$s]['crop'] = get_option( "{$s}_crop" ); // For default sizes set in options + } + + $sizes = apply_filters( 'intermediate_image_sizes_advanced', $sizes ); + + foreach ($sizes as $size => $size_data ) { + $resized = image_make_intermediate_size( $file, $size_data['width'], $size_data['height'], $size_data['crop'] ); + if ( $resized ) + $metadata['sizes'][$size] = $resized; + } + + // fetch additional metadata from exif/iptc + $image_meta = wp_read_image_metadata( $file ); + if ( $image_meta ) + $metadata['image_meta'] = $image_meta; + + } + + return apply_filters( 'wp_generate_attachment_metadata', $metadata, $attachment_id ); +} + +/** + * Calculated the new dimentions for a downsampled image. + * + * @since 2.0.0 + * @see wp_constrain_dimensions() + * + * @param int $width Current width of the image + * @param int $height Current height of the image + * @return mixed Array(height,width) of shrunk dimensions. + */ +function get_udims( $width, $height) { + return wp_constrain_dimensions( $width, $height, 128, 96 ); +} + +/** + * Convert a fraction string to a decimal. + * + * @since 2.5.0 + * + * @param string $str + * @return int|float + */ +function wp_exif_frac2dec($str) { + @list( $n, $d ) = explode( '/', $str ); + if ( !empty($d) ) + return $n / $d; + return $str; +} + +/** + * Convert the exif date format to a unix timestamp. + * + * @since 2.5.0 + * + * @param string $str + * @return int + */ +function wp_exif_date2ts($str) { + @list( $date, $time ) = explode( ' ', trim($str) ); + @list( $y, $m, $d ) = explode( ':', $date ); + + return strtotime( "{$y}-{$m}-{$d} {$time}" ); +} + +/** + * Get extended image metadata, exif or iptc as available. + * + * Retrieves the EXIF metadata aperture, credit, camera, caption, copyright, iso + * created_timestamp, focal_length, shutter_speed, and title. + * + * The IPTC metadata that is retrieved is APP13, credit, byline, created date + * and time, caption, copyright, and title. Also includes FNumber, Model, + * DateTimeDigitized, FocalLength, ISOSpeedRatings, and ExposureTime. + * + * @todo Try other exif libraries if available. + * @since 2.5.0 + * + * @param string $file + * @return bool|array False on failure. Image metadata array on success. + */ +function wp_read_image_metadata( $file ) { + if ( ! file_exists( $file ) ) + return false; + + list( , , $sourceImageType ) = getimagesize( $file ); + + // exif contains a bunch of data we'll probably never need formatted in ways + // that are difficult to use. We'll normalize it and just extract the fields + // that are likely to be useful. Fractions and numbers are converted to + // floats, dates to unix timestamps, and everything else to strings. + $meta = array( + 'aperture' => 0, + 'credit' => '', + 'camera' => '', + 'caption' => '', + 'created_timestamp' => 0, + 'copyright' => '', + 'focal_length' => 0, + 'iso' => 0, + 'shutter_speed' => 0, + 'title' => '', + ); + + // read iptc first, since it might contain data not available in exif such + // as caption, description etc + if ( is_callable( 'iptcparse' ) ) { + getimagesize( $file, $info ); + + if ( ! empty( $info['APP13'] ) ) { + $iptc = iptcparse( $info['APP13'] ); + + // headline, "A brief synopsis of the caption." + if ( ! empty( $iptc['2#105'][0] ) ) + $meta['title'] = utf8_encode( trim( $iptc['2#105'][0] ) ); + // title, "Many use the Title field to store the filename of the image, though the field may be used in many ways." + elseif ( ! empty( $iptc['2#005'][0] ) ) + $meta['title'] = utf8_encode( trim( $iptc['2#005'][0] ) ); + + if ( ! empty( $iptc['2#120'][0] ) ) { // description / legacy caption + $caption = utf8_encode( trim( $iptc['2#120'][0] ) ); + if ( empty( $meta['title'] ) ) { + // Assume the title is stored in 2:120 if it's short. + if ( strlen( $caption ) < 80 ) + $meta['title'] = $caption; + else + $meta['caption'] = $caption; + } elseif ( $caption != $meta['title'] ) { + $meta['caption'] = $caption; + } + } + + if ( ! empty( $iptc['2#110'][0] ) ) // credit + $meta['credit'] = utf8_encode(trim($iptc['2#110'][0])); + elseif ( ! empty( $iptc['2#080'][0] ) ) // creator / legacy byline + $meta['credit'] = utf8_encode(trim($iptc['2#080'][0])); + + if ( ! empty( $iptc['2#055'][0] ) and ! empty( $iptc['2#060'][0] ) ) // created date and time + $meta['created_timestamp'] = strtotime( $iptc['2#055'][0] . ' ' . $iptc['2#060'][0] ); + + if ( ! empty( $iptc['2#116'][0] ) ) // copyright + $meta['copyright'] = utf8_encode( trim( $iptc['2#116'][0] ) ); + } + } + + // fetch additional info from exif if available + if ( is_callable( 'exif_read_data' ) && in_array( $sourceImageType, apply_filters( 'wp_read_image_metadata_types', array( IMAGETYPE_JPEG, IMAGETYPE_TIFF_II, IMAGETYPE_TIFF_MM ) ) ) ) { + $exif = @exif_read_data( $file ); + + if ( !empty( $exif['Title'] ) ) + $meta['title'] = utf8_encode( trim( $exif['Title'] ) ); + + if ( ! empty( $exif['ImageDescription'] ) ) { + if ( empty( $meta['title'] ) && strlen( $exif['ImageDescription'] ) < 80 ) { + // Assume the title is stored in ImageDescription + $meta['title'] = utf8_encode( trim( $exif['ImageDescription'] ) ); + if ( ! empty( $exif['COMPUTED']['UserComment'] ) && trim( $exif['COMPUTED']['UserComment'] ) != $meta['title'] ) + $meta['caption'] = utf8_encode( trim( $exif['COMPUTED']['UserComment'] ) ); + } elseif ( trim( $exif['ImageDescription'] ) != $meta['title'] ) { + $meta['caption'] = utf8_encode( trim( $exif['ImageDescription'] ) ); + } + } elseif ( ! empty( $exif['Comments'] ) && trim( $exif['Comments'] ) != $meta['title'] ) { + $meta['caption'] = utf8_encode( trim( $exif['Comments'] ) ); + } + + if ( ! empty( $exif['Artist'] ) ) + $meta['credit'] = utf8_encode( trim( $exif['Artist'] ) ); + elseif ( ! empty($exif['Author'] ) ) + $meta['credit'] = utf8_encode( trim( $exif['Author'] ) ); + + if ( ! empty( $exif['Copyright'] ) ) + $meta['copyright'] = utf8_encode( trim( $exif['Copyright'] ) ); + if ( ! empty($exif['FNumber'] ) ) + $meta['aperture'] = round( wp_exif_frac2dec( $exif['FNumber'] ), 2 ); + if ( ! empty($exif['Model'] ) ) + $meta['camera'] = utf8_encode( trim( $exif['Model'] ) ); + if ( ! empty($exif['DateTimeDigitized'] ) ) + $meta['created_timestamp'] = wp_exif_date2ts($exif['DateTimeDigitized'] ); + if ( ! empty($exif['FocalLength'] ) ) + $meta['focal_length'] = wp_exif_frac2dec( $exif['FocalLength'] ); + if ( ! empty($exif['ISOSpeedRatings'] ) ) + $meta['iso'] = utf8_encode( trim( $exif['ISOSpeedRatings'] ) ); + if ( ! empty($exif['ExposureTime'] ) ) + $meta['shutter_speed'] = wp_exif_frac2dec( $exif['ExposureTime'] ); + } + + return apply_filters( 'wp_read_image_metadata', $meta, $file, $sourceImageType ); + +} + +/** + * Validate that file is an image. + * + * @since 2.5.0 + * + * @param string $path File path to test if valid image. + * @return bool True if valid image, false if not valid image. + */ +function file_is_valid_image($path) { + $size = @getimagesize($path); + return !empty($size); +} + +/** + * Validate that file is suitable for displaying within a web page. + * + * @since 2.5.0 + * @uses apply_filters() Calls 'file_is_displayable_image' on $result and $path. + * + * @param string $path File path to test. + * @return bool True if suitable, false if not suitable. + */ +function file_is_displayable_image($path) { + $info = @getimagesize($path); + if ( empty($info) ) + $result = false; + elseif ( !in_array($info[2], array(IMAGETYPE_GIF, IMAGETYPE_JPEG, IMAGETYPE_PNG)) ) // only gif, jpeg and png images can reliably be displayed + $result = false; + else + $result = true; + + return apply_filters('file_is_displayable_image', $result, $path); +} diff --git a/src/wp-admin/includes/import.php b/src/wp-admin/includes/import.php new file mode 100644 index 0000000..f57be76 --- /dev/null +++ b/src/wp-admin/includes/import.php @@ -0,0 +1,97 @@ + false, 'test_type' => false ); + $_FILES['import']['name'] .= '.txt'; + $file = wp_handle_upload( $_FILES['import'], $overrides ); + + if ( isset( $file['error'] ) ) + return $file; + + $url = $file['url']; + $type = $file['type']; + $file = $file['file']; + $filename = basename( $file ); + + // Construct the object array + $object = array( 'post_title' => $filename, + 'post_content' => $url, + 'post_mime_type' => $type, + 'guid' => $url, + 'context' => 'import', + 'post_status' => 'private' + ); + + // Save the data + $id = wp_insert_attachment( $object, $file ); + + // schedule a cleanup for one day from now in case of failed import or missing wp_import_cleanup() call + wp_schedule_single_event( time() + 86400, 'importer_scheduled_cleanup', array( $id ) ); + + return array( 'file' => $file, 'id' => $id ); +} + +?> diff --git a/src/wp-admin/includes/internal-linking.php b/src/wp-admin/includes/internal-linking.php new file mode 100644 index 0000000..a95c01b --- /dev/null +++ b/src/wp-admin/includes/internal-linking.php @@ -0,0 +1,124 @@ + 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', + 'order' => 'DESC', + 'orderby' => 'post_date', + '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; + + // 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, + ); + } + + return $results; +} + +/** + * Dialog for internal linking. + * + * @since 3.1.0 + */ +function wp_link_dialog() { +?> + + diff --git a/src/wp-admin/includes/list-table.php b/src/wp-admin/includes/list-table.php new file mode 100644 index 0000000..716e80a --- /dev/null +++ b/src/wp-admin/includes/list-table.php @@ -0,0 +1,104 @@ + 'posts', + 'WP_Media_List_Table' => 'media', + 'WP_Terms_List_Table' => 'terms', + 'WP_Users_List_Table' => 'users', + 'WP_Comments_List_Table' => 'comments', + 'WP_Post_Comments_List_Table' => 'comments', + 'WP_Links_List_Table' => 'links', + 'WP_Plugin_Install_List_Table' => 'plugin-install', + 'WP_Themes_List_Table' => 'themes', + 'WP_Theme_Install_List_Table' => 'theme-install', + 'WP_Plugins_List_Table' => 'plugins', + // Network Admin + 'WP_MS_Sites_List_Table' => 'ms-sites', + 'WP_MS_Users_List_Table' => 'ms-users', + 'WP_MS_Themes_List_Table' => 'ms-themes', + ); + + if ( isset( $core_classes[ $class ] ) ) { + require_once( ABSPATH . 'wp-admin/includes/class-wp-' . $core_classes[ $class ] . '-list-table.php' ); + return new $class; + } + + return false; +} + +/** + * Register column headers for a particular screen. + * + * @since 2.7.0 + * + * @param string $screen The handle for the screen to add help to. This is usually the hook name returned by the add_*_page() functions. + * @param array $columns An array of columns with column IDs as the keys and translated column names as the values + * @see get_column_headers(), print_column_headers(), get_hidden_columns() + */ +function register_column_headers($screen, $columns) { + $wp_list_table = new _WP_List_Table_Compat($screen, $columns); +} + +/** + * Prints column headers for a particular screen. + * + * @since 2.7.0 + */ +function print_column_headers($screen, $id = true) { + $wp_list_table = new _WP_List_Table_Compat($screen); + + $wp_list_table->print_column_headers($id); +} + +/** + * Helper class to be used only by back compat functions + * + * @since 3.1.0 + */ +class _WP_List_Table_Compat extends WP_List_Table { + var $_screen; + var $_columns; + + function _WP_List_Table_Compat( $screen, $columns = array() ) { + if ( is_string( $screen ) ) + $screen = convert_to_screen( $screen ); + + $this->_screen = $screen; + + if ( !empty( $columns ) ) { + $this->_columns = $columns; + add_filter( 'manage_' . $screen->id . '_columns', array( &$this, 'get_columns' ), 0 ); + } + } + + function get_column_info() { + $columns = get_column_headers( $this->_screen ); + $hidden = get_hidden_columns( $this->_screen ); + $sortable = array(); + + return array( $columns, $hidden, $sortable ); + } + + function get_columns() { + return $this->_columns; + } +} +?> \ No newline at end of file diff --git a/src/wp-admin/includes/manifest.php b/src/wp-admin/includes/manifest.php new file mode 100644 index 0000000..600b5db --- /dev/null +++ b/src/wp-admin/includes/manifest.php @@ -0,0 +1,203 @@ + __('From Computer'), // handler action suffix => tab text + 'type_url' => __('From URL'), + 'gallery' => __('Gallery'), + 'library' => __('Media Library') + ); + + return apply_filters('media_upload_tabs', $_default_tabs); +} + +/** + * {@internal Missing Short Description}} + * + * @since 2.5.0 + * + * @param unknown_type $tabs + * @return unknown + */ +function update_gallery_tab($tabs) { + global $wpdb; + + if ( !isset($_REQUEST['post_id']) ) { + unset($tabs['gallery']); + return $tabs; + } + + $post_id = intval($_REQUEST['post_id']); + + if ( $post_id ) + $attachments = intval( $wpdb->get_var( $wpdb->prepare( "SELECT count(*) FROM $wpdb->posts WHERE post_type = 'attachment' AND post_status != 'trash' AND post_parent = %d", $post_id ) ) ); + + if ( empty($attachments) ) { + unset($tabs['gallery']); + return $tabs; + } + + $tabs['gallery'] = sprintf(__('Gallery (%s)'), "$attachments"); + + return $tabs; +} +add_filter('media_upload_tabs', 'update_gallery_tab'); + +/** + * {@internal Missing Short Description}} + * + * @since 2.5.0 + */ +function the_media_upload_tabs() { + global $redir_tab; + $tabs = media_upload_tabs(); + + if ( !empty($tabs) ) { + echo "
    \n"; + if ( isset($redir_tab) && array_key_exists($redir_tab, $tabs) ) + $current = $redir_tab; + elseif ( isset($_GET['tab']) && array_key_exists($_GET['tab'], $tabs) ) + $current = $_GET['tab']; + else + $current = apply_filters('media_upload_default_tab', 'type'); + + foreach ( $tabs as $callback => $text ) { + $class = ''; + if ( $current == $callback ) + $class = " class='current'"; + $href = add_query_arg(array('tab'=>$callback, 's'=>false, 'paged'=>false, 'post_mime_type'=>false, 'm'=>false)); + $link = "$text"; + echo "\t
  • $link
  • \n"; + } + echo "
\n"; + } +} + +/** + * {@internal Missing Short Description}} + * + * @since 2.5.0 + * + * @param unknown_type $id + * @param unknown_type $alt + * @param unknown_type $title + * @param unknown_type $align + * @param unknown_type $url + * @param unknown_type $rel + * @param unknown_type $size + * @return unknown + */ +function get_image_send_to_editor($id, $caption, $title, $align, $url='', $rel = false, $size='medium', $alt = '') { + + $html = get_image_tag($id, $alt, $title, $align, $size); + + $rel = $rel ? ' rel="attachment wp-att-' . esc_attr($id).'"' : ''; + + if ( $url ) + $html = '$html"; + + $html = apply_filters( 'image_send_to_editor', $html, $id, $caption, $title, $align, $url, $size, $alt ); + + return $html; +} + +/** + * {@internal Missing Short Description}} + * + * @since 2.6.0 + * + * @param unknown_type $html + * @param unknown_type $id + * @param unknown_type $alt + * @param unknown_type $title + * @param unknown_type $align + * @param unknown_type $url + * @param unknown_type $size + * @return unknown + */ +function image_add_caption( $html, $id, $caption, $title, $align, $url, $size, $alt = '' ) { + + if ( empty($caption) || apply_filters( 'disable_captions', '' ) ) + return $html; + + $id = ( 0 < (int) $id ) ? 'attachment_' . $id : ''; + + if ( ! preg_match( '/width="([0-9]+)/', $html, $matches ) ) + return $html; + + $width = $matches[1]; + + $caption = str_replace( array( '>', '<', '"', "'" ), + array( '>', '<', '"', ''' ), + $caption + ); + + $html = preg_replace( '/(class=["\'][^\'"]*)align(none|left|right|center)\s?/', '$1', $html ); + if ( empty($align) ) + $align = 'none'; + + $shcode = '[caption id="' . $id . '" align="align' . $align + . '" width="' . $width . '" caption="' . addslashes($caption) . '"]' . $html . '[/caption]'; + + return apply_filters( 'image_add_caption_shortcode', $shcode, $html ); +} +add_filter( 'image_send_to_editor', 'image_add_caption', 20, 8 ); + +/** + * {@internal Missing Short Description}} + * + * @since 2.5.0 + * + * @param unknown_type $html + */ +function media_send_to_editor($html) { +?> + + false )) { + + $time = current_time('mysql'); + if ( $post = get_post($post_id) ) { + if ( substr( $post->post_date, 0, 4 ) > 0 ) + $time = $post->post_date; + } + + $name = $_FILES[$file_id]['name']; + $file = wp_handle_upload($_FILES[$file_id], $overrides, $time); + + if ( isset($file['error']) ) + return new WP_Error( 'upload_error', $file['error'] ); + + $name_parts = pathinfo($name); + $name = trim( substr( $name, 0, -(1 + strlen($name_parts['extension'])) ) ); + + $url = $file['url']; + $type = $file['type']; + $file = $file['file']; + $title = $name; + $content = ''; + + // use image exif/iptc data for title and caption defaults if possible + if ( $image_meta = @wp_read_image_metadata($file) ) { + if ( trim( $image_meta['title'] ) && ! is_numeric( sanitize_title( $image_meta['title'] ) ) ) + $title = $image_meta['title']; + if ( trim( $image_meta['caption'] ) ) + $content = $image_meta['caption']; + } + + // Construct the attachment array + $attachment = array_merge( array( + 'post_mime_type' => $type, + 'guid' => $url, + 'post_parent' => $post_id, + 'post_title' => $title, + 'post_content' => $content, + ), $post_data ); + + // This should never be set as it would then overwrite an existing attachment. + if ( isset( $attachment['ID'] ) ) + unset( $attachment['ID'] ); + + // Save the data + $id = wp_insert_attachment($attachment, $file, $post_id); + if ( !is_wp_error($id) ) { + wp_update_attachment_metadata( $id, wp_generate_attachment_metadata( $id, $file ) ); + } + + return $id; + +} + +/** + * This handles a sideloaded file in the same way as an uploaded file is handled by {@link media_handle_upload()} + * + * @since 2.6.0 + * + * @param array $file_array Array similar to a {@link $_FILES} upload array + * @param int $post_id The post ID the media is associated with + * @param string $desc Description of the sideloaded file + * @param array $post_data allows you to overwrite some of the attachment + * @return int|object The ID of the attachment or a WP_Error on failure + */ +function media_handle_sideload($file_array, $post_id, $desc = null, $post_data = array()) { + $overrides = array('test_form'=>false); + + $file = wp_handle_sideload($file_array, $overrides); + if ( isset($file['error']) ) + return new WP_Error( 'upload_error', $file['error'] ); + + $url = $file['url']; + $type = $file['type']; + $file = $file['file']; + $title = preg_replace('/\.[^.]+$/', '', basename($file)); + $content = ''; + + // use image exif/iptc data for title and caption defaults if possible + if ( $image_meta = @wp_read_image_metadata($file) ) { + if ( trim( $image_meta['title'] ) && ! is_numeric( sanitize_title( $image_meta['title'] ) ) ) + $title = $image_meta['title']; + if ( trim( $image_meta['caption'] ) ) + $content = $image_meta['caption']; + } + + $title = isset($desc) ? $desc : ''; + + // Construct the attachment array + $attachment = array_merge( array( + 'post_mime_type' => $type, + 'guid' => $url, + 'post_parent' => $post_id, + 'post_title' => $title, + 'post_content' => $content, + ), $post_data ); + + // This should never be set as it would then overwrite an existing attachment. + if ( isset( $attachment['ID'] ) ) + unset( $attachment['ID'] ); + + // Save the attachment metadata + $id = wp_insert_attachment($attachment, $file, $post_id); + if ( !is_wp_error($id) ) + wp_update_attachment_metadata( $id, wp_generate_attachment_metadata( $id, $file ) ); + + return $id; +} + +/** + * {@internal Missing Short Description}} + * + * Wrap iframe content (produced by $content_func) in a doctype, html head/body + * etc any additional function args will be passed to content_func. + * + * @since 2.5.0 + * + * @param unknown_type $content_func + */ +function wp_iframe($content_func /* ... */) { +?> + + > + + +<?php bloginfo('name') ?> › <?php _e('Uploads'); ?> — <?php _e('WordPress'); ?> + + + + + class="no-js"> + + + + + +$title"; +} + +function get_upload_iframe_src($type) { + global $post_ID, $temp_ID; + $uploading_iframe_ID = (int) (0 == $post_ID ? $temp_ID : $post_ID); + $upload_iframe_src = add_query_arg('post_id', $uploading_iframe_ID, 'media-upload.php'); + + if ( 'media' != $type ) + $upload_iframe_src = add_query_arg('type', $type, $upload_iframe_src); + $upload_iframe_src = apply_filters($type . '_upload_iframe_src', $upload_iframe_src); + + return add_query_arg('TB_iframe', true, $upload_iframe_src); +} + +/** + * {@internal Missing Short Description}} + * + * @since 2.5.0 + * + * @return unknown + */ +function media_upload_form_handler() { + check_admin_referer('media-form'); + + $errors = null; + + if ( isset($_POST['send']) ) { + $keys = array_keys($_POST['send']); + $send_id = (int) array_shift($keys); + } + + if ( !empty($_POST['attachments']) ) foreach ( $_POST['attachments'] as $attachment_id => $attachment ) { + $post = $_post = get_post($attachment_id, ARRAY_A); + $post_type_object = get_post_type_object( $post[ 'post_type' ] ); + + if ( !current_user_can( $post_type_object->cap->edit_post, $attachment_id ) ) + continue; + + if ( isset($attachment['post_content']) ) + $post['post_content'] = $attachment['post_content']; + if ( isset($attachment['post_title']) ) + $post['post_title'] = $attachment['post_title']; + if ( isset($attachment['post_excerpt']) ) + $post['post_excerpt'] = $attachment['post_excerpt']; + if ( isset($attachment['menu_order']) ) + $post['menu_order'] = $attachment['menu_order']; + + if ( isset($send_id) && $attachment_id == $send_id ) { + if ( isset($attachment['post_parent']) ) + $post['post_parent'] = $attachment['post_parent']; + } + + $post = apply_filters('attachment_fields_to_save', $post, $attachment); + + if ( isset($attachment['image_alt']) ) { + $image_alt = get_post_meta($attachment_id, '_wp_attachment_image_alt', true); + if ( $image_alt != stripslashes($attachment['image_alt']) ) { + $image_alt = wp_strip_all_tags( stripslashes($attachment['image_alt']), true ); + // update_meta expects slashed + update_post_meta( $attachment_id, '_wp_attachment_image_alt', addslashes($image_alt) ); + } + } + + if ( isset($post['errors']) ) { + $errors[$attachment_id] = $post['errors']; + unset($post['errors']); + } + + if ( $post != $_post ) + wp_update_post($post); + + foreach ( get_attachment_taxonomies($post) as $t ) { + if ( isset($attachment[$t]) ) + wp_set_object_terms($attachment_id, array_map('trim', preg_split('/,+/', $attachment[$t])), $t, false); + } + } + + if ( isset($_POST['insert-gallery']) || isset($_POST['update-gallery']) ) { ?> + + $html"; + } + + $html = apply_filters('media_send_to_editor', $html, $send_id, $attachment); + return media_send_to_editor($html); + } + + return $errors; +} + +/** + * {@internal Missing Short Description}} + * + * @since 2.5.0 + * + * @return unknown + */ +function media_upload_image() { + $errors = array(); + $id = 0; + + if ( isset($_POST['html-upload']) && !empty($_FILES) ) { + check_admin_referer('media-form'); + // Upload File button was clicked + $id = media_handle_upload('async-upload', $_REQUEST['post_id']); + unset($_FILES); + if ( is_wp_error($id) ) { + $errors['upload_error'] = $id; + $id = false; + } + } + + if ( !empty($_POST['insertonlybutton']) ) { + $alt = $align = ''; + + $src = $_POST['insertonly']['src']; + if ( !empty($src) && !strpos($src, '://') ) + $src = "http://$src"; + $alt = esc_attr($_POST['insertonly']['alt']); + if ( isset($_POST['insertonly']['align']) ) { + $align = esc_attr($_POST['insertonly']['align']); + $class = " class='align$align'"; + } + if ( !empty($src) ) + $html = "$alt"; + + $html = apply_filters('image_send_to_editor_url', $html, esc_url_raw($src), $alt, $align); + return media_send_to_editor($html); + } + + if ( !empty($_POST) ) { + $return = media_upload_form_handler(); + + if ( is_string($return) ) + return $return; + if ( is_array($return) ) + $errors = $return; + } + + if ( isset($_POST['save']) ) { + $errors['upload_notice'] = __('Saved.'); + return media_upload_gallery(); + } + + if ( isset($_GET['tab']) && $_GET['tab'] == 'type_url' ) + return wp_iframe( 'media_upload_type_url_form', 'image', $errors, $id ); + + return wp_iframe( 'media_upload_type_form', 'image', $errors, $id ); +} + +/** + * Download an image from the specified URL and attach it to a post. + * + * @since 2.6.0 + * + * @param string $file The URL of the image to download + * @param int $post_id The post ID the media is to be associated with + * @param string $desc Optional. Description of the image + * @return string|WP_Error Populated HTML img tag on success + */ +function media_sideload_image($file, $post_id, $desc = null) { + if ( ! empty($file) ) { + // Download file to temp location + $tmp = download_url( $file ); + + // Set variables for storage + // fix file filename for query strings + preg_match('/[^\?]+\.(jpg|JPG|jpe|JPE|jpeg|JPEG|gif|GIF|png|PNG)/', $file, $matches); + $file_array['name'] = basename($matches[0]); + $file_array['tmp_name'] = $tmp; + + // If error storing temporarily, unlink + if ( is_wp_error( $tmp ) ) { + @unlink($file_array['tmp_name']); + $file_array['tmp_name'] = ''; + } + + // do the validation and storage stuff + $id = media_handle_sideload( $file_array, $post_id, $desc ); + // If error storing permanently, unlink + if ( is_wp_error($id) ) { + @unlink($file_array['tmp_name']); + return $id; + } + + $src = wp_get_attachment_url( $id ); + } + + // Finally check to make sure the file has been saved, then return the html + if ( ! empty($src) ) { + $alt = isset($desc) ? esc_attr($desc) : ''; + $html = "$alt"; + return $html; + } +} + +/** + * {@internal Missing Short Description}} + * + * @since 2.5.0 + * + * @return unknown + */ +function media_upload_audio() { + $errors = array(); + $id = 0; + + if ( isset($_POST['html-upload']) && !empty($_FILES) ) { + check_admin_referer('media-form'); + // Upload File button was clicked + $id = media_handle_upload('async-upload', $_REQUEST['post_id']); + unset($_FILES); + if ( is_wp_error($id) ) { + $errors['upload_error'] = $id; + $id = false; + } + } + + if ( !empty($_POST['insertonlybutton']) ) { + $href = $_POST['insertonly']['href']; + if ( !empty($href) && !strpos($href, '://') ) + $href = "http://$href"; + + $title = esc_attr($_POST['insertonly']['title']); + if ( empty($title) ) + $title = esc_attr( basename($href) ); + + if ( !empty($title) && !empty($href) ) + $html = "$title"; + + $html = apply_filters('audio_send_to_editor_url', $html, $href, $title); + + return media_send_to_editor($html); + } + + if ( !empty($_POST) ) { + $return = media_upload_form_handler(); + + if ( is_string($return) ) + return $return; + if ( is_array($return) ) + $errors = $return; + } + + if ( isset($_POST['save']) ) { + $errors['upload_notice'] = __('Saved.'); + return media_upload_gallery(); + } + + if ( isset($_GET['tab']) && $_GET['tab'] == 'type_url' ) + return wp_iframe( 'media_upload_type_url_form', 'audio', $errors, $id ); + + return wp_iframe( 'media_upload_type_form', 'audio', $errors, $id ); +} + +/** + * {@internal Missing Short Description}} + * + * @since 2.5.0 + * + * @return unknown + */ +function media_upload_video() { + $errors = array(); + $id = 0; + + if ( isset($_POST['html-upload']) && !empty($_FILES) ) { + check_admin_referer('media-form'); + // Upload File button was clicked + $id = media_handle_upload('async-upload', $_REQUEST['post_id']); + unset($_FILES); + if ( is_wp_error($id) ) { + $errors['upload_error'] = $id; + $id = false; + } + } + + if ( !empty($_POST['insertonlybutton']) ) { + $href = $_POST['insertonly']['href']; + if ( !empty($href) && !strpos($href, '://') ) + $href = "http://$href"; + + $title = esc_attr($_POST['insertonly']['title']); + if ( empty($title) ) + $title = esc_attr( basename($href) ); + + if ( !empty($title) && !empty($href) ) + $html = "$title"; + + $html = apply_filters('video_send_to_editor_url', $html, $href, $title); + + return media_send_to_editor($html); + } + + if ( !empty($_POST) ) { + $return = media_upload_form_handler(); + + if ( is_string($return) ) + return $return; + if ( is_array($return) ) + $errors = $return; + } + + if ( isset($_POST['save']) ) { + $errors['upload_notice'] = __('Saved.'); + return media_upload_gallery(); + } + + if ( isset($_GET['tab']) && $_GET['tab'] == 'type_url' ) + return wp_iframe( 'media_upload_type_url_form', 'video', $errors, $id ); + + return wp_iframe( 'media_upload_type_form', 'video', $errors, $id ); +} + +/** + * {@internal Missing Short Description}} + * + * @since 2.5.0 + * + * @return unknown + */ +function media_upload_file() { + $errors = array(); + $id = 0; + + if ( isset($_POST['html-upload']) && !empty($_FILES) ) { + check_admin_referer('media-form'); + // Upload File button was clicked + $id = media_handle_upload('async-upload', $_REQUEST['post_id']); + unset($_FILES); + if ( is_wp_error($id) ) { + $errors['upload_error'] = $id; + $id = false; + } + } + + if ( !empty($_POST['insertonlybutton']) ) { + $href = $_POST['insertonly']['href']; + if ( !empty($href) && !strpos($href, '://') ) + $href = "http://$href"; + + $title = esc_attr($_POST['insertonly']['title']); + if ( empty($title) ) + $title = basename($href); + if ( !empty($title) && !empty($href) ) + $html = "$title"; + $html = apply_filters('file_send_to_editor_url', $html, esc_url_raw($href), $title); + return media_send_to_editor($html); + } + + if ( !empty($_POST) ) { + $return = media_upload_form_handler(); + + if ( is_string($return) ) + return $return; + if ( is_array($return) ) + $errors = $return; + } + + if ( isset($_POST['save']) ) { + $errors['upload_notice'] = __('Saved.'); + return media_upload_gallery(); + } + + if ( isset($_GET['tab']) && $_GET['tab'] == 'type_url' ) + return wp_iframe( 'media_upload_type_url_form', 'file', $errors, $id ); + + return wp_iframe( 'media_upload_type_form', 'file', $errors, $id ); +} + +/** + * {@internal Missing Short Description}} + * + * @since 2.5.0 + * + * @return unknown + */ +function media_upload_gallery() { + $errors = array(); + + if ( !empty($_POST) ) { + $return = media_upload_form_handler(); + + if ( is_string($return) ) + return $return; + if ( is_array($return) ) + $errors = $return; + } + + wp_enqueue_script('admin-gallery'); + return wp_iframe( 'media_upload_gallery_form', $errors ); +} + +/** + * {@internal Missing Short Description}} + * + * @since 2.5.0 + * + * @return unknown + */ +function media_upload_library() { + $errors = array(); + if ( !empty($_POST) ) { + $return = media_upload_form_handler(); + + if ( is_string($return) ) + return $return; + if ( is_array($return) ) + $errors = $return; + } + + return wp_iframe( 'media_upload_library_form', $errors ); +} + +/** + * Retrieve HTML for the image alignment radio buttons with the specified one checked. + * + * @since 2.7.0 + * + * @param unknown_type $post + * @param unknown_type $checked + * @return unknown + */ +function image_align_input_fields( $post, $checked = '' ) { + + if ( empty($checked) ) + $checked = get_user_setting('align', 'none'); + + $alignments = array('none' => __('None'), 'left' => __('Left'), 'center' => __('Center'), 'right' => __('Right')); + if ( !array_key_exists( (string) $checked, $alignments ) ) + $checked = 'none'; + + $out = array(); + foreach ( $alignments as $name => $label ) { + $name = esc_attr($name); + $out[] = ""; + } + return join("\n", $out); +} + +/** + * Retrieve HTML for the size radio buttons with the specified one checked. + * + * @since 2.7.0 + * + * @param unknown_type $post + * @param unknown_type $check + * @return unknown + */ +function image_size_input_fields( $post, $check = '' ) { + + // get a list of the actual pixel dimensions of each possible intermediate version of this image + $size_names = array('thumbnail' => __('Thumbnail'), 'medium' => __('Medium'), 'large' => __('Large'), 'full' => __('Full Size')); + + if ( empty($check) ) + $check = get_user_setting('imgsize', 'medium'); + + foreach ( $size_names as $size => $label ) { + $downsize = image_downsize($post->ID, $size); + $checked = ''; + + // is this size selectable? + $enabled = ( $downsize[3] || 'full' == $size ); + $css_id = "image-size-{$size}-{$post->ID}"; + // if this size is the default but that's not available, don't select it + if ( $size == $check ) { + if ( $enabled ) + $checked = " checked='checked'"; + else + $check = ''; + } elseif ( !$check && $enabled && 'thumbnail' != $size ) { + // if $check is not enabled, default to the first available size that's bigger than a thumbnail + $check = $size; + $checked = " checked='checked'"; + } + + $html = "
"; + + $html .= ""; + // only show the dimensions if that choice is available + if ( $enabled ) + $html .= " "; + + $html .= '
'; + + $out[] = $html; + } + + return array( + 'label' => __('Size'), + 'input' => 'html', + 'html' => join("\n", $out), + ); +} + +/** + * Retrieve HTML for the Link URL buttons with the default link type as specified. + * + * @since 2.7.0 + * + * @param unknown_type $post + * @param unknown_type $url_type + * @return unknown + */ +function image_link_input_fields($post, $url_type = '') { + + $file = wp_get_attachment_url($post->ID); + $link = get_attachment_link($post->ID); + + if ( empty($url_type) ) + $url_type = get_user_setting('urlbutton', 'post'); + + $url = ''; + if ( $url_type == 'file' ) + $url = $file; + elseif ( $url_type == 'post' ) + $url = $link; + + return " +
+ + + +"; +} + +/** + * {@internal Missing Short Description}} + * + * @since 2.5.0 + * + * @param unknown_type $form_fields + * @param unknown_type $post + * @return unknown + */ +function image_attachment_fields_to_edit($form_fields, $post) { + if ( substr($post->post_mime_type, 0, 5) == 'image' ) { + $alt = get_post_meta($post->ID, '_wp_attachment_image_alt', true); + if ( empty($alt) ) + $alt = ''; + + $form_fields['post_title']['required'] = true; + + $form_fields['image_alt'] = array( + 'value' => $alt, + 'label' => __('Alternate Text'), + 'helps' => __('Alt text for the image, e.g. “The Mona Lisa”') + ); + + $form_fields['align'] = array( + 'label' => __('Alignment'), + 'input' => 'html', + 'html' => image_align_input_fields($post, get_option('image_default_align')), + ); + + $form_fields['image-size'] = image_size_input_fields( $post, get_option('image_default_size', 'medium') ); + + } else { + unset( $form_fields['image_alt'] ); + } + return $form_fields; +} + +add_filter('attachment_fields_to_edit', 'image_attachment_fields_to_edit', 10, 2); + +/** + * {@internal Missing Short Description}} + * + * @since 2.5.0 + * + * @param unknown_type $form_fields + * @param unknown_type $post + * @return unknown + */ +function media_single_attachment_fields_to_edit( $form_fields, $post ) { + unset($form_fields['url'], $form_fields['align'], $form_fields['image-size']); + return $form_fields; +} + +/** + * {@internal Missing Short Description}} + * + * @since 2.8.0 + * + * @param unknown_type $form_fields + * @param unknown_type $post + * @return unknown + */ +function media_post_single_attachment_fields_to_edit( $form_fields, $post ) { + unset($form_fields['image_url']); + return $form_fields; +} + +/** + * {@internal Missing Short Description}} + * + * @since 2.5.0 + * + * @param unknown_type $post + * @param unknown_type $attachment + * @return unknown + */ +function image_attachment_fields_to_save($post, $attachment) { + if ( substr($post['post_mime_type'], 0, 5) == 'image' ) { + if ( strlen(trim($post['post_title'])) == 0 ) { + $post['post_title'] = preg_replace('/\.\w+$/', '', basename($post['guid'])); + $post['errors']['post_title']['errors'][] = __('Empty Title filled from filename.'); + } + } + + return $post; +} + +add_filter('attachment_fields_to_save', 'image_attachment_fields_to_save', 10, 2); + +/** + * {@internal Missing Short Description}} + * + * @since 2.5.0 + * + * @param unknown_type $html + * @param unknown_type $attachment_id + * @param unknown_type $attachment + * @return unknown + */ +function image_media_send_to_editor($html, $attachment_id, $attachment) { + $post =& get_post($attachment_id); + if ( substr($post->post_mime_type, 0, 5) == 'image' ) { + $url = $attachment['url']; + $align = !empty($attachment['align']) ? $attachment['align'] : 'none'; + $size = !empty($attachment['image-size']) ? $attachment['image-size'] : 'medium'; + $alt = !empty($attachment['image_alt']) ? $attachment['image_alt'] : ''; + $rel = ( $url == get_attachment_link($attachment_id) ); + + return get_image_send_to_editor($attachment_id, $attachment['post_excerpt'], $attachment['post_title'], $align, $url, $rel, $size, $alt); + } + + return $html; +} + +add_filter('media_send_to_editor', 'image_media_send_to_editor', 10, 3); + +/** + * {@internal Missing Short Description}} + * + * @since 2.5.0 + * + * @param unknown_type $post + * @param unknown_type $errors + * @return unknown + */ +function get_attachment_fields_to_edit($post, $errors = null) { + if ( is_int($post) ) + $post =& get_post($post); + if ( is_array($post) ) + $post = (object) $post; + + $image_url = wp_get_attachment_url($post->ID); + + $edit_post = sanitize_post($post, 'edit'); + + + + $form_fields = array( + 'post_title' => array( + 'label' => __('Title'), + 'value' => $edit_post->post_title + ), + 'image_alt' => array(), + 'post_excerpt' => array( + 'label' => __('Caption'), + 'value' => $edit_post->post_excerpt + ), + 'post_content' => array( + 'label' => __('Description'), + 'value' => $edit_post->post_content, + 'input' => 'textarea' + ), + 'url' => array( + 'label' => __('Link URL'), + 'input' => 'html', + 'html' => image_link_input_fields($post, get_option('image_default_link_type')), + 'helps' => __('Enter a link URL or click above for presets.') + ), + 'menu_order' => array( + 'label' => __('Order'), + 'value' => $edit_post->menu_order + ), + 'image_url' => array( + 'label' => __('File URL'), + 'input' => 'html', + 'html' => "
", + 'value' => wp_get_attachment_url($post->ID), + 'helps' => __('Location of the uploaded file.') + ) + ); + + foreach ( get_attachment_taxonomies($post) as $taxonomy ) { + $t = (array) get_taxonomy($taxonomy); + if ( ! $t['public'] ) + continue; + if ( empty($t['label']) ) + $t['label'] = $taxonomy; + if ( empty($t['args']) ) + $t['args'] = array(); + + $terms = get_object_term_cache($post->ID, $taxonomy); + if ( empty($terms) ) + $terms = wp_get_object_terms($post->ID, $taxonomy, $t['args']); + + $values = array(); + + foreach ( $terms as $term ) + $values[] = $term->name; + $t['value'] = join(', ', $values); + + $form_fields[$taxonomy] = $t; + } + + // Merge default fields with their errors, so any key passed with the error (e.g. 'error', 'helps', 'value') will replace the default + // The recursive merge is easily traversed with array casting: foreach( (array) $things as $thing ) + $form_fields = array_merge_recursive($form_fields, (array) $errors); + + $form_fields = apply_filters('attachment_fields_to_edit', $form_fields, $post); + + return $form_fields; +} + +/** + * Retrieve HTML for media items of post gallery. + * + * The HTML markup retrieved will be created for the progress of SWF Upload + * component. Will also create link for showing and hiding the form to modify + * the image attachment. + * + * @since 2.5.0 + * + * @param int $post_id Optional. Post ID. + * @param array $errors Errors for attachment, if any. + * @return string + */ +function get_media_items( $post_id, $errors ) { + $attachments = array(); + if ( $post_id ) { + $post = get_post($post_id); + if ( $post && $post->post_type == 'attachment' ) + $attachments = array($post->ID => $post); + else + $attachments = get_children( array( 'post_parent' => $post_id, 'post_type' => 'attachment', 'orderby' => 'menu_order ASC, ID', 'order' => 'DESC') ); + } else { + if ( is_array($GLOBALS['wp_the_query']->posts) ) + foreach ( $GLOBALS['wp_the_query']->posts as $attachment ) + $attachments[$attachment->ID] = $attachment; + } + + $output = ''; + foreach ( (array) $attachments as $id => $attachment ) { + if ( $attachment->post_status == 'trash' ) + continue; + if ( $item = get_media_item( $id, array( 'errors' => isset($errors[$id]) ? $errors[$id] : null) ) ) + $output .= "\n
$item\n
"; + } + + return $output; +} + +/** + * Retrieve HTML form for modifying the image attachment. + * + * @since 2.5.0 + * + * @param int $attachment_id Attachment ID for modification. + * @param string|array $args Optional. Override defaults. + * @return string HTML form for attachment. + */ +function get_media_item( $attachment_id, $args = null ) { + global $redir_tab; + + if ( ( $attachment_id = intval( $attachment_id ) ) && $thumb_url = wp_get_attachment_image_src( $attachment_id, 'thumbnail', true ) ) + $thumb_url = $thumb_url[0]; + else + $thumb_url = false; + + $post = get_post( $attachment_id ); + + $default_args = array( 'errors' => null, 'send' => $post->post_parent ? post_type_supports( get_post_type( $post->post_parent ), 'editor' ) : true, 'delete' => true, 'toggle' => true, 'show_title' => true ); + $args = wp_parse_args( $args, $default_args ); + $args = apply_filters( 'get_media_item_args', $args ); + extract( $args, EXTR_SKIP ); + + $toggle_on = __( 'Show' ); + $toggle_off = __( 'Hide' ); + + $filename = esc_html( basename( $post->guid ) ); + $title = esc_attr( $post->post_title ); + + if ( $_tags = get_the_tags( $attachment_id ) ) { + foreach ( $_tags as $tag ) + $tags[] = $tag->name; + $tags = esc_attr( join( ', ', $tags ) ); + } + + $post_mime_types = get_post_mime_types(); + $keys = array_keys( wp_match_mime_types( array_keys( $post_mime_types ), $post->post_mime_type ) ); + $type = array_shift( $keys ); + $type_html = ""; + + $form_fields = get_attachment_fields_to_edit( $post, $errors ); + + if ( $toggle ) { + $class = empty( $errors ) ? 'startclosed' : 'startopen'; + $toggle_links = " + $toggle_on + $toggle_off"; + } else { + $class = 'form-table'; + $toggle_links = ''; + } + + $display_title = ( !empty( $title ) ) ? $title : $filename; // $title shouldn't ever be empty, but just in case + $display_title = $show_title ? "
" . wp_html_excerpt( $display_title, 60 ) . "
" : ''; + + $gallery = ( ( isset( $_REQUEST['tab'] ) && 'gallery' == $_REQUEST['tab'] ) || ( isset( $redir_tab ) && 'gallery' == $redir_tab ) ); + $order = ''; + + foreach ( $form_fields as $key => $val ) { + if ( 'menu_order' == $key ) { + if ( $gallery ) + $order = ""; + else + $order = ""; + + unset( $form_fields['menu_order'] ); + break; + } + } + + $media_dims = ''; + $meta = wp_get_attachment_metadata( $post->ID ); + if ( is_array( $meta ) && array_key_exists( 'width', $meta ) && array_key_exists( 'height', $meta ) ) + $media_dims .= "{$meta['width']} × {$meta['height']} "; + $media_dims = apply_filters( 'media_meta', $media_dims, $post ); + + $image_edit_button = ''; + if ( gd_edit_image_support( $post->post_mime_type ) ) { + $nonce = wp_create_nonce( "image_editor-$post->ID" ); + $image_edit_button = " "; + } + + $attachment_url = get_permalink( $attachment_id ); + + $item = " + $type_html + $toggle_links + $order + $display_title + + + + + \n"; + + + + $item .= " + + + + \n"; + + $defaults = array( + 'input' => 'text', + 'required' => false, + 'value' => '', + 'extra_rows' => array(), + ); + + if ( $send ) + $send = get_submit_button( __( 'Insert into Post' ), 'button', "send[$attachment_id]", false ); + if ( $delete && current_user_can( 'delete_post', $attachment_id ) ) { + if ( !EMPTY_TRASH_DAYS ) { + $delete = "" . __( 'Delete Permanently' ) . ''; + } elseif ( !MEDIA_TRASH ) { + $delete = "" . __( 'Delete' ) . " + "; + } else { + $delete = "" . __( 'Move to Trash' ) . " + "; + } + } else { + $delete = ''; + } + + $thumbnail = ''; + $calling_post_id = 0; + if ( isset( $_GET['post_id'] ) ) + $calling_post_id = absint( $_GET['post_id'] ); + elseif ( isset( $_POST ) && count( $_POST ) ) // Like for async-upload where $_GET['post_id'] isn't set + $calling_post_id = $post->post_parent; + if ( 'image' == $type && $calling_post_id && current_theme_supports( 'post-thumbnails', get_post_type( $calling_post_id ) ) && get_post_thumbnail_id( $calling_post_id ) != $attachment_id ) { + $ajax_nonce = wp_create_nonce( "set_post_thumbnail-$calling_post_id" ); + $thumbnail = "" . esc_html__( "Use as featured image" ) . ""; + } + + if ( ( $send || $thumbnail || $delete ) && !isset( $form_fields['buttons'] ) ) + $form_fields['buttons'] = array( 'tr' => "\t\t\n" ); + + $hidden_fields = array(); + + foreach ( $form_fields as $id => $field ) { + if ( $id[0] == '_' ) + continue; + + if ( !empty( $field['tr'] ) ) { + $item .= $field['tr']; + continue; + } + + $field = array_merge( $defaults, $field ); + $name = "attachments[$attachment_id][$id]"; + + if ( $field['input'] == 'hidden' ) { + $hidden_fields[$name] = $field['value']; + continue; + } + + $required = $field['required'] ? '*' : ''; + $aria_required = $field['required'] ? " aria-required='true' " : ''; + $class = $id; + $class .= $field['required'] ? ' form-required' : ''; + + $item .= "\t\t\n\t\t\t\n\t\t\t\n\t\t\n"; + + $extra_rows = array(); + + if ( !empty( $field['errors'] ) ) + foreach ( array_unique( (array) $field['errors'] ) as $error ) + $extra_rows['error'][] = $error; + + if ( !empty( $field['extra_rows'] ) ) + foreach ( $field['extra_rows'] as $class => $rows ) + foreach ( (array) $rows as $html ) + $extra_rows[$class][] = $html; + + foreach ( $extra_rows as $class => $rows ) + foreach ( $rows as $html ) + $item .= "\t\t\n"; + } + + if ( !empty( $form_fields['_final'] ) ) + $item .= "\t\t\n"; + $item .= "\t\n"; + $item .= "\t
+

+

$image_edit_button

+
+

" . __('File name:') . " $filename

+

" . __('File type:') . " $post->post_mime_type

+

" . __('Upload date:') . " " . mysql2date( get_option('date_format'), $post->post_date ). '

'; + if ( !empty( $media_dims ) ) + $item .= "

" . __('Dimensions:') . " $media_dims

\n"; + + $item .= "
$send $thumbnail $delete
"; + if ( !empty( $field[ $field['input'] ] ) ) + $item .= $field[ $field['input'] ]; + elseif ( $field['input'] == 'textarea' ) { + if ( user_can_richedit() ) { // textarea_escaped when user_can_richedit() = false + $field['value'] = esc_textarea( $field['value'] ); + } + $item .= "'; + } else { + $item .= ""; + } + if ( !empty( $field['helps'] ) ) + $item .= "

" . join( "

\n

", array_unique( (array) $field['helps'] ) ) . '

'; + $item .= "
$html
{$form_fields['_final']}
\n"; + + foreach ( $hidden_fields as $name => $value ) + $item .= "\t\n"; + + if ( $post->post_parent < 1 && isset( $_REQUEST['post_id'] ) ) { + $parent = (int) $_REQUEST['post_id']; + $parent_name = "attachments[$attachment_id][post_parent]"; + $item .= "\t\n"; + } + + return $item; +} + +/** + * {@internal Missing Short Description}} + * + * @since 2.5.0 + */ +function media_upload_header() { + ?> + +
+ +
+ 1024 && $u < count( $sizes ) - 1; $u++ ) + $upload_size_unit /= 1024; + if ( $u < 0 ) { + $upload_size_unit = 0; + $u = 0; + } else { + $upload_size_unit = (int) $upload_size_unit; + } +?> + +
+ + + +
+
+ + get_error_message(); ?> + +
+' . sprintf( __( 'Sorry, you have filled your storage quota (%s MB).' ), get_space_allowed() ) . '

'; + return; +} + +do_action('pre-upload-ui'); + +if ( $flash ) : + +// Set the post params, which SWFUpload will post back with the file, and pass +// them through a filter. +$post_params = array( + "post_id" => $post_id, + "auth_cookie" => (is_ssl() ? $_COOKIE[SECURE_AUTH_COOKIE] : $_COOKIE[AUTH_COOKIE]), + "logged_in_cookie" => $_COOKIE[LOGGED_IN_COOKIE], + "_wpnonce" => wp_create_nonce('media-form'), + "type" => $type, + "tab" => $tab, + "short" => "1", +); +$post_params = apply_filters( 'swfupload_post_params', $post_params ); +$p = array(); +foreach ( $post_params as $param => $val ) + $p[] = "\t\t'$param' : '$val'"; +$post_params_str = implode( ", \n", $p ); + +// #8545. wmode=transparent cannot be used with SWFUpload +if ( 'media-new.php' == $pagenow ) { + $upload_image_path = get_user_option( 'admin_color' ); + if ( 'classic' != $upload_image_path ) + $upload_image_path = 'fresh'; + $upload_image_path = admin_url( 'images/upload-' . $upload_image_path . '.png?ver=20101205' ); +} else { + $upload_image_path = includes_url( 'images/upload.png?ver=20100531' ); +} + +?> + + +
+ + +
+ +
+ +
+

+ +

+
+ + +
> + +

+ + + + +

+
+

+ +

+ + +
+ + + +
+ + + + +

+ + + + +
+'.esc_html($id->get_error_message()).'
'; + exit; + } +} +?> +
+

+ +

+ + + +
+ + + + + +

+ + + +
+
+ +
+
+
+ + + +
+ + + + + + + | + | + +
+ + + +
+ + + + + + + +
    + $reals ) + foreach ( $reals as $real ) + if ( isset($num_posts[$_type]) ) + $num_posts[$_type] += $_num_posts[$real]; + else + $num_posts[$_type] = $_num_posts[$real]; +// If available type specified by media button clicked, filter by that type +if ( empty($_GET['post_mime_type']) && !empty($num_posts[$type]) ) { + $_GET['post_mime_type'] = $type; + list($post_mime_types, $avail_post_mime_types) = wp_edit_attachments_query(); +} +if ( empty($_GET['post_mime_type']) || $_GET['post_mime_type'] == 'all' ) + $class = ' class="current"'; +else + $class = ''; +$type_links[] = "
  • 'all', 'paged'=>false, 'm'=>false))) . "'$class>".__('All Types').""; +foreach ( $post_mime_types as $mime_type => $label ) { + $class = ''; + + if ( !wp_match_mime_types($mime_type, $avail_post_mime_types) ) + continue; + + if ( isset($_GET['post_mime_type']) && wp_match_mime_types($mime_type, $_GET['post_mime_type']) ) + $class = ' class="current"'; + + $type_links[] = "
  • $mime_type, 'paged'=>false))) . "'$class>" . sprintf( translate_nooped_plural( $label[2], $num_posts[$mime_type] ), "" . number_format_i18n( $num_posts[$mime_type] ) . '') . ''; +} +echo implode(' |
  • ', apply_filters( 'media_upload_mime_type_links', $type_links ) ) . ''; +unset($type_links); +?> +
+ +
+ + add_query_arg( 'paged', '%#%' ), + 'format' => '', + 'prev_text' => __('«'), + 'next_text' => __('»'), + 'total' => ceil($wp_query->found_posts / 10), + 'current' => $_GET['paged'] +)); + +if ( $page_links ) + echo "
$page_links
"; +?> + +
+posts WHERE post_type = 'attachment' ORDER BY post_date DESC"; + +$arc_result = $wpdb->get_results( $arc_query ); + +$month_count = count($arc_result); + +if ( $month_count && !( 1 == $month_count && 0 == $arc_result[0]->mmonth ) ) { ?> + + + + + +
+ +
+
+
+ +
+ + + + + + +
+ + +
+

+ + +

+
+ + + + + + +'; + } else { + $caption = ''; + } + + $default_align = get_option('image_default_align'); + if ( empty($default_align) ) + $default_align = 'none'; + + return ' +

' . __('Insert an image from another web site') . '

+ + + + + + + + + + + + + + + + ' . $caption . ' + + + + + + + + + + ' . _insert_into_post_button('image') . ' +
+ + * +
+ + * +
+ + +

' . __('Alt text for the image, e.g. “The Mona Lisa”') . '

+ + + + + + + + +
+ +
+ + + +

' . __('Enter a link URL or click above for presets.') . '

+'; + +} + +/** + * {@internal Missing Short Description}} + * + * @since 2.7.0 + * + * @return unknown + */ +function type_url_form_audio() { + return ' + + + + + + + + + + + ' . _insert_into_post_button('audio') . ' +
+ + * +
+ + * +
' . __('Link text, e.g. “Still Alive by Jonathan Coulton”') . '
+'; +} + +/** + * {@internal Missing Short Description}} + * + * @since 2.7.0 + * + * @return unknown + */ +function type_url_form_video() { + return ' + + + + + + + + + + + ' . _insert_into_post_button('video') . ' +
+ + * +
+ + * +
' . __('Link text, e.g. “Lucy on YouTube”') . '
+'; +} + +/** + * {@internal Missing Short Description}} + * + * @since 2.7.0 + * + * @return unknown + */ +function type_url_form_file() { + return ' + + + + + + + + + + + ' . _insert_into_post_button('file') . ' +
+ + * +
+ + * +
' . __('Link text, e.g. “Ransom Demands (PDF)”') . '
+'; +} + + +function _insert_into_post_button($type) { + if ( !post_type_supports(get_post_type($_GET['post_id']), 'editor') ) + return ''; + + if ( 'image' == $type ) + return ' + + + + + + + '; + + return ' + + + + ' . get_submit_button( __( 'Insert into Post' ), 'button', 'insertonlybutton', false ) . ' + + + '; +} + +/** + * {@internal Missing Short Description}} + * + * Support a GET parameter for disabling the flash uploader. + * + * @since 2.6.0 + * + * @param unknown_type $flash + * @return unknown + */ +function media_upload_use_flash($flash) { + if ( array_key_exists('flash', $_REQUEST) ) + $flash = !empty($_REQUEST['flash']); + return $flash; +} + +add_filter('flash_uploader', 'media_upload_use_flash'); + +/** + * {@internal Missing Short Description}} + * + * @since 2.6.0 + */ +function media_upload_flash_bypass() { + echo '

'; + printf( __('You are using the Flash uploader. Problems? Try the Browser uploader instead.'), esc_url(add_query_arg('flash', 0)) ); + echo '

'; +} + +/** + * {@internal Missing Short Description}} + * + * @since 2.6.0 + */ +function media_upload_html_bypass($flash = true) { + echo '

'; + _e('You are using the Browser uploader.'); + if ( $flash ) { + // the user manually selected the browser uploader, so let them switch back to Flash + echo ' '; + printf( __('Try the Flash uploader instead.'), esc_url(add_query_arg('flash', 1)) ); + } + echo "

\n"; +} + +add_action('post-flash-upload-ui', 'media_upload_flash_bypass'); +add_action('post-html-upload-ui', 'media_upload_html_bypass'); + +/** + * {@internal Missing Short Description}} + * + * Make sure the GET parameter sticks when we submit a form. + * + * @since 2.6.0 + * + * @param unknown_type $url + * @return unknown + */ +function media_upload_bypass_url($url) { + if ( array_key_exists('flash', $_REQUEST) ) + $url = add_query_arg('flash', intval($_REQUEST['flash'])); + return $url; +} + +add_filter('media_upload_form_url', 'media_upload_bypass_url'); + +add_filter('async_upload_image', 'get_media_item', 10, 2); +add_filter('async_upload_audio', 'get_media_item', 10, 2); +add_filter('async_upload_video', 'get_media_item', 10, 2); +add_filter('async_upload_file', 'get_media_item', 10, 2); + +add_action('media_upload_image', 'media_upload_image'); +add_action('media_upload_audio', 'media_upload_audio'); +add_action('media_upload_video', 'media_upload_video'); +add_action('media_upload_file', 'media_upload_file'); + +add_filter('media_upload_gallery', 'media_upload_gallery'); + +add_filter('media_upload_library', 'media_upload_library'); diff --git a/src/wp-admin/includes/menu.php b/src/wp-admin/includes/menu.php new file mode 100644 index 0000000..fa85e4b --- /dev/null +++ b/src/wp-admin/includes/menu.php @@ -0,0 +1,230 @@ + $sub) { + foreach ($sub as $index => $data) { + if ( ! current_user_can($data[1]) ) { + unset(${$sub_loop}[$parent][$index]); + $_wp_submenu_nopriv[$parent][$data[2]] = true; + } + } + unset($index, $data); + + if ( empty(${$sub_loop}[$parent]) ) + unset(${$sub_loop}[$parent]); + } + unset($sub, $parent); +} +unset($sub_loop); + +// Loop over the top-level menu. +// Menus for which the original parent is not accessible due to lack of privs will have the next +// submenu in line be assigned as the new menu parent. +foreach ( $menu as $id => $data ) { + if ( empty($submenu[$data[2]]) ) + continue; + $subs = $submenu[$data[2]]; + $first_sub = array_shift($subs); + $old_parent = $data[2]; + $new_parent = $first_sub[2]; + // If the first submenu is not the same as the assigned parent, + // make the first submenu the new parent. + if ( $new_parent != $old_parent ) { + $_wp_real_parent_file[$old_parent] = $new_parent; + $menu[$id][2] = $new_parent; + + foreach ($submenu[$old_parent] as $index => $data) { + $submenu[$new_parent][$index] = $submenu[$old_parent][$index]; + unset($submenu[$old_parent][$index]); + } + unset($submenu[$old_parent], $index); + + if ( isset($_wp_submenu_nopriv[$old_parent]) ) + $_wp_submenu_nopriv[$new_parent] = $_wp_submenu_nopriv[$old_parent]; + } +} +unset($id, $data, $subs, $first_sub, $old_parent, $new_parent); + +if ( is_network_admin() ) + do_action('network_admin_menu', ''); +elseif ( is_user_admin() ) + do_action('user_admin_menu', ''); +else + do_action('admin_menu', ''); + +// Remove menus that have no accessible submenus and require privs that the user does not have. +// Run re-parent loop again. +foreach ( $menu as $id => $data ) { + if ( ! current_user_can($data[1]) ) + $_wp_menu_nopriv[$data[2]] = true; + + // If there is only one submenu and it is has same destination as the parent, + // remove the submenu. + if ( ! empty( $submenu[$data[2]] ) && 1 == count ( $submenu[$data[2]] ) ) { + $subs = $submenu[$data[2]]; + $first_sub = array_shift($subs); + if ( $data[2] == $first_sub[2] ) + unset( $submenu[$data[2]] ); + } + + // If submenu is empty... + if ( empty($submenu[$data[2]]) ) { + // And user doesn't have privs, remove menu. + if ( isset( $_wp_menu_nopriv[$data[2]] ) ) { + unset($menu[$id]); + } + } +} +unset($id, $data, $subs, $first_sub); + +// Remove any duplicated separators +$separator_found = false; +foreach ( $menu as $id => $data ) { + if ( 0 == strcmp('wp-menu-separator', $data[4] ) ) { + if (false == $separator_found) { + $separator_found = true; + } else { + unset($menu[$id]); + $separator_found = false; + } + } else { + $separator_found = false; + } +} +unset($id, $data); + +function add_cssclass($add, $class) { + $class = empty($class) ? $add : $class .= ' ' . $add; + return $class; +} + +function add_menu_classes($menu) { + + $first = $lastorder = false; + $i = 0; + $mc = count($menu); + foreach ( $menu as $order => $top ) { + $i++; + + if ( 0 == $order ) { // dashboard is always shown/single + $menu[0][4] = add_cssclass('menu-top-first', $top[4]); + $lastorder = 0; + continue; + } + + if ( 0 === strpos($top[2], 'separator') ) { // if separator + $first = true; + $c = $menu[$lastorder][4]; + $menu[$lastorder][4] = add_cssclass('menu-top-last', $c); + continue; + } + + if ( $first ) { + $c = $menu[$order][4]; + $menu[$order][4] = add_cssclass('menu-top-first', $c); + $first = false; + } + + if ( $mc == $i ) { // last item + $c = $menu[$order][4]; + $menu[$order][4] = add_cssclass('menu-top-last', $c); + } + + $lastorder = $order; + } + + return apply_filters( 'add_menu_classes', $menu ); +} + +uksort($menu, "strnatcasecmp"); // make it all pretty + +if ( apply_filters('custom_menu_order', false) ) { + $menu_order = array(); + foreach ( $menu as $menu_item ) { + $menu_order[] = $menu_item[2]; + } + unset($menu_item); + $default_menu_order = $menu_order; + $menu_order = apply_filters('menu_order', $menu_order); + $menu_order = array_flip($menu_order); + $default_menu_order = array_flip($default_menu_order); + + function sort_menu($a, $b) { + global $menu_order, $default_menu_order; + $a = $a[2]; + $b = $b[2]; + if ( isset($menu_order[$a]) && !isset($menu_order[$b]) ) { + return -1; + } elseif ( !isset($menu_order[$a]) && isset($menu_order[$b]) ) { + return 1; + } elseif ( isset($menu_order[$a]) && isset($menu_order[$b]) ) { + if ( $menu_order[$a] == $menu_order[$b] ) + return 0; + return ($menu_order[$a] < $menu_order[$b]) ? -1 : 1; + } else { + return ($default_menu_order[$a] <= $default_menu_order[$b]) ? -1 : 1; + } + } + + usort($menu, 'sort_menu'); + unset($menu_order, $default_menu_order); +} + +// Remove the last menu item if it is a separator. +$last_menu_key = array_pop( array_keys( $menu ) ); +if ( 'wp-menu-separator' == $menu[ $last_menu_key ][ 4 ] ) + unset( $menu[ $last_menu_key ] ); +unset( $last_menu_key ); + +if ( !user_can_access_admin_page() ) { + do_action('admin_page_access_denied'); + wp_die( __('You do not have sufficient permissions to access this page.') ); +} + +$menu = add_menu_classes($menu); + +?> \ No newline at end of file diff --git a/src/wp-admin/includes/meta-boxes.php b/src/wp-admin/includes/meta-boxes.php new file mode 100644 index 0000000..6d396ad --- /dev/null +++ b/src/wp-admin/includes/meta-boxes.php @@ -0,0 +1,914 @@ +post_type; + $post_type_object = get_post_type_object($post_type); + $can_publish = current_user_can($post_type_object->cap->publish_posts); +?> +
+ +
+ + +
+ +
+ +
+
+post_status && 'future' != $post->post_status && 'pending' != $post->post_status ) { ?> +post_status ) { ?>style="display:none" type="submit" name="save" id="save-post" value="" tabindex="4" class="button button-highlighted" /> +post_status && $can_publish ) { ?> + + + +
+ +
+post_status ) { + $preview_link = esc_url( get_permalink( $post->ID ) ); + $preview_button = __( 'Preview Changes' ); +} else { + $preview_link = get_permalink( $post->ID ); + if ( is_ssl() ) + $preview_link = str_replace( 'http://', 'https://', $preview_link ); + $preview_link = esc_url( apply_filters( 'preview_post_link', add_query_arg( 'preview', 'true', $preview_link ) ) ); + $preview_button = __( 'Preview' ); +} +?> + + +
+ +
+
+ +
+ +
+ +post_status ) { + case 'private': + _e('Privately Published'); + break; + case 'publish': + _e('Published'); + break; + case 'future': + _e('Scheduled'); + break; + case 'pending': + _e('Pending Review'); + break; + case 'draft': + case 'auto-draft': + _e('Draft'); + break; +} +?> + +post_status || 'private' == $post->post_status || $can_publish ) { ?> +post_status ) { ?>style="display:none;" class="edit-post-status hide-if-no-js" tabindex='4'> + +
+ + + + +
+ + +
+ +
+ post_status ) { + $post->post_password = ''; + $visibility = 'private'; + $visibility_trans = __('Private'); +} elseif ( !empty( $post->post_password ) ) { + $visibility = 'password'; + $visibility_trans = __('Password protected'); +} elseif ( $post_type == 'post' && is_sticky( $post->ID ) ) { + $visibility = 'public'; + $visibility_trans = __('Public, Sticky'); +} else { + $visibility = 'public'; + $visibility_trans = __('Public'); +} + +echo esc_html( $visibility_trans ); ?> + + + +
+ + +ID)); ?> /> + + + + + />
+ +ID ) ); ?> tabindex="4" />
+ + />
+
+ />
+ +

+ + +

+
+ + +
+ +ID ) { + if ( 'future' == $post->post_status ) { // scheduled for publishing at a future date + $stamp = __('Scheduled for: %1$s'); + } else if ( 'publish' == $post->post_status || 'private' == $post->post_status ) { // already published + $stamp = __('Published on: %1$s'); + } else if ( '0000-00-00 00:00:00' == $post->post_date_gmt ) { // draft, 1 or more saves, no date specified + $stamp = __('Publish immediately'); + } else if ( time() < strtotime( $post->post_date_gmt . ' +0000' ) ) { // draft, 1 or more saves, future date specified + $stamp = __('Schedule for: %1$s'); + } else { // draft, 1 or more saves, date specified + $stamp = __('Publish on: %1$s'); + } + $date = date_i18n( $datef, strtotime( $post->post_date ) ); +} else { // draft (no saves, and thus no date specified) + $stamp = __('Publish immediately'); + $date = date_i18n( $datef, strtotime( current_time('mysql') ) ); +} + +if ( $can_publish ) : // Contributors don't get to choose the date of publish ?> +
+ + + +
+
+ + + +
+
+
+ +
+ +
+ID ) ) { + if ( !EMPTY_TRASH_DAYS ) + $delete_text = __('Delete Permanently'); + else + $delete_text = __('Move to Trash'); + ?> + +
+ +
+ +post_status, array('publish', 'future', 'private') ) || 0 == $post->ID ) { + if ( $can_publish ) : + if ( !empty($post->post_date_gmt) && time() < strtotime( $post->post_date_gmt . ' +0000' ) ) : ?> + + '5', 'accesskey' => 'p' ) ); ?> + + + '5', 'accesskey' => 'p' ) ); ?> + + + '5', 'accesskey' => 'p' ) ); ?> + + + + +
+
+
+
+ +post_type, 'post-formats' ) ) : + $post_formats = get_theme_support( 'post-formats' ); + + if ( is_array( $post_formats[0] ) ) : + $post_format = get_post_format( $post->ID ); + if ( !$post_format ) + $post_format = '0'; + // Add in the current one if it isn't there yet, in case the current theme doesn't support it + if ( $post_format && !in_array( $post_format, $post_formats[0] ) ) + $post_formats[0][] = $post_format; + ?> +
+ /> + +
/> +
+
+ 'post_tag'); + if ( !isset($box['args']) || !is_array($box['args']) ) + $args = array(); + else + $args = $box['args']; + extract( wp_parse_args($args, $defaults), EXTR_SKIP ); + $tax_name = esc_attr($taxonomy); + $taxonomy = get_taxonomy($taxonomy); + $disabled = !current_user_can($taxonomy->cap->assign_terms) ? 'disabled="disabled"' : ''; +?> +
+
+
+

labels->add_or_remove_items; ?>

+
+ cap->assign_terms) ) : ?> +
+ +
labels->add_new_item; ?>
+

+

+
+

labels->separate_items_with_commas ); ?>

+ +
+
+
+cap->assign_terms) ) : ?> +

labels->choose_from_most_used; ?>

+ + 'category'); + if ( !isset($box['args']) || !is_array($box['args']) ) + $args = array(); + else + $args = $box['args']; + extract( wp_parse_args($args, $defaults), EXTR_SKIP ); + $tax = get_taxonomy($taxonomy); + + ?> +
+ + + + +
+ "; // Allows for an empty term set to be sent. 0 is an invalid Term ID and will be ignored by empty() checks. + ?> +
    + ID, array( 'taxonomy' => $taxonomy, 'popular_cats' => $popular_ids ) ) ?> +
+
+ cap->edit_terms) ) : ?> +
+

+ + labels->add_new_item ); + ?> + +

+

+ + + + $taxonomy, 'hide_empty' => 0, 'name' => 'new'.$taxonomy.'_parent', 'orderby' => 'name', 'hierarchical' => 1, 'show_option_none' => '— ' . $tax->labels->parent_item . ' —', 'tab_index' => 3 ) ); ?> + + + +

+
+ +
+ + +

Learn more about manual excerpts.'); ?>

+to_ping) ) .'" />'; + if ('' != $post->pinged) { + $pings = '

'. __('Already pinged:') . '

    '; + $already_pinged = explode("\n", trim($post->pinged)); + foreach ($already_pinged as $pinged_url) { + $pings .= "\n\t
  • " . esc_html($pinged_url) . "
  • "; + } + $pings .= '
'; + } + +?> +


()

+

pingbacks, no other action necessary.'); ?>

+ +
+
+ID); +list_meta($metadata); +meta_form(); ?> +
+

use in your theme.'); ?>

+ + +

+
+ + +

+get_var($wpdb->prepare("SELECT count(1) FROM $wpdb->comments WHERE comment_post_ID = '%d' AND ( comment_approved = '0' OR comment_approved = '1')", $post_ID)); + + if ( 1 > $total ) { + echo '

' . __('No comments yet.') . '

'; + return; + } + + wp_nonce_field( 'get-comments', 'add_comment_nonce', false ); + + $wp_list_table = _get_list_table('WP_Post_Comments_List_Table'); + $wp_list_table->display( true ); +?> +

+ + + + + + + 'authors', + 'name' => 'post_author_override', + 'selected' => empty($post->ID) ? $user_ID : $post->post_author, + 'include_selected' => true + ) ); +} + + +/** + * Display list of revisions. + * + * @since 2.6.0 + * + * @param object $post + */ +function post_revisions_meta_box($post) { + wp_list_post_revisions(); +} + + +// -- Page related Meta Boxes + +/** + * Display page attributes form fields. + * + * @since 2.7.0 + * + * @param object $post + */ +function page_attributes_meta_box($post) { + $post_type_object = get_post_type_object($post->post_type); + if ( $post_type_object->hierarchical ) { + $pages = wp_dropdown_pages(array('post_type' => $post->post_type, 'exclude_tree' => $post->ID, 'selected' => $post->post_parent, 'name' => 'parent_id', 'show_option_none' => __('(no parent)'), 'sort_column'=> 'menu_order, post_title', 'echo' => 0)); + if ( ! empty($pages) ) { +?> +

+ + +post_type && 0 != count( get_page_templates() ) ) { + $template = !empty($post->page_template) ? $post->page_template : false; + ?> +

+ + +

+

+

post_type ) _e( 'Need help? Use the Help tab in the upper right of your screen.' ); ?>

+ + + +
    +
  • +
  • +
+ +
+
    + link_id) ) + wp_link_category_checklist($link->link_id); + else + wp_link_category_checklist(); + ?> +
+
+ + + +
+

+ +
+ +
+

+

+

+
+

+link_rel ) ? $link->link_rel : ''; // In PHP 5.3: $link_rel = $link->link_rel ?: ''; + $rels = preg_split('/\s+/', $link_rel); + + if ('' != $value && in_array($value, $rels) ) { + echo ' checked="checked"'; + } + + if ('' == $value) { + if ('family' == $class && strpos($link_rel, 'child') === false && strpos($link_rel, 'parent') === false && strpos($link_rel, 'sibling') === false && strpos($link_rel, 'spouse') === false && strpos($link_rel, 'kin') === false) echo ' checked="checked"'; + if ('friendship' == $class && strpos($link_rel, 'friend') === false && strpos($link_rel, 'acquaintance') === false && strpos($link_rel, 'contact') === false) echo ' checked="checked"'; + if ('geographical' == $class && strpos($link_rel, 'co-resident') === false && strpos($link_rel, 'neighbor') === false) echo ' checked="checked"'; + if ('identity' == $class && in_array('me', $rels) ) echo ' checked="checked"'; + } +} + + +/** + * Display xfn form fields. + * + * @since 2.6.0 + * + * @param object $link + */ +function link_xfn_meta_box($link) { +?> + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+ +
+ + +
+ + + +
+ + + + + + +
+ + + + +
+
+

XFN.'); ?>

+ + + + + + + + + + + + + + + + + + +
  +
+ID, '_thumbnail_id', true ); + echo _wp_post_thumbnail_html( $thumbnail_id ); +} diff --git a/src/wp-admin/includes/misc.php b/src/wp-admin/includes/misc.php new file mode 100644 index 0000000..a0db0ad --- /dev/null +++ b/src/wp-admin/includes/misc.php @@ -0,0 +1,588 @@ + $markerline ) { + if (strpos($markerline, '# BEGIN ' . $marker) !== false) + $state = false; + if ( $state ) { + if ( $n + 1 < count( $markerdata ) ) + fwrite( $f, "{$markerline}\n" ); + else + fwrite( $f, "{$markerline}" ); + } + if (strpos($markerline, '# END ' . $marker) !== false) { + fwrite( $f, "# BEGIN {$marker}\n" ); + if ( is_array( $insertion )) + foreach ( $insertion as $insertline ) + fwrite( $f, "{$insertline}\n" ); + fwrite( $f, "# END {$marker}\n" ); + $state = true; + $foundit = true; + } + } + } + if (!$foundit) { + fwrite( $f, "\n# BEGIN {$marker}\n" ); + foreach ( $insertion as $insertline ) + fwrite( $f, "{$insertline}\n" ); + fwrite( $f, "# END {$marker}\n" ); + } + fclose( $f ); + return true; + } else { + return false; + } +} + +/** + * Updates the htaccess file with the current rules if it is writable. + * + * Always writes to the file if it exists and is writable to ensure that we + * blank out old rules. + * + * @since 1.5.0 + */ +function save_mod_rewrite_rules() { + if ( is_multisite() ) + return; + + global $wp_rewrite; + + $home_path = get_home_path(); + $htaccess_file = $home_path.'.htaccess'; + + // If the file doesn't already exist check for write access to the directory and whether we have some rules. + // else check for write access to the file. + if ((!file_exists($htaccess_file) && is_writable($home_path) && $wp_rewrite->using_mod_rewrite_permalinks()) || is_writable($htaccess_file)) { + if ( got_mod_rewrite() ) { + $rules = explode( "\n", $wp_rewrite->mod_rewrite_rules() ); + return insert_with_markers( $htaccess_file, 'WordPress', $rules ); + } + } + + return false; +} + +/** + * Updates the IIS web.config file with the current rules if it is writable. + * If the permalinks do not require rewrite rules then the rules are deleted from the web.config file. + * + * @since 2.8.0 + * + * @return bool True if web.config was updated successfully + */ +function iis7_save_url_rewrite_rules(){ + if ( is_multisite() ) + return; + + global $wp_rewrite; + + $home_path = get_home_path(); + $web_config_file = $home_path . 'web.config'; + + // Using win_is_writable() instead of is_writable() because of a bug in Windows PHP + if ( iis7_supports_permalinks() && ( ( ! file_exists($web_config_file) && win_is_writable($home_path) && $wp_rewrite->using_mod_rewrite_permalinks() ) || win_is_writable($web_config_file) ) ) { + $rule = $wp_rewrite->iis7_url_rewrite_rules(false, '', ''); + if ( ! empty($rule) ) { + return iis7_add_rewrite_rule($web_config_file, $rule); + } else { + return iis7_delete_rewrite_rule($web_config_file); + } + } + return false; +} + +/** + * {@internal Missing Short Description}} + * + * @since 1.5.0 + * + * @param unknown_type $file + */ +function update_recently_edited( $file ) { + $oldfiles = (array ) get_option( 'recently_edited' ); + if ( $oldfiles ) { + $oldfiles = array_reverse( $oldfiles ); + $oldfiles[] = $file; + $oldfiles = array_reverse( $oldfiles ); + $oldfiles = array_unique( $oldfiles ); + if ( 5 < count( $oldfiles )) + array_pop( $oldfiles ); + } else { + $oldfiles[] = $file; + } + update_option( 'recently_edited', $oldfiles ); +} + +/** + * If siteurl or home changed, flush rewrite rules. + * + * @since 2.1.0 + * + * @param unknown_type $old_value + * @param unknown_type $value + */ +function update_home_siteurl( $old_value, $value ) { + global $wp_rewrite; + + if ( defined( "WP_INSTALLING" ) ) + return; + + // If home changed, write rewrite rules to new location. + $wp_rewrite->flush_rules(); +} + +add_action( 'update_option_home', 'update_home_siteurl', 10, 2 ); +add_action( 'update_option_siteurl', 'update_home_siteurl', 10, 2 ); + +/** + * Shorten an URL, to be used as link text + * + * @since 1.2.1 + * + * @param string $url + * @return string + */ +function url_shorten( $url ) { + $short_url = str_replace( 'http://', '', stripslashes( $url )); + $short_url = str_replace( 'www.', '', $short_url ); + if ('/' == substr( $short_url, -1 )) + $short_url = substr( $short_url, 0, -1 ); + if ( strlen( $short_url ) > 35 ) + $short_url = substr( $short_url, 0, 32 ).'...'; + return $short_url; +} + +/** + * Resets global variables based on $_GET and $_POST + * + * This function resets global variables based on the names passed + * in the $vars array to the value of $_POST[$var] or $_GET[$var] or '' + * if neither is defined. + * + * @since 2.0.0 + * + * @param array $vars An array of globals to reset. + */ +function wp_reset_vars( $vars ) { + for ( $i=0; $iget_error_data() ) + $message = $message->get_error_message() . ': ' . $message->get_error_data(); + else + $message = $message->get_error_message(); + } + echo "

$message

\n"; + wp_ob_end_flush_all(); + flush(); +} + +function wp_doc_link_parse( $content ) { + if ( !is_string( $content ) || empty( $content ) ) + return array(); + + if ( !function_exists('token_get_all') ) + return array(); + + $tokens = token_get_all( $content ); + $functions = array(); + $ignore_functions = array(); + for ( $t = 0, $count = count( $tokens ); $t < $count; $t++ ) { + if ( !is_array( $tokens[$t] ) ) continue; + if ( T_STRING == $tokens[$t][0] && ( '(' == $tokens[ $t + 1 ] || '(' == $tokens[ $t + 2 ] ) ) { + // If it's a function or class defined locally, there's not going to be any docs available + if ( ( isset( $tokens[ $t - 2 ][1] ) && in_array( $tokens[ $t - 2 ][1], array( 'function', 'class' ) ) ) || ( isset( $tokens[ $t - 2 ][0] ) && T_OBJECT_OPERATOR == $tokens[ $t - 1 ][0] ) ) { + $ignore_functions[] = $tokens[$t][1]; + } + // Add this to our stack of unique references + $functions[] = $tokens[$t][1]; + } + } + + $functions = array_unique( $functions ); + sort( $functions ); + $ignore_functions = apply_filters( 'documentation_ignore_functions', $ignore_functions ); + $ignore_functions = array_unique( $ignore_functions ); + + $out = array(); + foreach ( $functions as $function ) { + if ( in_array( $function, $ignore_functions ) ) + continue; + $out[] = $function; + } + + return $out; +} + +/** + * Saves option for number of rows when listing posts, pages, comments, etc. + * + * @since 2.8 +**/ +function set_screen_options() { + + if ( isset($_POST['wp_screen_options']) && is_array($_POST['wp_screen_options']) ) { + check_admin_referer( 'screen-options-nonce', 'screenoptionnonce' ); + + if ( !$user = wp_get_current_user() ) + return; + $option = $_POST['wp_screen_options']['option']; + $value = $_POST['wp_screen_options']['value']; + + if ( !preg_match( '/^[a-z_-]+$/', $option ) ) + return; + + $option = str_replace('-', '_', $option); + + $map_option = $option; + $type = str_replace('edit_', '', $map_option); + $type = str_replace('_per_page', '', $type); + if ( in_array($type, get_post_types()) ) + $map_option = 'edit_per_page'; + if ( in_array( $type, get_taxonomies()) ) + $map_option = 'edit_tags_per_page'; + + + switch ( $map_option ) { + case 'edit_per_page': + case 'users_per_page': + case 'edit_comments_per_page': + case 'upload_per_page': + case 'edit_tags_per_page': + case 'plugins_per_page': + // Network admin + case 'sites_network_per_page': + case 'users_network_per_page': + case 'site_users_network_per_page': + case 'plugins_network_per_page': + case 'themes_network_per_page': + case 'site_themes_network_per_page': + $value = (int) $value; + if ( $value < 1 || $value > 999 ) + return; + break; + default: + $value = apply_filters('set-screen-option', false, $option, $value); + if ( false === $value ) + return; + break; + } + + update_user_meta($user->ID, $option, $value); + wp_redirect( remove_query_arg( array('pagenum', 'apage', 'paged'), wp_get_referer() ) ); + exit; + } +} + +/** + * Check if rewrite rule for WordPress already exists in the IIS 7 configuration file + * + * @since 2.8.0 + * + * @return bool + * @param string $filename The file path to the configuration file + */ +function iis7_rewrite_rule_exists($filename) { + if ( ! file_exists($filename) ) + return false; + if ( ! class_exists('DOMDocument') ) + return false; + + $doc = new DOMDocument(); + if ( $doc->load($filename) === false ) + return false; + $xpath = new DOMXPath($doc); + $rules = $xpath->query('/configuration/system.webServer/rewrite/rules/rule[starts-with(@name,\'wordpress\')]'); + if ( $rules->length == 0 ) + return false; + else + return true; +} + +/** + * Delete WordPress rewrite rule from web.config file if it exists there + * + * @since 2.8.0 + * + * @param string $filename Name of the configuration file + * @return bool + */ +function iis7_delete_rewrite_rule($filename) { + // If configuration file does not exist then rules also do not exist so there is nothing to delete + if ( ! file_exists($filename) ) + return true; + + if ( ! class_exists('DOMDocument') ) + return false; + + $doc = new DOMDocument(); + $doc->preserveWhiteSpace = false; + + if ( $doc -> load($filename) === false ) + return false; + $xpath = new DOMXPath($doc); + $rules = $xpath->query('/configuration/system.webServer/rewrite/rules/rule[starts-with(@name,\'wordpress\')]'); + if ( $rules->length > 0 ) { + $child = $rules->item(0); + $parent = $child->parentNode; + $parent->removeChild($child); + $doc->formatOutput = true; + saveDomDocument($doc, $filename); + } + return true; +} + +/** + * Add WordPress rewrite rule to the IIS 7 configuration file. + * + * @since 2.8.0 + * + * @param string $filename The file path to the configuration file + * @param string $rewrite_rule The XML fragment with URL Rewrite rule + * @return bool + */ +function iis7_add_rewrite_rule($filename, $rewrite_rule) { + if ( ! class_exists('DOMDocument') ) + return false; + + // If configuration file does not exist then we create one. + if ( ! file_exists($filename) ) { + $fp = fopen( $filename, 'w'); + fwrite($fp, ''); + fclose($fp); + } + + $doc = new DOMDocument(); + $doc->preserveWhiteSpace = false; + + if ( $doc->load($filename) === false ) + return false; + + $xpath = new DOMXPath($doc); + + // First check if the rule already exists as in that case there is no need to re-add it + $wordpress_rules = $xpath->query('/configuration/system.webServer/rewrite/rules/rule[starts-with(@name,\'wordpress\')]'); + if ( $wordpress_rules->length > 0 ) + return true; + + // Check the XPath to the rewrite rule and create XML nodes if they do not exist + $xmlnodes = $xpath->query('/configuration/system.webServer/rewrite/rules'); + if ( $xmlnodes->length > 0 ) { + $rules_node = $xmlnodes->item(0); + } else { + $rules_node = $doc->createElement('rules'); + + $xmlnodes = $xpath->query('/configuration/system.webServer/rewrite'); + if ( $xmlnodes->length > 0 ) { + $rewrite_node = $xmlnodes->item(0); + $rewrite_node->appendChild($rules_node); + } else { + $rewrite_node = $doc->createElement('rewrite'); + $rewrite_node->appendChild($rules_node); + + $xmlnodes = $xpath->query('/configuration/system.webServer'); + if ( $xmlnodes->length > 0 ) { + $system_webServer_node = $xmlnodes->item(0); + $system_webServer_node->appendChild($rewrite_node); + } else { + $system_webServer_node = $doc->createElement('system.webServer'); + $system_webServer_node->appendChild($rewrite_node); + + $xmlnodes = $xpath->query('/configuration'); + if ( $xmlnodes->length > 0 ) { + $config_node = $xmlnodes->item(0); + $config_node->appendChild($system_webServer_node); + } else { + $config_node = $doc->createElement('configuration'); + $doc->appendChild($config_node); + $config_node->appendChild($system_webServer_node); + } + } + } + } + + $rule_fragment = $doc->createDocumentFragment(); + $rule_fragment->appendXML($rewrite_rule); + $rules_node->appendChild($rule_fragment); + + $doc->encoding = "UTF-8"; + $doc->formatOutput = true; + saveDomDocument($doc, $filename); + + return true; +} + +/** + * Saves the XML document into a file + * + * @since 2.8.0 + * + * @param DOMDocument $doc + * @param string $filename + */ +function saveDomDocument($doc, $filename) { + $config = $doc->saveXML(); + $config = preg_replace("/([^\r])\n/", "$1\r\n", $config); + $fp = fopen($filename, 'w'); + fwrite($fp, $config); + fclose($fp); +} + +/** + * Workaround for Windows bug in is_writable() function + * + * @since 2.8.0 + * + * @param string $path + * @return bool + */ +function win_is_writable( $path ) { + /* will work in despite of Windows ACLs bug + * NOTE: use a trailing slash for folders!!! + * see http://bugs.php.net/bug.php?id=27609 + * see http://bugs.php.net/bug.php?id=30931 + */ + + if ( $path[strlen( $path ) - 1] == '/' ) // recursively return a temporary file path + return win_is_writable( $path . uniqid( mt_rand() ) . '.tmp'); + else if ( is_dir( $path ) ) + return win_is_writable( $path . '/' . uniqid( mt_rand() ) . '.tmp' ); + // check tmp file for read/write capabilities + $should_delete_tmp_file = !file_exists( $path ); + $f = @fopen( $path, 'a' ); + if ( $f === false ) + return false; + fclose( $f ); + if ( $should_delete_tmp_file ) + unlink( $path ); + return true; +} + +/** + * Display the default admin color scheme picker (Used in user-edit.php) + * + * @since 3.0.0 + */ +function admin_color_scheme_picker() { + global $_wp_admin_css_colors, $user_id; ?> +
+ $color_info ): ?> +
/> + + + colors as $html_color ): ?> + + + +
 
+ + +
+ +
+ diff --git a/src/wp-admin/includes/ms-deprecated.php b/src/wp-admin/includes/ms-deprecated.php new file mode 100644 index 0000000..e7b017b --- /dev/null +++ b/src/wp-admin/includes/ms-deprecated.php @@ -0,0 +1,68 @@ + \ No newline at end of file diff --git a/src/wp-admin/includes/ms.php b/src/wp-admin/includes/ms.php new file mode 100644 index 0000000..98991ef --- /dev/null +++ b/src/wp-admin/includes/ms.php @@ -0,0 +1,778 @@ + ( 1024 * get_site_option( 'fileupload_maxk', 1500 ) ) ) + $file['error'] = sprintf(__('This file is too big. Files must be less than %1$s KB in size.'), get_site_option( 'fileupload_maxk', 1500 ) ); + if ( upload_is_user_over_quota( false ) ) { + $file['error'] = __( 'You have used your space quota. Please delete files before uploading.' ); + } + if ( $file['error'] != '0' && !isset($_POST['html-upload']) ) + wp_die( $file['error'] . ' ' . __( 'Back' ) . '' ); + + return $file; +} +add_filter( 'wp_handle_upload_prefilter', 'check_upload_size' ); + +/** + * Delete a blog + * + * @since 3.0.0 + * + * @param int $blog_id Blog ID + * @param bool $drop True if blog's table should be dropped. Default is false. + * @return void + */ +function wpmu_delete_blog( $blog_id, $drop = false ) { + global $wpdb; + + $switch = false; + if ( $blog_id != $wpdb->blogid ) { + $switch = true; + switch_to_blog( $blog_id ); + } + + $blog_prefix = $wpdb->get_blog_prefix( $blog_id ); + + do_action( 'delete_blog', $blog_id, $drop ); + + $users = get_users( array( 'blog_id' => $blog_id, 'fields' => 'ids' ) ); + + // Remove users from this blog. + if ( ! empty( $users ) ) { + foreach ( $users as $user_id ) { + remove_user_from_blog( $user_id, $blog_id) ; + } + } + + update_blog_status( $blog_id, 'deleted', 1 ); + + if ( $drop ) { + if ( substr( $blog_prefix, -1 ) == '_' ) + $blog_prefix = substr( $blog_prefix, 0, -1 ) . '\_'; + + $drop_tables = $wpdb->get_results( "SHOW TABLES LIKE '{$blog_prefix}%'", ARRAY_A ); + $drop_tables = apply_filters( 'wpmu_drop_tables', $drop_tables ); + + reset( $drop_tables ); + foreach ( (array) $drop_tables as $drop_table) { + $wpdb->query( "DROP TABLE IF EXISTS ". current( $drop_table ) ."" ); + } + $wpdb->query( $wpdb->prepare( "DELETE FROM $wpdb->blogs WHERE blog_id = %d", $blog_id ) ); + $dir = apply_filters( 'wpmu_delete_blog_upload_dir', WP_CONTENT_DIR . "/blogs.dir/{$blog_id}/files/", $blog_id ); + $dir = rtrim( $dir, DIRECTORY_SEPARATOR ); + $top_dir = $dir; + $stack = array($dir); + $index = 0; + + while ( $index < count( $stack ) ) { + # Get indexed directory from stack + $dir = $stack[$index]; + + $dh = @opendir( $dir ); + if ( $dh ) { + while ( ( $file = @readdir( $dh ) ) !== false ) { + if ( $file == '.' || $file == '..' ) + continue; + + if ( @is_dir( $dir . DIRECTORY_SEPARATOR . $file ) ) + $stack[] = $dir . DIRECTORY_SEPARATOR . $file; + else if ( @is_file( $dir . DIRECTORY_SEPARATOR . $file ) ) + @unlink( $dir . DIRECTORY_SEPARATOR . $file ); + } + } + $index++; + } + + $stack = array_reverse( $stack ); // Last added dirs are deepest + foreach( (array) $stack as $dir ) { + if ( $dir != $top_dir) + @rmdir( $dir ); + } + } + + $wpdb->query( "DELETE FROM {$wpdb->usermeta} WHERE meta_key = '{$blog_prefix}autosave_draft_ids'" ); + $blogs = get_site_option( 'blog_list' ); + if ( is_array( $blogs ) ) { + foreach ( $blogs as $n => $blog ) { + if ( $blog['blog_id'] == $blog_id ) + unset( $blogs[$n] ); + } + update_site_option( 'blog_list', $blogs ); + } + + if ( $switch === true ) + restore_current_blog(); +} + +// @todo Merge with wp_delete_user() ? +function wpmu_delete_user( $id ) { + global $wpdb; + + $id = (int) $id; + + do_action( 'wpmu_delete_user', $id ); + + $blogs = get_blogs_of_user( $id ); + + if ( ! empty( $blogs ) ) { + foreach ( $blogs as $blog ) { + switch_to_blog( $blog->userblog_id ); + remove_user_from_blog( $id, $blog->userblog_id ); + + $post_ids = $wpdb->get_col( $wpdb->prepare( "SELECT ID FROM $wpdb->posts WHERE post_author = %d", $id ) ); + foreach ( (array) $post_ids as $post_id ) { + wp_delete_post( $post_id ); + } + + // Clean links + $link_ids = $wpdb->get_col( $wpdb->prepare( "SELECT link_id FROM $wpdb->links WHERE link_owner = %d", $id ) ); + + if ( $link_ids ) { + foreach ( $link_ids as $link_id ) + wp_delete_link( $link_id ); + } + + restore_current_blog(); + } + } + + $wpdb->query( $wpdb->prepare( "DELETE FROM $wpdb->users WHERE ID = %d", $id ) ); + $wpdb->query( $wpdb->prepare( "DELETE FROM $wpdb->usermeta WHERE user_id = %d", $id ) ); + + clean_user_cache( $id ); + + // allow for commit transaction + do_action( 'deleted_user', $id ); + + return true; +} + +function wpmu_get_blog_allowedthemes( $blog_id = 0 ) { + $themes = get_themes(); + + if ( $blog_id != 0 ) + switch_to_blog( $blog_id ); + + $blog_allowed_themes = get_option( 'allowedthemes' ); + if ( !is_array( $blog_allowed_themes ) || empty( $blog_allowed_themes ) ) { // convert old allowed_themes to new allowedthemes + $blog_allowed_themes = get_option( 'allowed_themes' ); + + if ( is_array( $blog_allowed_themes ) ) { + foreach( (array) $themes as $key => $theme ) { + $theme_key = esc_html( $theme['Stylesheet'] ); + if ( isset( $blog_allowed_themes[$key] ) == true ) { + $blog_allowedthemes[$theme_key] = 1; + } + } + $blog_allowed_themes = $blog_allowedthemes; + add_option( 'allowedthemes', $blog_allowed_themes ); + delete_option( 'allowed_themes' ); + } + } + + if ( $blog_id != 0 ) + restore_current_blog(); + + return $blog_allowed_themes; +} + +function update_option_new_admin_email( $old_value, $value ) { + $email = get_option( 'admin_email' ); + if ( $value == get_option( 'admin_email' ) || !is_email( $value ) ) + return; + + $hash = md5( $value. time() .mt_rand() ); + $new_admin_email = array( + 'hash' => $hash, + 'newemail' => $value + ); + update_option( 'adminhash', $new_admin_email ); + + $content = apply_filters( 'new_admin_email_content', __( "Dear user, + +You recently requested to have the administration email address on +your site changed. +If this is correct, please click on the following link to change it: +###ADMIN_URL### + +You can safely ignore and delete this email if you do not want to +take this action. + +This email has been sent to ###EMAIL### + +Regards, +All at ###SITENAME### +###SITEURL### "), $new_admin_email ); + + $content = str_replace( '###ADMIN_URL###', esc_url( admin_url( 'options.php?adminhash='.$hash ) ), $content ); + $content = str_replace( '###EMAIL###', $value, $content ); + $content = str_replace( '###SITENAME###', get_site_option( 'site_name' ), $content ); + $content = str_replace( '###SITEURL###', network_home_url(), $content ); + + wp_mail( $value, sprintf( __( '[%s] New Admin Email Address' ), get_option( 'blogname' ) ), $content ); +} +add_action( 'update_option_new_admin_email', 'update_option_new_admin_email', 10, 2 ); +add_action( 'add_option_new_admin_email', 'update_option_new_admin_email', 10, 2 ); + +function send_confirmation_on_profile_email() { + global $errors, $wpdb; + $current_user = wp_get_current_user(); + if ( ! is_object($errors) ) + $errors = new WP_Error(); + + if ( $current_user->id != $_POST['user_id'] ) + return false; + + if ( $current_user->user_email != $_POST['email'] ) { + if ( !is_email( $_POST['email'] ) ) { + $errors->add( 'user_email', __( "ERROR: The e-mail address isn't correct." ), array( 'form-field' => 'email' ) ); + return; + } + + if ( $wpdb->get_var( $wpdb->prepare( "SELECT user_email FROM {$wpdb->users} WHERE user_email=%s", $_POST['email'] ) ) ) { + $errors->add( 'user_email', __( "ERROR: The e-mail address is already used." ), array( 'form-field' => 'email' ) ); + delete_option( $current_user->ID . '_new_email' ); + return; + } + + $hash = md5( $_POST['email'] . time() . mt_rand() ); + $new_user_email = array( + 'hash' => $hash, + 'newemail' => $_POST['email'] + ); + update_option( $current_user->ID . '_new_email', $new_user_email ); + + $content = apply_filters( 'new_user_email_content', __( "Dear user, + +You recently requested to have the email address on your account changed. +If this is correct, please click on the following link to change it: +###ADMIN_URL### + +You can safely ignore and delete this email if you do not want to +take this action. + +This email has been sent to ###EMAIL### + +Regards, +All at ###SITENAME### +###SITEURL###" ), $new_user_email ); + + $content = str_replace( '###ADMIN_URL###', esc_url( admin_url( 'profile.php?newuseremail='.$hash ) ), $content ); + $content = str_replace( '###EMAIL###', $_POST['email'], $content); + $content = str_replace( '###SITENAME###', get_site_option( 'site_name' ), $content ); + $content = str_replace( '###SITEURL###', network_home_url(), $content ); + + wp_mail( $_POST['email'], sprintf( __( '[%s] New Email Address' ), get_option( 'blogname' ) ), $content ); + $_POST['email'] = $current_user->user_email; + } +} +add_action( 'personal_options_update', 'send_confirmation_on_profile_email' ); + +function new_user_email_admin_notice() { + if ( strpos( $_SERVER['PHP_SELF'], 'profile.php' ) && isset( $_GET['updated'] ) && $email = get_option( get_current_user_id() . '_new_email' ) ) + echo "
" . sprintf( __( "Your email address has not been updated yet. Please check your inbox at %s for a confirmation email." ), $email['newemail'] ) . "
"; +} +add_action( 'admin_notices', 'new_user_email_admin_notice' ); + +function get_site_allowed_themes() { + $themes = get_themes(); + $allowed_themes = get_site_option( 'allowedthemes' ); + if ( !is_array( $allowed_themes ) || empty( $allowed_themes ) ) { + $allowed_themes = get_site_option( 'allowed_themes' ); // convert old allowed_themes format + if ( !is_array( $allowed_themes ) ) { + $allowed_themes = array(); + } else { + foreach( (array) $themes as $key => $theme ) { + $theme_key = esc_html( $theme['Stylesheet'] ); + if ( isset( $allowed_themes[ $key ] ) == true ) { + $allowedthemes[ $theme_key ] = 1; + } + } + $allowed_themes = $allowedthemes; + } + } + return $allowed_themes; +} + +/** + * Determines if there is any upload space left in the current blog's quota. + * + * @since 3.0.0 + * @return bool True if space is available, false otherwise. + */ +function is_upload_space_available() { + if ( get_site_option( 'upload_space_check_disabled' ) ) + return true; + + if ( !( $space_allowed = get_upload_space_available() ) ) + return false; + + return true; +} + +/** + * @since 3.0.0 + * + * @return int of upload size limit in bytes + */ +function upload_size_limit_filter( $size ) { + $fileupload_maxk = 1024 * get_site_option( 'fileupload_maxk', 1500 ); + if ( get_site_option( 'upload_space_check_disabled' ) ) + return min( $size, $fileupload_maxk ); + + return min( $size, $fileupload_maxk, get_upload_space_available() ); +} +/** + * Determines if there is any upload space left in the current blog's quota. + * + * @return int of upload space available in bytes + */ +function get_upload_space_available() { + $space_allowed = get_space_allowed() * 1024 * 1024; + if ( get_site_option( 'upload_space_check_disabled' ) ) + return $space_allowed; + + $dir_name = trailingslashit( BLOGUPLOADDIR ); + if ( !( is_dir( $dir_name) && is_readable( $dir_name ) ) ) + return $space_allowed; + + $dir = dir( $dir_name ); + $size = 0; + + while ( $file = $dir->read() ) { + if ( $file != '.' && $file != '..' ) { + if ( is_dir( $dir_name . $file) ) { + $size += get_dirsize( $dir_name . $file ); + } else { + $size += filesize( $dir_name . $file ); + } + } + } + $dir->close(); + + if ( ( $space_allowed - $size ) <= 0 ) + return 0; + + return $space_allowed - $size; +} + +/** + * Returns the upload quota for the current blog. + * + * @return int Quota + */ +function get_space_allowed() { + $space_allowed = get_option( 'blog_upload_space' ); + if ( $space_allowed == false ) + $space_allowed = get_site_option( 'blog_upload_space' ); + if ( empty( $space_allowed ) || !is_numeric( $space_allowed ) ) + $space_allowed = 50; + + return $space_allowed; +} + +function display_space_usage() { + $space = get_space_allowed(); + $used = get_dirsize( BLOGUPLOADDIR ) / 1024 / 1024; + + $percentused = ( $used / $space ) * 100; + + if ( $space > 1000 ) { + $space = number_format( $space / 1024 ); + /* translators: Gigabytes */ + $space .= __( 'GB' ); + } else { + /* translators: Megabytes */ + $space .= __( 'MB' ); + } + ?> + + + + + + + update( $wpdb->users, array( $pref => $value ), array( 'ID' => $id ) ); + + clean_user_cache( $id ); + + if ( $pref == 'spam' ) { + if ( $value == 1 ) + do_action( 'make_spam_user', $id ); + else + do_action( 'make_ham_user', $id ); + } + + return $value; +} + +function refresh_user_details( $id ) { + $id = (int) $id; + + if ( !$user = get_userdata( $id ) ) + return false; + + clean_user_cache( $id ); + + return $id; +} + +function format_code_lang( $code = '' ) { + $code = strtolower( substr( $code, 0, 2 ) ); + $lang_codes = array( + 'aa' => 'Afar', 'ab' => 'Abkhazian', 'af' => 'Afrikaans', 'ak' => 'Akan', 'sq' => 'Albanian', 'am' => 'Amharic', 'ar' => 'Arabic', 'an' => 'Aragonese', 'hy' => 'Armenian', 'as' => 'Assamese', 'av' => 'Avaric', 'ae' => 'Avestan', 'ay' => 'Aymara', 'az' => 'Azerbaijani', 'ba' => 'Bashkir', 'bm' => 'Bambara', 'eu' => 'Basque', 'be' => 'Belarusian', 'bn' => 'Bengali', + 'bh' => 'Bihari', 'bi' => 'Bislama', 'bs' => 'Bosnian', 'br' => 'Breton', 'bg' => 'Bulgarian', 'my' => 'Burmese', 'ca' => 'Catalan; Valencian', 'ch' => 'Chamorro', 'ce' => 'Chechen', 'zh' => 'Chinese', 'cu' => 'Church Slavic; Old Slavonic; Church Slavonic; Old Bulgarian; Old Church Slavonic', 'cv' => 'Chuvash', 'kw' => 'Cornish', 'co' => 'Corsican', 'cr' => 'Cree', + 'cs' => 'Czech', 'da' => 'Danish', 'dv' => 'Divehi; Dhivehi; Maldivian', 'nl' => 'Dutch; Flemish', 'dz' => 'Dzongkha', 'en' => 'English', 'eo' => 'Esperanto', 'et' => 'Estonian', 'ee' => 'Ewe', 'fo' => 'Faroese', 'fj' => 'Fijjian', 'fi' => 'Finnish', 'fr' => 'French', 'fy' => 'Western Frisian', 'ff' => 'Fulah', 'ka' => 'Georgian', 'de' => 'German', 'gd' => 'Gaelic; Scottish Gaelic', + 'ga' => 'Irish', 'gl' => 'Galician', 'gv' => 'Manx', 'el' => 'Greek, Modern', 'gn' => 'Guarani', 'gu' => 'Gujarati', 'ht' => 'Haitian; Haitian Creole', 'ha' => 'Hausa', 'he' => 'Hebrew', 'hz' => 'Herero', 'hi' => 'Hindi', 'ho' => 'Hiri Motu', 'hu' => 'Hungarian', 'ig' => 'Igbo', 'is' => 'Icelandic', 'io' => 'Ido', 'ii' => 'Sichuan Yi', 'iu' => 'Inuktitut', 'ie' => 'Interlingue', + 'ia' => 'Interlingua (International Auxiliary Language Association)', 'id' => 'Indonesian', 'ik' => 'Inupiaq', 'it' => 'Italian', 'jv' => 'Javanese', 'ja' => 'Japanese', 'kl' => 'Kalaallisut; Greenlandic', 'kn' => 'Kannada', 'ks' => 'Kashmiri', 'kr' => 'Kanuri', 'kk' => 'Kazakh', 'km' => 'Central Khmer', 'ki' => 'Kikuyu; Gikuyu', 'rw' => 'Kinyarwanda', 'ky' => 'Kirghiz; Kyrgyz', + 'kv' => 'Komi', 'kg' => 'Kongo', 'ko' => 'Korean', 'kj' => 'Kuanyama; Kwanyama', 'ku' => 'Kurdish', 'lo' => 'Lao', 'la' => 'Latin', 'lv' => 'Latvian', 'li' => 'Limburgan; Limburger; Limburgish', 'ln' => 'Lingala', 'lt' => 'Lithuanian', 'lb' => 'Luxembourgish; Letzeburgesch', 'lu' => 'Luba-Katanga', 'lg' => 'Ganda', 'mk' => 'Macedonian', 'mh' => 'Marshallese', 'ml' => 'Malayalam', + 'mi' => 'Maori', 'mr' => 'Marathi', 'ms' => 'Malay', 'mg' => 'Malagasy', 'mt' => 'Maltese', 'mo' => 'Moldavian', 'mn' => 'Mongolian', 'na' => 'Nauru', 'nv' => 'Navajo; Navaho', 'nr' => 'Ndebele, South; South Ndebele', 'nd' => 'Ndebele, North; North Ndebele', 'ng' => 'Ndonga', 'ne' => 'Nepali', 'nn' => 'Norwegian Nynorsk; Nynorsk, Norwegian', 'nb' => 'Bokmål, Norwegian, Norwegian Bokmål', + 'no' => 'Norwegian', 'ny' => 'Chichewa; Chewa; Nyanja', 'oc' => 'Occitan, Provençal', 'oj' => 'Ojibwa', 'or' => 'Oriya', 'om' => 'Oromo', 'os' => 'Ossetian; Ossetic', 'pa' => 'Panjabi; Punjabi', 'fa' => 'Persian', 'pi' => 'Pali', 'pl' => 'Polish', 'pt' => 'Portuguese', 'ps' => 'Pushto', 'qu' => 'Quechua', 'rm' => 'Romansh', 'ro' => 'Romanian', 'rn' => 'Rundi', 'ru' => 'Russian', + 'sg' => 'Sango', 'sa' => 'Sanskrit', 'sr' => 'Serbian', 'hr' => 'Croatian', 'si' => 'Sinhala; Sinhalese', 'sk' => 'Slovak', 'sl' => 'Slovenian', 'se' => 'Northern Sami', 'sm' => 'Samoan', 'sn' => 'Shona', 'sd' => 'Sindhi', 'so' => 'Somali', 'st' => 'Sotho, Southern', 'es' => 'Spanish; Castilian', 'sc' => 'Sardinian', 'ss' => 'Swati', 'su' => 'Sundanese', 'sw' => 'Swahili', + 'sv' => 'Swedish', 'ty' => 'Tahitian', 'ta' => 'Tamil', 'tt' => 'Tatar', 'te' => 'Telugu', 'tg' => 'Tajik', 'tl' => 'Tagalog', 'th' => 'Thai', 'bo' => 'Tibetan', 'ti' => 'Tigrinya', 'to' => 'Tonga (Tonga Islands)', 'tn' => 'Tswana', 'ts' => 'Tsonga', 'tk' => 'Turkmen', 'tr' => 'Turkish', 'tw' => 'Twi', 'ug' => 'Uighur; Uyghur', 'uk' => 'Ukrainian', 'ur' => 'Urdu', 'uz' => 'Uzbek', + 've' => 'Venda', 'vi' => 'Vietnamese', 'vo' => 'Volapük', 'cy' => 'Welsh','wa' => 'Walloon','wo' => 'Wolof', 'xh' => 'Xhosa', 'yi' => 'Yiddish', 'yo' => 'Yoruba', 'za' => 'Zhuang; Chuang', 'zu' => 'Zulu' ); + $lang_codes = apply_filters( 'lang_codes', $lang_codes, $code ); + return strtr( $code, $lang_codes ); +} + +function sync_category_tag_slugs( $term, $taxonomy ) { + if ( global_terms_enabled() && ( $taxonomy == 'category' || $taxonomy == 'post_tag' ) ) { + if ( is_object( $term ) ) { + $term->slug = sanitize_title( $term->name ); + } else { + $term['slug'] = sanitize_title( $term['name'] ); + } + } + return $term; +} +add_filter( 'get_term', 'sync_category_tag_slugs', 10, 2 ); + +function _access_denied_splash() { + if ( ! is_user_logged_in() || is_network_admin() ) + return; + + $blogs = get_blogs_of_user( get_current_user_id() ); + + if ( wp_list_filter( $blogs, array( 'userblog_id' => get_current_blog_id() ) ) ) + return; + + $blog_name = get_bloginfo( 'name' ); + + if ( empty( $blogs ) ) + wp_die( sprintf( __( 'You attempted to access the "%1$s" dashboard, but you do not currently have privileges on this site. If you believe you should be able to access the "%1$s" dashboard, please contact your network administrator.' ), $blog_name ) ); + + $output = '

' . sprintf( __( 'You attempted to access the "%1$s" dashboard, but you do not currently have privileges on this site. If you believe you should be able to access the "%1$s" dashboard, please contact your network administrator.' ), $blog_name ) . '

'; + $output .= '

' . __( 'If you reached this screen by accident and meant to visit one of your own sites, here are some shortcuts to help you find your way.' ) . '

'; + + $output .= '

' . __('Your Sites') . '

'; + $output .= ''; + + foreach ( $blogs as $blog ) { + $output .= ""; + $output .= ""; + $output .= ""; + $output .= ""; + } + $output .= '
"; + $output .= "{$blog->blogname}"; + $output .= ""; + $output .= "" . __( 'Visit Dashboard' ) . " | " . __( 'View Site' ) . "" ; + $output .= "
'; + + wp_die( $output ); +} +add_action( 'admin_page_access_denied', '_access_denied_splash', 99 ); + +function check_import_new_users( $permission ) { + if ( !is_super_admin() ) + return false; + return true; +} +add_filter( 'import_allow_create_users', 'check_import_new_users' ); +// See "import_allow_fetch_attachments" and "import_attachment_size_limit" filters too. + +function mu_dropdown_languages( $lang_files = array(), $current = '' ) { + $flag = false; + $output = array(); + + foreach ( (array) $lang_files as $val ) { + $code_lang = basename( $val, '.mo' ); + + if ( $code_lang == 'en_US' ) { // American English + $flag = true; + $ae = __( 'American English' ); + $output[$ae] = ''; + } elseif ( $code_lang == 'en_GB' ) { // British English + $flag = true; + $be = __( 'British English' ); + $output[$be] = ''; + } else { + $translated = format_code_lang( $code_lang ); + $output[$translated] = ''; + } + + } + + if ( $flag === false ) // WordPress english + $output[] = '"; + + // Order by name + uksort( $output, 'strnatcasecmp' ); + + $output = apply_filters( 'mu_dropdown_languages', $output, $lang_files, $current ); + echo implode( "\n\t", $output ); +} + +/* Warn the admin if SECRET SALT information is missing from wp-config.php */ +function secret_salt_warning() { + if ( !is_super_admin() ) + return; + $secret_keys = array( 'AUTH_KEY', 'SECURE_AUTH_KEY', 'LOGGED_IN_KEY', 'NONCE_KEY', 'AUTH_SALT', 'SECURE_AUTH_SALT', 'LOGGED_IN_SALT', 'NONCE_SALT' ); + $out = ''; + foreach( $secret_keys as $key ) { + if ( ! defined( $key ) ) + $out .= "define( '$key', '" . esc_html( wp_generate_password( 64, true, true ) ) . "' );
"; + } + if ( $out != '' ) { + $msg = __( 'Warning! WordPress encrypts user cookies, but you must add the following lines to wp-config.php for it to be more secure.' ); + $msg .= '
' . __( "Before the line /* That's all, stop editing! Happy blogging. */ please add this code:" ); + $msg .= "

$out"; + + echo "
$msg
"; + } +} +add_action( 'network_admin_notices', 'secret_salt_warning' ); + +function site_admin_notice() { + global $wp_db_version; + if ( !is_super_admin() ) + return false; + if ( get_site_option( 'wpmu_upgrade_site' ) != $wp_db_version ) + echo "
" . sprintf( __( 'Thank you for Updating! Please visit the Update Network page to update all your sites.' ), esc_url( network_admin_url( 'upgrade.php' ) ) ) . "
"; +} +add_action( 'admin_notices', 'site_admin_notice' ); +add_action( 'network_admin_notices', 'site_admin_notice' ); + +function avoid_blog_page_permalink_collision( $data, $postarr ) { + if ( is_subdomain_install() ) + return $data; + if ( $data['post_type'] != 'page' ) + return $data; + if ( !isset( $data['post_name'] ) || $data['post_name'] == '' ) + return $data; + if ( !is_main_site() ) + return $data; + + $post_name = $data['post_name']; + $c = 0; + while( $c < 10 && get_id_from_blogname( $post_name ) ) { + $post_name .= mt_rand( 1, 10 ); + $c ++; + } + if ( $post_name != $data['post_name'] ) { + $data['post_name'] = $post_name; + } + return $data; +} +add_filter( 'wp_insert_post_data', 'avoid_blog_page_permalink_collision', 10, 2 ); + +function choose_primary_blog() { + ?> + + + + + + + + + + + +
+ 1 ) { + $found = false; + ?> + + userblog_id ); + } + } elseif ( count( $all_blogs ) == 1 ) { + $blog = array_shift( $all_blogs ); + echo $blog->domain; + if ( $primary_blog != $blog->userblog_id ) // Set the primary blog again if it's out of sync with blog list. + update_user_meta( get_current_user_id(), 'primary_blog', $blog->userblog_id ); + } else { + echo "N/A"; + } + ?> +
+ +
+ ' . sprintf( __( 'The %1$s file is deprecated. Please remove it and update your server rewrite rules to use %2$s instead.' ), 'wp-content/blogs.php', 'wp-includes/ms-files.php' ) . ''; +} +add_action( 'network_admin_notices', 'ms_deprecated_blogs_file' ); + +/** + * Grants super admin privileges. + * + * @since 3.0.0 + * @param int $user_id + */ +function grant_super_admin( $user_id ) { + global $super_admins; + + // If global super_admins override is defined, there is nothing to do here. + if ( isset($super_admins) ) + return false; + + 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 = new WP_User( $user_id ); + if ( ! in_array( $user->user_login, $super_admins ) ) { + $super_admins[] = $user->user_login; + update_site_option( 'site_admins' , $super_admins ); + do_action( 'granted_super_admin', $user_id ); + return true; + } + return false; +} + +/** + * Revokes super admin privileges. + * + * @since 3.0.0 + * @param int $user_id + */ +function revoke_super_admin( $user_id ) { + global $super_admins; + + // If global super_admins override is defined, there is nothing to do here. + if ( isset($super_admins) ) + return false; + + 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 = new WP_User( $user_id ); + if ( $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 ); + do_action( 'revoked_super_admin', $user_id ); + return true; + } + } + return false; +} + +/** + * Whether or not we can edit this network from this page + * + * By default editing of network is restricted to the Network Admin for that site_id this allows for this to be overridden + * + * @since 3.1.0 + * @param integer $site_id The network/site id to check. + */ +function can_edit_network( $site_id ) { + global $wpdb; + + if ($site_id == $wpdb->siteid ) + $result = true; + else + $result = false; + + return apply_filters( 'can_edit_network', $result, $site_id ); +} + +/** + * Thickbox image paths for Network Admin. + * + * @since 3.1.0 + * @access private + */ +function _thickbox_path_admin_subfolder() { +?> + + diff --git a/src/wp-admin/includes/nav-menu.php b/src/wp-admin/includes/nav-menu.php new file mode 100644 index 0000000..8890166 --- /dev/null +++ b/src/wp-admin/includes/nav-menu.php @@ -0,0 +1,1171 @@ + $_wp_nav_menu_max_depth ? $depth : $_wp_nav_menu_max_depth; + + $indent = ( $depth ) ? str_repeat( "\t", $depth ) : ''; + + ob_start(); + $item_id = esc_attr( $item->ID ); + $removed_args = array( + 'action', + 'customlink-tab', + 'edit-menu-item', + 'menu-item', + 'page-tab', + '_wpnonce', + ); + + $original_title = ''; + if ( 'taxonomy' == $item->type ) { + $original_title = get_term_field( 'name', $item->object_id, $item->object, 'raw' ); + if ( is_wp_error( $original_title ) ) + $original_title = false; + } elseif ( 'post_type' == $item->type ) { + $original_object = get_post( $item->object_id ); + $original_title = $original_object->post_title; + } + + $classes = array( + 'menu-item menu-item-depth-' . $depth, + 'menu-item-' . esc_attr( $item->object ), + 'menu-item-edit-' . ( ( isset( $_GET['edit-menu-item'] ) && $item_id == $_GET['edit-menu-item'] ) ? 'active' : 'inactive'), + ); + + $title = $item->title; + + if ( ! empty( $item->_invalid ) ) { + $classes[] = 'menu-item-invalid'; + /* translators: %s: title of menu item which is invalid */ + $title = sprintf( __( '%s (Invalid)' ), $item->title ); + } elseif ( isset( $item->post_status ) && 'draft' == $item->post_status ) { + $classes[] = 'pending'; + /* translators: %s: title of menu item in draft status */ + $title = sprintf( __('%s (Pending)'), $item->title ); + } + + $title = empty( $item->label ) ? $title : $item->label; + + ?> +
  • '; + $output .= ''; + + // Menu item hidden fields + $output .= ''; + $output .= ''; + $output .= ''; + $output .= ''; + $output .= ''; + $output .= ''; + $output .= ''; + $output .= ''; + $output .= ''; + $output .= ''; + } +} + +/** + * Prints the appropriate response to a menu quick search. + * + * @since 3.0.0 + * + * @param array $request The unsanitized request values. + */ +function _wp_ajax_menu_quick_search( $request = array() ) { + $args = array(); + $type = isset( $request['type'] ) ? $request['type'] : ''; + $object_type = isset( $request['object_type'] ) ? $request['object_type'] : ''; + $query = isset( $request['q'] ) ? $request['q'] : ''; + $response_format = isset( $request['response-format'] ) && in_array( $request['response-format'], array( 'json', 'markup' ) ) ? $request['response-format'] : 'json'; + + if ( 'markup' == $response_format ) { + $args['walker'] = new Walker_Nav_Menu_Checklist; + } + + if ( 'get-post-item' == $type ) { + if ( post_type_exists( $object_type ) ) { + if ( isset( $request['ID'] ) ) { + $object_id = (int) $request['ID']; + if ( 'markup' == $response_format ) { + echo walk_nav_menu_tree( array_map('wp_setup_nav_menu_item', array( get_post( $object_id ) ) ), 0, (object) $args ); + } elseif ( 'json' == $response_format ) { + $post_obj = get_post( $object_id ); + echo json_encode( + array( + 'ID' => $object_id, + 'post_title' => get_the_title( $object_id ), + 'post_type' => get_post_type( $object_id ), + ) + ); + echo "\n"; + } + } + } elseif ( taxonomy_exists( $object_type ) ) { + if ( isset( $request['ID'] ) ) { + $object_id = (int) $request['ID']; + if ( 'markup' == $response_format ) { + echo walk_nav_menu_tree( array_map('wp_setup_nav_menu_item', array( get_term( $object_id, $object_type ) ) ), 0, (object) $args ); + } elseif ( 'json' == $response_format ) { + $post_obj = get_term( $object_id, $object_type ); + echo json_encode( + array( + 'ID' => $object_id, + 'post_title' => $post_obj->name, + 'post_type' => $object_type, + ) + ); + echo "\n"; + } + } + + } + + + } elseif ( preg_match('/quick-search-(posttype|taxonomy)-([a-zA-Z_-]*\b)/', $type, $matches) ) { + if ( 'posttype' == $matches[1] && get_post_type_object( $matches[2] ) ) { + query_posts(array( + 'posts_per_page' => 10, + 'post_type' => $matches[2], + 's' => $query, + )); + if ( ! have_posts() ) + return; + while ( have_posts() ) { + the_post(); + if ( 'markup' == $response_format ) { + echo walk_nav_menu_tree( array_map('wp_setup_nav_menu_item', array( get_post( get_the_ID() ) ) ), 0, (object) $args ); + } elseif ( 'json' == $response_format ) { + echo json_encode( + array( + 'ID' => get_the_ID(), + 'post_title' => get_the_title(), + 'post_type' => get_post_type(), + ) + ); + echo "\n"; + } + } + } elseif ( 'taxonomy' == $matches[1] ) { + $terms = get_terms( $matches[2], array( + 'name__like' => $query, + 'number' => 10, + )); + if ( empty( $terms ) || is_wp_error( $terms ) ) + return; + foreach( (array) $terms as $term ) { + if ( 'markup' == $response_format ) { + echo walk_nav_menu_tree( array_map('wp_setup_nav_menu_item', array( $term ) ), 0, (object) $args ); + } elseif ( 'json' == $response_format ) { + echo json_encode( + array( + 'ID' => $term->term_id, + 'post_title' => $term->name, + 'post_type' => $matches[2], + ) + ); + echo "\n"; + } + } + } + } +} + +/** + * Register nav menu metaboxes and advanced menu items + * + * @since 3.0.0 + **/ +function wp_nav_menu_setup() { + // Register meta boxes + if ( wp_get_nav_menus() ) + add_meta_box( 'nav-menu-theme-locations', __( 'Theme Locations' ), 'wp_nav_menu_locations_meta_box' , 'nav-menus', 'side', 'default' ); + add_meta_box( 'add-custom-links', __('Custom Links'), 'wp_nav_menu_item_link_meta_box', 'nav-menus', 'side', 'default' ); + wp_nav_menu_post_type_meta_boxes(); + wp_nav_menu_taxonomy_meta_boxes(); + + // Register advanced menu items (columns) + add_filter( 'manage_nav-menus_columns', 'wp_nav_menu_manage_columns'); + + // If first time editing, disable advanced items by default. + if( false === get_user_option( 'managenav-menuscolumnshidden' ) ) { + $user = wp_get_current_user(); + update_user_option($user->ID, 'managenav-menuscolumnshidden', + array( 0 => 'link-target', 1 => 'css-classes', 2 => 'xfn', 3 => 'description', ), + true); + } +} + +/** + * Limit the amount of meta boxes to just links, pages and cats for first time users. + * + * @since 3.0.0 + **/ +function wp_initial_nav_menu_meta_boxes() { + global $wp_meta_boxes; + + if ( get_user_option( 'metaboxhidden_nav-menus' ) !== false || ! is_array($wp_meta_boxes) ) + return; + + $initial_meta_boxes = array( 'nav-menu-theme-locations', 'add-custom-links', 'add-page', 'add-category' ); + $hidden_meta_boxes = array(); + + foreach ( array_keys($wp_meta_boxes['nav-menus']) as $context ) { + foreach ( array_keys($wp_meta_boxes['nav-menus'][$context]) as $priority ) { + foreach ( $wp_meta_boxes['nav-menus'][$context][$priority] as $box ) { + if ( in_array( $box['id'], $initial_meta_boxes ) ) { + unset( $box['id'] ); + } else { + $hidden_meta_boxes[] = $box['id']; + } + } + } + } + + $user = wp_get_current_user(); + update_user_option( $user->ID, 'metaboxhidden_nav-menus', $hidden_meta_boxes, true ); +} + +/** + * Creates metaboxes for any post type menu item. + * + * @since 3.0.0 + */ +function wp_nav_menu_post_type_meta_boxes() { + $post_types = get_post_types( array( 'show_in_nav_menus' => true ), 'object' ); + + if ( ! $post_types ) + return; + + foreach ( $post_types as $post_type ) { + $post_type = apply_filters( 'nav_menu_meta_box_object', $post_type ); + if ( $post_type ) { + $id = $post_type->name; + add_meta_box( "add-{$id}", $post_type->labels->name, 'wp_nav_menu_item_post_type_meta_box', 'nav-menus', 'side', 'default', $post_type ); + } + } +} + +/** + * Creates metaboxes for any taxonomy menu item. + * + * @since 3.0.0 + */ +function wp_nav_menu_taxonomy_meta_boxes() { + $taxonomies = get_taxonomies( array( 'show_in_nav_menus' => true ), 'object' ); + + if ( !$taxonomies ) + return; + + foreach ( $taxonomies as $tax ) { + $tax = apply_filters( 'nav_menu_meta_box_object', $tax ); + if ( $tax ) { + $id = $tax->name; + add_meta_box( "add-{$id}", $tax->labels->name, 'wp_nav_menu_item_taxonomy_meta_box', 'nav-menus', 'side', 'default', $tax ); + } + } +} + +/** + * Displays a metabox for the nav menu theme locations. + * + * @since 3.0.0 + */ +function wp_nav_menu_locations_meta_box() { + global $nav_menu_selected_id; + + if ( ! current_theme_supports( 'menus' ) ) { + // We must only support widgets. Leave a message and bail. + echo '

    ' . __('The current theme does not natively support menus, but you can use the “Custom Menu” widget to add any menus you create here to the theme’s sidebar.') . '

    '; + return; + } + + $locations = get_registered_nav_menus(); + $menus = wp_get_nav_menus(); + $menu_locations = get_nav_menu_locations(); + $num_locations = count( array_keys($locations) ); + + echo '

    ' . sprintf( _n('Your theme supports %s menu. Select which menu you would like to use.', 'Your theme supports %s menus. Select which menu appears in each location.', $num_locations ), number_format_i18n($num_locations) ) . '

    '; + + foreach ( $locations as $location => $description ) { + ?> +

    + +

    + +

    + + +

    + $_nav_menu_placeholder ? $_nav_menu_placeholder - 1 : -1; + + $current_tab = 'create'; + if ( isset( $_REQUEST['customlink-tab'] ) && in_array( $_REQUEST['customlink-tab'], array('create', 'all') ) ) { + $current_tab = $_REQUEST['customlink-tab']; + } + + $removed_args = array( + 'action', + 'customlink-tab', + 'edit-menu-item', + 'menu-item', + 'page-tab', + '_wpnonce', + ); + + ?> +
    + + + + + + +

    + + + class="button-secondary submit-add-to-menu" value="" name="add-custom-menu-item" id="submit-customlinkdiv" /> + +

    + +
    + name; + + // paginate browsing for large numbers of post objects + $per_page = 50; + $pagenum = isset( $_REQUEST[$post_type_name . '-tab'] ) && isset( $_REQUEST['paged'] ) ? absint( $_REQUEST['paged'] ) : 1; + $offset = 0 < $pagenum ? $per_page * ( $pagenum - 1 ) : 0; + + $args = array( + 'offset' => $offset, + 'order' => 'ASC', + 'orderby' => 'title', + 'posts_per_page' => $per_page, + 'post_type' => $post_type_name, + 'suppress_filters' => true, + 'update_post_term_cache' => false, + 'update_post_meta_cache' => false + ); + + if ( isset( $post_type['args']->_default_query ) ) + $args = array_merge($args, (array) $post_type['args']->_default_query ); + + // @todo transient caching of these results with proper invalidation on updating of a post of this type + $get_posts = new WP_Query; + $posts = $get_posts->query( $args ); + if ( ! $get_posts->post_count ) { + echo '

    ' . __( 'No items.' ) . '

    '; + return; + } + + $post_type_object = get_post_type_object($post_type_name); + + $num_pages = $get_posts->max_num_pages; + + $page_links = paginate_links( array( + 'base' => add_query_arg( + array( + $post_type_name . '-tab' => 'all', + 'paged' => '%#%', + 'item-type' => 'post_type', + 'item-object' => $post_type_name, + ) + ), + 'format' => '', + 'prev_text' => __('«'), + 'next_text' => __('»'), + 'total' => $num_pages, + 'current' => $pagenum + )); + + if ( !$posts ) + $error = '
  • '. $post_type['args']->labels->not_found .'
  • '; + + $db_fields = false; + if ( is_post_type_hierarchical( $post_type_name ) ) { + $db_fields = array( 'parent' => 'post_parent', 'id' => 'ID' ); + } + + $walker = new Walker_Nav_Menu_Checklist( $db_fields ); + + $current_tab = 'most-recent'; + if ( isset( $_REQUEST[$post_type_name . '-tab'] ) && in_array( $_REQUEST[$post_type_name . '-tab'], array('all', 'search') ) ) { + $current_tab = $_REQUEST[$post_type_name . '-tab']; + } + + if ( ! empty( $_REQUEST['quick-search-posttype-' . $post_type_name] ) ) { + $current_tab = 'search'; + } + + $removed_args = array( + 'action', + 'customlink-tab', + 'edit-menu-item', + 'menu-item', + 'page-tab', + '_wpnonce', + ); + + ?> +
    +
      +
    • >
    • +
    • >
    • +
    • >
    • +
    + +
    +
      + 'post_date', 'order' => 'DESC', 'posts_per_page' => 15 ) ); + $most_recent = $get_posts->query( $recent_args ); + $args['walker'] = $walker; + echo walk_nav_menu_tree( array_map('wp_setup_nav_menu_item', $most_recent), 0, (object) $args ); + ?> +
    +
    + + + + +
    + + + +
      + _add_to_top = true; + $front_page_obj->label = sprintf( _x('Home: %s', 'nav menu front page title'), $front_page_obj->post_title ); + array_unshift( $posts, $front_page_obj ); + } else { + $_nav_menu_placeholder = ( 0 > $_nav_menu_placeholder ) ? intval($_nav_menu_placeholder) - 1 : -1; + array_unshift( $posts, (object) array( + '_add_to_top' => true, + 'ID' => 0, + 'object_id' => $_nav_menu_placeholder, + 'post_content' => '', + 'post_excerpt' => '', + 'post_parent' => '', + 'post_title' => _x('Home', 'nav menu home label'), + 'post_type' => 'nav_menu_item', + 'type' => 'custom', + 'url' => home_url('/'), + ) ); + } + } + + $posts = apply_filters( 'nav_menu_items_'.$post_type_name, $posts, $args, $post_type ); + $checkbox_items = walk_nav_menu_tree( array_map('wp_setup_nav_menu_item', $posts), 0, (object) $args ); + + if ( 'all' == $current_tab && ! empty( $_REQUEST['selectall'] ) ) { + $checkbox_items = preg_replace('/(type=(.)checkbox(\2))/', '$1 checked=$2checked$2', $checkbox_items); + + } + + echo $checkbox_items; + ?> +
    + + + +
    + + +

    + + + + + + + class="button-secondary submit-add-to-menu" value="" name="add-post-type-menu-item" id="submit-posttype-" /> + +

    + +
    + name; + + // paginate browsing for large numbers of objects + $per_page = 50; + $pagenum = isset( $_REQUEST[$taxonomy_name . '-tab'] ) && isset( $_REQUEST['paged'] ) ? absint( $_REQUEST['paged'] ) : 1; + $offset = 0 < $pagenum ? $per_page * ( $pagenum - 1 ) : 0; + + $args = array( + 'child_of' => 0, + 'exclude' => '', + 'hide_empty' => false, + 'hierarchical' => 1, + 'include' => '', + 'include_last_update_time' => false, + 'number' => $per_page, + 'offset' => $offset, + 'order' => 'ASC', + 'orderby' => 'name', + 'pad_counts' => false, + ); + + $terms = get_terms( $taxonomy_name, $args ); + + if ( ! $terms || is_wp_error($terms) ) { + echo '

    ' . __( 'No items.' ) . '

    '; + return; + } + + $num_pages = ceil( wp_count_terms( $taxonomy_name , array_merge( $args, array('number' => '', 'offset' => '') ) ) / $per_page ); + + $page_links = paginate_links( array( + 'base' => add_query_arg( + array( + $taxonomy_name . '-tab' => 'all', + 'paged' => '%#%', + 'item-type' => 'taxonomy', + 'item-object' => $taxonomy_name, + ) + ), + 'format' => '', + 'prev_text' => __('«'), + 'next_text' => __('»'), + 'total' => $num_pages, + 'current' => $pagenum + )); + + $db_fields = false; + if ( is_taxonomy_hierarchical( $taxonomy_name ) ) { + $db_fields = array( 'parent' => 'parent', 'id' => 'term_id' ); + } + + $walker = new Walker_Nav_Menu_Checklist( $db_fields ); + + $current_tab = 'most-used'; + if ( isset( $_REQUEST[$taxonomy_name . '-tab'] ) && in_array( $_REQUEST[$taxonomy_name . '-tab'], array('all', 'most-used', 'search') ) ) { + $current_tab = $_REQUEST[$taxonomy_name . '-tab']; + } + + if ( ! empty( $_REQUEST['quick-search-taxonomy-' . $taxonomy_name] ) ) { + $current_tab = 'search'; + } + + $removed_args = array( + 'action', + 'customlink-tab', + 'edit-menu-item', + 'menu-item', + 'page-tab', + '_wpnonce', + ); + + ?> +
    +
      +
    • >
    • +
    • >
    • +
    • >
    • +
    + +
    +
      + 'count', 'order' => 'DESC', 'number' => 10, 'hierarchical' => false ) ); + $args['walker'] = $walker; + echo walk_nav_menu_tree( array_map('wp_setup_nav_menu_item', $popular_terms), 0, (object) $args ); + ?> +
    +
    + +
    + + + +
      + +
    + + + +
    + +
    + $searched, 'fields' => 'all', 'orderby' => 'count', 'order' => 'DESC', 'hierarchical' => false ) ); + } else { + $searched = ''; + $search_results = array(); + } + ?> +

    + + + 'submit-quick-search-taxonomy-' . $taxonomy_name ) ); ?> +

    + +
      + + + +
    • get_error_message(); ?>
    • + +
    • + +
    +
    + +

    + + + + + + + class="button-secondary submit-add-to-menu" value="" name="add-taxonomy-menu-item" id="submit-taxonomy-" /> + +

    + +
    + $_item_object_data ) { + if ( + empty( $_item_object_data['menu-item-object-id'] ) && // checkbox is not checked + ( + ! isset( $_item_object_data['menu-item-type'] ) || // and item type either isn't set + in_array( $_item_object_data['menu-item-url'], array( 'http://', '' ) ) || // or URL is the default + ! ( 'custom' == $_item_object_data['menu-item-type'] && ! isset( $_item_object_data['menu-item-db-id'] ) ) || // or it's not a custom menu item (but not the custom home page) + ! empty( $_item_object_data['menu-item-db-id'] ) // or it *is* a custom menu item that already exists + ) + ) { + continue; // then this potential menu item is not getting added to this menu + } + + // if this possible menu item doesn't actually have a menu database ID yet + if ( + empty( $_item_object_data['menu-item-db-id'] ) || + ( 0 > $_possible_db_id ) || + $_possible_db_id != $_item_object_data['menu-item-db-id'] + ) { + $_actual_db_id = 0; + } else { + $_actual_db_id = (int) $_item_object_data['menu-item-db-id']; + } + + $args = array( + 'menu-item-db-id' => ( isset( $_item_object_data['menu-item-db-id'] ) ? $_item_object_data['menu-item-db-id'] : '' ), + 'menu-item-object-id' => ( isset( $_item_object_data['menu-item-object-id'] ) ? $_item_object_data['menu-item-object-id'] : '' ), + 'menu-item-object' => ( isset( $_item_object_data['menu-item-object'] ) ? $_item_object_data['menu-item-object'] : '' ), + 'menu-item-parent-id' => ( isset( $_item_object_data['menu-item-parent-id'] ) ? $_item_object_data['menu-item-parent-id'] : '' ), + 'menu-item-position' => ( isset( $_item_object_data['menu-item-position'] ) ? $_item_object_data['menu-item-position'] : '' ), + 'menu-item-type' => ( isset( $_item_object_data['menu-item-type'] ) ? $_item_object_data['menu-item-type'] : '' ), + 'menu-item-title' => ( isset( $_item_object_data['menu-item-title'] ) ? $_item_object_data['menu-item-title'] : '' ), + 'menu-item-url' => ( isset( $_item_object_data['menu-item-url'] ) ? $_item_object_data['menu-item-url'] : '' ), + 'menu-item-description' => ( isset( $_item_object_data['menu-item-description'] ) ? $_item_object_data['menu-item-description'] : '' ), + 'menu-item-attr-title' => ( isset( $_item_object_data['menu-item-attr-title'] ) ? $_item_object_data['menu-item-attr-title'] : '' ), + 'menu-item-target' => ( isset( $_item_object_data['menu-item-target'] ) ? $_item_object_data['menu-item-target'] : '' ), + 'menu-item-classes' => ( isset( $_item_object_data['menu-item-classes'] ) ? $_item_object_data['menu-item-classes'] : '' ), + 'menu-item-xfn' => ( isset( $_item_object_data['menu-item-xfn'] ) ? $_item_object_data['menu-item-xfn'] : '' ), + ); + + $items_saved[] = wp_update_nav_menu_item( $menu_id, $_actual_db_id, $args ); + + } + } + return $items_saved; +} + +/** + * Adds custom arguments to some of the meta box object types. + * + * @since 3.0.0 + * + * @access private + * + * @param object $object The post type or taxonomy meta-object. + * @return object The post type of taxonomy object. + */ +function _wp_nav_menu_meta_box_object( $object = null ) { + if ( isset( $object->name ) ) { + + if ( 'page' == $object->name ) { + $object->_default_query = array( + 'orderby' => 'menu_order title', + 'post_status' => 'publish', + ); + + // posts should show only published items + } elseif ( 'post' == $object->name ) { + $object->_default_query = array( + 'post_status' => 'publish', + ); + + // cats should be in reverse chronological order + } elseif ( 'category' == $object->name ) { + $object->_default_query = array( + 'orderby' => 'id', + 'order' => 'DESC', + ); + + // custom post types should show only published items + } else { + $object->_default_query = array( + 'post_status' => 'publish', + ); + } + } + + return $object; +} + +/** + * Returns the menu formatted to edit. + * + * @since 3.0.0 + * + * @param string $menu_id The ID of the menu to format. + * @return string|WP_Error $output The menu formatted to edit or error object on failure. + */ +function wp_get_nav_menu_to_edit( $menu_id = 0 ) { + $menu = wp_get_nav_menu_object( $menu_id ); + + // If the menu exists, get its items. + if ( is_nav_menu( $menu ) ) { + $menu_items = wp_get_nav_menu_items( $menu->term_id, array('post_status' => 'any') ); + $result = '
    ' : '">'; + $result .= '

    ' . __('Select menu items (pages, categories, links) from the boxes at left to begin building your custom menu.') . '

    '; + $result .= '
    '; + + if( empty($menu_items) ) + return $result . ' '; + + $walker_class_name = apply_filters( 'wp_edit_nav_menu_walker', 'Walker_Nav_Menu_Edit', $menu_id ); + + if ( class_exists( $walker_class_name ) ) + $walker = new $walker_class_name; + else + return new WP_Error( 'menu_walker_not_exist', sprintf( __('The Walker class named %s does not exist.'), $walker_class_name ) ); + + $some_pending_menu_items = $some_invalid_menu_items = false; + foreach( (array) $menu_items as $menu_item ) { + if ( isset( $menu_item->post_status ) && 'draft' == $menu_item->post_status ) + $some_pending_menu_items = true; + if ( ! empty( $menu_item->_invalid ) ) + $some_invalid_menu_items = true; + } + + if ( $some_pending_menu_items ) + $result .= '

    ' . __('Click Save Menu to make pending menu items public.') . '

    '; + + if ( $some_invalid_menu_items ) + $result .= '

    ' . __('There are some invalid menu items. Please check or delete them.') . '

    '; + + $result .= ' '; + return $result; + } elseif ( is_wp_error( $menu ) ) { + return $menu; + } + + +} + +/** + * Returns the columns for the nav menus page. + * + * @since 3.0.0 + * + * @return string|WP_Error $output The menu formatted to edit or error object on failure. + */ +function wp_nav_menu_manage_columns() { + return array( + '_title' => __('Show advanced menu properties'), + 'cb' => '', + 'link-target' => __('Link Target'), + 'css-classes' => __('CSS Classes'), + 'xfn' => __('Link Relationship (XFN)'), + 'description' => __('Description'), + ); +} + +/** + * Deletes orphaned draft menu items + * + * @access private + * @since 3.0.0 + * + */ +function _wp_delete_orphaned_draft_menu_items() { + global $wpdb; + $delete_timestamp = time() - (60*60*24*EMPTY_TRASH_DAYS); + + // delete orphaned draft menu items + $menu_items_to_delete = $wpdb->get_col($wpdb->prepare("SELECT ID FROM $wpdb->posts AS p LEFT JOIN $wpdb->postmeta AS m ON p.ID = m.post_id WHERE post_type = 'nav_menu_item' AND post_status = 'draft' AND meta_key = '_menu_item_orphaned' AND meta_value < '%d'", $delete_timestamp ) ); + + foreach( (array) $menu_items_to_delete as $menu_item_id ) + wp_delete_post( $menu_item_id, true ); +} + +add_action('admin_head-nav-menus.php', '_wp_delete_orphaned_draft_menu_items'); + +?> diff --git a/src/wp-admin/includes/plugin-install.php b/src/wp-admin/includes/plugin-install.php new file mode 100644 index 0000000..ca3e1f5 --- /dev/null +++ b/src/wp-admin/includes/plugin-install.php @@ -0,0 +1,369 @@ +per_page) ) + $args->per_page = 24; + + // Allows a plugin to override the WordPress.org API entirely. + // Use the filter 'plugins_api_result' to mearly add results. + // Please ensure that a object is returned from the following filters. + $args = apply_filters('plugins_api_args', $args, $action); + $res = apply_filters('plugins_api', false, $action, $args); + + if ( false === $res ) { + $request = wp_remote_post('http://api.wordpress.org/plugins/info/1.0/', array( 'timeout' => 15, 'body' => array('action' => $action, 'request' => serialize($args))) ); + if ( is_wp_error($request) ) { + $res = new WP_Error('plugins_api_failed', __('An Unexpected HTTP Error occurred during the API request.'), $request->get_error_message() ); + } else { + $res = unserialize( wp_remote_retrieve_body( $request ) ); + if ( false === $res ) + $res = new WP_Error('plugins_api_failed', __('An unknown error occurred.'), wp_remote_retrieve_body( $request ) ); + } + } elseif ( !is_wp_error($res) ) { + $res->external = true; + } + + return apply_filters('plugins_api_result', $res, $action, $args); +} + +/** + * Retrieve popular WordPress plugin tags. + * + * @since 2.7.0 + * + * @param array $args + * @return array + */ +function install_popular_tags( $args = array() ) { + $key = md5(serialize($args)); + if ( false !== ($tags = get_site_transient('poptags_' . $key) ) ) + return $tags; + + $tags = plugins_api('hot_tags', $args); + + if ( is_wp_error($tags) ) + return $tags; + + set_site_transient('poptags_' . $key, $tags, 10800); // 3 * 60 * 60 = 10800 + + return $tags; +} + +function install_dashboard() { + ?> +

    WordPress Plugin Directory or upload a plugin in .zip format via this page.') ?>

    + +

    +

    + + +

    +

    + '; + if ( is_wp_error($api_tags) ) { + echo $api_tags->get_error_message(); + } else { + //Set up the tags in a way which can be interprated by wp_generate_tag_cloud() + $tags = array(); + foreach ( (array)$api_tags as $tag ) + $tags[ $tag['name'] ] = (object) array( + 'link' => esc_url( self_admin_url('plugin-install.php?tab=search&type=tag&s=' . urlencode($tag['name'])) ), + 'name' => $tag['name'], + 'id' => sanitize_title_with_dashes($tag['name']), + 'count' => $tag['count'] ); + echo wp_generate_tag_cloud($tags, array( 'single_text' => __('%d plugin'), 'multiple_text' => __('%d plugins') ) ); + } + echo '


    '; +} +add_action('install_plugins_dashboard', 'install_dashboard'); + +/** + * Display search form for searching plugins. + * + * @since 2.7.0 + */ +function install_search_form(){ + $type = isset($_REQUEST['type']) ? stripslashes( $_REQUEST['type'] ) : ''; + $term = isset($_REQUEST['s']) ? stripslashes( $_REQUEST['s'] ) : ''; + + ?>
    + + + + + +
    +

    +

    +
    + + + + +
    +display(); +} +add_action('install_plugins_search', 'display_plugins_table'); +add_action('install_plugins_featured', 'display_plugins_table'); +add_action('install_plugins_popular', 'display_plugins_table'); +add_action('install_plugins_new', 'display_plugins_table'); +add_action('install_plugins_updated', 'display_plugins_table'); + +/** + * Determine the status we can perform on a plugin. + * + * @since 3.0.0 + */ +function install_plugin_install_status($api, $loop = false) { + // this function is called recursivly, $loop prevents futhur loops. + if ( is_array($api) ) + $api = (object) $api; + + //Default to a "new" plugin + $status = 'install'; + $url = false; + + //Check to see if this plugin is known to be installed, and has an update awaiting it. + $update_plugins = get_site_transient('update_plugins'); + if ( is_object( $update_plugins ) ) { + foreach ( (array)$update_plugins->response as $file => $plugin ) { + if ( $plugin->slug === $api->slug ) { + $status = 'update_available'; + $update_file = $file; + $version = $plugin->new_version; + if ( current_user_can('update_plugins') ) + $url = wp_nonce_url(self_admin_url('update.php?action=upgrade-plugin&plugin=' . $update_file), 'upgrade-plugin_' . $update_file); + break; + } + } + } + + if ( 'install' == $status ) { + if ( is_dir( WP_PLUGIN_DIR . '/' . $api->slug ) ) { + $installed_plugin = get_plugins('/' . $api->slug); + if ( empty($installed_plugin) ) { + if ( current_user_can('install_plugins') ) + $url = wp_nonce_url(self_admin_url('update.php?action=install-plugin&plugin=' . $api->slug), 'install-plugin_' . $api->slug); + } else { + $key = array_shift( $key = array_keys($installed_plugin) ); //Use the first plugin regardless of the name, Could have issues for multiple-plugins in one directory if they share different version numbers + if ( version_compare($api->version, $installed_plugin[ $key ]['Version'], '=') ){ + $status = 'latest_installed'; + } elseif ( version_compare($api->version, $installed_plugin[ $key ]['Version'], '<') ) { + $status = 'newer_installed'; + $version = $installed_plugin[ $key ]['Version']; + } else { + //If the above update check failed, Then that probably means that the update checker has out-of-date information, force a refresh + if ( ! $loop ) { + delete_site_transient('update_plugins'); + wp_update_plugins(); + return install_plugin_install_status($api, true); + } + } + } + } else { + // "install" & no directory with that slug + if ( current_user_can('install_plugins') ) + $url = wp_nonce_url(self_admin_url('update.php?action=install-plugin&plugin=' . $api->slug), 'install-plugin_' . $api->slug); + } + } + if ( isset($_GET['from']) ) + $url .= '&from=' . urlencode(stripslashes($_GET['from'])); + + return compact('status', 'url', 'version'); +} + +/** + * Display plugin information in dialog box form. + * + * @since 2.7.0 + */ +function install_plugin_information() { + global $tab; + + $api = plugins_api('plugin_information', array('slug' => stripslashes( $_REQUEST['plugin'] ) )); + + if ( is_wp_error($api) ) + wp_die($api); + + $plugins_allowedtags = array('a' => array('href' => array(), 'title' => array(), 'target' => array()), + 'abbr' => array('title' => array()), 'acronym' => array('title' => array()), + 'code' => array(), 'pre' => array(), 'em' => array(), 'strong' => array(), + 'div' => array(), 'p' => array(), 'ul' => array(), 'ol' => array(), 'li' => array(), + 'h1' => array(), 'h2' => array(), 'h3' => array(), 'h4' => array(), 'h5' => array(), 'h6' => array(), + 'img' => array('src' => array(), 'class' => array(), 'alt' => array())); + //Sanitize HTML + foreach ( (array)$api->sections as $section_name => $content ) + $api->sections[$section_name] = wp_kses($content, $plugins_allowedtags); + foreach ( array('version', 'author', 'requires', 'tested', 'homepage', 'downloaded', 'slug') as $key ) + $api->$key = wp_kses($api->$key, $plugins_allowedtags); + + $section = isset($_REQUEST['section']) ? stripslashes( $_REQUEST['section'] ) : 'description'; //Default to the Description tab, Do not translate, API returns English. + if ( empty($section) || ! isset($api->sections[ $section ]) ) + $section = array_shift( $section_titles = array_keys((array)$api->sections) ); + + iframe_header( __('Plugin Install') ); + echo "
    \n"; + echo "
      \n"; + foreach ( (array)$api->sections as $section_name => $content ) { + + $title = $section_name; + $title = ucwords(str_replace('_', ' ', $title)); + + $class = ( $section_name == $section ) ? ' class="current"' : ''; + $href = add_query_arg( array('tab' => $tab, 'section' => $section_name) ); + $href = esc_url($href); + $san_title = esc_attr(sanitize_title_with_dashes($title)); + echo "\t
    • $title
    • \n"; + } + echo "
    \n"; + echo "
    \n"; + ?> +
    + download_link) && ( current_user_can('install_plugins') || current_user_can('update_plugins') ) ) : ?> +

    + ' . __('Install Now') . ''; + break; + case 'update_available': + if ( $status['url'] ) + echo '' . __('Install Update Now') .''; + break; + case 'newer_installed': + echo '' . sprintf(__('Newer Version (%s) Installed'), $status['version']) . ''; + break; + case 'latest_installed': + echo '' . __('Latest Version Installed') . ''; + break; + } + ?> +

    + +

    +
      +version) ) : ?> +
    • version ?>
    • +author) ) : ?> +
    • author, '_blank') ?>
    • +last_updated) ) : ?> +
    • last_updated)) ) ?>
    • +requires) ) : ?> +
    • requires) ?>
    • +tested) ) : ?> +
    • tested ?>
    • +downloaded) ) : ?> +
    • downloaded), number_format_i18n($api->downloaded)) ?>
    • +slug) && empty($api->external) ) : ?> +
    • +homepage) ) : ?> +
    • + +
    + rating) ) : ?> +

    +
    +
    +
    <?php _e('5 stars') ?>
    +
    <?php _e('4 stars') ?>
    +
    <?php _e('3 stars') ?>
    +
    <?php _e('2 stars') ?>
    +
    <?php _e('1 star') ?>
    +
    + num_ratings), number_format_i18n($api->num_ratings)); ?> + +
    +
    + tested) && version_compare( substr($GLOBALS['wp_version'], 0, strlen($api->tested)), $api->tested, '>') ) + echo '

    ' . __('Warning: This plugin has not been tested with your current version of WordPress.') . '

    '; + + else if ( !empty($api->requires) && version_compare( substr($GLOBALS['wp_version'], 0, strlen($api->requires)), $api->requires, '<') ) + echo '

    ' . __('Warning: This plugin has not been marked as compatible with your version of WordPress.') . '

    '; + + foreach ( (array)$api->sections as $section_name => $content ) { + $title = $section_name; + $title[0] = strtoupper($title[0]); + $title = str_replace('_', ' ', $title); + + $content = links_add_base_url($content, 'http://wordpress.org/extend/plugins/' . $api->slug . '/'); + $content = links_add_target($content, '_blank'); + + $san_title = esc_attr(sanitize_title_with_dashes($title)); + + $display = ( $section_name == $section ) ? 'block' : 'none'; + + echo "\t
    \n"; + echo "\t\t

    $title

    "; + echo $content; + echo "\t
    \n"; + } + echo "
    \n"; + + iframe_footer(); + exit; +} +add_action('install_plugins_pre_plugin-information', 'install_plugin_information'); diff --git a/src/wp-admin/includes/plugin.php b/src/wp-admin/includes/plugin.php new file mode 100644 index 0000000..be97e8c --- /dev/null +++ b/src/wp-admin/includes/plugin.php @@ -0,0 +1,1726 @@ + + * /* + * Plugin Name: Name of Plugin + * Plugin URI: Link to plugin information + * Description: Plugin Description + * Author: Plugin author's name + * Author URI: Link to the author's web site + * Version: Must be set in the plugin for WordPress 2.3+ + * Text Domain: Optional. Unique identifier, should be same as the one used in + * plugin_text_domain() + * Domain Path: Optional. Only useful if the translations are located in a + * folder above the plugin's base path. For example, if .mo files are + * located in the locale folder then Domain Path will be "/locale/" and + * must have the first slash. Defaults to the base folder the plugin is + * located in. + * Network: Optional. Specify "Network: true" to require that a plugin is activated + * across all sites in an installation. This will prevent a plugin from being + * activated on a single site when Multisite is enabled. + * * / # Remove the space to close comment + * + * + * Plugin data returned array contains the following: + * 'Name' - Name of the plugin, must be unique. + * 'Title' - Title of the plugin and the link to the plugin's web site. + * 'Description' - Description of what the plugin does and/or notes + * from the author. + * 'Author' - The author's name + * 'AuthorURI' - The authors web site address. + * 'Version' - The plugin version number. + * 'PluginURI' - Plugin web site address. + * 'TextDomain' - Plugin's text domain for localization. + * 'DomainPath' - Plugin's relative directory path to .mo files. + * 'Network' - Boolean. Whether the plugin can only be activated network wide. + * + * Some users have issues with opening large files and manipulating the contents + * for want is usually the first 1kiB or 2kiB. This function stops pulling in + * the plugin contents when it has all of the required plugin data. + * + * The first 8kiB of the file will be pulled in and if the plugin data is not + * within that first 8kiB, then the plugin author should correct their plugin + * and move the plugin data headers to the top. + * + * The plugin file is assumed to have permissions to allow for scripts to read + * the file. This is not checked however and the file is only opened for + * reading. + * + * @link http://trac.wordpress.org/ticket/5651 Previous Optimizations. + * @link http://trac.wordpress.org/ticket/7372 Further and better Optimizations. + * @since 1.5.0 + * + * @param string $plugin_file Path to the plugin file + * @param bool $markup If the returned data should have HTML markup applied + * @param bool $translate If the returned data should be translated + * @return array See above for description. + */ +function get_plugin_data( $plugin_file, $markup = true, $translate = true ) { + + $default_headers = array( + 'Name' => 'Plugin Name', + 'PluginURI' => 'Plugin URI', + 'Version' => 'Version', + 'Description' => 'Description', + 'Author' => 'Author', + 'AuthorURI' => 'Author URI', + 'TextDomain' => 'Text Domain', + 'DomainPath' => 'Domain Path', + 'Network' => 'Network', + // Site Wide Only is deprecated in favor of Network. + '_sitewide' => 'Site Wide Only', + ); + + $plugin_data = get_file_data( $plugin_file, $default_headers, 'plugin' ); + + // Site Wide Only is the old header for Network + if ( empty( $plugin_data['Network'] ) && ! empty( $plugin_data['_sitewide'] ) ) { + _deprecated_argument( __FUNCTION__, '3.0', sprintf( __( 'The %1$s plugin header is deprecated. Use %2$s instead.' ), 'Site Wide Only: true', 'Network: true' ) ); + $plugin_data['Network'] = $plugin_data['_sitewide']; + } + $plugin_data['Network'] = ( 'true' == strtolower( $plugin_data['Network'] ) ); + unset( $plugin_data['_sitewide'] ); + + //For backward compatibility by default Title is the same as Name. + $plugin_data['Title'] = $plugin_data['Name']; + + if ( $markup || $translate ) + $plugin_data = _get_plugin_data_markup_translate( $plugin_file, $plugin_data, $markup, $translate ); + else + $plugin_data['AuthorName'] = $plugin_data['Author']; + + return $plugin_data; +} + +function _get_plugin_data_markup_translate($plugin_file, $plugin_data, $markup = true, $translate = true) { + + //Translate fields + if ( $translate && ! empty($plugin_data['TextDomain']) ) { + if ( ! empty( $plugin_data['DomainPath'] ) ) + load_plugin_textdomain($plugin_data['TextDomain'], false, dirname($plugin_file). $plugin_data['DomainPath']); + else + load_plugin_textdomain($plugin_data['TextDomain'], false, dirname($plugin_file)); + + foreach ( array('Name', 'PluginURI', 'Description', 'Author', 'AuthorURI', 'Version') as $field ) + $plugin_data[ $field ] = translate($plugin_data[ $field ], $plugin_data['TextDomain']); + } + + $plugins_allowedtags = array( + 'a' => array( 'href' => array(), 'title' => array() ), + 'abbr' => array( 'title' => array() ), + 'acronym' => array( 'title' => array() ), + 'code' => array(), + 'em' => array(), + 'strong' => array(), + ); + + $plugin_data['AuthorName'] = $plugin_data['Author'] = wp_kses( $plugin_data['Author'], $plugins_allowedtags ); + + //Apply Markup + if ( $markup ) { + if ( ! empty($plugin_data['PluginURI']) && ! empty($plugin_data['Name']) ) + $plugin_data['Title'] = '' . $plugin_data['Name'] . ''; + else + $plugin_data['Title'] = $plugin_data['Name']; + + if ( ! empty($plugin_data['AuthorURI']) && ! empty($plugin_data['Author']) ) + $plugin_data['Author'] = '' . $plugin_data['Author'] . ''; + + $plugin_data['Description'] = wptexturize( $plugin_data['Description'] ); + if ( ! empty($plugin_data['Author']) ) + $plugin_data['Description'] .= ' ' . sprintf( __('By %s'), $plugin_data['Author'] ) . '.'; + } + + // Sanitize all displayed data. Author and AuthorName sanitized above. + $plugin_data['Title'] = wp_kses( $plugin_data['Title'], $plugins_allowedtags ); + $plugin_data['Version'] = wp_kses( $plugin_data['Version'], $plugins_allowedtags ); + $plugin_data['Description'] = wp_kses( $plugin_data['Description'], $plugins_allowedtags ); + $plugin_data['Name'] = wp_kses( $plugin_data['Name'], $plugins_allowedtags ); + + return $plugin_data; +} + +/** + * Get a list of a plugin's files. + * + * @since 2.8.0 + * + * @param string $plugin Plugin ID + * @return array List of files relative to the plugin root. + */ +function get_plugin_files($plugin) { + $plugin_file = WP_PLUGIN_DIR . '/' . $plugin; + $dir = dirname($plugin_file); + $plugin_files = array($plugin); + if ( is_dir($dir) && $dir != WP_PLUGIN_DIR ) { + $plugins_dir = @ opendir( $dir ); + if ( $plugins_dir ) { + while (($file = readdir( $plugins_dir ) ) !== false ) { + if ( substr($file, 0, 1) == '.' ) + continue; + if ( is_dir( $dir . '/' . $file ) ) { + $plugins_subdir = @ opendir( $dir . '/' . $file ); + if ( $plugins_subdir ) { + while (($subfile = readdir( $plugins_subdir ) ) !== false ) { + if ( substr($subfile, 0, 1) == '.' ) + continue; + $plugin_files[] = plugin_basename("$dir/$file/$subfile"); + } + @closedir( $plugins_subdir ); + } + } else { + if ( plugin_basename("$dir/$file") != $plugin ) + $plugin_files[] = plugin_basename("$dir/$file"); + } + } + @closedir( $plugins_dir ); + } + } + + return $plugin_files; +} + +/** + * Check the plugins directory and retrieve all plugin files with plugin data. + * + * WordPress only supports plugin files in the base plugins directory + * (wp-content/plugins) and in one directory above the plugins directory + * (wp-content/plugins/my-plugin). The file it looks for has the plugin data and + * must be found in those two locations. It is recommended that do keep your + * plugin files in directories. + * + * The file with the plugin data is the file that will be included and therefore + * needs to have the main execution for the plugin. This does not mean + * everything must be contained in the file and it is recommended that the file + * be split for maintainability. Keep everything in one file for extreme + * optimization purposes. + * + * @since 1.5.0 + * + * @param string $plugin_folder Optional. Relative path to single plugin folder. + * @return array Key is the plugin file path and the value is an array of the plugin data. + */ +function get_plugins($plugin_folder = '') { + + if ( ! $cache_plugins = wp_cache_get('plugins', 'plugins') ) + $cache_plugins = array(); + + if ( isset($cache_plugins[ $plugin_folder ]) ) + return $cache_plugins[ $plugin_folder ]; + + $wp_plugins = array (); + $plugin_root = WP_PLUGIN_DIR; + if ( !empty($plugin_folder) ) + $plugin_root .= $plugin_folder; + + // Files in wp-content/plugins directory + $plugins_dir = @ opendir( $plugin_root); + $plugin_files = array(); + if ( $plugins_dir ) { + while (($file = readdir( $plugins_dir ) ) !== false ) { + if ( substr($file, 0, 1) == '.' ) + continue; + if ( is_dir( $plugin_root.'/'.$file ) ) { + $plugins_subdir = @ opendir( $plugin_root.'/'.$file ); + if ( $plugins_subdir ) { + while (($subfile = readdir( $plugins_subdir ) ) !== false ) { + if ( substr($subfile, 0, 1) == '.' ) + continue; + if ( substr($subfile, -4) == '.php' ) + $plugin_files[] = "$file/$subfile"; + } + closedir( $plugins_subdir ); + } + } else { + if ( substr($file, -4) == '.php' ) + $plugin_files[] = $file; + } + } + closedir( $plugins_dir ); + } + + if ( empty($plugin_files) ) + return $wp_plugins; + + foreach ( $plugin_files as $plugin_file ) { + if ( !is_readable( "$plugin_root/$plugin_file" ) ) + continue; + + $plugin_data = get_plugin_data( "$plugin_root/$plugin_file", false, false ); //Do not apply markup/translate as it'll be cached. + + if ( empty ( $plugin_data['Name'] ) ) + continue; + + $wp_plugins[plugin_basename( $plugin_file )] = $plugin_data; + } + + uasort( $wp_plugins, '_sort_uname_callback' ); + + $cache_plugins[ $plugin_folder ] = $wp_plugins; + wp_cache_set('plugins', $cache_plugins, 'plugins'); + + return $wp_plugins; +} + +/** + * Check the mu-plugins directory and retrieve all mu-plugin files with any plugin data. + * + * WordPress only includes mu-plugin files in the base mu-plugins directory (wp-content/mu-plugins). + * + * @since 3.0.0 + * @return array Key is the mu-plugin file path and the value is an array of the mu-plugin data. + */ +function get_mu_plugins() { + $wp_plugins = array(); + // Files in wp-content/mu-plugins directory + $plugin_files = array(); + + if ( ! is_dir( WPMU_PLUGIN_DIR ) ) + return $wp_plugins; + if ( $plugins_dir = @ opendir( WPMU_PLUGIN_DIR ) ) { + while ( ( $file = readdir( $plugins_dir ) ) !== false ) { + if ( substr( $file, -4 ) == '.php' ) + $plugin_files[] = $file; + } + } else { + return $wp_plugins; + } + + @closedir( $plugins_dir ); + + if ( empty($plugin_files) ) + return $wp_plugins; + + foreach ( $plugin_files as $plugin_file ) { + if ( !is_readable( WPMU_PLUGIN_DIR . "/$plugin_file" ) ) + continue; + + $plugin_data = get_plugin_data( WPMU_PLUGIN_DIR . "/$plugin_file", false, false ); //Do not apply markup/translate as it'll be cached. + + if ( empty ( $plugin_data['Name'] ) ) + $plugin_data['Name'] = $plugin_file; + + $wp_plugins[ $plugin_file ] = $plugin_data; + } + + if ( isset( $wp_plugins['index.php'] ) && filesize( WPMU_PLUGIN_DIR . '/index.php') <= 30 ) // silence is golden + unset( $wp_plugins['index.php'] ); + + uasort( $wp_plugins, '_sort_uname_callback' ); + + return $wp_plugins; +} + +/** + * Callback to sort array by a 'Name' key. + * + * @since 3.1.0 + * @access private + */ +function _sort_uname_callback( $a, $b ) { + return strnatcasecmp( $a['Name'], $b['Name'] ); +} + +/** + * Check the wp-content directory and retrieve all drop-ins with any plugin data. + * + * @since 3.0.0 + * @return array Key is the file path and the value is an array of the plugin data. + */ +function get_dropins() { + $dropins = array(); + $plugin_files = array(); + + $_dropins = _get_dropins(); + + // These exist in the wp-content directory + if ( $plugins_dir = @ opendir( WP_CONTENT_DIR ) ) { + while ( ( $file = readdir( $plugins_dir ) ) !== false ) { + if ( isset( $_dropins[ $file ] ) ) + $plugin_files[] = $file; + } + } else { + return $dropins; + } + + @closedir( $plugins_dir ); + + if ( empty($plugin_files) ) + return $dropins; + + foreach ( $plugin_files as $plugin_file ) { + if ( !is_readable( WP_CONTENT_DIR . "/$plugin_file" ) ) + continue; + $plugin_data = get_plugin_data( WP_CONTENT_DIR . "/$plugin_file", false, false ); //Do not apply markup/translate as it'll be cached. + if ( empty( $plugin_data['Name'] ) ) + $plugin_data['Name'] = $plugin_file; + $dropins[ $plugin_file ] = $plugin_data; + } + + uksort( $dropins, 'strnatcasecmp' ); + + return $dropins; +} + +/** + * Returns drop-ins that WordPress uses. + * + * Includes Multisite drop-ins only when is_multisite() + * + * @since 3.0.0 + * @return array Key is file name. The value is an array, with the first value the + * purpose of the drop-in and the second value the name of the constant that must be + * true for the drop-in to be used, or true if no constant is required. + */ +function _get_dropins() { + $dropins = array( + 'advanced-cache.php' => array( __( 'Advanced caching plugin.' ), 'WP_CACHE' ), // WP_CACHE + 'db.php' => array( __( 'Custom database class.' ), true ), // auto on load + 'db-error.php' => array( __( 'Custom database error message.' ), true ), // auto on error + 'install.php' => array( __( 'Custom install script.' ), true ), // auto on install + 'maintenance.php' => array( __( 'Custom maintenance message.' ), true ), // auto on maintenance + 'object-cache.php' => array( __( 'External object cache.' ), true ), // auto on load + ); + + if ( is_multisite() ) { + $dropins['sunrise.php' ] = array( __( 'Executed before Multisite is loaded.' ), 'SUNRISE' ); // SUNRISE + $dropins['blog-deleted.php' ] = array( __( 'Custom site deleted message.' ), true ); // auto on deleted blog + $dropins['blog-inactive.php' ] = array( __( 'Custom site inactive message.' ), true ); // auto on inactive blog + $dropins['blog-suspended.php'] = array( __( 'Custom site suspended message.' ), true ); // auto on archived or spammed blog + } + + return $dropins; +} + +/** + * Check whether the plugin is active by checking the active_plugins list. + * + * @since 2.5.0 + * + * @param string $plugin Base plugin path from plugins directory. + * @return bool True, if in the active plugins list. False, not in the list. + */ +function is_plugin_active( $plugin ) { + return in_array( $plugin, (array) get_option( 'active_plugins', array() ) ) || is_plugin_active_for_network( $plugin ); +} + +/** + * Check whether the plugin is inactive. + * + * Reverse of is_plugin_active(). Used as a callback. + * + * @since 3.1.0 + * @see is_plugin_active() + * + * @param string $plugin Base plugin path from plugins directory. + * @return bool True if inactive. False if active. + */ +function is_plugin_inactive( $plugin ) { + return ! is_plugin_active( $plugin ); +} + +/** + * Check whether the plugin is active for the entire network. + * + * @since 3.0.0 + * + * @param string $plugin Base plugin path from plugins directory. + * @return bool True, if active for the network, otherwise false. + */ +function is_plugin_active_for_network( $plugin ) { + if ( !is_multisite() ) + return false; + + $plugins = get_site_option( 'active_sitewide_plugins'); + if ( isset($plugins[$plugin]) ) + return true; + + return false; +} + +/** + * Checks for "Network: true" in the plugin header to see if this should + * be activated only as a network wide plugin. The plugin would also work + * when Multisite is not enabled. + * + * Checks for "Site Wide Only: true" for backwards compatibility. + * + * @since 3.0.0 + * + * @param string $plugin Plugin to check + * @return bool True if plugin is network only, false otherwise. + */ +function is_network_only_plugin( $plugin ) { + $plugin_data = get_plugin_data( WP_PLUGIN_DIR . '/' . $plugin ); + if ( $plugin_data ) + return $plugin_data['Network']; + return false; +} + +/** + * Attempts activation of plugin in a "sandbox" and redirects on success. + * + * A plugin that is already activated will not attempt to be activated again. + * + * The way it works is by setting the redirection to the error before trying to + * include the plugin file. If the plugin fails, then the redirection will not + * be overwritten with the success message. Also, the options will not be + * updated and the activation hook will not be called on plugin error. + * + * It should be noted that in no way the below code will actually prevent errors + * within the file. The code should not be used elsewhere to replicate the + * "sandbox", which uses redirection to work. + * {@source 13 1} + * + * If any errors are found or text is outputted, then it will be captured to + * ensure that the success redirection will update the error redirection. + * + * @since 2.5.0 + * + * @param string $plugin Plugin path to main plugin file with plugin data. + * @param string $redirect Optional. URL to redirect to. + * @param bool $network_wide Whether to enable the plugin for all sites in the + * network or just the current site. Multisite only. Default is false. + * @param bool $silent Prevent calling activation hooks. Optional, default is false. + * @return WP_Error|null WP_Error on invalid file or null on success. + */ +function activate_plugin( $plugin, $redirect = '', $network_wide = false, $silent = false ) { + $plugin = plugin_basename( trim( $plugin ) ); + + if ( is_multisite() && ( $network_wide || is_network_only_plugin($plugin) ) ) { + $network_wide = true; + $current = get_site_option( 'active_sitewide_plugins', array() ); + } else { + $current = get_option( 'active_plugins', array() ); + } + + $valid = validate_plugin($plugin); + if ( is_wp_error($valid) ) + return $valid; + + if ( !in_array($plugin, $current) ) { + if ( !empty($redirect) ) + wp_redirect(add_query_arg('_error_nonce', wp_create_nonce('plugin-activation-error_' . $plugin), $redirect)); // we'll override this later if the plugin can be included without fatal error + ob_start(); + include_once(WP_PLUGIN_DIR . '/' . $plugin); + + if ( ! $silent ) { + do_action( 'activate_plugin', $plugin, $network_wide ); + do_action( 'activate_' . $plugin, $network_wide ); + } + + if ( $network_wide ) { + $current[$plugin] = time(); + update_site_option( 'active_sitewide_plugins', $current ); + } else { + $current[] = $plugin; + sort($current); + update_option('active_plugins', $current); + } + + if ( ! $silent ) { + do_action( 'activated_plugin', $plugin, $network_wide ); + } + + if ( ob_get_length() > 0 ) { + $output = ob_get_clean(); + return new WP_Error('unexpected_output', __('The plugin generated unexpected output.'), $output); + } + ob_end_clean(); + } + + return null; +} + +/** + * Deactivate a single plugin or multiple plugins. + * + * The deactivation hook is disabled by the plugin upgrader by using the $silent + * parameter. + * + * @since 2.5.0 + * + * @param string|array $plugins Single plugin or list of plugins to deactivate. + * @param bool $silent Prevent calling deactivation hooks. Default is false. + */ +function deactivate_plugins( $plugins, $silent = false ) { + if ( is_multisite() ) + $network_current = get_site_option( 'active_sitewide_plugins', array() ); + $current = get_option( 'active_plugins', array() ); + $do_blog = $do_network = false; + + foreach ( (array) $plugins as $plugin ) { + $plugin = plugin_basename( trim( $plugin ) ); + if ( ! is_plugin_active($plugin) ) + continue; + + $network_wide = is_plugin_active_for_network( $plugin ); + + if ( ! $silent ) + do_action( 'deactivate_plugin', $plugin, $network_wide ); + + if ( $network_wide ) { + $do_network = true; + unset( $network_current[ $plugin ] ); + } else { + $key = array_search( $plugin, $current ); + if ( false !== $key ) { + $do_blog = true; + array_splice( $current, $key, 1 ); + } + } + + if ( ! $silent ) { + do_action( 'deactivate_' . $plugin, $network_wide ); + do_action( 'deactivated_plugin', $plugin, $network_wide ); + } + } + + if ( $do_blog ) + update_option('active_plugins', $current); + if ( $do_network ) + update_site_option( 'active_sitewide_plugins', $network_current ); +} + +/** + * Activate multiple plugins. + * + * When WP_Error is returned, it does not mean that one of the plugins had + * errors. It means that one or more of the plugins file path was invalid. + * + * The execution will be halted as soon as one of the plugins has an error. + * + * @since 2.6.0 + * + * @param string|array $plugins + * @param string $redirect Redirect to page after successful activation. + * @param bool $network_wide Whether to enable the plugin for all sites in the network. + * @param bool $silent Prevent calling activation hooks. Default is false. + * @return bool|WP_Error True when finished or WP_Error if there were errors during a plugin activation. + */ +function activate_plugins( $plugins, $redirect = '', $network_wide = false, $silent = false ) { + if ( !is_array($plugins) ) + $plugins = array($plugins); + + $errors = array(); + foreach ( $plugins as $plugin ) { + if ( !empty($redirect) ) + $redirect = add_query_arg('plugin', $plugin, $redirect); + $result = activate_plugin($plugin, $redirect, $network_wide, $silent); + if ( is_wp_error($result) ) + $errors[$plugin] = $result; + } + + if ( !empty($errors) ) + return new WP_Error('plugins_invalid', __('One of the plugins is invalid.'), $errors); + + return true; +} + +/** + * Remove directory and files of a plugin for a single or list of plugin(s). + * + * If the plugins parameter list is empty, false will be returned. True when + * completed. + * + * @since 2.6.0 + * + * @param array $plugins List of plugin + * @param string $redirect Redirect to page when complete. + * @return mixed + */ +function delete_plugins($plugins, $redirect = '' ) { + global $wp_filesystem; + + if ( empty($plugins) ) + return false; + + $checked = array(); + foreach( $plugins as $plugin ) + $checked[] = 'checked[]=' . $plugin; + + ob_start(); + $url = wp_nonce_url('plugins.php?action=delete-selected&verify-delete=1&' . implode('&', $checked), 'bulk-plugins'); + if ( false === ($credentials = request_filesystem_credentials($url)) ) { + $data = ob_get_contents(); + ob_end_clean(); + if ( ! empty($data) ){ + include_once( ABSPATH . 'wp-admin/admin-header.php'); + echo $data; + include( ABSPATH . 'wp-admin/admin-footer.php'); + exit; + } + return; + } + + if ( ! WP_Filesystem($credentials) ) { + request_filesystem_credentials($url, '', true); //Failed to connect, Error and request again + $data = ob_get_contents(); + ob_end_clean(); + if ( ! empty($data) ){ + include_once( ABSPATH . 'wp-admin/admin-header.php'); + echo $data; + include( ABSPATH . 'wp-admin/admin-footer.php'); + exit; + } + return; + } + + if ( ! is_object($wp_filesystem) ) + return new WP_Error('fs_unavailable', __('Could not access filesystem.')); + + if ( is_wp_error($wp_filesystem->errors) && $wp_filesystem->errors->get_error_code() ) + return new WP_Error('fs_error', __('Filesystem error.'), $wp_filesystem->errors); + + //Get the base plugin folder + $plugins_dir = $wp_filesystem->wp_plugins_dir(); + if ( empty($plugins_dir) ) + return new WP_Error('fs_no_plugins_dir', __('Unable to locate WordPress Plugin directory.')); + + $plugins_dir = trailingslashit( $plugins_dir ); + + $errors = array(); + + foreach( $plugins as $plugin_file ) { + // Run Uninstall hook + if ( is_uninstallable_plugin( $plugin_file ) ) + uninstall_plugin($plugin_file); + + $this_plugin_dir = trailingslashit( dirname($plugins_dir . $plugin_file) ); + // If plugin is in its own directory, recursively delete the directory. + if ( strpos($plugin_file, '/') && $this_plugin_dir != $plugins_dir ) //base check on if plugin includes directory separator AND that its not the root plugin folder + $deleted = $wp_filesystem->delete($this_plugin_dir, true); + else + $deleted = $wp_filesystem->delete($plugins_dir . $plugin_file); + + if ( ! $deleted ) + $errors[] = $plugin_file; + } + + if ( ! empty($errors) ) + return new WP_Error('could_not_remove_plugin', sprintf(__('Could not fully remove the plugin(s) %s.'), implode(', ', $errors)) ); + + // Force refresh of plugin update information + if ( $current = get_site_transient('update_plugins') ) { + unset( $current->response[ $plugin_file ] ); + set_site_transient('update_plugins', $current); + } + + return true; +} + +/** + * Validate active plugins + * + * Validate all active plugins, deactivates invalid and + * returns an array of deactivated ones. + * + * @since 2.5.0 + * @return array invalid plugins, plugin as key, error as value + */ +function validate_active_plugins() { + $plugins = get_option( 'active_plugins', array() ); + // validate vartype: array + if ( ! is_array( $plugins ) ) { + update_option( 'active_plugins', array() ); + $plugins = array(); + } + + if ( is_multisite() && is_super_admin() ) { + $network_plugins = (array) get_site_option( 'active_sitewide_plugins', array() ); + $plugins = array_merge( $plugins, array_keys( $network_plugins ) ); + } + + if ( empty( $plugins ) ) + return; + + $invalid = array(); + + // invalid plugins get deactivated + foreach ( $plugins as $plugin ) { + $result = validate_plugin( $plugin ); + if ( is_wp_error( $result ) ) { + $invalid[$plugin] = $result; + deactivate_plugins( $plugin, true ); + } + } + return $invalid; +} + +/** + * Validate the plugin path. + * + * Checks that the file exists and {@link validate_file() is valid file}. + * + * @since 2.5.0 + * + * @param string $plugin Plugin Path + * @return WP_Error|int 0 on success, WP_Error on failure. + */ +function validate_plugin($plugin) { + if ( validate_file($plugin) ) + return new WP_Error('plugin_invalid', __('Invalid plugin path.')); + if ( ! file_exists(WP_PLUGIN_DIR . '/' . $plugin) ) + return new WP_Error('plugin_not_found', __('Plugin file does not exist.')); + + $installed_plugins = get_plugins(); + if ( ! isset($installed_plugins[$plugin]) ) + return new WP_Error('no_plugin_header', __('The plugin does not have a valid header.')); + return 0; +} + +/** + * Whether the plugin can be uninstalled. + * + * @since 2.7.0 + * + * @param string $plugin Plugin path to check. + * @return bool Whether plugin can be uninstalled. + */ +function is_uninstallable_plugin($plugin) { + $file = plugin_basename($plugin); + + $uninstallable_plugins = (array) get_option('uninstall_plugins'); + if ( isset( $uninstallable_plugins[$file] ) || file_exists( WP_PLUGIN_DIR . '/' . dirname($file) . '/uninstall.php' ) ) + return true; + + return false; +} + +/** + * Uninstall a single plugin. + * + * Calls the uninstall hook, if it is available. + * + * @since 2.7.0 + * + * @param string $plugin Relative plugin path from Plugin Directory. + */ +function uninstall_plugin($plugin) { + $file = plugin_basename($plugin); + + $uninstallable_plugins = (array) get_option('uninstall_plugins'); + if ( file_exists( WP_PLUGIN_DIR . '/' . dirname($file) . '/uninstall.php' ) ) { + if ( isset( $uninstallable_plugins[$file] ) ) { + unset($uninstallable_plugins[$file]); + update_option('uninstall_plugins', $uninstallable_plugins); + } + unset($uninstallable_plugins); + + define('WP_UNINSTALL_PLUGIN', $file); + include WP_PLUGIN_DIR . '/' . dirname($file) . '/uninstall.php'; + + return true; + } + + if ( isset( $uninstallable_plugins[$file] ) ) { + $callable = $uninstallable_plugins[$file]; + unset($uninstallable_plugins[$file]); + update_option('uninstall_plugins', $uninstallable_plugins); + unset($uninstallable_plugins); + + include WP_PLUGIN_DIR . '/' . $file; + + add_action( 'uninstall_' . $file, $callable ); + do_action( 'uninstall_' . $file ); + } +} + +// +// Menu +// + +/** + * Add a top level menu page + * + * This function takes a capability which will be used to determine whether + * or not a page is included in the menu. + * + * The function which is hooked in to handle the output of the page must check + * that the user has the required capability as well. + * + * @param string $page_title The text to be displayed in the title tags of the page when the menu is selected + * @param string $menu_title The text to be used for the menu + * @param string $capability The capability required for this menu to be displayed to the user. + * @param string $menu_slug The slug name to refer to this menu by (should be unique for this menu) + * @param callback $function The function to be called to output the content for this page. + * @param string $icon_url The url to the icon to be used for this menu + * @param int $position The position in the menu order this one should appear + * + * @return string The resulting page's hook_suffix + */ +function add_menu_page( $page_title, $menu_title, $capability, $menu_slug, $function = '', $icon_url = '', $position = NULL ) { + global $menu, $admin_page_hooks, $_registered_pages, $_parent_pages; + + $menu_slug = plugin_basename( $menu_slug ); + + $admin_page_hooks[$menu_slug] = sanitize_title( $menu_title ); + + $hookname = get_plugin_page_hookname( $menu_slug, '' ); + + if ( !empty( $function ) && !empty( $hookname ) && current_user_can( $capability ) ) + add_action( $hookname, $function ); + + if ( empty($icon_url) ) + $icon_url = esc_url( admin_url( 'images/generic.png' ) ); + elseif ( is_ssl() && 0 === strpos($icon_url, 'http://') ) + $icon_url = 'https://' . substr($icon_url, 7); + + $new_menu = array( $menu_title, $capability, $menu_slug, $page_title, 'menu-top ' . $hookname, $hookname, $icon_url ); + + if ( null === $position ) + $menu[] = $new_menu; + else + $menu[$position] = $new_menu; + + $_registered_pages[$hookname] = true; + + // No parent as top level + $_parent_pages[$menu_slug] = false; + + return $hookname; +} + +/** + * Add a top level menu page in the 'objects' section + * + * This function takes a capability which will be used to determine whether + * or not a page is included in the menu. + * + * The function which is hooked in to handle the output of the page must check + * that the user has the required capability as well. + * + * @param string $page_title The text to be displayed in the title tags of the page when the menu is selected + * @param string $menu_title The text to be used for the menu + * @param string $capability The capability required for this menu to be displayed to the user. + * @param string $menu_slug The slug name to refer to this menu by (should be unique for this menu) + * @param callback $function The function to be called to output the content for this page. + * @param string $icon_url The url to the icon to be used for this menu + * + * @return string The resulting page's hook_suffix + */ +function add_object_page( $page_title, $menu_title, $capability, $menu_slug, $function = '', $icon_url = '') { + global $_wp_last_object_menu; + + $_wp_last_object_menu++; + + return add_menu_page($page_title, $menu_title, $capability, $menu_slug, $function, $icon_url, $_wp_last_object_menu); +} + +/** + * Add a top level menu page in the 'utility' section + * + * This function takes a capability which will be used to determine whether + * or not a page is included in the menu. + * + * The function which is hooked in to handle the output of the page must check + * that the user has the required capability as well. + * + * @param string $page_title The text to be displayed in the title tags of the page when the menu is selected + * @param string $menu_title The text to be used for the menu + * @param string $capability The capability required for this menu to be displayed to the user. + * @param string $menu_slug The slug name to refer to this menu by (should be unique for this menu) + * @param callback $function The function to be called to output the content for this page. + * @param string $icon_url The url to the icon to be used for this menu + * + * @return string The resulting page's hook_suffix + */ +function add_utility_page( $page_title, $menu_title, $capability, $menu_slug, $function = '', $icon_url = '') { + global $_wp_last_utility_menu; + + $_wp_last_utility_menu++; + + return add_menu_page($page_title, $menu_title, $capability, $menu_slug, $function, $icon_url, $_wp_last_utility_menu); +} + +/** + * Add a sub menu page + * + * This function takes a capability which will be used to determine whether + * or not a page is included in the menu. + * + * The function which is hooked in to handle the output of the page must check + * that the user has the required capability as well. + * + * @param string $parent_slug The slug name for the parent menu (or the file name of a standard WordPress admin page) + * @param string $page_title The text to be displayed in the title tags of the page when the menu is selected + * @param string $menu_title The text to be used for the menu + * @param string $capability The capability required for this menu to be displayed to the user. + * @param string $menu_slug The slug name to refer to this menu by (should be unique for this menu) + * @param callback $function The function to be called to output the content for this page. + * + * @return string|bool The resulting page's hook_suffix, or false if the user does not have the capability required. + */ +function add_submenu_page( $parent_slug, $page_title, $menu_title, $capability, $menu_slug, $function = '' ) { + global $submenu; + global $menu; + global $_wp_real_parent_file; + global $_wp_submenu_nopriv; + global $_registered_pages; + global $_parent_pages; + + $menu_slug = plugin_basename( $menu_slug ); + $parent_slug = plugin_basename( $parent_slug); + + if ( isset( $_wp_real_parent_file[$parent_slug] ) ) + $parent_slug = $_wp_real_parent_file[$parent_slug]; + + if ( !current_user_can( $capability ) ) { + $_wp_submenu_nopriv[$parent_slug][$menu_slug] = true; + return false; + } + + // If the parent doesn't already have a submenu, add a link to the parent + // as the first item in the submenu. If the submenu file is the same as the + // parent file someone is trying to link back to the parent manually. In + // this case, don't automatically add a link back to avoid duplication. + if (!isset( $submenu[$parent_slug] ) && $menu_slug != $parent_slug ) { + foreach ( (array)$menu as $parent_menu ) { + if ( $parent_menu[2] == $parent_slug && current_user_can( $parent_menu[1] ) ) + $submenu[$parent_slug][] = $parent_menu; + } + } + + $submenu[$parent_slug][] = array ( $menu_title, $capability, $menu_slug, $page_title ); + + $hookname = get_plugin_page_hookname( $menu_slug, $parent_slug); + if (!empty ( $function ) && !empty ( $hookname )) + add_action( $hookname, $function ); + + $_registered_pages[$hookname] = true; + // backwards-compatibility for plugins using add_management page. See wp-admin/admin.php for redirect from edit.php to tools.php + if ( 'tools.php' == $parent_slug ) + $_registered_pages[get_plugin_page_hookname( $menu_slug, 'edit.php')] = true; + + // No parent as top level + $_parent_pages[$menu_slug] = $parent_slug; + + return $hookname; +} + +/** + * Add sub menu page to the tools main menu. + * + * This function takes a capability which will be used to determine whether + * or not a page is included in the menu. + * + * The function which is hooked in to handle the output of the page must check + * that the user has the required capability as well. + * + * @param string $page_title The text to be displayed in the title tags of the page when the menu is selected + * @param string $menu_title The text to be used for the menu + * @param string $capability The capability required for this menu to be displayed to the user. + * @param string $menu_slug The slug name to refer to this menu by (should be unique for this menu) + * @param callback $function The function to be called to output the content for this page. + * + * @return string|bool The resulting page's hook_suffix, or false if the user does not have the capability required. + */ +function add_management_page( $page_title, $menu_title, $capability, $menu_slug, $function = '' ) { + return add_submenu_page( 'tools.php', $page_title, $menu_title, $capability, $menu_slug, $function ); +} + +/** + * Add sub menu page to the options main menu. + * + * This function takes a capability which will be used to determine whether + * or not a page is included in the menu. + * + * The function which is hooked in to handle the output of the page must check + * that the user has the required capability as well. + * + * @param string $page_title The text to be displayed in the title tags of the page when the menu is selected + * @param string $menu_title The text to be used for the menu + * @param string $capability The capability required for this menu to be displayed to the user. + * @param string $menu_slug The slug name to refer to this menu by (should be unique for this menu) + * @param callback $function The function to be called to output the content for this page. + * + * @return string|bool The resulting page's hook_suffix, or false if the user does not have the capability required. + */ +function add_options_page( $page_title, $menu_title, $capability, $menu_slug, $function = '' ) { + return add_submenu_page( 'options-general.php', $page_title, $menu_title, $capability, $menu_slug, $function ); +} + +/** + * Add sub menu page to the themes main menu. + * + * This function takes a capability which will be used to determine whether + * or not a page is included in the menu. + * + * The function which is hooked in to handle the output of the page must check + * that the user has the required capability as well. + * + * @param string $page_title The text to be displayed in the title tags of the page when the menu is selected + * @param string $menu_title The text to be used for the menu + * @param string $capability The capability required for this menu to be displayed to the user. + * @param string $menu_slug The slug name to refer to this menu by (should be unique for this menu) + * @param callback $function The function to be called to output the content for this page. + * + * @return string|bool The resulting page's hook_suffix, or false if the user does not have the capability required. + */ +function add_theme_page( $page_title, $menu_title, $capability, $menu_slug, $function = '' ) { + return add_submenu_page( 'themes.php', $page_title, $menu_title, $capability, $menu_slug, $function ); +} + +/** + * Add sub menu page to the plugins main menu. + * + * This function takes a capability which will be used to determine whether + * or not a page is included in the menu. + * + * The function which is hooked in to handle the output of the page must check + * that the user has the required capability as well. + * + * @param string $page_title The text to be displayed in the title tags of the page when the menu is selected + * @param string $menu_title The text to be used for the menu + * @param string $capability The capability required for this menu to be displayed to the user. + * @param string $menu_slug The slug name to refer to this menu by (should be unique for this menu) + * @param callback $function The function to be called to output the content for this page. + * + * @return string|bool The resulting page's hook_suffix, or false if the user does not have the capability required. + */ +function add_plugins_page( $page_title, $menu_title, $capability, $menu_slug, $function = '' ) { + return add_submenu_page( 'plugins.php', $page_title, $menu_title, $capability, $menu_slug, $function ); +} + +/** + * Add sub menu page to the Users/Profile main menu. + * + * This function takes a capability which will be used to determine whether + * or not a page is included in the menu. + * + * The function which is hooked in to handle the output of the page must check + * that the user has the required capability as well. + * + * @param string $page_title The text to be displayed in the title tags of the page when the menu is selected + * @param string $menu_title The text to be used for the menu + * @param string $capability The capability required for this menu to be displayed to the user. + * @param string $menu_slug The slug name to refer to this menu by (should be unique for this menu) + * @param callback $function The function to be called to output the content for this page. + * + * @return string|bool The resulting page's hook_suffix, or false if the user does not have the capability required. + */ +function add_users_page( $page_title, $menu_title, $capability, $menu_slug, $function = '' ) { + if ( current_user_can('edit_users') ) + $parent = 'users.php'; + else + $parent = 'profile.php'; + return add_submenu_page( $parent, $page_title, $menu_title, $capability, $menu_slug, $function ); +} +/** + * Add sub menu page to the Dashboard main menu. + * + * This function takes a capability which will be used to determine whether + * or not a page is included in the menu. + * + * The function which is hooked in to handle the output of the page must check + * that the user has the required capability as well. + * + * @param string $page_title The text to be displayed in the title tags of the page when the menu is selected + * @param string $menu_title The text to be used for the menu + * @param string $capability The capability required for this menu to be displayed to the user. + * @param string $menu_slug The slug name to refer to this menu by (should be unique for this menu) + * @param callback $function The function to be called to output the content for this page. + * + * @return string|bool The resulting page's hook_suffix, or false if the user does not have the capability required. + */ +function add_dashboard_page( $page_title, $menu_title, $capability, $menu_slug, $function = '' ) { + return add_submenu_page( 'index.php', $page_title, $menu_title, $capability, $menu_slug, $function ); +} + +/** + * Add sub menu page to the posts main menu. + * + * This function takes a capability which will be used to determine whether + * or not a page is included in the menu. + * + * The function which is hooked in to handle the output of the page must check + * that the user has the required capability as well. + * + * @param string $page_title The text to be displayed in the title tags of the page when the menu is selected + * @param string $menu_title The text to be used for the menu + * @param string $capability The capability required for this menu to be displayed to the user. + * @param string $menu_slug The slug name to refer to this menu by (should be unique for this menu) + * @param callback $function The function to be called to output the content for this page. + * + * @return string|bool The resulting page's hook_suffix, or false if the user does not have the capability required. + */ +function add_posts_page( $page_title, $menu_title, $capability, $menu_slug, $function = '' ) { + return add_submenu_page( 'edit.php', $page_title, $menu_title, $capability, $menu_slug, $function ); +} + +/** + * Add sub menu page to the media main menu. + * + * This function takes a capability which will be used to determine whether + * or not a page is included in the menu. + * + * The function which is hooked in to handle the output of the page must check + * that the user has the required capability as well. + * + * @param string $page_title The text to be displayed in the title tags of the page when the menu is selected + * @param string $menu_title The text to be used for the menu + * @param string $capability The capability required for this menu to be displayed to the user. + * @param string $menu_slug The slug name to refer to this menu by (should be unique for this menu) + * @param callback $function The function to be called to output the content for this page. + * + * @return string|bool The resulting page's hook_suffix, or false if the user does not have the capability required. + */ +function add_media_page( $page_title, $menu_title, $capability, $menu_slug, $function = '' ) { + return add_submenu_page( 'upload.php', $page_title, $menu_title, $capability, $menu_slug, $function ); +} + +/** + * Add sub menu page to the links main menu. + * + * This function takes a capability which will be used to determine whether + * or not a page is included in the menu. + * + * The function which is hooked in to handle the output of the page must check + * that the user has the required capability as well. + * + * @param string $page_title The text to be displayed in the title tags of the page when the menu is selected + * @param string $menu_title The text to be used for the menu + * @param string $capability The capability required for this menu to be displayed to the user. + * @param string $menu_slug The slug name to refer to this menu by (should be unique for this menu) + * @param callback $function The function to be called to output the content for this page. + * + * @return string|bool The resulting page's hook_suffix, or false if the user does not have the capability required. + */ +function add_links_page( $page_title, $menu_title, $capability, $menu_slug, $function = '' ) { + return add_submenu_page( 'link-manager.php', $page_title, $menu_title, $capability, $menu_slug, $function ); +} + +/** + * Add sub menu page to the pages main menu. + * + * This function takes a capability which will be used to determine whether + * or not a page is included in the menu. + * + * The function which is hooked in to handle the output of the page must check + * that the user has the required capability as well. + * + * @param string $page_title The text to be displayed in the title tags of the page when the menu is selected + * @param string $menu_title The text to be used for the menu + * @param string $capability The capability required for this menu to be displayed to the user. + * @param string $menu_slug The slug name to refer to this menu by (should be unique for this menu) + * @param callback $function The function to be called to output the content for this page. + * + * @return string|bool The resulting page's hook_suffix, or false if the user does not have the capability required. +*/ +function add_pages_page( $page_title, $menu_title, $capability, $menu_slug, $function = '' ) { + return add_submenu_page( 'edit.php?post_type=page', $page_title, $menu_title, $capability, $menu_slug, $function ); +} + +/** + * Add sub menu page to the comments main menu. + * + * This function takes a capability which will be used to determine whether + * or not a page is included in the menu. + * + * The function which is hooked in to handle the output of the page must check + * that the user has the required capability as well. + * + * @param string $page_title The text to be displayed in the title tags of the page when the menu is selected + * @param string $menu_title The text to be used for the menu + * @param string $capability The capability required for this menu to be displayed to the user. + * @param string $menu_slug The slug name to refer to this menu by (should be unique for this menu) + * @param callback $function The function to be called to output the content for this page. + * + * @return string|bool The resulting page's hook_suffix, or false if the user does not have the capability required. +*/ +function add_comments_page( $page_title, $menu_title, $capability, $menu_slug, $function = '' ) { + return add_submenu_page( 'edit-comments.php', $page_title, $menu_title, $capability, $menu_slug, $function ); +} + + +/** + * Remove a top level admin menu + * + * @since 3.1.0 + * + * @param string $menu_slug The slug of the menu + * @return array|bool The removed menu on success, False if not found + */ +function remove_menu_page( $menu_slug ) { + global $menu; + + foreach ( $menu as $i => $item ) { + if ( $menu_slug == $item[2] ) { + unset( $menu[$i] ); + return $item; + } + } + + return false; +} + +/** + * Remove an admin submenu + * + * @since 3.1.0 + * + * @param string $menu_slug The slug for the parent menu + * @param string $submenu_slug The slug of the submenu + * @return array|bool The removed submenu on success, False if not found + */ +function remove_submenu_page( $menu_slug, $submenu_slug ) { + global $submenu; + + if ( !isset( $submenu[$menu_slug] ) ) + return false; + + foreach ( $submenu[$menu_slug] as $i => $item ) { + if ( $submenu_slug == $item[2] ) { + unset( $submenu[$menu_slug][$i] ); + return $item; + } + } + + return false; +} + +/** + * Get the url to access a particular menu page based on the slug it was registered with. + * + * If the slug hasn't been registered properly no url will be returned + * + * @since 3.0 + * + * @param string $menu_slug The slug name to refer to this menu by (should be unique for this menu) + * @param bool $echo Whether or not to echo the url - default is true + * @return string the url + */ +function menu_page_url($menu_slug, $echo = true) { + global $_parent_pages; + + if ( isset( $_parent_pages[$menu_slug] ) ) { + $parent_slug = $_parent_pages[$menu_slug]; + if ( $parent_slug && ! isset( $_parent_pages[$parent_slug] ) ) { + $url = admin_url( add_query_arg( 'page', $menu_slug, $parent_slug ) ); + } else { + $url = admin_url( 'admin.php?page=' . $menu_slug ); + } + } else { + $url = ''; + } + + $url = esc_url($url); + + if ( $echo ) + echo $url; + + return $url; +} + +// +// Pluggable Menu Support -- Private +// + +function get_admin_page_parent( $parent = '' ) { + global $parent_file; + global $menu; + global $submenu; + global $pagenow; + global $typenow; + global $plugin_page; + global $_wp_real_parent_file; + global $_wp_menu_nopriv; + global $_wp_submenu_nopriv; + + if ( !empty ( $parent ) && 'admin.php' != $parent ) { + if ( isset( $_wp_real_parent_file[$parent] ) ) + $parent = $_wp_real_parent_file[$parent]; + return $parent; + } + + /* + if ( !empty ( $parent_file ) ) { + if ( isset( $_wp_real_parent_file[$parent_file] ) ) + $parent_file = $_wp_real_parent_file[$parent_file]; + + return $parent_file; + } + */ + + if ( $pagenow == 'admin.php' && isset( $plugin_page ) ) { + foreach ( (array)$menu as $parent_menu ) { + if ( $parent_menu[2] == $plugin_page ) { + $parent_file = $plugin_page; + if ( isset( $_wp_real_parent_file[$parent_file] ) ) + $parent_file = $_wp_real_parent_file[$parent_file]; + return $parent_file; + } + } + if ( isset( $_wp_menu_nopriv[$plugin_page] ) ) { + $parent_file = $plugin_page; + if ( isset( $_wp_real_parent_file[$parent_file] ) ) + $parent_file = $_wp_real_parent_file[$parent_file]; + return $parent_file; + } + } + + if ( isset( $plugin_page ) && isset( $_wp_submenu_nopriv[$pagenow][$plugin_page] ) ) { + $parent_file = $pagenow; + if ( isset( $_wp_real_parent_file[$parent_file] ) ) + $parent_file = $_wp_real_parent_file[$parent_file]; + return $parent_file; + } + + foreach (array_keys( (array)$submenu ) as $parent) { + foreach ( $submenu[$parent] as $submenu_array ) { + if ( isset( $_wp_real_parent_file[$parent] ) ) + $parent = $_wp_real_parent_file[$parent]; + if ( !empty($typenow) && ($submenu_array[2] == "$pagenow?post_type=$typenow") ) { + $parent_file = $parent; + return $parent; + } elseif ( $submenu_array[2] == $pagenow && empty($typenow) && ( empty($parent_file) || false === strpos($parent_file, '?') ) ) { + $parent_file = $parent; + return $parent; + } else + if ( isset( $plugin_page ) && ($plugin_page == $submenu_array[2] ) ) { + $parent_file = $parent; + return $parent; + } + } + } + + if ( empty($parent_file) ) + $parent_file = ''; + return ''; +} + +function get_admin_page_title() { + global $title; + global $menu; + global $submenu; + global $pagenow; + global $plugin_page; + global $typenow; + + if ( ! empty ( $title ) ) + return $title; + + $hook = get_plugin_page_hook( $plugin_page, $pagenow ); + + $parent = $parent1 = get_admin_page_parent(); + + if ( empty ( $parent) ) { + foreach ( (array)$menu as $menu_array ) { + if ( isset( $menu_array[3] ) ) { + if ( $menu_array[2] == $pagenow ) { + $title = $menu_array[3]; + return $menu_array[3]; + } else + if ( isset( $plugin_page ) && ($plugin_page == $menu_array[2] ) && ($hook == $menu_array[3] ) ) { + $title = $menu_array[3]; + return $menu_array[3]; + } + } else { + $title = $menu_array[0]; + return $title; + } + } + } else { + foreach ( array_keys( $submenu ) as $parent ) { + foreach ( $submenu[$parent] as $submenu_array ) { + if ( isset( $plugin_page ) && + ( $plugin_page == $submenu_array[2] ) && + ( + ( $parent == $pagenow ) || + ( $parent == $plugin_page ) || + ( $plugin_page == $hook ) || + ( $pagenow == 'admin.php' && $parent1 != $submenu_array[2] ) || + ( !empty($typenow) && $parent == $pagenow . '?post_type=' . $typenow) + ) + ) { + $title = $submenu_array[3]; + return $submenu_array[3]; + } + + if ( $submenu_array[2] != $pagenow || isset( $_GET['page'] ) ) // not the current page + continue; + + if ( isset( $submenu_array[3] ) ) { + $title = $submenu_array[3]; + return $submenu_array[3]; + } else { + $title = $submenu_array[0]; + return $title; + } + } + } + if ( empty ( $title ) ) { + foreach ( $menu as $menu_array ) { + if ( isset( $plugin_page ) && + ( $plugin_page == $menu_array[2] ) && + ( $pagenow == 'admin.php' ) && + ( $parent1 == $menu_array[2] ) ) + { + $title = $menu_array[3]; + return $menu_array[3]; + } + } + } + } + + return $title; +} + +function get_plugin_page_hook( $plugin_page, $parent_page ) { + $hook = get_plugin_page_hookname( $plugin_page, $parent_page ); + if ( has_action($hook) ) + return $hook; + else + return null; +} + +function get_plugin_page_hookname( $plugin_page, $parent_page ) { + global $admin_page_hooks; + + $parent = get_admin_page_parent( $parent_page ); + + $page_type = 'admin'; + if ( empty ( $parent_page ) || 'admin.php' == $parent_page || isset( $admin_page_hooks[$plugin_page] ) ) { + if ( isset( $admin_page_hooks[$plugin_page] ) ) + $page_type = 'toplevel'; + else + if ( isset( $admin_page_hooks[$parent] )) + $page_type = $admin_page_hooks[$parent]; + } else if ( isset( $admin_page_hooks[$parent] ) ) { + $page_type = $admin_page_hooks[$parent]; + } + + $plugin_name = preg_replace( '!\.php!', '', $plugin_page ); + + return $page_type . '_page_' . $plugin_name; +} + +function user_can_access_admin_page() { + global $pagenow; + global $menu; + global $submenu; + global $_wp_menu_nopriv; + global $_wp_submenu_nopriv; + global $plugin_page; + global $_registered_pages; + + $parent = get_admin_page_parent(); + + if ( !isset( $plugin_page ) && isset( $_wp_submenu_nopriv[$parent][$pagenow] ) ) + return false; + + if ( isset( $plugin_page ) ) { + if ( isset( $_wp_submenu_nopriv[$parent][$plugin_page] ) ) + return false; + + $hookname = get_plugin_page_hookname($plugin_page, $parent); + + if ( !isset($_registered_pages[$hookname]) ) + return false; + } + + if ( empty( $parent) ) { + if ( isset( $_wp_menu_nopriv[$pagenow] ) ) + return false; + if ( isset( $_wp_submenu_nopriv[$pagenow][$pagenow] ) ) + return false; + if ( isset( $plugin_page ) && isset( $_wp_submenu_nopriv[$pagenow][$plugin_page] ) ) + return false; + if ( isset( $plugin_page ) && isset( $_wp_menu_nopriv[$plugin_page] ) ) + return false; + foreach (array_keys( $_wp_submenu_nopriv ) as $key ) { + if ( isset( $_wp_submenu_nopriv[$key][$pagenow] ) ) + return false; + if ( isset( $plugin_page ) && isset( $_wp_submenu_nopriv[$key][$plugin_page] ) ) + return false; + } + return true; + } + + if ( isset( $plugin_page ) && ( $plugin_page == $parent ) && isset( $_wp_menu_nopriv[$plugin_page] ) ) + return false; + + if ( isset( $submenu[$parent] ) ) { + foreach ( $submenu[$parent] as $submenu_array ) { + if ( isset( $plugin_page ) && ( $submenu_array[2] == $plugin_page ) ) { + if ( current_user_can( $submenu_array[1] )) + return true; + else + return false; + } else if ( $submenu_array[2] == $pagenow ) { + if ( current_user_can( $submenu_array[1] )) + return true; + else + return false; + } + } + } + + foreach ( $menu as $menu_array ) { + if ( $menu_array[2] == $parent) { + if ( current_user_can( $menu_array[1] )) + return true; + else + return false; + } + } + + return true; +} + +/* Whitelist functions */ + +/** + * Register a setting and its sanitization callback + * + * @since 2.7.0 + * + * @param string $option_group A settings group name. Should correspond to a whitelisted option key name. + * Default whitelisted option key names include "general," "discussion," and "reading," among others. + * @param string $option_name The name of an option to sanitize and save. + * @param unknown_type $sanitize_callback A callback function that sanitizes the option's value. + * @return unknown + */ +function register_setting( $option_group, $option_name, $sanitize_callback = '' ) { + global $new_whitelist_options; + + if ( 'misc' == $option_group ) { + _deprecated_argument( __FUNCTION__, '3.0', __( 'The miscellaneous options group has been removed. Use another settings group.' ) ); + $option_group = 'general'; + } + + $new_whitelist_options[ $option_group ][] = $option_name; + if ( $sanitize_callback != '' ) + add_filter( "sanitize_option_{$option_name}", $sanitize_callback ); +} + +/** + * Unregister a setting + * + * @since 2.7.0 + * + * @param unknown_type $option_group + * @param unknown_type $option_name + * @param unknown_type $sanitize_callback + * @return unknown + */ +function unregister_setting( $option_group, $option_name, $sanitize_callback = '' ) { + global $new_whitelist_options; + + if ( 'misc' == $option_group ) { + _deprecated_argument( __FUNCTION__, '3.0', __( 'The miscellaneous options group has been removed. Use another settings group.' ) ); + $option_group = 'general'; + } + + $pos = array_search( $option_name, (array) $new_whitelist_options ); + if ( $pos !== false ) + unset( $new_whitelist_options[ $option_group ][ $pos ] ); + if ( $sanitize_callback != '' ) + remove_filter( "sanitize_option_{$option_name}", $sanitize_callback ); +} + +/** + * {@internal Missing Short Description}} + * + * @since 2.7.0 + * + * @param unknown_type $options + * @return unknown + */ +function option_update_filter( $options ) { + global $new_whitelist_options; + + if ( is_array( $new_whitelist_options ) ) + $options = add_option_whitelist( $new_whitelist_options, $options ); + + return $options; +} +add_filter( 'whitelist_options', 'option_update_filter' ); + +/** + * {@internal Missing Short Description}} + * + * @since 2.7.0 + * + * @param unknown_type $new_options + * @param unknown_type $options + * @return unknown + */ +function add_option_whitelist( $new_options, $options = '' ) { + if ( $options == '' ) + global $whitelist_options; + else + $whitelist_options = $options; + + foreach ( $new_options as $page => $keys ) { + foreach ( $keys as $key ) { + if ( !isset($whitelist_options[ $page ]) || !is_array($whitelist_options[ $page ]) ) { + $whitelist_options[ $page ] = array(); + $whitelist_options[ $page ][] = $key; + } else { + $pos = array_search( $key, $whitelist_options[ $page ] ); + if ( $pos === false ) + $whitelist_options[ $page ][] = $key; + } + } + } + + return $whitelist_options; +} + +/** + * {@internal Missing Short Description}} + * + * @since 2.7.0 + * + * @param unknown_type $del_options + * @param unknown_type $options + * @return unknown + */ +function remove_option_whitelist( $del_options, $options = '' ) { + if ( $options == '' ) + global $whitelist_options; + else + $whitelist_options = $options; + + foreach ( $del_options as $page => $keys ) { + foreach ( $keys as $key ) { + if ( isset($whitelist_options[ $page ]) && is_array($whitelist_options[ $page ]) ) { + $pos = array_search( $key, $whitelist_options[ $page ] ); + if ( $pos !== false ) + unset( $whitelist_options[ $page ][ $pos ] ); + } + } + } + + return $whitelist_options; +} + +/** + * Output nonce, action, and option_page fields for a settings page. + * + * @since 2.7.0 + * + * @param string $option_group A settings group name. This should match the group name used in register_setting(). + */ +function settings_fields($option_group) { + echo ""; + echo ''; + wp_nonce_field("$option_group-options"); +} + +?> diff --git a/src/wp-admin/includes/post.php b/src/wp-admin/includes/post.php new file mode 100644 index 0000000..d65e0e2 --- /dev/null +++ b/src/wp-admin/includes/post.php @@ -0,0 +1,1864 @@ +cap->edit_others_posts ) ) { + if ( 'page' == $post_data['post_type'] ) { + return new WP_Error( 'edit_others_pages', $update ? + __( 'You are not allowed to edit pages as this user.' ) : + __( 'You are not allowed to create pages as this user.' ) + ); + } else { + return new WP_Error( 'edit_others_posts', $update ? + __( 'You are not allowed to edit posts as this user.' ) : + __( 'You are not allowed to post as this user.' ) + ); + } + } + } + + // What to do based on which button they pressed + if ( isset($post_data['saveasdraft']) && '' != $post_data['saveasdraft'] ) + $post_data['post_status'] = 'draft'; + if ( isset($post_data['saveasprivate']) && '' != $post_data['saveasprivate'] ) + $post_data['post_status'] = 'private'; + if ( isset($post_data['publish']) && ( '' != $post_data['publish'] ) && ( !isset($post_data['post_status']) || $post_data['post_status'] != 'private' ) ) + $post_data['post_status'] = 'publish'; + if ( isset($post_data['advanced']) && '' != $post_data['advanced'] ) + $post_data['post_status'] = 'draft'; + if ( isset($post_data['pending']) && '' != $post_data['pending'] ) + $post_data['post_status'] = 'pending'; + + if ( isset( $post_data['ID'] ) ) + $post_id = $post_data['ID']; + else + $post_id = false; + $previous_status = $post_id ? get_post_field( 'post_status', $post_id ) : false; + + // Posts 'submitted for approval' present are submitted to $_POST the same as if they were being published. + // Change status from 'publish' to 'pending' if user lacks permissions to publish or to resave published posts. + if ( isset($post_data['post_status']) && ('publish' == $post_data['post_status'] && !current_user_can( $ptype->cap->publish_posts )) ) + if ( $previous_status != 'publish' || !current_user_can( 'edit_post', $post_id ) ) + $post_data['post_status'] = 'pending'; + + if ( ! isset($post_data['post_status']) ) + $post_data['post_status'] = $previous_status; + + if (!isset( $post_data['comment_status'] )) + $post_data['comment_status'] = 'closed'; + + if (!isset( $post_data['ping_status'] )) + $post_data['ping_status'] = 'closed'; + + foreach ( array('aa', 'mm', 'jj', 'hh', 'mn') as $timeunit ) { + if ( !empty( $post_data['hidden_' . $timeunit] ) && $post_data['hidden_' . $timeunit] != $post_data[$timeunit] ) { + $post_data['edit_date'] = '1'; + break; + } + } + + if ( !empty( $post_data['edit_date'] ) ) { + $aa = $post_data['aa']; + $mm = $post_data['mm']; + $jj = $post_data['jj']; + $hh = $post_data['hh']; + $mn = $post_data['mn']; + $ss = $post_data['ss']; + $aa = ($aa <= 0 ) ? date('Y') : $aa; + $mm = ($mm <= 0 ) ? date('n') : $mm; + $jj = ($jj > 31 ) ? 31 : $jj; + $jj = ($jj <= 0 ) ? date('j') : $jj; + $hh = ($hh > 23 ) ? $hh -24 : $hh; + $mn = ($mn > 59 ) ? $mn -60 : $mn; + $ss = ($ss > 59 ) ? $ss -60 : $ss; + $post_data['post_date'] = sprintf( "%04d-%02d-%02d %02d:%02d:%02d", $aa, $mm, $jj, $hh, $mn, $ss ); + $post_data['post_date_gmt'] = get_gmt_from_date( $post_data['post_date'] ); + } + + return $post_data; +} + +/** + * Update an existing post with values provided in $_POST. + * + * @since 1.5.0 + * + * @param array $post_data Optional. + * @return int Post ID. + */ +function edit_post( $post_data = null ) { + + if ( empty($post_data) ) + $post_data = &$_POST; + + // Clear out any data in internal vars. + unset( $post_data['filter'] ); + + $post_ID = (int) $post_data['post_ID']; + $post = get_post( $post_ID ); + $post_data['post_type'] = $post->post_type; + $post_data['post_mime_type'] = $post->post_mime_type; + + $ptype = get_post_type_object($post_data['post_type']); + if ( !current_user_can( $ptype->cap->edit_post, $post_ID ) ) { + if ( 'page' == $post_data['post_type'] ) + wp_die( __('You are not allowed to edit this page.' )); + else + wp_die( __('You are not allowed to edit this post.' )); + } + + // Autosave shouldn't save too soon after a real save + if ( 'autosave' == $post_data['action'] ) { + $post =& get_post( $post_ID ); + $now = time(); + $then = strtotime($post->post_date_gmt . ' +0000'); + $delta = AUTOSAVE_INTERVAL / 2; + if ( ($now - $then) < $delta ) + return $post_ID; + } + + $post_data = _wp_translate_postdata( true, $post_data ); + if ( is_wp_error($post_data) ) + wp_die( $post_data->get_error_message() ); + if ( 'autosave' != $post_data['action'] && 'auto-draft' == $post_data['post_status'] ) + $post_data['post_status'] = 'draft'; + + if ( isset($post_data['visibility']) ) { + switch ( $post_data['visibility'] ) { + case 'public' : + $post_data['post_password'] = ''; + break; + case 'password' : + unset( $post_data['sticky'] ); + break; + case 'private' : + $post_data['post_status'] = 'private'; + $post_data['post_password'] = ''; + unset( $post_data['sticky'] ); + break; + } + } + + // Post Formats + if ( current_theme_supports( 'post-formats' ) && isset( $post_data['post_format'] ) ) { + $formats = get_theme_support( 'post-formats' ); + if ( is_array( $formats ) ) { + $formats = $formats[0]; + if ( in_array( $post_data['post_format'], $formats ) ) { + set_post_format( $post_ID, $post_data['post_format'] ); + } elseif ( '0' == $post_data['post_format'] ) { + set_post_format( $post_ID, false ); + } + } + } + + // Meta Stuff + if ( isset($post_data['meta']) && $post_data['meta'] ) { + foreach ( $post_data['meta'] as $key => $value ) { + if ( !$meta = get_post_meta_by_id( $key ) ) + continue; + if ( $meta->post_id != $post_ID ) + continue; + if ( is_protected_meta( $value['key'] ) ) + continue; + update_meta( $key, $value['key'], $value['value'] ); + } + } + + if ( isset($post_data['deletemeta']) && $post_data['deletemeta'] ) { + foreach ( $post_data['deletemeta'] as $key => $value ) { + if ( !$meta = get_post_meta_by_id( $key ) ) + continue; + if ( $meta->post_id != $post_ID ) + continue; + if ( is_protected_meta( $meta->meta_key ) ) + continue; + delete_meta( $key ); + } + } + + add_meta( $post_ID ); + + update_post_meta( $post_ID, '_edit_last', $GLOBALS['current_user']->ID ); + + wp_update_post( $post_data ); + + // Reunite any orphaned attachments with their parent + if ( !$draft_ids = get_user_option( 'autosave_draft_ids' ) ) + $draft_ids = array(); + if ( $draft_temp_id = (int) array_search( $post_ID, $draft_ids ) ) + _relocate_children( $draft_temp_id, $post_ID ); + + // Now that we have an ID we can fix any attachment anchor hrefs + _fix_attachment_links( $post_ID ); + + wp_set_post_lock( $post_ID, $GLOBALS['current_user']->ID ); + + if ( current_user_can( $ptype->cap->edit_others_posts ) ) { + if ( ! empty( $post_data['sticky'] ) ) + stick_post( $post_ID ); + else + unstick_post( $post_ID ); + } + + return $post_ID; +} + +/** + * Process the post data for the bulk editing of posts. + * + * Updates all bulk edited posts/pages, adding (but not removing) tags and + * categories. Skips pages when they would be their own parent or child. + * + * @since 2.7.0 + * + * @param array $post_data Optional, the array of post data to process if not provided will use $_POST superglobal. + * @return array + */ +function bulk_edit_posts( $post_data = null ) { + global $wpdb; + + if ( empty($post_data) ) + $post_data = &$_POST; + + if ( isset($post_data['post_type']) ) + $ptype = get_post_type_object($post_data['post_type']); + else + $ptype = get_post_type_object('post'); + + if ( !current_user_can( $ptype->cap->edit_posts ) ) { + if ( 'page' == $ptype->name ) + wp_die( __('You are not allowed to edit pages.')); + else + wp_die( __('You are not allowed to edit posts.')); + } + + if ( -1 == $post_data['_status'] ) { + $post_data['post_status'] = null; + unset($post_data['post_status']); + } else { + $post_data['post_status'] = $post_data['_status']; + } + unset($post_data['_status']); + + $post_IDs = array_map( 'intval', (array) $post_data['post'] ); + + $reset = array( 'post_author', 'post_status', 'post_password', 'post_parent', 'page_template', 'comment_status', 'ping_status', 'keep_private', 'tax_input', 'post_category', 'sticky' ); + foreach ( $reset as $field ) { + if ( isset($post_data[$field]) && ( '' == $post_data[$field] || -1 == $post_data[$field] ) ) + unset($post_data[$field]); + } + + if ( isset($post_data['post_category']) ) { + if ( is_array($post_data['post_category']) && ! empty($post_data['post_category']) ) + $new_cats = array_map( 'absint', $post_data['post_category'] ); + else + unset($post_data['post_category']); + } + + $tax_input = array(); + if ( isset($post_data['tax_input'])) { + foreach ( $post_data['tax_input'] as $tax_name => $terms ) { + if ( empty($terms) ) + continue; + if ( is_taxonomy_hierarchical( $tax_name ) ) + $tax_input[$tax_name] = array_map( 'absint', $terms ); + else { + $tax_input[$tax_name] = preg_replace( '/\s*,\s*/', ',', rtrim( trim($terms), ' ,' ) ); + $tax_input[$tax_name] = explode(',', $tax_input[$tax_name]); + } + } + } + + if ( isset($post_data['post_parent']) && ($parent = (int) $post_data['post_parent']) ) { + $pages = $wpdb->get_results("SELECT ID, post_parent FROM $wpdb->posts WHERE post_type = 'page'"); + $children = array(); + + for ( $i = 0; $i < 50 && $parent > 0; $i++ ) { + $children[] = $parent; + + foreach ( $pages as $page ) { + if ( $page->ID == $parent ) { + $parent = $page->post_parent; + break; + } + } + } + } + + $updated = $skipped = $locked = array(); + foreach ( $post_IDs as $post_ID ) { + $post_type_object = get_post_type_object( get_post_type( $post_ID ) ); + + if ( !isset( $post_type_object ) || ( isset($children) && in_array($post_ID, $children) ) || !current_user_can( $post_type_object->cap->edit_post, $post_ID ) ) { + $skipped[] = $post_ID; + continue; + } + + if ( wp_check_post_lock( $post_ID ) ) { + $locked[] = $post_ID; + continue; + } + + $post = get_post( $post_ID ); + $tax_names = get_object_taxonomies( $post ); + foreach ( $tax_names as $tax_name ) { + $taxonomy_obj = get_taxonomy($tax_name); + if ( isset( $tax_input[$tax_name]) && current_user_can( $taxonomy_obj->cap->assign_terms ) ) + $new_terms = $tax_input[$tax_name]; + else + $new_terms = array(); + + if ( $taxonomy_obj->hierarchical ) + $current_terms = (array) wp_get_object_terms( $post_ID, $tax_name, array('fields' => 'ids') ); + else + $current_terms = (array) wp_get_object_terms( $post_ID, $tax_name, array('fields' => 'names') ); + + $post_data['tax_input'][$tax_name] = array_merge( $current_terms, $new_terms ); + } + + if ( isset($new_cats) && in_array( 'category', $tax_names ) ) { + $cats = (array) wp_get_post_categories($post_ID); + $post_data['post_category'] = array_unique( array_merge($cats, $new_cats) ); + unset( $post_data['tax_input']['category'] ); + } + + $post_data['post_mime_type'] = $post->post_mime_type; + $post_data['guid'] = $post->guid; + + $post_data['ID'] = $post_ID; + $updated[] = wp_update_post( $post_data ); + + if ( isset( $post_data['sticky'] ) && current_user_can( $ptype->cap->edit_others_posts ) ) { + if ( 'sticky' == $post_data['sticky'] ) + stick_post( $post_ID ); + else + unstick_post( $post_ID ); + } + + } + + return array( 'updated' => $updated, 'skipped' => $skipped, 'locked' => $locked ); +} + +/** + * Default post information to use when populating the "Write Post" form. + * + * @since 2.0.0 + * + * @param string $post_type A post type string, defaults to 'post'. + * @return object stdClass object containing all the default post data as attributes + */ +function get_default_post_to_edit( $post_type = 'post', $create_in_db = false ) { + global $wpdb; + + $post_title = ''; + if ( !empty( $_REQUEST['post_title'] ) ) + $post_title = esc_html( stripslashes( $_REQUEST['post_title'] )); + + $post_content = ''; + if ( !empty( $_REQUEST['content'] ) ) + $post_content = esc_html( stripslashes( $_REQUEST['content'] )); + + $post_excerpt = ''; + if ( !empty( $_REQUEST['excerpt'] ) ) + $post_excerpt = esc_html( stripslashes( $_REQUEST['excerpt'] )); + + if ( $create_in_db ) { + // Cleanup old auto-drafts more than 7 days old + $old_posts = $wpdb->get_col( "SELECT ID FROM $wpdb->posts WHERE post_status = 'auto-draft' AND DATE_SUB( NOW(), INTERVAL 7 DAY ) > post_date" ); + foreach ( (array) $old_posts as $delete ) + wp_delete_post( $delete, true ); // Force delete + $post_id = wp_insert_post( array( 'post_title' => __( 'Auto Draft' ), 'post_type' => $post_type, 'post_status' => 'auto-draft' ) ); + $post = get_post( $post_id ); + if ( current_theme_supports( 'post-formats' ) && post_type_supports( $post->post_type, 'post-formats' ) && get_option( 'default_post_format' ) ) + set_post_format( $post, get_option( 'default_post_format' ) ); + } else { + $post->ID = 0; + $post->post_author = ''; + $post->post_date = ''; + $post->post_date_gmt = ''; + $post->post_password = ''; + $post->post_type = $post_type; + $post->post_status = 'draft'; + $post->to_ping = ''; + $post->pinged = ''; + $post->comment_status = get_option( 'default_comment_status' ); + $post->ping_status = get_option( 'default_ping_status' ); + $post->post_pingback = get_option( 'default_pingback_flag' ); + $post->post_category = get_option( 'default_category' ); + $post->page_template = 'default'; + $post->post_parent = 0; + $post->menu_order = 0; + } + + $post->post_content = apply_filters( 'default_content', $post_content, $post ); + $post->post_title = apply_filters( 'default_title', $post_title, $post ); + $post->post_excerpt = apply_filters( 'default_excerpt', $post_excerpt, $post ); + $post->post_name = ''; + + return $post; +} + +/** + * Get the default page information to use. + * + * @since 2.5.0 + * + * @return object stdClass object containing all the default post data as attributes + */ +function get_default_page_to_edit() { + $page = get_default_post_to_edit(); + $page->post_type = 'page'; + return $page; +} + +/** + * Get an existing post and format it for editing. + * + * @since 2.0.0 + * + * @param unknown_type $id + * @return unknown + */ +function get_post_to_edit( $id ) { + + $post = get_post( $id, OBJECT, 'edit' ); + + if ( $post->post_type == 'page' ) + $post->page_template = get_post_meta( $id, '_wp_page_template', true ); + + return $post; +} + +/** + * Determine if a post exists based on title, content, and date + * + * @since 2.0.0 + * + * @param string $title Post title + * @param string $content Optional post content + * @param string $date Optional post date + * @return int Post ID if post exists, 0 otherwise. + */ +function post_exists($title, $content = '', $date = '') { + global $wpdb; + + $post_title = stripslashes( sanitize_post_field( 'post_title', $title, 0, 'db' ) ); + $post_content = stripslashes( sanitize_post_field( 'post_content', $content, 0, 'db' ) ); + $post_date = stripslashes( sanitize_post_field( 'post_date', $date, 0, 'db' ) ); + + $query = "SELECT ID FROM $wpdb->posts WHERE 1=1"; + $args = array(); + + if ( !empty ( $date ) ) { + $query .= ' AND post_date = %s'; + $args[] = $post_date; + } + + if ( !empty ( $title ) ) { + $query .= ' AND post_title = %s'; + $args[] = $post_title; + } + + if ( !empty ( $content ) ) { + $query .= 'AND post_content = %s'; + $args[] = $post_content; + } + + if ( !empty ( $args ) ) + return $wpdb->get_var( $wpdb->prepare($query, $args) ); + + return 0; +} + +/** + * Creates a new post from the "Write Post" form using $_POST information. + * + * @since 2.1.0 + * + * @return unknown + */ +function wp_write_post() { + global $user_ID; + + + if ( isset($_POST['post_type']) ) + $ptype = get_post_type_object($_POST['post_type']); + else + $ptype = get_post_type_object('post'); + + if ( !current_user_can( $ptype->cap->edit_posts ) ) { + if ( 'page' == $ptype->name ) + return new WP_Error( 'edit_pages', __( 'You are not allowed to create pages on this site.' ) ); + else + return new WP_Error( 'edit_posts', __( 'You are not allowed to create posts or drafts on this site.' ) ); + } + + $_POST['post_mime_type'] = ''; + + // Clear out any data in internal vars. + unset( $_POST['filter'] ); + + // Check for autosave collisions + // Does this need to be updated? ~ Mark + $temp_id = false; + if ( isset($_POST['temp_ID']) ) { + $temp_id = (int) $_POST['temp_ID']; + if ( !$draft_ids = get_user_option( 'autosave_draft_ids' ) ) + $draft_ids = array(); + foreach ( $draft_ids as $temp => $real ) + if ( time() + $temp > 86400 ) // 1 day: $temp is equal to -1 * time( then ) + unset($draft_ids[$temp]); + + if ( isset($draft_ids[$temp_id]) ) { // Edit, don't write + $_POST['post_ID'] = $draft_ids[$temp_id]; + unset($_POST['temp_ID']); + update_user_option( $user_ID, 'autosave_draft_ids', $draft_ids ); + return edit_post(); + } + } + + // Edit don't write if we have a post id. + if ( isset( $_POST['ID'] ) ) { + $_POST['post_ID'] = $_POST['ID']; + unset ( $_POST['ID'] ); + } + if ( isset( $_POST['post_ID'] ) ) { + return edit_post(); + } + + $translated = _wp_translate_postdata( false ); + if ( is_wp_error($translated) ) + return $translated; + + if ( isset($_POST['visibility']) ) { + switch ( $_POST['visibility'] ) { + case 'public' : + $_POST['post_password'] = ''; + break; + case 'password' : + unset( $_POST['sticky'] ); + break; + case 'private' : + $_POST['post_status'] = 'private'; + $_POST['post_password'] = ''; + unset( $_POST['sticky'] ); + break; + } + } + + // Create the post. + $post_ID = wp_insert_post( $_POST ); + if ( is_wp_error( $post_ID ) ) + return $post_ID; + + if ( empty($post_ID) ) + return 0; + + add_meta( $post_ID ); + + add_post_meta( $post_ID, '_edit_last', $GLOBALS['current_user']->ID ); + + // Reunite any orphaned attachments with their parent + // Does this need to be udpated? ~ Mark + if ( !$draft_ids = get_user_option( 'autosave_draft_ids' ) ) + $draft_ids = array(); + if ( $draft_temp_id = (int) array_search( $post_ID, $draft_ids ) ) + _relocate_children( $draft_temp_id, $post_ID ); + if ( $temp_id && $temp_id != $draft_temp_id ) + _relocate_children( $temp_id, $post_ID ); + + // Update autosave collision detection + if ( $temp_id ) { + $draft_ids[$temp_id] = $post_ID; + update_user_option( $user_ID, 'autosave_draft_ids', $draft_ids ); + } + + // Now that we have an ID we can fix any attachment anchor hrefs + _fix_attachment_links( $post_ID ); + + wp_set_post_lock( $post_ID, $GLOBALS['current_user']->ID ); + + return $post_ID; +} + +/** + * Calls wp_write_post() and handles the errors. + * + * @since 2.0.0 + * + * @return unknown + */ +function write_post() { + $result = wp_write_post(); + if ( is_wp_error( $result ) ) + wp_die( $result->get_error_message() ); + else + return $result; +} + +// +// Post Meta +// + +/** + * {@internal Missing Short Description}} + * + * @since 1.2.0 + * + * @param unknown_type $post_ID + * @return unknown + */ +function add_meta( $post_ID ) { + global $wpdb; + $post_ID = (int) $post_ID; + + $metakeyselect = isset($_POST['metakeyselect']) ? stripslashes( trim( $_POST['metakeyselect'] ) ) : ''; + $metakeyinput = isset($_POST['metakeyinput']) ? stripslashes( trim( $_POST['metakeyinput'] ) ) : ''; + $metavalue = isset($_POST['metavalue']) ? maybe_serialize( stripslashes_deep( $_POST['metavalue'] ) ) : ''; + if ( is_string($metavalue) ) + $metavalue = trim( $metavalue ); + + if ( ('0' === $metavalue || !empty ( $metavalue ) ) && ((('#NONE#' != $metakeyselect) && !empty ( $metakeyselect) ) || !empty ( $metakeyinput) ) ) { + // We have a key/value pair. If both the select and the + // input for the key have data, the input takes precedence: + + if ('#NONE#' != $metakeyselect) + $metakey = $metakeyselect; + + if ( $metakeyinput) + $metakey = $metakeyinput; // default + + if ( is_protected_meta( $metakey ) ) + return false; + + wp_cache_delete($post_ID, 'post_meta'); + $wpdb->insert( $wpdb->postmeta, array( 'post_id' => $post_ID, 'meta_key' => $metakey, 'meta_value' => $metavalue ) ); + $meta_id = $wpdb->insert_id; + do_action( 'added_postmeta', $meta_id, $post_ID, $metakey, $metavalue ); + + return $meta_id; + } + return false; +} // add_meta + +/** + * {@internal Missing Short Description}} + * + * @since 1.2.0 + * + * @param unknown_type $mid + * @return unknown + */ +function delete_meta( $mid ) { + global $wpdb; + $mid = (int) $mid; + + $post_id = $wpdb->get_var( $wpdb->prepare("SELECT post_id FROM $wpdb->postmeta WHERE meta_id = %d", $mid) ); + + do_action( 'delete_postmeta', $mid ); + wp_cache_delete($post_id, 'post_meta'); + $rval = $wpdb->query( $wpdb->prepare("DELETE FROM $wpdb->postmeta WHERE meta_id = %d", $mid) ); + do_action( 'deleted_postmeta', $mid ); + + return $rval; +} + +/** + * Get a list of previously defined keys. + * + * @since 1.2.0 + * + * @return unknown + */ +function get_meta_keys() { + global $wpdb; + + $keys = $wpdb->get_col( " + SELECT meta_key + FROM $wpdb->postmeta + GROUP BY meta_key + ORDER BY meta_key" ); + + return $keys; +} + +/** + * {@internal Missing Short Description}} + * + * @since 2.1.0 + * + * @param unknown_type $mid + * @return unknown + */ +function get_post_meta_by_id( $mid ) { + global $wpdb; + $mid = (int) $mid; + + $meta = $wpdb->get_row( $wpdb->prepare("SELECT * FROM $wpdb->postmeta WHERE meta_id = %d", $mid) ); + if ( empty($meta) ) + return false; + if ( is_serialized_string( $meta->meta_value ) ) + $meta->meta_value = maybe_unserialize( $meta->meta_value ); + return $meta; +} + +/** + * {@internal Missing Short Description}} + * + * Some postmeta stuff. + * + * @since 1.2.0 + * + * @param unknown_type $postid + * @return unknown + */ +function has_meta( $postid ) { + global $wpdb; + + return $wpdb->get_results( $wpdb->prepare("SELECT meta_key, meta_value, meta_id, post_id + FROM $wpdb->postmeta WHERE post_id = %d + ORDER BY meta_key,meta_id", $postid), ARRAY_A ); + +} + +/** + * {@internal Missing Short Description}} + * + * @since 1.2.0 + * + * @param unknown_type $meta_id + * @param unknown_type $meta_key Expect Slashed + * @param unknown_type $meta_value Expect Slashed + * @return unknown + */ +function update_meta( $meta_id, $meta_key, $meta_value ) { + global $wpdb; + + $meta_key = stripslashes($meta_key); + + if ( is_protected_meta( $meta_key ) ) + return false; + + if ( '' === trim( $meta_value ) ) + return false; + + $post_id = $wpdb->get_var( $wpdb->prepare("SELECT post_id FROM $wpdb->postmeta WHERE meta_id = %d", $meta_id) ); + + $meta_value = maybe_serialize( stripslashes_deep( $meta_value ) ); + $meta_id = (int) $meta_id; + + $data = compact( 'meta_key', 'meta_value' ); + $where = compact( 'meta_id' ); + + do_action( 'update_postmeta', $meta_id, $post_id, $meta_key, $meta_value ); + $rval = $wpdb->update( $wpdb->postmeta, $data, $where ); + wp_cache_delete($post_id, 'post_meta'); + do_action( 'updated_postmeta', $meta_id, $post_id, $meta_key, $meta_value ); + + return $rval; +} + +// +// Private +// + +/** + * Replace hrefs of attachment anchors with up-to-date permalinks. + * + * @since 2.3.0 + * @access private + * + * @param unknown_type $post_ID + * @return unknown + */ +function _fix_attachment_links( $post_ID ) { + global $_fix_attachment_link_id; + + $post = & get_post( $post_ID, ARRAY_A ); + + $search = "#]+rel=('|\")[^'\"]*attachment[^>]*>#ie"; + + // See if we have any rel="attachment" links + if ( 0 == preg_match_all( $search, $post['post_content'], $anchor_matches, PREG_PATTERN_ORDER ) ) + return; + + $i = 0; + $search = "#[\s]+rel=(\"|')(.*?)wp-att-(\d+)\\1#i"; + foreach ( $anchor_matches[0] as $anchor ) { + if ( 0 == preg_match( $search, $anchor, $id_matches ) ) + continue; + + $id = (int) $id_matches[3]; + + // While we have the attachment ID, let's adopt any orphans. + $attachment = & get_post( $id, ARRAY_A ); + if ( ! empty( $attachment) && ! is_object( get_post( $attachment['post_parent'] ) ) ) { + $attachment['post_parent'] = $post_ID; + // Escape data pulled from DB. + $attachment = add_magic_quotes( $attachment ); + wp_update_post( $attachment ); + } + + $post_search[$i] = $anchor; + $_fix_attachment_link_id = $id; + $post_replace[$i] = preg_replace_callback( "#href=(\"|')[^'\"]*\\1#", '_fix_attachment_links_replace_cb', $anchor ); + ++$i; + } + + $post['post_content'] = str_replace( $post_search, $post_replace, $post['post_content'] ); + + // Escape data pulled from DB. + $post = add_magic_quotes( $post); + + return wp_update_post( $post); +} + +function _fix_attachment_links_replace_cb($match) { + global $_fix_attachment_link_id; + return stripslashes( 'href='.$match[1] ).get_attachment_link( $_fix_attachment_link_id ).stripslashes( $match[1] ); +} + +/** + * Move child posts to a new parent. + * + * @since 2.3.0 + * @access private + * + * @param unknown_type $old_ID + * @param unknown_type $new_ID + * @return unknown + */ +function _relocate_children( $old_ID, $new_ID ) { + global $wpdb; + $old_ID = (int) $old_ID; + $new_ID = (int) $new_ID; + + $children = $wpdb->get_col( $wpdb->prepare(" + SELECT post_id + FROM $wpdb->postmeta + WHERE meta_key = '_wp_attachment_temp_parent' + AND meta_value = %d", $old_ID) ); + + foreach ( $children as $child_id ) { + $wpdb->update($wpdb->posts, array('post_parent' => $new_ID), array('ID' => $child_id) ); + delete_post_meta($child_id, '_wp_attachment_temp_parent'); + } +} + +/** + * Get all the possible statuses for a post_type + * + * @since 2.5.0 + * + * @param string $type The post_type you want the statuses for + * @return array As array of all the statuses for the supplied post type + */ +function get_available_post_statuses($type = 'post') { + $stati = wp_count_posts($type); + + return array_keys(get_object_vars($stati)); +} + +/** + * Run the wp query to fetch the posts for listing on the edit posts page + * + * @since 2.5.0 + * + * @param array|bool $q Array of query variables to use to build the query or false to use $_GET superglobal. + * @return array + */ +function wp_edit_posts_query( $q = false ) { + if ( false === $q ) + $q = $_GET; + $q['m'] = isset($q['m']) ? (int) $q['m'] : 0; + $q['cat'] = isset($q['cat']) ? (int) $q['cat'] : 0; + $post_stati = get_post_stati(); + + if ( isset($q['post_type']) && in_array( $q['post_type'], get_post_types() ) ) + $post_type = $q['post_type']; + else + $post_type = 'post'; + + $avail_post_stati = get_available_post_statuses($post_type); + + if ( isset($q['post_status']) && in_array( $q['post_status'], $post_stati ) ) { + $post_status = $q['post_status']; + $perm = 'readable'; + } + + if ( isset($q['orderby']) ) + $orderby = $q['orderby']; + elseif ( isset($q['post_status']) && in_array($q['post_status'], array('pending', 'draft')) ) + $orderby = 'modified'; + + if ( isset($q['order']) ) + $order = $q['order']; + elseif ( isset($q['post_status']) && 'pending' == $q['post_status'] ) + $order = 'ASC'; + + $per_page = 'edit_' . $post_type . '_per_page'; + $posts_per_page = (int) get_user_option( $per_page ); + if ( empty( $posts_per_page ) || $posts_per_page < 1 ) + $posts_per_page = 20; + + $posts_per_page = apply_filters( $per_page, $posts_per_page ); + $posts_per_page = apply_filters( 'edit_posts_per_page', $posts_per_page, $post_type ); + + $query = compact('post_type', 'post_status', 'perm', 'order', 'orderby', 'posts_per_page'); + + // Hierarchical types require special args. + if ( is_post_type_hierarchical( $post_type ) && !isset($orderby) ) { + $query['orderby'] = 'menu_order title'; + $query['order'] = 'asc'; + $query['posts_per_page'] = -1; + $query['posts_per_archive_page'] = -1; + } + + if ( ! empty( $q['show_sticky'] ) ) + $query['post__in'] = (array) get_option( 'sticky_posts' ); + + wp( $query ); + + return $avail_post_stati; +} + +/** + * Get default post mime types + * + * @since 2.9.0 + * + * @return array + */ +function get_post_mime_types() { + $post_mime_types = array( // array( adj, noun ) + 'image' => array(__('Images'), __('Manage Images'), _n_noop('Image (%s)', 'Images (%s)')), + 'audio' => array(__('Audio'), __('Manage Audio'), _n_noop('Audio (%s)', 'Audio (%s)')), + 'video' => array(__('Video'), __('Manage Video'), _n_noop('Video (%s)', 'Video (%s)')), + ); + + return apply_filters('post_mime_types', $post_mime_types); +} + +/** + * {@internal Missing Short Description}} + * + * @since 2.5.0 + * + * @param unknown_type $type + * @return unknown + */ +function get_available_post_mime_types($type = 'attachment') { + global $wpdb; + + $types = $wpdb->get_col($wpdb->prepare("SELECT DISTINCT post_mime_type FROM $wpdb->posts WHERE post_type = %s", $type)); + return $types; +} + +/** + * {@internal Missing Short Description}} + * + * @since 2.5.0 + * + * @param unknown_type $q + * @return unknown + */ +function wp_edit_attachments_query( $q = false ) { + if ( false === $q ) + $q = $_GET; + + $q['m'] = isset( $q['m'] ) ? (int) $q['m'] : 0; + $q['cat'] = isset( $q['cat'] ) ? (int) $q['cat'] : 0; + $q['post_type'] = 'attachment'; + $post_type = get_post_type_object( 'attachment' ); + $states = 'inherit'; + if ( current_user_can( $post_type->cap->read_private_posts ) ) + $states .= ',private'; + + $q['post_status'] = isset( $q['status'] ) && 'trash' == $q['status'] ? 'trash' : $states; + $media_per_page = (int) get_user_option( 'upload_per_page' ); + if ( empty( $media_per_page ) || $media_per_page < 1 ) + $media_per_page = 20; + $q['posts_per_page'] = apply_filters( 'upload_per_page', $media_per_page ); + + $post_mime_types = get_post_mime_types(); + $avail_post_mime_types = get_available_post_mime_types('attachment'); + + if ( isset($q['post_mime_type']) && !array_intersect( (array) $q['post_mime_type'], array_keys($post_mime_types) ) ) + unset($q['post_mime_type']); + + if ( isset($q['detached']) ) + add_filter('posts_where', '_edit_attachments_query_helper'); + + wp( $q ); + + if ( isset($q['detached']) ) + remove_filter('posts_where', '_edit_attachments_query_helper'); + + return array($post_mime_types, $avail_post_mime_types); +} + +function _edit_attachments_query_helper($where) { + return $where .= ' AND post_parent < 1'; +} + +/** + * Returns the list of classes to be used by a metabox + * + * @uses get_user_option() + * @since 2.5.0 + * + * @param unknown_type $id + * @param unknown_type $page + * @return unknown + */ +function postbox_classes( $id, $page ) { + if ( isset( $_GET['edit'] ) && $_GET['edit'] == $id ) { + $classes = array( '' ); + } elseif ( $closed = get_user_option('closedpostboxes_'.$page ) ) { + if ( !is_array( $closed ) ) { + $classes = array( '' ); + } else { + $classes = in_array( $id, $closed ) ? array( 'closed' ) : array( '' ); + } + } else { + $classes = array( '' ); + } + + $classes = apply_filters( "postbox_classes_{$page}_{$id}", $classes ); + return implode( ' ', $classes ); +} + +/** + * {@internal Missing Short Description}} + * + * @since 2.5.0 + * + * @param int|object $id Post ID or post object. + * @param string $title (optional) Title + * @param string $name (optional) Name + * @return array With two entries of type string + */ +function get_sample_permalink($id, $title = null, $name = null) { + $post = &get_post($id); + if ( !$post->ID ) + return array('', ''); + + $ptype = get_post_type_object($post->post_type); + + $original_status = $post->post_status; + $original_date = $post->post_date; + $original_name = $post->post_name; + + // Hack: get_permalink would return ugly permalink for + // drafts, so we will fake, that our post is published + if ( in_array($post->post_status, array('draft', 'pending')) ) { + $post->post_status = 'publish'; + $post->post_name = sanitize_title($post->post_name ? $post->post_name : $post->post_title, $post->ID); + } + + // If the user wants to set a new name -- override the current one + // Note: if empty name is supplied -- use the title instead, see #6072 + if ( !is_null($name) ) + $post->post_name = sanitize_title($name ? $name : $title, $post->ID); + + $post->post_name = wp_unique_post_slug($post->post_name, $post->ID, $post->post_status, $post->post_type, $post->post_parent); + + $post->filter = 'sample'; + + $permalink = get_permalink($post, true); + + // Replace custom post_type Token with generic pagename token for ease of use. + $permalink = str_replace("%$post->post_type%", '%pagename%', $permalink); + + // Handle page hierarchy + if ( $ptype->hierarchical ) { + $uri = get_page_uri($post); + $uri = untrailingslashit($uri); + $uri = strrev( stristr( strrev( $uri ), '/' ) ); + $uri = untrailingslashit($uri); + $uri = apply_filters( 'editable_slug', $uri ); + if ( !empty($uri) ) + $uri .= '/'; + $permalink = str_replace('%pagename%', "{$uri}%pagename%", $permalink); + } + + $permalink = array($permalink, apply_filters('editable_slug', $post->post_name)); + $post->post_status = $original_status; + $post->post_date = $original_date; + $post->post_name = $original_name; + unset($post->filter); + + return $permalink; +} + +/** + * sample permalink html + * + * intended to be used for the inplace editor of the permalink post slug on in the post (and page?) editor. + * + * @since 2.5.0 + * + * @param int|object $id Post ID or post object. + * @param string $new_title (optional) New title + * @param string $new_slug (optional) New slug + * @return string intended to be used for the inplace editor of the permalink post slug on in the post (and page?) editor. + */ +function get_sample_permalink_html( $id, $new_title = null, $new_slug = null ) { + global $wpdb; + $post = &get_post($id); + + list($permalink, $post_name) = get_sample_permalink($post->ID, $new_title, $new_slug); + + if ( 'publish' == $post->post_status ) { + $ptype = get_post_type_object($post->post_type); + $view_post = $ptype->labels->view_item; + $title = __('Click to edit this part of the permalink'); + } else { + $title = __('Temporary permalink. Click to edit this part.'); + } + + if ( false === strpos($permalink, '%postname%') && false === strpos($permalink, '%pagename%') ) { + $return = '' . __('Permalink:') . "\n" . '' . $permalink . "\n"; + if ( '' == get_option( 'permalink_structure' ) && current_user_can( 'manage_options' ) && !( 'page' == get_option('show_on_front') && $id == get_option('page_on_front') ) ) + $return .= '' . __('Change Permalinks') . "\n"; + if ( isset($view_post) ) + $return .= "$view_post\n"; + + $return = apply_filters('get_sample_permalink_html', $return, $id, $new_title, $new_slug); + + return $return; + } + + if ( function_exists('mb_strlen') ) { + if ( mb_strlen($post_name) > 30 ) { + $post_name_abridged = mb_substr($post_name, 0, 14). '…' . mb_substr($post_name, -14); + } else { + $post_name_abridged = $post_name; + } + } else { + if ( strlen($post_name) > 30 ) { + $post_name_abridged = substr($post_name, 0, 14). '…' . substr($post_name, -14); + } else { + $post_name_abridged = $post_name; + } + } + + $post_name_html = '' . $post_name_abridged . ''; + $display_link = str_replace(array('%pagename%','%postname%'), $post_name_html, $permalink); + $view_link = str_replace(array('%pagename%','%postname%'), $post_name, $permalink); + $return = '' . __('Permalink:') . "\n"; + $return .= '' . $display_link . "\n"; + $return .= '‎'; // Fix bi-directional text display defect in RTL languages. + $return .= '' . __('Edit') . "\n"; + $return .= '' . $post_name . "\n"; + if ( isset($view_post) ) + $return .= "$view_post\n"; + + $return = apply_filters('get_sample_permalink_html', $return, $id, $new_title, $new_slug); + + return $return; +} + +/** + * Output HTML for the post thumbnail meta-box. + * + * @since 2.9.0 + * + * @param int $thumbnail_id ID of the attachment used for thumbnail + * @return string html + */ +function _wp_post_thumbnail_html( $thumbnail_id = NULL ) { + global $content_width, $_wp_additional_image_sizes, $post_ID; + $set_thumbnail_link = '

    %s

    '; + $content = sprintf($set_thumbnail_link, esc_html__( 'Set featured image' )); + + if ( $thumbnail_id && get_post( $thumbnail_id ) ) { + $old_content_width = $content_width; + $content_width = 266; + if ( !isset( $_wp_additional_image_sizes['post-thumbnail'] ) ) + $thumbnail_html = wp_get_attachment_image( $thumbnail_id, array( $content_width, $content_width ) ); + else + $thumbnail_html = wp_get_attachment_image( $thumbnail_id, 'post-thumbnail' ); + if ( !empty( $thumbnail_html ) ) { + $ajax_nonce = wp_create_nonce( "set_post_thumbnail-$post_ID" ); + $content = sprintf($set_thumbnail_link, $thumbnail_html); + $content .= '

    ' . esc_html__( 'Remove featured image' ) . '

    '; + } + $content_width = $old_content_width; + } + + return apply_filters( 'admin_post_thumbnail_html', $content ); +} + +/** + * Check to see if the post is currently being edited by another user. + * + * @since 2.5.0 + * + * @param int $post_id ID of the post to check for editing + * @return bool|int False: not locked or locked by current user. Int: user ID of user with lock. + */ +function wp_check_post_lock( $post_id ) { + if ( !$post = get_post( $post_id ) ) + return false; + + if ( !$lock = get_post_meta( $post->ID, '_edit_lock', true ) ) + return false; + + $lock = explode( ':', $lock ); + $time = $lock[0]; + $user = isset( $lock[1] ) ? $lock[1] : get_post_meta( $post->ID, '_edit_last', true ); + + $time_window = apply_filters( 'wp_check_post_lock_window', AUTOSAVE_INTERVAL * 2 ); + + if ( $time && $time > time() - $time_window && $user != get_current_user_id() ) + return $user; + return false; +} + +/** + * Mark the post as currently being edited by the current user + * + * @since 2.5.0 + * + * @param int $post_id ID of the post to being edited + * @return bool Returns false if the post doesn't exist of there is no current user + */ +function wp_set_post_lock( $post_id ) { + if ( !$post = get_post( $post_id ) ) + return false; + if ( 0 == ($user_id = get_current_user_id()) ) + return false; + + $now = time(); + $lock = "$now:$user_id"; + + update_post_meta( $post->ID, '_edit_lock', $lock ); +} + +/** + * Outputs the notice message to say that someone else is editing this post at the moment. + * + * @since 2.8.5 + * @return none + */ +function _admin_notice_post_locked() { + global $post; + + $lock = explode( ':', get_post_meta( $post->ID, '_edit_lock', true ) ); + $user = isset( $lock[1] ) ? $lock[1] : get_post_meta( $post->ID, '_edit_last', true ); + $last_user = get_userdata( $user ); + $last_user_name = $last_user ? $last_user->display_name : __('Somebody'); + + switch ($post->post_type) { + case 'post': + $message = __( 'Warning: %s is currently editing this post' ); + break; + case 'page': + $message = __( 'Warning: %s is currently editing this page' ); + break; + default: + $message = __( 'Warning: %s is currently editing this.' ); + } + + $message = sprintf( $message, esc_html( $last_user_name ) ); + echo "

    $message

    "; +} + +/** + * Creates autosave data for the specified post from $_POST data. + * + * @package WordPress + * @subpackage Post_Revisions + * @since 2.6.0 + * + * @uses _wp_translate_postdata() + * @uses _wp_post_revision_fields() + * + * @return unknown + */ +function wp_create_post_autosave( $post_id ) { + $translated = _wp_translate_postdata( true ); + if ( is_wp_error( $translated ) ) + return $translated; + + // Only store one autosave. If there is already an autosave, overwrite it. + if ( $old_autosave = wp_get_post_autosave( $post_id ) ) { + $new_autosave = _wp_post_revision_fields( $_POST, true ); + $new_autosave['ID'] = $old_autosave->ID; + $new_autosave['post_author'] = get_current_user_id(); + return wp_update_post( $new_autosave ); + } + + // _wp_put_post_revision() expects unescaped. + $_POST = stripslashes_deep($_POST); + + // Otherwise create the new autosave as a special post revision + return _wp_put_post_revision( $_POST, true ); +} + +/** + * Save draft or manually autosave for showing preview. + * + * @package WordPress + * @since 2.7.0 + * + * @uses wp_write_post() + * @uses edit_post() + * @uses get_post() + * @uses current_user_can() + * @uses wp_create_post_autosave() + * + * @return str URL to redirect to show the preview + */ +function post_preview() { + + $post_ID = (int) $_POST['post_ID']; + $status = get_post_status( $post_ID ); + if ( 'auto-draft' == $status ) + wp_die( __('Preview not available. Please save as a draft first.') ); + + if ( isset($_POST['catslist']) ) + $_POST['post_category'] = explode(",", $_POST['catslist']); + + if ( isset($_POST['tags_input']) ) + $_POST['tags_input'] = explode(",", $_POST['tags_input']); + + if ( $_POST['post_type'] == 'page' || empty($_POST['post_category']) ) + unset($_POST['post_category']); + + $_POST['ID'] = $post_ID; + $post = get_post($post_ID); + + if ( 'page' == $post->post_type ) { + if ( !current_user_can('edit_page', $post_ID) ) + wp_die(__('You are not allowed to edit this page.')); + } else { + if ( !current_user_can('edit_post', $post_ID) ) + wp_die(__('You are not allowed to edit this post.')); + } + + if ( 'draft' == $post->post_status ) { + $id = edit_post(); + } else { // Non drafts are not overwritten. The autosave is stored in a special post revision. + $id = wp_create_post_autosave( $post->ID ); + if ( ! is_wp_error($id) ) + $id = $post->ID; + } + + if ( is_wp_error($id) ) + wp_die( $id->get_error_message() ); + + if ( $_POST['post_status'] == 'draft' ) { + $url = add_query_arg( 'preview', 'true', get_permalink($id) ); + } else { + $nonce = wp_create_nonce('post_preview_' . $id); + $url = add_query_arg( array( 'preview' => 'true', 'preview_id' => $id, 'preview_nonce' => $nonce ), get_permalink($id) ); + } + + return $url; +} + +/** + * Adds the TinyMCE editor used on the Write and Edit screens. + * + * @package WordPress + * @since 2.7.0 + * + * TinyMCE is loaded separately from other Javascript by using wp-tinymce.php. It outputs concatenated + * and optionaly pre-compressed version of the core and all default plugins. Additional plugins are loaded + * directly by TinyMCE using non-blocking method. Custom plugins can be refreshed by adding a query string + * to the URL when queueing them with the mce_external_plugins filter. + * + * @param bool $teeny optional Output a trimmed down version used in Press This. + * @param mixed $settings optional An array that can add to or overwrite the default TinyMCE settings. + */ +function wp_tiny_mce( $teeny = false, $settings = false ) { + global $concatenate_scripts, $compress_scripts, $tinymce_version, $editor_styles; + + if ( ! user_can_richedit() ) + return; + + $baseurl = includes_url('js/tinymce'); + + $mce_locale = ( '' == get_locale() ) ? 'en' : strtolower( substr(get_locale(), 0, 2) ); // only ISO 639-1 + + /* + The following filter allows localization scripts to change the languages displayed in the spellchecker's drop-down menu. + By default it uses Google's spellchecker API, but can be configured to use PSpell/ASpell if installed on the server. + The + sign marks the default language. More information: + http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/spellchecker + */ + $mce_spellchecker_languages = apply_filters('mce_spellchecker_languages', '+English=en,Danish=da,Dutch=nl,Finnish=fi,French=fr,German=de,Italian=it,Polish=pl,Portuguese=pt,Spanish=es,Swedish=sv'); + + if ( $teeny ) { + $plugins = apply_filters( 'teeny_mce_plugins', array('inlinepopups', 'fullscreen', 'wordpress', 'wplink', 'wpdialogs') ); + $ext_plugins = ''; + } else { + $plugins = array( 'inlinepopups', 'spellchecker', 'tabfocus', 'paste', 'media', 'wordpress', 'wpfullscreen', 'wpeditimage', 'wpgallery', 'wplink', 'wpdialogs' ); + + /* + The following filter takes an associative array of external plugins for TinyMCE in the form 'plugin_name' => 'url'. + It adds the plugin's name to TinyMCE's plugins init and the call to PluginManager to load the plugin. + The url should be absolute and should include the js file name to be loaded. Example: + array( 'myplugin' => 'http://my-site.com/wp-content/plugins/myfolder/mce_plugin.js' ) + If the plugin uses a button, it should be added with one of the "$mce_buttons" filters. + */ + $mce_external_plugins = apply_filters('mce_external_plugins', array()); + + $ext_plugins = ''; + if ( ! empty($mce_external_plugins) ) { + + /* + The following filter loads external language files for TinyMCE plugins. + It 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 + /tinymce/langs/wp-langs.php and should define a variable $strings that + holds all translated strings. + When this filter is not used, the function will try to load {mce_locale}.js. + If that is not found, en.js will be tried next. + */ + $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 ( is_ssl() ) $url = str_replace('http://', 'https://', $url); + + $plugins[] = '-' . $name; + + $plugurl = dirname($url); + $strings = $str1 = $str2 = ''; + if ( ! in_array($name, $loaded_langs) ) { + $path = str_replace( WP_PLUGIN_URL, '', $plugurl ); + $path = WP_PLUGIN_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"; + } + } + } + + if ( $teeny ) { + $mce_buttons = apply_filters( 'teeny_mce_buttons', array('bold, italic, underline, blockquote, separator, strikethrough, bullist, numlist,justifyleft, justifycenter, justifyright, undo, redo, link, unlink, fullscreen') ); + $mce_buttons = implode($mce_buttons, ','); + $mce_buttons_2 = $mce_buttons_3 = $mce_buttons_4 = ''; + } else { + $mce_buttons = apply_filters('mce_buttons', array('bold', 'italic', 'strikethrough', '|', 'bullist', 'numlist', 'blockquote', '|', 'justifyleft', 'justifycenter', 'justifyright', '|', 'link', 'unlink', 'wp_more', '|', 'spellchecker', 'fullscreen', 'wp_adv' )); + $mce_buttons = implode($mce_buttons, ','); + + $mce_buttons_2 = array( 'formatselect', 'underline', 'justifyfull', 'forecolor', '|', 'pastetext', 'pasteword', 'removeformat', '|', 'charmap', '|', 'outdent', 'indent', '|', 'undo', 'redo', 'wp_help' ); + $mce_buttons_2 = apply_filters('mce_buttons_2', $mce_buttons_2); + $mce_buttons_2 = implode($mce_buttons_2, ','); + + $mce_buttons_3 = apply_filters('mce_buttons_3', array()); + $mce_buttons_3 = implode($mce_buttons_3, ','); + + $mce_buttons_4 = apply_filters('mce_buttons_4', array()); + $mce_buttons_4 = implode($mce_buttons_4, ','); + } + $no_captions = (bool) apply_filters( 'disable_captions', '' ); + + // TinyMCE init settings + $initArray = array ( + 'mode' => 'specific_textareas', + 'editor_selector' => 'theEditor', + 'width' => '100%', + 'theme' => 'advanced', + 'skin' => 'wp_theme', + 'theme_advanced_buttons1' => $mce_buttons, + 'theme_advanced_buttons2' => $mce_buttons_2, + 'theme_advanced_buttons3' => $mce_buttons_3, + 'theme_advanced_buttons4' => $mce_buttons_4, + 'language' => $mce_locale, + 'spellchecker_languages' => $mce_spellchecker_languages, + 'theme_advanced_toolbar_location' => 'top', + 'theme_advanced_toolbar_align' => 'left', + 'theme_advanced_statusbar_location' => 'bottom', + 'theme_advanced_resizing' => true, + 'theme_advanced_resize_horizontal' => false, + 'dialog_type' => 'modal', + 'formats' => "{ + alignleft : [ + {selector : 'p,h1,h2,h3,h4,h5,h6,td,th,div,ul,ol,li', styles : {textAlign : 'left'}}, + {selector : 'img,table', classes : 'alignleft'} + ], + aligncenter : [ + {selector : 'p,h1,h2,h3,h4,h5,h6,td,th,div,ul,ol,li', styles : {textAlign : 'center'}}, + {selector : 'img,table', classes : 'aligncenter'} + ], + alignright : [ + {selector : 'p,h1,h2,h3,h4,h5,h6,td,th,div,ul,ol,li', styles : {textAlign : 'right'}}, + {selector : 'img,table', classes : 'alignright'} + ], + strikethrough : {inline : 'del'} + }", + 'relative_urls' => false, + 'remove_script_host' => false, + 'convert_urls' => false, + 'apply_source_formatting' => false, + 'remove_linebreaks' => true, + 'gecko_spellcheck' => true, + 'keep_styles' => false, + 'entities' => '38,amp,60,lt,62,gt', + 'accessibility_focus' => true, + 'tabfocus_elements' => 'major-publishing-actions', + 'media_strict' => false, + 'paste_remove_styles' => true, + 'paste_remove_spans' => true, + 'paste_strip_class_attributes' => 'all', + 'paste_text_use_dialog' => true, + 'extended_valid_elements' => 'article[*],aside[*],audio[*],canvas[*],command[*],datalist[*],details[*],embed[*],figcaption[*],figure[*],footer[*],header[*],hgroup[*],keygen[*],mark[*],meter[*],nav[*],output[*],progress[*],section[*],source[*],summary,time[*],video[*],wbr', + 'wpeditimage_disable_captions' => $no_captions, + 'wp_fullscreen_content_css' => "$baseurl/plugins/wpfullscreen/css/wp-fullscreen.css", + 'plugins' => implode( ',', $plugins ), + ); + + if ( ! empty( $editor_styles ) && is_array( $editor_styles ) ) { + $mce_css = array(); + $style_uri = get_stylesheet_directory_uri(); + if ( ! is_child_theme() ) { + foreach ( $editor_styles as $file ) + $mce_css[] = "$style_uri/$file"; + } else { + $style_dir = get_stylesheet_directory(); + $template_uri = get_template_directory_uri(); + $template_dir = get_template_directory(); + foreach ( $editor_styles as $file ) { + if ( file_exists( "$template_dir/$file" ) ) + $mce_css[] = "$template_uri/$file"; + if ( file_exists( "$style_dir/$file" ) ) + $mce_css[] = "$style_uri/$file"; + } + } + $mce_css = implode( ',', $mce_css ); + } else { + $mce_css = ''; + } + + $mce_css = trim( apply_filters( 'mce_css', $mce_css ), ' ,' ); + + if ( ! empty($mce_css) ) + $initArray['content_css'] = $mce_css; + + if ( is_array($settings) ) + $initArray = array_merge($initArray, $settings); + + // For people who really REALLY know what they're doing with TinyMCE + // You can modify initArray to add, remove, change elements of the config before tinyMCE.init + // Setting "valid_elements", "invalid_elements" and "extended_valid_elements" can be done through "tiny_mce_before_init". + // Best is to use the default cleanup by not specifying valid_elements, as TinyMCE contains full set of XHTML 1.0. + if ( $teeny ) { + $initArray = apply_filters('teeny_mce_before_init', $initArray); + } else { + $initArray = apply_filters('tiny_mce_before_init', $initArray); + } + + if ( empty($initArray['theme_advanced_buttons3']) && !empty($initArray['theme_advanced_buttons4']) ) { + $initArray['theme_advanced_buttons3'] = $initArray['theme_advanced_buttons4']; + $initArray['theme_advanced_buttons4'] = ''; + } + + if ( ! isset($concatenate_scripts) ) + script_concat_settings(); + + $language = $initArray['language']; + + $compressed = $compress_scripts && $concatenate_scripts && isset($_SERVER['HTTP_ACCEPT_ENCODING']) + && false !== stripos($_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip'); + + /** + * 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 = apply_filters('tiny_mce_version', ''); + $version = 'ver=' . $tinymce_version . $version; + + if ( 'en' != $language ) + include_once(ABSPATH . WPINC . '/js/tinymce/langs/wp-langs.php'); + + $mce_options = ''; + foreach ( $initArray as $k => $v ) { + if ( is_bool($v) ) { + $val = $v ? 'true' : 'false'; + $mce_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) ) ) { + $mce_options .= $k . ':' . $v . ', '; + continue; + } + + $mce_options .= $k . ':"' . $v . '", '; + } + + $mce_options = rtrim( trim($mce_options), '\n\r,' ); + + do_action('before_wp_tiny_mce', $initArray); ?> + + + +\n"; + else + echo "\n"; + + if ( 'en' != $language && isset($lang) ) + echo "\n"; + else + echo "\n"; +?> + + +
    'wpdialogs,wplink,wpfullscreen' ) ); + + if ( !user_can_richedit() ) { + wp_enqueue_style( 'tinymce-buttons', includes_url('js/tinymce/themes/advanced/skins/wp_theme/ui.css'), array(), $tinymce_version ); + wp_print_styles('tinymce-buttons'); + } +} + +function wp_print_editor_js() { + wp_print_scripts('editor'); +} + +function wp_fullscreen_html() { + global $content_width, $post; + + $width = isset($content_width) && 800 > $content_width ? $content_width : 800; + $width = $width + 10; // compensate for the padding + $dfw_width = get_user_setting( 'dfw_width', $width ); + $save = isset($post->post_status) && $post->post_status == 'publish' ? __('Update') : __('Save'); +?> +
    +
    +
    +
    +
    + +
    + + +
    + +
    + array( 'title' => __('Bold (Ctrl + B)'), 'onclick' => 'fullscreen.b();', 'both' => false ), + 'italic' => array( 'title' => __('Italic (Ctrl + I)'), 'onclick' => 'fullscreen.i();', 'both' => false ), + '0' => 'separator', + 'bullist' => array( 'title' => __('Unordered list (Alt + Shift + U)'), 'onclick' => 'fullscreen.ul();', 'both' => false ), + 'numlist' => array( 'title' => __('Ordered list (Alt + Shift + O)'), 'onclick' => 'fullscreen.ol();', 'both' => false ), + '1' => 'separator', + 'blockquote' => array( 'title' => __('Blockquote (Alt+Shift+Q)'), 'onclick' => 'fullscreen.blockquote();', 'both' => false ), + 'image' => array( 'title' => __('Insert/edit image (Alt + Shift + M)'), 'onclick' => "jQuery('#add_{$media_link_type}').click();", 'both' => true ), + '2' => 'separator', + 'link' => array( 'title' => __('Insert/edit link (Alt + Shift + A)'), 'onclick' => 'fullscreen.link();', 'both' => true ), + 'unlink' => array( 'title' => __('Unlink (Alt + Shift + S)'), 'onclick' => 'fullscreen.unlink();', 'both' => false ), + '3' => 'separator', + 'help' => array( 'title' => __('Help (Alt + Shift + H)'), 'onclick' => 'fullscreen.help();', 'both' => false ) + ); + + $buttons = apply_filters( 'wp_fullscreen_buttons', $buttons ); + + foreach ( $buttons as $button => $args ) { + if ( 'separator' == $args ) { ?> +
    + + + class="wp-fullscreen-both"> + + + +
    + + +
    + +
    + post_status == 'publish' ) _e('Updated.'); else _e('Saved.'); ?> + + +
    + +
    +
    +
    + +
    + + + +
    + +
    + +
    +
    0' ); ?>
    +
    +
    +
    + + +
    +
    +charset) ) + $charset_collate = "DEFAULT CHARACTER SET $wpdb->charset"; +if ( ! empty($wpdb->collate) ) + $charset_collate .= " COLLATE $wpdb->collate"; + +/** Create WordPress database tables SQL */ +$wp_queries = "CREATE TABLE $wpdb->terms ( + term_id bigint(20) unsigned NOT NULL auto_increment, + name varchar(200) NOT NULL default '', + slug varchar(200) NOT NULL default '', + term_group bigint(10) NOT NULL default 0, + PRIMARY KEY (term_id), + UNIQUE KEY slug (slug), + KEY name (name) +) $charset_collate; +CREATE TABLE $wpdb->term_taxonomy ( + term_taxonomy_id bigint(20) unsigned NOT NULL auto_increment, + term_id bigint(20) unsigned NOT NULL default 0, + taxonomy varchar(32) NOT NULL default '', + description longtext NOT NULL, + parent bigint(20) unsigned NOT NULL default 0, + count bigint(20) NOT NULL default 0, + PRIMARY KEY (term_taxonomy_id), + UNIQUE KEY term_id_taxonomy (term_id,taxonomy), + KEY taxonomy (taxonomy) +) $charset_collate; +CREATE TABLE $wpdb->term_relationships ( + object_id bigint(20) unsigned NOT NULL default 0, + term_taxonomy_id bigint(20) unsigned NOT NULL default 0, + term_order int(11) NOT NULL default 0, + PRIMARY KEY (object_id,term_taxonomy_id), + KEY term_taxonomy_id (term_taxonomy_id) +) $charset_collate; +CREATE TABLE $wpdb->commentmeta ( + meta_id bigint(20) unsigned NOT NULL auto_increment, + comment_id bigint(20) unsigned NOT NULL default '0', + meta_key varchar(255) default NULL, + meta_value longtext, + PRIMARY KEY (meta_id), + KEY comment_id (comment_id), + KEY meta_key (meta_key) +) $charset_collate; +CREATE TABLE $wpdb->comments ( + comment_ID bigint(20) unsigned NOT NULL auto_increment, + comment_post_ID bigint(20) unsigned NOT NULL default '0', + comment_author tinytext NOT NULL, + comment_author_email varchar(100) NOT NULL default '', + comment_author_url varchar(200) NOT NULL default '', + comment_author_IP varchar(100) NOT NULL default '', + comment_date datetime NOT NULL default '0000-00-00 00:00:00', + comment_date_gmt datetime NOT NULL default '0000-00-00 00:00:00', + comment_content text NOT NULL, + comment_karma int(11) NOT NULL default '0', + comment_approved varchar(20) NOT NULL default '1', + comment_agent varchar(255) NOT NULL default '', + comment_type varchar(20) NOT NULL default '', + comment_parent bigint(20) unsigned NOT NULL default '0', + user_id bigint(20) unsigned NOT NULL default '0', + PRIMARY KEY (comment_ID), + KEY comment_approved (comment_approved), + KEY comment_post_ID (comment_post_ID), + KEY comment_approved_date_gmt (comment_approved,comment_date_gmt), + KEY comment_date_gmt (comment_date_gmt), + KEY comment_parent (comment_parent) +) $charset_collate; +CREATE TABLE $wpdb->links ( + link_id bigint(20) unsigned NOT NULL auto_increment, + link_url varchar(255) NOT NULL default '', + link_name varchar(255) NOT NULL default '', + link_image varchar(255) NOT NULL default '', + link_target varchar(25) NOT NULL default '', + link_description varchar(255) NOT NULL default '', + link_visible varchar(20) NOT NULL default 'Y', + link_owner bigint(20) unsigned NOT NULL default '1', + link_rating int(11) NOT NULL default '0', + link_updated datetime NOT NULL default '0000-00-00 00:00:00', + link_rel varchar(255) NOT NULL default '', + link_notes mediumtext NOT NULL, + link_rss varchar(255) NOT NULL default '', + PRIMARY KEY (link_id), + KEY link_visible (link_visible) +) $charset_collate; +CREATE TABLE $wpdb->options ( + option_id bigint(20) unsigned NOT NULL auto_increment, + blog_id int(11) NOT NULL default '0', + option_name varchar(64) NOT NULL default '', + option_value longtext NOT NULL, + autoload varchar(20) NOT NULL default 'yes', + PRIMARY KEY (option_id), + UNIQUE KEY option_name (option_name) +) $charset_collate; +CREATE TABLE $wpdb->postmeta ( + meta_id bigint(20) unsigned NOT NULL auto_increment, + post_id bigint(20) unsigned NOT NULL default '0', + meta_key varchar(255) default NULL, + meta_value longtext, + PRIMARY KEY (meta_id), + KEY post_id (post_id), + KEY meta_key (meta_key) +) $charset_collate; +CREATE TABLE $wpdb->posts ( + ID bigint(20) unsigned NOT NULL auto_increment, + post_author bigint(20) unsigned NOT NULL default '0', + post_date datetime NOT NULL default '0000-00-00 00:00:00', + post_date_gmt datetime NOT NULL default '0000-00-00 00:00:00', + post_content longtext NOT NULL, + post_title text NOT NULL, + post_excerpt text NOT NULL, + post_status varchar(20) NOT NULL default 'publish', + comment_status varchar(20) NOT NULL default 'open', + ping_status varchar(20) NOT NULL default 'open', + post_password varchar(20) NOT NULL default '', + post_name varchar(200) NOT NULL default '', + to_ping text NOT NULL, + pinged text NOT NULL, + post_modified datetime NOT NULL default '0000-00-00 00:00:00', + post_modified_gmt datetime NOT NULL default '0000-00-00 00:00:00', + post_content_filtered text NOT NULL, + post_parent bigint(20) unsigned NOT NULL default '0', + guid varchar(255) NOT NULL default '', + menu_order int(11) NOT NULL default '0', + post_type varchar(20) NOT NULL default 'post', + post_mime_type varchar(100) NOT NULL default '', + comment_count bigint(20) NOT NULL default '0', + PRIMARY KEY (ID), + KEY post_name (post_name), + KEY type_status_date (post_type,post_status,post_date,ID), + KEY post_parent (post_parent), + KEY post_author (post_author) +) $charset_collate; +CREATE TABLE $wpdb->users ( + ID bigint(20) unsigned NOT NULL auto_increment, + user_login varchar(60) NOT NULL default '', + user_pass varchar(64) NOT NULL default '', + user_nicename varchar(50) NOT NULL default '', + user_email varchar(100) NOT NULL default '', + user_url varchar(100) NOT NULL default '', + user_registered datetime NOT NULL default '0000-00-00 00:00:00', + user_activation_key varchar(60) NOT NULL default '', + user_status int(11) NOT NULL default '0', + display_name varchar(250) NOT NULL default '', + PRIMARY KEY (ID), + KEY user_login_key (user_login), + KEY user_nicename (user_nicename) +) $charset_collate; +CREATE TABLE $wpdb->usermeta ( + umeta_id bigint(20) unsigned NOT NULL auto_increment, + user_id bigint(20) unsigned NOT NULL default '0', + meta_key varchar(255) default NULL, + meta_value longtext, + PRIMARY KEY (umeta_id), + KEY user_id (user_id), + KEY meta_key (meta_key) +) $charset_collate;"; + +/** + * Create WordPress options and set the default values. + * + * @since 1.5.0 + * @uses $wpdb + * @uses $wp_db_version + */ +function populate_options() { + global $wpdb, $wp_db_version, $current_site; + + $guessurl = wp_guess_url(); + + do_action('populate_options'); + + if ( ini_get('safe_mode') ) { + // Safe mode can break mkdir() so use a flat structure by default. + $uploads_use_yearmonth_folders = 0; + } else { + $uploads_use_yearmonth_folders = 1; + } + + $options = array( + 'siteurl' => $guessurl, + 'blogname' => __('My Site'), + /* translators: blog tagline */ + 'blogdescription' => __('Just another WordPress site'), + 'users_can_register' => 0, + 'admin_email' => 'you@example.com', + 'start_of_week' => 1, + 'use_balanceTags' => 0, + 'use_smilies' => 1, + 'require_name_email' => 1, + 'comments_notify' => 1, + 'posts_per_rss' => 10, + 'rss_use_excerpt' => 0, + 'mailserver_url' => 'mail.example.com', + 'mailserver_login' => 'login@example.com', + 'mailserver_pass' => 'password', + 'mailserver_port' => 110, + 'default_category' => 1, + 'default_comment_status' => 'open', + 'default_ping_status' => 'open', + 'default_pingback_flag' => 1, + 'default_post_edit_rows' => 20, + 'posts_per_page' => 10, + /* translators: default date format, see http://php.net/date */ + 'date_format' => __('F j, Y'), + /* translators: default time format, see http://php.net/date */ + 'time_format' => __('g:i a'), + /* translators: links last updated date format, see http://php.net/date */ + 'links_updated_date_format' => __('F j, Y g:i a'), + 'links_recently_updated_prepend' => '', + 'links_recently_updated_append' => '', + 'links_recently_updated_time' => 120, + 'comment_moderation' => 0, + 'moderation_notify' => 1, + 'permalink_structure' => '', + 'gzipcompression' => 0, + 'hack_file' => 0, + 'blog_charset' => 'UTF-8', + 'moderation_keys' => '', + 'active_plugins' => array(), + 'home' => $guessurl, + 'category_base' => '', + 'ping_sites' => 'http://rpc.pingomatic.com/', + 'advanced_edit' => 0, + 'comment_max_links' => 2, + 'gmt_offset' => date('Z') / 3600, + + // 1.5 + 'default_email_category' => 1, + 'recently_edited' => '', + 'template' => WP_DEFAULT_THEME, + 'stylesheet' => WP_DEFAULT_THEME, + 'comment_whitelist' => 1, + 'blacklist_keys' => '', + 'comment_registration' => 0, + 'rss_language' => 'en', + 'html_type' => 'text/html', + + // 1.5.1 + 'use_trackback' => 0, + + // 2.0 + 'default_role' => 'subscriber', + 'db_version' => $wp_db_version, + + // 2.0.1 + 'uploads_use_yearmonth_folders' => $uploads_use_yearmonth_folders, + 'upload_path' => '', + + // 2.1 + 'blog_public' => '1', + 'default_link_category' => 2, + 'show_on_front' => 'posts', + + // 2.2 + 'tag_base' => '', + + // 2.5 + 'show_avatars' => '1', + 'avatar_rating' => 'G', + 'upload_url_path' => '', + 'thumbnail_size_w' => 150, + 'thumbnail_size_h' => 150, + 'thumbnail_crop' => 1, + 'medium_size_w' => 300, + 'medium_size_h' => 300, + + // 2.6 + 'avatar_default' => 'mystery', + 'enable_app' => 0, + 'enable_xmlrpc' => 0, + + // 2.7 + 'large_size_w' => 1024, + 'large_size_h' => 1024, + 'image_default_link_type' => 'file', + 'image_default_size' => '', + 'image_default_align' => '', + 'close_comments_for_old_posts' => 0, + 'close_comments_days_old' => 14, + 'thread_comments' => 1, + 'thread_comments_depth' => 5, + 'page_comments' => 0, + 'comments_per_page' => 50, + 'default_comments_page' => 'newest', + 'comment_order' => 'asc', + 'sticky_posts' => array(), + 'widget_categories' => array(), + 'widget_text' => array(), + 'widget_rss' => array(), + + // 2.8 + 'timezone_string' => '', + + // 2.9 + 'embed_autourls' => 1, + 'embed_size_w' => '', + 'embed_size_h' => 600, + + // 3.0 + 'page_for_posts' => 0, + 'page_on_front' => 0, + + // 3.1 + 'default_post_format' => 0, + ); + + // 3.0 multisite + if ( is_multisite() ) { + /* translators: blog tagline */ + $options[ 'blogdescription' ] = sprintf(__('Just another %s site'), $current_site->site_name ); + $options[ 'permalink_structure' ] = '/%year%/%monthnum%/%day%/%postname%/'; + } + + // Set autoload to no for these options + $fat_options = array( 'moderation_keys', 'recently_edited', 'blacklist_keys' ); + + $existing_options = $wpdb->get_col("SELECT option_name FROM $wpdb->options"); + + $insert = ''; + foreach ( $options as $option => $value ) { + if ( in_array($option, $existing_options) ) + continue; + if ( in_array($option, $fat_options) ) + $autoload = 'no'; + else + $autoload = 'yes'; + + $option = $wpdb->escape($option); + if ( is_array($value) ) + $value = serialize($value); + $value = $wpdb->escape($value); + if ( !empty($insert) ) + $insert .= ', '; + $insert .= "('$option', '$value', '$autoload')"; + } + + if ( !empty($insert) ) + $wpdb->query("INSERT INTO $wpdb->options (option_name, option_value, autoload) VALUES " . $insert); + + // in case it is set, but blank, update "home" + if ( !__get_option('home') ) update_option('home', $guessurl); + + // Delete unused options + $unusedoptions = array ('blodotgsping_url', 'bodyterminator', 'emailtestonly', 'phoneemail_separator', 'smilies_directory', 'subjectprefix', 'use_bbcode', 'use_blodotgsping', 'use_phoneemail', 'use_quicktags', 'use_weblogsping', 'weblogs_cache_file', 'use_preview', 'use_htmltrans', 'smilies_directory', 'fileupload_allowedusers', 'use_phoneemail', 'default_post_status', 'default_post_category', 'archive_mode', 'time_difference', 'links_minadminlevel', 'links_use_adminlevels', 'links_rating_type', 'links_rating_char', 'links_rating_ignore_zero', 'links_rating_single_image', 'links_rating_image0', 'links_rating_image1', 'links_rating_image2', 'links_rating_image3', 'links_rating_image4', 'links_rating_image5', 'links_rating_image6', 'links_rating_image7', 'links_rating_image8', 'links_rating_image9', 'weblogs_cacheminutes', 'comment_allowed_tags', 'search_engine_friendly_urls', 'default_geourl_lat', 'default_geourl_lon', 'use_default_geourl', 'weblogs_xml_url', 'new_users_can_blog', '_wpnonce', '_wp_http_referer', 'Update', 'action', 'rich_editing', 'autosave_interval', 'deactivated_plugins', 'can_compress_scripts', 'page_uris', 'update_core', 'update_plugins', 'update_themes', 'doing_cron', 'random_seed', 'rss_excerpt_length', 'secret', 'use_linksupdate', 'default_comment_status_page', 'wporg_popular_tags', 'what_to_show'); + foreach ( $unusedoptions as $option ) + delete_option($option); + + // delete obsolete magpie stuff + $wpdb->query("DELETE FROM $wpdb->options WHERE option_name REGEXP '^rss_[0-9a-f]{32}(_ts)?$'"); +} + +/** + * Execute WordPress role creation for the various WordPress versions. + * + * @since 2.0.0 + */ +function populate_roles() { + populate_roles_160(); + populate_roles_210(); + populate_roles_230(); + populate_roles_250(); + populate_roles_260(); + populate_roles_270(); + populate_roles_280(); + populate_roles_300(); +} + +/** + * Create the roles for WordPress 2.0 + * + * @since 2.0.0 + */ +function populate_roles_160() { + // Add roles + + // Dummy gettext calls to get strings in the catalog. + /* translators: user role */ + _x('Administrator', 'User role'); + /* translators: user role */ + _x('Editor', 'User role'); + /* translators: user role */ + _x('Author', 'User role'); + /* translators: user role */ + _x('Contributor', 'User role'); + /* translators: user role */ + _x('Subscriber', 'User role'); + + add_role('administrator', 'Administrator'); + add_role('editor', 'Editor'); + add_role('author', 'Author'); + add_role('contributor', 'Contributor'); + add_role('subscriber', 'Subscriber'); + + // Add caps for Administrator role + $role =& get_role('administrator'); + $role->add_cap('switch_themes'); + $role->add_cap('edit_themes'); + $role->add_cap('activate_plugins'); + $role->add_cap('edit_plugins'); + $role->add_cap('edit_users'); + $role->add_cap('edit_files'); + $role->add_cap('manage_options'); + $role->add_cap('moderate_comments'); + $role->add_cap('manage_categories'); + $role->add_cap('manage_links'); + $role->add_cap('upload_files'); + $role->add_cap('import'); + $role->add_cap('unfiltered_html'); + $role->add_cap('edit_posts'); + $role->add_cap('edit_others_posts'); + $role->add_cap('edit_published_posts'); + $role->add_cap('publish_posts'); + $role->add_cap('edit_pages'); + $role->add_cap('read'); + $role->add_cap('level_10'); + $role->add_cap('level_9'); + $role->add_cap('level_8'); + $role->add_cap('level_7'); + $role->add_cap('level_6'); + $role->add_cap('level_5'); + $role->add_cap('level_4'); + $role->add_cap('level_3'); + $role->add_cap('level_2'); + $role->add_cap('level_1'); + $role->add_cap('level_0'); + + // Add caps for Editor role + $role =& get_role('editor'); + $role->add_cap('moderate_comments'); + $role->add_cap('manage_categories'); + $role->add_cap('manage_links'); + $role->add_cap('upload_files'); + $role->add_cap('unfiltered_html'); + $role->add_cap('edit_posts'); + $role->add_cap('edit_others_posts'); + $role->add_cap('edit_published_posts'); + $role->add_cap('publish_posts'); + $role->add_cap('edit_pages'); + $role->add_cap('read'); + $role->add_cap('level_7'); + $role->add_cap('level_6'); + $role->add_cap('level_5'); + $role->add_cap('level_4'); + $role->add_cap('level_3'); + $role->add_cap('level_2'); + $role->add_cap('level_1'); + $role->add_cap('level_0'); + + // Add caps for Author role + $role =& get_role('author'); + $role->add_cap('upload_files'); + $role->add_cap('edit_posts'); + $role->add_cap('edit_published_posts'); + $role->add_cap('publish_posts'); + $role->add_cap('read'); + $role->add_cap('level_2'); + $role->add_cap('level_1'); + $role->add_cap('level_0'); + + // Add caps for Contributor role + $role =& get_role('contributor'); + $role->add_cap('edit_posts'); + $role->add_cap('read'); + $role->add_cap('level_1'); + $role->add_cap('level_0'); + + // Add caps for Subscriber role + $role =& get_role('subscriber'); + $role->add_cap('read'); + $role->add_cap('level_0'); +} + +/** + * Create and modify WordPress roles for WordPress 2.1. + * + * @since 2.1.0 + */ +function populate_roles_210() { + $roles = array('administrator', 'editor'); + foreach ($roles as $role) { + $role =& get_role($role); + if ( empty($role) ) + continue; + + $role->add_cap('edit_others_pages'); + $role->add_cap('edit_published_pages'); + $role->add_cap('publish_pages'); + $role->add_cap('delete_pages'); + $role->add_cap('delete_others_pages'); + $role->add_cap('delete_published_pages'); + $role->add_cap('delete_posts'); + $role->add_cap('delete_others_posts'); + $role->add_cap('delete_published_posts'); + $role->add_cap('delete_private_posts'); + $role->add_cap('edit_private_posts'); + $role->add_cap('read_private_posts'); + $role->add_cap('delete_private_pages'); + $role->add_cap('edit_private_pages'); + $role->add_cap('read_private_pages'); + } + + $role =& get_role('administrator'); + if ( ! empty($role) ) { + $role->add_cap('delete_users'); + $role->add_cap('create_users'); + } + + $role =& get_role('author'); + if ( ! empty($role) ) { + $role->add_cap('delete_posts'); + $role->add_cap('delete_published_posts'); + } + + $role =& get_role('contributor'); + if ( ! empty($role) ) { + $role->add_cap('delete_posts'); + } +} + +/** + * Create and modify WordPress roles for WordPress 2.3. + * + * @since 2.3.0 + */ +function populate_roles_230() { + $role =& get_role( 'administrator' ); + + if ( !empty( $role ) ) { + $role->add_cap( 'unfiltered_upload' ); + } +} + +/** + * Create and modify WordPress roles for WordPress 2.5. + * + * @since 2.5.0 + */ +function populate_roles_250() { + $role =& get_role( 'administrator' ); + + if ( !empty( $role ) ) { + $role->add_cap( 'edit_dashboard' ); + } +} + +/** + * Create and modify WordPress roles for WordPress 2.6. + * + * @since 2.6.0 + */ +function populate_roles_260() { + $role =& get_role( 'administrator' ); + + if ( !empty( $role ) ) { + $role->add_cap( 'update_plugins' ); + $role->add_cap( 'delete_plugins' ); + } +} + +/** + * Create and modify WordPress roles for WordPress 2.7. + * + * @since 2.7.0 + */ +function populate_roles_270() { + $role =& get_role( 'administrator' ); + + if ( !empty( $role ) ) { + $role->add_cap( 'install_plugins' ); + $role->add_cap( 'update_themes' ); + } +} + +/** + * Create and modify WordPress roles for WordPress 2.8. + * + * @since 2.8.0 + */ +function populate_roles_280() { + $role =& get_role( 'administrator' ); + + if ( !empty( $role ) ) { + $role->add_cap( 'install_themes' ); + } +} + +/** + * Create and modify WordPress roles for WordPress 3.0. + * + * @since 3.0.0 + */ +function populate_roles_300() { + $role =& get_role( 'administrator' ); + + if ( !empty( $role ) ) { + $role->add_cap( 'update_core' ); + $role->add_cap( 'list_users' ); + $role->add_cap( 'remove_users' ); + $role->add_cap( 'add_users' ); + $role->add_cap( 'promote_users' ); + $role->add_cap( 'edit_theme_options' ); + $role->add_cap( 'delete_themes' ); + $role->add_cap( 'export' ); + } +} + +/** + * populate network settings + * + * @since 3.0.0 + * + * @param int $network_id id of network to populate + * @return bool|WP_Error True on success, or WP_Error on warning (with the install otherwise successful, + * so the error code must be checked) or failure. + */ +function populate_network( $network_id = 1, $domain = '', $email = '', $site_name = '', $path = '/', $subdomain_install = false ) { + global $wpdb, $current_site, $wp_db_version, $wp_rewrite; + + $errors = new WP_Error(); + if ( '' == $domain ) + $errors->add( 'empty_domain', __( 'You must provide a domain name.' ) ); + if ( '' == $site_name ) + $errors->add( 'empty_sitename', __( 'You must provide a name for your network of sites.' ) ); + + // check for network collision + if ( $network_id == $wpdb->get_var( $wpdb->prepare( "SELECT id FROM $wpdb->site WHERE id = %d", $network_id ) ) ) + $errors->add( 'siteid_exists', __( 'The network already exists.' ) ); + + $site_user = get_user_by_email( $email ); + if ( ! is_email( $email ) ) + $errors->add( 'invalid_email', __( 'You must provide a valid e-mail address.' ) ); + + if ( $errors->get_error_code() ) + return $errors; + + // set up site tables + $template = get_option( 'template' ); + $stylesheet = get_option( 'stylesheet' ); + $allowed_themes = array( $stylesheet => true ); + if ( $template != $stylesheet ) + $allowed_themes[ $template ] = true; + if ( WP_DEFAULT_THEME != $stylesheet && WP_DEFAULT_THEME != $template ) + $allowed_themes[ WP_DEFAULT_THEME ] = true; + + if ( 1 == $network_id ) { + $wpdb->insert( $wpdb->site, array( 'domain' => $domain, 'path' => $path ) ); + $network_id = $wpdb->insert_id; + } else { + $wpdb->insert( $wpdb->site, array( 'domain' => $domain, 'path' => $path, 'id' => $network_id ) ); + } + + if ( !is_multisite() ) { + $site_admins = array( $site_user->user_login ); + $users = get_users( array( 'fields' => array( 'ID', 'user_login' ) ) ); + if ( $users ) { + foreach ( $users as $user ) { + if ( is_super_admin( $user->ID ) && !in_array( $user->user_login, $site_admins ) ) + $site_admins[] = $user->user_login; + } + } + } else { + $site_admins = get_site_option( 'site_admins' ); + } + + $welcome_email = __( 'Dear User, + +Your new SITE_NAME site has been successfully set up at: +BLOG_URL + +You can log in to the administrator account with the following information: +Username: USERNAME +Password: PASSWORD +Log in Here: BLOG_URLwp-login.php + +We hope you enjoy your new site. +Thanks! + +--The Team @ SITE_NAME' ); + + $sitemeta = array( + 'site_name' => $site_name, + 'admin_email' => $site_user->user_email, + 'admin_user_id' => $site_user->ID, + 'registration' => 'none', + 'upload_filetypes' => 'jpg jpeg png gif mp3 mov avi wmv midi mid pdf', + 'blog_upload_space' => 10, + 'fileupload_maxk' => 1500, + 'site_admins' => $site_admins, + 'allowedthemes' => $allowed_themes, + 'illegal_names' => array( 'www', 'web', 'root', 'admin', 'main', 'invite', 'administrator', 'files' ), + 'wpmu_upgrade_site' => $wp_db_version, + 'welcome_email' => $welcome_email, + 'first_post' => __( 'Welcome to SITE_NAME. This is your first post. Edit or delete it, then start blogging!' ), + // @todo - network admins should have a method of editing the network siteurl (used for cookie hash) + 'siteurl' => get_option( 'siteurl' ) . '/', + 'add_new_users' => '0', + 'upload_space_check_disabled' => '0', + 'subdomain_install' => intval( $subdomain_install ), + 'global_terms_enabled' => global_terms_enabled() ? '1' : '0' + ); + if ( ! $subdomain_install ) + $sitemeta['illegal_names'][] = 'blog'; + + $insert = ''; + foreach ( $sitemeta as $meta_key => $meta_value ) { + $meta_key = $wpdb->escape( $meta_key ); + if ( is_array( $meta_value ) ) + $meta_value = serialize( $meta_value ); + $meta_value = $wpdb->escape( $meta_value ); + if ( !empty( $insert ) ) + $insert .= ', '; + $insert .= "( $network_id, '$meta_key', '$meta_value')"; + } + $wpdb->query( "INSERT INTO $wpdb->sitemeta ( site_id, meta_key, meta_value ) VALUES " . $insert ); + + $current_site->domain = $domain; + $current_site->path = $path; + $current_site->site_name = ucfirst( $domain ); + + if ( !is_multisite() ) { + $wpdb->insert( $wpdb->blogs, array( 'site_id' => $network_id, 'domain' => $domain, 'path' => $path, 'registered' => current_time( 'mysql' ) ) ); + $blog_id = $wpdb->insert_id; + update_user_meta( $site_user->ID, 'source_domain', $domain ); + update_user_meta( $site_user->ID, 'primary_blog', $blog_id ); + if ( !$upload_path = get_option( 'upload_path' ) ) { + $upload_path = substr( WP_CONTENT_DIR, strlen( ABSPATH ) ) . '/uploads'; + update_option( 'upload_path', $upload_path ); + } + update_option( 'fileupload_url', get_option( 'siteurl' ) . '/' . $upload_path ); + } + + if ( $subdomain_install ) + update_option( 'permalink_structure', '/%year%/%monthnum%/%day%/%postname%/'); + else + update_option( 'permalink_structure', '/blog/%year%/%monthnum%/%day%/%postname%/'); + + $wp_rewrite->flush_rules(); + + if ( $subdomain_install ) { + $vhost_ok = false; + $errstr = ''; + $hostname = substr( md5( time() ), 0, 6 ) . '.' . $domain; // Very random hostname! + $page = wp_remote_get( 'http://' . $hostname, array( 'timeout' => 5, 'httpversion' => '1.1' ) ); + if ( is_wp_error( $page ) ) + $errstr = $page->get_error_message(); + elseif ( 200 == wp_remote_retrieve_response_code( $page ) ) + $vhost_ok = true; + + if ( ! $vhost_ok ) { + $msg = '

    ' . __( 'Warning! Wildcard DNS may not be configured correctly!' ) . '

    '; + $msg .= '

    ' . sprintf( __( 'The installer attempted to contact a random hostname (%1$s) on your domain.' ), $hostname ); + if ( ! empty ( $errstr ) ) + $msg .= ' ' . sprintf( __( 'This resulted in an error message: %s' ), '' . $errstr . '' ); + $msg .= '

    '; + $msg .= '

    ' . __( 'To use a subdomain configuration, you must have a wildcard entry in your DNS. This usually means adding a * hostname record pointing at your web server in your DNS configuration tool.' ) . '

    '; + $msg .= '

    ' . __( 'You can still use your site but any subdomain you create may not be accessible. If you know your DNS is correct, ignore this message.' ) . '

    '; + return new WP_Error( 'no_wildcard_dns', $msg ); + } + } + + return true; +} + +?> diff --git a/src/wp-admin/includes/taxonomy.php b/src/wp-admin/includes/taxonomy.php new file mode 100644 index 0000000..12e231a --- /dev/null +++ b/src/wp-admin/includes/taxonomy.php @@ -0,0 +1,252 @@ + $cat_name, 'category_parent' => $parent) ); +} + +/** + * {@internal Missing Short Description}} + * + * @since 2.0.0 + * + * @param unknown_type $categories + * @param unknown_type $post_id + * @return unknown + */ +function wp_create_categories($categories, $post_id = '') { + $cat_ids = array (); + foreach ($categories as $category) { + if ($id = category_exists($category)) + $cat_ids[] = $id; + else + if ($id = wp_create_category($category)) + $cat_ids[] = $id; + } + + if ( $post_id ) + wp_set_post_categories($post_id, $cat_ids); + + return $cat_ids; +} + +/** + * Updates an existing Category or creates a new Category. + * + * @since 2.0.0 + * + * @param mixed $catarr See defaults below. Set 'cat_ID' to a non-zero value to update an existing category. The 'taxonomy' key was added in 3.0.0. + * @param bool $wp_error Optional, since 2.5.0. Set this to true if the caller handles WP_Error return values. + * @return int|object The ID number of the new or updated Category on success. Zero or a WP_Error on failure, depending on param $wp_error. + */ +function wp_insert_category($catarr, $wp_error = false) { + $cat_defaults = array('cat_ID' => 0, 'taxonomy' => 'category', 'cat_name' => '', 'category_description' => '', 'category_nicename' => '', 'category_parent' => ''); + $catarr = wp_parse_args($catarr, $cat_defaults); + extract($catarr, EXTR_SKIP); + + if ( trim( $cat_name ) == '' ) { + if ( ! $wp_error ) + return 0; + else + return new WP_Error( 'cat_name', __('You did not enter a category name.') ); + } + + $cat_ID = (int) $cat_ID; + + // Are we updating or creating? + if ( !empty ($cat_ID) ) + $update = true; + else + $update = false; + + $name = $cat_name; + $description = $category_description; + $slug = $category_nicename; + $parent = $category_parent; + + $parent = (int) $parent; + if ( $parent < 0 ) + $parent = 0; + + if ( empty($parent) || !category_exists( $parent ) || ($cat_ID && cat_is_ancestor_of($cat_ID, $parent) ) ) + $parent = 0; + + $args = compact('name', 'slug', 'parent', 'description'); + + if ( $update ) + $cat_ID = wp_update_term($cat_ID, $taxonomy, $args); + else + $cat_ID = wp_insert_term($cat_name, $taxonomy, $args); + + if ( is_wp_error($cat_ID) ) { + if ( $wp_error ) + return $cat_ID; + else + return 0; + } + + return $cat_ID['term_id']; +} + +/** + * Aliases wp_insert_category() with minimal args. + * + * If you want to update only some fields of an existing category, call this + * function with only the new values set inside $catarr. + * + * @since 2.0.0 + * + * @param array $catarr The 'cat_ID' value is required. All other keys are optional. + * @return int|bool The ID number of the new or updated Category on success. Zero or FALSE on failure. + */ +function wp_update_category($catarr) { + $cat_ID = (int) $catarr['cat_ID']; + + if ( isset($catarr['category_parent']) && ($cat_ID == $catarr['category_parent']) ) + return false; + + // First, get all of the original fields + $category = get_category($cat_ID, ARRAY_A); + + // Escape data pulled from DB. + $category = add_magic_quotes($category); + + // Merge old and new fields with new fields overwriting old ones. + $catarr = array_merge($category, $catarr); + + return wp_insert_category($catarr); +} + +// +// Tags +// + +/** + * {@internal Missing Short Description}} + * + * @since 2.3.0 + * + * @param unknown_type $tag_name + * @return unknown + */ +function tag_exists($tag_name) { + return term_exists($tag_name, 'post_tag'); +} + +/** + * {@internal Missing Short Description}} + * + * @since 2.3.0 + * + * @param unknown_type $tag_name + * @return unknown + */ +function wp_create_tag($tag_name) { + return wp_create_term( $tag_name, 'post_tag'); +} + +/** + * {@internal Missing Short Description}} + * + * @since 2.3.0 + * + * @param unknown_type $post_id + * @return unknown + */ +function get_tags_to_edit( $post_id, $taxonomy = 'post_tag' ) { + return get_terms_to_edit( $post_id, $taxonomy); +} + +/** + * {@internal Missing Short Description}} + * + * @since 2.8.0 + * + * @param unknown_type $post_id + * @return unknown + */ +function get_terms_to_edit( $post_id, $taxonomy = 'post_tag' ) { + $post_id = (int) $post_id; + if ( !$post_id ) + return false; + + $tags = wp_get_post_terms($post_id, $taxonomy, array()); + + if ( !$tags ) + return false; + + if ( is_wp_error($tags) ) + return $tags; + + foreach ( $tags as $tag ) + $tag_names[] = $tag->name; + $tags_to_edit = join( ',', $tag_names ); + $tags_to_edit = esc_attr( $tags_to_edit ); + $tags_to_edit = apply_filters( 'terms_to_edit', $tags_to_edit, $taxonomy ); + + return $tags_to_edit; +} + +/** + * {@internal Missing Short Description}} + * + * @since 2.8.0 + * + * @param unknown_type $tag_name + * @return unknown + */ +function wp_create_term($tag_name, $taxonomy = 'post_tag') { + if ( $id = term_exists($tag_name, $taxonomy) ) + return $id; + + return wp_insert_term($tag_name, $taxonomy); +} diff --git a/src/wp-admin/includes/template.php b/src/wp-admin/includes/template.php new file mode 100644 index 0000000..a488baf --- /dev/null +++ b/src/wp-admin/includes/template.php @@ -0,0 +1,2228 @@ + 'parent', 'id' => 'term_id'); //TODO: decouple this + + function start_lvl(&$output, $depth, $args) { + $indent = str_repeat("\t", $depth); + $output .= "$indent
      \n"; + } + + function end_lvl(&$output, $depth, $args) { + $indent = str_repeat("\t", $depth); + $output .= "$indent
    \n"; + } + + function start_el(&$output, $category, $depth, $args) { + extract($args); + if ( empty($taxonomy) ) + $taxonomy = 'category'; + + if ( $taxonomy == 'category' ) + $name = 'post_category'; + else + $name = 'tax_input['.$taxonomy.']'; + + $class = in_array( $category->term_id, $popular_cats ) ? ' class="popular-category"' : ''; + $output .= "\n
  • " . ''; + } + + function end_el(&$output, $category, $depth, $args) { + $output .= "
  • \n"; + } +} + +/** + * {@internal Missing Short Description}} + * + * @since 2.5.1 + * + * @param unknown_type $post_id + * @param unknown_type $descendants_and_self + * @param unknown_type $selected_cats + * @param unknown_type $popular_cats + */ +function wp_category_checklist( $post_id = 0, $descendants_and_self = 0, $selected_cats = false, $popular_cats = false, $walker = null, $checked_ontop = true ) { + wp_terms_checklist($post_id, + array( + 'taxonomy' => 'category', + 'descendants_and_self' => $descendants_and_self, + 'selected_cats' => $selected_cats, + 'popular_cats' => $popular_cats, + 'walker' => $walker, + 'checked_ontop' => $checked_ontop + )); +} + +/** + * Taxonomy independent version of wp_category_checklist + * + * @since 3.0.0 + * + * @param int $post_id + * @param array $args + */ +function wp_terms_checklist($post_id = 0, $args = array()) { + $defaults = array( + 'descendants_and_self' => 0, + 'selected_cats' => false, + 'popular_cats' => false, + 'walker' => null, + 'taxonomy' => 'category', + 'checked_ontop' => true + ); + extract( wp_parse_args($args, $defaults), EXTR_SKIP ); + + if ( empty($walker) || !is_a($walker, 'Walker') ) + $walker = new Walker_Category_Checklist; + + $descendants_and_self = (int) $descendants_and_self; + + $args = array('taxonomy' => $taxonomy); + + $tax = get_taxonomy($taxonomy); + $args['disabled'] = !current_user_can($tax->cap->assign_terms); + + if ( is_array( $selected_cats ) ) + $args['selected_cats'] = $selected_cats; + elseif ( $post_id ) + $args['selected_cats'] = wp_get_object_terms($post_id, $taxonomy, array_merge($args, array('fields' => 'ids'))); + else + $args['selected_cats'] = array(); + + if ( is_array( $popular_cats ) ) + $args['popular_cats'] = $popular_cats; + else + $args['popular_cats'] = get_terms( $taxonomy, array( 'fields' => 'ids', 'orderby' => 'count', 'order' => 'DESC', 'number' => 10, 'hierarchical' => false ) ); + + if ( $descendants_and_self ) { + $categories = (array) get_terms($taxonomy, array( 'child_of' => $descendants_and_self, 'hierarchical' => 0, 'hide_empty' => 0 ) ); + $self = get_term( $descendants_and_self, $taxonomy ); + array_unshift( $categories, $self ); + } else { + $categories = (array) get_terms($taxonomy, array('get' => 'all')); + } + + if ( $checked_ontop ) { + // Post process $categories rather than adding an exclude to the get_terms() query to keep the query the same across all posts (for any query cache) + $checked_categories = array(); + $keys = array_keys( $categories ); + + foreach( $keys as $k ) { + if ( in_array( $categories[$k]->term_id, $args['selected_cats'] ) ) { + $checked_categories[] = $categories[$k]; + unset( $categories[$k] ); + } + } + + // Put checked cats on top + echo call_user_func_array(array(&$walker, 'walk'), array($checked_categories, 0, $args)); + } + // Then the rest of them + echo call_user_func_array(array(&$walker, 'walk'), array($categories, 0, $args)); +} + +/** + * {@internal Missing Short Description}} + * + * @since 2.5.0 + * + * @param unknown_type $taxonomy + * @param unknown_type $default + * @param unknown_type $number + * @param unknown_type $echo + * @return unknown + */ +function wp_popular_terms_checklist( $taxonomy, $default = 0, $number = 10, $echo = true ) { + global $post_ID; + + if ( $post_ID ) + $checked_terms = wp_get_object_terms($post_ID, $taxonomy, array('fields'=>'ids')); + else + $checked_terms = array(); + + $terms = get_terms( $taxonomy, array( 'orderby' => 'count', 'order' => 'DESC', 'number' => $number, 'hierarchical' => false ) ); + + $tax = get_taxonomy($taxonomy); + if ( ! current_user_can($tax->cap->assign_terms) ) + $disabled = 'disabled="disabled"'; + else + $disabled = ''; + + $popular_ids = array(); + foreach ( (array) $terms as $term ) { + $popular_ids[] = $term->term_id; + if ( !$echo ) // hack for AJAX use + continue; + $id = "popular-$taxonomy-$term->term_id"; + $checked = in_array( $term->term_id, $checked_terms ) ? 'checked="checked"' : ''; + ?> + + + + 'name', 'hide_empty' => 0 ) ); + + if ( empty( $categories ) ) + return; + + foreach ( $categories as $category ) { + $cat_id = $category->term_id; + $name = esc_html( apply_filters( 'the_category', $category->name ) ); + $checked = in_array( $cat_id, $checked_categories ) ? ' checked="checked"' : ''; + echo '"; + } +} + +/** + * Get the column headers for a screen + * + * @since 2.7.0 + * + * @param string|object $screen The screen you want the headers for + * @return array Containing the headers in the format id => UI String + */ +function get_column_headers( $screen ) { + if ( is_string( $screen ) ) + $screen = convert_to_screen( $screen ); + + global $_wp_column_headers; + + if ( !isset( $_wp_column_headers[ $screen->id ] ) ) { + $_wp_column_headers[ $screen->id ] = apply_filters( 'manage_' . $screen->id . '_columns', array() ); + } + + return $_wp_column_headers[ $screen->id ]; +} + +/** + * Get a list of hidden columns. + * + * @since 2.7.0 + * + * @param string|object $screen The screen you want the hidden columns for + * @return array + */ +function get_hidden_columns( $screen ) { + if ( is_string( $screen ) ) + $screen = convert_to_screen( $screen ); + + return (array) get_user_option( 'manage' . $screen->id . 'columnshidden' ); +} + +// adds hidden fields with the data for use in the inline editor for posts and pages +/** + * {@internal Missing Short Description}} + * + * @since 2.7.0 + * + * @param unknown_type $post + */ +function get_inline_data($post) { + $post_type_object = get_post_type_object($post->post_type); + if ( ! current_user_can($post_type_object->cap->edit_post, $post->ID) ) + return; + + $title = esc_textarea( trim( $post->post_title ) ); + + echo ' +'; +} + +/** + * {@internal Missing Short Description}} + * + * @since 2.7.0 + * + * @param unknown_type $position + * @param unknown_type $checkbox + * @param unknown_type $mode + */ +function wp_comment_reply($position = '1', $checkbox = false, $mode = 'single', $table_row = true) { + // allow plugin to replace the popup content + $content = apply_filters( 'wp_comment_reply', '', array('position' => $position, 'checkbox' => $checkbox, 'mode' => $mode) ); + + if ( ! empty($content) ) { + echo $content; + return; + } + + if ( $mode == 'single' ) { + $wp_list_table = _get_list_table('WP_Post_Comments_List_Table'); + } else { + $wp_list_table = _get_list_table('WP_Comments_List_Table'); + } + +?> +
    + +
    + + + +
    + + + + + + + ' . _x( 'Name', 'meta name' ) . ' + ' . __( 'Value' ) . ' + + + + + +'; //TBODY needed for list-manipulation JS + return; + } + $count = 0; +?> + + + + + + + + + + +
    + + $entry['meta_id'] = (int) $entry['meta_id']; + + $delete_nonce = wp_create_nonce( 'delete-meta_' . $entry['meta_id'] ); + + $r .= "\n\t"; + $r .= "\n\t\t"; + + $r .= "\n\t\t
    "; + $r .= get_submit_button( __( 'Delete' ), "delete:the-list:meta-{$entry['meta_id']}::_ajax_nonce=$delete_nonce deletemeta", "deletemeta[{$entry['meta_id']}]", false, array( 'tabindex' => '6' ) ); + $r .= "\n\t\t"; + $r .= get_submit_button( __( 'Update' ), "add:the-list:meta-{$entry['meta_id']}::_ajax_nonce-add-meta=$update_nonce updatemeta" , 'updatemeta', false, array( 'tabindex' => '6' ) ); + $r .= "
    "; + $r .= wp_nonce_field( 'change-meta', '_ajax_nonce', false, false ); + $r .= ""; + + $r .= "\n\t\t\n\t"; + return $r; +} + +/** + * {@internal Missing Short Description}} + * + * @since 1.2.0 + */ +function meta_form() { + global $wpdb; + $limit = (int) apply_filters( 'postmeta_form_limit', 30 ); + $keys = $wpdb->get_col( " + SELECT meta_key + FROM $wpdb->postmeta + GROUP BY meta_key + HAVING meta_key NOT LIKE '\_%' + ORDER BY meta_key + LIMIT $limit" ); + if ( $keys ) + natcasesort($keys); +?> +

    + + + + + + + + + + + + + + + + +
    + + + + + + + + + +
    + 'addmetasub', 'tabindex' => '9' ) ); ?> + +
    +post_status, array('draft', 'pending') ) && (!$post->post_date_gmt || '0000-00-00 00:00:00' == $post->post_date_gmt ) ); + + $tab_index_attribute = ''; + if ( (int) $tab_index > 0 ) + $tab_index_attribute = " tabindex=\"$tab_index\""; + + // echo '
    '; + + $time_adj = current_time('timestamp'); + $post_date = ($for_post) ? $post->post_date : $comment->comment_date; + $jj = ($edit) ? mysql2date( 'd', $post_date, false ) : gmdate( 'd', $time_adj ); + $mm = ($edit) ? mysql2date( 'm', $post_date, false ) : gmdate( 'm', $time_adj ); + $aa = ($edit) ? mysql2date( 'Y', $post_date, false ) : gmdate( 'Y', $time_adj ); + $hh = ($edit) ? mysql2date( 'H', $post_date, false ) : gmdate( 'H', $time_adj ); + $mn = ($edit) ? mysql2date( 'i', $post_date, false ) : gmdate( 'i', $time_adj ); + $ss = ($edit) ? mysql2date( 's', $post_date, false ) : gmdate( 's', $time_adj ); + + $cur_jj = gmdate( 'd', $time_adj ); + $cur_mm = gmdate( 'm', $time_adj ); + $cur_aa = gmdate( 'Y', $time_adj ); + $cur_hh = gmdate( 'H', $time_adj ); + $cur_mn = gmdate( 'i', $time_adj ); + + $month = "'; + + $day = ''; + $year = ''; + $hour = ''; + $minute = ''; + + echo '
    '; + /* translators: 1: month input, 2: day input, 3: year input, 4: hour input, 5: minute input */ + printf(__('%1$s%2$s, %3$s @ %4$s : %5$s'), $month, $day, $year, $hour, $minute); + + echo '
    '; + + if ( $multi ) return; + + echo "\n\n"; + foreach ( array('mm', 'jj', 'aa', 'hh', 'mn') as $timeunit ) { + echo '' . "\n"; + $cur_timeunit = 'cur_' . $timeunit; + echo '' . "\n"; + } +?> + +

    + + +

    +$template"; + endforeach; +} + +/** + * {@internal Missing Short Description}} + * + * @since 1.5.0 + * + * @param unknown_type $default + * @param unknown_type $parent + * @param unknown_type $level + * @return unknown + */ +function parent_dropdown( $default = 0, $parent = 0, $level = 0 ) { + global $wpdb, $post_ID; + $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 (!empty ( $post_ID ) ) { + if ( $item->ID == $post_ID ) { + continue; + } + } + $pad = str_repeat( ' ', $level * 3 ); + if ( $item->ID == $default) + $current = ' selected="selected"'; + else + $current = ''; + + echo "\n\t"; + parent_dropdown( $default, $item->ID, $level +1 ); + } + } else { + return false; + } +} + +/** + * {@internal Missing Short Description}} + * + * @since 2.0.0 + * + * @param unknown_type $id + * @return unknown + */ +function the_attachment_links( $id = false ) { + $id = (int) $id; + $post = & get_post( $id ); + + if ( $post->post_type != 'attachment' ) + return false; + + $icon = wp_get_attachment_image( $post->ID, 'thumbnail', true ); + $attachment_data = wp_get_attachment_metadata( $id ); + $thumb = isset( $attachment_data['thumb'] ); +?> + + 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 = false ) { + $p = ''; + $r = ''; + + $editable_roles = 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; +} + +/** + * {@internal Missing Short Description}} + * + * @since 2.3.0 + * + * @param unknown_type $size + * @return unknown + */ +function wp_convert_hr_to_bytes( $size ) { + $size = strtolower($size); + $bytes = (int) $size; + if ( strpos($size, 'k') !== false ) + $bytes = intval($size) * 1024; + elseif ( strpos($size, 'm') !== false ) + $bytes = intval($size) * 1024 * 1024; + elseif ( strpos($size, 'g') !== false ) + $bytes = intval($size) * 1024 * 1024 * 1024; + return $bytes; +} + +/** + * {@internal Missing Short Description}} + * + * @since 2.3.0 + * + * @param unknown_type $bytes + * @return unknown + */ +function wp_convert_bytes_to_hr( $bytes ) { + $units = array( 0 => 'B', 1 => 'kB', 2 => 'MB', 3 => 'GB' ); + $log = log( $bytes, 1024 ); + $power = (int) $log; + $size = pow(1024, $log - $power); + return $size . $units[$power]; +} + +/** + * {@internal Missing Short Description}} + * + * @since 2.5.0 + * + * @return unknown + */ +function wp_max_upload_size() { + $u_bytes = wp_convert_hr_to_bytes( ini_get( 'upload_max_filesize' ) ); + $p_bytes = wp_convert_hr_to_bytes( ini_get( 'post_max_size' ) ); + $bytes = apply_filters( 'upload_size_limit', min($u_bytes, $p_bytes), $u_bytes, $p_bytes ); + return $bytes; +} + +/** + * 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 ) { + $bytes = apply_filters( 'import_upload_size_limit', wp_max_upload_size() ); + $size = wp_convert_bytes_to_hr( $bytes ); + $upload_dir = wp_upload_dir(); + if ( ! empty( $upload_dir['error'] ) ) : + ?>

    +

    +
    +

    + () + + + +

    + +
    + $id, 'title' => $title, 'callback' => $callback, 'args' => $callback_args); +} + +/** + * Meta-Box template function + * + * @since 2.5.0 + * + * @param string $page page identifier, also known as 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($page, $context, $object) { + global $wp_meta_boxes; + static $already_sorted = false; + + $hidden = get_hidden_meta_boxes($page); + + printf('
    ', htmlspecialchars($context)); + + $i = 0; + do { + // 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, $page, $box_context, 'sorted' ); + } + } + } + $already_sorted = true; + + if ( !isset($wp_meta_boxes) || !isset($wp_meta_boxes[$page]) || !isset($wp_meta_boxes[$page][$context]) ) + break; + + 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++; + $style = ''; + $hidden_class = in_array($box['id'], $hidden) ? ' hide-if-js' : ''; + echo '
    ' . "\n"; + if ( 'dashboard_browser_nag' != $box['id'] ) + echo '

    '; + echo "

    {$box['title']}

    \n"; + echo '
    ' . "\n"; + call_user_func($box['callback'], $object, $box); + echo "
    \n"; + echo "
    \n"; + } + } + } + } while(0); + + echo "
    "; + + return $i; + +} + +/** + * Remove a meta box from an edit form. + * + * @since 2.6.0 + * + * @param string $id String for use in the 'id' attribute of tags. + * @param string $page The type of edit page on which to show the box (post, page, link). + * @param string $context The context within the page where the boxes should show ('normal', 'advanced'). + */ +function remove_meta_box($id, $page, $context) { + global $wp_meta_boxes; + + 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; +} + +/** + * {@internal Missing Short Description}} + * + * @since 2.7.0 + * + * @param unknown_type $screen + */ +function meta_box_prefs($screen) { + global $wp_meta_boxes; + + if ( is_string($screen) ) + $screen = convert_to_screen($screen); + + if ( empty($wp_meta_boxes[$screen->id]) ) + return; + + $hidden = get_hidden_meta_boxes($screen); + + foreach ( array_keys($wp_meta_boxes[$screen->id]) as $context ) { + foreach ( array_keys($wp_meta_boxes[$screen->id][$context]) as $priority ) { + foreach ( $wp_meta_boxes[$screen->id][$context][$priority] as $box ) { + if ( false == $box || ! $box['title'] ) + continue; + // Submit box cannot be hidden + if ( 'submitdiv' == $box['id'] || 'linksubmitdiv' == $box['id'] ) + continue; + $box_id = $box['id']; + echo '\n"; + } + } + } +} + +/** + * Get Hidden Meta Boxes + * + * @since 2.7.0 + * + * @param string|object $screen Screen identifier + * @return array Hidden Meta Boxes + */ +function get_hidden_meta_boxes( $screen ) { + if ( is_string( $screen ) ) + $screen = convert_to_screen( $screen ); + + $hidden = get_user_option( "metaboxhidden_{$screen->id}" ); + + // Hide slug boxes by default + if ( !is_array( $hidden ) ) { + if ( 'post' == $screen->base || 'page' == $screen->base ) + $hidden = array('slugdiv', 'trackbacksdiv', 'postcustom', 'postexcerpt', 'commentstatusdiv', 'commentsdiv', 'authordiv', 'revisionsdiv'); + else + $hidden = array( 'slugdiv' ); + $hidden = apply_filters('default_hidden_meta_boxes', $hidden, $screen); + } + + return $hidden; +} + +/** + * Add a new section to a settings page. + * + * Part of the Settings API. Use this to define new settings sections for an admin page. + * Show settings sections in your admin page callback function with do_settings_sections(). + * Add settings fields to your section with add_settings_field() + * + * The $callback argument should be the name of a function that echoes out any + * content you want to show at the top of the settings section before the actual + * fields. It can output nothing if you want. + * + * @since 2.7.0 + * + * @global $wp_settings_sections Storage array of all settings sections added to admin pages + * + * @param string $id Slug-name to identify the section. Used in the 'id' attribute of tags. + * @param string $title Formatted title of the section. Shown as the heading for the section. + * @param string $callback Function that echos out any content at the top of the section (between heading and fields). + * @param string $page The slug-name of the settings page on which to show the section. Built-in pages include 'general', 'reading', 'writing', 'discussion', 'media', etc. Create your own using add_options_page(); + */ +function add_settings_section($id, $title, $callback, $page) { + global $wp_settings_sections; + + if ( 'misc' == $page ) { + _deprecated_argument( __FUNCTION__, '3.0', __( 'The miscellaneous options group has been removed. Use another settings group.' ) ); + $page = 'general'; + } + + if ( !isset($wp_settings_sections) ) + $wp_settings_sections = array(); + if ( !isset($wp_settings_sections[$page]) ) + $wp_settings_sections[$page] = array(); + if ( !isset($wp_settings_sections[$page][$id]) ) + $wp_settings_sections[$page][$id] = array(); + + $wp_settings_sections[$page][$id] = array('id' => $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 retrive existing + * values to show. + * + * @since 2.7.0 + * + * @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 string $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 The slug-name of the section of the settingss page in which to show the box (default, ...). + * @param array $args Additional arguments + */ +function add_settings_field($id, $title, $callback, $page, $section = 'default', $args = array()) { + global $wp_settings_fields; + + if ( 'misc' == $page ) { + _deprecated_argument( __FUNCTION__, '3.0', __( 'The miscellaneous options group has been removed. Use another settings group.' ) ); + $page = 'general'; + } + + if ( !isset($wp_settings_fields) ) + $wp_settings_fields = array(); + if ( !isset($wp_settings_fields[$page]) ) + $wp_settings_fields[$page] = array(); + if ( !isset($wp_settings_fields[$page][$section]) ) + $wp_settings_fields[$page][$section] = array(); + + $wp_settings_fields[$page][$section][$id] = array('id' => $id, 'title' => $title, 'callback' => $callback, 'args' => $args); +} + +/** + * Prints out all settings sections added to a particular settings page + * + * Part of the Settings API. Use this in a settings page callback function + * to output all the sections and fields that were added to that $page with + * add_settings_section() and add_settings_field() + * + * @global $wp_settings_sections Storage array of all settings sections added to admin pages + * @global $wp_settings_fields Storage array of settings fields and info about their pages/sections + * @since 2.7.0 + * + * @param string $page The slug name of the page whos settings sections you want to output + */ +function do_settings_sections($page) { + global $wp_settings_sections, $wp_settings_fields; + + if ( !isset($wp_settings_sections) || !isset($wp_settings_sections[$page]) ) + return; + + foreach ( (array) $wp_settings_sections[$page] as $section ) { + echo "

    {$section['title']}

    \n"; + call_user_func($section['callback'], $section); + if ( !isset($wp_settings_fields) || !isset($wp_settings_fields[$page]) || !isset($wp_settings_fields[$page][$section['id']]) ) + continue; + echo ''; + do_settings_fields($page, $section['id']); + echo '
    '; + } +} + +/** + * Print out the settings fields for a particular settings section + * + * Part of the Settings API. Use this in a settings page to output + * a specific section. Should normally be called by do_settings_sections() + * rather than directly. + * + * @global $wp_settings_fields Storage array of settings fields and their pages/sections + * + * @since 2.7.0 + * + * @param string $page Slug title of the admin page who's settings fields you want to show. + * @param section $section Slug title of the settings section who's fields you want to show. + */ +function do_settings_fields($page, $section) { + global $wp_settings_fields; + + if ( !isset($wp_settings_fields) || !isset($wp_settings_fields[$page]) || !isset($wp_settings_fields[$page][$section]) ) + return; + + foreach ( (array) $wp_settings_fields[$page][$section] as $field ) { + echo ''; + if ( !empty($field['args']['label_for']) ) + echo ''; + else + echo '' . $field['title'] . ''; + echo ''; + call_user_func($field['callback'], $field['args']); + echo ''; + echo ''; + } +} + +/** + * Register a settings error to be displayed to the user + * + * Part of the Settings API. Use this to show messages to users about settings validation + * problems, missing settings or anything else. + * + * Settings errors should be added inside the $sanitize_callback function defined in + * register_setting() for a given setting to give feedback about the submission. + * + * By default messages will show immediately after the submission that generated the error. + * Additional calls to settings_errors() can be used to show errors even when the settings + * page is first accessed. + * + * @since 3.0.0 + * + * @global array $wp_settings_errors Storage array of errors registered during this pageload + * + * @param string $setting Slug title of the setting to which this error applies + * @param string $code Slug-name to identify the error. Used as part of 'id' attribute in HTML output. + * @param string $message The formatted message text to display to the user (will be shown inside styled
    and

    ) + * @param string $type The type of message it is, controls HTML class. Use 'error' or 'updated'. + */ +function add_settings_error( $setting, $code, $message, $type = 'error' ) { + global $wp_settings_errors; + + if ( !isset($wp_settings_errors) ) + $wp_settings_errors = array(); + + $new_error = array( + 'setting' => $setting, + 'code' => $code, + 'message' => $message, + 'type' => $type + ); + $wp_settings_errors[] = $new_error; +} + +/** + * Fetch settings errors registered by add_settings_error() + * + * Checks the $wp_settings_errors array for any errors declared during the current + * pageload and returns them. + * + * If changes were just submitted ($_GET['settings-updated']) and settings errors were saved + * to the 'settings_errors' transient then those errors will be returned instead. This + * is used to pass errors back across pageloads. + * + * Use the $sanitize argument to manually re-sanitize the option before returning errors. + * This is useful if you have errors or notices you want to show even when the user + * hasn't submitted data (i.e. when they first load an options page, or in admin_notices action hook) + * + * @since 3.0.0 + * + * @global array $wp_settings_errors Storage array of errors registered during this pageload + * + * @param string $setting Optional slug title of a specific setting who's errors you want. + * @param boolean $sanitize Whether to re-sanitize the setting value before returning errors. + * @return array Array of settings errors + */ +function get_settings_errors( $setting = '', $sanitize = FALSE ) { + global $wp_settings_errors; + + // If $sanitize is true, manually re-run the sanitizisation for this option + // This allows the $sanitize_callback from register_setting() to run, adding + // any settings errors you want to show by default. + if ( $sanitize ) + sanitize_option( $setting, get_option($setting)); + + // If settings were passed back from options.php then use them + // Ignore transients if $sanitize is true, we dont' want the old values anyway + if ( isset($_GET['settings-updated']) && $_GET['settings-updated'] && get_transient('settings_errors') ) { + $settings_errors = get_transient('settings_errors'); + delete_transient('settings_errors'); + // Otherwise check global in case validation has been run on this pageload + } elseif ( count( $wp_settings_errors ) ) { + $settings_errors = $wp_settings_errors; + } else { + return; + } + + // Filter the results to those of a specific setting if one was set + if ( $setting ) { + foreach ( (array) $settings_errors as $key => $details ) + if ( $setting != $details['setting'] ) + unset( $settings_errors[$key] ); + } + return $settings_errors; +} + +/** + * Display settings errors registered by add_settings_error() + * + * Part of the Settings API. Outputs a

    for each error retrieved by get_settings_errors(). + * + * This is called automatically after a settings page based on the Settings API is submitted. + * Errors should be added during the validation callback function for a setting defined in register_setting() + * + * The $sanitize option is passed into get_settings_errors() and will re-run the setting sanitization + * on its current value. + * + * The $hide_on_update option will cause errors to only show when the settings page is first loaded. + * if the user has already saved new values it will be hidden to avoid repeating messages already + * shown in the default error reporting after submission. This is useful to show general errors like missing + * settings when the user arrives at the settings page. + * + * @since 3.0.0 + * + * @param string $setting Optional slug title of a specific setting who's errors you want. + * @param boolean $sanitize Whether to re-sanitize the setting value before returning errors. + * @param boolean $hide_on_update If set to true errors will not be shown if the settings page has already been submitted. + */ +function settings_errors( $setting = '', $sanitize = FALSE, $hide_on_update = FALSE ) { + + if ($hide_on_update AND $_GET['settings-updated']) return; + + $settings_errors = get_settings_errors( $setting, $sanitize ); + + if ( !is_array($settings_errors) ) return; + + $output = ''; + foreach ( $settings_errors as $key => $details ) { + $css_id = 'setting-error-' . $details['code']; + $css_class = $details['type'] . ' settings-error'; + $output .= "
    \n"; + $output .= "

    {$details['message']}

    "; + $output .= "
    \n"; + } + echo $output; +} + +/** + * {@internal Missing Short Description}} + * + * @since 2.7.0 + * + * @param unknown_type $found_action + */ +function find_posts_div($found_action = '') { +?> + +post_password ) ) echo esc_attr( $post->post_password ); +} + +/** + * {@internal Missing Short Description}} + * + * @since 2.7.0 + */ +function favorite_actions( $screen = null ) { + $default_action = false; + + if ( is_string($screen) ) + $screen = convert_to_screen($screen); + + if ( $screen->is_user ) + return; + + if ( isset($screen->post_type) ) { + $post_type_object = get_post_type_object($screen->post_type); + if ( 'add' != $screen->action ) + $default_action = array('post-new.php?post_type=' . $post_type_object->name => array($post_type_object->labels->new_item, $post_type_object->cap->edit_posts)); + else + $default_action = array('edit.php?post_type=' . $post_type_object->name => array($post_type_object->labels->name, $post_type_object->cap->edit_posts)); + } + + if ( !$default_action ) { + if ( $screen->is_network ) { + $default_action = array('sites.php' => array( __('Sites'), 'manage_sites')); + } else { + switch ( $screen->id ) { + case 'upload': + $default_action = array('media-new.php' => array(__('New Media'), 'upload_files')); + break; + case 'media': + $default_action = array('upload.php' => array(__('Edit Media'), 'upload_files')); + break; + case 'link-manager': + case 'link': + if ( 'add' != $screen->action ) + $default_action = array('link-add.php' => array(__('New Link'), 'manage_links')); + else + $default_action = array('link-manager.php' => array(__('Edit Links'), 'manage_links')); + break; + case 'users': + $default_action = array('user-new.php' => array(__('New User'), 'create_users')); + break; + case 'user': + $default_action = array('users.php' => array(__('Edit Users'), 'edit_users')); + break; + case 'plugins': + $default_action = array('plugin-install.php' => array(__('Install Plugins'), 'install_plugins')); + break; + case 'plugin-install': + $default_action = array('plugins.php' => array(__('Manage Plugins'), 'activate_plugins')); + break; + case 'themes': + $default_action = array('theme-install.php' => array(__('Install Themes'), 'install_themes')); + break; + case 'theme-install': + $default_action = array('themes.php' => array(__('Manage Themes'), 'switch_themes')); + break; + default: + $default_action = array('post-new.php' => array(__('New Post'), 'edit_posts')); + break; + } + } + } + + if ( !$screen->is_network ) { + $actions = array( + 'post-new.php' => array(__('New Post'), 'edit_posts'), + 'edit.php?post_status=draft' => array(__('Drafts'), 'edit_posts'), + 'post-new.php?post_type=page' => array(__('New Page'), 'edit_pages'), + 'media-new.php' => array(__('Upload'), 'upload_files'), + 'edit-comments.php' => array(__('Comments'), 'moderate_comments') + ); + } else { + $actions = array( + 'sites.php' => array( __('Sites'), 'manage_sites'), + 'users.php' => array( __('Users'), 'manage_network_users') + ); + } + + $default_key = array_keys($default_action); + $default_key = $default_key[0]; + if ( isset($actions[$default_key]) ) + unset($actions[$default_key]); + $actions = array_merge($default_action, $actions); + $actions = apply_filters( 'favorite_actions', $actions, $screen ); + + $allowed_actions = array(); + foreach ( $actions as $action => $data ) { + if ( current_user_can($data[1]) ) + $allowed_actions[$action] = $data[0]; + } + + if ( empty($allowed_actions) ) + return; + + $first = array_keys($allowed_actions); + $first = $first[0]; + echo '
    '; + echo '

    '; + echo '
    '; + + array_shift($allowed_actions); + + foreach ( $allowed_actions as $action => $label) { + echo "\n"; + } + echo "
    \n"; +} + +/** + * Get the post title. + * + * The post title is fetched and if it is blank then a default string is + * returned. + * + * @since 2.7.0 + * @param int $post_id The post id. If not supplied the global $post is used. + * @return string The post title if set + */ +function _draft_or_post_title( $post_id = 0 ) { + $title = get_the_title($post_id); + if ( empty($title) ) + $title = __('(no title)'); + return $title; +} + +/** + * Display the search query. + * + * A simple wrapper to display the "s" parameter in a GET URI. This function + * should only be used when {@link the_search_query()} cannot. + * + * @uses attr + * @since 2.7.0 + * + */ +function _admin_search_query() { + echo isset($_REQUEST['s']) ? esc_attr( stripslashes( $_REQUEST['s'] ) ) : ''; +} + +/** + * Generic Iframe header for use with Thickbox + * + * @since 2.7.0 + * @param string $title Title of the Iframe page. + * @param bool $limit_styles Limit styles to colour-related styles only (unless others are enqueued). + * + */ +function iframe_header( $title = '', $limit_styles = false ) { + show_admin_bar( false ); + global $hook_suffix, $current_screen, $current_user, $admin_body_class, $wp_locale; + $admin_body_class = preg_replace('/[^a-z0-9_-]+/i', '-', $hook_suffix); + $admin_body_class .= ' iframe'; + +?> + > + + +<?php bloginfo('name') ?> › <?php echo $title ?> — <?php _e('WordPress'); ?> + + + + + class="no-js "> + + + + + + +post_password) ) + $post_states['protected'] = __('Password protected'); + if ( 'private' == $post->post_status && 'private' != $post_status ) + $post_states['private'] = __('Private'); + if ( 'draft' == $post->post_status && 'draft' != $post_status ) + $post_states['draft'] = __('Draft'); + if ( 'pending' == $post->post_status && 'pending' != $post_status ) + /* translators: post state */ + $post_states['pending'] = _x('Pending', 'post state'); + if ( is_sticky($post->ID) ) + $post_states['sticky'] = __('Sticky'); + + $post_states = apply_filters( 'display_post_states', $post_states ); + + if ( ! empty($post_states) ) { + $state_count = count($post_states); + $i = 0; + echo ' - '; + foreach ( $post_states as $state ) { + ++$i; + ( $i == $state_count ) ? $sep = '' : $sep = ', '; + echo "$state$sep"; + } + } + + if ( get_post_format( $post->ID ) ) + echo ' - ' . get_post_format_string( get_post_format( $post->ID ) ) . ''; +} + +function _media_states( $post ) { + $media_states = array(); + $stylesheet = get_option('stylesheet'); + + if ( current_theme_supports( 'custom-header') ) { + $meta_header = get_post_meta($post->ID, '_wp_attachment_is_custom_header', true ); + if ( ! empty( $meta_header ) && $meta_header == $stylesheet ) + $media_states[] = __( 'Header Image' ); + } + + if ( current_theme_supports( 'custom-background') ) { + $meta_background = get_post_meta($post->ID, '_wp_attachment_is_custom_background', true ); + if ( ! empty( $meta_background ) && $meta_background == $stylesheet ) + $media_states[] = __( 'Background Image' ); + } + + $media_states = apply_filters( 'display_media_states', $media_states ); + + if ( ! empty( $media_states ) ) { + $state_count = count( $media_states ); + $i = 0; + echo ' - '; + foreach ( $media_states as $state ) { + ++$i; + ( $i == $state_count ) ? $sep = '' : $sep = ', '; + echo "$state$sep"; + } + } +} + +/** + * Convert a screen string to a screen object + * + * @since 3.0.0 + * + * @param string $screen The name of the screen + * @return object An object containing the safe screen name and id + */ +function convert_to_screen( $screen ) { + $screen = str_replace( array('.php', '-new', '-add', '-network', '-user' ), '', $screen); + + if ( is_network_admin() ) + $screen .= '-network'; + elseif ( is_user_admin() ) + $screen .= '-user'; + + $screen = (string) apply_filters( 'screen_meta_screen', $screen ); + $screen = (object) array('id' => $screen, 'base' => $screen); + return $screen; +} + +function screen_meta($screen) { + global $wp_meta_boxes, $_wp_contextual_help, $wp_list_table, $wp_current_screen_options; + + if ( is_string($screen) ) + $screen = convert_to_screen($screen); + + $columns = get_column_headers( $screen ); + $hidden = get_hidden_columns( $screen ); + + $meta_screens = array('index' => 'dashboard'); + + if ( isset($meta_screens[$screen->id]) ) { + $screen->id = $meta_screens[$screen->id]; + $screen->base = $screen->id; + } + + $show_screen = false; + if ( !empty($wp_meta_boxes[$screen->id]) || !empty($columns) ) + $show_screen = true; + + $screen_options = screen_options($screen); + if ( $screen_options ) + $show_screen = true; + + if ( !isset($_wp_contextual_help) ) + $_wp_contextual_help = array(); + + $settings = apply_filters('screen_settings', '', $screen); + + switch ( $screen->id ) { + case 'widgets': + $settings = '

    ' . __('Enable accessibility mode') . '' . __('Disable accessibility mode') . "

    \n"; + $show_screen = true; + break; + } + if ( ! empty( $settings ) ) + $show_screen = true; + + if ( !empty($wp_current_screen_options) ) + $show_screen = true; + + $show_screen = apply_filters('screen_options_show_screen', $show_screen, $screen); + +?> +
    + + + + + + + +
    +id] = $help; +} + +function screen_layout($screen) { + global $screen_layout_columns, $wp_current_screen_options; + + if ( is_string($screen) ) + $screen = convert_to_screen($screen); + + // Back compat for plugins using the filter instead of add_screen_option() + $columns = apply_filters('screen_layout_columns', array(), $screen->id, $screen); + if ( !empty($columns) && isset($columns[$screen->id]) ) + add_screen_option('layout_columns', array('max' => $columns[$screen->id]) ); + + if ( !isset($wp_current_screen_options['layout_columns']) ) { + $screen_layout_columns = 0; + return ''; + } + + $screen_layout_columns = get_user_option("screen_layout_$screen->id"); + $num = $wp_current_screen_options['layout_columns']['max']; + + if ( ! $screen_layout_columns ) { + if ( isset($wp_current_screen_options['layout_columns']['default']) ) + $screen_layout_columns = $wp_current_screen_options['layout_columns']['default']; + else + $screen_layout_columns = 2; + } + + $i = 1; + $return = '
    ' . __('Screen Layout') . "
    \n
    " . __('Number of Columns:') . "\n"; + while ( $i <= $num ) { + $return .= "\n"; + ++$i; + } + $return .= "
    \n"; + return $return; +} + +/** + * Register and configure an admin screen option + * + * @since 3.1.0 + * + * @param string $option An option name. + * @param mixed $args Option dependent arguments + * @return void + */ +function add_screen_option( $option, $args = array() ) { + global $wp_current_screen_options; + + if ( !isset($wp_current_screen_options) ) + $wp_current_screen_options = array(); + + $wp_current_screen_options[$option] = $args; +} + +function screen_options($screen) { + global $wp_current_screen_options; + + if ( is_string($screen) ) + $screen = convert_to_screen($screen); + + if ( !isset($wp_current_screen_options['per_page']) ) + return ''; + + $per_page_label = $wp_current_screen_options['per_page']['label']; + + if ( empty($wp_current_screen_options['per_page']['option']) ) { + $option = str_replace( '-', '_', "{$screen->id}_per_page" ); + } else { + $option = $wp_current_screen_options['per_page']['option']; + } + + $per_page = (int) get_user_option( $option ); + if ( empty( $per_page ) || $per_page < 1 ) { + if ( isset($wp_current_screen_options['per_page']['default']) ) + $per_page = $wp_current_screen_options['per_page']['default']; + else + $per_page = 20; + } + + if ( 'edit_comments_per_page' == $option ) + $per_page = apply_filters( 'comments_per_page', $per_page, isset($_REQUEST['comment_status']) ? $_REQUEST['comment_status'] : 'all' ); + elseif ( 'categories_per_page' == $option ) + $per_page = apply_filters( 'edit_categories_per_page', $per_page ); + else + $per_page = apply_filters( $option, $per_page ); + + // Back compat + if ( isset( $screen->post_type ) ) + $per_page = apply_filters( 'edit_posts_per_page', $per_page, $screen->post_type ); + + $return = "
    \n"; + if ( !empty($per_page_label) ) + $return .= " \n"; + $return .= get_submit_button( __( 'Apply' ), 'button', 'screen-options-apply', false ); + $return .= ""; + $return .= "
    \n"; + return $return; +} + +function screen_icon( $screen = '' ) { + echo get_screen_icon( $screen ); +} + +function get_screen_icon( $screen = '' ) { + global $current_screen, $typenow; + + if ( empty($screen) ) + $screen = $current_screen; + elseif ( is_string($screen) ) + $name = $screen; + + $class = 'icon32'; + + if ( empty($name) ) { + if ( !empty($screen->parent_base) ) + $name = $screen->parent_base; + else + $name = $screen->base; + + if ( 'edit' == $name && isset($screen->post_type) && 'page' == $screen->post_type ) + $name = 'edit-pages'; + + $post_type = ''; + if ( isset( $screen->post_type ) ) + $post_type = $screen->post_type; + elseif ( $current_screen == $screen ) + $post_type = $typenow; + if ( $post_type ) + $class .= ' ' . sanitize_html_class( 'icon32-posts-' . $post_type ); + } + + return '

    '; +} + +/** + * Test support for compressing JavaScript from PHP + * + * Outputs JavaScript that tests if compression from PHP works as expected + * and sets an option with the result. Has no effect when the current user + * is not an administrator. To run the test again the option 'can_compress_scripts' + * has to be deleted. + * + * @since 2.8.0 + */ +function compression_test() { +?> + + $current_screen, 'base' => $current_screen); + } else { + $id = sanitize_key($id); + if ( false !== strpos($id, '-') ) { + list( $id, $typenow ) = explode('-', $id, 2); + if ( taxonomy_exists( $typenow ) ) { + $id = 'edit-tags'; + $taxnow = $typenow; + $typenow = ''; + } + } + $current_screen = array('id' => $id, 'base' => $id); + } + + $current_screen = (object) $current_screen; + + $current_screen->action = $action; + + // Map index to dashboard + if ( 'index' == $current_screen->base ) + $current_screen->base = 'dashboard'; + if ( 'index' == $current_screen->id ) + $current_screen->id = 'dashboard'; + + if ( 'edit' == $current_screen->id ) { + if ( empty($typenow) ) + $typenow = 'post'; + $current_screen->id .= '-' . $typenow; + $current_screen->post_type = $typenow; + } elseif ( 'post' == $current_screen->id ) { + if ( empty($typenow) ) + $typenow = 'post'; + $current_screen->id = $typenow; + $current_screen->post_type = $typenow; + } elseif ( 'edit-tags' == $current_screen->id ) { + if ( empty($taxnow) ) + $taxnow = 'post_tag'; + $current_screen->id = 'edit-' . $taxnow; + $current_screen->taxonomy = $taxnow; + } + + $current_screen->is_network = is_network_admin(); + $current_screen->is_user = is_user_admin(); + + if ( $current_screen->is_network ) { + $current_screen->base .= '-network'; + $current_screen->id .= '-network'; + } elseif ( $current_screen->is_user ) { + $current_screen->base .= '-user'; + $current_screen->id .= '-user'; + } + + $current_screen = apply_filters('current_screen', $current_screen); +} + +/** + * Echos a submit button, with provided text and appropriate class + * + * @since 3.1.0 + * + * @param string $text The text of the button (defaults to 'Save Changes') + * @param string $type The type of button. One of: primary, secondary, delete + * @param string $name The HTML name of the submit button. Defaults to "submit". If no id attribute + * is given in $other_attributes below, $name will be used as the button's id. + * @param bool $wrap True if the output button should be wrapped in a paragraph tag, + * false otherwise. Defaults to true + * @param array|string $other_attributes Other attributes that should be output with the button, + * mapping attributes to their values, such as array( 'tabindex' => '1' ). + * These attributes will be ouput as attribute="value", such as tabindex="1". + * Defaults to no other attributes. Other attributes can also be provided as a + * string such as 'tabindex="1"', though the array format is typically cleaner. + */ +function submit_button( $text = NULL, $type = 'primary', $name = 'submit', $wrap = true, $other_attributes = NULL ) { + echo get_submit_button( $text, $type, $name, $wrap, $other_attributes ); +} + +/** + * Returns a submit button, with provided text and appropriate class + * + * @since 3.1.0 + * + * @param string $text The text of the button (defaults to 'Save Changes') + * @param string $type The type of button. One of: primary, secondary, delete + * @param string $name The HTML name of the submit button. Defaults to "submit". If no id attribute + * is given in $other_attributes below, $name will be used as the button's id. + * @param bool $wrap True if the output button should be wrapped in a paragraph tag, + * false otherwise. Defaults to true + * @param array|string $other_attributes Other attributes that should be output with the button, + * mapping attributes to their values, such as array( 'tabindex' => '1' ). + * These attributes will be ouput as attribute="value", such as tabindex="1". + * Defaults to no other attributes. Other attributes can also be provided as a + * string such as 'tabindex="1"', though the array format is typically cleaner. + */ +function get_submit_button( $text = NULL, $type = 'primary', $name = 'submit', $wrap = true, $other_attributes = NULL ) { + switch ( $type ) : + case 'primary' : + case 'secondary' : + $class = 'button-' . $type; + break; + case 'delete' : + $class = 'button-secondary delete'; + break; + default : + $class = $type; // Custom cases can just pass in the classes they want to be used + endswitch; + $text = ( NULL == $text ) ? __( 'Save Changes' ) : $text; + + // Default the id attribute to $name unless an id was specifically provided in $other_attributes + $id = $name; + if ( is_array( $other_attributes ) && isset( $other_attributes['id'] ) ) { + $id = $other_attributes['id']; + unset( $other_attributes['id'] ); + } + + $attributes = ''; + if ( is_array( $other_attributes ) ) { + foreach ( $other_attributes as $attribute => $value ) { + $attributes .= $attribute . '="' . esc_attr( $value ) . '" '; // Trailing space is important + } + } else if ( !empty( $other_attributes ) ) { // Attributes provided as a string + $attributes = $other_attributes; + } + + $button = ''; + + if ( $wrap ) { + $button = '

    ' . $button . '

    '; + } + + return $button; +} diff --git a/src/wp-admin/includes/theme-install.php b/src/wp-admin/includes/theme-install.php new file mode 100644 index 0000000..1f24e40 --- /dev/null +++ b/src/wp-admin/includes/theme-install.php @@ -0,0 +1,323 @@ + array('href' => array(), 'title' => array(), 'target' => array()), + 'abbr' => array('title' => array()), 'acronym' => array('title' => array()), + 'code' => array(), 'pre' => array(), 'em' => array(), 'strong' => array(), + 'div' => array(), 'p' => array(), 'ul' => array(), 'ol' => array(), 'li' => array(), + 'h1' => array(), 'h2' => array(), 'h3' => array(), 'h4' => array(), 'h5' => array(), 'h6' => array(), + 'img' => array('src' => array(), 'class' => array(), 'alt' => array()) +); + +$theme_field_defaults = array( 'description' => true, 'sections' => false, 'tested' => true, 'requires' => true, + 'rating' => true, 'downloaded' => true, 'downloadlink' => true, 'last_updated' => true, 'homepage' => true, + 'tags' => true, 'num_ratings' => true +); + +/** + * Retrieve list of WordPress theme features (aka theme tags) + * + * @since 2.8.0 + * + * @deprecated since 3.1.0 Use get_theme_feature_list() instead. + * + * @return array + */ +function install_themes_feature_list( ) { + if ( !$cache = get_transient( 'wporg_theme_feature_list' ) ) + set_transient( 'wporg_theme_feature_list', array( ), 10800); + + if ( $cache ) + return $cache; + + $feature_list = themes_api( 'feature_list', array( ) ); + if ( is_wp_error( $feature_list ) ) + return $features; + + set_transient( 'wporg_theme_feature_list', $feature_list, 10800 ); + + return $feature_list; +} + +/** + * Display search form for searching themes. + * + * @since 2.8.0 + */ +function install_theme_search_form() { + $type = isset( $_REQUEST['type'] ) ? stripslashes( $_REQUEST['type'] ) : ''; + $term = isset( $_REQUEST['s'] ) ? stripslashes( $_REQUEST['s'] ) : ''; + ?> +

    + +
    + + + + +
    + +

    +
    +

    + '; + + foreach ( (array) $feature_list as $feature_name => $features ) { + $feature_name = esc_html( $feature_name ); + echo '
    ' . $feature_name . '
    '; + + echo '
      '; + foreach ( $features as $feature => $feature_name ) { + $feature_name = esc_html( $feature_name ); + $feature = esc_attr($feature); +?> + +
    1. + + +
    2. + + +
    +
    + + +
    +
    + + + +

    +

    +
    + + + +
    + name, $themes_allowedtags); + $desc = wp_kses($theme->description, $themes_allowedtags); + //if ( strlen($desc) > 30 ) + // $desc = substr($desc, 0, 15) . '...' . substr($desc, -15) . ''; + + $preview_link = $theme->preview_url . '?TB_iframe=true&width=600&height=400'; + if ( !is_array($actions) ) { + $actions = array(); + $actions[] = '' . __('Install') . ''; + if ( !is_network_admin() ) + $actions[] = '' . __('Preview') . ''; + $actions = apply_filters('theme_install_action_links', $actions, $theme); + } + + $actions = implode ( ' | ', $actions ); + ?> +'> + + +

    + +

    + + +
    +

    version, $themes_allowedtags) ?>

    +

    author, $themes_allowedtags) ?>

    +last_updated) ) : ?> +

    last_updated)) ) ?>

    +requires) ) : ?> +

    requires) ?>

    +tested) ) : ?> +

    tested ?>

    +downloaded) ) : ?> +

    downloaded), number_format_i18n($theme->downloaded)) ?>

    + +
    +
    +
    <?php _e('5 stars') ?>
    +
    <?php _e('4 stars') ?>
    +
    <?php _e('3 stars') ?>
    +
    <?php _e('2 stars') ?>
    +
    <?php _e('1 star') ?>
    +
    +
    + string 'Magazine Basic' (length=14) + public 'slug' => string 'magazine-basic' (length=14) + public 'version' => string '1.1' (length=3) + public 'author' => string 'tinkerpriest' (length=12) + public 'preview_url' => string 'http://wp-themes.com/?magazine-basic' (length=36) + public 'screenshot_url' => string 'http://wp-themes.com/wp-content/themes/magazine-basic/screenshot.png' (length=68) + public 'rating' => float 80 + public 'num_ratings' => int 1 + public 'homepage' => string 'http://wordpress.org/extend/themes/magazine-basic' (length=49) + public 'description' => string 'A basic magazine style layout with a fully customizable layout through a backend interface. Designed by c.bavota of Tinker Priest Media.' (length=214) + public 'download_link' => string 'http://wordpress.org/extend/themes/download/magazine-basic.1.1.zip' (length=66) + */ +} + +/** + * Display theme content based on theme list. + * + * @since 2.8.0 + */ +function display_themes() { + global $wp_list_table; + + $wp_list_table->display(); +} +add_action('install_themes_search', 'display_themes'); +add_action('install_themes_featured', 'display_themes'); +add_action('install_themes_new', 'display_themes'); +add_action('install_themes_updated', 'display_themes'); + +/** + * Display theme information in dialog box form. + * + * @since 2.8.0 + */ +function install_theme_information() { + //TODO: This function needs a LOT of UI work :) + global $tab, $themes_allowedtags; + + $api = themes_api('theme_information', array('slug' => stripslashes( $_REQUEST['theme'] ) )); + + if ( is_wp_error($api) ) + wp_die($api); + + // Sanitize HTML + foreach ( (array)$api->sections as $section_name => $content ) + $api->sections[$section_name] = wp_kses($content, $themes_allowedtags); + + foreach ( array('version', 'author', 'requires', 'tested', 'homepage', 'downloaded', 'slug') as $key ) { + if ( isset($api->$key) ) + $api->$key = wp_kses($api->$key, $themes_allowedtags); + } + + iframe_header( __('Theme Install') ); + + if ( empty($api->download_link) ) { + echo '

    ' . __('Error: This theme is currently not available. Please try again later.') . '

    '; + iframe_footer(); + exit; + } + + if ( !empty($api->tested) && version_compare($GLOBALS['wp_version'], $api->tested, '>') ) + echo '

    ' . __('Warning: This theme has not been tested with your current version of WordPress.') . '

    '; + else if ( !empty($api->requires) && version_compare($GLOBALS['wp_version'], $api->requires, '<') ) + echo '

    ' . __('Warning: This theme has not been marked as compatible with your version of WordPress.') . '

    '; + + // Default to a "new" theme + $type = 'install'; + // Check to see if this theme is known to be installed, and has an update awaiting it. + $update_themes = get_site_transient('update_themes'); + if ( is_object($update_themes) && isset($update_themes->response) ) { + foreach ( (array)$update_themes->response as $theme_slug => $theme_info ) { + if ( $theme_slug === $api->slug ) { + $type = 'update_available'; + $update_file = $theme_slug; + break; + } + } + } + + $themes = get_themes(); + foreach ( $themes as $this_theme ) { + if ( is_array($this_theme) && $this_theme['Stylesheet'] == $api->slug ) { + if ( $this_theme['Version'] == $api->version ) { + $type = 'latest_installed'; + } elseif ( $this_theme['Version'] > $api->version ) { + $type = 'newer_installed'; + $newer_version = $this_theme['Version']; + } + break; + } + } +?> + +
    + +

    name; ?>

    +

    author); ?>

    +

    version); ?>

    + +' . __('Cancel') . ' '; + +switch ( $type ) { +default: +case 'install': + if ( current_user_can('install_themes') ) : + $buttons .= '' . __('Install Now') . ''; + endif; + break; +case 'update_available': + if ( current_user_can('update_themes') ) : + $buttons .= '' . __('Install Update Now') . ''; + endif; + break; +case 'newer_installed': + if ( current_user_can('install_themes') || current_user_can('update_themes') ) : + ?>

    +
    +
    + +

    + +
    +

    + +name = $current_theme; + $ct->title = $themes[$current_theme]['Title']; + $ct->version = $themes[$current_theme]['Version']; + $ct->parent_theme = $themes[$current_theme]['Parent Theme']; + $ct->template_dir = $themes[$current_theme]['Template Dir']; + $ct->stylesheet_dir = $themes[$current_theme]['Stylesheet Dir']; + $ct->template = $themes[$current_theme]['Template']; + $ct->stylesheet = $themes[$current_theme]['Stylesheet']; + $ct->screenshot = $themes[$current_theme]['Screenshot']; + $ct->description = $themes[$current_theme]['Description']; + $ct->author = $themes[$current_theme]['Author']; + $ct->tags = $themes[$current_theme]['Tags']; + $ct->theme_root = $themes[$current_theme]['Theme Root']; + $ct->theme_root_uri = $themes[$current_theme]['Theme Root URI']; + return $ct; +} + +/** + * Remove a theme + * + * @since 2.8.0 + * + * @param string $template Template directory of the theme to delete + * @param string $redirect Redirect to page when complete. + * @return mixed + */ +function delete_theme($template, $redirect = '') { + global $wp_filesystem; + + if ( empty($template) ) + return false; + + ob_start(); + if ( empty( $redirect ) ) + $redirect = wp_nonce_url('themes.php?action=delete&template=' . $template, 'delete-theme_' . $template); + if ( false === ($credentials = request_filesystem_credentials($redirect)) ) { + $data = ob_get_contents(); + ob_end_clean(); + if ( ! empty($data) ){ + include_once( ABSPATH . 'wp-admin/admin-header.php'); + echo $data; + include( ABSPATH . 'wp-admin/admin-footer.php'); + exit; + } + return; + } + + if ( ! WP_Filesystem($credentials) ) { + request_filesystem_credentials($url, '', true); // Failed to connect, Error and request again + $data = ob_get_contents(); + ob_end_clean(); + if ( ! empty($data) ) { + include_once( ABSPATH . 'wp-admin/admin-header.php'); + echo $data; + include( ABSPATH . 'wp-admin/admin-footer.php'); + exit; + } + return; + } + + + if ( ! is_object($wp_filesystem) ) + return new WP_Error('fs_unavailable', __('Could not access filesystem.')); + + if ( is_wp_error($wp_filesystem->errors) && $wp_filesystem->errors->get_error_code() ) + return new WP_Error('fs_error', __('Filesystem error.'), $wp_filesystem->errors); + + //Get the base plugin folder + $themes_dir = $wp_filesystem->wp_themes_dir(); + if ( empty($themes_dir) ) + return new WP_Error('fs_no_themes_dir', __('Unable to locate WordPress theme directory.')); + + $themes_dir = trailingslashit( $themes_dir ); + $theme_dir = trailingslashit($themes_dir . $template); + $deleted = $wp_filesystem->delete($theme_dir, true); + + if ( ! $deleted ) + return new WP_Error('could_not_remove_theme', sprintf(__('Could not fully remove the theme %s.'), $template) ); + + // Force refresh of theme update information + delete_site_transient('update_themes'); + + return true; +} + +/** + * {@internal Missing Short Description}} + * + * @since 1.5.0 + * + * @return unknown + */ +function get_broken_themes() { + global $wp_broken_themes; + + get_themes(); + return $wp_broken_themes; +} + +/** + * Get the allowed themes for the current blog. + * + * @since 3.0.0 + * + * @uses get_themes() + * @uses current_theme_info() + * @uses get_site_allowed_themes() + * @uses wpmu_get_blog_allowedthemes + * + * @return array $themes Array of allowed themes. + */ +function get_allowed_themes() { + if ( !is_multisite() ) + return get_themes(); + + $themes = get_themes(); + $ct = current_theme_info(); + $allowed_themes = apply_filters("allowed_themes", get_site_allowed_themes() ); + if ( $allowed_themes == false ) + $allowed_themes = array(); + + $blog_allowed_themes = wpmu_get_blog_allowedthemes(); + if ( is_array( $blog_allowed_themes ) ) + $allowed_themes = array_merge( $allowed_themes, $blog_allowed_themes ); + + if ( isset( $allowed_themes[ esc_html( $ct->stylesheet ) ] ) == false ) + $allowed_themes[ esc_html( $ct->stylesheet ) ] = true; + + reset( $themes ); + foreach ( $themes as $key => $theme ) { + if ( isset( $allowed_themes[ esc_html( $theme[ 'Stylesheet' ] ) ] ) == false ) + unset( $themes[ $key ] ); + } + reset( $themes ); + + return $themes; +} + +/** + * Get the Page Templates available in this theme + * + * @since 1.5.0 + * + * @return array Key is the template name, value is the filename of the template + */ +function get_page_templates() { + $themes = get_themes(); + $theme = get_current_theme(); + $templates = $themes[$theme]['Template Files']; + $page_templates = array(); + + if ( is_array( $templates ) ) { + $base = array( trailingslashit(get_template_directory()), trailingslashit(get_stylesheet_directory()) ); + + foreach ( $templates as $template ) { + $basename = str_replace($base, '', $template); + + // don't allow template files in subdirectories + if ( false !== strpos($basename, '/') ) + continue; + + if ( 'functions.php' == $basename ) + continue; + + $template_data = implode( '', file( $template )); + + $name = ''; + if ( preg_match( '|Template Name:(.*)$|mi', $template_data, $name ) ) + $name = _cleanup_header_comment($name[1]); + + if ( !empty( $name ) ) { + $page_templates[trim( $name )] = $basename; + } + } + } + + return $page_templates; +} + +/** + * Tidies a filename for url display by the theme editor. + * + * @since 2.9.0 + * @access private + * + * @param string $fullpath Full path to the theme file + * @param string $containingfolder Path of the theme parent folder + * @return string + */ +function _get_template_edit_filename($fullpath, $containingfolder) { + return str_replace(dirname(dirname( $containingfolder )) , '', $fullpath); +} + +/** + * Check if there is an update for a theme available. + * + * Will display link, if there is an update available. + * + * @since 2.7.0 + * + * @param object $theme Theme data object. + * @return bool False if no valid info was passed. + */ +function theme_update_available( $theme ) { + static $themes_update; + + if ( !current_user_can('update_themes' ) ) + return; + + if ( !isset($themes_update) ) + $themes_update = get_site_transient('update_themes'); + + if ( is_object($theme) && isset($theme->stylesheet) ) + $stylesheet = $theme->stylesheet; + elseif ( is_array($theme) && isset($theme['Stylesheet']) ) + $stylesheet = $theme['Stylesheet']; + else + return false; //No valid info passed. + + if ( isset($themes_update->response[ $stylesheet ]) ) { + $update = $themes_update->response[ $stylesheet ]; + $theme_name = is_object($theme) ? $theme->name : (is_array($theme) ? $theme['Name'] : ''); + $details_url = add_query_arg(array('TB_iframe' => 'true', 'width' => 1024, 'height' => 800), $update['url']); //Theme browser inside WP? replace this, Also, theme preview JS will override this on the available list. + $update_url = wp_nonce_url('update.php?action=upgrade-theme&theme=' . urlencode($stylesheet), 'upgrade-theme_' . $stylesheet); + $update_onclick = 'onclick="if ( confirm(\'' . esc_js( __("Updating this theme will lose any customizations you have made. 'Cancel' to stop, 'OK' to update.") ) . '\') ) {return true;}return false;"'; + + if ( !is_multisite() ) { + if ( ! current_user_can('update_themes') ) + printf( '

    ' . __('There is a new version of %1$s available. View version %3$s details.') . '

    ', $theme_name, $details_url, $update['new_version']); + else if ( empty($update['package']) ) + printf( '

    ' . __('There is a new version of %1$s available. View version %3$s details. Automatic update is unavailable for this theme.') . '

    ', $theme_name, $details_url, $update['new_version']); + else + printf( '

    ' . __('There is a new version of %1$s available. View version %3$s details or update automatically.') . '

    ', $theme_name, $details_url, $update['new_version'], $update_url, $update_onclick ); + } + } +} + +/** + * Retrieve list of WordPress theme features (aka theme tags) + * + * @since 3.1.0 + * + * @return array Array of features keyed by category with translations keyed by slug. + */ +function get_theme_feature_list() { + // Hard-coded list is used if api not accessible. + $features = array( + __('Colors') => array( + '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 ') + ), + + __('Columns') => array( + 'one-column' => __( 'One Column' ), + 'two-columns' => __( 'Two Columns' ), + 'three-columns' => __( 'Three Columns' ), + 'four-columns' => __( 'Four Columns' ), + 'left-sidebar' => __( 'Left Sidebar' ), + 'right-sidebar' => __( 'Right Sidebar' ) + ), + + __('Width') => array( + 'fixed-width' => __( 'Fixed Width' ), + 'flexible-width' => __( 'Flexible Width' ) + ), + + __( 'Features' ) => array( + 'blavatar' => __( 'Blavatar' ), + 'buddypress' => __( 'BuddyPress' ), + 'custom-background' => __( 'Custom Background' ), + 'custom-colors' => __( 'Custom Colors' ), + 'custom-header' => __( 'Custom Header' ), + 'custom-menu' => __( 'Custom Menu' ), + 'editor-style' => __( 'Editor Style' ), + 'featured-image-header' => __( 'Featured Image Header' ), + 'featured-images' => __( 'Featured Images' ), + 'front-page-post-form' => __( 'Front Page Posting' ), + 'full-width-template' => __( 'Full Width Template' ), + 'microformats' => __( 'Microformats' ), + 'post-formats' => __( 'Post Formats' ), + 'rtl-language-support' => __( 'RTL Language Support' ), + 'sticky-post' => __( 'Sticky Post' ), + 'theme-options' => __( 'Theme Options' ), + 'threaded-comments' => __( 'Threaded Comments' ), + 'translation-ready' => __( 'Translation Ready' ) + ), + + __( 'Subject' ) => array( + 'holiday' => __( 'Holiday' ), + 'photoblogging' => __( 'Photoblogging' ), + 'seasonal' => __( 'Seasonal' ) + ) + ); + + if ( !current_user_can('install_themes') ) + return $features; + + if ( !$feature_list = get_site_transient( 'wporg_theme_feature_list' ) ) + set_site_transient( 'wporg_theme_feature_list', array( ), 10800); + + if ( !$feature_list ) { + $feature_list = themes_api( 'feature_list', array( ) ); + if ( is_wp_error( $feature_list ) ) + return $features; + } + + if ( !$feature_list ) + return $features; + + set_site_transient( 'wporg_theme_feature_list', $feature_list, 10800 ); + + $category_translations = array( 'Colors' => __('Colors'), 'Columns' => __('Columns'), 'Width' => __('Width'), + 'Features' => __('Features'), 'Subject' => __('Subject') ); + + // Loop over the wporg canonical list and apply translations + $wporg_features = array(); + foreach ( (array) $feature_list as $feature_category => $feature_items ) { + if ( isset($category_translations[$feature_category]) ) + $feature_category = $category_translations[$feature_category]; + $wporg_features[$feature_category] = array(); + + foreach ( $feature_items as $feature ) { + if ( isset($features[$feature_category][$feature]) ) + $wporg_features[$feature_category][$feature] = $features[$feature_category][$feature]; + else + $wporg_features[$feature_category][$feature] = $feature; + } + } + + return $wporg_features; +} + +/** + * Retrieve theme installer pages from WordPress Themes API. + * + * It is possible for a theme to override the Themes API result with three + * filters. Assume this is for themes, which can extend on the Theme Info to + * offer more choices. This is very powerful and must be used with care, when + * overridding the filters. + * + * The first filter, 'themes_api_args', is for the args and gives the action as + * the second parameter. The hook for 'themes_api_args' must ensure that an + * object is returned. + * + * The second filter, 'themes_api', is the result that would be returned. + * + * @since 2.8.0 + * + * @param string $action + * @param array|object $args Optional. Arguments to serialize for the Theme Info API. + * @return mixed + */ +function themes_api($action, $args = null) { + + if ( is_array($args) ) + $args = (object)$args; + + if ( !isset($args->per_page) ) + $args->per_page = 24; + + $args = apply_filters('themes_api_args', $args, $action); //NOTE: Ensure that an object is returned via this filter. + $res = apply_filters('themes_api', false, $action, $args); //NOTE: Allows a theme to completely override the builtin WordPress.org API. + + if ( ! $res ) { + $request = wp_remote_post('http://api.wordpress.org/themes/info/1.0/', array( 'body' => array('action' => $action, 'request' => serialize($args))) ); + if ( is_wp_error($request) ) { + $res = new WP_Error('themes_api_failed', __('An Unexpected HTTP Error occurred during the API request.'), $request->get_error_message() ); + } else { + $res = unserialize( wp_remote_retrieve_body( $request ) ); + if ( ! $res ) + $res = new WP_Error('themes_api_failed', __('An unknown error occurred.'), wp_remote_retrieve_body( $request ) ); + } + } + //var_dump(array($args, $res)); + return apply_filters('themes_api_result', $res, $action, $args); +} + +?> diff --git a/src/wp-admin/includes/update-core.php b/src/wp-admin/includes/update-core.php new file mode 100644 index 0000000..d44ffb2 --- /dev/null +++ b/src/wp-admin/includes/update-core.php @@ -0,0 +1,522 @@ + Introduced version + * Directories should be noted by suffixing it with a trailing slash (/) + * + * @since 3.2.0 + * @global array $_new_bundled_files + * @var array + * @name $_new_bundled_files + */ +global $_new_bundled_files; + +$_new_bundled_files = array( +'plugins/akismet/' => '2.0', +'themes/twentyten/' => '3.0', +'themes/twentyeleven/' => '3.2' +); + +/** + * Upgrade the core of WordPress. + * + * This will create a .maintenance file at the base of the WordPress directory + * to ensure that people can not access the web site, when the files are being + * copied to their locations. + * + * The files in the {@link $_old_files} list will be removed and the new files + * copied from the zip file after the database is upgraded. + * + * The files in the {@link $_new_bundled_files} list will be added to the installation + * if the version is greater than or equal to the old version being upgraded. + * + * The steps for the upgrader for after the new release is downloaded and + * unzipped is: + * 1. Test unzipped location for select files to ensure that unzipped worked. + * 2. Create the .maintenance file in current WordPress base. + * 3. Copy new WordPress directory over old WordPress files. + * 4. Upgrade WordPress to new version. + * 4.1. Copy all files/folders other than wp-content + * 4.2. Copy any language files to WP_LANG_DIR (which may differ from WP_CONTENT_DIR + * 4.3. Copy any new bundled themes/plugins to their respective locations + * 5. Delete new WordPress directory path. + * 6. Delete .maintenance file. + * 7. Remove old files. + * 8. Delete 'update_core' option. + * + * There are several areas of failure. For instance if PHP times out before step + * 6, then you will not be able to access any portion of your site. Also, since + * the upgrade will not continue where it left off, you will not be able to + * automatically remove old files and remove the 'update_core' option. This + * isn't that bad. + * + * If the copy of the new WordPress over the old fails, then the worse is that + * the new WordPress directory will remain. + * + * If it is assumed that every file will be copied over, including plugins and + * themes, then if you edit the default theme, you should rename it, so that + * your changes remain. + * + * @since 2.7.0 + * + * @param string $from New release unzipped path. + * @param string $to Path to old WordPress installation. + * @return WP_Error|null WP_Error on failure, null on success. + */ +function update_core($from, $to) { + global $wp_filesystem, $_old_files, $_new_bundled_files, $wpdb; + + @set_time_limit( 300 ); + + $php_version = phpversion(); + $mysql_version = $wpdb->db_version(); + $required_php_version = '5.2.4'; + $required_mysql_version = '5.0'; + $wp_version = '3.2.1'; + $php_compat = version_compare( $php_version, $required_php_version, '>=' ); + $mysql_compat = version_compare( $mysql_version, $required_mysql_version, '>=' ) || file_exists( WP_CONTENT_DIR . '/db.php' ); + + if ( !$mysql_compat || !$php_compat ) + $wp_filesystem->delete($from, true); + + if ( !$mysql_compat && !$php_compat ) + return new WP_Error( 'php_mysql_not_compatible', sprintf( __('The update cannot be installed because WordPress %1$s requires PHP version %2$s or higher and MySQL version %3$s or higher. You are running PHP version %4$s and MySQL version %5$s.'), $wp_version, $required_php_version, $required_mysql_version, $php_version, $mysql_version ) ); + elseif ( !$php_compat ) + return new WP_Error( 'php_not_compatible', sprintf( __('The update cannot be installed because WordPress %1$s requires PHP version %2$s or higher. You are running version %3$s.'), $wp_version, $required_php_version, $php_version ) ); + elseif ( !$mysql_compat ) + return new WP_Error( 'mysql_not_compatible', sprintf( __('The update cannot be installed because WordPress %1$s requires MySQL version %2$s or higher. You are running version %3$s.'), $wp_version, $required_mysql_version, $mysql_version ) ); + + // Sanity check the unzipped distribution + apply_filters('update_feedback', __('Verifying the unpacked files…')); + $distro = ''; + $roots = array( '/wordpress/', '/wordpress-mu/' ); + foreach( $roots as $root ) { + if ( $wp_filesystem->exists($from . $root . 'readme.html') && $wp_filesystem->exists($from . $root . 'wp-includes/version.php') ) { + $distro = $root; + break; + } + } + if ( !$distro ) { + $wp_filesystem->delete($from, true); + return new WP_Error('insane_distro', __('The update could not be unpacked') ); + } + + apply_filters('update_feedback', __('Installing the latest version…')); + + // Create maintenance file to signal that we are upgrading + $maintenance_string = ''; + $maintenance_file = $to . '.maintenance'; + $wp_filesystem->delete($maintenance_file); + $wp_filesystem->put_contents($maintenance_file, $maintenance_string, FS_CHMOD_FILE); + + // Copy new versions of WP files into place. + $result = _copy_dir($from . $distro, $to, array('wp-content') ); + + // Custom Content Directory needs updating now. + // Copy Languages + if ( !is_wp_error($result) && $wp_filesystem->is_dir($from . $distro . 'wp-content/languages') ) { + if ( WP_LANG_DIR != ABSPATH . WPINC . '/languages' || @is_dir(WP_LANG_DIR) ) + $lang_dir = WP_LANG_DIR; + else + $lang_dir = WP_CONTENT_DIR . '/languages'; + + if ( !@is_dir($lang_dir) && 0 === strpos($lang_dir, ABSPATH) ) { // Check the language directory exists first + $wp_filesystem->mkdir($to . str_replace($lang_dir, ABSPATH, ''), FS_CHMOD_DIR); // If it's within the ABSPATH we can handle it here, otherwise they're out of luck. + clearstatcache(); // for FTP, Need to clear the stat cache + } + + if ( @is_dir($lang_dir) ) { + $wp_lang_dir = $wp_filesystem->find_folder($lang_dir); + if ( $wp_lang_dir ) + $result = copy_dir($from . $distro . 'wp-content/languages/', $wp_lang_dir); + } + } + + // Copy New bundled plugins & themes + // This gives us the ability to install new plugins & themes bundled with future versions of WordPress whilst avoiding the re-install upon upgrade issue. + if ( !is_wp_error($result) && ( ! defined('CORE_UPGRADE_SKIP_NEW_BUNDLED') || ! CORE_UPGRADE_SKIP_NEW_BUNDLED ) ) { + $old_version = $GLOBALS['wp_version']; // $wp_version in local scope == new version + foreach ( (array) $_new_bundled_files as $file => $introduced_version ) { + // If $introduced version is greater than what the site was previously running + if ( version_compare($introduced_version, $old_version, '>') ) { + $directory = ('/' == $file[ strlen($file)-1 ]); + list($type, $filename) = explode('/', $file, 2); + + if ( 'plugins' == $type ) + $dest = $wp_filesystem->wp_plugins_dir(); + elseif ( 'themes' == $type ) + $dest = trailingslashit($wp_filesystem->wp_themes_dir()); // Back-compat, ::wp_themes_dir() did not return trailingslash'd pre-3.2 + else + continue; + + if ( ! $directory ) { + if ( $wp_filesystem->exists($dest . $filename) ) + continue; + + if ( ! $wp_filesystem->copy($from . $distro . 'wp-content/' . $file, $dest . $filename, FS_CHMOD_FILE) ) + $result = new WP_Error('copy_failed', __('Could not copy file.'), $dest . $filename); + } else { + if ( $wp_filesystem->is_dir($dest . $filename) ) + continue; + + $wp_filesystem->mkdir($dest . $filename, FS_CHMOD_DIR); + $_result = copy_dir( $from . $distro . 'wp-content/' . $file, $dest . $filename); + if ( is_wp_error($_result) ) //If a error occurs partway through this final step, keep the error flowing through, but keep process going. + $result = $_result; + } + } + } //end foreach + } + + // Handle $result error from the above blocks + if ( is_wp_error($result) ) { + $wp_filesystem->delete($maintenance_file); + $wp_filesystem->delete($from, true); + return $result; + } + + // Remove old files + foreach ( $_old_files as $old_file ) { + $old_file = $to . $old_file; + if ( !$wp_filesystem->exists($old_file) ) + continue; + $wp_filesystem->delete($old_file, true); + } + + // Upgrade DB with separate request + apply_filters('update_feedback', __('Upgrading database…')); + $db_upgrade_url = admin_url('upgrade.php?step=upgrade_db'); + wp_remote_post($db_upgrade_url, array('timeout' => 60)); + + // Remove working directory + $wp_filesystem->delete($from, true); + + // Force refresh of update information + if ( function_exists('delete_site_transient') ) + delete_site_transient('update_core'); + else + delete_option('update_core'); + + // Remove maintenance file, we're done. + $wp_filesystem->delete($maintenance_file); +} + +/** + * Copies a directory from one location to another via the WordPress Filesystem Abstraction. + * Assumes that WP_Filesystem() has already been called and setup. + * + * This is a temporary function for the 3.1 -> 3.2 upgrade only and will be removed in 3.3 + * + * @ignore + * @since 3.2.0 + * @see copy_dir() + * + * @param string $from source directory + * @param string $to destination directory + * @param array $skip_list a list of files/folders to skip copying + * @return mixed WP_Error on failure, True on success. + */ +function _copy_dir($from, $to, $skip_list = array() ) { + global $wp_filesystem; + + $dirlist = $wp_filesystem->dirlist($from); + + $from = trailingslashit($from); + $to = trailingslashit($to); + + $skip_regex = ''; + foreach ( (array)$skip_list as $key => $skip_file ) + $skip_regex .= preg_quote($skip_file, '!') . '|'; + + if ( !empty($skip_regex) ) + $skip_regex = '!(' . rtrim($skip_regex, '|') . ')$!i'; + + foreach ( (array) $dirlist as $filename => $fileinfo ) { + if ( !empty($skip_regex) ) + if ( preg_match($skip_regex, $from . $filename) ) + continue; + + if ( 'f' == $fileinfo['type'] ) { + if ( ! $wp_filesystem->copy($from . $filename, $to . $filename, true, FS_CHMOD_FILE) ) { + // If copy failed, chmod file to 0644 and try again. + $wp_filesystem->chmod($to . $filename, 0644); + if ( ! $wp_filesystem->copy($from . $filename, $to . $filename, true, FS_CHMOD_FILE) ) + return new WP_Error('copy_failed', __('Could not copy file.'), $to . $filename); + } + } elseif ( 'd' == $fileinfo['type'] ) { + if ( !$wp_filesystem->is_dir($to . $filename) ) { + if ( !$wp_filesystem->mkdir($to . $filename, FS_CHMOD_DIR) ) + return new WP_Error('mkdir_failed', __('Could not create directory.'), $to . $filename); + } + $result = _copy_dir($from . $filename, $to . $filename, $skip_list); + if ( is_wp_error($result) ) + return $result; + } + } + return true; +} + +?> diff --git a/src/wp-admin/includes/update.php b/src/wp-admin/includes/update.php new file mode 100644 index 0000000..202f7c4 --- /dev/null +++ b/src/wp-admin/includes/update.php @@ -0,0 +1,313 @@ + 'latest'); + return $updates[0]; +} + +/** + * Get available core updates + * + * @param array $options Set $options['dismissed'] to true to show dismissed upgrades too, + * set $options['available'] to false to skip not-dimissed updates. + * @return array Array of the update objects + */ +function get_core_updates( $options = array() ) { + $options = array_merge( array('available' => true, 'dismissed' => false ), $options ); + $dismissed = get_site_option( 'dismissed_update_core' ); + if ( !is_array( $dismissed ) ) $dismissed = array(); + $from_api = get_site_transient( 'update_core' ); + if ( empty($from_api) ) + return false; + if ( !isset( $from_api->updates ) || !is_array( $from_api->updates ) ) return false; + $updates = $from_api->updates; + if ( !is_array( $updates ) ) return false; + $result = array(); + foreach($updates as $update) { + if ( array_key_exists( $update->current.'|'.$update->locale, $dismissed ) ) { + if ( $options['dismissed'] ) { + $update->dismissed = true; + $result[]= $update; + } + } else { + if ( $options['available'] ) { + $update->dismissed = false; + $result[]= $update; + } + } + } + return $result; +} + +function dismiss_core_update( $update ) { + $dismissed = get_site_option( 'dismissed_update_core' ); + $dismissed[ $update->current.'|'.$update->locale ] = true; + return update_site_option( 'dismissed_update_core', $dismissed ); +} + +function undismiss_core_update( $version, $locale ) { + $dismissed = get_site_option( 'dismissed_update_core' ); + $key = $version.'|'.$locale; + if ( !isset( $dismissed[$key] ) ) return false; + unset( $dismissed[$key] ); + return update_site_option( 'dismissed_update_core', $dismissed ); +} + +function find_core_update( $version, $locale ) { + $from_api = get_site_transient( 'update_core' ); + if ( !is_array( $from_api->updates ) ) return false; + $updates = $from_api->updates; + foreach($updates as $update) { + if ( $update->current == $version && $update->locale == $locale ) + return $update; + } + return false; +} + +function core_update_footer( $msg = '' ) { + if ( is_multisite() && !current_user_can('update_core') ) + return false; + + if ( !current_user_can('update_core') ) + return sprintf( __( 'Version %s' ), $GLOBALS['wp_version'] ); + + $cur = get_preferred_from_update_core(); + if ( ! isset( $cur->current ) ) + $cur->current = ''; + + if ( ! isset( $cur->url ) ) + $cur->url = ''; + + if ( ! isset( $cur->response ) ) + $cur->response = ''; + + switch ( $cur->response ) { + case 'development' : + return sprintf( __( 'You are using a development version (%1$s). Cool! Please stay updated.' ), $GLOBALS['wp_version'], network_admin_url( 'update-core.php' ) ); + break; + + case 'upgrade' : + return sprintf( ''.__( 'Get Version %2$s' ).'', network_admin_url( 'update-core.php' ), $cur->current); + break; + + case 'latest' : + default : + return sprintf( __( 'Version %s' ), $GLOBALS['wp_version'] ); + break; + } +} +add_filter( 'update_footer', 'core_update_footer' ); + +function update_nag() { + if ( is_multisite() && !current_user_can('update_core') ) + return false; + + global $pagenow; + + if ( 'update-core.php' == $pagenow ) + return; + + $cur = get_preferred_from_update_core(); + + if ( ! isset( $cur->response ) || $cur->response != 'upgrade' ) + return false; + + if ( current_user_can('update_core') ) { + $msg = sprintf( __('WordPress %1$s is available! Please update now.'), $cur->current, network_admin_url( 'update-core.php' ) ); + } else { + $msg = sprintf( __('WordPress %1$s is available! Please notify the site administrator.'), $cur->current ); + } + echo "
    $msg
    "; +} +add_action( 'admin_notices', 'update_nag', 3 ); + +// Called directly from dashboard +function update_right_now_message() { + if ( is_multisite() && !current_user_can('update_core') ) + return false; + + $cur = get_preferred_from_update_core(); + + $msg = sprintf( __('You are using WordPress %s.'), $GLOBALS['wp_version'] ); + + if ( isset( $cur->response ) && $cur->response == 'upgrade' && current_user_can('update_core') ) { + $msg .= " " . sprintf( __('Update to %s'), $cur->current ? $cur->current : __( 'Latest' ) ) . ''; + } + + echo "$msg"; +} + +function get_plugin_updates() { + $all_plugins = get_plugins(); + $upgrade_plugins = array(); + $current = get_site_transient( 'update_plugins' ); + foreach ( (array)$all_plugins as $plugin_file => $plugin_data) { + if ( isset( $current->response[ $plugin_file ] ) ) { + $upgrade_plugins[ $plugin_file ] = (object) $plugin_data; + $upgrade_plugins[ $plugin_file ]->update = $current->response[ $plugin_file ]; + } + } + + return $upgrade_plugins; +} + +function wp_plugin_update_rows() { + if ( !current_user_can('update_plugins' ) ) + return; + + $plugins = get_site_transient( 'update_plugins' ); + if ( isset($plugins->response) && is_array($plugins->response) ) { + $plugins = array_keys( $plugins->response ); + foreach( $plugins as $plugin_file ) { + add_action( "after_plugin_row_$plugin_file", 'wp_plugin_update_row', 10, 2 ); + } + } +} +add_action( 'admin_init', 'wp_plugin_update_rows' ); + +function wp_plugin_update_row( $file, $plugin_data ) { + $current = get_site_transient( 'update_plugins' ); + if ( !isset( $current->response[ $file ] ) ) + return false; + + $r = $current->response[ $file ]; + + $plugins_allowedtags = array('a' => array('href' => array(),'title' => array()),'abbr' => array('title' => array()),'acronym' => array('title' => array()),'code' => array(),'em' => array(),'strong' => array()); + $plugin_name = wp_kses( $plugin_data['Name'], $plugins_allowedtags ); + + $details_url = self_admin_url('plugin-install.php?tab=plugin-information&plugin=' . $r->slug . '&TB_iframe=true&width=600&height=800'); + + $wp_list_table = _get_list_table('WP_Plugins_List_Table'); + + if ( is_network_admin() || !is_multisite() ) { + echo '
    '; + + if ( ! current_user_can('update_plugins') ) + printf( __('There is a new version of %1$s available. View version %4$s details.'), $plugin_name, esc_url($details_url), esc_attr($plugin_name), $r->new_version ); + else if ( empty($r->package) ) + printf( __('There is a new version of %1$s available. View version %4$s details. Automatic update is unavailable for this plugin.'), $plugin_name, esc_url($details_url), esc_attr($plugin_name), $r->new_version ); + else + printf( __('There is a new version of %1$s available. View version %4$s details or update automatically.'), $plugin_name, esc_url($details_url), esc_attr($plugin_name), $r->new_version, wp_nonce_url( self_admin_url('update.php?action=upgrade-plugin&plugin=') . $file, 'upgrade-plugin_' . $file) ); + + do_action( "in_plugin_update_message-$file", $plugin_data, $r ); + + echo '
    '; + } +} + +function wp_update_plugin($plugin, $feedback = '') { + if ( !empty($feedback) ) + add_filter('update_feedback', $feedback); + + include ABSPATH . 'wp-admin/includes/class-wp-upgrader.php'; + $upgrader = new Plugin_Upgrader(); + return $upgrader->upgrade($plugin); +} + +function get_theme_updates() { + $themes = get_themes(); + $current = get_site_transient('update_themes'); + $update_themes = array(); + + foreach ( $themes as $theme ) { + $theme = (object) $theme; + if ( isset($current->response[ $theme->Stylesheet ]) ) { + $update_themes[$theme->Stylesheet] = $theme; + $update_themes[$theme->Stylesheet]->update = $current->response[ $theme->Stylesheet ]; + } + } + + return $update_themes; +} + +function wp_update_theme($theme, $feedback = '') { + if ( !empty($feedback) ) + add_filter('update_feedback', $feedback); + + include ABSPATH . 'wp-admin/includes/class-wp-upgrader.php'; + $upgrader = new Theme_Upgrader(); + return $upgrader->upgrade($theme); +} + +function wp_theme_update_rows() { + if ( !current_user_can('update_themes' ) ) + return; + + $themes = get_site_transient( 'update_themes' ); + if ( isset($themes->response) && is_array($themes->response) ) { + $themes = array_keys( $themes->response ); + + foreach( $themes as $theme ) { + add_action( "after_theme_row_$theme", 'wp_theme_update_row', 10, 2 ); + } + } +} +add_action( 'admin_init', 'wp_theme_update_rows' ); + +function wp_theme_update_row( $theme_key, $theme ) { + $current = get_site_transient( 'update_themes' ); + if ( !isset( $current->response[ $theme_key ] ) ) + return false; + $r = $current->response[ $theme_key ]; + $themes_allowedtags = array('a' => array('href' => array(),'title' => array()),'abbr' => array('title' => array()),'acronym' => array('title' => array()),'code' => array(),'em' => array(),'strong' => array()); + $theme_name = wp_kses( $theme['Name'], $themes_allowedtags ); + + $details_url = self_admin_url("theme-install.php?tab=theme-information&theme=$theme_key&TB_iframe=true&width=600&height=400"); + + $wp_list_table = _get_list_table('WP_MS_Themes_List_Table'); + + echo '
    '; + if ( ! current_user_can('update_themes') ) + printf( __('There is a new version of %1$s available. View version %4$s details.'), $theme['Name'], esc_url($details_url), esc_attr($theme['Name']), $r->new_version ); + else if ( empty( $r['package'] ) ) + printf( __('There is a new version of %1$s available. View version %4$s details. Automatic update is unavailable for this plugin.'), $theme['Name'], esc_url($details_url), esc_attr($theme['Name']), $r['new_version'] ); + else + printf( __('There is a new version of %1$s available. View version %4$s details or update automatically.'), $theme['Name'], esc_url($details_url), esc_attr($theme['Name']), $r['new_version'], wp_nonce_url( self_admin_url('update.php?action=upgrade-theme&theme=') . $theme_key, 'upgrade-theme_' . $theme_key) ); + + do_action( "in_theme_update_message-$theme_key", $theme, $r ); + + echo '
    '; +} + +function wp_update_core($current, $feedback = '') { + if ( !empty($feedback) ) + add_filter('update_feedback', $feedback); + + include ABSPATH . 'wp-admin/includes/class-wp-upgrader.php'; + $upgrader = new Core_Upgrader(); + return $upgrader->upgrade($current); + +} + +function maintenance_nag() { + global $upgrading; + if ( ! isset( $upgrading ) ) + return false; + + if ( current_user_can('update_core') ) + $msg = sprintf( __('An automated WordPress update has failed to complete - please attempt the update again now.'), 'update-core.php' ); + else + $msg = __('An automated WordPress update has failed to complete! Please notify the site administrator.'); + + echo "
    $msg
    "; +} +add_action( 'admin_notices', 'maintenance_nag' ); + +?> diff --git a/src/wp-admin/includes/upgrade.php b/src/wp-admin/includes/upgrade.php new file mode 100644 index 0000000..f29f594 --- /dev/null +++ b/src/wp-admin/includes/upgrade.php @@ -0,0 +1,2001 @@ +Note that password carefully! It is a random password that was generated just for you.'); + $user_id = wp_create_user($user_name, $user_password, $user_email); + update_user_option($user_id, 'default_password_nag', true, true); + $email_password = true; + } else if ( !$user_id ) { + // Password has been provided + $message = ''.__('Your chosen password.').''; + $user_id = wp_create_user($user_name, $user_password, $user_email); + } else { + $message = __('User already exists. Password inherited.'); + } + + $user = new WP_User($user_id); + $user->set_role('administrator'); + + wp_install_defaults($user_id); + + $wp_rewrite->flush_rules(); + + wp_new_blog_notification($blog_title, $guessurl, $user_id, ($email_password ? $user_password : __('The password you chose during the install.') ) ); + + wp_cache_flush(); + + return array('url' => $guessurl, 'user_id' => $user_id, 'password' => $user_password, 'password_message' => $message); +} +endif; + +if ( !function_exists('wp_install_defaults') ) : +/** + * {@internal Missing Short Description}} + * + * {@internal Missing Long Description}} + * + * @since 2.1.0 + * + * @param int $user_id User ID. + */ +function wp_install_defaults($user_id) { + global $wpdb, $wp_rewrite, $current_site, $table_prefix; + + // Default category + $cat_name = __('Uncategorized'); + /* translators: Default category slug */ + $cat_slug = sanitize_title(_x('Uncategorized', 'Default category slug')); + + if ( global_terms_enabled() ) { + $cat_id = $wpdb->get_var( $wpdb->prepare( "SELECT cat_ID FROM {$wpdb->sitecategories} WHERE category_nicename = %s", $cat_slug ) ); + if ( $cat_id == null ) { + $wpdb->insert( $wpdb->sitecategories, array('cat_ID' => 0, 'cat_name' => $cat_name, 'category_nicename' => $cat_slug, 'last_updated' => current_time('mysql', true)) ); + $cat_id = $wpdb->insert_id; + } + update_option('default_category', $cat_id); + } else { + $cat_id = 1; + } + + $wpdb->insert( $wpdb->terms, array('term_id' => $cat_id, 'name' => $cat_name, 'slug' => $cat_slug, 'term_group' => 0) ); + $wpdb->insert( $wpdb->term_taxonomy, array('term_id' => $cat_id, 'taxonomy' => 'category', 'description' => '', 'parent' => 0, 'count' => 1)); + $cat_tt_id = $wpdb->insert_id; + + // Default link category + $cat_name = __('Blogroll'); + /* translators: Default link category slug */ + $cat_slug = sanitize_title(_x('Blogroll', 'Default link category slug')); + + if ( global_terms_enabled() ) { + $blogroll_id = $wpdb->get_var( $wpdb->prepare( "SELECT cat_ID FROM {$wpdb->sitecategories} WHERE category_nicename = %s", $cat_slug ) ); + if ( $blogroll_id == null ) { + $wpdb->insert( $wpdb->sitecategories, array('cat_ID' => 0, 'cat_name' => $cat_name, 'category_nicename' => $cat_slug, 'last_updated' => current_time('mysql', true)) ); + $blogroll_id = $wpdb->insert_id; + } + update_option('default_link_category', $blogroll_id); + } else { + $blogroll_id = 2; + } + + $wpdb->insert( $wpdb->terms, array('term_id' => $blogroll_id, 'name' => $cat_name, 'slug' => $cat_slug, 'term_group' => 0) ); + $wpdb->insert( $wpdb->term_taxonomy, array('term_id' => $blogroll_id, 'taxonomy' => 'link_category', 'description' => '', 'parent' => 0, 'count' => 7)); + $blogroll_tt_id = $wpdb->insert_id; + + // Now drop in some default links + $default_links = array(); + $default_links[] = array( 'link_url' => 'http://codex.wordpress.org/', + 'link_name' => 'Documentation', + 'link_rss' => '', + 'link_notes' => ''); + + $default_links[] = array( 'link_url' => 'http://wordpress.org/news/', + 'link_name' => 'WordPress Blog', + 'link_rss' => 'http://wordpress.org/news/feed/', + 'link_notes' => ''); + + $default_links[] = array( 'link_url' => 'http://wordpress.org/extend/ideas/', + 'link_name' => 'Suggest Ideas', + 'link_rss' => '', + 'link_notes' =>''); + + $default_links[] = array( 'link_url' => 'http://wordpress.org/support/', + 'link_name' => 'Support Forum', + 'link_rss' => '', + 'link_notes' =>''); + + $default_links[] = array( 'link_url' => 'http://wordpress.org/extend/plugins/', + 'link_name' => 'Plugins', + 'link_rss' => '', + 'link_notes' =>''); + + $default_links[] = array( 'link_url' => 'http://wordpress.org/extend/themes/', + 'link_name' => 'Themes', + 'link_rss' => '', + 'link_notes' =>''); + + $default_links[] = array( 'link_url' => 'http://planet.wordpress.org/', + 'link_name' => 'WordPress Planet', + 'link_rss' => '', + 'link_notes' =>''); + + foreach ( $default_links as $link ) { + $wpdb->insert( $wpdb->links, $link); + $wpdb->insert( $wpdb->term_relationships, array('term_taxonomy_id' => $blogroll_tt_id, 'object_id' => $wpdb->insert_id) ); + } + + // First post + $now = date('Y-m-d H:i:s'); + $now_gmt = gmdate('Y-m-d H:i:s'); + $first_post_guid = get_option('home') . '/?p=1'; + + if ( is_multisite() ) { + $first_post = get_site_option( 'first_post' ); + + if ( empty($first_post) ) + $first_post = stripslashes( __( 'Welcome to SITE_NAME. This is your first post. Edit or delete it, then start blogging!' ) ); + + $first_post = str_replace( "SITE_URL", esc_url( network_home_url() ), $first_post ); + $first_post = str_replace( "SITE_NAME", $current_site->site_name, $first_post ); + } else { + $first_post = __('Welcome to WordPress. This is your first post. Edit or delete it, then start blogging!'); + } + + $wpdb->insert( $wpdb->posts, array( + 'post_author' => $user_id, + 'post_date' => $now, + 'post_date_gmt' => $now_gmt, + 'post_content' => $first_post, + 'post_excerpt' => '', + 'post_title' => __('Hello world!'), + /* translators: Default post slug */ + 'post_name' => sanitize_title( _x('hello-world', 'Default post slug') ), + 'post_modified' => $now, + 'post_modified_gmt' => $now_gmt, + 'guid' => $first_post_guid, + 'comment_count' => 1, + 'to_ping' => '', + 'pinged' => '', + 'post_content_filtered' => '' + )); + $wpdb->insert( $wpdb->term_relationships, array('term_taxonomy_id' => $cat_tt_id, 'object_id' => 1) ); + + // Default comment + $first_comment_author = __('Mr WordPress'); + $first_comment_url = 'http://wordpress.org/'; + $first_comment = __('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.'); + if ( is_multisite() ) { + $first_comment_author = get_site_option( 'first_comment_author', $first_comment_author ); + $first_comment_url = get_site_option( 'first_comment_url', network_home_url() ); + $first_comment = get_site_option( 'first_comment', $first_comment ); + } + $wpdb->insert( $wpdb->comments, array( + 'comment_post_ID' => 1, + 'comment_author' => $first_comment_author, + 'comment_author_email' => '', + 'comment_author_url' => $first_comment_url, + 'comment_date' => $now, + 'comment_date_gmt' => $now_gmt, + 'comment_content' => $first_comment + )); + + // First Page + $first_page = sprintf( __( "This is an example page. It's different from a blog post because it will stay in one place and will show up in your site navigation (in most themes). Most people start with an About page that introduces them to potential site visitors. It might say something like this: + +
    Hi there! I'm a bike messenger by day, aspiring actor by night, and this is my blog. I live in Los Angeles, have a great dog named Jack, and I like piña coladas. (And gettin' caught in the rain.)
    + +...or something like this: + +
    The XYZ Doohickey Company was founded in 1971, and has been providing quality doohickies to the public ever since. Located in Gotham City, XYZ employs over 2,000 people and does all kinds of awesome things for the Gotham community.
    + +As a new WordPress user, you should go to your dashboard to delete this page and create new pages for your content. Have fun!" ), admin_url() ); + if ( is_multisite() ) + $first_page = get_site_option( 'first_page', $first_page ); + $first_post_guid = get_option('home') . '/?page_id=2'; + $wpdb->insert( $wpdb->posts, array( + 'post_author' => $user_id, + 'post_date' => $now, + 'post_date_gmt' => $now_gmt, + 'post_content' => $first_page, + 'post_excerpt' => '', + 'post_title' => __( 'Sample Page' ), + /* translators: Default page slug */ + 'post_name' => __( 'sample-page' ), + 'post_modified' => $now, + 'post_modified_gmt' => $now_gmt, + 'guid' => $first_post_guid, + 'post_type' => 'page', + 'to_ping' => '', + 'pinged' => '', + 'post_content_filtered' => '' + )); + $wpdb->insert( $wpdb->postmeta, array( 'post_id' => 2, 'meta_key' => '_wp_page_template', 'meta_value' => 'default' ) ); + + // Set up default widgets for default theme. + update_option( 'widget_search', array ( 2 => array ( 'title' => '' ), '_multiwidget' => 1 ) ); + update_option( 'widget_recent-posts', array ( 2 => array ( 'title' => '', 'number' => 5 ), '_multiwidget' => 1 ) ); + update_option( 'widget_recent-comments', array ( 2 => array ( 'title' => '', 'number' => 5 ), '_multiwidget' => 1 ) ); + update_option( 'widget_archives', array ( 2 => array ( 'title' => '', 'count' => 0, 'dropdown' => 0 ), '_multiwidget' => 1 ) ); + update_option( 'widget_categories', array ( 2 => array ( 'title' => '', 'count' => 0, 'hierarchical' => 0, 'dropdown' => 0 ), '_multiwidget' => 1 ) ); + update_option( 'widget_meta', array ( 2 => array ( 'title' => '' ), '_multiwidget' => 1 ) ); + update_option( 'sidebars_widgets', array ( 'wp_inactive_widgets' => array ( ), 'primary-widget-area' => array ( 0 => 'search-2', 1 => 'recent-posts-2', 2 => 'recent-comments-2', 3 => 'archives-2', 4 => 'categories-2', 5 => 'meta-2', ), 'secondary-widget-area' => array ( ), 'first-footer-widget-area' => array ( ), 'second-footer-widget-area' => array ( ), 'third-footer-widget-area' => array ( ), 'fourth-footer-widget-area' => array ( ), 'array_version' => 3 ) ); + + if ( is_multisite() ) { + // Flush rules to pick up the new page. + $wp_rewrite->init(); + $wp_rewrite->flush_rules(); + + $user = new WP_User($user_id); + $wpdb->update( $wpdb->options, array('option_value' => $user->user_email), array('option_name' => 'admin_email') ); + + // Remove all perms except for the login user. + $wpdb->query( $wpdb->prepare("DELETE FROM $wpdb->usermeta WHERE user_id != %d AND meta_key = %s", $user_id, $table_prefix.'user_level') ); + $wpdb->query( $wpdb->prepare("DELETE FROM $wpdb->usermeta WHERE user_id != %d AND meta_key = %s", $user_id, $table_prefix.'capabilities') ); + + // Delete any caps that snuck into the previously active blog. (Hardcoded to blog 1 for now.) TODO: Get previous_blog_id. + if ( !is_super_admin( $user_id ) && $user_id != 1 ) + $wpdb->query( $wpdb->prepare("DELETE FROM $wpdb->usermeta WHERE user_id = %d AND meta_key = %s", $user_id, $wpdb->base_prefix.'1_capabilities') ); + } +} +endif; + +if ( !function_exists('wp_new_blog_notification') ) : +/** + * {@internal Missing Short Description}} + * + * {@internal Missing Long Description}} + * + * @since 2.1.0 + * + * @param string $blog_title Blog title. + * @param string $blog_url Blog url. + * @param int $user_id User ID. + * @param string $password User's Password. + */ +function wp_new_blog_notification($blog_title, $blog_url, $user_id, $password) { + $user = new WP_User($user_id); + $email = $user->user_email; + $name = $user->user_login; + $message = sprintf(__("Your new WordPress site has been successfully set up at: + +%1\$s + +You can log in to the administrator account with the following information: + +Username: %2\$s +Password: %3\$s + +We hope you enjoy your new site. Thanks! + +--The WordPress Team +http://wordpress.org/ +"), $blog_url, $name, $password); + + @wp_mail($email, __('New WordPress Site'), $message); +} +endif; + +if ( !function_exists('wp_upgrade') ) : +/** + * Run WordPress Upgrade functions. + * + * {@internal Missing Long Description}} + * + * @since 2.1.0 + * + * @return null + */ +function wp_upgrade() { + global $wp_current_db_version, $wp_db_version, $wpdb; + + $wp_current_db_version = __get_option('db_version'); + + // We are up-to-date. Nothing to do. + if ( $wp_db_version == $wp_current_db_version ) + return; + + if ( ! is_blog_installed() ) + return; + + wp_check_mysql_version(); + wp_cache_flush(); + pre_schema_upgrade(); + make_db_current_silent(); + upgrade_all(); + if ( is_multisite() && is_main_site() ) + upgrade_network(); + wp_cache_flush(); + + if ( is_multisite() ) { + if ( $wpdb->get_row( "SELECT blog_id FROM {$wpdb->blog_versions} WHERE blog_id = '{$wpdb->blogid}'" ) ) + $wpdb->query( "UPDATE {$wpdb->blog_versions} SET db_version = '{$wp_db_version}' WHERE blog_id = '{$wpdb->blogid}'" ); + else + $wpdb->query( "INSERT INTO {$wpdb->blog_versions} ( `blog_id` , `db_version` , `last_updated` ) VALUES ( '{$wpdb->blogid}', '{$wp_db_version}', NOW());" ); + } +} +endif; + +/** + * Functions to be called in install and upgrade scripts. + * + * {@internal Missing Long Description}} + * + * @since 1.0.1 + */ +function upgrade_all() { + global $wp_current_db_version, $wp_db_version, $wp_rewrite; + $wp_current_db_version = __get_option('db_version'); + + // We are up-to-date. Nothing to do. + if ( $wp_db_version == $wp_current_db_version ) + return; + + // If the version is not set in the DB, try to guess the version. + if ( empty($wp_current_db_version) ) { + $wp_current_db_version = 0; + + // If the template option exists, we have 1.5. + $template = __get_option('template'); + if ( !empty($template) ) + $wp_current_db_version = 2541; + } + + if ( $wp_current_db_version < 6039 ) + upgrade_230_options_table(); + + populate_options(); + + if ( $wp_current_db_version < 2541 ) { + upgrade_100(); + upgrade_101(); + upgrade_110(); + upgrade_130(); + } + + if ( $wp_current_db_version < 3308 ) + upgrade_160(); + + if ( $wp_current_db_version < 4772 ) + upgrade_210(); + + if ( $wp_current_db_version < 4351 ) + upgrade_old_slugs(); + + if ( $wp_current_db_version < 5539 ) + upgrade_230(); + + if ( $wp_current_db_version < 6124 ) + upgrade_230_old_tables(); + + if ( $wp_current_db_version < 7499 ) + upgrade_250(); + + if ( $wp_current_db_version < 7935 ) + upgrade_252(); + + if ( $wp_current_db_version < 8201 ) + upgrade_260(); + + if ( $wp_current_db_version < 8989 ) + upgrade_270(); + + if ( $wp_current_db_version < 10360 ) + upgrade_280(); + + if ( $wp_current_db_version < 11958 ) + upgrade_290(); + + if ( $wp_current_db_version < 15260 ) + upgrade_300(); + + maybe_disable_automattic_widgets(); + + update_option( 'db_version', $wp_db_version ); + update_option( 'db_upgraded', true ); +} + +/** + * Execute changes made in WordPress 1.0. + * + * @since 1.0.0 + */ +function upgrade_100() { + global $wpdb; + + // Get the title and ID of every post, post_name to check if it already has a value + $posts = $wpdb->get_results("SELECT ID, post_title, post_name FROM $wpdb->posts WHERE post_name = ''"); + if ($posts) { + foreach($posts as $post) { + if ('' == $post->post_name) { + $newtitle = sanitize_title($post->post_title); + $wpdb->query( $wpdb->prepare("UPDATE $wpdb->posts SET post_name = %s WHERE ID = %d", $newtitle, $post->ID) ); + } + } + } + + $categories = $wpdb->get_results("SELECT cat_ID, cat_name, category_nicename FROM $wpdb->categories"); + foreach ($categories as $category) { + if ('' == $category->category_nicename) { + $newtitle = sanitize_title($category->cat_name); + $wpdb>update( $wpdb->categories, array('category_nicename' => $newtitle), array('cat_ID' => $category->cat_ID) ); + } + } + + $wpdb->query("UPDATE $wpdb->options SET option_value = REPLACE(option_value, 'wp-links/links-images/', 'wp-images/links/') + WHERE option_name LIKE 'links_rating_image%' + AND option_value LIKE 'wp-links/links-images/%'"); + + $done_ids = $wpdb->get_results("SELECT DISTINCT post_id FROM $wpdb->post2cat"); + if ($done_ids) : + foreach ($done_ids as $done_id) : + $done_posts[] = $done_id->post_id; + endforeach; + $catwhere = ' AND ID NOT IN (' . implode(',', $done_posts) . ')'; + else: + $catwhere = ''; + endif; + + $allposts = $wpdb->get_results("SELECT ID, post_category FROM $wpdb->posts WHERE post_category != '0' $catwhere"); + if ($allposts) : + foreach ($allposts as $post) { + // Check to see if it's already been imported + $cat = $wpdb->get_row( $wpdb->prepare("SELECT * FROM $wpdb->post2cat WHERE post_id = %d AND category_id = %d", $post->ID, $post->post_category) ); + if (!$cat && 0 != $post->post_category) { // If there's no result + $wpdb->insert( $wpdb->post2cat, array('post_id' => $post->ID, 'category_id' => $post->post_category) ); + } + } + endif; +} + +/** + * Execute changes made in WordPress 1.0.1. + * + * @since 1.0.1 + */ +function upgrade_101() { + global $wpdb; + + // Clean up indices, add a few + add_clean_index($wpdb->posts, 'post_name'); + add_clean_index($wpdb->posts, 'post_status'); + add_clean_index($wpdb->categories, 'category_nicename'); + add_clean_index($wpdb->comments, 'comment_approved'); + add_clean_index($wpdb->comments, 'comment_post_ID'); + add_clean_index($wpdb->links , 'link_category'); + add_clean_index($wpdb->links , 'link_visible'); +} + +/** + * Execute changes made in WordPress 1.2. + * + * @since 1.2.0 + */ +function upgrade_110() { + global $wpdb; + + // Set user_nicename. + $users = $wpdb->get_results("SELECT ID, user_nickname, user_nicename FROM $wpdb->users"); + foreach ($users as $user) { + if ('' == $user->user_nicename) { + $newname = sanitize_title($user->user_nickname); + $wpdb->update( $wpdb->users, array('user_nicename' => $newname), array('ID' => $user->ID) ); + } + } + + $users = $wpdb->get_results("SELECT ID, user_pass from $wpdb->users"); + foreach ($users as $row) { + if (!preg_match('/^[A-Fa-f0-9]{32}$/', $row->user_pass)) { + $wpdb->update( $wpdb->users, array('user_pass' => md5($row->user_pass)), array('ID' => $row->ID) ); + } + } + + // Get the GMT offset, we'll use that later on + $all_options = get_alloptions_110(); + + $time_difference = $all_options->time_difference; + + $server_time = time()+date('Z'); + $weblogger_time = $server_time + $time_difference*3600; + $gmt_time = time(); + + $diff_gmt_server = ($gmt_time - $server_time) / 3600; + $diff_weblogger_server = ($weblogger_time - $server_time) / 3600; + $diff_gmt_weblogger = $diff_gmt_server - $diff_weblogger_server; + $gmt_offset = -$diff_gmt_weblogger; + + // Add a gmt_offset option, with value $gmt_offset + add_option('gmt_offset', $gmt_offset); + + // Check if we already set the GMT fields (if we did, then + // MAX(post_date_gmt) can't be '0000-00-00 00:00:00' + // I just slapped myself silly for not thinking about it earlier + $got_gmt_fields = ! ($wpdb->get_var("SELECT MAX(post_date_gmt) FROM $wpdb->posts") == '0000-00-00 00:00:00'); + + if (!$got_gmt_fields) { + + // Add or substract time to all dates, to get GMT dates + $add_hours = intval($diff_gmt_weblogger); + $add_minutes = intval(60 * ($diff_gmt_weblogger - $add_hours)); + $wpdb->query("UPDATE $wpdb->posts SET post_date_gmt = DATE_ADD(post_date, INTERVAL '$add_hours:$add_minutes' HOUR_MINUTE)"); + $wpdb->query("UPDATE $wpdb->posts SET post_modified = post_date"); + $wpdb->query("UPDATE $wpdb->posts SET post_modified_gmt = DATE_ADD(post_modified, INTERVAL '$add_hours:$add_minutes' HOUR_MINUTE) WHERE post_modified != '0000-00-00 00:00:00'"); + $wpdb->query("UPDATE $wpdb->comments SET comment_date_gmt = DATE_ADD(comment_date, INTERVAL '$add_hours:$add_minutes' HOUR_MINUTE)"); + $wpdb->query("UPDATE $wpdb->users SET user_registered = DATE_ADD(user_registered, INTERVAL '$add_hours:$add_minutes' HOUR_MINUTE)"); + } + +} + +/** + * Execute changes made in WordPress 1.5. + * + * @since 1.5.0 + */ +function upgrade_130() { + global $wpdb; + + // Remove extraneous backslashes. + $posts = $wpdb->get_results("SELECT ID, post_title, post_content, post_excerpt, guid, post_date, post_name, post_status, post_author FROM $wpdb->posts"); + if ($posts) { + foreach($posts as $post) { + $post_content = addslashes(deslash($post->post_content)); + $post_title = addslashes(deslash($post->post_title)); + $post_excerpt = addslashes(deslash($post->post_excerpt)); + if ( empty($post->guid) ) + $guid = get_permalink($post->ID); + else + $guid = $post->guid; + + $wpdb->update( $wpdb->posts, compact('post_title', 'post_content', 'post_excerpt', 'guid'), array('ID' => $post->ID) ); + + } + } + + // Remove extraneous backslashes. + $comments = $wpdb->get_results("SELECT comment_ID, comment_author, comment_content FROM $wpdb->comments"); + if ($comments) { + foreach($comments as $comment) { + $comment_content = deslash($comment->comment_content); + $comment_author = deslash($comment->comment_author); + + $wpdb->update($wpdb->comments, compact('comment_content', 'comment_author'), array('comment_ID' => $comment->comment_ID) ); + } + } + + // Remove extraneous backslashes. + $links = $wpdb->get_results("SELECT link_id, link_name, link_description FROM $wpdb->links"); + if ($links) { + foreach($links as $link) { + $link_name = deslash($link->link_name); + $link_description = deslash($link->link_description); + + $wpdb->update( $wpdb->links, compact('link_name', 'link_description'), array('link_id' => $link->link_id) ); + } + } + + $active_plugins = __get_option('active_plugins'); + + // If plugins are not stored in an array, they're stored in the old + // newline separated format. Convert to new format. + if ( !is_array( $active_plugins ) ) { + $active_plugins = explode("\n", trim($active_plugins)); + update_option('active_plugins', $active_plugins); + } + + // Obsolete tables + $wpdb->query('DROP TABLE IF EXISTS ' . $wpdb->prefix . 'optionvalues'); + $wpdb->query('DROP TABLE IF EXISTS ' . $wpdb->prefix . 'optiontypes'); + $wpdb->query('DROP TABLE IF EXISTS ' . $wpdb->prefix . 'optiongroups'); + $wpdb->query('DROP TABLE IF EXISTS ' . $wpdb->prefix . 'optiongroup_options'); + + // Update comments table to use comment_type + $wpdb->query("UPDATE $wpdb->comments SET comment_type='trackback', comment_content = REPLACE(comment_content, '', '') WHERE comment_content LIKE '%'"); + $wpdb->query("UPDATE $wpdb->comments SET comment_type='pingback', comment_content = REPLACE(comment_content, '', '') WHERE comment_content LIKE '%'"); + + // Some versions have multiple duplicate option_name rows with the same values + $options = $wpdb->get_results("SELECT option_name, COUNT(option_name) AS dupes FROM `$wpdb->options` GROUP BY option_name"); + foreach ( $options as $option ) { + if ( 1 != $option->dupes ) { // Could this be done in the query? + $limit = $option->dupes - 1; + $dupe_ids = $wpdb->get_col( $wpdb->prepare("SELECT option_id FROM $wpdb->options WHERE option_name = %s LIMIT %d", $option->option_name, $limit) ); + if ( $dupe_ids ) { + $dupe_ids = join($dupe_ids, ','); + $wpdb->query("DELETE FROM $wpdb->options WHERE option_id IN ($dupe_ids)"); + } + } + } + + make_site_theme(); +} + +/** + * Execute changes made in WordPress 2.0. + * + * @since 2.0.0 + */ +function upgrade_160() { + global $wpdb, $wp_current_db_version; + + populate_roles_160(); + + $users = $wpdb->get_results("SELECT * FROM $wpdb->users"); + foreach ( $users as $user ) : + if ( !empty( $user->user_firstname ) ) + update_user_meta( $user->ID, 'first_name', $wpdb->escape($user->user_firstname) ); + if ( !empty( $user->user_lastname ) ) + update_user_meta( $user->ID, 'last_name', $wpdb->escape($user->user_lastname) ); + if ( !empty( $user->user_nickname ) ) + update_user_meta( $user->ID, 'nickname', $wpdb->escape($user->user_nickname) ); + if ( !empty( $user->user_level ) ) + update_user_meta( $user->ID, $wpdb->prefix . 'user_level', $user->user_level ); + if ( !empty( $user->user_icq ) ) + update_user_meta( $user->ID, 'icq', $wpdb->escape($user->user_icq) ); + if ( !empty( $user->user_aim ) ) + update_user_meta( $user->ID, 'aim', $wpdb->escape($user->user_aim) ); + if ( !empty( $user->user_msn ) ) + update_user_meta( $user->ID, 'msn', $wpdb->escape($user->user_msn) ); + if ( !empty( $user->user_yim ) ) + update_user_meta( $user->ID, 'yim', $wpdb->escape($user->user_icq) ); + if ( !empty( $user->user_description ) ) + update_user_meta( $user->ID, 'description', $wpdb->escape($user->user_description) ); + + if ( isset( $user->user_idmode ) ): + $idmode = $user->user_idmode; + if ($idmode == 'nickname') $id = $user->user_nickname; + if ($idmode == 'login') $id = $user->user_login; + if ($idmode == 'firstname') $id = $user->user_firstname; + if ($idmode == 'lastname') $id = $user->user_lastname; + if ($idmode == 'namefl') $id = $user->user_firstname.' '.$user->user_lastname; + if ($idmode == 'namelf') $id = $user->user_lastname.' '.$user->user_firstname; + if (!$idmode) $id = $user->user_nickname; + $wpdb->update( $wpdb->users, array('display_name' => $id), array('ID' => $user->ID) ); + endif; + + // FIXME: RESET_CAPS is temporary code to reset roles and caps if flag is set. + $caps = get_user_meta( $user->ID, $wpdb->prefix . 'capabilities'); + if ( empty($caps) || defined('RESET_CAPS') ) { + $level = get_user_meta($user->ID, $wpdb->prefix . 'user_level', true); + $role = translate_level_to_role($level); + update_user_meta( $user->ID, $wpdb->prefix . 'capabilities', array($role => true) ); + } + + endforeach; + $old_user_fields = array( 'user_firstname', 'user_lastname', 'user_icq', 'user_aim', 'user_msn', 'user_yim', 'user_idmode', 'user_ip', 'user_domain', 'user_browser', 'user_description', 'user_nickname', 'user_level' ); + $wpdb->hide_errors(); + foreach ( $old_user_fields as $old ) + $wpdb->query("ALTER TABLE $wpdb->users DROP $old"); + $wpdb->show_errors(); + + // populate comment_count field of posts table + $comments = $wpdb->get_results( "SELECT comment_post_ID, COUNT(*) as c FROM $wpdb->comments WHERE comment_approved = '1' GROUP BY comment_post_ID" ); + if ( is_array( $comments ) ) + foreach ($comments as $comment) + $wpdb->update( $wpdb->posts, array('comment_count' => $comment->c), array('ID' => $comment->comment_post_ID) ); + + // Some alpha versions used a post status of object instead of attachment and put + // the mime type in post_type instead of post_mime_type. + if ( $wp_current_db_version > 2541 && $wp_current_db_version <= 3091 ) { + $objects = $wpdb->get_results("SELECT ID, post_type FROM $wpdb->posts WHERE post_status = 'object'"); + foreach ($objects as $object) { + $wpdb->update( $wpdb->posts, array( 'post_status' => 'attachment', + 'post_mime_type' => $object->post_type, + 'post_type' => ''), + array( 'ID' => $object->ID ) ); + + $meta = get_post_meta($object->ID, 'imagedata', true); + if ( ! empty($meta['file']) ) + update_attached_file( $object->ID, $meta['file'] ); + } + } +} + +/** + * Execute changes made in WordPress 2.1. + * + * @since 2.1.0 + */ +function upgrade_210() { + global $wpdb, $wp_current_db_version; + + if ( $wp_current_db_version < 3506 ) { + // Update status and type. + $posts = $wpdb->get_results("SELECT ID, post_status FROM $wpdb->posts"); + + if ( ! empty($posts) ) foreach ($posts as $post) { + $status = $post->post_status; + $type = 'post'; + + if ( 'static' == $status ) { + $status = 'publish'; + $type = 'page'; + } else if ( 'attachment' == $status ) { + $status = 'inherit'; + $type = 'attachment'; + } + + $wpdb->query( $wpdb->prepare("UPDATE $wpdb->posts SET post_status = %s, post_type = %s WHERE ID = %d", $status, $type, $post->ID) ); + } + } + + if ( $wp_current_db_version < 3845 ) { + populate_roles_210(); + } + + if ( $wp_current_db_version < 3531 ) { + // Give future posts a post_status of future. + $now = gmdate('Y-m-d H:i:59'); + $wpdb->query ("UPDATE $wpdb->posts SET post_status = 'future' WHERE post_status = 'publish' AND post_date_gmt > '$now'"); + + $posts = $wpdb->get_results("SELECT ID, post_date FROM $wpdb->posts WHERE post_status ='future'"); + if ( !empty($posts) ) + foreach ( $posts as $post ) + wp_schedule_single_event(mysql2date('U', $post->post_date, false), 'publish_future_post', array($post->ID)); + } +} + +/** + * Execute changes made in WordPress 2.3. + * + * @since 2.3.0 + */ +function upgrade_230() { + global $wp_current_db_version, $wpdb; + + if ( $wp_current_db_version < 5200 ) { + populate_roles_230(); + } + + // Convert categories to terms. + $tt_ids = array(); + $have_tags = false; + $categories = $wpdb->get_results("SELECT * FROM $wpdb->categories ORDER BY cat_ID"); + foreach ($categories as $category) { + $term_id = (int) $category->cat_ID; + $name = $category->cat_name; + $description = $category->category_description; + $slug = $category->category_nicename; + $parent = $category->category_parent; + $term_group = 0; + + // Associate terms with the same slug in a term group and make slugs unique. + if ( $exists = $wpdb->get_results( $wpdb->prepare("SELECT term_id, term_group FROM $wpdb->terms WHERE slug = %s", $slug) ) ) { + $term_group = $exists[0]->term_group; + $id = $exists[0]->term_id; + $num = 2; + do { + $alt_slug = $slug . "-$num"; + $num++; + $slug_check = $wpdb->get_var( $wpdb->prepare("SELECT slug FROM $wpdb->terms WHERE slug = %s", $alt_slug) ); + } while ( $slug_check ); + + $slug = $alt_slug; + + if ( empty( $term_group ) ) { + $term_group = $wpdb->get_var("SELECT MAX(term_group) FROM $wpdb->terms GROUP BY term_group") + 1; + $wpdb->query( $wpdb->prepare("UPDATE $wpdb->terms SET term_group = %d WHERE term_id = %d", $term_group, $id) ); + } + } + + $wpdb->query( $wpdb->prepare("INSERT INTO $wpdb->terms (term_id, name, slug, term_group) VALUES + (%d, %s, %s, %d)", $term_id, $name, $slug, $term_group) ); + + $count = 0; + if ( !empty($category->category_count) ) { + $count = (int) $category->category_count; + $taxonomy = 'category'; + $wpdb->query( $wpdb->prepare("INSERT INTO $wpdb->term_taxonomy (term_id, taxonomy, description, parent, count) VALUES ( %d, %s, %s, %d, %d)", $term_id, $taxonomy, $description, $parent, $count) ); + $tt_ids[$term_id][$taxonomy] = (int) $wpdb->insert_id; + } + + if ( !empty($category->link_count) ) { + $count = (int) $category->link_count; + $taxonomy = 'link_category'; + $wpdb->query( $wpdb->prepare("INSERT INTO $wpdb->term_taxonomy (term_id, taxonomy, description, parent, count) VALUES ( %d, %s, %s, %d, %d)", $term_id, $taxonomy, $description, $parent, $count) ); + $tt_ids[$term_id][$taxonomy] = (int) $wpdb->insert_id; + } + + if ( !empty($category->tag_count) ) { + $have_tags = true; + $count = (int) $category->tag_count; + $taxonomy = 'post_tag'; + $wpdb->insert( $wpdb->term_taxonomy, compact('term_id', 'taxonomy', 'description', 'parent', 'count') ); + $tt_ids[$term_id][$taxonomy] = (int) $wpdb->insert_id; + } + + if ( empty($count) ) { + $count = 0; + $taxonomy = 'category'; + $wpdb->insert( $wpdb->term_taxonomy, compact('term_id', 'taxonomy', 'description', 'parent', 'count') ); + $tt_ids[$term_id][$taxonomy] = (int) $wpdb->insert_id; + } + } + + $select = 'post_id, category_id'; + if ( $have_tags ) + $select .= ', rel_type'; + + $posts = $wpdb->get_results("SELECT $select FROM $wpdb->post2cat GROUP BY post_id, category_id"); + foreach ( $posts as $post ) { + $post_id = (int) $post->post_id; + $term_id = (int) $post->category_id; + $taxonomy = 'category'; + if ( !empty($post->rel_type) && 'tag' == $post->rel_type) + $taxonomy = 'tag'; + $tt_id = $tt_ids[$term_id][$taxonomy]; + if ( empty($tt_id) ) + continue; + + $wpdb->insert( $wpdb->term_relationships, array('object_id' => $post_id, 'term_taxonomy_id' => $tt_id) ); + } + + // < 3570 we used linkcategories. >= 3570 we used categories and link2cat. + if ( $wp_current_db_version < 3570 ) { + // Create link_category terms for link categories. Create a map of link cat IDs + // to link_category terms. + $link_cat_id_map = array(); + $default_link_cat = 0; + $tt_ids = array(); + $link_cats = $wpdb->get_results("SELECT cat_id, cat_name FROM " . $wpdb->prefix . 'linkcategories'); + foreach ( $link_cats as $category) { + $cat_id = (int) $category->cat_id; + $term_id = 0; + $name = $wpdb->escape($category->cat_name); + $slug = sanitize_title($name); + $term_group = 0; + + // Associate terms with the same slug in a term group and make slugs unique. + if ( $exists = $wpdb->get_results( $wpdb->prepare("SELECT term_id, term_group FROM $wpdb->terms WHERE slug = %s", $slug) ) ) { + $term_group = $exists[0]->term_group; + $term_id = $exists[0]->term_id; + } + + if ( empty($term_id) ) { + $wpdb->insert( $wpdb->terms, compact('name', 'slug', 'term_group') ); + $term_id = (int) $wpdb->insert_id; + } + + $link_cat_id_map[$cat_id] = $term_id; + $default_link_cat = $term_id; + + $wpdb->insert( $wpdb->term_taxonomy, array('term_id' => $term_id, 'taxonomy' => 'link_category', 'description' => '', 'parent' => 0, 'count' => 0) ); + $tt_ids[$term_id] = (int) $wpdb->insert_id; + } + + // Associate links to cats. + $links = $wpdb->get_results("SELECT link_id, link_category FROM $wpdb->links"); + if ( !empty($links) ) foreach ( $links as $link ) { + if ( 0 == $link->link_category ) + continue; + if ( ! isset($link_cat_id_map[$link->link_category]) ) + continue; + $term_id = $link_cat_id_map[$link->link_category]; + $tt_id = $tt_ids[$term_id]; + if ( empty($tt_id) ) + continue; + + $wpdb->insert( $wpdb->term_relationships, array('object_id' => $link->link_id, 'term_taxonomy_id' => $tt_id) ); + } + + // Set default to the last category we grabbed during the upgrade loop. + update_option('default_link_category', $default_link_cat); + } else { + $links = $wpdb->get_results("SELECT link_id, category_id FROM $wpdb->link2cat GROUP BY link_id, category_id"); + foreach ( $links as $link ) { + $link_id = (int) $link->link_id; + $term_id = (int) $link->category_id; + $taxonomy = 'link_category'; + $tt_id = $tt_ids[$term_id][$taxonomy]; + if ( empty($tt_id) ) + continue; + $wpdb->insert( $wpdb->term_relationships, array('object_id' => $link_id, 'term_taxonomy_id' => $tt_id) ); + } + } + + if ( $wp_current_db_version < 4772 ) { + // Obsolete linkcategories table + $wpdb->query('DROP TABLE IF EXISTS ' . $wpdb->prefix . 'linkcategories'); + } + + // Recalculate all counts + $terms = $wpdb->get_results("SELECT term_taxonomy_id, taxonomy FROM $wpdb->term_taxonomy"); + foreach ( (array) $terms as $term ) { + if ( ('post_tag' == $term->taxonomy) || ('category' == $term->taxonomy) ) + $count = $wpdb->get_var( $wpdb->prepare("SELECT COUNT(*) FROM $wpdb->term_relationships, $wpdb->posts WHERE $wpdb->posts.ID = $wpdb->term_relationships.object_id AND post_status = 'publish' AND post_type = 'post' AND term_taxonomy_id = %d", $term->term_taxonomy_id) ); + else + $count = $wpdb->get_var( $wpdb->prepare("SELECT COUNT(*) FROM $wpdb->term_relationships WHERE term_taxonomy_id = %d", $term->term_taxonomy_id) ); + $wpdb->update( $wpdb->term_taxonomy, array('count' => $count), array('term_taxonomy_id' => $term->term_taxonomy_id) ); + } +} + +/** + * Remove old options from the database. + * + * @since 2.3.0 + */ +function upgrade_230_options_table() { + global $wpdb; + $old_options_fields = array( 'option_can_override', 'option_type', 'option_width', 'option_height', 'option_description', 'option_admin_level' ); + $wpdb->hide_errors(); + foreach ( $old_options_fields as $old ) + $wpdb->query("ALTER TABLE $wpdb->options DROP $old"); + $wpdb->show_errors(); +} + +/** + * Remove old categories, link2cat, and post2cat database tables. + * + * @since 2.3.0 + */ +function upgrade_230_old_tables() { + global $wpdb; + $wpdb->query('DROP TABLE IF EXISTS ' . $wpdb->prefix . 'categories'); + $wpdb->query('DROP TABLE IF EXISTS ' . $wpdb->prefix . 'link2cat'); + $wpdb->query('DROP TABLE IF EXISTS ' . $wpdb->prefix . 'post2cat'); +} + +/** + * Upgrade old slugs made in version 2.2. + * + * @since 2.2.0 + */ +function upgrade_old_slugs() { + // upgrade people who were using the Redirect Old Slugs plugin + global $wpdb; + $wpdb->query("UPDATE $wpdb->postmeta SET meta_key = '_wp_old_slug' WHERE meta_key = 'old_slug'"); +} + +/** + * Execute changes made in WordPress 2.5.0. + * + * @since 2.5.0 + */ +function upgrade_250() { + global $wp_current_db_version; + + if ( $wp_current_db_version < 6689 ) { + populate_roles_250(); + } + +} + +/** + * Execute changes made in WordPress 2.5.2. + * + * @since 2.5.2 + */ +function upgrade_252() { + global $wpdb; + + $wpdb->query("UPDATE $wpdb->users SET user_activation_key = ''"); +} + +/** + * Execute changes made in WordPress 2.6. + * + * @since 2.6.0 + */ +function upgrade_260() { + global $wp_current_db_version; + + if ( $wp_current_db_version < 8000 ) + populate_roles_260(); + + if ( $wp_current_db_version < 8201 ) { + update_option('enable_app', 1); + update_option('enable_xmlrpc', 1); + } +} + +/** + * Execute changes made in WordPress 2.7. + * + * @since 2.7.0 + */ +function upgrade_270() { + global $wpdb, $wp_current_db_version; + + if ( $wp_current_db_version < 8980 ) + populate_roles_270(); + + // Update post_date for unpublished posts with empty timestamp + if ( $wp_current_db_version < 8921 ) + $wpdb->query( "UPDATE $wpdb->posts SET post_date = post_modified WHERE post_date = '0000-00-00 00:00:00'" ); +} + +/** + * Execute changes made in WordPress 2.8. + * + * @since 2.8.0 + */ +function upgrade_280() { + global $wp_current_db_version, $wpdb; + + if ( $wp_current_db_version < 10360 ) + populate_roles_280(); + if ( is_multisite() ) { + $start = 0; + while( $rows = $wpdb->get_results( "SELECT option_name, option_value FROM $wpdb->options ORDER BY option_id LIMIT $start, 20" ) ) { + foreach( $rows as $row ) { + $value = $row->option_value; + if ( !@unserialize( $value ) ) + $value = stripslashes( $value ); + if ( $value !== $row->option_value ) { + update_option( $row->option_name, $value ); + } + } + $start += 20; + } + refresh_blog_details( $wpdb->blogid ); + } +} + +/** + * Execute changes made in WordPress 2.9. + * + * @since 2.9.0 + */ +function upgrade_290() { + global $wp_current_db_version; + + if ( $wp_current_db_version < 11958 ) { + // Previously, setting depth to 1 would redundantly disable threading, but now 2 is the minimum depth to avoid confusion + if ( get_option( 'thread_comments_depth' ) == '1' ) { + update_option( 'thread_comments_depth', 2 ); + update_option( 'thread_comments', 0 ); + } + } +} + +/** + * Execute changes made in WordPress 3.0. + * + * @since 3.0.0 + */ +function upgrade_300() { + global $wp_current_db_version, $wpdb; + + if ( $wp_current_db_version < 15093 ) + populate_roles_300(); + + if ( $wp_current_db_version < 14139 && is_multisite() && is_main_site() && ! defined( 'MULTISITE' ) && get_site_option( 'siteurl' ) === false ) + add_site_option( 'siteurl', '' ); + + // 3.0-alpha nav menu postmeta changes. can be removed before release. // r13802 + if ( $wp_current_db_version >= 13226 && $wp_current_db_version < 13974 ) + $wpdb->query( "DELETE FROM $wpdb->postmeta WHERE meta_key IN( 'menu_type', 'object_id', 'menu_new_window', 'menu_link', '_menu_item_append', 'menu_item_append', 'menu_item_type', 'menu_item_object_id', 'menu_item_target', 'menu_item_classes', 'menu_item_xfn', 'menu_item_url' )" ); + + // 3.0-beta1 remove_user primitive->meta cap. can be removed before release. r13956 + if ( $wp_current_db_version >= 12751 && $wp_current_db_version < 13974 ) { + $role =& get_role( 'administrator' ); + if ( ! empty( $role ) ) + $role->remove_cap( 'remove_user' ); + } + + // 3.0-beta1 nav menu postmeta changes. can be removed before release. r13974 + if ( $wp_current_db_version >= 13802 && $wp_current_db_version < 13974 ) + $wpdb->update( $wpdb->postmeta, array( 'meta_value' => '' ), array( 'meta_key' => '_menu_item_target', 'meta_value' => '_self' ) ); + + // 3.0 screen options key name changes. + if ( is_main_site() && !defined('DO_NOT_UPGRADE_GLOBAL_TABLES') ) { + $prefix = like_escape($wpdb->base_prefix); + $wpdb->query( "DELETE FROM $wpdb->usermeta WHERE meta_key LIKE '{$prefix}%meta-box-hidden%' OR meta_key LIKE '{$prefix}%closedpostboxes%' OR meta_key LIKE '{$prefix}%manage-%-columns-hidden%' OR meta_key LIKE '{$prefix}%meta-box-order%' OR meta_key LIKE '{$prefix}%metaboxorder%' OR meta_key LIKE '{$prefix}%screen_layout%' + OR meta_key = 'manageedittagscolumnshidden' OR meta_key='managecategoriescolumnshidden' OR meta_key = 'manageedit-tagscolumnshidden' OR meta_key = 'manageeditcolumnshidden' OR meta_key = 'categories_per_page' OR meta_key = 'edit_tags_per_page'" ); + } + +} + +/** + * Execute network level changes + * + * @since 3.0.0 + */ +function upgrade_network() { + global $wp_current_db_version, $wpdb; + // 2.8 + if ( $wp_current_db_version < 11549 ) { + $wpmu_sitewide_plugins = get_site_option( 'wpmu_sitewide_plugins' ); + $active_sitewide_plugins = get_site_option( 'active_sitewide_plugins' ); + if ( $wpmu_sitewide_plugins ) { + if ( !$active_sitewide_plugins ) + $sitewide_plugins = (array) $wpmu_sitewide_plugins; + else + $sitewide_plugins = array_merge( (array) $active_sitewide_plugins, (array) $wpmu_sitewide_plugins ); + + update_site_option( 'active_sitewide_plugins', $sitewide_plugins ); + } + delete_site_option( 'wpmu_sitewide_plugins' ); + delete_site_option( 'deactivated_sitewide_plugins' ); + + $start = 0; + while( $rows = $wpdb->get_results( "SELECT meta_key, meta_value FROM {$wpdb->sitemeta} ORDER BY meta_id LIMIT $start, 20" ) ) { + foreach( $rows as $row ) { + $value = $row->meta_value; + if ( !@unserialize( $value ) ) + $value = stripslashes( $value ); + if ( $value !== $row->meta_value ) { + update_site_option( $row->meta_key, $value ); + } + } + $start += 20; + } + } + // 3.0 + if ( $wp_current_db_version < 13576 ) + update_site_option( 'global_terms_enabled', '1' ); +} + +// The functions we use to actually do stuff + +// General + +/** + * {@internal Missing Short Description}} + * + * {@internal Missing Long Description}} + * + * @since 1.0.0 + * + * @param string $table_name Database table name to create. + * @param string $create_ddl SQL statement to create table. + * @return bool If table already exists or was created by function. + */ +function maybe_create_table($table_name, $create_ddl) { + global $wpdb; + if ( $wpdb->get_var("SHOW TABLES LIKE '$table_name'") == $table_name ) + return true; + //didn't find it try to create it. + $q = $wpdb->query($create_ddl); + // we cannot directly tell that whether this succeeded! + if ( $wpdb->get_var("SHOW TABLES LIKE '$table_name'") == $table_name ) + return true; + return false; +} + +/** + * {@internal Missing Short Description}} + * + * {@internal Missing Long Description}} + * + * @since 1.0.1 + * + * @param string $table Database table name. + * @param string $index Index name to drop. + * @return bool True, when finished. + */ +function drop_index($table, $index) { + global $wpdb; + $wpdb->hide_errors(); + $wpdb->query("ALTER TABLE `$table` DROP INDEX `$index`"); + // Now we need to take out all the extra ones we may have created + for ($i = 0; $i < 25; $i++) { + $wpdb->query("ALTER TABLE `$table` DROP INDEX `{$index}_$i`"); + } + $wpdb->show_errors(); + return true; +} + +/** + * {@internal Missing Short Description}} + * + * {@internal Missing Long Description}} + * + * @since 1.0.1 + * + * @param string $table Database table name. + * @param string $index Database table index column. + * @return bool True, when done with execution. + */ +function add_clean_index($table, $index) { + global $wpdb; + drop_index($table, $index); + $wpdb->query("ALTER TABLE `$table` ADD INDEX ( `$index` )"); + return true; +} + +/** + ** maybe_add_column() + ** Add column to db table if it doesn't exist. + ** Returns: true if already exists or on successful completion + ** false on error + */ +function maybe_add_column($table_name, $column_name, $create_ddl) { + global $wpdb, $debug; + foreach ($wpdb->get_col("DESC $table_name", 0) as $column ) { + if ($debug) echo("checking $column == $column_name
    "); + if ($column == $column_name) { + return true; + } + } + //didn't find it try to create it. + $q = $wpdb->query($create_ddl); + // we cannot directly tell that whether this succeeded! + foreach ($wpdb->get_col("DESC $table_name", 0) as $column ) { + if ($column == $column_name) { + return true; + } + } + return false; +} + +/** + * Retrieve all options as it was for 1.2. + * + * @since 1.2.0 + * + * @return array List of options. + */ +function get_alloptions_110() { + global $wpdb; + if ($options = $wpdb->get_results("SELECT option_name, option_value FROM $wpdb->options")) { + foreach ($options as $option) { + // "When trying to design a foolproof system, + // never underestimate the ingenuity of the fools :)" -- Dougal + if ('siteurl' == $option->option_name) $option->option_value = preg_replace('|/+$|', '', $option->option_value); + if ('home' == $option->option_name) $option->option_value = preg_replace('|/+$|', '', $option->option_value); + if ('category_base' == $option->option_name) $option->option_value = preg_replace('|/+$|', '', $option->option_value); + $all_options->{$option->option_name} = stripslashes($option->option_value); + } + } + return $all_options; +} + +/** + * Version of get_option that is private to install/upgrade. + * + * @since 1.5.1 + * @access private + * + * @param string $setting Option name. + * @return mixed + */ +function __get_option($setting) { + global $wpdb; + + if ( $setting == 'home' && defined( 'WP_HOME' ) ) { + return preg_replace( '|/+$|', '', WP_HOME ); + } + + if ( $setting == 'siteurl' && defined( 'WP_SITEURL' ) ) { + return preg_replace( '|/+$|', '', WP_SITEURL ); + } + + $option = $wpdb->get_var( $wpdb->prepare("SELECT option_value FROM $wpdb->options WHERE option_name = %s", $setting) ); + + if ( 'home' == $setting && '' == $option ) + return __get_option('siteurl'); + + if ( 'siteurl' == $setting || 'home' == $setting || 'category_base' == $setting ) + $option = preg_replace('|/+$|', '', $option); + + @ $kellogs = unserialize($option); + if ($kellogs !== FALSE) + return $kellogs; + else + return $option; +} + +/** + * {@internal Missing Short Description}} + * + * {@internal Missing Long Description}} + * + * @since 1.5.0 + * + * @param string $content + * @return string + */ +function deslash($content) { + // Note: \\\ inside a regex denotes a single backslash. + + // Replace one or more backslashes followed by a single quote with + // a single quote. + $content = preg_replace("/\\\+'/", "'", $content); + + // Replace one or more backslashes followed by a double quote with + // a double quote. + $content = preg_replace('/\\\+"/', '"', $content); + + // Replace one or more backslashes with one backslash. + $content = preg_replace("/\\\+/", "\\", $content); + + return $content; +} + +/** + * {@internal Missing Short Description}} + * + * {@internal Missing Long Description}} + * + * @since 1.5.0 + * + * @param unknown_type $queries + * @param unknown_type $execute + * @return unknown + */ +function dbDelta($queries, $execute = true) { + global $wpdb; + + // Separate individual queries into an array + if ( !is_array($queries) ) { + $queries = explode( ';', $queries ); + if ('' == $queries[count($queries) - 1]) array_pop($queries); + } + + $cqueries = array(); // Creation Queries + $iqueries = array(); // Insertion Queries + $for_update = array(); + + // Create a tablename index for an array ($cqueries) of queries + foreach($queries as $qry) { + if (preg_match("|CREATE TABLE ([^ ]*)|", $qry, $matches)) { + $cqueries[trim( strtolower($matches[1]), '`' )] = $qry; + $for_update[$matches[1]] = 'Created table '.$matches[1]; + } else if (preg_match("|CREATE DATABASE ([^ ]*)|", $qry, $matches)) { + array_unshift($cqueries, $qry); + } else if (preg_match("|INSERT INTO ([^ ]*)|", $qry, $matches)) { + $iqueries[] = $qry; + } else if (preg_match("|UPDATE ([^ ]*)|", $qry, $matches)) { + $iqueries[] = $qry; + } else { + // Unrecognized query type + } + } + + // Check to see which tables and fields exist + if ($tables = $wpdb->get_col('SHOW TABLES;')) { + // For every table in the database + foreach ($tables as $table) { + // Upgrade global tables only for the main site. Don't upgrade at all if DO_NOT_UPGRADE_GLOBAL_TABLES is defined. + if ( in_array($table, $wpdb->tables('global')) && ( !is_main_site() || defined('DO_NOT_UPGRADE_GLOBAL_TABLES') ) ) + continue; + + // If a table query exists for the database table... + if ( array_key_exists(strtolower($table), $cqueries) ) { + // Clear the field and index arrays + $cfields = $indices = array(); + // Get all of the field names in the query from between the parens + preg_match("|\((.*)\)|ms", $cqueries[strtolower($table)], $match2); + $qryline = trim($match2[1]); + + // Separate field lines into an array + $flds = explode("\n", $qryline); + + //echo "
    \n".print_r(strtolower($table), true).":\n".print_r($cqueries, true)."

    "; + + // For every field line specified in the query + foreach ($flds as $fld) { + // Extract the field name + preg_match("|^([^ ]*)|", trim($fld), $fvals); + $fieldname = trim( $fvals[1], '`' ); + + // Verify the found field name + $validfield = true; + switch (strtolower($fieldname)) { + case '': + case 'primary': + case 'index': + case 'fulltext': + case 'unique': + case 'key': + $validfield = false; + $indices[] = trim(trim($fld), ", \n"); + break; + } + $fld = trim($fld); + + // If it's a valid field, add it to the field array + if ($validfield) { + $cfields[strtolower($fieldname)] = trim($fld, ", \n"); + } + } + + // Fetch the table column structure from the database + $tablefields = $wpdb->get_results("DESCRIBE {$table};"); + + // For every field in the table + foreach ($tablefields as $tablefield) { + // If the table field exists in the field array... + if (array_key_exists(strtolower($tablefield->Field), $cfields)) { + // Get the field type from the query + preg_match("|".$tablefield->Field." ([^ ]*( unsigned)?)|i", $cfields[strtolower($tablefield->Field)], $matches); + $fieldtype = $matches[1]; + + // Is actual field type different from the field type in query? + if ($tablefield->Type != $fieldtype) { + // Add a query to change the column type + $cqueries[] = "ALTER TABLE {$table} CHANGE COLUMN {$tablefield->Field} " . $cfields[strtolower($tablefield->Field)]; + $for_update[$table.'.'.$tablefield->Field] = "Changed type of {$table}.{$tablefield->Field} from {$tablefield->Type} to {$fieldtype}"; + } + + // Get the default value from the array + //echo "{$cfields[strtolower($tablefield->Field)]}
    "; + if (preg_match("| DEFAULT '(.*)'|i", $cfields[strtolower($tablefield->Field)], $matches)) { + $default_value = $matches[1]; + if ($tablefield->Default != $default_value) { + // Add a query to change the column's default value + $cqueries[] = "ALTER TABLE {$table} ALTER COLUMN {$tablefield->Field} SET DEFAULT '{$default_value}'"; + $for_update[$table.'.'.$tablefield->Field] = "Changed default value of {$table}.{$tablefield->Field} from {$tablefield->Default} to {$default_value}"; + } + } + + // Remove the field from the array (so it's not added) + unset($cfields[strtolower($tablefield->Field)]); + } else { + // This field exists in the table, but not in the creation queries? + } + } + + // For every remaining field specified for the table + foreach ($cfields as $fieldname => $fielddef) { + // Push a query line into $cqueries that adds the field to that table + $cqueries[] = "ALTER TABLE {$table} ADD COLUMN $fielddef"; + $for_update[$table.'.'.$fieldname] = 'Added column '.$table.'.'.$fieldname; + } + + // Index stuff goes here + // Fetch the table index structure from the database + $tableindices = $wpdb->get_results("SHOW INDEX FROM {$table};"); + + if ($tableindices) { + // Clear the index array + unset($index_ary); + + // For every index in the table + foreach ($tableindices as $tableindex) { + // Add the index to the index data array + $keyname = $tableindex->Key_name; + $index_ary[$keyname]['columns'][] = array('fieldname' => $tableindex->Column_name, 'subpart' => $tableindex->Sub_part); + $index_ary[$keyname]['unique'] = ($tableindex->Non_unique == 0)?true:false; + } + + // For each actual index in the index array + foreach ($index_ary as $index_name => $index_data) { + // Build a create string to compare to the query + $index_string = ''; + if ($index_name == 'PRIMARY') { + $index_string .= 'PRIMARY '; + } else if($index_data['unique']) { + $index_string .= 'UNIQUE '; + } + $index_string .= 'KEY '; + if ($index_name != 'PRIMARY') { + $index_string .= $index_name; + } + $index_columns = ''; + // For each column in the index + foreach ($index_data['columns'] as $column_data) { + if ($index_columns != '') $index_columns .= ','; + // Add the field to the column list string + $index_columns .= $column_data['fieldname']; + if ($column_data['subpart'] != '') { + $index_columns .= '('.$column_data['subpart'].')'; + } + } + // Add the column list to the index create string + $index_string .= ' ('.$index_columns.')'; + if (!(($aindex = array_search($index_string, $indices)) === false)) { + unset($indices[$aindex]); + //echo "
    {$table}:
    Found index:".$index_string."
    \n"; + } + //else echo "
    {$table}:
    Did not find index:".$index_string."
    ".print_r($indices, true)."
    \n"; + } + } + + // For every remaining index specified for the table + foreach ( (array) $indices as $index ) { + // Push a query line into $cqueries that adds the index to that table + $cqueries[] = "ALTER TABLE {$table} ADD $index"; + $for_update[$table.'.'.$fieldname] = 'Added index '.$table.' '.$index; + } + + // Remove the original table creation query from processing + unset($cqueries[strtolower($table)]); + unset($for_update[strtolower($table)]); + } else { + // This table exists in the database, but not in the creation queries? + } + } + } + + $allqueries = array_merge($cqueries, $iqueries); + if ($execute) { + foreach ($allqueries as $query) { + //echo "
    ".print_r($query, true)."
    \n"; + $wpdb->query($query); + } + } + + return $for_update; +} + +/** + * {@internal Missing Short Description}} + * + * {@internal Missing Long Description}} + * + * @since 1.5.0 + */ +function make_db_current() { + global $wp_queries; + + $alterations = dbDelta($wp_queries); + echo "
      \n"; + foreach($alterations as $alteration) echo "
    1. $alteration
    2. \n"; + echo "
    \n"; +} + +/** + * {@internal Missing Short Description}} + * + * {@internal Missing Long Description}} + * + * @since 1.5.0 + */ +function make_db_current_silent() { + global $wp_queries; + + $alterations = dbDelta($wp_queries); +} + +/** + * {@internal Missing Short Description}} + * + * {@internal Missing Long Description}} + * + * @since 1.5.0 + * + * @param unknown_type $theme_name + * @param unknown_type $template + * @return unknown + */ +function make_site_theme_from_oldschool($theme_name, $template) { + $home_path = get_home_path(); + $site_dir = WP_CONTENT_DIR . "/themes/$template"; + + if (! file_exists("$home_path/index.php")) + return false; + + // Copy files from the old locations to the site theme. + // TODO: This does not copy arbitarary include dependencies. Only the + // standard WP files are copied. + $files = array('index.php' => 'index.php', 'wp-layout.css' => 'style.css', 'wp-comments.php' => 'comments.php', 'wp-comments-popup.php' => 'comments-popup.php'); + + foreach ($files as $oldfile => $newfile) { + if ($oldfile == 'index.php') + $oldpath = $home_path; + else + $oldpath = ABSPATH; + + if ($oldfile == 'index.php') { // Check to make sure it's not a new index + $index = implode('', file("$oldpath/$oldfile")); + if (strpos($index, 'WP_USE_THEMES') !== false) { + if (! @copy(WP_CONTENT_DIR . '/themes/' . WP_DEFAULT_THEME . '/index.php', "$site_dir/$newfile")) + return false; + continue; // Don't copy anything + } + } + + if (! @copy("$oldpath/$oldfile", "$site_dir/$newfile")) + return false; + + chmod("$site_dir/$newfile", 0777); + + // Update the blog header include in each file. + $lines = explode("\n", implode('', file("$site_dir/$newfile"))); + if ($lines) { + $f = fopen("$site_dir/$newfile", 'w'); + + foreach ($lines as $line) { + if (preg_match('/require.*wp-blog-header/', $line)) + $line = '//' . $line; + + // Update stylesheet references. + $line = str_replace("/wp-layout.css", "", $line); + + // Update comments template inclusion. + $line = str_replace("", "", $line); + + fwrite($f, "{$line}\n"); + } + fclose($f); + } + } + + // Add a theme header. + $header = "/*\nTheme Name: $theme_name\nTheme URI: " . __get_option('siteurl') . "\nDescription: A theme automatically created by the update.\nVersion: 1.0\nAuthor: Moi\n*/\n"; + + $stylelines = file_get_contents("$site_dir/style.css"); + if ($stylelines) { + $f = fopen("$site_dir/style.css", 'w'); + + fwrite($f, $header); + fwrite($f, $stylelines); + fclose($f); + } + + return true; +} + +/** + * {@internal Missing Short Description}} + * + * {@internal Missing Long Description}} + * + * @since 1.5.0 + * + * @param unknown_type $theme_name + * @param unknown_type $template + * @return unknown + */ +function make_site_theme_from_default($theme_name, $template) { + $site_dir = WP_CONTENT_DIR . "/themes/$template"; + $default_dir = WP_CONTENT_DIR . '/themes/' . WP_DEFAULT_THEME; + + // Copy files from the default theme to the site theme. + //$files = array('index.php', 'comments.php', 'comments-popup.php', 'footer.php', 'header.php', 'sidebar.php', 'style.css'); + + $theme_dir = @ opendir($default_dir); + if ($theme_dir) { + while(($theme_file = readdir( $theme_dir )) !== false) { + if (is_dir("$default_dir/$theme_file")) + continue; + if (! @copy("$default_dir/$theme_file", "$site_dir/$theme_file")) + return; + chmod("$site_dir/$theme_file", 0777); + } + } + @closedir($theme_dir); + + // Rewrite the theme header. + $stylelines = explode("\n", implode('', file("$site_dir/style.css"))); + if ($stylelines) { + $f = fopen("$site_dir/style.css", 'w'); + + foreach ($stylelines as $line) { + if (strpos($line, 'Theme Name:') !== false) $line = 'Theme Name: ' . $theme_name; + elseif (strpos($line, 'Theme URI:') !== false) $line = 'Theme URI: ' . __get_option('url'); + elseif (strpos($line, 'Description:') !== false) $line = 'Description: Your theme.'; + elseif (strpos($line, 'Version:') !== false) $line = 'Version: 1'; + elseif (strpos($line, 'Author:') !== false) $line = 'Author: You'; + fwrite($f, $line . "\n"); + } + fclose($f); + } + + // Copy the images. + umask(0); + if (! mkdir("$site_dir/images", 0777)) { + return false; + } + + $images_dir = @ opendir("$default_dir/images"); + if ($images_dir) { + while(($image = readdir($images_dir)) !== false) { + if (is_dir("$default_dir/images/$image")) + continue; + if (! @copy("$default_dir/images/$image", "$site_dir/images/$image")) + return; + chmod("$site_dir/images/$image", 0777); + } + } + @closedir($images_dir); +} + +// Create a site theme from the default theme. +/** + * {@internal Missing Short Description}} + * + * {@internal Missing Long Description}} + * + * @since 1.5.0 + * + * @return unknown + */ +function make_site_theme() { + // Name the theme after the blog. + $theme_name = __get_option('blogname'); + $template = sanitize_title($theme_name); + $site_dir = WP_CONTENT_DIR . "/themes/$template"; + + // If the theme already exists, nothing to do. + if ( is_dir($site_dir)) { + return false; + } + + // We must be able to write to the themes dir. + if (! is_writable(WP_CONTENT_DIR . "/themes")) { + return false; + } + + umask(0); + if (! mkdir($site_dir, 0777)) { + return false; + } + + if (file_exists(ABSPATH . 'wp-layout.css')) { + if (! make_site_theme_from_oldschool($theme_name, $template)) { + // TODO: rm -rf the site theme directory. + return false; + } + } else { + if (! make_site_theme_from_default($theme_name, $template)) + // TODO: rm -rf the site theme directory. + return false; + } + + // Make the new site theme active. + $current_template = __get_option('template'); + if ($current_template == WP_DEFAULT_THEME) { + update_option('template', $template); + update_option('stylesheet', $template); + } + return $template; +} + +/** + * Translate user level to user role name. + * + * @since 2.0.0 + * + * @param int $level User level. + * @return string User role name. + */ +function translate_level_to_role($level) { + switch ($level) { + case 10: + case 9: + case 8: + return 'administrator'; + case 7: + case 6: + case 5: + return 'editor'; + case 4: + case 3: + case 2: + return 'author'; + case 1: + return 'contributor'; + case 0: + return 'subscriber'; + } +} + +/** + * {@internal Missing Short Description}} + * + * {@internal Missing Long Description}} + * + * @since 2.1.0 + */ +function wp_check_mysql_version() { + global $wpdb; + $result = $wpdb->check_database_version(); + if ( is_wp_error( $result ) ) + die( $result->get_error_message() ); +} + +/** + * {@internal Missing Short Description}} + * + * {@internal Missing Long Description}} + * + * @since 2.2.0 + */ +function maybe_disable_automattic_widgets() { + $plugins = __get_option( 'active_plugins' ); + + foreach ( (array) $plugins as $plugin ) { + if ( basename( $plugin ) == 'widgets.php' ) { + array_splice( $plugins, array_search( $plugin, $plugins ), 1 ); + update_option( 'active_plugins', $plugins ); + break; + } + } +} + +/** + * Runs before the schema is upgraded. + * + * @since 2.9.0 + */ +function pre_schema_upgrade() { + global $wp_current_db_version, $wp_db_version, $wpdb; + + // Upgrade versions prior to 2.9 + if ( $wp_current_db_version < 11557 ) { + // Delete duplicate options. Keep the option with the highest option_id. + $wpdb->query("DELETE o1 FROM $wpdb->options AS o1 JOIN $wpdb->options AS o2 USING (`option_name`) WHERE o2.option_id > o1.option_id"); + + // Drop the old primary key and add the new. + $wpdb->query("ALTER TABLE $wpdb->options DROP PRIMARY KEY, ADD PRIMARY KEY(option_id)"); + + // Drop the old option_name index. dbDelta() doesn't do the drop. + $wpdb->query("ALTER TABLE $wpdb->options DROP INDEX option_name"); + } + +} + +/** + * Install Network. + * + * @since 3.0.0 + * + */ +if ( !function_exists( 'install_network' ) ) : +function install_network() { + global $wpdb, $charset_collate; + $ms_queries = " +CREATE TABLE $wpdb->users ( + ID bigint(20) unsigned NOT NULL auto_increment, + user_login varchar(60) NOT NULL default '', + user_pass varchar(64) NOT NULL default '', + user_nicename varchar(50) NOT NULL default '', + user_email varchar(100) NOT NULL default '', + user_url varchar(100) NOT NULL default '', + user_registered datetime NOT NULL default '0000-00-00 00:00:00', + user_activation_key varchar(60) NOT NULL default '', + user_status int(11) NOT NULL default '0', + display_name varchar(250) NOT NULL default '', + spam tinyint(2) NOT NULL default '0', + deleted tinyint(2) NOT NULL default '0', + PRIMARY KEY (ID), + KEY user_login_key (user_login), + KEY user_nicename (user_nicename) +) $charset_collate; +CREATE TABLE $wpdb->blogs ( + blog_id bigint(20) NOT NULL auto_increment, + site_id bigint(20) NOT NULL default '0', + domain varchar(200) NOT NULL default '', + path varchar(100) NOT NULL default '', + registered datetime NOT NULL default '0000-00-00 00:00:00', + last_updated datetime NOT NULL default '0000-00-00 00:00:00', + public tinyint(2) NOT NULL default '1', + archived enum('0','1') NOT NULL default '0', + mature tinyint(2) NOT NULL default '0', + spam tinyint(2) NOT NULL default '0', + deleted tinyint(2) NOT NULL default '0', + lang_id int(11) NOT NULL default '0', + PRIMARY KEY (blog_id), + KEY domain (domain(50),path(5)), + KEY lang_id (lang_id) +) $charset_collate; +CREATE TABLE $wpdb->blog_versions ( + blog_id bigint(20) NOT NULL default '0', + db_version varchar(20) NOT NULL default '', + last_updated datetime NOT NULL default '0000-00-00 00:00:00', + PRIMARY KEY (blog_id), + KEY db_version (db_version) +) $charset_collate; +CREATE TABLE $wpdb->registration_log ( + ID bigint(20) NOT NULL auto_increment, + email varchar(255) NOT NULL default '', + IP varchar(30) NOT NULL default '', + blog_id bigint(20) NOT NULL default '0', + date_registered datetime NOT NULL default '0000-00-00 00:00:00', + PRIMARY KEY (ID), + KEY IP (IP) +) $charset_collate; +CREATE TABLE $wpdb->site ( + id bigint(20) NOT NULL auto_increment, + domain varchar(200) NOT NULL default '', + path varchar(100) NOT NULL default '', + PRIMARY KEY (id), + KEY domain (domain,path) +) $charset_collate; +CREATE TABLE $wpdb->sitemeta ( + meta_id bigint(20) NOT NULL auto_increment, + site_id bigint(20) NOT NULL default '0', + meta_key varchar(255) default NULL, + meta_value longtext, + PRIMARY KEY (meta_id), + KEY meta_key (meta_key), + KEY site_id (site_id) +) $charset_collate; +CREATE TABLE $wpdb->signups ( + domain varchar(200) NOT NULL default '', + path varchar(100) NOT NULL default '', + title longtext NOT NULL, + user_login varchar(60) NOT NULL default '', + user_email varchar(100) NOT NULL default '', + registered datetime NOT NULL default '0000-00-00 00:00:00', + activated datetime NOT NULL default '0000-00-00 00:00:00', + active tinyint(1) NOT NULL default '0', + activation_key varchar(50) NOT NULL default '', + meta longtext, + KEY activation_key (activation_key), + KEY domain (domain) +) $charset_collate; +"; +// now create tables + dbDelta( $ms_queries ); +} +endif; + +/** + * Install global terms. + * + * @since 3.0.0 + * + */ +if ( !function_exists( 'install_global_terms' ) ) : +function install_global_terms() { + global $wpdb, $charset_collate; + $ms_queries = " +CREATE TABLE $wpdb->sitecategories ( + cat_ID bigint(20) NOT NULL auto_increment, + cat_name varchar(55) NOT NULL default '', + category_nicename varchar(200) NOT NULL default '', + last_updated timestamp NOT NULL, + PRIMARY KEY (cat_ID), + KEY category_nicename (category_nicename), + KEY last_updated (last_updated) +) $charset_collate; +"; +// now create tables + dbDelta( $ms_queries ); +} +endif; +?> diff --git a/src/wp-admin/includes/user.php b/src/wp-admin/includes/user.php new file mode 100644 index 0000000..758c065 --- /dev/null +++ b/src/wp-admin/includes/user.php @@ -0,0 +1,383 @@ +role_objects[$new_role]->has_cap( 'edit_users' ) ) { + // If the new role isn't editable by the logged-in user die with error + $editable_roles = get_editable_roles(); + if ( empty( $editable_roles[$new_role] ) ) + wp_die(__('You can’t give users that role.')); + + $user = new WP_User( $user_id ); + $user->set_role( $new_role ); + } + } + } else { + add_action( 'user_register', 'add_user' ); // See above + return edit_user(); + } +} + +/** + * Edit user settings based on contents of $_POST + * + * Used on user-edit.php and profile.php to manage and process user options, passwords etc. + * + * @since 2.0 + * + * @param int $user_id Optional. User ID. + * @return int user id of the updated user + */ +function edit_user( $user_id = 0 ) { + global $wp_roles, $wpdb; + $user = new stdClass; + if ( $user_id ) { + $update = true; + $user->ID = (int) $user_id; + $userdata = get_userdata( $user_id ); + $user->user_login = $wpdb->escape( $userdata->user_login ); + } else { + $update = false; + } + + if ( !$update && isset( $_POST['user_login'] ) ) + $user->user_login = sanitize_user($_POST['user_login'], true); + + $pass1 = $pass2 = ''; + if ( isset( $_POST['pass1'] )) + $pass1 = $_POST['pass1']; + if ( isset( $_POST['pass2'] )) + $pass2 = $_POST['pass2']; + + if ( isset( $_POST['role'] ) && current_user_can( 'edit_users' ) ) { + $new_role = sanitize_text_field( $_POST['role'] ); + $potential_role = isset($wp_roles->role_objects[$new_role]) ? $wp_roles->role_objects[$new_role] : false; + // Don't let anyone with 'edit_users' (admins) edit their own role to something without it. + // Multisite super admins can freely edit their blog roles -- they possess all caps. + if ( ( is_multisite() && current_user_can( 'manage_sites' ) ) || $user_id != get_current_user_id() || ($potential_role && $potential_role->has_cap( 'edit_users' ) ) ) + $user->role = $new_role; + + // If the new role isn't editable by the logged-in user die with error + $editable_roles = get_editable_roles(); + if ( ! empty( $new_role ) && empty( $editable_roles[$new_role] ) ) + wp_die(__('You can’t give users that role.')); + } + + if ( isset( $_POST['email'] )) + $user->user_email = sanitize_text_field( $_POST['email'] ); + if ( isset( $_POST['url'] ) ) { + if ( empty ( $_POST['url'] ) || $_POST['url'] == 'http://' ) { + $user->user_url = ''; + } else { + $user->user_url = esc_url_raw( $_POST['url'] ); + $user->user_url = preg_match('/^(https?|ftps?|mailto|news|irc|gopher|nntp|feed|telnet):/is', $user->user_url) ? $user->user_url : 'http://'.$user->user_url; + } + } + if ( isset( $_POST['first_name'] ) ) + $user->first_name = sanitize_text_field( $_POST['first_name'] ); + if ( isset( $_POST['last_name'] ) ) + $user->last_name = sanitize_text_field( $_POST['last_name'] ); + if ( isset( $_POST['nickname'] ) ) + $user->nickname = sanitize_text_field( $_POST['nickname'] ); + if ( isset( $_POST['display_name'] ) ) + $user->display_name = sanitize_text_field( $_POST['display_name'] ); + + if ( isset( $_POST['description'] ) ) + $user->description = trim( $_POST['description'] ); + + foreach ( _wp_get_user_contactmethods( $user ) as $method => $name ) { + if ( isset( $_POST[$method] )) + $user->$method = sanitize_text_field( $_POST[$method] ); + } + + if ( $update ) { + $user->rich_editing = isset( $_POST['rich_editing'] ) && 'false' == $_POST['rich_editing'] ? 'false' : 'true'; + $user->admin_color = isset( $_POST['admin_color'] ) ? sanitize_text_field( $_POST['admin_color'] ) : 'fresh'; + $user->show_admin_bar_front = isset( $_POST['admin_bar_front'] ) ? 'true' : 'false'; + $user->show_admin_bar_admin = isset( $_POST['admin_bar_admin'] ) ? 'true' : 'false'; + } + + $user->comment_shortcuts = isset( $_POST['comment_shortcuts'] ) && 'true' == $_POST['comment_shortcuts'] ? 'true' : ''; + + $user->use_ssl = 0; + if ( !empty($_POST['use_ssl']) ) + $user->use_ssl = 1; + + $errors = new WP_Error(); + + /* checking that username has been typed */ + if ( $user->user_login == '' ) + $errors->add( 'user_login', __( 'ERROR: Please enter a username.' )); + + /* checking the password has been typed twice */ + do_action_ref_array( 'check_passwords', array ( $user->user_login, & $pass1, & $pass2 )); + + if ( $update ) { + if ( empty($pass1) && !empty($pass2) ) + $errors->add( 'pass', __( 'ERROR: You entered your new password only once.' ), array( 'form-field' => 'pass1' ) ); + elseif ( !empty($pass1) && empty($pass2) ) + $errors->add( 'pass', __( 'ERROR: You entered your new password only once.' ), array( 'form-field' => 'pass2' ) ); + } else { + if ( empty($pass1) ) + $errors->add( 'pass', __( 'ERROR: Please enter your password.' ), array( 'form-field' => 'pass1' ) ); + elseif ( empty($pass2) ) + $errors->add( 'pass', __( 'ERROR: Please enter your password twice.' ), array( 'form-field' => 'pass2' ) ); + } + + /* Check for "\" in password */ + if ( false !== strpos( stripslashes($pass1), "\\" ) ) + $errors->add( 'pass', __( 'ERROR: Passwords may not contain the character "\\".' ), array( 'form-field' => 'pass1' ) ); + + /* checking the password has been typed twice the same */ + if ( $pass1 != $pass2 ) + $errors->add( 'pass', __( 'ERROR: Please enter the same password in the two password fields.' ), array( 'form-field' => 'pass1' ) ); + + if ( !empty( $pass1 ) ) + $user->user_pass = $pass1; + + if ( !$update && isset( $_POST['user_login'] ) && !validate_username( $_POST['user_login'] ) ) + $errors->add( 'user_login', __( 'ERROR: This username is invalid because it uses illegal characters. Please enter a valid username.' )); + + if ( !$update && username_exists( $user->user_login ) ) + $errors->add( 'user_login', __( 'ERROR: This username is already registered. Please choose another one.' )); + + /* checking e-mail address */ + if ( empty( $user->user_email ) ) { + $errors->add( 'empty_email', __( 'ERROR: Please enter an e-mail address.' ), array( 'form-field' => 'email' ) ); + } elseif ( !is_email( $user->user_email ) ) { + $errors->add( 'invalid_email', __( 'ERROR: The e-mail address isn’t correct.' ), array( 'form-field' => 'email' ) ); + } elseif ( ( $owner_id = email_exists($user->user_email) ) && ( !$update || ( $owner_id != $user->ID ) ) ) { + $errors->add( 'email_exists', __('ERROR: This email is already registered, please choose another one.'), array( 'form-field' => 'email' ) ); + } + + // Allow plugins to return their own errors. + do_action_ref_array('user_profile_update_errors', array ( &$errors, $update, &$user ) ); + + if ( $errors->get_error_codes() ) + return $errors; + + if ( $update ) { + $user_id = wp_update_user( get_object_vars( $user ) ); + } else { + $user_id = wp_insert_user( get_object_vars( $user ) ); + wp_new_user_notification( $user_id, isset($_POST['send_password']) ? $pass1 : '' ); + } + return $user_id; +} + +/** + * Fetch a filtered list of user roles that the current user is + * allowed to edit. + * + * Simple function who's main purpose is to allow filtering of the + * list of roles in the $wp_roles object so that plugins can remove + * innappropriate ones depending on the situation or user making edits. + * Specifically because without filtering anyone with the edit_users + * capability can edit others to be administrators, even if they are + * only editors or authors. This filter allows admins to delegate + * user management. + * + * @since 2.8 + * + * @return unknown + */ +function get_editable_roles() { + global $wp_roles; + + $all_roles = $wp_roles->roles; + $editable_roles = apply_filters('editable_roles', $all_roles); + + return $editable_roles; +} + +/** + * Retrieve user data and filter it. + * + * @since 2.0.5 + * + * @param int $user_id User ID. + * @return object WP_User object with user data. + */ +function get_user_to_edit( $user_id ) { + $user = new WP_User( $user_id ); + + $user_contactmethods = _wp_get_user_contactmethods( $user ); + foreach ($user_contactmethods as $method => $name) { + if ( empty( $user->{$method} ) ) + $user->{$method} = ''; + } + + if ( empty($user->description) ) + $user->description = ''; + + $user = sanitize_user_object($user, 'edit'); + + return $user; +} + +/** + * Retrieve the user's drafts. + * + * @since 2.0.0 + * + * @param int $user_id User ID. + * @return array + */ +function get_users_drafts( $user_id ) { + global $wpdb; + $query = $wpdb->prepare("SELECT ID, post_title FROM $wpdb->posts WHERE post_type = 'post' AND post_status = 'draft' AND post_author = %d ORDER BY post_modified DESC", $user_id); + $query = apply_filters('get_users_drafts', $query); + return $wpdb->get_results( $query ); +} + +/** + * Remove user and optionally reassign posts and links to another user. + * + * If the $reassign parameter is not assigned to an User ID, then all posts will + * be deleted of that user. The action 'delete_user' that is passed the User ID + * being deleted will be run after the posts are either reassigned or deleted. + * The user meta will also be deleted that are for that User ID. + * + * @since 2.0.0 + * + * @param int $id User ID. + * @param int $reassign Optional. Reassign posts and links to new User ID. + * @return bool True when finished. + */ +function wp_delete_user( $id, $reassign = 'novalue' ) { + global $wpdb; + + $id = (int) $id; + + // allow for transaction statement + do_action('delete_user', $id); + + if ( 'novalue' === $reassign || null === $reassign ) { + $post_ids = $wpdb->get_col( $wpdb->prepare("SELECT ID FROM $wpdb->posts WHERE post_author = %d", $id) ); + + if ( $post_ids ) { + foreach ( $post_ids as $post_id ) + wp_delete_post($post_id); + } + + // Clean links + $link_ids = $wpdb->get_col( $wpdb->prepare("SELECT link_id FROM $wpdb->links WHERE link_owner = %d", $id) ); + + if ( $link_ids ) { + foreach ( $link_ids as $link_id ) + wp_delete_link($link_id); + } + } else { + $reassign = (int) $reassign; + $wpdb->update( $wpdb->posts, array('post_author' => $reassign), array('post_author' => $id) ); + $wpdb->update( $wpdb->links, array('link_owner' => $reassign), array('link_owner' => $id) ); + } + + clean_user_cache($id); + + // FINALLY, delete user + if ( !is_multisite() ) { + $wpdb->query( $wpdb->prepare("DELETE FROM $wpdb->usermeta WHERE user_id = %d", $id) ); + $wpdb->query( $wpdb->prepare("DELETE FROM $wpdb->users WHERE ID = %d", $id) ); + } else { + $level_key = $wpdb->get_blog_prefix() . 'capabilities'; // wpmu site admins don't have user_levels + $wpdb->query("DELETE FROM $wpdb->usermeta WHERE user_id = $id AND meta_key = '{$level_key}'"); + } + + // allow for commit transaction + do_action('deleted_user', $id); + + return true; +} + +/** + * Remove all capabilities from user. + * + * @since 2.1.0 + * + * @param int $id User ID. + */ +function wp_revoke_user($id) { + $id = (int) $id; + + $user = new WP_User($id); + $user->remove_all_caps(); +} + +add_action('admin_init', 'default_password_nag_handler'); +/** + * @since 2.8.0 + */ +function default_password_nag_handler($errors = false) { + global $user_ID; + if ( ! get_user_option('default_password_nag') ) //Short circuit it. + return; + + //get_user_setting = JS saved UI setting. else no-js-falback code. + if ( 'hide' == get_user_setting('default_password_nag') || isset($_GET['default_password_nag']) && '0' == $_GET['default_password_nag'] ) { + delete_user_setting('default_password_nag'); + update_user_option($user_ID, 'default_password_nag', false, true); + } +} + +add_action('profile_update', 'default_password_nag_edit_user', 10, 2); +/** + * @since 2.8.0 + */ +function default_password_nag_edit_user($user_ID, $old_data) { + if ( ! get_user_option('default_password_nag', $user_ID) ) //Short circuit it. + return; + + $new_data = get_userdata($user_ID); + + if ( $new_data->user_pass != $old_data->user_pass ) { //Remove the nag if the password has been changed. + delete_user_setting('default_password_nag', $user_ID); + update_user_option($user_ID, 'default_password_nag', false, true); + } +} + +add_action('admin_notices', 'default_password_nag'); +/** + * @since 2.8.0 + */ +function default_password_nag() { + global $pagenow; + if ( 'profile.php' == $pagenow || ! get_user_option('default_password_nag') ) //Short circuit it. + return; + + echo '
    '; + echo '

    '; + echo '' . __('Notice:') . ' '; + _e('You’re using the auto-generated password for your account. Would you like to change it to something easier to remember?'); + echo '

    '; + printf( '' . __('Yes, take me to my profile page') . ' | ', admin_url('profile.php') . '#password' ); + printf( '' . __('No thanks, do not remind me again') . '', '?default_password_nag=0' ); + echo '

    '; +} + +?> diff --git a/src/wp-admin/includes/widgets.php b/src/wp-admin/includes/widgets.php new file mode 100644 index 0000000..6b7d635 --- /dev/null +++ b/src/wp-admin/includes/widgets.php @@ -0,0 +1,225 @@ + $widget['id'], 'widget_name' => $widget['name'], '_display' => 'template' ); + + if ( isset($wp_registered_widget_controls[$widget['id']]['id_base']) && isset($widget['params'][0]['number']) ) { + $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 ) + $args['_hide'] = '1'; + } + + $args = wp_list_widget_controls_dynamic_sidebar( array( 0 => $args, 1 => $widget['params'][0] ) ); + call_user_func_array( 'wp_widget_control', $args ); + } +} + +/** + * Callback to sort array by a 'name' key. + * + * @since 3.1.0 + * @access private + */ +function _sort_name_callback( $a, $b ) { + return strnatcasecmp( $a['name'], $b['name'] ); +} + +/** + * Show the widgets and their settings for a sidebar. + * Used in the the admin widget config screen. + * + * @since 2.5.0 + * + * @param string $sidebar id slug of the sidebar + */ +function wp_list_widget_controls( $sidebar ) { + add_filter( 'dynamic_sidebar_params', 'wp_list_widget_controls_dynamic_sidebar' ); + + echo "
    \n"; + + $description = wp_sidebar_description( $sidebar ); + + if ( !empty( $description ) ) { + echo "\n"; + } + + dynamic_sidebar( $sidebar ); + echo "
    \n"; +} + +/** + * {@internal Missing Short Description}} + * + * @since 2.5.0 + * + * @param array $params + * @return array + */ +function wp_list_widget_controls_dynamic_sidebar( $params ) { + global $wp_registered_widgets; + static $i = 0; + $i++; + + $widget_id = $params[0]['widget_id']; + $id = isset($params[0]['_temp_id']) ? $params[0]['_temp_id'] : $widget_id; + $hidden = isset($params[0]['_hide']) ? ' style="display:none;"' : ''; + + $params[0]['before_widget'] = "
    "; + $params[0]['after_widget'] = "
    "; + $params[0]['before_title'] = "%BEG_OF_TITLE%"; // deprecated + $params[0]['after_title'] = "%END_OF_TITLE%"; // deprecated + if ( is_callable( $wp_registered_widgets[$widget_id]['callback'] ) ) { + $wp_registered_widgets[$widget_id]['_callback'] = $wp_registered_widgets[$widget_id]['callback']; + $wp_registered_widgets[$widget_id]['callback'] = 'wp_widget_control'; + } + + return $params; +} + +function next_widget_id_number($id_base) { + global $wp_registered_widgets; + $number = 1; + + foreach ( $wp_registered_widgets as $widget_id => $widget ) { + if ( preg_match( '/' . $id_base . '-([0-9]+)$/', $widget_id, $matches ) ) + $number = max($number, $matches[1]); + } + $number++; + + return $number; +} + +/** + * Meta widget used to display the control form for a widget. + * + * Called from dynamic_sidebar(). + * + * @since 2.5.0 + * + * @param array $sidebar_args + * @return array + */ +function wp_widget_control( $sidebar_args ) { + global $wp_registered_widgets, $wp_registered_widget_controls, $sidebars_widgets; + + $widget_id = $sidebar_args['widget_id']; + $sidebar_id = isset($sidebar_args['id']) ? $sidebar_args['id'] : false; + $key = $sidebar_id ? array_search( $widget_id, $sidebars_widgets[$sidebar_id] ) : '-1'; // position of widget in sidebar + $control = isset($wp_registered_widget_controls[$widget_id]) ? $wp_registered_widget_controls[$widget_id] : array(); + $widget = $wp_registered_widgets[$widget_id]; + + $id_format = $widget['id']; + $widget_number = isset($control['params'][0]['number']) ? $control['params'][0]['number'] : ''; + $id_base = isset($control['id_base']) ? $control['id_base'] : $widget_id; + $multi_number = isset($sidebar_args['_multi_num']) ? $sidebar_args['_multi_num'] : ''; + $add_new = isset($sidebar_args['_add']) ? $sidebar_args['_add'] : ''; + + $query_arg = array( 'editwidget' => $widget['id'] ); + if ( $add_new ) { + $query_arg['addnew'] = 1; + if ( $multi_number ) { + $query_arg['num'] = $multi_number; + $query_arg['base'] = $id_base; + } + } else { + $query_arg['sidebar'] = $sidebar_id; + $query_arg['key'] = $key; + } + + // We aren't showing a widget control, we're outputing a template for a mult-widget control + if ( isset($sidebar_args['_display']) && 'template' == $sidebar_args['_display'] && $widget_number ) { + // number == -1 implies a template where id numbers are replaced by a generic '__i__' + $control['params'][0]['number'] = -1; + // with id_base widget id's are constructed like {$id_base}-{$id_number} + if ( isset($control['id_base']) ) + $id_format = $control['id_base'] . '-__i__'; + } + + $wp_registered_widgets[$widget_id]['callback'] = $wp_registered_widgets[$widget_id]['_callback']; + unset($wp_registered_widgets[$widget_id]['_callback']); + + $widget_title = esc_html( strip_tags( $sidebar_args['widget_name'] ) ); + $has_form = 'noform'; + + echo $sidebar_args['before_widget']; ?> +
    +
    + + +
    +

    +
    + +
    +
    +
    +" . __('There are no options for this widget.') . "

    \n"; ?> +
    + + + + + + + + +
    +
    + | + +
    +
    + + 'widget-' . esc_attr( $id_format ) . '-savewidget' ) ); ?> +
    +
    +
    +
    +
    + +
    + +
    + \ No newline at end of file diff --git a/src/wp-admin/index.php b/src/wp-admin/index.php new file mode 100644 index 0000000..35b041d --- /dev/null +++ b/src/wp-admin/index.php @@ -0,0 +1,70 @@ + 4, 'default' => 1) ); +else + add_screen_option('layout_columns', array('max' => 4, 'default' => 2) ); + +add_contextual_help($current_screen, + + '

    ' . __( 'Welcome to your WordPress Dashboard! You will find helpful tips in the Help tab of each screen to assist you as you get to know the application.' ) . '

    ' . + '

    ' . __( 'The Admin Bar at the top provides quick access to common tasks when you are viewing your site. If you miss the Favorite Actions dropdown, removed as of 3.2, you can find many of the same actions in the Admin Bar, such as Add New > Post.' ) . '

    ' . + '

    ' . __( 'The left-hand navigation menu provides links to the administration screens in your WordPress application. You can expand or collapse navigation sections by clicking on the arrow that appears on the right side of each navigation item when you hover over it. You can also minimize the navigation menu to a narrow icon strip by clicking on the Collapse Menu arrow at the bottom of the nav menu, below Settings; when minimized, the submenu items will be displayed on hover.' ) . '

    ' . + '

    ' . __( 'You can arrange your dashboard by choosing which boxes, or modules, to display in the work area, how many columns to display them in, and where each box should be placed. You can hide/show boxes and select the number of columns in the Screen Options tab. To rearrange the boxes, drag and drop by clicking on the title bar of the selected box and releasing when you see a gray dotted-line rectangle appear in the location you want to place the box. You can also expand or collapse each box; click the title area or downward arrow of the box. In addition, some boxes are configurable, and will show a “Configure” link in the title bar if you hover over it.' ) . '

    ' . + '

    ' . __( 'The boxes on your Dashboard screen are:' ) . '

    ' . + '

    ' . __( 'Right Now - Displays a summary of the content on your site and identifies which theme and version of WordPress you are using.' ) . '

    ' . + '

    ' . __( 'Recent Comments - Shows the most recent comments on your posts (configurable, up to 30) and allows you to moderate them.' ) . '

    ' . + '

    ' . __( 'Incoming Links - Shows links to your site found by Google Blog Search.' ) . '

    ' . + '

    ' . __( 'QuickPress - Allows you to create a new post and either publish it or save it as a draft.' ) . '

    ' . + '

    ' . __( 'Recent Drafts - Displays links to the 5 most recent draft posts you’ve started.' ) . '

    ' . + '

    ' . __( 'WordPress Blog - Come here for the latest scoop.' ) . '

    ' . + '

    ' . __( 'Other WordPress News - Shows the feed from WordPress Planet. You can configure it to show a different feed of your choosing.' ) . '

    ' . + '

    ' . __( 'Plugins - Features the most popular, newest, and recently updated plugins from the WordPress.org Plugin Directory.' ) . '

    ' . + '

    ' . __( 'For more information:' ) . '

    ' . + '

    ' . __( 'Documentation on Dashboard' ) . '

    ' . + '

    ' . __( 'Support Forums' ) . '

    ' +); + +include (ABSPATH . 'wp-admin/admin-header.php'); + +$today = current_time('mysql', 1); +?> + +
    + +

    + +
    + + + +
    +
    + +
    + + diff --git a/src/wp-admin/install-helper.php b/src/wp-admin/install-helper.php new file mode 100644 index 0000000..2970b7c --- /dev/null +++ b/src/wp-admin/install-helper.php @@ -0,0 +1,217 @@ + + * check_column('wp_links', 'link_description', 'mediumtext'); + * if (check_column($wpdb->comments, 'comment_author', 'tinytext')) + * echo "ok\n"; + * + * $error_count = 0; + * $tablename = $wpdb->links; + * // check the column + * if (!check_column($wpdb->links, 'link_description', 'varchar(255)')) { + * $ddl = "ALTER TABLE $wpdb->links MODIFY COLUMN link_description varchar(255) NOT NULL DEFAULT '' "; + * $q = $wpdb->query($ddl); + * } + * + * if (check_column($wpdb->links, 'link_description', 'varchar(255)')) { + * $res .= $tablename . ' - ok
    '; + * } else { + * $res .= 'There was a problem with ' . $tablename . '
    '; + * ++$error_count; + * } + * + * + * @package WordPress + * @subpackage Plugin + */ + +/** Load WordPress Bootstrap */ +require_once(dirname(dirname(__FILE__)).'/wp-load.php'); + +/** + * Turn debugging on or off. + * @global bool|int $debug + * @name $debug + * @var bool|int + * @since 1.0.0 + */ +$debug = 0; + +if ( ! function_exists('maybe_create_table') ) : +/** + * Create database table, if it doesn't already exist. + * + * @since 1.0.0 + * @package WordPress + * @subpackage Plugin + * @uses $wpdb + * + * @param string $table_name Database table name. + * @param string $create_ddl Create database table SQL. + * @return bool False on error, true if already exists or success. + */ +function maybe_create_table($table_name, $create_ddl) { + global $wpdb; + foreach ($wpdb->get_col("SHOW TABLES",0) as $table ) { + if ($table == $table_name) { + return true; + } + } + //didn't find it try to create it. + $wpdb->query($create_ddl); + // we cannot directly tell that whether this succeeded! + foreach ($wpdb->get_col("SHOW TABLES",0) as $table ) { + if ($table == $table_name) { + return true; + } + } + return false; +} +endif; + +if ( ! function_exists('maybe_add_column') ) : +/** + * Add column to database table, if column doesn't already exist in table. + * + * @since 1.0.0 + * @package WordPress + * @subpackage Plugin + * @uses $wpdb + * @uses $debug + * + * @param string $table_name Database table name + * @param string $column_name Table column name + * @param string $create_ddl SQL to add column to table. + * @return bool False on failure. True, if already exists or was successful. + */ +function maybe_add_column($table_name, $column_name, $create_ddl) { + global $wpdb, $debug; + foreach ($wpdb->get_col("DESC $table_name",0) as $column ) { + if ($debug) echo("checking $column == $column_name
    "); + + if ($column == $column_name) { + return true; + } + } + //didn't find it try to create it. + $wpdb->query($create_ddl); + // we cannot directly tell that whether this succeeded! + foreach ($wpdb->get_col("DESC $table_name",0) as $column ) { + if ($column == $column_name) { + return true; + } + } + return false; +} +endif; + +/** + * Drop column from database table, if it exists. + * + * @since 1.0.0 + * @package WordPress + * @subpackage Plugin + * @uses $wpdb + * + * @param string $table_name Table name + * @param string $column_name Column name + * @param string $drop_ddl SQL statement to drop column. + * @return bool False on failure, true on success or doesn't exist. + */ +function maybe_drop_column($table_name, $column_name, $drop_ddl) { + global $wpdb; + foreach ($wpdb->get_col("DESC $table_name",0) as $column ) { + if ($column == $column_name) { + //found it try to drop it. + $wpdb->query($drop_ddl); + // we cannot directly tell that whether this succeeded! + foreach ($wpdb->get_col("DESC $table_name",0) as $column ) { + if ($column == $column_name) { + return false; + } + } + } + } + // else didn't find it + return true; +} + +/** + * Check column matches criteria. + * + * Uses the SQL DESC for retrieving the table info for the column. It will help + * understand the parameters, if you do more research on what column information + * is returned by the SQL statement. Pass in null to skip checking that + * criteria. + * + * Column names returned from DESC table are case sensitive and are listed: + * Field + * Type + * Null + * Key + * Default + * Extra + * + * @since 1.0.0 + * @package WordPress + * @subpackage Plugin + * + * @param string $table_name Table name + * @param string $col_name Column name + * @param string $col_type Column type + * @param bool $is_null Optional. Check is null. + * @param mixed $key Optional. Key info. + * @param mixed $default Optional. Default value. + * @param mixed $extra Optional. Extra value. + * @return bool True, if matches. False, if not matching. + */ +function check_column($table_name, $col_name, $col_type, $is_null = null, $key = null, $default = null, $extra = null) { + global $wpdb, $debug; + $diffs = 0; + $results = $wpdb->get_results("DESC $table_name"); + + foreach ($results as $row ) { + if ($debug > 1) print_r($row); + + if ($row->Field == $col_name) { + // got our column, check the params + if ($debug) echo ("checking $row->Type against $col_type\n"); + if (($col_type != null) && ($row->Type != $col_type)) { + ++$diffs; + } + if (($is_null != null) && ($row->Null != $is_null)) { + ++$diffs; + } + if (($key != null) && ($row->Key != $key)) { + ++$diffs; + } + if (($default != null) && ($row->Default != $default)) { + ++$diffs; + } + if (($extra != null) && ($row->Extra != $extra)) { + ++$diffs; + } + if ($diffs > 0) { + if ($debug) echo ("diffs = $diffs returning false\n"); + return false; + } + return true; + } // end if found our column + } + return false; +} + +?> \ No newline at end of file diff --git a/src/wp-admin/install.php b/src/wp-admin/install.php new file mode 100644 index 0000000..0b65f52 --- /dev/null +++ b/src/wp-admin/install.php @@ -0,0 +1,264 @@ + + + + + + Error: PHP is not running + + +

    WordPress

    +

    Error: PHP is not running

    +

    WordPress requires that your web server is running PHP. Your server does not have PHP installed, or PHP is turned off.

    + + + + +> + + + <?php _e( 'WordPress › Installation' ); ?> + + + +

    WordPress

    + +get_var("SHOW TABLES LIKE '$wpdb->users'") != null ); + + // Ensure that Blogs appear in search engines by default + $blog_public = 1; + if ( ! empty( $_POST ) ) + $blog_public = isset( $_POST['blog_public'] ); + + $weblog_title = isset( $_POST['weblog_title'] ) ? trim( stripslashes( $_POST['weblog_title'] ) ) : ''; + $user_name = isset($_POST['user_name']) ? trim( stripslashes( $_POST['user_name'] ) ) : 'admin'; + $admin_password = isset($_POST['admin_password']) ? trim( stripslashes( $_POST['admin_password'] ) ) : ''; + $admin_email = isset( $_POST['admin_email'] ) ? trim( stripslashes( $_POST['admin_email'] ) ) : ''; + + if ( ! is_null( $error ) ) { +?> +

    ERROR: %s' ), $error ); ?>

    + +
    + + + + + + + + + + + + + + + + + + + + + + +
    + +

    + +
    + +

    +
    + +

    +
    +

    +
    +

    +

    +
    +' . __( 'Already Installed' ) . '

    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≈z123{ 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

    ' . __( 'You appear to have already installed WordPress. To reinstall please clear your old database tables first.' ) . '

    ' . __('Log In') . '

    ' ); +} + +$php_version = phpversion(); +$mysql_version = $wpdb->db_version(); +$php_compat = version_compare( $php_version, $required_php_version, '>=' ); +$mysql_compat = version_compare( $mysql_version, $required_mysql_version, '>=' ) || file_exists( WP_CONTENT_DIR . '/db.php' ); + +if ( !$mysql_compat && !$php_compat ) + $compat = sprintf( __('You cannot install because WordPress %1$s requires PHP version %2$s or higher and MySQL version %3$s or higher. You are running PHP version %4$s and MySQL version %5$s.'), $wp_version, $required_php_version, $required_mysql_version, $php_version, $mysql_version ); +elseif ( !$php_compat ) + $compat = sprintf( __('You cannot install because WordPress %1$s requires PHP version %2$s or higher. You are running version %3$s.'), $wp_version, $required_php_version, $php_version ); +elseif ( !$mysql_compat ) + $compat = sprintf( __('You cannot install because WordPress %1$s requires MySQL version %2$s or higher. You are running version %3$s.'), $wp_version, $required_mysql_version, $mysql_version ); + +if ( !$mysql_compat || !$php_compat ) { + display_header(); + die('

    ' . __('Insufficient Requirements') . '

    ' . $compat . '

    '); +} + +switch($step) { + case 0: // Step 1 + case 1: // Step 1, direct link. + display_header(); +?> +

    +

    ReadMe documentation at your leisure. Otherwise, just fill in the information below and you’ll be on your way to using the most extendable and powerful personal publishing platform in the world.' ), '../readme.html' ); ?>

    + +

    +

    + +error ) ) + wp_die( $wpdb->error->get_error_message() ); + + display_header(); + // Fill in the data we gathered + $weblog_title = isset( $_POST['weblog_title'] ) ? trim( stripslashes( $_POST['weblog_title'] ) ) : ''; + $user_name = isset($_POST['user_name']) ? trim( stripslashes( $_POST['user_name'] ) ) : 'admin'; + $admin_password = isset($_POST['admin_password']) ? $_POST['admin_password'] : ''; + $admin_password_check = isset($_POST['admin_password2']) ? $_POST['admin_password2'] : ''; + $admin_email = isset( $_POST['admin_email'] ) ?trim( stripslashes( $_POST['admin_email'] ) ) : ''; + $public = isset( $_POST['blog_public'] ) ? (int) $_POST['blog_public'] : 0; + // check e-mail address + $error = false; + if ( empty( $user_name ) ) { + // TODO: poka-yoke + display_setup_form( __('you must provide a valid username.') ); + $error = true; + } elseif ( $user_name != sanitize_user( $user_name, true ) ) { + display_setup_form( __('the username you provided has invalid characters.') ); + $error = true; + } elseif ( $admin_password != $admin_password_check ) { + // TODO: poka-yoke + display_setup_form( __( 'your passwords do not match. Please try again' ) ); + $error = true; + } else if ( empty( $admin_email ) ) { + // TODO: poka-yoke + display_setup_form( __( 'you must provide an e-mail address.' ) ); + $error = true; + } elseif ( ! is_email( $admin_email ) ) { + // TODO: poka-yoke + display_setup_form( __( 'that isn’t a valid e-mail address. E-mail addresses look like: username@example.com' ) ); + $error = true; + } + + if ( $error === false ) { + $wpdb->show_errors(); + $result = wp_install($weblog_title, $user_name, $admin_email, $public, '', $admin_password); + extract( $result, EXTR_SKIP ); +?> + +

    + +

    + + + + + + + + + + +
    '. esc_html($password) .'
    '; + echo "

    $password_message

    "; ?> +
    + +

    + + + + + + + + + + diff --git a/src/wp-admin/js/cat.dev.js b/src/wp-admin/js/cat.dev.js new file mode 100644 index 0000000..cbc2900 --- /dev/null +++ b/src/wp-admin/js/cat.dev.js @@ -0,0 +1,5 @@ +jQuery(document).ready( function($) { + var myConfirm = function() { return '' !== $('#newcat').val(); }; + $('#jaxcat').prepend('' + catL10n.how + ''); + $('#categorychecklist').wpList( { alt: '', response: 'cat-ajax-response', confirm: myConfirm } ); +} ); diff --git a/src/wp-admin/js/cat.js b/src/wp-admin/js/cat.js new file mode 100644 index 0000000..deee8c4 --- /dev/null +++ b/src/wp-admin/js/cat.js @@ -0,0 +1 @@ +jQuery(document).ready(function(b){var a=function(){return""!==b("#newcat").val()};b("#jaxcat").prepend(''+catL10n.how+'');b("#categorychecklist").wpList({alt:"",response:"cat-ajax-response",confirm:a})}); \ No newline at end of file diff --git a/src/wp-admin/js/categories.dev.js b/src/wp-admin/js/categories.dev.js new file mode 100644 index 0000000..cc58eb4 --- /dev/null +++ b/src/wp-admin/js/categories.dev.js @@ -0,0 +1,34 @@ +jQuery(document).ready(function($) { + var options = false, addAfter, delBefore, delAfter; + if ( document.forms['addcat'].category_parent ) + options = document.forms['addcat'].category_parent.options; + + addAfter = function( r, settings ) { + var name, id; + + name = $("" + $('name', r).text() + "").text(); + id = $('cat', r).attr('id'); + options[options.length] = new Option(name, id); + } + + delAfter = function( r, settings ) { + var id = $('cat', r).attr('id'), o; + for ( o = 0; o < options.length; o++ ) + if ( id == options[o].value ) + options[o] = null; + } + + delBefore = function(s) { + if ( 'undefined' != showNotice ) + return showNotice.warn() ? s : false; + + return s; + } + + if ( options ) + $('#the-list').wpList( { addAfter: addAfter, delBefore: delBefore, delAfter: delAfter } ); + else + $('#the-list').wpList({ delBefore: delBefore }); + + $('.delete a[class^="delete"]').live('click', function(){return false;}); +}); diff --git a/src/wp-admin/js/categories.js b/src/wp-admin/js/categories.js new file mode 100644 index 0000000..45c2358 --- /dev/null +++ b/src/wp-admin/js/categories.js @@ -0,0 +1 @@ +jQuery(document).ready(function(d){var b=false,e,c,a;if(document.forms.addcat.category_parent){b=document.forms.addcat.category_parent.options}e=function(h,g){var f,i;f=d(""+d("name",h).text()+"").text();i=d("cat",h).attr("id");b[b.length]=new Option(f,i)};a=function(g,f){var i=d("cat",g).attr("id"),h;for(h=0;h' + + $( '#mm option[value="' + mm + '"]' ).text() + ' ' + + jj + ', ' + + aa + ' @ ' + + hh + ':' + + mn + '
    ' + ); + return false; + }); +}); diff --git a/src/wp-admin/js/comment.js b/src/wp-admin/js/comment.js new file mode 100644 index 0000000..5816ebb --- /dev/null +++ b/src/wp-admin/js/comment.js @@ -0,0 +1 @@ +jQuery(document).ready(function(b){var a=b("#timestamp").html();b(".edit-timestamp").click(function(){if(b("#timestampdiv").is(":hidden")){b("#timestampdiv").slideDown("normal");b(".edit-timestamp").hide()}return false});b(".cancel-timestamp").click(function(){b("#timestampdiv").slideUp("normal");b("#mm").val(b("#hidden_mm").val());b("#jj").val(b("#hidden_jj").val());b("#aa").val(b("#hidden_aa").val());b("#hh").val(b("#hidden_hh").val());b("#mn").val(b("#hidden_mn").val());b("#timestamp").html(a);b(".edit-timestamp").show();return false});b(".save-timestamp").click(function(){var g=b("#aa").val(),h=b("#mm").val(),d=b("#jj").val(),c=b("#hh").val(),f=b("#mn").val(),e=new Date(g,h-1,d,c,f);if(e.getFullYear()!=g||(1+e.getMonth())!=h||e.getDate()!=d||e.getMinutes()!=f){b(".timestamp-wrap","#timestampdiv").addClass("form-invalid");return false}else{b(".timestamp-wrap","#timestampdiv").removeClass("form-invalid")}b("#timestampdiv").slideUp("normal");b(".edit-timestamp").show();b("#timestamp").html(commentL10n.submittedOn+" "+b('#mm option[value="'+h+'"]').text()+" "+d+", "+g+" @ "+c+":"+f+" ");return false})}); \ No newline at end of file diff --git a/src/wp-admin/js/common.dev.js b/src/wp-admin/js/common.dev.js new file mode 100644 index 0000000..5ab98ed --- /dev/null +++ b/src/wp-admin/js/common.dev.js @@ -0,0 +1,370 @@ +var showNotice, adminMenu, columns, validateForm, screenMeta; +(function($){ +// sidebar admin menu +adminMenu = { + init : function() { + var menu = $('#adminmenu'); + + $('.wp-menu-toggle', menu).each( function() { + var t = $(this), sub = t.siblings('.wp-submenu'); + if ( sub.length ) + t.click(function(){ adminMenu.toggle( sub ); }); + else + t.hide(); + }); + + this.favorites(); + + $('#collapse-menu', menu).click(function(){ + if ( $('body').hasClass('folded') ) { + adminMenu.fold(1); + deleteUserSetting( 'mfold' ); + } else { + adminMenu.fold(); + setUserSetting( 'mfold', 'f' ); + } + return false; + }); + + if ( $('body').hasClass('folded') ) + this.fold(); + }, + + restoreMenuState : function() { + // (perhaps) needed for back-compat + }, + + toggle : function(el) { + el.slideToggle(150, function() { + var id = el.css('display','').parent().toggleClass( 'wp-menu-open' ).attr('id'); + if ( id ) { + $('li.wp-has-submenu', '#adminmenu').each(function(i, e) { + if ( id == e.id ) { + var v = $(e).hasClass('wp-menu-open') ? 'o' : 'c'; + setUserSetting( 'm'+i, v ); + } + }); + } + }); + + return false; + }, + + fold : function(off) { + if (off) { + $('body').removeClass('folded'); + $('#adminmenu li.wp-has-submenu').unbind(); + } else { + $('body').addClass('folded'); + $('#adminmenu li.wp-has-submenu').hoverIntent({ + over: function(e){ + var m, b, h, o, f; + m = $(this).find('.wp-submenu'); + b = $(this).offset().top + m.height() + 1; // Bottom offset of the menu + h = $('#wpwrap').height(); // Height of the entire page + o = 60 + b - h; + f = $(window).height() + $(window).scrollTop() - 15; // The fold + if ( f < (b - o) ) { + o = b - f; + } + if ( o > 1 ) { + m.css({'marginTop':'-'+o+'px'}); + } else if ( m.css('marginTop') ) { + m.css({'marginTop':''}); + } + m.addClass('sub-open'); + }, + out: function(){ + $(this).find('.wp-submenu').removeClass('sub-open'); + }, + timeout: 220, + sensitivity: 8, + interval: 100 + }); + + } + }, + + favorites : function() { + $('#favorite-inside').width( $('#favorite-actions').width() - 4 ); + $('#favorite-toggle, #favorite-inside').bind('mouseenter', function() { + $('#favorite-inside').removeClass('slideUp').addClass('slideDown'); + setTimeout(function() { + if ( $('#favorite-inside').hasClass('slideDown') ) { + $('#favorite-inside').slideDown(100); + $('#favorite-first').addClass('slide-down'); + } + }, 200); + }).bind('mouseleave', function() { + $('#favorite-inside').removeClass('slideDown').addClass('slideUp'); + setTimeout(function() { + if ( $('#favorite-inside').hasClass('slideUp') ) { + $('#favorite-inside').slideUp(100, function() { + $('#favorite-first').removeClass('slide-down'); + }); + } + }, 300); + }); + } +}; + +$(document).ready(function(){ adminMenu.init(); }); + +// show/hide/save table columns +columns = { + init : function() { + var that = this; + $('.hide-column-tog', '#adv-settings').click( function() { + var $t = $(this), column = $t.val(); + if ( $t.prop('checked') ) + that.checked(column); + else + that.unchecked(column); + + columns.saveManageColumnsState(); + }); + }, + + saveManageColumnsState : function() { + var hidden = this.hidden(); + $.post(ajaxurl, { + action: 'hidden-columns', + hidden: hidden, + screenoptionnonce: $('#screenoptionnonce').val(), + page: pagenow + }); + }, + + checked : function(column) { + $('.column-' + column).show(); + this.colSpanChange(+1); + }, + + unchecked : function(column) { + $('.column-' + column).hide(); + this.colSpanChange(-1); + }, + + hidden : function() { + return $('.manage-column').filter(':hidden').map(function() { return this.id; }).get().join(','); + }, + + useCheckboxesForHidden : function() { + this.hidden = function(){ + return $('.hide-column-tog').not(':checked').map(function() { + var id = this.id; + return id.substring( id, id.length - 5 ); + }).get().join(','); + }; + }, + + colSpanChange : function(diff) { + var $t = $('table').find('.colspanchange'), n; + if ( !$t.length ) + return; + n = parseInt( $t.attr('colspan'), 10 ) + diff; + $t.attr('colspan', n.toString()); + } +} + +$(document).ready(function(){columns.init();}); + +validateForm = function( form ) { + return !$( form ).find('.form-required').filter( function() { return $('input:visible', this).val() == ''; } ).addClass( 'form-invalid' ).find('input:visible').change( function() { $(this).closest('.form-invalid').removeClass( 'form-invalid' ); } ).size(); +} + +// stub for doing better warnings +showNotice = { + warn : function() { + var msg = commonL10n.warnDelete || ''; + if ( confirm(msg) ) { + return true; + } + + return false; + }, + + note : function(text) { + alert(text); + } +}; + +screenMeta = { + links: { + 'screen-options-link-wrap': 'screen-options-wrap', + 'contextual-help-link-wrap': 'contextual-help-wrap' + }, + init: function() { + $('.screen-meta-toggle').click( screenMeta.toggleEvent ); + }, + toggleEvent: function( e ) { + var panel; + e.preventDefault(); + + // Check to see if we found a panel. + if ( ! screenMeta.links[ this.id ] ) + return; + + panel = $('#' + screenMeta.links[ this.id ]); + + if ( panel.is(':visible') ) + screenMeta.close( panel, $(this) ); + else + screenMeta.open( panel, $(this) ); + }, + open: function( panel, link ) { + $('.screen-meta-toggle').not( link ).css('visibility', 'hidden'); + + panel.slideDown( 'fast', function() { + link.addClass('screen-meta-active'); + }); + }, + close: function( panel, link ) { + panel.slideUp( 'fast', function() { + link.removeClass('screen-meta-active'); + $('.screen-meta-toggle').css('visibility', ''); + }); + } +}; + +$(document).ready( function() { + var lastClicked = false, checks, first, last, checked, dropdown, + pageInput = $('input[name="paged"]'), currentPage; + + // Move .updated and .error alert boxes. Don't move boxes designed to be inline. + $('div.wrap h2:first').nextAll('div.updated, div.error').addClass('below-h2'); + $('div.updated, div.error').not('.below-h2, .inline').insertAfter( $('div.wrap h2:first') ); + + // Init screen meta + screenMeta.init(); + + // User info dropdown. + dropdown = { + doc: $(document), + element: $('#user_info'), + open: function() { + if ( ! dropdown.element.hasClass('active') ) { + dropdown.element.addClass('active'); + dropdown.doc.one( 'click', dropdown.close ); + return false; + } + }, + close: function() { + dropdown.element.removeClass('active'); + } + }; + + dropdown.element.click( dropdown.open ); + + // check all checkboxes + $('tbody').children().children('.check-column').find(':checkbox').click( function(e) { + if ( 'undefined' == e.shiftKey ) { return true; } + if ( e.shiftKey ) { + if ( !lastClicked ) { return true; } + checks = $( lastClicked ).closest( 'form' ).find( ':checkbox' ); + first = checks.index( lastClicked ); + last = checks.index( this ); + checked = $(this).prop('checked'); + if ( 0 < first && 0 < last && first != last ) { + checks.slice( first, last ).prop( 'checked', function(){ + if ( $(this).closest('tr').is(':visible') ) + return checked; + + return false; + }); + } + } + lastClicked = this; + return true; + }); + + $('thead, tfoot').find('.check-column :checkbox').click( function(e) { + var c = $(this).prop('checked'), + kbtoggle = 'undefined' == typeof toggleWithKeyboard ? false : toggleWithKeyboard, + toggle = e.shiftKey || kbtoggle; + + $(this).closest( 'table' ).children( 'tbody' ).filter(':visible') + .children().children('.check-column').find(':checkbox') + .prop('checked', function() { + if ( $(this).closest('tr').is(':hidden') ) + return false; + if ( toggle ) + return $(this).prop( 'checked' ); + else if (c) + return true; + return false; + }); + + $(this).closest('table').children('thead, tfoot').filter(':visible') + .children().children('.check-column').find(':checkbox') + .prop('checked', function() { + if ( toggle ) + return false; + else if (c) + return true; + return false; + }); + }); + + $('#default-password-nag-no').click( function() { + setUserSetting('default_password_nag', 'hide'); + $('div.default-password-nag').hide(); + return false; + }); + + // tab in textareas + $('#newcontent').bind('keydown.wpevent_InsertTab', function(e) { + if ( e.keyCode != 9 ) + return true; + + var el = e.target, selStart = el.selectionStart, selEnd = el.selectionEnd, val = el.value, scroll, sel; + + try { + this.lastKey = 9; // not a standard DOM property, lastKey is to help stop Opera tab event. See blur handler below. + } catch(err) {} + + if ( document.selection ) { + el.focus(); + sel = document.selection.createRange(); + sel.text = '\t'; + } else if ( selStart >= 0 ) { + scroll = this.scrollTop; + el.value = val.substring(0, selStart).concat('\t', val.substring(selEnd) ); + el.selectionStart = el.selectionEnd = selStart + 1; + this.scrollTop = scroll; + } + + if ( e.stopPropagation ) + e.stopPropagation(); + if ( e.preventDefault ) + e.preventDefault(); + }); + + $('#newcontent').bind('blur.wpevent_InsertTab', function(e) { + if ( this.lastKey && 9 == this.lastKey ) + this.focus(); + }); + + if ( pageInput.length ) { + currentPage = pageInput.val(); + pageInput.closest('form').submit( function(){ + // Reset paging var for new filters/searches. See #17685. + if ( pageInput.val() == currentPage ) + pageInput.val('1'); + }); + } + +}); + +// internal use +$(document).bind( 'wp_CloseOnEscape', function( e, data ) { + if ( typeof(data.cb) != 'function' ) + return; + + if ( typeof(data.condition) != 'function' || data.condition() ) + data.cb(); + + return true; +}); + +})(jQuery); diff --git a/src/wp-admin/js/common.js b/src/wp-admin/js/common.js new file mode 100644 index 0000000..944dbdb --- /dev/null +++ b/src/wp-admin/js/common.js @@ -0,0 +1 @@ +var showNotice,adminMenu,columns,validateForm,screenMeta;(function(a){adminMenu={init:function(){var b=a("#adminmenu");a(".wp-menu-toggle",b).each(function(){var c=a(this),d=c.siblings(".wp-submenu");if(d.length){c.click(function(){adminMenu.toggle(d)})}else{c.hide()}});this.favorites();a("#collapse-menu",b).click(function(){if(a("body").hasClass("folded")){adminMenu.fold(1);deleteUserSetting("mfold")}else{adminMenu.fold();setUserSetting("mfold","f")}return false});if(a("body").hasClass("folded")){this.fold()}},restoreMenuState:function(){},toggle:function(b){b.slideToggle(150,function(){var c=b.css("display","").parent().toggleClass("wp-menu-open").attr("id");if(c){a("li.wp-has-submenu","#adminmenu").each(function(f,g){if(c==g.id){var d=a(g).hasClass("wp-menu-open")?"o":"c";setUserSetting("m"+f,d)}})}});return false},fold:function(b){if(b){a("body").removeClass("folded");a("#adminmenu li.wp-has-submenu").unbind()}else{a("body").addClass("folded");a("#adminmenu li.wp-has-submenu").hoverIntent({over:function(j){var d,c,g,k,i;d=a(this).find(".wp-submenu");c=a(this).offset().top+d.height()+1;g=a("#wpwrap").height();k=60+c-g;i=a(window).height()+a(window).scrollTop()-15;if(i<(c-k)){k=c-i}if(k>1){d.css({marginTop:"-"+k+"px"})}else{if(d.css("marginTop")){d.css({marginTop:""})}}d.addClass("sub-open")},out:function(){a(this).find(".wp-submenu").removeClass("sub-open")},timeout:220,sensitivity:8,interval:100})}},favorites:function(){a("#favorite-inside").width(a("#favorite-actions").width()-4);a("#favorite-toggle, #favorite-inside").bind("mouseenter",function(){a("#favorite-inside").removeClass("slideUp").addClass("slideDown");setTimeout(function(){if(a("#favorite-inside").hasClass("slideDown")){a("#favorite-inside").slideDown(100);a("#favorite-first").addClass("slide-down")}},200)}).bind("mouseleave",function(){a("#favorite-inside").removeClass("slideDown").addClass("slideUp");setTimeout(function(){if(a("#favorite-inside").hasClass("slideUp")){a("#favorite-inside").slideUp(100,function(){a("#favorite-first").removeClass("slide-down")})}},300)})}};a(document).ready(function(){adminMenu.init()});columns={init:function(){var b=this;a(".hide-column-tog","#adv-settings").click(function(){var d=a(this),c=d.val();if(d.prop("checked")){b.checked(c)}else{b.unchecked(c)}columns.saveManageColumnsState()})},saveManageColumnsState:function(){var b=this.hidden();a.post(ajaxurl,{action:"hidden-columns",hidden:b,screenoptionnonce:a("#screenoptionnonce").val(),page:pagenow})},checked:function(b){a(".column-"+b).show();this.colSpanChange(+1)},unchecked:function(b){a(".column-"+b).hide();this.colSpanChange(-1)},hidden:function(){return a(".manage-column").filter(":hidden").map(function(){return this.id}).get().join(",")},useCheckboxesForHidden:function(){this.hidden=function(){return a(".hide-column-tog").not(":checked").map(function(){var b=this.id;return b.substring(b,b.length-5)}).get().join(",")}},colSpanChange:function(b){var d=a("table").find(".colspanchange"),c;if(!d.length){return}c=parseInt(d.attr("colspan"),10)+b;d.attr("colspan",c.toString())}};a(document).ready(function(){columns.init()});validateForm=function(b){return !a(b).find(".form-required").filter(function(){return a("input:visible",this).val()==""}).addClass("form-invalid").find("input:visible").change(function(){a(this).closest(".form-invalid").removeClass("form-invalid")}).size()};showNotice={warn:function(){var b=commonL10n.warnDelete||"";if(confirm(b)){return true}return false},note:function(b){alert(b)}};screenMeta={links:{"screen-options-link-wrap":"screen-options-wrap","contextual-help-link-wrap":"contextual-help-wrap"},init:function(){a(".screen-meta-toggle").click(screenMeta.toggleEvent)},toggleEvent:function(c){var b;c.preventDefault();if(!screenMeta.links[this.id]){return}b=a("#"+screenMeta.links[this.id]);if(b.is(":visible")){screenMeta.close(b,a(this))}else{screenMeta.open(b,a(this))}},open:function(b,c){a(".screen-meta-toggle").not(c).css("visibility","hidden");b.slideDown("fast",function(){c.addClass("screen-meta-active")})},close:function(b,c){b.slideUp("fast",function(){c.removeClass("screen-meta-active");a(".screen-meta-toggle").css("visibility","")})}};a(document).ready(function(){var i=false,b,f,e,d,h,g=a('input[name="paged"]'),c;a("div.wrap h2:first").nextAll("div.updated, div.error").addClass("below-h2");a("div.updated, div.error").not(".below-h2, .inline").insertAfter(a("div.wrap h2:first"));screenMeta.init();h={doc:a(document),element:a("#user_info"),open:function(){if(!h.element.hasClass("active")){h.element.addClass("active");h.doc.one("click",h.close);return false}},close:function(){h.element.removeClass("active")}};h.element.click(h.open);a("tbody").children().children(".check-column").find(":checkbox").click(function(j){if("undefined"==j.shiftKey){return true}if(j.shiftKey){if(!i){return true}b=a(i).closest("form").find(":checkbox");f=b.index(i);e=b.index(this);d=a(this).prop("checked");if(0=0){j=this.scrollTop;l.value=p.substring(0,q).concat("\t",p.substring(k));l.selectionStart=l.selectionEnd=q+1;this.scrollTop=j}}if(o.stopPropagation){o.stopPropagation()}if(o.preventDefault){o.preventDefault()}});a("#newcontent").bind("blur.wpevent_InsertTab",function(j){if(this.lastKey&&9==this.lastKey){this.focus()}});if(g.length){c=g.val();g.closest("form").submit(function(){if(g.val()==c){g.val("1")}})}});a(document).bind("wp_CloseOnEscape",function(c,b){if(typeof(b.cb)!="function"){return}if(typeof(b.condition)!="function"||b.condition()){b.cb()}return true})})(jQuery); \ No newline at end of file diff --git a/src/wp-admin/js/custom-background.dev.js b/src/wp-admin/js/custom-background.dev.js new file mode 100644 index 0000000..b4dbc66 --- /dev/null +++ b/src/wp-admin/js/custom-background.dev.js @@ -0,0 +1,55 @@ +var farbtastic; + +function pickColor(color) { + farbtastic.setColor(color); + jQuery('#background-color').val(color); + jQuery('#custom-background-image').css('background-color', color); + if ( color && color !== '#' ) + jQuery('#clearcolor').show(); + else + jQuery('#clearcolor').hide(); +} + +jQuery(document).ready(function() { + jQuery('#pickcolor').click(function() { + jQuery('#colorPickerDiv').show(); + return false; + }); + + jQuery('#clearcolor a').click( function(e) { + pickColor(''); + e.preventDefault(); + }); + + jQuery('#background-color').keyup(function() { + var _hex = jQuery('#background-color').val(), hex = _hex; + if ( hex.charAt(0) != '#' ) + hex = '#' + hex; + hex = hex.replace(/[^#a-fA-F0-9]+/, ''); + if ( hex != _hex ) + jQuery('#background-color').val(hex); + if ( hex.length == 4 || hex.length == 7 ) + pickColor( hex ); + }); + + jQuery('input[name="background-position-x"]').change(function() { + jQuery('#custom-background-image').css('background-position', jQuery(this).val() + ' top'); + }); + + jQuery('input[name="background-repeat"]').change(function() { + jQuery('#custom-background-image').css('background-repeat', jQuery(this).val()); + }); + + farbtastic = jQuery.farbtastic('#colorPickerDiv', function(color) { + pickColor(color); + }); + pickColor(jQuery('#background-color').val()); + + jQuery(document).mousedown(function(){ + jQuery('#colorPickerDiv').each(function(){ + var display = jQuery(this).css('display'); + if ( display == 'block' ) + jQuery(this).fadeOut(2); + }); + }); +}); diff --git a/src/wp-admin/js/custom-background.js b/src/wp-admin/js/custom-background.js new file mode 100644 index 0000000..6cf8851 --- /dev/null +++ b/src/wp-admin/js/custom-background.js @@ -0,0 +1 @@ +var farbtastic;function pickColor(a){farbtastic.setColor(a);jQuery("#background-color").val(a);jQuery("#custom-background-image").css("background-color",a);if(a&&a!=="#"){jQuery("#clearcolor").show()}else{jQuery("#clearcolor").hide()}}jQuery(document).ready(function(){jQuery("#pickcolor").click(function(){jQuery("#colorPickerDiv").show();return false});jQuery("#clearcolor a").click(function(a){pickColor("");a.preventDefault()});jQuery("#background-color").keyup(function(){var b=jQuery("#background-color").val(),a=b;if(a.charAt(0)!="#"){a="#"+a}a=a.replace(/[^#a-fA-F0-9]+/,"");if(a!=b){jQuery("#background-color").val(a)}if(a.length==4||a.length==7){pickColor(a)}});jQuery('input[name="background-position-x"]').change(function(){jQuery("#custom-background-image").css("background-position",jQuery(this).val()+" top")});jQuery('input[name="background-repeat"]').change(function(){jQuery("#custom-background-image").css("background-repeat",jQuery(this).val())});farbtastic=jQuery.farbtastic("#colorPickerDiv",function(a){pickColor(a)});pickColor(jQuery("#background-color").val());jQuery(document).mousedown(function(){jQuery("#colorPickerDiv").each(function(){var a=jQuery(this).css("display");if(a=="block"){jQuery(this).fadeOut(2)}})})}); \ No newline at end of file diff --git a/src/wp-admin/js/custom-fields.dev.js b/src/wp-admin/js/custom-fields.dev.js new file mode 100644 index 0000000..9eab214 --- /dev/null +++ b/src/wp-admin/js/custom-fields.dev.js @@ -0,0 +1,34 @@ +jQuery(document).ready( function($) { + var before, addBefore, addAfter, delBefore; + + before = function() { + var nonce = $('#newmeta [name="_ajax_nonce"]').val(), postId = $('#post_ID').val(); + if ( !nonce || !postId ) { return false; } + return [nonce,postId]; + } + + addBefore = function( s ) { + var b = before(); + if ( !b ) { return false; } + s.data = s.data.replace(/_ajax_nonce=[a-f0-9]+/, '_ajax_nonce=' + b[0]) + '&post_id=' + b[1]; + return s; + }; + + addAfter = function( r, s ) { + var postId = $('postid', r).text(), h; + if ( !postId ) { return; } + $('#post_ID').attr( 'name', 'post_ID' ).val( postId ); + h = $('#hiddenaction'); + if ( 'post' == h.val() ) { h.val( 'postajaxpost' ); } + }; + + delBefore = function( s ) { + var b = before(); if ( !b ) return false; + s.data._ajax_nonce = b[0]; s.data.post_id = b[1]; + return s; + } + + $('#the-list') + .wpList( { addBefore: addBefore, addAfter: addAfter, delBefore: delBefore } ) + .find('.updatemeta, .deletemeta').attr( 'type', 'button' ); +} ); diff --git a/src/wp-admin/js/custom-fields.js b/src/wp-admin/js/custom-fields.js new file mode 100644 index 0000000..dbe2f48 --- /dev/null +++ b/src/wp-admin/js/custom-fields.js @@ -0,0 +1 @@ +jQuery(document).ready(function(d){var c,b,e,a;c=function(){var g=d('#newmeta [name="_ajax_nonce"]').val(),f=d("#post_ID").val();if(!g||!f){return false}return[g,f]};b=function(g){var f=c();if(!f){return false}g.data=g.data.replace(/_ajax_nonce=[a-f0-9]+/,"_ajax_nonce="+f[0])+"&post_id="+f[1];return g};e=function(j,i){var f=d("postid",j).text(),g;if(!f){return}d("#post_ID").attr("name","post_ID").val(f);g=d("#hiddenaction");if("post"==g.val()){g.val("postajaxpost")}};a=function(g){var f=c();if(!f){return false}g.data._ajax_nonce=f[0];g.data.post_id=f[1];return g};d("#the-list").wpList({addBefore:b,addAfter:e,delBefore:a}).find(".updatemeta, .deletemeta").attr("type","button")}); \ No newline at end of file diff --git a/src/wp-admin/js/dashboard.dev.js b/src/wp-admin/js/dashboard.dev.js new file mode 100644 index 0000000..127a7bd --- /dev/null +++ b/src/wp-admin/js/dashboard.dev.js @@ -0,0 +1,67 @@ +var ajaxWidgets, ajaxPopulateWidgets, quickPressLoad; + +jQuery(document).ready( function($) { + // These widgets are sometimes populated via ajax + ajaxWidgets = [ + 'dashboard_incoming_links', + 'dashboard_primary', + 'dashboard_secondary', + 'dashboard_plugins' + ]; + + ajaxPopulateWidgets = function(el) { + function show(i, id) { + var p, e = $('#' + id + ' div.inside:visible').find('.widget-loading'); + if ( e.length ) { + p = e.parent(); + setTimeout( function(){ + p.load( ajaxurl.replace( '/admin-ajax.php', '' ) + '/index-extra.php?jax=' + id, '', function() { + p.hide().slideDown('normal', function(){ + $(this).css('display', ''); + }); + }); + }, i * 500 ); + } + } + + if ( el ) { + el = el.toString(); + if ( $.inArray(el, ajaxWidgets) != -1 ) + show(0, el); + } else { + $.each( ajaxWidgets, show ); + } + }; + ajaxPopulateWidgets(); + + postboxes.add_postbox_toggles(pagenow, { pbshow: ajaxPopulateWidgets } ); + + /* QuickPress */ + quickPressLoad = function() { + var act = $('#quickpost-action'), t; + t = $('#quick-press').submit( function() { + $('#dashboard_quick_press #publishing-action img.waiting').css('visibility', 'visible'); + $('#quick-press .submit input[type="submit"], #quick-press .submit input[type="reset"]').prop('disabled', true); + + if ( 'post' == act.val() ) { + act.val( 'post-quickpress-publish' ); + } + + $('#dashboard_quick_press div.inside').load( t.attr( 'action' ), t.serializeArray(), function() { + $('#dashboard_quick_press #publishing-action img.waiting').css('visibility', 'hidden'); + $('#quick-press .submit input[type="submit"], #quick-press .submit input[type="reset"]').prop('disabled', false); + $('#dashboard_quick_press ul').next('p').remove(); + $('#dashboard_quick_press ul').find('li').each( function() { + $('#dashboard_recent_drafts ul').prepend( this ); + } ).end().remove(); + quickPressLoad(); + } ); + return false; + } ); + + $('#publish').click( function() { act.val( 'post-quickpress-publish' ); } ); + + }; + quickPressLoad(); + +} ); diff --git a/src/wp-admin/js/dashboard.js b/src/wp-admin/js/dashboard.js new file mode 100644 index 0000000..bd836d1 --- /dev/null +++ b/src/wp-admin/js/dashboard.js @@ -0,0 +1 @@ +var ajaxWidgets,ajaxPopulateWidgets,quickPressLoad;jQuery(document).ready(function(a){ajaxWidgets=["dashboard_incoming_links","dashboard_primary","dashboard_secondary","dashboard_plugins"];ajaxPopulateWidgets=function(c){function b(d,h){var g,f=a("#"+h+" div.inside:visible").find(".widget-loading");if(f.length){g=f.parent();setTimeout(function(){g.load(ajaxurl.replace("/admin-ajax.php","")+"/index-extra.php?jax="+h,"",function(){g.hide().slideDown("normal",function(){a(this).css("display","")})})},d*500)}}if(c){c=c.toString();if(a.inArray(c,ajaxWidgets)!=-1){b(0,c)}}else{a.each(ajaxWidgets,b)}};ajaxPopulateWidgets();postboxes.add_postbox_toggles(pagenow,{pbshow:ajaxPopulateWidgets});quickPressLoad=function(){var b=a("#quickpost-action"),c;c=a("#quick-press").submit(function(){a("#dashboard_quick_press #publishing-action img.waiting").css("visibility","visible");a('#quick-press .submit input[type="submit"], #quick-press .submit input[type="reset"]').prop("disabled",true);if("post"==b.val()){b.val("post-quickpress-publish")}a("#dashboard_quick_press div.inside").load(c.attr("action"),c.serializeArray(),function(){a("#dashboard_quick_press #publishing-action img.waiting").css("visibility","hidden");a('#quick-press .submit input[type="submit"], #quick-press .submit input[type="reset"]').prop("disabled",false);a("#dashboard_quick_press ul").next("p").remove();a("#dashboard_quick_press ul").find("li").each(function(){a("#dashboard_recent_drafts ul").prepend(this)}).end().remove();quickPressLoad()});return false});a("#publish").click(function(){b.val("post-quickpress-publish")})};quickPressLoad()}); \ No newline at end of file diff --git a/src/wp-admin/js/edit-comments.dev.js b/src/wp-admin/js/edit-comments.dev.js new file mode 100644 index 0000000..7cffd56 --- /dev/null +++ b/src/wp-admin/js/edit-comments.dev.js @@ -0,0 +1,596 @@ +var theList, theExtraList, toggleWithKeyboard = false, getCount, updateCount, updatePending, dashboardTotals; +(function($) { + +setCommentsList = function() { + var totalInput, perPageInput, pageInput, lastConfidentTime = 0, dimAfter, delBefore, updateTotalCount, delAfter, refillTheExtraList; + + totalInput = $('input[name="_total"]', '#comments-form'); + perPageInput = $('input[name="_per_page"]', '#comments-form'); + pageInput = $('input[name="_page"]', '#comments-form'); + + dimAfter = function( r, settings ) { + var c = $('#' + settings.element), editRow, replyID, replyButton; + + editRow = $('#replyrow'); + replyID = $('#comment_ID', editRow).val(); + replyButton = $('#replybtn', editRow); + + if ( c.is('.unapproved') ) { + if ( settings.data.id == replyID ) + replyButton.text(adminCommentsL10n.replyApprove); + + c.find('div.comment_status').html('0'); + } else { + if ( settings.data.id == replyID ) + replyButton.text(adminCommentsL10n.reply); + + c.find('div.comment_status').html('1'); + } + + $('span.pending-count').each( function() { + var a = $(this), n, dif; + n = a.html().replace(/[^0-9]+/g, ''); + n = parseInt(n,10); + if ( isNaN(n) ) return; + dif = $('#' + settings.element).is('.' + settings.dimClass) ? 1 : -1; + n = n + dif; + if ( n < 0 ) { n = 0; } + a.closest('.awaiting-mod')[ 0 == n ? 'addClass' : 'removeClass' ]('count-0'); + updateCount(a, n); + dashboardTotals(); + }); + }; + + // Send current total, page, per_page and url + delBefore = function( settings, list ) { + var cl = $(settings.target).attr('class'), id, el, n, h, a, author, action = false; + + settings.data._total = totalInput.val() || 0; + settings.data._per_page = perPageInput.val() || 0; + settings.data._page = pageInput.val() || 0; + settings.data._url = document.location.href; + settings.data.comment_status = $('input[name="comment_status"]', '#comments-form').val(); + + if ( cl.indexOf(':trash=1') != -1 ) + action = 'trash'; + else if ( cl.indexOf(':spam=1') != -1 ) + action = 'spam'; + + if ( action ) { + id = cl.replace(/.*?comment-([0-9]+).*/, '$1'); + el = $('#comment-' + id); + note = $('#' + action + '-undo-holder').html(); + + el.find('.check-column :checkbox').prop('checked', false); // Uncheck the row so as not to be affected by Bulk Edits. + + if ( el.siblings('#replyrow').length && commentReply.cid == id ) + commentReply.close(); + + if ( el.is('tr') ) { + n = el.children(':visible').length; + author = $('.author strong', el).text(); + h = $('' + note + ''); + } else { + author = $('.comment-author', el).text(); + h = $(''); + } + + el.before(h); + + $('strong', '#undo-' + id).text(author + ' '); + a = $('.undo a', '#undo-' + id); + a.attr('href', 'comment.php?action=un' + action + 'comment&c=' + id + '&_wpnonce=' + settings.data._ajax_nonce); + a.attr('class', 'delete:the-comment-list:comment-' + id + '::un' + action + '=1 vim-z vim-destructive'); + $('.avatar', el).clone().prependTo('#undo-' + id + ' .' + action + '-undo-inside'); + + a.click(function(){ + list.wpList.del(this); + $('#undo-' + id).css( {backgroundColor:'#ceb'} ).fadeOut(350, function(){ + $(this).remove(); + $('#comment-' + id).css('backgroundColor', '').fadeIn(300, function(){ $(this).show() }); + }); + return false; + }); + } + + return settings; + }; + + // Updates the current total (as displayed visibly) + updateTotalCount = function( total, time, setConfidentTime ) { + if ( time < lastConfidentTime ) + return; + + if ( setConfidentTime ) + lastConfidentTime = time; + + totalInput.val( total.toString() ); + $('span.total-type-count').each( function() { + updateCount( $(this), total ); + }); + }; + + dashboardTotals = function(n) { + var dash = $('#dashboard_right_now'), total, appr, totalN, apprN; + + n = n || 0; + if ( isNaN(n) || !dash.length ) + return; + + total = $('span.total-count', dash); + appr = $('span.approved-count', dash); + totalN = getCount(total); + + totalN = totalN + n; + apprN = totalN - getCount( $('span.pending-count', dash) ) - getCount( $('span.spam-count', dash) ); + updateCount(total, totalN); + updateCount(appr, apprN); + + }; + + getCount = function(el) { + var n = parseInt( el.html().replace(/[^0-9]+/g, ''), 10 ); + if ( isNaN(n) ) + return 0; + return n; + }; + + updateCount = function(el, n) { + var n1 = ''; + if ( isNaN(n) ) + return; + n = n < 1 ? '0' : n.toString(); + if ( n.length > 3 ) { + while ( n.length > 3 ) { + n1 = thousandsSeparator + n.substr(n.length - 3) + n1; + n = n.substr(0, n.length - 3); + } + n = n + n1; + } + el.html(n); + }; + + updatePending = function(n) { + $('span.pending-count').each( function() { + var a = $(this); + + if ( n < 0 ) + n = 0; + + a.closest('.awaiting-mod')[ 0 == n ? 'addClass' : 'removeClass' ]('count-0'); + updateCount(a, n); + dashboardTotals(); + }); + }; + + // In admin-ajax.php, we send back the unix time stamp instead of 1 on success + delAfter = function( r, settings ) { + var total, N, untrash = $(settings.target).parent().is('span.untrash'), + unspam = $(settings.target).parent().is('span.unspam'), spam, trash, pending, + unapproved = $('#' + settings.element).is('.unapproved'); + + function getUpdate(s) { + if ( $(settings.target).parent().is('span.' + s) ) + return 1; + else if ( $('#' + settings.element).is('.' + s) ) + return -1; + + return 0; + } + + spam = getUpdate('spam'); + trash = getUpdate('trash'); + + if ( untrash ) + trash = -1; + if ( unspam ) + spam = -1; + + pending = getCount( $('span.pending-count').eq(0) ); + + if ( $(settings.target).parent().is('span.unapprove') || ( ( untrash || unspam ) && unapproved ) ) { // we "deleted" an approved comment from the approved list by clicking "Unapprove" + pending = pending + 1; + } else if ( unapproved ) { // we deleted a formerly unapproved comment + pending = pending - 1; + } + + updatePending(pending); + + $('span.spam-count').each( function() { + var a = $(this), n = getCount(a) + spam; + updateCount(a, n); + }); + + $('span.trash-count').each( function() { + var a = $(this), n = getCount(a) + trash; + updateCount(a, n); + }); + + if ( $('#dashboard_right_now').length ) { + N = trash ? -1 * trash : 0; + dashboardTotals(N); + } else { + total = totalInput.val() ? parseInt( totalInput.val(), 10 ) : 0; + total = total - spam - trash; + if ( total < 0 ) + total = 0; + + if ( ( 'object' == typeof r ) && lastConfidentTime < settings.parsed.responses[0].supplemental.time ) { + total_items_i18n = settings.parsed.responses[0].supplemental.total_items_i18n || ''; + if ( total_items_i18n ) { + $('.displaying-num').text( total_items_i18n ); + $('.total-pages').text( settings.parsed.responses[0].supplemental.total_pages_i18n ); + $('.tablenav-pages').find('.next-page, .last-page').toggleClass('disabled', settings.parsed.responses[0].supplemental.total_pages == $('.current-page').val()); + } + updateTotalCount( total, settings.parsed.responses[0].supplemental.time, true ); + } else { + updateTotalCount( total, r, false ); + } + } + + + if ( ! theExtraList || theExtraList.size() == 0 || theExtraList.children().size() == 0 || untrash || unspam ) { + return; + } + + theList.get(0).wpList.add( theExtraList.children(':eq(0)').remove().clone() ); + + refillTheExtraList(); + }; + + refillTheExtraList = function(ev) { + var args = $.query.get(), total_pages = $('.total-pages').text(), per_page = $('input[name="_per_page"]', '#comments-form').val(); + + if (! args.paged) + args.paged = 1; + + if (args.paged > total_pages) { + return; + } + + if (ev) { + theExtraList.empty(); + args.number = Math.min(8, per_page); // see WP_Comments_List_Table::prepare_items() @ class-wp-comments-list-table.php + } else { + args.number = 1; + args.offset = Math.min(8, per_page) - 1; // fetch only the next item on the extra list + } + + args.no_placeholder = true; + + args.paged ++; + + // $.query.get() needs some correction to be sent into an ajax request + if ( true === args.comment_type ) + args.comment_type = ''; + + args = $.extend(args, { + 'action': 'fetch-list', + 'list_args': list_args, + '_ajax_fetch_list_nonce': $('#_ajax_fetch_list_nonce').val() + }); + + $.ajax({ + url: ajaxurl, + global: false, + dataType: 'json', + data: args, + success: function(response) { + theExtraList.get(0).wpList.add( response.rows ); + } + }); + }; + + theExtraList = $('#the-extra-comment-list').wpList( { alt: '', delColor: 'none', addColor: 'none' } ); + theList = $('#the-comment-list').wpList( { alt: '', delBefore: delBefore, dimAfter: dimAfter, delAfter: delAfter, addColor: 'none' } ) + .bind('wpListDelEnd', function(e, s){ + var id = s.element.replace(/[^0-9]+/g, ''); + + if ( s.target.className.indexOf(':trash=1') != -1 || s.target.className.indexOf(':spam=1') != -1 ) + $('#undo-' + id).fadeIn(300, function(){ $(this).show() }); + }); +}; + +commentReply = { + cid : '', + act : '', + + init : function() { + var row = $('#replyrow'); + + $('a.cancel', row).click(function() { return commentReply.revert(); }); + $('a.save', row).click(function() { return commentReply.send(); }); + $('input#author, input#author-email, input#author-url', row).keypress(function(e){ + if ( e.which == 13 ) { + commentReply.send(); + e.preventDefault(); + return false; + } + }); + + // add events + $('#the-comment-list .column-comment > p').dblclick(function(){ + commentReply.toggle($(this).parent()); + }); + + $('#doaction, #doaction2, #post-query-submit').click(function(e){ + if ( $('#the-comment-list #replyrow').length > 0 ) + commentReply.close(); + }); + + this.comments_listing = $('#comments-form > input[name="comment_status"]').val() || ''; + + /* $(listTable).bind('beforeChangePage', function(){ + commentReply.close(); + }); */ + }, + + addEvents : function(r) { + r.each(function() { + $(this).find('.column-comment > p').dblclick(function(){ + commentReply.toggle($(this).parent()); + }); + }); + }, + + toggle : function(el) { + if ( $(el).css('display') != 'none' ) + $(el).find('a.vim-q').click(); + }, + + revert : function() { + + if ( $('#the-comment-list #replyrow').length < 1 ) + return false; + + $('#replyrow').fadeOut('fast', function(){ + commentReply.close(); + }); + + return false; + }, + + close : function() { + var c; + + if ( this.cid ) { + c = $('#comment-' + this.cid); + + if ( this.act == 'edit-comment' ) + c.fadeIn(300, function(){ c.show() }).css('backgroundColor', ''); + + $('#replyrow').hide(); + $('#com-reply').append( $('#replyrow') ); + $('#replycontent').val(''); + $('input', '#edithead').val(''); + $('.error', '#replysubmit').html('').hide(); + $('.waiting', '#replysubmit').hide(); + + if ( $.browser.msie ) + $('#replycontainer, #replycontent').css('height', '120px'); + else + $('#replycontainer').resizable('destroy').css('height', '120px'); + + this.cid = ''; + } + }, + + open : function(id, p, a) { + var t = this, editRow, rowData, act, h, c = $('#comment-' + id), replyButton; + + t.close(); + t.cid = id; + + editRow = $('#replyrow'); + rowData = $('#inline-'+id); + act = t.act = (a == 'edit') ? 'edit-comment' : 'replyto-comment'; + + $('#action', editRow).val(act); + $('#comment_post_ID', editRow).val(p); + $('#comment_ID', editRow).val(id); + + if ( a == 'edit' ) { + $('#author', editRow).val( $('div.author', rowData).text() ); + $('#author-email', editRow).val( $('div.author-email', rowData).text() ); + $('#author-url', editRow).val( $('div.author-url', rowData).text() ); + $('#status', editRow).val( $('div.comment_status', rowData).text() ); + $('#replycontent', editRow).val( $('textarea.comment', rowData).val() ); + $('#edithead, #savebtn', editRow).show(); + $('#replyhead, #replybtn', editRow).hide(); + + h = c.height(); + if ( h > 220 ) + if ( $.browser.msie ) + $('#replycontainer, #replycontent', editRow).height(h-105); + else + $('#replycontainer', editRow).height(h-105); + + c.after( editRow ).fadeOut('fast', function(){ + $('#replyrow').fadeIn(300, function(){ $(this).show() }); + }); + } else { + replyButton = $('#replybtn', editRow); + $('#edithead, #savebtn', editRow).hide(); + $('#replyhead, #replybtn', editRow).show(); + c.after(editRow); + + if ( c.hasClass('unapproved') ) { + replyButton.text(adminCommentsL10n.replyApprove); + } else { + replyButton.text(adminCommentsL10n.reply); + } + + $('#replyrow').fadeIn(300, function(){ $(this).show() }); + } + + setTimeout(function() { + var rtop, rbottom, scrollTop, vp, scrollBottom; + + rtop = $('#replyrow').offset().top; + rbottom = rtop + $('#replyrow').height(); + scrollTop = window.pageYOffset || document.documentElement.scrollTop; + vp = document.documentElement.clientHeight || self.innerHeight || 0; + scrollBottom = scrollTop + vp; + + if ( scrollBottom - 20 < rbottom ) + window.scroll(0, rbottom - vp + 35); + else if ( rtop - 20 < scrollTop ) + window.scroll(0, rtop - 35); + + $('#replycontent').focus().keyup(function(e){ + if ( e.which == 27 ) + commentReply.revert(); // close on Escape + }); + }, 600); + + return false; + }, + + send : function() { + var post = {}; + + $('#replysubmit .error').hide(); + $('#replysubmit .waiting').show(); + + $('#replyrow input').not(':button').each(function() { + post[ $(this).attr('name') ] = $(this).val(); + }); + + post.content = $('#replycontent').val(); + post.id = post.comment_post_ID; + post.comments_listing = this.comments_listing; + post.p = $('[name="p"]').val(); + + if ( $('#comment-' + $('#comment_ID').val()).hasClass('unapproved') ) + post.approve_parent = 1; + + $.ajax({ + type : 'POST', + url : ajaxurl, + data : post, + success : function(x) { commentReply.show(x); }, + error : function(r) { commentReply.error(r); } + }); + + return false; + }, + + show : function(xml) { + var t = this, r, c, id, bg, pid; + + t.revert(); + + if ( typeof(xml) == 'string' ) { + t.error({'responseText': xml}); + return false; + } + + r = wpAjax.parseAjaxResponse(xml); + if ( r.errors ) { + t.error({'responseText': wpAjax.broken}); + return false; + } + + r = r.responses[0]; + c = r.data; + id = '#comment-' + r.id; + if ( 'edit-comment' == t.act ) + $(id).remove(); + + if ( r.supplemental.parent_approved ) { + pid = $('#comment-' + r.supplemental.parent_approved); + updatePending( getCount( $('span.pending-count').eq(0) ) - 1 ); + + if ( this.comments_listing == 'moderated' ) { + pid.animate( { 'backgroundColor':'#CCEEBB' }, 400, function(){ + pid.fadeOut(); + }); + return; + } + } + + $(c).hide() + $('#replyrow').after(c); + id = $(id); + t.addEvents(id); + bg = id.hasClass('unapproved') ? '#FFFFE0' : id.closest('.widefat').css('backgroundColor'); + + id.animate( { 'backgroundColor':'#CCEEBB' }, 300 ) + .animate( { 'backgroundColor': bg }, 300, function() { + if ( pid && pid.length ) { + pid.animate( { 'backgroundColor':'#CCEEBB' }, 300 ) + .animate( { 'backgroundColor': bg }, 300 ) + .removeClass('unapproved').addClass('approved') + .find('div.comment_status').html('1'); + } + }); + + }, + + error : function(r) { + var er = r.statusText; + + $('#replysubmit .waiting').hide(); + + if ( r.responseText ) + er = r.responseText.replace( /<.[^<>]*?>/g, '' ); + + if ( er ) + $('#replysubmit .error').html(er).show(); + + } +}; + +$(document).ready(function(){ + var make_hotkeys_redirect, edit_comment, toggle_all, make_bulk; + + setCommentsList(); + commentReply.init(); + $(document).delegate('span.delete a.delete', 'click', function(){return false;}); + + if ( typeof QTags != 'undefined' ) + ed_reply = new QTags('ed_reply', 'replycontent', 'replycontainer', 'more,fullscreen'); + + if ( typeof $.table_hotkeys != 'undefined' ) { + make_hotkeys_redirect = function(which) { + return function() { + var first_last, l; + + first_last = 'next' == which? 'first' : 'last'; + l = $('.tablenav-pages .'+which+'-page:not(.disabled)'); + if (l.length) + window.location = l[0].href.replace(/\&hotkeys_highlight_(first|last)=1/g, '')+'&hotkeys_highlight_'+first_last+'=1'; + } + }; + + edit_comment = function(event, current_row) { + window.location = $('span.edit a', current_row).attr('href'); + }; + + toggle_all = function() { + toggleWithKeyboard = true; + $('input:checkbox', '#cb').click().prop('checked', false); + toggleWithKeyboard = false; + }; + + make_bulk = function(value) { + return function() { + var scope = $('select[name="action"]'); + $('option[value="' + value + '"]', scope).prop('selected', true); + $('#doaction').click(); + } + }; + + $.table_hotkeys( + $('table.widefat'), + ['a', 'u', 's', 'd', 'r', 'q', 'z', ['e', edit_comment], ['shift+x', toggle_all], + ['shift+a', make_bulk('approve')], ['shift+s', make_bulk('spam')], + ['shift+d', make_bulk('delete')], ['shift+t', make_bulk('trash')], + ['shift+z', make_bulk('untrash')], ['shift+u', make_bulk('unapprove')]], + { highlight_first: adminCommentsL10n.hotkeys_highlight_first, highlight_last: adminCommentsL10n.hotkeys_highlight_last, + prev_page_link_cb: make_hotkeys_redirect('prev'), next_page_link_cb: make_hotkeys_redirect('next') } + ); + } +}); + +})(jQuery); diff --git a/src/wp-admin/js/edit-comments.js b/src/wp-admin/js/edit-comments.js new file mode 100644 index 0000000..c7c417c --- /dev/null +++ b/src/wp-admin/js/edit-comments.js @@ -0,0 +1 @@ +var theList,theExtraList,toggleWithKeyboard=false,getCount,updateCount,updatePending,dashboardTotals;(function(a){setCommentsList=function(){var c,e,g,j=0,f,h,d,i,b;c=a('input[name="_total"]',"#comments-form");e=a('input[name="_per_page"]',"#comments-form");g=a('input[name="_page"]',"#comments-form");f=function(n,l){var p=a("#"+l.element),k,o,m;k=a("#replyrow");o=a("#comment_ID",k).val();m=a("#replybtn",k);if(p.is(".unapproved")){if(l.data.id==o){m.text(adminCommentsL10n.replyApprove)}p.find("div.comment_status").html("0")}else{if(l.data.id==o){m.text(adminCommentsL10n.reply)}p.find("div.comment_status").html("1")}a("span.pending-count").each(function(){var q=a(this),s,r;s=q.html().replace(/[^0-9]+/g,"");s=parseInt(s,10);if(isNaN(s)){return}r=a("#"+l.element).is("."+l.dimClass)?1:-1;s=s+r;if(s<0){s=0}q.closest(".awaiting-mod")[0==s?"addClass":"removeClass"]("count-0");updateCount(q,s);dashboardTotals()})};h=function(o,s){var u=a(o.target).attr("class"),k,l,m,r,t,q,p=false;o.data._total=c.val()||0;o.data._per_page=e.val()||0;o.data._page=g.val()||0;o.data._url=document.location.href;o.data.comment_status=a('input[name="comment_status"]',"#comments-form").val();if(u.indexOf(":trash=1")!=-1){p="trash"}else{if(u.indexOf(":spam=1")!=-1){p="spam"}}if(p){k=u.replace(/.*?comment-([0-9]+).*/,"$1");l=a("#comment-"+k);note=a("#"+p+"-undo-holder").html();l.find(".check-column :checkbox").prop("checked",false);if(l.siblings("#replyrow").length&&commentReply.cid==k){commentReply.close()}if(l.is("tr")){m=l.children(":visible").length;q=a(".author strong",l).text();r=a(''+note+"")}else{q=a(".comment-author",l).text();r=a('")}l.before(r);a("strong","#undo-"+k).text(q+" ");t=a(".undo a","#undo-"+k);t.attr("href","comment.php?action=un"+p+"comment&c="+k+"&_wpnonce="+o.data._ajax_nonce);t.attr("class","delete:the-comment-list:comment-"+k+"::un"+p+"=1 vim-z vim-destructive");a(".avatar",l).clone().prependTo("#undo-"+k+" ."+p+"-undo-inside");t.click(function(){s.wpList.del(this);a("#undo-"+k).css({backgroundColor:"#ceb"}).fadeOut(350,function(){a(this).remove();a("#comment-"+k).css("backgroundColor","").fadeIn(300,function(){a(this).show()})});return false})}return o};d=function(k,l,m){if(l3){while(m.length>3){k=thousandsSeparator+m.substr(m.length-3)+k;m=m.substr(0,m.length-3)}m=m+k}l.html(m)};updatePending=function(k){a("span.pending-count").each(function(){var l=a(this);if(k<0){k=0}l.closest(".awaiting-mod")[0==k?"addClass":"removeClass"]("count-0");updateCount(l,k);dashboardTotals()})};i=function(k,n){var q,o,u=a(n.target).parent().is("span.untrash"),m=a(n.target).parent().is("span.unspam"),t,s,l,p=a("#"+n.element).is(".unapproved");function v(r){if(a(n.target).parent().is("span."+r)){return 1}else{if(a("#"+n.element).is("."+r)){return -1}}return 0}t=v("spam");s=v("trash");if(u){s=-1}if(m){t=-1}l=getCount(a("span.pending-count").eq(0));if(a(n.target).parent().is("span.unapprove")||((u||m)&&p)){l=l+1}else{if(p){l=l-1}}updatePending(l);a("span.spam-count").each(function(){var r=a(this),w=getCount(r)+t;updateCount(r,w)});a("span.trash-count").each(function(){var r=a(this),w=getCount(r)+s;updateCount(r,w)});if(a("#dashboard_right_now").length){o=s?-1*s:0;dashboardTotals(o)}else{q=c.val()?parseInt(c.val(),10):0;q=q-t-s;if(q<0){q=0}if(("object"==typeof k)&&jk){return}if(n){theExtraList.empty();l.number=Math.min(8,m)}else{l.number=1;l.offset=Math.min(8,m)-1}l.no_placeholder=true;l.paged++;if(true===l.comment_type){l.comment_type=""}l=a.extend(l,{action:"fetch-list",list_args:list_args,_ajax_fetch_list_nonce:a("#_ajax_fetch_list_nonce").val()});a.ajax({url:ajaxurl,global:false,dataType:"json",data:l,success:function(o){theExtraList.get(0).wpList.add(o.rows)}})};theExtraList=a("#the-extra-comment-list").wpList({alt:"",delColor:"none",addColor:"none"});theList=a("#the-comment-list").wpList({alt:"",delBefore:h,dimAfter:f,delAfter:i,addColor:"none"}).bind("wpListDelEnd",function(l,k){var m=k.element.replace(/[^0-9]+/g,"");if(k.target.className.indexOf(":trash=1")!=-1||k.target.className.indexOf(":spam=1")!=-1){a("#undo-"+m).fadeIn(300,function(){a(this).show()})}})};commentReply={cid:"",act:"",init:function(){var b=a("#replyrow");a("a.cancel",b).click(function(){return commentReply.revert()});a("a.save",b).click(function(){return commentReply.send()});a("input#author, input#author-email, input#author-url",b).keypress(function(c){if(c.which==13){commentReply.send();c.preventDefault();return false}});a("#the-comment-list .column-comment > p").dblclick(function(){commentReply.toggle(a(this).parent())});a("#doaction, #doaction2, #post-query-submit").click(function(c){if(a("#the-comment-list #replyrow").length>0){commentReply.close()}});this.comments_listing=a('#comments-form > input[name="comment_status"]').val()||""},addEvents:function(b){b.each(function(){a(this).find(".column-comment > p").dblclick(function(){commentReply.toggle(a(this).parent())})})},toggle:function(b){if(a(b).css("display")!="none"){a(b).find("a.vim-q").click()}},revert:function(){if(a("#the-comment-list #replyrow").length<1){return false}a("#replyrow").fadeOut("fast",function(){commentReply.close()});return false},close:function(){var b;if(this.cid){b=a("#comment-"+this.cid);if(this.act=="edit-comment"){b.fadeIn(300,function(){b.show()}).css("backgroundColor","")}a("#replyrow").hide();a("#com-reply").append(a("#replyrow"));a("#replycontent").val("");a("input","#edithead").val("");a(".error","#replysubmit").html("").hide();a(".waiting","#replysubmit").hide();if(a.browser.msie){a("#replycontainer, #replycontent").css("height","120px")}else{a("#replycontainer").resizable("destroy").css("height","120px")}this.cid=""}},open:function(b,d,k){var m=this,e,f,i,g,j=a("#comment-"+b),l;m.close();m.cid=b;e=a("#replyrow");f=a("#inline-"+b);i=m.act=(k=="edit")?"edit-comment":"replyto-comment";a("#action",e).val(i);a("#comment_post_ID",e).val(d);a("#comment_ID",e).val(b);if(k=="edit"){a("#author",e).val(a("div.author",f).text());a("#author-email",e).val(a("div.author-email",f).text());a("#author-url",e).val(a("div.author-url",f).text());a("#status",e).val(a("div.comment_status",f).text());a("#replycontent",e).val(a("textarea.comment",f).val());a("#edithead, #savebtn",e).show();a("#replyhead, #replybtn",e).hide();g=j.height();if(g>220){if(a.browser.msie){a("#replycontainer, #replycontent",e).height(g-105)}else{a("#replycontainer",e).height(g-105)}}j.after(e).fadeOut("fast",function(){a("#replyrow").fadeIn(300,function(){a(this).show()})})}else{l=a("#replybtn",e);a("#edithead, #savebtn",e).hide();a("#replyhead, #replybtn",e).show();j.after(e);if(j.hasClass("unapproved")){l.text(adminCommentsL10n.replyApprove)}else{l.text(adminCommentsL10n.reply)}a("#replyrow").fadeIn(300,function(){a(this).show()})}setTimeout(function(){var o,h,p,c,n;o=a("#replyrow").offset().top;h=o+a("#replyrow").height();p=window.pageYOffset||document.documentElement.scrollTop;c=document.documentElement.clientHeight||self.innerHeight||0;n=p+c;if(n-20]*?>/g,"")}if(c){a("#replysubmit .error").html(c).show()}}};a(document).ready(function(){var e,b,c,d;setCommentsList();commentReply.init();a(document).delegate("span.delete a.delete","click",function(){return false});if(typeof QTags!="undefined"){ed_reply=new QTags("ed_reply","replycontent","replycontainer","more,fullscreen")}if(typeof a.table_hotkeys!="undefined"){e=function(f){return function(){var h,g;h="next"==f?"first":"last";g=a(".tablenav-pages ."+f+"-page:not(.disabled)");if(g.length){window.location=g[0].href.replace(/\&hotkeys_highlight_(first|last)=1/g,"")+"&hotkeys_highlight_"+h+"=1"}}};b=function(g,f){window.location=a("span.edit a",f).attr("href")};c=function(){toggleWithKeyboard=true;a("input:checkbox","#cb").click().prop("checked",false);toggleWithKeyboard=false};d=function(f){return function(){var g=a('select[name="action"]');a('option[value="'+f+'"]',g).prop("selected",true);a("#doaction").click()}};a.table_hotkeys(a("table.widefat"),["a","u","s","d","r","q","z",["e",b],["shift+x",c],["shift+a",d("approve")],["shift+s",d("spam")],["shift+d",d("delete")],["shift+t",d("trash")],["shift+z",d("untrash")],["shift+u",d("unapprove")]],{highlight_first:adminCommentsL10n.hotkeys_highlight_first,highlight_last:adminCommentsL10n.hotkeys_highlight_last,prev_page_link_cb:e("prev"),next_page_link_cb:e("next")})}})})(jQuery); \ No newline at end of file diff --git a/src/wp-admin/js/editor.dev.js b/src/wp-admin/js/editor.dev.js new file mode 100644 index 0000000..2271bdb --- /dev/null +++ b/src/wp-admin/js/editor.dev.js @@ -0,0 +1,207 @@ + +jQuery(document).ready(function($){ + var h = wpCookies.getHash('TinyMCE_content_size'); + + if ( getUserSetting( 'editor' ) == 'html' ) { + if ( h ) + $('#content').css('height', h.ch - 15 + 'px'); + } else { + if ( typeof tinyMCE != 'object' ) { + $('#content').css('color', '#000'); + } else { + $('#quicktags').hide(); + } + } +}); + +var switchEditors = { + + mode : '', + + I : function(e) { + return document.getElementById(e); + }, + + _wp_Nop : function(content) { + var blocklist1, blocklist2; + + // Protect pre|script tags + if ( content.indexOf(']*>[\s\S]+?<\/\1>/g, function(a) { + a = a.replace(/
    (\r\n|\n)?/g, ''); + return a.replace(/<\/?p( [^>]*)?>(\r\n|\n)?/g, ''); + }); + } + + // Pretty it up for the source editor + blocklist1 = 'blockquote|ul|ol|li|table|thead|tbody|tfoot|tr|th|td|div|h[1-6]|p|fieldset'; + content = content.replace(new RegExp('\\s*\\s*', 'g'), '\n'); + content = content.replace(new RegExp('\\s*<((?:'+blocklist1+')(?: [^>]*)?)>', 'g'), '\n<$1>'); + + // Mark

    if it has any attributes. + content = content.replace(/(

    ]+>.*?)<\/p>/g, '$1'); + + // Sepatate

    containing

    + content = content.replace(/]*)?>\s*

    /gi, '\n\n'); + + // Remove

    and
    + content = content.replace(/\s*

    /gi, ''); + content = content.replace(/\s*<\/p>\s*/gi, '\n\n'); + content = content.replace(/\n[\s\u00a0]+\n/g, '\n\n'); + content = content.replace(/\s*
    \s*/gi, '\n'); + + // Fix some block element newline issues + content = content.replace(/\s*

    \s*/g, '
    \n'); + content = content.replace(/\s*\[caption([^\[]+)\[\/caption\]\s*/gi, '\n\n[caption$1[/caption]\n\n'); + content = content.replace(/caption\]\n\n+\[caption/g, 'caption]\n\n[caption'); + + blocklist2 = 'blockquote|ul|ol|li|table|thead|tbody|tfoot|tr|th|td|h[1-6]|pre|fieldset'; + content = content.replace(new RegExp('\\s*<((?:'+blocklist2+')(?: [^>]*)?)\\s*>', 'g'), '\n<$1>'); + content = content.replace(new RegExp('\\s*\\s*', 'g'), '\n'); + content = content.replace(/]*)>/g, '\t'); + + if ( content.indexOf(']*)?>\s*/g, '\n\n\n\n'); + } + + if ( content.indexOf('/g, function(a){ + return a.replace(/[\r\n]+/g, ''); + }); + } + + // Unmark special paragraph closing tags + content = content.replace(/<\/p#>/g, '

    \n'); + content = content.replace(/\s*(

    ]+>[\s\S]*?<\/p>)/g, '\n$1'); + + // Trim whitespace + content = content.replace(/^\s+/, ''); + content = content.replace(/[\s\u00a0]+$/, ''); + + // put back the line breaks in pre|script + content = content.replace(//g, '\n'); + + return content; + }, + + go : function(id, mode) { + id = id || 'content'; + mode = mode || this.mode || ''; + + var ed, qt = this.I('quicktags'), H = this.I('edButtonHTML'), P = this.I('edButtonPreview'), ta = this.I(id); + + try { ed = tinyMCE.get(id); } + catch(e) { ed = false; } + + if ( 'tinymce' == mode ) { + if ( ed && ! ed.isHidden() ) + return false; + + setUserSetting( 'editor', 'tinymce' ); + this.mode = 'html'; + + P.className = 'active'; + H.className = ''; + edCloseAllTags(); // :-( + qt.style.display = 'none'; + + ta.style.color = '#FFF'; + ta.value = this.wpautop(ta.value); + + try { + if ( ed ) + ed.show(); + else + tinyMCE.execCommand("mceAddControl", false, id); + } catch(e) {} + + ta.style.color = '#000'; + } else { + setUserSetting( 'editor', 'html' ); + ta.style.color = '#000'; + this.mode = 'tinymce'; + H.className = 'active'; + P.className = ''; + + if ( ed && !ed.isHidden() ) { + ta.style.height = ed.getContentAreaContainer().offsetHeight + 24 + 'px'; + ed.hide(); + } + + qt.style.display = 'block'; + } + return false; + }, + + _wp_Autop : function(pee) { + var blocklist = 'table|thead|tfoot|tbody|tr|td|th|caption|col|colgroup|div|dl|dd|dt|ul|ol|li|pre|select|form|blockquote|address|math|p|h[1-6]|fieldset|legend|hr|noscript|menu|samp|header|footer|article|section|hgroup|nav|aside|details|summary'; + + if ( pee.indexOf('/g, function(a){ + return a.replace(/[\r\n]+/g, ''); + }); + } + + pee = pee.replace(/<[^<>]+>/g, function(a){ + return a.replace(/[\r\n]+/g, ' '); + }); + + // Protect pre|script tags + if ( pee.indexOf(']*>[\s\S]+?<\/\1>/g, function(a) { + return a.replace(/(\r\n|\n)/g, ''); + }); + } + + pee = pee + '\n\n'; + pee = pee.replace(/
    \s*
    /gi, '\n\n'); + pee = pee.replace(new RegExp('(<(?:'+blocklist+')(?: [^>]*)?>)', 'gi'), '\n$1'); + pee = pee.replace(new RegExp('()', 'gi'), '$1\n\n'); + pee = pee.replace(/]*)?>/gi, '\n\n'); // hr is self closing block element + pee = pee.replace(/\r\n|\r/g, '\n'); + pee = pee.replace(/\n\s*\n+/g, '\n\n'); + pee = pee.replace(/([\s\S]+?)\n\n/g, '

    $1

    \n'); + pee = pee.replace(/

    \s*?<\/p>/gi, ''); + pee = pee.replace(new RegExp('

    \\s*(]*)?>)\\s*

    ', 'gi'), "$1"); + pee = pee.replace(/

    (/gi, '$1'); + pee = pee.replace(/

    \s*]*)>/gi, '

    '); + pee = pee.replace(/<\/blockquote>\s*<\/p>/gi, '

    '); + pee = pee.replace(new RegExp('

    \\s*(]*)?>)', 'gi'), "$1"); + pee = pee.replace(new RegExp('(]*)?>)\\s*

    ', 'gi'), "$1"); + pee = pee.replace(/\s*\n/gi, '
    \n'); + pee = pee.replace(new RegExp('(]*>)\\s*
    ', 'gi'), "$1"); + pee = pee.replace(/
    (\s*<\/?(?:p|li|div|dl|dd|dt|th|pre|td|ul|ol)>)/gi, '$1'); + pee = pee.replace(/(?:

    |
    )*\s*\[caption([^\[]+)\[\/caption\]\s*(?:<\/p>|
    )*/gi, '[caption$1[/caption]'); + + pee = pee.replace(/(<(?:div|th|td|form|fieldset|dd)[^>]*>)(.*?)<\/p>/g, function(a, b, c) { + if ( c.match(/]*)?>/) ) + return a; + + return b + '

    ' + c + '

    '; + }); + + // put back the line breaks in pre|script + pee = pee.replace(//g, '\n'); + + return pee; + }, + + pre_wpautop : function(content) { + var t = this, o = { o: t, data: content, unfiltered: content }; + + jQuery('body').trigger('beforePreWpautop', [o]); + o.data = t._wp_Nop(o.data); + jQuery('body').trigger('afterPreWpautop', [o]); + return o.data; + }, + + wpautop : function(pee) { + var t = this, o = { o: t, data: pee, unfiltered: pee }; + + jQuery('body').trigger('beforeWpautop', [o]); + o.data = t._wp_Autop(o.data); + jQuery('body').trigger('afterWpautop', [o]); + return o.data; + } +}; diff --git a/src/wp-admin/js/editor.js b/src/wp-admin/js/editor.js new file mode 100644 index 0000000..c3e342a --- /dev/null +++ b/src/wp-admin/js/editor.js @@ -0,0 +1 @@ +jQuery(document).ready(function(b){var a=wpCookies.getHash("TinyMCE_content_size");if(getUserSetting("editor")=="html"){if(a){b("#content").css("height",a.ch-15+"px")}}else{if(typeof tinyMCE!="object"){b("#content").css("color","#000")}else{b("#quicktags").hide()}}});var switchEditors={mode:"",I:function(a){return document.getElementById(a)},_wp_Nop:function(b){var c,a;if(b.indexOf("]*>[\s\S]+?<\/\1>/g,function(d){d=d.replace(/
    (\r\n|\n)?/g,"");return d.replace(/<\/?p( [^>]*)?>(\r\n|\n)?/g,"")})}c="blockquote|ul|ol|li|table|thead|tbody|tfoot|tr|th|td|div|h[1-6]|p|fieldset";b=b.replace(new RegExp("\\s*\\s*","g"),"\n");b=b.replace(new RegExp("\\s*<((?:"+c+")(?: [^>]*)?)>","g"),"\n<$1>");b=b.replace(/(

    ]+>.*?)<\/p>/g,"$1");b=b.replace(/]*)?>\s*

    /gi,"\n\n");b=b.replace(/\s*

    /gi,"");b=b.replace(/\s*<\/p>\s*/gi,"\n\n");b=b.replace(/\n[\s\u00a0]+\n/g,"\n\n");b=b.replace(/\s*
    \s*/gi,"\n");b=b.replace(/\s*

    \s*/g,"
    \n");b=b.replace(/\s*\[caption([^\[]+)\[\/caption\]\s*/gi,"\n\n[caption$1[/caption]\n\n");b=b.replace(/caption\]\n\n+\[caption/g,"caption]\n\n[caption");a="blockquote|ul|ol|li|table|thead|tbody|tfoot|tr|th|td|h[1-6]|pre|fieldset";b=b.replace(new RegExp("\\s*<((?:"+a+")(?: [^>]*)?)\\s*>","g"),"\n<$1>");b=b.replace(new RegExp("\\s*\\s*","g"),"\n");b=b.replace(/]*)>/g,"\t");if(b.indexOf("]*)?>\s*/g,"\n\n\n\n")}if(b.indexOf("/g,function(d){return d.replace(/[\r\n]+/g,"")})}b=b.replace(/<\/p#>/g,"

    \n");b=b.replace(/\s*(

    ]+>[\s\S]*?<\/p>)/g,"\n$1");b=b.replace(/^\s+/,"");b=b.replace(/[\s\u00a0]+$/,"");b=b.replace(//g,"\n");return b},go:function(i,g){i=i||"content";g=g||this.mode||"";var b,h=this.I("quicktags"),c=this.I("edButtonHTML"),d=this.I("edButtonPreview"),a=this.I(i);try{b=tinyMCE.get(i)}catch(f){b=false}if("tinymce"==g){if(b&&!b.isHidden()){return false}setUserSetting("editor","tinymce");this.mode="html";d.className="active";c.className="";edCloseAllTags();h.style.display="none";a.style.color="#FFF";a.value=this.wpautop(a.value);try{if(b){b.show()}else{tinyMCE.execCommand("mceAddControl",false,i)}}catch(f){}a.style.color="#000"}else{setUserSetting("editor","html");a.style.color="#000";this.mode="tinymce";c.className="active";d.className="";if(b&&!b.isHidden()){a.style.height=b.getContentAreaContainer().offsetHeight+24+"px";b.hide()}h.style.display="block"}return false},_wp_Autop:function(a){var b="table|thead|tfoot|tbody|tr|td|th|caption|col|colgroup|div|dl|dd|dt|ul|ol|li|pre|select|form|blockquote|address|math|p|h[1-6]|fieldset|legend|hr|noscript|menu|samp|header|footer|article|section|hgroup|nav|aside|details|summary";if(a.indexOf("/g,function(c){return c.replace(/[\r\n]+/g,"")})}a=a.replace(/<[^<>]+>/g,function(c){return c.replace(/[\r\n]+/g," ")});if(a.indexOf("]*>[\s\S]+?<\/\1>/g,function(c){return c.replace(/(\r\n|\n)/g,"")})}a=a+"\n\n";a=a.replace(/
    \s*
    /gi,"\n\n");a=a.replace(new RegExp("(<(?:"+b+")(?: [^>]*)?>)","gi"),"\n$1");a=a.replace(new RegExp("()","gi"),"$1\n\n");a=a.replace(/]*)?>/gi,"\n\n");a=a.replace(/\r\n|\r/g,"\n");a=a.replace(/\n\s*\n+/g,"\n\n");a=a.replace(/([\s\S]+?)\n\n/g,"

    $1

    \n");a=a.replace(/

    \s*?<\/p>/gi,"");a=a.replace(new RegExp("

    \\s*(]*)?>)\\s*

    ","gi"),"$1");a=a.replace(/

    (/gi,"$1");a=a.replace(/

    \s*]*)>/gi,"

    ");a=a.replace(/<\/blockquote>\s*<\/p>/gi,"

    ");a=a.replace(new RegExp("

    \\s*(]*)?>)","gi"),"$1");a=a.replace(new RegExp("(]*)?>)\\s*

    ","gi"),"$1");a=a.replace(/\s*\n/gi,"
    \n");a=a.replace(new RegExp("(]*>)\\s*
    ","gi"),"$1");a=a.replace(/
    (\s*<\/?(?:p|li|div|dl|dd|dt|th|pre|td|ul|ol)>)/gi,"$1");a=a.replace(/(?:

    |
    )*\s*\[caption([^\[]+)\[\/caption\]\s*(?:<\/p>|
    )*/gi,"[caption$1[/caption]");a=a.replace(/(<(?:div|th|td|form|fieldset|dd)[^>]*>)(.*?)<\/p>/g,function(e,d,f){if(f.match(/]*)?>/)){return e}return d+"

    "+f+"

    "});a=a.replace(//g,"\n");return a},pre_wpautop:function(b){var a=this,c={o:a,data:b,unfiltered:b};jQuery("body").trigger("beforePreWpautop",[c]);c.data=a._wp_Nop(c.data);jQuery("body").trigger("afterPreWpautop",[c]);return c.data},wpautop:function(b){var a=this,c={o:a,data:b,unfiltered:b};jQuery("body").trigger("beforeWpautop",[c]);c.data=a._wp_Autop(c.data);jQuery("body").trigger("afterWpautop",[c]);return c.data}}; \ No newline at end of file diff --git a/src/wp-admin/js/farbtastic.js b/src/wp-admin/js/farbtastic.js new file mode 100644 index 0000000..5404fb6 --- /dev/null +++ b/src/wp-admin/js/farbtastic.js @@ -0,0 +1,276 @@ +/*! + * Farbtastic: jQuery color picker plug-in v1.3u + * + * Licensed under the GPL license: + * http://www.gnu.org/licenses/gpl.html + */ +(function($) { + +$.fn.farbtastic = function (options) { + $.farbtastic(this, options); + return this; +}; + +$.farbtastic = function (container, callback) { + var container = $(container).get(0); + return container.farbtastic || (container.farbtastic = new $._farbtastic(container, callback)); +}; + +$._farbtastic = function (container, callback) { + // Store farbtastic object + var fb = this; + + // Insert markup + $(container).html('
    '); + var e = $('.farbtastic', container); + fb.wheel = $('.wheel', container).get(0); + // Dimensions + fb.radius = 84; + fb.square = 100; + fb.width = 194; + + // Fix background PNGs in IE6 + if (navigator.appVersion.match(/MSIE [0-6]\./)) { + $('*', e).each(function () { + if (this.currentStyle.backgroundImage != 'none') { + var image = this.currentStyle.backgroundImage; + image = this.currentStyle.backgroundImage.substring(5, image.length - 2); + $(this).css({ + 'backgroundImage': 'none', + 'filter': "progid:DXImageTransform.Microsoft.AlphaImageLoader(enabled=true, sizingMethod=crop, src='" + image + "')" + }); + } + }); + } + + /** + * Link to the given element(s) or callback. + */ + fb.linkTo = function (callback) { + // Unbind previous nodes + if (typeof fb.callback == 'object') { + $(fb.callback).unbind('keyup', fb.updateValue); + } + + // Reset color + fb.color = null; + + // Bind callback or elements + if (typeof callback == 'function') { + fb.callback = callback; + } + else if (typeof callback == 'object' || typeof callback == 'string') { + fb.callback = $(callback); + fb.callback.bind('keyup', fb.updateValue); + if (fb.callback.get(0).value) { + fb.setColor(fb.callback.get(0).value); + } + } + return this; + }; + fb.updateValue = function (event) { + if (this.value && this.value != fb.color) { + fb.setColor(this.value); + } + }; + + /** + * Change color with HTML syntax #123456 + */ + fb.setColor = function (color) { + var unpack = fb.unpack(color); + if (fb.color != color && unpack) { + fb.color = color; + fb.rgb = unpack; + fb.hsl = fb.RGBToHSL(fb.rgb); + fb.updateDisplay(); + } + return this; + }; + + /** + * Change color with HSL triplet [0..1, 0..1, 0..1] + */ + fb.setHSL = function (hsl) { + fb.hsl = hsl; + fb.rgb = fb.HSLToRGB(hsl); + fb.color = fb.pack(fb.rgb); + fb.updateDisplay(); + return this; + }; + + ///////////////////////////////////////////////////// + + /** + * Retrieve the coordinates of the given event relative to the center + * of the widget. + */ + fb.widgetCoords = function (event) { + var offset = $(fb.wheel).offset(); + return { x: (event.pageX - offset.left) - fb.width / 2, y: (event.pageY - offset.top) - fb.width / 2 }; + }; + + /** + * Mousedown handler + */ + fb.mousedown = function (event) { + // Capture mouse + if (!document.dragging) { + $(document).bind('mousemove', fb.mousemove).bind('mouseup', fb.mouseup); + document.dragging = true; + } + + // Check which area is being dragged + var pos = fb.widgetCoords(event); + fb.circleDrag = Math.max(Math.abs(pos.x), Math.abs(pos.y)) * 2 > fb.square; + + // Process + fb.mousemove(event); + return false; + }; + + /** + * Mousemove handler + */ + fb.mousemove = function (event) { + // Get coordinates relative to color picker center + var pos = fb.widgetCoords(event); + + // Set new HSL parameters + if (fb.circleDrag) { + var hue = Math.atan2(pos.x, -pos.y) / 6.28; + if (hue < 0) hue += 1; + fb.setHSL([hue, fb.hsl[1], fb.hsl[2]]); + } + else { + var sat = Math.max(0, Math.min(1, -(pos.x / fb.square) + .5)); + var lum = Math.max(0, Math.min(1, -(pos.y / fb.square) + .5)); + fb.setHSL([fb.hsl[0], sat, lum]); + } + return false; + }; + + /** + * Mouseup handler + */ + fb.mouseup = function () { + // Uncapture mouse + $(document).unbind('mousemove', fb.mousemove); + $(document).unbind('mouseup', fb.mouseup); + document.dragging = false; + }; + + /** + * Update the markers and styles + */ + fb.updateDisplay = function () { + // Markers + var angle = fb.hsl[0] * 6.28; + $('.h-marker', e).css({ + left: Math.round(Math.sin(angle) * fb.radius + fb.width / 2) + 'px', + top: Math.round(-Math.cos(angle) * fb.radius + fb.width / 2) + 'px' + }); + + $('.sl-marker', e).css({ + left: Math.round(fb.square * (.5 - fb.hsl[1]) + fb.width / 2) + 'px', + top: Math.round(fb.square * (.5 - fb.hsl[2]) + fb.width / 2) + 'px' + }); + + // Saturation/Luminance gradient + $('.color', e).css('backgroundColor', fb.pack(fb.HSLToRGB([fb.hsl[0], 1, 0.5]))); + + // Linked elements or callback + if (typeof fb.callback == 'object') { + // Set background/foreground color + $(fb.callback).css({ + backgroundColor: fb.color, + color: fb.hsl[2] > 0.5 ? '#000' : '#fff' + }); + + // Change linked value + $(fb.callback).each(function() { + if (this.value && this.value != fb.color) { + this.value = fb.color; + } + }); + } + else if (typeof fb.callback == 'function') { + fb.callback.call(fb, fb.color); + } + }; + + /* Various color utility functions */ + fb.pack = function (rgb) { + var r = Math.round(rgb[0] * 255); + var g = Math.round(rgb[1] * 255); + var b = Math.round(rgb[2] * 255); + return '#' + (r < 16 ? '0' : '') + r.toString(16) + + (g < 16 ? '0' : '') + g.toString(16) + + (b < 16 ? '0' : '') + b.toString(16); + }; + + fb.unpack = function (color) { + if (color.length == 7) { + return [parseInt('0x' + color.substring(1, 3)) / 255, + parseInt('0x' + color.substring(3, 5)) / 255, + parseInt('0x' + color.substring(5, 7)) / 255]; + } + else if (color.length == 4) { + return [parseInt('0x' + color.substring(1, 2)) / 15, + parseInt('0x' + color.substring(2, 3)) / 15, + parseInt('0x' + color.substring(3, 4)) / 15]; + } + }; + + fb.HSLToRGB = function (hsl) { + var m1, m2, r, g, b; + var h = hsl[0], s = hsl[1], l = hsl[2]; + m2 = (l <= 0.5) ? l * (s + 1) : l + s - l*s; + m1 = l * 2 - m2; + return [this.hueToRGB(m1, m2, h+0.33333), + this.hueToRGB(m1, m2, h), + this.hueToRGB(m1, m2, h-0.33333)]; + }; + + fb.hueToRGB = function (m1, m2, h) { + h = (h < 0) ? h + 1 : ((h > 1) ? h - 1 : h); + if (h * 6 < 1) return m1 + (m2 - m1) * h * 6; + if (h * 2 < 1) return m2; + if (h * 3 < 2) return m1 + (m2 - m1) * (0.66666 - h) * 6; + return m1; + }; + + fb.RGBToHSL = function (rgb) { + var min, max, delta, h, s, l; + var r = rgb[0], g = rgb[1], b = rgb[2]; + min = Math.min(r, Math.min(g, b)); + max = Math.max(r, Math.max(g, b)); + delta = max - min; + l = (min + max) / 2; + s = 0; + if (l > 0 && l < 1) { + s = delta / (l < 0.5 ? (2 * l) : (2 - 2 * l)); + } + h = 0; + if (delta > 0) { + if (max == r && max != g) h += (g - b) / delta; + if (max == g && max != b) h += (2 + (b - r) / delta); + if (max == b && max != r) h += (4 + (r - g) / delta); + h /= 6; + } + return [h, s, l]; + }; + + // Install mousedown handler (the others are set on the document on-demand) + $('*', e).mousedown(fb.mousedown); + + // Init color + fb.setColor('#000000'); + + // Set linked elements/callback + if (callback) { + fb.linkTo(callback); + } +}; + +})(jQuery); \ No newline at end of file diff --git a/src/wp-admin/js/gallery.dev.js b/src/wp-admin/js/gallery.dev.js new file mode 100644 index 0000000..1e80fd9 --- /dev/null +++ b/src/wp-admin/js/gallery.dev.js @@ -0,0 +1,197 @@ +jQuery(document).ready(function($) { + var gallerySortable, gallerySortableInit, w, desc = false; + + gallerySortableInit = function() { + gallerySortable = $('#media-items').sortable( { + items: 'div.media-item', + placeholder: 'sorthelper', + axis: 'y', + distance: 2, + handle: 'div.filename', + stop: function(e, ui) { + // When an update has occurred, adjust the order for each item + var all = $('#media-items').sortable('toArray'), len = all.length; + $.each(all, function(i, id) { + var order = desc ? (len - i) : (1 + i); + $('#' + id + ' .menu_order input').val(order); + }); + } + } ); + } + + sortIt = function() { + var all = $('.menu_order_input'), len = all.length; + all.each(function(i){ + var order = desc ? (len - i) : (1 + i); + $(this).val(order); + }); + } + + clearAll = function(c) { + c = c || 0; + $('.menu_order_input').each(function(){ + if ( this.value == '0' || c ) this.value = ''; + }); + } + + $('#asc').click(function(){desc = false; sortIt(); return false;}); + $('#desc').click(function(){desc = true; sortIt(); return false;}); + $('#clear').click(function(){clearAll(1); return false;}); + $('#showall').click(function(){ + $('#sort-buttons span a').toggle(); + $('a.describe-toggle-on').hide(); + $('a.describe-toggle-off, table.slidetoggle').show(); + return false; + }); + $('#hideall').click(function(){ + $('#sort-buttons span a').toggle(); + $('a.describe-toggle-on').show(); + $('a.describe-toggle-off, table.slidetoggle').hide(); + return false; + }); + + // initialize sortable + gallerySortableInit(); + clearAll(); + + if ( $('#media-items>*').length > 1 ) { + w = wpgallery.getWin(); + + $('#save-all, #gallery-settings').show(); + if ( typeof w.tinyMCE != 'undefined' && w.tinyMCE.activeEditor && ! w.tinyMCE.activeEditor.isHidden() ) { + wpgallery.mcemode = true; + wpgallery.init(); + } else { + $('#insert-gallery').show(); + } + } +}); + +jQuery(window).unload( function () { tinymce = tinyMCE = wpgallery = null; } ); // Cleanup + +/* gallery settings */ +var tinymce = null, tinyMCE, wpgallery; + +wpgallery = { + mcemode : false, + editor : {}, + dom : {}, + is_update : false, + el : {}, + + I : function(e) { + return document.getElementById(e); + }, + + init: function() { + var t = this, li, q, i, it, w = t.getWin(); + + if ( ! t.mcemode ) return; + + li = ('' + document.location.search).replace(/^\?/, '').split('&'); + q = {}; + for (i=0; i*").length>1){a=wpgallery.getWin();c("#save-all, #gallery-settings").show();if(typeof a.tinyMCE!="undefined"&&a.tinyMCE.activeEditor&&!a.tinyMCE.activeEditor.isHidden()){wpgallery.mcemode=true;wpgallery.init()}else{c("#insert-gallery").show()}}});jQuery(window).unload(function(){tinymce=tinyMCE=wpgallery=null});var tinymce=null,tinyMCE,wpgallery;wpgallery={mcemode:false,editor:{},dom:{},is_update:false,el:{},I:function(a){return document.getElementById(a)},init:function(){var d=this,a,f,c,e,b=d.getWin();if(!d.mcemode){return}a=(""+document.location.search).replace(/^\?/,"").split("&");f={};for(c=0;c this.hold['oh'] ) || ( w1 && w1 > this.hold['ow'] ) ) + warn.css('visibility', 'visible'); + else + warn.css('visibility', 'hidden'); + }, + + getSelRatio : function(postid) { + var x = this.hold['w'], y = this.hold['h'], + X = this.intval( $('#imgedit-crop-width-' + postid).val() ), + Y = this.intval( $('#imgedit-crop-height-' + postid).val() ); + + if ( X && Y ) + return X + ':' + Y; + + if ( x && y ) + return x + ':' + y; + + return '1:1'; + }, + + filterHistory : function(postid, setSize) { + // apply undo state to history + var history = $('#imgedit-history-' + postid).val(), pop, n, o, i, op = []; + + if ( history != '' ) { + history = JSON.parse(history); + pop = this.intval( $('#imgedit-undone-' + postid).val() ); + if ( pop > 0 ) { + while ( pop > 0 ) { + history.pop(); + pop--; + } + } + + if ( setSize ) { + if ( !history.length ) { + this.hold['w'] = this.hold['ow']; + this.hold['h'] = this.hold['oh']; + return ''; + } + + // restore + o = history[history.length - 1]; + o = o.c || o.r || o.f || false; + + if ( o ) { + this.hold['w'] = o.fw; + this.hold['h'] = o.fh; + } + } + + // filter the values + for ( n in history ) { + i = history[n]; + if ( i.hasOwnProperty('c') ) { + op[n] = { 'c': { 'x': i.c.x, 'y': i.c.y, 'w': i.c.w, 'h': i.c.h } }; + } else if ( i.hasOwnProperty('r') ) { + op[n] = { 'r': i.r.r }; + } else if ( i.hasOwnProperty('f') ) { + op[n] = { 'f': i.f.f }; + } + } + return JSON.stringify(op); + } + return ''; + }, + + refreshEditor : function(postid, nonce, callback) { + var t = this, data, img; + + t.toggleEditor(postid, 1); + data = { + 'action': 'imgedit-preview', + '_ajax_nonce': nonce, + 'postid': postid, + 'history': t.filterHistory(postid, 1), + 'rand': t.intval(Math.random() * 1000000) + }; + + img = $(''); + img.load( function() { + var max1, max2, parent = $('#imgedit-crop-' + postid), t = imageEdit; + + parent.empty().append(img); + + // w, h are the new full size dims + max1 = Math.max( t.hold.w, t.hold.h ); + max2 = Math.max( $(img).width(), $(img).height() ); + t.hold['sizer'] = max1 > max2 ? max2 / max1 : 1; + + t.initCrop(postid, img, parent); + t.setCropSelection(postid, 0); + + if ( (typeof callback != "unknown") && callback != null ) + callback(); + + if ( $('#imgedit-history-' + postid).val() && $('#imgedit-undone-' + postid).val() == 0 ) + $('input.imgedit-submit-btn', '#imgedit-panel-' + postid).removeAttr('disabled'); + else + $('input.imgedit-submit-btn', '#imgedit-panel-' + postid).prop('disabled', true); + + t.toggleEditor(postid, 0); + }).attr('src', ajaxurl + '?' + $.param(data)); + }, + + action : function(postid, nonce, action) { + var t = this, data, w, h, fw, fh; + + if ( t.notsaved(postid) ) + return false; + + data = { + 'action': 'image-editor', + '_ajax_nonce': nonce, + 'postid': postid + }; + + if ( 'scale' == action ) { + w = $('#imgedit-scale-width-' + postid), + h = $('#imgedit-scale-height-' + postid), + fw = t.intval(w.val()), + fh = t.intval(h.val()); + + if ( fw < 1 ) { + w.focus(); + return false; + } else if ( fh < 1 ) { + h.focus(); + return false; + } + + if ( fw == t.hold.ow || fh == t.hold.oh ) + return false; + + data['do'] = 'scale'; + data['fwidth'] = fw; + data['fheight'] = fh; + } else if ( 'restore' == action ) { + data['do'] = 'restore'; + } else { + return false; + } + + t.toggleEditor(postid, 1); + $.post(ajaxurl, data, function(r) { + $('#image-editor-' + postid).empty().append(r); + t.toggleEditor(postid, 0); + }); + }, + + save : function(postid, nonce) { + var data, target = this.getTarget(postid), history = this.filterHistory(postid, 0); + + if ( '' == history ) + return false; + + this.toggleEditor(postid, 1); + data = { + 'action': 'image-editor', + '_ajax_nonce': nonce, + 'postid': postid, + 'history': history, + 'target': target, + 'do': 'save' + }; + + $.post(ajaxurl, data, function(r) { + var ret = JSON.parse(r); + + if ( ret.error ) { + $('#imgedit-response-' + postid).html('

    ' + ret.error + '

    '); + imageEdit.close(postid); + return; + } + + if ( ret.fw && ret.fh ) + $('#media-dims-' + postid).html( ret.fw + ' × ' + ret.fh ); + + if ( ret.thumbnail ) + $('.thumbnail', '#thumbnail-head-' + postid).attr('src', ''+ret.thumbnail); + + if ( ret.msg ) + $('#imgedit-response-' + postid).html('

    ' + ret.msg + '

    '); + + imageEdit.close(postid); + }); + }, + + open : function(postid, nonce) { + var data, elem = $('#image-editor-' + postid), head = $('#media-head-' + postid), + btn = $('#imgedit-open-btn-' + postid), spin = btn.siblings('img'); + + btn.prop('disabled', true); + spin.css('visibility', 'visible'); + + data = { + 'action': 'image-editor', + '_ajax_nonce': nonce, + 'postid': postid, + 'do': 'open' + }; + + elem.load(ajaxurl, data, function() { + elem.fadeIn('fast'); + head.fadeOut('fast', function(){ + btn.removeAttr('disabled'); + spin.css('visibility', 'hidden'); + }); + }); + }, + + imgLoaded : function(postid) { + var img = $('#image-preview-' + postid), parent = $('#imgedit-crop-' + postid); + + this.initCrop(postid, img, parent); + this.setCropSelection(postid, 0); + this.toggleEditor(postid, 0); + }, + + initCrop : function(postid, image, parent) { + var t = this, selW = $('#imgedit-sel-width-' + postid), + selH = $('#imgedit-sel-height-' + postid); + + t.iasapi = $(image).imgAreaSelect({ + parent: parent, + instance: true, + handles: true, + keys: true, + minWidth: 3, + minHeight: 3, + + onInit: function(img, c) { + parent.children().mousedown(function(e){ + var ratio = false, sel, defRatio; + + if ( e.shiftKey ) { + sel = t.iasapi.getSelection(); + defRatio = t.getSelRatio(postid); + ratio = ( sel && sel.width && sel.height ) ? sel.width + ':' + sel.height : defRatio; + } + + t.iasapi.setOptions({ + aspectRatio: ratio + }); + }); + }, + + onSelectStart: function(img, c) { + imageEdit.setDisabled($('#imgedit-crop-sel-' + postid), 1); + }, + + onSelectEnd: function(img, c) { + imageEdit.setCropSelection(postid, c); + }, + + onSelectChange: function(img, c) { + var sizer = imageEdit.hold.sizer; + selW.val( imageEdit.round(c.width / sizer) ); + selH.val( imageEdit.round(c.height / sizer) ); + } + }); + }, + + setCropSelection : function(postid, c) { + var sel, min = $('#imgedit-minthumb-' + postid).val() || '128:128', + sizer = this.hold['sizer']; + min = min.split(':'); + c = c || 0; + + if ( !c || ( c.width < 3 && c.height < 3 ) ) { + this.setDisabled($('.imgedit-crop', '#imgedit-panel-' + postid), 0); + this.setDisabled($('#imgedit-crop-sel-' + postid), 0); + $('#imgedit-sel-width-' + postid).val(''); + $('#imgedit-sel-height-' + postid).val(''); + $('#imgedit-selection-' + postid).val(''); + return false; + } + + if ( c.width < (min[0] * sizer) && c.height < (min[1] * sizer) ) { + this.setDisabled($('.imgedit-crop', '#imgedit-panel-' + postid), 0); + $('#imgedit-selection-' + postid).val(''); + return false; + } + + sel = { 'x': c.x1, 'y': c.y1, 'w': c.width, 'h': c.height }; + this.setDisabled($('.imgedit-crop', '#imgedit-panel-' + postid), 1); + $('#imgedit-selection-' + postid).val( JSON.stringify(sel) ); + }, + + close : function(postid, warn) { + warn = warn || false; + + if ( warn && this.notsaved(postid) ) + return false; + + this.iasapi = {}; + this.hold = {}; + $('#image-editor-' + postid).fadeOut('fast', function() { + $('#media-head-' + postid).fadeIn('fast'); + $(this).empty(); + }); + }, + + notsaved : function(postid) { + var h = $('#imgedit-history-' + postid).val(), + history = (h != '') ? JSON.parse(h) : new Array(), + pop = this.intval( $('#imgedit-undone-' + postid).val() ); + + if ( pop < history.length ) { + if ( confirm( $('#imgedit-leaving-' + postid).html() ) ) + return false; + return true; + } + return false; + }, + + addStep : function(op, postid, nonce) { + var t = this, elem = $('#imgedit-history-' + postid), + history = (elem.val() != '') ? JSON.parse(elem.val()) : new Array(), + undone = $('#imgedit-undone-' + postid), + pop = t.intval(undone.val()); + + while ( pop > 0 ) { + history.pop(); + pop--; + } + undone.val(0); // reset + + history.push(op); + elem.val( JSON.stringify(history) ); + + t.refreshEditor(postid, nonce, function() { + t.setDisabled($('#image-undo-' + postid), true); + t.setDisabled($('#image-redo-' + postid), false); + }); + }, + + rotate : function(angle, postid, nonce, t) { + if ( $(t).hasClass('disabled') ) + return false; + + this.addStep({ 'r': { 'r': angle, 'fw': this.hold['h'], 'fh': this.hold['w'] }}, postid, nonce); + }, + + flip : function (axis, postid, nonce, t) { + if ( $(t).hasClass('disabled') ) + return false; + + this.addStep({ 'f': { 'f': axis, 'fw': this.hold['w'], 'fh': this.hold['h'] }}, postid, nonce); + }, + + crop : function (postid, nonce, t) { + var sel = $('#imgedit-selection-' + postid).val(), + w = this.intval( $('#imgedit-sel-width-' + postid).val() ), + h = this.intval( $('#imgedit-sel-height-' + postid).val() ); + + if ( $(t).hasClass('disabled') || sel == '' ) + return false; + + sel = JSON.parse(sel); + if ( sel.w > 0 && sel.h > 0 && w > 0 && h > 0 ) { + sel['fw'] = w; + sel['fh'] = h; + this.addStep({ 'c': sel }, postid, nonce); + } + }, + + undo : function (postid, nonce) { + var t = this, button = $('#image-undo-' + postid), elem = $('#imgedit-undone-' + postid), + pop = t.intval( elem.val() ) + 1; + + if ( button.hasClass('disabled') ) + return; + + elem.val(pop); + t.refreshEditor(postid, nonce, function() { + var elem = $('#imgedit-history-' + postid), + history = (elem.val() != '') ? JSON.parse(elem.val()) : new Array(); + + t.setDisabled($('#image-redo-' + postid), true); + t.setDisabled(button, pop < history.length); + }); + }, + + redo : function(postid, nonce) { + var t = this, button = $('#image-redo-' + postid), elem = $('#imgedit-undone-' + postid), + pop = t.intval( elem.val() ) - 1; + + if ( button.hasClass('disabled') ) + return; + + elem.val(pop); + t.refreshEditor(postid, nonce, function() { + t.setDisabled($('#image-undo-' + postid), true); + t.setDisabled(button, pop > 0); + }); + }, + + setNumSelection : function(postid) { + var sel, elX = $('#imgedit-sel-width-' + postid), elY = $('#imgedit-sel-height-' + postid), + x = this.intval( elX.val() ), y = this.intval( elY.val() ), + img = $('#image-preview-' + postid), imgh = img.height(), imgw = img.width(), + sizer = this.hold['sizer'], x1, y1, x2, y2, ias = this.iasapi; + + if ( x < 1 ) { + elX.val(''); + return false; + } + + if ( y < 1 ) { + elY.val(''); + return false; + } + + if ( x && y && ( sel = ias.getSelection() ) ) { + x2 = sel.x1 + Math.round( x * sizer ); + y2 = sel.y1 + Math.round( y * sizer ); + x1 = sel.x1; + y1 = sel.y1; + + if ( x2 > imgw ) { + x1 = 0; + x2 = imgw; + elX.val( Math.round( x2 / sizer ) ); + } + + if ( y2 > imgh ) { + y1 = 0; + y2 = imgh; + elY.val( Math.round( y2 / sizer ) ); + } + + ias.setSelection( x1, y1, x2, y2 ); + ias.update(); + this.setCropSelection(postid, ias.getSelection()); + } + }, + + round : function(num) { + var s; + num = Math.round(num); + + if ( this.hold.sizer > 0.6 ) + return num; + + s = num.toString().slice(-1); + + if ( '1' == s ) + return num - 1; + else if ( '9' == s ) + return num + 1; + + return num; + }, + + setRatioSelection : function(postid, n, el) { + var sel, r, x = this.intval( $('#imgedit-crop-width-' + postid).val() ), + y = this.intval( $('#imgedit-crop-height-' + postid).val() ), + h = $('#image-preview-' + postid).height(); + + if ( !this.intval( $(el).val() ) ) { + $(el).val(''); + return; + } + + if ( x && y ) { + this.iasapi.setOptions({ + aspectRatio: x + ':' + y + }); + + if ( sel = this.iasapi.getSelection(true) ) { + r = Math.ceil( sel.y1 + ((sel.x2 - sel.x1) / (x / y)) ); + + if ( r > h ) { + r = h; + if ( n ) + $('#imgedit-crop-height-' + postid).val(''); + else + $('#imgedit-crop-width-' + postid).val(''); + } + + this.iasapi.setSelection( sel.x1, sel.y1, sel.x2, r ); + this.iasapi.update(); + } + } + } +} +})(jQuery); diff --git a/src/wp-admin/js/image-edit.js b/src/wp-admin/js/image-edit.js new file mode 100644 index 0000000..27a2d04 --- /dev/null +++ b/src/wp-admin/js/image-edit.js @@ -0,0 +1 @@ +var imageEdit;(function(a){imageEdit={iasapi:{},hold:{},postid:"",intval:function(b){return b|0},setDisabled:function(c,b){if(b){c.removeClass("disabled");a("input",c).removeAttr("disabled")}else{c.addClass("disabled");a("input",c).prop("disabled",true)}},init:function(g,e){var d=this,c=a("#image-editor-"+d.postid),b=d.intval(a("#imgedit-x-"+g).val()),f=d.intval(a("#imgedit-y-"+g).val());if(d.postid!=g&&c.length){d.close(d.postid)}d.hold.w=d.hold.ow=b;d.hold.h=d.hold.oh=f;d.hold.xy_ratio=b/f;d.hold.sizer=parseFloat(a("#imgedit-sizer-"+g).val());d.postid=g;a("#imgedit-response-"+g).empty();a('input[type="text"]',"#imgedit-panel-"+g).keypress(function(i){var h=i.keyCode;if(36this.hold.oh)||(c&&c>this.hold.ow)){g.css("visibility","visible")}else{g.css("visibility","hidden")}},getSelRatio:function(f){var b=this.hold.w,e=this.hold.h,d=this.intval(a("#imgedit-crop-width-"+f).val()),c=this.intval(a("#imgedit-crop-height-"+f).val());if(d&&c){return d+":"+c}if(b&&e){return b+":"+e}return"1:1"},filterHistory:function(j,f){var d=a("#imgedit-history-"+j).val(),b,h,e,c,g=[];if(d!=""){d=JSON.parse(d);b=this.intval(a("#imgedit-undone-"+j).val());if(b>0){while(b>0){d.pop();b--}}if(f){if(!d.length){this.hold.w=this.hold.ow;this.hold.h=this.hold.oh;return""}e=d[d.length-1];e=e.c||e.r||e.f||false;if(e){this.hold.w=e.fw;this.hold.h=e.fh}}for(h in d){c=d[h];if(c.hasOwnProperty("c")){g[h]={c:{x:c.c.x,y:c.c.y,w:c.c.w,h:c.c.h}}}else{if(c.hasOwnProperty("r")){g[h]={r:c.r.r}}else{if(c.hasOwnProperty("f")){g[h]={f:c.f.f}}}}}return JSON.stringify(g)}return""},refreshEditor:function(g,d,f){var c=this,e,b;c.toggleEditor(g,1);e={action:"imgedit-preview",_ajax_nonce:d,postid:g,history:c.filterHistory(g,1),rand:c.intval(Math.random()*1000000)};b=a('');b.load(function(){var i,h,k=a("#imgedit-crop-"+g),j=imageEdit;k.empty().append(b);i=Math.max(j.hold.w,j.hold.h);h=Math.max(a(b).width(),a(b).height());j.hold.sizer=i>h?h/i:1;j.initCrop(g,b,k);j.setCropSelection(g,0);if((typeof f!="unknown")&&f!=null){f()}if(a("#imgedit-history-"+g).val()&&a("#imgedit-undone-"+g).val()==0){a("input.imgedit-submit-btn","#imgedit-panel-"+g).removeAttr("disabled")}else{a("input.imgedit-submit-btn","#imgedit-panel-"+g).prop("disabled",true)}j.toggleEditor(g,0)}).attr("src",ajaxurl+"?"+a.param(e))},action:function(b,g,c){var j=this,e,i,f,d,k;if(j.notsaved(b)){return false}e={action:"image-editor",_ajax_nonce:g,postid:b};if("scale"==c){i=a("#imgedit-scale-width-"+b),f=a("#imgedit-scale-height-"+b),d=j.intval(i.val()),k=j.intval(f.val());if(d<1){i.focus();return false}else{if(k<1){f.focus();return false}}if(d==j.hold.ow||k==j.hold.oh){return false}e["do"]="scale";e.fwidth=d;e.fheight=k}else{if("restore"==c){e["do"]="restore"}else{return false}}j.toggleEditor(b,1);a.post(ajaxurl,e,function(h){a("#image-editor-"+b).empty().append(h);j.toggleEditor(b,0)})},save:function(f,b){var c,e=this.getTarget(f),d=this.filterHistory(f,0);if(""==d){return false}this.toggleEditor(f,1);c={action:"image-editor",_ajax_nonce:b,postid:f,history:d,target:e,"do":"save"};a.post(ajaxurl,c,function(h){var g=JSON.parse(h);if(g.error){a("#imgedit-response-"+f).html('

    '+g.error+"

    ");imageEdit.close(f);return}if(g.fw&&g.fh){a("#media-dims-"+f).html(g.fw+" × "+g.fh)}if(g.thumbnail){a(".thumbnail","#thumbnail-head-"+f).attr("src",""+g.thumbnail)}if(g.msg){a("#imgedit-response-"+f).html('

    '+g.msg+"

    ")}imageEdit.close(f)})},open:function(h,d){var f,e=a("#image-editor-"+h),c=a("#media-head-"+h),b=a("#imgedit-open-btn-"+h),g=b.siblings("img");b.prop("disabled",true);g.css("visibility","visible");f={action:"image-editor",_ajax_nonce:d,postid:h,"do":"open"};e.load(ajaxurl,f,function(){e.fadeIn("fast");c.fadeOut("fast",function(){b.removeAttr("disabled");g.css("visibility","hidden")})})},imgLoaded:function(d){var b=a("#image-preview-"+d),c=a("#imgedit-crop-"+d);this.initCrop(d,b,c);this.setCropSelection(d,0);this.toggleEditor(d,0)},initCrop:function(g,e,c){var b=this,d=a("#imgedit-sel-width-"+g),f=a("#imgedit-sel-height-"+g);b.iasapi=a(e).imgAreaSelect({parent:c,instance:true,handles:true,keys:true,minWidth:3,minHeight:3,onInit:function(h,i){c.children().mousedown(function(m){var k=false,l,j;if(m.shiftKey){l=b.iasapi.getSelection();j=b.getSelRatio(g);k=(l&&l.width&&l.height)?l.width+":"+l.height:j}b.iasapi.setOptions({aspectRatio:k})})},onSelectStart:function(h,i){imageEdit.setDisabled(a("#imgedit-crop-sel-"+g),1)},onSelectEnd:function(h,i){imageEdit.setCropSelection(g,i)},onSelectChange:function(h,j){var i=imageEdit.hold.sizer;d.val(imageEdit.round(j.width/i));f.val(imageEdit.round(j.height/i))}})},setCropSelection:function(g,f){var e,b=a("#imgedit-minthumb-"+g).val()||"128:128",d=this.hold.sizer;b=b.split(":");f=f||0;if(!f||(f.width<3&&f.height<3)){this.setDisabled(a(".imgedit-crop","#imgedit-panel-"+g),0);this.setDisabled(a("#imgedit-crop-sel-"+g),0);a("#imgedit-sel-width-"+g).val("");a("#imgedit-sel-height-"+g).val("");a("#imgedit-selection-"+g).val("");return false}if(f.width<(b[0]*d)&&f.height<(b[1]*d)){this.setDisabled(a(".imgedit-crop","#imgedit-panel-"+g),0);a("#imgedit-selection-"+g).val("");return false}e={x:f.x1,y:f.y1,w:f.width,h:f.height};this.setDisabled(a(".imgedit-crop","#imgedit-panel-"+g),1);a("#imgedit-selection-"+g).val(JSON.stringify(e))},close:function(c,b){b=b||false;if(b&&this.notsaved(c)){return false}this.iasapi={};this.hold={};a("#image-editor-"+c).fadeOut("fast",function(){a("#media-head-"+c).fadeIn("fast");a(this).empty()})},notsaved:function(e){var c=a("#imgedit-history-"+e).val(),d=(c!="")?JSON.parse(c):new Array(),b=this.intval(a("#imgedit-undone-"+e).val());if(b0){g.pop();b--}f.val(0);g.push(i);e.val(JSON.stringify(g));c.refreshEditor(h,d,function(){c.setDisabled(a("#image-undo-"+h),true);c.setDisabled(a("#image-redo-"+h),false)})},rotate:function(d,e,c,b){if(a(b).hasClass("disabled")){return false}this.addStep({r:{r:d,fw:this.hold.h,fh:this.hold.w}},e,c)},flip:function(d,e,c,b){if(a(b).hasClass("disabled")){return false}this.addStep({f:{f:d,fw:this.hold.w,fh:this.hold.h}},e,c)},crop:function(g,e,c){var f=a("#imgedit-selection-"+g).val(),b=this.intval(a("#imgedit-sel-width-"+g).val()),d=this.intval(a("#imgedit-sel-height-"+g).val());if(a(c).hasClass("disabled")||f==""){return false}f=JSON.parse(f);if(f.w>0&&f.h>0&&b>0&&d>0){f.fw=b;f.fh=d;this.addStep({c:f},g,e)}},undo:function(g,e){var d=this,c=a("#image-undo-"+g),f=a("#imgedit-undone-"+g),b=d.intval(f.val())+1;if(c.hasClass("disabled")){return}f.val(b);d.refreshEditor(g,e,function(){var h=a("#imgedit-history-"+g),i=(h.val()!="")?JSON.parse(h.val()):new Array();d.setDisabled(a("#image-redo-"+g),true);d.setDisabled(c,b0)})},setNumSelection:function(c){var g,k=a("#imgedit-sel-width-"+c),j=a("#imgedit-sel-height-"+c),o=this.intval(k.val()),m=this.intval(j.val()),i=a("#image-preview-"+c),p=i.height(),h=i.width(),b=this.hold.sizer,f,n,e,l,d=this.iasapi;if(o<1){k.val("");return false}if(m<1){j.val("");return false}if(o&&m&&(g=d.getSelection())){e=g.x1+Math.round(o*b);l=g.y1+Math.round(m*b);f=g.x1;n=g.y1;if(e>h){f=0;e=h;k.val(Math.round(e/b))}if(l>p){n=0;l=p;j.val(Math.round(l/b))}d.setSelection(f,n,e,l);d.update();this.setCropSelection(c,d.getSelection())}},round:function(b){var c;b=Math.round(b);if(this.hold.sizer>0.6){return b}c=b.toString().slice(-1);if("1"==c){return b-1}else{if("9"==c){return b+1}}return b},setRatioSelection:function(j,i,d){var f,e,b=this.intval(a("#imgedit-crop-width-"+j).val()),g=this.intval(a("#imgedit-crop-height-"+j).val()),c=a("#image-preview-"+j).height();if(!this.intval(a(d).val())){a(d).val("");return}if(b&&g){this.iasapi.setOptions({aspectRatio:b+":"+g});if(f=this.iasapi.getSelection(true)){e=Math.ceil(f.y1+((f.x2-f.x1)/(b/g)));if(e>c){e=c;if(i){a("#imgedit-crop-height-"+j).val("")}else{a("#imgedit-crop-width-"+j).val("")}}this.iasapi.setSelection(f.x1,f.y1,f.x2,e);this.iasapi.update()}}}}})(jQuery); \ No newline at end of file diff --git a/src/wp-admin/js/inline-edit-post.dev.js b/src/wp-admin/js/inline-edit-post.dev.js new file mode 100644 index 0000000..b470c33 --- /dev/null +++ b/src/wp-admin/js/inline-edit-post.dev.js @@ -0,0 +1,290 @@ +(function($) { +inlineEditPost = { + + init : function(){ + var t = this, qeRow = $('#inline-edit'), bulkRow = $('#bulk-edit'); + + t.type = $('table.widefat').hasClass('pages') ? 'page' : 'post'; + t.what = '#post-'; + + // prepare the edit rows + qeRow.keyup(function(e){ + if (e.which == 27) + return inlineEditPost.revert(); + }); + bulkRow.keyup(function(e){ + if (e.which == 27) + return inlineEditPost.revert(); + }); + + $('a.cancel', qeRow).click(function(){ + return inlineEditPost.revert(); + }); + $('a.save', qeRow).click(function(){ + return inlineEditPost.save(this); + }); + $('td', qeRow).keydown(function(e){ + if ( e.which == 13 ) + return inlineEditPost.save(this); + }); + + $('a.cancel', bulkRow).click(function(){ + return inlineEditPost.revert(); + }); + + $('#inline-edit .inline-edit-private input[value="private"]').click( function(){ + var pw = $('input.inline-edit-password-input'); + if ( $(this).prop('checked') ) { + pw.val('').prop('disabled', true); + } else { + pw.prop('disabled', false); + } + }); + + // add events + $('a.editinline').live('click', function(){ + inlineEditPost.edit(this); + return false; + }); + + $('#bulk-title-div').parents('fieldset').after( + $('#inline-edit fieldset.inline-edit-categories').clone() + ).siblings( 'fieldset:last' ).prepend( + $('#inline-edit label.inline-edit-tags').clone() + ); + + // hiearchical taxonomies expandable? + $('span.catshow').click(function(){ + $(this).hide().next().show().parent().next().addClass("cat-hover"); + }); + + $('span.cathide').click(function(){ + $(this).hide().prev().show().parent().next().removeClass("cat-hover"); + }); + + $('select[name="_status"] option[value="future"]', bulkRow).remove(); + + $('#doaction, #doaction2').click(function(e){ + var n = $(this).attr('id').substr(2); + if ( $('select[name="'+n+'"]').val() == 'edit' ) { + e.preventDefault(); + t.setBulk(); + } else if ( $('form#posts-filter tr.inline-editor').length > 0 ) { + t.revert(); + } + }); + + $('#post-query-submit').mousedown(function(e){ + t.revert(); + $('select[name^="action"]').val('-1'); + }); + }, + + toggle : function(el){ + var t = this; + $(t.what+t.getId(el)).css('display') == 'none' ? t.revert() : t.edit(el); + }, + + setBulk : function(){ + var te = '', type = this.type, tax, c = true; + this.revert(); + + $('#bulk-edit td').attr('colspan', $('.widefat:first thead th:visible').length); + $('table.widefat tbody').prepend( $('#bulk-edit') ); + $('#bulk-edit').addClass('inline-editor').show(); + + $('tbody th.check-column input[type="checkbox"]').each(function(i){ + if ( $(this).prop('checked') ) { + c = false; + var id = $(this).val(), theTitle; + theTitle = $('#inline_'+id+' .post_title').text() || inlineEditL10n.notitle; + te += '
    X'+theTitle+'
    '; + } + }); + + if ( c ) + return this.revert(); + + $('#bulk-titles').html(te); + $('#bulk-titles a').click(function(){ + var id = $(this).attr('id').substr(1); + + $('table.widefat input[value="' + id + '"]').prop('checked', false); + $('#ttle'+id).remove(); + }); + + // enable autocomplete for tags + if ( 'post' == type ) { + // support multi taxonomies? + tax = 'post_tag'; + $('tr.inline-editor textarea[name="tags_input"]').suggest( 'admin-ajax.php?action=ajax-tag-search&tax='+tax, { delay: 500, minchars: 2, multiple: true, multipleSep: ", " } ); + } + $('html, body').animate( { scrollTop: 0 }, 'fast' ); + }, + + edit : function(id) { + var t = this, fields, editRow, rowData, cats, status, pageOpt, pageLevel, nextPage, pageLoop = true, nextLevel, tax; + t.revert(); + + if ( typeof(id) == 'object' ) + id = t.getId(id); + + fields = ['post_title', 'post_name', 'post_author', '_status', 'jj', 'mm', 'aa', 'hh', 'mn', 'ss', 'post_password']; + if ( t.type == 'page' ) + fields.push('post_parent', 'menu_order', 'page_template'); + + // add the new blank row + editRow = $('#inline-edit').clone(true); + $('td', editRow).attr('colspan', $('.widefat:first thead th:visible').length); + + if ( $(t.what+id).hasClass('alternate') ) + $(editRow).addClass('alternate'); + $(t.what+id).hide().after(editRow); + + // populate the data + rowData = $('#inline_'+id); + if ( !$(':input[name="post_author"] option[value="' + $('.post_author', rowData).text() + '"]', editRow).val() ) { + // author no longer has edit caps, so we need to add them to the list of authors + $(':input[name="post_author"]', editRow).prepend(''); + } + if ( $(':input[name="post_author"] option', editRow).length == 1 ) { + $('label.inline-edit-author', editRow).hide(); + } + + for ( var f = 0; f < fields.length; f++ ) { + $(':input[name="' + fields[f] + '"]', editRow).val( $('.'+fields[f], rowData).text() ); + } + + if ( $('.comment_status', rowData).text() == 'open' ) + $('input[name="comment_status"]', editRow).prop("checked", true); + if ( $('.ping_status', rowData).text() == 'open' ) + $('input[name="ping_status"]', editRow).prop("checked", true); + if ( $('.sticky', rowData).text() == 'sticky' ) + $('input[name="sticky"]', editRow).prop("checked", true); + + // hierarchical taxonomies + $('.post_category', rowData).each(function(){ + var term_ids = $(this).text(); + + if ( term_ids ) { + taxname = $(this).attr('id').replace('_'+id, ''); + $('ul.'+taxname+'-checklist :checkbox', editRow).val(term_ids.split(',')); + } + }); + //flat taxonomies + $('.tags_input', rowData).each(function(){ + var terms = $(this).text(); + + if ( terms ) { + taxname = $(this).attr('id').replace('_'+id, ''); + $('textarea.tax_input_'+taxname, editRow).val(terms); + $('textarea.tax_input_'+taxname, editRow).suggest( 'admin-ajax.php?action=ajax-tag-search&tax='+taxname, { delay: 500, minchars: 2, multiple: true, multipleSep: ", " } ); + } + }); + + + // handle the post status + status = $('._status', rowData).text(); + if ( 'future' != status ) + $('select[name="_status"] option[value="future"]', editRow).remove(); + + if ( 'private' == status ) { + $('input[name="keep_private"]', editRow).prop("checked", true); + $('input.inline-edit-password-input').val('').prop('disabled', true); + } + + // remove the current page and children from the parent dropdown + pageOpt = $('select[name="post_parent"] option[value="' + id + '"]', editRow); + if ( pageOpt.length > 0 ) { + pageLevel = pageOpt[0].className.split('-')[1]; + nextPage = pageOpt; + while ( pageLoop ) { + nextPage = nextPage.next('option'); + if (nextPage.length == 0) break; + nextLevel = nextPage[0].className.split('-')[1]; + if ( nextLevel <= pageLevel ) { + pageLoop = false; + } else { + nextPage.remove(); + nextPage = pageOpt; + } + } + pageOpt.remove(); + } + + $(editRow).attr('id', 'edit-'+id).addClass('inline-editor').show(); + $('.ptitle', editRow).focus(); + + return false; + }, + + save : function(id) { + var params, fields, page = $('.post_status_page').val() || ''; + + if ( typeof(id) == 'object' ) + id = this.getId(id); + + $('table.widefat .inline-edit-save .waiting').show(); + + params = { + action: 'inline-save', + post_type: typenow, + post_ID: id, + edit_date: 'true', + post_status: page + }; + + fields = $('#edit-'+id+' :input').serialize(); + params = fields + '&' + $.param(params); + + // make ajax request + $.post('admin-ajax.php', params, + function(r) { + $('table.widefat .inline-edit-save .waiting').hide(); + + if (r) { + if ( -1 != r.indexOf(']*?>/g, '' ); + $('#edit-'+id+' .inline-edit-save .error').html(r).show(); + } + } else { + $('#edit-'+id+' .inline-edit-save .error').html(inlineEditL10n.error).show(); + } + } + , 'html'); + return false; + }, + + revert : function(){ + var id = $('table.widefat tr.inline-editor').attr('id'); + + if ( id ) { + $('table.widefat .inline-edit-save .waiting').hide(); + + if ( 'bulk-edit' == id ) { + $('table.widefat #bulk-edit').removeClass('inline-editor').hide(); + $('#bulk-titles').html(''); + $('#inlineedit').append( $('#bulk-edit') ); + } else { + $('#'+id).remove(); + id = id.substr( id.lastIndexOf('-') + 1 ); + $(this.what+id).show(); + } + } + + return false; + }, + + getId : function(o) { + var id = $(o).closest('tr').attr('id'), + parts = id.split('-'); + return parts[parts.length - 1]; + } +}; + +$(document).ready(function(){inlineEditPost.init();}); +})(jQuery); diff --git a/src/wp-admin/js/inline-edit-post.js b/src/wp-admin/js/inline-edit-post.js new file mode 100644 index 0000000..b72bd87 --- /dev/null +++ b/src/wp-admin/js/inline-edit-post.js @@ -0,0 +1 @@ +(function(a){inlineEditPost={init:function(){var c=this,d=a("#inline-edit"),b=a("#bulk-edit");c.type=a("table.widefat").hasClass("pages")?"page":"post";c.what="#post-";d.keyup(function(f){if(f.which==27){return inlineEditPost.revert()}});b.keyup(function(f){if(f.which==27){return inlineEditPost.revert()}});a("a.cancel",d).click(function(){return inlineEditPost.revert()});a("a.save",d).click(function(){return inlineEditPost.save(this)});a("td",d).keydown(function(f){if(f.which==13){return inlineEditPost.save(this)}});a("a.cancel",b).click(function(){return inlineEditPost.revert()});a('#inline-edit .inline-edit-private input[value="private"]').click(function(){var e=a("input.inline-edit-password-input");if(a(this).prop("checked")){e.val("").prop("disabled",true)}else{e.prop("disabled",false)}});a("a.editinline").live("click",function(){inlineEditPost.edit(this);return false});a("#bulk-title-div").parents("fieldset").after(a("#inline-edit fieldset.inline-edit-categories").clone()).siblings("fieldset:last").prepend(a("#inline-edit label.inline-edit-tags").clone());a("span.catshow").click(function(){a(this).hide().next().show().parent().next().addClass("cat-hover")});a("span.cathide").click(function(){a(this).hide().prev().show().parent().next().removeClass("cat-hover")});a('select[name="_status"] option[value="future"]',b).remove();a("#doaction, #doaction2").click(function(f){var g=a(this).attr("id").substr(2);if(a('select[name="'+g+'"]').val()=="edit"){f.preventDefault();c.setBulk()}else{if(a("form#posts-filter tr.inline-editor").length>0){c.revert()}}});a("#post-query-submit").mousedown(function(f){c.revert();a('select[name^="action"]').val("-1")})},toggle:function(c){var b=this;a(b.what+b.getId(c)).css("display")=="none"?b.revert():b.edit(c)},setBulk:function(){var e="",d=this.type,b,f=true;this.revert();a("#bulk-edit td").attr("colspan",a(".widefat:first thead th:visible").length);a("table.widefat tbody").prepend(a("#bulk-edit"));a("#bulk-edit").addClass("inline-editor").show();a('tbody th.check-column input[type="checkbox"]').each(function(g){if(a(this).prop("checked")){f=false;var h=a(this).val(),c;c=a("#inline_"+h+" .post_title").text()||inlineEditL10n.notitle;e+='
    X'+c+"
    "}});if(f){return this.revert()}a("#bulk-titles").html(e);a("#bulk-titles a").click(function(){var c=a(this).attr("id").substr(1);a('table.widefat input[value="'+c+'"]').prop("checked",false);a("#ttle"+c).remove()});if("post"==d){b="post_tag";a('tr.inline-editor textarea[name="tags_input"]').suggest("admin-ajax.php?action=ajax-tag-search&tax="+b,{delay:500,minchars:2,multiple:true,multipleSep:", "})}a("html, body").animate({scrollTop:0},"fast")},edit:function(b){var o=this,j,d,g,n,i,h,m,l,c=true,p,e;o.revert();if(typeof(b)=="object"){b=o.getId(b)}j=["post_title","post_name","post_author","_status","jj","mm","aa","hh","mn","ss","post_password"];if(o.type=="page"){j.push("post_parent","menu_order","page_template")}d=a("#inline-edit").clone(true);a("td",d).attr("colspan",a(".widefat:first thead th:visible").length);if(a(o.what+b).hasClass("alternate")){a(d).addClass("alternate")}a(o.what+b).hide().after(d);g=a("#inline_"+b);if(!a(':input[name="post_author"] option[value="'+a(".post_author",g).text()+'"]',d).val()){a(':input[name="post_author"]',d).prepend('")}if(a(':input[name="post_author"] option',d).length==1){a("label.inline-edit-author",d).hide()}for(var k=0;k0){m=h[0].className.split("-")[1];l=h;while(c){l=l.next("option");if(l.length==0){break}p=l[0].className.split("-")[1];if(p<=m){c=false}else{l.remove();l=h}}h.remove()}a(d).attr("id","edit-"+b).addClass("inline-editor").show();a(".ptitle",d).focus();return false},save:function(e){var d,b,c=a(".post_status_page").val()||"";if(typeof(e)=="object"){e=this.getId(e)}a("table.widefat .inline-edit-save .waiting").show();d={action:"inline-save",post_type:typenow,post_ID:e,edit_date:"true",post_status:c};b=a("#edit-"+e+" :input").serialize();d=b+"&"+a.param(d);a.post("admin-ajax.php",d,function(f){a("table.widefat .inline-edit-save .waiting").hide();if(f){if(-1!=f.indexOf("]*?>/g,"");a("#edit-"+e+" .inline-edit-save .error").html(f).show()}}else{a("#edit-"+e+" .inline-edit-save .error").html(inlineEditL10n.error).show()}},"html");return false},revert:function(){var b=a("table.widefat tr.inline-editor").attr("id");if(b){a("table.widefat .inline-edit-save .waiting").hide();if("bulk-edit"==b){a("table.widefat #bulk-edit").removeClass("inline-editor").hide();a("#bulk-titles").html("");a("#inlineedit").append(a("#bulk-edit"))}else{a("#"+b).remove();b=b.substr(b.lastIndexOf("-")+1);a(this.what+b).show()}}return false},getId:function(c){var d=a(c).closest("tr").attr("id"),b=d.split("-");return b[b.length-1]}};a(document).ready(function(){inlineEditPost.init()})})(jQuery); \ No newline at end of file diff --git a/src/wp-admin/js/inline-edit-tax.dev.js b/src/wp-admin/js/inline-edit-tax.dev.js new file mode 100644 index 0000000..333bf6b --- /dev/null +++ b/src/wp-admin/js/inline-edit-tax.dev.js @@ -0,0 +1,118 @@ + +(function($) { +inlineEditTax = { + + init : function() { + var t = this, row = $('#inline-edit'); + + t.type = $('#the-list').attr('class').substr(5); + t.what = '#'+t.type+'-'; + + $('.editinline').live('click', function(){ + inlineEditTax.edit(this); + return false; + }); + + // prepare the edit row + row.keyup(function(e) { if(e.which == 27) return inlineEditTax.revert(); }); + + $('a.cancel', row).click(function() { return inlineEditTax.revert(); }); + $('a.save', row).click(function() { return inlineEditTax.save(this); }); + $('input, select', row).keydown(function(e) { if(e.which == 13) return inlineEditTax.save(this); }); + + $('#posts-filter input[type="submit"]').mousedown(function(e){ + t.revert(); + }); + }, + + toggle : function(el) { + var t = this; + $(t.what+t.getId(el)).css('display') == 'none' ? t.revert() : t.edit(el); + }, + + edit : function(id) { + var t = this, editRow; + t.revert(); + + if ( typeof(id) == 'object' ) + id = t.getId(id); + + editRow = $('#inline-edit').clone(true), rowData = $('#inline_'+id); + $('td', editRow).attr('colspan', $('.widefat:first thead th:visible').length); + + if ( $(t.what+id).hasClass('alternate') ) + $(editRow).addClass('alternate'); + + $(t.what+id).hide().after(editRow); + + $(':input[name="name"]', editRow).val( $('.name', rowData).text() ); + $(':input[name="slug"]', editRow).val( $('.slug', rowData).text() ); + + $(editRow).attr('id', 'edit-'+id).addClass('inline-editor').show(); + $('.ptitle', editRow).eq(0).focus(); + + return false; + }, + + save : function(id) { + var params, fields, tax = $('input[name="taxonomy"]').val() || ''; + + if( typeof(id) == 'object' ) + id = this.getId(id); + + $('table.widefat .inline-edit-save .waiting').show(); + + params = { + action: 'inline-save-tax', + tax_type: this.type, + tax_ID: id, + taxonomy: tax + }; + + fields = $('#edit-'+id+' :input').serialize(); + params = fields + '&' + $.param(params); + + // make ajax request + $.post('admin-ajax.php', params, + function(r) { + var row, new_id; + $('table.widefat .inline-edit-save .waiting').hide(); + + if (r) { + if ( -1 != r.indexOf('' ).text( name ); + } ); + } ); + }; + + $('#categorychecklist').wpList( { + alt: '', + what: 'link-category', + response: 'category-ajax-response', + addAfter: catAddAfter + } ); + + $('a[href="#categories-all"]').click(function(){deleteUserSetting('cats');}); + $('a[href="#categories-pop"]').click(function(){setUserSetting('cats','pop');}); + if ( 'pop' == getUserSetting('cats') ) + $('a[href="#categories-pop"]').click(); + + $('#category-add-toggle').click( function() { + $(this).parents('div:first').toggleClass( 'wp-hidden-children' ); + $('#category-tabs a[href="#categories-all"]').click(); + $('#newcategory').focus(); + return false; + } ); + + $('.categorychecklist :checkbox').change( syncChecks ).filter( ':checked' ).change(); +}); diff --git a/src/wp-admin/js/link.js b/src/wp-admin/js/link.js new file mode 100644 index 0000000..3feeaeb --- /dev/null +++ b/src/wp-admin/js/link.js @@ -0,0 +1 @@ +jQuery(document).ready(function(c){var b,a=false,d,e;c("#link_name").focus();postboxes.add_postbox_toggles("link");c("#category-tabs a").click(function(){var f=c(this).attr("href");c(this).parent().addClass("tabs").siblings("li").removeClass("tabs");c(".tabs-panel").hide();c(f).show();if("#categories-all"==f){deleteUserSetting("cats")}else{setUserSetting("cats","pop")}return false});if(getUserSetting("cats")){c('#category-tabs a[href="#categories-pop"]').click()}b=c("#newcat").one("focus",function(){c(this).val("").removeClass("form-input-tip")});c("#category-add-submit").click(function(){b.focus()});d=function(){if(a){return}a=true;var f=c(this),h=f.is(":checked"),g=f.val().toString();c("#in-link-category-"+g+", #in-popular-category-"+g).prop("checked",h);a=false};e=function(g,f){c(f.what+" response_data",g).each(function(){var h=c(c(this).text());h.find("label").each(function(){var j=c(this),l=j.find("input").val(),m=j.find("input")[0].id,i=c.trim(j.text()),k;c("#"+m).change(d);k=c('').text(i)})})};c("#categorychecklist").wpList({alt:"",what:"link-category",response:"category-ajax-response",addAfter:e});c('a[href="#categories-all"]').click(function(){deleteUserSetting("cats")});c('a[href="#categories-pop"]').click(function(){setUserSetting("cats","pop")});if("pop"==getUserSetting("cats")){c('a[href="#categories-pop"]').click()}c("#category-add-toggle").click(function(){c(this).parents("div:first").toggleClass("wp-hidden-children");c('#category-tabs a[href="#categories-all"]').click();c("#newcategory").focus();return false});c(".categorychecklist :checkbox").change(d).filter(":checked").change()}); \ No newline at end of file diff --git a/src/wp-admin/js/media-upload.dev.js b/src/wp-admin/js/media-upload.dev.js new file mode 100644 index 0000000..b19f292 --- /dev/null +++ b/src/wp-admin/js/media-upload.dev.js @@ -0,0 +1,72 @@ +// send html to the post editor +function send_to_editor(h) { + var ed; + + if ( typeof tinyMCE != 'undefined' && ( ed = tinyMCE.activeEditor ) && !ed.isHidden() ) { + // restore caret position on IE + if ( tinymce.isIE && ed.windowManager.insertimagebookmark ) + ed.selection.moveToBookmark(ed.windowManager.insertimagebookmark); + + if ( h.indexOf('[caption') === 0 ) { + if ( ed.plugins.wpeditimage ) + h = ed.plugins.wpeditimage._do_shcode(h); + } else if ( h.indexOf('[gallery') === 0 ) { + if ( ed.plugins.wpgallery ) + h = ed.plugins.wpgallery._do_gallery(h); + } else if ( h.indexOf('[embed') === 0 ) { + if ( ed.plugins.wordpress ) + h = ed.plugins.wordpress._setEmbed(h); + } + + ed.execCommand('mceInsertContent', false, h); + + } else if ( typeof edInsertContent == 'function' ) { + edInsertContent(edCanvas, h); + } else { + jQuery( edCanvas ).val( jQuery( edCanvas ).val() + h ); + } + + tb_remove(); +} + +// thickbox settings +var tb_position; +(function($) { + tb_position = function() { + var tbWindow = $('#TB_window'), width = $(window).width(), H = $(window).height(), W = ( 720 < width ) ? 720 : width, adminbar_height = 0; + + if ( $('body.admin-bar').length ) + adminbar_height = 28; + + if ( tbWindow.size() ) { + tbWindow.width( W - 50 ).height( H - 45 - adminbar_height ); + $('#TB_iframeContent').width( W - 50 ).height( H - 75 - adminbar_height ); + tbWindow.css({'margin-left': '-' + parseInt((( W - 50 ) / 2),10) + 'px'}); + if ( typeof document.body.style.maxWidth != 'undefined' ) + tbWindow.css({'top': 20 + adminbar_height + 'px','margin-top':'0'}); + }; + + return $('a.thickbox').each( function() { + var href = $(this).attr('href'); + if ( ! href ) return; + href = href.replace(/&width=[0-9]+/g, ''); + href = href.replace(/&height=[0-9]+/g, ''); + $(this).attr( 'href', href + '&width=' + ( W - 80 ) + '&height=' + ( H - 85 - adminbar_height ) ); + }); + }; + + $(window).resize(function(){ tb_position(); }); + + // store caret position in IE + $(document).ready(function($){ + $('a.thickbox').click(function(){ + var ed; + + if ( typeof tinyMCE != 'undefined' && tinymce.isIE && ( ed = tinyMCE.activeEditor ) && !ed.isHidden() ) { + ed.focus(); + ed.windowManager.insertimagebookmark = ed.selection.getBookmark(); + } + }); + }); + +})(jQuery); diff --git a/src/wp-admin/js/media-upload.js b/src/wp-admin/js/media-upload.js new file mode 100644 index 0000000..201f6ab --- /dev/null +++ b/src/wp-admin/js/media-upload.js @@ -0,0 +1 @@ +function send_to_editor(b){var a;if(typeof tinyMCE!="undefined"&&(a=tinyMCE.activeEditor)&&!a.isHidden()){if(tinymce.isIE&&a.windowManager.insertimagebookmark){a.selection.moveToBookmark(a.windowManager.insertimagebookmark)}if(b.indexOf("[caption")===0){if(a.plugins.wpeditimage){b=a.plugins.wpeditimage._do_shcode(b)}}else{if(b.indexOf("[gallery")===0){if(a.plugins.wpgallery){b=a.plugins.wpgallery._do_gallery(b)}}else{if(b.indexOf("[embed")===0){if(a.plugins.wordpress){b=a.plugins.wordpress._setEmbed(b)}}}}a.execCommand("mceInsertContent",false,b)}else{if(typeof edInsertContent=="function"){edInsertContent(edCanvas,b)}else{jQuery(edCanvas).val(jQuery(edCanvas).val()+b)}}tb_remove()}var tb_position;(function(a){tb_position=function(){var f=a("#TB_window"),e=a(window).width(),d=a(window).height(),c=(720]*?>/g, '' ); + } + if ( er ) { + $('#find-posts-response').html(er); + } + } + }; + + $(document).ready(function() { + $('#find-posts-submit').click(function(e) { + if ( '' == $('#find-posts-response').html() ) + e.preventDefault(); + }); + $( '#find-posts .find-box-search :input' ).keypress( function( event ) { + if ( 13 == event.which ) { + findPosts.send(); + return false; + } + } ); + $( '#find-posts-search' ).click( findPosts.send ); + $( '#find-posts-close' ).click( findPosts.close ); + $('#doaction, #doaction2').click(function(e){ + $('select[name^="action"]').each(function(){ + if ( $(this).val() == 'attach' ) { + e.preventDefault(); + findPosts.open(); + } + }); + }); + }); +})(jQuery); diff --git a/src/wp-admin/js/media.js b/src/wp-admin/js/media.js new file mode 100644 index 0000000..d5bd85b --- /dev/null +++ b/src/wp-admin/js/media.js @@ -0,0 +1 @@ +var findPosts;(function(a){findPosts={open:function(d,c){var b=document.documentElement.scrollTop||a(document).scrollTop();if(d&&c){a("#affected").attr("name",d).val(c)}a("#find-posts").show().draggable({handle:"#find-posts-head"}).css({top:b+50+"px",left:"50%",marginLeft:"-250px"});a("#find-posts-input").focus().keyup(function(f){if(f.which==27){findPosts.close()}});return false},close:function(){a("#find-posts-response").html("");a("#find-posts").draggable("destroy").hide()},send:function(){var b={ps:a("#find-posts-input").val(),action:"find_posts",_ajax_nonce:a("#_ajax_nonce").val()};var c;a("input[@name='itemSelect[]']:checked").each(function(){c=a(this).val()});b.post_type=c;a.ajax({type:"POST",url:ajaxurl,data:b,success:function(d){findPosts.show(d)},error:function(d){findPosts.error(d)}})},show:function(b){if(typeof(b)=="string"){this.error({responseText:b});return}var c=wpAjax.parseAjaxResponse(b);if(c.errors){this.error({responseText:wpAjax.broken})}c=c.responses[0];a("#find-posts-response").html(c.data)},error:function(b){var c=b.statusText;if(b.responseText){c=b.responseText.replace(/<.[^<>]*?>/g,"")}if(c){a("#find-posts-response").html(c)}}};a(document).ready(function(){a("#find-posts-submit").click(function(b){if(""==a("#find-posts-response").html()){b.preventDefault()}});a("#find-posts .find-box-search :input").keypress(function(b){if(13==b.which){findPosts.send();return false}});a("#find-posts-search").click(findPosts.send);a("#find-posts-close").click(findPosts.close);a("#doaction, #doaction2").click(function(b){a('select[name^="action"]').each(function(){if(a(this).val()=="attach"){b.preventDefault();findPosts.open()}})})})})(jQuery); \ No newline at end of file diff --git a/src/wp-admin/js/nav-menu.dev.js b/src/wp-admin/js/nav-menu.dev.js new file mode 100644 index 0000000..33cc6cf --- /dev/null +++ b/src/wp-admin/js/nav-menu.dev.js @@ -0,0 +1,959 @@ +/** + * WordPress Administration Navigation Menu + * Interface JS functions + * + * @version 2.0.0 + * + * @package WordPress + * @subpackage Administration + */ + +var wpNavMenu; + +(function($) { + + var api = wpNavMenu = { + + options : { + menuItemDepthPerLevel : 30, // Do not use directly. Use depthToPx and pxToDepth instead. + globalMaxDepth : 11 + }, + + menuList : undefined, // Set in init. + targetList : undefined, // Set in init. + menusChanged : false, + isRTL: !! ( 'undefined' != typeof isRtl && isRtl ), + negateIfRTL: ( 'undefined' != typeof isRtl && isRtl ) ? -1 : 1, + + // Functions that run on init. + init : function() { + api.menuList = $('#menu-to-edit'); + api.targetList = api.menuList; + + this.jQueryExtensions(); + + this.attachMenuEditListeners(); + + this.setupInputWithDefaultTitle(); + this.attachQuickSearchListeners(); + this.attachThemeLocationsListeners(); + + this.attachTabsPanelListeners(); + + this.attachUnsavedChangesListener(); + + if( api.menuList.length ) // If no menu, we're in the + tab. + this.initSortables(); + + this.initToggles(); + + this.initTabManager(); + }, + + jQueryExtensions : function() { + // jQuery extensions + $.fn.extend({ + menuItemDepth : function() { + var margin = api.isRTL ? this.eq(0).css('margin-right') : this.eq(0).css('margin-left'); + return api.pxToDepth( margin && -1 != margin.indexOf('px') ? margin.slice(0, -2) : 0 ); + }, + updateDepthClass : function(current, prev) { + return this.each(function(){ + var t = $(this); + prev = prev || t.menuItemDepth(); + $(this).removeClass('menu-item-depth-'+ prev ) + .addClass('menu-item-depth-'+ current ); + }); + }, + shiftDepthClass : function(change) { + return this.each(function(){ + var t = $(this), + depth = t.menuItemDepth(); + $(this).removeClass('menu-item-depth-'+ depth ) + .addClass('menu-item-depth-'+ (depth + change) ); + }); + }, + childMenuItems : function() { + var result = $(); + this.each(function(){ + var t = $(this), depth = t.menuItemDepth(), next = t.next(); + while( next.length && next.menuItemDepth() > depth ) { + result = result.add( next ); + next = next.next(); + } + }); + return result; + }, + updateParentMenuItemDBId : function() { + return this.each(function(){ + var item = $(this), + input = item.find('.menu-item-data-parent-id'), + depth = item.menuItemDepth(), + parent = item.prev(); + + if( depth == 0 ) { // Item is on the top level, has no parent + input.val(0); + } else { // Find the parent item, and retrieve its object id. + while( ! parent[0] || ! parent[0].className || -1 == parent[0].className.indexOf('menu-item') || ( parent.menuItemDepth() != depth - 1 ) ) + parent = parent.prev(); + input.val( parent.find('.menu-item-data-db-id').val() ); + } + }); + }, + hideAdvancedMenuItemFields : function() { + return this.each(function(){ + var that = $(this); + $('.hide-column-tog').not(':checked').each(function(){ + that.find('.field-' + $(this).val() ).addClass('hidden-field'); + }); + }); + }, + /** + * Adds selected menu items to the menu. + * + * @param jQuery metabox The metabox jQuery object. + */ + addSelectedToMenu : function(processMethod) { + if ( 0 == $('#menu-to-edit').length ) { + return false; + } + + return this.each(function() { + var t = $(this), menuItems = {}, + checkboxes = t.find('.tabs-panel-active .categorychecklist li input:checked'), + re = new RegExp('menu-item\\[(\[^\\]\]*)'); + + processMethod = processMethod || api.addMenuItemToBottom; + + // If no items are checked, bail. + if ( !checkboxes.length ) + return false; + + // Show the ajax spinner + t.find('img.waiting').show(); + + // Retrieve menu item data + $(checkboxes).each(function(){ + var t = $(this), + listItemDBIDMatch = re.exec( t.attr('name') ), + listItemDBID = 'undefined' == typeof listItemDBIDMatch[1] ? 0 : parseInt(listItemDBIDMatch[1], 10); + if ( this.className && -1 != this.className.indexOf('add-to-top') ) + processMethod = api.addMenuItemToTop; + menuItems[listItemDBID] = t.closest('li').getItemData( 'add-menu-item', listItemDBID ); + }); + + // Add the items + api.addItemToMenu(menuItems, processMethod, function(){ + // Deselect the items and hide the ajax spinner + checkboxes.removeAttr('checked'); + t.find('img.waiting').hide(); + }); + }); + }, + getItemData : function( itemType, id ) { + itemType = itemType || 'menu-item'; + + var itemData = {}, i, + fields = [ + 'menu-item-db-id', + 'menu-item-object-id', + 'menu-item-object', + 'menu-item-parent-id', + 'menu-item-position', + 'menu-item-type', + 'menu-item-title', + 'menu-item-url', + 'menu-item-description', + 'menu-item-attr-title', + 'menu-item-target', + 'menu-item-classes', + 'menu-item-xfn' + ]; + + if( !id && itemType == 'menu-item' ) { + id = this.find('.menu-item-data-db-id').val(); + } + + if( !id ) return itemData; + + this.find('input').each(function() { + var field; + i = fields.length; + while ( i-- ) { + if( itemType == 'menu-item' ) + field = fields[i] + '[' + id + ']'; + else if( itemType == 'add-menu-item' ) + field = 'menu-item[' + id + '][' + fields[i] + ']'; + + if ( + this.name && + field == this.name + ) { + itemData[fields[i]] = this.value; + } + } + }); + + return itemData; + }, + setItemData : function( itemData, itemType, id ) { // Can take a type, such as 'menu-item', or an id. + itemType = itemType || 'menu-item'; + + if( !id && itemType == 'menu-item' ) { + id = $('.menu-item-data-db-id', this).val(); + } + + if( !id ) return this; + + this.find('input').each(function() { + var t = $(this), field; + $.each( itemData, function( attr, val ) { + if( itemType == 'menu-item' ) + field = attr + '[' + id + ']'; + else if( itemType == 'add-menu-item' ) + field = 'menu-item[' + id + '][' + attr + ']'; + + if ( field == t.attr('name') ) { + t.val( val ); + } + }); + }); + return this; + } + }); + }, + + initToggles : function() { + // init postboxes + postboxes.add_postbox_toggles('nav-menus'); + + // adjust columns functions for menus UI + columns.useCheckboxesForHidden(); + columns.checked = function(field) { + $('.field-' + field).removeClass('hidden-field'); + } + columns.unchecked = function(field) { + $('.field-' + field).addClass('hidden-field'); + } + // hide fields + api.menuList.hideAdvancedMenuItemFields(); + }, + + initSortables : function() { + var currentDepth = 0, originalDepth, minDepth, maxDepth, + prev, next, prevBottom, nextThreshold, helperHeight, transport, + menuEdge = api.menuList.offset().left, + body = $('body'), maxChildDepth, + menuMaxDepth = initialMenuMaxDepth(); + + // Use the right edge if RTL. + menuEdge += api.isRTL ? api.menuList.width() : 0; + + api.menuList.sortable({ + handle: '.menu-item-handle', + placeholder: 'sortable-placeholder', + start: function(e, ui) { + var height, width, parent, children, tempHolder; + + // handle placement for rtl orientation + if ( api.isRTL ) + ui.item[0].style.right = 'auto'; + + transport = ui.item.children('.menu-item-transport'); + + // Set depths. currentDepth must be set before children are located. + originalDepth = ui.item.menuItemDepth(); + updateCurrentDepth(ui, originalDepth); + + // Attach child elements to parent + // Skip the placeholder + parent = ( ui.item.next()[0] == ui.placeholder[0] ) ? ui.item.next() : ui.item; + children = parent.childMenuItems(); + transport.append( children ); + + // Update the height of the placeholder to match the moving item. + height = transport.outerHeight(); + // If there are children, account for distance between top of children and parent + height += ( height > 0 ) ? (ui.placeholder.css('margin-top').slice(0, -2) * 1) : 0; + height += ui.helper.outerHeight(); + helperHeight = height; + height -= 2; // Subtract 2 for borders + ui.placeholder.height(height); + + // Update the width of the placeholder to match the moving item. + maxChildDepth = originalDepth; + children.each(function(){ + var depth = $(this).menuItemDepth(); + maxChildDepth = (depth > maxChildDepth) ? depth : maxChildDepth; + }); + width = ui.helper.find('.menu-item-handle').outerWidth(); // Get original width + width += api.depthToPx(maxChildDepth - originalDepth); // Account for children + width -= 2; // Subtract 2 for borders + ui.placeholder.width(width); + + // Update the list of menu items. + tempHolder = ui.placeholder.next(); + tempHolder.css( 'margin-top', helperHeight + 'px' ); // Set the margin to absorb the placeholder + ui.placeholder.detach(); // detach or jQuery UI will think the placeholder is a menu item + $(this).sortable( "refresh" ); // The children aren't sortable. We should let jQ UI know. + ui.item.after( ui.placeholder ); // reattach the placeholder. + tempHolder.css('margin-top', 0); // reset the margin + + // Now that the element is complete, we can update... + updateSharedVars(ui); + }, + stop: function(e, ui) { + var children, depthChange = currentDepth - originalDepth; + + // Return child elements to the list + children = transport.children().insertAfter(ui.item); + + // Update depth classes + if( depthChange != 0 ) { + ui.item.updateDepthClass( currentDepth ); + children.shiftDepthClass( depthChange ); + updateMenuMaxDepth( depthChange ); + } + // Register a change + api.registerChange(); + // Update the item data. + ui.item.updateParentMenuItemDBId(); + + // address sortable's incorrectly-calculated top in opera + ui.item[0].style.top = 0; + + // handle drop placement for rtl orientation + if ( api.isRTL ) { + ui.item[0].style.left = 'auto'; + ui.item[0].style.right = 0; + } + + // The width of the tab bar might have changed. Just in case. + api.refreshMenuTabs( true ); + }, + change: function(e, ui) { + // Make sure the placeholder is inside the menu. + // Otherwise fix it, or we're in trouble. + if( ! ui.placeholder.parent().hasClass('menu') ) + (prev.length) ? prev.after( ui.placeholder ) : api.menuList.prepend( ui.placeholder ); + + updateSharedVars(ui); + }, + sort: function(e, ui) { + var offset = ui.helper.offset(), + edge = api.isRTL ? offset.left + ui.helper.width() : offset.left, + depth = api.negateIfRTL * api.pxToDepth( edge - menuEdge ); + // Check and correct if depth is not within range. + // Also, if the dragged element is dragged upwards over + // an item, shift the placeholder to a child position. + if ( depth > maxDepth || offset.top < prevBottom ) depth = maxDepth; + else if ( depth < minDepth ) depth = minDepth; + + if( depth != currentDepth ) + updateCurrentDepth(ui, depth); + + // If we overlap the next element, manually shift downwards + if( nextThreshold && offset.top + helperHeight > nextThreshold ) { + next.after( ui.placeholder ); + updateSharedVars( ui ); + $(this).sortable( "refreshPositions" ); + } + } + }); + + function updateSharedVars(ui) { + var depth; + + prev = ui.placeholder.prev(); + next = ui.placeholder.next(); + + // Make sure we don't select the moving item. + if( prev[0] == ui.item[0] ) prev = prev.prev(); + if( next[0] == ui.item[0] ) next = next.next(); + + prevBottom = (prev.length) ? prev.offset().top + prev.height() : 0; + nextThreshold = (next.length) ? next.offset().top + next.height() / 3 : 0; + minDepth = (next.length) ? next.menuItemDepth() : 0; + + if( prev.length ) + maxDepth = ( (depth = prev.menuItemDepth() + 1) > api.options.globalMaxDepth ) ? api.options.globalMaxDepth : depth; + else + maxDepth = 0; + } + + function updateCurrentDepth(ui, depth) { + ui.placeholder.updateDepthClass( depth, currentDepth ); + currentDepth = depth; + } + + function initialMenuMaxDepth() { + if( ! body[0].className ) return 0; + var match = body[0].className.match(/menu-max-depth-(\d+)/); + return match && match[1] ? parseInt(match[1]) : 0; + } + + function updateMenuMaxDepth( depthChange ) { + var depth, newDepth = menuMaxDepth; + if ( depthChange === 0 ) { + return; + } else if ( depthChange > 0 ) { + depth = maxChildDepth + depthChange; + if( depth > menuMaxDepth ) + newDepth = depth; + } else if ( depthChange < 0 && maxChildDepth == menuMaxDepth ) { + while( ! $('.menu-item-depth-' + newDepth, api.menuList).length && newDepth > 0 ) + newDepth--; + } + // Update the depth class. + body.removeClass( 'menu-max-depth-' + menuMaxDepth ).addClass( 'menu-max-depth-' + newDepth ); + menuMaxDepth = newDepth; + } + }, + + attachMenuEditListeners : function() { + var that = this; + $('#update-nav-menu').bind('click', function(e) { + if ( e.target && e.target.className ) { + if ( -1 != e.target.className.indexOf('item-edit') ) { + return that.eventOnClickEditLink(e.target); + } else if ( -1 != e.target.className.indexOf('menu-save') ) { + return that.eventOnClickMenuSave(e.target); + } else if ( -1 != e.target.className.indexOf('menu-delete') ) { + return that.eventOnClickMenuDelete(e.target); + } else if ( -1 != e.target.className.indexOf('item-delete') ) { + return that.eventOnClickMenuItemDelete(e.target); + } else if ( -1 != e.target.className.indexOf('item-cancel') ) { + return that.eventOnClickCancelLink(e.target); + } + } + }); + }, + + /** + * An interface for managing default values for input elements + * that is both JS and accessibility-friendly. + * + * Input elements that add the class 'input-with-default-title' + * will have their values set to the provided HTML title when empty. + */ + setupInputWithDefaultTitle : function() { + var name = 'input-with-default-title'; + + $('.' + name).each( function(){ + var $t = $(this), title = $t.attr('title'), val = $t.val(); + $t.data( name, title ); + + if( '' == val ) $t.val( title ); + else if ( title == val ) return; + else $t.removeClass( name ); + }).focus( function(){ + var $t = $(this); + if( $t.val() == $t.data(name) ) + $t.val('').removeClass( name ); + }).blur( function(){ + var $t = $(this); + if( '' == $t.val() ) + $t.addClass( name ).val( $t.data(name) ); + }); + }, + + attachThemeLocationsListeners : function() { + var loc = $('#nav-menu-theme-locations'), params = {}; + params['action'] = 'menu-locations-save'; + params['menu-settings-column-nonce'] = $('#menu-settings-column-nonce').val(); + loc.find('input[type="submit"]').click(function() { + loc.find('select').each(function() { + params[this.name] = $(this).val(); + }); + loc.find('.waiting').show(); + $.post( ajaxurl, params, function(r) { + loc.find('.waiting').hide(); + }); + return false; + }); + }, + + attachQuickSearchListeners : function() { + var searchTimer; + + $('.quick-search').keypress(function(e){ + var t = $(this); + + if( 13 == e.which ) { + api.updateQuickSearchResults( t ); + return false; + } + + if( searchTimer ) clearTimeout(searchTimer); + + searchTimer = setTimeout(function(){ + api.updateQuickSearchResults( t ); + }, 400); + }).attr('autocomplete','off'); + }, + + updateQuickSearchResults : function(input) { + var panel, params, + minSearchLength = 2, + q = input.val(); + + if( q.length < minSearchLength ) return; + + panel = input.parents('.tabs-panel'); + params = { + 'action': 'menu-quick-search', + 'response-format': 'markup', + 'menu': $('#menu').val(), + 'menu-settings-column-nonce': $('#menu-settings-column-nonce').val(), + 'q': q, + 'type': input.attr('name') + }; + + $('img.waiting', panel).show(); + + $.post( ajaxurl, params, function(menuMarkup) { + api.processQuickSearchQueryResponse(menuMarkup, params, panel); + }); + }, + + addCustomLink : function( processMethod ) { + var url = $('#custom-menu-item-url').val(), + label = $('#custom-menu-item-name').val(); + + processMethod = processMethod || api.addMenuItemToBottom; + + if ( '' == url || 'http://' == url ) + return false; + + // Show the ajax spinner + $('.customlinkdiv img.waiting').show(); + this.addLinkToMenu( url, label, processMethod, function() { + // Remove the ajax spinner + $('.customlinkdiv img.waiting').hide(); + // Set custom link form back to defaults + $('#custom-menu-item-name').val('').blur(); + $('#custom-menu-item-url').val('http://'); + }); + }, + + addLinkToMenu : function(url, label, processMethod, callback) { + processMethod = processMethod || api.addMenuItemToBottom; + callback = callback || function(){}; + + api.addItemToMenu({ + '-1': { + 'menu-item-type': 'custom', + 'menu-item-url': url, + 'menu-item-title': label + } + }, processMethod, callback); + }, + + addItemToMenu : function(menuItem, processMethod, callback) { + var menu = $('#menu').val(), + nonce = $('#menu-settings-column-nonce').val(); + + processMethod = processMethod || function(){}; + callback = callback || function(){}; + + params = { + 'action': 'add-menu-item', + 'menu': menu, + 'menu-settings-column-nonce': nonce, + 'menu-item': menuItem + }; + + $.post( ajaxurl, params, function(menuMarkup) { + var ins = $('#menu-instructions'); + processMethod(menuMarkup, params); + if( ! ins.hasClass('menu-instructions-inactive') && ins.siblings().length ) + ins.addClass('menu-instructions-inactive'); + callback(); + }); + }, + + /** + * Process the add menu item request response into menu list item. + * + * @param string menuMarkup The text server response of menu item markup. + * @param object req The request arguments. + */ + addMenuItemToBottom : function( menuMarkup, req ) { + $(menuMarkup).hideAdvancedMenuItemFields().appendTo( api.targetList ); + }, + + addMenuItemToTop : function( menuMarkup, req ) { + $(menuMarkup).hideAdvancedMenuItemFields().prependTo( api.targetList ); + }, + + attachUnsavedChangesListener : function() { + $('#menu-management input, #menu-management select, #menu-management, #menu-management textarea').change(function(){ + api.registerChange(); + }); + + if ( 0 != $('#menu-to-edit').length ) { + window.onbeforeunload = function(){ + if ( api.menusChanged ) + return navMenuL10n.saveAlert; + }; + } else { + // Make the post boxes read-only, as they can't be used yet + $('#menu-settings-column').find('input,select').prop('disabled', true).end().find('a').attr('href', '#').unbind('click'); + } + }, + + registerChange : function() { + api.menusChanged = true; + }, + + attachTabsPanelListeners : function() { + $('#menu-settings-column').bind('click', function(e) { + var selectAreaMatch, panelId, wrapper, items, + target = $(e.target); + + if ( target.hasClass('nav-tab-link') ) { + panelId = /#(.*)$/.exec(e.target.href); + if ( panelId && panelId[1] ) + panelId = panelId[1] + else + return false; + + wrapper = target.parents('.inside').first(); + + // upon changing tabs, we want to uncheck all checkboxes + $('input', wrapper).removeAttr('checked'); + + $('.tabs-panel-active', wrapper).removeClass('tabs-panel-active').addClass('tabs-panel-inactive'); + $('#' + panelId, wrapper).removeClass('tabs-panel-inactive').addClass('tabs-panel-active'); + + $('.tabs', wrapper).removeClass('tabs'); + target.parent().addClass('tabs'); + + // select the search bar + $('.quick-search', wrapper).focus(); + + return false; + } else if ( target.hasClass('select-all') ) { + selectAreaMatch = /#(.*)$/.exec(e.target.href); + if ( selectAreaMatch && selectAreaMatch[1] ) { + items = $('#' + selectAreaMatch[1] + ' .tabs-panel-active .menu-item-title input'); + if( items.length === items.filter(':checked').length ) + items.removeAttr('checked'); + else + items.prop('checked', true); + return false; + } + } else if ( target.hasClass('submit-add-to-menu') ) { + api.registerChange(); + + if ( e.target.id && 'submit-customlinkdiv' == e.target.id ) + api.addCustomLink( api.addMenuItemToBottom ); + else if ( e.target.id && -1 != e.target.id.indexOf('submit-') ) + $('#' + e.target.id.replace(/submit-/, '')).addSelectedToMenu( api.addMenuItemToBottom ); + return false; + } else if ( target.hasClass('page-numbers') ) { + $.post( ajaxurl, e.target.href.replace(/.*\?/, '').replace(/action=([^&]*)/, '') + '&action=menu-get-metabox', + function( resp ) { + if ( -1 == resp.indexOf('replace-id') ) + return; + + var metaBoxData = $.parseJSON(resp), + toReplace = document.getElementById(metaBoxData['replace-id']), + placeholder = document.createElement('div'), + wrap = document.createElement('div'); + + if ( ! metaBoxData['markup'] || ! toReplace ) + return; + + wrap.innerHTML = metaBoxData['markup'] ? metaBoxData['markup'] : ''; + + toReplace.parentNode.insertBefore( placeholder, toReplace ); + placeholder.parentNode.removeChild( toReplace ); + + placeholder.parentNode.insertBefore( wrap, placeholder ); + + placeholder.parentNode.removeChild( placeholder ); + + } + ); + + return false; + } + }); + }, + + initTabManager : function() { + var fixed = $('.nav-tabs-wrapper'), + fluid = fixed.children('.nav-tabs'), + active = fluid.children('.nav-tab-active'), + tabs = fluid.children('.nav-tab'), + tabsWidth = 0, + fixedRight, fixedLeft, + arrowLeft, arrowRight, resizeTimer, css = {}, + marginFluid = api.isRTL ? 'margin-right' : 'margin-left', + marginFixed = api.isRTL ? 'margin-left' : 'margin-right', + msPerPx = 2; + + /** + * Refreshes the menu tabs. + * Will show and hide arrows where necessary. + * Scrolls to the active tab by default. + * + * @param savePosition {boolean} Optional. Prevents scrolling so + * that the current position is maintained. Default false. + **/ + api.refreshMenuTabs = function( savePosition ) { + var fixedWidth = fixed.width(), + margin = 0, css = {}; + fixedLeft = fixed.offset().left; + fixedRight = fixedLeft + fixedWidth; + + if( !savePosition ) + active.makeTabVisible(); + + // Prevent space from building up next to the last tab if there's more to show + if( tabs.last().isTabVisible() ) { + margin = fixed.width() - tabsWidth; + margin = margin > 0 ? 0 : margin; + css[marginFluid] = margin + 'px'; + fluid.animate( css, 100, "linear" ); + } + + // Show the arrows only when necessary + if( fixedWidth > tabsWidth ) + arrowLeft.add( arrowRight ).hide(); + else + arrowLeft.add( arrowRight ).show(); + } + + $.fn.extend({ + makeTabVisible : function() { + var t = this.eq(0), left, right, css = {}, shift = 0; + + if( ! t.length ) return this; + + left = t.offset().left; + right = left + t.outerWidth(); + + if( right > fixedRight ) + shift = fixedRight - right; + else if ( left < fixedLeft ) + shift = fixedLeft - left; + + if( ! shift ) return this; + + css[marginFluid] = "+=" + api.negateIfRTL * shift + 'px'; + fluid.animate( css, Math.abs( shift ) * msPerPx, "linear" ); + return this; + }, + isTabVisible : function() { + var t = this.eq(0), + left = t.offset().left, + right = left + t.outerWidth(); + return ( right <= fixedRight && left >= fixedLeft ) ? true : false; + } + }); + + // Find the width of all tabs + tabs.each(function(){ + tabsWidth += $(this).outerWidth(true); + }); + + // Set up fixed margin for overflow, unset padding + css['padding'] = 0; + css[marginFixed] = (-1 * tabsWidth) + 'px'; + fluid.css( css ); + + // Build tab navigation + arrowLeft = $(''); + arrowRight = $(''); + // Attach to the document + fixed.wrap(''; + include( ABSPATH . 'wp-admin/admin-footer.php' ); + die(); + } + + echo '
    '; + + wp_nonce_field( 'install-network-1' ); + + $error_codes = array(); + if ( is_wp_error( $errors ) ) { + echo '

    ' . __( 'ERROR: The network could not be created.' ) . '

    '; + foreach ( $errors->get_error_messages() as $error ) + echo "

    $error

    "; + echo '
    '; + $error_codes = $errors->get_error_codes(); + } + + if ( WP_CONTENT_DIR != ABSPATH . 'wp-content' ) + echo '

    ' . __('Warning!') . ' ' . __( 'Networks may not be fully compatible with custom wp-content directories.' ) . '

    '; + + $site_name = ( ! empty( $_POST['sitename'] ) && ! in_array( 'empty_sitename', $error_codes ) ) ? $_POST['sitename'] : sprintf( _x('%s Sites', 'Default network name' ), get_option( 'blogname' ) ); + $admin_email = ( ! empty( $_POST['email'] ) && ! in_array( 'invalid_email', $error_codes ) ) ? $_POST['email'] : get_option( 'admin_email' ); + ?> +

    +

    +

    ' . __( 'Note:' ) . ' ' . __( 'Please make sure the Apache mod_rewrite module is installed as it will be used at the end of this installation.' ) . '

    '; + elseif ( $is_apache ) + echo '

    ' . __( 'Warning!' ) . ' ' . __( 'It looks like the Apache mod_rewrite module is not installed.' ) . '

    '; + if ( $got_mod_rewrite || $is_apache ) // Protect against mod_rewrite mimicry (but ! Apache) + echo '

    ' . __( 'If mod_rewrite is disabled, ask your administrator to enable that module, or look at the Apache documentation or elsewhere for help setting it up.' ) . '

    '; + } + + if ( allow_subdomain_install() && allow_subdirectory_install() ) : ?> +

    +

    You cannot change this later.' ); ?>

    +

    + + + + + + + + + + +
    site1.%1$s and site2.%1$s', 'subdomain examples' ), $hostname ); ?>
    %1$s/site1 and %1$s/site2', 'subdirectory examples' ), $hostname ); ?>
    + + +

    +

    %1$s before enabling the network feature. It will still be possible to visit your site using the www prefix with an address like %2$s but any links will not have the www prefix.' ), substr( $hostname, 4 ), $hostname ); ?> + + + + + +
    + %s.' ), $hostname ); ?> +
    + + +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    localhost, the sites in your WordPress network must use sub-directories. Consider using localhost.localdomain if you wish to use sub-domains.' ); + // Uh oh: + if ( !allow_subdirectory_install() ) + echo ' ' . __( 'Warning!' ) . ' ' . __( 'The main site in a sub-directory install will need to use a modified permalink structure, potentially breaking existing links.' ) . ''; + ?>
    ' . __( 'Warning!' ) . ' ' . __( 'The main site in a sub-directory install will need to use a modified permalink structure, potentially breaking existing links.' ) . ''; + ?>
    ' . __( 'The main site in a sub-directory install will need to use a modified permalink structure, potentially breaking existing links.' ) . ''; + ?>
    + %s.' ), $hostname ); ?> +
    + +
    +
    + +
    +
    + +
    + ' . $errors->get_error_message() . '
    '; + + if ( $_POST ) { + if ( allow_subdomain_install() ) + $subdomain_install = allow_subdirectory_install() ? ! empty( $_POST['subdomain_install'] ) : true; + else + $subdomain_install = false; + } else { + if ( is_multisite() ) { + $subdomain_install = is_subdomain_install(); +?> +

    +get_var( "SELECT meta_value FROM $wpdb->sitemeta WHERE site_id = 1 AND meta_key = 'subdomain_install'" ); +?> +

    +

    + +

    +

    +

    Caution: We recommend you back up your existing wp-config.php and %s files.' ), '.htaccess' ); + elseif ( file_exists( ABSPATH . 'web.config' ) ) + printf( __( 'Caution: We recommend you back up your existing wp-config.php and %s files.' ), 'web.config' ); + else + _e( 'Caution: We recommend you back up your existing wp-config.php file.' ); + ?>

    + +
      +
    1. blogs.dir directory at %s/blogs.dir. This directory is used to store uploaded media for your additional sites and must be writeable by the web server.' ), WP_CONTENT_DIR ); + if ( WP_CONTENT_DIR != ABSPATH . 'wp-content' ) + echo ' ' . __('Warning:') . ' ' . __( 'Networks may not be fully compatible with custom wp-content directories.' ) . '

    2. +
    3. wp-config.php file in %s above the line reading /* That’s all, stop editing! Happy blogging. */:' ), ABSPATH ); ?>

      + + '', 'SECURE_AUTH_KEY' => '', 'LOGGED_IN_KEY' => '', 'NONCE_KEY' => '', 'AUTH_SALT' => '', 'SECURE_AUTH_SALT' => '', 'LOGGED_IN_SALT' => '', 'NONCE_SALT' => '' ); + foreach ( $keys_salts as $c => $v ) { + if ( defined( $c ) ) + unset( $keys_salts[ $c ] ); + } + if ( ! empty( $keys_salts ) ) { + $keys_salts_str = ''; + $from_api = wp_remote_get( 'https://api.wordpress.org/secret-key/1.1/salt/' ); + if ( is_wp_error( $from_api ) ) { + foreach ( $keys_salts as $c => $v ) { + $keys_salts_str .= "\ndefine( '$c', '" . wp_generate_password( 64, true, true ) . "' );"; + } + } else { + $from_api = explode( "\n", wp_remote_retrieve_body( $from_api ) ); + foreach ( $keys_salts as $c => $v ) { + $keys_salts_str .= "\ndefine( '$c', '" . substr( array_shift( $from_api ), 28, 64 ) . "' );"; + } + } + $num_keys_salts = count( $keys_salts ); +?> +

      wp-config.php file.', 'These unique authentication keys are also missing from your wp-config.php file.', $num_keys_salts ); ?>

      + + +
    4. + + + + + + + + + + + + + + + + + + + + + + + + + + + + +'; + } else { + $web_config_file = +' + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +'; + } + ?> +
    5. web.config file in %s, replacing other WordPress rules:' ), ABSPATH ); ?>

      +
    6. +
    + + +
  • .htaccess file in %s, replacing other WordPress rules:' ), ABSPATH ); ?>

    +
  • + + + +

    +get_error_codes() ) && 'no_wildcard_dns' == $result->get_error_code() ) + network_step2( $result ); + else + network_step1( $result ); + } else { + network_step2(); + } + } else { + network_step2(); + } +} elseif ( is_multisite() || network_domain_check() ) { + network_step2(); +} else { + network_step1(); +} +?> +
    + + diff --git a/src/wp-admin/network/admin.php b/src/wp-admin/network/admin.php new file mode 100644 index 0000000..d6de38d --- /dev/null +++ b/src/wp-admin/network/admin.php @@ -0,0 +1,25 @@ +domain != $current_site->domain ) || ( $current_blog->path != $current_site->path ) ); +$redirect_network_admin_request = apply_filters( 'redirect_network_admin_request', $redirect_network_admin_request ); +if ( $redirect_network_admin_request ) { + wp_redirect( network_admin_url() ); + exit; +} +unset( $redirect_network_admin_request ); +?> diff --git a/src/wp-admin/network/edit.php b/src/wp-admin/network/edit.php new file mode 100644 index 0000000..2d3f952 --- /dev/null +++ b/src/wp-admin/network/edit.php @@ -0,0 +1,482 @@ + +

    +

    +
    + + ID'>$current_user->user_login"; + + foreach ( ( $allusers = (array) $_POST['allusers'] ) as $key => $val ) { + if ( $val != '' && $val != '0' ) { + $delete_user = new WP_User( $val ); + + if ( ! current_user_can( 'delete_user', $delete_user->ID ) ) + wp_die( sprintf( __( 'Warning! User %s cannot be deleted.' ), $delete_user->user_login ) ); + + if ( in_array( $delete_user->user_login, $site_admins ) ) + wp_die( sprintf( __( 'Warning! User cannot be deleted. The user %s is a network admnistrator.' ), $delete_user->user_login ) ); + + echo "\n"; + $blogs = get_blogs_of_user( $val, true ); + + if ( !empty( $blogs ) ) { + ?> +

    %s?" ), $delete_user->user_login ); ?>

    + $details ) { + $blog_users = get_users( array( 'blog_id' => $details->userblog_id ) ); + if ( is_array( $blog_users ) && !empty( $blog_users ) ) { + $user_site = "{$details->blogname}"; + $user_dropdown = "\n"; + ?> +
      +
    • +
    • +
    • +
    + "; + } + } + } + + submit_button( __('Confirm Deletion'), 'delete' ); + ?> + + options page.' ), esc_url( admin_url( 'settings.php' ) ) ) ); + + if ( isset($_POST['WPLANG']) && ( '' === $_POST['WPLANG'] || in_array( $_POST['WPLANG'], get_available_languages() ) ) ) + update_site_option( 'WPLANG', $_POST['WPLANG'] ); + + if ( is_email( $_POST['admin_email'] ) ) + update_site_option( 'admin_email', $_POST['admin_email'] ); + + $illegal_names = split( ' ', $_POST['illegal_names'] ); + foreach ( (array) $illegal_names as $name ) { + $name = trim( $name ); + if ( $name != '' ) + $names[] = trim( $name ); + } + update_site_option( 'illegal_names', $names ); + + if ( $_POST['limited_email_domains'] != '' ) { + $limited_email_domains = str_replace( ' ', "\n", $_POST['limited_email_domains'] ); + $limited_email_domains = split( "\n", stripslashes( $limited_email_domains ) ); + $limited_email = array(); + foreach ( (array) $limited_email_domains as $domain ) { + $domain = trim( $domain ); + if ( ! preg_match( '/(--|\.\.)/', $domain ) && preg_match( '|^([a-zA-Z0-9-\.])+$|', $domain ) ) + $limited_email[] = trim( $domain ); + } + update_site_option( 'limited_email_domains', $limited_email ); + } else { + update_site_option( 'limited_email_domains', '' ); + } + + if ( $_POST['banned_email_domains'] != '' ) { + $banned_email_domains = split( "\n", stripslashes( $_POST['banned_email_domains'] ) ); + $banned = array(); + foreach ( (array) $banned_email_domains as $domain ) { + $domain = trim( $domain ); + if ( ! preg_match( '/(--|\.\.)/', $domain ) && preg_match( '|^([a-zA-Z0-9-\.])+$|', $domain ) ) + $banned[] = trim( $domain ); + } + update_site_option( 'banned_email_domains', $banned ); + } else { + update_site_option( 'banned_email_domains', '' ); + } + + $options = array( 'registrationnotification', 'registration', 'add_new_users', 'menu_items', 'mu_media_buttons', 'upload_space_check_disabled', 'blog_upload_space', 'upload_filetypes', 'site_name', 'first_post', 'first_page', 'first_comment', 'first_comment_url', 'first_comment_author', 'welcome_email', 'welcome_user_email', 'fileupload_maxk', 'global_terms_enabled' ); + $checked_options = array( 'mu_media_buttons' => array(), 'menu_items' => array(), 'registrationnotification' => 'no', 'upload_space_check_disabled' => 1, 'add_new_users' => 0 ); + foreach ( $checked_options as $option_name => $option_unchecked_value ) { + if ( ! isset( $_POST[$option_name] ) ) + $_POST[$option_name] = $option_unchecked_value; + } + foreach ( $options as $option_name ) { + if ( ! isset($_POST[$option_name]) ) + continue; + $value = stripslashes_deep( $_POST[$option_name] ); + update_site_option( $option_name, $value ); + } + + // Update more options here + do_action( 'update_wpmu_options' ); + + wp_redirect( add_query_arg( 'updated', 'true', network_admin_url( 'settings.php' ) ) ); + exit(); + break; + + case 'updateblog': + // No longer used. + break; + + case 'deleteblog': + check_admin_referer('deleteblog'); + if ( ! ( current_user_can( 'manage_sites' ) && current_user_can( 'delete_sites' ) ) ) + wp_die( __( 'You do not have permission to access this page.' ) ); + + if ( $id != '0' && $id != $current_site->blog_id && current_user_can( 'delete_site', $id ) ) { + wpmu_delete_blog( $id, true ); + wp_redirect( add_query_arg( array( 'updated' => 'true', 'action' => 'delete' ), wp_get_referer() ) ); + } else { + wp_redirect( add_query_arg( array( 'updated' => 'true', 'action' => 'not_deleted' ), wp_get_referer() ) ); + } + + exit(); + break; + + case 'allblogs': + if ( ( isset( $_POST['action'] ) || isset( $_POST['action2'] ) ) && isset( $_POST['allblogs'] ) ) { + check_admin_referer( 'bulk-sites' ); + + if ( ! current_user_can( 'manage_sites' ) ) + wp_die( __( 'You do not have permission to access this page.' ) ); + + if ( $_GET['action'] != -1 || $_POST['action2'] != -1 ) + $doaction = $_POST['action'] != -1 ? $_POST['action'] : $_POST['action2']; + + $blogfunction = ''; + + foreach ( (array) $_POST['allblogs'] as $key => $val ) { + if ( $val != '0' && $val != $current_site->blog_id ) { + switch ( $doaction ) { + case 'delete': + if ( ! current_user_can( 'delete_site', $val ) ) + wp_die( __( 'You are not allowed to delete the site.' ) ); + $blogfunction = 'all_delete'; + wpmu_delete_blog( $val, true ); + break; + + case 'spam': + $blogfunction = 'all_spam'; + update_blog_status( $val, 'spam', '1' ); + set_time_limit( 60 ); + break; + + case 'notspam': + $blogfunction = 'all_notspam'; + update_blog_status( $val, 'spam', '0' ); + set_time_limit( 60 ); + break; + } + } else { + wp_die( __( 'You are not allowed to change the current site.' ) ); + } + } + + wp_redirect( add_query_arg( array( 'updated' => 'true', 'action' => $blogfunction ), wp_get_referer() ) ); + } else { + wp_redirect( network_admin_url( 'sites.php' ) ); + } + exit(); + break; + + case 'archiveblog': + check_admin_referer( 'archiveblog' ); + if ( ! current_user_can( 'manage_sites' ) ) + wp_die( __( 'You do not have permission to access this page.' ) ); + + update_blog_status( $id, 'archived', '1' ); + wp_redirect( add_query_arg( array( 'updated' => 'true', 'action' => 'archive' ), wp_get_referer() ) ); + exit(); + break; + + case 'unarchiveblog': + check_admin_referer( 'unarchiveblog' ); + if ( ! current_user_can( 'manage_sites' ) ) + wp_die( __( 'You do not have permission to access this page.' ) ); + + update_blog_status( $id, 'archived', '0' ); + wp_redirect( add_query_arg( array( 'updated' => 'true', 'action' => 'unarchive' ), wp_get_referer() ) ); + exit(); + break; + + case 'activateblog': + check_admin_referer( 'activateblog' ); + if ( ! current_user_can( 'manage_sites' ) ) + wp_die( __( 'You do not have permission to access this page.' ) ); + + update_blog_status( $id, 'deleted', '0' ); + do_action( 'activate_blog', $id ); + wp_redirect( add_query_arg( array( 'updated' => 'true', 'action' => 'activate' ), wp_get_referer() ) ); + exit(); + break; + + case 'deactivateblog': + check_admin_referer( 'deactivateblog' ); + if ( ! current_user_can( 'manage_sites' ) ) + wp_die( __( 'You do not have permission to access this page.' ) ); + + do_action( 'deactivate_blog', $id ); + update_blog_status( $id, 'deleted', '1' ); + wp_redirect( add_query_arg( array( 'updated' => 'true', 'action' => 'deactivate' ), wp_get_referer() ) ); + exit(); + break; + + case 'unspamblog': + check_admin_referer( 'unspamblog' ); + if ( ! current_user_can( 'manage_sites' ) ) + wp_die( __( 'You do not have permission to access this page.' ) ); + + update_blog_status( $id, 'spam', '0' ); + wp_redirect( add_query_arg( array( 'updated' => 'true', 'action' => 'unspam' ), wp_get_referer() ) ); + exit(); + break; + + case 'spamblog': + check_admin_referer( 'spamblog' ); + if ( ! current_user_can( 'manage_sites' ) ) + wp_die( __( 'You do not have permission to access this page.' ) ); + + update_blog_status( $id, 'spam', '1' ); + wp_redirect( add_query_arg( array( 'updated' => 'true', 'action' => 'spam' ), wp_get_referer() ) ); + exit(); + break; + + case 'unmatureblog': + check_admin_referer( 'unmatureblog' ); + if ( ! current_user_can( 'manage_sites' ) ) + wp_die( __( 'You do not have permission to access this page.' ) ); + + update_blog_status( $id, 'mature', '0' ); + wp_redirect( add_query_arg( array( 'updated' => 'true', 'action' => 'unmature' ), wp_get_referer() ) ); + exit(); + break; + + case 'matureblog': + check_admin_referer( 'matureblog' ); + if ( ! current_user_can( 'manage_sites' ) ) + wp_die( __( 'You do not have permission to access this page.' ) ); + + update_blog_status( $id, 'mature', '1' ); + wp_redirect( add_query_arg( array( 'updated' => 'true', 'action' => 'mature' ), wp_get_referer() ) ); + exit(); + break; + + // Common + case 'confirm': + check_admin_referer( 'confirm' ); + if ( !headers_sent() ) { + nocache_headers(); + header( 'Content-Type: text/html; charset=utf-8' ); + } + if ( $current_site->blog_id == $id ) + wp_die( __( 'You are not allowed to change the current site.' ) ); + ?> + + > + + <?php _e( 'WordPress › Confirm your action' ); ?> + + + + + +

    WordPress

    +
    + + + + +

    + +
    + + + '; + confirm_delete_users( $_POST['allusers'] ); + echo '
    '; + require_once( '../admin-footer.php' ); + } else { + wp_redirect( network_admin_url( 'users.php' ) ); + } + exit(); + break; + + case 'allusers': + if ( !current_user_can( 'manage_network_users' ) ) + wp_die( __( 'You do not have permission to access this page.' ) ); + + if ( ( isset( $_POST['action']) || isset($_POST['action2'] ) ) && isset( $_POST['allusers'] ) ) { + check_admin_referer( 'bulk-users-network' ); + + if ( $_GET['action'] != -1 || $_POST['action2'] != -1 ) + $doaction = $_POST['action'] != -1 ? $_POST['action'] : $_POST['action2']; + + $userfunction = ''; + + foreach ( (array) $_POST['allusers'] as $key => $val ) { + if ( !empty( $val ) ) { + switch ( $doaction ) { + case 'delete': + if ( ! current_user_can( 'delete_users' ) ) + wp_die( __( 'You do not have permission to access this page.' ) ); + $title = __( 'Users' ); + $parent_file = 'users.php'; + require_once( '../admin-header.php' ); + echo '
    '; + confirm_delete_users( $_POST['allusers'] ); + echo '
    '; + require_once( '../admin-footer.php' ); + exit(); + break; + + case 'spam': + $user = new WP_User( $val ); + if ( in_array( $user->user_login, get_super_admins() ) ) + wp_die( sprintf( __( 'Warning! User cannot be modified. The user %s is a network administrator.' ), esc_html( $user->user_login ) ) ); + + $userfunction = 'all_spam'; + $blogs = get_blogs_of_user( $val, true ); + foreach ( (array) $blogs as $key => $details ) { + if ( $details->userblog_id != $current_site->blog_id ) // main blog not a spam ! + update_blog_status( $details->userblog_id, 'spam', '1' ); + } + update_user_status( $val, 'spam', '1' ); + break; + + case 'notspam': + $userfunction = 'all_notspam'; + $blogs = get_blogs_of_user( $val, true ); + foreach ( (array) $blogs as $key => $details ) + update_blog_status( $details->userblog_id, 'spam', '0' ); + + update_user_status( $val, 'spam', '0' ); + break; + } + } + } + + wp_redirect( add_query_arg( array( 'updated' => 'true', 'action' => $userfunction ), wp_get_referer() ) ); + } else { + $location = network_admin_url( 'users.php' ); + + if ( ! empty( $_REQUEST['paged'] ) ) + $location = add_query_arg( 'paged', (int) $_REQUEST['paged'], $location ); + wp_redirect( $location ); + } + exit(); + break; + + case 'dodelete': + check_admin_referer( 'ms-users-delete' ); + if ( ! ( current_user_can( 'manage_network_users' ) && current_user_can( 'delete_users' ) ) ) + wp_die( __( 'You do not have permission to access this page.' ) ); + + if ( ! empty( $_POST['blog'] ) && is_array( $_POST['blog'] ) ) { + foreach ( $_POST['blog'] as $id => $users ) { + foreach ( $users as $blogid => $user_id ) { + if ( ! current_user_can( 'delete_user', $id ) ) + continue; + + if ( ! empty( $_POST['delete'] ) && 'reassign' == $_POST['delete'][$blogid][$id] ) + remove_user_from_blog( $id, $blogid, $user_id ); + else + remove_user_from_blog( $id, $blogid ); + } + } + } + $i = 0; + if ( is_array( $_POST['user'] ) && ! empty( $_POST['user'] ) ) + foreach( $_POST['user'] as $id ) { + if ( ! current_user_can( 'delete_user', $id ) ) + continue; + wpmu_delete_user( $id ); + $i++; + } + + if ( $i == 1 ) + $deletefunction = 'delete'; + else + $deletefunction = 'all_delete'; + + wp_redirect( add_query_arg( array( 'updated' => 'true', 'action' => $deletefunction ), network_admin_url( 'users.php' ) ) ); + exit(); + break; + + default: + // Let plugins use us as a post handler easily + do_action( 'network_admin_edit_' . $_GET['action'] ); + wp_redirect( network_admin_url( 'index.php' ) ); + exit(); + break; +} +?> diff --git a/src/wp-admin/network/index-extra.php b/src/wp-admin/network/index-extra.php new file mode 100644 index 0000000..17ead78 --- /dev/null +++ b/src/wp-admin/network/index-extra.php @@ -0,0 +1,13 @@ +' . __('Until WordPress 3.0, running multiple sites required using WordPress MU instead of regular WordPress. In version 3.0, these applications have merged. If you are a former MU user, you should be aware of the following changes:') . '

    ' . + '
    • ' . __('Site Admin is now Super Admin (we highly encourage you to get yourself a cape!).') . '
    • ' . + '
    • ' . __('Blogs are now called Sites; Site is now called Network.') . '
    ' . + '

    ' . __('The Right Now box provides the network administrator with links to the screens to either create a new site or user, or to search existing users and sites. Screen for Sites and Users are also accessible through the left-hand navigation in the Network Admin section.') . '

    ' . + '

    ' . __('For more information:') . '

    ' . + '

    ' . __('Documentation on the Network Admin') . '

    ' . + '

    ' . __('Support Forums') . '

    ' +); + +wp_dashboard_setup(); + +wp_enqueue_script( 'dashboard' ); +wp_enqueue_script( 'plugin-install' ); +wp_admin_css( 'dashboard' ); +wp_admin_css( 'plugin-install' ); +add_thickbox(); + +add_screen_option('layout_columns', array('max' => 4, 'default' => 2) ); + +require_once( '../admin-header.php' ); + +?> + +
    + +

    + +
    + + + +
    +
    + +
    + + diff --git a/src/wp-admin/network/menu.php b/src/wp-admin/network/menu.php new file mode 100644 index 0000000..c33d47a --- /dev/null +++ b/src/wp-admin/network/menu.php @@ -0,0 +1,86 @@ +response) ) + $theme_update_count = count( $update_themes->response ); + $menu[15] = array(sprintf( __( 'Themes %s' ), "" . number_format_i18n( $theme_update_count ) . "" ), 'manage_network_themes', 'themes.php', '', 'menu-top menu-icon-appearance', 'menu-appearance', 'div' ); +} else { + $menu[15] = array( __( 'Themes' ), 'manage_network_themes', 'themes.php', '', 'menu-top menu-icon-appearance', 'menu-appearance', 'div' ); +} +$submenu['themes.php'][5] = array( __('Installed Themes'), 'manage_network_themes', 'themes.php' ); +$submenu['themes.php'][10] = array( _x('Add New', 'theme'), 'install_themes', 'theme-install.php' ); +$submenu['themes.php'][15] = array( _x('Editor', 'theme editor'), 'edit_themes', 'theme-editor.php' ); + +if ( current_user_can( 'update_plugins' ) ) { + $update_plugins = get_site_transient( 'update_plugins' ); + if ( !empty($update_plugins->response) ) + $plugin_update_count = count( $update_plugins->response ); + $menu[20] = array( sprintf( __( 'Plugins %s' ), "" . number_format_i18n( $plugin_update_count ) . "" ), 'manage_network_plugins', 'plugins.php', '', 'menu-top menu-icon-plugins', 'menu-plugins', 'div'); +} else { + $menu[20] = array( __('Plugins'), 'manage_network_plugins', 'plugins.php', '', 'menu-top menu-icon-plugins', 'menu-plugins', 'div' ); +} +$submenu['plugins.php'][5] = array( __('Installed Plugins'), 'manage_network_plugins', 'plugins.php' ); +$submenu['plugins.php'][10] = array( _x('Add New', 'plugin editor'), 'install_plugins', 'plugin-install.php' ); +$submenu['plugins.php'][15] = array( _x('Editor', 'plugin editor'), 'edit_plugins', 'plugin-editor.php' ); + + +$menu[25] = array(__('Settings'), 'manage_network_options', 'settings.php', '', 'menu-top menu-icon-settings', 'menu-settings', 'div'); +if ( defined( 'MULTISITE' ) && defined( 'WP_ALLOW_MULTISITE' ) && WP_ALLOW_MULTISITE ) { + $submenu['settings.php'][5] = array( __('Network Settings'), 'manage_network_options', 'settings.php' ); + $submenu['settings.php'][10] = array( __('Network Setup'), 'manage_network_options', 'setup.php' ); +} + +if ( current_user_can( 'update_core' ) ) { + $update_wordpress = get_core_updates( array('dismissed' => false) ); + if ( !empty($update_wordpress) && !in_array( $update_wordpress[0]->response, array('development', 'latest') ) ) + $wordpress_update_count = 1; + + $update_count = $plugin_update_count + $theme_update_count + $wordpress_update_count; + $update_title = array(); + if ( $wordpress_update_count ) + $update_title[] = sprintf(__('%d WordPress Update'), $wordpress_update_count); + if ( $plugin_update_count ) + $update_title[] = sprintf(_n('%d Plugin Update', '%d Plugin Updates', $plugin_update_count), $plugin_update_count); + if ( $theme_update_count ) + $update_title[] = sprintf(_n('%d Theme Update', '%d Theme Updates', $theme_update_count), $theme_update_count); + + $update_title = !empty($update_title) ? esc_attr(implode(', ', $update_title)) : ''; + + $menu[30] = array( sprintf( __( 'Updates %s' ), "" . number_format_i18n($update_count) . "" ), 'manage_network', 'upgrade.php', '', 'menu-top menu-icon-tools', 'menu-update', 'div' ); +} else { + $menu[30] = array( __( 'Updates' ), 'manage_network', 'upgrade.php', '', 'menu-top menu-icon-tools', 'menu-update', 'div' ); +} + +$submenu[ 'upgrade.php' ][10] = array( __( 'Available Updates' ), 'update_core', 'update-core.php' ); +$submenu[ 'upgrade.php' ][15] = array( __( 'Update Network' ), 'manage_network', 'upgrade.php' ); +unset($plugin_update_count, $theme_update_count, $wordpress_update_count, $update_count, $update_title, $update_themes, $update_plugins, $update_wordpress); + + +$menu[99] = array( '', 'read', 'separator-last', '', 'wp-menu-separator-last' ); + +require_once(ABSPATH . 'wp-admin/includes/menu.php'); + +?> \ No newline at end of file diff --git a/src/wp-admin/network/plugin-editor.php b/src/wp-admin/network/plugin-editor.php new file mode 100644 index 0000000..8850aa8 --- /dev/null +++ b/src/wp-admin/network/plugin-editor.php @@ -0,0 +1,16 @@ +' . __('This screen sets and changes options for the network as a whole. The first site is the main site in the network and network options are pulled from that original site’s options.') . '

    ' . + '

    ' . __('Operational settings has fields for the network’s name and admin email.') . '

    ' . + '

    ' . __('Dashboard Site is an option to give a site to users who do not have a site on the system. Their default role is Subscriber, but that default can be changed. The Admin Notice Feed can provide a notice on all dashboards of the latest post via RSS or Atom, or provide no such notice if left blank.') . '

    ' . + '

    ' . __('Registration settings can disable/enable public signups. If you let others sign up for a site, install spam plugins. Spaces, not commas, should separate names banned as sites for this network.') . '

    ' . + '

    ' . __('New site settings are defaults applied when a new site is created in the network. These include welcome email for when a new site or user account is registered, and what᾿s put in the first post, page, comment, comment author, and comment URL.') . '

    ' . + '

    ' . __('Upload settings control the size of the uploaded files and the amount of available upload space for each site. You can change the default value for specific sites when you edit a particular site. Allowed file types are also listed (space separated only).') . '

    ' . + '

    ' . __('Checkboxes for media upload buttons set which are shown in the visual editor. If unchecked, a generic upload button is still visible; other media types can still be uploaded if on the allowed file types list.') . '

    ' . + '

    ' . __('Menu setting enables/disables the plugin menus from appearing for non super admins, so that only super admins, not site admins, have access to activate plugins.') . '

    ' . + '

    ' . __('Super admins can no longer be added on the Options screen. You must now go to the list of existing users on Network Admin > Users and click on Username or the Edit action link below that name. This goes to an Edit User page where you can check a box to grant super admin privileges.') . '

    ' . + '

    ' . __('For more information:') . '

    ' . + '

    ' . __('Documentation on Network Settings') . '

    ' . + '

    ' . __('Support Forums') . '

    ' +); + +include( '../admin-header.php' ); + +if (isset($_GET['updated'])) { + ?> +

    + + +
    + +

    +
    + +

    + + + + + + + + + + +
    + +
    + +
    + +
    + support@%s is recommended.' ), $current_site->domain ); ?> +
    +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    + NOBLOGREDIRECT in wp-config.php to a URL you will redirect visitors to if they visit a non-existent site.' ); + ?> +
    + +
    + +
    + " size="45" /> +
    + +
    + + +
    + +
    + +
    + +
    +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    +

    + + + + + + + + + + + + + + + + + + + + + +

    +
    +
    +
    +
    ' ); ?>
    + + +

    + + + + + +
    + +
    + + +

    + + + + + + + + + + +
    +
    + + diff --git a/src/wp-admin/network/setup.php b/src/wp-admin/network/setup.php new file mode 100644 index 0000000..e5d5880 --- /dev/null +++ b/src/wp-admin/network/setup.php @@ -0,0 +1,16 @@ +' . __('The menu is for editing information specific to individual sites, particularly if the admin area of a site is unavailable.') . '

    ' . + '

    ' . __('Info - The domain and path are rarely edited as this can cause the site to not work properly. The Registered date and Last Updated date are displayed. Network admins can mark a site as archived, spam, deleted and mature, to remove from public listings or disable.') . '

    ' . + '

    ' . __('Users - This displays the users associated with this site. You can also change their role, reset their password, or remove them from the site. Removing the user from the site does not remove the user from the network.') . '

    ' . + '

    ' . sprintf( __('Themes - This area shows themes that are not already enabled across the network. Enabling a theme in this menu makes it accessible to this site. It does not activate the theme, but allows it to show in the site’s Appearance menu. To enable a theme for the entire network, see the Network Themes screen.' ), network_admin_url( 'themes.php' ) ) . '

    ' . + '

    ' . __('Settings - This page shows a list of all settings associated with this site. Some are created by WordPress and others are created by plugins you activate. Note that some fields are grayed out and say Serialized Data. You cannot modify these values due to the way the setting is stored in the database.') . '

    ' . + '

    ' . __('For more information:') . '

    ' . + '

    ' . __('Documentation on Site Management') . '

    ' . + '

    ' . __('Support Forums') . '

    ' +); + +$id = isset( $_REQUEST['id'] ) ? intval( $_REQUEST['id'] ) : 0; + +if ( ! $id ) + wp_die( __('Invalid site ID.') ); + +$details = get_blog_details( $id ); +if ( !can_edit_network( $details->site_id ) ) + wp_die( __( 'You do not have permission to access this page.' ) ); + +$is_main_site = is_main_site( $id ); + +if ( isset($_REQUEST['action']) && 'update-site' == $_REQUEST['action'] ) { + check_admin_referer( 'edit-site' ); + + switch_to_blog( $id ); + + if ( isset( $_POST['update_home_url'] ) && $_POST['update_home_url'] == 'update' ) { + $blog_address = get_blogaddress_by_domain( $_POST['blog']['domain'], $_POST['blog']['path'] ); + if ( get_option( 'siteurl' ) != $blog_address ) + update_option( 'siteurl', $blog_address ); + + if ( get_option( 'home' ) != $blog_address ) + update_option( 'home', $blog_address ); + } + + // rewrite rules can't be flushed during switch to blog + delete_option( 'rewrite_rules' ); + + // update blogs table + $blog_data = stripslashes_deep( $_POST['blog'] ); + $existing_details = get_blog_details( $id, false ); + $blog_data_checkboxes = array( 'public', 'archived', 'spam', 'mature', 'deleted' ); + foreach ( $blog_data_checkboxes as $c ) { + if ( ! in_array( $existing_details->$c, array( 0, 1 ) ) ) + $blog_data[ $c ] = $existing_details->$c; + else + $blog_data[ $c ] = isset( $_POST['blog'][ $c ] ) ? 1 : 0; + } + update_blog_details( $id, $blog_data ); + + restore_current_blog(); + wp_redirect( add_query_arg( array( 'update' => 'updated', 'id' => $id ), 'site-info.php') ); + exit; +} + +if ( isset($_GET['update']) ) { + $messages = array(); + if ( 'updated' == $_GET['update'] ) + $messages[] = __('Site info updated.'); +} + +$site_url_no_http = preg_replace( '#^http(s)?://#', '', get_blogaddress_by_id( $id ) ); +$title_site_url_linked = sprintf( __('Edit Site: %2$s'), get_blogaddress_by_id( $id ), $site_url_no_http ); +$title = sprintf( __('Edit Site: %s'), $site_url_no_http ); + +$parent_file = 'sites.php'; +$submenu_file = 'sites.php'; + +require('../admin-header.php'); + +?> + +
    + +

    + +

    ' . $msg . '

    '; +} ?> +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + __( 'Public' ) ); + if ( ! $is_main_site ) { + $attribute_fields['archived'] = __( 'Archived' ); + $attribute_fields['spam'] = _x( 'Spam', 'site' ); + $attribute_fields['deleted'] = __( 'Deleted' ); + } + $attribute_fields['mature'] = __( 'Mature' ); + ?> + + + + +
    domain ) ?>
    path ) ?> +
    /> siteurl and home as well.' ); ?>
    + $field_label ) : ?> +
    + +
    + +
    + +
    +' . __('This screen is for Super Admins to add new sites to the network. This is not affected by the registration settings.') . '

    ' . + '

    ' . __('If the admin email for the new site does not exist in the database, a new user will also be created.') . '

    ' . + '

    ' . __('For more information:') . '

    ' . + '

    ' . __('Documentation on Site Management') . '

    ' . + '

    ' . __('Support Forums') . '

    ' +); + +if ( isset($_REQUEST['action']) && 'add-site' == $_REQUEST['action'] ) { + check_admin_referer( 'add-blog', '_wpnonce_add-blog' ); + + if ( ! current_user_can( 'manage_sites' ) ) + wp_die( __( 'You do not have permission to access this page.' ) ); + + if ( ! is_array( $_POST['blog'] ) ) + wp_die( __( 'Can’t create an empty site.' ) ); + $blog = $_POST['blog']; + $domain = ''; + if ( ! preg_match( '/(--)/', $blog['domain'] ) && preg_match( '|^([a-zA-Z0-9-])+$|', $blog['domain'] ) ) + $domain = strtolower( $blog['domain'] ); + + // If not a subdomain install, make sure the domain isn't a reserved word + if ( ! is_subdomain_install() ) { + $subdirectory_reserved_names = apply_filters( 'subdirectory_reserved_names', array( 'page', 'comments', 'blog', 'files', 'feed' ) ); + if ( in_array( $domain, $subdirectory_reserved_names ) ) + wp_die( sprintf( __('The following words are reserved for use by WordPress functions and cannot be used as blog names: %s' ), implode( ', ', $subdirectory_reserved_names ) ) ); + } + + $email = sanitize_email( $blog['email'] ); + $title = $blog['title']; + + if ( empty( $domain ) ) + wp_die( __( 'Missing or invalid site address.' ) ); + if ( empty( $email ) ) + wp_die( __( 'Missing email address.' ) ); + if ( !is_email( $email ) ) + wp_die( __( 'Invalid email address.' ) ); + + if ( is_subdomain_install() ) { + $newdomain = $domain . '.' . preg_replace( '|^www\.|', '', $current_site->domain ); + $path = $base; + } else { + $newdomain = $current_site->domain; + $path = $base . $domain . '/'; + } + + $password = 'N/A'; + $user_id = email_exists($email); + if ( !$user_id ) { // Create a new user with a random password + $password = wp_generate_password( 12, false ); + $user_id = wpmu_create_user( $domain, $password, $email ); + if ( false == $user_id ) + wp_die( __( 'There was an error creating the user.' ) ); + else + wp_new_user_notification( $user_id, $password ); + } + + $wpdb->hide_errors(); + $id = wpmu_create_blog( $newdomain, $path, $title, $user_id , array( 'public' => 1 ), $current_site->id ); + $wpdb->show_errors(); + if ( !is_wp_error( $id ) ) { + if ( !is_super_admin( $user_id ) && !get_user_option( 'primary_blog', $user_id ) ) + update_user_option( $user_id, 'primary_blog', $id, true ); + $content_mail = sprintf( __( "New site created by %1s\n\nAddress: http://%2s\nName: %3s"), $current_user->user_login , $newdomain . $path, stripslashes( $title ) ); + wp_mail( get_site_option('admin_email'), sprintf( __( '[%s] New Site Created' ), $current_site->site_name ), $content_mail, 'From: "Site Admin" <' . get_site_option( 'admin_email' ) . '>' ); + wpmu_welcome_notification( $id, $user_id, $password, $title, array( 'public' => 1 ) ); + wp_redirect( add_query_arg( array('update' => 'added'), 'site-new.php' ) ); + exit; + } else { + wp_die( $id->get_error_message() ); + } +} + +if ( isset($_GET['update']) ) { + $messages = array(); + if ( 'added' == $_GET['update'] ) + $messages[] = __('Site added.'); +} + +$title = __('Add New Site'); +$parent_file = 'sites.php'; + +require('../admin-header.php'); + +?> + +
    + +

    +

    ' . $msg . '

    '; +} ?> +
    + + + + + + + + + + + + + + + + + +
    + + .domain );?> + domain . $current_site->path ?> + ' . __( 'Only the characters a-z and 0-9 recommended.' ) . '

    '; + ?> +

    + +
    +
    + diff --git a/src/wp-admin/network/site-settings.php b/src/wp-admin/network/site-settings.php new file mode 100644 index 0000000..35bcb43 --- /dev/null +++ b/src/wp-admin/network/site-settings.php @@ -0,0 +1,153 @@ +' . __('The menu is for editing information specific to individual sites, particularly if the admin area of a site is unavailable.') . '

    ' . + '

    ' . __('Info - The domain and path are rarely edited as this can cause the site to not work properly. The Registered date and Last Updated date are displayed. Network admins can mark a site as archived, spam, deleted and mature, to remove from public listings or disable.') . '

    ' . + '

    ' . __('Users - This displays the users associated with this site. You can also change their role, reset their password, or remove them from the site. Removing the user from the site does not remove the user from the network.') . '

    ' . + '

    ' . sprintf( __('Themes - This area shows themes that are not already enabled across the network. Enabling a theme in this menu makes it accessible to this site. It does not activate the theme, but allows it to show in the site’s Appearance menu. To enable a theme for the entire network, see the Network Themes screen.' ), network_admin_url( 'themes.php' ) ) . '

    ' . + '

    ' . __('Settings - This page shows a list of all settings associated with this site. Some are created by WordPress and others are created by plugins you activate. Note that some fields are grayed out and say Serialized Data. You cannot modify these values due to the way the setting is stored in the database.') . '

    ' . + '

    ' . __('For more information:') . '

    ' . + '

    ' . __('Documentation on Site Management') . '

    ' . + '

    ' . __('Support Forums') . '

    ' +); + +$id = isset( $_REQUEST['id'] ) ? intval( $_REQUEST['id'] ) : 0; + +if ( ! $id ) + wp_die( __('Invalid site ID.') ); + +$details = get_blog_details( $id ); +if ( !can_edit_network( $details->site_id ) ) + wp_die( __( 'You do not have permission to access this page.' ) ); + +$is_main_site = is_main_site( $id ); + +if ( isset($_REQUEST['action']) && 'update-site' == $_REQUEST['action'] && is_array( $_POST['option'] ) ) { + check_admin_referer( 'edit-site' ); + + switch_to_blog( $id ); + + $c = 1; + $count = count( $_POST['option'] ); + $skip_options = array( 'allowedthemes' ); // Don't update these options since they are handled elsewhere in the form. + foreach ( (array) $_POST['option'] as $key => $val ) { + if ( $key === 0 || is_array( $val ) || in_array($key, $skip_options) ) + continue; // Avoids "0 is a protected WP option and may not be modified" error when edit blog options + if ( $c == $count ) + update_option( $key, stripslashes( $val ) ); + else + update_option( $key, stripslashes( $val ), false ); // no need to refresh blog details yet + $c++; + } + + do_action( 'wpmu_update_blog_options' ); + restore_current_blog(); + wp_redirect( add_query_arg( array( 'update' => 'updated', 'id' => $id ), 'site-settings.php') ); + exit; +} + +if ( isset($_GET['update']) ) { + $messages = array(); + if ( 'updated' == $_GET['update'] ) + $messages[] = __('Site options updated.'); +} + +$site_url_no_http = preg_replace( '#^http(s)?://#', '', get_blogaddress_by_id( $id ) ); +$title_site_url_linked = sprintf( __('Edit Site: %2$s'), get_blogaddress_by_id( $id ), $site_url_no_http ); +$title = sprintf( __('Edit Site: %s'), $site_url_no_http ); + +$parent_file = 'sites.php'; +$submenu_file = 'sites.php'; + +require('../admin-header.php'); + +?> + +
    + +

    + +

    ' . $msg . '

    '; +} ?> +
    + + + + get_blog_prefix( $id ); + $options = $wpdb->get_results( "SELECT * FROM {$blog_prefix}options WHERE option_name NOT LIKE '\_%' AND option_name NOT LIKE '%user_roles'" ); + foreach ( $options as $option ) { + if ( $option->option_name == 'default_role' ) + $editblog_default_role = $option->option_value; + $disabled = false; + $class = 'all-options'; + if ( is_serialized( $option->option_value ) ) { + if ( is_serialized_string( $option->option_value ) ) { + $option->option_value = esc_html( maybe_unserialize( $option->option_value ), 'single' ); + } else { + $option->option_value = 'SERIALIZED DATA'; + $disabled = true; + $class = 'all-options disabled'; + } + } + if ( strpos( $option->option_value, "\n" ) !== false ) { + ?> + + + + + + + + option_name, array( 'siteurl', 'home' ) ) ) { ?> + + + + + + +
    option_name ) ) ?>
    option_name ) ) ); ?>option_value ) ?> />
    + +
    + + +' . __('The menu is for editing information specific to individual sites, particularly if the admin area of a site is unavailable.') . '

    ' . + '

    ' . __('Info - The domain and path are rarely edited as this can cause the site to not work properly. The Registered date and Last Updated date are displayed. Network admins can mark a site as archived, spam, deleted and mature, to remove from public listings or disable.') . '

    ' . + '

    ' . __('Users - This displays the users associated with this site. You can also change their role, reset their password, or remove them from the site. Removing the user from the site does not remove the user from the network.') . '

    ' . + '

    ' . sprintf( __('Themes - This area shows themes that are not already enabled across the network. Enabling a theme in this menu makes it accessible to this site. It does not activate the theme, but allows it to show in the site’s Appearance menu. To enable a theme for the entire network, see the Network Themes screen.' ), network_admin_url( 'themes.php' ) ) . '

    ' . + '

    ' . __('Settings - This page shows a list of all settings associated with this site. Some are created by WordPress and others are created by plugins you activate. Note that some fields are grayed out and say Serialized Data. You cannot modify these values due to the way the setting is stored in the database.') . '

    ' . + '

    ' . __('For more information:') . '

    ' . + '

    ' . __('Documentation on Site Management') . '

    ' . + '

    ' . __('Support Forums') . '

    ' +); + +$wp_list_table = _get_list_table('WP_MS_Themes_List_Table'); + +$action = $wp_list_table->current_action(); + +$s = isset($_REQUEST['s']) ? $_REQUEST['s'] : ''; + +// Clean up request URI from temporary args for screen options/paging uri's to work as expected. +$temp_args = array( 'enabled', 'disabled', 'error' ); +$_SERVER['REQUEST_URI'] = remove_query_arg( $temp_args, $_SERVER['REQUEST_URI'] ); +$referer = remove_query_arg( $temp_args, wp_get_referer() ); + +$id = isset( $_REQUEST['id'] ) ? intval( $_REQUEST['id'] ) : 0; + +if ( ! $id ) + wp_die( __('Invalid site ID.') ); + +$wp_list_table->prepare_items(); + +$details = get_blog_details( $id ); +if ( !can_edit_network( $details->site_id ) ) + wp_die( __( 'You do not have permission to access this page.' ) ); + +$is_main_site = is_main_site( $id ); + +if ( $action ) { + switch_to_blog( $id ); + $allowed_themes = get_option( 'allowedthemes' ); + + switch ( $action ) { + case 'enable': + check_admin_referer( 'enable-theme_' . $_GET['theme'] ); + $theme = $_GET['theme']; + $action = 'enabled'; + $n = 1; + if ( !$allowed_themes ) + $allowed_themes = array( $theme => true ); + else + $allowed_themes[$theme] = true; + break; + case 'disable': + check_admin_referer( 'disable-theme_' . $_GET['theme'] ); + $theme = $_GET['theme']; + $action = 'disabled'; + $n = 1; + if ( !$allowed_themes ) + $allowed_themes = array(); + else + unset( $allowed_themes[$theme] ); + break; + case 'enable-selected': + check_admin_referer( 'bulk-themes' ); + if ( isset( $_POST['checked'] ) ) { + $themes = (array) $_POST['checked']; + $action = 'enabled'; + $n = count( $themes ); + foreach( (array) $themes as $theme ) + $allowed_themes[ $theme ] = true; + } else { + $action = 'error'; + $n = 'none'; + } + break; + case 'disable-selected': + check_admin_referer( 'bulk-themes' ); + if ( isset( $_POST['checked'] ) ) { + $themes = (array) $_POST['checked']; + $action = 'disabled'; + $n = count( $themes ); + foreach( (array) $themes as $theme ) + unset( $allowed_themes[ $theme ] ); + } else { + $action = 'error'; + $n = 'none'; + } + break; + } + + update_option( 'allowedthemes', $allowed_themes ); + restore_current_blog(); + + wp_redirect( add_query_arg( $action, $n, $referer ) ); + exit; +} + +if ( isset( $_GET['action'] ) && 'update-site' == $_GET['action'] ) { + wp_redirect( $referer ); + exit(); +} + +add_thickbox(); +add_screen_option( 'per_page', array( 'label' => _x( 'Themes', 'themes per page (screen options)' ) ) ); + +$site_url_no_http = preg_replace( '#^http(s)?://#', '', get_blogaddress_by_id( $id ) ); +$title_site_url_linked = sprintf( __('Edit Site: %2$s'), get_blogaddress_by_id( $id ), $site_url_no_http ); +$title = sprintf( __('Edit Site: %s'), $site_url_no_http ); + +$parent_file = 'sites.php'; +$submenu_file = 'sites.php'; + +require('../admin-header.php'); ?> + +
    + +

    +

    ' . sprintf( _n( 'Theme enabled.', '%s themes enabled.', $_GET['enabled'] ), number_format_i18n( $_GET['enabled'] ) ) . '

    '; +} elseif ( isset( $_GET['disabled'] ) ) { + $_GET['disabled'] = absint( $_GET['disabled'] ); + echo '

    ' . sprintf( _n( 'Theme disabled.', '%s themes disabled.', $_GET['disabled'] ), number_format_i18n( $_GET['disabled'] ) ) . '

    '; +} elseif ( isset( $_GET['error'] ) && 'none' == $_GET['error'] ) { + echo '

    ' . __( 'No theme selected.' ) . '

    '; +} ?> + +

    + +
    +search_box( __( 'Search Installed Themes' ), 'theme' ); ?> + +
    + +views(); ?> + +
    + + + +display(); ?> + +
    + + + diff --git a/src/wp-admin/network/site-users.php b/src/wp-admin/network/site-users.php new file mode 100644 index 0000000..82788af --- /dev/null +++ b/src/wp-admin/network/site-users.php @@ -0,0 +1,311 @@ +prepare_items(); + +$action = $wp_list_table->current_action(); + +add_contextual_help($current_screen, + '

    ' . __('The menu is for editing information specific to individual sites, particularly if the admin area of a site is unavailable.') . '

    ' . + '

    ' . __('Info - The domain and path are rarely edited as this can cause the site to not work properly. The Registered date and Last Updated date are displayed. Network admins can mark a site as archived, spam, deleted and mature, to remove from public listings or disable.') . '

    ' . + '

    ' . __('Users - This displays the users associated with this site. You can also change their role, reset their password, or remove them from the site. Removing the user from the site does not remove the user from the network.') . '

    ' . + '

    ' . sprintf( __('Themes - This area shows themes that are not already enabled across the network. Enabling a theme in this menu makes it accessible to this site. It does not activate the theme, but allows it to show in the site’s Appearance menu. To enable a theme for the entire network, see the Network Themes screen.' ), network_admin_url( 'themes.php' ) ) . '

    ' . + '

    ' . __('Settings - This page shows a list of all settings associated with this site. Some are created by WordPress and others are created by plugins you activate. Note that some fields are grayed out and say Serialized Data. You cannot modify these values due to the way the setting is stored in the database.') . '

    ' . + '

    ' . __('For more information:') . '

    ' . + '

    ' . __('Documentation on Site Management') . '

    ' . + '

    ' . __('Support Forums') . '

    ' +); + +$id = isset( $_REQUEST['id'] ) ? intval( $_REQUEST['id'] ) : 0; + +if ( ! $id ) + wp_die( __('Invalid site ID.') ); + +$details = get_blog_details( $id ); +if ( !can_edit_network( $details->site_id ) ) + wp_die( __( 'You do not have permission to access this page.' ) ); + +$is_main_site = is_main_site( $id ); + +// get blog prefix +$blog_prefix = $wpdb->get_blog_prefix( $id ); + +// @todo This is a hack. Eventually, add API to WP_Roles allowing retrieval of roles for a particular blog. +if ( ! empty($wp_roles->use_db) ) { + $editblog_roles = get_blog_option( $id, "{$blog_prefix}user_roles" ); +} else { + // Roles are stored in memory, not the DB. + $editblog_roles = $wp_roles->roles; +} +$default_role = get_blog_option( $id, 'default_role' ); + +$action = $wp_list_table->current_action(); + +if ( $action ) { + switch_to_blog( $id ); + + switch ( $action ) { + case 'newuser': + check_admin_referer( 'add-user', '_wpnonce_add-new-user' ); + $user = $_POST['user']; + if ( !is_array( $_POST['user'] ) || empty( $user['username'] ) || empty( $user['email'] ) ) { + $update = 'err_new'; + } else { + $password = wp_generate_password( 12, false); + $user_id = wpmu_create_user( esc_html( strtolower( $user['username'] ) ), $password, esc_html( $user['email'] ) ); + + if ( false == $user_id ) { + $update = 'err_new_dup'; + } else { + wp_new_user_notification( $user_id, $password ); + add_user_to_blog( $id, $user_id, $_POST['new_role'] ); + $update = 'newuser'; + } + } + break; + + case 'adduser': + check_admin_referer( 'add-user', '_wpnonce_add-user' ); + if ( !empty( $_POST['newuser'] ) ) { + $update = 'adduser'; + $newuser = $_POST['newuser']; + $userid = $wpdb->get_var( $wpdb->prepare( "SELECT ID FROM " . $wpdb->users . " WHERE user_login = %s", $newuser ) ); + if ( $userid ) { + $user = $wpdb->get_var( "SELECT user_id FROM " . $wpdb->usermeta . " WHERE user_id='$userid' AND meta_key='{$blog_prefix}capabilities'" ); + if ( $user == false ) + add_user_to_blog( $id, $userid, $_POST['new_role'] ); + else + $update = 'err_add_member'; + } else { + $update = 'err_add_notfound'; + } + } else { + $update = 'err_add_notfound'; + } + break; + + case 'remove': + if ( !current_user_can('remove_users') ) + die(__('You can’t remove users.')); + check_admin_referer( 'bulk-users' ); + + $update = 'remove'; + if ( isset( $_REQUEST['users'] ) ) { + $userids = $_REQUEST['users']; + + foreach ( $userids as $user_id ) { + $user_id = (int) $user_id; + remove_user_from_blog( $user_id, $id ); + } + } elseif ( isset( $_GET['user'] ) ) { + remove_user_from_blog( $_GET['user'] ); + } else { + $update = 'err_remove'; + } + break; + + case 'promote': + check_admin_referer( 'bulk-users' ); + $editable_roles = get_editable_roles(); + if ( empty( $editable_roles[$_REQUEST['new_role']] ) ) + wp_die(__('You can’t give users that role.')); + + if ( isset( $_REQUEST['users'] ) ) { + $userids = $_REQUEST['users']; + $update = 'promote'; + foreach ( $userids as $user_id ) { + $user_id = (int) $user_id; + + // If the user doesn't already belong to the blog, bail. + if ( !is_user_member_of_blog( $user_id ) ) + wp_die(__('Cheatin’ uh?')); + + $user = new WP_User( $user_id ); + $user->set_role( $_REQUEST['new_role'] ); + } + } else { + $update = 'err_promote'; + } + break; + } + + restore_current_blog(); + wp_redirect( add_query_arg( 'update', $update, wp_get_referer() ) ); + exit(); +} + +if ( isset( $_GET['action'] ) && 'update-site' == $_GET['action'] ) { + wp_redirect( wp_get_referer() ); + exit(); +} + +add_screen_option( 'per_page', array( 'label' => _x( 'Users', 'users per page (screen options)' ) ) ); + +$site_url_no_http = preg_replace( '#^http(s)?://#', '', get_blogaddress_by_id( $id ) ); +$title_site_url_linked = sprintf( __('Edit Site: %2$s'), get_blogaddress_by_id( $id ), $site_url_no_http ); +$title = sprintf( __('Edit Site: %s'), $site_url_no_http ); + +$parent_file = 'sites.php'; +$submenu_file = 'sites.php'; + +require('../admin-header.php'); ?> + +
    + +

    +

    ' . __( 'User added.' ) . '

    '; + break; + case 'err_add_member': + echo '

    ' . __( 'User is already a member of this site.' ) . '

    '; + break; + case 'err_add_notfound': + echo '

    ' . __( 'Enter the username of an existing user.' ) . '

    '; + break; + case 'promote': + echo '

    ' . __( 'Changed roles.' ) . '

    '; + break; + case 'err_promote': + echo '

    ' . __( 'Select a user to change role.' ) . '

    '; + break; + case 'remove': + echo '

    ' . __( 'User removed from this site.' ) . '

    '; + break; + case 'err_remove': + echo '

    ' . __( 'Select a user to remove.' ) . '

    '; + break; + case 'newuser': + echo '

    ' . __( 'User created.' ) . '

    '; + break; + case 'err_new': + echo '

    ' . __( 'Enter the username and email.' ) . '

    '; + break; + case 'err_new_dup': + echo '

    ' . __( 'Duplicated username or email address.' ) . '

    '; + break; + } +endif; ?> + +
    +search_box( __( 'Search Users' ), 'user' ); ?> + +
    + +views(); ?> + +
    + + + +display(); ?> + +
    + + + + +

    + +

    + +

    + +
    +
    + + + + + + + + + + + +
    + + 'submit-add-existing-user' ) ); ?> +
    + + + +
    +
    + + + + + + + + + + + + + + + + + + +
    + + 'submit-add-user' ) ); ?> +
    + + +get_pagenum(); + +$title = __( 'Sites' ); +$parent_file = 'sites.php'; + +add_screen_option( 'per_page', array('label' => _x( 'Sites', 'sites per page (screen options)' )) ); + +add_contextual_help($current_screen, + '

    ' . __('Add New takes you to the Add New Site screen. You can search for a site by Name, ID number, or IP address. Screen Options allows you to choose how many sites to display on one page.') . '

    ' . + '

    ' . __('This is the main table of all sites on this network. Switch between list and excerpt views by using the icons above the right side of the table.') . '

    ' . + '

    ' . __('Hovering over each site reveals seven options (three for the primary site):') . '

    ' . + '
    • ' . __('An Edit link to a separate Edit Site screen.') . '
    • ' . + '
    • ' . __('Dashboard leads to the Dashboard for that site.') . '
    • ' . + '
    • ' . __('Deactivate, Archive, and Spam which lead to confirmation screens. These actions can be reversed later.') . '
    • ' . + '
    • ' . __('Delete which is a permanent action after the confirmation screens.') . '
    • ' . + '
    • ' . __('Visit to go to the frontend site live.') . '
    ' . + '

    ' . __('The site ID is used internally, and is not shown on the front end of the site or to users/viewers.') . '

    ' . + '

    ' . __('Clicking on bold headings can re-sort this table.') . '

    ' . + '

    ' . __('For more information:') . '

    ' . + '

    ' . __('Documentation on Site Management') . '

    ' . + '

    ' . __('Support Forums') . '

    ' +); + +$id = isset( $_REQUEST['id'] ) ? intval( $_REQUEST['id'] ) : 0; + +$msg = ''; +if ( isset( $_REQUEST['updated'] ) && $_REQUEST['updated'] == 'true' && ! empty( $_REQUEST['action'] ) ) { + switch ( $_REQUEST['action'] ) { + case 'all_notspam': + $msg = __( 'Sites removed from spam.' ); + break; + case 'all_spam': + $msg = __( 'Sites marked as spam.' ); + break; + case 'all_delete': + $msg = __( 'Sites deleted.' ); + break; + case 'delete': + $msg = __( 'Site deleted.' ); + break; + case 'not_deleted': + $msg = __( 'You do not have permission to delete that site.' ); + break; + case 'archive': + $msg = __( 'Site archived.' ); + break; + case 'unarchive': + $msg = __( 'Site unarchived.' ); + break; + case 'activate': + $msg = __( 'Site activated.' ); + break; + case 'deactivate': + $msg = __( 'Site deactivated.' ); + break; + case 'unspam': + $msg = __( 'Site removed from spam.' ); + break; + case 'spam': + $msg = __( 'Site marked as spam.' ); + break; + default: + $msg = apply_filters( 'network_sites_updated_message_' . $_REQUEST['action'] , __( 'Settings saved.' ) ); + break; + } + if ( $msg ) + $msg = '

    ' . $msg . '

    '; +} + +$wp_list_table->prepare_items(); + +require_once( '../admin-header.php' ); +?> + +
    + +

    + + + + + +' . __( 'Search results for “%s”' ) . '', esc_html( $s ) ); +} ?> +

    + + + +
    + display(); ?> +
    +
    + diff --git a/src/wp-admin/network/theme-editor.php b/src/wp-admin/network/theme-editor.php new file mode 100644 index 0000000..f6ac9c2 --- /dev/null +++ b/src/wp-admin/network/theme-editor.php @@ -0,0 +1,16 @@ +get_pagenum(); + +$action = $wp_list_table->current_action(); + +$s = isset($_REQUEST['s']) ? $_REQUEST['s'] : ''; + +// Clean up request URI from temporary args for screen options/paging uri's to work as expected. +$temp_args = array( 'enabled', 'disabled', 'deleted', 'error' ); +$_SERVER['REQUEST_URI'] = remove_query_arg( $temp_args, $_SERVER['REQUEST_URI'] ); +$referer = remove_query_arg( $temp_args, wp_get_referer() ); + +if ( $action ) { + $allowed_themes = get_site_option( 'allowedthemes' ); + switch ( $action ) { + case 'enable': + check_admin_referer('enable-theme_' . $_GET['theme']); + $allowed_themes[ $_GET['theme'] ] = true; + update_site_option( 'allowedthemes', $allowed_themes ); + wp_redirect( add_query_arg( 'enabled', '1', $referer ) ); + exit; + break; + case 'disable': + check_admin_referer('disable-theme_' . $_GET['theme']); + unset( $allowed_themes[ $_GET['theme'] ] ); + update_site_option( 'allowedthemes', $allowed_themes ); + wp_redirect( add_query_arg( 'disabled', '1', $referer ) ); + exit; + break; + case 'enable-selected': + check_admin_referer('bulk-themes'); + $themes = isset( $_POST['checked'] ) ? (array) $_POST['checked'] : array(); + if ( empty($themes) ) { + wp_redirect( add_query_arg( 'error', 'none', $referer ) ); + exit; + } + foreach( (array) $themes as $theme ) + $allowed_themes[ $theme ] = true; + update_site_option( 'allowedthemes', $allowed_themes ); + wp_redirect( add_query_arg( 'enabled', count( $themes ), $referer ) ); + exit; + break; + case 'disable-selected': + check_admin_referer('bulk-themes'); + $themes = isset( $_POST['checked'] ) ? (array) $_POST['checked'] : array(); + if ( empty($themes) ) { + wp_redirect( add_query_arg( 'error', 'none', $referer ) ); + exit; + } + foreach( (array) $themes as $theme ) + unset( $allowed_themes[ $theme ] ); + update_site_option( 'allowedthemes', $allowed_themes ); + wp_redirect( add_query_arg( 'disabled', count( $themes ), $referer ) ); + exit; + break; + case 'delete-selected': + if ( ! current_user_can( 'delete_themes' ) ) + wp_die( __('You do not have sufficient permissions to delete themes for this site.') ); + check_admin_referer( 'bulk-themes' ); + + $themes = isset( $_REQUEST['checked'] ) ? (array) $_REQUEST['checked'] : array(); + + if ( isset( $themes[ get_option( 'template' ) ] ) ) + unset( $themes[ get_option( 'template' ) ] ); + if ( isset( $themes[ get_option( 'stylesheet' ) ] ) ) + unset( $themes[ get_option( 'stylesheet' ) ] ); + + if ( empty( $themes ) ) { + wp_redirect( add_query_arg( 'error', 'none', $referer ) ); + exit; + } + + $main_theme = get_current_theme(); + $files_to_delete = $theme_info = array(); + foreach ( $themes as $key => $theme ) { + $data = get_theme_data( WP_CONTENT_DIR . '/themes/' . $theme . '/style.css' ); + if ( $data['Name'] == $main_theme ) { + unset( $themes[$key] ); + } else { + $files_to_delete = array_merge( $files_to_delete, list_files( WP_CONTENT_DIR . "/themes/$theme" ) ); + $theme_info[ $theme ] = $data; + } + } + + if ( empty( $themes ) ) { + wp_redirect( add_query_arg( 'error', 'main', $referer ) ); + exit; + } + + include(ABSPATH . 'wp-admin/update.php'); + + $parent_file = 'themes.php'; + + if ( ! isset( $_REQUEST['verify-delete'] ) ) { + wp_enqueue_script( 'jquery' ); + require_once( ABSPATH . 'wp-admin/admin-header.php' ); + ?> +
    + ' . _n( 'Delete Theme', 'Delete Themes', $themes_to_delete ) . ''; + ?> +

    +

    +
      + ', sprintf( __('%1$s by %2$s' ), esc_html( $theme['Name'] ), esc_html( $theme['AuthorName'] ) ), ''; /* translators: 1: theme name, 2: theme author */ ?> +
    +

    +
    + + + '; + ?> + + +
    +
    + +
    + +

    + +
    + 1), $_SERVER['REQUEST_URI'] ) ) ); + $paged = ( $_REQUEST['paged'] ) ? $_REQUEST['paged'] : 1; + wp_redirect( network_admin_url( "themes.php?deleted=".count( $themes )."&paged=$paged&s=$s" ) ); + exit; + break; + } +} + +$wp_list_table->prepare_items(); + +add_thickbox(); + +add_screen_option( 'per_page', array('label' => _x( 'Themes', 'themes per page (screen options)' )) ); + +add_contextual_help($current_screen, + '

    ' . __('This screen enables and disables the inclusion of themes available to choose in the Appearance menu for each site. It does not activate or deactivate which theme a site is currently using.') . '

    ' . + '

    ' . __('If the network admin disables a theme that is in use, it can still remain selected on that site. If another theme is chosen, the disabled theme will not appear in the site’s Appearance > Themes screen.') . '

    ' . + '

    ' . __('Themes can be enabled on a site by site basis by the network admin on the Edit Site screen (which has a Themes tab); get there via the Edit action link on the All Sites screen. Only network admins are able to install or edit themes.') . '

    ' . + '

    ' . __('For more information:') . '

    ' . + '

    ' . __('Documentation on Network Themes') . '

    ' . + '

    ' . __('Support Forums') . '

    ' +); + +$title = __('Themes'); +$parent_file = 'themes.php'; + +require_once(ABSPATH . 'wp-admin/admin-header.php'); + +?> + +
    + +

    ' . __('Search results for “%s”') . '', esc_html( $s ) ); ?> +

    + +

    ' . sprintf( _n( 'Theme enabled.', '%s themes enabled.', $_GET['enabled'] ), number_format_i18n( $_GET['enabled'] ) ) . '

    '; +} elseif ( isset( $_GET['disabled'] ) ) { + $_GET['disabled'] = absint( $_GET['disabled'] ); + echo '

    ' . sprintf( _n( 'Theme disabled.', '%s themes disabled.', $_GET['disabled'] ), number_format_i18n( $_GET['disabled'] ) ) . '

    '; +} elseif ( isset( $_GET['deleted'] ) ) { + $_GET['deleted'] = absint( $_GET['deleted'] ); + echo '

    ' . sprintf( _nx( 'Theme deleted.', '%s themes deleted.', $_GET['deleted'], 'network' ), number_format_i18n( $_GET['deleted'] ) ) . '

    '; +} elseif ( isset( $_GET['error'] ) && 'none' == $_GET['error'] ) { + echo '

    ' . __( 'No theme selected.' ) . '

    '; +} elseif ( isset( $_GET['error'] ) && 'main' == $_GET['error'] ) { + echo '

    ' . __( 'You cannot delete a theme while it is active on the main site.' ) . '

    '; +} + +?> + +
    +search_box( __( 'Search Installed Themes' ), 'theme' ); ?> +
    + +views(); ?> + +
    + + + +display(); ?> +
    + + + +' . __('Only use this screen once you have updated to a new version of WordPress through Updates/Available Updates (via the Network Administration navigation menu or the Admin Bar). Clicking the Update Network button will step through each site in the network, five at a time, and make sure any database updates are applied.') . '

    ' . + '

    ' . __('If a version update to core has not happened, clicking this button won’t affect anything.') . '

    ' . + '

    ' . __('If this process fails for any reason, users logging in to their sites will force the same update.') . '

    ' . + '

    ' . __('For more information:') . '

    ' . + '

    ' . __('Documentation on Update Network') . '

    ' . + '

    ' . __('Support Forums') . '

    ' +); + +require_once('../admin-header.php'); + +if ( ! current_user_can( 'manage_network' ) ) + wp_die( __( 'You do not have permission to access this page.' ) ); + +echo '
    '; +screen_icon('tools'); +echo '

    ' . __( 'Update Network' ) . '

    '; + +$action = isset($_GET['action']) ? $_GET['action'] : 'show'; + +switch ( $action ) { + case "upgrade": + $n = ( isset($_GET['n']) ) ? intval($_GET['n']) : 0; + + if ( $n < 5 ) { + global $wp_db_version; + update_site_option( 'wpmu_upgrade_site', $wp_db_version ); + } + + $blogs = $wpdb->get_results( "SELECT * FROM {$wpdb->blogs} WHERE site_id = '{$wpdb->siteid}' AND spam = '0' AND deleted = '0' AND archived = '0' ORDER BY registered DESC LIMIT {$n}, 5", ARRAY_A ); + if ( empty( $blogs ) ) { + echo '

    ' . __( 'All done!' ) . '

    '; + break; + } + echo "
      "; + foreach ( (array) $blogs as $details ) { + $siteurl = get_blog_option( $details['blog_id'], 'siteurl' ); + echo "
    • $siteurl
    • "; + $response = wp_remote_get( trailingslashit( $siteurl ) . "wp-admin/upgrade.php?step=upgrade_db", array( 'timeout' => 120, 'httpversion' => '1.1' ) ); + if ( is_wp_error( $response ) ) + wp_die( sprintf( __( 'Warning! Problem updating %1$s. Your server may not be able to connect to sites running on it. Error message: %2$s' ), $siteurl, $response->get_error_message() ) ); + do_action( 'after_mu_upgrade', $response ); + do_action( 'wpmu_upgrade_site', $details[ 'blog_id' ] ); + } + echo "
    "; + ?>

    +

    +

    +
    + + diff --git a/src/wp-admin/network/user-edit.php b/src/wp-admin/network/user-edit.php new file mode 100644 index 0000000..0b2cfd2 --- /dev/null +++ b/src/wp-admin/network/user-edit.php @@ -0,0 +1,16 @@ +' . __('Add User will set up a new user account on the network and send that person an email with username and password.') . '

    ' . + '

    ' . __('Users who are signed up to the network without a site are added as subscribers to the main or primary dashboard site, giving them profile pages to manage their accounts. These users will only see Dashboard and My Sites in the main navigation until a site is created for them.') . '

    ' . + '

    ' . __('For more information:') . '

    ' . + '

    ' . __('Documentation on Network Users') . '

    ' . + '

    ' . __('Support Forums') . '

    ' +); + +if ( isset($_REQUEST['action']) && 'add-user' == $_REQUEST['action'] ) { + check_admin_referer( 'add-user', '_wpnonce_add-user' ); + if ( ! current_user_can( 'manage_network_users' ) ) + wp_die( __( 'You do not have permission to access this page.' ) ); + + if ( ! is_array( $_POST['user'] ) ) + wp_die( __( 'Cannot create an empty user.' ) ); + + $user = $_POST['user']; + + $user_details = wpmu_validate_user_signup( $user['username'], $user['email'] ); + if ( is_wp_error( $user_details[ 'errors' ] ) && ! empty( $user_details[ 'errors' ]->errors ) ) { + $add_user_errors = $user_details[ 'errors' ]; + } else { + $password = wp_generate_password( 12, false); + $user_id = wpmu_create_user( esc_html( strtolower( $user['username'] ) ), $password, esc_html( $user['email'] ) ); + + if ( ! $user_id ) { + $add_user_errors = new WP_Error( 'add_user_fail', __( 'Cannot add user.' ) ); + } else { + wp_new_user_notification( $user_id, $password ); + wp_redirect( add_query_arg( array('update' => 'added'), 'user-new.php' ) ); + exit; + } + } +} + +if ( isset($_GET['update']) ) { + $messages = array(); + if ( 'added' == $_GET['update'] ) + $messages[] = __('User added.'); +} + +$title = __('Add New User'); +$parent_file = 'users.php'; + +require('../admin-header.php'); ?> + +
    + +

    +

    ' . $msg . '

    '; +} + +if ( isset( $add_user_errors ) && is_wp_error( $add_user_errors ) ) { ?> +
    + get_error_messages() as $message ) + echo "

    $message

    "; + ?> +
    + +
    + + + + + + + + + + + + +
    + + +
    + + diff --git a/src/wp-admin/network/users.php b/src/wp-admin/network/users.php new file mode 100644 index 0000000..44a6c9c --- /dev/null +++ b/src/wp-admin/network/users.php @@ -0,0 +1,96 @@ +get_pagenum(); +$wp_list_table->prepare_items(); +$total_pages = $wp_list_table->get_pagination_arg( 'total_pages' ); + +if ( $pagenum > $total_pages && $total_pages > 0 ) { + wp_redirect( add_query_arg( 'paged', $total_pages ) ); + exit; +} +$title = __( 'Users' ); +$parent_file = 'users.php'; + +add_screen_option( 'per_page', array('label' => _x( 'Users', 'users per page (screen options)' )) ); + +add_contextual_help($current_screen, + '

    ' . __('This table shows all users across the network and the sites to which they are assigned.') . '

    ' . + '

    ' . __('Hover over any user on the list to make the edit links appear. The Edit link on the left will take you to his or her Edit User profile page; the Edit link on the right by any site name goes to an Edit Site screen for that site.') . '

    ' . + '

    ' . __('You can also go to the user’s profile page by clicking on the individual username.') . '

    ' . + '

    ' . __('You can sort the table by clicking on any of the bold headings and switch between list and excerpt views by using the icons in the upper right.') . '

    ' . + '

    ' . __('The bulk action will permanently delete selected users, or mark/unmark those selected as spam. Spam users will have posts removed and will be unable to sign up again with the same email addresses.') . '

    ' . + '

    ' . __('You can make an existing user an additional super admin by going to the Edit User profile page and checking the box to grant that privilege.') . '

    ' . + '

    ' . __('For more information:') . '

    ' . + '

    ' . __('Documentation on Network Users') . '

    ' . + '

    ' . __('Support Forums') . '

    ' +); + +require_once( '../admin-header.php' ); + +if ( isset( $_REQUEST['updated'] ) && $_REQUEST['updated'] == 'true' && ! empty( $_REQUEST['action'] ) ) { + ?> +

    + +

    + +
    + +

    + ' . __( 'Search results for “%s”' ) . '', esc_html( $usersearch ) ); + ?> +

    + + views(); ?> + +
    + search_box( __( 'Search Users' ), 'user' ); ?> +
    + +
    + display(); ?> +
    +
    + + diff --git a/src/wp-admin/options-discussion.php b/src/wp-admin/options-discussion.php new file mode 100644 index 0000000..862b002 --- /dev/null +++ b/src/wp-admin/options-discussion.php @@ -0,0 +1,248 @@ +' . __('This screen provides many options for controlling the management and display of comments and links to your posts/pages. So many, in fact, they won’t all fit here! :) Use the documentation link below to get information on what each discussion setting does.') . '

    ' . + '

    ' . __('You must click the Save Changes button at the bottom of the screen for new settings to take effect.') . '

    ' . + '

    ' . __('For more information:') . '

    ' . + '

    ' . __('Documentation on Discussion Settings') . '

    ' . + '

    ' . __('Support Forums') . '

    ' +); + +include('./admin-header.php'); +?> + +
    + +

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    +

    + +

    +

    + +

    +
    +

    +

    + +

    +
    + +

    + +

    + + + + + + + + + + + + + + + + + +
    + __( 'Don’t show Avatars' ), 1 => __( 'Show Avatars' ) ); + foreach ( $yesorno as $key => $value) { + $selected = (get_option('show_avatars') == $key) ? 'checked="checked"' : ''; + echo "\n\t
    "; + } +?> +
    + + __('G — Suitable for all audiences'), + /* translators: Content suitability rating: http://bit.ly/89QxZA */ + 'PG' => __('PG — Possibly offensive, usually for audiences 13 and above'), + /* translators: Content suitability rating: http://bit.ly/89QxZA */ + 'R' => __('R — Intended for adult audiences above 17'), + /* translators: Content suitability rating: http://bit.ly/89QxZA */ + 'X' => __('X — Even more mature than above') +); +foreach ($ratings as $key => $rating) : + $selected = (get_option('avatar_rating') == $key) ? 'checked="checked"' : ''; + echo "\n\t
    "; +endforeach; +?> + +
    + +
    + + __('Mystery Man'), + 'blank' => __('Blank'), + 'gravatar_default' => __('Gravatar Logo'), + 'identicon' => __('Identicon (Generated)'), + 'wavatar' => __('Wavatar (Generated)'), + 'monsterid' => __('MonsterID (Generated)'), + 'retro' => __('Retro (Generated)') +); +$avatar_defaults = apply_filters('avatar_defaults', $avatar_defaults); +$default = get_option('avatar_default'); +if ( empty($default) ) + $default = 'mystery'; +$size = 32; +$avatar_list = ''; +foreach ( $avatar_defaults as $default_key => $default_name ) { + $selected = ($default == $default_key) ? 'checked="checked" ' : ''; + $avatar_list .= "\n\t'; + $avatar_list .= '
    '; +} +echo apply_filters('default_avatar_select', $avatar_list); +?> + +
    + + + + +
    +
    + + diff --git a/src/wp-admin/options-general.php b/src/wp-admin/options-general.php new file mode 100644 index 0000000..3f8a7b7 --- /dev/null +++ b/src/wp-admin/options-general.php @@ -0,0 +1,318 @@ + + +' . __('The fields on this screen determine some of the basics of your site setup.') . '

    ' . + '

    ' . __('Most themes display the site title at the top of every page, in the title bar of the browser, and as the identifying name for syndicated feeds. The tagline is also displayed by many themes.') . '

    ' . + '

    ' . __('The WordPress URL and the Site URL can be the same (example.com) or different; for example, having the WordPress core files (example.com/wordpress) in a subdirectory instead of the root directory.') . '

    ' . + '

    ' . __('If you want site visitors to be able to register themselves, as opposed to being registered by the site administrator, check the membership box. A default user role can be set for all new users, whether self-registered or registered by the site administrator.') . '

    ' . + '

    ' . __('UTC means Coordinated Universal Time.') . '

    ' . + '

    ' . __('Remember to click the Save Changes button at the bottom of the screen for new settings to take effect.') . '

    ' . + '

    ' . __('For more information:') . '

    ' . + '

    ' . __('Documentation on General Settings') . '

    ' . + '

    ' . __('Support Forums') . '

    ' +); + +include('./admin-header.php'); +?> + +
    + +

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    class="regular-text code" />
    class="regular-text code" /> +to be different from the directory you installed WordPress.'); ?>
    +
    +
    + +
    +The new address will not become active until confirmed.') ?> + +
    +

    %1$s. Cancel'), esc_html( $new_admin_email ), esc_url( admin_url( 'options.php?dismiss=new_admin_email' ) ) ); ?>

    +
    + +
    + + + + UTC time is %s'), date_i18n($timezone_format, false, 'gmt')); ?> + + %1$s'), date_i18n($timezone_format)); ?> + +
    + + +
    + + +
    + $right_now ) { + $found = true; + break; + } + } + + if ( $found ) { + echo ' '; + $message = $tr['isdst'] ? + __('Daylight saving time begins on: %s.') : + __('Standard time begins on: %s.'); + // Add the difference between the current offset and the new offset to ts to get the correct transition time from date_i18n(). + printf( $message, date_i18n(get_option('date_format') . ' ' . get_option('time_format'), $tr['ts'] + ($tz_offset - $tr['offset']) ) ); + } else { + _e('This timezone does not observe daylight saving time.'); + } + } + // Set back to UTC. + date_default_timezone_set('UTC'); + ?> +
    + +
    +
    + ' . date_i18n( $format ) . "
    \n"; + } + + echo ' ' . date_i18n( get_option('date_format') ) . " \n"; + + echo "\t

    " . __('Documentation on date and time formatting.') . "

    \n"; +?> +
    +
    +
    + ' . date_i18n( $format ) . "
    \n"; + } + + echo ' ' . date_i18n( get_option('time_format') ) . " \n"; + ; +?> +
    +
    + +
    + + + + +
    + +
    + + diff --git a/src/wp-admin/options-head.php b/src/wp-admin/options-head.php new file mode 100644 index 0000000..7f2cc74 --- /dev/null +++ b/src/wp-admin/options-head.php @@ -0,0 +1,21 @@ + \ No newline at end of file diff --git a/src/wp-admin/options-media.php b/src/wp-admin/options-media.php new file mode 100644 index 0000000..6e3a29c --- /dev/null +++ b/src/wp-admin/options-media.php @@ -0,0 +1,141 @@ +' . __('You can set maximum sizes for images inserted into your written content; you can also insert an image as Full Size.') . '

    ' . + '

    ' . __('The Embed option allows you embed a video, image, or other media content into your content automatically by typing the URL (of the web page where the file lives) on its own line when you create your content.') . '

    ' . + ( is_multisite() ? '' : '

    ' . __('Uploading Options gives you folder and path choices for storing your files in your installation’s directory.') . '

    ' ) . + '

    ' . __('You must click the Save Changes button at the bottom of the screen for new settings to take effect.') . '

    ' . + '

    ' . __('For more information:') . '

    ' . + '

    ' . __('Documentation on Media Settings') . '

    ' . + '

    ' . __('Support Forums') . '

    ' +); + +include('./admin-header.php'); + +?> + +
    + +

    + +
    + + +

    +

    + + + + + + + + + + + + + + + + + + +
    + + + +
    +/> + +
    + + + + +
    + + + + +
    + +

    + + + + + + + + + + + + + + +
    + +
    + + + + +' . __("If the width value is left blank, embeds will default to the max width of your theme."); ?> +
    + + +

    + + + + + + + + + + + + + + + + +
    +wp-content/uploads'); ?> +
    + +
    + +
    + + + + + + +
    + +
    + + diff --git a/src/wp-admin/options-permalink.php b/src/wp-admin/options-permalink.php new file mode 100644 index 0000000..50aa32e --- /dev/null +++ b/src/wp-admin/options-permalink.php @@ -0,0 +1,260 @@ +' . __('This screen provides some common options for your default permalinks URL structure.') . '

    ' . + '

    ' . __('If you pick an option other than Default, your general URL path with structure tags, terms surrounded by %, will also appear in the custom structure field and your path can be further modified there.') . '

    ' . + '

    ' . __('When you assign multiple categories or tags to a post, only one can show up in the permalink: the lowest numbered category. This applies if your custom structure includes %category% or %tag%.') . '

    ' . + '

    ' . __('Note that permalinks beginning with the category, tag, author or postname structure tags require more advanced server resources. Double-check your hosting details to make sure those are in place or start your permalinks with other structure tags.') . '

    ' . + '

    ' . __('The Optional fields let you customize the “category” and “tag” base names that will appear in archive URLs. For example, the page listing all posts in the “Uncategorized” category could be /topics/uncategorized instead of /category/uncategorized.') . '

    ' . + '

    ' . __('You must click the Save Changes button at the bottom of the screen for new settings to take effect.') . '

    ' . + '

    ' . __('For more information:') . '

    ' . + '

    ' . __('Documentation on Permalinks Settings') . '

    ' . + '

    ' . __('Documentation on Using Permalinks') . '

    ' . + '

    ' . __('Support Forums') . '

    ' +); + +/** + * Display JavaScript on the page. + * + * @package WordPress + * @subpackage Permalink_Settings_Screen + */ +function add_js() { + ?> + +set_permalink_structure( $permalink_structure ); + } + + if ( isset( $_POST['category_base'] ) ) { + $category_base = $_POST['category_base']; + if ( ! empty( $category_base ) ) + $category_base = $blog_prefix . preg_replace('#/+#', '/', '/' . str_replace( '#', '', $category_base ) ); + $wp_rewrite->set_category_base( $category_base ); + } + + if ( isset( $_POST['tag_base'] ) ) { + $tag_base = $_POST['tag_base']; + if ( ! empty( $tag_base ) ) + $tag_base = $blog_prefix . preg_replace('#/+#', '/', '/' . str_replace( '#', '', $tag_base ) ); + $wp_rewrite->set_tag_base( $tag_base ); + } + + create_initial_taxonomies(); +} + +$permalink_structure = get_option('permalink_structure'); +$category_base = get_option('category_base'); +$tag_base = get_option( 'tag_base' ); + +if ( $iis7_permalinks ) { + if ( ( ! file_exists($home_path . 'web.config') && win_is_writable($home_path) ) || win_is_writable($home_path . 'web.config') ) + $writable = true; + else + $writable = false; +} else { + if ( ( ! file_exists($home_path . '.htaccess') && is_writable($home_path) ) || is_writable($home_path . '.htaccess') ) + $writable = true; + else + $writable = false; +} + +if ( $wp_rewrite->using_index_permalinks() ) + $usingpi = true; +else + $usingpi = false; + +$wp_rewrite->flush_rules(); + + +if (isset($_POST['submit'])) : ?> +

    +

    + + +
    + +

    + +
    + + +

    URLs which have question marks and lots of numbers in them, however WordPress offers you the ability to create a custom URL structure for your permalinks and archives. This can improve the aesthetics, usability, and forward-compatibility of your links. A number of tags are available, and here are some examples to get you started.'); ?>

    + + +

    + + + + + + + + + + + + + + + + + + + + + +
    /?p=123
    /archives/123
    + + + + +
    + +

    + +

    URLs here. For example, using topics as your category base would make your category links like http://example.org/topics/uncategorized/. If you leave these blank the defaults will be used.') ?>

    + +

    URLs here. For example, using topics as your category base would make your category links like http://example.org/index.php/topics/uncategorized/. If you leave these blank the defaults will be used.') ?>

    + + + + + + + + + + + + +
    + + + + +
    + + +

    web.config file were writable, we could do this automatically, but it isn’t so this is the url rewrite rule you should have in your web.config file. Click in the field and press CTRL + a to select all. Then insert this rule inside of the /<configuration>/<system.webServer>/<rewrite>/<rules> element in web.config file.') ?>

    +
    + +

    +
    +

    web.config file writable for us to generate rewrite rules automatically, do not forget to revert the permissions after rule has been saved.') ?>

    + +

    writable, we could do this automatically, but it isn’t so this is the url rewrite rule you should have in your web.config file. Create a new file, called web.config in the root directory of your site. Click in the field and press CTRL + a to select all. Then insert this code into the web.config file.') ?>

    +
    + +

    +
    +

    web.config file automatically, do not forget to revert the permissions after the file has been created.') ?>

    + + + +

    .htaccess file were writable, we could do this automatically, but it isn’t so these are the mod_rewrite rules you should have in your .htaccess file. Click in the field and press CTRL + a to select all.') ?>

    +
    + +

    +
    + + + + +
    + + diff --git a/src/wp-admin/options-privacy.php b/src/wp-admin/options-privacy.php new file mode 100644 index 0000000..9fd25bc --- /dev/null +++ b/src/wp-admin/options-privacy.php @@ -0,0 +1,58 @@ +' . __('You can choose whether or not your site will be crawled by robots, ping services, and spiders. If you want those services to ignore your site, click the second option here. Note that your privacy is not complete; your site is still visible on the web.') . '

    ' . + '

    ' . __('When this setting is in effect a reminder is shown in the Right Now box of the Dashboard that says, “Search Engines Blocked,” to remind you that your site is not being crawled.') . '

    ' . + '

    ' . __('You must click the Save Changes button at the bottom of the screen for new settings to take effect.') . '

    ' . + '

    ' . __('For more information:') . '

    ' . + '

    ' . __('Documentation on Privacy Settings') . '

    ' . + '

    ' . __('Support Forums') . '

    ' +); + +include('./admin-header.php'); +?> + +
    + +

    + +
    + + + + + + + + +
    + /> +
    + /> + + +
    + + + + +
    + +
    + + diff --git a/src/wp-admin/options-reading.php b/src/wp-admin/options-reading.php new file mode 100644 index 0000000..08c408e --- /dev/null +++ b/src/wp-admin/options-reading.php @@ -0,0 +1,131 @@ + + +' . __('This screen contains the settings that affect the display of your content.') . '

    ' . + '

    ' . sprintf(__('You can choose what’s displayed on the front page of your site. It can be posts in reverse chronological order (classic blog), or a fixed/static page. To set a static home page, you first need to create two Pages. One will become the front page, and the other will be where your posts are displayed.'), 'post-new.php?post_type=page') . '

    ' . + '

    ' . __('You can also control the display of your content in RSS feeds, including the maximum numbers of posts to display, whether to show full text or a summary, and the character set encoding.') . '

    ' . + '

    ' . __('You must click the Save Changes button at the bottom of the screen for new settings to take effect.') . '

    ' . + '

    ' . __('For more information:') . '

    ' . + '

    ' . __('Documentation on Reading Settings') . '

    ' . + '

    ' . __('Support Forums') . '

    ' +); + +include( './admin-header.php' ); +?> + +
    + +

    + +
    + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + +
    +

    +

    +

    +

    +
      +
    • +
    • +
    + +

    Warning: these pages should not be the same!' ); ?>

    + +
    + +
    +


    +

    +
    +character encoding of your site (UTF-8 is recommended, if you are adventurous there are some other encodings)' ); ?>
    + + + + +
    +
    + diff --git a/src/wp-admin/options-writing.php b/src/wp-admin/options-writing.php new file mode 100644 index 0000000..115e143 --- /dev/null +++ b/src/wp-admin/options-writing.php @@ -0,0 +1,176 @@ +' . __('You can submit content in several different ways; this screen holds the settings for all of them. The top section controls the editor within these administration screens, while the rest control external publishing methods. For more information on any of these methods, use the documentation links below.') . '

    ' . + '

    ' . __('You must click the Save Changes button at the bottom of the screen for new settings to take effect.') . '

    ' . + '

    ' . __('For more information:') . '

    ' . + '

    ' . __('Documentation on Writing Settings') . '

    ' . + '

    ' . __('Support Forums') . '

    ' +); + +include('./admin-header.php'); +?> + +
    + +

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    + +
    + 0, 'name' => 'default_category', 'orderby' => 'name', 'selected' => get_option('default_category'), 'hierarchical' => true)); +?> +
    + +
    + 0, 'name' => 'default_link_category', 'orderby' => 'name', 'selected' => get_option('default_link_category'), 'hierarchical' => true, 'taxonomy' => 'link_category')); +?> +
    + + +

    +

    +

    +

    +

    + + + +

    +

    %s, %s, %s.'), wp_generate_password(8, false), wp_generate_password(8, false), wp_generate_password(8, false)) ?>

    + + + + + + + + + + + + + + + + + + + +
    + + +
    + +
    + 0, 'name' => 'default_email_category', 'orderby' => 'name', 'selected' => get_option('default_email_category'), 'hierarchical' => true)); +?> +
    + + +

    +

    + + + + + + + + + + +
    +
    +
    +
    +
    + + +

    + + + +

    + + + + + +

    Update Services because of your site’s privacy settings.'), 'options-privacy.php'); ?>

    + + + + + + + +
    +
    + + diff --git a/src/wp-admin/options.php b/src/wp-admin/options.php new file mode 100644 index 0000000..069dcb9 --- /dev/null +++ b/src/wp-admin/options.php @@ -0,0 +1,227 @@ + array( 'blogname', 'blogdescription', 'gmt_offset', 'date_format', 'time_format', 'start_of_week', 'timezone_string' ), + 'discussion' => array( 'default_pingback_flag', 'default_ping_status', 'default_comment_status', 'comments_notify', 'moderation_notify', 'comment_moderation', 'require_name_email', 'comment_whitelist', 'comment_max_links', 'moderation_keys', 'blacklist_keys', 'show_avatars', 'avatar_rating', 'avatar_default', 'close_comments_for_old_posts', 'close_comments_days_old', 'thread_comments', 'thread_comments_depth', 'page_comments', 'comments_per_page', 'default_comments_page', 'comment_order', 'comment_registration' ), + 'media' => array( 'thumbnail_size_w', 'thumbnail_size_h', 'thumbnail_crop', 'medium_size_w', 'medium_size_h', 'large_size_w', 'large_size_h', 'image_default_size', 'image_default_align', 'image_default_link_type', 'embed_autourls', 'embed_size_w', 'embed_size_h' ), + 'privacy' => array( 'blog_public' ), + 'reading' => array( 'posts_per_page', 'posts_per_rss', 'rss_use_excerpt', 'blog_charset', 'show_on_front', 'page_on_front', 'page_for_posts' ), + 'writing' => array( 'default_post_edit_rows', 'use_smilies', 'default_category', 'default_email_category', 'use_balanceTags', 'default_link_category', 'default_post_format', 'enable_app', 'enable_xmlrpc' ), + 'options' => array( '' ) ); + +$mail_options = array('mailserver_url', 'mailserver_port', 'mailserver_login', 'mailserver_pass'); +$uploads_options = array('uploads_use_yearmonth_folders', 'upload_path', 'upload_url_path'); + +if ( !is_multisite() ) { + if ( !defined( 'WP_SITEURL' ) ) + $whitelist_options['general'][] = 'siteurl'; + if ( !defined( 'WP_HOME' ) ) + $whitelist_options['general'][] = 'home'; + + $whitelist_options['general'][] = 'admin_email'; + $whitelist_options['general'][] = 'users_can_register'; + $whitelist_options['general'][] = 'default_role'; + + $whitelist_options['writing'] = array_merge($whitelist_options['writing'], $mail_options); + $whitelist_options['writing'][] = 'ping_sites'; + + $whitelist_options['media'] = array_merge($whitelist_options['media'], $uploads_options); +} else { + $whitelist_options['general'][] = 'new_admin_email'; + $whitelist_options['general'][] = 'WPLANG'; + $whitelist_options['general'][] = 'language'; + + if ( apply_filters( 'enable_post_by_email_configuration', true ) ) + $whitelist_options['writing'] = array_merge($whitelist_options['writing'], $mail_options); + + $whitelist_options[ 'misc' ] = array(); +} + +$whitelist_options = apply_filters( 'whitelist_options', $whitelist_options ); + +/* + * If $_GET['action'] == 'update' we are saving settings sent from a settings page + */ +if ( 'update' == $action ) { + if ( 'options' == $option_page && !isset( $_POST['option_page'] ) ) { // This is for back compat and will eventually be removed. + $unregistered = true; + check_admin_referer( 'update-options' ); + } else { + $unregistered = false; + check_admin_referer( $option_page . '-options' ); + } + + if ( !isset( $whitelist_options[ $option_page ] ) ) + wp_die( __( 'Error: options page not found.' ) ); + + if ( 'options' == $option_page ) { + if ( is_multisite() && ! is_super_admin() ) + wp_die( __( 'You do not have sufficient permissions to modify unregistered settings for this site.' ) ); + $options = explode( ',', stripslashes( $_POST[ 'page_options' ] ) ); + } else { + $options = $whitelist_options[ $option_page ]; + } + + // Handle custom date/time formats + if ( 'general' == $option_page ) { + if ( !empty($_POST['date_format']) && isset($_POST['date_format_custom']) && '\c\u\s\t\o\m' == stripslashes( $_POST['date_format'] ) ) + $_POST['date_format'] = $_POST['date_format_custom']; + if ( !empty($_POST['time_format']) && isset($_POST['time_format_custom']) && '\c\u\s\t\o\m' == stripslashes( $_POST['time_format'] ) ) + $_POST['time_format'] = $_POST['time_format_custom']; + // Map UTC+- timezones to gmt_offsets and set timezone_string to empty. + if ( !empty($_POST['timezone_string']) && preg_match('/^UTC[+-]/', $_POST['timezone_string']) ) { + $_POST['gmt_offset'] = $_POST['timezone_string']; + $_POST['gmt_offset'] = preg_replace('/UTC\+?/', '', $_POST['gmt_offset']); + $_POST['timezone_string'] = ''; + } + } + + if ( $options ) { + foreach ( $options as $option ) { + if ( $unregistered ) + _deprecated_argument( 'options.php', '2.7', sprintf( __( 'The %1$s setting is unregistered. Unregistered settings are deprecated. See http://codex.wordpress.org/Settings_API' ), $option, $option_page ) ); + + $option = trim($option); + $value = null; + if ( isset($_POST[$option]) ) + $value = $_POST[$option]; + if ( !is_array($value) ) + $value = trim($value); + $value = stripslashes_deep($value); + update_option($option, $value); + } + } + + /** + * Handle settings errors and return to options page + */ + // If no settings errors were registered add a general 'updated' message. + if ( !count( get_settings_errors() ) ) + add_settings_error('general', 'settings_updated', __('Settings saved.'), 'updated'); + set_transient('settings_errors', get_settings_errors(), 30); + + /** + * Redirect back to the settings page that was submitted + */ + $goback = add_query_arg( 'settings-updated', 'true', wp_get_referer() ); + wp_redirect( $goback ); + exit; +} + +include('./admin-header.php'); ?> + +
    + +

    +
    + + + + +get_results( "SELECT * FROM $wpdb->options ORDER BY option_name" ); + +foreach ( (array) $options as $option ) : + $disabled = false; + if ( $option->option_name == '' ) + continue; + if ( is_serialized( $option->option_value ) ) { + if ( is_serialized_string( $option->option_value ) ) { + // this is a serialized string, so we should display it + $value = maybe_unserialize( $option->option_value ); + $options_to_update[] = $option->option_name; + $class = 'all-options'; + } else { + $value = 'SERIALIZED DATA'; + $disabled = true; + $class = 'all-options disabled'; + } + } else { + $value = $option->option_value; + $options_to_update[] = $option->option_name; + $class = 'all-options'; + } + $name = esc_attr( $option->option_name ); + echo " + + + +"; +endforeach; +?> +
    "; + if ( strpos( $value, "\n" ) !== false ) + echo ""; + else + echo ""; + echo "
    + + + + + +
    +
    + + + diff --git a/src/wp-admin/plugin-editor.php b/src/wp-admin/plugin-editor.php new file mode 100644 index 0000000..2c710df --- /dev/null +++ b/src/wp-admin/plugin-editor.php @@ -0,0 +1,264 @@ + time()) + (array)get_option('recently_activated')); + + wp_redirect(add_query_arg('_wpnonce', wp_create_nonce('edit-plugin-test_' . $file), "plugin-editor.php?file=$file&liveupdate=1&scrollto=$scrollto&networkwide=" . $network_wide)); + exit; + } + wp_redirect( self_admin_url("plugin-editor.php?file=$file&a=te&scrollto=$scrollto") ); + } else { + wp_redirect( self_admin_url("plugin-editor.php?file=$file&scrollto=$scrollto") ); + } + exit; + +break; + +default: + + if ( isset($_GET['liveupdate']) ) { + check_admin_referer('edit-plugin-test_' . $file); + + $error = validate_plugin($file); + if ( is_wp_error($error) ) + wp_die( $error ); + + if ( ( ! empty( $_GET['networkwide'] ) && ! is_plugin_active_for_network($file) ) || ! is_plugin_active($file) ) + activate_plugin($file, "plugin-editor.php?file=$file&phperror=1", ! empty( $_GET['networkwide'] ) ); // we'll override this later if the plugin can be included without fatal error + + wp_redirect( self_admin_url("plugin-editor.php?file=$file&a=te&scrollto=$scrollto") ); + exit; + } + + // List of allowable extensions + $editable_extensions = array('php', 'txt', 'text', 'js', 'css', 'html', 'htm', 'xml', 'inc', 'include'); + $editable_extensions = (array) apply_filters('editable_extensions', $editable_extensions); + + if ( ! is_file($real_file) ) { + wp_die(sprintf('

    %s

    ', __('No such file exists! Double check the name and try again.'))); + } else { + // Get the extension of the file + if ( preg_match('/\.([^.]+)$/', $real_file, $matches) ) { + $ext = strtolower($matches[1]); + // If extension is not in the acceptable list, skip it + if ( !in_array( $ext, $editable_extensions) ) + wp_die(sprintf('

    %s

    ', __('Files of this type are not editable.'))); + } + } + + add_contextual_help($current_screen, + '

    ' . __('You can use the editor to make changes to any of your plugins’ individual PHP files. Be aware that if you make changes, plugins updates will overwrite your customizations.') . '

    ' . + '

    ' . __('Choose a plugin to edit from the menu in the upper right and click the Select button. Click once on any file name to load it in the editor, and make your changes. Don’t forget to save your changes (Update File) when you’re finished.') . '

    ' . + '

    ' . __('The Documentation menu below the editor lists the PHP functions recognized in the plugin file. Clicking Lookup takes you to a web page about that particular function.') . '

    ' . + '

    ' . __('If you want to make changes but don’t want them to be overwritten when the plugin is updated, you may be ready to think about writing your own plugin. For information on how to edit plugins, write your own from scratch, or just better understand their anatomy, check out the links below.') . '

    ' . + ( is_network_admin() ? '

    ' . __('Any edits to files from this screen will be reflected on all sites in the network.') . '

    ' : '' ) . + '

    ' . __('For more information:') . '

    ' . + '

    ' . __('Documentation on Editing Plugins') . '

    ' . + '

    ' . __('Documentation on Writing Plugins') . '

    ' . + '

    ' . __('Support Forums') . '

    ' + ); + + require_once(ABSPATH . 'wp-admin/admin-header.php'); + + update_recently_edited(WP_PLUGIN_DIR . '/' . $file); + + $content = file_get_contents( $real_file ); + + if ( '.php' == substr( $real_file, strrpos( $real_file, '.' ) ) ) { + $functions = wp_doc_link_parse( $content ); + + if ( !empty($functions) ) { + $docs_select = ''; + } + } + + $content = esc_textarea( $content ); + ?> + +

    + +

    fatal error.') ?>

    + + + +
    + +
    + +

    + +
    +
    +%s (active)'), $file); + else + echo sprintf(__('Browsing %s (active)'), $file); + } else { + if ( is_writeable($real_file) ) + echo sprintf(__('Editing %s (inactive)'), $file); + else + echo sprintf(__('Browsing %s (inactive)'), $file); + } + ?> +
    +
    +
    + + + +
    +
    +
    +
    + +
    +

    + +
      + + > + +
    +
    +
    + +
    + + + + +
    + +
    + + + +

    Warning: Making changes to active plugins is not recommended. If your changes cause a fatal error, the plugin will be automatically deactivated.'); ?>

    + +

    + "; + submit_button( __( 'Update File and Attempt to Reactivate' ), 'primary', 'submit', false, array( 'tabindex' => '2' ) ); + } else { + submit_button( __( 'Update File' ), 'primary', 'submit', false, array( 'tabindex' => '2' ) ); + } + ?> +

    + +

    the Codex for more information.'); ?>

    + +
    +
    +
    + +get_pagenum(); +$wp_list_table->prepare_items(); + +$title = __('Install Plugins'); +$parent_file = 'plugins.php'; + +wp_enqueue_style( 'plugin-install' ); +wp_enqueue_script( 'plugin-install' ); +if ( 'plugin-information' != $tab ) + add_thickbox(); + +$body_id = $tab; + +do_action('install_plugins_pre_' . $tab); //Used to override the general interface, Eg, install or plugin information. + +add_contextual_help($current_screen, + '

    ' . sprintf(__('Plugins hook into WordPress to extend its functionality with custom features. Plugins are developed independently from WordPress core by thousands of developers all over the world. All plugins in the official WordPress.org Plugin Directory are compatible with the license WordPress uses. You can find new plugins to install by searching or browsing the Directory right here in your own Plugins section.'), 'http://wordpress.org/extend/plugins/') . '

    ' . + '

    ' . __('If you know what you’re looking for, Search is your best bet. The Search screen has options to search the WordPress.org Plugin Directory for a particular Term, Author, or Tag. You can also search the directory by selecting a popular tags. Tags in larger type mean more plugins have been labeled with that tag.') . '

    ' . + '

    ' . __('If you just want to get an idea of what’s available, you can browse Featured, Popular, Newest, and Recently Updated plugins by using the links in the upper left of the screen. These sections rotate regularly.') . '

    ' . + '

    ' . __('If you want to install a plugin that you’ve downloaded elsewhere, click Upload in the upper left. You will be prompted to upload the .zip package, and once uploaded, you can activate the new plugin.') . '

    ' . + '

    ' . __('For more information:') . '

    ' . + '

    ' . __('Documentation on Installing Plugins') . '

    ' . + '

    ' . __('Support Forums') . '

    ' +); + +include(ABSPATH . 'wp-admin/admin-header.php'); +?> +
    + +

    + +views(); ?> + +
    + +
    +get_pagenum(); + +$action = $wp_list_table->current_action(); + +$plugin = isset($_REQUEST['plugin']) ? $_REQUEST['plugin'] : ''; +$s = isset($_REQUEST['s']) ? $_REQUEST['s'] : ''; + +// Clean up request URI from temporary args for screen options/paging uri's to work as expected. +$_SERVER['REQUEST_URI'] = remove_query_arg(array('error', 'deleted', 'activate', 'activate-multi', 'deactivate', 'deactivate-multi', '_error_nonce'), $_SERVER['REQUEST_URI']); + +if ( $action ) { + $network_wide = false; + if ( ( isset( $_GET['networkwide'] ) || 'network-activate-selected' == $action ) && is_multisite() && current_user_can( 'manage_network_plugins' ) ) + $network_wide = true; + + switch ( $action ) { + case 'activate': + if ( ! current_user_can('activate_plugins') ) + wp_die(__('You do not have sufficient permissions to activate plugins for this site.')); + + check_admin_referer('activate-plugin_' . $plugin); + + $result = activate_plugin($plugin, self_admin_url('plugins.php?error=true&plugin=' . $plugin), $network_wide); + if ( is_wp_error( $result ) ) { + if ( 'unexpected_output' == $result->get_error_code() ) { + $redirect = self_admin_url('plugins.php?error=true&charsout=' . strlen($result->get_error_data()) . '&plugin=' . $plugin . "&plugin_status=$status&paged=$page&s=$s"); + wp_redirect(add_query_arg('_error_nonce', wp_create_nonce('plugin-activation-error_' . $plugin), $redirect)); + exit; + } else { + wp_die($result); + } + } + + $recent = (array)get_option('recently_activated'); + if ( isset($recent[ $plugin ]) ) { + unset($recent[ $plugin ]); + update_option('recently_activated', $recent); + } + if ( isset($_GET['from']) && 'import' == $_GET['from'] ) { + wp_redirect( self_admin_url("import.php?import=" . str_replace('-importer', '', dirname($plugin))) ); // overrides the ?error=true one above and redirects to the Imports page, stripping the -importer suffix + } else { + wp_redirect( self_admin_url("plugins.php?activate=true&plugin_status=$status&paged=$page&s=$s") ); // overrides the ?error=true one above + } + exit; + break; + case 'activate-selected': + case 'network-activate-selected': + if ( ! current_user_can('activate_plugins') ) + wp_die(__('You do not have sufficient permissions to activate plugins for this site.')); + + check_admin_referer('bulk-plugins'); + + $plugins = isset( $_POST['checked'] ) ? (array) $_POST['checked'] : array(); + + // Only activate plugins which are not already active. + $check = $network_wide ? 'is_plugin_active_for_network' : 'is_plugin_active'; + foreach ( $plugins as $i => $plugin ) + if ( $check( $plugin ) ) + unset( $plugins[ $i ] ); + + if ( empty($plugins) ) { + wp_redirect( self_admin_url("plugins.php?plugin_status=$status&paged=$page&s=$s") ); + exit; + } + + activate_plugins($plugins, self_admin_url('plugins.php?error=true'), $network_wide); + + $recent = (array)get_option('recently_activated'); + foreach ( $plugins as $plugin => $time) + if ( isset($recent[ $plugin ]) ) + unset($recent[ $plugin ]); + + update_option('recently_activated', $recent); + + wp_redirect( self_admin_url("plugins.php?activate-multi=true&plugin_status=$status&paged=$page&s=$s") ); + exit; + break; + case 'update-selected' : + + check_admin_referer( 'bulk-plugins' ); + + if ( isset( $_GET['plugins'] ) ) + $plugins = explode( ',', $_GET['plugins'] ); + elseif ( isset( $_POST['checked'] ) ) + $plugins = (array) $_POST['checked']; + else + $plugins = array(); + + $title = __( 'Update Plugins' ); + $parent_file = 'plugins.php'; + + require_once(ABSPATH . 'wp-admin/admin-header.php'); + + echo '
    '; + screen_icon(); + echo '

    ' . esc_html( $title ) . '

    '; + + + $url = self_admin_url('update.php?action=update-selected&plugins=' . urlencode( join(',', $plugins) )); + $url = wp_nonce_url($url, 'bulk-update-plugins'); + + echo ""; + echo '
    '; + require_once(ABSPATH . 'wp-admin/admin-footer.php'); + exit; + break; + case 'error_scrape': + if ( ! current_user_can('activate_plugins') ) + wp_die(__('You do not have sufficient permissions to activate plugins for this site.')); + + check_admin_referer('plugin-activation-error_' . $plugin); + + $valid = validate_plugin($plugin); + if ( is_wp_error($valid) ) + wp_die($valid); + + if ( ! WP_DEBUG ) { + error_reporting( E_CORE_ERROR | E_CORE_WARNING | E_COMPILE_ERROR | E_ERROR | E_WARNING | E_PARSE | E_USER_ERROR | E_USER_WARNING | E_RECOVERABLE_ERROR ); + } + + @ini_set('display_errors', true); //Ensure that Fatal errors are displayed. + // Go back to "sandbox" scope so we get the same errors as before + function plugin_sandbox_scrape( $plugin ) { + include( WP_PLUGIN_DIR . '/' . $plugin ); + } + plugin_sandbox_scrape( $plugin ); + do_action('activate_' . $plugin); + exit; + break; + case 'deactivate': + if ( ! current_user_can('activate_plugins') ) + wp_die(__('You do not have sufficient permissions to deactivate plugins for this site.')); + + check_admin_referer('deactivate-plugin_' . $plugin); + deactivate_plugins($plugin); + update_option('recently_activated', array($plugin => time()) + (array)get_option('recently_activated')); + if ( headers_sent() ) + echo ""; + else + wp_redirect( self_admin_url("plugins.php?deactivate=true&plugin_status=$status&paged=$page&s=$s") ); + exit; + break; + case 'deactivate-selected': + if ( ! current_user_can('activate_plugins') ) + wp_die(__('You do not have sufficient permissions to deactivate plugins for this site.')); + + check_admin_referer('bulk-plugins'); + + $plugins = isset( $_POST['checked'] ) ? (array) $_POST['checked'] : array(); + $plugins = array_filter($plugins, 'is_plugin_active'); //Do not deactivate plugins which are already deactivated. + if ( empty($plugins) ) { + wp_redirect( self_admin_url("plugins.php?plugin_status=$status&paged=$page&s=$s") ); + exit; + } + + deactivate_plugins($plugins); + + $deactivated = array(); + foreach ( $plugins as $plugin ) + $deactivated[ $plugin ] = time(); + + update_option('recently_activated', $deactivated + (array)get_option('recently_activated')); + wp_redirect( self_admin_url("plugins.php?deactivate-multi=true&plugin_status=$status&paged=$page&s=$s") ); + exit; + break; + case 'delete-selected': + if ( ! current_user_can('delete_plugins') ) + wp_die(__('You do not have sufficient permissions to delete plugins for this site.')); + + check_admin_referer('bulk-plugins'); + + //$_POST = from the plugin form; $_GET = from the FTP details screen. + $plugins = isset( $_REQUEST['checked'] ) ? (array) $_REQUEST['checked'] : array(); + if ( empty( $plugins ) ) { + wp_redirect( self_admin_url("plugins.php?plugin_status=$status&paged=$page&s=$s") ); + exit; + } + + $plugins = array_filter($plugins, 'is_plugin_inactive'); // Do not allow to delete Activated plugins. + if ( empty( $plugins ) ) { + wp_redirect( self_admin_url( "plugins.php?error=true&main=true&plugin_status=$status&paged=$page&s=$s" ) ); + exit; + } + + include(ABSPATH . 'wp-admin/update.php'); + + $parent_file = 'plugins.php'; + + if ( ! isset($_REQUEST['verify-delete']) ) { + wp_enqueue_script('jquery'); + require_once(ABSPATH . 'wp-admin/admin-header.php'); + ?> +
    + $data ) { + $plugin_info[ $plugin_file ] = _get_plugin_data_markup_translate( $plugin_file, $data ); + $plugin_info[ $plugin_file ]['is_uninstallable'] = is_uninstallable_plugin( $plugin ); + if ( ! $plugin_info[ $plugin_file ]['Network'] ) + $have_non_network_plugins = true; + } + } + } + } + screen_icon(); + $plugins_to_delete = count( $plugin_info ); + echo '

    ' . _n( 'Delete Plugin', 'Delete Plugins', $plugins_to_delete ) . '

    '; + ?> + +

    + +

    +
      + ', sprintf( __( '%1$s by %2$s (will also delete its data)' ), esc_html($plugin['Name']), esc_html($plugin['AuthorName']) ), ''; + $data_to_delete = true; + } else { + /* translators: 1: plugin name, 2: plugin author */ + echo '
    • ', sprintf( __('%1$s by %2$s' ), esc_html($plugin['Name']), esc_html($plugin['AuthorName']) ), '
    • '; + } + } + ?> +
    +

    +
    + + + '; + ?> + + +
    +
    + +
    + +

    + +
    + prepare_items(); + +wp_enqueue_script('plugin-install'); +add_thickbox(); + +add_screen_option( 'per_page', array('label' => _x( 'Plugins', 'plugins per page (screen options)' )) ); + +add_contextual_help($current_screen, + '

    ' . __('Plugins extend and expand the functionality of WordPress. Once a plugin is installed, you may activate it or deactivate it here.') . '

    ' . + '

    ' . sprintf(__('You can find additional plugins for your site by using the Plugin Browser/Installer functionality or by browsing the WordPress Plugin Directory directly and installing new plugins manually. To manually install a plugin you generally just need to upload the plugin file into your /wp-content/plugins directory. Once a plugin has been installed, you can activate it here.'), 'plugin-install.php', 'http://wordpress.org/extend/plugins/') . '

    ' . + '

    ' . __('Most of the time, plugins play nicely with the core of WordPress and with other plugins. Sometimes, though, a plugin’s code will get in the way of another plugin, causing compatibility issues. If your site starts doing strange things, this may be the problem. Try deactivating all your plugins and re-activating them in various combinations until you isolate which one(s) caused the issue.') . '

    ' . + '

    ' . sprintf( __('If something goes wrong with a plugin and you can’t use WordPress, delete or rename that file in the %s directory and it will be automatically deactivated.'), WP_PLUGIN_DIR) . '

    ' . + '

    ' . __('For more information:') . '

    ' . + '

    ' . __('Documentation on Managing Plugins') . '

    ' . + '

    ' . __('Support Forums') . '

    ' +); + +$title = __('Plugins'); +$parent_file = 'plugins.php'; + +require_once(ABSPATH . 'wp-admin/admin-header.php'); + +$invalid = validate_active_plugins(); +if ( !empty($invalid) ) + foreach ( $invalid as $plugin_file => $error ) + echo '

    ' . sprintf(__('The plugin %s has been deactivated due to an error: %s'), esc_html($plugin_file), $error->get_error_message()) . '

    '; +?> + +unexpected output during activation. If you notice “headers already sent” messages, problems with syndication feeds or other issues, try deactivating or removing this plugin.'), $_GET['charsout']); + else + $errmsg = __('Plugin could not be activated because it triggered a fatal error.'); + ?> +

    + + + +
    + +

    get_error_message() ); ?>

    + +

    deleted.'); ?>

    + + +

    activated.') ?>

    + +

    activated.'); ?>

    + +

    deactivated.') ?>

    + +

    deactivated.'); ?>

    + +

    + + +
    + +

    + +' . __('Search results for “%s”') . '', esc_html( $s ) ); ?> +

    + + + +views(); ?> + +
    + +search_box( __( 'Search Installed Plugins' ), 'plugin' ); ?> + + + + +display(); ?> +
    + +
    + + true ) ) ) ) + $post_type = $_GET['post_type']; +else + wp_die( __('Invalid post type') ); + +if ( 'post' != $post_type ) { + $parent_file = "edit.php?post_type=$post_type"; + $submenu_file = "post-new.php?post_type=$post_type"; +} else { + $parent_file = 'edit.php'; + $submenu_file = 'post-new.php'; +} + +$post_type_object = get_post_type_object($post_type); + +$title = $post_type_object->labels->add_new_item; + +$editing = true; + +if ( ! current_user_can( $post_type_object->cap->edit_posts ) ) + wp_die( __( 'Cheatin’ uh?' ) ); + +wp_enqueue_script('autosave'); + +// Show post form. +$post = get_default_post_to_edit( $post_type, true ); +$post_ID = $post->ID; +include('edit-form-advanced.php'); +include('./admin-footer.php'); +?> diff --git a/src/wp-admin/post.php b/src/wp-admin/post.php new file mode 100644 index 0000000..df9e5a5 --- /dev/null +++ b/src/wp-admin/post.php @@ -0,0 +1,279 @@ +post_type); + if ( $post_type_object ) { + $post_type = $post->post_type; + $current_screen->post_type = $post->post_type; + $current_screen->id = $current_screen->post_type; + } + } +} elseif ( isset($_POST['post_type']) ) { + $post_type_object = get_post_type_object($_POST['post_type']); + if ( $post_type_object ) { + $post_type = $post_type_object->name; + $current_screen->post_type = $post_type; + $current_screen->id = $current_screen->post_type; + } +} + +/** + * Redirect to previous page. + * + * @param int $post_id Optional. Post ID. + */ +function redirect_post($post_id = '') { + if ( isset($_POST['save']) || isset($_POST['publish']) ) { + $status = get_post_status( $post_id ); + + if ( isset( $_POST['publish'] ) ) { + switch ( $status ) { + case 'pending': + $message = 8; + break; + case 'future': + $message = 9; + break; + default: + $message = 6; + } + } else { + $message = 'draft' == $status ? 10 : 1; + } + + $location = add_query_arg( 'message', $message, get_edit_post_link( $post_id, 'url' ) ); + } elseif ( isset($_POST['addmeta']) && $_POST['addmeta'] ) { + $location = add_query_arg( 'message', 2, wp_get_referer() ); + $location = explode('#', $location); + $location = $location[0] . '#postcustom'; + } elseif ( isset($_POST['deletemeta']) && $_POST['deletemeta'] ) { + $location = add_query_arg( 'message', 3, wp_get_referer() ); + $location = explode('#', $location); + $location = $location[0] . '#postcustom'; + } elseif ( 'post-quickpress-save-cont' == $_POST['action'] ) { + $location = "post.php?action=edit&post=$post_id&message=7"; + } else { + $location = add_query_arg( 'message', 4, get_edit_post_link( $post_id, 'url' ) ); + } + + wp_redirect( apply_filters( 'redirect_post_location', $location, $post_id ) ); + exit; +} + +if ( isset( $_POST['deletepost'] ) ) + $action = 'delete'; +elseif ( isset($_POST['wp-preview']) && 'dopreview' == $_POST['wp-preview'] ) + $action = 'preview'; + +$sendback = wp_get_referer(); +if ( strpos($sendback, 'post.php') !== false || strpos($sendback, 'post-new.php') !== false ) { + $sendback = admin_url('edit.php'); + $sendback .= ( !empty( $post_type ) ) ? '?post_type=' . $post_type : ''; +} else { + $sendback = remove_query_arg( array('trashed', 'untrashed', 'deleted', 'ids'), $sendback ); +} + +switch($action) { +case 'postajaxpost': +case 'post': +case 'post-quickpress-publish': +case 'post-quickpress-save': + check_admin_referer('add-' . $post_type); + + if ( 'post-quickpress-publish' == $action ) + $_POST['publish'] = 'publish'; // tell write_post() to publish + + if ( 'post-quickpress-publish' == $action || 'post-quickpress-save' == $action ) { + $_POST['comment_status'] = get_option('default_comment_status'); + $_POST['ping_status'] = get_option('default_ping_status'); + } + + if ( !empty( $_POST['quickpress_post_ID'] ) ) { + $_POST['post_ID'] = (int) $_POST['quickpress_post_ID']; + $post_id = edit_post(); + } else { + $post_id = 'postajaxpost' == $action ? edit_post() : write_post(); + } + + if ( 0 === strpos( $action, 'post-quickpress' ) ) { + $_POST['post_ID'] = $post_id; + // output the quickpress dashboard widget + require_once(ABSPATH . 'wp-admin/includes/dashboard.php'); + wp_dashboard_quick_press(); + exit; + } + + redirect_post($post_id); + exit(); + break; + +case 'edit': + $editing = true; + + if ( empty( $post_id ) ) { + wp_redirect( admin_url('post.php') ); + exit(); + } + + $p = $post_id; + + if ( empty($post->ID) ) + wp_die( __('You attempted to edit an item that doesn’t exist. Perhaps it was deleted?') ); + + if ( !current_user_can($post_type_object->cap->edit_post, $post_id) ) + wp_die( __('You are not allowed to edit this item.') ); + + if ( 'trash' == $post->post_status ) + wp_die( __('You can’t edit this item because it is in the Trash. Please restore it and try again.') ); + + if ( null == $post_type_object ) + wp_die( __('Unknown post type.') ); + + $post_type = $post->post_type; + if ( 'post' == $post_type ) { + $parent_file = "edit.php"; + $submenu_file = "edit.php"; + $post_new_file = "post-new.php"; + } else { + if ( isset( $post_type_object ) && $post_type_object->show_in_menu && $post_type_object->show_in_menu !== true ) + $parent_file = $post_type_object->show_in_menu; + else + $parent_file = "edit.php?post_type=$post_type"; + $submenu_file = "edit.php?post_type=$post_type"; + $post_new_file = "post-new.php?post_type=$post_type"; + } + + if ( $last = wp_check_post_lock( $post->ID ) ) { + add_action('admin_notices', '_admin_notice_post_locked' ); + } else { + wp_set_post_lock( $post->ID ); + wp_enqueue_script('autosave'); + } + + $title = $post_type_object->labels->edit_item; + $post = get_post_to_edit($post_id); + + if ( post_type_supports($post_type, 'comments') ) { + wp_enqueue_script('admin-comments'); + enqueue_comment_hotkeys_js(); + } + + include('./edit-form-advanced.php'); + + break; + +case 'editattachment': + check_admin_referer('update-attachment_' . $post_id); + + // Don't let these be changed + unset($_POST['guid']); + $_POST['post_type'] = 'attachment'; + + // Update the thumbnail filename + $newmeta = wp_get_attachment_metadata( $post_id, true ); + $newmeta['thumb'] = $_POST['thumb']; + + wp_update_attachment_metadata( $post_id, $newmeta ); + +case 'editpost': + check_admin_referer('update-' . $post_type . '_' . $post_id); + + $post_id = edit_post(); + + redirect_post($post_id); // Send user on their way while we keep working + + exit(); + break; + +case 'trash': + check_admin_referer('trash-' . $post_type . '_' . $post_id); + + $post = & get_post($post_id); + + if ( !current_user_can($post_type_object->cap->delete_post, $post_id) ) + wp_die( __('You are not allowed to move this item to the Trash.') ); + + if ( ! wp_trash_post($post_id) ) + wp_die( __('Error in moving to Trash.') ); + + wp_redirect( add_query_arg( array('trashed' => 1, 'ids' => $post_id), $sendback ) ); + exit(); + break; + +case 'untrash': + check_admin_referer('untrash-' . $post_type . '_' . $post_id); + + if ( !current_user_can($post_type_object->cap->delete_post, $post_id) ) + wp_die( __('You are not allowed to move this item out of the Trash.') ); + + if ( ! wp_untrash_post($post_id) ) + wp_die( __('Error in restoring from Trash.') ); + + wp_redirect( add_query_arg('untrashed', 1, $sendback) ); + exit(); + break; + +case 'delete': + check_admin_referer('delete-' . $post_type . '_' . $post_id); + + if ( !current_user_can($post_type_object->cap->delete_post, $post_id) ) + wp_die( __('You are not allowed to delete this item.') ); + + $force = !EMPTY_TRASH_DAYS; + if ( $post->post_type == 'attachment' ) { + $force = ( $force || !MEDIA_TRASH ); + if ( ! wp_delete_attachment($post_id, $force) ) + wp_die( __('Error in deleting.') ); + } else { + if ( !wp_delete_post($post_id, $force) ) + wp_die( __('Error in deleting.') ); + } + + wp_redirect( add_query_arg('deleted', 1, $sendback) ); + exit(); + break; + +case 'preview': + check_admin_referer( 'autosave', 'autosavenonce' ); + + $url = post_preview(); + + wp_redirect($url); + exit(); + break; + +default: + wp_redirect( admin_url('edit.php') ); + exit(); + break; +} // end switch +include('./admin-footer.php'); +?> diff --git a/src/wp-admin/press-this.php b/src/wp-admin/press-this.php new file mode 100644 index 0000000..70f1808 --- /dev/null +++ b/src/wp-admin/press-this.php @@ -0,0 +1,652 @@ + $image) { + // see if files exist in content - we don't want to upload non-used selected files. + if ( strpos($_POST['content'], htmlspecialchars($image)) !== false ) { + $desc = isset($_POST['photo_description'][$key]) ? $_POST['photo_description'][$key] : ''; + $upload = media_sideload_image($image, $post_ID, $desc); + + // Replace the POSTED content with correct uploaded ones. Regex contains fix for Magic Quotes + if ( !is_wp_error($upload) ) + $content = preg_replace('/]*)src=\\\?(\"|\')'.preg_quote(htmlspecialchars($image), '/').'\\\?(\2)([^>\/]*)\/*>/is', $upload, $content); + } + } + } + // set the post_content and status + if ( isset( $_POST['publish'] ) && current_user_can( 'publish_posts' ) ) + $quick['post_status'] = 'publish'; + elseif ( isset( $_POST['review'] ) ) + $quick['post_status'] = 'pending'; + else + $quick['post_status'] = 'draft'; + $quick['post_content'] = $content; + // error handling for media_sideload + if ( is_wp_error($upload) ) { + wp_delete_post($post_ID); + wp_die($upload); + } else { + // Post formats + if ( current_theme_supports( 'post-formats' ) && isset( $_POST['post_format'] ) ) { + $post_formats = get_theme_support( 'post-formats' ); + if ( is_array( $post_formats ) ) { + $post_formats = $post_formats[0]; + if ( in_array( $_POST['post_format'], $post_formats ) ) + set_post_format( $post_ID, $_POST['post_format'] ); + elseif ( '0' == $_POST['post_format'] ) + set_post_format( $post_ID, false ); + } + } + + $quick['ID'] = $post_ID; + wp_update_post($quick); + } + return $post_ID; +} + +// For submitted posts. +if ( isset($_REQUEST['action']) && 'post' == $_REQUEST['action'] ) { + check_admin_referer('press-this'); + $post_ID = press_it(); + $posted = $post_ID; +} else { + $post_ID = 0; +} + +// Set Variables +$title = isset( $_GET['t'] ) ? trim( strip_tags( html_entity_decode( stripslashes( $_GET['t'] ) , ENT_QUOTES) ) ) : ''; + +$selection = ''; +if ( !empty($_GET['s']) ) { + $selection = str_replace(''', "'", stripslashes($_GET['s'])); + $selection = trim( htmlspecialchars( html_entity_decode($selection, ENT_QUOTES) ) ); +} + +if ( ! empty($selection) ) { + $selection = preg_replace('/(\r?\n|\r)/', '

    ', $selection); + $selection = '

    ' . str_replace('

    ', '', $selection) . '

    '; +} + +$url = isset($_GET['u']) ? esc_url($_GET['u']) : ''; +$image = isset($_GET['i']) ? $_GET['i'] : ''; + +if ( !empty($_REQUEST['ajax']) ) { + switch ($_REQUEST['ajax']) { + case 'video': ?> + +
    +

    +
    + +

    +
    +
    + + +

    +
    +
    + +
    +
    + +

    + + + <?php echo esc_attr(__('Click to insert.')); ?> + +

    + +

    + + +

    +
    +
    + +
    +
    +

    +
    +
    + +
    +
    + +

    |

    + ]*)src=(\"|\')([^<>\'\"]+)(\2)([^>]*)\/*>/i'; + $content = str_replace(array("\n","\t","\r"), '', $content); + preg_match_all($pattern, $content, $matches); + if ( empty($matches[0]) ) + return ''; + $sources = array(); + foreach ($matches[3] as $src) { + // if no http in url + if (strpos($src, 'http') === false) + // if it doesn't have a relative uri + if ( strpos($src, '../') === false && strpos($src, './') === false && strpos($src, '/') === 0) + $src = 'http://'.str_replace('//','/', $host['host'].'/'.$src); + else + $src = 'http://'.str_replace('//','/', $host['host'].'/'.dirname($host['path']).'/'.$src); + $sources[] = esc_url($src); + } + return "'" . implode("','", $sources) . "'"; + } + $url = wp_kses(urldecode($url), null); + echo 'new Array('.get_images_from_uri($url).')'; + break; + + case 'photo_js': ?> + // gather images and load some default JS + var last = null + var img, img_tag, aspect, w, h, skip, i, strtoappend = ""; + if(photostorage == false) { + var my_src = eval( + jQuery.ajax({ + type: "GET", + url: "", + cache : false, + async : false, + data: "ajax=photo_images&u=", + dataType : "script" + }).responseText + ); + if(my_src.length == 0) { + var my_src = eval( + jQuery.ajax({ + type: "GET", + url: "", + cache : false, + async : false, + data: "ajax=photo_images&u=", + dataType : "script" + }).responseText + ); + if(my_src.length == 0) { + strtoappend = ''; + } + } + } + for (i = 0; i < my_src.length; i++) { + img = new Image(); + img.src = my_src[i]; + img_attr = 'id="img' + i + '"'; + skip = false; + + maybeappend = ''; + + if (img.width && img.height) { + if (img.width >= 30 && img.height >= 30) { + aspect = img.width / img.height; + scale = (aspect > 1) ? (71 / img.width) : (71 / img.height); + + w = img.width; + h = img.height; + + if (scale < 1) { + w = parseInt(img.width * scale); + h = parseInt(img.height * scale); + } + img_attr += ' style="width: ' + w + 'px; height: ' + h + 'px;"'; + strtoappend += maybeappend; + } + } else { + strtoappend += maybeappend; + } + } + + function pick(img, desc) { + if (img) { + if('object' == typeof jQuery('.photolist input') && jQuery('.photolist input').length != 0) length = jQuery('.photolist input').length; + if(length == 0) length = 1; + jQuery('.photolist').append(''); + jQuery('.photolist').append(''); + insert_editor( "\n\n" + encodeURI('

    ' + desc + '

    ')); + } + return false; + } + + function image_selector() { + tb_remove(); + desc = jQuery('#this_photo_description').val(); + src = jQuery('#this_photo').val(); + pick(src, desc); + jQuery('#extra-fields').hide(); + jQuery('#extra-fields').html(''); + return false; + } + jQuery('#extra-fields').html('

    ()

    '); + jQuery('#img_container').html(strtoappend); + + + > + + + <?php _e('Press This') ?> + + + + + + + + + '370' ) ); +} +?> +
    +
    +
    +
    + + + + + + + +
    + +
    +

    +

    +
    +

    + 'save' ) ); + if ( current_user_can('publish_posts') ) { + submit_button( __( 'Publish' ), 'primary', 'publish', false ); + } else { + echo '

    '; + submit_button( __( 'Submit for Review' ), 'primary', 'review', false ); + } ?> + +

    + +

    + +

    + +
    +
    + + +
    +

    +

    +
    +
    + + + + + +
    +
      + 'category', 'popular_cats' => $popular_ids ) ) ?> +
    +
    + + cap->assign_terms) ) : ?> +

    + + cap->edit_terms) ) : ?> +
    +

    + + labels->add_new_item ); ?> + +

    +

    + + + + 'category', 'hide_empty' => 0, 'name' => 'newcategory_parent', 'orderby' => 'name', 'hierarchical' => 1, 'show_option_none' => '— ' . $tax->labels->parent_item . ' —', 'tab_index' => 3 ) ); ?> + + + +

    +
    + +
    +
    +
    + +
    +
    +
    +
    +

    +
    +
    +

    + + +

    + + +
    +

    +
    +
    + +
    +
    +
    +
    +
    + + + + +

    | |

    + + +
    +
    + +
    +
    + + + +
    +
    + + + +
    + + +
    + + +<?php _e('Insert an Image'); ?><?php _e('Embed a Video'); ?> +
    +
    +
    +
    + +
    +
    +
    +
    +
    + + + + diff --git a/src/wp-admin/profile.php b/src/wp-admin/profile.php new file mode 100644 index 0000000..71a1b04 --- /dev/null +++ b/src/wp-admin/profile.php @@ -0,0 +1,19 @@ + diff --git a/src/wp-admin/revision.php b/src/wp-admin/revision.php new file mode 100644 index 0000000..dd20c12 --- /dev/null +++ b/src/wp-admin/revision.php @@ -0,0 +1,223 @@ +post_parent ) ) + break; + if ( !$post = get_post( $revision->post_parent ) ) + break; + + // Revisions disabled and we're not looking at an autosave + if ( ( ! WP_POST_REVISIONS || !post_type_supports($post->post_type, 'revisions') ) && !wp_is_post_autosave( $revision ) ) { + $redirect = 'edit.php?post_type=' . $post->post_type; + break; + } + + check_admin_referer( "restore-post_$post->ID|$revision->ID" ); + + wp_restore_post_revision( $revision->ID ); + $redirect = add_query_arg( array( 'message' => 5, 'revision' => $revision->ID ), get_edit_post_link( $post->ID, 'url' ) ); + break; +case 'diff' : + if ( !$left_revision = get_post( $left ) ) + break; + if ( !$right_revision = get_post( $right ) ) + break; + + if ( !current_user_can( 'read_post', $left_revision->ID ) || !current_user_can( 'read_post', $right_revision->ID ) ) + break; + + // If we're comparing a revision to itself, redirect to the 'view' page for that revision or the edit page for that post + if ( $left_revision->ID == $right_revision->ID ) { + $redirect = get_edit_post_link( $left_revision->ID ); + include( './js/revisions-js.php' ); + break; + } + + // Don't allow reverse diffs? + if ( strtotime($right_revision->post_modified_gmt) < strtotime($left_revision->post_modified_gmt) ) { + $redirect = add_query_arg( array( 'left' => $right, 'right' => $left ) ); + break; + } + + if ( $left_revision->ID == $right_revision->post_parent ) // right is a revision of left + $post =& $left_revision; + elseif ( $left_revision->post_parent == $right_revision->ID ) // left is a revision of right + $post =& $right_revision; + elseif ( $left_revision->post_parent == $right_revision->post_parent ) // both are revisions of common parent + $post = get_post( $left_revision->post_parent ); + else + break; // Don't diff two unrelated revisions + + if ( ! WP_POST_REVISIONS || !post_type_supports($post->post_type, 'revisions') ) { // Revisions disabled + if ( + // we're not looking at an autosave + ( !wp_is_post_autosave( $left_revision ) && !wp_is_post_autosave( $right_revision ) ) + || + // we're not comparing an autosave to the current post + ( $post->ID !== $left_revision->ID && $post->ID !== $right_revision->ID ) + ) { + $redirect = 'edit.php?post_type=' . $post->post_type; + break; + } + } + + if ( + // They're the same + $left_revision->ID == $right_revision->ID + || + // Neither is a revision + ( !wp_get_post_revision( $left_revision->ID ) && !wp_get_post_revision( $right_revision->ID ) ) + ) + break; + + $post_title = '' . get_the_title() . ''; + $h2 = sprintf( __( 'Compare Revisions of “%1$s”' ), $post_title ); + $title = __( 'Revisions' ); + + $left = $left_revision->ID; + $right = $right_revision->ID; + + $redirect = false; + break; +case 'view' : +default : + if ( !$revision = wp_get_post_revision( $revision_id ) ) + break; + if ( !$post = get_post( $revision->post_parent ) ) + break; + + if ( !current_user_can( 'read_post', $revision->ID ) || !current_user_can( 'read_post', $post->ID ) ) + break; + + // Revisions disabled and we're not looking at an autosave + if ( ( ! WP_POST_REVISIONS || !post_type_supports($post->post_type, 'revisions') ) && !wp_is_post_autosave( $revision ) ) { + $redirect = 'edit.php?post_type=' . $post->post_type; + break; + } + + $post_title = '' . get_the_title() . ''; + $revision_title = wp_post_revision_title( $revision, false ); + $h2 = sprintf( __( 'Revision for “%1$s” created on %2$s' ), $post_title, $revision_title ); + $title = __( 'Revisions' ); + + // Sets up the diff radio buttons + $left = $revision->ID; + $right = $post->ID; + + $redirect = false; + break; +endswitch; + +// Empty post_type means either malformed object found, or no valid parent was found. +if ( !$redirect && empty($post->post_type) ) + $redirect = 'edit.php'; + +if ( !empty($redirect) ) { + wp_redirect( $redirect ); + exit; +} + +// This is so that the correct "Edit" menu item is selected. +if ( !empty($post->post_type) && 'post' != $post->post_type ) + $parent_file = $submenu_file = 'edit.php?post_type=' . $post->post_type; +else + $parent_file = $submenu_file = 'edit.php'; + +require_once( './admin-header.php' ); + +?> + +
    + +

    + + + + + + + + + $field_title ) : + if ( 'diff' == $action ) { + $left_content = apply_filters( "_wp_post_revision_field_$field", $left_revision->$field, $field ); + $right_content = apply_filters( "_wp_post_revision_field_$field", $right_revision->$field, $field ); + if ( !$content = wp_text_diff( $left_content, $right_content ) ) + continue; // There is no difference between left and right + $identical = false; + } else { + add_filter( "_wp_post_revision_field_$field", 'htmlspecialchars' ); + $content = apply_filters( "_wp_post_revision_field_$field", $revision->$field, $field ); + } + ?> + + + + + + + + + + + + +
    + + +

    + +
    + +

    + + 'form-table', 'parent' => true, 'right' => $right, 'left' => $left ); +if ( ! WP_POST_REVISIONS || !post_type_supports($post->post_type, 'revisions') ) + $args['type'] = 'autosave'; + +wp_list_post_revisions( $post, $args ); + +?> + +
    + +El archivo 'wp-config.php' ya existe. Si necesitas reiniciar alguno de los elementos de la configuración de este archivo bórralo primero. Puedes tratar de instalar ahora.

    "); + +// Comprobamos si existe un wp-config.php por encima del directorio raiz pero que no sea parte de otra instalación +if (file_exists(ABSPATH . '../wp-config.php') && ! file_exists(ABSPATH . '../wp-settings.php')) + wp_die("

    El archivo 'wp-config.php' ya existe un nivel por encima de tu instalación de WordPress. Si necesitas reiniciar alguno de los elementos de la configuración de este archivo bórralo primero. Puedes tratar de instalar ahora.

    "); + +if ( version_compare( $required_php_version, phpversion(), '>' ) ) + wp_die( sprintf( /*WP_I18N_OLD_PHP*/'Tu servidor está usando la versión de PHP %1$s pero WordPress requiere al menos la %2$s.'/*/WP_I18N_OLD_PHP*/, phpversion(), $required_php_version ) ); + +if ( !extension_loaded('mysql') && !file_exists(ABSPATH . 'wp-content/db.php') ) + wp_die( /*WP_I18N_OLD_MYSQL*/'Tu instalación de PHP parece que no dispone de la extensión MySQL requerida por WordPress.'/*/WP_I18N_OLD_MYSQL*/ ); + +if (isset($_GET['step'])) + $step = $_GET['step']; +else + $step = 0; + +/** + * Muestra la cabecera de configuración del fichero wp-config.php. + * + * @ignore + * @since 2.3.0 + * @package WordPress + * @subpackage Installer_WP_Config + */ +function display_header() { + header( 'Content-Type: text/html; charset=utf-8' ); +?> + + + + +Archivo de configuración de WordPress + + + + +

    WordPress

    + + +

    Bienvenid@ a WordPress. Antes de empezar necesitamos algo de información de la base de datos. Necesitas conocer la siguiente información antes de seguir.

    +
      +
    1. Nombre de la base de datos
    2. +
    3. Nombre de usuario de la base de datos
    4. +
    5. Contraseña de la base de datos
    6. +
    7. Host de la base de datos
    8. +
    9. Prefijo de tabla (si quieres ejecutar más de un WordPress en una sola base de datos
    10. +
    +

    Si por alguna razón no funciona la creación automática de este archivo no te preocupes. Todo lo que hace es rellenar un fichero de configuración con la información de la base de datos. También puedes simplemente abrir el fichero wp-config-sample.php en un editor de texto, rellenar la información y guardarlo como wp-config.php.

    +

    En la mayoría de las ocasiones esta información te la facilita tu proveedor de alojamiento. Si no tienes esta información tendrás que contactar con ellos antes de poder continuar. Si ya estás listo …

    + +

    ¡Vamos a ello!

    + +
    +

    A continuación deberás introducir los detalles de conexión con tu base de datos. Si no estás seguro de cuales son contacta con tu proveedor de alojamiento.

    + + + + + + + + + + + + + + + + + + + + + + + + + + +
    El nombre de la base de datos en la que quieres que se ejecute WP.
    Tu nombre de usuario de MySQL
    …y la contraseña de MySQL.
    Si no funciona localhost tendrás que contactar con tu proveedor de alojamiento para que te diga cual es.
    Si quieres ejecutar varias instalaciones de WordPress en una sola base de datos cambia esto.
    + +

    +
    +ERROR: "Prefijo de tabla" solo puede contener números, letras y guión bajo.'/*/WP_I18N_BAD_PREFIX*/ ); + + // Probamos la conexión con la base de datos. + /**#@+ + * @ignore + */ + define('DB_NAME', $dbname); + define('DB_USER', $uname); + define('DB_PASSWORD', $passwrd); + define('DB_HOST', $dbhost); + /**#@-*/ + + // Fallará si los valores son incorrectos. + require_wp_db(); + if ( !empty($wpdb->error) ) + wp_die($wpdb->error->get_error_message()); + + // Carga o generación de las claves y salts. + $no_api = isset( $_POST['noapi'] ); + require_once( ABSPATH . WPINC . '/plugin.php' ); + require_once( ABSPATH . WPINC . '/l10n.php' ); + require_once( ABSPATH . WPINC . '/pomo/translations.php' ); + if ( ! $no_api ) { + require_once( ABSPATH . WPINC . '/class-http.php' ); + require_once( ABSPATH . WPINC . '/http.php' ); + wp_fix_server_vars(); + /**#@+ + * @ignore + */ + function get_bloginfo() { + return ( ( is_ssl() ? 'https://' : 'http://' ) . $_SERVER['HTTP_HOST'] . str_replace( $_SERVER['PHP_SELF'], '/wp-admin/setup-config.php', '' ) ); + } + /**#@-*/ + $secret_keys = wp_remote_get( 'https://api.wordpress.org/secret-key/1.1/salt/' ); + } + + if ( $no_api || is_wp_error( $secret_keys ) ) { + $secret_keys = array(); + require_once( ABSPATH . WPINC . '/pluggable.php' ); + for ( $i = 0; $i < 8; $i++ ) { + $secret_keys[] = wp_generate_password( 64, true, true ); + } + } else { + $secret_keys = explode( "\n", wp_remote_retrieve_body( $secret_keys ) ); + foreach ( $secret_keys as $k => $v ) { + $secret_keys[$k] = substr( $v, 28, 64 ); + } + } + $key = 0; + + foreach ($configFile as $line_num => $line) { + switch (substr($line,0,16)) { + case "define('DB_NAME'": + $configFile[$line_num] = str_replace("nombredetubasededatos", $dbname, $line); + break; + case "define('DB_USER'": + $configFile[$line_num] = str_replace("'nombredeusuario'", "'$uname'", $line); + break; + case "define('DB_PASSW": + $configFile[$line_num] = str_replace("'contraseña'", "'$passwrd'", $line); + break; + case "define('DB_HOST'": + $configFile[$line_num] = str_replace("localhost", $dbhost, $line); + break; + case '$table_prefix =': + $configFile[$line_num] = str_replace('wp_', $prefix, $line); + break; + case "define('AUTH_KEY": + case "define('SECURE_A": + case "define('LOGGED_I": + case "define('NONCE_KE": + case "define('AUTH_SAL": + case "define('SECURE_A": + case "define('LOGGED_I": + case "define('NONCE_SA": + $configFile[$line_num] = str_replace('pon aquí tu frase aleatoria', $secret_keys[$key++], $line ); + break; + } + } + if ( ! is_writable(ABSPATH) ) : + display_header(); +?> +

    Lo siento pero no se ha podido escribir en el fichero wp-config.php.

    +

    Puedes crear mahualmente el archivo wp-config.php y pegar dentro el siguiente texto.

    + +

    Una vez hayas hecho esto haz clic en "Iniciar la instalación."

    +

    Iniciar la instalación

    + +

    ¡Todo correcto! Ya has terminado esta parte de la instalación. Ahora WordPress puede comunicarse con tu base de datos. Si estás preparado es momento de …

    + +

    Iniciar la instalación

    + + + diff --git a/src/wp-admin/theme-editor.php b/src/wp-admin/theme-editor.php new file mode 100644 index 0000000..c41f0c8 --- /dev/null +++ b/src/wp-admin/theme-editor.php @@ -0,0 +1,271 @@ +'.__('You do not have sufficient permissions to edit templates for this site.').'

    '); + +$title = __("Edit Themes"); +$parent_file = 'themes.php'; + +$help = '

    ' . __('You can use the Theme Editor to edit the individual CSS and PHP files which make up your theme.') . '

    '; +$help .= '

    ' . __('Begin by choosing a theme to edit from the dropdown menu and clicking Select. A list then appears of all the template files. Clicking once on any file name causes the file to appear in the large Editor box.') . '

    '; +$help .= '

    ' . __('For PHP files, you can use the Documentation dropdown to select from functions recognized in that file. Lookup takes you to a web page with reference material about that particular function.') . '

    '; +$help .= '

    ' . __('After typing in your edits, click Update File.') . '

    '; +$help .= '

    ' . __('Advice: think very carefully about your site crashing if you are live-editing the theme currently in use.') . '

    '; +$help .= '

    ' . __('Upgrading to a newer version of the same theme will override changes made here. To avoid this, consider creating a child theme instead.') . '

    '; +if ( is_network_admin() ) + $help .= '

    ' . __('Any edits to files from this screen will be reflected on all sites in the network.') . '

    '; +$help .= '

    ' . __('For more information:') . '

    '; +$help .= '

    ' . __('Documentation on Theme Development') . '

    '; +$help .= '

    ' . __('Documentation on Using Themes') . '

    '; +$help .= '

    ' . __('Documentation on Editing Files') . '

    '; +$help .= '

    ' . __('Documentation on Template Tags') . '

    '; +$help .= '

    ' . __('Support Forums') . '

    '; +add_contextual_help($current_screen, $help); + +wp_reset_vars(array('action', 'redirect', 'profile', 'error', 'warning', 'a', 'file', 'theme', 'dir')); + +wp_admin_css( 'theme-editor' ); + +$themes = get_themes(); + +if (empty($theme)) { + $theme = get_current_theme(); +} else { + $theme = stripslashes($theme); +} + +if ( ! isset($themes[$theme]) ) + wp_die(__('The requested theme does not exist.')); + +$allowed_files = array_merge( $themes[$theme]['Stylesheet Files'], $themes[$theme]['Template Files'] ); + +if ( empty( $file ) ) { + if ( false !== array_search( $themes[$theme]['Stylesheet Dir'] . '/style.css', $allowed_files ) ) + $file = $themes[$theme]['Stylesheet Dir'] . '/style.css'; + else + $file = $allowed_files[0]; +} else { + $file = stripslashes($file); + if ( 'theme' == $dir ) { + $file = dirname(dirname($themes[$theme]['Template Dir'])) . $file ; + } else if ( 'style' == $dir) { + $file = dirname(dirname($themes[$theme]['Stylesheet Dir'])) . $file ; + } +} + +validate_file_to_edit($file, $allowed_files); +$scrollto = isset($_REQUEST['scrollto']) ? (int) $_REQUEST['scrollto'] : 0; +$file_show = basename( $file ); + +switch($action) { + +case 'update': + + check_admin_referer('edit-theme_' . $file . $theme); + + $newcontent = stripslashes($_POST['newcontent']); + $theme = urlencode($theme); + if (is_writeable($file)) { + //is_writable() not always reliable, check return value. see comments @ http://uk.php.net/is_writable + $f = fopen($file, 'w+'); + if ($f !== FALSE) { + fwrite($f, $newcontent); + fclose($f); + $location = "theme-editor.php?file=$file&theme=$theme&a=te&scrollto=$scrollto"; + } else { + $location = "theme-editor.php?file=$file&theme=$theme&scrollto=$scrollto"; + } + } else { + $location = "theme-editor.php?file=$file&theme=$theme&scrollto=$scrollto"; + } + + $location = wp_kses_no_null($location); + $strip = array('%0d', '%0a', '%0D', '%0A'); + $location = _deep_replace($strip, $location); + header("Location: $location"); + exit(); + +break; + +default: + + require_once(ABSPATH . 'wp-admin/admin-header.php'); + + update_recently_edited($file); + + if ( !is_file($file) ) + $error = 1; + + $content = ''; + if ( !$error && filesize($file) > 0 ) { + $f = fopen($file, 'r'); + $content = fread($f, filesize($file)); + + if ( '.php' == substr( $file, strrpos( $file, '.' ) ) ) { + $functions = wp_doc_link_parse( $content ); + + $docs_select = ''; + } + + $content = esc_textarea( $content ); + } + + ?> + +

    +($file_show)" : $file_show; + +$is_child_theme = $themes[$theme]['Template'] != $themes[$theme]['Stylesheet']; +?> +
    + +

    + +
    +
    +

    +
    +
    +
    + + + +
    +
    +
    +
    +
    + +

    + +

    + +
      +($template_show)" : "$description"; + $filedesc = ( $template_file == $file ) ? "$description
      ($template_show)
      " : $filedesc; + $template_mapping[ $description ] = array( _get_template_edit_filename($template_file, $template_dir), $filedesc ); + } + ksort( $template_mapping ); + while ( list( $template_sorted_key, list( $template_file, $filedesc ) ) = each( $template_mapping ) ) : + ?> +
    • + +
    +

    +
      +($style_show)" : "$description"; + $filedesc = ( $style_file == $file ) ? "$description
      ($style_show)
      " : $filedesc; + $template_mapping[ $description ] = array( _get_template_edit_filename($style_file, $stylesheet_dir), $filedesc ); + } + ksort( $template_mapping ); + while ( list( $template_sorted_key, list( $style_file, $filedesc ) ) = each( $template_mapping ) ) : + ?> +
    • + +
    + +
    + +
    + +
    + + + + +
    + +
    + + + +
    + + +
    + +

    +

    + + '2' ) ); + else : ?> +

    the Codex for more information.'); ?>

    + +
    +
    +

    ' . __('Oops, no such file exists! Double check the name and try again, merci.') . '

    '; + } +?> +
    +
    + +get_pagenum(); +$wp_list_table->prepare_items(); + +$title = __('Install Themes'); +$parent_file = 'themes.php'; +if ( !is_network_admin() ) + $submenu_file = 'themes.php'; + +wp_enqueue_style( 'theme-install' ); +wp_enqueue_script( 'theme-install' ); + +add_thickbox(); +wp_enqueue_script( 'theme-preview' ); + +$body_id = $tab; + +do_action('install_themes_pre_' . $tab); //Used to override the general interface, Eg, install or theme information. + +$help = '

    ' . sprintf(__('You can find additional themes for your site by using the Theme Browser/Installer on this screen, which will display themes from the WordPress.org Theme Directory. These themes are designed and developed by third parties, are available free of charge, and are compatible with the license WordPress uses.'), 'http://wordpress.org/extend/themes/') . '

    '; +$help .= '

    ' . __('You can Search for themes by keyword, author, or tag, or can get more specific and search by criteria listed in the feature filter. Alternately, you can browse the themes that are Featured, Newest, or Recently Updated. When you find a theme you like, you can preview it or install it.') . '

    '; +$help .= '

    ' . __('You can Upload a theme manually if you have already downloaded its ZIP archive onto your computer (make sure it is from a trusted and original source). You can also do it the old-fashioned way and copy a downloaded theme’s folder via FTP into your /wp-content/themes directory.') . '

    '; +$help .= '

    ' . __('For more information:') . '

    '; +$help .= '

    ' . __('Documentation on Adding New Themes') . '

    '; +$help .= '

    ' . __('Support Forums') . '

    '; +add_contextual_help($current_screen, $help); + +include(ABSPATH . 'wp-admin/admin-header.php'); +?> +
    + +

    + + + +views(); ?> + +
    + +
    +prepare_items(); + +$title = __('Manage Themes'); +$parent_file = 'themes.php'; + +if ( current_user_can( 'switch_themes' ) ) : + +$help = '

    ' . __('Aside from the default theme included with your WordPress installation, themes are designed and developed by third parties.') . '

    '; +$help .= '

    ' . __('You can see your active theme at the top of the screen. Below are the other themes you have installed that are not currently in use. You can see what your site would look like with one of these themes by clicking the Preview link. To change themes, click the Activate link.') . '

    '; +if ( current_user_can('install_themes') ) + $help .= '

    ' . sprintf(__('If you would like to see more themes to choose from, click on the “Install Themes” tab and you will be able to browse or search for additional themes from the WordPress.org Theme Directory. Themes in the WordPress.org Theme Directory are designed and developed by third parties, and are compatible with the license WordPress uses. Oh, and they’re free!'), 'http://wordpress.org/extend/themes/') . '

    '; + +$help .= '

    ' . __('For more information:') . '

    '; +$help .= '

    ' . __('Documentation on Using Themes') . '

    '; +$help .= '

    ' . __('Support Forums') . '

    '; +add_contextual_help($current_screen, $help); + +add_thickbox(); +wp_enqueue_script( 'theme-preview' ); +wp_enqueue_script( 'theme' ); +wp_enqueue_style( 'theme-install' ); + +endif; + +require_once('./admin-header.php'); +?> + + +

    + +

    widgets settings screen to configure them.'), admin_url( 'widgets.php' ) ); ?>

    +

    Visit site' ), home_url( '/' ) ); ?>

    +

    + + +
    +

    + +

    + +

    +
    +screenshot ) : ?> +<?php _e('Current theme preview'); ?> + +

    title, $ct->version, $ct->author) ; ?>

    +

    description; ?>

    +
    + + {$item[0]}"; + else + $options[] = "{$item[0]}"; + } else if ( current_user_can($item[1]) ) { + if ( file_exists(ABSPATH . 'wp-admin/' . $item[2]) ) { + $options[] = "{$item[0]}"; + } else { + $options[] = "{$item[0]}"; + } + } + } + } + echo implode ( ' | ', $options ); + + if ( $ct->tags ) : ?> +

    tags); ?>

    + +
    + + +
    + +
    +'; + require( './admin-footer.php' ); + exit; +} +?> + +

    + +has_items() ) : ?> + +
    + + + +
    + +
    + +
    +

    + + + + $features ) : + $feature_name = esc_html( $feature_name ); ?> + +
    +
    + +
      + $feature ) : + $feature_name = $feature; + $feature_name = esc_html( $feature_name ); + $feature = esc_attr( $feature ); + ?> +
    1. + features ) ); ?>/> + +
    2. + +
    +
    + + +
    + 'margin-left: 120px', 'id' => 'filter-submit' ) ); ?> +   + +
    +
    +
    +
    +
    + +
    + + + +display(); ?> + +
    +
    + + + +

    +

    + + + + + + + + + + "; + } +?> +
    $title$description
    + +
    + + diff --git a/src/wp-admin/tools.php b/src/wp-admin/tools.php new file mode 100644 index 0000000..48528ae --- /dev/null +++ b/src/wp-admin/tools.php @@ -0,0 +1,63 @@ +' . __('Press This is a bookmarklet that makes it easy to blog about something you come across on the web. You can use it to just grab a link, or to post an excerpt. Press This will even allow you to choose from images included on the page and use them in your post. Just drag the Press This link on this screen to your bookmarks bar in your browser, and you’ll be on your way to easier content creation. Clicking on it while on another website opens a popup window with all these options.') . '

    ' . + '

    ' . __('The Use This link for the Categories and Tags Converter will take you to the Import page, where that Converter is one of the plugins you can download. Once that plugin is installed, the link on this page takes you to a screen where you can choose conversion either way.') . '

    ' . + '

    ' . __('Note: Turbo/Gears is no longer promoted on this screen as it was in previous versions due to the fact that Google has discontinued support for it.') . '

    ' . + '

    ' . __('For more information:') . '

    ' . + '

    ' . __('Documentation on Tools') . '

    ' . + '

    ' . __('Support Forums') . '

    ' +); + +require_once('./admin-header.php'); + +?> +
    + +

    + + +
    +

    +

    + +

    +

    +

    + +
    +cap->manage_terms) || current_user_can($tags->cap->manage_terms) ) : ?> +
    +

    +

    Use this to convert categories to tags or tags to categories.'), 'import.php' ); ?>

    +
    + +
    + diff --git a/src/wp-admin/update-core.php b/src/wp-admin/update-core.php new file mode 100644 index 0000000..85c70a4 --- /dev/null +++ b/src/wp-admin/update-core.php @@ -0,0 +1,505 @@ +locale && 'en_US' == get_locale() ) ? + $update->current : sprintf("%s–%s", $update->current, $update->locale); + $current = false; + if ( !isset($update->response) || 'latest' == $update->response ) + $current = true; + $submit = __('Update Now'); + $form_action = 'update-core.php?action=do-core-upgrade'; + $php_version = phpversion(); + $mysql_version = $wpdb->db_version(); + $show_buttons = true; + if ( 'development' == $update->response ) { + $message = __('You are using a development version of WordPress. You can update to the latest nightly build automatically or download the nightly build and install it manually:'); + $download = __('Download nightly build'); + } else { + if ( $current ) { + $message = sprintf(__('You have the latest version of WordPress. You do not need to update. However, if you want to re-install version %s, you can do so automatically or download the package and re-install manually:'), $version_string); + $submit = __('Re-install Now'); + $form_action = 'update-core.php?action=do-core-reinstall'; + } else { + $php_compat = version_compare( $php_version, $update->php_version, '>=' ); + $mysql_compat = version_compare( $mysql_version, $update->mysql_version, '>=' ) || file_exists( WP_CONTENT_DIR . '/db.php' ); + if ( !$mysql_compat && !$php_compat ) + $message = sprintf( __('You cannot update because WordPress %1$s requires PHP version %2$s or higher and MySQL version %3$s or higher. You are running PHP version %4$s and MySQL version %5$s.'), $update->current, $update->php_version, $update->mysql_version, $php_version, $mysql_version ); + elseif ( !$php_compat ) + $message = sprintf( __('You cannot update because WordPress %1$s requires PHP version %2$s or higher. You are running version %3$s.'), $update->current, $update->php_version, $php_version ); + elseif ( !$mysql_compat ) + $message = sprintf( __('You cannot update because WordPress %1$s requires MySQL version %2$s or higher. You are running version %3$s.'), $update->current, $update->mysql_version, $mysql_version ); + else + $message = sprintf(__('You can update to WordPress %2$s automatically or download the package and install it manually:'), $update->current, $version_string); + if ( !$mysql_compat || !$php_compat ) + $show_buttons = false; + } + $download = sprintf(__('Download %s'), $version_string); + } + + echo '

    '; + echo $message; + echo '

    '; + echo '
    '; + wp_nonce_field('upgrade-core'); + echo '

    '; + echo ''; + echo ''; + if ( $show_buttons ) { + if ( $first_pass ) { + submit_button( $submit, 'button button-primary', 'upgrade', false ); + $first_pass = false; + } else { + submit_button( $submit, 'button', 'upgrade', false ); + } + echo ' ' . $download . ' '; + } + if ( 'en_US' != $update->locale ) + if ( !isset( $update->dismissed ) || !$update->dismissed ) + submit_button( __('Hide this update'), 'button', 'dismiss', false ); + else + submit_button( __('Bring back this update'), 'button', 'undismiss', false ); + echo '

    '; + if ( 'en_US' != $update->locale && ( !isset($wp_local_package) || $wp_local_package != $update->locale ) ) + echo '

    '.__('This localized version contains both the translation and various other localization fixes. You can skip upgrading if you want to keep your current translation.').'

    '; + else if ( 'en_US' == $update->locale && get_locale() != 'en_US' ) { + echo '

    '.sprintf( __('You are about to install WordPress %s in English (US). There is a chance this update will break your translation. You may prefer to wait for the localized version to be released.'), $update->response != 'development' ? $update->current : '' ).'

    '; + } + echo '
    '; + +} + +function dismissed_updates() { + $dismissed = get_core_updates( array( 'dismissed' => true, 'available' => false ) ); + if ( $dismissed ) { + + $show_text = esc_js(__('Show hidden updates')); + $hide_text = esc_js(__('Hide hidden updates')); + ?> + + '.__('Show hidden updates').'

    '; + echo '
      '; + foreach( (array) $dismissed as $update) { + echo '
    • '; + list_core_update( $update ); + echo '
    • '; + } + echo '
    '; + } +} + +/** + * Display upgrade WordPress for downloading latest or upgrading automatically form. + * + * @since 2.7 + * + * @return null + */ +function core_upgrade_preamble() { + global $upgrade_error; + + $updates = get_core_updates(); +?> +
    + +

    +

    '; + if ( $upgrade_error == 'themes' ) + _e('Please select one or more themes to update.'); + else + _e('Please select one or more plugins to update.'); + echo '

    '; + } + + echo '

    '; + /* translators: %1 date, %2 time. */ + printf( __('Last checked on %1$s at %2$s.'), date_i18n( get_option( 'date_format' ) ), date_i18n( get_option( 'time_format' ) ) ); + echo '   ' . __( 'Check Again' ) . ''; + echo '

    '; + + if ( !isset($updates[0]->response) || 'latest' == $updates[0]->response ) { + echo '

    '; + _e('You have the latest version of WordPress.'); + echo '

    '; + } else { + echo '

    '; + _e('Important: before updating, please back up your database and files. For help with updates, visit the Updating WordPress Codex page.'); + echo '

    '; + + echo '

    '; + _e( 'An updated version of WordPress is available.' ); + echo '

    '; + } + + echo '
      '; + $alternate = true; + foreach( (array) $updates as $update ) { + echo '
    • '; + list_core_update( $update ); + echo '
    • '; + } + echo '
    '; + echo '

    ' . __( 'While your site is being updated, it will be in maintenance mode. As soon as your updates are complete, your site will return to normal.' ) . '

    '; + dismissed_updates(); + + if ( current_user_can( 'update_plugins' ) ) + list_plugin_updates(); + if ( current_user_can( 'update_themes' ) ) + list_theme_updates(); + do_action('core_upgrade_preamble'); + echo ''; +} + +function list_plugin_updates() { + global $wp_version; + + $cur_wp_version = preg_replace('/-.*$/', '', $wp_version); + + require_once(ABSPATH . 'wp-admin/includes/plugin-install.php'); + $plugins = get_plugin_updates(); + if ( empty( $plugins ) ) { + echo '

    ' . __( 'Plugins' ) . '

    '; + echo '

    ' . __( 'Your plugins are all up to date.' ) . '

    '; + return; + } + $form_action = 'update-core.php?action=do-plugin-upgrade'; + + $core_updates = get_core_updates(); + if ( !isset($core_updates[0]->response) || 'latest' == $core_updates[0]->response || 'development' == $core_updates[0]->response || version_compare( $core_updates[0]->current, $cur_wp_version, '=') ) + $core_update_version = false; + else + $core_update_version = $core_updates[0]->current; + ?> +

    +

    +
    + +

    + + + + + + + + + + + + + + + + $plugin_data) { + $info = plugins_api('plugin_information', array('slug' => $plugin_data->update->slug )); + // Get plugin compat for running version of WordPress. + if ( isset($info->tested) && version_compare($info->tested, $cur_wp_version, '>=') ) { + $compat = '
    ' . sprintf(__('Compatibility with WordPress %1$s: 100%% (according to its author)'), $cur_wp_version); + } elseif ( isset($info->compatibility[$cur_wp_version][$plugin_data->update->new_version]) ) { + $compat = $info->compatibility[$cur_wp_version][$plugin_data->update->new_version]; + $compat = '
    ' . sprintf(__('Compatibility with WordPress %1$s: %2$d%% (%3$d "works" votes out of %4$d total)'), $cur_wp_version, $compat[0], $compat[2], $compat[1]); + } else { + $compat = '
    ' . sprintf(__('Compatibility with WordPress %1$s: Unknown'), $cur_wp_version); + } + // Get plugin compat for updated version of WordPress. + if ( $core_update_version ) { + if ( isset($info->compatibility[$core_update_version][$plugin_data->update->new_version]) ) { + $update_compat = $info->compatibility[$core_update_version][$plugin_data->update->new_version]; + $compat .= '
    ' . sprintf(__('Compatibility with WordPress %1$s: %2$d%% (%3$d "works" votes out of %4$d total)'), $core_update_version, $update_compat[0], $update_compat[2], $update_compat[1]); + } else { + $compat .= '
    ' . sprintf(__('Compatibility with WordPress %1$s: Unknown'), $core_update_version); + } + } + // Get the upgrade notice for the new plugin version. + if ( isset($plugin_data->update->upgrade_notice) ) { + $upgrade_notice = '
    ' . strip_tags($plugin_data->update->upgrade_notice); + } else { + $upgrade_notice = ''; + } + echo " + + + + "; + } +?> + +
    {$plugin_data->Name}
    " . sprintf(__('You have version %1$s installed. Update to %2$s.'), $plugin_data->Version, $plugin_data->update->new_version) . $compat . $upgrade_notice . "
    +

    +
    +' . __( 'Themes' ) . ''; + echo '

    ' . __( 'Your themes are all up to date.' ) . '

    '; + return; + } + + $form_action = 'update-core.php?action=do-theme-upgrade'; + +?> +

    +

    +

    Please Note: Any customizations you have made to theme files will be lost. Please consider using child themes for modifications.'), _x('http://codex.wordpress.org/Child_Themes', 'Link used in suggestion to use child themes in GUU') ); ?>

    +
    + +

    + + + + + + + + + + + + + + + + $theme_data) { + $screenshot = $theme_data->{'Theme Root URI'} . '/' . $stylesheet . '/' . $theme_data->Screenshot; + + echo " + + + + "; + } +?> + +
    {$theme_data->Name}" . sprintf(__('You have version %1$s installed. Update to %2$s.'), $theme_data->Version, $theme_data->update['new_version']) . "
    +

    +
    + +
    + +

    +errors->get_error_code() ) { + foreach ( $wp_filesystem->errors->get_error_messages() as $message ) + show_message($message); + echo '
    '; + return; + } + + if ( $reinstall ) + $update->response = 'reinstall'; + + $result = wp_update_core($update, 'show_message'); + + if ( is_wp_error($result) ) { + show_message($result); + if ('up_to_date' != $result->get_error_code() ) + show_message( __('Installation Failed') ); + } else { + show_message( __('WordPress updated successfully') ); + show_message( '' . __('Go to Dashboard') . '' ); + } + echo ''; +} + +function do_dismiss_core_update() { + $version = isset( $_POST['version'] )? $_POST['version'] : false; + $locale = isset( $_POST['locale'] )? $_POST['locale'] : 'en_US'; + $update = find_core_update( $version, $locale ); + if ( !$update ) + return; + dismiss_core_update( $update ); + wp_redirect( wp_nonce_url('update-core.php?action=upgrade-core', 'upgrade-core') ); + exit; +} + +function do_undismiss_core_update() { + $version = isset( $_POST['version'] )? $_POST['version'] : false; + $locale = isset( $_POST['locale'] )? $_POST['locale'] : 'en_US'; + $update = find_core_update( $version, $locale ); + if ( !$update ) + return; + undismiss_core_update( $version, $locale ); + wp_redirect( wp_nonce_url('update-core.php?action=upgrade-core', 'upgrade-core') ); + exit; +} + +function no_update_actions($actions) { + return ''; +} + +$action = isset($_GET['action']) ? $_GET['action'] : 'upgrade-core'; + +$upgrade_error = false; +if ( ( 'do-theme-upgrade' == $action || ( 'do-plugin-upgrade' == $action && ! isset( $_GET['plugins'] ) ) ) + && ! isset( $_POST['checked'] ) ) { + $upgrade_error = $action == 'do-theme-upgrade' ? 'themes' : 'plugins'; + $action = 'upgrade-core'; +} + +$title = __('WordPress Updates'); +$parent_file = 'tools.php'; + +add_contextual_help($current_screen, + '

    ' . __('This screen lets you update to the latest version of WordPress as well as update your themes and plugins from the WordPress.org repository. When updates are available, the number of available updates will appear in a bubble on the left hand menu as a notification. It is very important to keep your WordPress installation up to date for security reasons, so when you see a number appear, make sure you take the time to update, which is an easy process.') . '

    ' . + '

    ' . __('Updating your WordPress installation is a simple one-click procedure; just click on the Update button when it says a new version is available.') . '

    ' . + '

    ' . __('To update themes or plugins from this screen, use the checkboxes to make your selection and click on the appropriate Update button. Check the box at the top of the Themes or Plugins section to select all and update them all at once.') . '

    ' . + '

    ' . __('For more information:') . '

    ' . + '

    ' . __('Documentation on Updating WordPress') . '

    ' . + '

    ' . __('Support Forums') . '

    ' +); + +if ( 'upgrade-core' == $action ) { + + wp_version_check(); + require_once(ABSPATH . 'wp-admin/admin-header.php'); + core_upgrade_preamble(); + include(ABSPATH . 'wp-admin/admin-footer.php'); + +} elseif ( 'do-core-upgrade' == $action || 'do-core-reinstall' == $action ) { + check_admin_referer('upgrade-core'); + + // do the (un)dismiss actions before headers, + // so that they can redirect + if ( isset( $_POST['dismiss'] ) ) + do_dismiss_core_update(); + elseif ( isset( $_POST['undismiss'] ) ) + do_undismiss_core_update(); + + require_once(ABSPATH . 'wp-admin/admin-header.php'); + if ( 'do-core-reinstall' == $action ) + $reinstall = true; + else + $reinstall = false; + + if ( isset( $_POST['upgrade'] ) ) + do_core_upgrade($reinstall); + + include(ABSPATH . 'wp-admin/admin-footer.php'); + +} elseif ( 'do-plugin-upgrade' == $action ) { + + if ( ! current_user_can( 'update_plugins' ) ) + wp_die( __( 'You do not have sufficient permissions to update this site.' ) ); + + check_admin_referer('upgrade-core'); + + if ( isset( $_GET['plugins'] ) ) { + $plugins = explode( ',', $_GET['plugins'] ); + } elseif ( isset( $_POST['checked'] ) ) { + $plugins = (array) $_POST['checked']; + } else { + wp_redirect( admin_url('update-core.php') ); + exit; + } + + $url = 'update.php?action=update-selected&plugins=' . urlencode(implode(',', $plugins)); + $url = wp_nonce_url($url, 'bulk-update-plugins'); + + $title = __('Update Plugins'); + + require_once(ABSPATH . 'wp-admin/admin-header.php'); + echo '
    '; + screen_icon('plugins'); + echo '

    ' . esc_html__('Update Plugins') . '

    '; + echo ""; + echo '
    '; + include(ABSPATH . 'wp-admin/admin-footer.php'); + +} elseif ( 'do-theme-upgrade' == $action ) { + + if ( ! current_user_can( 'update_themes' ) ) + wp_die( __( 'You do not have sufficient permissions to update this site.' ) ); + + check_admin_referer('upgrade-core'); + + if ( isset( $_GET['themes'] ) ) { + $themes = explode( ',', $_GET['themes'] ); + } elseif ( isset( $_POST['checked'] ) ) { + $themes = (array) $_POST['checked']; + } else { + wp_redirect( admin_url('update-core.php') ); + exit; + } + + $url = 'update.php?action=update-selected-themes&themes=' . urlencode(implode(',', $themes)); + $url = wp_nonce_url($url, 'bulk-update-themes'); + + $title = __('Update Themes'); + + require_once(ABSPATH . 'wp-admin/admin-header.php'); + echo '
    '; + screen_icon('themes'); + echo '

    ' . esc_html__('Update Themes') . '

    '; + echo ""; + echo '
    '; + include(ABSPATH . 'wp-admin/admin-footer.php'); + +} else { + do_action('update-core-custom_' . $action); +} \ No newline at end of file diff --git a/src/wp-admin/update.php b/src/wp-admin/update.php new file mode 100644 index 0000000..e529064 --- /dev/null +++ b/src/wp-admin/update.php @@ -0,0 +1,250 @@ +bulk_upgrade( $plugins ); + + iframe_footer(); + + } elseif ( 'upgrade-plugin' == $action ) { + if ( ! current_user_can('update_plugins') ) + wp_die(__('You do not have sufficient permissions to update plugins for this site.')); + + check_admin_referer('upgrade-plugin_' . $plugin); + + $title = __('Update Plugin'); + $parent_file = 'plugins.php'; + $submenu_file = 'plugins.php'; + require_once(ABSPATH . 'wp-admin/admin-header.php'); + + $nonce = 'upgrade-plugin_' . $plugin; + $url = 'update.php?action=upgrade-plugin&plugin=' . $plugin; + + $upgrader = new Plugin_Upgrader( new Plugin_Upgrader_Skin( compact('title', 'nonce', 'url', 'plugin') ) ); + $upgrader->upgrade($plugin); + + include(ABSPATH . 'wp-admin/admin-footer.php'); + + } elseif ('activate-plugin' == $action ) { + if ( ! current_user_can('update_plugins') ) + wp_die(__('You do not have sufficient permissions to update plugins for this site.')); + + check_admin_referer('activate-plugin_' . $plugin); + if ( ! isset($_GET['failure']) && ! isset($_GET['success']) ) { + wp_redirect( admin_url('update.php?action=activate-plugin&failure=true&plugin=' . $plugin . '&_wpnonce=' . $_GET['_wpnonce']) ); + activate_plugin( $plugin, '', ! empty( $_GET['networkwide'] ), true ); + wp_redirect( admin_url('update.php?action=activate-plugin&success=true&plugin=' . $plugin . '&_wpnonce=' . $_GET['_wpnonce']) ); + die(); + } + iframe_header( __('Plugin Reactivation'), true ); + if ( isset($_GET['success']) ) + echo '

    ' . __('Plugin reactivated successfully.') . '

    '; + + if ( isset($_GET['failure']) ){ + echo '

    ' . __('Plugin failed to reactivate due to a fatal error.') . '

    '; + + error_reporting( E_CORE_ERROR | E_CORE_WARNING | E_COMPILE_ERROR | E_ERROR | E_WARNING | E_PARSE | E_USER_ERROR | E_USER_WARNING | E_RECOVERABLE_ERROR ); + @ini_set('display_errors', true); //Ensure that Fatal errors are displayed. + include(WP_PLUGIN_DIR . '/' . $plugin); + } + iframe_footer(); + } elseif ( 'install-plugin' == $action ) { + + if ( ! current_user_can('install_plugins') ) + wp_die(__('You do not have sufficient permissions to install plugins for this site.')); + + include_once ABSPATH . 'wp-admin/includes/plugin-install.php'; //for plugins_api.. + + check_admin_referer('install-plugin_' . $plugin); + $api = plugins_api('plugin_information', array('slug' => $plugin, 'fields' => array('sections' => false) ) ); //Save on a bit of bandwidth. + + if ( is_wp_error($api) ) + wp_die($api); + + $title = __('Plugin Install'); + $parent_file = 'plugins.php'; + $submenu_file = 'plugin-install.php'; + require_once(ABSPATH . 'wp-admin/admin-header.php'); + + $title = sprintf( __('Installing Plugin: %s'), $api->name . ' ' . $api->version ); + $nonce = 'install-plugin_' . $plugin; + $url = 'update.php?action=install-plugin&plugin=' . $plugin; + if ( isset($_GET['from']) ) + $url .= '&from=' . urlencode(stripslashes($_GET['from'])); + + $type = 'web'; //Install plugin type, From Web or an Upload. + + $upgrader = new Plugin_Upgrader( new Plugin_Installer_Skin( compact('title', 'url', 'nonce', 'plugin', 'api') ) ); + $upgrader->install($api->download_link); + + include(ABSPATH . 'wp-admin/admin-footer.php'); + + } elseif ( 'upload-plugin' == $action ) { + + if ( ! current_user_can('install_plugins') ) + wp_die(__('You do not have sufficient permissions to install plugins for this site.')); + + check_admin_referer('plugin-upload'); + + $file_upload = new File_Upload_Upgrader('pluginzip', 'package'); + + $title = __('Upload Plugin'); + $parent_file = 'plugins.php'; + $submenu_file = 'plugin-install.php'; + require_once(ABSPATH . 'wp-admin/admin-header.php'); + + $title = sprintf( __('Installing Plugin from uploaded file: %s'), basename( $file_upload->filename ) ); + $nonce = 'plugin-upload'; + $url = add_query_arg(array('package' => $file_upload->filename ), 'update.php?action=upload-plugin'); + $type = 'upload'; //Install plugin type, From Web or an Upload. + + $upgrader = new Plugin_Upgrader( new Plugin_Installer_Skin( compact('type', 'title', 'nonce', 'url') ) ); + $upgrader->install( $file_upload->package ); + + include(ABSPATH . 'wp-admin/admin-footer.php'); + + } elseif ( 'upgrade-theme' == $action ) { + + if ( ! current_user_can('update_themes') ) + wp_die(__('You do not have sufficient permissions to update themes for this site.')); + + check_admin_referer('upgrade-theme_' . $theme); + + add_thickbox(); + wp_enqueue_script('theme-preview'); + $title = __('Update Theme'); + $parent_file = 'themes.php'; + $submenu_file = 'themes.php'; + require_once(ABSPATH . 'wp-admin/admin-header.php'); + + $nonce = 'upgrade-theme_' . $theme; + $url = 'update.php?action=upgrade-theme&theme=' . $theme; + + $upgrader = new Theme_Upgrader( new Theme_Upgrader_Skin( compact('title', 'nonce', 'url', 'theme') ) ); + $upgrader->upgrade($theme); + + include(ABSPATH . 'wp-admin/admin-footer.php'); + } elseif ( 'update-selected-themes' == $action ) { + if ( ! current_user_can( 'update_themes' ) ) + wp_die( __( 'You do not have sufficient permissions to update themes for this site.' ) ); + + check_admin_referer( 'bulk-update-themes' ); + + if ( isset( $_GET['themes'] ) ) + $themes = explode( ',', stripslashes($_GET['themes']) ); + elseif ( isset( $_POST['checked'] ) ) + $themes = (array) $_POST['checked']; + else + $themes = array(); + + $themes = array_map('urldecode', $themes); + + $url = 'update.php?action=update-selected-themes&themes=' . urlencode(implode(',', $themes)); + $nonce = 'bulk-update-themes'; + + wp_enqueue_script('jquery'); + iframe_header(); + + $upgrader = new Theme_Upgrader( new Bulk_Theme_Upgrader_Skin( compact( 'nonce', 'url' ) ) ); + $upgrader->bulk_upgrade( $themes ); + + iframe_footer(); + } elseif ( 'install-theme' == $action ) { + + if ( ! current_user_can('install_themes') ) + wp_die(__('You do not have sufficient permissions to install themes for this site.')); + + include_once ABSPATH . 'wp-admin/includes/theme-install.php'; //for themes_api.. + + check_admin_referer('install-theme_' . $theme); + $api = themes_api('theme_information', array('slug' => $theme, 'fields' => array('sections' => false) ) ); //Save on a bit of bandwidth. + + if ( is_wp_error($api) ) + wp_die($api); + + add_thickbox(); + wp_enqueue_script('theme-preview'); + $title = __('Install Themes'); + $parent_file = 'themes.php'; + $submenu_file = 'themes.php'; + require_once(ABSPATH . 'wp-admin/admin-header.php'); + + $title = sprintf( __('Installing Theme: %s'), $api->name . ' ' . $api->version ); + $nonce = 'install-theme_' . $theme; + $url = 'update.php?action=install-theme&theme=' . $theme; + $type = 'web'; //Install theme type, From Web or an Upload. + + $upgrader = new Theme_Upgrader( new Theme_Installer_Skin( compact('title', 'url', 'nonce', 'plugin', 'api') ) ); + $upgrader->install($api->download_link); + + include(ABSPATH . 'wp-admin/admin-footer.php'); + + } elseif ( 'upload-theme' == $action ) { + + if ( ! current_user_can('install_themes') ) + wp_die(__('You do not have sufficient permissions to install themes for this site.')); + + check_admin_referer('theme-upload'); + + $file_upload = new File_Upload_Upgrader('themezip', 'package'); + + $title = __('Upload Theme'); + $parent_file = 'themes.php'; + $submenu_file = 'theme-install.php'; + add_thickbox(); + wp_enqueue_script('theme-preview'); + require_once(ABSPATH . 'wp-admin/admin-header.php'); + + $title = sprintf( __('Installing Theme from uploaded file: %s'), basename( $file_upload->filename ) ); + $nonce = 'theme-upload'; + $url = add_query_arg(array('package' => $file_upload->filename), 'update.php?action=upload-theme'); + $type = 'upload'; //Install plugin type, From Web or an Upload. + + $upgrader = new Theme_Upgrader( new Theme_Installer_Skin( compact('type', 'title', 'nonce', 'url') ) ); + $upgrader->install( $file_upload->package ); + + include(ABSPATH . 'wp-admin/admin-footer.php'); + + } else { + do_action('update-custom_' . $action); + } +} diff --git a/src/wp-admin/upgrade-functions.php b/src/wp-admin/upgrade-functions.php new file mode 100644 index 0000000..ca14a59 --- /dev/null +++ b/src/wp-admin/upgrade-functions.php @@ -0,0 +1,13 @@ + diff --git a/src/wp-admin/upgrade.php b/src/wp-admin/upgrade.php new file mode 100644 index 0000000..794b55b --- /dev/null +++ b/src/wp-admin/upgrade.php @@ -0,0 +1,110 @@ +db_version(); +$php_compat = version_compare( $php_version, $required_php_version, '>=' ); +$mysql_compat = version_compare( $mysql_version, $required_mysql_version, '>=' ) || file_exists( WP_CONTENT_DIR . '/db.php' ); + +@header( 'Content-Type: ' . get_option( 'html_type' ) . '; charset=' . get_option( 'blog_charset' ) ); +?> + +> + + + <?php _e( 'WordPress › Update' ); ?> + + + +

    WordPress

    + + + +

    +

    +

    + +WordPress %1$s requires PHP version %2$s or higher and MySQL version %3$s or higher. You are running PHP version %4$s and MySQL version %5$s.'), $wp_version, $required_php_version, $required_mysql_version, $php_version, $mysql_version ); + elseif ( !$php_compat ) + printf( __('You cannot update because WordPress %1$s requires PHP version %2$s or higher. You are running version %3$s.'), $wp_version, $required_php_version, $php_version ); + elseif ( !$mysql_compat ) + printf( __('You cannot update because WordPress %1$s requires MySQL version %2$s or higher. You are running version %3$s.'), $wp_version, $required_mysql_version, $mysql_version ); +?> + +

    +

    +

    +

    + +

    +

    +

    + + + + + + diff --git a/src/wp-admin/upload.php b/src/wp-admin/upload.php new file mode 100644 index 0000000..e121207 --- /dev/null +++ b/src/wp-admin/upload.php @@ -0,0 +1,222 @@ +get_pagenum(); + +// Handle bulk actions +$doaction = $wp_list_table->current_action(); + +if ( $doaction ) { + check_admin_referer('bulk-media'); + + if ( 'delete_all' == $doaction ) { + $post_ids = $wpdb->get_col( "SELECT ID FROM $wpdb->posts WHERE post_type='attachment' AND post_status = 'trash'" ); + $doaction = 'delete'; + } elseif ( isset( $_REQUEST['media'] ) ) { + $post_ids = $_REQUEST['media']; + } elseif ( isset( $_REQUEST['ids'] ) ) { + $post_ids = explode( ',', $_REQUEST['ids'] ); + } + + $location = 'upload.php'; + if ( $referer = wp_get_referer() ) { + if ( false !== strpos( $referer, 'upload.php' ) ) + $location = remove_query_arg( array( 'trashed', 'untrashed', 'deleted', 'message', 'ids', 'posted' ), $referer ); + } + + switch ( $doaction ) { + case 'find_detached': + if ( !current_user_can('edit_posts') ) + wp_die( __('You are not allowed to scan for lost attachments.') ); + + $lost = $wpdb->get_col( " + SELECT ID FROM $wpdb->posts + WHERE post_type = 'attachment' AND post_parent > '0' + AND post_parent NOT IN ( + SELECT ID FROM $wpdb->posts + WHERE post_type NOT IN ( 'attachment', '" . join( "', '", get_post_types( array( 'public' => false ) ) ) . "' ) + ) + " ); + + $_REQUEST['detached'] = 1; + break; + case 'attach': + $parent_id = (int) $_REQUEST['found_post_id']; + if ( !$parent_id ) + return; + + $parent = &get_post( $parent_id ); + if ( !current_user_can( 'edit_post', $parent_id ) ) + wp_die( __( 'You are not allowed to edit this post.' ) ); + + $attach = array(); + foreach ( (array) $_REQUEST['media'] as $att_id ) { + $att_id = (int) $att_id; + + if ( !current_user_can( 'edit_post', $att_id ) ) + continue; + + $attach[] = $att_id; + clean_attachment_cache( $att_id ); + } + + if ( ! empty( $attach ) ) { + $attach = implode( ',', $attach ); + $attached = $wpdb->query( $wpdb->prepare( "UPDATE $wpdb->posts SET post_parent = %d WHERE post_type = 'attachment' AND ID IN ( $attach )", $parent_id ) ); + } + + if ( isset( $attached ) ) { + $location = 'upload.php'; + if ( $referer = wp_get_referer() ) { + if ( false !== strpos( $referer, 'upload.php' ) ) + $location = $referer; + } + + $location = add_query_arg( array( 'attached' => $attached ) , $location ); + wp_redirect( $location ); + exit; + } + break; + case 'trash': + foreach ( (array) $post_ids as $post_id ) { + if ( !current_user_can( 'delete_post', $post_id ) ) + wp_die( __( 'You are not allowed to move this post to the trash.' ) ); + + if ( !wp_trash_post( $post_id ) ) + wp_die( __( 'Error in moving to trash...' ) ); + } + $location = add_query_arg( array( 'trashed' => count( $post_ids ), 'ids' => join( ',', $post_ids ) ), $location ); + break; + case 'untrash': + foreach ( (array) $post_ids as $post_id ) { + if ( !current_user_can( 'delete_post', $post_id ) ) + wp_die( __( 'You are not allowed to move this post out of the trash.' ) ); + + if ( !wp_untrash_post( $post_id ) ) + wp_die( __( 'Error in restoring from trash...' ) ); + } + $location = add_query_arg( 'untrashed', count( $post_ids ), $location ); + break; + case 'delete': + foreach ( (array) $post_ids as $post_id_del ) { + if ( !current_user_can( 'delete_post', $post_id_del ) ) + wp_die( __( 'You are not allowed to delete this post.' ) ); + + if ( !wp_delete_attachment( $post_id_del ) ) + wp_die( __( 'Error in deleting...' ) ); + } + $location = add_query_arg( 'deleted', count( $post_ids ), $location ); + break; + } + + wp_redirect( $location ); + exit; +} elseif ( ! empty( $_GET['_wp_http_referer'] ) ) { + wp_redirect( remove_query_arg( array( '_wp_http_referer', '_wpnonce' ), stripslashes( $_SERVER['REQUEST_URI'] ) ) ); + exit; +} + +$wp_list_table->prepare_items(); + +$title = __('Media Library'); +$parent_file = 'upload.php'; + +wp_enqueue_script( 'wp-ajax-response' ); +wp_enqueue_script( 'jquery-ui-draggable' ); +wp_enqueue_script( 'media' ); + +add_screen_option( 'per_page', array('label' => _x( 'Media items', 'items per page (screen options)' )) ); + +add_contextual_help( $current_screen, + '

    ' . __( 'All the files you’ve uploaded are listed in the Media Library, with the most recent uploads listed first. You can use the Screen Options tab to customize the display of this screen.' ) . '

    ' . + '

    ' . __( 'You can narrow the list by file type/status using the text link filters at the top of the screen. You also can refine the list by date using the dropdown menu above the media table.' ) . '

    ' . + '

    ' . __( 'Hovering over a row reveals action links: Edit, Delete Permanently, and View. Clicking Edit or on the media file’s name displays a simple screen to edit that individual file’s metadata. Clicking Delete Permanently will delete the file from the media library (as well as from any posts to which it is currently attached). View will take you to the display page for that file.' ) . '

    ' . + '

    ' . __( 'If a media file has not been attached to any post, you will see that in the Attached To column, and can click on Attach File to launch a small popup that will allow you to search for a post and attach the file.' ) . '

    ' . + '

    ' . __( 'For more information:' ) . '

    ' . + '

    ' . __( 'Documentation on Media Library' ) . '

    ' . + '

    ' . __( 'Support Forums' ) . '

    ' +); + +require_once('./admin-header.php'); +?> + +
    + +

    ' . __('Search results for “%s”') . '', get_search_query() ); ?> +

    + +' . __('Undo') . ''; + $_SERVER['REQUEST_URI'] = remove_query_arg(array('trashed'), $_SERVER['REQUEST_URI']); +} + +if ( isset($_GET['untrashed']) && (int) $_GET['untrashed'] ) { + $message = sprintf( _n( 'Media attachment restored from the trash.', '%d media attachments restored from the trash.', $_GET['untrashed'] ), number_format_i18n( $_GET['untrashed'] ) ); + $_SERVER['REQUEST_URI'] = remove_query_arg(array('untrashed'), $_SERVER['REQUEST_URI']); +} + +$messages[1] = __('Media attachment updated.'); +$messages[2] = __('Media permanently deleted.'); +$messages[3] = __('Error saving media attachment.'); +$messages[4] = __('Media moved to the trash.') . ' ' . __('Undo') . ''; +$messages[5] = __('Media restored from the trash.'); + +if ( isset($_GET['message']) && (int) $_GET['message'] ) { + $message = $messages[$_GET['message']]; + $_SERVER['REQUEST_URI'] = remove_query_arg(array('message'), $_SERVER['REQUEST_URI']); +} + +if ( !empty($message) ) { ?> +

    + + +views(); ?> + +
    + +search_box( __( 'Search Media' ), 'media' ); ?> + +display(); ?> + +
    + +
    + +
    +
    + +ID ) ); + +if ( ! $user_id && IS_PROFILE_PAGE ) + $user_id = $current_user->ID; +elseif ( ! $user_id && ! IS_PROFILE_PAGE ) + wp_die(__( 'Invalid user ID.' ) ); +elseif ( ! get_userdata( $user_id ) ) + wp_die( __('Invalid user ID.') ); + +wp_enqueue_script('user-profile'); + +$title = IS_PROFILE_PAGE ? __('Profile') : __('Edit User'); +if ( current_user_can('edit_users') && !IS_PROFILE_PAGE ) + $submenu_file = 'users.php'; +else + $submenu_file = 'profile.php'; + +if ( current_user_can('edit_users') && !is_user_admin() ) + $parent_file = 'users.php'; +else + $parent_file = 'profile.php'; + +// contextual help - choose Help on the top right of admin panel to preview this. +add_contextual_help($current_screen, + '

    ' . __('Your profile contains information about you (your “account”) as well as some personal options related to using WordPress.') . '

    ' . + '

    ' . __('You can change your password, turn on keyboard shortcuts, change the color scheme of your WordPress administration screens, and turn off the WYSIWYG (Visual) editor, among other things.') . '

    ' . + '

    ' . __('Your username cannot be changed, but you can use other fields to enter your real name or a nickname, and change which name to display on your posts.') . '

    ' . + '

    ' . __('Required fields are indicated; the rest are optional. Profile information will only be displayed if your theme is set up to do so.') . '

    ' . + '

    ' . __('Remember to click the Update Profile button when you are finished.') . '

    ' . + '

    ' . __('For more information:') . '

    ' . + '

    ' . __('Documentation on User Profiles') . '

    ' . + '

    ' . __('Support Forums') . '

    ' +); + + +$wp_http_referer = remove_query_arg(array('update', 'delete_count'), stripslashes($wp_http_referer)); + +$user_can_edit = current_user_can( 'edit_posts' ) || current_user_can( 'edit_pages' ); + +/** + * Optional SSL preference that can be turned on by hooking to the 'personal_options' action. + * + * @since 2.7.0 + * + * @param object $user User data object + */ +function use_ssl_preference($user) { +?> + + + + +ID && ! apply_filters( 'enable_edit_any_user_configuration', true ) ) + wp_die( __( 'You do not have permission to edit this user.' ) ); + +// Execute confirmed email change. See send_confirmation_on_profile_email(). +if ( is_multisite() && IS_PROFILE_PAGE && isset( $_GET[ 'newuseremail' ] ) && $current_user->ID ) { + $new_email = get_option( $current_user->ID . '_new_email' ); + if ( $new_email[ 'hash' ] == $_GET[ 'newuseremail' ] ) { + $user->ID = $current_user->ID; + $user->user_email = esc_html( trim( $new_email[ 'newemail' ] ) ); + if ( $wpdb->get_var( $wpdb->prepare( "SELECT user_login FROM {$wpdb->signups} WHERE user_login = %s", $current_user->user_login ) ) ) + $wpdb->query( $wpdb->prepare( "UPDATE {$wpdb->signups} SET user_email = %s WHERE user_login = %s", $user->user_email, $current_user->user_login ) ); + wp_update_user( get_object_vars( $user ) ); + delete_option( $current_user->ID . '_new_email' ); + wp_redirect( add_query_arg( array('updated' => 'true'), self_admin_url( 'profile.php' ) ) ); + die(); + } +} elseif ( is_multisite() && IS_PROFILE_PAGE && !empty( $_GET['dismiss'] ) && $current_user->ID . '_new_email' == $_GET['dismiss'] ) { + delete_option( $current_user->ID . '_new_email' ); + wp_redirect( add_query_arg( array('updated' => 'true'), self_admin_url( 'profile.php' ) ) ); + die(); +} + +switch ($action) { +case 'update': + +check_admin_referer('update-user_' . $user_id); + +if ( !current_user_can('edit_user', $user_id) ) + wp_die(__('You do not have permission to edit this user.')); + +if ( IS_PROFILE_PAGE ) + do_action('personal_options_update', $user_id); +else + do_action('edit_user_profile_update', $user_id); + +if ( !is_multisite() ) { + $errors = edit_user($user_id); +} else { + $user = get_userdata( $user_id ); + + // Update the email address in signups, if present. + if ( $user->user_login && isset( $_POST[ 'email' ] ) && is_email( $_POST[ 'email' ] ) && $wpdb->get_var( $wpdb->prepare( "SELECT user_login FROM {$wpdb->signups} WHERE user_login = %s", $user->user_login ) ) ) + $wpdb->query( $wpdb->prepare( "UPDATE {$wpdb->signups} SET user_email = %s WHERE user_login = %s", $_POST[ 'email' ], $user_login ) ); + + // WPMU must delete the user from the current blog if WP added him after editing. + $delete_role = false; + $blog_prefix = $wpdb->get_blog_prefix(); + if ( $user_id != $current_user->ID ) { + $cap = $wpdb->get_var( "SELECT meta_value FROM {$wpdb->usermeta} WHERE user_id = '{$user_id}' AND meta_key = '{$blog_prefix}capabilities' AND meta_value = 'a:0:{}'" ); + if ( !is_network_admin() && null == $cap && $_POST[ 'role' ] == '' ) { + $_POST[ 'role' ] = 'contributor'; + $delete_role = true; + } + } + if ( !isset( $errors ) || ( isset( $errors ) && is_object( $errors ) && false == $errors->get_error_codes() ) ) + $errors = edit_user($user_id); + if ( $delete_role ) // stops users being added to current blog when they are edited + delete_user_meta( $user_id, $blog_prefix . 'capabilities' ); + + if ( is_multisite() && is_network_admin() && !IS_PROFILE_PAGE && current_user_can( 'manage_network_options' ) && !isset($super_admins) && empty( $_POST['super_admin'] ) == is_super_admin( $user_id ) ) + empty( $_POST['super_admin'] ) ? revoke_super_admin( $user_id ) : grant_super_admin( $user_id ); +} + +if ( !is_wp_error( $errors ) ) { + $redirect = (IS_PROFILE_PAGE ? "profile.php?" : "user-edit.php?user_id=$user_id&"). "updated=true"; + if ( $wp_http_referer ) + $redirect = add_query_arg('wp_http_referer', urlencode($wp_http_referer), $redirect); + wp_redirect($redirect); + exit; +} + +default: +$profileuser = get_user_to_edit($user_id); + +if ( !current_user_can('edit_user', $user_id) ) + wp_die(__('You do not have permission to edit this user.')); + +include (ABSPATH . 'wp-admin/admin-header.php'); +?> + +ID ) && current_user_can( 'manage_network_options' ) ) { ?> +

    + + +
    +

    + +

    + +
    + + +

    \n

    ", $errors->get_error_messages() ); ?>

    + + +
    + +

    + + + + + +

    + +
    > + + + + +

    + + +

    + +

    + + + + + + + + + 1 && has_action('admin_color_scheme_picker') ) : ?> + + + + + + + + + + + + + + + +
    More information'); ?>
    +
    +
    +
    + + +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    +user_email != get_site_option( 'admin_email' ) ) : ?> +

    + +

    + +
    + +
    + +

    + + + + + + + + + + + + + $desc) { +?> + + + + + +
    + ID . '_new_email' ); + if ( $new_email && $new_email != $current_user->user_email ) : ?> +
    +

    %1$s. Cancel'), $new_email['newemail'], esc_url( self_admin_url( 'profile.php?dismiss=' . $current_user->ID . '_new_email' ) ) ); ?>

    +
    + +
    + +

    + + + + + + + + + + + + + +

    +

    +
    +
    +

    +
    + + + +caps) > count($profileuser->roles) && apply_filters('additional_capabilities_display', true, $profileuser) ) { ?> +
    + + + + + +
    caps as $cap => $value ) { + if ( !$wp_roles->is_role($cap) ) { + if ( $output != '' ) + $output .= ', '; + $output .= $value ? $cap : "Denied: {$cap}"; + } + } + echo $output; + ?>
    + + + + + + + +
    +
    + + + diff --git a/src/wp-admin/user-new.php b/src/wp-admin/user-new.php new file mode 100644 index 0000000..cef46a3 --- /dev/null +++ b/src/wp-admin/user-new.php @@ -0,0 +1,350 @@ + 'enter_email'), 'user-new.php' ) ); + die(); + } + } + + if ( !$user_details ) { + wp_redirect( add_query_arg( array('update' => 'does_not_exist'), 'user-new.php' ) ); + die(); + } + + if ( ! current_user_can('promote_user', $user_details->ID) ) + wp_die(__('Cheatin’ uh?')); + + // Adding an existing user to this blog + $new_user_email = esc_html(trim($_REQUEST['email'])); + $redirect = 'user-new.php'; + $username = $user_details->user_login; + $user_id = $user_details->ID; + if ( ( $username != null && !is_super_admin( $user_id ) ) && ( array_key_exists($blog_id, get_blogs_of_user($user_id)) ) ) { + $redirect = add_query_arg( array('update' => 'addexisting'), 'user-new.php' ); + } else { + if ( isset( $_POST[ 'noconfirmation' ] ) && is_super_admin() ) { + add_existing_user_to_blog( array( 'user_id' => $user_id, 'role' => $_REQUEST[ 'role' ] ) ); + $redirect = add_query_arg( array('update' => 'addnoconfirmation'), 'user-new.php' ); + } else { + $newuser_key = substr( md5( $user_id ), 0, 5 ); + add_option( 'new_user_' . $newuser_key, array( 'user_id' => $user_id, 'email' => $user_details->user_email, 'role' => $_REQUEST[ 'role' ] ) ); + $message = __("Hi,\n\nYou have been invited to join '%s' at\n%s as a %s.\nPlease click the following link to confirm the invite:\n%s\n"); + wp_mail( $new_user_email, sprintf( __( '[%s] Joining confirmation' ), get_option( 'blogname' ) ), sprintf($message, get_option('blogname'), site_url(), $_REQUEST[ 'role' ], site_url("/newbloguser/$newuser_key/"))); + $redirect = add_query_arg( array('update' => 'add'), 'user-new.php' ); + } + } + wp_redirect( $redirect ); + die(); +} elseif ( isset($_REQUEST['action']) && 'createuser' == $_REQUEST['action'] ) { + check_admin_referer( 'create-user', '_wpnonce_create-user' ); + + if ( ! current_user_can('create_users') ) + wp_die(__('Cheatin’ uh?')); + + if ( !is_multisite() ) { + $user_id = add_user(); + + if ( is_wp_error( $user_id ) ) { + $add_user_errors = $user_id; + } else { + if ( current_user_can('edit_users') ) { + $new_user_login = apply_filters('pre_user_login', sanitize_user(stripslashes($_REQUEST['user_login']), true)); + $redirect = 'users.php?usersearch='. urlencode($new_user_login) . '&update=add' . '#user-' . $user_id; + } else { + $redirect = add_query_arg( 'update', 'add', 'user-new.php' ); + } + wp_redirect( $redirect ); + die(); + } + } else { + // Adding a new user to this blog + $user_details = wpmu_validate_user_signup( $_REQUEST[ 'user_login' ], $_REQUEST[ 'email' ] ); + unset( $user_details[ 'errors' ]->errors[ 'user_email_used' ] ); + if ( is_wp_error( $user_details[ 'errors' ] ) && !empty( $user_details[ 'errors' ]->errors ) ) { + $add_user_errors = $user_details[ 'errors' ]; + } else { + $new_user_login = apply_filters('pre_user_login', sanitize_user(stripslashes($_REQUEST['user_login']), true)); + if ( isset( $_POST[ 'noconfirmation' ] ) && is_super_admin() ) { + add_filter( 'wpmu_signup_user_notification', '__return_false' ); // Disable confirmation email + } + wpmu_signup_user( $new_user_login, $_REQUEST[ 'email' ], array( 'add_to_blog' => $wpdb->blogid, 'new_role' => $_REQUEST[ 'role' ] ) ); + if ( isset( $_POST[ 'noconfirmation' ] ) && is_super_admin() ) { + $key = $wpdb->get_var( $wpdb->prepare( "SELECT activation_key FROM {$wpdb->signups} WHERE user_login = %s AND user_email = %s", $new_user_login, $_REQUEST[ 'email' ] ) ); + wpmu_activate_signup( $key ); + $redirect = add_query_arg( array('update' => 'addnoconfirmation'), 'user-new.php' ); + } else { + $redirect = add_query_arg( array('update' => 'newuserconfimation'), 'user-new.php' ); + } + wp_redirect( $redirect ); + die(); + } + } +} + + +$title = __('Add New User'); +$parent_file = 'users.php'; + +$do_both = false; +if ( is_multisite() && current_user_can('promote_users') && current_user_can('create_users') ) + $do_both = true; + +add_contextual_help($current_screen, + '

    ' . __('To add a new user to your site, fill in the form on this screen. If you’re not sure which role to assign, you can use the link below to review the different roles and their capabilities. Here is a basic overview of roles:') . '

    ' . + '
      ' . + '
    • ' . __('Administrators have access to all the administration features.') . '
    • ' . + '
    • ' . __('Editors can publish posts, manage posts as well as manage other people’s posts, etc.') . '
    • ' . + '
    • ' . __('Authors can publish and manage their own posts.') . '
    • ' . + '
    • ' . __('Contributors can write and manage their posts but not publish posts or upload media files.') . '
    • ' . + '
    • ' . __('Subscribers can read comments/comment/receive newsletters, etc.') . '
    • ' . + '
    ' . + '

    ' . __('You must assign a password to the new user, but don’t worry; when they log in for the first time they will be prompted to change it. The username, however, cannot be changed.') . '

    ' . + '

    ' . __('New users will receive an email letting them know they’ve been added as a user for your site. By default, this email will also contain their password. Uncheck the box if you don’t want the password to be included in the welcome email.') . '

    ' . + '

    ' . __('Remember to click the Add User button at the bottom of this screen when you are finished.') . '

    ' . + '

    ' . __('For more information:') . '

    ' . + '

    ' . __('Documentation on Adding New Users') . '

    ' . + '

    ' . __('Support Forums') . '

    ' +); + +wp_enqueue_script('wp-ajax-response'); +wp_enqueue_script('user-profile'); + +require_once ('admin-header.php'); + +if ( isset($_GET['update']) ) { + $messages = array(); + if ( is_multisite() ) { + switch ( $_GET['update'] ) { + case "newuserconfimation": + $messages[] = __('Invitation email sent to new user. A confirmation link must be clicked before their account is created.'); + break; + case "add": + $messages[] = __('Invitation email sent to user. A confirmation link must be clicked for them to be added to your site.'); + break; + case "addnoconfirmation": + $messages[] = __('User has been added to your site.'); + break; + case "addexisting": + $messages[] = __('That user is already a member of this site.'); + break; + case "does_not_exist": + $messages[] = __('The requested user does not exist.'); + break; + case "does_not_exist": + $messages[] = __('Please enter a valid email address.'); + break; + } + } else { + if ( 'add' == $_GET['update'] ) + $messages[] = __('User added.'); + } +} +?> +
    + +

    +

    + + +
    +
      + get_error_messages() as $err ) + echo "
    • $err
    • \n"; + ?> +
    +
    +

    ' . $msg . '

    '; +} ?> + + +
    + get_error_messages() as $message ) + echo "

    $message

    "; + ?> +
    + +
    + +' . __('Add Existing User') . ''; + if ( !is_super_admin() ) { + _e( 'Enter the email address of an existing user on this network to invite them to this site. That person will be sent an email asking them to confirm the invite.' ); + $label = __('E-mail'); + } else { + _e( 'Enter the email address or username of an existing user on this network to invite them to this site. That person will be sent an email asking them to confirm the invite.' ); + $label = __('E-mail or Username'); + } +?> +
    > + + + + + + + + + + + + + + + + + + +
    +
    + 'addusersub' ) ); ?> +
    +' . __( 'Add New User' ) . ''; +?> +

    +
    > + + + 'login', 'first_name' => 'firstname', 'last_name' => 'lastname', + 'email' => 'email', 'url' => 'uri', 'role' => 'role', 'send_password' => 'send_password', 'noconfirmation' => 'ignore_pass' ) as $post_field => $var ) { + $var = "new_user_$var"; + if( isset( $_POST['createuser'] ) ) { + if ( ! isset($$var) ) + $$var = isset( $_POST[$post_field] ) ? stripslashes( $_POST[$post_field] ) : ''; + } else { + $$var = false; + } +} + +?> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    +
    +

    +
    +
    + + 'createusersub' ) ); ?> + +
    + + + diff --git a/src/wp-admin/user/admin.php b/src/wp-admin/user/admin.php new file mode 100644 index 0000000..6aebd88 --- /dev/null +++ b/src/wp-admin/user/admin.php @@ -0,0 +1,27 @@ +domain != $current_site->domain ) || ( $current_blog->path != $current_site->path ) ); +$redirect_user_admin_request = apply_filters( 'redirect_user_admin_request', $redirect_user_admin_request ); +if ( $redirect_user_admin_request ) { + wp_redirect( user_admin_url() ); + exit; +} +unset( $redirect_user_admin_request ); + +?> diff --git a/src/wp-admin/user/index-extra.php b/src/wp-admin/user/index-extra.php new file mode 100644 index 0000000..4881263 --- /dev/null +++ b/src/wp-admin/user/index-extra.php @@ -0,0 +1,12 @@ + \ No newline at end of file diff --git a/src/wp-admin/user/profile.php b/src/wp-admin/user/profile.php new file mode 100644 index 0000000..b55ba1c --- /dev/null +++ b/src/wp-admin/user/profile.php @@ -0,0 +1,12 @@ +get_pagenum(); +$title = __('Users'); +$parent_file = 'users.php'; + +add_screen_option( 'per_page', array('label' => _x( 'Users', 'users per page (screen options)' )) ); + +// contextual help - choose Help on the top right of admin panel to preview this. +add_contextual_help($current_screen, + '

    ' . __('This screen lists all the existing users for your site. Each user has one of five defined roles as set by the site admin: Site Administrator, Editor, Author, Contributor, or Subscriber. Users with roles other than Administrator will see fewer options in the dashboard navigation when they are logged in, based on their role.') . '

    ' . + '

    ' . __('You can customize the display of information on this screen as you can on other screens, by using the Screen Options tab and the on-screen filters.') . '

    ' . + '

    ' . __('To add a new user for your site, click the Add New button at the top of the screen or Add New in the Users menu section.') . '

    ' . + '

    ' . __('For more information:') . '

    ' . + '

    ' . __('Documentation on Managing Users') . '

    ' . + '

    ' . __('Descriptions of Roles and Capabilities') . '

    ' . + '

    ' . __('Support Forums') . '

    ' +); + +if ( empty($_REQUEST) ) { + $referer = ''; +} elseif ( isset($_REQUEST['wp_http_referer']) ) { + $redirect = remove_query_arg(array('wp_http_referer', 'updated', 'delete_count'), stripslashes($_REQUEST['wp_http_referer'])); + $referer = ''; +} else { + $redirect = 'users.php'; + $referer = ''; +} + +$update = ''; + +switch ( $wp_list_table->current_action() ) { + +/* Bulk Dropdown menu Role changes */ +case 'promote': + check_admin_referer('bulk-users'); + + if ( ! current_user_can( 'promote_users' ) ) + wp_die( __( 'You can’t edit that user.' ) ); + + if ( empty($_REQUEST['users']) ) { + wp_redirect($redirect); + exit(); + } + + $editable_roles = get_editable_roles(); + if ( empty( $editable_roles[$_REQUEST['new_role']] ) ) + wp_die(__('You can’t give users that role.')); + + $userids = $_REQUEST['users']; + $update = 'promote'; + foreach ( $userids as $id ) { + $id = (int) $id; + + if ( ! current_user_can('promote_user', $id) ) + wp_die(__('You can’t edit that user.')); + // The new role of the current user must also have promote_users caps + if ( $id == $current_user->ID && !$wp_roles->role_objects[$_REQUEST['new_role']]->has_cap('promote_users') ) { + $update = 'err_admin_role'; + continue; + } + + // If the user doesn't already belong to the blog, bail. + if ( is_multisite() && !is_user_member_of_blog( $id ) ) + wp_die(__('Cheatin’ uh?')); + + $user = new WP_User($id); + $user->set_role($_REQUEST['new_role']); + } + + wp_redirect(add_query_arg('update', $update, $redirect)); + exit(); + +break; + +case 'dodelete': + if ( is_multisite() ) + wp_die( __('User deletion is not allowed from this screen.') ); + + check_admin_referer('delete-users'); + + if ( empty($_REQUEST['users']) ) { + wp_redirect($redirect); + exit(); + } + + if ( ! current_user_can( 'delete_users' ) ) + wp_die(__('You can’t delete users.')); + + $userids = $_REQUEST['users']; + $update = 'del'; + $delete_count = 0; + + foreach ( (array) $userids as $id) { + $id = (int) $id; + + if ( ! current_user_can( 'delete_user', $id ) ) + wp_die(__( 'You can’t delete that user.' ) ); + + if ( $id == $current_user->ID ) { + $update = 'err_admin_del'; + continue; + } + switch ( $_REQUEST['delete_option'] ) { + case 'delete': + if ( current_user_can('delete_user', $id) ) + wp_delete_user($id); + break; + case 'reassign': + if ( current_user_can('delete_user', $id) ) + wp_delete_user($id, $_REQUEST['reassign_user']); + break; + } + ++$delete_count; + } + + $redirect = add_query_arg( array('delete_count' => $delete_count, 'update' => $update), $redirect); + wp_redirect($redirect); + exit(); + +break; + +case 'delete': + if ( is_multisite() ) + wp_die( __('User deletion is not allowed from this screen.') ); + + check_admin_referer('bulk-users'); + + if ( empty($_REQUEST['users']) && empty($_REQUEST['user']) ) { + wp_redirect($redirect); + exit(); + } + + if ( ! current_user_can( 'delete_users' ) ) + $errors = new WP_Error( 'edit_users', __( 'You can’t delete users.' ) ); + + if ( empty($_REQUEST['users']) ) + $userids = array(intval($_REQUEST['user'])); + else + $userids = (array) $_REQUEST['users']; + + include ('admin-header.php'); +?> +
    + + + +
    + +

    +

    +
      +ID ) { + echo "
    • " . sprintf(__('ID #%1s: %2s The current user will not be deleted.'), $id, $user->user_login) . "
    • \n"; + } else { + echo "
    • " . sprintf(__('ID #%1s: %2s'), $id, $user->user_login) . "
    • \n"; + $go_delete++; + } + } + ?> +
    + +

    +
      +
    • +
    • + '.__('Attribute all posts and links to:').''; + wp_dropdown_users( array( 'name' => 'reassign_user', 'exclude' => array_diff( $userids, array($current_user->ID) ) ) ); ?>
    • +
    + + + +

    + +
    +
    +id && !is_super_admin() ) { + $update = 'err_admin_remove'; + continue; + } + if ( !current_user_can('remove_user', $id) ) { + $update = 'err_admin_remove'; + continue; + } + remove_user_from_blog($id, $blog_id); + } + + $redirect = add_query_arg( array('update' => $update), $redirect); + wp_redirect($redirect); + exit; + +break; + +case 'remove': + + check_admin_referer('bulk-users'); + + if ( ! is_multisite() ) + wp_die( __( 'You can’t remove users.' ) ); + + if ( empty($_REQUEST['users']) && empty($_REQUEST['user']) ) { + wp_redirect($redirect); + exit(); + } + + if ( !current_user_can('remove_users') ) + $error = new WP_Error('edit_users', __('You can’t remove users.')); + + if ( empty($_REQUEST['users']) ) + $userids = array(intval($_REQUEST['user'])); + else + $userids = $_REQUEST['users']; + + include ('admin-header.php'); +?> +
    + + + +
    + +

    +

    +
      +id && !is_super_admin() ) { + echo "
    • " . sprintf(__('ID #%1s: %2s The current user will not be removed.'), $id, $user->user_login) . "
    • \n"; + } elseif ( !current_user_can('remove_user', $id) ) { + echo "
    • " . sprintf(__('ID #%1s: %2s You don\'t have permission to remove this user.'), $id, $user->user_login) . "
    • \n"; + } else { + echo "
    • " . sprintf(__('ID #%1s: %2s'), $id, $user->user_login) . "
    • \n"; + $go_remove = true; + } + } + ?> + + + + +

      + +
    +
    +prepare_items(); + $total_pages = $wp_list_table->get_pagination_arg( 'total_pages' ); + if ( $pagenum > $total_pages && $total_pages > 0 ) { + wp_redirect( add_query_arg( 'paged', $total_pages ) ); + exit; + } + include('./admin-header.php'); + + $messages = array(); + if ( isset($_GET['update']) ) : + switch($_GET['update']) { + case 'del': + case 'del_many': + $delete_count = isset($_GET['delete_count']) ? (int) $_GET['delete_count'] : 0; + $messages[] = '

    ' . sprintf(_n('%s user deleted', '%s users deleted', $delete_count), $delete_count) . '

    '; + break; + case 'add': + $messages[] = '

    ' . __('New user created.') . '

    '; + break; + case 'promote': + $messages[] = '

    ' . __('Changed roles.') . '

    '; + break; + case 'err_admin_role': + $messages[] = '

    ' . __('The current user’s role must have user editing capabilities.') . '

    '; + $messages[] = '

    ' . __('Other user roles have been changed.') . '

    '; + break; + case 'err_admin_del': + $messages[] = '

    ' . __('You can’t delete the current user.') . '

    '; + $messages[] = '

    ' . __('Other users have been deleted.') . '

    '; + break; + case 'remove': + $messages[] = '

    ' . __('User removed from this site.') . '

    '; + break; + case 'err_admin_remove': + $messages[] = '

    ' . __("You can't remove the current user.") . '

    '; + $messages[] = '

    ' . __('Other users have been removed.') . '

    '; + break; + } + endif; ?> + + +
    +
      + get_error_messages() as $err ) + echo "
    • $err
    • \n"; + ?> +
    +
    + + +
    + +

    + + + + +' . __('Search results for “%s”') . '', esc_html( $usersearch ) ); ?> +

    + +views(); ?> + +
    + +search_box( __( 'Search Users' ), 'user' ); ?> + +display(); ?> +
    + +
    +
    +' . __('Widgets are independent sections of content that can be placed into any widgetized area provided by your theme (commonly called sidebars). To populate your sidebars/widget areas with individual widgets, drag and drop the title bars into the desired area. By default, only the first widget area is expanded. To populate additional widget areas, click on their title bars to expand them.') . '

    +

    ' . __('The Available Widgets section contains all the widgets you can choose from. Once you drag a widget into a sidebar, it will open to allow you to configure its settings. When you are happy with the widget settings, click the Save button and the widget will go live on your site. If you click Delete, it will remove the widget.') . '

    +

    ' . __('If you want to remove the widget but save its setting for possible future use, just drag it into the Inactive Widgets area. You can add them back anytime from there. This is especially helpful when you switch to a theme with fewer or different widget areas.') . '

    +

    ' . __('Widgets may be used multiple times. You can give each widget a title, to display on your site, but it’s not required.') . '

    +

    ' . __('Enabling Accessibility Mode, via Screen Options, allows you to use Add and Edit buttons instead of using drag and drop.') . '

    +

    ' . __('Many themes show some sidebar widgets by default until you edit your sidebars, but they are not automatically displayed in your sidebar management tool. After you make your first widget change, you can re-add the default widgets by adding them from the Available Widgets area.') . '

    +'; +$help .= '

    ' . __('For more information:') . '

    '; +$help .= '

    ' . __('Documentation on Widgets') . '

    '; +$help .= '

    ' . __('Support Forums') . '

    '; +add_contextual_help($current_screen, $help); + +// register the inactive_widgets area as sidebar +register_sidebar(array( + 'name' => __('Inactive Widgets'), + 'id' => 'wp_inactive_widgets', + 'description' => '', + 'before_widget' => '', + 'after_widget' => '', + 'before_title' => '', + 'after_title' => '', +)); + +// These are the widgets grouped by sidebar +$sidebars_widgets = wp_get_sidebars_widgets(); +if ( empty( $sidebars_widgets ) ) + $sidebars_widgets = wp_get_widget_defaults(); + +// look for "lost" widgets, this has to run at least on each theme change +function retrieve_widgets() { + global $wp_registered_widget_updates, $wp_registered_sidebars, $sidebars_widgets, $wp_registered_widgets; + + $_sidebars_widgets = array(); + $sidebars = array_keys($wp_registered_sidebars); + + unset( $sidebars_widgets['array_version'] ); + + $old = array_keys($sidebars_widgets); + sort($old); + sort($sidebars); + + if ( $old == $sidebars ) + return; + + // Move the known-good ones first + foreach ( $sidebars as $id ) { + if ( array_key_exists( $id, $sidebars_widgets ) ) { + $_sidebars_widgets[$id] = $sidebars_widgets[$id]; + unset($sidebars_widgets[$id], $sidebars[$id]); + } + } + + // if new theme has less sidebars than the old theme + if ( !empty($sidebars_widgets) ) { + foreach ( $sidebars_widgets as $lost => $val ) { + if ( is_array($val) ) + $_sidebars_widgets['wp_inactive_widgets'] = array_merge( (array) $_sidebars_widgets['wp_inactive_widgets'], $val ); + } + } + + // discard invalid, theme-specific widgets from sidebars + $shown_widgets = array(); + foreach ( $_sidebars_widgets as $sidebar => $widgets ) { + if ( !is_array($widgets) ) + continue; + + $_widgets = array(); + foreach ( $widgets as $widget ) { + if ( isset($wp_registered_widgets[$widget]) ) + $_widgets[] = $widget; + } + $_sidebars_widgets[$sidebar] = $_widgets; + $shown_widgets = array_merge($shown_widgets, $_widgets); + } + + $sidebars_widgets = $_sidebars_widgets; + unset($_sidebars_widgets, $_widgets); + + // find hidden/lost multi-widget instances + $lost_widgets = array(); + foreach ( $wp_registered_widgets as $key => $val ) { + if ( in_array($key, $shown_widgets, true) ) + continue; + + $number = preg_replace('/.+?-([0-9]+)$/', '$1', $key); + + if ( 2 > (int) $number ) + continue; + + $lost_widgets[] = $key; + } + + $sidebars_widgets['wp_inactive_widgets'] = array_merge($lost_widgets, (array) $sidebars_widgets['wp_inactive_widgets']); + wp_set_sidebars_widgets($sidebars_widgets); +} +retrieve_widgets(); + +if ( count($wp_registered_sidebars) == 1 ) { + // If only "wp_inactive_widgets" is defined the theme has no sidebars, die. + require_once( './admin-header.php' ); +?> + +
    + +

    +
    +

    +
    +

    follow these instructions.' ); ?>

    +
    + + $val ) { + if ( is_array($val) && preg_match('/__i__|%i%/', key($val)) ) { + $_POST[$key] = array( $number => array_shift($val) ); + break; + } + } + } + + $sidebar_id = $_POST['sidebar']; + $position = isset($_POST[$sidebar_id . '_position']) ? (int) $_POST[$sidebar_id . '_position'] - 1 : 0; + + $id_base = $_POST['id_base']; + $sidebar = isset($sidebars_widgets[$sidebar_id]) ? $sidebars_widgets[$sidebar_id] : array(); + + // delete + if ( isset($_POST['removewidget']) && $_POST['removewidget'] ) { + + if ( !in_array($widget_id, $sidebar, true) ) { + wp_redirect( admin_url('widgets.php?error=0') ); + exit; + } + + $sidebar = array_diff( $sidebar, array($widget_id) ); + $_POST = array('sidebar' => $sidebar_id, 'widget-' . $id_base => array(), 'the-widget-id' => $widget_id, 'delete_widget' => '1'); + } + + $_POST['widget-id'] = $sidebar; + + foreach ( (array) $wp_registered_widget_updates as $name => $control ) { + if ( $name != $id_base || !is_callable($control['callback']) ) + continue; + + ob_start(); + call_user_func_array( $control['callback'], $control['params'] ); + ob_end_clean(); + + break; + } + + $sidebars_widgets[$sidebar_id] = $sidebar; + + // remove old position + if ( !isset($_POST['delete_widget']) ) { + foreach ( $sidebars_widgets as $key => $sb ) { + if ( is_array($sb) ) + $sidebars_widgets[$key] = array_diff( $sb, array($widget_id) ); + } + array_splice( $sidebars_widgets[$sidebar_id], $position, 0, $widget_id ); + } + + wp_set_sidebars_widgets($sidebars_widgets); + wp_redirect( admin_url('widgets.php?message=0') ); + exit; +} + +// Output the widget form without js +if ( isset($_GET['editwidget']) && $_GET['editwidget'] ) { + $widget_id = $_GET['editwidget']; + + if ( isset($_GET['addnew']) ) { + // Default to the first sidebar + $sidebar = array_shift( $keys = array_keys($wp_registered_sidebars) ); + + if ( isset($_GET['base']) && isset($_GET['num']) ) { // multi-widget + // Copy minimal info from an existing instance of this widget to a new instance + foreach ( $wp_registered_widget_controls as $control ) { + if ( $_GET['base'] === $control['id_base'] ) { + $control_callback = $control['callback']; + $multi_number = (int) $_GET['num']; + $control['params'][0]['number'] = -1; + $widget_id = $control['id'] = $control['id_base'] . '-' . $multi_number; + $wp_registered_widget_controls[$control['id']] = $control; + break; + } + } + } + } + + if ( isset($wp_registered_widget_controls[$widget_id]) && !isset($control) ) { + $control = $wp_registered_widget_controls[$widget_id]; + $control_callback = $control['callback']; + } elseif ( !isset($wp_registered_widget_controls[$widget_id]) && isset($wp_registered_widgets[$widget_id]) ) { + $name = esc_html( strip_tags($wp_registered_widgets[$widget_id]['name']) ); + } + + if ( !isset($name) ) + $name = esc_html( strip_tags($control['name']) ); + + if ( !isset($sidebar) ) + $sidebar = isset($_GET['sidebar']) ? $_GET['sidebar'] : 'wp_inactive_widgets'; + + if ( !isset($multi_number) ) + $multi_number = isset($control['params'][0]['number']) ? $control['params'][0]['number'] : ''; + + $id_base = isset($control['id_base']) ? $control['id_base'] : $control['id']; + + // show the widget form + $width = ' style="width:' . max($control['width'], 350) . 'px"'; + $key = isset($_GET['key']) ? (int) $_GET['key'] : 0; + + require_once( './admin-header.php' ); ?> +
    + +

    +
    > +

    + +
    +
    +' . __('There are no options for this widget.') . "

    \n"; ?> +
    + +

    +
    + + $sbvalue ) { + echo "\t\t\n"; + } ?> +
    "; + if ( 'wp_inactive_widgets' == $sbname ) { + echo ' '; + } else { + if ( !isset($sidebars_widgets[$sbname]) || !is_array($sidebars_widgets[$sbname]) ) { + $j = 1; + $sidebars_widgets[$sbname] = array(); + } else { + $j = count($sidebars_widgets[$sbname]); + if ( isset($_GET['addnew']) || !in_array($widget_id, $sidebars_widgets[$sbname], true) ) + $j++; + } + $selected = ''; + echo "\t\t\n"; + } + echo "
    +
    + +
    + + + + + + + +
    +
    +
    +
    +
    + + +
    + +

    + + +

    + + +

    + + + + +
    +
    +
    + +
    +

    +
    + +
    +
    +
    +
    +
    + +
    + +
    +

    + +
    +
    +
    +
    +
    + +
    +
    + $registered_sidebar ) { + if ( 'wp_inactive_widgets' == $sidebar ) + continue; + $closed = $i ? ' closed' : ''; ?> +
    + + +
    + +
    +
    +
    + +
    +
    +
    + +script_name = array_pop( explode( '/', $_SERVER['SCRIPT_NAME'] ) ); + $this->app_base = site_url( $this->script_name . '/' ); + + $this->selectors = array( + '@/service$@' => + array('GET' => 'get_service'), + '@/categories$@' => + array('GET' => 'get_categories_xml'), + '@/post/(\d+)$@' => + array('GET' => 'get_post', + 'PUT' => 'put_post', + 'DELETE' => 'delete_post'), + '@/posts/?(\d+)?$@' => + array('GET' => 'get_posts', + 'POST' => 'create_post'), + '@/attachments/?(\d+)?$@' => + array('GET' => 'get_attachment', + 'POST' => 'create_attachment'), + '@/attachment/file/(\d+)$@' => + array('GET' => 'get_file', + 'PUT' => 'put_file', + 'DELETE' => 'delete_file'), + '@/attachment/(\d+)$@' => + array('GET' => 'get_attachment', + 'PUT' => 'put_attachment', + 'DELETE' => 'delete_attachment'), + ); + } + + /** + * Handle ATOMPUB request. + * + * @since 2.2.0 + */ + function handle_request() { + global $always_authenticate; + + if ( !empty( $_SERVER['ORIG_PATH_INFO'] ) ) + $path = $_SERVER['ORIG_PATH_INFO']; + else + $path = $_SERVER['PATH_INFO']; + + $method = $_SERVER['REQUEST_METHOD']; + + log_app('REQUEST',"$method $path\n================"); + + $this->process_conditionals(); + //$this->process_conditionals(); + + // exception case for HEAD (treat exactly as GET, but don't output) + if ($method == 'HEAD') { + $this->do_output = false; + $method = 'GET'; + } + + // redirect to /service in case no path is found. + if (strlen($path) == 0 || $path == '/') + $this->redirect($this->get_service_url()); + + // check to see if AtomPub is enabled + if ( !get_option( 'enable_app' ) ) + $this->forbidden( sprintf( __( 'AtomPub services are disabled on this site. An admin user can enable them at %s' ), admin_url('options-writing.php') ) ); + + // dispatch + foreach ( $this->selectors as $regex => $funcs ) { + if ( preg_match($regex, $path, $matches) ) { + if ( isset($funcs[$method]) ) { + + // authenticate regardless of the operation and set the current + // user. each handler will decide if auth is required or not. + if ( !$this->authenticate() ) { + if ( $always_authenticate ) + $this->auth_required('Credentials required.'); + } + + array_shift($matches); + call_user_func_array(array(&$this,$funcs[$method]), $matches); + exit(); + } else { + // only allow what we have handlers for... + $this->not_allowed(array_keys($funcs)); + } + } + } + + // oops, nothing found + $this->not_found(); + } + + /** + * Retrieve XML for ATOMPUB service. + * + * @since 2.2.0 + */ + function get_service() { + log_app('function','get_service()'); + + if ( !current_user_can( 'edit_posts' ) ) + $this->auth_required( __( 'Sorry, you do not have the right to access this site.' ) ); + + $entries_url = esc_attr($this->get_entries_url()); + $categories_url = esc_attr($this->get_categories_url()); + $media_url = esc_attr($this->get_attachments_url()); + $accepted_media_types = ''; + foreach ($this->media_content_types as $med) { + $accepted_media_types = $accepted_media_types . "" . $med . ""; + } + $atom_prefix="atom"; + $atom_blogname = get_bloginfo('name'); + $service_doc = << + + <$atom_prefix:title>$atom_blogname Workspace + + <$atom_prefix:title>$atom_blogname Posts + $this->ATOM_CONTENT_TYPE;type=entry + + + + <$atom_prefix:title>$atom_blogname Media + $accepted_media_types + + + + +EOD; + + $this->output($service_doc, $this->SERVICE_CONTENT_TYPE); + } + + /** + * Retrieve categories list in XML format. + * + * @since 2.2.0 + */ + function get_categories_xml() { + log_app('function','get_categories_xml()'); + + if ( !current_user_can( 'edit_posts' ) ) + $this->auth_required( __( 'Sorry, you do not have the right to access this site.' ) ); + + $home = esc_attr(get_bloginfo_rss('url')); + + $categories = ""; + $cats = get_categories(array('hierarchical' => 0, 'hide_empty' => 0)); + foreach ( (array) $cats as $cat ) { + $categories .= " name) . "\" />\n"; + } + $output = << + $categories + +EOD; + $this->output($output, $this->CATEGORIES_CONTENT_TYPE); + } + + /** + * Create new post. + * + * @since 2.2.0 + */ + function create_post() { + global $user_ID; + $this->get_accepted_content_type($this->atom_content_types); + + $parser = new AtomParser(); + if ( !$parser->parse() ) + $this->client_error(); + + $entry = array_pop($parser->feed->entries); + + log_app('Received entry:', print_r($entry,true)); + + $catnames = array(); + foreach ( $entry->categories as $cat ) { + array_push($catnames, $cat["term"]); + } + + $wp_cats = get_categories(array('hide_empty' => false)); + + $post_category = array(); + + foreach ( $wp_cats as $cat ) { + if ( in_array($cat->name, $catnames) ) + array_push($post_category, $cat->term_id); + } + + $publish = ! ( isset( $entry->draft ) && 'yes' == trim( $entry->draft ) ); + + $cap = ($publish) ? 'publish_posts' : 'edit_posts'; + + if ( !current_user_can($cap) ) + $this->auth_required(__('Sorry, you do not have the right to edit/publish new posts.')); + + $blog_ID = get_current_blog_id(); + $post_status = ($publish) ? 'publish' : 'draft'; + $post_author = (int) $user_ID; + $post_title = $entry->title[1]; + $post_content = $entry->content[1]; + $post_excerpt = $entry->summary[1]; + $pubtimes = $this->get_publish_time($entry->published); + $post_date = $pubtimes[0]; + $post_date_gmt = $pubtimes[1]; + + if ( isset( $_SERVER['HTTP_SLUG'] ) ) + $post_name = $_SERVER['HTTP_SLUG']; + + $post_data = compact('blog_ID', 'post_author', 'post_date', 'post_date_gmt', 'post_content', 'post_title', 'post_category', 'post_status', 'post_excerpt', 'post_name'); + + $this->escape($post_data); + log_app('Inserting Post. Data:', print_r($post_data,true)); + + $postID = wp_insert_post($post_data); + if ( is_wp_error( $postID ) ) + $this->internal_error($postID->get_error_message()); + + if ( !$postID ) + $this->internal_error(__('Sorry, your entry could not be posted. Something wrong happened.')); + + // getting warning here about unable to set headers + // because something in the cache is printing to the buffer + // could we clean up wp_set_post_categories or cache to not print + // this could affect our ability to send back the right headers + @wp_set_post_categories($postID, $post_category); + + do_action( 'atompub_create_post', $postID, $entry ); + + $output = $this->get_entry($postID); + + log_app('function',"create_post($postID)"); + $this->created($postID, $output); + } + + /** + * Retrieve post. + * + * @since 2.2.0 + * + * @param int $postID Post ID. + */ + function get_post($postID) { + global $entry; + + if ( !current_user_can( 'edit_post', $postID ) ) + $this->auth_required( __( 'Sorry, you do not have the right to access this post.' ) ); + + $this->set_current_entry($postID); + $output = $this->get_entry($postID); + log_app('function',"get_post($postID)"); + $this->output($output); + + } + + /** + * Update post. + * + * @since 2.2.0 + * + * @param int $postID Post ID. + */ + function put_post($postID) { + // checked for valid content-types (atom+xml) + // quick check and exit + $this->get_accepted_content_type($this->atom_content_types); + + $parser = new AtomParser(); + if ( !$parser->parse() ) + $this->bad_request(); + + $parsed = array_pop($parser->feed->entries); + + log_app('Received UPDATED entry:', print_r($parsed,true)); + + // check for not found + global $entry; + $this->set_current_entry($postID); + + if ( !current_user_can('edit_post', $entry['ID']) ) + $this->auth_required(__('Sorry, you do not have the right to edit this post.')); + + $publish = ! ( isset($parsed->draft) && 'yes' == trim($parsed->draft) ); + $post_status = ($publish) ? 'publish' : 'draft'; + + extract($entry); + + $post_title = $parsed->title[1]; + $post_content = $parsed->content[1]; + $post_excerpt = $parsed->summary[1]; + $pubtimes = $this->get_publish_time($entry->published); + $post_date = $pubtimes[0]; + $post_date_gmt = $pubtimes[1]; + $pubtimes = $this->get_publish_time($parsed->updated); + $post_modified = $pubtimes[0]; + $post_modified_gmt = $pubtimes[1]; + + $postdata = compact('ID', 'post_content', 'post_title', 'post_category', 'post_status', 'post_excerpt', 'post_date', 'post_date_gmt', 'post_modified', 'post_modified_gmt'); + $this->escape($postdata); + + $result = wp_update_post($postdata); + + if ( !$result ) + $this->internal_error(__('For some strange yet very annoying reason, this post could not be edited.')); + + do_action( 'atompub_put_post', $ID, $parsed ); + + log_app('function',"put_post($postID)"); + $this->ok(); + } + + /** + * Remove post. + * + * @since 2.2.0 + * + * @param int $postID Post ID. + */ + function delete_post($postID) { + + // check for not found + global $entry; + $this->set_current_entry($postID); + + if ( !current_user_can('edit_post', $postID) ) + $this->auth_required(__('Sorry, you do not have the right to delete this post.')); + + if ( $entry['post_type'] == 'attachment' ) { + $this->delete_attachment($postID); + } else { + $result = wp_delete_post($postID); + + if ( !$result ) { + $this->internal_error(__('For some strange yet very annoying reason, this post could not be deleted.')); + } + + log_app('function',"delete_post($postID)"); + $this->ok(); + } + + } + + /** + * Retrieve attachment. + * + * @since 2.2.0 + * + * @param int $postID Optional. Post ID. + */ + function get_attachment($postID = null) { + if ( !current_user_can( 'upload_files' ) ) + $this->auth_required( __( 'Sorry, you do not have permission to upload files.' ) ); + + if ( !isset($postID) ) { + $this->get_attachments(); + } else { + $this->set_current_entry($postID); + $output = $this->get_entry($postID, 'attachment'); + log_app('function',"get_attachment($postID)"); + $this->output($output); + } + } + + /** + * Create new attachment. + * + * @since 2.2.0 + */ + function create_attachment() { + + $type = $this->get_accepted_content_type(); + + if ( !current_user_can('upload_files') ) + $this->auth_required(__('You do not have permission to upload files.')); + + $fp = fopen("php://input", "rb"); + $bits = null; + while ( !feof($fp) ) { + $bits .= fread($fp, 4096); + } + fclose($fp); + + $slug = ''; + if ( isset( $_SERVER['HTTP_SLUG'] ) ) + $slug = $_SERVER['HTTP_SLUG']; + elseif ( isset( $_SERVER['HTTP_TITLE'] ) ) + $slug = $_SERVER['HTTP_TITLE']; + elseif ( empty( $slug ) ) // just make a random name + $slug = substr( md5( uniqid( microtime() ) ), 0, 7); + $ext = preg_replace( '|.*/([a-z0-9]+)|', '$1', $_SERVER['CONTENT_TYPE'] ); + $slug = sanitize_file_name( "$slug.$ext" ); + $file = wp_upload_bits( $slug, NULL, $bits); + + log_app('wp_upload_bits returns:',print_r($file,true)); + + $url = $file['url']; + $file = $file['file']; + + do_action('wp_create_file_in_uploads', $file); // replicate + + // Construct the attachment array + $attachment = array( + 'post_title' => $slug, + 'post_content' => $slug, + 'post_status' => 'attachment', + 'post_parent' => 0, + 'post_mime_type' => $type, + 'guid' => $url + ); + + // Save the data + $postID = wp_insert_attachment($attachment, $file); + + if (!$postID) + $this->internal_error(__('Sorry, your entry could not be posted. Something wrong happened.')); + + $output = $this->get_entry($postID, 'attachment'); + + $this->created($postID, $output, 'attachment'); + log_app('function',"create_attachment($postID)"); + } + + /** + * Update attachment. + * + * @since 2.2.0 + * + * @param int $postID Post ID. + */ + function put_attachment($postID) { + // checked for valid content-types (atom+xml) + // quick check and exit + $this->get_accepted_content_type($this->atom_content_types); + + $parser = new AtomParser(); + if (!$parser->parse()) { + $this->bad_request(); + } + + $parsed = array_pop($parser->feed->entries); + + // check for not found + global $entry; + $this->set_current_entry($postID); + + if ( !current_user_can('edit_post', $entry['ID']) ) + $this->auth_required(__('Sorry, you do not have the right to edit this post.')); + + extract($entry); + + $post_title = $parsed->title[1]; + $post_content = $parsed->summary[1]; + $pubtimes = $this->get_publish_time($parsed->updated); + $post_modified = $pubtimes[0]; + $post_modified_gmt = $pubtimes[1]; + + $postdata = compact('ID', 'post_content', 'post_title', 'post_category', 'post_status', 'post_excerpt', 'post_modified', 'post_modified_gmt'); + $this->escape($postdata); + + $result = wp_update_post($postdata); + + if ( !$result ) + $this->internal_error(__('For some strange yet very annoying reason, this post could not be edited.')); + + log_app('function',"put_attachment($postID)"); + $this->ok(); + } + + /** + * Remove attachment. + * + * @since 2.2.0 + * + * @param int $postID Post ID. + */ + function delete_attachment($postID) { + log_app('function',"delete_attachment($postID). File '$location' deleted."); + + // check for not found + global $entry; + $this->set_current_entry($postID); + + if ( !current_user_can('edit_post', $postID) ) + $this->auth_required(__('Sorry, you do not have the right to delete this post.')); + + $location = get_post_meta($entry['ID'], '_wp_attached_file', true); + $filetype = wp_check_filetype($location); + + if ( !isset($location) || 'attachment' != $entry['post_type'] || empty($filetype['ext']) ) + $this->internal_error(__('Error occurred while accessing post metadata for file location.')); + + // delete file + @unlink($location); + + // delete attachment + $result = wp_delete_post($postID); + + if ( !$result ) + $this->internal_error(__('For some strange yet very annoying reason, this post could not be deleted.')); + + log_app('function',"delete_attachment($postID). File '$location' deleted."); + $this->ok(); + } + + /** + * Retrieve attachment from post. + * + * @since 2.2.0 + * + * @param int $postID Post ID. + */ + function get_file($postID) { + + // check for not found + global $entry; + $this->set_current_entry($postID); + + // then whether user can edit the specific post + if ( !current_user_can('edit_post', $postID) ) + $this->auth_required(__('Sorry, you do not have the right to edit this post.')); + + $location = get_post_meta($entry['ID'], '_wp_attached_file', true); + $location = get_option ('upload_path') . '/' . $location; + $filetype = wp_check_filetype($location); + + if ( !isset($location) || 'attachment' != $entry['post_type'] || empty($filetype['ext']) ) + $this->internal_error(__('Error occurred while accessing post metadata for file location.')); + + status_header('200'); + header('Content-Type: ' . $entry['post_mime_type']); + header('Connection: close'); + + if ( $fp = fopen($location, "rb") ) { + status_header('200'); + header('Content-Type: ' . $entry['post_mime_type']); + header('Connection: close'); + + while ( !feof($fp) ) { + echo fread($fp, 4096); + } + + fclose($fp); + } else { + status_header ('404'); + } + + log_app('function',"get_file($postID)"); + exit; + } + + /** + * Upload file to blog and add attachment to post. + * + * @since 2.2.0 + * + * @param int $postID Post ID. + */ + function put_file($postID) { + + // first check if user can upload + if ( !current_user_can('upload_files') ) + $this->auth_required(__('You do not have permission to upload files.')); + + // check for not found + global $entry; + $this->set_current_entry($postID); + + // then whether user can edit the specific post + if ( !current_user_can('edit_post', $postID) ) + $this->auth_required(__('Sorry, you do not have the right to edit this post.')); + + $upload_dir = wp_upload_dir( ); + $location = get_post_meta($entry['ID'], '_wp_attached_file', true); + $filetype = wp_check_filetype($location); + + $location = "{$upload_dir['basedir']}/{$location}"; + + if (!isset($location) || 'attachment' != $entry['post_type'] || empty($filetype['ext'])) + $this->internal_error(__('Error occurred while accessing post metadata for file location.')); + + $fp = fopen("php://input", "rb"); + $localfp = fopen($location, "w+"); + while ( !feof($fp) ) { + fwrite($localfp,fread($fp, 4096)); + } + fclose($fp); + fclose($localfp); + + $ID = $entry['ID']; + $pubtimes = $this->get_publish_time($entry->published); + $post_date = $pubtimes[0]; + $post_date_gmt = $pubtimes[1]; + $pubtimes = $this->get_publish_time($parsed->updated); + $post_modified = $pubtimes[0]; + $post_modified_gmt = $pubtimes[1]; + + $post_data = compact('ID', 'post_date', 'post_date_gmt', 'post_modified', 'post_modified_gmt'); + $result = wp_update_post($post_data); + + if ( !$result ) + $this->internal_error(__('Sorry, your entry could not be posted. Something wrong happened.')); + + wp_update_attachment_metadata( $postID, wp_generate_attachment_metadata( $postID, $location ) ); + + log_app('function',"put_file($postID)"); + $this->ok(); + } + + /** + * Retrieve entries URL. + * + * @since 2.2.0 + * + * @param int $page Page ID. + * @return string + */ + function get_entries_url($page = null) { + if ( isset($GLOBALS['post_type']) && ( $GLOBALS['post_type'] == 'attachment' ) ) + $path = $this->MEDIA_PATH; + else + $path = $this->ENTRIES_PATH; + $url = $this->app_base . $path; + if ( isset($page) && is_int($page) ) + $url .= "/$page"; + return $url; + } + + /** + * Display entries URL. + * + * @since 2.2.0 + * + * @param int $page Page ID. + */ + function the_entries_url($page = null) { + echo $this->get_entries_url($page); + } + + /** + * Retrieve categories URL. + * + * @since 2.2.0 + * + * @param mixed $deprecated Not used. + * @return string + */ + function get_categories_url($deprecated = '') { + if ( !empty( $deprecated ) ) + _deprecated_argument( __FUNCTION__, '2.5' ); + return $this->app_base . $this->CATEGORIES_PATH; + } + + /** + * Display category URL. + * + * @since 2.2.0 + */ + function the_categories_url() { + echo $this->get_categories_url(); + } + + /** + * Retrieve attachment URL. + * + * @since 2.2.0 + * + * @param int $page Page ID. + * @return string + */ + function get_attachments_url($page = null) { + $url = $this->app_base . $this->MEDIA_PATH; + if (isset($page) && is_int($page)) { + $url .= "/$page"; + } + return $url; + } + + /** + * Display attachment URL. + * + * @since 2.2.0 + * + * @param int $page Page ID. + */ + function the_attachments_url($page = null) { + echo $this->get_attachments_url($page); + } + + /** + * Retrieve service URL. + * + * @since 2.3.0 + * + * @return string + */ + function get_service_url() { + return $this->app_base . $this->SERVICE_PATH; + } + + /** + * Retrieve entry URL. + * + * @since 2.7.0 + * + * @param int $postID Post ID. + * @return string + */ + function get_entry_url($postID = null) { + if (!isset($postID)) { + global $post; + $postID = (int) $post->ID; + } + + $url = $this->app_base . $this->ENTRY_PATH . "/$postID"; + + log_app('function',"get_entry_url() = $url"); + return $url; + } + + /** + * Display entry URL. + * + * @since 2.7.0 + * + * @param int $postID Post ID. + */ + function the_entry_url($postID = null) { + echo $this->get_entry_url($postID); + } + + /** + * Retrieve media URL. + * + * @since 2.2.0 + * + * @param int $postID Post ID. + * @return string + */ + function get_media_url($postID = null) { + if (!isset($postID)) { + global $post; + $postID = (int) $post->ID; + } + + $url = $this->app_base . $this->MEDIA_SINGLE_PATH ."/file/$postID"; + + log_app('function',"get_media_url() = $url"); + return $url; + } + + /** + * Display the media URL. + * + * @since 2.2.0 + * + * @param int $postID Post ID. + */ + function the_media_url($postID = null) { + echo $this->get_media_url($postID); + } + + /** + * Set the current entry to post ID. + * + * @since 2.2.0 + * + * @param int $postID Post ID. + */ + function set_current_entry($postID) { + global $entry; + log_app('function',"set_current_entry($postID)"); + + if (!isset($postID)) { + // $this->bad_request(); + $this->not_found(); + } + + $entry = wp_get_single_post($postID,ARRAY_A); + + if (!isset($entry) || !isset($entry['ID'])) + $this->not_found(); + + return; + } + + /** + * Display posts XML. + * + * @since 2.2.0 + * + * @param int $page Optional. Page ID. + * @param string $post_type Optional, default is 'post'. Post Type. + */ + function get_posts($page = 1, $post_type = 'post') { + log_app('function',"get_posts($page, '$post_type')"); + $feed = $this->get_feed($page, $post_type); + $this->output($feed); + } + + /** + * Display attachment XML. + * + * @since 2.2.0 + * + * @param int $page Page ID. + * @param string $post_type Optional, default is 'attachment'. Post type. + */ + function get_attachments($page = 1, $post_type = 'attachment') { + log_app('function',"get_attachments($page, '$post_type')"); + $GLOBALS['post_type'] = $post_type; + $feed = $this->get_feed($page, $post_type); + $this->output($feed); + } + + /** + * Retrieve feed XML. + * + * @since 2.2.0 + * + * @param int $page Page ID. + * @param string $post_type Optional, default is post. Post type. + * @return string + */ + function get_feed($page = 1, $post_type = 'post') { + global $post, $wp, $wp_query, $posts, $wpdb, $blog_id; + log_app('function',"get_feed($page, '$post_type')"); + ob_start(); + + $this->ENTRY_PATH = $post_type; + + if (!isset($page)) { + $page = 1; + } + $page = (int) $page; + + $count = get_option('posts_per_rss'); + + wp('posts_per_page=' . $count . '&offset=' . ($count * ($page-1) . '&orderby=modified')); + + $post = $GLOBALS['post']; + $posts = $GLOBALS['posts']; + $wp = $GLOBALS['wp']; + $wp_query = $GLOBALS['wp_query']; + $wpdb = $GLOBALS['wpdb']; + $blog_id = (int) $GLOBALS['blog_id']; + log_app('function',"query_posts(# " . print_r($wp_query, true) . "#)"); + + log_app('function',"total_count(# $wp_query->max_num_pages #)"); + $last_page = $wp_query->max_num_pages; + $next_page = (($page + 1) > $last_page) ? NULL : $page + 1; + $prev_page = ($page - 1) < 1 ? NULL : $page - 1; + $last_page = ((int)$last_page == 1 || (int)$last_page == 0) ? NULL : (int) $last_page; + $self_page = $page > 1 ? $page : NULL; +?> > +the_entries_url() ?> + +<?php bloginfo_rss('name') ?> + + + + + + + + + + +Copyright + +echo_entry(); + } + } +?> +ENTRY_PATH = 'attachment'; + $varname = 'attachment_id'; + break; + } + query_posts($varname . '=' . $postID); + if ( have_posts() ) { + while ( have_posts() ) { + the_post(); + $this->echo_entry(); + log_app('$post',print_r($GLOBALS['post'],true)); + $entry = ob_get_contents(); + break; + } + } + ob_end_clean(); + + log_app('get_entry returning:',$entry); + return $entry; + } + + /** + * Display post content XML. + * + * @since 2.3.0 + */ + function echo_entry() { ?> + + ID ); ?> + + <?php echo $content ?> + + + + + post_status == 'draft' ? 'yes' : 'no') ?> + + + + + + + +post_type == 'attachment') { ?> + + + + +post_content ) ) : +list($content_type, $content) = prep_atom_text_construct(get_the_content()); ?> + + + + + + + + + + + + + 302 Found + + +

    Found

    +

    The document has moved here.

    + + + +EOD; + header('HTTP/1.1 302 Moved'); + header('Content-Type: text/html'); + header('Location: ' . $url); + echo $content; + exit; + + } + + /** + * Set 'Client Error' (400) status header. + * + * @since 2.2.0 + */ + function client_error($msg = 'Client Error') { + log_app('Status','400: Client Error'); + header('Content-Type: text/plain'); + status_header('400'); + exit; + } + + /** + * Set created status headers (201). + * + * Sets the 'content-type', 'content-location', and 'location'. + * + * @since 2.2.0 + */ + function created($post_ID, $content, $post_type = 'post') { + log_app('created()::$post_ID',"$post_ID, $post_type"); + $edit = $this->get_entry_url($post_ID); + switch($post_type) { + case 'post': + $ctloc = $this->get_entry_url($post_ID); + break; + case 'attachment': + $edit = $this->app_base . "attachments/$post_ID"; + break; + } + header("Content-Type: $this->ATOM_CONTENT_TYPE"); + if (isset($ctloc)) + header('Content-Location: ' . $ctloc); + header('Location: ' . $edit); + status_header('201'); + echo $content; + exit; + } + + /** + * Set 'Auth Required' (401) headers. + * + * @since 2.2.0 + * + * @param string $msg Status header content and HTML content. + */ + function auth_required($msg) { + log_app('Status','401: Auth Required'); + nocache_headers(); + header('WWW-Authenticate: Basic realm="WordPress Atom Protocol"'); + header("HTTP/1.1 401 $msg"); + header('Status: 401 ' . $msg); + header('Content-Type: text/html'); + $content = << + + + 401 Unauthorized + + +

    401 Unauthorized

    +

    $msg

    + + + +EOD; + echo $content; + exit; + } + + /** + * Display XML and set headers with content type. + * + * @since 2.2.0 + * + * @param string $xml Display feed content. + * @param string $ctype Optional, default is 'atom+xml'. Feed content type. + */ + function output($xml, $ctype = 'application/atom+xml') { + status_header('200'); + $xml = ''."\n".$xml; + header('Connection: close'); + header('Content-Length: '. strlen($xml)); + header('Content-Type: ' . $ctype); + header('Content-Disposition: attachment; filename=atom.xml'); + header('Date: '. date('r')); + if ($this->do_output) + echo $xml; + log_app('function', "output:\n$xml"); + exit; + } + + /** + * Sanitize content for database usage. + * + * @since 2.2.0 + * + * @param array $array Sanitize array and multi-dimension array. + */ + function escape(&$array) { + global $wpdb; + + foreach ($array as $k => $v) { + if (is_array($v)) { + $this->escape($array[$k]); + } else if (is_object($v)) { + //skip + } else { + $array[$k] = $wpdb->escape($v); + } + } + } + + /** + * Access credential through various methods and perform login. + * + * @since 2.2.0 + * + * @return bool + */ + function authenticate() { + log_app("authenticate()",print_r($_ENV, true)); + + // if using mod_rewrite/ENV hack + // http://www.besthostratings.com/articles/http-auth-php-cgi.html + if (isset($_SERVER['HTTP_AUTHORIZATION'])) { + list($_SERVER['PHP_AUTH_USER'], $_SERVER['PHP_AUTH_PW']) = + explode(':', base64_decode(substr($_SERVER['HTTP_AUTHORIZATION'], 6))); + } else if (isset($_SERVER['REDIRECT_REMOTE_USER'])) { + // Workaround for setups that do not forward HTTP_AUTHORIZATION + // See http://trac.wordpress.org/ticket/7361 + list($_SERVER['PHP_AUTH_USER'], $_SERVER['PHP_AUTH_PW']) = + explode(':', base64_decode(substr($_SERVER['REDIRECT_REMOTE_USER'], 6))); + } + + // If Basic Auth is working... + if (isset($_SERVER['PHP_AUTH_USER']) && isset($_SERVER['PHP_AUTH_PW'])) { + log_app("Basic Auth",$_SERVER['PHP_AUTH_USER']); + + $user = wp_authenticate($_SERVER['PHP_AUTH_USER'], $_SERVER['PHP_AUTH_PW']); + if ( $user && !is_wp_error($user) ) { + wp_set_current_user($user->ID); + log_app("authenticate()", $user->user_login); + return true; + } + } + + return false; + } + + /** + * Retrieve accepted content types. + * + * @since 2.2.0 + * + * @param array $types Optional. Content Types. + * @return string + */ + function get_accepted_content_type($types = null) { + + if (!isset($types)) { + $types = $this->media_content_types; + } + + if (!isset($_SERVER['CONTENT_LENGTH']) || !isset($_SERVER['CONTENT_TYPE'])) { + $this->length_required(); + } + + $type = $_SERVER['CONTENT_TYPE']; + list($type,$subtype) = explode('/',$type); + list($subtype) = explode(";",$subtype); // strip MIME parameters + log_app("get_accepted_content_type", "type=$type, subtype=$subtype"); + + foreach($types as $t) { + list($acceptedType,$acceptedSubtype) = explode('/',$t); + if ($acceptedType == '*' || $acceptedType == $type) { + if ($acceptedSubtype == '*' || $acceptedSubtype == $subtype) + return $type . "/" . $subtype; + } + } + + $this->invalid_media(); + } + + /** + * Process conditionals for posts. + * + * @since 2.2.0 + */ + function process_conditionals() { + + if (empty($this->params)) return; + if ($_SERVER['REQUEST_METHOD'] == 'DELETE') return; + + switch($this->params[0]) { + case $this->ENTRY_PATH: + global $post; + $post = wp_get_single_post($this->params[1]); + $wp_last_modified = get_post_modified_time('D, d M Y H:i:s', true); + $post = NULL; + break; + case $this->ENTRIES_PATH: + $wp_last_modified = mysql2date('D, d M Y H:i:s', get_lastpostmodified('GMT'), 0).' GMT'; + break; + default: + return; + } + $wp_etag = md5($wp_last_modified); + @header("Last-Modified: $wp_last_modified"); + @header("ETag: $wp_etag"); + + // Support for Conditional GET + if (isset($_SERVER['HTTP_IF_NONE_MATCH'])) + $client_etag = stripslashes($_SERVER['HTTP_IF_NONE_MATCH']); + else + $client_etag = false; + + $client_last_modified = 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_header( 304 ); + exit; + } + } + + /** + * Convert RFC3339 time string to timestamp. + * + * @since 2.3.0 + * + * @param string $str String to time. + * @return bool|int false if format is incorrect. + */ + function rfc3339_str2time($str) { + + $match = false; + if (!preg_match("/(\d{4}-\d{2}-\d{2})T(\d{2}\:\d{2}\:\d{2})\.?\d{0,3}(Z|[+-]+\d{2}\:\d{2})/", $str, $match)) + return false; + + if ($match[3] == 'Z') + $match[3] = '+0000'; + + return strtotime($match[1] . " " . $match[2] . " " . $match[3]); + } + + /** + * Retrieve published time to display in XML. + * + * @since 2.3.0 + * + * @param string $published Time string. + * @return string + */ + function get_publish_time($published) { + + $pubtime = $this->rfc3339_str2time($published); + + if (!$pubtime) { + return array(current_time('mysql'),current_time('mysql',1)); + } else { + return array(date("Y-m-d H:i:s", $pubtime), gmdate("Y-m-d H:i:s", $pubtime)); + } + } + +} + +/** + * AtomServer + * @var AtomServer + * @global object $server + */ +$server = new AtomServer(); +$server->handle_request(); + +?> diff --git a/src/wp-atom.php b/src/wp-atom.php new file mode 100644 index 0000000..a83ac7d --- /dev/null +++ b/src/wp-atom.php @@ -0,0 +1,12 @@ + diff --git a/src/wp-blog-header.php b/src/wp-blog-header.php new file mode 100644 index 0000000..0f7118f --- /dev/null +++ b/src/wp-blog-header.php @@ -0,0 +1,20 @@ + \ No newline at end of file diff --git a/src/wp-comments-post.php b/src/wp-comments-post.php new file mode 100644 index 0000000..9c17a35 --- /dev/null +++ b/src/wp-comments-post.php @@ -0,0 +1,105 @@ +comment_status) ) { + do_action('comment_id_not_found', $comment_post_ID); + exit; +} + +// get_post_status() will get the parent status for attachments. +$status = get_post_status($post); + +$status_obj = get_post_status_object($status); + +if ( !comments_open($comment_post_ID) ) { + do_action('comment_closed', $comment_post_ID); + wp_die( __('Sorry, comments are closed for this item.') ); +} elseif ( 'trash' == $status ) { + do_action('comment_on_trash', $comment_post_ID); + exit; +} elseif ( !$status_obj->public && !$status_obj->private ) { + do_action('comment_on_draft', $comment_post_ID); + exit; +} elseif ( post_password_required($comment_post_ID) ) { + do_action('comment_on_password_protected', $comment_post_ID); + exit; +} else { + do_action('pre_comment_on_post', $comment_post_ID); +} + +$comment_author = ( isset($_POST['author']) ) ? trim(strip_tags($_POST['author'])) : null; +$comment_author_email = ( isset($_POST['email']) ) ? trim($_POST['email']) : null; +$comment_author_url = ( isset($_POST['url']) ) ? trim($_POST['url']) : null; +$comment_content = ( isset($_POST['comment']) ) ? trim($_POST['comment']) : null; + +// If the user is logged in +$user = wp_get_current_user(); +if ( $user->ID ) { + if ( empty( $user->display_name ) ) + $user->display_name=$user->user_login; + $comment_author = $wpdb->escape($user->display_name); + $comment_author_email = $wpdb->escape($user->user_email); + $comment_author_url = $wpdb->escape($user->user_url); + if ( current_user_can('unfiltered_html') ) { + if ( wp_create_nonce('unfiltered-html-comment_' . $comment_post_ID) != $_POST['_wp_unfiltered_html_comment'] ) { + kses_remove_filters(); // start with a clean slate + kses_init_filters(); // set up the filters + } + } +} else { + if ( get_option('comment_registration') || 'private' == $status ) + wp_die( __('Sorry, you must be logged in to post a comment.') ); +} + +$comment_type = ''; + +if ( get_option('require_name_email') && !$user->ID ) { + if ( 6 > strlen($comment_author_email) || '' == $comment_author ) + wp_die( __('Error: please fill the required fields (name, email).') ); + elseif ( !is_email($comment_author_email)) + wp_die( __('Error: please enter a valid email address.') ); +} + +if ( '' == $comment_content ) + wp_die( __('Error: please type a comment.') ); + +$comment_parent = isset($_POST['comment_parent']) ? absint($_POST['comment_parent']) : 0; + +$commentdata = compact('comment_post_ID', 'comment_author', 'comment_author_email', 'comment_author_url', 'comment_content', 'comment_type', 'comment_parent', 'user_ID'); + +$comment_id = wp_new_comment( $commentdata ); + +$comment = get_comment($comment_id); +if ( !$user->ID ) { + $comment_cookie_lifetime = apply_filters('comment_cookie_lifetime', 30000000); + setcookie('comment_author_' . COOKIEHASH, $comment->comment_author, time() + $comment_cookie_lifetime, COOKIEPATH, COOKIE_DOMAIN); + setcookie('comment_author_email_' . COOKIEHASH, $comment->comment_author_email, time() + $comment_cookie_lifetime, COOKIEPATH, COOKIE_DOMAIN); + setcookie('comment_author_url_' . COOKIEHASH, esc_url($comment->comment_author_url), time() + $comment_cookie_lifetime, COOKIEPATH, COOKIE_DOMAIN); +} + +$location = empty($_POST['redirect_to']) ? get_comment_link($comment_id) : $_POST['redirect_to'] . '#comment-' . $comment_id; +$location = apply_filters('comment_post_redirect', $location, $comment); + +wp_redirect($location); +exit; +?> diff --git a/src/wp-commentsrss2.php b/src/wp-commentsrss2.php new file mode 100644 index 0000000..280766e --- /dev/null +++ b/src/wp-commentsrss2.php @@ -0,0 +1,12 @@ + diff --git a/src/wp-config-sample.php b/src/wp-config-sample.php new file mode 100644 index 0000000..d1cea2c --- /dev/null +++ b/src/wp-config-sample.php @@ -0,0 +1,89 @@ + diff --git a/src/wp-config.php b/src/wp-config.php new file mode 100644 index 0000000..92a9ed1 --- /dev/null +++ b/src/wp-config.php @@ -0,0 +1,89 @@ +ST0E9&iYPd9H?Yu^@)rdfHDLg{:i/>)}zoK j]#'); // Cambia esto por tu frase aleatoria. +define('SECURE_AUTH_KEY', 'dzvwvMI?{[g):6r6*umDl.pRb9KGY;X<*KE,3&Gh~vK~}Rp_A+%K::T rVb'); // Cambia esto por tu frase aleatoria. +define('AUTH_SALT', 't:78G>9gk,.pun:D3^:_$SSpEw1>6:QC,)wMCHV'); // Cambia esto por tu frase aleatoria. +define('SECURE_AUTH_SALT', 'N<2pXCs^63AxWiuw-* vF+@d3XK*H<@@obi{-l)hZPB&)2fDl)PqRk9@R2{dnfn&'); // Cambia esto por tu frase aleatoria. +define('LOGGED_IN_SALT', '2%3Au216^[o!{BT*q y}CfHuZd0IJ/o_Dw`lb<+~dUYQ^7V_1dSfhCzNllmpsXdH'); // Cambia esto por tu frase aleatoria. +define('NONCE_SALT', '[hASI/;A,V`@qgLAaq:YG!V9`:4?1;n;T |]9x.L>5_;-W1=eU>SEyOJN7@qIYL['); // Cambia esto por tu frase aleatoria. +/**#@-*/ + +/** + * Prefijo de la base de datos de WordPress. + * + * Cambia el prefijo si deseas instalar multiples blogs en una sola base de datos. + * Emplea solo números, letras y guión bajo. + */ +$table_prefix = 'wpr3ss_'; + +/** + * Idioma de WordPress. + * + * Cambia lo siguiente para tener WordPress en tu idioma. El correspondiente archivo MO + * del lenguaje elegido debe encontrarse en wp-content/languages. + * Por ejemplo, instala ca_ES.mo copiándolo a wp-content/languages y define WPLANG como 'ca_ES' + * para traducir WordPress al catalán. + */ +define ('WPLANG', 'es_ES'); + +/** + * Para desarrolladores: modo debug de WordPress. + * + * Cambia esto a true para activar la muestra de avisos durante el desarrollo. + * Se recomienda encarecidamente a los desarrolladores de temas y plugins que usen WP_DEBUG + * en sus entornos de desarrollo. + */ +define('WP_DEBUG', false); + +/* ¡Eso es todo, deja de editar! Feliz blogging */ + +/** WordPress absolute path to the Wordpress directory. */ +if ( !defined('ABSPATH') ) + define('ABSPATH', dirname(__FILE__) . '/'); + +/** Sets up WordPress vars and included files. */ +require_once(ABSPATH . 'wp-settings.php'); +?> diff --git a/src/wp-content/index.php b/src/wp-content/index.php new file mode 100644 index 0000000..4e6c07c --- /dev/null +++ b/src/wp-content/index.php @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/src/wp-content/languages/es_ES.mo b/src/wp-content/languages/es_ES.mo new file mode 100644 index 0000000000000000000000000000000000000000..bdb789f4ce5a73a9276b77e206e6c49f74e5c72a GIT binary patch literal 404844 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%0D16lz6jN;gT2q}(v27aGell%x1tIjv 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 literal 0 HcmV?d00001 diff --git a/src/wp-content/languages/es_ES.po b/src/wp-content/languages/es_ES.po new file mode 100644 index 0000000..179f55f --- /dev/null +++ b/src/wp-content/languages/es_ES.po @@ -0,0 +1,14470 @@ +# Translation of Development (future 3.2) in Spanish (Spain) +# This file is distributed under the same license as the Development (future 3.2) package. +msgid "" +msgstr "" +"PO-Revision-Date: 2011-07-05 05:59:15+0000\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: GlotPress/0.1\n" +"Project-Id-Version: Development (future 3.2)\n" + +#: wp-admin/includes/theme.php:313 +msgid "Full Width Template" +msgstr "Plantilla a pantalla completa" + +#: wp-admin/includes/theme.php:315 +msgid "Post Formats" +msgstr "Formatos de entradas" + +#: wp-admin/includes/theme.php:311 +msgid "Featured Images" +msgstr "Imágenes destacadas" + +#: wp-admin/includes/theme.php:310 +msgid "Featured Image Header" +msgstr "Imagen de cabecera" + +#: wp-includes/formatting.php:2541 +msgid "The timezone you have entered is not valid. Please select a valid timezone." +msgstr "La zona horaria que has introducido no es válida. Por favor, selecciona una zona horaria válida." + +#: wp-admin/includes/dashboard.php:1181 +msgid "It looks like you're using an old version of %s. For the best WordPress experience, please update your browser." +msgstr "Parece que estás usando una versión antigua de %s. Para una mejor experiencia de WordPress, por favor, actualiza tu navegador." + +#: wp-admin/includes/dashboard.php:1179 +msgid "It looks like you're using an insecure version of %s. Using an outdated browser makes your computer unsafe. For the best WordPress experience, please update your browser." +msgstr "Parece que estás usando una versión insegura de %s. El uso de un navegador obsoleto hace que tu ordenador sea inseguro. Para una mejor experiencia con WordPress, por favor, actualiza tu navegador." + +#: wp-admin/includes/nav-menu.php:1118 +msgid "There are some invalid menu items. Please check or delete them." +msgstr "Hay algunos elementos de menú no válidos. Por favor, compruébalos o elimínalos." + +#: wp-includes/post.php:22 +msgctxt "add new on admin bar" +msgid "Post" +msgstr "Entrada" + +#: wp-includes/post.php:37 +msgctxt "add new on admin bar" +msgid "Page" +msgstr "Página" + +#: wp-admin/includes/nav-menu.php:73 +msgid "%s (Invalid)" +msgstr "%s (no válido)" + +#: wp-admin/includes/class-wp-plugin-install-list-table.php:141 +msgctxt "plugin name" +msgid "Name" +msgstr "Nombre" + +#: wp-admin/includes/class-wp-terms-list-table.php:100 +#: wp-admin/includes/class-wp-terms-list-table.php:339 +msgctxt "term name" +msgid "Name" +msgstr "Nombre" + +#: wp-admin/includes/template.php:428 wp-admin/includes/template.php:443 +#: wp-admin/includes/template.php:538 +msgctxt "meta name" +msgid "Name" +msgstr "Nombre" + +#: wp-admin/index.php:44 +msgid "WordPress Blog - Come here for the latest scoop." +msgstr "Blog oficial de WordPress - Ven aquí para ver las últimas noticias." + +#: wp-admin/user-new.php:34 +msgid "[%s] Your site invite" +msgstr "[%s] Tu sitio invita a" + +#: wp-admin/themes.php:212 +msgctxt "theme name" +msgid "Name" +msgstr "Nombre" + +#: wp-admin/edit-link-form.php:86 +#: wp-admin/includes/class-wp-links-list-table.php:80 +msgctxt "link name" +msgid "Name" +msgstr "Nombre" + +#: wp-includes/js/tinymce/langs/wp-langs.php:366 +msgctxt "html attribute" +msgid "Name" +msgstr "Nombre" + +#: wp-includes/js/tinymce/langs/wp-langs.php:323 +msgctxt "html attribute" +msgid "Name:" +msgstr "Nombre:" + +#: wp-admin/credits.php:174 +msgid "Blue Color Scheme" +msgstr "Paleta azul" + +#: wp-admin/credits.php:173 +msgid "Icon Design" +msgstr "Diseño del icono" + +#: wp-admin/theme-install.php:42 +msgid "You can find additional themes for your site by using the Theme Browser/Installer on this screen, which will display themes from the WordPress.org Theme Directory. These themes are designed and developed by third parties, are available free of charge, and are compatible with the license WordPress uses." +msgstr "Puedes encontrar más temas en el buscador/instalador de temas que hay en esta misma página, donde se mostrarán los temas del Directorio de temas. Estos temas son diseñados y desarrollados por terceros y estás disponibles sin cargo (gratis) y compatible con la licencia que utiliza WordPress." + +#: wp-admin/themes.php:43 +msgid "If you would like to see more themes to choose from, click on the “Install Themes” tab and you will be able to browse or search for additional themes from the WordPress.org Theme Directory. Themes in the WordPress.org Theme Directory are designed and developed by third parties, and are compatible with the license WordPress uses. Oh, and they’re free!" +msgstr "Si quieres ver más temas entre los que elegir haz clic en la pestaña “Instalar Temas” y podrás navegar o buscar más temas del Directorio de Temas de WordPress.org. Los temas del Directorio de WordPress.org están diseñados por terceros y son compabiltes con la licencia que utiliza Wordpress. Ah, y además ¡son gratis!" + +#: wp-admin/plugin-install.php:40 +msgid "Plugins hook into WordPress to extend its functionality with custom features. Plugins are developed independently from WordPress core by thousands of developers all over the world. All plugins in the official WordPress.org Plugin Directory are compatible with the license WordPress uses. You can find new plugins to install by searching or browsing the Directory right here in your own Plugins section." +msgstr "Los plugins se conectan con WordPress para extender su funcionalidad con características personalizadas. Los plugins los desarrollan de manera independiente del núcleo de WordPress miles de desarrolladores de tdoo el mundo. Todos los plugins en el directorio oficial de plugins de WordPress.org son compatibles con la licencia que utiliza WordPress. Puedes descubrir nuevos plugins para instalar buscando o navegando por el directorio desde aquí mismo, en tu propia sección de plugins." + +#: wp-includes/admin-bar.php:249 +msgctxt "add new from admin bar" +msgid "Media" +msgstr "Medio" + +#: wp-includes/admin-bar.php:261 +msgctxt "add new from admin bar" +msgid "Plugin" +msgstr "Plugin" + +#: wp-includes/admin-bar.php:252 +msgctxt "add new from admin bar" +msgid "Link" +msgstr "Enlace" + +#: wp-includes/admin-bar.php:258 +msgctxt "add new from admin bar" +msgid "Theme" +msgstr "Tema" + +#: wp-includes/admin-bar.php:255 +msgctxt "add new from admin bar" +msgid "User" +msgstr "Usuario" + +#: wp-admin/update-core.php:40 +msgid "Re-install Now" +msgstr "Reinstalar ahora" + +#: wp-admin/includes/file.php:255 +msgid "The uploaded file exceeds the upload_max_filesize directive in php.ini." +msgstr "El archivo subido excede la directiva upload_max_filesize en php.ini." + +#: wp-admin/includes/file.php:256 +msgid "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form." +msgstr "El archivo subido excede la directiva MAX_FILE_SIZE que se especificó en el formulario HTML." + +#: wp-includes/pluggable.php:870 +msgid "You should specify a nonce action to be verified by using the first parameter." +msgstr "Debes especificar una acción \"nonce\" a verificar mediante el primer parámetro." + +#: wp-includes/taxonomy.php:407 +msgid "View Tag" +msgstr "Ver etiqueta" + +#: wp-includes/taxonomy.php:407 +msgid "View Category" +msgstr "Ver categoría" + +#: wp-admin/tools.php:39 wp-admin/options-writing.php:94 +msgid "If your bookmarks toolbar is hidden: copy the code below, open your Bookmarks manager, create new bookmark, type Press This into the name field and paste the code into the URL field." +msgstr "Si tu barra de marcadores está oculta: copia el siguiente código, abre el gestor de marcadores, crea un nuevo marcador, teclea Publica esto en el campo de nombre y pega el código en el campo de la URL." + +#: wp-admin/credits.php:166 +msgid "Core Committer" +msgstr "Confirmador del núcleo" + +#: wp-admin/credits.php:167 +msgid "Guest Committer" +msgstr "Confirmador invitado" + +#: wp-admin/credits.php:172 +msgid "External Libraries" +msgstr "Librerías externas" + +#: wp-admin/press-this.php:623 +msgid "Add:" +msgstr "Añadir:" + +#: wp-admin/press-this.php:315 +msgid "Add Photos" +msgstr "Añadir fotos" + +#: wp-includes/js/tinymce/wp-mce-help.php:260 +msgid "Editor width in Distraction-free writing mode:" +msgstr "Ancho del editor en modo de escritura sin distracciones:" + +#: wp-includes/js/tinymce/wp-mce-help.php:261 +msgid "Wider" +msgstr "Más ancho" + +#: wp-includes/js/tinymce/wp-mce-help.php:262 +msgid "Narrower" +msgstr "Más estrecho" + +#: wp-includes/js/tinymce/wp-mce-help.php:263 +msgid "Default width" +msgstr "Ancho por defecto" + +#: wp-admin/credits.php:20 +msgid "Documentation on Contributing to WordPress" +msgstr "Documentación acerca de como colaborar con WordPress" + +#: wp-admin/credits.php:18 +msgid "WordPress always needs more people to report bugs, patch bugs, test betas, work on UI design, translate strings, write documentation, and add questions/answers/suggestions to the Support Forums. Join in!" +msgstr "WordPress siempre necesita más personas para informar de los errores, errores de parches, las versiones beta de prueba, el trabajo en el diseño de la interfaz de usuario, traducir cadenas, escribir documentación y agregar preguntas, respuestas y sugerencias a los foros de soporte técnico. ¡Participa!" + +#: wp-admin/credits.php:16 +msgid "Each name or handle is a link to that person’s profile in the WordPress.org community directory." +msgstr "Cada nombre o manejador es un enlace al perfil de esa persona en el directorio de la comunidad WordPress.org." + +#: wp-admin/nav-menus.php:452 +msgid "This feature allows you to use a custom menu in place of your theme’s default menus. If your theme does not support the custom menus feature yet (the new and old default themes, Twenty Eleven and Twenty Ten, do), you can learn about adding this support by following the Documentation link in this tab. You can still use the “Custom Menu” widget to add menus to a sidebar." +msgstr "Esta característica te permite usar un menú personalizado en lugar de menús predeterminados en tu tema. Si tu tema no es compatible con la función de los menús personalizados (los temas predeterminados nuevos y viejos, Twenty Eleven y Twenty Ten lo son), puedes aprender acerca de cómo agregar esta función siguiendo el enlace de documentación en esta pestaña. Puedes seguir utilizando el widget \"menú personalizado\" para añadir menús a una barra lateral." + +#: wp-admin/credits.php:17 +msgid "You can register your own profile at this link to start contributing." +msgstr "Puedes registrar tu propio perfil en este enlace para empezar a colaborar." + +#: wp-admin/index.php:36 +msgid "The left-hand navigation menu provides links to the administration screens in your WordPress application. You can expand or collapse navigation sections by clicking on the arrow that appears on the right side of each navigation item when you hover over it. You can also minimize the navigation menu to a narrow icon strip by clicking on the Collapse Menu arrow at the bottom of the nav menu, below Settings; when minimized, the submenu items will be displayed on hover." +msgstr "El menú de navegación de la izquierda ofrece enlaces a las pantallas de administración de WordPress. Puedes expandir o contraer secciones de navegación haciendo clic en la flecha que aparece a la derecha de cada elemento de navegación cuando pasas sobre él. También puedes minimizar el menú de navegación a una franja estrecha haciendo clic en la flecha de Cerrar menú en la parte inferior del menú de navegación, debajo de Ajustes. Cuando se minimiza, los elementos de submenú se mostrarán al pasar por encima." + +#: wp-admin/index.php:37 +msgid "You can arrange your dashboard by choosing which boxes, or modules, to display in the work area, how many columns to display them in, and where each box should be placed. You can hide/show boxes and select the number of columns in the Screen Options tab. To rearrange the boxes, drag and drop by clicking on the title bar of the selected box and releasing when you see a gray dotted-line rectangle appear in the location you want to place the box. You can also expand or collapse each box; click the title area or downward arrow of the box. In addition, some boxes are configurable, and will show a “Configure” link in the title bar if you hover over it." +msgstr "Puedes ordenar tu escritorio eligiendo que cajas, o módulos, mostrar en el área de trabajo, en cuantas columnas mostrarlas y donde debe estar cada caja. Puedes ocultar o mostrar cajas y elegir el número de columnas en la pestaña de Opciones de pantalla. Para reordenar las cajas arrastra y suéltalas haciendo clic en la barra de título de la caja elegida y suéltala cuando veas un rectángulo con una línea de puntos gris en el sitio donde quieras poner la caja. También peudes expandir o cerrar cada caja; haz clic en el área del título o en la flecha abajo de la caja. Además, algunas cajas son configurables, y mostrarán un enlace de “Configurar” en la barra de título al pasar sobre ella." + +#: wp-admin/edit-form-advanced.php:171 +msgid "Post Format - This designates how your theme will display a specific post. For example, you could have a standard blog post with a title and paragraphs, or a short aside that omits the title and contains a short text blurb. Please refer to the Codex for descriptions of each post format. Your theme could enable all or some of 10 possible formats." +msgstr "Formato de entrada - Esto se refiere a como tu tema mostrará una entrada específica. Por ejemplo, puedes tener una entrada de blog standard con título y párrafos, o una cita corta que omita el título y contenga un texto corto emergente. Por favor, remítete al Codex para las descripciones de cada formato de entrada. Tu tema puede permitir todos o solo alguno de los 10 posibles formatos." + +#: wp-admin/edit-form-advanced.php:182 +msgid "Creating a Page is very similar to creating a Post, and the screens can be customized in the same way using drag and drop, the Screen Options tab, and expanding/collapsing boxes as you choose. This screen also has the new in 3.2 distraction-free writing space, available in both the Visual and HTML modes via the Fullscreen buttons. The Page editor mostly works the same as the Post editor, but there are some Page-specific features in the Page Attributes box:" +msgstr "Crear una página es muy parecido a crear una entrada, y las pantallas pueden personalizarse del mismo modo, arrastrando y soltando, tienes la pestaña de Ajustes de pantalla, y puedes expandir o cerrar cajas a voluntad. Esta pantalla también dispone del espacio sin distracciones incorporado en 3.2, disponible tanto en los modos de editor visual como HTML desde los botones de pantalla completa. El editor de páginas trabaja prácticamente igual que el editor de entradas, solo que hay algunas características específicas para páginas en la caja Atributos de página:" + +#: wp-admin/index.php:35 +msgid "The Admin Bar at the top provides quick access to common tasks when you are viewing your site. If you miss the Favorite Actions dropdown, removed as of 3.2, you can find many of the same actions in the Admin Bar, such as Add New > Post." +msgstr "La barra de administración de la parte superior ofrece acceso rápido a tareas habituales cuando estás viendo tu sitio. Si echas de menos el desplegable de acciones preferidas, eliminado desde la versión 3.2, puedes encontrar muchas de esas acciones en la barra de administración, como por ejemplo Añadir nueva > Entrada." + +#: wp-admin/edit-comments.php:117 +msgid "In the Comment column, above each comment it says “Submitted on,” followed by the date and time the comment was left on your site. Clicking on the date/time link will take you to that comment on your live site. Hovering over any comment gives you options to approve, reply (and approve), quick edit, edit, spam mark, or trash that comment." +msgstr "En la columna de comentario, sobre cada comentario dice: \"Enviado el\", seguido de la fecha y hora se hizo un comentario en tu sitio. Al hacer clic en la fecha y hora, el enlace te llevará a ese comentario en tu sitio. Pasar por encima de cualquier comentario da opciones para aprobarlo, responderlo (con aprobación), edición rápida, edición normal, marcar como spam o mandar a la papelera ese comentario." + +#: wp-admin/options-privacy.php:20 +msgid "When this setting is in effect a reminder is shown in the Right Now box of the Dashboard that says, “Search Engines Blocked,” to remind you that your site is not being crawled." +msgstr "Cuando este ajuste está activado se muestra un aviso en la caja Ahora mismo del Escritorio que dice: \"Motores de búsqueda bloqueados\", para recordarte que tu sitio no está siendo rastreado." + +#: wp-admin/edit-form-advanced.php:169 +msgid "Post editor - Enter the text for your post. There are two modes of editing: Visual and HTML. Choose the mode by clicking on the appropriate tab. Visual mode gives you a WYSIWYG editor. Click the last icon in the row to get a second row of controls. The HTML mode allows you to enter raw HTML along with your post text. You can insert media files by clicking the icons above the post editor and following the directions. You can go the distraction-free writing screen, new in 3.2, via the Fullscreen icon in Visual mode (second to last in the top row) or the Fullscreen button in HTML mode (last in the row). Once there, you can make buttons visible by hovering over the top area. Exit Fullscreen back to the regular post editor." +msgstr "Editor de entradas - Introduce el texto de tu entrada. Hay dos modos de editar: Visual y HTML. Elige el modo haciendo clic en la pestaña adecuada. El modo visual te ofrece un editor WYSIWYG (lo que ves es lo que obtendrás). Haz clic en el último icono de la fila para mostrar una segunda fila de controles. El modo HTML permite introducir HTML en el texto de tu entrada. Puedes insertar archivos multimedia haciendo clic en los iconos por encima del editor y seguir las instrucciones. Puedes ir a la pantalla de escritura sin distracción, nueva en 3.2, a través del icono de Pantalla completa en el modo visual (segundo desde la derecha en la fila superior) o del botón de Pantalla completa del modo HTML (el último de la fila). Una vez ahí puedes hacer visibles los botones pasando sobre el área superior. Salir de pantalla completa te devuelve al editor de entradas normal." + +#: wp-admin/tools.php:16 +msgid "The Use This link for the Categories and Tags Converter will take you to the Import page, where that Converter is one of the plugins you can download. Once that plugin is installed, the link on this page takes you to a screen where you can choose conversion either way." +msgstr "Al usar este vínculo para el convertidor de las categorías y etiquetas te llevará a la página de importación, donde dicho convertidor es uno de los plugins que puedes descargar. Una vez que el plugin está instalado, el enlace en esta página te lleva a una pantalla donde se puede elegir la conversión adecuada." + +#: wp-admin/edit-form-advanced.php:167 +msgid "The title field and the big Post Editing Area are fixed in place, but you can reposition all the other boxes using drag and drop, and can minimize or expand them by clicking the title bar of each box. Use the Screen Options tab to unhide more boxes (Excerpt, Send Trackbacks, Custom Fields, Discussion, Slug, Author) or to choose a 1- or 2-column layout for this screen." +msgstr "El campo de título del área grande de edición de entradas es fijo, pero puedes cambiar la posición del resto de cajas solo con arrastrar y soltar, y puedes miniminzarlas o expandirlas haciendo clic en la barra de título de cada caja. Usa la pestaña de Ajustes de pantalla para mostrar más cajas (Extracto, Enviar trackbacks, Campos personalizados, Discusión, Slug, Autor) o para elegir un diseño de 1 o 2 columnas para esta pantalla." + +#: wp-admin/menu.php:219 +msgid "Available Tools" +msgstr "Herramientas disponibles" + +#: wp-admin/menu.php:225 +msgid "Network Setup" +msgstr "Configuración de la red" + +#: wp-admin/credits.php:165 +msgid "User Experience Lead" +msgstr "Líder de experiencia de usuario" + +#: wp-admin/credits.php:105 +msgctxt "Translate this to be the equivalent of English Translators in your language for the credits page Translators section" +msgid "Translators" +msgstr "Traductores" + +#: wp-admin/credits.php:92 wp-admin/credits.php:149 +msgid "http://codex.wordpress.org/Contributing_to_WordPress" +msgstr "http://codex.wordpress.org/Contributing_to_WordPress" + +#: wp-admin/credits.php:97 +msgid "WordPress is created by a worldwide team of passionate individuals. We couldn’t possibly list them all, but here some of the most influential people currently involved with the project:" +msgstr "WordPress está creado por un equipo de personas apasionadas de todas partes del mundo. No se pueden enumerar todas, pero estas son algunas de las personas más influyentes que en la actualidad participan en el proyecto:" + +#: wp-admin/freedoms.php:30 +msgid "WordPress grows when people like you tell their friends about it, and the thousands of businesses and services that are built on and around WordPress share that fact with their users. We’re flattered every time someone spreads the good word, just make sure to check out our trademark guidelines first." +msgstr "WordPress crece cuando la gente habla a sus amigos sobre él y los miles de negocios y servicios que se construyen en y alrededor de WordPress lo comparten con sus usuarios. Nos enorgullece cada vez que alguien difunde la buena nueva, simplemente asegúrate de echar un vistazo a nuestras guías de marca." + +#: wp-admin/freedoms.php:37 +msgid "Every plugin and theme in WordPress.org’s directory is 100%% GPL or a similarly free and compatible license, so you can feel safe finding plugins and themes there. If you get a plugin or theme from another source, make sure to ask them if it’s GPL first. If they don’t respect the WordPress license, we don’t recommend them." +msgstr "Cada plugin y tema del directorio de WordPress.org es 100%% GPL o con una licencia libre similar y compatible, así que puedes sentirte seguro buscando plugins y temas aquí. Si obtienes un plugin o tema desde otra fuente asegúrate de preguntar primero si es GPL. Si no respeta la licencia de WordPress no lo recomedamos." + +#: wp-admin/freedoms.php:21 +msgid "WordPress is Free and open source software, built by a distributed community of mostly volunteer developers from around the world. WordPress comes with some awesome, worldview-changing rights courtesy of its license, the GPL." +msgstr "WordPress es un software de código libre y abierto, construido por una comunidad de desarrolladores, en su mayoría voluntarios, distribuidos por todo el mundo. WordPress viene con la genial licencia que cambiará el mundo, la licencia GPL." + +#: wp-admin/edit-form-advanced.php:272 wp-admin/includes/post.php:1853 +msgid "Word count: %s" +msgstr "Número de palabras: %s" + +#: wp-admin/includes/post.php:1807 +msgid "Blockquote (Alt+Shift+Q)" +msgstr "Cita (Alt+Shift+Q)" + +#: wp-admin/credits.php:164 +msgid "Lead Developer" +msgstr "Jefe de Desarrollo" + +#: wp-admin/credits.php:168 +msgid "Developer" +msgstr "Desarrollador" + +#: wp-admin/includes/post.php:1813 +msgid "Help (Alt + Shift + H)" +msgstr "Ayuda (Alt + Mayús + H)" + +#: wp-admin/includes/schema.php:684 +msgid "" +"Dear User,\n" +"\n" +"Your new SITE_NAME site has been successfully set up at:\n" +"BLOG_URL\n" +"\n" +"You can log in to the administrator account with the following information:\n" +"Username: USERNAME\n" +"Password: PASSWORD\n" +"Log in Here: BLOG_URLwp-login.php\n" +"\n" +"We hope you enjoy your new site.\n" +"Thanks!\n" +"\n" +"--The Team @ SITE_NAME" +msgstr "" +"Estimado usuario:\n" +"\n" +"Tu nuevo sitio SITE_NAME se ha creado en:\n" +"BLOG_URL\n" +"\n" +"Puedes acceder a la administración de la cuenta con la siguiente información:\n" +"Nombre de usuario: USERNAME\n" +"Contraseña: PASSWORD\n" +"Acceda aquí: BLOG_URLwp-login.php\n" +"\n" +"Esperamos que disfrutes de tu nuevo sitio\n" +"Gracias\n" +"\n" +"-- El equipo @ SITE_NAME" + +#: wp-admin/credits.php:160 +msgid "Extended Core Team" +msgstr "Equipo Extendido del Core" + +#: wp-admin/credits.php:147 +msgid "Want to see your name in lights on this page? Get involved in WordPress." +msgstr "¿Quieres ver tu nombre destacado en esta página? Involúcrate en WordPress." + +#: wp-admin/credits.php:12 +msgid "Credits" +msgstr "Créditos" + +#: wp-admin/widgets.php:360 +msgctxt "removing-widget" +msgid "Deactivate" +msgstr "Desactivar" + +#: wp-admin/credits.php:82 +msgid "WordPress Credits" +msgstr "Créditos de WordPress" + +#: wp-admin/credits.php:163 +msgid "Cofounder, Project Lead" +msgstr "Co-fundador, jefe de proyecto" + +#: wp-admin/credits.php:171 +msgid "Internationalization" +msgstr "Internacionalización" + +#: wp-admin/admin-header.php:154 +msgid "Howdy, %1$s" +msgstr "Hola, %1$s" + +#: wp-admin/admin-header.php:156 +msgid "Edit your profile" +msgstr "Edita tu perfil" + +#: wp-admin/credits.php:162 +msgid "Core Contributors to WordPress %s" +msgstr "Colaboradores del núcleo de Wordpress %s" + +#: wp-admin/credits.php:161 +msgid "Recent Rockstars" +msgstr "Estrellas del rock recientes" + +#: wp-admin/includes/post.php:1784 +msgid "Exit fullscreen" +msgstr "Salir de pantalla completa" + +#: wp-admin/includes/post.php:1854 +msgid "Just write." +msgstr "Simplemente escribe." + +#: wp-admin/menu.php:117 +msgid "All Comments" +msgstr "Todos los comentarios" + +#: wp-admin/menu.php:185 +msgid "Installed Plugins" +msgstr "Plugins instalados" + +#: wp-admin/menu.php:202 +msgid "All Users" +msgstr "Todos los usuarios" + +#: wp-admin/credits.php:89 +msgid "WordPress is created by a worldwide team of passionate individuals. Get involved in WordPress." +msgstr "WordPress está creado por un equipo de personas apasionadas que están alrededor del todo el planeta.Involucrarse en WordPress." + +#: wp-admin/credits.php:159 +msgid "Project Leaders" +msgstr "Líderes de proyecto" + +#: wp-admin/credits.php:169 +msgid "Designer" +msgstr "Diseñador" + +#: wp-admin/freedoms.php:24 +msgid "You have the freedom to run the program, for any purpose." +msgstr "Tienes la libertad de usar el programa con cualquier propósito." + +#: wp-admin/includes/dashboard.php:1192 +msgid "

    Update %2$s or learn how to browse happy

    " +msgstr "

    Actualiza %2$s o aprende como navegar feliz

    " + +#: wp-admin/freedoms.php:25 +msgid "You have access to the source code, the freedom to study how the program works, and the freedom to change it to make it do what you wish." +msgstr "Tienes acceso al código fuente, la libertad de estudiar cómo funciona el programa, y ​​la libertad de cambiarlo para que haga lo que quieras." + +#: wp-admin/freedoms.php:26 +msgid "You have the freedom to redistribute copies of the original program so you can help your neighbor." +msgstr "Tienes la libertad de redistribuir copias del programa original y así ayudar a otros." + +#: wp-admin/admin-footer.php:27 +msgid "Credits" +msgstr "Créditos" + +#: wp-admin/freedoms.php:27 +msgid "You have the freedom to distribute copies of your modified versions to others. By doing this you can give the whole community a chance to benefit from your changes." +msgstr "Eres libre de distribuir copias de tu versión modificada a quien quieras. Si lo haces, das la oportunidad de beneficiarse de tus cambios a toda la comunidad." + +#: wp-admin/includes/dashboard.php:33 +msgid "You are using an insecure browser!" +msgstr "¡Estás usando un navegador inseguro!" + +#: wp-admin/includes/dashboard.php:35 +msgid "Your browser is out of date!" +msgstr "¡Tu navegador está obsoleto!" + +#: wp-admin/freedoms.php:39 +msgid "Don’t you wish all software came with these freedoms? So do we! For more information, check out the Free Software Foundation." +msgstr "¿No te gustaría que todo el software tuviera esa libertad? Nosotros también. Para más información ve a la Free Software Foundation." + +#: wp-admin/admin-ajax.php:944 +msgid "Your login has expired. Please open a new browser window and log in again. " +msgstr "Tu acceso ha caducado. Por favor, abre una nueva ventana del navegador y accede de nuevo." + +#: wp-admin/admin-footer.php:25 +msgid "Freedoms" +msgstr "Derechos" + +#: wp-admin/freedoms.php:12 wp-admin/freedoms.php:19 +msgid "Freedoms" +msgstr "Derechos" + +#: wp-admin/custom-background.php:298 +msgid "Clear" +msgstr "Borrar" + +#: wp-admin/themes.php:146 wp-admin/themes.php:148 +msgid "Search Installed Themes" +msgstr "Buscar temas instalados" + +#: wp-admin/custom-header.php:542 +msgid "You can use one of these cool headers or show a random one on each page." +msgstr "Puedes usar una de estas cabeceras tan chulas o mostrarlas aleatoriamente en cada página." + +#: wp-admin/custom-header.php:540 +msgid "If you don‘t want to upload your own image, you can use one of these cool headers, or show a random one." +msgstr "Si no quieres subir tu propia imagen puedes usar una de estas cabeceras tan chulas o ir mostrándolas aleatoriamente." + +#: wp-admin/custom-header.php:528 +msgid "You can choose one of your previously uploaded headers, or show a random one." +msgstr "Puedes elegir una las cabeceras que ya has subido o que se muestren aleatoriamente." + +#: wp-includes/script-loader.php:320 +msgid "Approve and Reply" +msgstr "Aprobar y responder" + +#: wp-includes/post.php:1188 wp-admin/menu.php:75 +msgid "All Posts" +msgstr "Todas las entradas" + +#: wp-includes/post.php:1188 wp-admin/menu.php:100 +msgid "All Pages" +msgstr "Todas las páginas" + +#: wp-admin/menu-header.php:173 +msgid "Collapse menu" +msgstr "Cerrar menú" + +#: wp-admin/includes/class-wp-plugins-list-table.php:296 +msgid "Drop-ins are advanced plugins in the %s directory that replace WordPress functionality when present." +msgstr "Los infiltrados son plugins avanzados del directorio %s que reemplazan funcionalidades de WordPress cuando están disponibles." + +#: wp-admin/includes/class-wp-plugins-list-table.php:294 +msgid "Files in the %s directory are executed automatically." +msgstr "Los archivos del directorio %s se ejecutan automáticamente." + +#: wp-admin/includes/post.php:1835 +msgid "Updated." +msgstr "Actualizada." + +#: wp-includes/script-loader.php:89 +msgid "fullscreen" +msgstr "pantalla completa" + +#: wp-admin/custom-header.php:270 +msgid "Random: Show a different image on each page." +msgstr "Aleatoria: Muestra una imagen diferente en cada página." + +#: wp-admin/custom-header.php:526 +msgid "Uploaded Images" +msgstr "Imágenes subidas" + +#: wp-admin/edit-tags.php:216 +msgid "Documentation on Post Tags" +msgstr "Documentación sobre etiquetas de las entradas" + +#: wp-admin/media-upload.php:69 +msgid "Documentation on Uploading Media Files" +msgstr "Documentación sobre la carga de archivos multimedia" + +#: wp-admin/user-edit.php:47 +msgid "Documentation on User Profiles" +msgstr " Documentación sobre los perfiles de usuario" + +#: wp-admin/options-permalink.php:26 +msgid "Documentation on Permalinks Settings" +msgstr " Documentación sobre ajustes de enlaces permanentes" + +#: wp-admin/edit-tags.php:212 +msgid "Documentation on Categories" +msgstr "Documentación sobre las categorías" + +#: wp-admin/edit-tags.php:214 +msgid "Documentation on Link Categories" +msgstr " Documentación sobre categorías de enlaces" + +#: wp-admin/widgets.php:45 +msgid "Documentation on Widgets" +msgstr " Documentación sobre widgets" + +#: wp-admin/nav-menus.php:456 +msgid "Documentation on Menus" +msgstr " Documentación sobre menús " + +#: wp-admin/media.php:76 +msgid "Documentation on Edit Media" +msgstr "Documentación de editar objetos multimedia" + +#: wp-admin/edit-form-advanced.php:188 +msgid "Documentation on Editing Pages" +msgstr " Documentación de la edición de páginas" + +#: wp-admin/upload.php:148 +msgid "Documentation on Media Library" +msgstr "Documentación sobre la librería multimedia " + +#: wp-admin/tools.php:19 +msgid "Documentation on Tools" +msgstr "Documentación sobre herramientas " + +#: wp-admin/custom-header.php:106 +msgid "Documentation on Custom Header" +msgstr "Documentación sobre cabeceras personalizadas" + +#: wp-admin/export.php:45 +msgid "Documentation on Export" +msgstr "Documentación sobre exportación " + +#: wp-admin/options-general.php:69 +msgid "Documentation on General Settings" +msgstr "Documentación sobre ajustes generales" + +#: wp-admin/options-media.php:24 +msgid "Documentation on Media Settings" +msgstr "Documentación sobre Ajustes multimedia" + +#: wp-admin/update-core.php:413 +msgid "Documentation on Updating WordPress" +msgstr " Documentación sobre actualizar WordPress" + +#: wp-admin/edit-form-advanced.php:177 +msgid "Documentation on Writing and Editing Posts" +msgstr "Documentación sobre escritura y edición de entradas " + +#: wp-admin/comment.php:51 wp-admin/edit-comments.php:121 +msgid "Documentation on Comments" +msgstr "Documentación sobre comentarios" + +#: wp-admin/users.php:28 +msgid "Documentation on Managing Users" +msgstr "Documentación sobre la gestión de usuarios" + +#: wp-admin/options-discussion.php:22 +msgid "Documentation on Discussion Settings" +msgstr "Documentación sobre ajustes de comentarios" + +#: wp-admin/edit-link-form.php:47 +msgid "Documentation on Creating Links" +msgstr " Documentación sobre la creación de enlaces " + +#: wp-admin/options-reading.php:50 +msgid "Documentation on Reading Settings" +msgstr "Documentación sobre ajustes de lectura" + +#: wp-admin/plugin-install.php:45 +msgid "Documentation on Installing Plugins" +msgstr "Documentación sobre la instalación de plugins " + +#: wp-admin/edit.php:169 +msgid "Documentation on Managing Posts" +msgstr "Documentación sobre la gestión de entradas " + +#: wp-admin/options-privacy.php:23 +msgid "Documentation on Privacy Settings" +msgstr "Documentación sobre ajustes de privacidad" + +#: wp-admin/index.php:48 +msgid "Documentation on Dashboard" +msgstr "Documentación sobre el escritorio" + +#: wp-admin/plugin-editor.php:122 +msgid "Documentation on Editing Plugins" +msgstr "Documentación de la edición de plugins" + +#: wp-admin/custom-background.php:88 +msgid "Documentation on Custom Background" +msgstr " Documentación sobre fondo personalizado" + +#: wp-admin/import.php:23 +msgid "Documentation on Import" +msgstr "Documentación sobre importar" + +#: wp-admin/edit.php:178 +msgid "Documentation on Managing Pages" +msgstr "Documentación sobre la gestión de páginas" + +#: wp-admin/edit-form-advanced.php:187 +msgid "Documentation on Adding New Pages" +msgstr "Documentación sobre añadir nuevas páginas" + +#: wp-admin/options-writing.php:22 +msgid "Documentation on Writing Settings" +msgstr "Documentación sobre ajustes de escritura" + +#: wp-admin/link-manager.php:49 +msgid "Documentation on Managing Links" +msgstr "Documentación sobre la gestión de enlaces " + +#: wp-admin/user-new.php:149 +msgid "Documentation on Adding New Users" +msgstr "Documentación sobre agregar nuevos usuarios" + +#: wp-admin/includes/post.php:1801 +msgid "Bold (Ctrl + B)" +msgstr "Negrita (Ctrl + B)" + +#: wp-admin/includes/post.php:1802 +msgid "Italic (Ctrl + I)" +msgstr "Cursiva (Ctrl + I)" + +#: wp-admin/includes/post.php:1805 +msgid "Ordered list (Alt + Shift + O)" +msgstr "Lista ordenada (Alt + Mayúsculas + O)" + +#: wp-admin/includes/post.php:1804 +msgid "Unordered list (Alt + Shift + U)" +msgstr "Lista sin ordenar (Alt + Shift + U)" + +#: wp-admin/includes/post.php:1808 +msgid "Insert/edit image (Alt + Shift + M)" +msgstr "Insertar/editar imagen (Alt + Mayúsculas + M)" + +#: wp-admin/includes/post.php:1810 +msgid "Insert/edit link (Alt + Shift + A)" +msgstr "Insertar / editar enlace (Alt + Mayúsculas + A)" + +#: wp-admin/includes/post.php:1811 +msgid "Unlink (Alt + Shift + S)" +msgstr "Desvincular (Alt + Shift + S)" + +#: wp-admin/admin-ajax.php:1524 +msgid "Save failed" +msgstr "Error al guardar" + +#: wp-admin/users.php:164 +msgid "You have specified this user for deletion:" +msgid_plural "You have specified these users for deletion:" +msgstr[0] "Ha marcado a este usuario para su eliminación:" +msgstr[1] "Ha marcado a estos usuarios para su eliminación:" + +#: wp-admin/user-edit.php:161 +msgid "← Back to Users" +msgstr "← Volver a usuarios" + +#: wp-admin/admin-ajax.php:959 +msgid "Autosave disabled." +msgstr "Autoguardado desactivado." + +#: wp-admin/admin-ajax.php:962 +msgid "%s is currently editing this article. If you update it, you will overwrite the changes." +msgstr "%s está actualmente editando este artículo. Si lo actualizas, sobrescribirás los cambios." + +#: wp-includes/js/tinymce/wp-mce-help.php:271 +msgid "TinyMCE is a platform independent web based Javascript HTML WYSIWYG editor released as Open Source under %sLGPL\tby Moxiecode Systems AB. It has the ability to convert HTML TEXTAREA fields or other HTML elements to editor instances." +msgstr "TinyMCE es un editor Javascript HTML WYSIWYG basado en web e independiente de la plataforma, liberado como Código abierto bajo la licencia %sLGPL→ por Moxiecode Systems AB. Puede convertir campos u o tros elementos HTML en instancias del editor." + +#: wp-includes/js/tinymce/langs/wp-langs.php:40 +msgid "Indigo" +msgstr "Ãndigo" + +#: wp-includes/js/tinymce/langs/wp-langs.php:39 +msgid "Navy Blue" +msgstr "Azul marino" + +#: wp-includes/js/tinymce/langs/wp-langs.php:37 +msgid "Dark green" +msgstr "Verde oscuro" + +#: wp-includes/js/tinymce/langs/wp-langs.php:51 +msgid "Amber" +msgstr "Ãmbar" + +#: wp-includes/js/tinymce/langs/wp-langs.php:44 +msgid "Olive" +msgstr "Verde oliva" + +#: wp-includes/js/tinymce/langs/wp-langs.php:231 +msgid "Words:" +msgstr "Palabras:" + +#: wp-includes/js/tinymce/langs/wp-langs.php:42 +msgid "Maroon" +msgstr "Granate" + +#: wp-includes/js/tinymce/langs/wp-langs.php:461 +msgid "Poster" +msgstr "Cartel" + +#: wp-includes/js/tinymce/langs/wp-langs.php:460 +msgid "Preload" +msgstr "Precarga" + +#: wp-includes/js/tinymce/langs/wp-langs.php:459 +msgid "Alternative source 2" +msgstr "Fuente alternativa 2" + +#: wp-includes/js/tinymce/langs/wp-langs.php:458 +msgid "Alternative source 1" +msgstr "Fuente alternativa 1" + +#: wp-includes/js/tinymce/langs/wp-langs.php:224 +msgid "Disc" +msgstr "Disco" + +#: wp-includes/js/tinymce/langs/wp-langs.php:222 +msgid "Upper roman" +msgstr "Romana superior" + +#: wp-includes/js/tinymce/langs/wp-langs.php:62 +msgid "Aqua" +msgstr "Agua" + +#: wp-includes/js/tinymce/langs/wp-langs.php:61 +msgid "Lime" +msgstr "Lima" + +#: wp-includes/js/tinymce/langs/wp-langs.php:58 +msgid "Magenta" +msgstr "Magenta" + +#: wp-includes/js/tinymce/langs/wp-langs.php:55 +msgid "Royal blue" +msgstr "Azul real" + +#: wp-includes/js/tinymce/langs/wp-langs.php:54 +msgid "Turquoise" +msgstr "Turquesa" + +#: wp-includes/js/tinymce/langs/wp-langs.php:52 +msgid "Yellow green" +msgstr "Verde amarillento" + +#: wp-includes/js/tinymce/langs/wp-langs.php:221 +msgid "Upper alpha" +msgstr "Alfa superior" + +#: wp-includes/js/tinymce/langs/wp-langs.php:220 +msgid "Lower roman" +msgstr "Romana inferior" + +#: wp-includes/js/tinymce/langs/wp-langs.php:35 +msgid "Burnt orange" +msgstr "Naranja quemado" + +#: wp-includes/js/tinymce/langs/wp-langs.php:152 +msgid "Paste is now in plain text mode. Click again to toggle back to regular paste mode." +msgstr "Pegar está ahora en modo de texto sin formato. Haz clic de nuevo para volver al modo de pegado normal." + +#: wp-includes/js/tinymce/langs/wp-langs.php:72 +msgid "Plum" +msgstr "Ciruela" + +#: wp-includes/js/tinymce/langs/wp-langs.php:28 +msgid "{#field} must be a number" +msgstr "{#field} debe ser un número" + +#: wp-includes/js/tinymce/langs/wp-langs.php:57 +msgid "Medium gray" +msgstr "Gris medio" + +#: wp-includes/js/tinymce/langs/wp-langs.php:53 +msgid "Sea green" +msgstr "Verde mar" + +#: wp-includes/js/tinymce/langs/wp-langs.php:151 +msgid "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." +msgstr "Pegar está ahora en modo de texto sin formato. Haz clic de nuevo para volver al modo de pegado regular. Después de pegar algo se te devolverá al modo de pegado normal." + +#: wp-includes/js/tinymce/langs/wp-langs.php:457 +msgid "HTML5 Video Options" +msgstr "Opciones de vídeo HTML5" + +#: wp-includes/js/tinymce/langs/wp-langs.php:41 +msgid "Very dark gray" +msgstr "Gris muy oscuro" + +#: wp-includes/js/tinymce/langs/wp-langs.php:296 +msgid "Press ALT F10 for toolbar. Press ALT 0 for help." +msgstr "Pulsa ALT F10 para la barra de herramientas. Pulsa ALT 0 para ayuda." + +#: wp-includes/js/tinymce/langs/wp-langs.php:295 +#: wp-includes/js/tinymce/langs/wp-langs.php:351 +msgid "Accessibility Help" +msgstr "Ayuda sobre accesibilidad" + +#: wp-includes/js/tinymce/langs/wp-langs.php:352 +msgid "General Usage" +msgstr "Uso general" + +#: wp-includes/js/tinymce/langs/wp-langs.php:29 +msgid "{#field} must be a number greater than {#min}" +msgstr "{#field} debe ser un número mayor que {#min}" + +#: wp-includes/js/tinymce/langs/wp-langs.php:38 +msgid "Dark azure" +msgstr "Azur oscuro" + +#: wp-includes/js/tinymce/langs/wp-langs.php:36 +msgid "Dark olive" +msgstr "Verde oliva oscuro" + +#: wp-includes/js/tinymce/langs/wp-langs.php:219 +msgid "Lower greek" +msgstr "Griega inferior" + +#: wp-includes/js/tinymce/langs/wp-langs.php:218 +msgid "Lower alpha" +msgstr "Alfa inferior" + +#: wp-includes/js/tinymce/langs/wp-langs.php:210 +msgid "Learn word" +msgstr "Aprender palabra" + +#: wp-includes/js/tinymce/langs/wp-langs.php:216 +msgid "Types" +msgstr "Tipos" + +#: wp-includes/js/tinymce/langs/wp-langs.php:298 +msgid "Toolbar" +msgstr "Barra de herramientas" + +#: wp-includes/js/tinymce/langs/wp-langs.php:30 +msgid "{#field} must be a number or percentage" +msgstr "{#field} debe ser un número o porcentaje" + +#: wp-includes/js/tinymce/langs/wp-langs.php:225 +msgid "Square" +msgstr "Cuadrado" + +#: wp-includes/js/tinymce/langs/wp-langs.php:59 +msgid "Gold" +msgstr "Dorado" + +#: wp-includes/js/tinymce/langs/wp-langs.php:71 +msgid "Light sky blue" +msgstr "Azul cielo claro" + +#: wp-includes/js/tinymce/langs/wp-langs.php:223 +msgid "Circle" +msgstr "Círculo" + +#: wp-includes/js/tinymce/langs/wp-langs.php:67 +msgid "Peach" +msgstr "Melocotón" + +#: wp-includes/js/tinymce/wp-mce-help.php:272 +msgid "Copyright © 2003-2011, Moxiecode Systems AB, All rights reserved." +msgstr "Derechos de copia © 2003-2011, Moxiecode Systems AB, Todos los derechos reservados." + +#: wp-includes/js/tinymce/langs/wp-langs.php:63 +msgid "Sky blue" +msgstr "Azul cielo" + +#: wp-includes/js/tinymce/langs/wp-langs.php:228 +#: wp-includes/js/tinymce/langs/wp-langs.php:297 +msgid "Rich Text Area" +msgstr "Ãrea de texto enriquecido" + +#: wp-includes/js/tinymce/langs/wp-langs.php:69 +msgid "Pale green" +msgstr "Verde pálido" + +#: wp-includes/js/tinymce/langs/wp-langs.php:68 +msgid "Light yellow" +msgstr "Amarillo claro" + +#: wp-includes/js/tinymce/langs/wp-langs.php:46 +msgid "Teal" +msgstr "Turquesa" + +#: wp-includes/js/tinymce/langs/wp-langs.php:70 +msgid "Pale cyan" +msgstr "Cian pálido" + +#: wp-includes/js/tinymce/langs/wp-langs.php:48 +msgid "Grayish blue" +msgstr "Azul grisáceo" + +#: wp-includes/class-http.php:146 +msgid "Destination directory for file streaming does not exist or is not writable." +msgstr "La carpeta de destino para cargar el archivo no existe o no tiene permisos de escritura." + +#: wp-includes/class-http.php:248 +msgid "There are no HTTP transports available which can complete the requested request." +msgstr "No hay medios de transporte HTTP disponibles que puedan completar la solicitud requerida." + +#: wp-includes/taxonomy.php:92 wp-includes/taxonomy.php:93 +#: wp-admin/edit-form-advanced.php:106 +msgctxt "post format" +msgid "Format" +msgstr "Formato" + +#: wp-content/plugins/akismet/admin.php:444 +msgid "Akismet has protected your site from %2$s spam comment already. " +msgid_plural "Akismet has protected your site from %2$s spam comments already. " +msgstr[0] "Akismet ha protegido su sitio de %2$s comentario de spam hasta ahora." +msgstr[1] "Akismet ha protegido su sitio de %2$s comentarios de spam hasta ahora." + +#: wp-content/plugins/akismet/admin.php:454 +msgid "There's %1$s comment in your spam queue right now." +msgid_plural "There are %1$s comments in your spam queue right now." +msgstr[0] "Hay %1$s comentario en la cola de spam en este momento." +msgstr[1] "Hay %1$s comentarios en la cola de spam en este momento." + +#: wp-admin/includes/class-wp-list-table.php:526 +msgctxt "paging" +msgid "%1$s of %2$s" +msgstr "%1$s de %2$s" + +#: wp-content/plugins/akismet/admin.php:450 +msgid "Akismet blocks spam from getting to your blog. " +msgstr "Akismet bloquea el spam que llegue a tu sitio." + +#: wp-admin/user-edit.php:216 wp-admin/user-edit.php:217 +msgid "Show Admin Bar" +msgstr "Mostrar la barra de administración" + +#: wp-admin/user-edit.php:220 +msgid "when viewing site" +msgstr "cuando se esté viendo el sitio" + +#: wp-content/plugins/akismet/admin.php:139 +msgid "Sign up success! Please check your email for your Akismet API Key and enter it below." +msgstr "¡Regístro completado! Por favor, consulta en tu correo electrónico tu clave de API de Akismet y añádela debajo." + +#: wp-admin/user-edit.php:223 +msgid "in dashboard" +msgstr "en el escritorio" + +#: wp-content/plugins/akismet/admin.php:325 +msgid "Flagged as spam by Akismet" +msgstr "Marcado como spam por Akismet" + +#: wp-content/plugins/akismet/widget.php:89 +msgid "" +msgid_plural "" +msgstr[0] "" +msgstr[1] "" + +#: wp-content/plugins/akismet/widget.php:15 +msgid "%1$s%2$s%3$s %4$sspam comment%5$s %6$sblocked by%7$s
    %8$sAkismet%9$s" +msgid_plural "%1$s%2$s%3$s %4$sspam comments%5$s %6$sblocked by%7$s
    %8$sAkismet%9$s" +msgstr[0] "%1$s%2$s%3$s %4$scomentario de spam%5$s %6$sbloqueado por%7$s
    %8$sAkismet%9$s" +msgstr[1] "%1$s%2$s%3$s %4$scomentarios de spam%5$s %6$sbloqueados por%7$s
    %8$sAkismet%9$s" + +#: wp-content/plugins/akismet/admin.php:342 +msgid "History" +msgstr "Historial" + +#: wp-content/plugins/akismet/admin.php:275 +msgctxt "comments" +msgid "Spam" +msgstr "Spam" + +#: wp-content/plugins/akismet/admin.php:460 +msgid "There's nothing in your spam queue at the moment." +msgstr "En este momento no tienes nada en la cola de spam. " + +#: wp-content/plugins/akismet/admin.php:327 +msgid "Cleared by Akismet" +msgstr "Borrado por Akismet" + +#: wp-admin/includes/internal-linking.php:77 +msgid "Enter the destination URL" +msgstr "Introduce la URL de destino" + +#: wp-admin/includes/file.php:65 +msgid "%s Page Template" +msgstr "%s Plantilla de Página" + +#: wp-admin/includes/internal-linking.php:89 +msgid "Or link to existing content" +msgstr "O enlaza a contenido ya existente" + +#: wp-admin/press-this.php:503 +msgid "Post Format:" +msgstr "Formato de entrada:" + +#: wp-admin/plugins.php:250 +msgid "This plugin may be active on other sites in the network." +msgid_plural "These plugins may be active on other sites in the network." +msgstr[0] "Este plugin puede estar activado para otros sitios de la red." +msgstr[1] "Estos plugins pueden estar activos para otros sitios de la red." + +#: wp-admin/plugins.php:345 +msgid "You cannot delete a plugin while it is active on the main site." +msgstr "No puedes borrar un plugin si está activado para el sitio principal." + +#: wp-admin/options-writing.php:65 +msgid "Default Post Format" +msgstr "Formato de entrada por defecto" + +#: wp-admin/update-core.php:18 wp-admin/update-core.php:448 +#: wp-admin/update-core.php:477 +msgid "You do not have sufficient permissions to update this site." +msgstr "No tienes los permisos adecuados para actualizar este sitio." + +#: wp-admin/users.php:365 wp-admin/user-edit.php:178 +msgctxt "user" +msgid "Add Existing" +msgstr "Añadir usuario existente" + +#: wp-admin/user-new.php:191 +msgctxt "user" +msgid "Add New User" +msgstr "Añadir nuevo usuario " + +#: wp-admin/user-new.php:343 +msgid "Add New User " +msgstr "Añadir nuevo usuario" + +#: wp-admin/user-new.php:258 +msgid "Add Existing User " +msgstr "Añadir usuario existente" + +#: wp-admin/plugin-editor.php:120 wp-admin/theme-editor.php:30 +msgid "Any edits to files from this screen will be reflected on all sites in the network." +msgstr "Cualquier modificación de los archivos se verá reflejada en todos los sitios de la red." + +#: wp-admin/user-new.php:193 +msgctxt "user" +msgid "Add Existing User" +msgstr "Añadir usuario existente" + +#: wp-includes/query.php:146 wp-includes/query.php:167 +#: wp-includes/query.php:187 wp-includes/query.php:211 +#: wp-includes/query.php:235 wp-includes/query.php:259 +#: wp-includes/query.php:288 wp-includes/query.php:308 +#: wp-includes/query.php:328 wp-includes/query.php:348 +#: wp-includes/query.php:369 wp-includes/query.php:389 +#: wp-includes/query.php:419 wp-includes/query.php:448 +#: wp-includes/query.php:468 wp-includes/query.php:495 +#: wp-includes/query.php:515 wp-includes/query.php:535 +#: wp-includes/query.php:555 wp-includes/query.php:575 +#: wp-includes/query.php:604 wp-includes/query.php:631 +#: wp-includes/query.php:651 wp-includes/query.php:671 +#: wp-includes/query.php:691 wp-includes/query.php:711 +msgid "Conditional query tags do not work before the query is run. Before then, they always return false." +msgstr "Las etiquetas de las consultas condicionales no funcionan antes de ejecutar la consulta. Haciéndolo antes, siempre devuelven falso." + +#: wp-admin/nav-menus.php:454 +msgid "To create a new custom menu, click on the + tab, give the menu a name, and click Create Menu. Next, add menu items from the appropriate boxes. You’ll be able to edit the information for each menu item, and can drag and drop to put them in order. You can also drag a menu item a little to the right to make it a submenu, to create menus with hierarchy. Drop the item into its new nested placement when the dotted rectangle target shifts over, also a little to the right. Don’t forget to click Save when you’re finished." +msgstr "Si quieres crear un nuevo menú personalizado, pulsa la pestaña +, ponle un nombre y haz clic en Crear menú. A continuación, añade al menú los elementos en las cajas correspondientes. Podrás editar la información de cada elemento del menú, y arrastrar y soltar para ponerlas en el orden que quieras. También puedes arrastrar el menú un poco a la derecha para hacerlo submenú, es decir, para crear menús jerárquicos. Suelta en la parte derecha el elemento en éste nuevo lugar anidado cuando aparezca el rectángulo con línea de puntos. No te olvides hacer clic en Guardar cuando hayas terminado." + +#: wp-admin/tools.php:15 +msgid "Press This is a bookmarklet that makes it easy to blog about something you come across on the web. You can use it to just grab a link, or to post an excerpt. Press This will even allow you to choose from images included on the page and use them in your post. Just drag the Press This link on this screen to your bookmarks bar in your browser, and you’ll be on your way to easier content creation. Clicking on it while on another website opens a popup window with all these options." +msgstr "" +"Publicar esto es un marcador de enlaces que hace fácil bloguear sobre algo con lo que te hayas topado en la web. Puedes usarlo para guardar un enlace, para publicar un resumen del mismo. Publicar esto te permite elegir de entre las imágenes de esa página cuál se utilizará para tu entrada. \n" +"Sólo tienes que arrastrar el enlace de Publicar esto de esta pantalla a la barra de enlaces favoritos de tu navegador y tendrás la forma más fácil de crear contenido. Haciendo clic en él mientras estés visitando cualquier sitio web se abre una ventana emergente con las opciones mencionadas. " + +#: wp-admin/plugin-editor.php:123 +msgid "Documentation on Writing Plugins" +msgstr "Documentación sobre cómo escribir plugins" + +#: wp-admin/index.php:38 +msgid "The boxes on your Dashboard screen are:" +msgstr "Las cajas en tu Escritorio son:" + +#: wp-admin/users.php:24 +msgid "This screen lists all the existing users for your site. Each user has one of five defined roles as set by the site admin: Site Administrator, Editor, Author, Contributor, or Subscriber. Users with roles other than Administrator will see fewer options in the dashboard navigation when they are logged in, based on their role." +msgstr "Esta pantalla muestra todos los usuarios existentes para tu sitio. Cada usuario dispone de uno de los cinco perfiles definidos según lo establecido por el administrador del sitio: Administrador del sitio, editor, autor, colaborador o suscriptor. Los usuarios con perfiles que no sean de administrador verán menos opciones en el panel de navegación cuando se hayan identificado, en base a su perfil." + +#: wp-admin/options-permalink.php:27 +msgid "Documentation on Using Permalinks" +msgstr "Documentación sobre el uso de enlaces permanentes" + +#: wp-admin/plugin-editor.php:119 +msgid "If you want to make changes but don’t want them to be overwritten when the plugin is updated, you may be ready to think about writing your own plugin. For information on how to edit plugins, write your own from scratch, or just better understand their anatomy, check out the links below." +msgstr "Si quieres hacer cambios pero no quieres que se sobreescriban cuando se actualice el plugin, deberías pensar en escribir tu propio plugin. Para obtener información acerca de cómo editar plugins, escribir desde cero el tuyo, o simplemente entender mejor su anatomía, echa un vistazo a los enlaces de aquí abajo." + +#: wp-admin/users.php:29 +msgid "Descriptions of Roles and Capabilities" +msgstr "Descripción de los perfiles y capacidades" + +#: wp-admin/export.php:42 +msgid "You can export a file of your site’s content in order to import it into another installation or platform. The export file will be an XML file format called WXR. Posts, pages, comments, custom fields, categories, and tags can be included. You can choose for the WXR file to include only certain posts or pages by setting the dropdown filters to limit the export by category, author, date range by month, or publishing status." +msgstr "Puedes exportar el contenido de tu sitio’s a un archivo para ser importado en otra instalación o plataforma. El archivo de importación es un archivo XML llamado WXR. Entradas, páginas, comentarios, campos personalizados, categorías y etiquetas se incluirán en él. Puedes elegir sólo algunas entradas o páginas, basta con limitar la exportación a determinadas categorías, autor, rango de fechas por meses o estatus de publicación en los filtros de descarte." + +#: wp-admin/edit-tags.php:184 +msgid "You can delete link categories in the Bulk Action pulldown, but that action does not delete the links within the category. Instead, it moves them to the default link category." +msgstr "Puedes borrar categorías de enlaces con la opción del desplegable Acciones en lote, pero eso no borrará los enlaces de la categoría. En su lugar, lo que hace en enviarlas a la categoría de enlaces por defecto." + +#: wp-admin/includes/upgrade.php:266 +msgid "sample-page" +msgstr "pagina-ejemplo" + +#: wp-admin/includes/upgrade.php:264 +msgid "Sample Page" +msgstr "Página de ejemplo" + +#: wp-includes/functions.php:3501 +msgid "%1$s was called incorrectly. %2$s %3$s" +msgstr "%1$s se llamó incorrectamente. %2$s %3$s" + +#: wp-includes/functions.php:3500 +msgid "(This message was added in version %s.)" +msgstr "(Este mensaje se añadió en la versión %s.)" + +#: wp-admin/options-discussion.php:216 +msgid "Retro (Generated)" +msgstr "Retro (generado)" + +#: wp-admin/includes/class-wp-themes-list-table.php:71 +msgid "You only have one theme enabled for this site right now. Visit the Network Admin to enable or install more themes." +msgstr "Sólo tienes un tema activado para este sitio. Ve a la administración de la red para activar or instalar más temas." + +#: wp-admin/includes/class-wp-themes-list-table.php:75 +msgid "You only have one theme enabled for this site right now. Visit the Network Admin to enable more themes." +msgstr "Sólo tienes un tema activado para este sitio. Ve a la administración de la red para activar más temas." + +#: wp-admin/includes/upgrade.php:246 +msgid "" +"This is an example page. It's different from a blog post because it will stay in one place and will show up in your site navigation (in most themes). Most people start with an About page that introduces them to potential site visitors. It might say something like this:\n" +"\n" +"
    Hi there! I'm a bike messenger by day, aspiring actor by night, and this is my blog. I live in Los Angeles, have a great dog named Jack, and I like piña coladas. (And gettin' caught in the rain.)
    \n" +"\n" +"...or something like this:\n" +"\n" +"
    The XYZ Doohickey Company was founded in 1971, and has been providing quality doohickies to the public ever since. Located in Gotham City, XYZ employs over 2,000 people and does all kinds of awesome things for the Gotham community.
    \n" +"\n" +"As a new WordPress user, you should go to your dashboard to delete this page and create new pages for your content. Have fun!" +msgstr "" +"Esta es una página de ejemplo, Es diferente a una entrada de un blog porque se mantiene estática y, en la mayoría de temas, se mostrará en la barra de navegación. Casi todo el mundo comienza con una página Sobre mí para presentarse a los potenciales visitantes. Puede decir algo así:\n" +"\n" +"
    ¡Hola!: Soy físico durante el día, lector de manga por las noches y este es mi blog. Vivo en Albacete y tengo un gato llamado Alex. Me encantan los mojitos (y mirar a la gente corriendo en los parques)
    \n" +"\n" +"O algo así:\n" +"\n" +"
    La empresa Calcetines XYC se fundó en 1973, y ha estado produciendo calcetines de calidad para sus clientes desde entonces. Se encuentra en Vetusta, tiene unos 2.000 empleados e intenta ayudar en lo que puede para mejorar la vida en Vestusta
    \n" +"\n" +"Deberías ir a tu escritorio, borrar esta página y crear algunas nuevas con tu contenido. ¡A divertirse!" + +#: wp-includes/user.php:111 +msgid "ERROR: The password you entered for the username %1$s is incorrect. Lost your password?" +msgstr "ERROR: La contraseña que introdujo para el usuario %1$s no es correcta. Has perdido tu contraseña?" + +#: wp-includes/class-wp-xmlrpc-server.php:3380 +msgid "Sorry, you cannot publish this post." +msgstr "Perdona, pero no puedes publicar esta entrada." + +#: wp-content/plugins/akismet/admin.php:27 +msgid "Comment History" +msgstr "Historial de comentarios" + +#: wp-content/plugins/akismet/admin.php:221 +msgid "Click here to confirm that Akismet.com is up." +msgstr "Haz click aquí para confirmar que Akismet.com está funcionando." + +#: wp-content/plugins/akismet/admin.php:14 +msgid "Akismet %s requires WordPress 3.0 or higher." +msgstr "Akismet %s necesita WordPress 3.0 o superior para funcionar." + +#: wp-content/plugins/akismet/admin.php:354 +msgid "%s approved" +msgid_plural "%s approved" +msgstr[0] "%s aprobado" +msgstr[1] "%s aprobados" + +#: wp-content/plugins/akismet/admin.php:521 +msgid "%s reported this comment as not spam" +msgstr "%s no considera este comentario como spam" + +#: wp-content/plugins/akismet/akismet.php:266 +msgid "Akismet caught this comment as spam" +msgstr "Akismet considera que este comentario es spam" + +#: wp-content/plugins/akismet/admin.php:570 +msgid "%s reported this comment as spam" +msgstr "%s considera que este comentario es spam" + +#: wp-content/plugins/akismet/akismet.php:459 +msgid "Akismet caught this comment as spam during an automatic retry." +msgstr "Akismet ha realizado una revisión auntomática y considera que este comentario es spam" + +#: wp-content/plugins/akismet/admin.php:211 +msgid "Re-trying" +msgstr "Intentándolo de nuevo" + +#: wp-content/plugins/akismet/admin.php:157 +msgid "Auto-delete spam submitted on posts more than a month old." +msgstr "Autoborrado de spam realizado para entradas con más de un mes de antiguedad." + +#: wp-content/plugins/akismet/admin.php:130 +msgid "Your WordPress home URL %s is invalid. Please fix the home option." +msgstr "La URL de la página de inicio de tu WordPress %s no es válida. Por favor, arregla la opción de página de inicio." + +#: wp-content/plugins/akismet/admin.php:158 +msgid "Show the number of comments you've approved beside each comment author." +msgstr "Mostrar el número de comentarios que has aprobado junto al autor de cada comentario." + +#: wp-content/plugins/akismet/admin.php:615 +msgid "%s changed the comment status to %s" +msgstr "%s cambió el estado del comentario a %s" + +#: wp-content/plugins/akismet/akismet.php:268 +#: wp-content/plugins/akismet/akismet.php:276 +msgid "Comment status was changed to %s" +msgstr "El estado del comentario se cambió a %s" + +#: wp-content/plugins/akismet/akismet.php:461 +msgid "Akismet cleared this comment during an automatic retry." +msgstr "Akismet borró este comentario durante una revisión automática." + +#: wp-content/plugins/akismet/akismet.php:271 +msgid "Akismet cleared this comment" +msgstr "Akismet borró este comentario" + +#: wp-content/plugins/akismet/akismet.php:274 +msgid "Comment was caught by wp_blacklist_check" +msgstr "Comentario pillado por wp_blacklist_check" + +#: wp-content/plugins/akismet/admin.php:302 +msgid "A server or network problem prevented Akismet from checking %d comment. It has been temporarily held for moderation and will be automatically re-checked in %s." +msgid_plural "A server or network problem prevented Akismet from checking %d comments. They have been temporarily held for moderation and will be automatically re-checked in %s." +msgstr[0] "Un problema del servidor o de la red impidió a Akismet revisar el comentario %d. Ha sido temporalmente puesto en moderación y se volverá a revisar en %s." +msgstr[1] "Un problema del servidor o de la red impidió a Akismet revisar los comentarios %d. Han sido temporalmente puestos en moderación y se volverán a revisar en %s." + +#: wp-content/plugins/akismet/admin.php:211 +msgid "Accessible" +msgstr "Accesible" + +#: wp-content/plugins/akismet/akismet.php:281 +msgid "Akismet was unable to check this comment (response: %s), will automatically retry again later." +msgstr "Akismet fue incapaz de revisar este comentario (respuesta: %s), se volverá a intentar más tarde." + +#: wp-admin/user-edit.php:268 +msgid "Super admin privileges cannot be removed because this user has the network admin email." +msgstr "Los privilegios del Super admin no se pueden eliminar porque este usuario tiene el correo electrónico de administrador de la red." + +#: wp-includes/pluggable.php:1102 +msgid "Permalink: %s" +msgstr "Enlace permanente: %s" + +#: wp-admin/includes/class-wp-themes-list-table.php:82 +msgid "You only have one theme installed right now. Live a little! You can choose from over 1,000 free themes in the WordPress.org Theme Directory at any time: just click on the Install Themes tab above." +msgstr "Tienes sólo un tema instalado. ¡Disfruta de la vida! Puedes elegir entre más de 1.000 temas gratuitos en el directorio de temas de WordPress.org cuando quieras: sólo tienes que hacer clic en la pestaña Instalar tema de arriba." + +#: wp-admin/maint/repair.php:81 +msgid "One or more database tables are unavailable. To allow WordPress to attempt to repair these tables, press the “Repair Database” button. Repairing can take a while, so please be patient." +msgstr "Una o más tablas no están disponibles. Para permitir a WordPress que intente repararlas, pulse el botón “Reparar bases de datos”. La reparación puede llevar un rato, ten paciencia, por favor." + +#: wp-admin/includes/file.php:14 +msgid "Visual Editor RTL Stylesheet" +msgstr "Editor visual de estilos RTL" + +#: wp-admin/theme-editor.php:175 +msgid "This child theme inherits templates from a parent theme, %s." +msgstr "Este tema hijo hereda plantillas de un tema padre, %s." + +#: wp-admin/theme-editor.php:242 +msgid "This is a file in your current parent theme." +msgstr "Este es un archivo del tema padre actual." + +#: wp-admin/includes/media.php:1587 +msgid "If you want to use all capabilities of the uploader, like uploading multiple files at once, please update to lighttpd 1.5." +msgstr "Si quieres usar todas las funciones del cargador, como subir varios archivos al mismo tiempo, por favor, actualiza a Lighttpd 1.5" + +#: wp-admin/includes/theme.php:247 +msgid "Updating this theme will lose any customizations you have made. 'Cancel' to stop, 'OK' to update." +msgstr "Al actualizar este tema se perderán todas las personalizaciones que hayas hecho. 'Cancelar' para parar, 'OK' para actualizar." + +#: wp-app.php:715 wp-app.php:752 wp-app.php:804 +msgid "Error occurred while accessing post metadata for file location." +msgstr "Ha ocurrido un error mientras se accedía a los metadatos de la entrada para la localización del archivo." + +#: wp-admin/includes/class-wp-upgrader.php:1086 +msgid "An error occurred while updating %1$s: %2$s." +msgstr "Ha ocurrido un error cuando se actualizaba %1$s: %2$s." + +#: wp-admin/admin-ajax.php:524 wp-admin/admin-ajax.php:1388 +msgid "An error has occurred. Please reload the page and try again." +msgstr "Ha ocurrido un error. Por favor, recarga la página e inténtalo de nuevo." + +#: wp-admin/upgrade.php:93 +msgid "Your WordPress database has been successfully updated!" +msgstr "¡La base de datos de WordPress se ha actualizado con éxito!" + +#: wp-admin/upgrade.php:82 +msgid "Update WordPress Database" +msgstr "Actualizar la base de datos de WordPress" + +#: wp-admin/update-core.php:85 +msgid "You are about to install WordPress %s in English (US). There is a chance this update will break your translation. You may prefer to wait for the localized version to be released." +msgstr "Se va a instalar WordPress %s en inglés (US). Existe la posibilidad de que esta actualización rompa tu traducción. Puede que prefieras esperar a que salga la versión local." + +#: wp-admin/upgrade.php:81 +msgid "The update process may take a little while, so please be patient." +msgstr "La actualización puede tardar un poco, así que sé paciente, por favor." + +#: wp-admin/upgrade.php:49 +msgid "WordPress › Update" +msgstr "Actualización de WordPress" + +#: wp-admin/upgrade.php:92 +msgid "Update Complete" +msgstr "Actualización completada" + +#: wp-admin/update-core.php:411 +msgid "To update themes or plugins from this screen, use the checkboxes to make your selection and click on the appropriate Update button. Check the box at the top of the Themes or Plugins section to select all and update them all at once." +msgstr "Para actualizar temas o plugins en esta pantalla usa las casillas de verificación para hacer tu selección y haz clic en el botón de actualizar correspondiente. Marca la casilla superior en la sección de temas o plugins para seleccionarlas todas y actualizarlas de una vez." + +#: wp-admin/upgrade.php:79 +msgid "Database Update Required" +msgstr "Es necesaria una actualización de la base de datos" + +#: wp-admin/upgrade.php:80 +msgid "WordPress has been updated! Before we send you on your way, we have to update your database to the newest version." +msgstr "¡WordPress se ha actualizado! Antes de continuar, tenemos que actualizar tu base de datos a la última versión." + +#: wp-admin/upgrade.php:60 +msgid "No Update Required" +msgstr "No es necesaria la actualización" + +#: wp-includes/functions.php:2672 +msgid "Your attempt to update this plugin: “%s” has failed." +msgstr "Su intento de actualizar este plugin: \"%s\" ha fallado." + +#: wp-admin/includes/class-wp-upgrader.php:377 +msgid "Plugin updated successfully." +msgstr "El plugin se ha actualizado con éxito." + +#: wp-admin/includes/class-wp-upgrader.php:1383 wp-admin/update.php:154 +msgid "Update Theme" +msgstr "Actualizar tema" + +#: wp-admin/includes/update.php:207 wp-admin/includes/update.php:282 +msgid "There is a new version of %1$s available. View version %4$s details or update automatically." +msgstr "Hay una versión nueva de %1$s disponible. Ver los detalles de la versión %4$s o actualizar automáticamente." + +#: wp-admin/includes/theme.php:253 +msgid "There is a new version of %1$s available. View version %3$s details. Automatic update is unavailable for this theme." +msgstr "Hay una nueva versión de %1$s disponible. Ver detalles de la versión %3$s. La actualización automática no está disponible para este tema." + +#: wp-admin/includes/class-wp-plugins-list-table.php:233 +msgid "Update Available (%s)" +msgid_plural "Update Available (%s)" +msgstr[0] "(%s) actualización disponible" +msgstr[1] "(%s) actualizaciones disponibles" + +#: wp-admin/includes/class-wp-upgrader.php:376 +msgid "Plugin update failed." +msgstr "Actualización de plugin fallida." + +#: wp-admin/includes/class-wp-upgrader.php:615 +msgid "Theme update failed." +msgstr "Actualización del tema fallida." + +#: wp-admin/includes/class-wp-upgrader.php:616 +msgid "Theme updated successfully." +msgstr "Tema actualizado correctamente." + +#: wp-admin/includes/theme.php:255 +msgid "There is a new version of %1$s available. View version %3$s details or update automatically." +msgstr "Hay una nueva versión de %1$s disponible. Ver detalles de la versión %3$s o actualizar automáticamente." + +#: wp-admin/includes/class-wp-upgrader.php:1026 wp-admin/update.php:54 +msgid "Update Plugin" +msgstr "Actualizar plugin" + +#: wp-admin/includes/update.php:205 wp-admin/includes/update.php:280 +msgid "There is a new version of %1$s available. View version %4$s details. Automatic update is unavailable for this plugin." +msgstr "Hay una nueva versión de %1$s disponible. Ver detalles de la versión %4$s. La actualización automática no está disponible para este plugin." + +#: wp-admin/includes/class-wp-upgrader.php:370 +#: wp-admin/includes/class-wp-upgrader.php:610 +#: wp-admin/includes/class-wp-upgrader.php:863 +msgid "Update package not available." +msgstr "Paquete de actualización no disponible." + +#: wp-includes/post.php:5128 +msgctxt "Post format" +msgid "Standard" +msgstr "Estándar" + +#: wp-admin/options-writing.php:68 wp-admin/includes/meta-boxes.php:256 +#: wp-admin/press-this.php:505 +msgid "Standard" +msgstr "Estándar" + +#: wp-includes/post.php:934 +msgid "Post types cannot exceed 20 characters in length" +msgstr "Los tipos de entradas no pueden exceder de 20 caracteres de longitud" + +#: wp-admin/export.php:145 wp-admin/export.php:177 +msgid "Date range:" +msgstr "Rango de fechas:" + +#: wp-admin/export.php:129 +msgid "This will contain all of your posts, pages, comments, custom fields, terms, navigation menus and custom posts." +msgstr "Esto contendrá todas tus entradas, páginas, comentarios, campos personalizados, menús de navegación y entradas personalizadas." + +#: wp-admin/export.php:125 +msgid "Choose what to export" +msgstr "Elige qué exportar" + +#: wp-admin/export.php:123 +msgid "Once you’ve saved the download file, you can use the Import function in another WordPress installation to import this site." +msgstr "Una vez que hayas guardado el archivo de descarga, puedes utilizar la función importar en otra instalación de WordPress para importar este sitio." + +#: wp-admin/export.php:138 wp-admin/export.php:170 +msgid "Authors:" +msgstr "Autores:" + +#: wp-admin/export.php:128 +msgid "All content" +msgstr "Todo el contenido" + +#: wp-includes/script-loader.php:335 +msgid "Add new Tag" +msgstr "Añadir nueva etiqueta" + +#: wp-includes/admin-bar.php:266 +msgctxt "admin bar menu group label" +msgid "Add New" +msgstr "Añadir nueva" + +#: wp-admin/includes/file.php:309 wp-admin/includes/file.php:429 +msgid "Sorry, this file type is not permitted for security reasons." +msgstr "Perdona, por razones de seguridad, este tipo de archivos no está permitido." + +#: wp-admin/options-media.php:84 wp-admin/options-media.php:85 +msgid "When possible, embed the media content from a URL directly onto the page. For example: links to Flickr and YouTube." +msgstr "Siempre que sea posible, incrusta el contenido multimedia pegando la URL directamente en la página. Por ejemplo: pegando los enlaces de Flickr y YouTube. " + +#: wp-includes/post.php:5137 +msgctxt "Post format" +msgid "Audio" +msgstr "Audio" + +#: wp-admin/user-new.php:22 +msgid "" +"Hi,\n" +"You've been invited to join '%1$s' at\n" +"%2$s as a %3$s.\n" +"If you do not want to join this site please ignore\n" +"this email. This invitation will expire in a few days.\n" +"\n" +"Please click the following link to activate your user account:\n" +"%%s" +msgstr "" +"Hola,\n" +"Has sido invitado a unirte a '%1$s' en\n" +"%2$s como %3$s.\n" +"Si no quieres unirte a este sitio, por favor ignora este correo electrónico\n" +"Esta invitación caducará en unos días.\n" +"\n" +"Por favor, haga click en el siguiente enlace para activar su cuenta de usuario:\n" +"%%s" + +#: wp-includes/class-wp-xmlrpc-server.php:2234 +#: wp-includes/class-wp-xmlrpc-server.php:2539 +msgid "Invalid post format" +msgstr "Formato de entrada no válido" + +#: wp-admin/admin-header.php:24 +msgid "%1$s — WordPress" +msgstr "%1$s — WordPress" + +#: wp-admin/admin-header.php:118 +msgid "%s Global Dashboard" +msgstr "%s Escritorio global" + +#: wp-admin/admin-header.php:116 +msgid "%s Network Admin" +msgstr "%s Administrador de la red" + +#: wp-admin/user-edit.php:212 +msgid "More information" +msgstr "Más información" + +#: wp-includes/pluggable.php:1077 wp-includes/pluggable.php:1190 +msgid "Whois : http://whois.arin.net/rest/ip/%s" +msgstr "Whois : http://whois.arin.net/rest/ip/%s" + +#: wp-admin/includes/internal-linking.php:85 +msgid "Open link in a new window/tab" +msgstr "Abrir enlace en una nueva ventana/pestaña" + +#: wp-admin/includes/internal-linking.php:105 +msgid "No search term specified. Showing recent items." +msgstr "" +"No se ha indicado ningún término de búsqueda. Se mostrarán\n" +" los objetos más recientes." + +#: wp-admin/includes/class-wp-comments-list-table.php:258 +msgctxt "column name" +msgid "In Response To" +msgstr "En respuesta a" + +#: wp-admin/includes/class-wp-comments-list-table.php:354 +msgid "Submitted on %2$s at %3$s" +msgstr "Enviado el %2$s a las %3$s" + +#: wp-includes/plugin.php:676 +msgid "Only a static class method or function can be used in an uninstall hook." +msgstr "Sólo una función o método de la clase estática pueden ser usados en un gancho de desinstalación." + +#: wp-admin/edit-comments.php:122 +msgid "Documentation on Comment Spam" +msgstr "Documentación sobre los comentarios de spam" + +#: wp-admin/edit-comments.php:123 +msgid "Documentation on Keyboard Shortcuts" +msgstr "Documentación sobre atajos de teclado" + +#: wp-admin/widgets.php:38 +msgid "The Available Widgets section contains all the widgets you can choose from. Once you drag a widget into a sidebar, it will open to allow you to configure its settings. When you are happy with the widget settings, click the Save button and the widget will go live on your site. If you click Delete, it will remove the widget." +msgstr "La sección de widgets disponibles contiene todos los widgets que puedes elegir. Cuando arrastres el widget al lateral, se abrirá para que puedas configurar sus opciones. Cuando las tengas a tu gusto, haz clic en botón de guardar y el widget se pondrá a funcionar en tu sitio. Si pulsas borrar, se quitará el widget." + +#: wp-admin/media.php:74 +msgid "Remember to click Update Media to save metadata entered or changed." +msgstr "Recuerda hacer clic en Actualizar archivos multimedia para guardar los metadatos que hayas introducido o cambiado." + +#: wp-admin/media.php:73 +msgid "Note that you crop the image by clicking on it (the Crop icon is already selected) and dragging the cropping frame to select the desired part. Then click Save to retain the cropping." +msgstr "Se recorta la imagen haciendo clic en la misma (el icono de recorte ya estará seleccionado) y arrastrando el marcho de recorte hasta donde se desee. Para fijarla, haz clic en guardar." + +#: wp-admin/media.php:72 +msgid "For images only, you can click on Edit Image under the thumbnail to expand out an inline image editor with icons for cropping, rotating, or flipping the image as well as for undoing and redoing. The boxes on the right give you more options for scaling the image, for cropping it, and for cropping the thumbnail in a different way than you crop the original image. You can click on Help in those boxes to get more information." +msgstr "(Sólo para imágenes) Puedes hacer clic en editar imágenes, debajo de la miniatura, para obtener el menú de edición de imágenes y recortar, rotar o invertir la imagen, así como deshacer y rehacer. Las cajas de la derecha te dan más opciones para escalar y recortar la imagen; y para recortar la miniatura de forma diferente de la imagen original. Puedes hacer clic en la ayuda en esas cajas para obtener más información." + +#: wp-admin/media.php:71 +msgid "This screen allows you to edit five fields for metadata in a file within the media library." +msgstr "Esta pantalla te permite editar cinco campos para metadatos de un archivo en la biblioteca multimedia." + +#: wp-admin/user-new.php:175 +msgid "The requested user does not exist." +msgstr "El usuario solicitado no existe" + +#: wp-admin/user-new.php:228 +msgid "Enter the email address of an existing user on this network to invite them to this site. That person will be sent an email asking them to confirm the invite." +msgstr "Escribe el correo electrónico de un usuario de esta red para invitarlo a este sitio. A esa persona se le enviará uno correo electrónico para que confirme la invitación." + +#: wp-admin/user-new.php:232 +msgid "E-mail or Username" +msgstr "Correo electrónico o nombre usuario" + +#: wp-admin/user-new.php:226 +msgid "Add Existing User" +msgstr "Añadir usuario ya existente" + +#: wp-admin/user-new.php:178 +msgid "Please enter a valid email address." +msgstr "Por favor, escribe un correo electrónico válido." + +#: wp-admin/user-new.php:267 +msgid "Create a brand new user and add it to this site." +msgstr "Crear un nuevo usuario y añadirlo a este sitio." + +#: wp-admin/user-new.php:231 +msgid "Enter the email address or username of an existing user on this network to invite them to this site. That person will be sent an email asking them to confirm the invite." +msgstr "Escribe el correo electrónico o el nombre de usuario de un miembro de esta red para invitarlo a este sitio. A esa persona se le enviará uno correo electrónico para que confirme la invitación." + +#: wp-includes/post.php:2312 +msgid "Passing an integer number of posts is deprecated. Pass an array of arguments instead." +msgstr "Pasar un número entero de entradas es obsoleto. Pasa una matriz de argumentos en su lugar." + +#: wp-admin/admin-header.php:26 +msgid "%1$s ‹ %2$s — WordPress" +msgstr "%1$s ‹ %2$s — WordPress" + +#: wp-includes/post.php:5129 +msgctxt "Post format" +msgid "Aside" +msgstr "Minientrada" + +#: wp-includes/post.php:5130 +msgctxt "Post format" +msgid "Chat" +msgstr "Chat" + +#: wp-includes/post.php:5131 +msgctxt "Post format" +msgid "Gallery" +msgstr "Galería" + +#: wp-includes/post.php:5132 +msgctxt "Post format" +msgid "Link" +msgstr "Enlace" + +#: wp-includes/post.php:5133 +msgctxt "Post format" +msgid "Image" +msgstr "Imagen" + +#: wp-includes/post.php:5134 +msgctxt "Post format" +msgid "Quote" +msgstr "Cita" + +#: wp-includes/post.php:5135 +msgctxt "Post format" +msgid "Status" +msgstr "Estado" + +#: wp-includes/post.php:5136 +msgctxt "Post format" +msgid "Video" +msgstr "Vídeo" + +#: wp-admin/user-new.php:254 wp-admin/user-new.php:338 +msgid "Add the user without sending them a confirmation email." +msgstr "Añadir el usuario sin enviarle un email de confirmación." + +#: wp-includes/post.php:1186 +msgid "No pages found in Trash." +msgstr "Ninguna página encontrada en la papelera." + +#: wp-includes/post.php:1185 +msgid "No pages found." +msgstr "No se encontraron páginas." + +#: wp-includes/post.php:1186 +msgid "No posts found in Trash." +msgstr "Ningún post encontrado en la papelera." + +#: wp-includes/admin-bar.php:165 +msgid "Shortlink" +msgstr "Enlace corto" + +#: wp-admin/maint/repair.php:83 +msgid "WordPress can automatically look for some common database problems and repair them. Repairing can take a while, so please be patient." +msgstr "WordPress puede revisar automáticamente algunos problemas habituales de bases de datos. Repararlos puede llevar un rato, ten paciencia, por favor." + +#: wp-includes/class-wp-xmlrpc-server.php:1581 +msgid "Invalid attachment ID." +msgstr "ID de adjunto no válido." + +#: wp-includes/class-wp-xmlrpc-server.php:1640 +msgid "Sorry, you cannot upload files." +msgstr "Perdona, pero no puedes subir archivos." + +#: wp-includes/registration-functions.php:7 wp-includes/registration.php:7 +msgid "This file no longer needs to be included." +msgstr "Ya no es necesario incluir este archivo." + +#: wp-admin/update-core.php:276 +msgid "Please Note: Any customizations you have made to theme files will be lost. Please consider using child themes for modifications." +msgstr "Atención: Se perderá cualquier personalización que hayas hecho a los archivos del tema. Por favor, considere el uso de temas hijos para mantener cambios." + +#: wp-admin/includes/class-wp-posts-list-table.php:178 +msgctxt "posts" +msgid "Sticky (%s)" +msgid_plural "Sticky (%s)" +msgstr[0] "(%s) fija" +msgstr[1] "(%s) fijas" + +#: wp-login.php:402 +msgid "Please enter your username or email address. You will receive a link to create a new password via email." +msgstr "Por favor, escribe tu nombre de usuario o tu correo electrónico. Recibirás un enlace para crear la contraseña nueva por correo electrónico." + +#: wp-admin/update-core.php:139 +msgid "Please select one or more plugins to update." +msgstr "Por favor, elige uno o más plugins a actualizar." + +#: wp-admin/update-core.php:137 +msgid "Please select one or more themes to update." +msgstr "Por favor, elige uno o más temas para actualizarlos." + +#: wp-admin/update-core.php:145 +msgid "Last checked on %1$s at %2$s." +msgstr "Última revisión el %1$s a las %2$s." + +#: wp-admin/update-core.php:146 +msgid "Check Again" +msgstr "Comprobar de nuevo" + +#: wp-includes/default-widgets.php:264 wp-includes/default-widgets.php:493 +msgid "Display as dropdown" +msgstr "Mostrar como desplegable" + +#: wp-includes/class-wp-xmlrpc-server.php:371 +msgid "Large size image height" +msgstr "Altura de la imagen de tamaño grande" + +#: wp-includes/class-wp-xmlrpc-server.php:356 +msgid "Medium size image width" +msgstr "Achura de la imagen de tamaño medio" + +#: wp-includes/class-wp-xmlrpc-server.php:361 +msgid "Medium size image height" +msgstr "Altura de la imagen de tamaño medio" + +#: wp-includes/class-wp-xmlrpc-server.php:366 +msgid "Large size image width" +msgstr "Tamaño grande de la imagen" + +#: wp-includes/class-wp-xmlrpc-server.php:351 +msgid "Crop thumbnail to exact dimensions" +msgstr "Recortar la miniatura a sus dimensiones exactas" + +#: wp-includes/class-wp-xmlrpc-server.php:346 +msgid "Thumbnail Height" +msgstr "Altura de la miniatura" + +#: wp-includes/class-wp-xmlrpc-server.php:341 +msgid "Thumbnail Width" +msgstr "Anchura de la miniatura" + +#: wp-admin/includes/class-wp-upgrader.php:1085 +msgid "The update process is starting. This process may take a while on some hosts, so please be patient." +msgstr "El proceso de actualización ha empezado. Puede llevar un rato en algunos servidores, ten paciencia, por favor." + +#: wp-includes/script-loader.php:282 +msgid "No matches found." +msgstr "No se han encontrado coincidencias." + +#: wp-login.php:459 +msgid "New password" +msgstr "Nueva contraseña" + +#: wp-login.php:463 +msgid "Confirm new password" +msgstr "Confirma la nueva contraseña" + +#: wp-login.php:218 +msgid "To reset your password, visit the following address:" +msgstr "Para restaurar la contraseña, visita la siguiente dirección:" + +#: wp-login.php:452 wp-login.php:471 +msgid "Reset Password" +msgstr "Restaurar contraseña" + +#: wp-login.php:441 +msgid "The passwords do not match." +msgstr "Las contraseñas no coinciden." + +#: wp-login.php:444 +msgid "Password Reset" +msgstr "Contraseña restaurada" + +#: wp-login.php:444 +msgid "Your password has been reset." +msgstr "Tu contraseña ha sido restaurada." + +#: wp-login.php:214 +msgid "Someone requested that the password be reset for the following account:" +msgstr "Alguien ha solicitado que sea restaurada la contraseña de la siguiente cuenta:" + +#: wp-login.php:217 +msgid "If this was a mistake, just ignore this email and nothing will happen." +msgstr "Si ha sido un error, ignora este correo y no pasará nada." + +#: wp-login.php:452 +msgid "Enter your new password below." +msgstr "Introduce tu nueva contraseña abajo." + +#: wp-includes/post.php:538 +msgid "Invalid post" +msgstr "Entrada no válida" + +#: wp-admin/admin-header.php:19 +msgid "Global Dashboard" +msgstr "Escritorio global" + +#: wp-includes/admin-bar.php:91 +msgid "Edit My Profile" +msgstr "Editar mi perfil" + +#: wp-includes/admin-bar.php:142 +msgid "Manage Comments" +msgstr "Gestionar comentarios" + +#: wp-admin/options-general.php:246 +msgid "Documentation on date and time formatting." +msgstr "Documentación sobre formatos de fecha y hora." + +#: wp-admin/includes/user.php:376 +msgid "You’re using the auto-generated password for your account. Would you like to change it to something easier to remember?" +msgstr "Estás utilizando la contraseña generada automáticamente para tu cuenta. ¿Quieres cambiarla por otra más fácil de recordar?" + +#: wp-admin/themes.php:157 +msgid "Theme filters" +msgstr "Filtros de temas" + +#: wp-admin/themes.php:183 +msgid "Apply Filters" +msgstr "Aplicar filtros" + +#: wp-admin/themes.php:185 +msgid "Close filters" +msgstr "Cerrar filtros" + +#: wp-admin/includes/theme.php:316 +msgid "RTL Language Support" +msgstr "Soporte del lenguaje RTL" + +#: wp-includes/admin-bar.php:133 wp-admin/includes/theme.php:303 +msgid "Blavatar" +msgstr "Blavatar" + +#: wp-admin/includes/theme.php:285 +msgid "Light " +msgstr "Brillante" + +#: wp-admin/includes/theme.php:304 +msgid "BuddyPress" +msgstr "BuddyPress" + +#: wp-admin/includes/theme.php:309 +msgid "Editor Style" +msgstr "Estilo del editor" + +#: wp-admin/includes/theme.php:312 +msgid "Front Page Posting" +msgstr "Escritura en la página principal" + +#: wp-admin/includes/theme.php:320 +msgid "Translation Ready" +msgstr "Traducción lista" + +#: wp-content/plugins/akismet/admin.php:342 +#: wp-content/plugins/akismet/admin.php:349 +msgid "View comment history" +msgstr "Ver histórico de comentarios" + +#: wp-content/plugins/akismet/admin.php:381 +msgid "Akismet" +msgstr "Akismet" + +#: wp-content/plugins/akismet/admin.php:688 +msgid "Akismet was unable to re-check this comment (response: %s)" +msgstr "Akismet ha sido incapaz de revisar de nuevo el comentario (respuesta: %s)" + +#: wp-content/plugins/akismet/admin.php:331 +msgid "Flagged as spam by %s" +msgstr "Marcado como spam por %s" + +#: wp-content/plugins/akismet/admin.php:680 +msgid "Akismet re-checked and caught this comment as spam" +msgstr "Akismet ha revisado de nuevo el comentario y lo considera spam" + +#: wp-content/plugins/akismet/admin.php:14 +msgid "Please upgrade WordPress to a current version, or downgrade to version 2.4 of the Akismet plugin." +msgstr "Por favor, actualiza WordPress a la versión actual, o vuelve a la version 2.4 el plugin de Akismet" + +#: wp-content/plugins/akismet/admin.php:333 +msgid "Un-spammed by %s" +msgstr "Desmarcado como spam por %s" + +#: wp-content/plugins/akismet/admin.php:684 +msgid "Akismet re-checked and cleared this comment" +msgstr "Akismet revisó de nuevo este comentario y lo ha marcado como bueno" + +#: wp-admin/themes.php:92 +msgid "Options:" +msgstr "Opciones:" + +#: wp-admin/comment.php:64 +msgid "You are not allowed to edit this comment." +msgstr "No tienes permiso para editar este comentario." + +#: wp-admin/includes/file.php:985 +msgid "To perform the requested action, WordPress needs to access your web server." +msgstr "Para realizar la operación que has solicitado WordPress necesita tener acceso a tu servidor web." + +#: wp-includes/query.php:1945 +msgid "\"caller_get_posts\" is deprecated. Use \"ignore_sticky_posts\" instead." +msgstr "\"caller_get_posts\" está obsoleto. Utilice \"ignore_sticky_posts\" en su lugar." + +#: wp-includes/taxonomy.php:70 +msgid "New Link Category Name" +msgstr "Nuevo nombre de categoría de enlaces" + +#: wp-includes/taxonomy.php:69 +msgid "Add New Link Category" +msgstr "Añadir nueva categoría de enlaces" + +#: wp-includes/taxonomy.php:68 +msgid "Update Link Category" +msgstr "Actualizar categoría de enlaces" + +#: wp-includes/taxonomy.php:66 +msgid "All Link Categories" +msgstr "Todas las categorías de enlaces" + +#: wp-includes/taxonomy.php:64 +msgid "Search Link Categories" +msgstr "Buscar categorías de enlaces" + +#: wp-includes/taxonomy.php:63 +msgid "Link Category" +msgstr "Categoría de enlaces" + +#: wp-admin/includes/class-wp-list-table.php:519 +msgid "Current page" +msgstr "Página actual" + +#: wp-admin/includes/class-wp-list-table.php:510 +msgid "Go to the previous page" +msgstr "Ir a la página anterior" + +#: wp-admin/includes/class-wp-themes-list-table.php:65 +#: wp-admin/includes/class-wp-list-table.php:187 +msgid "No items found." +msgstr "No se ha encontrado nada." + +#: wp-admin/includes/class-wp-list-table.php:530 +msgid "Go to the next page" +msgstr "Ir a la página siguiente" + +#: wp-admin/includes/class-wp-list-table.php:537 +msgid "Go to the last page" +msgstr "Ir a la última página" + +#: wp-admin/admin-ajax.php:231 wp-admin/includes/class-wp-list-table.php:485 +#: wp-admin/includes/class-wp-list-table.php:884 +msgid "1 item" +msgid_plural "%s items" +msgstr[0] "1 elemento" +msgstr[1] "%s elementos" + +#: wp-admin/includes/class-wp-users-list-table.php:79 +msgid "No matching users were found." +msgstr "No se han encontrado usuarios que se ajusten a lo que buscas." + +#: wp-admin/includes/class-wp-theme-install-list-table.php:109 +msgid "No themes match your request." +msgstr "Ningún tema se ajusta a lo que buscas." + +#: wp-admin/includes/class-wp-list-table.php:503 +msgid "Go to the first page" +msgstr "Ir a la primera página" + +#: wp-admin/includes/dashboard.php:471 +msgid "Search Sites" +msgstr "Buscar sitios" + +#: wp-admin/includes/dashboard.php:437 +msgid "Create a New User" +msgstr "Crear un nuevo usuario" + +#: wp-admin/includes/dashboard.php:445 +msgid "You have %1$s and %2$s." +msgstr "Tienes %1$s y %2$s." + +#: wp-admin/includes/dashboard.php:443 +msgid "%s site" +msgid_plural "%s sites" +msgstr[0] "%s sitio" +msgstr[1] "%s sitios" + +#: wp-admin/includes/dashboard.php:442 +msgid "%s user" +msgid_plural "%s users" +msgstr[0] "%s usuario" +msgstr[1] "%s usuarios" + +#: wp-admin/admin-header.php:17 wp-admin/admin-header.php:160 +msgid "Network Admin" +msgstr "Administrador de la red" + +#: wp-admin/update-core.php:155 +msgid "Important: before updating, please back up your database and files. For help with updates, visit the Updating WordPress Codex page." +msgstr "Importante: antes de la actualización, por favor, realiza un respaldo de la base de datos y ficheros. Si necesitas ayuda para la actualización, visita la página del Codex: Actualización de WordPress." + +#: wp-admin/includes/dashboard.php:89 +msgid "http://wordpress.org/news/" +msgstr "http://wordpress.org/news/" + +#: wp-admin/includes/dashboard.php:90 +msgid "http://wordpress.org/news/feed/" +msgstr "http://wordpress.org/news/feed/" + +#: wp-includes/wp-db.php:742 +msgid "" +"

    Can’t select database

    \n" +"

    We were able to connect to the database server (which means your username and password is okay) but not able to select the %1$s database.

    \n" +"
      \n" +"
    • Are you sure it exists?
    • \n" +"
    • Does the user %2$s have permission to use the %1$s database?
    • \n" +"
    • On some systems the name of your database is prefixed with your username, so it would be like username_%1$s. Could that be the problem?
    • \n" +"
    \n" +"

    If you don't know how to set up a database you should contact your host. If all else fails you may find help at the WordPress Support Forums.

    " +msgstr "" +"

    No se pudo elegir base de datos

    \n" +"

    Hemos podido conectar con el servidor de la bases de datos (lo que significa que tu nombre de usuario y la contraseña están correctos) pero no se pudo elegir la base de datos %1$s.

    \n" +"
      \n" +"
    • ¿Estás seguro que existe?
    • \n" +"
    • ¿El usuario %2$s tiene permiso para utilizar la base de datos %1$?
    • \n" +"
    • En algunos sistemas el nombre de la base de datos es el prefijo con el nombre de usuario, que sería como username_%1$s. ¿Podría ser ésto el problema?
    • \n" +"
    \n" +"

    Si no sabes cómo configurar una base de datos debes ponerte en contacto con el administrador de su hosting. Si todo lo demás falla puedes encontrar ayuda en los Foros de Soporte de WordPress.

    " + +#: wp-admin/options-discussion.php:63 +msgid "(Signup has been disabled. Only members of this site can comment.)" +msgstr "(El registro ha sido deshabilitado. Sólo los miembros de este sitio pueden comentar.)" + +#: wp-admin/update-core.php:52 +msgid "You can update to WordPress %2$s automatically or download the package and install it manually:" +msgstr "Puedes actualizar a WordPress %2$s automáticamente o descargar el paquete e instalarlo manualmente:" + +#: wp-admin/user-new.php:146 +msgid "New users will receive an email letting them know they’ve been added as a user for your site. By default, this email will also contain their password. Uncheck the box if you don’t want the password to be included in the welcome email." +msgstr "Los usuarios nuevos recibirán un correo electrónico haciéndoles saber que han sido añadidos como usuarios de tu sitio. De forma predeterminada, este correo electrónico también contendrá su contraseña. Desmarca la casilla si no quieres que la contraseña se incluya en el correo electrónico de bienvenida." + +#: wp-admin/includes/media.php:2211 +msgid "Link text, e.g. “Lucy on YouTube”" +msgstr "Texto del enlace, p.e. “Lucy en YouTube”" + +#: wp-admin/includes/theme.php:251 +msgid "There is a new version of %1$s available. View version %3$s details." +msgstr "Hay una nueva versión de %1$s disponible. Ver detalles de la versión %3$s." + +#: wp-admin/includes/update.php:203 wp-admin/includes/update.php:278 +msgid "There is a new version of %1$s available. View version %4$s details." +msgstr "Hay una nueva versión de %1$s disponible. Ver detalles de la versión %4$s. " + +#: wp-admin/includes/class-wp-upgrader.php:1233 +msgid "Go to themes page" +msgstr "Ir a la página de temas" + +#: wp-admin/edit.php:221 +msgid "Item moved to the Trash." +msgid_plural "%s items moved to the Trash." +msgstr[0] "Movido a la papelera" +msgstr[1] "%s movidos a la papelera." + +#: wp-admin/includes/class-wp-upgrader.php:1046 +#: wp-admin/includes/class-wp-upgrader.php:1201 +msgid "Go to plugins page" +msgstr "Ir a la página de plugins" + +#: wp-admin/includes/class-wp-upgrader.php:1202 +#: wp-admin/includes/class-wp-upgrader.php:1234 +msgid "Go to WordPress Updates page" +msgstr "Ir a la página de actualizaciones de WordPress" + +#: wp-admin/import.php:139 +msgid "If the importer you need is not listed, search the plugins directory to see if an importer is available." +msgstr "Si el importador que necesitas no está en la lista, busca en el directorio de plugins para ver si está disponible." + +#: wp-content/plugins/akismet/widget.php:43 +msgid "Spam Blocked" +msgstr "Spam bloqueado" + +#: wp-admin/includes/nav-menu.php:77 +msgid "%s (Pending)" +msgstr "%s (Pendiente)" + +#: wp-admin/includes/nav-menu.php:1115 +msgid "Click Save Menu to make pending menu items public." +msgstr "Haz click en Guardar menú para hacer públicos los elementos de menú pendientes." + +#: wp-content/plugins/akismet/admin.php:290 +msgid "You must enter your Akismet API key for it to work." +msgstr "Debes introducir tu clave de API de Akismet para que funcione." + +#: wp-content/plugins/akismet/admin.php:144 +msgid "For many people, Akismet will greatly reduce or even completely eliminate the comment and trackback spam you get on your site. If one does happen to get through, simply mark it as \"spam\" on the moderation screen and Akismet will learn from the mistakes. If you don't have an API key yet, you can get one at Akismet.com." +msgstr "En la mayoría de los casos, Akismet reduce enormemente (o incluso elimina) el spam en los comentarios y trackbacks de tu sitio. Si se cuela alguno simplemente debes marcar como spam en la pantalla de moderación y Akismet aprenderá de sus errores. SI todavía no tienes una clave de API puedes obtener una en Akismet.com." + +#: wp-content/plugins/akismet/admin.php:146 +msgid "Akismet API Key" +msgstr "Clave de API de Akismet" + +#: wp-content/plugins/akismet/admin.php:150 +msgid "What is this?" +msgstr "¿Qué es esto?" + +#: wp-includes/load.php:112 +msgid "Your server is running PHP version %1$s but WordPress %2$s requires at least %3$s." +msgstr "Tu servidor está ejecutando la versión %1$s de PHP, pero WordPess %2$s necesita, al menos, la versión %3$s." + +#: wp-admin/includes/dashboard.php:435 +msgid "Create a New Site" +msgstr "Crear nuevo sitio" + +#: wp-admin/plugins.php:319 +msgctxt "plugins per page (screen options)" +msgid "Plugins" +msgstr "Plugins" + +#: wp-admin/upload.php:140 +msgctxt "items per page (screen options)" +msgid "Media items" +msgstr "Elementos multimedia" + +#: wp-admin/edit-comments.php:112 +msgctxt "comments per page (screen options)" +msgid "Comments" +msgstr "Comentarios" + +#: wp-admin/users.php:20 +msgctxt "users per page (screen options)" +msgid "Users" +msgstr "Usuarios" + +#: wp-admin/custom-header.php:505 +msgid "Images of exactly %1$d × %2$d pixels will be used as-is." +msgstr "Las imágenes de exactamente %1$d x %2$d pixels se utilizarán tal cual." + +#: wp-admin/theme-install.php:46 +msgid "Documentation on Adding New Themes" +msgstr "Documentación sobre Añadir nuevos temas" + +#: wp-admin/custom-header.php:701 +msgid "Crop and Publish" +msgstr "Recortar y publicar" + +#: wp-admin/custom-header.php:104 +msgid "Some themes come with additional header images bundled. If you see multiple images displayed, select the one you’d like and click the Save Changes button." +msgstr "Algunos temas llevan incluidas imágenes de cabecera adicionales. Si ves que se muestran varias imágenes elige la que te guste y haz clic en el botón Guardar cambios." + +#: wp-includes/pluggable.php:1171 +msgid "A new trackback on the post \"%s\" is waiting for your approval" +msgstr "Un nuevo trackback a la entrada \"%s\" está esperando tu aprobación" + +#: wp-admin/theme-editor.php:28 +msgid "Upgrading to a newer version of the same theme will override changes made here. To avoid this, consider creating a child theme instead." +msgstr "Si actualizas a una versión más reciente del mismo tema sobreescribirá los cambios realizados aquí. Para evitar esto plantéate crear un tema hijo (child theme) en su lugar." + +#: wp-admin/plugins.php:323 +msgid "You can find additional plugins for your site by using the Plugin Browser/Installer functionality or by browsing the WordPress Plugin Directory directly and installing new plugins manually. To manually install a plugin you generally just need to upload the plugin file into your /wp-content/plugins directory. Once a plugin has been installed, you can activate it here." +msgstr "Puedes encontrar plugins adicionales para tu sitio usando la funcionalidad Instalador/navegador de plugins o navegando por el directorio de plugins de WordPress directamente e instalando manualmente nuevos plugins. Para instalar manualmente un plugin normalmente necesitarás subir el fichero del plugin a tu directorio /wp-content/plugins. Una vez se haya instalado el plugin puedes activarlo aquí." + +#: wp-admin/edit-link-form.php:45 +msgid "XFN stands for XHTML Friends Network, which is optional. WordPress allows the generation of XFN attributes to show how you are related to the authors/owners of the site to which you are linking." +msgstr "XFN se refiere a red de amigos XHTML (XHTML Friends Network), y es opcional. WordPress permite generar atributos XFN que muestran tu relación con los autores/propietarios del sitio al que estés enlazando." + +#: wp-admin/plugins.php:327 +msgid "Documentation on Managing Plugins" +msgstr "Documentación sobre cómo gestionar plugins" + +#: wp-admin/theme-editor.php:35 +msgid "Documentation on Template Tags" +msgstr "Documentación sobre etiquetas de plantilla" + +#: wp-admin/theme-editor.php:34 +msgid "Documentation on Editing Files" +msgstr "Documentación sobre cómo editar archivos" + +#: wp-admin/themes.php:46 wp-admin/theme-editor.php:33 +msgid "Documentation on Using Themes" +msgstr "Documentación sobre el uso de temas" + +#: wp-admin/theme-editor.php:32 +msgid "Documentation on Theme Development" +msgstr "Documentación sobre el desarrollo de temas" + +#: wp-admin/includes/file.php:995 +msgid "FTP Password" +msgstr "Contraseña FTP" + +#: wp-admin/includes/file.php:994 +msgid "FTP Username" +msgstr "Usuario FTP" + +#: wp-admin/includes/file.php:991 +msgid "FTP/SSH Password" +msgstr "Contraseña FTP/SSH" + +#: wp-admin/includes/file.php:990 +msgid "FTP/SSH Username" +msgstr "Usuario FTP/SSH" + +#: wp-admin/index.php:45 +msgid "Other WordPress News - Shows the feed from WordPress Planet. You can configure it to show a different feed of your choosing." +msgstr "Otras noticias sobre WordPress - Muestra el feed de WordPress Planet. Puedes configurarlo para que muestre un feed diferente, a tu elección." + +#: wp-admin/options-reading.php:46 +msgid "You can choose what’s displayed on the front page of your site. It can be posts in reverse chronological order (classic blog), or a fixed/static page. To set a static home page, you first need to create two Pages. One will become the front page, and the other will be where your posts are displayed." +msgstr "Puedes elegir lo que se muestra en la página principal de tu sitio. Pueden ser entradas en orden cronológico inverso (blog clásico) o una página fija/estática. Para definir una página de inicio estática primero tienes que crear dos páginas. Una será la página principal y la otra donde se mostrarán tus entradas." + +#: wp-admin/options-permalink.php:23 +msgid "The Optional fields let you customize the “category” and “tag” base names that will appear in archive URLs. For example, the page listing all posts in the “Uncategorized” category could be /topics/uncategorized instead of /category/uncategorized." +msgstr "Los campos opcionales te permiten personalizar los nombres base de “categoría” y “etiqueta” que aparecerán en las URLs del archivo. Por ejemplo, la página con el listado de todas las entradas de la categoría “Sin categoría” podrían ser como /temas/sin-categoria en vez de /category/sin-categoria." + +#: wp-admin/themes.php:208 +msgid "The following themes are installed but incomplete. Themes must have a stylesheet and a template." +msgstr "Los siguientes temas están instalados pero incompletos. Los temas deben tener una hoja de estilos y una plantilla." + +#: wp-admin/index.php:46 +msgid "Plugins - Features the most popular, newest, and recently updated plugins from the WordPress.org Plugin Directory." +msgstr "Plugins - Muestra los plugins más populares, más nuevos y los recientemente actualizados del directorio de plugins de WordPress.org." + +#: wp-admin/options-permalink.php:21 +msgid "When you assign multiple categories or tags to a post, only one can show up in the permalink: the lowest numbered category. This applies if your custom structure includes %category% or %tag%." +msgstr "Cuando asignas varias categorías o etiquetas a una entrada sólo se puede mostrar una en el enlace permanente: la categoría con el número más bajo. Esto es así si tu estructura personalizada contiene %category% o %tag%." + +#: wp-admin/options-permalink.php:20 +msgid "If you pick an option other than Default, your general URL path with structure tags, terms surrounded by %, will also appear in the custom structure field and your path can be further modified there." +msgstr "Si eliges una opción distinta de la que está por defecto tu ruta general de URL con etiquetas de estructura, los términos rodeados por %, también aparecerán en el campo de estructura personalizada y podrás cambiar aquí tu ruta en otro momento." + +#: wp-admin/widgets.php:42 +msgid "Many themes show some sidebar widgets by default until you edit your sidebars, but they are not automatically displayed in your sidebar management tool. After you make your first widget change, you can re-add the default widgets by adding them from the Available Widgets area." +msgstr "Muchos temas muestran varios widgets de barra lateral por defecto hasta que editas tus barras laterales, pero no se muestran automáticamente en tu herramienta de gestión de barras laterales. Una vez hagas tu primer cambio en un widget puedes volver a añadirlo desde el área de widgets disponibles." + +#: wp-admin/includes/class-wp-themes-list-table.php:188 +msgid "The template files are located in %2$s. The stylesheet files are located in %3$s. %4$s uses templates from %5$s. Changes made to the templates will affect both themes." +msgstr "Los archivos de la plantilla están situados en %2$s. Los archivos de la hoja de estilos están situados en %3$s. %4$s utiliza plantillas de %5$s. Los cambios que se hagan a las plantillas afectarán a ambos temas." + +#: wp-admin/widgets.php:39 +msgid "If you want to remove the widget but save its setting for possible future use, just drag it into the Inactive Widgets area. You can add them back anytime from there. This is especially helpful when you switch to a theme with fewer or different widget areas." +msgstr "Si quieres quitar el widget, pero también guardar los ajustes por si los necesitaras en el futuro, simplemente arrástralo al área de widgets inactivos. Puedes añadirlos de nuevo en cualquier otro momento desde ahí. Esto es especialmente útil cuando cambias a un tema con pocas o distintas áreas de widgets." + +#: wp-admin/users.php:26 +msgid "To add a new user for your site, click the Add New button at the top of the screen or Add New in the Users menu section." +msgstr "Para añadir un usuario nuevo a tu sitio haz clic en el botón Añadir nuevo en la parte superior de la pantalla o en la sección Añadir nuevo del menú Usuarios." + +#: wp-admin/options-media.php:19 +msgid "You can set maximum sizes for images inserted into your written content; you can also insert an image as Full Size." +msgstr "Puedes establecer los tamaños máximos para las imágenes insertadas en tu contenido; también puedes insertar una imagen a tamaño completo." + +#: wp-admin/plugin-install.php:41 +msgid "If you know what you’re looking for, Search is your best bet. The Search screen has options to search the WordPress.org Plugin Directory for a particular Term, Author, or Tag. You can also search the directory by selecting a popular tags. Tags in larger type mean more plugins have been labeled with that tag." +msgstr "Si ya sabes lo que estás buscando la Búsqueda es tu mejor apuesta. La pantalla Buscar tiene opciones para buscar en el directorio de de plugins de WordPress.org un término concreto, por autor o por etiquetas. También puedes buscar en el directorio eligiendo entre las etiquetas populares. Las etiquetas de mayor tamaño significan que hay más plugins etiquetados con esa etiqueta." + +#: wp-admin/media-upload.php:67 +msgid "There are two options for uploading files: Select Files will open the Flash-based uploader (multiple file upload allowed), or you can use the Browser Uploader. Clicking Select Files opens a navigation window showing you files in your operating system. Selecting Open after clicking on the file you want activates a progress bar on the uploader screen. Basic image editing is available after upload is complete. Make sure you click Save before leaving this screen." +msgstr "Hay dos opciones para subir archivos: Elegir archivos abrirá el cargador basado en Flash (permite subir varios archivos), o puedes usar el Cargador del navegador. Haciendo clic en Elegir archivos, se abre una ventana de navegación que muestra los archivos de tu sistema operativo. Eligiendo Abrir, después de hacer clic en el archivo que quieres, activa una barra de progreso en la pantalla del cargador. Hay disponible una edición básica de imágenes después de que la subida esté completa. Asegúrate de hacer clic en Guardar antes de salir de esta pantalla." + +#: wp-admin/options-media.php:20 +msgid "The Embed option allows you embed a video, image, or other media content into your content automatically by typing the URL (of the web page where the file lives) on its own line when you create your content." +msgstr "La opción de Incrustar te permite incrustar un vídeo, imagen u otro contenido multimedia automáticamente en tu contenido tecleando la URL (de la página web donde está el archivo) en su propia línea cuando creas tu contenido." + +#: wp-admin/options-general.php:63 +msgid "Most themes display the site title at the top of every page, in the title bar of the browser, and as the identifying name for syndicated feeds. The tagline is also displayed by many themes." +msgstr "La mayoría de los temas muestran el título del sitio en la parte superior de cada página, en la barra de título del navegador, y como nombre identificativo para los feeds. La descripción corta también se muestra en muchos temas." + +#: wp-admin/edit-form-advanced.php:185 +msgid "Order - Pages are usually ordered alphabetically, but you can choose your own order by entering a number (1 for first, etc.) in this field." +msgstr "Orden - Normalmente las páginas se ordenan alfabéticamente, pero puedes elegir tu propio orden introduciendo un número (1 para la primera, etc) en este campo." + +#: wp-admin/includes/file.php:989 +msgid "Please enter your FTP or SSH credentials to proceed." +msgstr "Por favor, introduce tus datos de acceso FTP o SSH para proceder." + +#: wp-admin/includes/file.php:993 +msgid "Please enter your FTP credentials to proceed." +msgstr "Por favor, introduce tus datos de acceso FTP para proceder." + +#: wp-admin/includes/file.php:999 +msgid "If you do not remember your credentials, you should contact your web host." +msgstr "Si no recuerdas tus datos de acceso deberías contactar con tu proveedor de alojamiento." + +#: wp-admin/upload.php:143 +msgid "All the files you’ve uploaded are listed in the Media Library, with the most recent uploads listed first. You can use the Screen Options tab to customize the display of this screen." +msgstr "Todos los archivos que has subido están listados en la Librería multimedia, con las subidas más recientes listadas al principio. Puedes usar la pestaña Opciones de pantalla para personalizar cómo se muestra esta pantalla. " + +#: wp-admin/theme-install.php:44 +msgid "You can Upload a theme manually if you have already downloaded its ZIP archive onto your computer (make sure it is from a trusted and original source). You can also do it the old-fashioned way and copy a downloaded theme’s folder via FTP into your /wp-content/themes directory." +msgstr "Pudes subir manualmente un tema si ya has descargado su archivo ZIP en tu ordenador (asegúrate de que sea de una fuente fiable y original). También puedes hacerlo al viejo estilo y copiar un tema descargado a través de FTP en tu directorio /wp-content/themes." + +#: wp-admin/user-edit.php:41 +msgid "Your profile contains information about you (your “account”) as well as some personal options related to using WordPress." +msgstr "Tu perfil contiene infomación sobre ti (tu “cuenta”) así como algunas opciones personales relacionadas con el uso de WordPress." + +#: wp-admin/edit-form-advanced.php:181 wp-admin/edit.php:174 +msgid "Pages are similar to Posts in that they have a title, body text, and associated metadata, but they are different in that they are not part of the chronological blog stream, kind of like permanent posts. Pages are not categorized or tagged, but can have a hierarchy. You can nest Pages under other Pages by making one the “Parent” of the other, creating a group of Pages." +msgstr "Las páginas son similares a las entradas y tienen título, cuerpo de texto y metadatos asociados, pero son diferentes en que no forman parte de la secuencia cronológica tipo blog, son una especie de entradas permanentes. Las páginas no tienen categorías ni etiquetas, pero pueden tener una jerarquía. Puedes anidar páginas bajo otras páginas haciendo a una “Superior” de otra, creando así un grupo de páginas." + +#: wp-admin/edit-comments.php:118 +msgid "In the In Response To column, there are three elements. The text is the name of the post that inspired the comment, and links to the post editor for that entry. The “#” permalink symbol below leads to that post on your live site. The small bubble with the number in it shows how many comments that post has received. If the bubble is gray, you have moderated all comments for that post. If it is blue, there are pending comments. Clicking the bubble will filter the comments screen to show only comments on that post." +msgstr "En la columna En respuesta a hay tres elementos. El texto es el nombre de la entrada que inspiró el comentario, y está enlazado al editor de entradas de esa entrada. El enlace permanente del símbolo “#” lleva a esa entrada en tu sitio. La pequeña burbuja con número muestra cuántos comentarios ha recibido esa entrada. Si la burbuja es gris es que ya has moderado todos los comentarios de esa entrada. Si es azul es que hay comentarios pendientes. Haciendo clic en la burbuja se filtra la pantalla de comentarios para que muestre sólo los comentarios de esa entrada." + +#: wp-admin/edit-form-advanced.php:173 +msgid "Send Trackbacks - Trackbacks are a way to notify legacy blog systems that you’ve linked to them. Enter the URL(s) you want to send trackbacks. If you link to other WordPress sites they’ll be notified automatically using pingbacks, and this field is unnecessary." +msgstr "Enviar trackbacks - Los trackbacks son un modo de avisar a los sistemas antiguos de blogs que les has enlazado. Introduce la(s) URL(s) a la(s) que quieres enviar trackbacks. Si enlazas a otro sitio creado con WordPress recibirán aviso automáticamente por medio de los pingbacks, y este campo no sería necesario." + +#: wp-admin/options-permalink.php:22 +msgid "Note that permalinks beginning with the category, tag, author or postname structure tags require more advanced server resources. Double-check your hosting details to make sure those are in place or start your permalinks with other structure tags." +msgstr "Date cuenta de que los enlaces permanentes con etiquetas estructurales que llaman a categoría, etiqueta, autor o nombre de la entrada requieren recursos de servidor más avanzados. Revisa de nuevo los detalles del alojamiento para asegurarte de que que están en su lugar o empieza tus enlaces permanentes con otras etiquetas estructurales." + +#: wp-admin/index.php:34 +msgid "Welcome to your WordPress Dashboard! You will find helpful tips in the Help tab of each screen to assist you as you get to know the application." +msgstr "Bienvenido a tu escritorio de WordPress. Encontrarás consejos en la pestaña Ayuda de cada pantalla que te ayudarán a conocer la aplicación." + +#: wp-admin/upload.php:145 +msgid "Hovering over a row reveals action links: Edit, Delete Permanently, and View. Clicking Edit or on the media file’s name displays a simple screen to edit that individual file’s metadata. Clicking Delete Permanently will delete the file from the media library (as well as from any posts to which it is currently attached). View will take you to the display page for that file." +msgstr "Pasando por encima de la fila revela los enlaces de acción: Editar, Eliminar permanentemente, y Ver. Haciendo clic sobre Editar o sobre el nombre del archivo multimedia mostrará una pantalla simple para poder editar metadatos. Haciendo click en Eliminar permanentemente eliminará el archivo de la librería multimedia (como de las entradas que la estén usando). Ver te llevará a la pantalla de visualizado para el archivo." + +#: wp-admin/user-new.php:142 +msgid "Contributors can write and manage their posts but not publish posts or upload media files." +msgstr "Los Colaboradores pueden escribir y gestionar sus entradas, pero no pueden publicar entradas o subir archivos multimedia." + +#: wp-admin/user-new.php:141 +msgid "Authors can publish and manage their own posts." +msgstr "Los Autores pueden publicar y gestionar sus entradas." + +#: wp-admin/user-new.php:139 +msgid "Administrators have access to all the administration features." +msgstr "Los Administradores tienen acceso a todas las funciones de administración." + +#: wp-admin/plugin-editor.php:118 +msgid "The Documentation menu below the editor lists the PHP functions recognized in the plugin file. Clicking Lookup takes you to a web page about that particular function." +msgstr "El menú Documentación bajo el editor enumera las funciones PHP reconocidas en los archivos del plugin. Haciendo clic en Buscar te lleva a una página que habla de esa función en particular." + +#: wp-admin/plugin-editor.php:116 +msgid "You can use the editor to make changes to any of your plugins’ individual PHP files. Be aware that if you make changes, plugins updates will overwrite your customizations." +msgstr "Puedes usar el editor para realizar cambios a cualquier archivo php de tus plugins. Cuidado si realizas cambios, la actualización de los plugins producirá que tus modificaciones sean sobrescritas y se pierdan." + +#: wp-admin/link-manager.php:44 +msgid "You can add links here to be displayed on your site, usually using Widgets. By default, links to several sites in the WordPress community are included as examples." +msgstr "Aquí puedes añadir enlaces a mostrar en tu sitio, generalmente usando Widgets. Por defecto, los enlaces son a varios sitios de la comunidad de WordPress. Son incluidos como ejemplo." + +#: wp-admin/link-manager.php:47 +msgid "If you delete a link, it will be removed permanently, as Links do not have a Trash function yet." +msgstr "Si eliminas un enlace, será eliminado de forma permanente. Aún no existe una Papelera para los enlaces." + +#: wp-admin/update-core.php:410 +msgid "Updating your WordPress installation is a simple one-click procedure; just click on the Update button when it says a new version is available." +msgstr "Actualizar tu instalación de Wordpress es un proceso tan simple como realizar un solo clic; simplemente haz clic en el botón Actualizar cuando te muestre el mensaje de que hay una nueva actualización." + +#: wp-admin/custom-background.php:86 +msgid "Don’t forget to click on the Save Changes button when you are finished." +msgstr "No olvides hacer clic en el botón Guardar cambios cuando acabes." + +#: wp-admin/custom-header.php:103 +msgid "If you want to discard your custom header and go back to the default included in your theme, click on the buttons to remove the custom image and restore the original header image." +msgstr "Si quieres descartar tu cabecera personalizada y volver a las por defecto de tu tema, haz clic en la parte inferior para eliminar la imagen personalizada y restaurar la imagen original." + +#: wp-admin/custom-background.php:84 +msgid "To use a background image, simply upload it, then choose your display options below. You can display a single instance of your image, or tile it to fill the screen. You can have your background fixed in place, so your site content moves on top of it, or you can have it scroll with your site." +msgstr "Para usar una imagen de fondo, simplemente súbela y después selecciona las opciones de visualización. Puedes mostrar la imagen una sola vez o ponerla en mosaico para que rellene la pantalla. Puedes fijar tu fondo, tu sitio pasará por encima de ella o puedes hacer que se mueva con tu sitio (cuando subas o bajes la barra del navegador)." + +#: wp-admin/custom-background.php:83 +msgid "You can customize the look of your site without touching any of your theme’s code by using a custom background. Your background can be an image or a color." +msgstr "Puedes personalizar la imagen de tu sitio sin tocar nada del código del tema usando un fondo personalizado. Tu fondo puede ser una imagen o un color." + +#: wp-admin/custom-background.php:85 +msgid "You can also choose a background color. If you know the hexadecimal code for the color you want, enter it in the Color field. If not, click on the Select a Color link, and a color picker will allow you to choose the exact shade you want." +msgstr "También puedes elegir un color de fondo. Si sabes el código hexadecimal que quieres introdúcelo en el campo Color. Si no lo sabes, haz click en el enlace de elegir un color y un selector de colores te permitirá escoger el color exacto que quieras." + +#: wp-admin/custom-header.php:102 +msgid "You can set a custom image header for your site. Simply upload the image and crop it, and the new header will go live immediately." +msgstr "Puedes poner una imagen de cabecera personalizada en tu sitio. Simplemente sube una imagen, recórtala/ajústala y la nueva cabecera aparecerá inmediatamente en tu sitio." + +#: wp-admin/edit-tags.php:200 +msgid "Slug - The “slug” is the URL-friendly version of the name. It is usually all lowercase and contains only letters, numbers, and hyphens." +msgstr "Slug - La “slug ” es la versión amigable de la URL. Normalmente, son todo minúsculas y contiene sólo letras, números y guiones." + +#: wp-admin/edit.php:175 +msgid "Managing Pages is very similar to managing Posts, and the screens can be customized in the same way." +msgstr "Gestionar páginas es muy similar a gestionar entradas y la pantalla se puede personalizar de la misma forma." + +#: wp-admin/edit-form-advanced.php:175 +msgid "You can also create posts with the Press This bookmarklet." +msgstr "También puedes crear entradas con el marcador Publicar esto." + +#: wp-admin/plugins.php:347 +msgid "The plugin generated %d characters of unexpected output during activation. If you notice “headers already sent” messages, problems with syndication feeds or other issues, try deactivating or removing this plugin." +msgstr "El plugin ha generado %d caracteres de salida inesperada durante la activación. Si te sale el mensaje de advertencia “headers already sent” (cabeceras ya enviadas), problemas con las feeds u otros problemas, prueba a desactivar o eliminar este plugin." + +#: wp-admin/users.php:25 +msgid "You can customize the display of information on this screen as you can on other screens, by using the Screen Options tab and the on-screen filters." +msgstr "Puedes personalizar la información de esta pantalla al igual que en las otras, usando la pestaña Opciones de Pantalla y los filtros en pantalla." + +#: wp-admin/user-new.php:147 +msgid "Remember to click the Add User button at the bottom of this screen when you are finished." +msgstr "Acuérdate de hacer clic en el botón Añadir usuario en la parte inferior de la pantalla cuando finalices." + +#: wp-admin/user-edit.php:42 +msgid "You can change your password, turn on keyboard shortcuts, change the color scheme of your WordPress administration screens, and turn off the WYSIWYG (Visual) editor, among other things." +msgstr "Puedes cambiar tu contraseña, activar los atajos de teclado, cambiar el esquema de colores de la pantalla de administración de WordPress y desactivar el editor (visual) WYSIWYG entre de otras cosas." + +#: wp-admin/user-edit.php:43 +msgid "Your username cannot be changed, but you can use other fields to enter your real name or a nickname, and change which name to display on your posts." +msgstr "Tu nombre de usuario no puede cambiarse, pero puedes usar los otros campos para introducir tu nombre real o tu alias y utilizarlo para que se muestre en tus entradas." + +#: wp-admin/user-edit.php:44 +msgid "Required fields are indicated; the rest are optional. Profile information will only be displayed if your theme is set up to do so." +msgstr "Los campos necesarios están marcados. El resto son opcionales. El perfil sólo será mostrado si tu tema está configurado para ello." + +#: wp-admin/user-edit.php:45 +msgid "Remember to click the Update Profile button when you are finished." +msgstr "Recuerda hacer click en el botón actualizar Perfil cuando acabes." + +#: wp-admin/user-new.php:140 +msgid "Editors can publish posts, manage posts as well as manage other people’s posts, etc." +msgstr "Los Editores pueden publicar entradas, gestionar sus entradas y entradas de otras personas, etc." + +#: wp-admin/user-new.php:143 +msgid "Subscribers can read comments/comment/receive newsletters, etc." +msgstr "Los Suscriptores pueden leer comentarios/comentar/recibir noticias, etc." + +#: wp-admin/user-new.php:137 +msgid "To add a new user to your site, fill in the form on this screen. If you’re not sure which role to assign, you can use the link below to review the different roles and their capabilities. Here is a basic overview of roles:" +msgstr "Para añadir un nuevo usuario a tu sitio, rellena el cuestionario siguiente. Si no estás seguro de qué perfil debes asignarle, puedes utilizar el enlace siguiente para ver las diferentes capacidades de los diferentes perfiles. Aquí tienes una breve explicación de los perfiles:" + +#: wp-admin/user-new.php:145 +msgid "You must assign a password to the new user, but don’t worry; when they log in for the first time they will be prompted to change it. The username, however, cannot be changed." +msgstr "Debes asignar una contraseña al nuevo usuario, pero no te preocupes, cuando se identifique por primera vez se le preguntará si quiere cambiarla. El nombre de usuario no se puede cambiar." + +#: wp-admin/custom-background.php:271 +msgid "Background Repeat" +msgstr "Repetir fondo" + +#: wp-admin/comment.php:49 +msgid "You can also moderate the comment from this screen using the Status box, where you can also change the timestamp of the comment." +msgstr "También puedes moderar los comentarios desde esta pantalla usando la caja de estado, donde puedes cambiar el día/hora del comentario." + +#: wp-admin/comment.php:48 +msgid "You can edit the information left in a comment if needed. This is often useful when you notice that a commenter has made a typographical error." +msgstr "Si te es necesario puedes editar la información que falta en un comentario. Esto es muy útil si te advierten que un usuario ha cometido un error tipográfico al realizar un comentario." + +#: wp-admin/custom-background.php:281 +msgid "Background Attachment" +msgstr "Adjunto del fondo" + +#: wp-admin/nav-menus.php:554 +msgid "Automatically add new top-level pages" +msgstr "Añadir automáticamente las páginas de nivel superior" + +#: wp-admin/nav-menus.php:540 +msgid "Enter menu name here" +msgstr "Introduce el nombre del menú aquí." + +#: wp-admin/options-privacy.php:19 +msgid "You can choose whether or not your site will be crawled by robots, ping services, and spiders. If you want those services to ignore your site, click the second option here. Note that your privacy is not complete; your site is still visible on the web." +msgstr "Puedes decidir si tu sitio debe o no ser rastreado por robots, servicios de ping y arañas. Si deseas que todos esos servicios ignoren tu sitio, haz clic en la segunda opción. Atención, tu privacidad no es completa, tu sitio seguirá siendo visible en la web." + +#: wp-admin/options-media.php:21 +msgid "Uploading Options gives you folder and path choices for storing your files in your installation’s directory." +msgstr "Las opciones de subida te dan a escoger en qué directorio y ruta almacenar tus archivos." + +#: wp-admin/options-reading.php:47 +msgid "You can also control the display of your content in RSS feeds, including the maximum numbers of posts to display, whether to show full text or a summary, and the character set encoding." +msgstr "También puedes controlar la forma de mostrar tus contenidos en el canal RSS, incluyendo el número máximo de entradas a mostrar, si mostrar el texto íntegro o una fracción de éste y la codificación de caracteres." + +#: wp-admin/options-permalink.php:19 +msgid "This screen provides some common options for your default permalinks URL structure." +msgstr "Esta pantalla facilita unas opciones comunes para la estructura por defecto de la URL estructural de los enlaces permanentes." + +#: wp-admin/options-general.php:67 +msgid "Remember to click the Save Changes button at the bottom of the screen for new settings to take effect." +msgstr "Recuerda hacer clic en la parte inferior de la pantalla sobre el botón Guardar cambios para que los nuevos ajustes surtan efecto." + +#: wp-admin/options-writing.php:19 +msgid "You can submit content in several different ways; this screen holds the settings for all of them. The top section controls the editor within these administration screens, while the rest control external publishing methods. For more information on any of these methods, use the documentation links below." +msgstr "Puedes enviar contenido de varias formas; en esta pantalla encontrarás los ajustes para todas ellas. La sección superior controla el editor que hay en esta pantalla de administración, mientras que el resto controla métodos externos de publicación. Para más información de cualquiera de estos métodos, usa la documentación que encontrarás en los siguientes enlaces." + +#: wp-admin/options-general.php:66 +msgid "UTC means Coordinated Universal Time." +msgstr "UTC quiere decir Hora universal coordinada (Coordinated Universal Time)" + +#: wp-admin/options-general.php:62 +msgid "The fields on this screen determine some of the basics of your site setup." +msgstr "Los campos en esta pantalla determinan algunas configuraciones básicas de tu sitio." + +#: wp-admin/options-reading.php:45 +msgid "This screen contains the settings that affect the display of your content." +msgstr "Esta pantalla contiene los ajustes que afectarán a cómo se muestran tus contenidos." + +#: wp-admin/options-general.php:65 +msgid "If you want site visitors to be able to register themselves, as opposed to being registered by the site administrator, check the membership box. A default user role can be set for all new users, whether self-registered or registered by the site administrator." +msgstr "Si deseas que los visitantes se puedan registrar en tu sitio, en vez de que el administrador del sitio deba registrarlos, marca la casilla de miembros. Se otorgará un perfil predeterminado a cada nuevo usuario. Da igual que se registren ellos mismos o que les registre el administrador del sitio." + +#: wp-admin/options-discussion.php:20 wp-admin/options-privacy.php:21 +#: wp-admin/options-media.php:22 wp-admin/options-writing.php:20 +#: wp-admin/options-reading.php:48 wp-admin/options-permalink.php:24 +msgid "You must click the Save Changes button at the bottom of the screen for new settings to take effect." +msgstr "Debes hacer clic en el botón Guardar cambios en la parte inferior de la pantalla para que los nuevos ajustes tengan efecto." + +#: wp-admin/options-discussion.php:19 +msgid "This screen provides many options for controlling the management and display of comments and links to your posts/pages. So many, in fact, they won’t all fit here! :) Use the documentation link below to get information on what each discussion setting does." +msgstr "Esta pantalla proporciona muchas opciones para mostrar y gestionar los comentarios y enlaces en tus entradas/páginas. Son muchas, pero no caben todas aquí :) Usa el enlace a la documentación para conseguir más información y saber qué hace cada ajuste." + +#: wp-admin/options-general.php:64 +msgid "The WordPress URL and the Site URL can be the same (example.com) or different; for example, having the WordPress core files (example.com/wordpress) in a subdirectory instead of the root directory." +msgstr "La URL de WordPress y la URL del sitio pueden ser las mismas (ejemplo.com) o diferentes; por ejemplo, puedes tener los archivos del core de WordPress en un subdirectorio (ejemplo.com/wordpress) en vez de en el directorio raíz." + +#: wp-admin/edit-link-form.php:44 +msgid "The boxes for link name, web address, and description have fixed positions, while the others may be repositioned using drag and drop. You can also hide boxes you don’t use in the Screen Options tab, or minimize boxes by clicking on the title bar of the box." +msgstr "Las cajas para el nombre del enlace, dirección web y descripción tienen una posición fija. Las otras las puedes mover y colocar mediante arrastrar y soltar. Puedes esconder cajas que no quieras usar en la pestaña Opciones de pantalla o minimizar las cajas haciendo clic en la barra del título de la caja." + +#: wp-admin/update-core.php:171 +msgid "While your site is being updated, it will be in maintenance mode. As soon as your updates are complete, your site will return to normal." +msgstr "Mientras se actualiza tu sitio, éste permanecerá en modo mantenimiento. Tan pronto como finalice la actualización, tu sitio volverá a estar activo." + +#: wp-admin/update-core.php:191 +msgid "Your plugins are all up to date." +msgstr "Tus plugins están todos actualizados." + +#: wp-admin/update-core.php:151 +msgid "You have the latest version of WordPress." +msgstr "Tienes la última versión de WordPress. No es necesario actualizarla." + +#: wp-admin/update-core.php:267 +msgid "Your themes are all up to date." +msgstr "Tus temas están actualizados." + +#: wp-admin/update-core.php:159 +msgid "An updated version of WordPress is available." +msgstr "Hay disponible una nueva versión actualizada de WordPress." + +#: wp-admin/includes/nav-menu.php:176 +msgid "Original: %s" +msgstr "Original: %s" + +#: wp-admin/plugin-editor.php:138 +msgid "Function Name…" +msgstr "Nombre de la función…" + +#: wp-admin/import.php:113 +msgid "Activate importer" +msgstr "Activar importador" + +#: wp-admin/edit-link-form.php:43 +msgid "You can add or edit links on this screen by entering information in each of the boxes. Only the link’s web address and name (the text you want to display on your site as the link) are required fields." +msgstr "Puede añadir o editar enlaces desde esta pantalla introduciendo la información en cada caja. Sólo son necesarios el enlace a la web y el nombre (el texto que quieres mostrar en el enlace en tu sitio)." + +#: wp-admin/includes/class-wp-upgrader.php:1290 +msgid "Return to Importers" +msgstr "Volver a los importadores" + +#: wp-admin/includes/class-wp-upgrader.php:1280 +msgid "Activate Plugin & Run Importer" +msgstr "Activar plugin y Comenzar Importación" + +#: wp-includes/theme-compat/comments.php:26 +msgid "One Response to %2$s" +msgid_plural "%1$s Responses to %2$s" +msgstr[0] "Una Respuesta a %2$s" +msgstr[1] "%1$s Respuestas a %2$s" + +#: wp-admin/tools.php:52 +msgid "Use this to convert categories to tags or tags to categories." +msgstr "Usa esto para convertir categorías en etiquetas o etiquetas en categorías." + +#: wp-admin/edit-tags.php:277 +msgid "Categories can be selectively converted to tags using the category to tag converter." +msgstr "Las categorías se pueden convertir a voluntad en etiquetas usando el conversor de categorías a etiquetas." + +#: wp-admin/edit-tags.php:282 +msgid "Tags can be selectively converted to categories using the tag to category converter" +msgstr "Las etiquetas se pueden convertir a voluntad a categorías usando el conversor de etiquetas a categorías" + +#: wp-admin/includes/nav-menu.php:733 +msgctxt "nav menu front page title" +msgid "Home: %s" +msgstr "Inicio: %s" + +#: wp-admin/import.php:56 +msgid "ERROR:" +msgstr "ERROR:" + +#: wp-admin/import.php:56 +msgid "The %s importer is invalid or is not installed." +msgstr "El importador %s no es válido o no está instalado." + +#: wp-admin/edit-form-advanced.php:123 +msgid "Page Attributes" +msgstr "Atributos de página" + +#: wp-admin/includes/meta-boxes.php:580 +msgid "Need help? Use the Help tab in the upper right of your screen." +msgstr "¿Necesitas ayuda? Usa la pestaña Ayuda en la parte superior derecha de la pantalla." + +#: wp-admin/tools.php:17 +msgid "Note: Turbo/Gears is no longer promoted on this screen as it was in previous versions due to the fact that Google has discontinued support for it." +msgstr "Nota: Turbo/Gears ya no está disponible en esta pantalla como en versiones anteriores ya que Google ha dejado de darle soporte." + +#: wp-admin/import.php:20 +msgid "This screen lists links to plugins to import data from blogging/content management platforms. Choose the platform you want to import from, and click Install Now when you are prompted in the popup window. If your platform is not listed, click the link to search the plugin directory for other importer plugins to see if there is one for your platform." +msgstr "Esta pantalla lista los enlaces a los plugins de importación de datos de blogs/contenido de diferentes plataformas. Elige la plataforma desde la que quieres importar datos y haz clic en Instalar ahora cuando seas preguntado en la ventana emergente. Si tu plataforma no está en la lista, haz clic en el enlace de buscar en el directorio de plugins para ver si hay uno para tu plataforma." + +#: wp-admin/export.php:43 +msgid "Once generated, your WXR file can be imported by another WordPress site or by another blogging platform able to access this format." +msgstr "Una vez generado, tu archivo WXR puede ser importado por otro sitio WordPress o por otra plataforma de blogs que pueda acceder a este formato." + +#: wp-admin/import.php:21 +msgid "In previous versions of WordPress, all the importers were built-in, but they have been turned into plugins as of version 3.0 since most people only use them once or infrequently." +msgstr "En versiones anteriores de WordPress, todos los importadores estaban incluidos. Ahora han sido convertidos en plugins para la versión 3.0. Mucha gente sólo lo utilizaba una vez o ni eso." + +#: wp-admin/link-manager.php:46 +msgid "You can customize the display of this screen using the Screen Options tab and/or the dropdown filters above the links table." +msgstr "Puedes personalizar cómo se muestra esta pantalla usando la pestaña Opciones de pantalla y/o el menú desplegable de filtros encima de la tabla de enlaces." + +#: wp-admin/plugin-editor.php:117 +msgid "Choose a plugin to edit from the menu in the upper right and click the Select button. Click once on any file name to load it in the editor, and make your changes. Don’t forget to save your changes (Update File) when you’re finished." +msgstr "Elige un plugin a editar en el menú superior derecha y haz clic en el botón Seleccionar. Haz clic una vez sobre cualquier nombre de archivo para cargarlo en el editor. No olvides guardar tus cambios (Actualizar archivo) cuando acabes." + +#: wp-admin/plugins.php:324 +msgid "Most of the time, plugins play nicely with the core of WordPress and with other plugins. Sometimes, though, a plugin’s code will get in the way of another plugin, causing compatibility issues. If your site starts doing strange things, this may be the problem. Try deactivating all your plugins and re-activating them in various combinations until you isolate which one(s) caused the issue." +msgstr "La mayoría de las veces los plugins funcionan perfectamente con el núcleo de WordPress y con los otros plugins. Algunas veces, puede haber incompatibilidades entre algunos plugins produciendo problemas. Tu sitio podría comenzar a hacer cosas raras, esto podría ser un problema. Prueba a desactivar tus plugin e ir activándolos uno a uno y comprobando que el problema no reaparezca. Es la forma de detectar el plugin problemático o la combinación de plugins problemáticos." + +#: wp-admin/plugin-install.php:43 +msgid "If you want to install a plugin that you’ve downloaded elsewhere, click Upload in the upper left. You will be prompted to upload the .zip package, and once uploaded, you can activate the new plugin." +msgstr "Si deseas instalar un plugin que has descargado de cualquier sitio, haz click en la parte superior izquierda. Se te preguntará por un archivo comprimido en .zip y, una vez subido, podrás activarlo." + +#: wp-admin/plugin-install.php:42 +msgid "If you just want to get an idea of what’s available, you can browse Featured, Popular, Newest, and Recently Updated plugins by using the links in the upper left of the screen. These sections rotate regularly." +msgstr "Si quieres hacerte una idea de lo que está disponible, puedes navegar por Destacados, Populares, Nuevos y Actualizados recientemente, usando los enlaces en la parte superior izquierda de la pantalla. Esta sección rota regularmente." + +#: wp-admin/themes.php:41 +msgid "You can see your active theme at the top of the screen. Below are the other themes you have installed that are not currently in use. You can see what your site would look like with one of these themes by clicking the Preview link. To change themes, click the Activate link." +msgstr "Puedes ver tu tema activo en la parte superior de la pantalla. Debajo están los otros temas que tienes instalados pero que no están actualmente en uso. Puedes ver cómo quedaría tu sitio con uno de estos temas haciendo clic en el enlace Previsualizar. Para cambiar de tema, haz clic en Activar." + +#: wp-admin/themes.php:40 +msgid "Aside from the default theme included with your WordPress installation, themes are designed and developed by third parties." +msgstr "Aparte del tema por defecto incluido en su instalación de WordPress, los temas han sido diseñados y desarrollados por terceros." + +#: wp-admin/theme-editor.php:25 +msgid "For PHP files, you can use the Documentation dropdown to select from functions recognized in that file. Lookup takes you to a web page with reference material about that particular function." +msgstr "Para los archivos PHP, puedes usar el menú desplegable de Documentación para elegir las funciones reconocidas que son usadas en ese archivo. Buscar te lleva a una página con material de referencia de esa función en particular." + +#: wp-admin/widgets.php:40 +msgid "Widgets may be used multiple times. You can give each widget a title, to display on your site, but it’s not required." +msgstr "Los widgets pueden usarse varias veces. Puedes proporcionar a cada widget un título para ser mostrado en tu sitio, pero no es necesario." + +#: wp-admin/widgets.php:41 +msgid "Enabling Accessibility Mode, via Screen Options, allows you to use Add and Edit buttons instead of using drag and drop." +msgstr "Activar el modo de accesibilidad, vía Opciones de Pantalla, te permite usar botones de Añadir y Editar en vez de arrastrar y soltar." + +#: wp-admin/theme-editor.php:23 +msgid "You can use the Theme Editor to edit the individual CSS and PHP files which make up your theme." +msgstr "Puedes usar el Editor de temas para editar de forma individual los archivos css y php que crean la apariencia de tu sitio." + +#: wp-admin/theme-editor.php:24 +msgid "Begin by choosing a theme to edit from the dropdown menu and clicking Select. A list then appears of all the template files. Clicking once on any file name causes the file to appear in the large Editor box." +msgstr "Comienza seleccionando qué tema quieres editar en el menú desplegable y haz clic en Elegir. Una lista de todas las plantillas aparecerá. Apretando una vez sobre el nombre de un archivo, éste aparecerá en la gran caja de edición." + +#: wp-admin/widgets.php:37 +msgid "Widgets are independent sections of content that can be placed into any widgetized area provided by your theme (commonly called sidebars). To populate your sidebars/widget areas with individual widgets, drag and drop the title bars into the desired area. By default, only the first widget area is expanded. To populate additional widget areas, click on their title bars to expand them." +msgstr "Los Widgets son secciones independientes de contenido que pueden ser colocados en cualquier parte de tu tema que esté preparado para ello (comúnmente llamados sidebars). Para colocar en tus áreas sidebar/widget con widgets de forma individual, arrastra y suelta la barra del título del widget al área deseada. Por defecto, sólo la primera área está desplegada. Para poner widgets en otras aéreas haz clic en el barra del título para desplegarlas." + +#: wp-admin/theme-install.php:43 +msgid "You can Search for themes by keyword, author, or tag, or can get more specific and search by criteria listed in the feature filter. Alternately, you can browse the themes that are Featured, Newest, or Recently Updated. When you find a theme you like, you can preview it or install it." +msgstr "Puedes buscar temas por palabras clave, autor o etiquetas o puedes ser más específico y buscar por criterios utilizando los filtros. De forma alternativa, puedes ver los temas Destacados, Nuevos o Actualizados Recientemente. Cuando encuentres el tema que te guste, puedes realizar una previsualización o instalarlo." + +#: wp-admin/theme-editor.php:27 +msgid "Advice: think very carefully about your site crashing if you are live-editing the theme currently in use." +msgstr "Advertencia: piensa detenidamente en la posibilidad de que tu sitio produzca errores y sea inaccesible si estás editando el tema en uso y cometes algún error." + +#: wp-admin/theme-editor.php:26 +msgid "After typing in your edits, click Update File." +msgstr "Después de introducir tus modificaciones, haz click en Actualizar archivo." + +#: wp-admin/nav-menus.php:453 +msgid "You can create custom menus for your site. These menus may contain links to pages, categories, custom links or other content types (use the Screen Options tab to decide which ones to show on the screen). You can specify a different navigation label for a menu item as well as other attributes. You can create multiple menus. If your theme includes more than one menu, you can choose which custom menu to associate with each. You can also use custom menus in conjunction with the Custom Menus widget." +msgstr "Puedes crear menús personalizados para tu sitio. Estos menús pueden contener enlaces a páginas, categorías y enlaces personalizados o otro tipo de contenido (usa la pestaña Opciones de pantalla para decidir cuales se muestran en esta pantalla). Puedes especificar diferentes niveles de navegación para un elemento del menú como para otros atributos. Puedes crear múltiples menús. Si tu tema incluye más de un menú, puedes elegir qué menú personalizado asociarás a cada espacio. También puedes usar los menús personalizados conjuntamente con el widget Menús personalizados." + +#: wp-admin/includes/meta-boxes.php:559 +msgid "(no parent)" +msgstr "(sin superior)" + +#: wp-admin/edit.php:176 +msgid "You can also perform the same types of actions, including narrowing the list by using the filters, acting on a Page using the action links that appear when you hover over a row, or using the Bulk Actions menu to edit the metadata for multiple Pages at once." +msgstr "También puedes realizar el mismo tipo que acciones, incluyendo reducir el listado usando filtros, acciones en una página usando las acciones que aparecen cuando te pones sobre ellas o usar el menú Acciones en lote para editar los metadatos de múltiples páginas de una sola vez." + +#: wp-admin/edit-form-advanced.php:184 +msgid "Template - Some themes have custom templates you can use for certain pages that might have additional features or custom layouts. If so, you’ll see them in this dropdown menu." +msgstr "Plantilla - Algunos temas tienen plantillas personalizadas que pueden usarse para añadir algunas características adicionales o diseños personalizados. Si las hay, las encontrarás en el menú desplegable." + +#: wp-admin/edit-form-advanced.php:183 +msgid "Parent - You can arrange your pages in hierarchies. For example, you could have an “About” page that has “Life Story” and “My Dog” pages under it. There are no limits to how many levels you can nest pages." +msgstr "Superiores - Puedes ordenar tus páginas en jerarquías. Por ejemplo, podrías tener una página “Sobre” que bajo ella las páginas “Historia de mi vida” y “Mi perro”. No hay límites en cuántos niveles puedes anidar páginas." + +#: wp-admin/includes/class-wp-upgrader.php:1089 +msgid "All updates have been completed." +msgstr "Todas las actualizaciones han sido completadas." + +#: wp-admin/includes/nav-menu.php:1093 +msgid "Select menu items (pages, categories, links) from the boxes at left to begin building your custom menu." +msgstr "Selecciona elementos de menú (páginas, categorías, enlaces) de la caja de la izquierda para comenzar a construir tu propio menú." + +#: wp-admin/edit-tags.php:191 +msgid "When adding a new tag on this screen, you’ll fill in the following fields:" +msgstr "Cuando añadas una nueva etiqueta en esta pantalla, rellenarás los siguientes campos:" + +#: wp-admin/edit-tags.php:177 +msgid "You can use categories to define sections of your site and group related posts. The default category is “Uncategorized” until you change it in your writing settings." +msgstr "Puedes usar categorías para definir secciones para las entradas de tu sitio y grupo. La categoría por defecto es “Sin categoría” hasta que la cambies en tus ajustes de escritura." + +#: wp-admin/edit-tags.php:181 +msgid "You can assign keywords to your posts using Post Tags. Unlike categories, tags have no hierarchy, meaning there’s no relationship from one tag to another." +msgstr "Puedes asignar palabras clave a tus entradas usando las etiquetas de entradas. A diferencia de las categorías, las etiquetas no tienen jerarquías, lo que quiere decir que no están relacionadas entre sí." + +#: wp-admin/edit-tags.php:186 +msgid "What’s the difference between categories and tags? Normally, tags are ad-hoc keywords that identify important information in your post (names, subjects, etc) that may or may not recur in other posts, while categories are pre-determined sections. If you think of your site like a book, the categories are like the Table of Contents and the tags are like the terms in the index." +msgstr "¿Cuál es la diferencia entre categorías y etiquetas? Normalmente, las etiquetas son palabras clave que identifican información importante en tus entradas (nombres, asuntos, etc...) que pueden ser recurrentes o no en otras entradas, mientras que las categorías son secciones predeterminadas. Si piensas en tu sitio como en un libro, las categorías sería la tabla de contenidos mientras que las etiquetas serían como los términos en el índice." + +#: wp-admin/edit-tags.php:208 +msgid "You can change the display of this screen using the Screen Options tab to set how many items are displayed per screen and to display/hide columns in the table." +msgstr "Puedes cambiar la forma de visualización de esta pantalla usando la pestaña Opciones de pantalla para marcar cuántos elementos se muestran por pantalla y mostrar/esconder columnas." + +#: wp-admin/edit-tags.php:206 +msgid "Description - The description is not prominent by default; however, some themes may display it." +msgstr "Descripción - La descripción no se muestra por defecto, pero algunos temas la podrían mostrar." + +#: wp-admin/edit-tags.php:203 +msgid "Parent - Categories, unlike tags, can have a hierarchy. You might have a Jazz category, and under that have children categories for Bebop and Big Band. Totally optional. To create a subcategory, just choose another category from the Parent dropdown." +msgstr "Categorías - Superiores, a diferencia de las etiquetas, pueden tener jerarquías. Puedes tener la categoría Jazz y bajo esta, tener unas categorías hijas para Bebop y Big Band. Totalmente Opcional. Para crear una subcategoría, tan solo selecciona otra categoría del menú desplegable de Superiores." + +#: wp-admin/edit-tags.php:196 +msgid "Name - The name is how it appears on your site." +msgstr "Nombre - El nombre es como aparece en tu sitio" + +#: wp-admin/edit-tags.php:189 +msgid "When adding a new category on this screen, you’ll fill in the following fields:" +msgstr "Cuando añades una nueva categoría en esta pantalla, rellenas los siguientes campos." + +#: wp-admin/upload.php:146 +msgid "If a media file has not been attached to any post, you will see that in the Attached To column, and can click on Attach File to launch a small popup that will allow you to search for a post and attach the file." +msgstr "Si un archivo multimedia no se ha adjuntado a ninguna entrada, lo verás que en la columna Adjunto a y haciendo click en Adjuntar archivo te desplegará una pequeña ventana emergente que te permitirá buscar una entrada y adjuntarle el archivo." + +#: wp-admin/upload.php:144 +msgid "You can narrow the list by file type/status using the text link filters at the top of the screen. You also can refine the list by date using the dropdown menu above the media table." +msgstr "Puedes reducir el listado por tipo/estado usando los filtros en la parte superior de la pantalla. También puedes refinar la búsqueda por fecha usando el menú desplegable junto a la tabla de multimedia." + +#: wp-admin/media-upload.php:66 +msgid "You can upload media files here without creating a post first. This allows you to upload files to use with posts and pages later and/or to get a web link for a particular file that you can share." +msgstr "Desde aquí puedes subir archivos multimedia sin tener que crear primero una entrada. Esto te permite subir archivos para usarlos en tus entradas y páginas y/o conseguir un enlace al archivo en particular que puedes compartir" + +#: wp-admin/link-manager.php:45 +msgid "Links may be separated into categories; these are different than the categories used on your posts." +msgstr "Los enlaces deben ser separados en categorías. Estas son diferentes de las que utilizas en tus entradas." + +#: wp-admin/includes/template.php:1668 +msgid "Header Image" +msgstr "Imagen de cabecera" + +#: wp-admin/custom-header.php:537 +msgid "Default Images" +msgstr "Imágenes por defecto" + +#: wp-admin/custom-header.php:683 +msgid "Crop Header Image" +msgstr "Recortar imagen de cabecera" + +#: wp-admin/link-manager.php:48 wp-admin/user-new.php:148 wp-admin/index.php:47 +#: wp-admin/edit-link-form.php:46 wp-admin/options-general.php:68 +#: wp-admin/themes.php:45 wp-admin/media.php:75 wp-admin/custom-header.php:105 +#: wp-admin/options-discussion.php:21 wp-admin/plugin-editor.php:121 +#: wp-admin/plugin-install.php:44 wp-admin/options-privacy.php:22 +#: wp-admin/theme-editor.php:31 wp-admin/tools.php:18 +#: wp-admin/edit-form-advanced.php:176 wp-admin/edit-form-advanced.php:186 +#: wp-admin/comment.php:50 wp-admin/edit-comments.php:120 +#: wp-admin/import.php:22 wp-admin/custom-background.php:87 +#: wp-admin/options-media.php:23 wp-admin/edit.php:168 wp-admin/edit.php:177 +#: wp-admin/upload.php:147 wp-admin/export.php:44 wp-admin/theme-install.php:45 +#: wp-admin/users.php:27 wp-admin/options-writing.php:21 +#: wp-admin/update-core.php:412 wp-admin/options-reading.php:49 +#: wp-admin/options-permalink.php:25 wp-admin/user-edit.php:46 +#: wp-admin/widgets.php:44 wp-admin/credits.php:19 wp-admin/plugins.php:326 +#: wp-admin/edit-tags.php:209 wp-admin/media-upload.php:68 +#: wp-admin/nav-menus.php:455 +msgid "For more information:" +msgstr "Para más información:" + +#: wp-admin/custom-header.php:554 +msgid "This will remove the header image. You will not be able to restore any customizations." +msgstr "Esto eliminará la imagen de cabecera. No podrás restaurar ninguna personalización." + +#: wp-admin/edit-tags.php:179 +msgid "You can create groups of links by using link categories. Link category names must be unique and link categories are separate from the categories you use for posts." +msgstr "Puedes crear grupos de enlaces usando las categorías de enlaces. Los nombres de las categorías de enlaces deben ser únicos y diferentes a las categorías que usas para las entradas." + +#: wp-admin/custom-header.php:504 +msgid "You can upload a custom header image to be shown at the top of your site instead of the default one. On the next screen you will be able to crop the image." +msgstr "Puedes subir una imagen de cabecera personalizada para que se vea en tu sitio web en vez de la que viene por defecto. En la siguiente pantalla podrás recortar la imagen." + +#: wp-admin/custom-header.php:555 +msgid "Remove Header Image" +msgstr "Eliminar imagen de cabecera" + +#: wp-admin/custom-header.php:562 +msgid "Reset Image" +msgstr "Restaurar imagen" + +#: wp-admin/custom-header.php:564 +msgid "This will restore the original header image. You will not be able to restore any customizations." +msgstr "Esto restaurará la imagen de cabecera original. No te será posible restaurar ninguna personalización." + +#: wp-admin/custom-header.php:565 +msgid "Restore Original Header Image" +msgstr "Restaurar imagen de cabecera original" + +#: wp-admin/custom-header.php:576 +msgid "Display Text" +msgstr "Visualización de texto" + +#: wp-admin/custom-header.php:587 +msgid "Text Color" +msgstr "Color de texto" + +#: wp-admin/custom-header.php:591 +msgid "If you want to hide header text, add #blank as text color." +msgstr "Si quieres ocultar el texto de la cabecera, añade #blank como color de texto." + +#: wp-admin/custom-header.php:600 +msgid "Reset Text Color" +msgstr "Restaurar color de texto" + +#: wp-admin/custom-header.php:602 +msgid "This will restore the original header text. You will not be able to restore any customizations." +msgstr "Esto restaurará el texto original de la cabecera. No te será posible restaurar ninguna personalización." + +#: wp-admin/custom-header.php:603 +msgid "Restore Original Header Text" +msgstr "Restaurar texto original de la cabecera" + +#: wp-admin/custom-header.php:636 +msgid "Image Upload Error" +msgstr "Error al subir la imagen" + +#: wp-admin/custom-header.php:687 +msgid "You need Javascript to choose a part of the image." +msgstr "Necesitas Javascript para elegir una parte de la imagen." + +#: wp-admin/edit-comments.php:115 +msgid "A yellow row means the comment is waiting for you to moderate it." +msgstr "Una fila amarilla significa que el comentario está esperando a que lo moderes." + +#: wp-admin/edit-comments.php:116 +msgid "In the Author column, in addition to the author’s name, email address, and blog URL, the commenter’s IP address is shown. Clicking on this link will show you all the comments made from this IP address." +msgstr "En la columna Autor, además del nombre del autor, la dirección de correo electrónico y la url del sitio se muestra la dirección IP del que ha realizado el comentario. Haciendo clic en este enlace te mostrará todos los comentarios realizados desde esa dirección IP." + +#: wp-admin/edit-comments.php:114 +msgid "You can manage comments made on your site similar to the way you manage Posts and other content. This screen is customizable in the same ways as other management screens, and you can act on comments using the on-hover action links or the Bulk Actions." +msgstr "Puedes gestionar los comentarios realizados en tu sitio de forma similar a la que gestionas las Entradas y otros contenidos. Esta pantalla es personalizable, de la misma forma que las otras pantallas de gestión. Puedes actuar sobre cada comentario usando los enlaces de acción que aparecerán al ponerte sobre ellos o utilizando la Acción en lote." + +#: wp-admin/edit-comments.php:119 +msgid "Many people take advantage of keyboard shortcuts to moderate their comments more quickly. Use the link below to learn more." +msgstr "Mucha gente saca partido a los atajos de teclado para moderar comentarios de forma rápida. Utiliza el siguiente enlace para aprender más." + +#: wp-admin/includes/class-wp-posts-list-table.php:542 +msgid "Edit this item" +msgstr "Editar este elemento" + +#: wp-admin/includes/class-wp-posts-list-table.php:543 +msgid "Edit this item inline" +msgstr "Editar este elemento en línea" + +#: wp-admin/includes/class-wp-posts-list-table.php:547 +msgid "Restore this item from the Trash" +msgstr "Restaurar este elemento desde la papelera" + +#: wp-admin/includes/class-wp-posts-list-table.php:549 +msgid "Move this item to the Trash" +msgstr "Mover este elemento a la papelera" + +#: wp-admin/includes/class-wp-posts-list-table.php:551 +msgid "Delete this item permanently" +msgstr "Borrar este elemento permanentemente" + +#: wp-admin/includes/meta-boxes.php:447 +msgid "Allow comments." +msgstr "Permitir comentarios." + +#: wp-admin/import.php:32 +msgid "Install the LiveJournal importer to import posts from LiveJournal using their API." +msgstr "Instala el importador de LiveJournal para importar entradas usando su API" + +#: wp-admin/includes/media.php:1484 +msgid "Sorry, you have filled your storage quota (%s MB)." +msgstr "Lo sentimos, usted ha ocupado su cuota de almacenamiento (%s MB)." + +#: wp-admin/includes/nav-menu.php:483 wp-admin/nav-menus.php:450 +msgid "The current theme does not natively support menus, but you can use the “Custom Menu” widget to add any menus you create here to the theme’s sidebar." +msgstr "El tema actual no soporta menús de forma nativa, pero puedes usar el widget “Menús personalizados” para añadir los menús que has creado a la barra lateral de tu tema." + +#: wp-admin/includes/class-wp-upgrader.php:1202 +#: wp-admin/includes/class-wp-upgrader.php:1234 +msgid "Return to WordPress Updates" +msgstr "Volver a las actualizaciones de WordPress" + +#: wp-admin/edit-form-advanced.php:170 +msgid "Publish - You can set the terms of publishing your post in the Publish box. For Status, Visibility, and Publish (immediately), click on the Edit link to reveal more options. Visibility includes options for password-protecting a post or making it stay at the top of your blog indefinitely (sticky). Publish (immediately) allows you to set a future or past date and time, so you can schedule a post to be published in the future or backdate a post." +msgstr "Publicar - Puedes fijar las características de publicación en la caja de publicación. Para el estado, visibilidad y publicar (inmediatamente), haz clic en el enlace \"editar\" para ver más opciones. La visibilidad incluye opciones para proteger una entrada con contraseña o para hacer que se quede en la parte superior de tu sitio indefinidamente (entrada fija). Publicar (inmediatamente) te permite fijar una fecha de publicación pasada o futura, con lo que puedes programar una entrada para publicarse después o atrasar la fecha de una entrada." + +#: wp-admin/edit-form-advanced.php:172 +msgid "Featured Image - This allows you to associate an image with your post without inserting it. This is usually useful only if your theme makes use of the featured image as a post thumbnail on the home page, a custom header, etc." +msgstr "Imagen destacada - Esto te permite asociar una imagen con su entrada sin tener que insertarla, Es útil sólo si tu tema usa la imagen destacada para mostrar una miniatura en la página de inicio, en una cabecera personalizada, etc." + +#: wp-admin/edit-form-advanced.php:168 +msgid "Title - Enter a title for your post. After you enter a title, you’ll see the permalink below, which you can edit." +msgstr "Título - Introduce el título de tu entrada. Después de introducir el título, podrás ver el enlace permanente el cual podrás editar." + +#: wp-admin/edit-form-advanced.php:174 +msgid "Discussion - You can turn comments and pings on or off, and if there are comments on the post, you can see them here and moderate them." +msgstr "Comentarios - Puedes activar o desactivar los comentarios y pings, y si hay comentario en las entradas, puedes verlos aquí y moderarlos." + +#: wp-admin/edit.php:158 +msgid "You can refine the list to show only posts in a specific category or from a specific month by using the dropdown menus above the posts list. Click the Filter button after making your selection. You also can refine the list by clicking on the post author, category or tag in the posts list." +msgstr "Puedes refinar lo que muestra el listado de entradas haciendo que sólo se muestren las de una categoría específica o de un mes determinado usando el menú desplegable que encontrarás sobre el listado de entradas. Realiza un clic sobre el botón Filtro después de realizar tu selección. También puedes refinar el listado haciendo clic sobre el autor de una entrada, categoría o etiqueta del listado de entradas." + +#: wp-admin/edit.php:157 +msgid "You can view posts in a simple title list or with an excerpt. Choose the view you prefer by clicking on the icons at the top of the list on the right." +msgstr "Puedes ver las entradas en un listado que muestre sólo los títulos o un fragmento del contenido. Selecciona la vista que prefieras realizando un clic en los iconos que encontrarás en la parte superior derecha del listado." + +#: wp-admin/edit.php:155 +msgid "You can hide/display columns based on your needs and decide how many posts to list per screen using the Screen Options tab." +msgstr "Puedes esconder/mostrar columnas basándote en tus necesidades y decidir cuántas entradas se mostrarán por pantalla utilizando la pestaña Opciones de pantalla." + +#: wp-admin/edit.php:156 +msgid "You can filter the list of posts by post status using the text links in the upper left to show All, Published, Draft, or Trashed posts. The default view is to show all posts." +msgstr "Puedes filtrar la lista de entradas por estados usando los enlaces que aparecen en la parte superior izquierda para mostrar Todas, Publicado, Borrador o entradas en Papelera. La vista por defecto es mostrar todas las entradas." + +#: wp-admin/edit.php:153 +msgid "You can customize the display of this screen in a number of ways:" +msgstr "Puedes personalizar cómo se muestra esta pantalla de diferentes formas:" + +#: wp-admin/edit.php:160 +msgid "Hovering over a row in the posts list will display action links that allow you to manage your post. You can perform the following actions:" +msgstr "Pasando sobre la línea de la entrada, mostrará los enlaces de las acciones, permitiéndote gestionar la entrada. Puedes realizar las siguientes acciones:" + +#: wp-admin/edit.php:167 +msgid "You can also edit multiple posts at once. Select the posts you want to edit using the checkboxes, select Edit from the Bulk Actions menu and click Apply. You will be able to change the metadata (categories, author, etc.) for all selected posts at once. To remove a post from the grouping, just click the x next to its name in the Bulk Edit area that appears." +msgstr "También puedes editar múltiples entradas de una sola vez. Elige las entradas marcando en sus casillas de verificación, elige Editar en el menú Acciones en lote y haz clic en Aplicar. Esto te permitirá cambiar los metadatos (categorías, autor, etc) de todas las entradas elegidas a la vez. Para eliminar una entrada del grupo, simplemente haz click en la x que está junto a su nombre en el área de Edición en lote." + +#: wp-admin/edit.php:165 +msgid "Preview will show you what your draft post will look like if you publish it. View will take you to your live site to view the post. Which link is available depends on your post’s status." +msgstr "Previsualizar te mostrará cómo se verá la entrada antes de publicarla. Ver te llevará a tu sitio público para ver tu entrada publicada. Cada uno de los enlaces está disponible dependiendo del estado de tu entrada." + +#: wp-admin/edit.php:164 +msgid "Trash removes your post from this list and places it in the trash, from which you can permanently delete it." +msgstr "Papelera elimina la entrada de esta lista y la coloca en la papelera. Desde ahí la podrás eliminar de forma permanente." + +#: wp-admin/edit.php:163 +msgid "Quick Edit provides inline access to the metadata of your post, allowing you to update post details without leaving this screen." +msgstr "Edición rápida te da acceso en línea a los metadatos de tu entrada, permitiéndote actualizar los detalles de tu entrada sin abandonar la pantalla." + +#: wp-admin/edit.php:162 +msgid "Edit takes you to the editing screen for that post. You can also reach that screen by clicking on the post title." +msgstr "Editar te lleva a la pantalla de edición de entradas. También puedes acceder a esta pantalla haciendo clic sobre el título de cada entrada." + +#: wp-includes/default-widgets.php:1057 wp-admin/includes/theme.php:308 +msgid "Custom Menu" +msgstr "Menú personalizado" + +#: wp-includes/default-widgets.php:1056 +msgid "Use this widget to add one of your custom menus as a widget." +msgstr "Usa este widget para añadir uno de tus menús de navegación como widget." + +#: wp-admin/plugins.php:396 +msgid "Search Installed Plugins" +msgstr "Buscar Plugins Instalados" + +#: wp-admin/includes/nav-menu.php:492 +msgid "Your theme supports %s menu. Select which menu you would like to use." +msgid_plural "Your theme supports %s menus. Select which menu appears in each location." +msgstr[0] "Tu tema soporta %s menú. Selecciona qué menú quieres utilizar." +msgstr[1] "Tu tema soporta %s menús. Selecciona qué menú quieres utilizar en cada posición." + +#: wp-admin/update-core.php:409 +msgid "This screen lets you update to the latest version of WordPress as well as update your themes and plugins from the WordPress.org repository. When updates are available, the number of available updates will appear in a bubble on the left hand menu as a notification. It is very important to keep your WordPress installation up to date for security reasons, so when you see a number appear, make sure you take the time to update, which is an easy process." +msgstr "Esta pantalla te permite actualizar a la última versión de WordPress, así como actualizar tu temas y plugins desde el repositorio de WordPress.org. Cuando hay actualizaciones disponibles, el número de actualizaciones disponibles aparecerá en una burbuja en el menú de la izquierda como una notificación. Es muy importante mantener tu instalación de WordPress al día por razones de seguridad, así que cuando veas que aparece un número, asegúrate de que realizas las actualizaciones, que es un proceso muy fácil." + +#: wp-admin/index.php:41 +msgid "Incoming Links - Shows links to your site found by Google Blog Search." +msgstr "Enlaces entrantes - Muestra enlaces que apuntan a tu sitio encontrados por la búsqueda de blogs de Google." + +#: wp-admin/index.php:42 +msgid "QuickPress - Allows you to create a new post and either publish it or save it as a draft." +msgstr "Publicación rápida - Te permite crear entradas nuevas y publicarlas o guardarlas como borradores." + +#: wp-admin/index.php:43 +msgid "Recent Drafts - Displays links to the 5 most recent draft posts you’ve started." +msgstr "Borradores recientes - Muestra un enlace a los últimos 5 borradores de entradas que hayas comenzado." + +#: wp-admin/index.php:39 +msgid "Right Now - Displays a summary of the content on your site and identifies which theme and version of WordPress you are using." +msgstr "Ahora mismo - Muestra un resumen de tu sitio e identifica qué tema y versión estás usando." + +#: wp-admin/index.php:40 +msgid "Recent Comments - Shows the most recent comments on your posts (configurable, up to 30) and allows you to moderate them." +msgstr "Comentario recientes - Muestra los comentarios más recientes en tus entradas (es configurable, hasta 30 comentarios) y te permite moderarlos." + +#: wp-admin/nav-menus.php:19 +msgid "Your theme does not support navigation menus or widgets." +msgstr "El tema actual no soporta menús de navegación o widgets." + +#: wp-includes/script-loader.php:245 wp-admin/async-upload.php:56 +msgid "“%s” has failed to upload due to an error" +msgstr "Ha habido un error al subir “%s”" + +#: wp-admin/includes/dashboard.php:488 +msgid "Post published. View post | Edit post" +msgstr "Entrada publicada. Ver entrada | Editar entrada" + +#: wp-admin/includes/dashboard.php:492 +msgid "Draft saved. Preview post | Edit post" +msgstr "Borrador guardado. Previsualizar entrada | Editar entrada" + +#: wp-admin/tools.php:51 wp-admin/import.php:31 +msgid "Categories and Tags Converter" +msgstr "Conversor de etiquetas y categorías" + +#: wp-admin/import.php:31 +msgid "Install the category/tag converter to convert existing categories to tags or tags to categories, selectively." +msgstr "Instala el conversor de categorías existentes en etiquetas o las etiquetas en categorías, de forma selectiva." + +#: wp-includes/pluggable.php:1092 +msgid "New pingback on your post \"%s\"" +msgstr "Nuevo pingback en tu entrada \"%s\"" + +#: wp-includes/pluggable.php:1178 +msgid "A new pingback on the post \"%s\" is waiting for your approval" +msgstr "Un nuevo pingback a la entada \"%s\" está esperando tu aprobación" + +#: wp-includes/pluggable.php:1185 +msgid "A new comment on the post \"%s\" is waiting for your approval" +msgstr "Un nuevo comentario a la entrada \"%s\" está esperando tu aprobación" + +#: wp-includes/pluggable.php:1083 +msgid "New trackback on your post \"%s\"" +msgstr "Nuevo trackback a tu entrada \"%s\"" + +#: wp-includes/pluggable.php:1072 +msgid "New comment on your post \"%s\"" +msgstr "Nuevo comentario a tu entrada \"%s\"" + +#: wp-admin/user-edit.php:335 +msgid "There is a pending change of your e-mail to %1$s. Cancel" +msgstr "Hay un cambio pendiente en tu correo electrónico a %1$s. Cancelar" + +#: wp-admin/includes/nav-menu.php:664 +msgid "Most Recent" +msgstr "Más reciente" + +#: wp-admin/export.php:151 wp-admin/export.php:183 +msgid "End Date" +msgstr "Fecha de finalización" + +#: wp-admin/export.php:147 wp-admin/export.php:179 +msgid "Start Date" +msgstr "Fecha de inicio" + +#: wp-includes/taxonomy.php:2035 +msgid "A term with the name provided already exists." +msgstr "Ya existe un término igual al facilitado." + +#: wp-admin/custom-background.php:272 +msgid "No Repeat" +msgstr "No repetir" + +#: wp-includes/theme-compat/sidebar.php:74 +msgid "XFN" +msgstr "XFN" + +#: wp-includes/theme-compat/sidebar.php:74 +msgid "XHTML Friends Network" +msgstr "Red de amigos de XHTML" + +#: wp-includes/theme-compat/sidebar.php:73 +msgid "Valid XHTML" +msgstr "Valida XHTML" + +#: wp-includes/theme-compat/footer.php:19 +msgid "%1$s and %2$s." +msgstr "%1$s y %2$s." + +#: wp-includes/theme-compat/sidebar.php:38 +msgid "F, Y" +msgstr "j F Y" + +#: wp-includes/theme-compat/sidebar.php:47 +msgid "You are currently browsing the %2$s blog archives." +msgstr "Estás navegando por el archivo de %2$s." + +#: wp-includes/theme-compat/sidebar.php:38 +msgid "You are currently browsing the %2$s blog archives for %3$s." +msgstr "Actualmente estás viendo el archivo del sitio %2$s de %3$s." + +#: wp-includes/theme-compat/comments.php:49 +msgid "Comments are closed." +msgstr "Los comentarios están cerrados." + +#: wp-includes/theme-compat/sidebar.php:41 +msgid "You are currently browsing the %2$s blog archives for the year %3$s." +msgstr "Actualmente estás viendo el archivo del sitio %2$s del año %3$s." + +#: wp-includes/theme-compat/comments.php:73 +msgid "Logged in as %2$s." +msgstr "Identificado como %2$s." + +#: wp-includes/theme-compat/comments-popup.php:71 +msgid "Logged in as %2$s. Log out »" +msgstr "Identificado como %2$s. Salir »" + +#: wp-includes/theme-compat/comments.php:92 +msgid "Submit Comment" +msgstr "Enviar comentario" + +#: wp-includes/theme-compat/footer.php:17 +msgid "%1$s is proudly powered by %2$s" +msgstr "%1$s funciona gracias a %2$s" + +#: wp-includes/theme-compat/comments-popup.php:85 +msgid "URL" +msgstr "URL" + +#: wp-includes/theme-compat/comments-popup.php:90 +msgid "Your Comment" +msgstr "Tu comentario" + +#: wp-includes/theme-compat/comments-popup.php:98 +msgid "Say It!" +msgstr "Enviar" + +#: wp-includes/theme-compat/comments-popup.php:108 +msgid "Close this window." +msgstr "Cerrar esta ventana." + +#: wp-includes/theme-compat/comments-popup.php:114 +msgid "Sorry, no posts matched your criteria." +msgstr "Lo siento, no hay nada que se ajuste a lo que buscas." + +#: wp-includes/theme-compat/comments-popup.php:118 +msgid "Powered by WordPress" +msgstr "Gestionado con WordPress" + +#: wp-includes/theme-compat/comments.php:73 +msgid "Log out of this account" +msgstr "Salir de esta cuenta" + +#: wp-includes/theme-compat/comments.php:73 +msgid "Log out »" +msgstr "Salir »" + +#: wp-includes/theme-compat/comments.php:81 +msgid "Mail (will not be published)" +msgstr "Correo electrónico (no será publicado)" + +#: wp-includes/theme-compat/comments.php:88 +msgid "XHTML: You can use these tags: %s" +msgstr "XHTML: Puedes usar estas etiquetas: %s" + +#: wp-includes/theme-compat/sidebar.php:44 +msgid "You have searched the %2$s blog archives for ‘%3$s’. If you are unable to find anything in these search results, you can try one of these links." +msgstr "Has buscado en el archivo del sitio %2$s el término ‘%3$s’. Si no te es posible encontrar nada en los resultados, puedes probar uno de estos enlaces." + +#: wp-includes/theme-compat/sidebar.php:35 +msgid "l, F jS, Y" +msgstr "j F Y" + +#: wp-includes/theme-compat/sidebar.php:35 +msgid "You are currently browsing the %2$s blog archives for the day %3$s." +msgstr "Actualmente estás navegando por el archivo del sitio %2$s del día %3$s." + +#: wp-includes/theme-compat/sidebar.php:32 +msgid "You are currently browsing the archives for the %s category." +msgstr "Actualmente estás navegando por el archivo de la categoría %s" + +#: wp-includes/theme-compat/footer.php:20 +msgid "%d queries. %s seconds." +msgstr "%d consultas. %s segundos." + +#: wp-includes/theme-compat/footer.php:19 +msgid "Comments (RSS)" +msgstr "Comentarios (RSS)" + +#: wp-includes/theme-compat/footer.php:19 +msgid "Entries (RSS)" +msgstr "Artículos (RSS)" + +#: wp-includes/theme-compat/comments-popup.php:67 +msgid "Line and paragraph breaks automatic, e-mail address never displayed, HTML allowed: %s" +msgstr "Las líneas y párrafos saltan automáticamente, nunca se mostrarán los correos electrónicos. HTMLpermitido: %s" + +#: wp-includes/theme-compat/comments.php:17 +msgid "This post is password protected. Enter the password to view comments." +msgstr "Esta entrada está protegida. Para verla, escribe la contraseña:" + +#: wp-includes/theme-compat/sidebar.php:73 +msgid "This page validates as XHTML 1.0 Transitional" +msgstr "Esta página valida como XHTML 1.0 transicional" + +#: wp-includes/theme-compat/comments-popup.php:103 +msgid "Sorry, the comment form is closed at this time." +msgstr "Lo siento, el formulario de comentarios está cerrado en este momento." + +#: wp-includes/theme-compat/comments-popup.php:14 +msgid "%1$s - Comments on %2$s" +msgstr "%1$s - Comentarios en %2$s" + +#: wp-includes/theme-compat/comments-popup.php:35 +msgid "RSS feed for comments on this post." +msgstr "RSS feed para los comentarios de esta entrada." + +#: wp-includes/theme-compat/comments-popup.php:38 +msgid "The URL to TrackBack this entry is: %s" +msgstr "La URL para realizar un TrackBack a esta entrada es: %s" + +#: wp-includes/theme-compat/comments-popup.php:56 +msgid "by %1$s — %2$s @ %4$s" +msgstr "por %1$s — %2$s @ %4$s" + +#: wp-includes/theme-compat/comments-popup.php:66 +msgid "Leave a comment" +msgstr "Deja un comentario" + +#: wp-admin/includes/template.php:1795 +msgctxt "Screen Options" +msgid "Show on screen" +msgstr "Mostrar en pantalla" + +#: wp-admin/import.php:36 +msgid "Install the WordPress importer to import posts, pages, comments, custom fields, categories, and tags from a WordPress export file." +msgstr "Instala el importador de WordPress para importar entradas, páginas, comentarios, campos personalizados, categorías y etiquetas de un archivo de exportación de WordPress." + +#: wp-admin/import.php:35 +msgid "Install the RSS importer to import posts from an RSS feed." +msgstr "Instala el importador RSS para Importar entradas de una fuente RSS." + +#: wp-admin/import.php:34 +msgid "Install the blogroll importer to import links in OPML format." +msgstr "Instala el importador de sitios de interés para importar enlaces en formato OPML." + +#: wp-admin/import.php:33 +msgid "Install the Movable Type importer to import posts and comments from a Movable Type or TypePad blog." +msgstr "Instala el importador de Movable Type para importar entradas y comentarios de un blog de Movable Type o TypePad." + +#: wp-admin/import.php:30 +msgid "Install the Blogger importer to import posts, comments, and users from a Blogger blog." +msgstr "Instala el importador de Blogger para importar entradas, comentarios y usuarios de un blog de Blogger." + +#: wp-admin/import.php:119 +msgid "Install importer" +msgstr "Instalar importador" + +#: wp-includes/post-template.php:1416 +msgctxt "revisions column name" +msgid "New" +msgstr "Nuevo" + +#: wp-includes/post-template.php:1415 +msgctxt "revisions column name" +msgid "Old" +msgstr "Antiguo" + +#: wp-includes/post-template.php:1417 +msgctxt "revisions column name" +msgid "Date Created" +msgstr "Fecha de creación" + +#: wp-includes/taxonomy.php:413 wp-admin/press-this.php:583 +msgid "Choose from the most used tags" +msgstr "Elige entre las etiquetas más utilizadas" + +#: wp-admin/theme-editor.php:198 +msgctxt "Theme stylesheets in theme editor" +msgid "Styles" +msgstr "Estilos" + +#: wp-admin/includes/plugin-install.php:128 +msgctxt "Plugin Installer" +msgid "Tag" +msgstr "Etiqueta" + +#: wp-admin/includes/theme-install.php:63 +msgctxt "Theme Installer" +msgid "Tag" +msgstr "Etiqueta" + +#: wp-admin/includes/media.php:1809 +msgctxt "verb" +msgid "Clear" +msgstr "Limpiar" + +#: wp-admin/edit-tags.php:355 wp-admin/edit-tag-form.php:63 +msgctxt "Taxonomy Description" +msgid "Description" +msgstr "Descripción" + +#: wp-admin/edit-tags.php:340 wp-admin/edit-tag-form.php:46 +msgctxt "Taxonomy Slug" +msgid "Slug" +msgstr "Slug" + +#: wp-admin/edit-tags.php:334 wp-admin/edit-tag-form.php:40 +msgctxt "Taxonomy Name" +msgid "Name" +msgstr "Nombre" + +#: wp-admin/edit-tags.php:347 wp-admin/edit-tag-form.php:53 +msgctxt "Taxonomy Parent" +msgid "Parent" +msgstr "Superior" + +#: wp-admin/edit-form-comment.php:51 +msgctxt "adjective" +msgid "Pending" +msgstr "Pendiente" + +#: wp-admin/includes/class-wp-comments-list-table.php:192 +msgctxt "comment" +msgid "Mark as Spam" +msgstr "Marcar como spam" + +#: wp-includes/comment-template.php:1538 +msgid "You may use these HTML tags and attributes: %s" +msgstr "Puedes usar las siguientes etiquetas y atributos HTML: %s" + +#: wp-admin/custom-background.php:294 +msgid "Color" +msgstr "Color" + +#: wp-admin/custom-background.php:180 wp-admin/includes/template.php:1674 +msgid "Background Image" +msgstr "Imagen de fondo" + +#: wp-admin/custom-background.php:213 +msgid "Remove Background Image" +msgstr "Quitar imagen de fondo" + +#: wp-includes/script-loader.php:230 +msgid "This file exceeds the maximum upload size for this site." +msgstr "El tamaño del archivo excede el tamaño permitido en este sitio." + +#: wp-admin/includes/media.php:1570 wp-admin/includes/media.php:1585 +msgid "Maximum upload file size: %d%s" +msgstr "Tamaño máximo de subida de archivos: %d%s" + +#: wp-admin/edit-comments.php:108 wp-admin/edit-comments.php:133 +msgid "Comments on “%s”" +msgstr "Comentarios en “%s”" + +#: wp-admin/includes/nav-menu.php:1104 +msgid "The Walker class named %s does not exist." +msgstr "La clase Walker para el nombre %s no existe." + +#: wp-admin/includes/nav-menu.php:1140 +msgid "Show advanced menu properties" +msgstr "Mostrar propiedades avanzadas de menú" + +#: wp-admin/includes/template.php:1768 +msgctxt "Columns" +msgid "Show on screen" +msgstr "Mostrar en pantalla" + +#: wp-admin/includes/template.php:1761 +msgctxt "Metaboxes" +msgid "Show on screen" +msgstr "Mostrar en pantalla " + +#: wp-admin/includes/nav-menu.php:386 +msgid "Theme Locations" +msgstr "Ubicación del tema" + +#: wp-includes/taxonomy.php:400 +msgctxt "taxonomy singular name" +msgid "Category" +msgstr "Categoría" + +#: wp-includes/taxonomy.php:401 +msgid "Search Tags" +msgstr "Buscar etiquetas" + +#: wp-includes/taxonomy.php:402 +msgid "Popular Tags" +msgstr "Etiquetas populares" + +#: wp-includes/taxonomy.php:410 +msgid "New Category Name" +msgstr "Nombre de la nueva categoría" + +#: wp-includes/taxonomy.php:410 +msgid "New Tag Name" +msgstr "Nombre de la nueva etiqueta" + +#: wp-includes/taxonomy.php:409 +msgid "Add New Category" +msgstr "Añadir nueva categoría" + +#: wp-includes/taxonomy.php:409 +msgid "Add New Tag" +msgstr "Añadir nueva etiqueta" + +#: wp-includes/taxonomy.php:408 +msgid "Update Tag" +msgstr "Etiqueta actualizada" + +#: wp-includes/taxonomy.php:405 +msgid "Parent Category:" +msgstr "Categoría superior:" + +#: wp-includes/taxonomy.php:404 +msgid "Parent Category" +msgstr "Categoría superior" + +#: wp-includes/taxonomy.php:403 +msgid "All Tags" +msgstr "Todas las etiquetas" + +#: wp-includes/taxonomy.php:399 +msgctxt "taxonomy general name" +msgid "Categories" +msgstr "Categorías" + +#: wp-includes/taxonomy.php:400 +msgctxt "taxonomy singular name" +msgid "Post Tag" +msgstr "Etiqueta de la entrada" + +#: wp-includes/taxonomy.php:399 +msgctxt "taxonomy general name" +msgid "Post Tags" +msgstr "Etiquetas de las entradas" + +#: wp-admin/includes/meta-boxes.php:351 wp-admin/press-this.php:546 +msgid "+ %s" +msgstr "+ %s" + +#: wp-admin/includes/dashboard.php:405 +msgid "Theme %1$s with %2$s Widget" +msgid_plural "Theme %1$s with %2$s Widgets" +msgstr[0] "Tema %1$s con %2$s widget" +msgstr[1] "Tema %1$s con %2$s widgets" + +#: wp-includes/post.php:1184 +msgid "Search Pages" +msgstr "Buscar páginas" + +#: wp-includes/post.php:1180 +msgid "Add New Post" +msgstr "Añadir nueva entrada" + +#: wp-includes/post.php:1187 +msgid "Parent Page:" +msgstr "Página superior:" + +#: wp-includes/post.php:1177 +msgctxt "post type general name" +msgid "Posts" +msgstr "Entradas" + +#: wp-includes/post.php:1181 +msgid "Edit Page" +msgstr "Editar página" + +#: wp-includes/post.php:1184 +msgid "Search Posts" +msgstr "Buscar entradas" + +#: wp-includes/post.php:1180 +msgid "Add New Page" +msgstr "Añadir nueva página" + +#: wp-includes/post.php:1177 +msgctxt "post type general name" +msgid "Pages" +msgstr "Páginas" + +#: wp-includes/post.php:1178 +msgctxt "post type singular name" +msgid "Page" +msgstr "Página" + +#: wp-includes/post.php:1178 +msgctxt "post type singular name" +msgid "Post" +msgstr "Entrada" + +#: wp-admin/update-core.php:252 wp-admin/update-core.php:302 +msgid "You have version %1$s installed. Update to %2$s." +msgstr "Estás usando la versión %1$s. Actualiza a %2$s." + +#: wp-admin/includes/nav-menu.php:744 +msgctxt "nav menu home label" +msgid "Home" +msgstr "Inicio" + +#: wp-admin/themes.php:64 +msgid "New theme activated. This theme supports widgets, please visit the widgets settings screen to configure them." +msgstr "Nuevo tema activado. Este tema soporta widgets, por favor, visita la pantalla configuración de widgets para configurarlos." + +#: wp-login.php:300 wp-admin/includes/user.php:164 +msgid "ERROR: This username is invalid because it uses illegal characters. Please enter a valid username." +msgstr "ERROR: Este nombre de usuario no es válido, ya que usa caracteres no permitidos. Por favor, introduce un nombre de usuario válido." + +#: wp-admin/includes/dashboard.php:373 +msgctxt "comment" +msgid "Spam" +msgid_plural "Spam" +msgstr[0] "Spam" +msgstr[1] "Spam" + +#: wp-admin/includes/class-wp-comments-list-table.php:197 +#: wp-admin/includes/class-wp-comments-list-table.php:402 +msgctxt "comment" +msgid "Not Spam" +msgstr "No es spam" + +#: wp-includes/comment-template.php:1531 +msgid "Required fields are marked %s" +msgstr "Los campos necesarios están marcados %s" + +#: wp-admin/custom-background.php:227 +msgid "This will restore the original background image. You will not be able to restore any customizations." +msgstr "Esto restaurará la imagen de fondo original. No te será posible restaurar ninguna personalización." + +#: wp-includes/theme-compat/footer.php:10 +#: wp-includes/theme-compat/sidebar.php:10 +#: wp-includes/theme-compat/comments.php:10 +#: wp-includes/theme-compat/header.php:10 +#: wp-includes/theme-compat/comments-popup.php:10 +msgid "Please include a %1$s template in your theme." +msgstr "Por favor, incluye la plantilla %1$s en tu tema" + +#: wp-includes/theme-compat/footer.php:10 +#: wp-includes/theme-compat/sidebar.php:10 +#: wp-includes/theme-compat/comments.php:10 +#: wp-includes/theme-compat/header.php:10 +#: wp-includes/theme-compat/comments-popup.php:10 +msgid "Theme without %1$s" +msgstr "Tema sin %1$s" + +#: wp-includes/general-template.php:405 +msgid "The %s option is deprecated for the family of bloginfo() functions." +msgstr "La opción %s es obsoleta, ya no se utiliza en la familia de funciones bloginfo()." + +#: wp-includes/general-template.php:405 +msgid "Use the %s option instead." +msgstr "Usa la opción %s en su lugar." + +#: wp-admin/includes/nav-menu.php:557 +msgid "Label" +msgstr "Etiqueta" + +#: wp-admin/nav-menus.php:494 +msgid "Add New Menu" +msgstr "Añadir nuevo menú" + +#: wp-admin/nav-menus.php:587 +msgid "When you have finished building your custom menu, make sure you click the Save Menu button." +msgstr "Cuando hayas terminado de crear tu menú personalizado, asegúrate de hacer clic en el botón Guardar menú." + +#: wp-admin/nav-menus.php:586 +msgid "After you have added your items, drag and drop to put them in the order you want. You can also click each item to reveal additional configuration options." +msgstr "Después de añadir tus objetos, arrastra y suéltalos en el orden que desees. También puedes hacer clic en cada objeto para ver opciones de configuración avanzadas." + +#: wp-admin/nav-menus.php:559 +msgid "Create Menu" +msgstr "Crear menú" + +#: wp-admin/nav-menus.php:585 +msgid "To create a custom menu, give it a name above and click Create Menu. Then choose items like pages, categories or custom links from the left column to add to this menu." +msgstr "Para crear un menú personalizado dale un nombre y haz clic en Crear menú. Después elige objetos como páginas, categorías o enlaces personalizados de la columna izquierda para añadirlos a este menú." + +#: wp-includes/default-widgets.php:17 +msgid "Your site’s WordPress Pages" +msgstr "Las Páginas de tu sitio de WordPress" + +#: wp-admin/includes/upgrade.php:322 +msgid "" +"Your new WordPress site has been successfully set up at:\n" +"\n" +"%1$s\n" +"\n" +"You can log in to the administrator account with the following information:\n" +"\n" +"Username: %2$s\n" +"Password: %3$s\n" +"\n" +"We hope you enjoy your new site. Thanks!\n" +"\n" +"--The WordPress Team\n" +"http://wordpress.org/\n" +msgstr "" +"Se ha configurado correctamente tu nuevo sitio de WordPress en:\n" +"\n" +"%1$s\n" +"\n" +"Puedes identificarte como administrador con la siguiente información:\n" +"\n" +"Nombre de usuario: %2$s\n" +"Contraseña: %3$s\n" +"\n" +"Esperamos que disfrutes de tu nuevo sitio. ¡Gracias!\n" +"\n" +"--El equipo de WordPress\n" +"http://es.wordpress.org/\n" + +#: wp-admin/includes/dashboard.php:91 +msgid "WordPress Blog" +msgstr "Blog oficial WordPress" + +#: wp-content/plugins/akismet/admin.php:169 +msgid "Your web host or server administrator has disabled PHP's fsockopen or gethostbynamel functions. Akismet cannot work correctly until this is fixed. Please contact your web host or firewall administrator and give them this information about Akismet's system requirements." +msgstr "Tu servidor tiene desactivada la función fsockopen o la función gethostbynamel de PHP. Akismet no puede funcionar correctamente si esto está desactivado. Por favor, ponte en contacto con tu proveedor e infórmales sobre los requisitos de Akismet." + +#: wp-includes/class-wp-xmlrpc-server.php:1796 +msgid "Sorry, you do not have access to user data on this site." +msgstr "Disculpa, no tienes acceso a los datos de los usuarios de este sitio." + +#: wp-includes/class-wp-xmlrpc-server.php:2018 +msgid "Sorry, you are not allowed to post on this site." +msgstr "Disculpa, no tienes autorización para publicar en este sitio." + +#: wp-includes/class-wp-xmlrpc-server.php:2210 +#: wp-includes/class-wp-xmlrpc-server.php:2223 +#: wp-includes/class-wp-xmlrpc-server.php:2499 +#: wp-includes/class-wp-xmlrpc-server.php:2517 +#: wp-includes/class-wp-xmlrpc-server.php:2528 +msgid "Sorry, you are not allowed to publish posts on this site." +msgstr "Disculpa, no tienes autorización para publicar entradas en este sitio." + +#: wp-includes/class-wp-xmlrpc-server.php:3000 +#: wp-includes/class-wp-xmlrpc-server.php:3192 +msgid "Sorry, you must be able to edit posts on this site in order to view categories." +msgstr "Disculpa, para ver las categorías tienes que estar autorizado para editar entradas en este sitio." + +#: wp-includes/class-wp-xmlrpc-server.php:2199 +#: wp-includes/class-wp-xmlrpc-server.php:2508 +msgid "Sorry, you are not allowed to publish pages on this site." +msgstr "Disculpa, no tienes autorización para publicar páginas en este sitio." + +#: wp-admin/user-edit.php:255 wp-admin/user-edit.php:257 +msgid "— No role for this site —" +msgstr "— No hay perfil para este sitio —" + +#: wp-app.php:287 +msgid "AtomPub services are disabled on this site. An admin user can enable them at %s" +msgstr "En este sitio están desactivados los servicios AtomPub. Un administrador puede activarlos visitando %s." + +#: wp-includes/class-wp-xmlrpc-server.php:793 +msgid "Sorry, you cannot edit posts on this site." +msgstr "Disculpa, no puedes editar entradas en este sitio." + +#: wp-includes/class-wp-xmlrpc-server.php:957 +msgid "Sorry, you must be able to edit posts to this site in order to view categories." +msgstr "Disculpa, para ver las categorías tienes que estar autorizado para editar entradas en este sitio." + +#: wp-includes/class-wp-xmlrpc-server.php:1338 +#: wp-includes/class-wp-xmlrpc-server.php:1397 +#: wp-includes/class-wp-xmlrpc-server.php:1423 +#: wp-includes/class-wp-xmlrpc-server.php:1449 +msgid "You are not allowed access to details about this site." +msgstr "No tienes autorización para ver los detalles de este sitio." + +#: wp-admin/tools.php:35 wp-admin/options-writing.php:90 +msgid "Use Press This to clip text, images and videos from any web page. Then edit and add more straight from Press This before you save or publish it in a post on your site." +msgstr "Utiliza Publicar esto para copiar texto, imágenes y vídeos de cualquier página Web. Después corrige y añade más directamente desde Publicar esto antes de guardarlo o publicarlo en una entrada del sitio." + +#: wp-includes/default-widgets.php:513 +msgid "The most recent posts on your site" +msgstr "Las entradas más recientes de tu sitio" + +#: wp-includes/default-widgets.php:330 +msgid "A calendar of your site’s posts" +msgstr "Un calendario de las entradas de tu sitio" + +#: wp-includes/default-widgets.php:217 +msgid "A monthly archive of your site’s posts" +msgstr "Un archivo mensual de las entradas de tu sitio" + +#: wp-includes/default-widgets.php:174 +msgid "A search form for your site" +msgstr "Un formulario de búsqueda para tu sitio" + +#: wp-app.php:324 wp-app.php:365 +msgid "Sorry, you do not have the right to access this site." +msgstr "Lo sentimos, no tienes autorización para acceder a este sitio." + +#: wp-admin/users.php:332 +msgid "User removed from this site." +msgstr "Usuario eliminado de este sitio." + +#: wp-includes/pluggable.php:1260 +msgid "New user registration on your site %s:" +msgstr "Registrado un nuevo usuario en tu sitio %s:" + +#: wp-includes/user.php:102 +msgid "Site Suspended." +msgstr "Sitio suspendido." + +#: wp-includes/class-wp-xmlrpc-server.php:993 +#: wp-includes/class-wp-xmlrpc-server.php:1135 +#: wp-includes/class-wp-xmlrpc-server.php:1138 +#: wp-includes/class-wp-xmlrpc-server.php:1185 +#: wp-includes/class-wp-xmlrpc-server.php:1188 +msgid "You are not allowed to moderate comments on this site." +msgstr "No tienes autorización para moderar comentarios en este sitio." + +#: wp-includes/class-wp-xmlrpc-server.php:828 +msgid "Sorry, you must be able to edit posts on this site in order to view tags." +msgstr "Disculpa, para ver las etiquetas tienes que estar autorizado para editar entradas en este sitio." + +#: wp-includes/class-wp-xmlrpc-server.php:321 +msgid "Site Tagline" +msgstr "Descripción corta" + +#: wp-includes/class-wp-xmlrpc-server.php:304 +msgid "Site URL" +msgstr "URL del sitio" + +#: wp-admin/users.php:264 +msgid "Remove Users from Site" +msgstr "Eliminar usuarios del sitio" + +#: wp-includes/class-wp-xmlrpc-server.php:159 +#: wp-includes/class-wp-xmlrpc-server.php:181 +msgid "XML-RPC services are disabled on this site. An admin user can enable them at %s" +msgstr "El servicio XML-RPC está desactivado en este sitio. Un administrador puede activarlo en %s" + +#: wp-admin/includes/post.php:546 +msgid "You are not allowed to create posts or drafts on this site." +msgstr "No tienes autorización para crear entradas o borradores en este sitio." + +#: wp-admin/includes/plugin.php:401 +msgid "Custom site deleted message." +msgstr "Mensaje personalizado para sitios eliminados." + +#: wp-admin/includes/plugin.php:403 +msgid "Custom site suspended message." +msgstr "Mensaje personalizado para sitios suspendidos." + +#: wp-admin/includes/plugin.php:402 +msgid "Custom site inactive message." +msgstr "Mensaje personalizado para sitios inactivos." + +#: wp-admin/includes/meta-boxes.php:408 +msgid "Trackbacks are a way to notify legacy blog systems that you’ve linked to them. If you link other WordPress sites they’ll be notified automatically using pingbacks, no other action necessary." +msgstr "Los trackbacks son un modo de avisar a sistemas antiguos de que les has enlazado. Si enlazas a otros sitios creados con WordPress recibirán un aviso automático gracias a los pingbacks, sin tener que hacer nada." + +#: wp-admin/includes/post.php:544 +msgid "You are not allowed to create pages on this site." +msgstr "No tienes autorización para crear páginas en este sitio." + +#: wp-admin/includes/schema.php:200 +msgid "My Site" +msgstr "Mi sitio" + +#: wp-admin/install.php:133 +msgid "Allow my site to appear in search engines like Google and Technorati." +msgstr "Permitir que mi sitio aparezca en motores de búsqueda como Google y Technorati." + +#: wp-admin/includes/upgrade.php:337 +msgid "New WordPress Site" +msgstr "Nuevo sitio de WordPress" + +#: wp-admin/update.php:194 wp-admin/update.php:224 +msgid "You do not have sufficient permissions to install themes for this site." +msgstr "No tienes suficientes permisos para instalar temas en este sitio." + +#: wp-admin/update.php:93 wp-admin/update.php:124 +msgid "You do not have sufficient permissions to install plugins for this site." +msgstr "No tienes suficientes permisos para instalar plugins en este sitio." + +#: wp-admin/update.php:148 wp-admin/update.php:168 +msgid "You do not have sufficient permissions to update themes for this site." +msgstr "No tienes suficientes permisos para actualizar temas en este sitio." + +#: wp-admin/update.php:24 wp-admin/update.php:50 wp-admin/update.php:69 +msgid "You do not have sufficient permissions to update plugins for this site." +msgstr "No tienes suficientes permisos para actualizar plugins en este sitio." + +#: wp-includes/load.php:426 +msgid "The site you have requested is not installed properly. Please contact the system administrator." +msgstr "El sitio que has solicitado no está instalado correctamente. Por favor, ponte en contacto con el administrador del sistema." + +#: wp-admin/theme-install.php:16 +msgid "You do not have sufficient permissions to install themes on this site." +msgstr "No tienes suficientes permisos para instalar temas en este sitio." + +#: wp-admin/theme-editor.php:18 +msgid "You do not have sufficient permissions to edit templates for this site." +msgstr "No tienes suficientes permisos para editar las plantillas de este sitio." + +#: wp-admin/plugins.php:41 wp-admin/plugins.php:71 wp-admin/plugins.php:131 +msgid "You do not have sufficient permissions to activate plugins for this site." +msgstr "No tienes suficientes permisos para activar plugins en este sitio." + +#: wp-admin/plugin-install.php:16 +msgid "You do not have sufficient permissions to install plugins on this site." +msgstr "No tienes suficientes permisos para instalar plugins en este sitio." + +#: wp-admin/plugins.php:154 wp-admin/plugins.php:167 +msgid "You do not have sufficient permissions to deactivate plugins for this site." +msgstr "No tienes suficientes permisos para desactivar plugins en este sitio." + +#: wp-admin/plugins.php:190 +msgid "You do not have sufficient permissions to delete plugins for this site." +msgstr "No tienes suficientes permisos para eliminar plugins en este sitio." + +#: wp-admin/link-add.php:13 +msgid "You do not have sufficient permissions to add links to this site." +msgstr "No tienes suficientes permisos para añadir enlaces a este sitio." + +#: wp-admin/link-manager.php:12 wp-admin/link-manager.php:56 +#: wp-admin/link.php:18 +msgid "You do not have sufficient permissions to edit the links for this site." +msgstr "No tienes suficientes permisos para editar los enlaces en este sitio." + +#: wp-admin/export.php:13 +msgid "You do not have sufficient permissions to export the content of this site." +msgstr "No tienes suficientes permisos para exportar el contenido de este sitio." + +#: wp-admin/import.php:15 +msgid "You do not have sufficient permissions to import content in this site." +msgstr "No tienes suficientes permisos para importar contenidos en este sitio." + +#: wp-admin/import.php:58 +msgid "If you have posts or comments in another system, WordPress can import those into this site. To get started, choose a system to import from below:" +msgstr "Si tienes entradas o comentarios en otro sistema, WordPress los puede importar a este sitio. Para comenzar, elige el sistema desde el que los importarás:" + +#: wp-admin/plugin-editor.php:30 +msgid "There are no plugins installed on this site." +msgstr "No hay plugins instalados en este sitio." + +#: wp-admin/plugin-editor.php:18 +msgid "You do not have sufficient permissions to edit plugins for this site." +msgstr "No tienes suficientes permisos para editar los plugins de este sitio." + +#: wp-admin/includes/nav-menu.php:609 wp-admin/includes/nav-menu.php:828 +msgid "No items." +msgstr "Sin elementos." + +#: wp-admin/nav-menus.php:539 +msgid "Menu Name" +msgstr "Nombre del menú" + +#: wp-admin/includes/nav-menu.php:1143 +msgid "CSS Classes" +msgstr "Clases CSS" + +#: wp-admin/includes/nav-menu.php:134 +msgid "Navigation Label" +msgstr "Etiqueta de navegación" + +#: wp-includes/script-loader.php:441 +msgctxt "search results" +msgid "No results found." +msgstr "No se han encontrado resultados." + +#: wp-includes/nav-menu.php:226 wp-includes/nav-menu.php:233 +msgid "The menu name %s conflicts with another menu name. Please try another." +msgstr "El nombre de menú %s está creando un conflicto con otro nombre de menú. Por favor, selecciona otro nombre." + +#: wp-admin/includes/schema.php:774 +msgid "To use a subdomain configuration, you must have a wildcard entry in your DNS. This usually means adding a * hostname record pointing at your web server in your DNS configuration tool." +msgstr "Para hacer uso de la configuración en subdominios debes tener una entrada de registro wildcard en tu DNS. Normalmente esto se consigue añadiendo el registro * en tu nombre de servidor, apuntando a tu servidor o dominio en las herramientas de configuración de tu servidor o dominio." + +#: wp-admin/includes/schema.php:770 +msgid "The installer attempted to contact a random hostname (%1$s) on your domain." +msgstr "El instalador ha tratado de contactar con un servidor aleatorio (%1$s) en tu dominio." + +#: wp-admin/includes/nav-menu.php:387 +msgid "Custom Links" +msgstr "Enlaces personalizados" + +#: wp-includes/nav-menu.php:275 +msgid "The given object ID is not that of a menu item." +msgstr "El ID de objeto dado no es de un objeto de menú." + +#: wp-admin/install.php:108 +msgid "Usernames can have only alphanumeric characters, spaces, underscores, hyphens, periods and the @ symbol." +msgstr "Los nombres de usuario sólo pueden tener caracteres alfanuméricos, espacios, guiones bajos, guiones, puntos y el símbolo @." + +#: wp-admin/install.php:197 +msgid "the username you provided has invalid characters." +msgstr "el nombre de usuario proporcionado tiene caracteres inválidos." + +#: wp-admin/includes/nav-menu.php:114 +msgid "Move down" +msgstr "Mover abajo" + +#: wp-admin/nav-menus.php:237 +msgid "The menu item has been successfully deleted." +msgstr "La opción del menú se ha eliminado correctamente." + +#: wp-admin/includes/nav-menu.php:101 +msgid "Move up" +msgstr "Mover arriba" + +#: wp-admin/nav-menus.php:519 wp-admin/nav-menus.php:529 +msgid "Add menu" +msgstr "Añadir menú" + +#: wp-includes/formatting.php:2426 wp-includes/formatting.php:2434 +msgid "The email address entered did not appear to be a valid email address. Please enter a valid email address." +msgstr "La dirección de correo electrónico parece que no es válida. Por favor, introduce una válida." + +#: wp-includes/formatting.php:2517 +msgid "The WordPress address you entered did not appear to be a valid URL. Please enter a valid URL." +msgstr "La dirección de WordPress parece no ser una URL válida. Por favor, introduce una válida." + +#: wp-includes/formatting.php:2527 +msgid "The Site address you entered did not appear to be a valid URL. Please enter a valid URL." +msgstr "La dirección del sitio no parece ser una URL válida. Por favor, introduce una válida." + +#: wp-includes/taxonomy.php:2020 +msgid "A term with the name provided already exists with this parent." +msgstr "Un término con el nombre dado ya existe en este nivel." + +#: wp-admin/includes/class-wp-theme-install-list-table.php:98 +#: wp-admin/includes/class-wp-plugin-install-list-table.php:86 +msgid "Try again" +msgstr "Inténtalo de nuevo" + +#: wp-admin/includes/plugin-install.php:50 wp-admin/includes/theme.php:406 +msgid "An unknown error occurred." +msgstr "Ha ocurrido un error desconocido." + +#: wp-admin/includes/plugin-install.php:46 wp-admin/includes/theme.php:402 +msgid "An Unexpected HTTP Error occurred during the API request." +msgstr "Hubo un error HTTP inesperado durante la petición API." + +#: wp-admin/admin-ajax.php:866 +msgid "Please provide a custom field name." +msgstr "Por favor, proporciona un nombre al campo personalizado." + +#: wp-includes/locale.php:186 +msgid "number_format_decimal_point" +msgstr "," + +#: wp-includes/comment-template.php:1537 +msgid "Your email address will not be published." +msgstr "Tu dirección de correo electrónico no será publicada." + +#: wp-admin/custom-background.php:246 +msgid "Display Options" +msgstr "Opciones de visualización" + +#: wp-admin/custom-header.php:552 wp-admin/custom-background.php:209 +msgid "Remove Image" +msgstr "Eliminar Imagen" + +#: wp-admin/custom-header.php:502 wp-admin/custom-background.php:234 +msgid "Upload Image" +msgstr "Subir imagen" + +#: wp-admin/custom-background.php:295 +msgid "Background Color" +msgstr "Color de fondo" + +#: wp-admin/custom-background.php:253 +msgid "Background Position" +msgstr "Posición del fondo" + +#: wp-admin/users.php:265 +msgid "You have specified these users for removal:" +msgstr "Has especificado estos usuarios para ser eliminados:" + +#: wp-admin/users.php:91 wp-admin/users.php:138 +msgid "User deletion is not allowed from this screen." +msgstr "No está permitido eliminar usuarios desde esta pantalla." + +#: wp-admin/users.php:111 +msgid "You can’t delete that user." +msgstr "No puedes eliminar este usuario." + +#: wp-admin/users.php:273 +msgid "ID #%1s: %2s The current user will not be removed." +msgstr "ID #%1s: %2s El usuario actual no será eliminado." + +#: wp-admin/users.php:275 +msgid "ID #%1s: %2s You don't have permission to remove this user." +msgstr "ID #%1s: %2s No tienes permisos para eliminar este usuario." + +#: wp-admin/users.php:284 +msgid "Confirm Removal" +msgstr "Confirmar Eliminación" + +#: wp-admin/users.php:286 +msgid "There are no valid users selected for removal." +msgstr "No hay usuarios válidos seleccionados para su eliminación." + +#: wp-admin/users.php:335 +msgid "You can't remove the current user." +msgstr "No puedes eliminar el usuario actual." + +#: wp-admin/users.php:336 +msgid "Other users have been removed." +msgstr "Otros usuarios han sido eliminados." + +#: wp-admin/includes/class-wp-upgrader.php:1088 +msgid "%1$s updated successfully." +msgstr "%1$s actualizado correctamente." + +#: wp-admin/includes/class-wp-upgrader.php:1088 +msgid "Show Details" +msgstr "Mostrar detalles" + +#: wp-admin/includes/class-wp-upgrader.php:1088 +msgid "Hide Details" +msgstr "Ocultar detalles" + +#: wp-admin/install.php:194 +msgid "you must provide a valid username." +msgstr "debes proporcionar un nombre de usuario válido." + +#: wp-admin/includes/user.php:378 +msgid "Yes, take me to my profile page" +msgstr "Sí, llévame a mi página de perfil" + +#: wp-admin/includes/upgrade.php:74 +msgid "Your chosen password." +msgstr "Tu contraseña elegida." + +#: wp-admin/includes/user.php:379 +msgid "No thanks, do not remind me again" +msgstr "No gracias, no me lo recuerdes de nuevo" + +#: wp-admin/post.php:235 +msgid "You are not allowed to move this item out of the Trash." +msgstr "No te está permitido mover este elemento fuera de la Papelera." + +#: wp-admin/post.php:254 wp-admin/post.php:257 +msgid "Error in deleting." +msgstr "Error al eliminar." + +#: wp-admin/edit.php:97 wp-admin/post.php:238 +msgid "Error in restoring from Trash." +msgstr "Error al restaurar de la papelera." + +#: wp-admin/edit.php:94 +msgid "You are not allowed to restore this item from the Trash." +msgstr "No estás autorizado para restaurar este elemento de la papelera." + +#: wp-admin/edit.php:84 wp-admin/post.php:225 +msgid "Error in moving to Trash." +msgstr "Error moviendo a la papelera." + +#: wp-admin/edit-comments.php:189 +msgid "%s comment restored from the Trash" +msgid_plural "%s comments restored from the Trash" +msgstr[0] "%s comentario restaurado de la papelera" +msgstr[1] "%s comentarios restaurados de la papelera" + +#: wp-admin/edit-comments.php:185 +msgid "%s comment moved to the Trash." +msgid_plural "%s comments moved to the Trash." +msgstr[0] "%s comentario movido a la papelera." +msgstr[1] "%s comentarios movidos a la papelera." + +#: wp-admin/edit.php:81 wp-admin/post.php:222 +msgid "You are not allowed to move this item to the Trash." +msgstr "No te está permitido mover este elemento a la papelera." + +#: wp-admin/edit.php:228 +msgid "Item restored from the Trash." +msgid_plural "%s items restored from the Trash." +msgstr[0] "Elemento restaurado de la papelera." +msgstr[1] "%s elementos restaurados de la papelera." + +#: wp-admin/update-core.php:275 +msgid "The following themes have new versions available. Check the ones you want to update and then click “Update Themes”." +msgstr "Los siguientes temas tienen versiones nuevas disponibles. Marca aquellas que quieras actualizar y haz clic en “Actualizar Temas”." + +#: wp-includes/class-http.php:123 +msgid "A valid URL was not provided." +msgstr "No se ha facilitado una URL válida." + +#: wp-includes/comment-template.php:1536 +msgid "Logged in as %2$s. Log out?" +msgstr "Conectado como %2$s. ¿Quieres salir?" + +#: wp-admin/user-new.php:169 +msgid "User has been added to your site." +msgstr "El usuario ha sido añadido a tu sitio." + +#: wp-admin/user-new.php:172 +msgid "That user is already a member of this site." +msgstr "Este usuario ya es miembro de este sitio." + +#: wp-admin/user-new.php:166 +msgid "Invitation email sent to user. A confirmation link must be clicked for them to be added to your site." +msgstr "Invitación enviada por correo electrónico al usuario. Debe hacer clic en un enlace de confirmación para que se añada a tu sitio." + +#: wp-includes/media.php:419 +msgid "Could not calculate resized image dimensions" +msgstr "No se han podido recalcular las dimensiones de la imagen redimensionada" + +#: wp-includes/comment-template.php:726 +msgid "Use get_trackback_url() instead if you do not want the value echoed." +msgstr "Utiliza get_trackback_url() en su lugar si no quieres un valor vacío." + +#: wp-admin/update-core.php:203 +msgid "The following plugins have new versions available. Check the ones you want to update and then click “Update Plugins”." +msgstr "Hay nuevas versiones de los siguientes plugins. Marca aquellos que quieras actualizar y haz clic en “Actualizar plugins”." + +#: wp-mail.php:14 +msgid "This action has been disabled by the administrator." +msgstr "Esta acción ha sido deshabilitada por el administrador." + +#: wp-includes/author-template.php:55 +msgid "Use get_the_author() instead if you do not want the value echoed." +msgstr "Utiliza get_the_author() en su lugar si no quieres un valor vacío." + +#: wp-admin/options.php:140 +msgid "The %1$s setting is unregistered. Unregistered settings are deprecated. See http://codex.wordpress.org/Settings_API" +msgstr "La configuración %1$s no está registrada. Las configuraciones sin registrar son obsoletas. Visita http://codex.wordpress.org/Settings_API" + +#: wp-admin/custom-background.php:214 +msgid "This will remove the background image. You will not be able to restore any customizations." +msgstr "Esto eliminará la imagen de fondo. No podrás restaurar ninguna personalización." + +#: wp-admin/edit-tag-form.php:14 +msgid "You did not select an item for editing." +msgstr "No has elegido un elemento para editar." + +#: wp-admin/includes/class-wp-themes-list-table.php:88 +msgid "Only the current theme is available to you. Contact the %s administrator for information about accessing additional themes." +msgstr "Para ti sólo está disponible el tema actual. Contacta con el administrador de %s para obtener información sobre cómo acceder a temas adicionales." + +#: wp-admin/includes/dashboard.php:1154 +msgid "%2$sMB" +msgstr "%2$sMB" + +#: wp-admin/includes/dashboard.php:1162 +msgid "%2$sMB (%3$s%%)" +msgstr "%2$sMB (%3$s%%)" + +#: wp-admin/includes/file.php:22 +msgid "Author Template" +msgstr "Plantilla de autor" + +#: wp-admin/includes/file.php:13 +msgid "Visual Editor Stylesheet" +msgstr "Hoja de estilos del editor visual" + +#: wp-admin/includes/file.php:23 +msgid "Tag Template" +msgstr "Plantilla de etiqueta" + +#: wp-admin/update-core.php:276 +msgctxt "Link used in suggestion to use child themes in GUU" +msgid "http://codex.wordpress.org/Child_Themes" +msgstr "http://codex.wordpress.org/Child_Themes" + +#: wp-admin/edit-form-advanced.php:55 +msgid "Page saved." +msgstr "Página guardada." + +#: wp-admin/edit-form-advanced.php:239 wp-admin/includes/post.php:1845 +msgid "Enter title here" +msgstr "Introduce el título aquí" + +#: wp-admin/users.php:204 wp-admin/users.php:212 wp-admin/users.php:241 +#: wp-admin/users.php:249 +msgid "You can’t remove users." +msgstr "No puedes eliminar usuarios." + +#: wp-includes/script-loader.php:408 +msgid "Are you sure you want to install this plugin?" +msgstr "¿Estás seguro de querer instalar este plugin?" + +#: wp-admin/includes/class-wp-plugin-install-list-table.php:208 +msgid "This plugin is already installed and is up to date" +msgstr "Este plugin ya está instalado y actualizado" + +#: wp-admin/includes/class-wp-plugin-install-list-table.php:192 +msgid "More information about %s" +msgstr "Más información sobre %s" + +#: wp-admin/update-core.php:29 +#: wp-admin/includes/class-wp-plugin-install-list-table.php:204 +msgid "Update Now" +msgstr "Actualizar ahora" + +#: wp-admin/user-edit.php:266 +msgid "Grant this user super admin privileges for the Network." +msgstr "Dar permisos de super admin en la red a este usuario." + +#: wp-admin/user-edit.php:155 +msgid "Important:" +msgstr "Importante:" + +#: wp-admin/user-edit.php:155 +msgid "This user has super admin privileges." +msgstr "Este usuario tiene privilegios de super admin." + +#: wp-admin/includes/post.php:1238 +msgid "Remove featured image" +msgstr "Quitar la imagen destacada" + +#: wp-admin/includes/post.php:1225 wp-admin/includes/post.php:1226 +msgid "Set featured image" +msgstr "Establecer la imagen destacada" + +#: wp-includes/script-loader.php:431 wp-admin/includes/media.php:1338 +msgid "Use as featured image" +msgstr "Usar como imagen destacada" + +#: wp-admin/edit-form-advanced.php:127 +msgid "Featured Image" +msgstr "Imagen destacada" + +#: wp-admin/includes/class-wp-plugin-install-list-table.php:204 +msgid "Update to version %s" +msgstr "Actualizar a la versión %s" + +#: wp-admin/user-new.php:183 +msgid "User added." +msgstr "Usuario añadido." + +#: wp-includes/script-loader.php:265 wp-admin/install.php:258 +msgid "Mismatch" +msgstr "No coinciden" + +#: wp-admin/setup-config.php:163 +msgid "ERROR: \"Table Prefix\" can only contain numbers, letters, and underscores." +msgstr "ERROR: El \"Prefijo Tabla\" sólo puede contener números, letras y guiones bajos." + +#: wp-admin/press-this.php:540 +msgid "You cannot modify this Taxonomy." +msgstr "No puedes modificar esta taxonomía." + +#: wp-admin/custom-background.php:275 +msgid "Tile Vertically" +msgstr "Mosaico Vertical" + +#: wp-admin/custom-background.php:274 +msgid "Tile Horizontally" +msgstr "Mosaico Horizontal" + +#: wp-includes/load.php:173 +msgid "Maintenance" +msgstr "Mantenimiento" + +#: wp-includes/load.php:177 +msgid "Briefly unavailable for scheduled maintenance. Check back in a minute." +msgstr "No disponible por mantenimiento programado. Vuelve a comprobar el sitio en unos minutos." + +#: wp-admin/options-reading.php:108 +msgid "items" +msgstr "elementos" + +#: wp-admin/user-edit.php:238 +msgid "Usernames cannot be changed." +msgstr "El nombre de usuario no puede cambiarse." + +#: wp-includes/post.php:86 +msgid "Navigation Menu Items" +msgstr "Elementos del menú de navegación" + +#: wp-includes/post.php:87 +msgid "Navigation Menu Item" +msgstr "Elemento del menú de navegación" + +#: wp-includes/taxonomy.php:49 +msgid "Navigation Menus" +msgstr "Menús de navegación" + +#: wp-admin/nav-menus.php:385 +msgid "The %s menu has been updated." +msgstr "El menú %s se ha actualizado." + +#: wp-admin/nav-menus.php:256 +msgid "The menu has been successfully deleted." +msgstr "El menú se ha borrado con éxito." + +#: wp-includes/functions.php:1919 +msgid "One or more database tables are unavailable. The database may need to be repaired." +msgstr "Una tabla o más de la base de dato no están disponibles. La base de datos debe ser reparada." + +#: wp-admin/includes/dashboard.php:420 +msgid "Search Engines Blocked" +msgstr "Buscadores bloqueados" + +#: wp-admin/includes/dashboard.php:419 +msgid "Your site is asking search engines not to index its content" +msgstr "Tu sitio le está diciendo a los buscadores que no indexen su contenido." + +#: wp-admin/plugins.php:20 +msgid "You do not have sufficient permissions to manage plugins for this site." +msgstr "No tienes suficientes permisos para administrar los plugins de este sitio." + +#: wp-admin/options-general.php:101 +msgid "Enter the address here if you want your site homepage to be different from the directory you installed WordPress." +msgstr "Introduce la dirección de tu página de inicio si es diferente al directorio donde está instalado WordPress." + +#: wp-admin/options-discussion.php:162 +msgid "An avatar is an image that follows you from weblog to weblog appearing beside your name when you comment on avatar enabled sites. Here you can enable the display of avatars for people who comment on your site." +msgstr "Un avatar es una imagen que te sigue de sitio en sitio, apareciendo junto a tu nombre cuando comentas en una entrada si están activados los avatares en el sitio. Aquí puedes activar que se muestren los avatares de la gente que comente en tu sitio." + +#: wp-admin/options-general.php:99 +msgid "Site address (URL)" +msgstr "Dirección del sitio (URL)" + +#: wp-admin/options-general.php:91 +msgid "In a few words, explain what this site is about." +msgstr "En pocas palabras, explica de qué va este sitio." + +#: wp-admin/options-general.php:299 +msgid "Site language:" +msgstr "Idioma del sitio:" + +#: wp-admin/options-privacy.php:42 +msgid "I would like my site to be visible to everyone, including search engines (like Google, Bing, Technorati) and archivers" +msgstr "Quiero que mi sitio sea visible para todo el mundo, incluyendo buscadores (como Google, Bing, Technorati) y archivadores" + +#: wp-admin/options-privacy.php:39 wp-admin/options-privacy.php:40 +msgid "Site Visibility" +msgstr "Visibilidad del sitio" + +#: wp-admin/options-writing.php:165 +msgid "WordPress is not notifying any Update Services because of your site’s privacy settings." +msgstr "WordPress no está notificando a ningún Servicio de Actualizaciones por la configuración de privacidad." + +#: wp-admin/options-reading.php:121 +msgid "The character encoding of your site (UTF-8 is recommended, if you are adventurous there are some other encodings)" +msgstr "La codificación de caracteres de tu sitio (recomendamos UTF-8, pero si eres un aventurero, tienes otras codificaciones)" + +#: wp-admin/includes/template.php:1092 wp-admin/includes/template.php:1132 +#: wp-admin/includes/plugin.php:1602 wp-admin/includes/plugin.php:1625 +msgid "The miscellaneous options group has been removed. Use another settings group." +msgstr "Las opciones misceláneas de grupo se han eliminado. Usa otros ajustes de grupo." + +#: wp-links-opml.php:29 +msgid "Links for %s" +msgstr "Enlaces para %s" + +#: wp-includes/nav-menu.php:611 +msgid "Custom" +msgstr "Personalizado" + +#: wp-admin/includes/nav-menu.php:149 +msgid "New window or tab" +msgstr "Nueva ventana o pestaña" + +#: wp-admin/includes/nav-menu.php:169 +msgid "The description will be displayed in the menu if the current theme supports it." +msgstr "La descripción se mostrará en los menús si el tema actual lo soporta." + +#: wp-admin/includes/nav-menu.php:148 +msgid "Same window or tab" +msgstr "Misma ventana o pestaña" + +#: wp-includes/default-widgets.php:1094 +msgid "No menus have been created yet. Create some." +msgstr "Aún no se han creado menús. Crea alguno." + +#: wp-admin/options.php:117 +msgid "You do not have sufficient permissions to modify unregistered settings for this site." +msgstr "No tienes suficientes permisos para modificar ajustes no registrados para este sitio." + +#: wp-admin/options-general.php:130 +msgid "There is a pending change of the admin e-mail to %1$s. Cancel" +msgstr "Hay un cambio pendiente del correo electrónico del administrador a %1$s. Cancelar" + +#: wp-includes/script-loader.php:442 +msgid "" +"You are about to permanently delete this menu. \n" +" 'Cancel' to stop, 'OK' to delete." +msgstr "" +"Estás a punto de eliminar permanentemente este menú. \n" +"'Cancelar' para parar, 'OK' para eliminar." + +#: wp-admin/includes/nav-menu.php:140 +msgid "Title Attribute" +msgstr "Atributos del título" + +#: wp-admin/nav-menus.php:296 +msgid "The %s menu has been successfully created." +msgstr "El menú %s se ha creado correctamente." + +#: wp-admin/includes/nav-menu.php:146 wp-admin/includes/nav-menu.php:1142 +msgid "Link Target" +msgstr "Destino del enlace" + +#: wp-admin/includes/nav-menu.php:155 +msgid "CSS Classes (optional)" +msgstr "Clases CSS (opcional)" + +#: wp-admin/nav-menus.php:559 wp-admin/nav-menus.php:598 +msgid "Save Menu" +msgstr "Guardar menú" + +#: wp-admin/install.php:117 +msgid "A password will be automatically generated for you if you leave this blank." +msgstr "Se generará un password automático si lo dejas en blanco. " + +#: wp-admin/install.php:116 +msgid "Password, twice" +msgstr "Password, dos veces" + +#: wp-admin/includes/class-wp-upgrader.php:1220 +msgid "Updating Theme %1$s (%2$d/%3$d)" +msgstr "Actualizando tema %1$s (%2$d/%3$d)" + +#: wp-includes/link-template.php:2464 +msgid "This is the short link." +msgstr "Este es el enlace corto." + +#: wp-admin/options-discussion.php:42 +msgid "Attempt to notify any blogs linked to from the article." +msgstr "Tratar de avisar a los sitios enlazados desde el artículo." + +#: wp-admin/includes/schema.php:640 +msgid "You must provide a domain name." +msgstr "Debes facilitarnos un nombre de dominio." + +#: wp-admin/includes/schema.php:642 +msgid "You must provide a name for your network of sites." +msgstr "Debes facilitarnos un nombre para tu red de sitios." + +#: wp-admin/includes/schema.php:646 +msgid "The network already exists." +msgstr "La red ya existe." + +#: wp-admin/includes/schema.php:650 +msgid "You must provide a valid e-mail address." +msgstr "Debes facilitarnos una dirección de correo electrónico válida." + +#: wp-admin/includes/schema.php:772 +msgid "This resulted in an error message: %s" +msgstr "Esto ha dado como resultado un mensaje de error: %s" + +#: wp-admin/includes/schema.php:775 +msgid "You can still use your site but any subdomain you create may not be accessible. If you know your DNS is correct, ignore this message." +msgstr "Puedes continuar usando tu sitio, pero ningún subdominio que crees será accesible. Si sabes que tu configuración de DNS es correcta, ignora este mensaje." + +#: wp-admin/menu.php:223 +msgid "Delete Site" +msgstr "Eliminar sitio" + +#: wp-admin/includes/user.php:375 +msgid "Notice:" +msgstr "Aviso:" + +#: wp-admin/edit-form-advanced.php:247 +msgid "Get Shortlink" +msgstr "Obtener enlace corto" + +#: wp-includes/admin-bar.php:349 wp-admin/menu.php:57 +msgid "%d WordPress Update" +msgstr "%d Actualización WordPress" + +#: wp-includes/admin-bar.php:353 wp-admin/menu.php:61 +msgid "%d Theme Update" +msgid_plural "%d Theme Updates" +msgstr[0] "%d Actualización tema" +msgstr[1] "%d Actualizaciones temas" + +#: wp-includes/admin-bar.php:351 wp-admin/menu.php:59 +msgid "%d Plugin Update" +msgid_plural "%d Plugin Updates" +msgstr[0] "%d Actualización plugin" +msgstr[1] "%d Actualizaciones plugins" + +#: wp-admin/includes/class-wp-upgrader.php:1188 +msgid "Updating Plugin %1$s (%2$d/%3$d)" +msgstr "Actualizando plugin %1$s (%2$d/%3$d)" + +#: wp-admin/includes/class-wp-upgrader.php:1087 +msgid "The update of %1$s failed." +msgstr "La actualización de %1$s ha fallado." + +#: wp-admin/includes/upgrade.php:87 +msgid "The password you chose during the install." +msgstr "La contraseña que has elegido durante la instalación." + +#: wp-admin/includes/upgrade.php:77 +msgid "User already exists. Password inherited." +msgstr "El usuario ya existe. No se ha modificado la contraseña." + +#: wp-admin/install.php:201 +msgid "your passwords do not match. Please try again" +msgstr "Las contraseñas introducidas no coinciden. Por favor, prueba de nuevo" + +#: wp-includes/admin-bar.php:358 wp-admin/menu.php:67 +msgid "Updates %s" +msgstr "Actualizar %s" + +#: wp-admin/upgrade.php:70 wp-admin/update-core.php:50 +msgid "You cannot update because WordPress %1$s requires MySQL version %2$s or higher. You are running version %3$s." +msgstr "La actualización no puede instalarse porque WordPress %1$s requiere la versión %2$s o superior de MySQL. Estás usando la versión %3$s." + +#: wp-admin/update-core.php:364 +msgid "WordPress updated successfully" +msgstr "WordPress ha sido actualizado correctamente" + +#: wp-admin/update-core.php:345 +msgid "Update WordPress" +msgstr "Actualizar WordPress" + +#: wp-admin/update-core.php:206 wp-admin/update-core.php:258 +#: wp-admin/update-core.php:464 wp-admin/update-core.php:469 +#: wp-admin/plugins.php:111 +msgid "Update Plugins" +msgstr "Actualizar plugins" + +#: wp-admin/upgrade.php:68 wp-admin/update-core.php:48 +msgid "You cannot update because WordPress %1$s requires PHP version %2$s or higher. You are running version %3$s." +msgstr "La actualización no puede instalarse ya que WordPress %1$s requiere la versión %2$s o superior de PHP. Estás usando la versión %3$s." + +#: wp-admin/upgrade.php:66 wp-admin/update-core.php:46 +msgid "You cannot update because WordPress %1$s requires PHP version %2$s or higher and MySQL version %3$s or higher. You are running PHP version %4$s and MySQL version %5$s." +msgstr "No puedes instalar a causa de que WordPress %1$s requiere la versión %2$s o superior de PHP y la versión %3$s o superior de MySQL. Estás usando la versión %4$s de PHP y la versión %5$s de MySQL." + +#: wp-admin/update-core.php:35 +msgid "You are using a development version of WordPress. You can update to the latest nightly build automatically or download the nightly build and install it manually:" +msgstr "Estás utilizando una versión en desarrollo de WordPress. Puedes actualizar a la última versión de desarrollo automáticamente o descargarla para instalarla manualmente:" + +#: wp-admin/update-core.php:39 +msgid "You have the latest version of WordPress. You do not need to update. However, if you want to re-install version %s, you can do so automatically or download the package and re-install manually:" +msgstr "Tienes la última versión de WordPress. No necesitas actualizar. No obstante, si quieres reinstalar la versión %s, puedes hacerlo automáticamente o descargarla para reinstalarla manualmente:" + +#: wp-admin/update-core.php:132 wp-admin/update-core.php:405 +msgid "WordPress Updates" +msgstr "Actualizaciones de WordPress" + +#: wp-admin/user-edit.php:263 +msgid "Super Admin" +msgstr "Súper Admin" + +#: wp-admin/custom-header.php:592 wp-admin/custom-background.php:298 +msgid "Select a Color" +msgstr "Elige un color" + +#: wp-admin/options-general.php:13 wp-admin/options-discussion.php:13 +#: wp-admin/options-privacy.php:13 wp-admin/options-media.php:13 +#: wp-admin/options-writing.php:13 wp-admin/options-reading.php:13 +#: wp-admin/options-permalink.php:13 +msgid "You do not have sufficient permissions to manage options for this site." +msgstr "No tienes suficientes permisos para administrar las opciones de este sitio." + +#: wp-admin/edit.php:17 wp-admin/post-new.php:17 +#: wp-admin/includes/class-wp-posts-list-table.php:56 +msgid "Invalid post type" +msgstr "Tipo de entrada no válido." + +#: wp-admin/includes/nav-menu.php:116 wp-admin/includes/nav-menu.php:118 +msgid "Edit Menu Item" +msgstr "Editar elemento del menú" + +#: wp-includes/script-loader.php:240 +msgid "File canceled." +msgstr "Archivo cancelado." + +#: wp-includes/load.php:22 +msgid "GLOBALS overwrite attempt detected" +msgstr "Detectado intento GLOBAL de sobrescritura." + +#: wp-admin/options-general.php:125 +msgid "This address is used for admin purposes. If you change this we will send you an e-mail at your new address to confirm it. The new address will not become active until confirmed." +msgstr "Esta dirección de correo electrónico se usa para propósitos administrativos. Si la cambias, te enviaremos un correo electrónico a tu nueva dirección para confirmarla. La nueva dirección no se activará hasta ser confirmada." + +#: wp-admin/options-general.php:202 +msgid "Daylight saving time begins on: %s." +msgstr "El horario de verano comienza el: %s." + +#: wp-admin/plugins.php:259 +msgid "%1$s by %2$s (will also delete its data)" +msgstr "%1$s por %2$s (también elimina sus propios datos)" + +#: wp-admin/plugins.php:252 +msgid "You are about to remove the following plugin:" +msgid_plural "You are about to remove the following plugins:" +msgstr[0] "Estás a punto de eliminar el siguiente plugin:" +msgstr[1] "Estás a punto de eliminar los siguientes plugins:" + +#: wp-admin/plugins.php:247 +msgid "Delete Plugin" +msgid_plural "Delete Plugins" +msgstr[0] "Eliminar Plugin" +msgstr[1] "Eliminar Plugins" + +#: wp-admin/plugins.php:270 +msgid "Are you sure you wish to delete these files and data?" +msgstr "¿Estás seguro de que deseas eliminar estos archivos y datos?" + +#: wp-admin/plugins.php:282 +msgid "Yes, Delete these files and data" +msgstr "Sí, quiero borrar estos archivos y datos" + +#: wp-admin/includes/class-wp-plugins-list-table.php:351 +msgid "Requires %s in wp-config.php." +msgstr "Requiere %s en wp-config.php." + +#: wp-admin/includes/class-wp-plugins-list-table.php:351 +msgid "Inactive:" +msgstr "Inactivo:" + +#: wp-admin/includes/class-wp-plugins-list-table.php:227 +msgid "Must-Use (%s)" +msgid_plural "Must-Use (%s)" +msgstr[0] "Debes Usar (%s)" +msgstr[1] "Debes Usar (%s)" + +#: wp-admin/theme-install.php:59 +msgctxt "theme" +msgid "Manage Themes" +msgstr "Administrar temas" + +#: wp-admin/themes.php:76 +msgctxt "theme" +msgid "Install Themes" +msgstr "Instalar temas" + +#: wp-admin/update-core.php:365 +msgid "Go to Dashboard" +msgstr "Ir al Escritorio" + +#: wp-includes/default-widgets.php:1103 wp-admin/nav-menus.php:487 +msgid "Select Menu:" +msgstr "Elegir menú:" + +#: wp-includes/taxonomy.php:50 +msgid "Navigation Menu" +msgstr "Menú de Navegación" + +#: wp-includes/default-widgets.php:1028 +msgid "Taxonomy:" +msgstr "Taxonomía:" + +#: wp-admin/nav-menus.php:299 wp-admin/nav-menus.php:309 +msgid "Please enter a valid menu name." +msgstr "Por favor, introduce un nombre de menú válido." + +#: wp-admin/nav-menus.php:564 +msgid "Delete Menu" +msgstr "Eliminar menú" + +#: wp-admin/includes/nav-menu.php:558 +msgid "Menu Item" +msgstr "Elemento del menú" + +#: wp-admin/includes/nav-menu.php:665 wp-admin/includes/nav-menu.php:879 +msgid "View All" +msgstr "Ver todo" + +#: wp-admin/includes/nav-menu.php:565 wp-admin/includes/nav-menu.php:786 +#: wp-admin/includes/nav-menu.php:963 +msgid "Add to Menu" +msgstr "Añadir al menú" + +#: wp-admin/options-general.php:179 +msgid "This timezone is currently in daylight saving time." +msgstr "Esta zona horaria se encuentra actualmente en el horario de verano." + +#: wp-admin/options-general.php:207 +msgid "This timezone does not observe daylight saving time." +msgstr "Esta zona horaria no tiene en cuenta el horario de verano." + +#: wp-admin/includes/class-wp-plugins-list-table.php:230 +msgid "Drop-ins (%s)" +msgid_plural "Drop-ins (%s)" +msgstr[0] "Infiltrado (%s)" +msgstr[1] "Infiltrados (%s)" + +#: wp-admin/includes/plugin.php:400 +msgid "Executed before Multisite is loaded." +msgstr "Ejecutado antes de cargar el Multisitio." + +#: wp-admin/includes/plugin.php:396 +msgid "External object cache." +msgstr "Caché de objetos externos." + +#: wp-admin/includes/plugin.php:395 +msgid "Custom maintenance message." +msgstr "Mensaje personalizado de mantenimiento." + +#: wp-admin/includes/plugin.php:394 +msgid "Custom install script." +msgstr "Script personalizado de instalación." + +#: wp-admin/includes/plugin.php:393 +msgid "Custom database error message." +msgstr "Mensaje de error de base de datos personalizado." + +#: wp-admin/includes/file.php:288 +msgid "File is empty. Please upload something more substantial." +msgstr "El archivo está vacío. Por favor, sube algo con más sustancia." + +#: wp-admin/includes/class-wp-plugin-install-list-table.php:200 +msgid "Install %s" +msgstr "Instalar %s" + +#: wp-admin/includes/plugin.php:392 +msgid "Custom database class." +msgstr "Clase de base datos personalizada." + +#: wp-admin/includes/plugin.php:391 +msgid "Advanced caching plugin." +msgstr "Plugin avanzado de caché." + +#: wp-admin/install.php:157 +msgid "You cannot install because WordPress %1$s requires MySQL version %2$s or higher. You are running version %3$s." +msgstr "No puedes instalar porque WordPress %1$s requiere la versión %2$s o superior de MySQL. Estás usando la versión %3$s." + +#: wp-admin/install.php:155 +msgid "You cannot install because WordPress %1$s requires PHP version %2$s or higher. You are running version %3$s." +msgstr "No puedes instalar porque WordPress %1$s requiere la versión %2$s o superior de PHP. Estás usando la versión %3$s." + +#: wp-admin/includes/update.php:135 +msgid "WordPress %1$s is available! Please notify the site administrator." +msgstr "¡WordPress %1$s está disponible! Por favor, avisa al administrador del sitio." + +#: wp-admin/includes/update.php:133 +msgid "WordPress %1$s is available! Please update now." +msgstr "¡WordPress %1$s está disponible! Por favor, actualiza ahora." + +#: wp-admin/install.php:153 +msgid "You cannot install because WordPress %1$s requires PHP version %2$s or higher and MySQL version %3$s or higher. You are running PHP version %4$s and MySQL version %5$s." +msgstr "No puedes instalar ya que WordPress %1$s requiere la versión %2$s o superior de PHP y la versión %3$s o superior de MySQL. Estás usando la versión %4$s de PHP y la versión %5$s de MySQL." + +#: wp-includes/admin-bar.php:311 wp-admin/menu.php:161 wp-admin/menu.php:166 +#: wp-admin/nav-menus.php:466 +msgid "Menus" +msgstr "Menús" + +#: wp-admin/comment.php:141 +msgid "This comment is currently marked as spam." +msgstr "Este comentario está marcado como spam." + +#: wp-admin/comment.php:80 +msgid "Moderate Comment" +msgstr "Comentario moderado" + +#: wp-admin/comment.php:138 +msgid "This comment is currently approved." +msgstr "Este comentario está aprobado." + +#: wp-admin/edit-comments.php:197 +msgid "This comment is already approved." +msgstr "Este comentario ya está aprobado." + +#: wp-admin/comment.php:144 +msgid "This comment is currently in the Trash." +msgstr "Este comentario está actualmente en la papelera." + +#: wp-admin/custom-background.php:270 +msgid "Repeat" +msgstr "Repetir" + +#: wp-admin/custom-background.php:280 +msgid "Attachment" +msgstr "Adjunto" + +#: wp-admin/custom-background.php:273 +msgid "Tile" +msgstr "Mosaico" + +#: wp-admin/custom-background.php:284 +msgid "Scroll" +msgstr "Desplazar" + +#: wp-admin/custom-background.php:288 +msgid "Fixed" +msgstr "Fijo" + +#: wp-admin/edit-comments.php:200 +msgid "This comment is already in the Trash." +msgstr "Este comentario ya está en la papelera." + +#: wp-admin/edit-comments.php:200 +msgid "View Trash" +msgstr "Ver papelera" + +#: wp-admin/edit-comments.php:203 +msgid "This comment is already marked as spam." +msgstr "Este comentario ya ha sido marcado como spam." + +#: wp-includes/class-wp-xmlrpc-server.php:164 +#: wp-includes/class-wp-xmlrpc-server.php:188 +msgid "Bad login/pass combination." +msgstr "Combinación de usuario/contraseña errónea." + +#: wp-includes/class-wp-xmlrpc-server.php:294 +msgid "Software Name" +msgstr "Nombre de la aplicación" + +#: wp-includes/class-wp-xmlrpc-server.php:299 +msgid "Software Version" +msgstr "Versión de la aplicación" + +#: wp-includes/class-wp-xmlrpc-server.php:311 +msgid "Time Zone" +msgstr "Zona horaria" + +#: wp-includes/class-wp-xmlrpc-server.php:336 +msgid "Allow new users to sign up" +msgstr "Permitir el registro de nuevos usuarios" + +#: wp-includes/class-wp-xmlrpc-server.php:465 +msgid "Sorry, you cannot edit this page." +msgstr "Disculpa, no puedes editar esta página." + +#: wp-includes/class-wp-xmlrpc-server.php:541 +#: wp-includes/class-wp-xmlrpc-server.php:651 +#: wp-includes/class-wp-xmlrpc-server.php:690 +msgid "Sorry, no such page." +msgstr "Disculpa, no existe esa página." + +#: wp-includes/class-wp-xmlrpc-server.php:569 +#: wp-includes/class-wp-xmlrpc-server.php:733 +msgid "Sorry, you cannot edit pages." +msgstr "Disculpa, no puedes editar páginas." + +#: wp-includes/class-wp-xmlrpc-server.php:617 +msgid "Sorry, you cannot add new pages." +msgstr "Disculpa, no puedes añadir nuevas páginas." + +#: wp-includes/class-wp-xmlrpc-server.php:655 +msgid "Sorry, you do not have the right to delete this page." +msgstr "Disculpa, no tienes autorización para borrar esta página." + +#: wp-includes/class-wp-xmlrpc-server.php:660 +msgid "Failed to delete the page." +msgstr "No se logró borrar la página." + +#: wp-includes/class-wp-xmlrpc-server.php:694 +msgid "Sorry, you do not have the right to edit this page." +msgstr "Disculpa, no tienes autorización para editar esta página." + +#: wp-includes/class-wp-xmlrpc-server.php:873 +msgid "Sorry, you do not have the right to add a category." +msgstr "Disculpa, no tienes autorización para añadir categorías." + +#: wp-includes/class-wp-xmlrpc-server.php:901 +#: wp-includes/class-wp-xmlrpc-server.php:903 +msgid "Sorry, the new category failed." +msgstr "Disculpa, la creación de la nueva categoría falló." + +#: wp-includes/class-wp-xmlrpc-server.php:931 +msgid "Sorry, you do not have the right to delete a category." +msgstr "Disculpa, no tienes autorización para borrar categorías." + +#: wp-includes/class-wp-xmlrpc-server.php:998 +#: wp-includes/class-wp-xmlrpc-server.php:1143 +#: wp-includes/class-wp-xmlrpc-server.php:1193 +msgid "Invalid comment ID." +msgstr "El ID del comentario no es válido." + +#: wp-includes/class-wp-xmlrpc-server.php:1067 +msgid "Sorry, you cannot edit comments." +msgstr "Disculpa, no puedes editar comentarios." + +#: wp-includes/class-wp-xmlrpc-server.php:1200 +msgid "Invalid comment status." +msgstr "El estado del comentario no es válido." + +#: wp-includes/class-wp-xmlrpc-server.php:1231 +msgid "Sorry, the comment could not be edited. Something wrong happened." +msgstr "Disculpa, no se ha podido editar el comentario. Se ha producido un error." + +#: wp-includes/class-wp-xmlrpc-server.php:1262 +msgid "You must be registered to comment" +msgstr "Los usuarios deben registrarse e identificarse para comentar" + +#: wp-includes/class-wp-xmlrpc-server.php:1275 +#: wp-includes/class-wp-xmlrpc-server.php:1278 +#: wp-includes/class-wp-xmlrpc-server.php:2549 +msgid "Invalid post ID." +msgstr "El ID de la entrada no es válido." + +#: wp-includes/class-wp-xmlrpc-server.php:1304 +msgid "Comment author name and email are required" +msgstr "El nombre y correo electrónico del autor del comentario son campos necesarios" + +#: wp-includes/class-wp-xmlrpc-server.php:1306 +msgid "A valid email address is required" +msgstr "Se necesita un correo electrónico válido" + +#: wp-includes/class-wp-xmlrpc-server.php:1365 +msgid "You are not allowed access to details about comments." +msgstr "No tienes autorización para ver los detalles de los comentarios." + +#: wp-includes/class-wp-xmlrpc-server.php:1527 +msgid "You are not allowed to update options." +msgstr "No tienes autorización para actualizar las opciones." + +#: wp-includes/class-wp-xmlrpc-server.php:1831 +#: wp-includes/class-wp-xmlrpc-server.php:2770 +#: wp-includes/class-wp-xmlrpc-server.php:3273 +msgid "Sorry, you cannot edit this post." +msgstr "Disculpa, no puedes editar esta entrada." + +#: wp-includes/class-wp-xmlrpc-server.php:1882 +#: wp-includes/class-wp-xmlrpc-server.php:3138 +msgid "Either there are no posts, or something went wrong." +msgstr "Una de dos, o no hay entradas o algo fue mal." + +#: wp-includes/class-wp-xmlrpc-server.php:1937 +msgid "Sorry, this user can not edit the template." +msgstr "Disculpa, este usuario no puede editar la plantilla." + +#: wp-includes/class-wp-xmlrpc-server.php:1977 +msgid "Sorry, this user cannot edit the template." +msgstr "Disculpa, este usuario no puede editar la plantilla." + +#: wp-includes/class-wp-xmlrpc-server.php:1987 +msgid "Either the file is not writable, or something wrong happened. The file has not been updated." +msgstr "Una de dos, o el archivo no tiene permisos de escritura, o ha ocurrido algún error. El archivo no ha sido actualizado." + +#: wp-includes/class-wp-xmlrpc-server.php:2073 +#: wp-includes/class-wp-xmlrpc-server.php:2125 +#: wp-includes/class-wp-xmlrpc-server.php:2865 +#: wp-includes/class-wp-xmlrpc-server.php:3335 +msgid "Sorry, no such post." +msgstr "Disculpa, no existe la entrada." + +#: wp-includes/class-wp-xmlrpc-server.php:2083 +#: wp-includes/class-wp-xmlrpc-server.php:2686 +msgid "Sorry, you do not have the right to publish this post." +msgstr "Disculpa, no tienes autorización para publicar esta entrada." + +#: wp-includes/class-wp-xmlrpc-server.php:2214 +#: wp-includes/class-wp-xmlrpc-server.php:2270 +#: wp-includes/class-wp-xmlrpc-server.php:2521 +#: wp-includes/class-wp-xmlrpc-server.php:2586 +msgid "Invalid post type." +msgstr "Tipo de entrada no válido." + +#: wp-includes/class-wp-xmlrpc-server.php:2263 +msgid "You are not allowed to post as this user" +msgstr "No tienes autorización para publicar entradas con este nombre de usuario." + +#: wp-includes/class-wp-xmlrpc-server.php:2267 +msgid "You are not allowed to create pages as this user" +msgstr "No tienes autorización para crear páginas con este nombre de usuario." + +#: wp-includes/class-wp-xmlrpc-server.php:2579 +msgid "You are not allowed to change the post author as this user." +msgstr "No tienes autorización para cambiar el autor de la entrada identificado con este nombre de usuario." + +#: wp-includes/class-wp-xmlrpc-server.php:2583 +msgid "You are not allowed to change the page author as this user." +msgstr "No tienes autorización para cambiar el autor de la página identificado con este nombre de usuario." + +#: wp-includes/class-wp-xmlrpc-server.php:2684 +msgid "Sorry, you do not have the right to publish this page." +msgstr "Disculpa, no tienes autorización para publicar esta página." + +#: wp-includes/class-wp-xmlrpc-server.php:2721 +msgid "Sorry, your entry could not be edited. Something wrong happened." +msgstr "Disculpa, no se pudo editar tu entrada. Ocurrió algún error." + +#: wp-includes/class-wp-xmlrpc-server.php:1576 +#: wp-includes/class-wp-xmlrpc-server.php:3056 +msgid "You are not allowed to upload files to this site." +msgstr "No tienes autorización para subir archivos al sitio." + +#: wp-includes/class-wp-xmlrpc-server.php:3083 +msgid "Could not write file %1$s (%2$s)" +msgstr "No se pudo escribir el archivo %1$s (%2$s)" + +#: wp-includes/class-wp-xmlrpc-server.php:3230 +msgid "Sorry, you can not edit this post." +msgstr "Disculpa, no puedes editar esta entrada." + +#: wp-includes/class-wp-xmlrpc-server.php:3427 +msgid "Is there no link to us?" +msgstr "¿No hay enlace hacia nosotros?" + +#: wp-includes/class-wp-xmlrpc-server.php:3467 +#: wp-includes/class-wp-xmlrpc-server.php:3477 +#: wp-includes/class-wp-xmlrpc-server.php:3484 +#: wp-includes/class-wp-xmlrpc-server.php:3591 +msgid "The specified target URL cannot be used as a target. It either doesn’t exist, or it is not a pingback-enabled resource." +msgstr "La URL especificada no puede utilizarse como destino. O bien no existe o no está habilitado para pingbacks." + +#: wp-includes/class-wp-xmlrpc-server.php:3480 +msgid "The source URL and the target URL cannot both point to the same resource." +msgstr "La URL de origen y la URL de destino no pueden apuntar ambas al mismo recurso." + +#: wp-includes/class-wp-xmlrpc-server.php:3488 +msgid "The pingback has already been registered." +msgstr "El pingback ya ha sido registrado." + +#: wp-includes/class-wp-xmlrpc-server.php:3496 +msgid "The source URL does not exist." +msgstr "La URL de origen no existe." + +#: wp-includes/class-wp-xmlrpc-server.php:3508 +msgid "We cannot find a title on that page." +msgstr "No podemos encontrar un título en esa página." + +#: wp-includes/class-wp-xmlrpc-server.php:3544 +msgid "The source URL does not contain a link to the target URL, and so cannot be used as a source." +msgstr "La URL de origen no contiene un enlace a la URL de destino, así que no puede ser usada como origen." + +#: wp-includes/class-wp-xmlrpc-server.php:3565 +msgid "Pingback from %1$s to %2$s registered. Keep the web talking! :-)" +msgstr "Pingback desde %1$s a %2$s registrado. ¡Haz que la web hable! :-)" + +#: wp-includes/class-wp-xmlrpc-server.php:3598 +msgid "The specified target URL does not exist." +msgstr "La URL de destino especificada no existe." + +#: wp-includes/load.php:115 +msgid "Your PHP installation appears to be missing the MySQL extension which is required by WordPress." +msgstr "Parece que tu instalación de PHP no cuenta con la extensión de MySQL, necesaria para hacer funcionar WordPress." + +#: wp-includes/load.php:369 +msgid "ERROR: $table_prefix in wp-config.php can only contain numbers, letters, and underscores." +msgstr "ERROR: $table_prefix en wp-config.php sólo puede contener números, letras y guiones bajos." + +#: wp-includes/wp-db.php:1032 +msgid "" +"\n" +"

    Error establishing a database connection

    \n" +"

    This either means that the username and password information in your wp-config.php file is incorrect or we can't contact the database server at %s. This could mean your host's database server is down.

    \n" +"
      \n" +"\t
    • Are you sure you have the correct username and password?
    • \n" +"\t
    • Are you sure that you have typed the correct hostname?
    • \n" +"\t
    • Are you sure that the database server is running?
    • \n" +"
    \n" +"

    If you're unsure what these terms mean you should probably contact your host. If you still need help you can always visit the WordPress Support Forums.

    \n" +msgstr "" +"\n" +"

    Error de conexión con la base de datos

    \n" +"

    Esto puede deberse a que los datos de usuario y contraseña de tu wp-config.php son incorrectos o a que no es posible contactar con el servidor de base de datos en %s, lo que podría significar que el servidor de bases de datos de tu host está inactivo.

    \n" +"
      \n" +"\t
    • ¿Estás seguro de que el nombre de usuario y la contraseña son correctos?
    • \n" +"\t
    • ¿Estás seguro de que el nombre del host es correcto?
    • \n" +"\t
    • ¿Estás seguro de que el servidor de bases de datos está activo?
    • \n" +"
    \n" +"

    Si no tienes muy claro lo que significan los términos anteriores, ponte en contacto con tu proveedor de alojamiento. Si necesitas más ayuda, puedes visitar los Foros de ayuda de WordPress.

    \n" + +#: wp-includes/wp-db.php:563 +msgid "Invalid database prefix" +msgstr "Prefijo de la base de datos no válido" + +#: wp-includes/wp-db.php:913 +msgid "WordPress database error %1$s for query %2$s made by %3$s" +msgstr "Error %1$s de la base de datos de WordPress para la consulta %2$s realizada por %3$s" + +#: wp-includes/wp-db.php:915 +msgid "WordPress database error %1$s for query %2$s" +msgstr "Error %1$s de la base de datos de WordPress para la consulta %2$s" + +#: wp-includes/wp-db.php:1311 +msgid " $db->get_row(string query, output type, int offset) -- Output type must be one of: OBJECT, ARRAY_A, ARRAY_N" +msgstr " $db->get_row(string query, output type, int offset) -- El tipo de salida (output) debe ser uno de estos: OBJECT, ARRAY_A, ARRAY_N" + +#: wp-load.php:55 +msgid "ltr" +msgstr "ltr" + +#: wp-load.php:56 +msgid "There doesn't seem to be a wp-config.php file. I need this before we can get started. Need more help? We got it. You can create a wp-config.php file through a web interface, but this doesn't work for all server setups. The safest way is to manually create the file.

    Create a Configuration File" +msgstr "Aparentemente falta el archivo wp-config.php. Este archivo es necesario para empezar. ¿Necesitas ayuda? La encontrarás aquí (en inglés). Puedes crear un archivo wp-config.php a través de la web, pero esto no funciona en algunos servidores. Lo más seguro es crear el archivo manualmente.

    Crear un archivo de configuración" + +#: wp-includes/comment-template.php:1543 +msgid "Cancel reply" +msgstr "Cancelar respuesta" + +#: wp-includes/comment-template.php:1544 +msgid "Post Comment" +msgstr "Publicar comentario" + +#: wp-includes/comment.php:387 +msgid "Unapproved" +msgstr "Rechazado" + +#: wp-includes/comment.php:628 wp-includes/comment.php:630 +msgid "Duplicate comment detected; it looks as though you’ve already said that!" +msgstr "Comentario duplicado: ¡parece que ya había sido enviado antes!" + +#: wp-includes/comment.php:688 wp-includes/comment.php:690 +msgid "You are posting comments too quickly. Slow down." +msgstr "Estás enviando comentarios a demasiada velocidad. Un poco de calma." + +#: wp-includes/comment.php:1412 +msgid "Could not update comment status" +msgstr "No ha sido posible actualizar el estado del comentario" + +#: wp-includes/cron.php:159 +msgid "This argument has changed to an array to match the behavior of the other cron functions." +msgstr "Este argumento ha cambiado a un array para que coincida con el comportamiento de otras funciones de cron." + +#: wp-includes/cron.php:314 +msgid "Once Hourly" +msgstr "Cada hora" + +#: wp-includes/cron.php:315 +msgid "Twice Daily" +msgstr "Dos veces al día" + +#: wp-includes/cron.php:316 +msgid "Once Daily" +msgstr "Cada día" + +#: wp-includes/default-widgets.php:68 +msgid "Sort by:" +msgstr "Ordenar por:" + +#: wp-includes/default-widgets.php:70 +msgid "Page title" +msgstr "Título de la página" + +#: wp-includes/default-widgets.php:71 +msgid "Page order" +msgstr "Orden de la página" + +#: wp-includes/default-widgets.php:72 +msgid "Page ID" +msgstr "ID de la página" + +#: wp-includes/default-widgets.php:76 +msgid "Exclude:" +msgstr "Excluir:" + +#: wp-includes/default-widgets.php:78 +msgid "Page IDs, separated by commas." +msgstr "IDs de página, separados por comas." + +#: wp-includes/default-widgets.php:93 +msgid "Your blogroll" +msgstr "Tus sitios de interés" + +#: wp-includes/default-widgets.php:108 wp-includes/default-widgets.php:143 +#: wp-admin/menu.php:94 +msgid "All Links" +msgstr "Todos los enlaces" + +#: wp-includes/default-widgets.php:141 +msgid "Select Link Category" +msgstr "Elige la categoría del enlace" + +#: wp-includes/default-widgets.php:154 +msgid "Show Link Image" +msgstr "Mostrar la imagen del enlace" + +#: wp-includes/default-widgets.php:156 +msgid "Show Link Name" +msgstr "Mostrar el nombre del enlace" + +#: wp-includes/default-widgets.php:158 +msgid "Show Link Description" +msgstr "Mostrar la descripción del enlace" + +#: wp-includes/default-widgets.php:160 +msgid "Show Link Rating" +msgstr "Mostrar la clasificación del enlace" + +#: wp-includes/default-widgets.php:233 +msgid "Select Month" +msgstr "Elegir mes" + +#: wp-includes/default-widgets.php:266 wp-includes/default-widgets.php:496 +msgid "Show post counts" +msgstr "Mostrar la cantidad de entradas" + +#: wp-includes/default-widgets.php:282 +msgid "Log in/out, admin, feed and WordPress links" +msgstr "Inicio/Cierre de sesión, administración, RSS y enlaces de WordPress" + +#: wp-includes/default-widgets.php:297 +msgid "Syndicate this site using RSS 2.0" +msgstr "Suscribirse a este sitio usando RSS 2.0" + +#: wp-includes/default-widgets.php:297 +msgid "Entries RSS" +msgstr "RSS de las entradas" + +#: wp-includes/default-widgets.php:331 +msgid "Calendar" +msgstr "Calendario" + +#: wp-includes/default-widgets.php:371 +msgid "Arbitrary text or HTML" +msgstr "Texto o HTML arbitrario" + +#: wp-includes/default-widgets.php:373 +msgid "Text" +msgstr "Texto" + +#: wp-includes/default-widgets.php:408 +msgid "Automatically add paragraphs" +msgstr "Añadir automáticamente parágrafos" + +#: wp-includes/default-widgets.php:421 +msgid "A list or dropdown of categories" +msgstr "Una lista o desplegable de categorías" + +#: wp-includes/default-widgets.php:440 +msgid "Select Category" +msgstr "Elegir categoría" + +#: wp-includes/default-widgets.php:499 +msgid "Show hierarchy" +msgstr "Mostrar jerarquía" + +#: wp-includes/default-widgets.php:514 wp-includes/default-widgets.php:536 +msgid "Recent Posts" +msgstr "Entradas recientes" + +#: wp-includes/default-widgets.php:585 +msgid "Number of posts to show:" +msgstr "Número de entradas a mostrar:" + +#: wp-includes/default-widgets.php:599 +msgid "The most recent comments" +msgstr "Los comentarios más recientes" + +#: wp-includes/default-widgets.php:651 +msgctxt "widgets" +msgid "%1$s on %2$s" +msgstr "%1$s en %2$s" + +#: wp-includes/default-widgets.php:696 +msgid "Entries from any RSS or Atom feed" +msgstr "Entradas desde cualquier feed RSS o Atom" + +#: wp-includes/default-widgets.php:740 +msgid "Syndicate this content" +msgstr "Sindicar este contenido" + +#: wp-includes/default-widgets.php:804 +msgid "An error has occurred; the feed is probably down. Try again later." +msgstr "Ha ocurrido un error; probablemente el feed está caído. Inténtalo de nuevo más tarde." + +#: wp-includes/default-widgets.php:818 +msgid "Untitled" +msgstr "Sin título" + +#: wp-includes/default-widgets.php:898 +msgid "RSS Error: %s" +msgstr "RSS Error: %s" + +#: wp-includes/default-widgets.php:902 +msgid "Enter the RSS feed URL here:" +msgstr "Introduce la URL del feed RSS aquí:" + +#: wp-includes/default-widgets.php:905 +msgid "Give the feed a title (optional):" +msgstr "Dale un título al feed (opcional):" + +#: wp-includes/default-widgets.php:908 +msgid "How many items would you like to display?" +msgstr "¿Cuantos elementos te gustaría mostrar?" + +#: wp-includes/default-widgets.php:917 +msgid "Display item content?" +msgstr "¿Mostrar el contenido?" + +#: wp-includes/default-widgets.php:920 +msgid "Display item author if available?" +msgstr "¿Mostrar el autor si está disponible?" + +#: wp-includes/default-widgets.php:923 +msgid "Display item date?" +msgstr "¿Mostrar la fecha?" + +#: wp-includes/default-widgets.php:989 +msgid "Your most used tags in cloud format" +msgstr "Las etiquetas más utilizadas en formato de nube" + +#: wp-includes/default-widgets.php:990 +msgid "Tag Cloud" +msgstr "Nube de etiquetas" + +#: wp-includes/deprecated.php:62 +msgid "new WordPress Loop" +msgstr "nuevo Loop de WordPress" + +#: wp-includes/deprecated.php:987 +msgid "Last updated" +msgstr "Última actualización" + +#: wp-includes/deprecated.php:1898 wp-includes/post-template.php:1154 +msgid "Missing Attachment" +msgstr "Falta el archivo" + +#: wp-includes/feed-atom-comments.php:21 +msgid "Comments for %1$s searching on %2$s" +msgstr "Comentarios para %1$s buscando en %2$s" + +#: wp-includes/feed-rss2-comments.php:26 wp-includes/feed-atom-comments.php:23 +msgid "Comments for %s" +msgstr "Comentarios para %s" + +#: wp-includes/feed-rss2-comments.php:45 wp-includes/feed-atom-comments.php:53 +msgid "Comment on %1$s by %2$s" +msgstr "Comentario en %1$s por %2$s" + +#: wp-includes/feed-rss2-comments.php:47 wp-includes/feed-atom-comments.php:55 +msgid "By: %s" +msgstr "Por: %s" + +#: wp-includes/feed-rss2-comments.php:22 +msgid "Comments on: %s" +msgstr "Comentarios en: %s" + +#: wp-includes/feed-rss2-comments.php:24 +msgid "Comments for %s searching on %s" +msgstr "Comentarios para %s buscando en %s" + +#: wp-includes/feed-rss2-comments.php:55 +msgid "Protected Comments: Please enter your password to view comments." +msgstr "Comentarios protegidos: Por favor, escribe tu contraseña para ver los comentarios." + +#: wp-includes/formatting.php:36 wp-includes/formatting.php:2905 +msgctxt "opening curly quote" +msgid "“" +msgstr "“" + +#: wp-includes/formatting.php:38 +msgctxt "closing curly quote" +msgid "”" +msgstr "”" + +#: wp-includes/formatting.php:1813 +msgid "%s min" +msgid_plural "%s mins" +msgstr[0] "%s min" +msgstr[1] "%s mins" + +#: wp-includes/formatting.php:1819 +msgid "%s hour" +msgid_plural "%s hours" +msgstr[0] "%s hora" +msgstr[1] "%s horas" + +#: wp-includes/formatting.php:1825 +msgid "%s day" +msgid_plural "%s days" +msgstr[0] "%s día" +msgstr[1] "%s días" + +#: wp-includes/formatting.php:2689 +msgid ", " +msgstr ", " + +#: wp-includes/formatting.php:2691 +msgid ", and " +msgstr ", y " + +#: wp-includes/formatting.php:2693 +msgid " and " +msgstr "y " + +#: wp-includes/functions.php:406 +msgid "%s is a protected WP option and may not be modified" +msgstr "%s es una opción protegida de WP y no puede modificarse" + +#: wp-includes/functions.php:1780 +msgid "ERROR: %s is not a valid feed template." +msgstr "ERROR: %s no es una plantilla de feed válida." + +#: wp-includes/functions.php:2274 wp-includes/functions.php:2392 +msgid "Unable to create directory %s. Is its parent directory writable by the server?" +msgstr "No se pudo crear el directorio %s. Asegúrate de que el servidor tiene permisos de escritura para el directorio superior." + +#: wp-includes/functions.php:2371 +msgid "Empty filename" +msgstr "El nombre de archivo está vacío." + +#: wp-includes/functions.php:2398 +msgid "Could not write file %s" +msgstr "No se pudo escribir el archivo %s." + +#: wp-includes/functions.php:2647 +msgid "Your attempt to edit this attachment: “%s” has failed." +msgstr "Tu intento de editar este archivo: “%s” ha fallado." + +#: wp-includes/functions.php:2649 +msgid "Your attempt to add this category has failed." +msgstr "Tu intento de añadir esta categoría ha fallado." + +#: wp-includes/functions.php:2650 +msgid "Your attempt to delete this category: “%s” has failed." +msgstr "Tu intento de eliminar esta categoría: “%s” ha fallado." + +#: wp-includes/functions.php:2651 +msgid "Your attempt to edit this category: “%s” has failed." +msgstr "Tu intento de editar esta categoría: “%s” ha fallado." + +#: wp-includes/functions.php:2653 +msgid "Your attempt to delete this comment: “%s” has failed." +msgstr "Tu intento de borrar este comentario: “%s” ha fallado." + +#: wp-includes/functions.php:2654 +msgid "Your attempt to unapprove this comment: “%s” has failed." +msgstr "Tu intento de rechazar este comentario: “%s” ha fallado." + +#: wp-includes/functions.php:2655 +msgid "Your attempt to approve this comment: “%s” has failed." +msgstr "Tu intento de aprobar este comentario: “%s” ha fallado." + +#: wp-includes/functions.php:2656 +msgid "Your attempt to edit this comment: “%s” has failed." +msgstr "Tu intento de editar este comentario: “%s” ha fallado." + +#: wp-includes/functions.php:2657 +msgid "Your attempt to bulk modify comments has failed." +msgstr "Tu intento de modificar en bloque los comentarios ha fallado." + +#: wp-includes/functions.php:2658 +msgid "Your attempt to moderate comments has failed." +msgstr "Tu intento de moderar comentarios ha fallado." + +#: wp-includes/functions.php:2660 +msgid "Your attempt to add this link has failed." +msgstr "Tu intento de añadir este enlace ha fallado." + +#: wp-includes/functions.php:2661 +msgid "Your attempt to delete this link: “%s” has failed." +msgstr "Tu intento de borrar este enlace: “%s” ha fallado." + +#: wp-includes/functions.php:2662 +msgid "Your attempt to edit this link: “%s” has failed." +msgstr "Tu intento de editar este enlace: “%s” ha fallado." + +#: wp-includes/functions.php:2663 +msgid "Your attempt to bulk modify links has failed." +msgstr "Tu intento de modificar en bloque los enlaces ha fallado." + +#: wp-includes/functions.php:2665 +msgid "Your attempt to add this page has failed." +msgstr "Tu intento de añadir esta página ha fallado." + +#: wp-includes/functions.php:2666 +msgid "Your attempt to delete this page: “%s” has failed." +msgstr "Tu intento de borrar esta página: “%s” ha fallado." + +#: wp-includes/functions.php:2667 +msgid "Your attempt to edit this page: “%s” has failed." +msgstr "Tu intento de editar esta página: “%s” ha fallado." + +#: wp-includes/functions.php:2669 +msgid "Your attempt to edit this plugin file: “%s” has failed." +msgstr "Tu intento de editar este archivo de un plugin: “%s” ha fallado." + +#: wp-includes/functions.php:2670 +msgid "Your attempt to activate this plugin: “%s” has failed." +msgstr "Tu intento de activar este plugin: “%s” ha fallado." + +#: wp-includes/functions.php:2671 +msgid "Your attempt to deactivate this plugin: “%s” has failed." +msgstr "Tu intento de desactivar este plugin: “%s” ha fallado." + +#: wp-includes/functions.php:2674 +msgid "Your attempt to add this post has failed." +msgstr "Tu intento de añadir esta entrada ha fallado." + +#: wp-includes/functions.php:2675 +msgid "Your attempt to delete this post: “%s” has failed." +msgstr "Tu intento de borrar esta entrada: “%s” ha fallado" + +#: wp-includes/functions.php:2676 +msgid "Your attempt to edit this post: “%s” has failed." +msgstr "Tu intento de editar esta entrada: “%s” ha fallado." + +#: wp-includes/functions.php:2678 +msgid "Your attempt to add this user has failed." +msgstr "Tu intento de añadir este usuario ha fallado." + +#: wp-includes/functions.php:2679 +msgid "Your attempt to delete users has failed." +msgstr "Tu intento de borrar estos usuarios ha fallado." + +#: wp-includes/functions.php:2680 +msgid "Your attempt to bulk modify users has failed." +msgstr "Tu intento de modificar en bloque usuarios ha fallado." + +#: wp-includes/functions.php:2681 +msgid "Your attempt to edit this user: “%s” has failed." +msgstr "Tu intento por editar este usuario: “%s” ha fallado." + +#: wp-includes/functions.php:2682 +msgid "Your attempt to modify the profile for: “%s” has failed." +msgstr "Tu intento de modificar el perfil de: “%s” ha fallado." + +#: wp-includes/functions.php:2684 +msgid "Your attempt to edit your settings has failed." +msgstr "Tu intento de editar tu configuración ha fallado." + +#: wp-includes/functions.php:2685 +msgid "Your attempt to change your permalink structure to: %s has failed." +msgstr "Tu intento de cambiar la estructura de enlaces permanentes a %s no ha tenido éxito." + +#: wp-includes/functions.php:2686 +msgid "Your attempt to edit this file: “%s” has failed." +msgstr "Tu intento de editar este fichero: “%s” ha fallado." + +#: wp-includes/functions.php:2687 +msgid "Your attempt to edit this theme file: “%s” has failed." +msgstr "Tu intento de editar este archivo del tema: “%s” ha fallado." + +#: wp-includes/functions.php:2688 +msgid "Your attempt to switch to this theme: “%s” has failed." +msgstr "Tu intento de cambiar este tema: “%s” ha fallado." + +#: wp-includes/functions.php:2690 +msgid "You are attempting to log out of %s" +msgstr "Estás intentando cerrar tu sesión en %s." + +#: wp-includes/functions.php:2729 +msgid "WordPress Failure Notice" +msgstr "Aviso de fallo de WordPress" + +#: wp-includes/functions.php:2732 +msgid "Do you really want to log out?" +msgstr "¿Estás seguro de que quieres desconectarte?" + +#: wp-includes/functions.php:2734 +msgid "Please try again." +msgstr "Por favor, inténtalo de nuevo." + +#: wp-includes/functions.php:2810 +msgid "« Back" +msgstr "« Volver" + +#: wp-includes/functions.php:2831 +msgid "WordPress › Error" +msgstr "WordPress › Error" + +#: wp-includes/functions.php:3382 wp-includes/functions.php:3422 +msgid "%1$s is deprecated since version %2$s! Use %3$s instead." +msgstr "%1$s está obsoleto desde la versión %2$s. Utiliza %3$s en su lugar." + +#: wp-includes/functions.php:3384 wp-includes/functions.php:3424 +msgid "%1$s is deprecated since version %2$s with no alternative available." +msgstr "%1$s está obsoleto desde la versión %2$s y no hay alternativas disponibles." + +#: wp-includes/functions.php:3466 +msgid "%1$s was called with an argument that is deprecated since version %2$s! %3$s" +msgstr "%1$s fue llamado con un argumento que está obsoleto desde la versión %2$s! %3$s" + +#: wp-includes/functions.php:3468 +msgid "%1$s was called with an argument that is deprecated since version %2$s with no alternative available." +msgstr "%1$s fue llamado con un argumento que está obsoleto desde la versión %2$s y no hay alternativas disponibles." + +#: wp-includes/functions.php:4185 +msgid "Select a city" +msgstr "Selecciona una ciudad" + +#: wp-includes/functions.php:4230 wp-includes/functions.php:4234 +msgid "UTC" +msgstr "UTC" + +#: wp-includes/functions.php:4238 +msgid "Manual Offsets" +msgstr "Desplazamientos manuales" + +#: wp-includes/general-template.php:161 +msgid "Search for:" +msgstr "Buscar por:" + +#: wp-includes/general-template.php:187 wp-login.php:419 wp-login.php:444 +#: wp-login.php:475 wp-login.php:531 +msgid "Log in" +msgstr "Acceder" + +#: wp-includes/general-template.php:189 +msgid "Log out" +msgstr "Desconectar" + +#: wp-includes/general-template.php:260 wp-login.php:644 +msgid "Remember Me" +msgstr "Recuérdame" + +#: wp-includes/general-template.php:336 wp-login.php:421 wp-login.php:477 +#: wp-login.php:527 wp-login.php:660 +msgid "Register" +msgstr "Registrarse" + +#: wp-includes/general-template.php:340 wp-admin/admin-header.php:162 +msgid "Site Admin" +msgstr "Administrador del sitio" + +#: wp-includes/general-template.php:587 +msgid "Search Results %1$s %2$s" +msgstr "Resultados de la búsqueda %1$s %2$s" + +#: wp-includes/general-template.php:592 +msgid "Page not found" +msgstr "No se encontró la página" + +#: wp-includes/general-template.php:939 +msgid "%1$s %2$d" +msgstr "%1$s %2$d" + +#: wp-includes/general-template.php:1148 +msgctxt "calendar caption" +msgid "%1$s %2$s" +msgstr "%1$s %2$s" + +#: wp-includes/general-template.php:1174 wp-includes/general-template.php:1182 +msgid "View posts for %1$s %2$s" +msgstr "Ver todas las entradas para %1$s %2$s" + +#: wp-includes/general-template.php:1604 wp-includes/general-template.php:1627 +msgctxt "feed link" +msgid "»" +msgstr "»" + +#: wp-includes/general-template.php:1606 +msgid "%1$s %2$s Feed" +msgstr "%1$s %2$s Feed" + +#: wp-includes/general-template.php:1608 +msgid "%1$s %2$s Comments Feed" +msgstr "%1$s %2$s RSS de los comentarios" + +#: wp-includes/general-template.php:1629 +msgid "%1$s %2$s %3$s Comments Feed" +msgstr "%1$s %2$s %3$s RSS de los comentarios" + +#: wp-includes/general-template.php:1631 +msgid "%1$s %2$s %3$s Category Feed" +msgstr "%1$s %2$s %3$s RSS de la categoría" + +#: wp-includes/general-template.php:1633 +msgid "%1$s %2$s %3$s Tag Feed" +msgstr "%1$s %2$s %3$s RSS de la etiqueta" + +#: wp-includes/general-template.php:1635 +msgid "%1$s %2$s Posts by %3$s Feed" +msgstr "%1$s %2$s RSS de las entradas de %3$s" + +#: wp-includes/general-template.php:1637 +msgid "%1$s %2$s Search Results for “%3$s” Feed" +msgstr "%1$s %2$s Resultados de búsqueda para “%3$s” RSS" + +#: wp-includes/general-template.php:1969 +msgid "« Previous" +msgstr "« Anterior" + +#: wp-includes/general-template.php:1970 +msgid "Next »" +msgstr "Siguiente »" + +#: wp-includes/general-template.php:2079 +#: wp-includes/js/tinymce/langs/wp-langs.php:49 wp-admin/includes/theme.php:274 +msgid "Gray" +msgstr "Gris" + +#: wp-includes/class-http.php:126 +msgid "User has blocked requests through HTTP." +msgstr "El usuario ha bloqueado las peticiones a través de HTTP." + +#: wp-includes/class-http.php:737 wp-includes/class-http.php:921 +#: wp-includes/class-http.php:1117 wp-includes/class-http.php:1136 +msgid "Too many redirects." +msgstr "Demasiadas redirecciones." + +#: wp-includes/class-http.php:821 +msgid "Malformed URL: %s" +msgstr "La URL %s está mal formada" + +#: wp-includes/class-http.php:697 wp-includes/class-http.php:879 +#: wp-includes/class-http.php:898 wp-includes/class-http.php:1072 +msgid "Could not open handle for fopen() to %s" +msgstr "No se pudo utilizar la función fopen() para %s." + +#: wp-includes/js/tinymce/langs/wp-langs.php:15 +msgid "Do you want to use the WYSIWYG mode for this textarea?" +msgstr "¿Quieres usar el editor visual en este área de texto?" + +#: wp-includes/js/tinymce/langs/wp-langs.php:17 +msgid "Insert" +msgstr "Insertar" + +#: wp-includes/js/tinymce/langs/wp-langs.php:21 +msgid "Browse" +msgstr "Examinar" + +#: wp-includes/js/tinymce/langs/wp-langs.php:22 +#: wp-includes/js/tinymce/langs/wp-langs.php:367 +msgid "Class" +msgstr "Clase" + +#: wp-includes/js/tinymce/langs/wp-langs.php:23 +msgid "-- Not set --" +msgstr "-- Sin configurar --" + +#: wp-includes/js/tinymce/langs/wp-langs.php:24 +#: wp-includes/js/tinymce/langs/wp-langs.php:290 +msgid "Copy/Cut/Paste is not available in Mozilla and Firefox." +msgstr "Copiar/Cortar/Pegar no está disponible en Mozilla y Firefox" + +#: wp-includes/js/tinymce/langs/wp-langs.php:25 +msgid "Currently not supported by your browser, use keyboard shortcuts instead." +msgstr "Actualmente no es compatible con tu navegador, en su lugar puedes utilizar los atajos de teclado." + +#: wp-includes/js/tinymce/langs/wp-langs.php:26 +msgid "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." +msgstr "Disculpa, parece que tu bloqueador de ventanas emergentes ha bloqueado una ventana que proporciona funciones de la aplicación. Tendrás que desactivar el bloqueador si quieres usar esta herramienta." + +#: wp-includes/js/tinymce/langs/wp-langs.php:27 +msgid "Error: Invalid values entered, these are marked in red." +msgstr "Error: Se han introducido valores incorrectos que han sido marcados en rojo." + +#: wp-includes/js/tinymce/langs/wp-langs.php:31 +#: wp-includes/js/tinymce/langs/wp-langs.php:294 +msgid "More colors" +msgstr "Más colores" + +#: wp-includes/js/tinymce/langs/wp-langs.php:80 +msgid "Full" +msgstr "Completo" + +#: wp-includes/js/tinymce/langs/wp-langs.php:83 +msgid "%Y-%m-%d" +msgstr "%d-%m-%Y" + +#: wp-includes/js/tinymce/langs/wp-langs.php:84 +msgid "%H:%M:%S" +msgstr "%H:%M:%S" + +#: wp-includes/js/tinymce/langs/wp-langs.php:85 +msgid "Insert date" +msgstr "Insertar fecha" + +#: wp-includes/js/tinymce/langs/wp-langs.php:86 +msgid "Insert time" +msgstr "Insertar hora" + +#: wp-includes/locale.php:140 wp-includes/locale.php:155 +#: wp-includes/js/tinymce/langs/wp-langs.php:87 +msgid "January" +msgstr "enero" + +#: wp-includes/locale.php:141 wp-includes/locale.php:156 +#: wp-includes/js/tinymce/langs/wp-langs.php:87 +msgid "February" +msgstr "febrero" + +#: wp-includes/locale.php:142 wp-includes/locale.php:157 +#: wp-includes/js/tinymce/langs/wp-langs.php:87 +msgid "March" +msgstr "marzo" + +#: wp-includes/locale.php:143 wp-includes/locale.php:158 +#: wp-includes/js/tinymce/langs/wp-langs.php:87 +msgid "April" +msgstr "abril" + +#: wp-includes/locale.php:144 wp-includes/locale.php:159 +#: wp-includes/js/tinymce/langs/wp-langs.php:87 +msgid "May" +msgstr "mayo" + +#: wp-includes/locale.php:145 wp-includes/locale.php:160 +#: wp-includes/js/tinymce/langs/wp-langs.php:87 +msgid "June" +msgstr "junio" + +#: wp-includes/locale.php:146 wp-includes/locale.php:161 +#: wp-includes/js/tinymce/langs/wp-langs.php:87 +msgid "July" +msgstr "julio" + +#: wp-includes/locale.php:147 wp-includes/locale.php:162 +#: wp-includes/js/tinymce/langs/wp-langs.php:87 +msgid "August" +msgstr "agosto" + +#: wp-includes/locale.php:148 wp-includes/locale.php:163 +#: wp-includes/js/tinymce/langs/wp-langs.php:87 +msgid "September" +msgstr "septiembre" + +#: wp-includes/locale.php:149 wp-includes/locale.php:164 +#: wp-includes/js/tinymce/langs/wp-langs.php:87 +msgid "October" +msgstr "octubre" + +#: wp-includes/locale.php:150 wp-includes/locale.php:165 +#: wp-includes/js/tinymce/langs/wp-langs.php:87 +msgid "November" +msgstr "noviembre" + +#: wp-includes/locale.php:151 wp-includes/locale.php:166 +#: wp-includes/js/tinymce/langs/wp-langs.php:87 +msgid "December" +msgstr "diciembre" + +#: wp-includes/locale.php:155 wp-includes/js/tinymce/langs/wp-langs.php:88 +msgid "Jan_January_abbreviation" +msgstr "ene" + +#: wp-includes/locale.php:156 wp-includes/js/tinymce/langs/wp-langs.php:88 +msgid "Feb_February_abbreviation" +msgstr "feb" + +#: wp-includes/locale.php:157 wp-includes/js/tinymce/langs/wp-langs.php:88 +msgid "Mar_March_abbreviation" +msgstr "mar" + +#: wp-includes/locale.php:158 wp-includes/js/tinymce/langs/wp-langs.php:88 +msgid "Apr_April_abbreviation" +msgstr "abr" + +#: wp-includes/locale.php:159 wp-includes/js/tinymce/langs/wp-langs.php:88 +msgid "May_May_abbreviation" +msgstr "may" + +#: wp-includes/locale.php:160 wp-includes/js/tinymce/langs/wp-langs.php:88 +msgid "Jun_June_abbreviation" +msgstr "jun" + +#: wp-includes/locale.php:161 wp-includes/js/tinymce/langs/wp-langs.php:88 +msgid "Jul_July_abbreviation" +msgstr "jul" + +#: wp-includes/locale.php:162 wp-includes/js/tinymce/langs/wp-langs.php:88 +msgid "Aug_August_abbreviation" +msgstr "ago" + +#: wp-includes/locale.php:163 wp-includes/js/tinymce/langs/wp-langs.php:88 +msgid "Sep_September_abbreviation" +msgstr "sep" + +#: wp-includes/locale.php:164 wp-includes/js/tinymce/langs/wp-langs.php:88 +msgid "Oct_October_abbreviation" +msgstr "oct" + +#: wp-includes/locale.php:165 wp-includes/js/tinymce/langs/wp-langs.php:88 +msgid "Nov_November_abbreviation" +msgstr "nov" + +#: wp-includes/locale.php:166 wp-includes/js/tinymce/langs/wp-langs.php:88 +msgid "Dec_December_abbreviation" +msgstr "dic" + +#: wp-includes/locale.php:108 wp-includes/locale.php:118 +#: wp-includes/locale.php:131 wp-includes/js/tinymce/langs/wp-langs.php:89 +msgid "Sunday" +msgstr "Domingo" + +#: wp-includes/locale.php:109 wp-includes/locale.php:119 +#: wp-includes/locale.php:132 wp-includes/js/tinymce/langs/wp-langs.php:89 +msgid "Monday" +msgstr "Lunes" + +#: wp-includes/locale.php:110 wp-includes/locale.php:120 +#: wp-includes/locale.php:133 wp-includes/js/tinymce/langs/wp-langs.php:89 +msgid "Tuesday" +msgstr "Martes" + +#: wp-includes/locale.php:111 wp-includes/locale.php:121 +#: wp-includes/locale.php:134 wp-includes/js/tinymce/langs/wp-langs.php:89 +msgid "Wednesday" +msgstr "Miércoles" + +#: wp-includes/locale.php:112 wp-includes/locale.php:122 +#: wp-includes/locale.php:135 wp-includes/js/tinymce/langs/wp-langs.php:89 +msgid "Thursday" +msgstr "Jueves" + +#: wp-includes/locale.php:113 wp-includes/locale.php:123 +#: wp-includes/locale.php:136 wp-includes/js/tinymce/langs/wp-langs.php:89 +msgid "Friday" +msgstr "Viernes" + +#: wp-includes/locale.php:114 wp-includes/locale.php:124 +#: wp-includes/locale.php:137 wp-includes/js/tinymce/langs/wp-langs.php:89 +msgid "Saturday" +msgstr "Sábado" + +#: wp-includes/locale.php:131 wp-includes/js/tinymce/langs/wp-langs.php:90 +msgid "Sun" +msgstr "Dom" + +#: wp-includes/locale.php:132 wp-includes/js/tinymce/langs/wp-langs.php:90 +msgid "Mon" +msgstr "Lun" + +#: wp-includes/locale.php:133 wp-includes/js/tinymce/langs/wp-langs.php:90 +msgid "Tue" +msgstr "Mar" + +#: wp-includes/locale.php:134 wp-includes/js/tinymce/langs/wp-langs.php:90 +msgid "Wed" +msgstr "Mie" + +#: wp-includes/locale.php:135 wp-includes/js/tinymce/langs/wp-langs.php:90 +msgid "Thu" +msgstr "Jue" + +#: wp-includes/locale.php:136 wp-includes/js/tinymce/langs/wp-langs.php:90 +msgid "Fri" +msgstr "Vie" + +#: wp-includes/locale.php:137 wp-includes/js/tinymce/langs/wp-langs.php:90 +msgid "Sat" +msgstr "Sab" + +#: wp-includes/js/tinymce/langs/wp-langs.php:93 +msgid "Print" +msgstr "Imprimir" + +#: wp-includes/js/tinymce/langs/wp-langs.php:99 +msgid "Direction left to right" +msgstr "Dirección de izquierda a derecha" + +#: wp-includes/js/tinymce/langs/wp-langs.php:100 +msgid "Direction right to left" +msgstr "Dirección de derecha a izquierda" + +#: wp-includes/js/tinymce/langs/wp-langs.php:103 +msgid "Insert new layer" +msgstr "Insertar nueva capa" + +#: wp-includes/js/tinymce/langs/wp-langs.php:104 +msgid "Move forward" +msgstr "Avanzar" + +#: wp-includes/js/tinymce/langs/wp-langs.php:105 +msgid "Move backward" +msgstr "Retroceder" + +#: wp-includes/js/tinymce/langs/wp-langs.php:106 +msgid "Toggle absolute positioning" +msgstr "Cambiar la posición absoluta" + +#: wp-includes/js/tinymce/langs/wp-langs.php:107 +msgid "New layer..." +msgstr "Nueva capa..." + +#: wp-includes/js/tinymce/langs/wp-langs.php:111 +msgid "Cancel all changes" +msgstr "Cancelar todos los cambios" + +#: wp-includes/js/tinymce/langs/wp-langs.php:114 +msgid "Insert non-breaking space character" +msgstr "Insertar un caracter de espacio" + +#: wp-includes/js/tinymce/langs/wp-langs.php:117 +msgid "Run spell checking" +msgstr "Iniciar el corrector ortográfico" + +#: wp-includes/js/tinymce/langs/wp-langs.php:118 +msgid "ieSpell not detected. Do you want to install it now?" +msgstr "No se ha detectado ieSpell. ¿Quieres instalarlo ahora?" + +#: wp-includes/js/tinymce/langs/wp-langs.php:121 +msgid "Horizontale rule" +msgstr "Regla horizontal" + +#: wp-includes/js/tinymce/langs/wp-langs.php:124 +msgid "Emotions" +msgstr "Emoticonos" + +#: wp-includes/js/tinymce/langs/wp-langs.php:127 +msgid "Find" +msgstr "Buscar" + +#: wp-includes/js/tinymce/langs/wp-langs.php:128 +msgid "Find/Replace" +msgstr "Buscar/Remplazar" + +#: wp-includes/js/tinymce/langs/wp-langs.php:131 +#: wp-includes/js/tinymce/langs/wp-langs.php:271 +#: wp-includes/js/tinymce/langs/wp-langs.php:325 +msgid "Insert/edit image" +msgstr "Insertar/Editar imagen" + +#: wp-includes/script-loader.php:278 +#: wp-includes/js/tinymce/langs/wp-langs.php:134 +#: wp-includes/js/tinymce/langs/wp-langs.php:269 +#: wp-includes/js/tinymce/langs/wp-langs.php:342 +msgid "Insert/edit link" +msgstr "Insertar/Editar enlace" + +#: wp-includes/js/tinymce/langs/wp-langs.php:137 +msgid "Citation" +msgstr "Cita" + +#: wp-includes/js/tinymce/langs/wp-langs.php:138 +msgid "Abbreviation" +msgstr "Abreviatura" + +#: wp-includes/js/tinymce/langs/wp-langs.php:139 +msgid "Acronym" +msgstr "Acrónimo" + +#: wp-includes/js/tinymce/langs/wp-langs.php:140 +msgid "Deletion" +msgstr "Borrado" + +#: wp-includes/js/tinymce/langs/wp-langs.php:141 +msgid "Insertion" +msgstr "Insertar" + +#: wp-includes/js/tinymce/langs/wp-langs.php:142 +msgid "Insert/Edit Attributes" +msgstr "Insertar/Editar atributos" + +#: wp-includes/js/tinymce/langs/wp-langs.php:145 +msgid "Edit CSS Style" +msgstr "Editar la hoja de estilos CSS" + +#: wp-includes/js/tinymce/langs/wp-langs.php:148 +msgid "Paste as Plain Text" +msgstr "Pegar como texto plano" + +#: wp-includes/js/tinymce/langs/wp-langs.php:149 +msgid "Paste from Word" +msgstr "Pegar desde Word" + +#: wp-includes/js/tinymce/langs/wp-langs.php:155 +#: wp-includes/js/tinymce/langs/wp-langs.php:157 +msgid "Use CTRL+V on your keyboard to paste the text into the window." +msgstr "Usa CTRL+V en tu teclado para pegar el texto en la ventana." + +#: wp-includes/js/tinymce/langs/wp-langs.php:156 +msgid "Keep linebreaks" +msgstr "Conservar los saltos de línea" + +#: wp-includes/js/tinymce/langs/wp-langs.php:160 +msgid "Inserts a new table" +msgstr "Insertar una nueva tabla" + +#: wp-includes/js/tinymce/langs/wp-langs.php:161 +msgid "Insert row before" +msgstr "Insertar fila encima" + +#: wp-includes/js/tinymce/langs/wp-langs.php:162 +msgid "Insert row after" +msgstr "Insertar fila debajo" + +#: wp-includes/js/tinymce/langs/wp-langs.php:163 +msgid "Delete row" +msgstr "Borrar fila" + +#: wp-includes/js/tinymce/langs/wp-langs.php:164 +msgid "Insert column before" +msgstr "Insertar columna a la izquierda" + +#: wp-includes/js/tinymce/langs/wp-langs.php:165 +msgid "Insert column after" +msgstr "Insertar columna a la derecha" + +#: wp-includes/js/tinymce/langs/wp-langs.php:166 +msgid "Remove column" +msgstr "Borrar columna" + +#: wp-includes/js/tinymce/langs/wp-langs.php:167 +msgid "Split merged table cells" +msgstr "Dividir celdas combinadas" + +#: wp-includes/js/tinymce/langs/wp-langs.php:168 +msgid "Merge table cells" +msgstr "Combinar celdas" + +#: wp-includes/js/tinymce/langs/wp-langs.php:169 +msgid "Table row properties" +msgstr "Propiedades de fila" + +#: wp-includes/js/tinymce/langs/wp-langs.php:170 +msgid "Table cell properties" +msgstr "Propiedades de celda" + +#: wp-includes/js/tinymce/langs/wp-langs.php:171 +msgid "Table properties" +msgstr "Propiedades de tabla" + +#: wp-includes/js/tinymce/langs/wp-langs.php:172 +msgid "Paste table row before" +msgstr "Pegar fila encima" + +#: wp-includes/js/tinymce/langs/wp-langs.php:173 +msgid "Paste table row after" +msgstr "Pegar fila debajo" + +#: wp-includes/js/tinymce/langs/wp-langs.php:174 +msgid "Cut table row" +msgstr "Cortar fila" + +#: wp-includes/js/tinymce/langs/wp-langs.php:175 +msgid "Copy table row" +msgstr "Copiar fila" + +#: wp-includes/js/tinymce/langs/wp-langs.php:176 +msgid "Delete table" +msgstr "Borrar tabla" + +#: wp-includes/js/tinymce/langs/wp-langs.php:177 +msgid "Row" +msgstr "Fila" + +#: wp-includes/js/tinymce/langs/wp-langs.php:178 +msgid "Column" +msgstr "Columna" + +#: wp-includes/js/tinymce/langs/wp-langs.php:179 +msgid "Cell" +msgstr "Celda" + +#: wp-includes/script-loader.php:443 wp-includes/script-loader.php:564 +#: wp-includes/js/tinymce/langs/wp-langs.php:182 +msgid "The changes you made will be lost if you navigate away from this page." +msgstr "Los cambios realizados se perderán si abres otra página." + +#: wp-includes/script-loader.php:90 +#: wp-includes/js/tinymce/langs/wp-langs.php:185 +msgid "Toggle fullscreen mode" +msgstr "Cambiar a modo pantalla completa" + +#: wp-includes/js/tinymce/langs/wp-langs.php:188 +#: wp-includes/js/tinymce/langs/wp-langs.php:356 +msgid "Insert / edit embedded media" +msgstr "Insertar / editar inserción de archivos" + +#: wp-includes/js/tinymce/langs/wp-langs.php:189 +msgid "Edit embedded media" +msgstr "Editar medios incrustados" + +#: wp-includes/js/tinymce/langs/wp-langs.php:192 +msgid "Document properties" +msgstr "Propiedades del documento" + +#: wp-includes/js/tinymce/langs/wp-langs.php:195 +msgid "Insert predefined template content" +msgstr "Insertar la plantilla predefinida de contenido" + +#: wp-includes/js/tinymce/langs/wp-langs.php:198 +msgid "Visual control characters on/off." +msgstr "Control visual de los caracteres on/off." + +#: wp-includes/js/tinymce/langs/wp-langs.php:201 +msgid "Toggle spellchecker" +msgstr "Activar/desactivar el corrector ortográfico" + +#: wp-includes/js/tinymce/langs/wp-langs.php:202 +msgid "Spellchecker settings" +msgstr "Opciones del corrector ortográfico" + +#: wp-includes/js/tinymce/langs/wp-langs.php:203 +msgid "Ignore word" +msgstr "Ignorar palabra" + +#: wp-includes/js/tinymce/langs/wp-langs.php:204 +msgid "Ignore all" +msgstr "Ignorar todo" + +#: wp-includes/js/tinymce/langs/wp-langs.php:205 +msgid "Languages" +msgstr "Idiomas" + +#: wp-includes/js/tinymce/langs/wp-langs.php:206 +msgid "Please wait..." +msgstr "Un momento..." + +#: wp-includes/js/tinymce/langs/wp-langs.php:207 +msgid "Suggestions" +msgstr "Sugerencias" + +#: wp-includes/js/tinymce/langs/wp-langs.php:208 +msgid "No suggestions" +msgstr "No hay sugerencias" + +#: wp-includes/js/tinymce/langs/wp-langs.php:209 +msgid "No misspellings found." +msgstr "No hay errores ortográficos." + +#: wp-includes/js/tinymce/langs/wp-langs.php:213 +msgid "Insert Page Break" +msgstr "Insertar salto de página" + +#: wp-includes/js/tinymce/langs/wp-langs.php:236 +msgctxt "TinyMCE font styles" +msgid "Styles" +msgstr "Estilos" + +#: wp-includes/js/tinymce/langs/wp-langs.php:237 +msgid "Font size" +msgstr "Tamaño de la fuente" + +#: wp-includes/js/tinymce/langs/wp-langs.php:238 +msgid "Font family" +msgstr "Familia de la fuente" + +#: wp-includes/js/tinymce/langs/wp-langs.php:239 +msgid "Format" +msgstr "Formato" + +#: wp-includes/js/tinymce/langs/wp-langs.php:240 +msgid "Paragraph" +msgstr "Párrafo" + +#: wp-includes/js/tinymce/langs/wp-langs.php:241 +msgid "Div" +msgstr "Div" + +#: wp-includes/js/tinymce/langs/wp-langs.php:242 +#: wp-includes/js/tinymce/wp-mce-help.php:242 +msgid "Address" +msgstr "Dirección" + +#: wp-includes/js/tinymce/langs/wp-langs.php:243 +msgid "Preformatted" +msgstr "Preformateado" + +#: wp-includes/js/tinymce/langs/wp-langs.php:244 +#: wp-includes/js/tinymce/wp-mce-help.php:239 +msgid "Heading 1" +msgstr "Título 1" + +#: wp-includes/js/tinymce/langs/wp-langs.php:245 +#: wp-includes/js/tinymce/wp-mce-help.php:240 +msgid "Heading 2" +msgstr "Título 2" + +#: wp-includes/js/tinymce/langs/wp-langs.php:246 +#: wp-includes/js/tinymce/wp-mce-help.php:240 +msgid "Heading 3" +msgstr "Título 3" + +#: wp-includes/js/tinymce/langs/wp-langs.php:247 +#: wp-includes/js/tinymce/wp-mce-help.php:241 +msgid "Heading 4" +msgstr "Título 4" + +#: wp-includes/js/tinymce/langs/wp-langs.php:248 +#: wp-includes/js/tinymce/wp-mce-help.php:241 +msgid "Heading 5" +msgstr "Título 5" + +#: wp-includes/js/tinymce/langs/wp-langs.php:249 +#: wp-includes/js/tinymce/wp-mce-help.php:242 +msgid "Heading 6" +msgstr "Título 6" + +#: wp-includes/js/tinymce/langs/wp-langs.php:250 +#: wp-includes/js/tinymce/langs/wp-langs.php:289 +msgid "Blockquote" +msgstr "Cita" + +#: wp-includes/js/tinymce/langs/wp-langs.php:251 +msgid "Code" +msgstr "Código" + +#: wp-includes/js/tinymce/langs/wp-langs.php:252 +msgid "Code sample" +msgstr "Código de ejemplo" + +#: wp-includes/js/tinymce/langs/wp-langs.php:253 +msgid "Definition term " +msgstr "Definición del término" + +#: wp-includes/js/tinymce/langs/wp-langs.php:254 +msgid "Definition description" +msgstr "Definición de descripción" + +#: wp-includes/js/tinymce/langs/wp-langs.php:255 +#: wp-includes/js/tinymce/wp-mce-help.php:238 +#: wp-includes/js/tinymce/wp-mce-help.php:248 +msgid "Bold" +msgstr "Negrita" + +#: wp-includes/js/tinymce/langs/wp-langs.php:256 +#: wp-includes/js/tinymce/wp-mce-help.php:238 +#: wp-includes/js/tinymce/wp-mce-help.php:248 +msgid "Italic" +msgstr "Cursiva" + +#: wp-includes/js/tinymce/langs/wp-langs.php:257 +#: wp-includes/js/tinymce/wp-mce-help.php:239 +msgid "Underline" +msgstr "Subrayado" + +#: wp-includes/js/tinymce/langs/wp-langs.php:258 +#: wp-includes/js/tinymce/wp-mce-help.php:252 +msgid "Strikethrough" +msgstr "Tachado" + +#: wp-includes/js/tinymce/langs/wp-langs.php:259 +#: wp-includes/js/tinymce/wp-mce-help.php:250 +msgid "Align Left" +msgstr "Alinear a la izquierda" + +#: wp-includes/js/tinymce/langs/wp-langs.php:260 +#: wp-includes/js/tinymce/wp-mce-help.php:251 +msgid "Align Center" +msgstr "Alinear al centro" + +#: wp-includes/js/tinymce/langs/wp-langs.php:261 +#: wp-includes/js/tinymce/wp-mce-help.php:252 +msgid "Align Right" +msgstr "Alinear a la derecha" + +#: wp-includes/js/tinymce/langs/wp-langs.php:262 +msgid "Align Full" +msgstr "Alineación completa" + +#: wp-includes/js/tinymce/langs/wp-langs.php:263 +msgid "Unordered list" +msgstr "Lista desordenada" + +#: wp-includes/js/tinymce/langs/wp-langs.php:264 +msgid "Ordered list" +msgstr "Lista ordenada" + +#: wp-includes/js/tinymce/langs/wp-langs.php:265 +msgid "Outdent" +msgstr "Disminuir margen" + +#: wp-includes/js/tinymce/langs/wp-langs.php:266 +msgid "Indent" +msgstr "Aumentar margen" + +#: wp-includes/js/tinymce/langs/wp-langs.php:270 +msgid "Unlink" +msgstr "Quitar enlace" + +#: wp-includes/js/tinymce/langs/wp-langs.php:272 +msgid "Cleanup messy code" +msgstr "Limpiar el código desordenado" + +#: wp-includes/js/tinymce/langs/wp-langs.php:273 +msgid "Edit HTML Source" +msgstr "Editar HTML" + +#: wp-includes/js/tinymce/langs/wp-langs.php:274 +msgid "Subscript" +msgstr "Subíndice" + +#: wp-includes/js/tinymce/langs/wp-langs.php:275 +msgid "Superscript" +msgstr "Superíndice" + +#: wp-includes/js/tinymce/langs/wp-langs.php:276 +msgid "Insert horizontal ruler" +msgstr "Insertar línea horizontal" + +#: wp-includes/js/tinymce/langs/wp-langs.php:277 +msgid "Remove formatting" +msgstr "Eliminar formato" + +#: wp-includes/js/tinymce/langs/wp-langs.php:278 +msgid "Select text color" +msgstr "Elegir color de texto" + +#: wp-includes/js/tinymce/langs/wp-langs.php:279 +msgid "Select background color" +msgstr "Elegir color de fondo" + +#: wp-includes/js/tinymce/langs/wp-langs.php:280 +msgid "Insert custom character" +msgstr "Insertar carácter especial" + +#: wp-includes/js/tinymce/langs/wp-langs.php:281 +msgid "Toggle guidelines/invisible elements" +msgstr "Mostrar/Ocultar guías y otros elementos" + +#: wp-includes/js/tinymce/langs/wp-langs.php:282 +#: wp-includes/js/tinymce/langs/wp-langs.php:311 +msgid "Insert/edit anchor" +msgstr "Insertar/Editar anclaje" + +#: wp-includes/js/tinymce/langs/wp-langs.php:283 +#: wp-includes/js/tinymce/wp-mce-help.php:235 +msgid "Cut" +msgstr "Cortar" + +#: wp-includes/js/tinymce/langs/wp-langs.php:284 +#: wp-includes/js/tinymce/wp-mce-help.php:234 +msgid "Copy" +msgstr "Copiar" + +#: wp-includes/js/tinymce/langs/wp-langs.php:285 +#: wp-includes/js/tinymce/wp-mce-help.php:234 +msgid "Paste" +msgstr "Pegar" + +#: wp-includes/js/tinymce/langs/wp-langs.php:286 +msgid "Image properties" +msgstr "Propiedades de la imagen" + +#: wp-includes/js/tinymce/langs/wp-langs.php:287 +msgid "New document" +msgstr "Nuevo documento" + +#: wp-includes/js/tinymce/langs/wp-langs.php:292 +msgid "Are you sure you want to clear all contents?" +msgstr "¿Seguro que quieres borrar todo el contenido?" + +#: wp-includes/js/tinymce/langs/wp-langs.php:293 +msgid "Jump to tool buttons - Alt+Q, Jump to editor - Alt-Z, Jump to element path - Alt-X" +msgstr "Ir a la herramienta de los botones - Alt + Q, Ir al editor - Alt-Z, Ir al elemento de la ruta - Alt-X" + +#: wp-includes/js/tinymce/langs/wp-langs.php:302 +#: wp-includes/js/tinymce/wp-mce-help.php:268 +msgid "About TinyMCE" +msgstr "Acerca de TinyMCE" + +#: wp-includes/js/tinymce/langs/wp-langs.php:305 +msgid "License" +msgstr "Licencia" + +#: wp-includes/js/tinymce/langs/wp-langs.php:310 +msgid "Loaded plugins" +msgstr "Plugins cargados" + +#: wp-includes/js/tinymce/langs/wp-langs.php:312 +msgid "Anchor name" +msgstr "Nombre del ancla" + +#: wp-includes/js/tinymce/langs/wp-langs.php:313 +msgid "HTML Source Editor" +msgstr "Editor HTML" + +#: wp-includes/js/tinymce/langs/wp-langs.php:314 +msgid "Word wrap" +msgstr "Ajuste de palabras" + +#: wp-includes/js/tinymce/langs/wp-langs.php:315 +msgid "Select a color" +msgstr "Elige un color" + +#: wp-includes/js/tinymce/langs/wp-langs.php:316 +msgid "Picker" +msgstr "Selector" + +#: wp-includes/js/tinymce/langs/wp-langs.php:317 +msgid "Color picker" +msgstr "Selector de color" + +#: wp-includes/js/tinymce/langs/wp-langs.php:318 +msgid "Palette" +msgstr "Paleta" + +#: wp-includes/js/tinymce/langs/wp-langs.php:319 +msgid "Palette colors" +msgstr "Paleta de colores" + +#: wp-includes/js/tinymce/langs/wp-langs.php:320 +msgid "Named" +msgstr "Nombrado" + +#: wp-includes/js/tinymce/langs/wp-langs.php:321 +msgid "Named colors" +msgstr "Nombre de los colores" + +#: wp-includes/js/tinymce/langs/wp-langs.php:322 +msgid "Color:" +msgstr "Color:" + +#: wp-includes/js/tinymce/langs/wp-langs.php:324 +msgid "Select custom character" +msgstr "Elegir un carácter especial" + +#: wp-includes/js/tinymce/langs/wp-langs.php:327 +msgid "Image description" +msgstr "Descripción de la imagen" + +#: wp-includes/js/tinymce/langs/wp-langs.php:328 +msgid "Image list" +msgstr "Lista de imágenes" + +#: wp-includes/js/tinymce/langs/wp-langs.php:329 +msgid "Border" +msgstr "Borde" + +#: wp-includes/js/tinymce/langs/wp-langs.php:330 +#: wp-includes/js/tinymce/langs/wp-langs.php:361 +msgid "Dimensions" +msgstr "Dimensiones" + +#: wp-includes/js/tinymce/langs/wp-langs.php:331 +msgid "Vertical space" +msgstr "Espacio vertical" + +#: wp-includes/js/tinymce/langs/wp-langs.php:332 +msgid "Horizontal space" +msgstr "Espacio horizontal" + +#: wp-includes/js/tinymce/langs/wp-langs.php:334 +msgid "Baseline" +msgstr "Linea base" + +#: wp-includes/js/tinymce/langs/wp-langs.php:335 +#: wp-includes/js/tinymce/langs/wp-langs.php:436 +msgid "Top" +msgstr "Arriba" + +#: wp-includes/js/tinymce/langs/wp-langs.php:336 +msgid "Middle" +msgstr "Intermedio" + +#: wp-includes/js/tinymce/langs/wp-langs.php:337 +#: wp-includes/js/tinymce/langs/wp-langs.php:438 +msgid "Bottom" +msgstr "Abajo" + +#: wp-includes/js/tinymce/langs/wp-langs.php:338 +msgid "Text top" +msgstr "Texto superior" + +#: wp-includes/js/tinymce/langs/wp-langs.php:339 +msgid "Text bottom" +msgstr "Texto inferior" + +#: wp-includes/js/tinymce/langs/wp-langs.php:345 +msgid "Open link in the same window" +msgstr "Abrir el enlace en la misma ventana" + +#: wp-includes/js/tinymce/langs/wp-langs.php:346 +msgid "Open link in a new window" +msgstr "Abrir el enlace en una nueva ventana" + +#: wp-includes/js/tinymce/langs/wp-langs.php:348 +msgid "The URL you entered seems to be an email address, do you want to add the required mailto: prefix?" +msgstr "La URL que has introducido parece ser un correo electrónico, ¿quieres añadir el prefijo mailto:?" + +#: wp-includes/js/tinymce/langs/wp-langs.php:349 +msgid "The URL you entered seems to external link, do you want to add the required http:// prefix?" +msgstr "La URL especificada parece ser un enlace externo, ¿quieres añadir el prefijo http://?" + +#: wp-includes/js/tinymce/langs/wp-langs.php:350 +msgid "Link list" +msgstr "Lista de enlaces" + +#: wp-includes/js/tinymce/langs/wp-langs.php:357 +msgid "General" +msgstr "Generales" + +#: wp-includes/js/tinymce/langs/wp-langs.php:359 +msgid "File/URL" +msgstr "Archivo/URL" + +#: wp-includes/js/tinymce/langs/wp-langs.php:360 +#: wp-includes/js/tinymce/wp-mce-help.php:253 +#: wp-includes/js/tinymce/wp-mce-help.php:254 +msgid "List" +msgstr "Lista" + +#: wp-includes/js/tinymce/langs/wp-langs.php:363 +msgid "Constrain proportions" +msgstr "Mantener proporciones" + +#: wp-includes/js/tinymce/langs/wp-langs.php:364 +msgid "Type" +msgstr "Tipo" + +#: wp-includes/js/tinymce/langs/wp-langs.php:365 +msgid "Id" +msgstr "Id" + +#: wp-includes/js/tinymce/langs/wp-langs.php:368 +msgid "V-Space" +msgstr "Espacio vertical" + +#: wp-includes/js/tinymce/langs/wp-langs.php:369 +msgid "H-Space" +msgstr "Espacio horizontal" + +#: wp-includes/js/tinymce/langs/wp-langs.php:370 +msgid "Auto play" +msgstr "Reproducción automática" + +#: wp-includes/js/tinymce/langs/wp-langs.php:371 +#: wp-includes/js/tinymce/langs/wp-langs.php:453 +msgid "Loop" +msgstr "Repetir" + +#: wp-includes/js/tinymce/langs/wp-langs.php:372 +msgid "Show menu" +msgstr "Mostrar menú" + +#: wp-includes/js/tinymce/langs/wp-langs.php:373 +msgid "Quality" +msgstr "Calidad" + +#: wp-includes/js/tinymce/langs/wp-langs.php:375 +msgid "Align" +msgstr "Alineación" + +#: wp-includes/js/tinymce/langs/wp-langs.php:376 +msgid "SAlign" +msgstr "SAlign" + +#: wp-includes/js/tinymce/langs/wp-langs.php:377 +msgid "WMode" +msgstr "Modo de ventana" + +#: wp-includes/admin-bar.php:314 wp-includes/js/tinymce/langs/wp-langs.php:378 +#: wp-admin/custom-background.php:67 +msgid "Background" +msgstr "Fondo" + +#: wp-includes/js/tinymce/langs/wp-langs.php:379 +msgid "Base" +msgstr "Base" + +#: wp-includes/js/tinymce/langs/wp-langs.php:380 +msgid "Flashvars" +msgstr "Flashvars" + +#: wp-includes/js/tinymce/langs/wp-langs.php:381 +msgid "SWLiveConnect" +msgstr "SWLiveConnect" + +#: wp-includes/js/tinymce/langs/wp-langs.php:382 +msgid "AutoHREF" +msgstr "AutoHREF" + +#: wp-includes/js/tinymce/langs/wp-langs.php:383 +msgid "Cache" +msgstr "Caché" + +#: wp-includes/js/tinymce/langs/wp-langs.php:384 +msgid "Hidden" +msgstr "Oculto" + +#: wp-includes/js/tinymce/langs/wp-langs.php:385 +msgid "Controller" +msgstr "Controlador" + +#: wp-includes/js/tinymce/langs/wp-langs.php:386 +msgid "Kiosk mode" +msgstr "Modo quiosco" + +#: wp-includes/js/tinymce/langs/wp-langs.php:387 +msgid "Play every frame" +msgstr "Reproducir todos los cuadros" + +#: wp-includes/js/tinymce/langs/wp-langs.php:388 +msgid "Target cache" +msgstr "Caché destino" + +#: wp-includes/js/tinymce/langs/wp-langs.php:389 +msgid "No correction" +msgstr "Sin corrección" + +#: wp-includes/js/tinymce/langs/wp-langs.php:390 +msgid "Enable JavaScript" +msgstr "Activar JavaScript" + +#: wp-includes/js/tinymce/langs/wp-langs.php:391 +#: wp-includes/js/tinymce/langs/wp-langs.php:449 +msgid "Start time" +msgstr "Hora de inicio" + +#: wp-includes/js/tinymce/langs/wp-langs.php:392 +msgid "End time" +msgstr "Hora de finalización" + +#: wp-includes/js/tinymce/langs/wp-langs.php:393 +msgid "href" +msgstr "href" + +#: wp-includes/js/tinymce/langs/wp-langs.php:394 +msgid "Choke speed" +msgstr "Velocidad de obstrucción" + +#: wp-includes/js/tinymce/langs/wp-langs.php:396 +msgid "Volume" +msgstr "Volumen" + +#: wp-includes/js/tinymce/langs/wp-langs.php:397 +#: wp-includes/js/tinymce/langs/wp-langs.php:452 +msgid "Auto start" +msgstr "Inicio automático" + +#: wp-includes/js/tinymce/langs/wp-langs.php:399 +msgid "Fullscreen" +msgstr "Pantalla completa" + +#: wp-includes/js/tinymce/langs/wp-langs.php:400 +msgid "Invoke URLs" +msgstr "Invocar URLs" + +#: wp-includes/js/tinymce/langs/wp-langs.php:401 +msgid "Mute" +msgstr "Silenciar" + +#: wp-includes/js/tinymce/langs/wp-langs.php:402 +msgid "Stretch to fit" +msgstr "Estrechar para ajustar" + +#: wp-includes/js/tinymce/langs/wp-langs.php:403 +msgid "Windowless video" +msgstr "Vídeo sin ventana" + +#: wp-includes/js/tinymce/langs/wp-langs.php:404 +msgid "Balance" +msgstr "Balance" + +#: wp-includes/js/tinymce/langs/wp-langs.php:405 +msgid "Base URL" +msgstr "URL base" + +#: wp-includes/js/tinymce/langs/wp-langs.php:406 +msgid "Captioning id" +msgstr "ID de captura" + +#: wp-includes/js/tinymce/langs/wp-langs.php:407 +msgid "Current marker" +msgstr "Marcador actual" + +#: wp-includes/js/tinymce/langs/wp-langs.php:408 +msgid "Current position" +msgstr "Posición actual" + +#: wp-includes/js/tinymce/langs/wp-langs.php:409 +msgid "Default frame" +msgstr "Marco por defecto" + +#: wp-includes/js/tinymce/langs/wp-langs.php:410 +msgid "Play count" +msgstr "Contador de reproducción" + +#: wp-includes/js/tinymce/langs/wp-langs.php:411 +msgid "Rate" +msgstr "Puntuar" + +#: wp-includes/js/tinymce/langs/wp-langs.php:412 +msgid "UI Mode" +msgstr "Modo UI" + +#: wp-includes/js/tinymce/langs/wp-langs.php:413 +msgid "Flash options" +msgstr "Opciones del Flash" + +#: wp-includes/js/tinymce/langs/wp-langs.php:414 +msgid "Quicktime options" +msgstr "Opciones de Quicktime" + +#: wp-includes/js/tinymce/langs/wp-langs.php:415 +msgid "Windows media player options" +msgstr "Opciones de Windows Media Player" + +#: wp-includes/js/tinymce/langs/wp-langs.php:416 +msgid "Real media player options" +msgstr "Opciones de Real Media Player" + +#: wp-includes/js/tinymce/langs/wp-langs.php:417 +msgid "Shockwave options" +msgstr "Opciones de Shockwave" + +#: wp-includes/js/tinymce/langs/wp-langs.php:418 +msgid "Auto goto URL" +msgstr "Ir automáticamente a la URL" + +#: wp-includes/js/tinymce/langs/wp-langs.php:420 +msgid "Image status" +msgstr "Estado de la Imagen" + +#: wp-includes/js/tinymce/langs/wp-langs.php:421 +msgid "Maintain aspect" +msgstr "Mantener aspecto" + +#: wp-includes/js/tinymce/langs/wp-langs.php:422 +msgid "No java" +msgstr "Sin java" + +#: wp-includes/js/tinymce/langs/wp-langs.php:423 +msgid "Prefetch" +msgstr "Prelectura" + +#: wp-includes/js/tinymce/langs/wp-langs.php:424 +msgid "Shuffle" +msgstr "Aleatorio" + +#: wp-includes/js/tinymce/langs/wp-langs.php:425 +msgid "Console" +msgstr "Consola" + +#: wp-includes/js/tinymce/langs/wp-langs.php:426 +msgid "Num loops" +msgstr "Bucles numéricos" + +#: wp-includes/js/tinymce/langs/wp-langs.php:427 +msgid "Controls" +msgstr "Controles" + +#: wp-includes/js/tinymce/langs/wp-langs.php:428 +msgid "Script callbacks" +msgstr "Llamadas de Script" + +#: wp-includes/js/tinymce/langs/wp-langs.php:429 +msgid "Stretch style" +msgstr "Estilo estirado" + +#: wp-includes/js/tinymce/langs/wp-langs.php:430 +msgid "Stretch H-Align" +msgstr "Estirar alineación horizontal" + +#: wp-includes/js/tinymce/langs/wp-langs.php:431 +msgid "Stretch V-Align" +msgstr "Estirar alineación vertical" + +#: wp-includes/js/tinymce/langs/wp-langs.php:432 +msgid "Sound" +msgstr "Sonido" + +#: wp-includes/js/tinymce/langs/wp-langs.php:433 +msgid "Progress" +msgstr "Progreso" + +#: wp-includes/js/tinymce/langs/wp-langs.php:434 +msgid "QT Src" +msgstr "Origen de QT" + +#: wp-includes/js/tinymce/langs/wp-langs.php:435 +msgid "Streamed rtsp resources should be added to the QT Src field under the advanced tab." +msgstr "Los recursos Rtsp deben añadirse en el campo Origen de QT en la pestaña de Ajustes avanzados." + +#: wp-includes/js/tinymce/langs/wp-langs.php:441 +msgid "Top left" +msgstr "Arriba izq." + +#: wp-includes/js/tinymce/langs/wp-langs.php:442 +msgid "Top right" +msgstr "Arriba dcha." + +#: wp-includes/js/tinymce/langs/wp-langs.php:443 +msgid "Bottom left" +msgstr "Abajo izq." + +#: wp-includes/js/tinymce/langs/wp-langs.php:444 +msgid "Bottom right" +msgstr "Abajo dcha." + +#: wp-includes/js/tinymce/langs/wp-langs.php:445 +msgid "Flash video options" +msgstr "Opciones del video Flash" + +#: wp-includes/js/tinymce/langs/wp-langs.php:446 +msgid "Scale mode" +msgstr "Modo de escala" + +#: wp-includes/js/tinymce/langs/wp-langs.php:447 +msgid "Buffer" +msgstr "Buffer" + +#: wp-includes/js/tinymce/langs/wp-langs.php:448 +msgid "Start image" +msgstr "Imagen de inicio" + +#: wp-includes/js/tinymce/langs/wp-langs.php:450 +msgid "Default volume" +msgstr "Volumen predeterminado" + +#: wp-includes/js/tinymce/langs/wp-langs.php:451 +msgid "Hidden GUI" +msgstr "Ocultar GUI" + +#: wp-includes/js/tinymce/langs/wp-langs.php:454 +msgid "Show scale modes" +msgstr "Mostrar modos de escala" + +#: wp-includes/js/tinymce/langs/wp-langs.php:455 +msgid "Smooth video" +msgstr "Suavizar vídeo" + +#: wp-includes/js/tinymce/langs/wp-langs.php:456 +msgid "JS Callback" +msgstr "Llamada JS" + +#: wp-includes/js/tinymce/langs/wp-langs.php:466 +msgid "Show/Hide Kitchen Sink" +msgstr "Ver/Ocultar botones adicionales" + +#: wp-includes/js/tinymce/langs/wp-langs.php:467 +#: wp-includes/js/tinymce/wp-mce-help.php:256 +msgid "Insert More Tag" +msgstr "Insertar etiqueta Más" + +#: wp-includes/js/tinymce/langs/wp-langs.php:468 +msgid "Insert Page break" +msgstr "Insertar salto de página" + +#: wp-includes/js/tinymce/langs/wp-langs.php:470 +msgid "More..." +msgstr "Más..." + +#: wp-includes/js/tinymce/langs/wp-langs.php:471 +msgid "Next page..." +msgstr "Siguiente página..." + +#: wp-includes/js/tinymce/langs/wp-langs.php:476 +msgid "Edit Gallery" +msgstr "Editar galería" + +#: wp-includes/js/tinymce/langs/wp-langs.php:477 +msgid "Delete Gallery" +msgstr "Eliminar galería" + +#: wp-includes/js/tinymce/langs/wp-langs.php:482 +msgid "Delete Image" +msgstr "Eliminar imagen" + +#: wp-includes/js/tinymce/langs/wp-langs.php:483 +msgid "Advanced Settings" +msgstr "Ajustes avanzados" + +#: wp-includes/js/tinymce/langs/wp-langs.php:489 +msgid "Current Link" +msgstr "Enlace actual" + +#: wp-includes/js/tinymce/langs/wp-langs.php:490 +msgid "Link to Image" +msgstr "Enlazar a imagen" + +#: wp-includes/js/tinymce/langs/wp-langs.php:492 +msgid "Advanced Image Settings" +msgstr "Ajustes avanzados de imágenes" + +#: wp-includes/js/tinymce/langs/wp-langs.php:462 +#: wp-includes/js/tinymce/langs/wp-langs.php:493 +msgid "Source" +msgstr "Fuente" + +#: wp-includes/js/tinymce/langs/wp-langs.php:496 +#: wp-includes/js/tinymce/langs/wp-langs.php:501 +msgid "Original Size" +msgstr "Tamaño original" + +#: wp-includes/js/tinymce/langs/wp-langs.php:497 +#: wp-includes/js/tinymce/langs/wp-langs.php:502 +msgid "CSS Class" +msgstr "Clase CSS" + +#: wp-includes/js/tinymce/langs/wp-langs.php:498 +msgid "Advanced Link Settings" +msgstr "Ajustes avanzados de enlaces" + +#: wp-includes/js/tinymce/langs/wp-langs.php:499 +msgid "Link Rel" +msgstr "Relación del enlace" + +#: wp-includes/js/tinymce/langs/wp-langs.php:503 +msgid "60%" +msgstr "60%" + +#: wp-includes/js/tinymce/langs/wp-langs.php:504 +msgid "70%" +msgstr "70%" + +#: wp-includes/js/tinymce/langs/wp-langs.php:505 +msgid "80%" +msgstr "80%" + +#: wp-includes/js/tinymce/langs/wp-langs.php:506 +msgid "90%" +msgstr "90%" + +#: wp-includes/js/tinymce/langs/wp-langs.php:507 +msgid "100%" +msgstr "100%" + +#: wp-includes/js/tinymce/langs/wp-langs.php:508 +msgid "110%" +msgstr "110%" + +#: wp-includes/js/tinymce/langs/wp-langs.php:509 +msgid "120%" +msgstr "120%" + +#: wp-includes/js/tinymce/langs/wp-langs.php:510 +msgid "130%" +msgstr "130%" + +#: wp-includes/js/tinymce/wp-mce-help.php:16 +msgid "Rich Editor Help" +msgstr "Ayuda del editor visual" + +#: wp-includes/js/tinymce/wp-mce-help.php:200 +msgid "Basics of Rich Editing" +msgstr "Uso básico del editor visual" + +#: wp-includes/js/tinymce/wp-mce-help.php:200 +msgid "Basics" +msgstr "Básico" + +#: wp-includes/js/tinymce/wp-mce-help.php:201 +msgid "Advanced use of the Rich Editor" +msgstr "Uso avanzado del Editor visual" + +#: wp-includes/js/tinymce/wp-mce-help.php:202 +msgid "Hotkeys" +msgstr "Atajos de teclado" + +#: wp-includes/js/tinymce/wp-mce-help.php:203 +msgid "About the software" +msgstr "Acerca del programa" + +#: wp-includes/js/tinymce/wp-mce-help.php:209 +msgid "Rich Editing Basics" +msgstr "Edición visual básica" + +#: wp-includes/js/tinymce/wp-mce-help.php:210 +msgid "Rich editing, also called WYSIWYG for What You See Is What You Get, means your text is formatted as you type. The rich editor creates HTML code behind the scenes while you concentrate on writing. Font styles, links and images all appear approximately as they will on the internet." +msgstr "La edición visual, también llamada WYSIWYG por What You See Is What You Get (en inglés, Lo Que Ves Es Lo Que Obtendrás), consiste en dar formato al texto a medida que lo escribes. El editor visual va creando el código HTML tras las bambalinas mientras tú te centras en escribir. Tipos de letra, enlaces e imágenes se ven tal y como aparecerán en Internet." + +#: wp-includes/js/tinymce/wp-mce-help.php:211 +msgid "WordPress includes a rich HTML editor that works well in all major web browsers used today. However editing HTML is not the same as typing text. Each web page has two major components: the structure, which is the actual HTML code and is produced by the editor as you type, and the display, that is applied to it by the currently selected WordPress theme and is defined in style.css. WordPress is producing valid XHTML 1.0 which means that inserting multiple line breaks (BR tags) after a paragraph would not produce white space on the web page. The BR tags will be removed as invalid by the internal HTML correcting functions." +msgstr "WordPress incluye un editor HTML que suele funcionar bien en los principales navegadores utilizados en la actualidad. Sin embargo, la edición de HTML no es tan fiable como escribir texto. Cada página Web tiene dos componentes principales: la estructura, que es el actual código HTML y es producido por el editor a partir de los que estás escribiendo, y el diseño, que se aplica a ella por el tema seleccionado WordPress y se define en el style.css. Además WordPress válida XHTML 1.0, lo que significa que no se puede mostrar el control de los elementos estructurales. Por lo tanto, la inserción de varios saltos de línea (BR etiquetas) después de un párrafo no da lugar a espacios en blanco en la página web final. La etiquetas BR serán eliminadas como incorrectas por las funciones de corrección." + +#: wp-includes/js/tinymce/wp-mce-help.php:212 +msgid "While using the editor, most basic keyboard shortcuts work like in any other text editor. For example: Shift+Enter inserts line break, Ctrl+C = copy, Ctrl+X = cut, Ctrl+Z = undo, Ctrl+Y = redo, Ctrl+A = select all, etc. (on Mac use the Command key instead of Ctrl). See the Hotkeys tab for all available keyboard shortcuts." +msgstr "Si sueles usar el editor, la mayoría de las combinaciones de teclas básicas funcionan como en cualquier otro editor de texto. Por ejemplo: Shift + Enter inserta un salto de línea, Ctrl + C = copiar, Ctrl + X = cortar, Ctrl + Z = deshacer, Ctrl + Y = rehacer, Ctrl + A = seleccionar todo, etc (en Mac usar la tecla Comando en lugar de Ctrl). Puedes ver la lista de teclas rápidas para todos los atajos de teclado." + +#: wp-includes/js/tinymce/wp-mce-help.php:213 +msgid "If you do not like the way the rich editor works, you may turn it off from Your Profile submenu, under Users in the admin menu." +msgstr "Si no te gusta la forma en que trabaja el editor visual, podrás desactivarlo desde el submenu de tu perfil, en el menú usuario en la administración." + +#: wp-includes/js/tinymce/wp-mce-help.php:217 +msgid "Advanced Rich Editing" +msgstr "Edición visual avanzada" + +#: wp-includes/js/tinymce/wp-mce-help.php:218 +msgid "Images and Attachments" +msgstr "Imágenes y archivos" + +#: wp-includes/js/tinymce/wp-mce-help.php:219 +msgid "There is a button in the editor toolbar for inserting images that are already hosted somewhere on the internet. If you have a URL for an image, click this button and enter the URL in the box which appears." +msgstr "En la barra de herramientas del editor hay un botón para insertar imágenes hospedadas en cualquier sitio de Internet. Si tienes el URL de una imagen, haz clic en ese botón y escríbelo en la ventana que aparecerá." + +#: wp-includes/js/tinymce/wp-mce-help.php:220 +msgid "If you need to upload an image or another media file from your computer, you can use the Media Library buttons above the editor. The media library will attempt to create a thumbnail-sized copy from each uploaded image. To insert your image into the post, first click on the thumbnail to reveal a menu of options. When you have selected the options you like, click \"Send to Editor\" and your image or file will appear in the post you are editing. If you are inserting a movie, there are additional options in the \"Media\" dialog that can be opened from the second toolbar row." +msgstr "Si necesitas subir una imagen o cualquier archivo multimedia de tu ordenador, puedes utilizar los botones de la Librería Multimedia sobre el editor. Esta herramienta tratará de crear una miniatura de la imagen cuando la subas. Para insertar la imagen en la entrada, primero haz clic en la miniatura y aparecerá un menú de opciones. Para insertar la imagen en el editor, primero haz clic en la miniatura y se mostrará un menú de opciones. Selecciona \"Enviar al editor\" y tu imagen o archivo aparecerá en la entrada que estás editando. Si estás insertando un video, aparecen opciones adicionales en el menú a las que se puede acceder desde la segunda fila de botones de la barra de tareas." + +#: wp-includes/js/tinymce/wp-mce-help.php:221 +msgid "HTML in the Rich Editor" +msgstr "HTML en el editor visual" + +#: wp-includes/js/tinymce/wp-mce-help.php:222 +msgid "Any HTML entered directly into the rich editor will show up as text when the post is viewed. What you see is what you get. When you want to include HTML elements that cannot be generated with the toolbar buttons, you must enter it by hand in the HTML editor. Examples are tables and <code>. To do this, click the HTML tab and edit the code, then switch back to Visual mode. If the code is valid and understood by the editor, you should see it rendered immediately." +msgstr "Cualquier etiqueta HTML que escribas en el editor se mostrará como texto al visualizar la entrada. Lo que ves es lo que obtendrás. Si quieres incluir elementos HTML distintos de los generados por los botones de la barra de herramientas, como tablas o <code>, deberás hacerlo a mano en el editor HTML. Para ello, haz clic en el botón HTML, edita el código y haz clic en Actualizar. Si el código es válido y el editor lo entiende, lo verás procesado inmediatamente." + +#: wp-includes/js/tinymce/wp-mce-help.php:223 +msgid "Pasting in the Rich Editor" +msgstr "Pegando en el editor visual" + +#: wp-includes/js/tinymce/wp-mce-help.php:224 +msgid "When pasting content from another web page the results can be inconsistent and depend on your browser and on the web page you are pasting from. The editor tries to correct any invalid HTML code that was pasted, but for best results try using the HTML tab or one of the paste buttons that are on the second row. Alternatively try pasting paragraph by paragraph. In most browsers to select one paragraph at a time, triple-click on it." +msgstr "Cuando se pegan los contenidos de otra página web los resultados pueden ser incompatibles entre sí y dependen de tu navegador y de la página web desde donde estás pegando. El editor intenta corregir cualquier código HTML no válido que se pega, pero para obtener los mejores resultados, prueba a utilizar la pestaña HTML o pegar con uno de los botones que se encuentran en la segunda fila. Alternativamente intenta pegar párrafo por párrafo. En la mayoría de los navegadores, para seleccionar un párrafo a la vez, haz triple clic sobre él." + +#: wp-includes/js/tinymce/wp-mce-help.php:225 +msgid "Pasting content from another application, like Word or Excel, is best done with the Paste from Word button on the second row, or in HTML mode." +msgstr "Al pegar contenido desde otra aplicación, como Word o Excel, se hace mejor con el botón de la segunda fila Pegar desde Word, o en modo HTML." + +#: wp-includes/js/tinymce/wp-mce-help.php:229 +msgid "Writing at Full Speed" +msgstr "Escribir a toda velocidad" + +#: wp-includes/js/tinymce/wp-mce-help.php:230 +msgid "Rather than reaching for your mouse to click on the toolbar, use these access keys. Windows and Linux use Ctrl + letter. Macintosh uses Command + letter." +msgstr "En lugar de mover el ratón para hacer clic en la barra de herramientas, usa estas teclas de acceso rápido. En Windows y Linux usa Ctrl+letra. En Macintosh usa Comando+letra." + +#: wp-includes/js/tinymce/wp-mce-help.php:233 +#: wp-includes/js/tinymce/wp-mce-help.php:247 +msgid "Letter" +msgstr "Letra" + +#: wp-includes/js/tinymce/wp-mce-help.php:233 +#: wp-includes/js/tinymce/wp-mce-help.php:247 +msgid "Action" +msgstr "Acción" + +#: wp-includes/js/tinymce/wp-mce-help.php:235 +msgid "Select all" +msgstr "Seleccionar todos" + +#: wp-includes/js/tinymce/wp-mce-help.php:245 +msgid "The following shortcuts use different access keys: Alt + Shift + letter." +msgstr "Los siguientes atajos utilizan claves de acceso diferentes: Alt + Shift + letra." + +#: wp-includes/js/tinymce/wp-mce-help.php:250 +msgid "Check Spelling" +msgstr "Comprobar ortografía" + +#: wp-includes/js/tinymce/wp-mce-help.php:251 +msgid "Justify Text" +msgstr "Justificar texto" + +#: wp-includes/js/tinymce/wp-mce-help.php:253 +msgid "Insert link" +msgstr "Insertar enlace" + +#: wp-includes/js/tinymce/wp-mce-help.php:254 +msgid "Remove link" +msgstr "Borrar enlace" + +#: wp-includes/js/tinymce/wp-mce-help.php:255 +msgid "Quote" +msgstr "Cita" + +#: wp-includes/js/tinymce/wp-mce-help.php:256 +msgid "Full Screen" +msgstr "Pantalla completa" + +#: wp-includes/js/tinymce/wp-mce-help.php:257 +msgid "Insert Page Break tag" +msgstr "Insertar etiqueta de salto de página" + +#: wp-includes/js/tinymce/wp-mce-help.php:258 +msgid "Switch to HTML mode" +msgstr "Cambiar a modo HTML" + +#: wp-includes/js/tinymce/wp-mce-help.php:271 +msgid "GNU Library General Public Licence" +msgstr "Licencia Pública General de Librería GNU (GPL)" + +#: wp-includes/js/tinymce/wp-mce-help.php:273 +msgid "For more information about this software visit the TinyMCE website." +msgstr "Para más información sobre este software, visita el sitio de TinyMCE." + +#: wp-includes/js/tinymce/wp-mce-help.php:276 +msgid "Got Moxie?" +msgstr "¿Tienes Moxie?" + +#: wp-includes/link-template.php:517 +msgid "Comments Feed" +msgstr "Feed de comentarios" + +#: wp-includes/link-template.php:1177 wp-includes/link-template.php:1455 +msgid "Previous Post" +msgstr "Entrada anterior" + +#: wp-includes/link-template.php:1177 wp-includes/link-template.php:1455 +msgid "Next Post" +msgstr "Entrada siguiente" + +#: wp-includes/link-template.php:1315 +msgid "Last Post" +msgstr "Última entrada" + +#: wp-includes/link-template.php:1803 +msgid "Newer Comments »" +msgstr "Últimos comentarios »" + +#: wp-includes/link-template.php:1840 +msgid "« Older Comments" +msgstr "« Comentarios más viejos" + +#: wp-includes/locale.php:118 +msgid "S_Sunday_initial" +msgstr "D" + +#: wp-includes/locale.php:119 +msgid "M_Monday_initial" +msgstr "L" + +#: wp-includes/locale.php:120 +msgid "T_Tuesday_initial" +msgstr "M" + +#: wp-includes/locale.php:121 +msgid "W_Wednesday_initial" +msgstr "X" + +#: wp-includes/locale.php:122 +msgid "T_Thursday_initial" +msgstr "J" + +#: wp-includes/locale.php:123 +msgid "F_Friday_initial" +msgstr "V" + +#: wp-includes/locale.php:124 +msgid "S_Saturday_initial" +msgstr "S" + +#: wp-includes/locale.php:173 +msgid "am" +msgstr "am" + +#: wp-includes/locale.php:174 +msgid "pm" +msgstr "pm" + +#: wp-includes/locale.php:175 +msgid "AM" +msgstr "AM" + +#: wp-includes/locale.php:176 +msgid "PM" +msgstr "PM" + +#: wp-includes/locale.php:182 +msgid "number_format_thousands_sep" +msgstr "." + +#: wp-includes/media.php:414 +msgid "Could not read image size" +msgstr "No se pudo leer el tamaño de imagen" + +#: wp-includes/media.php:448 wp-includes/media.php:451 +#: wp-includes/media.php:456 +msgid "Resize path invalid" +msgstr "Ruta de redimensionado no válida" + +#: wp-includes/pluggable.php:536 +msgid "ERROR: Invalid username or incorrect password." +msgstr "ERROR: El nombre de usuario y/o la contraseña no son correctos." + +#: wp-includes/pluggable.php:1074 wp-includes/pluggable.php:1187 +msgid "Author : %1$s (IP: %2$s , %3$s)" +msgstr "Autor : %1$s (IP: %2$s , %3$s)" + +#: wp-includes/pluggable.php:1075 wp-includes/pluggable.php:1188 +msgid "E-mail : %s" +msgstr "Correo electrónico : %s" + +#: wp-includes/pluggable.php:1076 wp-includes/pluggable.php:1086 +#: wp-includes/pluggable.php:1095 wp-includes/pluggable.php:1174 +#: wp-includes/pluggable.php:1181 wp-includes/pluggable.php:1189 +msgid "URL : %s" +msgstr "URL : %s" + +#: wp-includes/pluggable.php:1078 wp-includes/pluggable.php:1191 +msgid "Comment: " +msgstr "Comentario:" + +#: wp-includes/pluggable.php:1079 +msgid "You can see all comments on this post here: " +msgstr "Puedes ver todos los comentarios de esta entrada aquí:" + +#: wp-includes/pluggable.php:1081 +msgid "[%1$s] Comment: \"%2$s\"" +msgstr "[%1$s] Comentario: \"%2$s\"" + +#: wp-includes/pluggable.php:1085 wp-includes/pluggable.php:1094 +msgid "Website: %1$s (IP: %2$s , %3$s)" +msgstr "Sitio web: %1$s (IP: %2$s , %3$s)" + +#: wp-includes/pluggable.php:1087 wp-includes/pluggable.php:1096 +msgid "Excerpt: " +msgstr "Extracto:" + +#: wp-includes/pluggable.php:1088 +msgid "You can see all trackbacks on this post here: " +msgstr "Puedes ver todos los trackbacks de esta entrada aquí:" + +#: wp-includes/pluggable.php:1090 +msgid "[%1$s] Trackback: \"%2$s\"" +msgstr "[%1$s] Trackback: \"%2$s\"" + +#: wp-includes/pluggable.php:1097 +msgid "You can see all pingbacks on this post here: " +msgstr "Puede ver todos los pingback de esta entrada aquí:" + +#: wp-includes/pluggable.php:1099 +msgid "[%1$s] Pingback: \"%2$s\"" +msgstr "[%1$s] Pingback: \"%2$s\"" + +#: wp-includes/pluggable.php:1104 wp-includes/pluggable.php:1197 +msgid "Trash it: %s" +msgstr "Enviar a la papelera: %s" + +#: wp-includes/pluggable.php:1106 wp-includes/pluggable.php:1199 +msgid "Delete it: %s" +msgstr "Borrarlo: %s" + +#: wp-includes/pluggable.php:1107 wp-includes/pluggable.php:1200 +msgid "Spam it: %s" +msgstr "Marcarlo como spam: %s" + +#: wp-includes/pluggable.php:1173 wp-includes/pluggable.php:1180 +msgid "Website : %1$s (IP: %2$s , %3$s)" +msgstr "Sitio web : %1$s (IP: %2$s , %3$s)" + +#: wp-includes/pluggable.php:1175 +msgid "Trackback excerpt: " +msgstr "Extracto del trackback:" + +#: wp-includes/pluggable.php:1182 +msgid "Pingback excerpt: " +msgstr "Extracto del pingback:" + +#: wp-includes/pluggable.php:1195 +msgid "Approve it: %s" +msgstr "Aprobarlo: %s" + +#: wp-includes/pluggable.php:1202 +msgid "Currently %s comment is waiting for approval. Please visit the moderation panel:" +msgid_plural "Currently %s comments are waiting for approval. Please visit the moderation panel:" +msgstr[0] "Actualmente hay %s comentario en espera de aprobación. Por favor visita el panel de moderación:" +msgstr[1] "Actualmente hay %s comentarios en espera de aprobación. Por favor visita el panel de moderación:" + +#: wp-includes/pluggable.php:1206 +msgid "[%1$s] Please moderate: \"%2$s\"" +msgstr "[%1$s] Pendientes de moderación: \"%2$s\"" + +#: wp-includes/pluggable.php:1232 +msgid "Password Lost and Changed for user: %s" +msgstr "Contraseña perdida y cambiada para el usuario: %s" + +#: wp-includes/pluggable.php:1236 +msgid "[%s] Password Lost/Changed" +msgstr "[%s] Contraseña Perdida/Cambiada" + +#: wp-includes/pluggable.php:1261 wp-includes/pluggable.php:1269 +#: wp-login.php:216 +msgid "Username: %s" +msgstr "Nombre de usuario: %s" + +#: wp-includes/pluggable.php:1264 +msgid "[%s] New User Registration" +msgstr "[%s] Registro de nuevo usuario" + +#: wp-includes/pluggable.php:1270 +msgid "Password: %s" +msgstr "Contraseña: %s" + +#: wp-includes/pluggable.php:1273 +msgid "[%s] Your username and password" +msgstr "[%s] Tu nombre de usuario y contraseña" + +#: wp-includes/post-template.php:112 +msgid "Protected: %s" +msgstr "Protegido: %s" + +#: wp-includes/post-template.php:115 +msgid "Private: %s" +msgstr "Privado: %s" + +#: wp-includes/post-template.php:268 +msgid "There is no excerpt because this is a protected post." +msgstr "No hay extracto porque es una entrada protegida." + +#: wp-includes/post-template.php:627 +msgid "Next page" +msgstr "Página siguiente" + +#: wp-includes/post-template.php:628 +msgid "Previous page" +msgstr "Página anterior" + +#: wp-includes/post-template.php:890 wp-admin/menu.php:27 +msgid "Home" +msgstr "Inicio" + +#: wp-includes/post-template.php:1215 +msgid "This post is password protected. To view it please enter your password below:" +msgstr "Esta entrada está protegida. Para verla escribe la contraseña:" + +#: wp-includes/post-template.php:1279 +msgctxt "revision date format" +msgid "j F, Y @ G:i" +msgstr "j F, Y @ G:i" + +#: wp-includes/post-template.php:1281 +msgid "%1$s [Autosave]" +msgstr "%s [Autoguardado]" + +#: wp-includes/post-template.php:1283 +msgid "%1$s [Current Revision]" +msgstr "%s [Revisión Actual]" + +#: wp-includes/post-template.php:1349 +msgctxt "post revision" +msgid "%1$s by %2$s" +msgstr "%1$s por %2$s" + +#: wp-includes/post-template.php:1399 +msgid "Compare Revisions" +msgstr "Comparar revisiones" + +#: wp-includes/post.php:71 +msgid "Revision" +msgstr "Revisión" + +#: wp-includes/post.php:97 +msgctxt "post" +msgid "Published" +msgstr "Publicada" + +#: wp-includes/post.php:100 +msgid "Published (%s)" +msgid_plural "Published (%s)" +msgstr[0] "Publicada (%s)" +msgstr[1] "Publicadas (%s)" + +#: wp-includes/post.php:104 +msgctxt "post" +msgid "Scheduled" +msgstr "Programada" + +#: wp-includes/post.php:107 +msgid "Scheduled (%s)" +msgid_plural "Scheduled (%s)" +msgstr[0] "Programada (%s)" +msgstr[1] "Programadas (%s)" + +#: wp-includes/post.php:111 +msgctxt "post" +msgid "Draft" +msgstr "Borrador" + +#: wp-includes/post.php:114 +msgid "Draft (%s)" +msgid_plural "Drafts (%s)" +msgstr[0] "Borrador (%s)" +msgstr[1] "Borradores (%s)" + +#: wp-includes/post.php:118 +msgctxt "post" +msgid "Pending" +msgstr "Pendiente" + +#: wp-includes/post.php:121 +msgid "Pending (%s)" +msgid_plural "Pending (%s)" +msgstr[0] "Pendiente (%s)" +msgstr[1] "Pendientes (%s)" + +#: wp-includes/post.php:125 +msgctxt "post" +msgid "Private" +msgstr "Privada" + +#: wp-includes/post.php:128 +msgid "Private (%s)" +msgid_plural "Private (%s)" +msgstr[0] "Privada (%s)" +msgstr[1] "Privadas (%s)" + +#: wp-includes/post.php:132 +msgctxt "post" +msgid "Trash" +msgstr "Papelera" + +#: wp-includes/post.php:135 +msgid "Trash (%s)" +msgid_plural "Trash (%s)" +msgstr[0] "Papelera (%s)" +msgstr[1] "Papelera (%s)" + +#: wp-includes/post.php:2452 +msgid "Content, title, and excerpt are empty." +msgstr "Contenido, título y extracto están vacios." + +#: wp-includes/post.php:2576 +msgid "Could not update post in the database" +msgstr "No ha sido posible actualizar la entrada en la base de datos" + +#: wp-includes/post.php:2592 +msgid "Could not insert post into the database" +msgstr "No ha sido posible insertar la entrada en la base de datos" + +#: wp-includes/post.php:2642 +msgid "The page template is invalid." +msgstr "La plantilla de la página no es válida." + +#: wp-includes/post.php:4879 +msgid "Cannot create a revision of a revision" +msgstr "No se puede crear una revisión de una revisión" + +#: wp-includes/post.php:5054 +msgid "You do not have permission to preview drafts." +msgstr "No tienes autorización para previsualizar borradores." + +#: wp-includes/user.php:1406 +msgid "Cannot create a user with an empty login name." +msgstr "No se puede crear un usuario con el nombre de identificación vacio." + +#: wp-includes/user.php:1409 +msgid "This username is already registered." +msgstr "Este usuario ya está registrado." + +#: wp-includes/user.php:1424 +msgid "This email address is already registered." +msgstr "Esta dirección de correo electrónico ya está registrada." + +#: wp-includes/user.php:1614 +msgid "AIM" +msgstr "AIM" + +#: wp-includes/user.php:1615 +msgid "Yahoo IM" +msgstr "Yahoo IM" + +#: wp-includes/user.php:1616 +msgid "Jabber / Google Talk" +msgstr "Jabber / Google Talk" + +#: wp-includes/rss.php:900 +msgid "An error has occurred, which probably means the feed is down. Try again later." +msgstr "Ha ocurrido un error, probablemente el feed esté caído. Inténtalo de nuevo más tarde." + +#: wp-includes/script-loader.php:70 +msgid "" +"You are about to permanently delete the selected items.\n" +" 'Cancel' to stop, 'OK' to delete." +msgstr "" +"Estás a punto de borrar permanentemente los elementos seleccionados. \n" +" 'Aceptar' para borrar, 'Cancelar' para salir." + +#: wp-includes/script-loader.php:80 +msgid "(Quick Links)" +msgstr "(Enlaces rápidos)" + +#: wp-includes/script-loader.php:81 +msgid "Enter a word to look up:" +msgstr "Introduce una palabra a buscar:" + +#: wp-includes/script-loader.php:82 +msgid "Dictionary lookup" +msgstr "Buscar en el diccionario" + +#: wp-includes/script-loader.php:83 +msgid "lookup" +msgstr "buscar" + +#: wp-includes/script-loader.php:84 +msgid "Close all open tags" +msgstr "Cerrar todas las etiquetas abiertas" + +#: wp-includes/script-loader.php:85 +msgid "close tags" +msgstr "cerrar etiquetas" + +#: wp-includes/script-loader.php:86 +msgid "Enter the URL" +msgstr "Introduce la URL" + +#: wp-includes/script-loader.php:87 +msgid "Enter the URL of the image" +msgstr "Introduce la URL de la imagen" + +#: wp-includes/script-loader.php:88 +msgid "Enter a description of the image" +msgstr "Introduce una descripción de la imagen" + +#: wp-includes/script-loader.php:107 wp-includes/script-loader.php:307 +msgid "You do not have permission to do that." +msgstr "No tienes autorización para hacer eso." + +#: wp-includes/script-loader.php:108 wp-includes/script-loader.php:308 +msgid "An unidentified error has occurred." +msgstr "Ha ocurrido un error no identificado." + +#: wp-includes/script-loader.php:196 +msgid "Next >" +msgstr "Siguiente >" + +#: wp-includes/script-loader.php:197 +msgid "< Prev" +msgstr "< Anterior" + +#: wp-includes/script-loader.php:198 +msgid "Image" +msgstr "Imagen" + +#: wp-includes/script-loader.php:199 +msgid "of" +msgstr "de" + +#: wp-includes/script-loader.php:201 +msgid "This feature requires inline frames. You have iframes disabled or your browser does not support them." +msgstr "Esta función requiere de frames insertados. Tienes los iframes desactivados o tu navegador no los soporta." + +#: wp-includes/script-loader.php:226 +msgid "not configured" +msgstr "sin configurar" + +#: wp-includes/script-loader.php:229 +msgid "You have attempted to queue too many files." +msgstr "Has intentado poner en cola demasiados archivos." + +#: wp-includes/script-loader.php:231 +msgid "This file is empty. Please try another." +msgstr "Este archivo está vacio. Por favor, prueba con otro." + +#: wp-includes/script-loader.php:232 +msgid "This file type is not allowed. Please try another." +msgstr "Este tipo de archivo no está permitido. Por favor, prueba con otro." + +#: wp-includes/script-loader.php:233 +msgid "An error occurred in the upload. Please try again later." +msgstr "Ha habido un error en la subida. Por favor inténtalo más tarde." + +#: wp-includes/script-loader.php:234 +msgid "There was a configuration error. Please contact the server administrator." +msgstr "Ha habido un problema con la configuración. Por favor, contacta con el administrador del servidor." + +#: wp-includes/script-loader.php:235 +msgid "You may only upload 1 file." +msgstr "Sólo puedes subir 1 archivo." + +#: wp-includes/script-loader.php:236 +msgid "HTTP error." +msgstr "Error HTTP." + +#: wp-includes/script-loader.php:237 +msgid "Upload failed." +msgstr "Falló la subida." + +#: wp-includes/script-loader.php:238 +msgid "IO error." +msgstr "Error de entrada/salida." + +#: wp-includes/script-loader.php:239 +msgid "Security error." +msgstr "Error de seguridad." + +#: wp-includes/script-loader.php:241 +msgid "Upload stopped." +msgstr "Subida detenida." + +#: wp-includes/script-loader.php:243 +msgid "Crunching…" +msgstr "Calculando…" + +#: wp-includes/script-loader.php:244 +msgid "moved to the trash." +msgstr "movidos a la papelera." + +#: wp-includes/script-loader.php:297 +msgid "Separate multiple categories with commas." +msgstr "Separa múltiples categorías con comas." + +#: wp-includes/script-loader.php:263 wp-admin/install.php:256 +msgctxt "password strength" +msgid "Medium" +msgstr "Medio" + +#: wp-includes/script-loader.php:333 +msgid "Tags used on this post:" +msgstr "Etiquetas utilizadas en esta entrada:" + +#: wp-includes/script-loader.php:340 +msgid "Publish on:" +msgstr "Publicar el:" + +#: wp-includes/script-loader.php:341 +msgid "Schedule for:" +msgstr "Programar para el:" + +#: wp-includes/script-loader.php:342 +msgid "Published on:" +msgstr "Publicada el:" + +#: wp-includes/script-loader.php:343 +msgid "Show more comments" +msgstr "Mostrar más comentarios" + +#: wp-includes/script-loader.php:344 +msgid "No more comments found." +msgstr "No hay más comentarios." + +#: wp-includes/script-loader.php:353 +msgid "Password Protected" +msgstr "Protegida con contraseña" + +#: wp-includes/script-loader.php:367 +msgid "Submitted on:" +msgstr "Enviado el:" + +#: wp-includes/script-loader.php:391 wp-includes/script-loader.php:400 +msgid "Error while saving the changes." +msgstr "Error al guardar los cambios." + +#: wp-includes/script-loader.php:392 +msgid "Remove From Bulk Edit" +msgstr "Borrar desde la edición en bloque" + +#: wp-includes/script-loader.php:407 +msgid "Plugin Information:" +msgstr "Información del plugin:" + +#: wp-includes/script-loader.php:432 +msgid "Saving..." +msgstr "Guardando..." + +#: wp-includes/script-loader.php:433 +msgid "Could not set that as the thumbnail image. Try a different attachment." +msgstr "No se pudo establecer como imagen de miniatura. Prueba con otro adjunto." + +#: wp-includes/script-loader.php:563 +msgid "Saving Draft…" +msgstr "Guardando borrador…" + +#: wp-includes/taxonomy.php:490 wp-includes/taxonomy.php:843 +#: wp-includes/taxonomy.php:971 wp-includes/taxonomy.php:1161 +#: wp-includes/taxonomy.php:1834 wp-includes/taxonomy.php:2103 +msgid "Invalid Taxonomy" +msgstr "Taxonomía no válida" + +#: wp-includes/taxonomy.php:838 wp-includes/taxonomy.php:2880 +msgid "Empty Term" +msgstr "Término vacío" + +#: wp-includes/taxonomy.php:1979 +msgid "Invalid term ID" +msgstr "ID del término no válido" + +#: wp-includes/taxonomy.php:1982 wp-includes/taxonomy.php:2300 +msgid "A name is required for this term" +msgstr "Este término necesita un nombre." + +#: wp-includes/taxonomy.php:2024 wp-includes/taxonomy.php:2031 +#: wp-includes/taxonomy.php:2041 +msgid "Could not insert term into the database" +msgstr "No ha sido posible insertar el término en la base de datos." + +#: wp-includes/taxonomy.php:2333 +msgid "The slug “%s” is already in use by another term" +msgstr "El slug “%s” lo está utilizando ya otro término." + +#: wp-includes/taxonomy.php:3044 +msgid "Invalid object ID" +msgstr "El ID del objeto no es válido" + +#: wp-includes/theme.php:282 +msgid "File not readable." +msgstr "Archivo no legible." + +#: wp-includes/theme.php:334 +msgid "Template is missing." +msgstr "Falta la plantilla." + +#: wp-includes/theme.php:336 +msgid "The parent theme is missing. Please install the \"%s\" parent theme." +msgstr "No encontramos el tema principal. Por favor, instala el tema principal \"%s\"." + +#: wp-includes/theme.php:641 +msgid "Stylesheet is missing." +msgstr "Falta la hoja de estilo." + +#: wp-includes/user.php:80 +msgid "ERROR: The username field is empty." +msgstr "ERROR: El campo Nombre de usuario está vacío." + +#: wp-includes/user.php:83 +msgid "ERROR: The password field is empty." +msgstr "ERROR: El campo contraseña está vacío." + +#: wp-includes/user.php:91 +msgid "ERROR: Invalid username. Lost your password?" +msgstr "ERROR: El usuario es incorrecto. ¿La has olvidado?" + +#: wp-includes/user.php:96 +msgid "ERROR: Your account has been marked as a spammer." +msgstr "ERROR: Tu cuenta ha sido marcada como spammer." + +#: wp-includes/user.php:137 +msgid "Please log in again." +msgstr "Por favor, accede de nuevo." + +#: wp-includes/widgets.php:488 wp-includes/widgets.php:547 +msgid "Sidebar %d" +msgstr "Barra lateral %d" + +#: wp-includes/wp-db.php:1479 +msgid "ERROR: WordPress %1$s requires MySQL %2$s or higher" +msgstr "ERROR: WordPress %1$s necesita MySQL %2$s o superior." + +#: wp-login.php:87 +msgid "Powered by WordPress" +msgstr "Funciona gracias a WordPress" + +#: wp-login.php:171 +msgid "ERROR: Enter a username or e-mail address." +msgstr "ERROR: escribe un nombre de usuario o correo electrónico." + +#: wp-login.php:176 +msgid "ERROR: There is no user registered with that email address." +msgstr "ERROR: no hay ningún usuario registrado con esa dirección de correo electrónico." + +#: wp-login.php:188 +msgid "ERROR: Invalid username or e-mail." +msgstr "ERROR: el nombre de usuario o el correo electrónico no son correctos." + +#: wp-login.php:202 +msgid "Password reset is not allowed for this user" +msgstr "El restablecimiento de contraseña no está permitido para este usuario" + +#: wp-login.php:228 +msgid "[%s] Password Reset" +msgstr "[%s] Restablecer contraseña" + +#: wp-login.php:234 +msgid "The e-mail could not be sent." +msgstr "No se pudo enviar el correo electrónico" + +#: wp-login.php:234 +msgid "Possible reason: your host may have disabled the mail() function..." +msgstr "Posible razón: el servidor puede tener deshabilitada la función mail()..." + +#: wp-login.php:255 wp-login.php:258 wp-login.php:263 +msgid "Invalid key" +msgstr "Clave no válida." + +#: wp-login.php:303 +msgid "ERROR: This username is already registered, please choose another one." +msgstr "ERROR: Ese usuario ya existe. Por favor, elige otro." + +#: wp-login.php:308 +msgid "ERROR: Please type your e-mail address." +msgstr "ERROR: Por favor, escribe tu correo electrónico." + +#: wp-login.php:310 +msgid "ERROR: The email address isn’t correct." +msgstr "ERROR: La dirección de correo electrónico no es correcta." + +#: wp-login.php:326 +msgid "ERROR: Couldn’t register you... please contact the webmaster !" +msgstr "ERROR: No es posible registrarte... por favor, ponte en contacto con el administrador" + +#: wp-login.php:398 +msgid "Sorry, that key does not appear to be valid." +msgstr "Disculpa, la contraseña no es válida." + +#: wp-login.php:402 +msgid "Lost Password" +msgstr "Contraseña perdida" + +#: wp-login.php:410 +msgid "Username or E-mail:" +msgstr "Nombre de usuario o correo electrónico:" + +#: wp-login.php:415 +msgid "Get New Password" +msgstr "Obtener una contraseña nueva" + +#: wp-login.php:127 +msgid "Are you lost?" +msgstr "¿Te has perdido?" + +#: wp-login.php:127 +msgid "← Back to %s" +msgstr "« Volver a %s" + +#: wp-login.php:511 +msgid "Registration Form" +msgstr "Formulario de registro" + +#: wp-login.php:511 +msgid "Register For This Site" +msgstr "Registrarte en este sitio" + +#: wp-login.php:524 +msgid "A password will be e-mailed to you." +msgstr "Recibirás una contraseña en este correo electrónico." + +#: wp-login.php:532 wp-login.php:661 wp-login.php:663 +msgid "Password Lost and Found" +msgstr "Recupera tu contraseña perdida" + +#: wp-login.php:532 wp-login.php:661 wp-login.php:663 +msgid "Lost your password?" +msgstr "¿Has perdido tu contraseña?" + +#: wp-login.php:578 +msgid "You have logged in successfully." +msgstr "Te has conectado con éxito." + +#: wp-login.php:607 +msgid "ERROR: Cookies are blocked or not supported by your browser. You must enable cookies to use WordPress." +msgstr "ERROR: Las Cookies están bloqueadas o no las soporta tu navegador. Debes habilitar las cookies para usar WordPress." + +#: wp-login.php:611 +msgid "You are now logged out." +msgstr "Ahora estás desconectado." + +#: wp-login.php:613 +msgid "User registration is currently not allowed." +msgstr "No se permite el registro de nuevos usuarios." + +#: wp-login.php:615 +msgid "Check your e-mail for the confirmation link." +msgstr "Revisa tu correo electrónico para obtener el enlace de confirmación." + +#: wp-login.php:617 +msgid "Check your e-mail for your new password." +msgstr "Revisa tu correo electrónico para obtener la contraseña nueva." + +#: wp-login.php:619 +msgid "Registration complete. Please check your e-mail." +msgstr "Registro completo. Por favor, revisa tu correo electrónico." + +#: wp-login.php:621 +msgid "Your session has expired. Please log-in again." +msgstr "Tu sesión ha expirado. Vuelve a acceder." + +#: wp-mail.php:29 +msgid "Slow down cowboy, no need to check for new mails so often!" +msgstr "¡Tranquilo, campeón! ¡No hace falta comprobar el correo tan a menudo!" + +#: wp-mail.php:49 +msgid "There doesn’t seem to be any new mail." +msgstr "Parece que no hay ningún correo electrónico nuevo." + +#: wp-mail.php:115 +msgid "Author is %s" +msgstr "El autor es %s" + +#: wp-mail.php:221 +msgid "Author: %s" +msgstr "Autor: %s" + +#: wp-mail.php:222 +msgid "Posted title: %s" +msgstr "Título publicado: %s" + +#: wp-mail.php:225 +msgid "Oops: %s" +msgstr "Oops: %s" + +#: wp-mail.php:229 +msgid "Mission complete. Message %s deleted." +msgstr "Misión cumplida. Mensaje %s borrado." + +#: wp-includes/js/tinymce/langs/wp-langs.php:288 +#: wp-includes/js/tinymce/langs/wp-langs.php:304 +#: wp-includes/js/tinymce/langs/wp-langs.php:469 +#: wp-includes/js/tinymce/wp-mce-help.php:257 +#: wp-admin/includes/template.php:1829 +msgid "Help" +msgstr "Ayuda" + +#: wp-admin/includes/template.php:1816 +msgid "Documentation" +msgstr "Documentación" + +#: wp-admin/link-manager.php:50 wp-admin/user-new.php:150 wp-admin/index.php:49 +#: wp-admin/edit-link-form.php:48 wp-admin/options-general.php:70 +#: wp-admin/themes.php:47 wp-admin/media.php:77 wp-admin/custom-header.php:107 +#: wp-admin/options-discussion.php:23 wp-admin/plugin-editor.php:124 +#: wp-admin/plugin-install.php:46 wp-admin/options-privacy.php:24 +#: wp-admin/theme-editor.php:36 wp-admin/tools.php:20 +#: wp-admin/edit-form-advanced.php:178 wp-admin/edit-form-advanced.php:189 +#: wp-admin/comment.php:52 wp-admin/edit-comments.php:124 +#: wp-admin/import.php:24 wp-admin/custom-background.php:89 +#: wp-admin/options-media.php:25 wp-admin/edit.php:170 wp-admin/edit.php:179 +#: wp-admin/upload.php:149 wp-admin/export.php:46 wp-admin/theme-install.php:47 +#: wp-admin/users.php:30 wp-admin/options-writing.php:23 +#: wp-admin/update-core.php:414 wp-admin/options-reading.php:51 +#: wp-admin/includes/template.php:1818 wp-admin/options-permalink.php:28 +#: wp-admin/user-edit.php:48 wp-admin/widgets.php:46 wp-admin/credits.php:21 +#: wp-admin/plugins.php:328 wp-admin/edit-tags.php:218 +#: wp-admin/media-upload.php:70 wp-admin/nav-menus.php:457 +msgid "Support Forums" +msgstr "Foros de soporte (en inglés)" + +#: wp-admin/includes/template.php:1833 +msgid "Screen Options" +msgstr "Opciones de pantalla" + +#: wp-admin/includes/template.php:1888 +msgid "Screen Layout" +msgstr "Diseño de pantalla" + +#: wp-admin/includes/template.php:1888 +msgid "Number of Columns:" +msgstr "Número de columnas:" + +#: wp-admin/includes/theme-install.php:56 +msgid "Search for themes by keyword, author, or tag." +msgstr "Buscar temas por palabra clave, autor o etiqueta." + +#: wp-admin/themes.php:149 wp-admin/includes/theme-install.php:79 +msgid "Feature Filter" +msgstr "Filtrar por características" + +#: wp-admin/includes/theme-install.php:81 +msgid "Find a theme based on specific features" +msgstr "Buscar un tema basándote en determinadas características" + +#: wp-admin/includes/theme.php:270 wp-admin/includes/theme.php:347 +msgid "Colors" +msgstr "Colores" + +#: wp-includes/js/tinymce/langs/wp-langs.php:34 wp-admin/includes/theme.php:271 +msgid "Black" +msgstr "Negro" + +#: wp-includes/general-template.php:2077 +#: wp-includes/js/tinymce/langs/wp-langs.php:47 wp-admin/includes/theme.php:272 +msgid "Blue" +msgstr "Azul" + +#: wp-includes/js/tinymce/langs/wp-langs.php:64 wp-admin/includes/theme.php:273 +msgid "Brown" +msgstr "Marrón" + +#: wp-includes/js/tinymce/langs/wp-langs.php:45 wp-admin/includes/theme.php:275 +msgid "Green" +msgstr "Verde" + +#: wp-includes/js/tinymce/langs/wp-langs.php:43 wp-admin/includes/theme.php:276 +msgid "Orange" +msgstr "Naranja" + +#: wp-includes/js/tinymce/langs/wp-langs.php:66 wp-admin/includes/theme.php:277 +msgid "Pink" +msgstr "Rosa" + +#: wp-includes/js/tinymce/langs/wp-langs.php:56 wp-admin/includes/theme.php:278 +msgid "Purple" +msgstr "Púrpura" + +#: wp-includes/js/tinymce/langs/wp-langs.php:50 wp-admin/includes/theme.php:279 +msgid "Red" +msgstr "Rojo" + +#: wp-includes/js/tinymce/langs/wp-langs.php:65 wp-admin/includes/theme.php:280 +msgid "Silver" +msgstr "Gris" + +#: wp-admin/includes/theme.php:281 +msgid "Tan" +msgstr "Café" + +#: wp-includes/js/tinymce/langs/wp-langs.php:73 wp-admin/includes/theme.php:282 +msgid "White" +msgstr "Blanco" + +#: wp-includes/js/tinymce/langs/wp-langs.php:60 wp-admin/includes/theme.php:283 +msgid "Yellow" +msgstr "Amarillo" + +#: wp-admin/includes/theme.php:284 +msgid "Dark" +msgstr "Negro" + +#: wp-admin/includes/theme.php:288 wp-admin/includes/theme.php:347 +msgid "Columns" +msgstr "Columnas" + +#: wp-admin/includes/theme.php:289 +msgid "One Column" +msgstr "Una columna" + +#: wp-admin/includes/theme.php:290 +msgid "Two Columns" +msgstr "Dos columnas" + +#: wp-admin/includes/theme.php:291 +msgid "Three Columns" +msgstr "Tres columnas" + +#: wp-admin/includes/theme.php:292 +msgid "Four Columns" +msgstr "Cuatro columnas" + +#: wp-admin/includes/theme.php:293 +msgid "Left Sidebar" +msgstr "Barra lateral izquierda" + +#: wp-admin/includes/theme.php:294 +msgid "Right Sidebar" +msgstr "Barra lateral derecha" + +#: wp-includes/js/tinymce/langs/wp-langs.php:494 wp-admin/options-media.php:46 +#: wp-admin/options-media.php:92 wp-admin/includes/theme.php:297 +#: wp-admin/includes/theme.php:347 +msgid "Width" +msgstr "Ancho" + +#: wp-admin/includes/theme.php:298 +msgid "Fixed Width" +msgstr "Ancho fijo" + +#: wp-admin/includes/theme.php:299 +msgid "Flexible Width" +msgstr "Ancho flexible" + +#: wp-admin/includes/theme.php:302 wp-admin/includes/theme.php:348 +msgid "Features" +msgstr "Características" + +#: wp-admin/includes/theme.php:306 +msgid "Custom Colors" +msgstr "Colores personalizados" + +#: wp-admin/includes/theme.php:318 +msgid "Theme Options" +msgstr "Opciones del tema" + +#: wp-admin/includes/theme.php:319 +msgid "Threaded Comments" +msgstr "Comentarios anidados" + +#: wp-admin/includes/theme.php:317 +msgid "Sticky Post" +msgstr "Entrada fija" + +#: wp-admin/includes/theme.php:314 +msgid "Microformats" +msgstr "Microformatos" + +#: wp-admin/includes/theme.php:323 wp-admin/includes/theme.php:348 +msgid "Subject" +msgstr "Asunto" + +#: wp-admin/includes/theme.php:324 +msgid "Holiday" +msgstr "Vacaciones" + +#: wp-admin/includes/theme.php:325 +msgid "Photoblogging" +msgstr "Fotoblogging" + +#: wp-admin/includes/theme.php:326 +msgid "Seasonal" +msgstr "Estacional" + +#: wp-admin/includes/theme-install.php:109 +msgid "Find Themes" +msgstr "Buscar temas" + +#: wp-admin/includes/theme-install.php:117 +msgid "Install a theme in .zip format" +msgstr "Instalar un tema desde un archivo .zip" + +#: wp-admin/includes/theme-install.php:118 +msgid "If you have a theme in a .zip format, you may install it by uploading it here." +msgstr "Si tienes un tema en un archivo .zip, puedes instalarlo subiendo el archivo desde aquí." + +#: wp-admin/includes/theme-install.php:143 +msgid "Install “%s”" +msgstr "Instalar “%s”" + +#: wp-admin/includes/theme-install.php:160 +#: wp-admin/includes/class-wp-plugin-install-list-table.php:192 +msgid "Details" +msgstr "Detalles" + +#: wp-admin/includes/theme-install.php:237 +msgid "Theme Install" +msgstr "Instalar" + +#: wp-admin/includes/theme-install.php:240 +msgid "Error: This theme is currently not available. Please try again later." +msgstr "ERROR: Este tema no está disponible actualmente. Por favor vuelve a intentarlo más tarde." + +#: wp-admin/includes/theme-install.php:246 +msgid "Warning: This theme has not been tested with your current version of WordPress." +msgstr "Atención: Este tema no ha sido probado en esta versión de WordPress." + +#: wp-admin/includes/theme-install.php:248 +msgid "Warning: This theme has not been marked as compatible with your version of WordPress." +msgstr "Atención: Este tema no es compatible con esta versión de WordPress." + +#: wp-admin/includes/theme-install.php:281 +msgid "by %s" +msgstr "por %s" + +#: wp-admin/includes/theme-install.php:282 +msgid "Version: %s" +msgstr "Versión: %s" + +#: wp-admin/includes/theme-install.php:301 +msgid "Newer version (%s) is installed." +msgstr "La última versión (%s) ya está instalada." + +#: wp-admin/includes/theme-install.php:306 +msgid "This version is already installed." +msgstr "Esta versión ya está instalada." + +#: wp-admin/includes/theme.php:93 +msgid "Unable to locate WordPress theme directory." +msgstr "Ha sido imposible localizar el directorio de temas de WordPress." + +#: wp-admin/includes/theme.php:100 +msgid "Could not fully remove the theme %s." +msgstr "No se pudo eliminar completamente el tema %s." + +#: wp-admin/includes/update-core.php:347 +msgid "The update cannot be installed because WordPress %1$s requires PHP version %2$s or higher and MySQL version %3$s or higher. You are running PHP version %4$s and MySQL version %5$s." +msgstr "La actualización no se pudo instalar a causa de que WordPress %1$s requiere la versión %2$s o superior de PHP y la versión %3$s o superior de MySQL. Estás usando la versión %4$s de PHP y la versión %5$s de MySQL." + +#: wp-admin/includes/update-core.php:349 +msgid "The update cannot be installed because WordPress %1$s requires PHP version %2$s or higher. You are running version %3$s." +msgstr "La actualización no puede instalarse ya que WordPress %1$s requiere la versión %2$s o superior de PHP. Estás usando la versión %3$s." + +#: wp-admin/includes/update-core.php:351 +msgid "The update cannot be installed because WordPress %1$s requires MySQL version %2$s or higher. You are running version %3$s." +msgstr "La actualización no puede instalarse porque WordPress %1$s requiere la versión %2$s o superior de MySQL. Estás usando la versión %3$s." + +#: wp-admin/includes/update-core.php:354 +msgid "Verifying the unpacked files…" +msgstr "Verificando los archivos descomprimidos…" + +#: wp-admin/includes/update-core.php:365 +msgid "The update could not be unpacked" +msgstr "No se ha podido descomprimir la actualización." + +#: wp-admin/includes/update-core.php:451 +msgid "Upgrading database…" +msgstr "Actualizado la base de datos…" + +#: wp-admin/includes/class-wp-plugins-list-table.php:429 +#: wp-admin/includes/update.php:89 wp-admin/includes/update.php:112 +msgid "Version %s" +msgstr "Versión %s" + +#: wp-admin/includes/update.php:103 +msgid "You are using a development version (%1$s). Cool! Please stay updated." +msgstr "Estás usando una versión en desarrollo (%1$s). ¡Mola! Por favor, mantente actualizado." + +#: wp-admin/includes/update.php:107 +msgid "Get Version %2$s" +msgstr "Descargar versión %2$s" + +#: wp-admin/includes/update.php:148 +msgid "You are using WordPress %s." +msgstr "Estás usando WordPress %s." + +#: wp-admin/includes/update.php:151 +msgid "Update to %s" +msgstr "Actualizar a %s" + +#: wp-admin/includes/update.php:151 +msgid "Latest" +msgstr "Última" + +#: wp-admin/includes/update.php:305 +msgid "An automated WordPress update has failed to complete - please attempt the update again now." +msgstr "No se ha podido completar la actualización automática de WordPress. Por favor, vuelve a intentarlo." + +#: wp-admin/includes/update.php:307 +msgid "An automated WordPress update has failed to complete! Please notify the site administrator." +msgstr "¡No se ha podido completar la actualización automática de WordPress! Por favor, avisa al administrador." + +#: wp-admin/includes/upgrade.php:68 +msgid "Note that password carefully! It is a random password that was generated just for you." +msgstr "¡Anota la contraseña cuidadosamente! Es una contraseña aleatoria que ha sido generada sólo para ti." + +#: wp-admin/includes/upgrade.php:111 +msgctxt "Default category slug" +msgid "Uncategorized" +msgstr "Sin categoría" + +#: wp-admin/includes/upgrade.php:131 +msgctxt "Default link category slug" +msgid "Blogroll" +msgstr "Sitios de interés" + +#: wp-admin/includes/upgrade.php:204 +msgid "Welcome to WordPress. This is your first post. Edit or delete it, then start blogging!" +msgstr "Bienvenido a WordPress. Esta es tu primera entrada. Edítala o bórrala, ¡y comienza a publicar!." + +#: wp-admin/includes/upgrade.php:213 +msgid "Hello world!" +msgstr "¡Hola mundo!" + +#: wp-admin/includes/upgrade.php:215 +msgctxt "Default post slug" +msgid "hello-world" +msgstr "hola-mundo" + +#: wp-admin/includes/upgrade.php:227 +msgid "Mr WordPress" +msgstr "Sr WordPress" + +#: wp-admin/includes/upgrade.php:229 +msgid "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." +msgstr "Hola, esto es un comentario.
    Para borrar un comentario sólo tienes que entrar y ver los comentarios de la entrada. Entonces tendrás la opción de editar o borrar." + +#: wp-includes/js/tinymce/langs/wp-langs.php:303 +#: wp-includes/js/tinymce/wp-mce-help.php:203 +msgid "About" +msgstr "Acerca de" + +#: wp-admin/users.php:61 wp-admin/includes/user.php:34 +#: wp-admin/includes/user.php:88 +msgid "You can’t give users that role." +msgstr "No puedes dar este perfil a los usuarios." + +#: wp-login.php:298 wp-admin/includes/user.php:135 +msgid "ERROR: Please enter a username." +msgstr "ERROR: Por favor, introduce un nombre de usuario." + +#: wp-admin/includes/user.php:142 wp-admin/includes/user.php:144 +msgid "ERROR: You entered your new password only once." +msgstr "ERROR: Has escrito tu nueva contraseña sólo una vez." + +#: wp-admin/includes/user.php:147 +msgid "ERROR: Please enter your password." +msgstr "ERROR: Por favor, escribe tu contraseña." + +#: wp-admin/includes/user.php:149 +msgid "ERROR: Please enter your password twice." +msgstr "ERROR: Por favor, escribe tu contraseña dos veces." + +#: wp-admin/includes/user.php:154 +msgid "ERROR: Passwords may not contain the character \"\\\"." +msgstr "ERROR: La contraseña no puede contener el carácter \"\\\"." + +#: wp-admin/includes/user.php:158 +msgid "ERROR: Please enter the same password in the two password fields." +msgstr "ERROR: Por favor, introduce la misma contraseña en los dos campos." + +#: wp-admin/includes/user.php:167 +msgid "ERROR: This username is already registered. Please choose another one." +msgstr "ERROR: Ese usuario ya existe. Por favor, elige otro." + +#: wp-admin/includes/user.php:171 +msgid "ERROR: Please enter an e-mail address." +msgstr "ERROR: Por favor, introduce un correo electrónico" + +#: wp-admin/includes/user.php:173 +msgid "ERROR: The e-mail address isn’t correct." +msgstr "ERROR: La dirección de correo electrónico no es correcta." + +#: wp-login.php:313 wp-admin/includes/user.php:175 +msgid "ERROR: This email is already registered, please choose another one." +msgstr "ERROR: Esa dirección de correo electrónico ya está registrada. Por favor, elige otra." + +#: wp-admin/includes/deprecated.php:524 +msgid "No matching users were found!" +msgstr "¡No se encontraron usuarios!" + +#: wp-includes/widgets.php:67 wp-admin/includes/widgets.php:194 +#: wp-admin/widgets.php:273 +msgid "There are no options for this widget." +msgstr "No hay opciones para este widget." + +#: wp-includes/admin-bar.php:108 wp-includes/admin-bar.php:110 +#: wp-includes/admin-bar.php:138 wp-admin/index.php:24 +#: wp-admin/user/menu.php:10 wp-admin/menu.php:25 +msgid "Dashboard" +msgstr "Escritorio" + +#: wp-admin/install.php:60 +msgid "WordPress › Installation" +msgstr "Instalación de WordPress" + +#: wp-admin/install.php:92 +msgid "ERROR: %s" +msgstr "ERROR: %s" + +#: wp-admin/install.php:105 +msgid "User(s) already exists." +msgstr "El (los) usuario(s) ya existe(n)." + +#: wp-includes/script-loader.php:259 wp-login.php:467 wp-admin/user-new.php:314 +#: wp-admin/install.php:122 wp-admin/install.php:253 wp-admin/user-edit.php:375 +msgid "Strength indicator" +msgstr "Seguridad de la contraseña" + +#: wp-login.php:468 wp-admin/user-new.php:315 wp-admin/install.php:123 +#: wp-admin/user-edit.php:376 +msgid "Hint: The password should be at least seven characters long. To make it stronger, use upper and lower case letters, numbers and symbols like ! \" ? $ % ^ & )." +msgstr "Tu contraseña debe tener al menos siete caracteres. Para que tu contraseña sea segura, usa mayúsculas, minúsculas, números y símbolos como ! \" ? $ % ^ & )." + +#: wp-admin/install.php:128 +msgid "Your E-mail" +msgstr "Tu correo electrónico" + +#: wp-admin/install.php:130 +msgid "Double-check your email address before continuing." +msgstr "Comprueba bien tu dirección de correo electrónico antes de continuar." + +#: wp-admin/install.php:136 +msgid "Install WordPress" +msgstr "Instalar WordPress" + +#: wp-admin/install.php:144 +msgid "Already Installed" +msgstr "Ya está instalado" + +#: wp-admin/install.php:144 +msgid "You appear to have already installed WordPress. To reinstall please clear your old database tables first." +msgstr "WordPress parece estar ya instalado. Si deseas reinstalar, por favor, borra las tablas de la base de datos." + +#: wp-admin/install.php:161 +msgid "Insufficient Requirements" +msgstr "Requisitos Insuficientes" + +#: wp-admin/install.php:169 +msgid "Welcome" +msgstr "Bienvenido" + +#: wp-admin/install.php:170 +msgid "Welcome to the famous five minute WordPress installation process! You may want to browse the ReadMe documentation at your leisure. Otherwise, just fill in the information below and you’ll be on your way to using the most extendable and powerful personal publishing platform in the world." +msgstr "¡Bienvenido al famoso proceso de instalación de WordPress de cinco minutos! Tal vez quieras leer tranquilamente la Documentación del archivo Léeme. En caso contrario, rellena los datos más abajo y en seguida estarás utilizando la plataforma de publicación personal más potente y extensible del mundo." + +#: wp-admin/install.php:172 +msgid "Information needed" +msgstr "Información necesaria" + +#: wp-admin/install.php:173 +msgid "Please provide the following information. Don’t worry, you can always change these settings later." +msgstr "Por favor, debes facilitarnos los siguientes datos. No te preocupes, siempre podrás cambiar estos ajustes más tarde." + +#: wp-admin/install.php:205 +msgid "you must provide an e-mail address." +msgstr "debes proporcionar un correo electrónico." + +#: wp-admin/install.php:209 +msgid "that isn’t a valid e-mail address. E-mail addresses look like: username@example.com" +msgstr "esa no es una dirección de correo electrónico válido. Una dirección bien formada tiene este aspecto: usuario@ejemplo.com" + +#: wp-admin/install.php:219 +msgid "Success!" +msgstr "¡Lo lograste!" + +#: wp-admin/install.php:221 +msgid "WordPress has been installed. Were you expecting more steps? Sorry to disappoint." +msgstr "Wordpress se ha instalado correctamente. ¿Esperabas más pasos? Sentimos decepcionarte. :)" + +#: wp-includes/general-template.php:261 wp-login.php:627 wp-login.php:646 +#: wp-admin/install.php:144 wp-admin/install.php:238 +msgid "Log In" +msgstr "Acceder" + +#: wp-includes/script-loader.php:260 wp-admin/install.php:254 +msgid "Very weak" +msgstr "Muy débil" + +#: wp-includes/script-loader.php:261 wp-admin/install.php:255 +msgid "Weak" +msgstr "Débil" + +#: wp-includes/script-loader.php:264 wp-admin/install.php:257 +msgid "Strong" +msgstr "Fuerte" + +#: wp-admin/link-add.php:15 +msgid "Add New Link" +msgstr "Añadir enlace" + +#: wp-includes/taxonomy.php:406 +msgid "Edit Category" +msgstr "Editar Categoría" + +#: wp-admin/link-manager.php:62 wp-admin/edit-link-form.php:56 +#: wp-admin/menu.php:96 +msgctxt "link" +msgid "Add New" +msgstr "Añadir nuevo" + +#: wp-admin/link-manager.php:71 +msgid "%s link deleted." +msgid_plural "%s links deleted" +msgstr[0] "%s enlace eliminado." +msgstr[1] "%s enlaces eliminados." + +#: wp-admin/link-manager.php:79 +msgid "Search Links" +msgstr "Buscar enlaces" + +#: wp-admin/custom-header.php:581 +#: wp-admin/includes/class-wp-links-list-table.php:110 +msgid "Yes" +msgstr "Sí" + +#: wp-admin/includes/class-wp-links-list-table.php:146 +msgid "Visit %s" +msgstr "Visitar %s" + +#: wp-admin/includes/class-wp-links-list-table.php:42 +msgid "No links found." +msgstr "No se encontraron enlaces." + +#: wp-admin/link-parse-opml.php:90 +msgid "XML error: %1$s at line %2$s" +msgstr "Error de XML: %1$s en la línea %2$s" + +#: wp-includes/link-template.php:1056 wp-admin/link.php:104 +msgid "Edit Link" +msgstr "Editar enlace" + +#: wp-admin/link.php:109 +msgid "Link not found." +msgstr "No se encontró el enlace." + +#: wp-admin/maint/repair.php:13 +msgid "WordPress › Database Repair" +msgstr "WordPress › Reparación de la base de datos" + +#: wp-admin/maint/repair.php:22 +msgid "To allow use of this page to automatically repair database problems, please add the following line to your wp-config.php file. Once this line is added to your config, reload this page." +msgstr "Para permitir el uso de esta página y así reparar automáticamente problemas en la base de datos, añade la línea siguiente a tu fichero wp-config.php. Una vez hayas añadido esta línea a tu configuración vuelve a cargar esta página." + +#: wp-admin/maint/repair.php:71 +msgid "Some database problems could not be repaired. Please copy-and-paste the following list of errors to the WordPress support forums to get additional assistance." +msgstr "Algunos problemas de la base de datos no se han podido reparar. Por favor, copia y pega la siguiente lista de errores en los foros de soporte de WordPress para conseguir ayuda." + +#: wp-admin/maint/repair.php:77 +msgid "Repairs complete. Please remove the following line from wp-config.php to prevent this page from being used by unauthorized users." +msgstr "Reparación completa. Quita la siguiente línea del archivo wp-config.php para evitar que esta página la utilicen usuarios sin autorización." + +#: wp-admin/maint/repair.php:85 +msgid "Repair Database" +msgstr "Reparar base de datos" + +#: wp-admin/maint/repair.php:86 +msgid "WordPress can also attempt to optimize the database. This improves performance in some situations. Repairing and optimizing the database can take a long time and the database will be locked while optimizing." +msgstr "WordPress puede también tratar de optimizar la base de datos. Esto mejora el rendimiento en algunas situaciones. Reparar y optimizar la base de datos puede llevar bastante tiempo y la base de datos se bloqueará durante la optimización." + +#: wp-admin/maint/repair.php:87 +msgid "Repair and Optimize Database" +msgstr "Reparar y optimizar la base de datos" + +#: wp-admin/media-upload.php:35 +msgid "You are not allowed to be here" +msgstr "No tienes autorización para estar aquí." + +#: wp-admin/media-upload.php:62 +msgid "Upload New Media" +msgstr "Subir nuevo medio" + +#: wp-admin/media.php:23 wp-admin/media.php:57 +msgid "You are not allowed to edit this attachment." +msgstr "No tienes autorización para editar este archivo adjunto." + +#: wp-admin/media.php:61 +msgid "You attempted to edit an attachment that doesn’t exist. Perhaps it was deleted?" +msgstr "Estás intentando editar un adjunto que no existe. ¿Lo has borrado?" + +#: wp-admin/media.php:62 +msgid "You can’t edit this attachment because it is in the Trash. Please move it out of the Trash and try again." +msgstr "No puedes editar este adjunto ya que está en la Papelera. Sácalo de la Papelera e inténtalo de nuevo." + +#: wp-admin/media.php:88 wp-admin/upload.php:165 wp-admin/upload.php:191 +msgid "Media attachment updated." +msgstr "El archivo ha sido actualizado." + +#: wp-admin/media.php:110 wp-admin/media.php:119 +msgid "Update Media" +msgstr "Actualizar medio" + +#: wp-admin/includes/template.php:1421 wp-admin/includes/template.php:1472 +msgid "Sites" +msgstr "Sitios" + +#: wp-includes/admin-bar.php:305 wp-admin/update-core.php:266 +#: wp-admin/update-core.php:274 wp-admin/menu.php:159 wp-admin/menu.php:164 +msgid "Themes" +msgstr "Temas" + +#: wp-includes/admin-bar.php:126 wp-admin/menu.php:30 +msgid "My Sites" +msgstr "Mis sitios" + +#: wp-admin/menu.php:89 +msgid "Library" +msgstr "Librería multimedia" + +#: wp-admin/media.php:104 wp-admin/upload.php:157 wp-admin/menu.php:91 +msgctxt "file" +msgid "Add New" +msgstr "Añadir nuevo" + +#: wp-includes/post.php:1179 wp-admin/menu.php:102 +msgctxt "page" +msgid "Add New" +msgstr "Añadir nueva" + +#: wp-includes/admin-bar.php:286 wp-admin/menu.php:114 +msgid "Comments %s" +msgstr "Comentarios %s" + +#: wp-includes/admin-bar.php:299 wp-admin/menu.php:158 wp-admin/menu.php:163 +msgid "Appearance" +msgstr "Apariencia" + +#: wp-admin/menu.php:174 +msgctxt "theme editor" +msgid "Editor" +msgstr "Editor" + +#: wp-admin/menu.php:183 +msgid "Plugins %s" +msgstr "Plugins %s" + +#: wp-admin/includes/class-wp-plugin-install-list-table.php:208 +msgid "Installed" +msgstr "Instalados" + +#: wp-admin/plugins.php:384 wp-admin/menu.php:189 +msgctxt "plugin" +msgid "Add New" +msgstr "Añadir nuevo" + +#: wp-admin/menu.php:190 +msgctxt "plugin editor" +msgid "Editor" +msgstr "Editor" + +#: wp-admin/user/menu.php:14 wp-admin/user-edit.php:28 wp-admin/menu.php:198 +msgid "Profile" +msgstr "Perfil" + +#: wp-admin/users.php:363 wp-admin/user-edit.php:176 wp-admin/menu.php:204 +#: wp-admin/menu.php:206 +msgctxt "user" +msgid "Add New" +msgstr "Añadir nuevo" + +#: wp-admin/admin-header.php:156 wp-admin/menu.php:208 wp-admin/menu.php:211 +msgid "Your Profile" +msgstr "Tu perfil" + +#: wp-admin/tools.php:12 wp-admin/menu.php:218 +msgid "Tools" +msgstr "Herramientas" + +#: wp-admin/menu.php:227 wp-admin/options.php:21 +#: wp-content/plugins/akismet/admin.php:45 +msgid "Settings" +msgstr "Ajustes" + +#: wp-admin/menu.php:228 +msgctxt "settings screen" +msgid "General" +msgstr "Generales" + +#: wp-admin/menu.php:229 +msgid "Writing" +msgstr "Escritura" + +#: wp-admin/menu.php:230 +msgid "Reading" +msgstr "Lectura" + +#: wp-admin/menu.php:233 +msgid "Privacy" +msgstr "Privacidad" + +#: wp-admin/menu.php:234 +msgid "Permalinks" +msgstr "Enlaces permanentes" + +#: wp-admin/users.php:376 wp-admin/includes/dashboard.php:464 +msgid "Search Users" +msgstr "Buscar usuarios" + +#: wp-content/plugins/akismet/admin.php:134 +msgid "Options saved." +msgstr "Opciones guardadas." + +#: wp-includes/link-template.php:1315 +msgid "First Post" +msgstr "Primera entrada" + +#: wp-includes/js/tinymce/langs/wp-langs.php:398 +msgid "Enabled" +msgstr "Activado" + +#: wp-includes/js/tinymce/langs/wp-langs.php:291 +msgid "Path" +msgstr "Ruta" + +#: wp-admin/includes/class-wp-users-list-table.php:127 +#: wp-admin/includes/class-wp-users-list-table.php:254 +#: wp-admin/includes/nav-menu.php:189 +msgid "Remove" +msgstr "Eliminar" + +#: wp-admin/user-edit.php:242 +msgid "Role:" +msgstr "Perfil:" + +#: wp-admin/includes/class-wp-plugins-list-table.php:262 +#: wp-admin/includes/class-wp-plugins-list-table.php:377 +msgid "Deactivate" +msgstr "Desactivar" + +#: wp-includes/class-wp-xmlrpc-server.php:316 wp-admin/options-general.php:85 +#: wp-admin/install.php:97 +msgid "Site Title" +msgstr "Título del sitio" + +#: wp-includes/comment-template.php:1525 +msgid "Email" +msgstr "Correo electrónico" + +#: wp-admin/update-core.php:279 wp-admin/update-core.php:308 +#: wp-admin/update-core.php:493 wp-admin/update-core.php:498 +msgid "Update Themes" +msgstr "Actualizar temas" + +#: wp-admin/options-discussion.php:15 +msgid "Discussion Settings" +msgstr "Ajustes de comentarios" + +#: wp-admin/options-discussion.php:38 wp-admin/options-discussion.php:39 +msgid "Default article settings" +msgstr "Ajustes por defecto de las entradas" + +#: wp-admin/options-discussion.php:46 +msgid "Allow link notifications from other blogs (pingbacks and trackbacks.)" +msgstr "Permitir notificaciones de enlace desde otros sitios (pingbacks y trackbacks)" + +#: wp-admin/options-discussion.php:50 +msgid "Allow people to post comments on new articles" +msgstr "Permitir comentarios en las nuevas entradas" + +#: wp-admin/options-discussion.php:52 +msgid "These settings may be overridden for individual articles." +msgstr "Estos ajustes pueden modificarse para cada entrada en particular." + +#: wp-admin/options-discussion.php:56 wp-admin/options-discussion.php:57 +msgid "Other comment settings" +msgstr "Otros ajustes de comentarios" + +#: wp-admin/options-discussion.php:58 +msgid "Comment author must fill out name and e-mail" +msgstr "El autor del comentario debe rellenar el nombre y el correo electrónico" + +#: wp-admin/options-discussion.php:62 +msgid "Users must be registered and logged in to comment" +msgstr "Los usuarios deben registrarse e identificarse para comentar" + +#: wp-admin/options-discussion.php:69 +msgid "Automatically close comments on articles older than %s days" +msgstr "Cerrar automáticamente los comentarios en las entradas con más de %s días" + +#: wp-admin/options-discussion.php:85 +msgid "Enable threaded (nested) comments %s levels deep" +msgstr "Activar los comentarios anidados hasta %s niveles" + +#: wp-admin/options-discussion.php:94 +msgid "last" +msgstr "última" + +#: wp-admin/options-discussion.php:96 +msgid "first" +msgstr "primera" + +#: wp-admin/options-discussion.php:98 +msgid "Break comments into pages with %1$s top level comments per page and the %2$s page displayed by default" +msgstr "Separa los comentarios en páginas de %1$s comentarios por página y se muestra la %2$s página por defecto" + +#: wp-admin/options-discussion.php:106 +msgid "older" +msgstr "más antiguos" + +#: wp-admin/options-discussion.php:108 +msgid "newer" +msgstr "más recientes" + +#: wp-admin/options-discussion.php:110 +msgid "Comments should be displayed with the %s comments at the top of each page" +msgstr "Los comentarios se ordenarán con los %s al principio" + +#: wp-admin/options-discussion.php:116 wp-admin/options-discussion.php:117 +msgid "E-mail me whenever" +msgstr "Enviarme un correo electrónico cuando" + +#: wp-admin/options-discussion.php:120 +msgid "Anyone posts a comment" +msgstr "Alguien envía un comentario" + +#: wp-admin/options-discussion.php:124 +msgid "A comment is held for moderation" +msgstr "Se ha recibido un comentario para moderar" + +#: wp-admin/options-discussion.php:128 wp-admin/options-discussion.php:129 +msgid "Before a comment appears" +msgstr "Para que un comentario aparezca" + +#: wp-admin/options-discussion.php:132 +msgid "An administrator must always approve the comment" +msgstr "Un administrador debe aprobar el comentario" + +#: wp-admin/options-discussion.php:134 +msgid "Comment author must have a previously approved comment" +msgstr "El autor del comentario debe tener un comentario previamente aprobado" + +#: wp-admin/options-discussion.php:138 wp-admin/options-discussion.php:139 +msgid "Comment Moderation" +msgstr "Moderación de comentarios" + +#: wp-admin/options-discussion.php:140 +msgid "Hold a comment in the queue if it contains %s or more links. (A common characteristic of comment spam is a large number of hyperlinks.)" +msgstr "Mantener un comentario en espera si contiene más de %s enlaces (una característica común del spam en comentarios es el gran número de enlaces)." + +#: wp-admin/options-discussion.php:142 +msgid "When a comment contains any of these words in its content, name, URL, e-mail, or IP, it will be held in the moderation queue. One word or IP per line. It will match inside words, so “press” will match “WordPress”." +msgstr "Mantener en la cola de moderación todo comentario que incluya cualquiera de las siguientes palabras en su contenido, nombre, URL, e-mail o IP. Una palabra o IP por línea. Atención a las coincidencias en el interior de palabras: “press” coincidirá con “WordPress”." + +#: wp-admin/options-discussion.php:149 wp-admin/options-discussion.php:150 +msgid "Comment Blacklist" +msgstr "Lista negra de comentarios" + +#: wp-admin/options-discussion.php:151 +msgid "When a comment contains any of these words in its content, name, URL, e-mail, or IP, it will be marked as spam. One word or IP per line. It will match inside words, so “press” will match “WordPress”." +msgstr "Cuando un comentario contenga cualquiera de estas palabras en su contenido, nombre, URL, correo electrónico, o IP, será marcado como spam. Una palabra o IP por línea. Tendrá en cuenta las coincidencias parciales, así que “press” coincidirá con “WordPress”." + +#: wp-admin/options-discussion.php:160 +msgid "Avatars" +msgstr "Avatares" + +#: wp-admin/options-discussion.php:168 wp-admin/options-discussion.php:169 +msgid "Avatar Display" +msgstr "Visibilidad" + +#: wp-admin/options-discussion.php:171 +msgid "Don’t show Avatars" +msgstr "No mostrar avatares" + +#: wp-admin/options-discussion.php:171 +msgid "Show Avatars" +msgstr "Mostrar avatares" + +#: wp-admin/options-discussion.php:180 wp-admin/options-discussion.php:181 +msgid "Maximum Rating" +msgstr "Calificación máxima" + +#: wp-admin/options-discussion.php:186 +msgid "G — Suitable for all audiences" +msgstr "G — Para todos los públicos" + +#: wp-admin/options-discussion.php:188 +msgid "PG — Possibly offensive, usually for audiences 13 and above" +msgstr "PG — Posiblemente ofensivo, normalmente para mayores de 13 años" + +#: wp-admin/options-discussion.php:190 +msgid "R — Intended for adult audiences above 17" +msgstr "R — Destinado a un público adulto mayor de 17" + +#: wp-admin/options-discussion.php:192 +msgid "X — Even more mature than above" +msgstr "X — Contenido más adulto que los anteriores." + +#: wp-admin/options-discussion.php:203 wp-admin/options-discussion.php:204 +msgid "Default Avatar" +msgstr "Avatar por defecto" + +#: wp-admin/options-discussion.php:206 +msgid "For users without a custom avatar of their own, you can either display a generic logo or a generated one based on their e-mail address." +msgstr "Para usuarios que no tengan un avatar personalizado podemos mostrar uno genérico o uno basado en su dirección de correo electrónico." + +#: wp-admin/options-discussion.php:210 +msgid "Mystery Man" +msgstr "Hombre misterioso" + +#: wp-admin/options-discussion.php:211 +msgid "Blank" +msgstr "Sin avatar" + +#: wp-admin/options-discussion.php:212 +msgid "Gravatar Logo" +msgstr "Logo de Gravatar" + +#: wp-admin/options-discussion.php:213 +msgid "Identicon (Generated)" +msgstr "Identicon (autogenerado)" + +#: wp-admin/options-discussion.php:214 +msgid "Wavatar (Generated)" +msgstr "Wavatar (autogenerado)" + +#: wp-admin/options-discussion.php:215 +msgid "MonsterID (Generated)" +msgstr "MonsterID (autogenerado)" + +#: wp-admin/options-general.php:15 +msgid "General Settings" +msgstr "Ajustes generales" + +#: wp-admin/options-general.php:18 +msgctxt "timezone date format" +msgid "Y-m-d G:i:s" +msgstr "d-m-Y G:i" + +#: wp-admin/options-general.php:89 +msgid "Tagline" +msgstr "Descripción corta" + +#: wp-admin/options-general.php:95 +msgid "WordPress address (URL)" +msgstr "Dirección de WordPress (URL)" + +#: wp-admin/options-general.php:104 wp-admin/options-general.php:123 +msgid "E-mail address" +msgstr "Dirección de correo electrónico" + +#: wp-admin/options-general.php:106 +msgid "This address is used for admin purposes, like new user notification." +msgstr "Esta dirección se usa sólo con fines administrativos, como para la notificación de nuevos usuarios." + +#: wp-admin/options-general.php:109 wp-admin/options-general.php:110 +msgid "Membership" +msgstr "Miembros" + +#: wp-admin/options-general.php:112 +msgid "Anyone can register" +msgstr "Cualquiera puede registrarse" + +#: wp-admin/options-general.php:116 +msgid "New User Default Role" +msgstr "Perfil predeterminado para nuevos usuarios" + +#: wp-admin/options-general.php:158 +msgid "Timezone" +msgstr "Zona horaria" + +#: wp-admin/options-general.php:165 +msgid "UTC time is %s" +msgstr "La hora UTC es %s" + +#: wp-admin/options-general.php:167 +msgid "Local time is %1$s" +msgstr "La hora local es %1$s" + +#: wp-admin/options-general.php:170 +msgid "Choose a city in the same timezone as you." +msgstr "Elige una ciudad que esté en la misma zona horaria que la tuya." + +#: wp-admin/options-general.php:181 +msgid "This timezone is currently in standard time." +msgstr "Esta zona horaria se encuentra actualmente en horario de invierno." + +#: wp-admin/options-general.php:203 +msgid "Standard time begins on: %s." +msgstr "El horario de invierno comienza el: %s." + +#: wp-includes/class-wp-xmlrpc-server.php:326 wp-admin/options-general.php:219 +#: wp-admin/options-general.php:221 +msgid "Date Format" +msgstr "Formato de fecha" + +#: wp-admin/options-general.php:244 wp-admin/options-general.php:276 +msgid "Custom:" +msgstr "Personalizado:" + +#: wp-includes/class-wp-xmlrpc-server.php:331 wp-admin/options-general.php:252 +#: wp-admin/options-general.php:254 +msgid "Time Format" +msgstr "Formato de hora" + +#: wp-admin/options-general.php:283 +msgid "Week Starts On" +msgstr "La semana comienza el" + +#: wp-admin/options-head.php:16 wp-admin/options.php:158 +msgid "Settings saved." +msgstr "Ajustes guardados." + +#: wp-admin/options-media.php:15 +msgid "Media Settings" +msgstr "Ajustes de medios" + +#: wp-admin/options-media.php:39 +msgid "Image sizes" +msgstr "Tamaño de las imágenes" + +#: wp-admin/options-media.php:40 +msgid "The sizes listed below determine the maximum dimensions in pixels to use when inserting an image into the body of a post." +msgstr "Los tamaños que se listan a continuación indican las dimensiones máximas a utilizar para insertar una imagen en el contenido de una entrada." + +#: wp-admin/options-media.php:44 +msgid "Thumbnail size" +msgstr "Tamaño de la miniatura" + +#: wp-includes/js/tinymce/langs/wp-langs.php:495 +#: wp-includes/js/tinymce/langs/wp-langs.php:500 wp-admin/options-media.php:48 +#: wp-admin/options-media.php:94 +msgid "Height" +msgstr "Altura" + +#: wp-admin/options-media.php:51 +msgid "Crop thumbnail to exact dimensions (normally thumbnails are proportional)" +msgstr "Recortar las miniaturas en las dimensiones exactas (normalmente, las miniaturas son proporcionales)" + +#: wp-admin/options-media.php:56 wp-admin/options-media.php:57 +msgid "Medium size" +msgstr "Tamaño medio" + +#: wp-admin/options-media.php:58 wp-admin/options-media.php:68 +msgid "Max Width" +msgstr "Anchura máxima" + +#: wp-admin/options-media.php:60 wp-admin/options-media.php:70 +msgid "Max Height" +msgstr "Altura máxima" + +#: wp-admin/options-media.php:66 wp-admin/options-media.php:67 +msgid "Large size" +msgstr "Tamaño grande" + +#: wp-admin/options-media.php:78 +msgid "Embeds" +msgstr "Incrustados" + +#: wp-admin/options-media.php:83 +msgid "Auto-embeds" +msgstr "Auto-incrustados" + +#: wp-admin/options-media.php:90 +msgid "Maximum embed size" +msgstr "Tamaño máximo de incrustación" + +#: wp-admin/options-media.php:96 +msgid "If the width value is left blank, embeds will default to the max width of your theme." +msgstr "Si el valor del ancho se deja vacío, lo que incrustes se verá al valor máximo de ancho de tu tema." + +#: wp-admin/options-media.php:104 +msgid "Uploading Files" +msgstr "Subida de archivos" + +#: wp-admin/options-media.php:107 +msgid "Store uploads in this folder" +msgstr "Guardar los archivos subidos en esta carpeta" + +#: wp-admin/options-media.php:109 +msgid "Default is wp-content/uploads" +msgstr "El predeterminado es wp-content/uploads" + +#: wp-admin/options-media.php:114 +msgid "Full URL path to files" +msgstr "Ruta URL completa a los archivos" + +#: wp-admin/options-media.php:116 +msgid "Configuring this is optional. By default, it should be blank." +msgstr "Esta configuración es opcional. Por defecto debería estar en blanco." + +#: wp-admin/options-media.php:124 +msgid "Organize my uploads into month- and year-based folders" +msgstr "Organizar mis archivos subidos en carpetas basadas en mes y año" + +#: wp-admin/options-permalink.php:15 +msgid "Permalink Settings" +msgstr "Ajustes de los enlaces permanentes" + +#: wp-admin/options-permalink.php:133 +msgid "You should update your web.config now" +msgstr "Ahora debes actualizar tu web.config" + +#: wp-admin/options-permalink.php:135 +msgid "Permalink structure updated. Remove write access on web.config file now!" +msgstr "La estructura de enlaces permanentes se ha actualizado. Elimina el acceso de escritura en el archivo web.config ahora mismo." + +#: wp-admin/options-permalink.php:137 +msgid "Permalink structure updated" +msgstr "Estructura de enlaces permanentes actualizada" + +#: wp-admin/options-permalink.php:140 +msgid "You should update your .htaccess now." +msgstr "Ahora debes actualizar tu .htaccess" + +#: wp-admin/options-permalink.php:142 wp-admin/options-permalink.php:145 +msgid "Permalink structure updated." +msgstr "Estructura de enlaces permanentes actualizada." + +#: wp-admin/options-permalink.php:158 +msgid "By default WordPress uses web URLs which have question marks and lots of numbers in them, however WordPress offers you the ability to create a custom URL structure for your permalinks and archives. This can improve the aesthetics, usability, and forward-compatibility of your links. A number of tags are available, and here are some examples to get you started." +msgstr "Por defecto, WordPress usa URLs que tengan signos de interrogación y un montón de números. Sin embargo, WordPress ofrece la posibilidad de crear una estructura de URL para tus enlaces permanentes y archivos. Esto puede mejorar la estética, usabilidad y compatibilidad de tus enlaces. Hay disponibles ciertas etiquetas, y aquí hay algunos ejemplos para comenzar." + +#: wp-admin/options-permalink.php:174 +msgid "Common settings" +msgstr "Ajustes habituales" + +#: wp-includes/js/tinymce/langs/wp-langs.php:217 +#: wp-admin/options-permalink.php:177 +msgid "Default" +msgstr "Predeterminado" + +#: wp-admin/options-permalink.php:181 +msgid "Day and name" +msgstr "Día y nombre" + +#: wp-admin/options-permalink.php:185 +msgid "Month and name" +msgstr "Mes y nombre" + +#: wp-admin/options-permalink.php:189 +msgid "Numeric" +msgstr "Numérico" + +#: wp-admin/options-permalink.php:195 +msgid "Custom Structure" +msgstr "Estructura personalizada" + +#: wp-admin/options-permalink.php:205 +msgid "Optional" +msgstr "Opcional" + +#: wp-admin/options-permalink.php:207 +msgid "If you like, you may enter custom structures for your category and tag URLs here. For example, using topics as your category base would make your category links like http://example.org/topics/uncategorized/. If you leave these blank the defaults will be used." +msgstr "Si quieres, puedes introducir estructuras personalizadas para las URLs de las categorías y etiquetas. Por ejemplo, usar secciones como categoría base mostraría tus enlaces de categoría como http://ejemplo.org/index.php/secciones/general/. Si dejas esto en blanco se usará la opción predeterminada." + +#: wp-admin/options-permalink.php:209 +msgid "If you like, you may enter custom structures for your category and tag URLs here. For example, using topics as your category base would make your category links like http://example.org/index.php/topics/uncategorized/. If you leave these blank the defaults will be used." +msgstr "Si quieres, puedes introducir estructuras personalizadas para las URLs de las categorías y etiquetas. Por ejemplo, usar secciones como categoría base haría tus enlaces de categoría como http://ejemplo.org/index.php/secciones/general/. Si dejas esto en blanco se usará la opción predeterminada." + +#: wp-admin/options-permalink.php:214 +msgid "Category base" +msgstr "Categoría base" + +#: wp-admin/options-permalink.php:218 +msgid "Tag base" +msgstr "Etiqueta base" + +#: wp-admin/options-permalink.php:232 +msgid "If your web.config file were writable, we could do this automatically, but it isn’t so this is the url rewrite rule you should have in your web.config file. Click in the field and press CTRL + a to select all. Then insert this rule inside of the /<configuration>/<system.webServer>/<rewrite>/<rules> element in web.config file." +msgstr "Si tu archivo web.config tuviera permisos de escritura los cambios se harían automáticamente. Al no ser así, a continuación tienes las reglas de mod_rewrite que debes agregar manualmente a tu archivo web.config que se encuentra en el directorio raíz de WordPress. Haz clic en el área de texto y pulsa CTRL + a para seleccionar todo el texto. Después copia y pega las reglas de la configuración /<configuration>/<system.webServer>/<rewrite>/<rules> en tu archivo web.config." + +#: wp-admin/options-permalink.php:237 +msgid "If you temporarily make your web.config file writable for us to generate rewrite rules automatically, do not forget to revert the permissions after rule has been saved." +msgstr "Si temporalmente tienes que hacer el web.config editable para que podamos generar automaticamente las reglas de reescritura, no te olvides de volverlo a poner como estaba." + +#: wp-admin/options-permalink.php:239 +msgid "If the root directory of your site were writable, we could do this automatically, but it isn’t so this is the url rewrite rule you should have in your web.config file. Create a new file, called web.config in the root directory of your site. Click in the field and press CTRL + a to select all. Then insert this code into the web.config file." +msgstr "Si la carpeta raíz de tu sitio tuviera permisos de escritura, podríamos hacer este cambio automáticamente. Al no tener permisos de escritura, deberás editar tu web.config y añadirla a mano. Crea un nuevo archivo en la carpeta raíz de tu sitio y llámalo web.config. Haz clic en el siguiente campo y teclea CTRL + a para seleccionarlo todo. Luego pega este código en el fichero web.config." + +#: wp-admin/options-permalink.php:244 +msgid "If you temporarily make your site’s root directory writable for us to generate the web.config file automatically, do not forget to revert the permissions after the file has been created." +msgstr "Si das permisos temporales de escritura a la carpeta raíz de tu sitio para que se genere el archivo web.config automáticamente, no olvides revertir los permisos después de que se cree el archivo." + +#: wp-admin/options-permalink.php:249 +msgid "If your .htaccess file were writable, we could do this automatically, but it isn’t so these are the mod_rewrite rules you should have in your .htaccess file. Click in the field and press CTRL + a to select all." +msgstr "Si tu archivo .htaccess tuviera permisos de escritura los cambios se harían automáticamente, pero si no fuera así, aquí tienes las reglas de mod_rewrite que debes agregar manualmente a tu archivo .htaccess. Haz clic en el área de texto y pulsa CTRL + a o COMANDO + a para seleccionarlo todo." + +#: wp-admin/options-privacy.php:15 +msgid "Privacy Settings" +msgstr "Ajustes de privacidad" + +#: wp-admin/options-privacy.php:44 +msgid "I would like to block search engines, but allow normal visitors" +msgstr "Quiero bloquear los motores de búsqueda, pero permitir visitantes normales." + +#: wp-admin/options-reading.php:15 +msgid "Reading Settings" +msgstr "Ajustes de lectura" + +#: wp-admin/options-reading.php:78 wp-admin/options-reading.php:79 +msgid "Front page displays" +msgstr "La página inicial mostrará" + +#: wp-admin/options-reading.php:82 +msgid "Your latest posts" +msgstr "Tus últimas entradas" + +#: wp-admin/options-reading.php:87 +msgid "A static page (select below)" +msgstr "Una página estática (seleccionar abajo)" + +#: wp-admin/options-reading.php:91 +msgid "Front page: %s" +msgstr "Página inicial: %s" + +#: wp-admin/options-reading.php:92 +msgid "Posts page: %s" +msgstr "Página de entradas: %s" + +#: wp-admin/options-reading.php:95 +msgid "Warning: these pages should not be the same!" +msgstr "Atención: estas páginas no pueden ser las mismas." + +#: wp-admin/options-reading.php:101 +msgid "Blog pages show at most" +msgstr "Número máximo de entradas a mostrar en el sitio" + +#: wp-admin/options-reading.php:103 +msgid "posts" +msgstr "entradas" + +#: wp-admin/options-reading.php:107 +msgid "Syndication feeds show the most recent" +msgstr "Número máximo de entradas a mostrar en el feed" + +#: wp-admin/options-reading.php:111 wp-admin/options-reading.php:112 +msgid "For each article in a feed, show" +msgstr "Mostrar, para cada entrada en el feed," + +#: wp-admin/options-reading.php:113 +msgid "Full text" +msgstr "Texto completo" + +#: wp-admin/options-reading.php:114 +msgid "Summary" +msgstr "Resumen" + +#: wp-admin/options-reading.php:119 +msgid "Encoding for pages and feeds" +msgstr "Codificación para páginas y feeds" + +#: wp-admin/options-writing.php:15 +msgid "Writing Settings" +msgstr "Ajustes de escritura" + +#: wp-admin/options-writing.php:38 +msgid "Size of the post box" +msgstr "Tamaño de la caja de texto" + +#: wp-admin/options-writing.php:40 +msgid "lines" +msgstr "líneas" + +#: wp-admin/options-writing.php:43 wp-admin/options-writing.php:44 +msgid "Formatting" +msgstr "Formato" + +#: wp-admin/options-writing.php:47 +msgid "Convert emoticons like :-) and :-P to graphics on display" +msgstr "Convertir emoticonos como :-) y :-P a gráficos en pantalla" + +#: wp-admin/options-writing.php:48 +msgid "WordPress should correct invalidly nested XHTML automatically" +msgstr "WordPress corregirá de forma automática el XHTML incorrectamente anidado" + +#: wp-admin/options-writing.php:52 +msgid "Default Post Category" +msgstr "Categoría predeterminada para las entradas" + +#: wp-admin/options-writing.php:77 +msgid "Default Link Category" +msgstr "Categoría predeterminada para enlaces" + +#: wp-admin/options-writing.php:132 +msgid "Remote Publishing" +msgstr "Publicación remota" + +#: wp-admin/options-writing.php:133 +msgid "To post to WordPress from a desktop blogging client or remote website that uses the Atom Publishing Protocol or one of the XML-RPC publishing interfaces you must enable them below." +msgstr "Para enviar una entrada a WordPress desde un cliente de escritorio o sitio web que utilice el protocolo de publicación Atom o uno de los interfaces de publicación XML-RPC, debes autorizarlos antes." + +#: wp-admin/options-writing.php:136 wp-admin/options-writing.php:137 +msgid "Atom Publishing Protocol" +msgstr "Protocolo de publicación Atom" + +#: wp-admin/options-writing.php:140 +msgid "Enable the Atom Publishing Protocol." +msgstr "Activar el protocolo de publicación Atom." + +#: wp-admin/options-writing.php:144 wp-admin/options-writing.php:145 +#: wp-admin/credits.php:170 +msgid "XML-RPC" +msgstr "XML-RPC" + +#: wp-admin/options-writing.php:148 +msgid "Enable the WordPress, Movable Type, MetaWeblog and Blogger XML-RPC publishing protocols." +msgstr "Activar los protocolos de publicación XML-RPC para WordPress, Movable Type, MetaWeblog y Blogger." + +#: wp-admin/options-writing.php:99 +msgid "Post via e-mail" +msgstr "Publicar por correo electrónico" + +#: wp-admin/options-writing.php:100 +msgid "To post to WordPress by e-mail you must set up a secret e-mail account with POP3 access. Any mail received at this address will be posted, so it’s a good idea to keep this address very secret. Here are three random strings you could use: %s, %s, %s." +msgstr "Para publicar en WordPress por correo electrónico debes crear una cuenta de correo electrónico secreta con acceso POP3. Todo correo recibido en esta dirección será publicado, por ello es buena idea que mantengas esa dirección totalmente secreta. Aquí tienes tres cadenas aleatorias que puedes usar como nombre de cuenta: %s, %s, %s." + +#: wp-admin/options-writing.php:104 +msgid "Mail Server" +msgstr "Servidor de correo" + +#: wp-admin/options-writing.php:106 +msgid "Port" +msgstr "Puerto" + +#: wp-admin/options-writing.php:111 +msgid "Login Name" +msgstr "Nombre de acceso" + +#: wp-admin/options-writing.php:121 +msgid "Default Mail Category" +msgstr "Categoría predeterminada para publicar por correo electrónico" + +#: wp-admin/options-writing.php:155 +msgid "Update Services" +msgstr "Servicios de actualización" + +#: wp-admin/options-writing.php:159 +msgid "When you publish a new post, WordPress automatically notifies the following site update services. For more about this, see Update Services on the Codex. Separate multiple service URLs with line breaks." +msgstr "Cuando publicas una entrada nueva, WordPress lo notifica automáticamente a los siguientes servicios de actualización. Para más información, visita Update Services en el Codex. Separa las URL de distintos servicios con saltos de línea." + +#: wp-admin/options.php:113 +msgid "Error: options page not found." +msgstr "Error: no se encuentra la página de opciones." + +#: wp-admin/options.php:173 +msgid "All Settings" +msgstr "Todos los ajustes" + +#: wp-admin/plugin-editor.php:20 +msgid "Edit Plugins" +msgstr "Editar plugins" + +#: wp-admin/plugin-editor.php:104 +msgid "No such file exists! Double check the name and try again." +msgstr "¡El archivo no existe! Comprueba el nombre e inténtalo de nuevo." + +#: wp-admin/plugin-editor.php:111 +msgid "Files of this type are not editable." +msgstr "Los archivos de este tipo no son editables." + +#: wp-admin/theme-editor.php:122 +msgid "Function Name..." +msgstr "Nombre de la función..." + +#: wp-admin/plugin-editor.php:149 wp-admin/theme-editor.php:134 +msgid "File edited successfully." +msgstr "El archivo ha sido editado correctamente." + +#: wp-admin/plugin-editor.php:151 +msgid "This plugin has been deactivated because your changes resulted in a fatal error." +msgstr "El plugin ha sido desactivado porque tus cambios han provocado un error fatal." + +#: wp-admin/plugin-editor.php:167 +msgid "Editing %s (active)" +msgstr "Editando %s (activo)" + +#: wp-admin/plugin-editor.php:169 +msgid "Browsing %s (active)" +msgstr "Examinando %s (activo)" + +#: wp-admin/plugin-editor.php:172 +msgid "Editing %s (inactive)" +msgstr "Editando %s (inactivo)" + +#: wp-admin/plugin-editor.php:174 +msgid "Browsing %s (inactive)" +msgstr "Examinando %s (inactivo)" + +#: wp-admin/plugin-editor.php:180 +msgid "Select plugin to edit:" +msgstr "Elige el plugin a editar:" + +#: wp-admin/plugin-editor.php:202 +msgid "Plugin Files" +msgstr "Archivos del plugin" + +#: wp-admin/plugin-editor.php:231 wp-admin/theme-editor.php:233 +msgid "Documentation:" +msgstr "Documentación:" + +#: wp-admin/plugin-editor.php:231 wp-admin/theme-editor.php:235 +msgid "Lookup" +msgstr "Buscar" + +#: wp-admin/plugin-editor.php:235 +msgid "Warning: Making changes to active plugins is not recommended. If your changes cause a fatal error, the plugin will be automatically deactivated." +msgstr "Atención: No es recomendable realizar cambios en plugins activos. Si tus cambios provocan un error fatal, el plugin se desactivará automáticamente." + +#: wp-admin/plugin-editor.php:241 +msgid "Update File and Attempt to Reactivate" +msgstr "Actualizar archivo e intentar reactivarlo" + +#: wp-admin/plugin-editor.php:243 wp-admin/theme-editor.php:246 +msgid "Update File" +msgstr "Actualizar archivo" + +#: wp-admin/plugin-editor.php:248 wp-admin/theme-editor.php:248 +msgid "You need to make this file writable before you can save your changes. See the Codex for more information." +msgstr "Para guardar los cambios, es necesario que el archivo tenga permisos de escritura. Visita el codex para obtener más información." + +#: wp-admin/includes/class-wp-plugin-install-list-table.php:33 +msgctxt "Plugin Installer" +msgid "Featured" +msgstr "Destacados" + +#: wp-admin/includes/class-wp-plugin-install-list-table.php:34 +msgctxt "Plugin Installer" +msgid "Popular" +msgstr "Populares" + +#: wp-admin/includes/class-wp-plugin-install-list-table.php:35 +msgctxt "Plugin Installer" +msgid "Newest" +msgstr "Recientes" + +#: wp-admin/includes/class-wp-plugin-install-list-table.php:36 +msgctxt "Plugin Installer" +msgid "Recently Updated" +msgstr "Actualizados recientemente" + +#: wp-admin/plugins.php:263 +msgid "%1$s by %2$s" +msgstr "%1$s por %2$s" + +#: wp-admin/plugins.php:272 +msgid "Are you sure you wish to delete these files?" +msgstr "¿Estás seguro de que deseas eliminar estos archivos?" + +#: wp-admin/plugins.php:282 +msgid "Yes, Delete these files" +msgstr "Sí, quiero borrar estos archivos" + +#: wp-admin/plugins.php:285 +msgid "No, Return me to the plugin list" +msgstr "No, quiero volver a la lista de plugins" + +#: wp-admin/plugins.php:288 +msgid "Click to view entire list of files which will be deleted" +msgstr "Pulsa aquí para ver la lista completa de archivos que serán eliminados" + +#: wp-admin/plugins.php:322 +msgid "Plugins extend and expand the functionality of WordPress. Once a plugin is installed, you may activate it or deactivate it here." +msgstr "Los plugins amplían las funcionalidades de WordPress. Una vez instalados, puedes activarlos o desactivarlos desde aquí." + +#: wp-admin/plugins.php:325 +msgid "If something goes wrong with a plugin and you can’t use WordPress, delete or rename that file in the %s directory and it will be automatically deactivated." +msgstr "Si algo va mal con un plugin y no puedes utilizar tu WordPress, borra o renombra ese archivo en el directorio %s y se desactivará automáticamente." + +#: wp-admin/plugins.php:339 +msgid "The plugin %s has been deactivated due to an error: %s" +msgstr "El plugin %s se ha desactivado debido a un error: %s" + +#: wp-admin/plugins.php:349 +msgid "Plugin could not be activated because it triggered a fatal error." +msgstr "El plugin no ha podido activarse porque ha provocado un error fatal." + +#: wp-admin/plugins.php:364 +msgid "Plugin could not be deleted due to an error: %s" +msgstr "El plugin no se ha podido eliminar debido a un error: %s" + +#: wp-admin/plugins.php:366 +msgid "The selected plugins have been deleted." +msgstr "Los plugins elegidos han sido eliminados." + +#: wp-admin/plugins.php:369 +msgid "Plugin activated." +msgstr "El plugin ha sido activado." + +#: wp-admin/plugins.php:371 +msgid "Selected plugins activated." +msgstr "Los plugins elegidos han sido activados." + +#: wp-admin/plugins.php:373 +msgid "Plugin deactivated." +msgstr "El plugin ha sido desactivado." + +#: wp-admin/plugins.php:375 +msgid "Selected plugins deactivated." +msgstr "Los plugins elegidos han sido desactivados." + +#: wp-admin/plugins.php:377 +msgid "No out of date plugins were selected." +msgstr "Ningún plugin actualizable elegido." + +#: wp-includes/js/tinymce/langs/wp-langs.php:307 +#: wp-admin/includes/class-wp-plugins-list-table.php:193 +msgid "Plugin" +msgstr "Plugin" + +#: wp-admin/includes/class-wp-plugins-list-table.php:368 +#: wp-admin/includes/class-wp-plugins-list-table.php:377 +msgid "Deactivate this plugin" +msgstr "Desactivar este plugin" + +#: wp-admin/includes/class-wp-plugins-list-table.php:368 +msgid "Network Deactivate" +msgstr "Desactivar para la red" + +#: wp-admin/includes/class-wp-upgrader.php:1285 +#: wp-admin/includes/class-wp-plugins-list-table.php:371 +msgid "Activate this plugin for all sites in this network" +msgstr "Activar este plugin para todos los sitios en esta red" + +#: wp-admin/includes/class-wp-upgrader.php:1285 +#: wp-admin/includes/class-wp-plugins-list-table.php:371 +msgid "Network Activate" +msgstr "Activar para la red" + +#: wp-admin/includes/class-wp-plugins-list-table.php:387 +msgid "Open this file in the Plugin Editor" +msgstr "Abrir este archivo en el editor de plugins" + +#: wp-admin/includes/class-wp-plugins-list-table.php:373 +#: wp-admin/includes/class-wp-plugins-list-table.php:382 +msgid "Delete this plugin" +msgstr "Borrar este plugin" + +#: wp-admin/includes/class-wp-plugins-list-table.php:437 +msgid "Visit plugin site" +msgstr "Visitar la web del plugin" + +#: wp-admin/includes/class-wp-plugins-list-table.php:292 +msgid "Clear List" +msgstr "Limpiar lista" + +#: wp-admin/includes/class-wp-plugins-list-table.php:212 +msgctxt "plugins" +msgid "All (%s)" +msgid_plural "All (%s)" +msgstr[0] "Todo (%s)" +msgstr[1] "Todos (%s)" + +#: wp-admin/includes/class-wp-plugins-list-table.php:215 +msgid "Active (%s)" +msgid_plural "Active (%s)" +msgstr[0] "Activo (%s)" +msgstr[1] "Activos (%s)" + +#: wp-admin/includes/class-wp-plugins-list-table.php:218 +msgid "Recently Active (%s)" +msgid_plural "Recently Active (%s)" +msgstr[0] "Activo recientemente (%s)" +msgstr[1] "Activos recientemente (%s)" + +#: wp-admin/includes/class-wp-plugins-list-table.php:221 +msgid "Inactive (%s)" +msgid_plural "Inactive (%s)" +msgstr[0] "Inactivo (%s)" +msgstr[1] "Inactivos (%s)" + +#: wp-admin/includes/class-wp-plugins-list-table.php:224 +msgid "Network (%s)" +msgid_plural "Network (%s)" +msgstr[0] "Red (%s)" +msgstr[1] "Red (%s)" + +#: wp-admin/includes/class-wp-plugins-list-table.php:183 +msgid "No plugins found." +msgstr "No se encontraron plugins." + +#: wp-admin/includes/class-wp-plugins-list-table.php:185 +msgid "You do not appear to have any plugins available at this time." +msgstr "No parece que tengas plugins disponibles en este momento." + +#: wp-admin/post.php:149 +msgid "You attempted to edit an item that doesn’t exist. Perhaps it was deleted?" +msgstr "Lo que intentas editar no existe. ¿Habrá sido borrado?" + +#: wp-admin/async-upload.php:38 wp-admin/post.php:152 +#: wp-admin/edit-tags.php:227 +msgid "You are not allowed to edit this item." +msgstr "No tienes autorización para editar esto." + +#: wp-admin/post.php:155 +msgid "You can’t edit this item because it is in the Trash. Please restore it and try again." +msgstr "No puedes editar esto ya que está en la Papelera. Sácala de la Papelera e inténtalo de nuevo." + +#: wp-admin/async-upload.php:35 wp-admin/post.php:158 +msgid "Unknown post type." +msgstr "Tipo de entrada desconocida." + +#: wp-admin/press-this.php:132 +msgid "Embed Code" +msgstr "Incrustar código" + +#: wp-admin/press-this.php:135 +msgid "Insert Video" +msgstr "Insertar vídeo" + +#: wp-admin/press-this.php:161 +msgid "Click to insert." +msgstr "Clic para insertar." + +#: wp-includes/js/tinymce/wp-mce-help.php:255 wp-admin/press-this.php:165 +#: wp-admin/press-this.php:193 +msgid "Insert Image" +msgstr "Insertar imagen" + +#: wp-admin/press-this.php:263 +msgid "Unable to retrieve images or no images on page." +msgstr "No se pueden extraer imágenes o no hay imágenes en la página." + +#: wp-admin/press-this.php:315 +msgid "click images to select" +msgstr "haz clic en las imágenes para seleccionar" + +#: wp-admin/press-this.php:315 +msgid "Add from URL" +msgstr "Añadir desde URL" + +#: wp-admin/press-this.php:315 +msgid "Refresh" +msgstr "Actualizar" + +#: wp-admin/press-this.php:417 +msgid "Loading..." +msgstr "Cargando..." + +#: wp-admin/press-this.php:570 wp-admin/press-this.php:574 +msgid "Post Tags" +msgstr "Etiquetas de las entradas" + +#: wp-admin/press-this.php:600 +msgid "Your post has been saved." +msgstr "Tu entrada ha sido guardada correctamente." + +#: wp-admin/press-this.php:600 +msgid "View post" +msgstr "Ver entrada" + +#: wp-admin/press-this.php:600 +msgid "Close Window" +msgstr "Cerrar ventana" + +#: wp-admin/press-this.php:626 wp-admin/press-this.php:627 +msgid "Insert an Image" +msgstr "Insertar imagen" + +#: wp-admin/press-this.php:629 +msgid "Embed a Video" +msgstr "Insertar vídeo" + +#: wp-includes/general-template.php:1808 wp-includes/general-template.php:1813 +#: wp-admin/includes/post.php:1789 wp-admin/press-this.php:616 +msgid "HTML" +msgstr "HTML" + +#: wp-includes/general-template.php:1809 wp-includes/general-template.php:1814 +#: wp-admin/includes/post.php:1788 wp-admin/press-this.php:617 +msgid "Visual" +msgstr "Visual" + +#: wp-admin/press-this.php:640 +msgid "via " +msgstr "vía " + +#: wp-admin/revision.php:96 +msgid "Compare Revisions of “%1$s”" +msgstr "Comparar revisiones de “%s”" + +#: wp-admin/revision.php:122 +msgid "Revision for “%1$s” created on %2$s" +msgstr "Revisión para “%1$s” creada el %2$s" + +#: wp-admin/revision.php:162 +msgid "Older: %s" +msgstr "Anteriores: %s" + +#: wp-admin/revision.php:163 +msgid "Newer: %s" +msgstr "Recientes: %s" + +#: wp-admin/revision.php:196 +msgid "These revisions are identical." +msgstr "Estas revisiones son idénticas." + +#: wp-includes/default-widgets.php:66 wp-includes/default-widgets.php:196 +#: wp-includes/default-widgets.php:262 wp-includes/default-widgets.php:317 +#: wp-includes/default-widgets.php:357 wp-includes/default-widgets.php:403 +#: wp-includes/default-widgets.php:489 wp-includes/default-widgets.php:582 +#: wp-includes/default-widgets.php:679 wp-includes/default-widgets.php:1026 +#: wp-includes/default-widgets.php:1099 +#: wp-content/plugins/akismet/widget.php:51 +msgid "Title:" +msgstr "Título:" + +#: wp-admin/themes.php:123 wp-admin/includes/class-wp-themes-list-table.php:193 +msgid "Tags:" +msgstr "Etiquetas:" + +#: wp-includes/script-loader.php:336 wp-includes/taxonomy.php:411 +msgid "Separate tags with commas" +msgstr "Separa las etiquetas con comas." + +#: wp-admin/theme-editor.php:20 +msgid "Edit Themes" +msgstr "Editar temas" + +#: wp-admin/theme-editor.php:52 +msgid "The requested theme does not exist." +msgstr "El tema solicitado no existe." + +#: wp-admin/theme-editor.php:152 +msgid "Select theme to edit:" +msgstr "Elige el tema a editar:" + +#: wp-admin/theme-editor.php:173 +msgid "Templates" +msgstr "Plantillas" + +#: wp-admin/theme-editor.php:254 +msgid "Oops, no such file exists! Double check the name and try again, merci." +msgstr "¡El archivo no existe! Comprueba el nombre e inténtalo de nuevo, gracias." + +#: wp-admin/includes/class-wp-theme-install-list-table.php:33 +msgctxt "Theme Installer" +msgid "Featured" +msgstr "Destacados" + +#: wp-admin/includes/class-wp-theme-install-list-table.php:35 +msgctxt "Theme Installer" +msgid "Newest" +msgstr "Recientes" + +#: wp-admin/includes/class-wp-theme-install-list-table.php:36 +msgctxt "Theme Installer" +msgid "Recently Updated" +msgstr "Actualizados recientemente" + +#: wp-admin/themes.php:61 +msgid "The active theme is broken. Reverting to the default theme." +msgstr "El tema activo está dañado. Volviendo al tema por defecto." + +#: wp-admin/themes.php:66 +msgid "New theme activated. Visit site" +msgstr "Nuevo tema activado. Visitar sitio" + +#: wp-admin/themes.php:69 +msgid "Theme deleted." +msgstr "El tema ha sido eliminado." + +#: wp-admin/themes.php:82 +msgid "Current Theme" +msgstr "Tema actual" + +#: wp-admin/themes.php:85 +msgid "Current theme preview" +msgstr "Vista previa del tema actual" + +#: wp-admin/themes.php:89 wp-admin/includes/class-wp-themes-list-table.php:183 +msgid "%1$s %2$s by %3$s" +msgstr "%1$s %2$s por %3$s" + +#: wp-admin/includes/class-wp-themes-list-table.php:190 +msgid "All of this theme’s files are located in %2$s." +msgstr "Todos los archivos de este tema se encuentran en %2$s." + +#: wp-admin/themes.php:139 +msgid "Available Themes" +msgstr "Temas disponibles" + +#: wp-admin/includes/class-wp-themes-list-table.php:162 +msgid "Preview of “%s”" +msgstr "Vista previa de “%s”" + +#: wp-admin/includes/class-wp-themes-list-table.php:171 +msgid "" +"You are about to delete this theme '%s'\n" +" 'Cancel' to stop, 'OK' to delete." +msgstr "" +"Estás a punto de borrar este tema '%s'\n" +" 'Aceptar' para borrar, 'Cancelar' para salir." + +#: wp-admin/themes.php:207 +msgid "Broken Themes" +msgstr "Temas dañados" + +#: wp-admin/tools.php:33 wp-admin/options-writing.php:89 +msgid "Press This is a bookmarklet: a little app that runs in your browser and lets you grab bits of the web." +msgstr "Publicar esto es un marcador: una pequeña aplicación que se ejecuta en el navegador y permite coger secciones de la web." + +#: wp-admin/tools.php:36 wp-admin/options-writing.php:91 +msgid "Drag-and-drop the following link to your bookmarks bar or right click it and add it to your favorites for a posting shortcut." +msgstr "Arrastra el siguente enlace y colócalo en tu barra de marcadores o haz clic con el botón derecho para añadirlo en tu lista de favoritos como un atajo de publicación de entradas." + +#: wp-admin/update-core.php:36 +msgid "Download nightly build" +msgstr "Descargando la última versión de desarrollo" + +#: wp-admin/update-core.php:56 +msgid "Download %s" +msgstr "Descargar %s" + +#: wp-admin/update-core.php:78 +msgid "Hide this update" +msgstr "Ocultar esta actualización" + +#: wp-admin/update-core.php:80 +msgid "Bring back this update" +msgstr "Volver a mostrar esta actualización" + +#: wp-admin/update-core.php:83 +msgid "This localized version contains both the translation and various other localization fixes. You can skip upgrading if you want to keep your current translation." +msgstr "Esta versión traducida contiene tanto la traducción como otros ajustes de traducción. Puedes saltarte la actualización si quieres mantener la traducción actual." + +#: wp-admin/update-core.php:95 wp-admin/update-core.php:107 +msgid "Show hidden updates" +msgstr "Mostrar actualizaciones ocultas" + +#: wp-admin/update-core.php:96 +msgid "Hide hidden updates" +msgstr "Ocultar actualizaciones ocultas" + +#: wp-includes/js/tinymce/langs/wp-langs.php:150 wp-admin/update-core.php:211 +#: wp-admin/update-core.php:218 wp-admin/update-core.php:284 +#: wp-admin/update-core.php:291 wp-admin/includes/nav-menu.php:781 +#: wp-admin/includes/nav-menu.php:958 +msgid "Select All" +msgstr "Elegir todo" + +#: wp-admin/update-core.php:227 +msgid "Compatibility with WordPress %1$s: 100%% (according to its author)" +msgstr "Compatibilidad con WordPress %1$s: 100%% (según su autor)" + +#: wp-admin/update-core.php:230 wp-admin/update-core.php:238 +msgid "Compatibility with WordPress %1$s: %2$d%% (%3$d \"works\" votes out of %4$d total)" +msgstr "Compatibilidad con WordPress %1$s: %2$d%% (%3$d votos de \"funciona\" de un total de %4$d)" + +#: wp-admin/update-core.php:232 wp-admin/update-core.php:240 +msgid "Compatibility with WordPress %1$s: Unknown" +msgstr "Compatibilidad con WordPress %1$s: Desconocida" + +#: wp-admin/update-core.php:362 +msgid "Installation Failed" +msgstr "Instalación fallida" + +#: wp-admin/update.php:78 +msgid "Plugin Reactivation" +msgstr "Reactivación del plugin" + +#: wp-admin/update.php:80 +msgid "Plugin reactivated successfully." +msgstr "El plugin ha sido reactivado." + +#: wp-admin/update.php:83 +msgid "Plugin failed to reactivate due to a fatal error." +msgstr "El plugin no ha sido reactivado debido a un error fatal." + +#: wp-admin/update.php:108 +msgid "Installing Plugin: %s" +msgstr "Instalando plugin: %s" + +#: wp-admin/update.php:130 +msgid "Upload Plugin" +msgstr "Subir plugin" + +#: wp-admin/update.php:135 +msgid "Installing Plugin from uploaded file: %s" +msgstr "Instalando plugin desde el archivo: %s" + +#: wp-admin/update.php:211 +msgid "Installing Theme: %s" +msgstr "Instalando tema: %s" + +#: wp-admin/update.php:230 +msgid "Upload Theme" +msgstr "Subir tema" + +#: wp-admin/update.php:237 +msgid "Installing Theme from uploaded file: %s" +msgstr "Instalando tema desde el archivo: %s" + +#: wp-admin/upgrade.php:61 +msgid "Your WordPress database is already up-to-date!" +msgstr "¡Tu base de datos de WordPress ya está actualizada!" + +#: wp-admin/upgrade.php:98 +msgid "%s queries" +msgstr "%s consultas" + +#: wp-admin/upgrade.php:100 +msgid "%s seconds" +msgstr "%s segundos" + +#: wp-admin/upload.php:42 +msgid "You are not allowed to scan for lost attachments." +msgstr "No tienes autorización para buscar adjuntos perdidos." + +#: wp-admin/upload.php:95 +msgid "You are not allowed to move this post to the trash." +msgstr "No tienes autorización para mover esta entrada a la papelera." + +#: wp-admin/upload.php:105 +msgid "You are not allowed to move this post out of the trash." +msgstr "No tienes autorización para sacar esta entrada de la papelera." + +#: wp-admin/upload.php:115 +msgid "You are not allowed to delete this post." +msgstr "No tienes autorización para borrar esta entrada." + +#: wp-admin/upload.php:171 +msgid "Reattached %d attachment." +msgid_plural "Reattached %d attachments." +msgstr[0] "Se ha vuelto a adjuntar %d adjunto." +msgstr[1] "Se han vuelto a adjuntar %d adjuntos." + +#: wp-admin/upload.php:176 +msgid "Media attachment permanently deleted." +msgid_plural "%d media attachments permanently deleted." +msgstr[0] "Medio adjunto borrado permanentemente." +msgstr[1] "%d medios adjuntos borrados permanentemente." + +#: wp-admin/upload.php:181 +msgid "Media attachment moved to the trash." +msgid_plural "%d media attachments moved to the trash." +msgstr[0] "Medio adjunto movido a la papelera." +msgstr[1] "%d medios adjuntos movidos a la papelera." + +#: wp-admin/upload.php:187 +msgid "Media attachment restored from the trash." +msgid_plural "%d media attachments restored from the trash." +msgstr[0] "Medio adjunto restaurado de la papelera." +msgstr[1] "%d medios adjuntos restaurados de la papelera." + +#: wp-admin/upload.php:192 +msgid "Media permanently deleted." +msgstr "Medio borrado permanentemente." + +#: wp-admin/upload.php:193 +msgid "Error saving media attachment." +msgstr "Error al guardar el archivo." + +#: wp-admin/upload.php:194 +msgid "Media moved to the trash." +msgstr "Medios movidos a la papelera." + +#: wp-admin/upload.php:195 +msgid "Media restored from the trash." +msgstr "Medios restaurados de la papelera." + +#: wp-admin/includes/class-wp-media-list-table.php:57 +msgctxt "uploaded files" +msgid "All (%s)" +msgid_plural "All (%s)" +msgstr[0] "Todo (%s)" +msgstr[1] "Todos (%s)" + +#: wp-admin/includes/class-wp-media-list-table.php:69 +msgctxt "detached files" +msgid "Unattached (%s)" +msgid_plural "Unattached (%s)" +msgstr[0] "Sin adjuntar (%s)" +msgstr[1] "Sin adjuntar (%s)" + +#: wp-admin/includes/class-wp-media-list-table.php:72 +msgctxt "uploaded files" +msgid "Trash (%s)" +msgid_plural "Trash (%s)" +msgstr[0] "Papelera (%s)" +msgstr[1] "Papelera (%s)" + +#: wp-admin/includes/class-wp-media-list-table.php:81 +msgid "Attach to a post" +msgstr "Adjuntar a una entrada" + +#: wp-admin/includes/class-wp-media-list-table.php:100 +msgid "Scan for lost attachments" +msgstr "Buscar adjuntos perdidos" + +#: wp-admin/user-edit.php:28 +msgid "Edit User" +msgstr "Editar usuario" + +#: wp-admin/user-edit.php:22 wp-admin/user-edit.php:24 +msgid "Invalid user ID." +msgstr "El ID del usuario no es válido." + +#: wp-admin/user-edit.php:66 +msgid "Use https" +msgstr "Usar https" + +#: wp-admin/user-edit.php:67 +msgid "Always use https when visiting the admin" +msgstr "Usar siempre https para visitar la administración" + +#: wp-admin/user-edit.php:75 wp-admin/user-edit.php:102 +#: wp-admin/user-edit.php:149 +msgid "You do not have permission to edit this user." +msgstr "No tienes autorización para editar este usuario." + +#: wp-admin/user-edit.php:159 +msgid "User updated." +msgstr "El usuario ha sido actualizado." + +#: wp-admin/user-edit.php:193 +msgid "Personal Options" +msgstr "Opciones personales" + +#: wp-admin/user-edit.php:198 +msgid "Visual Editor" +msgstr "Editor visual" + +#: wp-admin/user-edit.php:199 +msgid "Disable the visual editor when writing" +msgstr "Desactivar el editor visual al escribir" + +#: wp-admin/includes/misc.php:567 wp-admin/user-edit.php:204 +msgid "Admin Color Scheme" +msgstr "Esquema de color de administración" + +#: wp-admin/user-edit.php:212 +msgid "Enable keyboard shortcuts for comment moderation." +msgstr "Activar los atajos del teclado para la moderación de comentarios." + +#: wp-admin/user-new.php:296 wp-admin/user-edit.php:274 +msgid "First Name" +msgstr "Nombre" + +#: wp-admin/user-new.php:300 wp-admin/user-edit.php:279 +msgid "Last Name" +msgstr "Apellidos" + +#: wp-admin/user-edit.php:284 +msgid "Nickname" +msgstr "Alias" + +#: wp-includes/theme-compat/comments.php:78 +#: wp-includes/theme-compat/comments.php:81 wp-admin/user-new.php:287 +#: wp-admin/user-new.php:291 wp-admin/user-edit.php:284 +#: wp-admin/user-edit.php:329 +msgid "(required)" +msgstr "(requerido)" + +#: wp-admin/user-edit.php:289 +msgid "Display name publicly as" +msgstr "Mostrar este nombre públicamente" + +#: wp-admin/user-edit.php:325 +msgid "Contact Info" +msgstr "Información de contacto" + +#: wp-includes/theme-compat/comments.php:84 +#: wp-includes/comment-template.php:1527 wp-admin/user-new.php:304 +#: wp-admin/user-edit.php:342 +msgid "Website" +msgstr "Web" + +#: wp-admin/user-edit.php:358 +msgid "About Yourself" +msgstr "Acerca de ti" + +#: wp-admin/user-edit.php:358 +msgid "About the user" +msgstr "Acerca del usuario" + +#: wp-admin/user-edit.php:362 +msgid "Biographical Info" +msgstr "Información biográfica" + +#: wp-admin/user-edit.php:364 +msgid "Share a little biographical information to fill out your profile. This may be shown publicly." +msgstr "Incluye alguna información biográfica en tu perfil. Podrá mostrarse públicamente." + +#: wp-admin/user-edit.php:372 +msgid "New Password" +msgstr "Nueva contraseña" + +#: wp-admin/user-edit.php:373 +msgid "If you would like to change the password type a new one. Otherwise leave this blank." +msgstr "Si deseas cambiar la contraseña del usuario, escribe aquí dos veces la nueva. En caso contrario, deja las casillas en blanco." + +#: wp-admin/user-edit.php:374 +msgid "Type your new password again." +msgstr "Teclea tu nueva contraseña otra vez." + +#: wp-admin/user-edit.php:393 +msgid "Additional Capabilities" +msgstr "Capacidades adicionales" + +#: wp-admin/user-edit.php:412 +msgid "Update Profile" +msgstr "Actualizar perfil" + +#: wp-admin/user-edit.php:412 +msgid "Update User" +msgstr "Actualizar usuario" + +#: wp-admin/user-new.php:75 +msgid "" +"Hi,\n" +"\n" +"You have been invited to join '%s' at\n" +"%s as a %s.\n" +"Please click the following link to confirm the invite:\n" +"%s\n" +msgstr "" +"Hola,\n" +"\n" +"Has sido invitado a participar de '%s' en\n" +"%s como %s.\n" +"Por favor, haz clic en el enlace para aceptar la invitación:\n" +"%s\n" + +#: wp-admin/user-new.php:76 +msgid "[%s] Joining confirmation" +msgstr "[%s] Esperando confirmación" + +#: wp-admin/user-new.php:129 wp-admin/user-new.php:265 wp-admin/menu.php:213 +#: wp-admin/menu.php:215 +msgid "Add New User" +msgstr "Añadir nuevo usuario" + +#: wp-admin/user-new.php:163 +msgid "Invitation email sent to new user. A confirmation link must be clicked before their account is created." +msgstr "La invitación ha sido enviada al nuevo usuario por correo electrónico. Deberá hacer clic en el enlace de confirmación para que su cuenta sea creada." + +#: wp-admin/user-new.php:309 +msgid "(twice, required)" +msgstr "(dos veces, requerido)" + +#: wp-admin/user-new.php:319 +msgid "Send Password?" +msgstr "¿Enviar Contraseña?" + +#: wp-admin/user-new.php:320 +msgid "Send this password to the new user by email." +msgstr "Enviar esta contraseña al nuevo usuario por correo electrónico." + +#: wp-admin/user-new.php:253 wp-admin/user-new.php:337 +msgid "Skip Confirmation Email" +msgstr "No enviar el correo electrónico de confirmación" + +#: wp-admin/users.php:52 wp-admin/users.php:69 +msgid "You can’t edit that user." +msgstr "No puedes editar ese usuario." + +#: wp-admin/users.php:101 wp-admin/users.php:148 +msgid "You can’t delete users." +msgstr "No puedes borrar usuarios." + +#: wp-admin/users.php:163 +msgid "Delete Users" +msgstr "Borrar usuarios" + +#: wp-admin/users.php:172 +msgid "ID #%1s: %2s The current user will not be deleted." +msgstr "ID #%1s: %2s El usuario actual no se borrará." + +#: wp-admin/users.php:174 wp-admin/users.php:277 +msgid "ID #%1s: %2s" +msgstr "ID #%1s: %2s" + +#: wp-admin/users.php:181 +msgid "What should be done with posts and links owned by this user?" +msgid_plural "What should be done with posts and links owned by these users?" +msgstr[0] "¿Qué debe hacerse con los enlaces y entradas que le pertenecen?" +msgstr[1] "" + +#: wp-admin/users.php:184 +msgid "Delete all posts and links." +msgstr "Borrar todas las entradas y enlaces." + +#: wp-admin/users.php:186 +msgid "Attribute all posts and links to:" +msgstr "Atribuir todas las entradas y enlaces a:" + +#: wp-admin/users.php:190 +msgid "Confirm Deletion" +msgstr "Confirmar borrado" + +#: wp-admin/users.php:192 +msgid "There are no valid users selected for deletion." +msgstr "No se han seleccionado usuarios válidos para borrar." + +#: wp-admin/users.php:315 +msgid "%s user deleted" +msgid_plural "%s users deleted" +msgstr[0] "%s usuario borrado" +msgstr[1] "%s usuarios borrados" + +#: wp-admin/users.php:318 +msgid "New user created." +msgstr "Nuevo usuario creado." + +#: wp-admin/users.php:321 +msgid "Changed roles." +msgstr "Cambiar perfil." + +#: wp-admin/users.php:324 +msgid "The current user’s role must have user editing capabilities." +msgstr "El perfil del usuario actual debería poder editar usuarios." + +#: wp-admin/users.php:325 +msgid "Other user roles have been changed." +msgstr "Se han cambiado los perfiles de los otros usuarios." + +#: wp-admin/users.php:328 +msgid "You can’t delete the current user." +msgstr "No puedes borrar el usuario actual." + +#: wp-admin/users.php:329 +msgid "Other users have been deleted." +msgstr "Se han eliminado los otros usuarios." + +#: wp-admin/includes/class-wp-users-list-table.php:101 +msgctxt "users" +msgid "All (%s)" +msgid_plural "All (%s)" +msgstr[0] "Todo (%s)" +msgstr[1] "Todos (%s)" + +#: wp-admin/includes/class-wp-users-list-table.php:115 +msgid "%1$s (%2$s)" +msgstr "%1$s (%2$s)" + +#: wp-admin/includes/class-wp-users-list-table.php:143 +#: wp-admin/includes/class-wp-users-list-table.php:145 +msgid "Change role to…" +msgstr "Cambiar perfil a…" + +#: wp-admin/includes/class-wp-users-list-table.php:148 +msgid "Change" +msgstr "Cambiar" + +#: wp-includes/functions.php:3236 wp-includes/admin-bar.php:308 +#: wp-admin/widgets.php:33 +msgid "Widgets" +msgstr "Widgets" + +#: wp-admin/widgets.php:51 wp-admin/widgets.php:374 +msgid "Inactive Widgets" +msgstr "Widgets inactivos" + +#: wp-admin/widgets.php:143 +msgid "No Sidebars Defined" +msgstr "No hay barras laterales definidas" + +#: wp-admin/widgets.php:145 +msgid "The theme you are currently using isn’t widget-aware, meaning that it has no sidebars that you are able to change. For information on making your theme widget-aware, please follow these instructions." +msgstr "Estás viendo este mensaje porque el tema que estás usando actualmente no está preparado para widgets. Esto significa que no tiene barras laterales que puedas cambiar. Para información de cómo preparar tu tema para widgets, por favor sigue estas instrucciones." + +#: wp-admin/widgets.php:265 +msgid "Widget %s" +msgstr "Widget %s" + +#: wp-admin/widgets.php:276 +msgid "Select both the sidebar for this widget and the position of the widget in that sidebar." +msgstr "Selecciona la barra lateral y la posición en la que irá el widget." + +#: wp-admin/custom-background.php:252 wp-admin/widgets.php:278 +msgid "Position" +msgstr "Posición" + +#: wp-admin/widgets.php:316 +msgid "Save Widget" +msgstr "Guardar Widget" + +#: wp-admin/widgets.php:332 +msgid "Changes saved." +msgstr "Cambios guardados." + +#: wp-admin/widgets.php:336 +msgid "Error while saving." +msgstr "Error al guardar los cambios." + +#: wp-admin/widgets.php:337 +msgid "Error in displaying the widget settings form." +msgstr "Error al mostrar el formulario con las opciones del widget." + +#: wp-admin/widgets.php:360 +msgid "Available Widgets" +msgstr "Widgets disponibles" + +#: wp-admin/widgets.php:362 +msgid "Drag widgets from here to a sidebar on the right to activate them. Drag widgets back here to deactivate them and delete their settings." +msgstr "Arrastra los widgets de aquí a la barra de la derecha para activarlos. Arrastra los widgets aquí desde la barra de la derecha para desactivarlos y eliminar su configuración." + +#: wp-admin/widgets.php:377 +msgid "Drag widgets here to remove them from the sidebar but keep their settings." +msgstr "Arrastra los widgets aquí para eliminarlos de la barra lateral pero manteniendo su configuración." + +#: wp-app.php:420 +msgid "Sorry, you do not have the right to edit/publish new posts." +msgstr "Lo sentimos, no tienes autorización para editar/publicar nuevas entradas." + +#: wp-includes/class-wp-xmlrpc-server.php:2038 +#: wp-includes/class-wp-xmlrpc-server.php:2405 wp-app.php:445 wp-app.php:640 +#: wp-app.php:826 +msgid "Sorry, your entry could not be posted. Something wrong happened." +msgstr "Disculpa, ha sido imposible publicar la entrada. Algo ha ocurrido." + +#: wp-app.php:472 +msgid "Sorry, you do not have the right to access this post." +msgstr "Lo sentimos, no tienes autorización para acceder a esta entrada." + +#: wp-includes/class-wp-xmlrpc-server.php:2078 wp-app.php:506 wp-app.php:672 +#: wp-app.php:745 wp-app.php:795 +msgid "Sorry, you do not have the right to edit this post." +msgstr "Lo sentimos, no tienes autorización para editar esta entrada." + +#: wp-includes/class-wp-xmlrpc-server.php:2094 wp-app.php:529 wp-app.php:688 +msgid "For some strange yet very annoying reason, this post could not be edited." +msgstr "Por alguna extraña razón esta entrada no puede editarse." + +#: wp-includes/class-wp-xmlrpc-server.php:2128 wp-app.php:551 wp-app.php:709 +msgid "Sorry, you do not have the right to delete this post." +msgstr "Lo sentimos, no tienes autorización para borrar esta entrada." + +#: wp-includes/class-wp-xmlrpc-server.php:2133 wp-app.php:559 wp-app.php:724 +msgid "For some strange yet very annoying reason, this post could not be deleted." +msgstr "Por alguna extraña y desagradable razón esta entrada no puede borrarse." + +#: wp-app.php:577 +msgid "Sorry, you do not have permission to upload files." +msgstr "Lo sentimos, no tienes autorización para subir archivos." + +#: wp-comments-post.php:36 +msgid "Sorry, comments are closed for this item." +msgstr "Disculpa, los comentarios están cerrados." + +#: wp-comments-post.php:71 +msgid "Sorry, you must be logged in to post a comment." +msgstr "Disculpa, debes identificarte para escribir un comentario." + +#: wp-comments-post.php:78 +msgid "Error: please fill the required fields (name, email)." +msgstr "Error: por favor, completa los campos requeridos (nombre, correo electrónico)." + +#: wp-comments-post.php:80 +msgid "Error: please enter a valid email address." +msgstr "Error: por favor, escribe un correo electrónico válido." + +#: wp-content/plugins/akismet/admin.php:40 +#: wp-content/plugins/akismet/admin.php:137 +msgid "Akismet Configuration" +msgstr "Configuración de Akismet" + +#: wp-content/plugins/akismet/admin.php:122 +msgid "Your key has been cleared." +msgstr "Tu clave ha sido eliminada." + +#: wp-content/plugins/akismet/admin.php:123 +msgid "Your key has been verified. Happy blogging!" +msgstr "Tu clave ha sido verificada. ¡Disfruta tu sitio!" + +#: wp-content/plugins/akismet/admin.php:124 +msgid "The key you entered is invalid. Please double-check it." +msgstr "La clave que has introducido no es válida. Por favor compruébala." + +#: wp-content/plugins/akismet/admin.php:125 +msgid "The key you entered could not be verified because a connection to akismet.com could not be established. Please check your server configuration." +msgstr "La clave que has introducido no se ha podido verificar porque no se ha podido realizar la conexión con akismet.com. Por favor, comprueba la configuración de tu servidor." + +#: wp-content/plugins/akismet/admin.php:126 +msgid "There was a problem connecting to the Akismet server. Please check your server configuration." +msgstr "Hubo un problema al conectar con el servidor de Akismet. Por favor, comprueba la configuración de tu servidor." + +#: wp-content/plugins/akismet/admin.php:127 +msgid "Please enter an API key. (Get your key.)" +msgstr "Por favor introduce una clave de API. (Consigue tu clave.)" + +#: wp-content/plugins/akismet/admin.php:128 +msgid "This key is valid." +msgstr "La clave es válida." + +#: wp-content/plugins/akismet/admin.php:129 +msgid "The key below was previously validated but a connection to akismet.com can not be established at this time. Please check your server configuration." +msgstr "La clave mostrada fue validada anteriormente pero no se puede realizar una conexión con akismet.com en este momento. Por favor, comprueba la configuración de tu servidor." + +#: wp-content/plugins/akismet/admin.php:152 +msgid "Why might my key be invalid?" +msgstr "¿Por qué no es válida mi clave?" + +#: wp-content/plugins/akismet/admin.php:153 +msgid "This can mean one of two things, either you copied the key wrong or that the plugin is unable to reach the Akismet servers, which is most often caused by an issue with your web host around firewalls or similar." +msgstr "Esto puede significar una de estas dos cosas: que has copiado mal la clave o que el plugin no es capaz de encontrar los servidores de Akismet, que a menudo suele ocurrir por un problema con tu alojamiento web con los cortafuegos o algo similar." + +#: wp-content/plugins/akismet/admin.php:159 +msgid "Update options »" +msgstr "Actualizar opciones »" + +#: wp-content/plugins/akismet/admin.php:164 +msgid "Server Connectivity" +msgstr "Conectividad del servidor" + +#: wp-content/plugins/akismet/admin.php:177 +msgid "Unable to reach some Akismet servers." +msgstr "No se puede acceder a ningún servidor de Akismet." + +#: wp-content/plugins/akismet/admin.php:178 +msgid "A network problem or firewall is blocking some connections from your web server to Akismet.com. Akismet is working but this may cause problems during times of network congestion. Please contact your web host or firewall administrator and give them this information about Akismet and firewalls." +msgstr "Un problema en la red o en el firewall está bloqueando algunas conexiones de su servidor web para Akismet.com. Akismet está funcionando pero esto te puede causar problemas cuando la red esté saturada. Por favor, ponte en contacto con tuproveedor e infórmales sobre este problema." + +#: wp-content/plugins/akismet/admin.php:182 +msgid "Unable to reach any Akismet servers." +msgstr "No se puede acceder a ningún servidor de Akismet." + +#: wp-content/plugins/akismet/admin.php:183 +msgid "A network problem or firewall is blocking all connections from your web server to Akismet.com. Akismet cannot work correctly until this is fixed. Please contact your web host or firewall administrator and give them this information about Akismet and firewalls." +msgstr "Un problema en la red o en el firewall está bloqueando algunas conexiones de tu servidor web para Akismet.com. Akismet no está funcionando correctamente. Por favor, ponte en contacto con tu proveedor e infórmales sobre este problema." + +#: wp-content/plugins/akismet/admin.php:187 +msgid "All Akismet servers are available." +msgstr "Todos los servidores Akismet están disponibles." + +#: wp-content/plugins/akismet/admin.php:188 +msgid "Akismet is working correctly. All servers are accessible." +msgstr "Akismet está funcionando correctamente. Se puede acceder a todos los servidores." + +#: wp-content/plugins/akismet/admin.php:168 +msgid "Network functions are disabled." +msgstr "Las funciones de red están desactivadas." + +#: wp-content/plugins/akismet/admin.php:193 +msgid "Unable to find Akismet servers." +msgstr "No se pudieron encontrar los servidores de Akismet." + +#: wp-content/plugins/akismet/admin.php:194 +msgid "A DNS problem or firewall is preventing all access from your web server to Akismet.com. Akismet cannot work correctly until this is fixed. Please contact your web host or firewall administrator and give them this information about Akismet and firewalls." +msgstr "Un problema de DNS o en el firewall impide el acceso de su servidor a Akismet.com. Akismet no puede funcionar correctamente con este problema. Por favor, ponte en contacto con tu proveedor e infórmales sobre este problema." + +#: wp-content/plugins/akismet/admin.php:202 +msgid "Akismet server" +msgstr "Servidor Akismet" + +#: wp-content/plugins/akismet/admin.php:202 +msgid "Network Status" +msgstr "Estado de la red" + +#: wp-content/plugins/akismet/admin.php:219 +msgid "Last checked %s ago." +msgstr "Última consulta hace %s." + +#: wp-content/plugins/akismet/admin.php:220 +msgid "Check network status »" +msgstr "Comprueba el estado de la red »" + +#: wp-content/plugins/akismet/admin.php:231 +msgid "Akismet Stats" +msgstr "Estadísticas de Akismet" + +#: wp-content/plugins/akismet/admin.php:290 +msgid "Akismet is almost ready." +msgstr "Akismet casi está preparado." + +#: wp-content/plugins/akismet/admin.php:302 +msgid "Akismet has detected a problem." +msgstr "Akismet ha detectado un problema." + +#: wp-content/plugins/akismet/legacy.php:47 +msgid "Akismet Spam (%s)" +msgstr "Spam en Akismet (%s)" + +#: wp-content/plugins/akismet/legacy.php:49 +#: wp-content/plugins/akismet/legacy.php:51 +msgid "Akismet Spam" +msgstr "Spam en Akismet" + +#: wp-content/plugins/akismet/legacy.php:61 +#: wp-content/plugins/akismet/legacy.php:80 +msgid "You do not have sufficient permission to moderate comments." +msgstr "No tienes autorización para moderar comentarios." + +#: wp-content/plugins/akismet/legacy.php:96 +msgid "%1$s comments recovered." +msgstr "%1$s comentario ha sido recuperado." + +#: wp-content/plugins/akismet/legacy.php:100 +msgid "All spam deleted." +msgstr "Todo el spam ha sido borrado." + +#: wp-content/plugins/akismet/legacy.php:148 +msgid "Caught Spam" +msgstr "Spam capturado" + +#: wp-content/plugins/akismet/legacy.php:153 +msgid "Akismet has caught %1$s spam for you since you first installed it." +msgstr "Akismet ha capturado %1$s spam desde la primera vez que lo instalaste." + +#: wp-content/plugins/akismet/legacy.php:160 +msgid "You have no spam currently in the queue. Must be your lucky day. :)" +msgstr "En este momento no tienes spam en cola. Debe ser tu día de suerte. :)" + +#: wp-content/plugins/akismet/legacy.php:163 +msgid "You can delete all of the spam from your database with a single click. This operation cannot be undone, so you may wish to check to ensure that no legitimate comments got through first. Spam is automatically deleted after 15 days, so don’t sweat it." +msgstr "Puedes borrar todo el spam de tu base de datos con un solo clic. Esta operación no es reversible así que puede que quieras antes comprobar si hay comentarios legítimos. El spam se borra automáticamente a los 15 días, así que no te agobies." + +#: wp-content/plugins/akismet/legacy.php:169 +#: wp-content/plugins/akismet/legacy.php:347 +msgid "There are currently %1$s comments identified as spam." +msgstr "En este momento hay %1$s comentarios identificados como spam." + +#: wp-content/plugins/akismet/legacy.php:169 +#: wp-content/plugins/akismet/legacy.php:347 +msgid "Delete all" +msgstr "Borrar todos" + +#: wp-content/plugins/akismet/legacy.php:178 +msgid "These are the latest comments identified as spam by Akismet. If you see any mistakes, simply mark the comment as \"not spam\" and Akismet will learn from the submission. If you wish to recover a comment from spam, simply select the comment, and click Not Spam. After 15 days we clean out the junk for you." +msgstr "Estos son los últimos comentarios identificados como spam por Akismet. Si encuentras algún error, sólo tienes que marcarlo como \"No es spam\" y Akismet aprenderá al recibirlo. Si deseas recuperar un comentario, selecciónalo y haz clic en \"No es spam\". Tras 15 días, la basura desaparecerá sola." + +#: wp-admin/export.php:135 wp-admin/export.php:141 wp-admin/export.php:158 +#: wp-admin/export.php:173 wp-admin/export.php:190 +#: wp-content/plugins/akismet/legacy.php:209 +msgid "All" +msgstr "Todo" + +#: wp-content/plugins/akismet/legacy.php:232 +msgid "Search Spam »" +msgstr "Buscar spam »" + +#: wp-includes/link-template.php:1665 wp-includes/link-template.php:1701 +#: wp-content/plugins/akismet/legacy.php:239 +#: wp-content/plugins/akismet/legacy.php:306 +msgid "« Previous Page" +msgstr "« Página anterior" + +#: wp-includes/link-template.php:1594 wp-includes/link-template.php:1702 +#: wp-content/plugins/akismet/legacy.php:260 +#: wp-content/plugins/akismet/legacy.php:327 +msgid "Next Page »" +msgstr "Página siguiente »" + +#: wp-content/plugins/akismet/legacy.php:282 +msgid "IP:" +msgstr "IP:" + +#: wp-content/plugins/akismet/legacy.php:333 +msgid "De-spam marked comments »" +msgstr "Quitar marca de spam »" + +#: wp-content/plugins/akismet/legacy.php:335 +msgid "Comments you de-spam will be submitted to Akismet as mistakes so it can learn and get better." +msgstr "Los comentarios a los que quites la marca de \"spam\" se enviarán a Akismet como errores para que vaya aprendiendo y mejorando." + +#: wp-admin/includes/nav-menu.php:709 wp-admin/includes/nav-menu.php:943 +#: wp-content/plugins/akismet/legacy.php:340 +msgid "No results found." +msgstr "Sin resultados." + +#: wp-content/plugins/akismet/admin.php:281 +msgid "Akismet has protected your site from %3$s spam comments." +msgid_plural "Akismet has protected your site from %3$s spam comments." +msgstr[0] "Akismet ha protegido tu sitio de %3$s comentarios de spam." +msgstr[1] "Akismet ha protegido tu sitio de %3$s comentarios de spam." + +#: wp-content/plugins/akismet/legacy.php:385 +msgid "Recheck Queue for Spam" +msgstr "Volver a comprobar cola de spam" + +#: wp-content/plugins/akismet/admin.php:478 +msgid "Check for Spam" +msgstr "Comprobar la lista de spam" + +#: wp-includes/feed-atom-comments.php:19 +msgid "Comments on %s" +msgstr "Comentarios en %s" + +#: wp-includes/theme-compat/sidebar.php:75 wp-includes/default-widgets.php:299 +msgid "Powered by WordPress, state-of-the-art semantic personal publishing platform." +msgstr "Gestionado con WordPress, una avanzada plataforma semántica de publicación personal." + +#: wp-includes/comment-template.php:987 +msgid "Enter your password to view comments." +msgstr "Escribe tu contraseña para ver los comentarios." + +#: wp-includes/comment-template.php:582 wp-includes/comment-template.php:974 +msgid "No Comments" +msgstr "No hay comentarios" + +#: wp-includes/comment-template.php:584 wp-includes/comment-template.php:975 +msgid "1 Comment" +msgstr "1 comentario" + +#: wp-includes/comment-template.php:580 wp-includes/comment-template.php:976 +msgid "% Comments" +msgstr "% comentarios" + +#: wp-includes/link-template.php:731 wp-includes/link-template.php:938 +#: wp-includes/link-template.php:1013 wp-includes/link-template.php:1054 +msgid "Edit This" +msgstr "Editar Esto" + +#: wp-includes/theme-compat/comments.php:66 +#: wp-includes/comment-template.php:1535 +msgid "You must be logged in to post a comment." +msgstr "Disculpa, debes iniciar sesión para escribir un comentario." + +#: wp-includes/category-template.php:1030 +msgid "Tags: " +msgstr "Etiquetas: " + +#: wp-includes/post-template.php:185 +msgid "(more...)" +msgstr "(más...)" + +#: wp-includes/post-template.php:625 +msgid "Pages:" +msgstr "Páginas:" + +#: wp-admin/export.php:134 +msgid "Categories:" +msgstr "Categorías:" + +#: wp-includes/default-widgets.php:298 +msgid "The latest comments to all posts in RSS" +msgstr "Últimos comentarios a todas las entradas en RSS" + +#: wp-includes/default-widgets.php:298 +msgid "Comments RSS" +msgstr "RSS de los comentarios" + +#: wp-includes/comment-template.php:1355 +msgid "%s says:" +msgstr "%s dice:" + +#: wp-includes/comment-template.php:1358 +msgid "Your comment is awaiting moderation." +msgstr "Tu comentario está pendiente de moderación" + +#: wp-includes/comment-template.php:1365 +msgid "%1$s at %2$s" +msgstr "%1$s a las %2$s" + +#: wp-includes/comment-template.php:1365 +msgid "(Edit)" +msgstr "(Editar)" + +#: wp-includes/category-template.php:59 wp-includes/category-template.php:174 +#: wp-includes/category-template.php:177 wp-includes/category-template.php:184 +#: wp-includes/category-template.php:197 wp-includes/category-template.php:200 +#: wp-includes/category-template.php:207 +msgid "View all posts in %s" +msgstr "Ver todas las entradas en %s" + +#: wp-includes/theme-compat/sidebar.php:69 wp-includes/default-widgets.php:283 +#: wp-includes/default-widgets.php:288 +msgid "Meta" +msgstr "Meta" + +#: wp-includes/atomlib.php:133 +msgid "XML error: %s at line %d" +msgstr "Error de XML: %s en la línea %d" + +#: wp-includes/author-template.php:143 +msgid "Visit %s’s website" +msgstr "Visitar el sitio de %s" + +#: wp-includes/author-template.php:211 wp-includes/author-template.php:325 +msgid "Posts by %s" +msgstr "Entradas de %s" + +#: wp-includes/bookmark-template.php:82 +msgid "Last updated: %s" +msgstr "Última actualización: %s" + +#: wp-includes/bookmark-template.php:206 +msgid "Bookmarks" +msgstr "Marcadores" + +#: wp-includes/capabilities.php:723 +msgid "Usage of user levels by plugins and themes is deprecated. Use roles and capabilities instead." +msgstr "El uso de niveles de usuarios por plugins y temas está obsoleto. Usa los perfiles y capacidades en su lugar." + +#: wp-includes/category-template.php:419 +msgid "No categories" +msgstr "No hay categorías" + +#: wp-includes/category-template.php:568 +msgid "%s topic" +msgid_plural "%s topics" +msgstr[0] "%s tema" +msgstr[1] "%s temas" + +#: wp-includes/class-pop3.php:82 +msgid "No server specified" +msgstr "Servidor no especificado" + +#: wp-includes/class-pop3.php:90 wp-includes/class-pop3.php:102 +#: wp-includes/class-pop3.php:123 wp-includes/class-pop3.php:246 +#: wp-includes/class-pop3.php:300 wp-includes/class-pop3.php:311 +#: wp-includes/class-pop3.php:359 wp-includes/class-pop3.php:393 +#: wp-includes/class-pop3.php:426 wp-includes/class-pop3.php:525 +#: wp-includes/class-pop3.php:548 +msgid "Error " +msgstr "Error " + +#: wp-includes/class-pop3.php:115 +msgid "no login ID submitted" +msgstr "no se ha enviado el ID de usuario" + +#: wp-includes/class-pop3.php:118 wp-includes/class-pop3.php:138 +msgid "connection not established" +msgstr "no se estableció la conexión" + +#: wp-includes/class-pop3.php:135 wp-includes/class-pop3.php:171 +msgid "No password submitted" +msgstr "No se envió la contraseña" + +#: wp-includes/class-pop3.php:143 +msgid "Authentication failed" +msgstr "Autentificación fallida" + +#: wp-includes/class-pop3.php:162 wp-includes/class-pop3.php:205 +#: wp-includes/class-pop3.php:230 wp-includes/class-pop3.php:272 +#: wp-includes/class-pop3.php:346 wp-includes/class-pop3.php:386 +#: wp-includes/class-pop3.php:416 wp-includes/class-pop3.php:450 +#: wp-includes/class-pop3.php:513 wp-includes/class-pop3.php:578 +msgid "No connection to server" +msgstr "No hay conexión con el servidor." + +#: wp-includes/class-pop3.php:168 +msgid "No login ID submitted" +msgstr "No se ha enviado el ID de usuario" + +#: wp-includes/class-pop3.php:176 +msgid "No server banner" +msgstr "No hay identificación del servidor" + +#: wp-includes/class-pop3.php:176 wp-includes/class-pop3.php:186 +msgid "abort" +msgstr "cancelar" + +#: wp-includes/class-pop3.php:186 +msgid "apop authentication failed" +msgstr "Falló la autenticación apop" + +#: wp-includes/class-pop3.php:323 +msgid "Premature end of list" +msgstr "Fin de la lista prematuro" + +#: wp-includes/class-pop3.php:456 +msgid "Empty command string" +msgstr "Cadena de comandos vacía" + +#: wp-includes/class-pop3.php:476 +msgid "connection does not exist" +msgstr "conexión inexistente" + +#: wp-includes/class-pop3.php:583 +msgid "No msg number submitted" +msgstr "No se envió ningún número de mensaje" + +#: wp-includes/class-pop3.php:589 +msgid "Command failed " +msgstr "Comando fallido" + +#: wp-includes/category-template.php:837 +msgid "View all posts filed under %s" +msgstr "Ver todas las entradas archivadas en %s" + +#: wp-includes/category-template.php:852 +msgid "Feed for all posts filed under %s" +msgstr "Feed para todas las entradas archivadas en %s" + +#: wp-includes/comment-template.php:977 +msgid "Comments Off" +msgstr "Comentarios desactivados" + +#: wp-includes/comment-template.php:1014 +msgid "Comment on %s" +msgstr "Comentarios en %s" + +#: wp-includes/comment-template.php:1040 +msgid "Log in to Reply" +msgstr "Inicia sesión para responder" + +#: wp-includes/comment-template.php:1100 +msgid "Leave a Comment" +msgstr "Dejar un comentario" + +#: wp-includes/comment-template.php:1101 +msgid "Log in to leave a Comment" +msgstr "Inicia sesión para dejar un comentario" + +#: wp-includes/comment-template.php:1140 +msgid "Click here to cancel reply." +msgstr "Clic para cancelar respuesta." + +#: wp-includes/theme-compat/comments.php:59 +#: wp-includes/comment-template.php:1197 wp-includes/comment-template.php:1541 +msgid "Leave a Reply" +msgstr "Deja un comentario" + +#: wp-includes/theme-compat/comments.php:59 +#: wp-includes/comment-template.php:1198 wp-includes/comment-template.php:1542 +msgid "Leave a Reply to %s" +msgstr "Responder a %s" + +#: wp-admin/comment.php:126 +msgid "Permanently Delete Comment" +msgstr "Borrar comentario permanentemente" + +#: wp-admin/comment.php:129 +msgid "You are about to approve the following comment:" +msgstr "Estás a punto de aprobar el siguiente comentario:" + +#: wp-admin/comment.php:130 +msgid "Approve Comment" +msgstr "Aprobar comentario" + +#: wp-admin/theme-editor.php:241 wp-admin/comment.php:151 +#: wp-admin/plugins.php:250 +msgid "Caution:" +msgstr "Atención:" + +#: wp-includes/theme-compat/sidebar.php:21 wp-includes/post-template.php:1418 +#: wp-includes/js/tinymce/langs/wp-langs.php:308 +#: wp-admin/edit-form-advanced.php:150 wp-admin/comment.php:155 +#: wp-admin/includes/class-wp-posts-list-table.php:274 +#: wp-admin/includes/class-wp-posts-list-table.php:781 +#: wp-admin/includes/plugin-install.php:127 +#: wp-admin/includes/class-wp-comments-list-table.php:254 +#: wp-admin/includes/class-wp-comments-list-table.php:525 +#: wp-admin/includes/theme-install.php:62 +#: wp-admin/includes/class-wp-media-list-table.php:135 +#: wp-admin/includes/meta-boxes.php:524 wp-admin/edit-form-comment.php:86 +msgid "Author" +msgstr "Autor" + +#: wp-includes/theme-compat/comments-popup.php:80 wp-login.php:520 +#: wp-admin/user-new.php:229 wp-admin/user-new.php:291 wp-admin/comment.php:160 +#: wp-admin/includes/class-wp-users-list-table.php:165 +#: wp-admin/includes/template.php:356 wp-admin/user-edit.php:329 +msgid "E-mail" +msgstr "Correo electrónico" + +#: wp-admin/comment.php:166 wp-admin/includes/media.php:2229 +#: wp-admin/includes/internal-linking.php:79 wp-admin/includes/template.php:361 +#: wp-admin/includes/template.php:730 wp-admin/includes/nav-menu.php:127 +#: wp-admin/includes/nav-menu.php:550 +#: wp-admin/includes/class-wp-links-list-table.php:81 +#: wp-admin/press-this.php:180 +msgid "URL" +msgstr "URL" + +#: wp-includes/comment-template.php:678 wp-includes/comment-template.php:1534 +#: wp-admin/comment.php:171 +msgctxt "noun" +msgid "Comment" +msgstr "Comentario" + +#: wp-includes/functions.php:2710 wp-includes/functions.php:2712 +#: wp-admin/comment.php:176 +msgid "Are you sure you want to do this?" +msgstr "¿Seguro que quieres hacer esto?" + +#: wp-admin/custom-header.php:580 wp-admin/comment.php:182 +#: wp-admin/includes/class-wp-links-list-table.php:110 +msgid "No" +msgstr "No" + +#: wp-admin/comment.php:282 wp-admin/includes/media.php:1767 +msgid "Unknown action." +msgstr "Acción desconocida." + +#: wp-admin/custom-background.php:169 wp-admin/includes/theme.php:305 +msgid "Custom Background" +msgstr "Fondo personalizado" + +#: wp-admin/custom-background.php:172 +msgid "Background updated. Visit your site to see how it looks." +msgstr "Fondo actualizado. Visita tu sitio para ver cómo queda." + +#: wp-admin/custom-header.php:508 wp-admin/custom-background.php:236 +msgid "Choose an image from your computer:" +msgstr "Elige una imagen desde tu ordenador:" + +#: wp-admin/custom-header.php:512 wp-admin/custom-background.php:239 +#: wp-admin/includes/media.php:1579 wp-admin/includes/media.php:1581 +#: wp-admin/includes/class-wp-theme-install-list-table.php:32 +#: wp-admin/includes/template.php:1467 +#: wp-admin/includes/class-wp-plugin-install-list-table.php:32 +msgid "Upload" +msgstr "Subir" + +#: wp-admin/includes/template.php:2202 wp-admin/options.php:219 +msgid "Save Changes" +msgstr "Guardar cambios" + +#: wp-admin/custom-header.php:468 wp-admin/includes/theme.php:307 +msgid "Custom Header" +msgstr "Cabecera personalizada" + +#: wp-admin/custom-header.php:472 +msgid "Header updated. Visit your site to see how it looks." +msgstr "Cabezera actualizada. Visita tu sitio para ver los cambios." + +#: wp-admin/custom-header.php:669 wp-admin/custom-header.php:730 +msgid "Image could not be processed. Please go back and try again." +msgstr "La imagen no se pudo procesar. Por favor, prueba de nuevo." + +#: wp-admin/custom-header.php:669 wp-admin/custom-header.php:730 +msgid "Image Processing Error" +msgstr "Error en el procesado de la imagen" + +#: wp-admin/custom-header.php:686 +msgid "Choose the part of the image you want to use as your header." +msgstr "Elige la parte de la imagen que quieras usar como cabecera." + +#: wp-admin/custom-header.php:780 +msgid "You do not have permission to customize headers." +msgstr "No tienes autorización para personalizar cabeceras." + +#: wp-admin/includes/dashboard.php:590 +#: wp-admin/includes/class-wp-posts-list-table.php:527 +#: wp-admin/includes/class-wp-posts-list-table.php:533 +#: wp-admin/includes/class-wp-terms-list-table.php:255 +#: wp-admin/includes/class-wp-media-list-table.php:205 +#: wp-admin/includes/class-wp-media-list-table.php:218 +#: wp-admin/includes/class-wp-links-list-table.php:136 +msgid "Edit “%s”" +msgstr "Editar “%s”" + +#: wp-includes/script-loader.php:339 wp-includes/script-loader.php:366 +#: wp-admin/includes/dashboard.php:697 +#: wp-admin/includes/class-wp-posts-list-table.php:194 +#: wp-admin/includes/class-wp-posts-list-table.php:542 +#: wp-admin/includes/class-wp-comments-list-table.php:414 +#: wp-admin/includes/class-wp-users-list-table.php:246 +#: wp-admin/includes/class-wp-plugins-list-table.php:387 +#: wp-admin/includes/class-wp-terms-list-table.php:259 +#: wp-admin/includes/class-wp-media-list-table.php:337 +#: wp-admin/includes/class-wp-media-list-table.php:351 +#: wp-admin/includes/post.php:1205 +#: wp-admin/includes/class-wp-links-list-table.php:139 +#: wp-admin/includes/widgets.php:182 wp-admin/includes/meta-boxes.php:84 +#: wp-admin/includes/meta-boxes.php:130 wp-admin/includes/meta-boxes.php:182 +#: wp-admin/edit-form-comment.php:62 +msgid "Edit" +msgstr "Editar" + +#: wp-includes/post-template.php:1376 +#: wp-admin/includes/class-wp-posts-list-table.php:192 +#: wp-admin/includes/class-wp-posts-list-table.php:547 +#: wp-admin/includes/class-wp-comments-list-table.php:195 +#: wp-admin/includes/class-wp-comments-list-table.php:404 +#: wp-admin/includes/class-wp-media-list-table.php:354 +msgid "Restore" +msgstr "Restaurar" + +#: wp-admin/includes/class-wp-posts-list-table.php:549 +#: wp-admin/includes/class-wp-media-list-table.php:340 +#: wp-admin/includes/class-wp-media-list-table.php:356 +msgid "Trash" +msgstr "Papelera" + +#: wp-admin/includes/dashboard.php:701 +#: wp-admin/includes/class-wp-posts-list-table.php:197 +#: wp-admin/includes/class-wp-posts-list-table.php:551 +#: wp-admin/includes/media.php:1315 +#: wp-admin/includes/class-wp-comments-list-table.php:200 +#: wp-admin/includes/class-wp-comments-list-table.php:408 +#: wp-admin/includes/class-wp-media-list-table.php:79 +#: wp-admin/includes/class-wp-media-list-table.php:343 +#: wp-admin/includes/class-wp-media-list-table.php:359 +#: wp-admin/includes/meta-boxes.php:198 wp-admin/edit-form-comment.php:71 +msgid "Delete Permanently" +msgstr "Borrar permanentemente" + +#: wp-admin/includes/class-wp-posts-list-table.php:558 +#: wp-admin/includes/class-wp-media-list-table.php:345 +#: wp-admin/includes/class-wp-media-list-table.php:364 +msgid "View “%s”" +msgstr "Ver “%s”" + +#: wp-admin/includes/class-wp-posts-list-table.php:558 +#: wp-admin/includes/class-wp-terms-list-table.php:264 +#: wp-admin/includes/class-wp-media-list-table.php:345 +#: wp-admin/includes/class-wp-media-list-table.php:364 +msgid "View" +msgstr "Ver" + +#: wp-admin/includes/class-wp-posts-list-table.php:639 +#: wp-admin/includes/class-wp-media-list-table.php:250 +msgid "No Tags" +msgstr "Sin etiquetas" + +#: wp-admin/includes/class-wp-posts-list-table.php:571 +#: wp-admin/includes/class-wp-media-list-table.php:265 +msgid "Unpublished" +msgstr "Sin publicar" + +#: wp-admin/includes/dashboard.php:590 +#: wp-admin/includes/class-wp-posts-list-table.php:574 +#: wp-admin/includes/class-wp-media-list-table.php:267 +msgid "Y/m/d g:i:s A" +msgstr "d/m/Y G:i" + +#: wp-admin/includes/class-wp-media-list-table.php:272 +msgid "%s from now" +msgstr "%s desde ahora" + +#: wp-admin/includes/class-wp-posts-list-table.php:581 +#: wp-admin/includes/plugin-install.php:313 +#: wp-admin/includes/class-wp-comments-list-table.php:333 +#: wp-admin/includes/theme-install.php:165 +#: wp-admin/includes/class-wp-media-list-table.php:274 +#: wp-content/plugins/akismet/admin.php:369 +#: wp-content/plugins/akismet/admin.php:397 +msgid "%s ago" +msgstr "hace %s" + +#: wp-admin/includes/class-wp-media-list-table.php:297 +msgid "(Unattached)" +msgstr "(Sin adjuntar)" + +#: wp-admin/includes/class-wp-media-list-table.php:298 +#: wp-admin/includes/class-wp-media-list-table.php:347 +msgid "Attach" +msgstr "Adjuntar" + +#: wp-admin/includes/class-wp-list-table.php:429 +msgid "%s pending" +msgstr "%s pendientes" + +#: wp-admin/includes/class-wp-media-list-table.php:126 +msgid "No media attachments found." +msgstr "No se han encontrado adjuntos." + +#: wp-admin/link-manager.php:64 wp-admin/edit-comments.php:143 +#: wp-admin/edit.php:191 wp-admin/upload.php:159 wp-admin/users.php:369 +#: wp-admin/plugins.php:387 wp-admin/edit-tags.php:242 +msgid "Search results for “%s”" +msgstr "Resultados de búsqueda para “%s”" + +#: wp-admin/edit-comments.php:173 +msgid "%s comment approved" +msgid_plural "%s comments approved" +msgstr[0] "%s comentario aprobado" +msgstr[1] "%s comentarios aprobados" + +#: wp-admin/edit-comments.php:177 +msgid "%s comment marked as spam." +msgid_plural "%s comments marked as spam." +msgstr[0] "%s comentario marcado como spam." +msgstr[1] "%s comentarios marcados como spam." + +#: wp-includes/js/tinymce/langs/wp-langs.php:267 +#: wp-includes/js/tinymce/wp-mce-help.php:236 wp-admin/edit-comments.php:177 +#: wp-admin/edit-comments.php:185 wp-admin/edit.php:223 wp-admin/upload.php:182 +#: wp-admin/upload.php:194 wp-admin/includes/image-edit.php:56 +#: wp-admin/includes/media.php:1324 wp-admin/includes/template.php:406 +#: wp-admin/includes/template.php:409 +msgid "Undo" +msgstr "Deshacer" + +#: wp-admin/edit-comments.php:181 +msgid "%s comment restored from the spam" +msgid_plural "%s comments restored from the spam" +msgstr[0] "%s comentario recuperado de spam" +msgstr[1] "%s comentarios recuperados de spam" + +#: wp-admin/edit-comments.php:192 +msgid "%s comment permanently deleted" +msgid_plural "%s comments permanently deleted" +msgstr[0] "%s comentario borrado permanentemente" +msgstr[1] "%s comentarios borrados permanentemente" + +#: wp-admin/includes/class-wp-comments-list-table.php:146 +msgctxt "comments" +msgid "All" +msgid_plural "All" +msgstr[0] "Todo" +msgstr[1] "Todos" + +#: wp-admin/includes/class-wp-comments-list-table.php:147 +msgid "Pending (%s)" +msgid_plural "Pending (%s)" +msgstr[0] "Pendiente (%s)" +msgstr[1] "Pendientes (%s)" + +#: wp-admin/includes/class-wp-comments-list-table.php:148 +msgid "Approved" +msgid_plural "Approved" +msgstr[0] "Aprobado" +msgstr[1] "Aprobados" + +#: wp-admin/includes/class-wp-comments-list-table.php:149 +msgid "Spam (%s)" +msgid_plural "Spam (%s)" +msgstr[0] "Spam (%s)" +msgstr[1] "Spam (%s)" + +#: wp-admin/includes/class-wp-comments-list-table.php:150 +msgid "Trash (%s)" +msgid_plural "Trash (%s)" +msgstr[0] "Papelera (%s)" +msgstr[1] "Papelera (%s)" + +#: wp-admin/edit-comments.php:217 +msgid "Search Comments" +msgstr "Buscar comentarios" + +#: wp-admin/includes/deprecated.php:563 +msgid "Displaying %s–%s of %s" +msgstr "Mostrando %s–%s de %s" + +#: wp-admin/includes/class-wp-list-table.php:290 +msgid "Bulk Actions" +msgstr "Acciones en lote" + +#: wp-admin/includes/dashboard.php:696 +#: wp-admin/includes/class-wp-comments-list-table.php:188 +#: wp-admin/includes/class-wp-comments-list-table.php:391 +#: wp-admin/includes/class-wp-comments-list-table.php:396 +msgid "Unapprove" +msgstr "Rechazar" + +#: wp-admin/includes/dashboard.php:695 +#: wp-admin/includes/class-wp-comments-list-table.php:190 +#: wp-admin/includes/class-wp-comments-list-table.php:393 +#: wp-admin/includes/class-wp-comments-list-table.php:395 +msgid "Approve" +msgstr "Aprobar" + +#: wp-content/plugins/akismet/legacy.php:288 +msgid "Not Spam" +msgstr "No es spam" + +#: wp-admin/includes/class-wp-posts-list-table.php:199 +#: wp-admin/includes/media.php:1323 +#: wp-admin/includes/class-wp-comments-list-table.php:202 +#: wp-admin/includes/meta-boxes.php:200 wp-admin/edit-form-comment.php:71 +msgid "Move to Trash" +msgstr "Mover a la papelera" + +#: wp-includes/js/tinymce/langs/wp-langs.php:16 +#: wp-admin/includes/template.php:1954 +#: wp-admin/includes/class-wp-list-table.php:300 +msgid "Apply" +msgstr "Aplicar" + +#: wp-admin/includes/class-wp-comments-list-table.php:215 +msgid "Show all comment types" +msgstr "Mostrar todos los comentarios" + +#: wp-includes/theme-compat/comments-popup.php:33 +#: wp-admin/edit-form-advanced.php:143 wp-admin/edit-comments.php:110 +#: wp-admin/edit-comments.php:140 +#: wp-admin/includes/class-wp-posts-list-table.php:284 +#: wp-admin/includes/class-wp-posts-list-table.php:901 +#: wp-admin/includes/class-wp-comments-list-table.php:218 +#: wp-admin/includes/file.php:16 wp-admin/includes/template.php:1468 +#: wp-admin/includes/template.php:1781 +#: wp-content/plugins/akismet/legacy.php:214 +msgid "Comments" +msgstr "Comentarios" + +#: wp-admin/includes/class-wp-posts-list-table.php:910 +#: wp-admin/includes/class-wp-comments-list-table.php:219 +msgid "Pings" +msgstr "Pings" + +#: wp-admin/includes/class-wp-posts-list-table.php:225 +#: wp-admin/includes/class-wp-comments-list-table.php:227 +#: wp-admin/includes/class-wp-media-list-table.php:96 +#: wp-admin/includes/class-wp-links-list-table.php:71 +msgid "Filter" +msgstr "Filtrar" + +#: wp-admin/includes/class-wp-comments-list-table.php:232 +msgid "Empty Spam" +msgstr "Vaciar spam" + +#: wp-admin/includes/class-wp-posts-list-table.php:229 +#: wp-admin/includes/class-wp-comments-list-table.php:232 +#: wp-admin/includes/class-wp-media-list-table.php:102 +msgid "Empty Trash" +msgstr "Vaciar papelera" + +#: wp-admin/includes/class-wp-comments-list-table.php:133 +msgid "No comments awaiting moderation… yet." +msgstr "No hay comentarios pendientes de moderación." + +#: wp-admin/includes/class-wp-comments-list-table.php:135 +msgid "No comments found." +msgstr "Sin comentarios." + +#: wp-admin/edit-form-advanced.php:33 +msgid "Post updated. View post" +msgstr "Entrada actualizada. Vista previa" + +#: wp-admin/edit-form-advanced.php:34 wp-admin/edit-form-advanced.php:50 +msgid "Custom field updated." +msgstr "Campo personalizado actualizado." + +#: wp-admin/edit-form-advanced.php:35 wp-admin/edit-form-advanced.php:51 +msgid "Custom field deleted." +msgstr "Campo personalizado borrado." + +#: wp-admin/edit-form-advanced.php:36 +msgid "Post updated." +msgstr "Entrada actualizada." + +#: wp-admin/edit-form-advanced.php:38 +msgid "Post restored to revision from %s" +msgstr "Entrada restaurada a la revisión %s" + +#: wp-admin/edit-form-advanced.php:39 +msgid "Post published. View post" +msgstr "Entrada publicada. Ver entrada" + +#: wp-admin/edit-form-advanced.php:40 +msgid "Post saved." +msgstr "Entrada guardada." + +#: wp-admin/edit-form-advanced.php:41 +msgid "Post submitted. Preview post" +msgstr "Entrada enviada. Vista previa" + +#: wp-admin/edit-form-advanced.php:42 +msgid "Post scheduled for: %1$s. Preview post" +msgstr "Entrada programada el: %1$s. Vista previa" + +#: wp-admin/edit-form-advanced.php:44 wp-admin/edit-form-advanced.php:57 +#: wp-admin/includes/meta-boxes.php:159 wp-admin/edit-form-comment.php:58 +msgid "M j, Y @ G:i" +msgstr "j F Y G:i a" + +#: wp-admin/edit-form-advanced.php:45 +msgid "Post draft updated. Preview post" +msgstr "Entrada actualizada. Vista previa" + +#: wp-admin/edit-form-advanced.php:49 +msgid "Page updated. View page" +msgstr "Página actualizada. Vista previa" + +#: wp-admin/edit-form-advanced.php:52 +msgid "Page updated." +msgstr "Página actualizada." + +#: wp-admin/edit-form-advanced.php:53 +msgid "Page restored to revision from %s" +msgstr "Página restaurada desde la revisión %s" + +#: wp-admin/edit-form-advanced.php:54 +msgid "Page published. View page" +msgstr "Página publicada. Vista previa" + +#: wp-admin/edit-form-advanced.php:56 +msgid "Page submitted. Preview page" +msgstr "Página enviada. Vista previa" + +#: wp-admin/edit-form-advanced.php:57 +msgid "Page scheduled for: %1$s. Preview page" +msgstr "Página programada para: %1$s. Vista previa" + +#: wp-admin/edit-form-advanced.php:58 +msgid "Page draft updated. Preview page" +msgstr "Borrador de página actualizado. Vista previa" + +#: wp-admin/edit-form-advanced.php:91 +msgid "There is an autosave of this post that is more recent than the version below. View the autosave" +msgstr "Hay una copia automática de esta entrada con fecha más reciente que la de la versión mostrada. Ver la copia automática" + +#: wp-includes/script-loader.php:345 wp-admin/edit-form-advanced.php:103 +#: wp-admin/includes/dashboard.php:559 wp-admin/includes/meta-boxes.php:215 +#: wp-admin/includes/meta-boxes.php:216 wp-admin/press-this.php:490 +msgid "Publish" +msgstr "Publicar" + +#: wp-admin/edit-form-advanced.php:123 +msgid "Attributes" +msgstr "Atributos" + +#: wp-includes/post.php:4689 wp-admin/edit-form-advanced.php:130 +#: wp-admin/includes/meta-boxes.php:382 +msgid "Excerpt" +msgstr "Extracto" + +#: wp-admin/edit-form-advanced.php:133 +msgid "Send Trackbacks" +msgstr "Enviar trackbacks" + +#: wp-admin/edit-form-advanced.php:136 +msgid "Custom Fields" +msgstr "Campos personalizados" + +#: wp-admin/edit-form-advanced.php:140 wp-admin/includes/dashboard.php:332 +#: wp-admin/menu.php:231 +msgid "Discussion" +msgstr "Comentarios" + +#: wp-admin/edit-form-advanced.php:146 +#: wp-admin/includes/class-wp-posts-list-table.php:749 +#: wp-admin/includes/class-wp-terms-list-table.php:102 +#: wp-admin/includes/class-wp-terms-list-table.php:344 +#: wp-admin/includes/meta-boxes.php:509 +msgid "Slug" +msgstr "Slug" + +#: wp-includes/post.php:70 wp-admin/revision.php:97 wp-admin/revision.php:123 +#: wp-admin/edit-form-advanced.php:154 +msgid "Revisions" +msgstr "Revisiones" + +#: wp-admin/edit-form-advanced.php:280 wp-admin/admin-ajax.php:1542 +msgid "Last edited by %1$s on %2$s at %3$s" +msgstr "Última edición por %1$s el %2$s a las %3$s" + +#: wp-admin/edit-form-advanced.php:282 wp-admin/admin-ajax.php:1544 +msgid "Last edited on %1$s at %2$s" +msgstr "Última edición el %1$s a las %2$s" + +#: wp-admin/edit-form-comment.php:17 +msgid "Editing Comment # %s" +msgstr "Editando comentario # %s" + +#: wp-admin/edit-form-comment.php:42 +msgid "View Comment" +msgstr "Ver comentario" + +#: wp-includes/comment.php:389 wp-admin/edit-form-comment.php:50 +msgctxt "adjective" +msgid "Approved" +msgstr "Aprobado" + +#: wp-includes/comment.php:391 wp-admin/edit-form-comment.php:52 +msgctxt "adjective" +msgid "Spam" +msgstr "Spam" + +#: wp-admin/edit-form-comment.php:59 +msgid "Submitted on: %1$s" +msgstr "Enviado el: %1$s" + +#: wp-admin/includes/template.php:372 wp-admin/edit-form-comment.php:74 +msgid "Update Comment" +msgstr "Actualizar comentario" + +#: wp-admin/edit-form-comment.php:91 +msgid "Name:" +msgstr "Nombre:" + +#: wp-admin/edit-form-comment.php:98 +msgid "E-mail (%s):" +msgstr "Correo electrónico (%s):" + +#: wp-admin/edit-form-comment.php:98 +msgid "send e-mail" +msgstr "enviar correo electrónico" + +#: wp-admin/edit-form-comment.php:100 +msgid "E-mail:" +msgstr "Correo electrónico:" + +#: wp-admin/edit-form-comment.php:109 +msgid "visit site" +msgstr "visitar sitio" + +#: wp-admin/edit-form-comment.php:110 +msgid "URL (%s):" +msgstr "URL (%s):" + +#: wp-admin/edit-form-comment.php:112 +msgid "URL:" +msgstr "URL:" + +#: wp-includes/taxonomy.php:62 wp-admin/menu.php:97 +msgid "Link Categories" +msgstr "Categorías de enlaces" + +#: wp-includes/taxonomy.php:401 +msgid "Search Categories" +msgstr "Buscar categorías" + +#: wp-admin/includes/class-wp-themes-list-table.php:171 +#: wp-admin/includes/media.php:1317 +#: wp-admin/includes/class-wp-users-list-table.php:130 +#: wp-admin/includes/class-wp-users-list-table.php:252 +#: wp-admin/includes/template.php:505 +#: wp-admin/includes/class-wp-plugins-list-table.php:268 +#: wp-admin/includes/class-wp-plugins-list-table.php:373 +#: wp-admin/includes/class-wp-plugins-list-table.php:382 +#: wp-admin/includes/class-wp-terms-list-table.php:83 +#: wp-admin/includes/class-wp-terms-list-table.php:263 +#: wp-admin/includes/class-wp-links-list-table.php:47 +#: wp-admin/includes/class-wp-links-list-table.php:140 +#: wp-admin/includes/widgets.php:206 wp-admin/includes/meta-boxes.php:627 +#: wp-admin/widgets.php:314 +msgid "Delete" +msgstr "Borrar" + +#: wp-admin/edit-tags.php:342 wp-admin/edit-tag-form.php:48 +msgid "The “slug” is the URL-friendly version of the name. It is usually all lowercase and contains only letters, numbers, and hyphens." +msgstr "El “slug” es la versión amigable de la URL del nombre. Suele estar en minúsculas y contiene sólo letras, números y guiones." + +#: wp-admin/edit-tags.php:357 +msgid "The description is not prominent by default; however, some themes may show it." +msgstr "La descripción no suele mostrarse por defecto, sin embargo hay algunos temas que puede que la muestren." + +#: wp-includes/taxonomy.php:67 +msgid "Edit Link Category" +msgstr "Editar categoría del enlace" + +#: wp-includes/taxonomy.php:408 +msgid "Update Category" +msgstr "Actualizar categoría" + +#: wp-admin/edit-link-form.php:14 +msgid "Links / Edit Link" +msgstr "Enlaces / Editar enlace" + +#: wp-admin/edit-link-form.php:15 wp-admin/includes/meta-boxes.php:633 +msgid "Update Link" +msgstr "Actualizar enlace" + +#: wp-admin/edit-link-form.php:19 +msgid "Links / Add New Link" +msgstr "Enlaces / Añadir nuevo enlace" + +#: wp-includes/script-loader.php:280 wp-admin/edit-link-form.php:20 +#: wp-admin/includes/meta-boxes.php:635 +msgid "Add Link" +msgstr "Añadir enlace" + +#: wp-includes/js/tinymce/langs/wp-langs.php:110 wp-admin/edit-link-form.php:27 +#: wp-admin/includes/image-edit.php:75 wp-admin/includes/nav-menu.php:516 +#: wp-admin/includes/post.php:1779 wp-admin/includes/widgets.php:211 +#: wp-admin/includes/meta-boxes.php:25 wp-admin/includes/meta-boxes.php:602 +msgid "Save" +msgstr "Guardar" + +#: wp-includes/theme-compat/sidebar.php:63 +#: wp-includes/category-template.php:427 wp-includes/default-widgets.php:422 +#: wp-includes/default-widgets.php:428 wp-admin/edit-link-form.php:28 +#: wp-admin/includes/class-wp-posts-list-table.php:277 +#: wp-admin/includes/class-wp-links-list-table.php:82 +#: wp-admin/press-this.php:518 +msgid "Categories" +msgstr "Categorías" + +#: wp-includes/js/tinymce/langs/wp-langs.php:344 +#: wp-includes/js/tinymce/langs/wp-langs.php:395 wp-admin/edit-link-form.php:29 +#: wp-admin/includes/meta-boxes.php:699 +msgid "Target" +msgstr "Destino" + +#: wp-admin/edit-link-form.php:30 wp-admin/includes/nav-menu.php:161 +#: wp-admin/includes/nav-menu.php:1144 +msgid "Link Relationship (XFN)" +msgstr "Relación con el enlace (XFN)" + +#: wp-includes/js/tinymce/langs/wp-langs.php:358 +#: wp-includes/js/tinymce/wp-mce-help.php:201 wp-admin/edit-link-form.php:31 +msgid "Advanced" +msgstr "Avanzado" + +#: wp-admin/edit-link-form.php:59 +msgid "Link added." +msgstr "Enlace añadido." + +#: wp-includes/theme-compat/comments.php:78 +#: wp-includes/theme-compat/comments-popup.php:75 +#: wp-includes/comment-template.php:1523 +#: wp-admin/includes/class-wp-users-list-table.php:164 +#: wp-admin/includes/template.php:351 wp-admin/user-edit.php:233 +msgid "Name" +msgstr "Nombre" + +#: wp-admin/edit-link-form.php:89 +msgid "Example: Nifty blogging software" +msgstr "Ejemplo: Estupendo software de publicación" + +#: wp-admin/edit-link-form.php:94 +msgid "Web Address" +msgstr "Dirección web" + +#: wp-admin/edit-link-form.php:97 +msgid "Example: http://wordpress.org/ — don’t forget the http://" +msgstr "Ejemplo: http://wordpress.org/ —no olvides poner http://" + +#: wp-admin/edit-link-form.php:102 wp-admin/themes.php:213 +#: wp-admin/includes/media.php:1098 +#: wp-admin/includes/class-wp-plugins-list-table.php:194 +#: wp-admin/includes/nav-menu.php:167 wp-admin/includes/nav-menu.php:1145 +#: wp-admin/includes/class-wp-terms-list-table.php:101 +#: wp-admin/includes/class-wp-plugin-install-list-table.php:144 +#: wp-admin/press-this.php:151 wp-admin/press-this.php:186 +msgid "Description" +msgstr "Descripción" + +#: wp-admin/edit-link-form.php:105 +msgid "This will be shown when someone hovers over the link in the blogroll, or optionally below the link." +msgstr "Esto se mostrará cuando alguien pase el cursor sobre el enlace en los sitios de interés, u opcionalmente a debajo del enlace." + +#: wp-admin/edit-tags.php:336 wp-admin/edit-tag-form.php:42 +msgid "The name is how it appears on your site." +msgstr "El nombre es cómo aparecerá en tu sitio." + +#: wp-includes/deprecated.php:707 wp-includes/js/tinymce/langs/wp-langs.php:484 +#: wp-admin/includes/media.php:850 wp-admin/includes/media.php:944 +#: wp-admin/includes/media.php:2131 wp-admin/includes/media.php:2147 +#: wp-admin/includes/class-wp-users-list-table.php:264 +#: wp-admin/edit-tags.php:348 wp-admin/edit-tag-form.php:55 +msgid "None" +msgstr "Ninguna" + +#: wp-admin/edit-tags.php:350 wp-admin/edit-tag-form.php:57 +msgid "Categories, unlike tags, can have a hierarchy. You might have a Jazz category, and under that have children categories for Bebop and Big Band. Totally optional." +msgstr "Las categorías, a diferencia de las etiquetas, pueden tener jerarquías. Podrías tener una categoría de Jazz, y por debajo las categorías Bebop y Big Band. Totalmente opcional." + +#: wp-admin/edit-tag-form.php:65 +msgid "The description is not prominent by default, however some themes may show it." +msgstr "La descripción no suele mostrarse por defecto, sin embargo hay algunas plantillas que puede que la muestren." + +#: wp-includes/taxonomy.php:1972 wp-includes/taxonomy.php:2274 +#: wp-admin/includes/class-wp-terms-list-table.php:23 +msgid "Invalid taxonomy" +msgstr "Taxonomia no válida" + +#: wp-includes/taxonomy.php:406 +msgid "Edit Tag" +msgstr "Editar etiqueta" + +#: wp-admin/edit-tags.php:229 +msgid "Item added." +msgstr "Añadido." + +#: wp-admin/edit-tags.php:230 +msgid "Item deleted." +msgstr "Eliminado." + +#: wp-admin/edit-tags.php:231 +msgid "Item updated." +msgstr "Actualizado." + +#: wp-admin/edit-tags.php:232 +msgid "Item not added." +msgstr "No añadido." + +#: wp-admin/edit-tags.php:234 +msgid "Items deleted." +msgstr "Eliminados." + +#: wp-admin/edit-tags.php:275 +msgid "Note:
    Deleting a category does not delete the posts in that category. Instead, posts that were only assigned to the deleted category are set to the category %s." +msgstr "Nota:
    Al borrar una categoría no borrarás las entradas que hay en ella. En su lugar, las entradas que sólo estén asignadas a esa categoría se asignarán a la categoría %s." + +#: wp-admin/upload.php:98 +msgid "Error in moving to trash..." +msgstr "Error al mover a la papelera..." + +#: wp-admin/upload.php:108 +msgid "Error in restoring from trash..." +msgstr "Error al restaurar de la papelera..." + +#: wp-admin/edit.php:109 wp-admin/post.php:248 +msgid "You are not allowed to delete this item." +msgstr "No tienes autorización para borrar este elemento." + +#: wp-admin/edit.php:113 wp-admin/edit.php:116 wp-admin/upload.php:118 +msgid "Error in deleting..." +msgstr "Error al borrar..." + +#: wp-includes/post.php:1179 wp-admin/menu.php:77 +msgctxt "post" +msgid "Add New" +msgstr "Añadir nueva" + +#: wp-admin/edit.php:196 +msgid "This has been saved." +msgstr "Se ha guardado." + +#: wp-includes/post.php:1183 wp-admin/edit.php:196 +#: wp-content/plugins/akismet/legacy.php:294 +msgid "View Post" +msgstr "Ver entrada" + +#: wp-includes/post.php:1181 wp-admin/edit.php:196 wp-admin/press-this.php:600 +msgid "Edit Post" +msgstr "Editar entrada" + +#: wp-admin/edit.php:203 +msgid "%s post updated." +msgid_plural "%s posts updated." +msgstr[0] "%s entrada actualizada." +msgstr[1] "%s entradas actualizadas." + +#: wp-admin/edit.php:211 +msgid "%s item not updated, somebody is editing it." +msgid_plural "%s items not updated, somebody is editing them." +msgstr[0] "%s no se ha actualizado, alguien lo está editando." +msgstr[1] "%s no se han actualizado, alguien los está editando." + +#: wp-admin/edit.php:216 +msgid "Item permanently deleted." +msgid_plural "%s items permanently deleted." +msgstr[0] "Borrado permanentemente." +msgstr[1] "%s borrados permanentemente." + +#: wp-admin/includes/class-wp-posts-list-table.php:145 +msgctxt "posts" +msgid "Mine (%s)" +msgid_plural "Mine (%s)" +msgstr[0] "Mío (%s)" +msgstr[1] "Míos (%s)" + +#: wp-admin/includes/class-wp-posts-list-table.php:156 +msgctxt "posts" +msgid "All (%s)" +msgid_plural "All (%s)" +msgstr[0] "Todo (%s)" +msgstr[1] "Todos (%s)" + +#: wp-admin/includes/media.php:2018 +#: wp-admin/includes/class-wp-list-table.php:374 +msgid "Show all dates" +msgstr "Mostrar todas las fechas" + +#: wp-admin/includes/class-wp-posts-list-table.php:215 +#: wp-admin/includes/class-wp-links-list-table.php:64 +msgid "View all categories" +msgstr "Ver todas las categorías" + +#: wp-admin/includes/class-wp-list-table.php:402 +msgid "List View" +msgstr "Ver lista" + +#: wp-admin/includes/class-wp-list-table.php:403 +msgid "Excerpt View" +msgstr "Ver extracto" + +#: wp-admin/export.php:17 wp-admin/menu.php:221 +msgid "Export" +msgstr "Exportar" + +#: wp-admin/export.php:121 +msgid "When you click the button below WordPress will create an XML file for you to save to your computer." +msgstr "Cuando hagas clic en el botón de abajo, WordPress creará un archivo XML para que lo guardes en tu ordenador." + +#: wp-admin/export.php:122 +msgid "This format, which we call WordPress eXtended RSS or WXR, will contain your posts, pages, comments, custom fields, categories, and tags." +msgstr "Este formato, que llamamos WordPress eXtended RSS (RSS ampliado de WordPress) o WXR, contendrá todas tus entradas, comentarios, campos personalizados, categorías y etiquetas." + +#: wp-admin/export.php:202 +msgid "Download Export File" +msgstr "Descargar el archivo de exportación" + +#: wp-admin/import.php:93 +msgid "No importers are available." +msgstr "No hay importadores disponibles." + +#: wp-admin/upgrade.php:62 wp-admin/upgrade.php:94 +#: wp-admin/includes/media.php:1319 +msgid "Continue" +msgstr "Continuar" + +#: wp-admin/export.php:131 wp-admin/includes/class-wp-users-list-table.php:167 +#: wp-admin/includes/class-wp-terms-list-table.php:110 wp-admin/menu.php:74 +msgid "Posts" +msgstr "Entradas" + +#: wp-admin/import.php:30 +msgid "Blogger" +msgstr "Blogger" + +#: wp-admin/users.php:17 wp-admin/includes/template.php:1473 +#: wp-admin/menu.php:196 +msgid "Users" +msgstr "Usuarios" + +#: wp-includes/script-loader.php:434 +msgid "Done" +msgstr "Hecho" + +#: wp-includes/comment-template.php:30 wp-includes/theme.php:236 +msgid "Anonymous" +msgstr "Anónimo" + +#: wp-admin/import.php:32 +msgid "LiveJournal" +msgstr "LiveJournal" + +#: wp-admin/options-reading.php:91 wp-admin/options-reading.php:92 +#: wp-admin/includes/template.php:548 wp-admin/widgets.php:295 +msgid "— Select —" +msgstr "— Seleccionar —" + +#: wp-includes/post-template.php:1216 wp-admin/includes/dashboard.php:186 +msgid "Submit" +msgstr "Enviar" + +#: wp-admin/import.php:33 +msgid "Movable Type and TypePad" +msgstr "Movable Type y TypePad" + +#: wp-admin/import.php:34 wp-admin/includes/upgrade.php:129 +msgid "Blogroll" +msgstr "Sitios de interés" + +#: wp-includes/default-widgets.php:698 wp-admin/import.php:35 +msgid "RSS" +msgstr "RSS" + +#: wp-includes/functions.php:2375 +msgid "Invalid file type" +msgstr "Tipo de archivo no válido" + +#: wp-admin/includes/bookmark.php:192 +msgid "Could not update link in the database" +msgstr "No ha sido posible actualizar el enlace en la base de datos." + +#: wp-admin/includes/bookmark.php:199 +msgid "Could not insert link into the database" +msgstr "No ha sido posible insertar el enlace en la base de datos." + +#: wp-admin/includes/class-wp-filesystem-base.php:212 +msgid "Changing to %s" +msgstr "Cambiando a %s" + +#: wp-admin/includes/class-wp-filesystem-base.php:221 +msgid "Found %s" +msgstr "Encontrado %s" + +#: wp-admin/includes/class-wp-filesystem-ftpext.php:28 +msgid "The ftp PHP extension is not available" +msgstr "La extensión PHP de FTP no está disponible." + +#: wp-admin/includes/class-wp-filesystem-ftpsockets.php:38 +#: wp-admin/includes/class-wp-filesystem-ftpext.php:44 +msgid "FTP hostname is required" +msgstr "El nombre del servidor del FTP es necesario" + +#: wp-admin/includes/class-wp-filesystem-ftpsockets.php:47 +#: wp-admin/includes/class-wp-filesystem-ftpext.php:53 +msgid "FTP username is required" +msgstr "El nombre de usuario del FTP es necesario" + +#: wp-admin/includes/class-wp-filesystem-ftpsockets.php:52 +#: wp-admin/includes/class-wp-filesystem-ftpext.php:58 +msgid "FTP password is required" +msgstr "La contraseña del FTP es necesaria" + +#: wp-admin/includes/class-wp-filesystem-ftpsockets.php:64 +#: wp-admin/includes/class-wp-filesystem-ftpsockets.php:69 +#: wp-admin/includes/class-wp-filesystem-ftpext.php:74 +msgid "Failed to connect to FTP Server %1$s:%2$s" +msgstr "Ha sido imposible conectar con el servidor FTP %1$s:%2$s" + +#: wp-admin/includes/class-wp-filesystem-ssh2.php:117 +#: wp-admin/includes/class-wp-filesystem-ftpsockets.php:74 +#: wp-admin/includes/class-wp-filesystem-ftpext.php:79 +msgid "Username/Password incorrect for %s" +msgstr "Nombre de usuario y/o contraseña incorrecto/s para %s" + +#: wp-admin/includes/class-wp-filesystem-ssh2.php:57 +msgid "The ssh2 PHP extension is not available" +msgstr "La extesión PHP de SSH2 no está disponible" + +#: wp-admin/includes/class-wp-filesystem-ssh2.php:61 +msgid "The ssh2 PHP extension is available, however, we require the PHP5 function stream_get_contents()" +msgstr "La extensión ssh2 de PHP está disponible, no obstante es necesaria la función de PHP5 stream_get_contents()" + +#: wp-admin/includes/class-wp-filesystem-ssh2.php:72 +msgid "SSH2 hostname is required" +msgstr "El nombre del servidor del SSH2 es necesario" + +#: wp-admin/includes/class-wp-filesystem-ssh2.php:88 +msgid "SSH2 username is required" +msgstr "El nombre de usuario del SSH2 es necesario" + +#: wp-admin/includes/class-wp-filesystem-ssh2.php:96 +msgid "SSH2 password is required" +msgstr "La contraseña del SSH2 es necesaria" + +#: wp-admin/includes/class-wp-filesystem-ssh2.php:111 +msgid "Failed to connect to SSH2 Server %1$s:%2$s" +msgstr "Ha sido imposible conectar con el SSH2 %1$s:%2$s" + +#: wp-admin/includes/class-wp-filesystem-ssh2.php:122 +msgid "Public and Private keys incorrect for %s" +msgstr "Claves públicas y privadas incorrectas para %s" + +#: wp-admin/includes/class-wp-filesystem-ssh2.php:138 +msgid "Unable to perform command: %s" +msgstr "No se pudo realizar el comando: %s" + +#: wp-admin/includes/class-wp-upgrader.php:41 +msgid "Invalid Data provided." +msgstr "Datos facilitado no válidos." + +#: wp-admin/includes/file.php:518 wp-admin/includes/class-wp-upgrader.php:42 +#: wp-admin/includes/plugin.php:684 wp-admin/includes/theme.php:85 +msgid "Could not access filesystem." +msgstr "No ha sido posible acceder al sistema de archivos." + +#: wp-admin/includes/class-wp-upgrader.php:43 wp-admin/includes/plugin.php:687 +#: wp-admin/includes/theme.php:88 +msgid "Filesystem error." +msgstr "Error del sistema de archivos." + +#: wp-admin/includes/class-wp-upgrader.php:44 +msgid "Unable to locate WordPress Root directory." +msgstr "Ha sido imposible localizar el directorio de WordPress." + +#: wp-admin/includes/class-wp-upgrader.php:45 +msgid "Unable to locate WordPress Content directory (wp-content)." +msgstr "Ha sido imposible localizar el directorio de contenidos de WordPress (wp-content)." + +#: wp-admin/includes/class-wp-upgrader.php:46 wp-admin/includes/plugin.php:692 +msgid "Unable to locate WordPress Plugin directory." +msgstr "Ha sido imposible localizar el directorio de plugins de WordPress." + +#: wp-admin/includes/class-wp-upgrader.php:47 +msgid "Unable to locate WordPress Theme directory." +msgstr "Ha sido imposible localizar el directorio de temas de WordPress." + +#: wp-admin/includes/class-wp-upgrader.php:49 +msgid "Unable to locate needed folder (%s)." +msgstr "Ha sido imposible localizar la carpeta %s." + +#: wp-admin/includes/class-wp-upgrader.php:51 +msgid "Download failed." +msgstr "Descarga fallida." + +#: wp-admin/includes/class-wp-upgrader.php:52 +#: wp-admin/includes/update-core.php:368 +msgid "Installing the latest version…" +msgstr "Instalando última versión…" + +#: wp-admin/includes/class-wp-upgrader.php:53 +msgid "Destination folder already exists." +msgstr "La carpeta ya existe." + +#: wp-admin/includes/file.php:612 wp-admin/includes/file.php:704 +#: wp-admin/includes/file.php:763 wp-admin/includes/class-wp-upgrader.php:54 +#: wp-admin/includes/update-core.php:513 +msgid "Could not create directory." +msgstr "No ha sido posible crear el directorio" + +#: wp-admin/includes/file.php:578 wp-admin/includes/file.php:672 +#: wp-admin/includes/class-wp-upgrader.php:55 +msgid "Incompatible Archive." +msgstr "Archivo incompatible." + +#: wp-admin/includes/class-wp-upgrader.php:57 +msgid "Enabling Maintenance mode…" +msgstr "Activando el modo mantenimiento…" + +#: wp-admin/includes/class-wp-upgrader.php:58 +msgid "Disabling Maintenance mode…" +msgstr "Desactivando el modo de mantenimiento…" + +#: wp-admin/includes/class-wp-upgrader.php:369 +msgid "The plugin is at the latest version." +msgstr "Tienes la última versión del plugin." + +#: wp-admin/includes/class-wp-upgrader.php:371 +#: wp-admin/includes/class-wp-upgrader.php:611 +#: wp-admin/includes/class-wp-upgrader.php:864 +msgid "Downloading update from %s…" +msgstr "Descargando paquete de instalación desde %s…" + +#: wp-admin/includes/class-wp-upgrader.php:372 +#: wp-admin/includes/class-wp-upgrader.php:612 +#: wp-admin/includes/class-wp-upgrader.php:865 +msgid "Unpacking the update…" +msgstr "Descomprimiendo actualización…" + +#: wp-admin/includes/class-wp-upgrader.php:373 +msgid "Deactivating the plugin…" +msgstr "Desactivando el plugin…" + +#: wp-admin/includes/class-wp-upgrader.php:374 +msgid "Removing the old version of the plugin…" +msgstr "Eliminando la antigua versión del plugin…" + +#: wp-admin/includes/class-wp-upgrader.php:375 +msgid "Could not remove the old plugin." +msgstr "No ha sido posible eliminar la versión anterior del plugin." + +#: wp-admin/includes/class-wp-upgrader.php:381 +#: wp-admin/includes/class-wp-upgrader.php:620 +msgid "Install package not available." +msgstr "El paquete de instalación no está disponible." + +#: wp-admin/includes/class-wp-upgrader.php:382 +#: wp-admin/includes/class-wp-upgrader.php:621 +msgid "Downloading install package from %s…" +msgstr "Descargando el archivo de instalación de %s…" + +#: wp-admin/includes/class-wp-upgrader.php:383 +#: wp-admin/includes/class-wp-upgrader.php:622 +msgid "Unpacking the package…" +msgstr "Descomprimiendo…" + +#: wp-admin/includes/class-wp-upgrader.php:384 +msgid "Installing the plugin…" +msgstr "Instalando el plugin…" + +#: wp-admin/includes/class-wp-upgrader.php:385 +msgid "Plugin install failed." +msgstr "Fallo en la instalación del plugin." + +#: wp-admin/includes/class-wp-upgrader.php:386 +msgid "Plugin installed successfully." +msgstr "Plugin instalado correctamente." + +#: wp-admin/includes/class-wp-upgrader.php:609 +msgid "The theme is at the latest version." +msgstr "Tienes la última versión del tema." + +#: wp-admin/includes/class-wp-upgrader.php:613 +msgid "Removing the old version of the theme…" +msgstr "Eliminando la antigua versión del tema…" + +#: wp-admin/includes/class-wp-upgrader.php:614 +msgid "Could not remove the old theme." +msgstr "No ha sido posible eliminar la versión anterior del tema." + +#: wp-admin/includes/class-wp-upgrader.php:623 +msgid "Installing the theme…" +msgstr "Instalando el tema…" + +#: wp-admin/includes/class-wp-upgrader.php:624 +msgid "Theme install failed." +msgstr "Fallo en la instalación del tema." + +#: wp-admin/includes/class-wp-upgrader.php:625 +msgid "Theme installed successfully." +msgstr "El tema se ha instalado correctamente." + +#: wp-admin/includes/class-wp-upgrader.php:862 +msgid "WordPress is at the latest version." +msgstr "Tienes la última versión de WordPress." + +#: wp-admin/includes/class-wp-upgrader.php:866 +msgid "Could not copy files." +msgstr "No ha sido posible copiar los archivos." + +#: wp-admin/includes/class-wp-upgrader.php:1040 +msgid "Reactivating the plugin…" +msgstr "Reactivando el plugin…" + +#: wp-admin/includes/class-wp-upgrader.php:1045 +#: wp-admin/includes/class-wp-upgrader.php:1280 +#: wp-admin/includes/class-wp-upgrader.php:1282 +#: wp-admin/includes/class-wp-plugins-list-table.php:379 +msgid "Activate this plugin" +msgstr "Activar este plugin" + +#: wp-admin/includes/class-wp-upgrader.php:1045 +#: wp-admin/includes/class-wp-upgrader.php:1282 +msgid "Activate Plugin" +msgstr "Activar plugin" + +#: wp-admin/includes/class-wp-upgrader.php:1046 +#: wp-admin/includes/class-wp-upgrader.php:1201 +#: wp-admin/includes/class-wp-upgrader.php:1294 +msgid "Return to Plugins page" +msgstr "Volver a la página de plugins" + +#: wp-admin/includes/class-wp-upgrader.php:1268 +msgid "Successfully installed the plugin %s %s." +msgstr "El plugin %s %s se ha instalado correctamente." + +#: wp-admin/includes/class-wp-upgrader.php:1292 +msgid "Return to Plugin Installer" +msgstr "Volver al instalador de plugins" + +#: wp-admin/includes/class-wp-upgrader.php:1333 +msgid "Successfully installed the theme %1$s %2$s." +msgstr "El tema %1$s %2$s se ha instalado correctamente." + +#: wp-admin/includes/class-wp-posts-list-table.php:556 +#: wp-admin/includes/class-wp-themes-list-table.php:169 +#: wp-admin/includes/class-wp-upgrader.php:1352 +#: wp-admin/includes/class-wp-upgrader.php:1405 +#: wp-admin/includes/theme-install.php:145 +#: wp-admin/includes/theme-install.php:153 +msgid "Preview “%s”" +msgstr "Vista previa “%s”" + +#: wp-includes/js/tinymce/langs/wp-langs.php:96 +#: wp-includes/js/tinymce/langs/wp-langs.php:362 wp-admin/custom-header.php:481 +#: wp-admin/custom-background.php:184 +#: wp-admin/includes/class-wp-posts-list-table.php:556 +#: wp-admin/includes/class-wp-themes-list-table.php:169 +#: wp-admin/includes/class-wp-upgrader.php:1352 +#: wp-admin/includes/class-wp-upgrader.php:1405 +#: wp-admin/includes/theme-install.php:145 wp-admin/includes/meta-boxes.php:48 +msgid "Preview" +msgstr "Vista previa" + +#: wp-admin/includes/class-wp-themes-list-table.php:166 +#: wp-admin/includes/class-wp-upgrader.php:1353 +#: wp-admin/includes/class-wp-upgrader.php:1406 +msgid "Activate “%s”" +msgstr "Activar “%s”" + +#: wp-admin/includes/class-wp-upgrader.php:1357 +msgid "Return to Theme Installer" +msgstr "Volver al instalador de temas" + +#: wp-admin/includes/class-wp-upgrader.php:1359 +msgid "Themes page" +msgstr "Página de temas" + +#: wp-admin/includes/class-wp-upgrader.php:1233 +#: wp-admin/includes/class-wp-upgrader.php:1359 +#: wp-admin/includes/class-wp-upgrader.php:1412 +msgid "Return to Themes page" +msgstr "Volver a la página de temas" + +#: wp-admin/includes/class-wp-upgrader.php:1438 +msgid "Please select a file" +msgstr "Por favor elige un archivo" + +#: wp-admin/includes/file.php:329 wp-admin/includes/file.php:451 +#: wp-admin/includes/class-wp-upgrader.php:1452 +msgid "The uploaded file could not be moved to %s." +msgstr "El archivo subido no se ha podido mover a %s." + +#: wp-admin/includes/dashboard.php:40 wp-admin/includes/dashboard.php:43 +msgid "Right Now" +msgstr "Ahora mismo" + +#: wp-includes/default-widgets.php:600 wp-includes/default-widgets.php:638 +#: wp-admin/includes/dashboard.php:53 +msgid "Recent Comments" +msgstr "Comentarios recientes" + +#: wp-admin/includes/dashboard.php:70 +msgid "Incoming Links" +msgstr "Enlaces entrantes" + +#: wp-includes/js/tinymce/langs/wp-langs.php:306 wp-admin/update-core.php:190 +#: wp-admin/update-core.php:202 wp-admin/includes/dashboard.php:75 +#: wp-admin/plugins.php:331 +msgid "Plugins" +msgstr "Plugins" + +#: wp-admin/includes/dashboard.php:79 +msgid "QuickPress" +msgstr "Publicación rápida" + +#: wp-admin/includes/dashboard.php:83 +msgid "Recent Drafts" +msgstr "Últimos borradores" + +#: wp-admin/includes/dashboard.php:104 +msgid "http://planet.wordpress.org/" +msgstr "http://planet.wordpress.org/" + +#: wp-admin/includes/dashboard.php:105 +msgid "http://planet.wordpress.org/feed/" +msgstr "http://planet.wordpress.org/feed/" + +#: wp-admin/includes/dashboard.php:106 +msgid "Other WordPress News" +msgstr "Otras noticias sobre WordPress" + +#: wp-admin/includes/dashboard.php:129 wp-admin/includes/dashboard.php:599 +msgid "View all" +msgstr "Ver todo" + +#: wp-includes/script-loader.php:338 wp-includes/script-loader.php:365 +#: wp-includes/js/tinymce/langs/wp-langs.php:19 +#: wp-admin/includes/dashboard.php:156 +#: wp-admin/includes/class-wp-posts-list-table.php:996 +#: wp-admin/includes/image-edit.php:74 wp-admin/includes/media.php:1320 +#: wp-admin/includes/media.php:1582 wp-admin/includes/internal-linking.php:115 +#: wp-admin/includes/template.php:370 wp-admin/includes/template.php:559 +#: wp-admin/includes/template.php:646 wp-admin/includes/theme-install.php:285 +#: wp-admin/includes/nav-menu.php:190 +#: wp-admin/includes/class-wp-terms-list-table.php:365 +#: wp-admin/includes/meta-boxes.php:104 wp-admin/includes/meta-boxes.php:150 +#: wp-admin/press-this.php:135 wp-admin/press-this.php:165 +#: wp-admin/press-this.php:193 wp-admin/press-this.php:315 +#: wp-admin/widgets.php:311 +msgid "Cancel" +msgstr "Cancelar" + +#: wp-admin/includes/dashboard.php:160 +msgid "Configure" +msgstr "Configurar" + +#: wp-admin/includes/dashboard.php:266 +msgid "Post" +msgid_plural "Posts" +msgstr[0] "Entrada" +msgstr[1] "Entradas" + +#: wp-admin/includes/dashboard.php:337 +msgid "Comment" +msgid_plural "Comments" +msgstr[0] "Comentario" +msgstr[1] "Comentarios" + +#: wp-admin/includes/dashboard.php:294 +msgid "Page" +msgid_plural "Pages" +msgstr[0] "Página" +msgstr[1] "Páginas" + +#: wp-admin/includes/dashboard.php:349 +msgctxt "Right Now" +msgid "Approved" +msgid_plural "Approved" +msgstr[0] "Aprobado" +msgstr[1] "Aprobados" + +#: wp-admin/includes/dashboard.php:306 +msgid "Category" +msgid_plural "Categories" +msgstr[0] "Categoría" +msgstr[1] "Categorías" + +#: wp-admin/includes/dashboard.php:361 +msgid "Pending" +msgid_plural "Pending" +msgstr[0] "Pendiente" +msgstr[1] "Pendientes" + +#: wp-admin/includes/dashboard.php:318 +msgid "Tag" +msgid_plural "Tags" +msgstr[0] "Etiqueta" +msgstr[1] "Etiquetas" + +#: wp-admin/includes/dashboard.php:407 +msgid "Theme %1$s with %2$s Widget" +msgid_plural "Theme %1$s with %2$s Widgets" +msgstr[0] "Tema %1$s con %2$s widget" +msgstr[1] "Tema %1$s con %2$s widgets" + +#: wp-admin/includes/dashboard.php:411 +msgid "Theme %1$s" +msgstr "Tema %1$s" + +#: wp-admin/includes/dashboard.php:413 +msgid "Theme %1$s" +msgstr "Tema %1$s" + +#: wp-admin/includes/dashboard.php:490 +msgid "Post submitted. Preview post | Edit post" +msgstr "Entrada enviada. Previsualizar entrada | Editar entrada" + +#: wp-admin/includes/dashboard.php:505 +msgid "You can also try %s, easy blogging from anywhere on the Web." +msgstr "También puedes probar %s para crear fácilmente entradas desde cualquier web." + +#: wp-admin/tools.php:32 wp-admin/tools.php:37 wp-admin/options-writing.php:88 +#: wp-admin/options-writing.php:92 wp-admin/includes/dashboard.php:505 +#: wp-admin/press-this.php:327 wp-admin/press-this.php:484 +msgid "Press This" +msgstr "Publicar esto" + +#: wp-includes/post.php:4688 wp-admin/includes/dashboard.php:261 +#: wp-admin/includes/dashboard.php:539 +msgid "Content" +msgstr "Contenido" + +#: wp-includes/default-widgets.php:1000 wp-admin/includes/dashboard.php:546 +#: wp-admin/includes/class-wp-posts-list-table.php:280 +msgid "Tags" +msgstr "Etiquetas" + +#: wp-includes/script-loader.php:349 wp-admin/includes/dashboard.php:556 +#: wp-admin/includes/meta-boxes.php:31 wp-admin/press-this.php:488 +msgid "Save Draft" +msgstr "Guardar borrador" + +#: wp-admin/includes/dashboard.php:557 +msgid "Reset" +msgstr "Reiniciar" + +#: wp-admin/includes/dashboard.php:559 wp-admin/includes/meta-boxes.php:219 +#: wp-admin/includes/meta-boxes.php:220 wp-admin/press-this.php:493 +msgid "Submit for Review" +msgstr "Enviar para revisión" + +#: wp-admin/includes/dashboard.php:602 +msgid "There are no drafts at the moment" +msgstr "En este momento no hay borradores" + +#: wp-includes/theme-compat/comments-popup.php:62 +#: wp-admin/includes/dashboard.php:661 wp-admin/includes/meta-boxes.php:480 +msgid "No comments yet." +msgstr "Aún no hay comentarios." + +#: wp-admin/includes/dashboard.php:695 +#: wp-admin/includes/class-wp-comments-list-table.php:393 +#: wp-admin/includes/class-wp-comments-list-table.php:395 +msgid "Approve this comment" +msgstr "Aprobar este comentario" + +#: wp-admin/includes/dashboard.php:696 +#: wp-admin/includes/class-wp-comments-list-table.php:391 +#: wp-admin/includes/class-wp-comments-list-table.php:396 +msgid "Unapprove this comment" +msgstr "Rechazar este comentario" + +#: wp-includes/link-template.php:1015 wp-admin/edit-comments.php:197 +#: wp-admin/edit-comments.php:203 wp-admin/includes/dashboard.php:697 +#: wp-admin/includes/class-wp-comments-list-table.php:414 +msgid "Edit comment" +msgstr "Editar comentario" + +#: wp-admin/includes/dashboard.php:698 +#: wp-admin/includes/class-wp-comments-list-table.php:417 +msgid "Reply to this comment" +msgstr "Responder a este comentario" + +#: wp-includes/script-loader.php:321 wp-includes/comment-template.php:1039 +#: wp-admin/includes/dashboard.php:698 +#: wp-admin/includes/class-wp-comments-list-table.php:417 +msgid "Reply" +msgstr "Responder" + +#: wp-admin/includes/dashboard.php:699 +#: wp-admin/includes/class-wp-comments-list-table.php:400 +msgid "Mark this comment as spam" +msgstr "Marcar este comentario como spam" + +#: wp-admin/includes/dashboard.php:699 +#: wp-admin/includes/class-wp-comments-list-table.php:400 +msgctxt "verb" +msgid "Spam" +msgstr "Spam" + +#: wp-admin/includes/dashboard.php:703 +#: wp-admin/includes/class-wp-comments-list-table.php:410 +msgid "Move this comment to the trash" +msgstr "Mover este comentario a la papelera" + +#: wp-admin/includes/dashboard.php:703 +#: wp-admin/includes/class-wp-comments-list-table.php:410 +msgctxt "verb" +msgid "Trash" +msgstr "Enviar a la Papelera" + +#: wp-admin/includes/dashboard.php:729 +msgid "From %1$s on %2$s%3$s" +msgstr "De %1$s en %2$s%3$s" + +#: wp-admin/includes/dashboard.php:730 +msgid "[Pending]" +msgstr "[Pendiente]" + +#: wp-includes/comment-template.php:680 wp-admin/includes/dashboard.php:737 +msgid "Pingback" +msgstr "Pingback" + +#: wp-includes/comment-template.php:679 wp-admin/includes/dashboard.php:740 +msgid "Trackback" +msgstr "Trackback" + +#: wp-admin/includes/dashboard.php:749 +msgctxt "dashboard" +msgid "%1$s on %2$s" +msgstr "%1$s en %2$s" + +#: wp-includes/default-widgets.php:682 wp-admin/includes/dashboard.php:780 +msgid "Number of comments to show:" +msgstr "Número de comentarios a mostrar:" + +#: wp-admin/includes/dashboard.php:1038 +msgid "Loading…" +msgstr "Cargando…" + +#: wp-admin/includes/dashboard.php:1038 +msgid "This widget requires JavaScript." +msgstr "Este widget requiere Javascript." + +#: wp-includes/default-widgets.php:788 wp-admin/includes/dashboard.php:801 +#: wp-admin/includes/dashboard.php:917 +msgid "RSS Error: %s" +msgstr "Error en el RSS: %s" + +#: wp-admin/includes/dashboard.php:808 +msgid "This dashboard widget queries Google Blog Search so that when another blog links to your site it will show up here. It has found no incoming links… yet. It’s okay — there is no rush." +msgstr "Este widget de escritorio consulta a la Búsqueda de blogs de Google de modo que cuando otro blog enlace a su sitio se mostrará aquí. No se ha encontrado ningún enlace entrante… aún. Está bien, no hay prisa." + +#: wp-admin/includes/dashboard.php:832 wp-admin/includes/dashboard.php:834 +#: wp-admin/includes/post.php:1304 +msgid "Somebody" +msgstr "Alguien" + +#: wp-admin/includes/dashboard.php:846 +msgid "%1$s linked here saying, \"%3$s\"" +msgstr "%1$s enlazó aquí diciendo, \"%3$s\"" + +#: wp-admin/includes/dashboard.php:849 +msgid "%1$s linked here saying, \"%3$s\"" +msgstr "%1$s enlazó aquí diciendo, \"%3$s\"" + +#: wp-admin/includes/dashboard.php:854 +msgid "on %4$s" +msgstr "en %4$s" + +#: wp-admin/includes/dashboard.php:956 +msgid "Most Popular" +msgstr "Más populares" + +#: wp-admin/includes/dashboard.php:956 +msgid "Newest Plugins" +msgstr "Plugins recientes" + +#: wp-admin/includes/dashboard.php:956 +msgid "Recently Updated" +msgstr "Actualizados recientemente" + +#: wp-admin/includes/dashboard.php:1014 wp-admin/includes/theme-install.php:143 +msgid "Install" +msgstr "Instalar" + +#: wp-includes/default-widgets.php:734 wp-admin/includes/dashboard.php:1118 +msgid "Unknown Feed" +msgstr "Feed desconocido" + +#: wp-admin/includes/file.php:11 +msgid "Main Index Template" +msgstr "Plantilla de la página principal" + +#: wp-admin/includes/file.php:12 wp-admin/includes/file.php:40 +msgid "Stylesheet" +msgstr "Hoja de estilos" + +#: wp-admin/includes/file.php:15 +msgid "RTL Stylesheet" +msgstr "Hoja de estilos RTL" + +#: wp-admin/includes/file.php:17 +msgid "Popup Comments" +msgstr "Comentarios emergentes" + +#: wp-admin/includes/file.php:18 +msgid "Footer" +msgstr "Pie de página" + +#: wp-includes/admin-bar.php:317 wp-admin/custom-header.php:86 +#: wp-admin/includes/file.php:19 +msgid "Header" +msgstr "Cabecera" + +#: wp-includes/widgets.php:490 wp-admin/includes/file.php:20 +#: wp-admin/widgets.php:278 +msgid "Sidebar" +msgstr "Barra lateral" + +#: wp-includes/theme-compat/sidebar.php:57 wp-includes/default-widgets.php:218 +#: wp-includes/default-widgets.php:225 wp-admin/includes/file.php:21 +msgid "Archives" +msgstr "Archivos" + +#: wp-admin/includes/file.php:24 +msgid "Category Template" +msgstr "Plantilla de categoría" + +#: wp-admin/includes/file.php:25 wp-admin/includes/meta-boxes.php:572 +msgid "Page Template" +msgstr "Plantilla de página" + +#: wp-admin/includes/class-wp-theme-install-list-table.php:31 +#: wp-admin/includes/file.php:26 +#: wp-admin/includes/class-wp-plugin-install-list-table.php:31 +msgid "Search Results" +msgstr "Resultados de la búsqueda" + +#: wp-admin/includes/file.php:27 +msgid "Search Form" +msgstr "Formulario de búsqueda" + +#: wp-admin/includes/file.php:28 +msgid "Single Post" +msgstr "Entrada individual" + +#: wp-admin/includes/file.php:29 +msgid "404 Template" +msgstr "Error 404 (página no encontrada)" + +#: wp-admin/includes/file.php:30 +msgid "Links Template" +msgstr "Plantilla de enlaces" + +#: wp-admin/includes/file.php:31 +msgid "Theme Functions" +msgstr "Funciones del tema" + +#: wp-admin/includes/file.php:32 +msgid "Attachment Template" +msgstr "Plantilla de archivos adjuntos" + +#: wp-admin/includes/file.php:33 +msgid "Image Attachment Template" +msgstr "Plantilla de imagen adjunta" + +#: wp-admin/includes/file.php:34 +msgid "Video Attachment Template" +msgstr "Plantilla de vídeo adjunto" + +#: wp-admin/includes/file.php:35 +msgid "Audio Attachment Template" +msgstr "Plantilla de audio adjunto" + +#: wp-admin/includes/file.php:36 +msgid "Application Attachment Template" +msgstr "Plantilla de aplicación adjunta" + +#: wp-admin/includes/file.php:37 +msgid "my-hacks.php (legacy hacks support)" +msgstr "my-hacks.php (soporte para hacks)" + +#: wp-admin/includes/file.php:38 +msgid ".htaccess (for rewrite rules )" +msgstr ".htaccess (para reglas de reescritura)" + +#: wp-admin/includes/file.php:41 +msgid "Comments Template" +msgstr "Plantilla de comentarios" + +#: wp-admin/includes/file.php:42 +msgid "Popup Comments Template" +msgstr "Plantilla de comentarios emergentes" + +#: wp-admin/includes/file.php:202 +msgid "Sorry, can’t edit files with “..” in the name. If you are trying to edit a file in your WordPress home directory, you can just type the name of the file in." +msgstr "Disculpa, no puedes editar archivos con \"..\" en el nombre. Si estás intentando editar un archivo en tu directorio raíz de WordPress, simplemente escribe el nombre del archivo." + +#: wp-admin/includes/file.php:208 +msgid "Sorry, that file cannot be edited." +msgstr "Disculpa, ese archivo no puede editarse." + +#: wp-admin/includes/file.php:381 +msgid "The uploaded file exceeds the upload_max_filesize directive in php.ini." +msgstr "El archivo a subir sobrepasa la directiva upload_max_filesize (tamaño máximo de subida) en php.ini." + +#: wp-admin/includes/file.php:382 +msgid "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form." +msgstr "El archivo a subir sobrepasa la directiva MAX_FILE_SIZE (tamaño máximo de archivo) especificada en el formulario HTML." + +#: wp-admin/includes/file.php:257 wp-admin/includes/file.php:383 +msgid "The uploaded file was only partially uploaded." +msgstr "Sólo se ha podido subir una parte del archivo." + +#: wp-admin/includes/file.php:258 wp-admin/includes/file.php:384 +msgid "No file was uploaded." +msgstr "No se ha subido ningún archivo." + +#: wp-admin/includes/file.php:260 wp-admin/includes/file.php:386 +msgid "Missing a temporary folder." +msgstr "Falta un directorio temporal." + +#: wp-admin/includes/file.php:261 wp-admin/includes/file.php:387 +msgid "Failed to write file to disk." +msgstr "El archivo no se ha podido grabar en el disco." + +#: wp-admin/includes/file.php:262 wp-admin/includes/file.php:388 +msgid "File upload stopped by extension." +msgstr "Subida de archivo detenida a causa de la extensión." + +#: wp-admin/includes/file.php:279 wp-admin/includes/file.php:404 +msgid "Invalid form submission." +msgstr "Se envió un formulario erróneo." + +#: wp-admin/includes/file.php:290 wp-admin/includes/import.php:63 +msgid "File is empty. Please upload something more substantial. This error could also be caused by uploads being disabled in your php.ini or by post_max_size being defined as smaller than upload_max_filesize in php.ini." +msgstr "El archivo está vacío. Por favor, sube algo con más sustancia. Este error puede que lo provoque que tu fichero php.ini tenga inhabilitadas las subidas o porque post_max_size esté definido más pequeño que el upload_max_filesize en php.ini." + +#: wp-admin/includes/file.php:296 +msgid "Specified file failed upload test." +msgstr "El archivo indicado no cumple los requisitos de subida." + +#: wp-admin/includes/file.php:412 +msgid "File is empty. Please upload something more substantial. This error could also be caused by uploads being disabled in your php.ini." +msgstr "El archivo está vacío. Por favor, sube algo con más sustancia. Este error podría ser causado porque las subidas está desactivadas en tu php.ini." + +#: wp-admin/includes/file.php:416 +msgid "Specified file does not exist." +msgstr "El archivo especificado no existe." + +#: wp-admin/includes/file.php:480 +msgid "Invalid URL Provided." +msgstr "La URL especificada no es válido." + +#: wp-admin/includes/file.php:484 +msgid "Could not create Temporary file." +msgstr "No ha sido posible crear el archivo temporal." + +#: wp-admin/includes/file.php:582 wp-admin/includes/file.php:618 +msgid "Could not retrieve file from archive." +msgstr "No se puede recuperar el archivo." + +#: wp-admin/includes/file.php:628 +msgid "Could not extract file from archive." +msgstr "No podemos descomprimir el archivo." + +#: wp-admin/includes/file.php:631 wp-admin/includes/file.php:717 +#: wp-admin/includes/file.php:758 wp-admin/includes/update-core.php:421 +#: wp-admin/includes/update-core.php:508 +msgid "Could not copy file." +msgstr "No ha sido posible copiar el archivo." + +#: wp-admin/includes/file.php:675 +msgid "Empty archive." +msgstr "Archivo vacío." + +#: wp-admin/includes/file.php:948 +msgid "Error: There was an error connecting to the server, Please verify the settings are correct." +msgstr "Error: Se ha producido un error en la conexión con el servidor. Por favor, verifica que la configuración es correcta." + +#: wp-admin/includes/file.php:956 +msgid "FTP" +msgstr "FTP" + +#: wp-admin/includes/file.php:958 +msgid "FTPS (SSL)" +msgstr "FTPS (SSL)" + +#: wp-admin/includes/file.php:960 +msgid "SSH2" +msgstr "SSH2" + +#: wp-admin/includes/file.php:981 +msgid "Connection Information" +msgstr "Datos de conexión" + +#: wp-admin/includes/file.php:1003 +msgid "Hostname" +msgstr "Servidor" + +#: wp-includes/general-template.php:258 wp-login.php:516 wp-login.php:636 +#: wp-admin/user-new.php:287 wp-admin/install.php:101 wp-admin/install.php:225 +#: wp-admin/includes/file.php:983 +#: wp-admin/includes/class-wp-users-list-table.php:163 +#: wp-admin/user-edit.php:237 +msgid "Username" +msgstr "Nombre de usuario" + +#: wp-includes/general-template.php:259 wp-login.php:640 +#: wp-admin/user-new.php:309 wp-admin/install.php:229 +#: wp-admin/options-writing.php:115 +#: wp-admin/includes/class-wp-posts-list-table.php:796 +#: wp-admin/includes/file.php:984 +msgid "Password" +msgstr "Contraseña" + +#: wp-admin/includes/file.php:1019 +msgid "Authentication Keys" +msgstr "Claves de autentificación" + +#: wp-admin/includes/file.php:1021 +msgid "Public Key:" +msgstr "Clave pública:" + +#: wp-admin/includes/file.php:1022 +msgid "Private Key:" +msgstr "Clave privada:" + +#: wp-admin/includes/file.php:1025 +msgid "Enter the location on the server where the keys are located. If a passphrase is needed, enter that in the password field above." +msgstr "Introduce la dirección del servidor en el que se encuentran las claves. Si es necesaria una contraseña, introdúcela en el campo de contraseña." + +#: wp-admin/includes/file.php:1030 wp-admin/includes/file.php:1032 +msgid "Connection Type" +msgstr "Tipo de conexión" + +#: wp-admin/includes/file.php:1051 +msgid "Proceed" +msgstr "Ejecutar" + +#: wp-admin/includes/image-edit.php:19 wp-admin/includes/image-edit.php:545 +msgid "Image data does not exist. Please re-upload the image." +msgstr "No existen datos de la imagen. Por favor, vuelve a subir la imagen." + +#: wp-admin/includes/image-edit.php:40 +msgid "Crop" +msgstr "Recortar" + +#: wp-admin/includes/image-edit.php:44 +msgid "Rotate counter-clockwise" +msgstr "Rotar en sentido contrario a las agujas del reloj." + +#: wp-admin/includes/image-edit.php:45 +msgid "Rotate clockwise" +msgstr "Rotar en el sentido de las agujas del reloj." + +#: wp-admin/includes/image-edit.php:47 +msgid "Image rotation is not supported by your web host (function imagerotate() is missing)" +msgstr "Tu hosting no soporta la rotación de imágenes (no tiene la función imagerotate())" + +#: wp-admin/includes/image-edit.php:53 +msgid "Flip vertically" +msgstr "Voltear verticalmente" + +#: wp-admin/includes/image-edit.php:54 +msgid "Flip horizontally" +msgstr "Voltear horizontalmente" + +#: wp-includes/js/tinymce/langs/wp-langs.php:268 +#: wp-includes/js/tinymce/wp-mce-help.php:236 +#: wp-admin/includes/image-edit.php:57 +msgid "Redo" +msgstr "Rehacer" + +#: wp-admin/includes/image-edit.php:82 +msgid "Scale Image" +msgstr "Escalar imagen" + +#: wp-admin/includes/image-edit.php:84 +msgid "You can proportionally scale the original image. For best results the scaling should be done before performing any other operations on it like crop, rotate, etc. Note that if you make the image larger it may become fuzzy." +msgstr "Puedes escalar proporcionalmente la imagen original. Para obtener los mejores resultados es mejor escalar la imagen antes de realizar otras operaciones como recortar, rotar, etc. Date cuenta de que si haces más grande la imagen puede verse borrosa." + +#: wp-admin/includes/image-edit.php:85 +msgid "Original dimensions %s" +msgstr "Dimensiones originales %s" + +#: wp-includes/js/tinymce/langs/wp-langs.php:374 +#: wp-admin/includes/image-edit.php:89 +msgid "Scale" +msgstr "Escala" + +#: wp-admin/custom-background.php:222 wp-admin/custom-background.php:226 +#: wp-admin/includes/image-edit.php:97 +msgid "Restore Original Image" +msgstr "Restaurar imagen original" + +#: wp-admin/includes/image-edit.php:99 +msgid "Discard any changes and restore the original image." +msgstr "Descartar todos los cambios y restaurar la imagen original." + +#: wp-admin/includes/image-edit.php:102 +msgid "Previously edited copies of the image will not be deleted." +msgstr "Las copias de la imagen editadas previamente no se borrarán." + +#: wp-admin/includes/image-edit.php:106 +msgid "Restore image" +msgstr "Restaurar imagen" + +#: wp-admin/includes/image-edit.php:117 +msgid "Image Crop" +msgstr "Recortar imagen" + +#: wp-admin/includes/image-edit.php:118 wp-admin/includes/image-edit.php:164 +msgid "(help)" +msgstr "(ayuda)" + +#: wp-admin/includes/image-edit.php:120 +msgid "The image can be cropped by clicking on it and dragging to select the desired part. While dragging the dimensions of the selection are displayed below." +msgstr "Puedes recortar la imagen haciendo clic en ella y arrastrando la parte deseada. Mientras arrastras, abajo se muestran las dimensiones." + +#: wp-admin/includes/image-edit.php:121 wp-admin/user-edit.php:211 +msgid "Keyboard Shortcuts" +msgstr "Atajos de teclado" + +#: wp-admin/includes/image-edit.php:123 +msgid "Arrow: move by 10px" +msgstr "Flecha: mover 10px" + +#: wp-admin/includes/image-edit.php:124 +msgid "Shift + arrow: move by 1px" +msgstr "May + flecha: mover 1px" + +#: wp-admin/includes/image-edit.php:125 +msgid "Ctrl + arrow: resize by 10px" +msgstr "Control + flecha: redimensiona en 10px" + +#: wp-admin/includes/image-edit.php:126 +msgid "Ctrl + Shift + arrow: resize by 1px" +msgstr "Control + May + flecha: redimensiona en 1 px" + +#: wp-admin/includes/image-edit.php:127 +msgid "Shift + drag: lock aspect ratio" +msgstr "May + arrastrar: bloquea relación de aspecto" + +#: wp-admin/includes/image-edit.php:130 +msgid "Crop Aspect Ratio" +msgstr "Relación de aspecto de la zona a recortar" + +#: wp-admin/includes/image-edit.php:131 +msgid "You can specify the crop selection aspect ratio then hold down the Shift key while dragging to lock it. The values can be 1:1 (square), 4:3, 16:9, etc. If there is a selection, specifying aspect ratio will set it immediately." +msgstr "Puedes especificar la relación de aspecto de la zona seleccionada para recortar y luego mantener la tecla mayúsculas mientras arrastras para bloquearlo. Los valores pueden ser 1:1 (cuadrado), 4:3, 16:9, etc. Si hay una selección, al especificar la relación de aspecto se establece al instante." + +#: wp-admin/includes/image-edit.php:133 +msgid "Crop Selection" +msgstr "Selección de recorte" + +#: wp-admin/includes/image-edit.php:134 +msgid "Once started, the selection can be adjusted by entering new values (in pixels). Note that these values are scaled to approximately match the original image dimensions. The minimum selection size equals the thumbnail size as set in the Media settings." +msgstr "Una vez comiences, la selección puede ajustarse introduciendo nuevos valores (en pixels). Date cuenta que estos valores se escalan para que se ajusten, aproximadamente, a las dimensiones de la imagen original. El tamaño de selección mínimo se iguala al tamaño de miniatura establecido en las opciones de Multimedia." + +#: wp-admin/includes/image-edit.php:139 +msgid "Aspect ratio:" +msgstr "Relación de aspecto:" + +#: wp-admin/includes/image-edit.php:148 +msgid "Selection:" +msgstr "Selección:" + +#: wp-admin/includes/image-edit.php:163 +msgid "Thumbnail Settings" +msgstr "Opciones de miniatura" + +#: wp-admin/includes/image-edit.php:165 +msgid "The thumbnail image can be cropped differently. For example it can be square or contain only a portion of the original image to showcase it better. Here you can select whether to apply changes to all image sizes or make the thumbnail different." +msgstr "La imagen de miniatura puede recortarse de manera diferente. Por ejemplo, puede ser cuadrada, o contener sólo una parte de la imagen original para que se ajuste mejor. Aquí puedes elegir si aplicar los cambios a todos los tamaños de imagen o hacer una miniatura diferente." + +#: wp-admin/includes/image-edit.php:169 +msgid "Current thumbnail" +msgstr "Miniatura actual" + +#: wp-admin/includes/image-edit.php:173 +msgid "Apply changes to:" +msgstr "Aplicar cambios a:" + +#: wp-admin/includes/image-edit.php:177 +msgid "All image sizes" +msgstr "Todos los tamaños de imagen" + +#: wp-includes/js/tinymce/langs/wp-langs.php:486 +#: wp-admin/includes/image-edit.php:181 wp-admin/includes/media.php:876 +msgid "Thumbnail" +msgstr "Miniatura" + +#: wp-admin/includes/image-edit.php:185 +msgid "All sizes except thumbnail" +msgstr "Todos los tamaños excepto la miniatura" + +#: wp-admin/includes/image-edit.php:195 +msgid "There are unsaved changes that will be lost. 'OK' to continue, 'Cancel' to return to the Image Editor." +msgstr "Hay cambios sin guardar que se perderán. 'Aceptar' para continuar, 'Cancelar' para volver al Editor de imágenes." + +#: wp-admin/includes/image-edit.php:428 +msgid "Cannot load image metadata." +msgstr "No se pudieron cargar los metadatos de la imagen." + +#: wp-admin/includes/image-edit.php:483 +msgid "Cannot save image metadata." +msgstr "No se pudieron guardar los metadatos de la imagen." + +#: wp-admin/includes/image-edit.php:488 +msgid "Image metadata is inconsistent." +msgstr "Los metadatos de la imagen son inconsistentes." + +#: wp-admin/includes/image-edit.php:490 +msgid "Image restored successfully." +msgstr "Imagen restaurada con éxito." + +#: wp-admin/includes/image-edit.php:503 +msgid "Unable to create new image." +msgstr "No se pudo crear una imagen nueva." + +#: wp-admin/includes/image-edit.php:529 +msgid "Error while saving the scaled image. Please reload the page and try again." +msgstr "Error al tratar de guardar la imagen escalada. Vuelve a cargar la página e inténtalo de nuevo." + +#: wp-admin/includes/image-edit.php:537 +msgid "Nothing to save, the image has not changed." +msgstr "Nada que guardar, la imagen no ha cambiado." + +#: wp-admin/includes/image-edit.php:580 +msgid "Unable to save the image." +msgstr "No se pudo guardar la imagen." + +#: wp-admin/includes/image-edit.php:665 +msgid "Image saved" +msgstr "Imagen guardada" + +#: wp-includes/media.php:247 +msgid "File “%s” doesn’t exist?" +msgstr "¿El archivo “%s” no existe?" + +#: wp-includes/media.php:250 +msgid "The GD image library is not installed." +msgstr "La librería de imágenes GD no está instalada." + +#: wp-includes/media.php:257 +msgid "File “%s” is not an image." +msgstr "El archivo “%s” no es una imagen." + +#: wp-admin/includes/media.php:18 +msgid "From Computer" +msgstr "Desde el ordenador" + +#: wp-admin/includes/media.php:19 +msgid "From URL" +msgstr "Desde una URL" + +#: wp-admin/includes/media.php:20 +msgid "Gallery" +msgstr "Galería" + +#: wp-admin/upload.php:133 wp-admin/includes/media.php:21 +msgid "Media Library" +msgstr "Librería multimedia" + +#: wp-admin/includes/media.php:53 +msgid "Gallery (%s)" +msgstr "Galería (%s)" + +#: wp-admin/includes/media.php:316 +msgid "Uploads" +msgstr "Archivos subidos" + +#: wp-admin/includes/media.php:316 wp-admin/includes/template.php:1558 +msgid "WordPress" +msgstr "WordPress" + +#: wp-admin/includes/media.php:398 +msgid "Upload/Insert %s" +msgstr "Subir/Insertar %s" + +#: wp-includes/js/tinymce/langs/wp-langs.php:472 +#: wp-admin/includes/media.php:396 +msgid "Add Media" +msgstr "Añadir objeto" + +#: wp-includes/js/tinymce/langs/wp-langs.php:473 +#: wp-admin/includes/media.php:390 +msgid "Add an Image" +msgstr "Añadir una imagen" + +#: wp-includes/js/tinymce/langs/wp-langs.php:474 +#: wp-admin/includes/media.php:392 +msgid "Add Video" +msgstr "Añadir un vídeo" + +#: wp-includes/js/tinymce/langs/wp-langs.php:475 +#: wp-admin/includes/media.php:394 +msgid "Add Audio" +msgstr "Añadir un archivo de audio" + +#: wp-admin/admin-ajax.php:1529 wp-admin/includes/media.php:562 +#: wp-admin/includes/media.php:667 wp-admin/includes/media.php:726 +#: wp-admin/includes/media.php:782 wp-admin/includes/post.php:1835 +msgid "Saved." +msgstr "Guardado." + +#: wp-includes/js/tinymce/langs/wp-langs.php:77 +#: wp-includes/js/tinymce/langs/wp-langs.php:340 +#: wp-includes/js/tinymce/langs/wp-langs.php:439 +#: wp-admin/custom-background.php:256 wp-admin/includes/media.php:850 +#: wp-admin/includes/media.php:2133 +msgid "Left" +msgstr "Izquierda" + +#: wp-includes/js/tinymce/langs/wp-langs.php:78 +#: wp-includes/js/tinymce/langs/wp-langs.php:419 +#: wp-includes/js/tinymce/langs/wp-langs.php:440 +#: wp-admin/custom-background.php:260 wp-admin/includes/media.php:850 +#: wp-admin/includes/media.php:2135 +msgid "Center" +msgstr "Centrar" + +#: wp-includes/js/tinymce/langs/wp-langs.php:79 +#: wp-includes/js/tinymce/langs/wp-langs.php:341 +#: wp-includes/js/tinymce/langs/wp-langs.php:437 +#: wp-admin/custom-background.php:264 wp-admin/includes/media.php:850 +#: wp-admin/includes/media.php:2137 +msgid "Right" +msgstr "Derecha" + +#: wp-includes/js/tinymce/langs/wp-langs.php:487 +#: wp-admin/includes/media.php:876 +msgid "Medium" +msgstr "Medio" + +#: wp-admin/includes/media.php:876 +msgid "Large" +msgstr "Grande" + +#: wp-includes/js/tinymce/langs/wp-langs.php:488 +#: wp-admin/includes/media.php:876 +msgid "Full Size" +msgstr "Tamaño completo" + +#: wp-includes/js/tinymce/langs/wp-langs.php:485 +#: wp-admin/includes/media.php:913 +msgid "Size" +msgstr "Tamaño" + +#: wp-admin/includes/media.php:945 wp-admin/includes/media.php:1113 +msgid "File URL" +msgstr "URL del archivo" + +#: wp-admin/includes/media.php:946 +msgid "Post URL" +msgstr "URL de la entrada" + +#: wp-includes/js/tinymce/langs/wp-langs.php:513 +#: wp-admin/includes/media.php:969 wp-admin/includes/media.php:2121 +msgid "Alternate Text" +msgstr "Texto alternativo" + +#: wp-admin/includes/media.php:970 wp-admin/includes/media.php:2124 +msgid "Alt text for the image, e.g. “The Mona Lisa”" +msgstr "Texto alternativo (alt) de la imagen, por ejemplo “La Mona Lisa”" + +#: wp-includes/js/tinymce/langs/wp-langs.php:76 +#: wp-includes/js/tinymce/langs/wp-langs.php:333 +#: wp-admin/includes/media.php:974 wp-admin/includes/media.php:2128 +msgid "Alignment" +msgstr "Alineación" + +#: wp-admin/includes/media.php:1030 +msgid "Empty Title filled from filename." +msgstr "Título vacío rellenado desde el nombre de fichero." + +#: wp-includes/js/tinymce/langs/wp-langs.php:512 +#: wp-admin/includes/media.php:1094 +msgid "Caption" +msgstr "Leyenda" + +#: wp-includes/js/tinymce/langs/wp-langs.php:343 +#: wp-admin/includes/media.php:1103 +msgid "Link URL" +msgstr "URL del enlace" + +#: wp-includes/js/tinymce/langs/wp-langs.php:491 +#: wp-admin/includes/media.php:1106 wp-admin/includes/media.php:2149 +msgid "Enter a link URL or click above for presets." +msgstr "Introduce una URL para el enlace o clic sobre el actual." + +#: wp-admin/includes/class-wp-posts-list-table.php:861 +#: wp-admin/includes/media.php:1109 wp-admin/includes/media.php:1817 +#: wp-admin/includes/meta-boxes.php:578 wp-admin/includes/meta-boxes.php:579 +msgid "Order" +msgstr "Orden" + +#: wp-admin/includes/media.php:1117 +msgid "Location of the uploaded file." +msgstr "Ubicación del archivo subido." + +#: wp-admin/includes/media.php:1214 wp-admin/includes/media.php:1803 +msgid "Show" +msgstr "Mostrar" + +#: wp-admin/includes/media.php:1215 wp-admin/includes/media.php:1804 +msgid "Hide" +msgstr "Ocultar" + +#: wp-includes/js/tinymce/langs/wp-langs.php:481 +#: wp-admin/includes/media.php:1270 +msgid "Edit Image" +msgstr "Editar imagen" + +#: wp-admin/includes/media.php:1288 +msgid "File name:" +msgstr "Nombre de archivo:" + +#: wp-admin/includes/media.php:1289 +msgid "File type:" +msgstr "Tipo de archivo:" + +#: wp-admin/includes/media.php:1290 +msgid "Upload date:" +msgstr "Fecha de subida:" + +#: wp-admin/includes/media.php:1292 +msgid "Dimensions:" +msgstr "Dimensiones:" + +#: wp-admin/includes/media.php:1312 wp-admin/includes/media.php:2257 +#: wp-admin/includes/media.php:2266 +msgid "Insert into Post" +msgstr "Insertar en la entrada" + +#: wp-admin/includes/media.php:1318 +msgid "You are about to delete %s." +msgstr "Estás a punto de eliminar %s." + +#: wp-admin/includes/media.php:1525 +msgid "Select Files" +msgstr "Elegir archivos" + +#: wp-admin/includes/media.php:1566 +msgid "Choose files to upload" +msgstr "Elige los archivos a subir" + +#: wp-admin/includes/media.php:1568 +msgid "Cancel Upload" +msgstr "Cancelar la subida" + +#: wp-admin/includes/media.php:1572 +msgid "After a file has been uploaded, you can add titles and descriptions." +msgstr "Después de subir un archivo, puedes agregar el título y la descripcion." + +#: wp-admin/includes/media.php:1618 +msgid "Add media files from your computer" +msgstr "Añadir archivos desde tu ordenador" + +#: wp-admin/includes/media.php:1647 wp-admin/includes/media.php:1827 +#: wp-admin/includes/media.php:2068 wp-admin/media-upload.php:96 +msgid "Save all changes" +msgstr "Guardar todos los cambios" + +#: wp-admin/includes/media.php:1679 +msgid "Add media file from URL" +msgstr "Añadir archivo desde una URL" + +#: wp-admin/includes/media.php:1802 +msgid "All Tabs:" +msgstr "Todas las pestañas:" + +#: wp-admin/includes/media.php:1806 +msgid "Sort Order:" +msgstr "Ordenar:" + +#: wp-admin/includes/media.php:1807 wp-admin/includes/media.php:1875 +msgid "Ascending" +msgstr "Ascendente" + +#: wp-admin/includes/media.php:1808 wp-admin/includes/media.php:1878 +msgid "Descending" +msgstr "Descendente" + +#: wp-includes/post.php:53 wp-admin/includes/media.php:1816 +#: wp-admin/menu.php:88 wp-admin/menu.php:232 +msgid "Media" +msgstr "Multimedia" + +#: wp-includes/post-template.php:1419 wp-admin/includes/media.php:1818 +msgid "Actions" +msgstr "Acciones" + +#: wp-admin/includes/media.php:1834 +msgid "Gallery Settings" +msgstr "Opciones de la galería" + +#: wp-admin/includes/media.php:1839 +msgid "Link thumbnails to:" +msgstr "Enlazar miniaturas a:" + +#: wp-admin/includes/media.php:1844 +msgid "Image File" +msgstr "Archivo de imagen" + +#: wp-admin/includes/media.php:1847 +msgid "Attachment Page" +msgstr "Página de adjuntos" + +#: wp-admin/includes/media.php:1854 +msgid "Order images by:" +msgstr "Ordenar imágenes por:" + +#: wp-admin/includes/media.php:1859 +msgid "Menu order" +msgstr "Orden del menú" + +#: wp-admin/includes/media.php:1861 +msgid "Date/Time" +msgstr "Fecha/Hora" + +#: wp-admin/includes/media.php:1862 +msgid "Random" +msgstr "Aleatorio" + +#: wp-admin/includes/media.php:1870 +msgid "Order:" +msgstr "Orden:" + +#: wp-admin/includes/media.php:1885 +msgid "Gallery columns:" +msgstr "Columnas de la galería" + +#: wp-admin/includes/media.php:1905 +msgid "Insert gallery" +msgstr "Insertar galería" + +#: wp-admin/includes/media.php:1906 +msgid "Update gallery settings" +msgstr "Actualizar ajustes de la galería" + +#: wp-admin/upload.php:210 wp-admin/includes/media.php:1949 +#: wp-admin/includes/media.php:1951 +msgid "Search Media" +msgstr "Buscar medios" + +#: wp-admin/includes/media.php:1974 +msgid "All Types" +msgstr "Todos los tipos" + +#: wp-admin/includes/media.php:2038 +msgid "Filter »" +msgstr "Filtrar »" + +#: wp-admin/includes/media.php:2087 +msgid "Image Caption" +msgstr "Leyenda de la imagen" + +#: wp-admin/includes/media.php:2101 +msgid "Insert an image from another web site" +msgstr "Insertar una imagen desde otra web" + +#: wp-includes/js/tinymce/langs/wp-langs.php:326 +#: wp-admin/includes/media.php:2105 +msgid "Image URL" +msgstr "URL de la imagen" + +#: wp-admin/includes/media.php:2113 +msgid "Image Title" +msgstr "Título de la imagen" + +#: wp-admin/includes/media.php:2143 +msgid "Link Image To:" +msgstr "Enlazar la imagen a:" + +#: wp-admin/includes/media.php:2148 +msgid "Link to image" +msgstr "Enlace a la imagen" + +#: wp-admin/includes/media.php:2169 +msgid "Audio File URL" +msgstr "URL del archivo de audio" + +#: wp-admin/includes/media.php:2181 +msgid "Link text, e.g. “Still Alive by Jonathan Coulton”" +msgstr "Texto del enlace, por ejemplo “Still Alive por Jonathan Coulton”" + +#: wp-admin/includes/media.php:2199 +msgid "Video URL" +msgstr "URL del vídeo" + +#: wp-admin/includes/media.php:2241 +msgid "Link text, e.g. “Ransom Demands (PDF)”" +msgstr "Texto del enlace, por ejemplo \"Peticiones de rescate (PDF)\"" + +#: wp-admin/includes/media.php:2297 +msgid "You are using the Flash uploader. Problems? Try the Browser uploader instead." +msgstr "Estás usando la subida de archivos mediante Flash. ¿Tienes problemas?, prueba el cargador del navegador." + +#: wp-admin/includes/media.php:2308 +msgid "You are using the Browser uploader." +msgstr "Estás usando el cargador del navegador." + +#: wp-admin/includes/media.php:2312 +msgid "Try the Flash uploader instead." +msgstr "Prueba el cargador Flash en su lugar." + +#: wp-includes/script-loader.php:348 wp-admin/includes/meta-boxes.php:33 +msgid "Save as Pending" +msgstr "Guardar como pendiente" + +#: wp-admin/includes/meta-boxes.php:42 +msgid "Preview Changes" +msgstr "Vista previa de los cambios" + +#: wp-admin/export.php:156 wp-admin/export.php:188 +#: wp-admin/includes/meta-boxes.php:60 +msgid "Status:" +msgstr "Estado:" + +#: wp-includes/script-loader.php:354 wp-admin/includes/meta-boxes.php:65 +#: wp-admin/includes/meta-boxes.php:92 +msgid "Privately Published" +msgstr "Publicada como privada" + +#: wp-includes/script-loader.php:337 wp-admin/includes/template.php:645 +#: wp-admin/includes/meta-boxes.php:103 wp-admin/includes/meta-boxes.php:149 +msgid "OK" +msgstr "Aceptar" + +#: wp-admin/includes/meta-boxes.php:111 +msgid "Visibility:" +msgstr "Visibilidad:" + +#: wp-includes/script-loader.php:350 wp-includes/post.php:598 +#: wp-includes/post.php:618 wp-admin/includes/class-wp-posts-list-table.php:808 +#: wp-admin/includes/class-wp-posts-list-table.php:950 +#: wp-admin/includes/template.php:1635 wp-admin/includes/meta-boxes.php:116 +#: wp-admin/includes/meta-boxes.php:146 +msgid "Private" +msgstr "Privada" + +#: wp-admin/includes/template.php:1633 wp-admin/includes/meta-boxes.php:119 +#: wp-admin/includes/meta-boxes.php:144 +msgid "Password protected" +msgstr "Protegida con contraseña" + +#: wp-includes/script-loader.php:352 wp-admin/includes/meta-boxes.php:122 +msgid "Public, Sticky" +msgstr "Pública, Fija" + +#: wp-includes/script-loader.php:351 wp-admin/includes/meta-boxes.php:125 +#: wp-admin/includes/meta-boxes.php:140 +msgid "Public" +msgstr "Público" + +#: wp-admin/includes/meta-boxes.php:142 +msgid "Stick this post to the front page" +msgstr "Fijar esta entrada en la página principal" + +#: wp-admin/includes/meta-boxes.php:162 +msgid "Scheduled for: %1$s" +msgstr "Programada para:%1$s" + +#: wp-admin/includes/meta-boxes.php:164 +msgid "Published on: %1$s" +msgstr "Publicada el: %1$s" + +#: wp-admin/includes/meta-boxes.php:166 wp-admin/includes/meta-boxes.php:174 +msgid "Publish immediately" +msgstr "Publicar inmediatamente" + +#: wp-admin/includes/meta-boxes.php:168 +msgid "Schedule for: %1$s" +msgstr "Programar para:%1$s" + +#: wp-admin/includes/meta-boxes.php:170 +msgid "Publish on: %1$s" +msgstr "Publicar el: %1$s" + +#: wp-includes/script-loader.php:346 wp-admin/includes/meta-boxes.php:212 +#: wp-admin/includes/meta-boxes.php:213 +msgid "Schedule" +msgstr "Programar" + +#: wp-includes/script-loader.php:279 wp-includes/script-loader.php:347 +#: wp-includes/js/tinymce/langs/wp-langs.php:18 +#: wp-admin/includes/class-wp-posts-list-table.php:999 +#: wp-admin/includes/class-wp-posts-list-table.php:1001 +#: wp-admin/includes/class-wp-posts-list-table.php:1004 +#: wp-admin/includes/internal-linking.php:118 +#: wp-admin/includes/template.php:507 +#: wp-admin/includes/class-wp-plugins-list-table.php:266 +#: wp-admin/includes/post.php:1779 wp-admin/includes/meta-boxes.php:224 +#: wp-admin/includes/meta-boxes.php:225 wp-admin/edit-tag-form.php:90 +msgid "Update" +msgstr "Actualizar" + +#: wp-includes/taxonomy.php:412 +msgid "Add or remove tags" +msgstr "Añadir o quitar etiquetas" + +#: wp-includes/script-loader.php:296 wp-includes/script-loader.php:334 +#: wp-admin/includes/widgets.php:182 wp-admin/includes/meta-boxes.php:293 +#: wp-admin/includes/meta-boxes.php:682 wp-admin/press-this.php:578 +msgid "Add" +msgstr "Añadir" + +#: wp-includes/taxonomy.php:403 wp-admin/includes/meta-boxes.php:656 +msgid "All Categories" +msgstr "Todas las categorías" + +#: wp-admin/includes/nav-menu.php:878 wp-admin/includes/meta-boxes.php:327 +#: wp-admin/includes/meta-boxes.php:657 wp-admin/press-this.php:524 +msgid "Most Used" +msgstr "Más utilizadas" + +#: wp-admin/includes/meta-boxes.php:678 wp-admin/includes/meta-boxes.php:680 +msgid "+ Add New Category" +msgstr "+ Añadir categoría nueva " + +#: wp-admin/includes/meta-boxes.php:681 +msgid "New category name" +msgstr "Nombre nueva categoría" + +#: wp-admin/includes/meta-boxes.php:383 +msgid "Excerpts are optional hand-crafted summaries of your content that can be used in your theme. Learn more about manual excerpts." +msgstr "Los extractos son resúmenes opcionales de tu contenido hechos \"ex-profeso\" que puedes usar en tu tema. Aprende algo acerca de los extractos manuales." + +#: wp-admin/includes/meta-boxes.php:398 +msgid "Already pinged:" +msgstr "Pingbacks enviados:" + +#: wp-admin/includes/meta-boxes.php:407 +msgid "Send trackbacks to:" +msgstr "Enviar trackbacks a:" + +#: wp-admin/includes/meta-boxes.php:407 +msgid "Separate multiple URLs with spaces" +msgstr "Separar varias URLs con espacios" + +#: wp-admin/includes/meta-boxes.php:431 +msgid "Custom fields can be used to add extra metadata to a post that you can use in your theme." +msgstr "Los campos personalizados se pueden usar para añadir metadatos adicionales a una entrada y luego mostrarlos en tu tema. ." + +#: wp-admin/includes/meta-boxes.php:448 +msgid "Allow trackbacks and pingbacks on this page." +msgstr "Permitir trackbacks y pingbacks en esta página." + +#: wp-admin/includes/meta-boxes.php:448 +msgid "http://codex.wordpress.org/Introduction_to_Blogging#Managing_Comments" +msgstr "http://codex.wordpress.org/Introduction_to_Blogging#Managing_Comments" + +#: wp-admin/includes/meta-boxes.php:489 +msgid "Show comments" +msgstr "Mostrar comentarios" + +#: wp-admin/includes/class-wp-posts-list-table.php:847 +#: wp-admin/includes/meta-boxes.php:562 wp-admin/includes/meta-boxes.php:563 +msgid "Parent" +msgstr "Superior" + +#: wp-admin/includes/class-wp-posts-list-table.php:849 +msgid "Main Page (no parent)" +msgstr "Página principal (sin superior)" + +#: wp-admin/includes/class-wp-posts-list-table.php:868 +#: wp-admin/includes/meta-boxes.php:571 +msgid "Template" +msgstr "Plantilla" + +#: wp-admin/includes/class-wp-posts-list-table.php:873 +#: wp-admin/includes/meta-boxes.php:573 +msgid "Default Template" +msgstr "Plantilla predeterminada" + +#: wp-admin/includes/meta-boxes.php:608 +msgid "Visit Link" +msgstr "Visitar enlace" + +#: wp-admin/includes/meta-boxes.php:616 +msgid "Keep this link private" +msgstr "Mantener este enlace como privado" + +#: wp-admin/includes/class-wp-links-list-table.php:140 +#: wp-admin/includes/meta-boxes.php:627 +msgid "" +"You are about to delete this link '%s'\n" +" 'Cancel' to stop, 'OK' to delete." +msgstr "" +"Estás a punto de borrar este enlace '%s'\n" +" 'Cancelar' para borrar, 'Aceptar' para borrarlo." + +#: wp-admin/includes/meta-boxes.php:702 +msgid "_blank — new window or tab." +msgstr "_blank — nueva ventana o pestaña." + +#: wp-admin/includes/meta-boxes.php:705 +msgid "_top — current window or tab, with no frames." +msgstr "_top — ventana o pestaña actual, sin marcos." + +#: wp-admin/includes/meta-boxes.php:708 +msgid "_none — same window or tab." +msgstr "_none — misma ventana o pestaña." + +#: wp-admin/includes/meta-boxes.php:710 +msgid "Choose the target frame for your link." +msgstr "Ellige el marco de destino para tu enlace." + +#: wp-admin/includes/meta-boxes.php:757 +msgid "rel:" +msgstr "rel:" + +#: wp-admin/includes/meta-boxes.php:764 wp-admin/includes/meta-boxes.php:765 +msgid "identity" +msgstr "identidad" + +#: wp-admin/includes/meta-boxes.php:768 +msgid "another web address of mine" +msgstr "otra dirección web mía" + +#: wp-admin/includes/meta-boxes.php:772 wp-admin/includes/meta-boxes.php:773 +msgid "friendship" +msgstr "amistad" + +#: wp-admin/includes/meta-boxes.php:775 +msgid "contact" +msgstr "contacto" + +#: wp-admin/includes/meta-boxes.php:777 +msgid "acquaintance" +msgstr "conocido" + +#: wp-admin/includes/meta-boxes.php:779 +msgid "friend" +msgstr "amigo" + +#: wp-admin/includes/meta-boxes.php:781 wp-admin/includes/meta-boxes.php:814 +#: wp-admin/includes/meta-boxes.php:837 +msgid "none" +msgstr "ninguno" + +#: wp-admin/includes/meta-boxes.php:785 wp-admin/includes/meta-boxes.php:786 +msgid "physical" +msgstr "físico" + +#: wp-admin/includes/meta-boxes.php:789 +msgid "met" +msgstr "conocido en persona" + +#: wp-admin/includes/meta-boxes.php:793 wp-admin/includes/meta-boxes.php:794 +msgid "professional" +msgstr "profesional" + +#: wp-admin/includes/meta-boxes.php:797 +msgid "co-worker" +msgstr "compañero de trabajo" + +#: wp-admin/includes/meta-boxes.php:800 +msgid "colleague" +msgstr "colega" + +#: wp-admin/includes/meta-boxes.php:804 wp-admin/includes/meta-boxes.php:805 +msgid "geographical" +msgstr "geográfico" + +#: wp-admin/includes/meta-boxes.php:808 +msgid "co-resident" +msgstr "co-residente" + +#: wp-admin/includes/meta-boxes.php:811 +msgid "neighbor" +msgstr "vecino" + +#: wp-admin/includes/meta-boxes.php:818 wp-admin/includes/meta-boxes.php:819 +msgid "family" +msgstr "familia" + +#: wp-admin/includes/meta-boxes.php:822 +msgid "child" +msgstr "hija/o" + +#: wp-admin/includes/meta-boxes.php:825 +msgid "kin" +msgstr "pariente" + +#: wp-admin/includes/meta-boxes.php:828 +msgid "parent" +msgstr "padre/madre" + +#: wp-admin/includes/meta-boxes.php:831 +msgid "sibling" +msgstr "hermano/a" + +#: wp-admin/includes/meta-boxes.php:834 +msgid "spouse" +msgstr "cónyuge" + +#: wp-admin/includes/meta-boxes.php:841 wp-admin/includes/meta-boxes.php:842 +msgid "romantic" +msgstr "romántica" + +#: wp-admin/includes/meta-boxes.php:845 +msgid "muse" +msgstr "inspiración" + +#: wp-admin/includes/meta-boxes.php:848 +msgid "crush" +msgstr "flechazo" + +#: wp-admin/includes/meta-boxes.php:851 +msgid "date" +msgstr "fecha" + +#: wp-admin/includes/meta-boxes.php:854 +msgid "sweetheart" +msgstr "pareja" + +#: wp-admin/includes/meta-boxes.php:861 +msgid "If the link is to a person, you can specify your relationship with them using the above form. If you would like to learn more about the idea check out XFN." +msgstr "Si el enlace es a una persona, puedes especificar tu relación con ella utilizando el formulario de arriba. Si deseas aprender más acerca de cómo funciona esto revisa el XFN." + +#: wp-admin/includes/meta-boxes.php:877 +msgid "Image Address" +msgstr "Dirección de la imagen" + +#: wp-admin/includes/meta-boxes.php:881 +msgid "RSS Address" +msgstr "Dirección RSS" + +#: wp-admin/includes/meta-boxes.php:885 +msgid "Notes" +msgstr "Notas" + +#: wp-admin/includes/class-wp-links-list-table.php:85 +#: wp-admin/includes/meta-boxes.php:889 +#: wp-admin/includes/class-wp-plugin-install-list-table.php:143 +msgid "Rating" +msgstr "Valoración" + +#: wp-admin/includes/meta-boxes.php:898 +msgid "(Leave at 0 for no rating.)" +msgstr "(Dejalo en 0 para no valorar.)" + +#: wp-admin/includes/dashboard.php:1150 +msgid "Storage Space" +msgstr "Espacio de almacenamiento" + +#: wp-admin/includes/dashboard.php:1155 +msgid "Space Allowed" +msgstr "Espacio permitido" + +#: wp-admin/includes/dashboard.php:1163 +msgid "Space Used" +msgstr "Espacio utilizado" + +#: wp-admin/includes/menu.php:225 +msgid "You do not have sufficient permissions to access this page." +msgstr "No tienes suficientes permisos para acceder a esta página" + +#: wp-includes/script-loader.php:242 wp-admin/async-upload.php:55 +#: wp-admin/includes/dashboard.php:1193 +msgid "Dismiss" +msgstr "Omitir" + +#: wp-admin/includes/plugin-install.php:84 +msgid "Plugins extend and expand the functionality of WordPress. You may automatically install plugins from the WordPress Plugin Directory or upload a plugin in .zip format via this page." +msgstr "Los plugins amplían las funciones de WordPress. Puedes instalarlos automáticamente desde el directorio de plugins de WordPress o subir un plugin en formato .zip desde esta página." + +#: wp-includes/class-wp-admin-bar.php:104 wp-includes/default-widgets.php:175 +#: wp-includes/general-template.php:163 wp-admin/includes/plugin-install.php:86 +#: wp-admin/includes/class-wp-theme-install-list-table.php:29 +#: wp-admin/includes/internal-linking.php:93 +#: wp-admin/includes/template.php:1358 wp-admin/includes/template.php:1360 +#: wp-admin/includes/theme-install.php:66 wp-admin/includes/nav-menu.php:666 +#: wp-admin/includes/nav-menu.php:695 wp-admin/includes/nav-menu.php:697 +#: wp-admin/includes/nav-menu.php:880 wp-admin/includes/nav-menu.php:929 +#: wp-admin/includes/nav-menu.php:931 +#: wp-admin/includes/class-wp-plugin-install-list-table.php:29 +#: wp-content/plugins/akismet/legacy.php:176 +msgid "Search" +msgstr "Buscar" + +#: wp-admin/includes/plugin-install.php:87 +msgid "Search for plugins by keyword, author, or tag." +msgstr "Búsqueda de plugins por palabra clave, autor o etiqueta." + +#: wp-admin/includes/plugin-install.php:90 +msgid "Popular tags" +msgstr "Etiquetas populares" + +#: wp-admin/includes/plugin-install.php:91 +msgid "You may also browse based on the most popular tags in the Plugin Directory:" +msgstr "También puedes ver las etiquetas más populares del directorio de plugins:" + +#: wp-admin/includes/plugin-install.php:108 +msgid "%d plugin" +msgstr "%d plugin" + +#: wp-admin/includes/plugin-install.php:108 +msgid "%d plugins" +msgstr "%d plugins" + +#: wp-admin/includes/plugin-install.php:126 +#: wp-admin/includes/theme-install.php:61 +msgid "Term" +msgstr "Término" + +#: wp-admin/includes/plugin-install.php:131 +#: wp-admin/includes/plugin-install.php:132 +msgid "Search Plugins" +msgstr "Buscar plugins" + +#: wp-admin/includes/plugin-install.php:144 +msgid "Install a plugin in .zip format" +msgstr "Instalar un plugin en formato .zip" + +#: wp-admin/includes/plugin-install.php:145 +msgid "If you have a plugin in a .zip format, you may install it by uploading it here." +msgstr "Si tienes un plugin en un archivo .zip, puedes subirlo e instalarlo desde aquí." + +#: wp-admin/includes/plugin-install.php:148 +msgid "Plugin zip file" +msgstr "Archivo .zip del plugin" + +#: wp-admin/includes/plugin-install.php:150 +#: wp-admin/includes/plugin-install.php:289 +#: wp-admin/includes/theme-install.php:122 +#: wp-admin/includes/theme-install.php:291 +#: wp-admin/includes/class-wp-plugin-install-list-table.php:200 +msgid "Install Now" +msgstr "Instalar ahora" + +#: wp-includes/js/tinymce/langs/wp-langs.php:309 +#: wp-admin/includes/class-wp-plugin-install-list-table.php:142 +msgid "Version" +msgstr "Versión" + +#: wp-admin/includes/class-wp-plugin-install-list-table.php:97 +msgid "No plugins match your request." +msgstr "No hay plugins que mostrar." + +#: wp-admin/includes/class-wp-plugins-list-table.php:434 +#: wp-admin/includes/plugin.php:145 +#: wp-admin/includes/class-wp-plugin-install-list-table.php:185 +msgid "By %s" +msgstr "Por %s" + +#: wp-admin/includes/plugin-install.php:328 +#: wp-admin/includes/plugin-install.php:336 +#: wp-admin/includes/theme-install.php:173 +#: wp-admin/includes/class-wp-plugin-install-list-table.php:221 +msgid "(based on %s rating)" +msgid_plural "(based on %s ratings)" +msgstr[0] "(basado en %s voto)" +msgstr[1] "(basado en %s votos)" + +#: wp-admin/includes/plugin-install.php:330 +#: wp-admin/includes/theme-install.php:175 +#: wp-admin/includes/class-wp-plugin-install-list-table.php:230 +msgid "5 stars" +msgstr "5 estrellas" + +#: wp-admin/includes/plugin-install.php:331 +#: wp-admin/includes/theme-install.php:176 +#: wp-admin/includes/class-wp-plugin-install-list-table.php:231 +msgid "4 stars" +msgstr "4 estrellas" + +#: wp-admin/includes/plugin-install.php:332 +#: wp-admin/includes/theme-install.php:177 +#: wp-admin/includes/class-wp-plugin-install-list-table.php:232 +msgid "3 stars" +msgstr "3 estrellas" + +#: wp-admin/includes/plugin-install.php:333 +#: wp-admin/includes/theme-install.php:178 +#: wp-admin/includes/class-wp-plugin-install-list-table.php:233 +msgid "2 stars" +msgstr "2 estrellas" + +#: wp-admin/includes/plugin-install.php:334 +#: wp-admin/includes/theme-install.php:179 +#: wp-admin/includes/class-wp-plugin-install-list-table.php:234 +msgid "1 star" +msgstr "1 estrella" + +#: wp-admin/includes/plugin-install.php:264 wp-admin/update.php:103 +msgid "Plugin Install" +msgstr "Instalar plugin" + +#: wp-admin/includes/plugin-install.php:293 +#: wp-admin/includes/theme-install.php:296 +msgid "Install Update Now" +msgstr "Instalar actualización ahora" + +#: wp-admin/includes/plugin-install.php:296 +msgid "Newer Version (%s) Installed" +msgstr "Instalada la última versión (%s)" + +#: wp-admin/includes/plugin-install.php:299 +msgid "Latest Version Installed" +msgstr "Instalada la última versión" + +#: wp-admin/includes/plugin-install.php:305 +msgid "FYI" +msgstr "FYI" + +#: wp-includes/js/tinymce/wp-mce-help.php:270 +#: wp-admin/includes/plugin-install.php:308 +#: wp-admin/includes/theme-install.php:162 +msgid "Version:" +msgstr "Versión:" + +#: wp-admin/includes/plugin-install.php:310 +#: wp-admin/includes/theme-install.php:163 +msgid "Author:" +msgstr "Autor:" + +#: wp-admin/includes/plugin-install.php:312 +#: wp-admin/includes/theme-install.php:165 +msgid "Last Updated:" +msgstr "Última actualización:" + +#: wp-admin/includes/plugin-install.php:315 +#: wp-admin/includes/theme-install.php:167 +msgid "Requires WordPress Version:" +msgstr "Requiere la versión de WordPress:" + +#: wp-admin/includes/plugin-install.php:315 +#: wp-admin/includes/theme-install.php:167 +msgid "%s or higher" +msgstr "%s o superior" + +#: wp-admin/includes/plugin-install.php:317 +#: wp-admin/includes/theme-install.php:169 +msgid "Compatible up to:" +msgstr "Compatible con:" + +#: wp-admin/includes/plugin-install.php:319 +#: wp-admin/includes/theme-install.php:171 +msgid "Downloaded:" +msgstr "Descargado:" + +#: wp-admin/includes/plugin-install.php:319 +#: wp-admin/includes/theme-install.php:171 +msgid "%s time" +msgid_plural "%s times" +msgstr[0] "%s vez" +msgstr[1] "%s veces" + +#: wp-admin/includes/plugin-install.php:321 +msgid "WordPress.org Plugin Page »" +msgstr "Página de plugins de WordPress.org »" + +#: wp-admin/includes/plugin-install.php:323 +msgid "Plugin Homepage »" +msgstr "Página del plugin »" + +#: wp-admin/includes/plugin-install.php:327 +msgid "Average Rating" +msgstr "Puntuación promedio" + +#: wp-admin/includes/plugin-install.php:342 +msgid "Warning: This plugin has not been tested with your current version of WordPress." +msgstr "Atención: Este plugin no ha sido probado en esta versión de WordPress." + +#: wp-admin/includes/plugin-install.php:345 +msgid "Warning: This plugin has not been marked as compatible with your version of WordPress." +msgstr "Atención: Este plugin no es compatible con esta versión de WordPress." + +#: wp-admin/includes/plugin.php:92 +msgid "The %1$s plugin header is deprecated. Use %2$s instead." +msgstr "La cabecera del plugin %1$s es obsoleta. Usa %2$s en su lugar." + +#: wp-admin/includes/plugin.php:136 +msgid "Visit plugin homepage" +msgstr "Visitar la web del plugin" + +#: wp-includes/theme.php:242 +#: wp-admin/includes/class-wp-plugins-list-table.php:433 +#: wp-admin/includes/plugin.php:141 +msgid "Visit author homepage" +msgstr "Visitar la web del autor" + +#: wp-admin/includes/plugin.php:541 +msgid "The plugin generated unexpected output." +msgstr "El plugin ha generado una respuesta insesperada." + +#: wp-admin/includes/plugin.php:629 +msgid "One of the plugins is invalid." +msgstr "Uno de los plugins no es válido." + +#: wp-admin/includes/plugin.php:715 +msgid "Could not fully remove the plugin(s) %s." +msgstr "No se pudo/ieron eliminar completamente el/los plugin/s %s." + +#: wp-admin/includes/plugin.php:776 +msgid "Invalid plugin path." +msgstr "La ruta del plugin no es válida." + +#: wp-admin/includes/plugin.php:778 +msgid "Plugin file does not exist." +msgstr "El archivo del plugin no existe." + +#: wp-admin/includes/plugin.php:782 +msgid "The plugin does not have a valid header." +msgstr "El plugin no tiene una cabecera válida." + +#: wp-admin/includes/post.php:59 +msgid "You are not allowed to edit pages as this user." +msgstr "No tienes autorización para editar páginas con este nombre de usuario." + +#: wp-admin/includes/post.php:60 +msgid "You are not allowed to create pages as this user." +msgstr "No tienes autorización para crear páginas con ese nombre de usuario." + +#: wp-admin/includes/post.php:64 +msgid "You are not allowed to edit posts as this user." +msgstr "No tienes autorización para editar entradas con este nombre de usuario." + +#: wp-admin/includes/post.php:65 +msgid "You are not allowed to post as this user." +msgstr "No tienes autorización para publicar con este nombre de usuario." + +#: wp-admin/includes/post.php:282 +msgid "You are not allowed to edit pages." +msgstr "No tienes autorización para editar páginas." + +#: wp-admin/includes/post.php:284 +msgid "You are not allowed to edit posts." +msgstr "No tienes autorización para editar entradas." + +#: wp-admin/includes/post.php:423 +msgid "Auto Draft" +msgstr "Borrador automático" + +#: wp-admin/includes/post.php:987 +msgid "Images" +msgstr "Imágenes" + +#: wp-admin/includes/post.php:987 +msgid "Manage Images" +msgstr "Administrar imágenes" + +#: wp-admin/includes/post.php:987 +msgid "Image (%s)" +msgid_plural "Images (%s)" +msgstr[0] "Imagen (%s)" +msgstr[1] "Imágenes (%s)" + +#: wp-admin/includes/post.php:988 +msgid "Audio" +msgstr "Audio" + +#: wp-admin/includes/post.php:988 +msgid "Manage Audio" +msgstr "Administrar audio" + +#: wp-admin/includes/post.php:988 +msgid "Audio (%s)" +msgid_plural "Audio (%s)" +msgstr[0] "Audio (%s)" +msgstr[1] "Audio (%s)" + +#: wp-admin/includes/post.php:989 +msgid "Video" +msgstr "Vídeo" + +#: wp-admin/includes/post.php:989 +msgid "Manage Video" +msgstr "Administrar vídeo" + +#: wp-admin/includes/post.php:989 +msgid "Video (%s)" +msgid_plural "Video (%s)" +msgstr[0] "Vídeo (%s)" +msgstr[1] "Vídeos (%s)" + +#: wp-includes/post.php:1183 +msgid "View Page" +msgstr "Ver página" + +#: wp-admin/includes/post.php:1168 +msgid "Click to edit this part of the permalink" +msgstr "Haz clic para editar esta parte del enlace permanente" + +#: wp-admin/includes/post.php:1170 +msgid "Temporary permalink. Click to edit this part." +msgstr "Enlace permanente temporal. Haz clic para editar esta parte." + +#: wp-admin/includes/post.php:1174 wp-admin/includes/post.php:1202 +msgid "Permalink:" +msgstr "Enlace permanente:" + +#: wp-admin/includes/post.php:1176 +msgid "Change Permalinks" +msgstr "Enlaces permanentes" + +#: wp-admin/includes/post.php:1308 +msgid "Warning: %s is currently editing this post" +msgstr "Atención: %s está editando actualmente esta entrada" + +#: wp-admin/includes/post.php:1311 +msgid "Warning: %s is currently editing this page" +msgstr "Atención: %s está editando actualmente esta página" + +#: wp-admin/includes/post.php:1314 +msgid "Warning: %s is currently editing this." +msgstr "Atención: %s está editando actualmente esto." + +#: wp-admin/includes/post.php:1372 +msgid "Preview not available. Please save as a draft first." +msgstr "Vista previa no disponible. Por favor, guarda antes el borrador." + +#: wp-admin/includes/schema.php:202 +msgid "Just another WordPress site" +msgstr "Otro sitio realizado con WordPress" + +#: wp-admin/options-general.php:225 wp-admin/includes/schema.php:223 +msgid "F j, Y" +msgstr "j F, Y" + +#: wp-admin/options-general.php:258 wp-admin/includes/schema.php:225 +msgid "g:i a" +msgstr "G:i" + +#: wp-admin/includes/schema.php:227 +msgid "F j, Y g:i a" +msgstr "j F, Y G:i" + +#: wp-admin/includes/schema.php:329 +msgid "Just another %s site" +msgstr "Otro sitio más de %s" + +#: wp-admin/includes/schema.php:397 +msgctxt "User role" +msgid "Administrator" +msgstr "Administrador" + +#: wp-admin/includes/schema.php:399 +msgctxt "User role" +msgid "Editor" +msgstr "Editor" + +#: wp-admin/includes/schema.php:401 +msgctxt "User role" +msgid "Author" +msgstr "Autor" + +#: wp-admin/includes/schema.php:403 +msgctxt "User role" +msgid "Contributor" +msgstr "Colaborador" + +#: wp-admin/includes/schema.php:405 +msgctxt "User role" +msgid "Subscriber" +msgstr "Suscriptor" + +#: wp-admin/includes/upgrade.php:199 wp-admin/includes/schema.php:712 +msgid "Welcome to SITE_NAME. This is your first post. Edit or delete it, then start blogging!" +msgstr "Te damos la bienvenida a SITE_NAME. Este es tu primer artículo. Edítalo o bórralo... ¡y comienza a publicar!" + +#: wp-admin/includes/schema.php:769 +msgid "Warning! Wildcard DNS may not be configured correctly!" +msgstr "¡Atención! ¡Puede que las DNS no estén configuradas correctamente." + +#: wp-admin/includes/class-wp-posts-list-table.php:732 +#: wp-admin/includes/class-wp-comments-list-table.php:415 +#: wp-admin/includes/class-wp-terms-list-table.php:336 +msgid "Quick Edit" +msgstr "Edición rápida" + +#: wp-admin/includes/class-wp-posts-list-table.php:543 +#: wp-admin/includes/class-wp-comments-list-table.php:415 +#: wp-admin/includes/class-wp-terms-list-table.php:260 +msgid "Quick Edit" +msgstr "Edición rápida" + +#: wp-admin/includes/class-wp-posts-list-table.php:271 +msgctxt "column name" +msgid "Title" +msgstr "Título" + +#: wp-admin/includes/class-wp-media-list-table.php:134 +msgctxt "column name" +msgid "File" +msgstr "Archivo" + +#: wp-admin/includes/class-wp-media-list-table.php:139 +msgctxt "column name" +msgid "Attached to" +msgstr "Adjunto a" + +#: wp-admin/includes/class-wp-media-list-table.php:143 +msgctxt "column name" +msgid "Date" +msgstr "Fecha" + +#: wp-admin/includes/class-wp-comments-list-table.php:255 +#: wp-admin/includes/class-wp-comments-list-table.php:526 +msgctxt "column name" +msgid "Comment" +msgstr "Comentario" + +#: wp-admin/includes/class-wp-links-list-table.php:83 +msgid "Relationship" +msgstr "Relación con el enlace (XFN)" + +#: wp-admin/includes/class-wp-links-list-table.php:84 +msgid "Visible" +msgstr "Visible" + +#: wp-includes/default-widgets.php:94 wp-admin/link-manager.php:40 +#: wp-admin/includes/class-wp-terms-list-table.php:106 wp-admin/menu.php:93 +msgid "Links" +msgstr "Enlaces" + +#: wp-admin/user-new.php:245 wp-admin/user-new.php:325 +#: wp-admin/includes/class-wp-users-list-table.php:166 +msgid "Role" +msgstr "Perfil" + +#: wp-admin/includes/class-wp-posts-list-table.php:732 +msgid "Bulk Edit" +msgstr "Edición masiva" + +#: wp-admin/includes/class-wp-posts-list-table.php:777 +#: wp-admin/includes/class-wp-posts-list-table.php:851 +#: wp-admin/includes/class-wp-posts-list-table.php:871 +#: wp-admin/includes/class-wp-posts-list-table.php:903 +#: wp-admin/includes/class-wp-posts-list-table.php:912 +#: wp-admin/includes/class-wp-posts-list-table.php:944 +#: wp-admin/includes/class-wp-posts-list-table.php:965 +msgid "— No Change —" +msgstr "— Sin cambios —" + +#: wp-admin/includes/class-wp-posts-list-table.php:803 +msgid "–OR–" +msgstr "–O–" + +#: wp-admin/includes/class-wp-posts-list-table.php:823 +msgid "[more]" +msgstr "[más]" + +#: wp-admin/includes/class-wp-posts-list-table.php:824 +msgid "[less]" +msgstr "[menos]" + +#: wp-admin/includes/class-wp-posts-list-table.php:904 +#: wp-admin/includes/class-wp-posts-list-table.php:913 +msgid "Allow" +msgstr "Permitir" + +#: wp-admin/includes/class-wp-posts-list-table.php:905 +#: wp-admin/includes/class-wp-posts-list-table.php:914 +msgid "Do not allow" +msgstr "No permitir" + +#: wp-admin/includes/class-wp-posts-list-table.php:926 +msgid "Allow Comments" +msgstr "Permitir comentarios" + +#: wp-admin/includes/class-wp-posts-list-table.php:931 +msgid "Allow Pings" +msgstr "Permitir pings" + +#: wp-admin/includes/class-wp-posts-list-table.php:963 +#: wp-admin/includes/class-wp-posts-list-table.php:966 +#: wp-admin/includes/template.php:1642 +msgid "Sticky" +msgstr "Fija" + +#: wp-admin/includes/class-wp-posts-list-table.php:967 +msgid "Not Sticky" +msgstr "No es fija" + +#: wp-admin/includes/class-wp-posts-list-table.php:975 +msgid "Make this post sticky" +msgstr "Marcar esta entrada como fija" + +#: wp-admin/includes/class-wp-posts-list-table.php:596 +msgid "Missed schedule" +msgstr "Programación perdida" + +#: wp-admin/includes/class-wp-posts-list-table.php:600 +msgid "Last Modified" +msgstr "Última modificación" + +#: wp-includes/category-template.php:161 +#: wp-admin/includes/class-wp-posts-list-table.php:619 +#: wp-admin/includes/upgrade.php:109 +msgid "Uncategorized" +msgstr "Sin categoría" + +#: wp-includes/pluggable.php:1262 +#: wp-admin/includes/class-wp-users-list-table.php:291 +msgid "E-mail: %s" +msgstr "Correo electrónico: %s" + +#: wp-admin/includes/class-wp-users-list-table.php:300 +msgid "View posts by this author" +msgstr "Ver las entradas de este autor" + +#: wp-admin/includes/class-wp-comments-list-table.php:335 +msgid "Y/m/d \\a\\t g:i A" +msgstr "d/m/Y \\a\\t G:i" + +#: wp-admin/includes/class-wp-comments-list-table.php:362 +msgid "In reply to %2$s." +msgstr "En respuesta a %2$s." + +#: wp-admin/includes/class-wp-comments-list-table.php:475 +msgid "Y/m/d \\a\\t g:ia" +msgstr "d/m/Y \\a\\t G:i" + +#: wp-admin/includes/template.php:347 +msgid "Reply to Comment" +msgstr "Responder al comentarío" + +#: wp-admin/includes/template.php:373 +msgid "Submit Reply" +msgstr "Enviar respuesta" + +#: wp-admin/includes/template.php:406 +msgid "Comment by %s moved to the trash." +msgstr "Comentario de %s movido a la papelera." + +#: wp-admin/includes/template.php:409 +msgid "Comment by %s marked as spam." +msgstr "El comentario de %s se ha marcado como spam." + +#: wp-admin/includes/template.php:429 wp-admin/includes/template.php:444 +#: wp-admin/includes/template.php:512 wp-admin/includes/template.php:539 +msgid "Value" +msgstr "Valor" + +#: wp-admin/includes/template.php:502 +msgid "Key" +msgstr "Clave" + +#: wp-admin/includes/template.php:534 +msgid "Add New Custom Field:" +msgstr "Añadir nuevo campo personalizado:" + +#: wp-admin/includes/template.php:558 +msgid "Enter new" +msgstr "Nuevo" + +#: wp-admin/includes/template.php:568 +msgid "Add Custom Field" +msgstr "Añadir un campo personalizado" + +#: wp-admin/includes/template.php:630 +msgid "%1$s%2$s, %3$s @ %4$s : %5$s" +msgstr "%1$s%2$s, %3$s @ %4$s : %5$s" + +#: wp-admin/includes/template.php:735 +msgid "Thumbnail linked to file" +msgstr "Miniatura enlazada al archivo" + +#: wp-admin/includes/template.php:735 +msgid "Image linked to file" +msgstr "Imagen enlazada al archivo" + +#: wp-admin/includes/template.php:739 +msgid "Thumbnail linked to page" +msgstr "Miniatura enlazada a la página" + +#: wp-admin/includes/template.php:739 +msgid "Image linked to page" +msgstr "Imagen enlazada a la página" + +#: wp-admin/includes/template.php:744 +msgid "Link to file" +msgstr "Enlace al archivo" + +#: wp-admin/includes/template.php:748 +msgid "Link to page" +msgstr "Enlace a la página" + +#: wp-admin/includes/template.php:843 +msgid "Before you can upload your import file, you will need to fix the following error:" +msgstr "Antes de poder subir el fichero de importación, debes resolver el siguiente error:" + +#: wp-admin/includes/template.php:849 +msgid "Choose a file from your computer:" +msgstr "Elige un archivo de tu ordenador:" + +#: wp-admin/includes/template.php:849 +msgid "Maximum size: %s" +msgstr "Tamaño máximo: %s" + +#: wp-admin/includes/template.php:854 +msgid "Upload file and import" +msgstr "Subir archivo e importar" + +#: wp-admin/includes/template.php:967 wp-admin/press-this.php:483 +#: wp-admin/press-this.php:517 wp-admin/press-this.php:567 +msgid "Click to toggle" +msgstr "Haz clic para cambiar" + +#: wp-admin/includes/template.php:1349 +msgid "Find Posts or Pages" +msgstr "Buscar entradas o páginas" + +#: wp-includes/theme-compat/sidebar.php:55 wp-includes/post-template.php:810 +#: wp-includes/default-widgets.php:18 wp-includes/default-widgets.php:24 +#: wp-admin/export.php:167 wp-admin/menu.php:99 +msgid "Pages" +msgstr "Páginas" + +#: wp-includes/script-loader.php:200 +#: wp-includes/js/tinymce/langs/wp-langs.php:20 +#: wp-includes/js/tinymce/wp-mce-help.php:284 wp-login.php:582 +#: wp-admin/includes/template.php:1376 wp-admin/includes/widgets.php:207 +msgid "Close" +msgstr "Cerrar" + +#: wp-admin/plugin-editor.php:195 wp-admin/theme-editor.php:164 +#: wp-admin/includes/template.php:1377 +#: wp-admin/includes/class-wp-plugins-list-table.php:396 +#: wp-admin/nav-menus.php:497 +msgid "Select" +msgstr "Elegir" + +#: wp-includes/post.php:1182 wp-admin/includes/template.php:1466 +msgid "New Page" +msgstr "Nueva página" + +#: wp-admin/includes/template.php:1425 +msgid "New Media" +msgstr "Añadir medio" + +#: wp-admin/media.php:45 wp-admin/includes/template.php:1428 +msgid "Edit Media" +msgstr "Editar multimedia" + +#: wp-admin/includes/template.php:1433 +msgid "New Link" +msgstr "Añadir enlace" + +#: wp-admin/includes/template.php:1435 +msgid "Edit Links" +msgstr "Editar enlaces" + +#: wp-admin/includes/template.php:1438 +msgid "New User" +msgstr "Añadir usuario" + +#: wp-admin/includes/template.php:1441 +msgid "Edit Users" +msgstr "Editar usuarios" + +#: wp-admin/plugin-install.php:27 wp-admin/includes/template.php:1444 +msgid "Install Plugins" +msgstr "Instalar plugins" + +#: wp-admin/includes/template.php:1447 +msgid "Manage Plugins" +msgstr "Administrar plugins" + +#: wp-admin/theme-install.php:27 wp-admin/includes/template.php:1450 +#: wp-admin/update.php:206 +msgid "Install Themes" +msgstr "Instalar temas" + +#: wp-admin/themes.php:35 wp-admin/includes/template.php:1453 +msgid "Manage Themes" +msgstr "Administrar temas" + +#: wp-includes/post.php:1182 wp-includes/admin-bar.php:141 +#: wp-admin/includes/template.php:1456 wp-admin/includes/template.php:1464 +msgid "New Post" +msgstr "Nueva entrada" + +#: wp-admin/includes/template.php:1465 +msgid "Drafts" +msgstr "Borradores" + +#: wp-includes/script-loader.php:281 wp-includes/script-loader.php:393 +#: wp-admin/includes/template.php:1522 +msgid "(no title)" +msgstr "(sin título)" + +#: wp-admin/includes/template.php:1640 +msgctxt "post state" +msgid "Pending" +msgstr "Pendiente" + +#: wp-admin/includes/template.php:1743 +msgid "Enable accessibility mode" +msgstr "Activar modo de accesibilidad" + +#: wp-admin/includes/template.php:1743 +msgid "Disable accessibility mode" +msgstr "Desactivar modo de accesibilidad" + +#: wp-admin/includes/class-wp-themes-list-table.php:168 +#: wp-admin/includes/class-wp-upgrader.php:1353 +#: wp-admin/includes/class-wp-upgrader.php:1406 +#: wp-admin/includes/class-wp-plugins-list-table.php:258 +#: wp-admin/includes/class-wp-plugins-list-table.php:379 +msgid "Activate" +msgstr "Activar" + +#: wp-includes/post-template.php:1216 wp-admin/includes/meta-boxes.php:145 +msgid "Password:" +msgstr "Contraseña:" + +#: wp-admin/admin-ajax.php:36 +msgid "ALERT: You are logged out! Could not save draft. Please log in again." +msgstr "ATENCIÓN: ¡No has iniciado la sesión! No se pudo guardar el borrador. Vuelve a iniciar la sesión." + +#: wp-admin/includes/media.php:1997 wp-admin/includes/nav-menu.php:627 +#: wp-admin/includes/nav-menu.php:844 +msgid "«" +msgstr "«" + +#: wp-admin/includes/media.php:1998 wp-admin/includes/nav-menu.php:628 +#: wp-admin/includes/nav-menu.php:845 +msgid "»" +msgstr "»" + +#: wp-admin/admin-ajax.php:455 +msgid "Comment %d does not exist" +msgstr "El comentario %d no existe" + +#: wp-admin/includes/taxonomy.php:100 +msgid "You did not enter a category name." +msgstr "No has introducido un nombre de categoría." + +#: wp-admin/admin-ajax.php:577 +msgid "No tags found!" +msgstr "¡No se han encontrado etiquetas!" + +#: wp-admin/admin-ajax.php:641 +msgid "Error: you are replying to a comment on a draft post." +msgstr "Error: estás respondiendo a un comentario de una entrada en borrador." + +#: wp-admin/admin-ajax.php:656 +msgid "Sorry, you must be logged in to reply to a comment." +msgstr "Lo siento, tienes que iniciar sesión para responder a un comentario." + +#: wp-admin/admin-ajax.php:660 wp-admin/admin-ajax.php:722 +#: wp-comments-post.php:84 +msgid "Error: please type a comment." +msgstr "Error: por favor, escribe un comentario." + +#: wp-admin/admin-ajax.php:843 wp-admin/admin-ajax.php:848 +#: wp-admin/admin-ajax.php:868 +msgid "Please provide a custom field value." +msgstr "Por favor, pon algún valor en el campo personalizado." + +#: wp-admin/admin-ajax.php:918 +msgid "User %s added" +msgstr "Usuario %s añadido" + +#: wp-admin/admin-ajax.php:938 +msgid "g:i:s a" +msgstr "G:i:s" + +#: wp-admin/admin-ajax.php:940 +msgid "Draft saved at %s." +msgstr "Borrador guardado a las %s." + +#: wp-admin/admin-ajax.php:958 wp-admin/admin-ajax.php:1191 +msgid "Someone" +msgstr "Alguien" + +#: wp-admin/admin-ajax.php:967 wp-admin/admin-ajax.php:1181 +#: wp-admin/includes/post.php:156 wp-admin/includes/post.php:1388 +msgid "You are not allowed to edit this page." +msgstr "No tienes autorización para editar esta página." + +#: wp-admin/upload.php:62 wp-admin/admin-ajax.php:970 +#: wp-admin/admin-ajax.php:1184 wp-admin/includes/post.php:158 +#: wp-admin/includes/post.php:1391 +msgid "You are not allowed to edit this post." +msgstr "No tienes autorización para editar esta entrada." + +#: wp-admin/admin-ajax.php:1192 +msgid "Saving is disabled: %s is currently editing this page." +msgstr "Guardar está desactivado: %s está ahora mismo editando esta página." + +#: wp-admin/admin-ajax.php:1192 +msgid "Saving is disabled: %s is currently editing this post." +msgstr "Guardar está desactivado: %s está ahora mismo editando esta entrada." + +#: wp-admin/user-new.php:14 wp-admin/user-new.php:16 wp-admin/user-new.php:59 +#: wp-admin/user-new.php:86 wp-admin/themes.php:13 wp-admin/themes.php:26 +#: wp-admin/edit-comments.php:12 wp-admin/edit.php:24 wp-admin/post-new.php:34 +#: wp-admin/users.php:13 wp-admin/users.php:78 +#: wp-admin/includes/bookmark.php:30 wp-admin/press-this.php:17 +#: wp-admin/widgets.php:16 wp-admin/plugins.php:16 wp-admin/edit-tags.php:13 +#: wp-admin/edit-tags.php:40 wp-admin/edit-tags.php:78 +#: wp-admin/edit-tags.php:92 wp-admin/edit-tags.php:129 +#: wp-admin/nav-menus.php:23 wp-admin/options.php:35 wp-admin/options.php:59 +#: wp-content/plugins/akismet/admin.php:58 +msgid "Cheatin’ uh?" +msgstr "¡Haciendo trampas! ¿eh?" + +#: wp-admin/admin-ajax.php:1258 wp-admin/admin-ajax.php:1265 +#: wp-admin/edit-tags.php:233 +msgid "Item not updated." +msgstr "No actualizado." + +#: wp-includes/post.php:1185 +msgid "No posts found." +msgstr "No se encontraron entradas." + +#: wp-includes/post.php:4687 wp-includes/js/tinymce/langs/wp-langs.php:347 +#: wp-includes/js/tinymce/langs/wp-langs.php:511 wp-admin/admin-ajax.php:1302 +#: wp-admin/includes/dashboard.php:528 +#: wp-admin/includes/class-wp-posts-list-table.php:744 +#: wp-admin/includes/media.php:1089 wp-admin/includes/media.php:1860 +#: wp-admin/includes/media.php:2176 wp-admin/includes/media.php:2206 +#: wp-admin/includes/media.php:2236 wp-admin/includes/internal-linking.php:82 +msgid "Title" +msgstr "Título" + +#: wp-admin/admin-ajax.php:1302 +#: wp-admin/includes/class-wp-posts-list-table.php:286 +#: wp-admin/includes/class-wp-posts-list-table.php:757 +msgid "Date" +msgstr "Fecha" + +#: wp-admin/admin-ajax.php:1302 +#: wp-admin/includes/class-wp-posts-list-table.php:941 +#: wp-admin/edit-form-comment.php:35 +msgid "Status" +msgstr "Estado" + +#: wp-includes/script-loader.php:355 wp-includes/post.php:599 +#: wp-includes/post.php:619 wp-admin/admin-ajax.php:1308 +#: wp-admin/includes/class-wp-posts-list-table.php:593 +#: wp-admin/includes/class-wp-posts-list-table.php:947 +#: wp-admin/includes/meta-boxes.php:68 wp-admin/includes/meta-boxes.php:90 +msgid "Published" +msgstr "Publicada" + +#: wp-admin/admin-ajax.php:1311 +#: wp-admin/includes/class-wp-posts-list-table.php:598 +#: wp-admin/includes/class-wp-posts-list-table.php:948 +#: wp-admin/includes/meta-boxes.php:71 wp-admin/includes/meta-boxes.php:94 +msgid "Scheduled" +msgstr "Programada" + +#: wp-includes/post.php:597 wp-admin/admin-ajax.php:1314 +#: wp-admin/includes/class-wp-posts-list-table.php:953 +#: wp-admin/includes/meta-boxes.php:74 wp-admin/includes/meta-boxes.php:96 +msgid "Pending Review" +msgstr "Pendiente de revisión" + +#: wp-includes/post.php:596 wp-includes/post.php:617 +#: wp-admin/admin-ajax.php:1317 +#: wp-admin/includes/class-wp-posts-list-table.php:954 +#: wp-admin/includes/template.php:1637 wp-admin/includes/meta-boxes.php:78 +#: wp-admin/includes/meta-boxes.php:98 wp-admin/includes/meta-boxes.php:100 +msgid "Draft" +msgstr "Borrador" + +#: wp-admin/admin-ajax.php:1325 +#: wp-admin/includes/class-wp-posts-list-table.php:583 +#: wp-admin/includes/class-wp-comments-list-table.php:355 +#: wp-admin/includes/internal-linking.php:51 +#: wp-admin/includes/class-wp-media-list-table.php:276 +#: wp-admin/includes/class-wp-media-list-table.php:292 +msgid "Y/m/d" +msgstr "d/m/Y" + +#: wp-admin/admin-footer.php:23 +msgid "Thank you for creating with WordPress." +msgstr "Gracias por crear con WordPress." + +#: wp-admin/admin-footer.php:24 +msgid "Documentation" +msgstr "Documentación" + +#: wp-admin/admin-footer.php:26 +msgid "Feedback" +msgstr "Feedback" + +#: wp-includes/admin-bar.php:106 wp-includes/admin-bar.php:145 +#: wp-admin/admin-header.php:122 wp-admin/admin-header.php:142 +msgid "Visit Site" +msgstr "Visitar sitio" + +#: wp-includes/admin-bar.php:92 wp-admin/admin-header.php:165 +msgid "Log Out" +msgstr "Cerrar sesión" + +#: wp-admin/admin.php:154 +msgid "Invalid plugin page" +msgstr "Página de plugin no válida" + +#: wp-admin/admin.php:158 +msgid "Cannot load %s." +msgstr "No se pudo cargar %s." + +#: wp-admin/admin.php:179 +msgid "You are not allowed to import." +msgstr "No tienes autorización para importar." + +#: wp-admin/import.php:17 wp-admin/menu.php:220 wp-admin/admin.php:197 +msgid "Import" +msgstr "Importar" + +#: wp-admin/async-upload.php:29 wp-admin/upload.php:13 +#: wp-admin/media-upload.php:19 wp-app.php:599 wp-app.php:787 +msgid "You do not have permission to upload files." +msgstr "No tienes autorización para subir archivos." + +#: wp-admin/comment.php:46 wp-admin/edit-form-comment.php:16 +#: wp-admin/edit-form-comment.php:27 +msgid "Edit Comment" +msgstr "Editar comentario" + +#: wp-admin/comment.php:61 wp-admin/comment.php:215 +#: wp-admin/edit-comments.php:152 +msgid "Oops, no comment with this ID." +msgstr "Vaya, no hay comentarios con ese ID." + +#: wp-admin/comment.php:61 wp-admin/comment.php:215 +msgid "Go back" +msgstr "Volver atrás" + +#: wp-admin/comment.php:217 wp-admin/edit-comments.php:155 +#: wp-admin/includes/comment.php:37 +msgid "You are not allowed to edit comments on this post." +msgstr "No tienes autorización para editar comentarios en esta entrada." + +#: wp-admin/comment.php:67 +msgid "This comment is in the Trash. Please move it out of the Trash if you want to edit it." +msgstr "Este comentario está en la papelera. Por favor, sácalo de la papelera si quieres editarlo." + +#: wp-admin/comment.php:117 +msgid "You are about to mark the following comment as spam:" +msgstr "Estás a punto de marcar el siguiente comentario como spam:" + +#: wp-admin/comment.php:118 +msgid "Spam Comment" +msgstr "Comentario spam" + +#: wp-admin/comment.php:121 +msgid "You are about to move the following comment to the Trash:" +msgstr "Estás a punto de mover el siguiente comentario a la basura:" + +#: wp-admin/comment.php:122 +msgid "Trash Comment" +msgstr "Enviar comentario a la papelera" + +#: wp-admin/comment.php:125 +msgid "You are about to delete the following comment:" +msgstr "Estás a punto de borrar el siguiente comentario:" \ No newline at end of file diff --git a/src/wp-content/languages/ms-es_ES.mo b/src/wp-content/languages/ms-es_ES.mo new file mode 100644 index 0000000000000000000000000000000000000000..f57136c114adbc2a795b1045aa3aae0426132e1e GIT binary patch literal 82624 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 literal 0 HcmV?d00001 diff --git a/src/wp-content/languages/ms-es_ES.po b/src/wp-content/languages/ms-es_ES.po new file mode 100644 index 0000000..fc919a2 --- /dev/null +++ b/src/wp-content/languages/ms-es_ES.po @@ -0,0 +1,2262 @@ +# Translation of Multisite in Spanish (Spain) +# This file is distributed under the same license as the Multisite package. +msgid "" +msgstr "" +"PO-Revision-Date: 2011-07-05 06:00:26+0000\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: GlotPress/0.1\n" +"Project-Id-Version: Multisite\n" + +#: wp-admin/includes/ms.php:514 +msgid "If you reached this screen by accident and meant to visit one of your own sites, here are some shortcuts to help you find your way." +msgstr "Si has llegado a esta pantalla por accedente y querías visitar uno de tus sitios, aquí hay algunos enlaces que te pueden ayudar a encontrar tu camino." + +#: wp-includes/ms-functions.php:1307 +msgid "" +"Dear User,\n" +"\n" +"Your new SITE_NAME site has been successfully set up at:\n" +"BLOG_URL\n" +"\n" +"You can log in to the administrator account with the following information:\n" +"Username: USERNAME\n" +"Password: PASSWORD\n" +"Log in here: BLOG_URLwp-login.php\n" +"\n" +"We hope you enjoy your new site. Thanks!\n" +"\n" +"--The Team @ SITE_NAME" +msgstr "" +"Estimado usuario,\n" +"\n" +"Tu nuevo sitio SITE_NAME se ha creado y configurado con éxito en:\n" +"BLOG_URL\n" +"\n" +"Puedes acceder a tu cuenta de administrador con la siguiente información:\n" +"Usuario: USERNAME\n" +"Contraseña: PASSWORD\n" +"Accede aquí: BLOG_URLwp-login.php\n" +"\n" +"Esperamos que disfrutes tu nuevo sitio. ¡Gracias!\n" +"\n" +"--El equipo @ SITE_NAME" + +#: wp-admin/network/user-new.php:46 +msgid "Cannot add user." +msgstr "No se pudo añadir el usuario." + +#: wp-admin/network/site-users.php:161 wp-admin/network/site-settings.php:72 +#: wp-admin/network/site-info.php:82 wp-admin/network/site-themes.php:128 +msgid "Edit Site: %2$s" +msgstr "Editar sitio: %2$s" + +#: wp-admin/network/sites.php:37 +msgid "Clicking on bold headings can re-sort this table." +msgstr "Haciendo clic en las cabeceras en negrita puedes reordenar esta tabla." + +#: wp-admin/network/index.php:29 +msgid "The Right Now box provides the network administrator with links to the screens to either create a new site or user, or to search existing users and sites. Screen for Sites and Users are also accessible through the left-hand navigation in the Network Admin section." +msgstr "La caja Ahora mismo ofrece al administrador de la red enlaces a las pantallas para crear nuevos usuarios o sitios, o para buscar usuarios y sitios existentes. La pantalla de Sitios y usuarios también está disponible en la navegación de la izquierda en la sección de Administrar red." + +#: wp-admin/network/user-new.php:21 +msgid "Add User will set up a new user account on the network and send that person an email with username and password." +msgstr "Añadir usuario configurará una nueva cuenta de usuario en la red y enviará a esa persona un correo electrónico con su usuario y contraseña." + +#: wp-admin/network/themes.php:181 +msgid "Themes can be enabled on a site by site basis by the network admin on the Edit Site screen (which has a Themes tab); get there via the Edit action link on the All Sites screen. Only network admins are able to install or edit themes." +msgstr "Los temas puede activarlos el administrador de la red sitio a sitio en la pantalla de Editar sitiio (que tiene una pestaña Temas); puedes llegar ahí desde el enlace de acción Editar de la pantalla Todos los sitios. Solo los administradores de red pueden instalar o editar temas. " + +#: wp-admin/network/upgrade.php:22 +msgid "Only use this screen once you have updated to a new version of WordPress through Updates/Available Updates (via the Network Administration navigation menu or the Admin Bar). Clicking the Update Network button will step through each site in the network, five at a time, and make sure any database updates are applied." +msgstr "Usa solamente esta pantalla una vez hayas actualizado a una versión de WordPress desde Actualizaciones disponibles (desde el menú de navegación de Administrar red o la barra de administración). Si haces clic en el botón Actualizar red empezará la actualización en cada sitio, de cinco en cinco, y asegúrate de que se actualizan las bases de datos." + +#: wp-admin/network.php:109 +msgid "The next screen for Network Setup will give you individually-generated lines of code to add to your wp-config.php and .htaccess files. Make sure the settings of your FTP client make files starting with a dot visible, so that you can find .htaccess; you may have to create this file if it really is not there. Make backup copies of those two files." +msgstr "La siguiente pantalla para configurar la red te ofrecerá líneas de código autogeneradas para ti para que las añadas a tus archivos wp-config.php y .htaccess. Asegúrate de que los ajustes de tu cliente FTP permiten que los ficheros con un punto delante se muestren, para que puedas ver el fichero .htaccess; puede que tengas que crear este archivo si no estuviera ya creado. Haz copias de seguridad de esos dos archivos." + +#: wp-admin/network/menu.php:77 +msgid "Available Updates" +msgstr "Actualizaciones disponibles" + +#: wp-admin/network/menu.php:17 +msgid "All Sites" +msgstr "Todos los sitios" + +#: wp-admin/network/menu.php:33 +msgid "Installed Themes" +msgstr "Temas instalados" + +#: wp-admin/network/menu.php:52 +msgid "Network Settings" +msgstr "Ajustes de red" + +#: wp-activate.php:92 +msgid "Your account is now activated. Log in or go back to the homepage." +msgstr "Tu cuenta se ha activado. Accede o vuelve a la página de inicio." + +#: wp-admin/network/settings.php:31 +msgid "Super admins can no longer be added on the Options screen. You must now go to the list of existing users on Network Admin > Users and click on Username or the Edit action link below that name. This goes to an Edit User page where you can check a box to grant super admin privileges." +msgstr "Los super administadores ya no pueden añadirse en la pantalla de Ajustes. Ahora debes ir a la lista de usuarios existentes en Administrar red > Usuarios y hacer clic en el enlace de acción de Usuario o Editar debajo del nombre. Esto te lleva a una página de Editar usuario en la que puedes marcar una casilla que le dará privilegios de administrador." + +#: wp-admin/network.php:111 +msgid "Once you add this code and refresh your browser, multisite should be enabled. This screen will keep an archive of the added code. You can toggle between Network Admin and Site Admin by clicking on the Howdy (Username) dropdown in the upper right of the administration area." +msgstr "Una vez añadas este código y refresques tu navegador se activará multisitio. Esta pantalla mantendrá un registro del código añadido. Puedes alternar entre Administrador de red y Administrador de sitio haciendo clic en el desplegable Hola (Usuario) de la parte superior derecha del área de administración." + +#: wp-activate.php:90 +msgid "Your account is now activated. View your site or Log in" +msgstr "Tu cuenta se ha activado. Visualiza tu sitio o Accede" + +#: wp-admin/includes/ms.php:511 wp-admin/includes/ms.php:513 +msgid "You attempted to access the \"%1$s\" dashboard, but you do not currently have privileges on this site. If you believe you should be able to access the \"%1$s\" dashboard, please contact your network administrator." +msgstr "Has tratado de acceder al escritorio de \"%1$s\" pero no tienes permisos en este sitio. Si crees qeu deberías poder acceder al escritorio de \"%1$s\" contacta con tu administrador de red." + +#: wp-admin/includes/ms.php:525 +msgid "Visit Dashboard" +msgstr "Visitar escritorio" + +#: wp-admin/includes/ms.php:516 +msgid "Your Sites" +msgstr "Tus sitios" + +#: wp-admin/includes/ms.php:525 +msgid "View Site" +msgstr "Ver sitio" + +#: wp-admin/my-sites.php:45 +msgid "Documentation on My Sites" +msgstr "Documentación sobre Mis sitios" + +#: wp-admin/network.php:115 +msgid "Documentation on the Network Screen" +msgstr "Documentación sobre la pantalla de red" + +#: wp-admin/network/themes.php:210 +msgctxt "network" +msgid "Theme deleted." +msgid_plural "%s themes deleted." +msgstr[0] "Tema borrado." +msgstr[1] "%s temas borrados." + +#: wp-admin/network/user-new.php:25 wp-admin/network/index.php:32 +#: wp-admin/network/site-users.php:32 wp-admin/network/site-settings.php:27 +#: wp-admin/network/site-new.php:24 wp-admin/network/users.php:42 +#: wp-admin/network/sites.php:40 wp-admin/network/site-info.php:27 +#: wp-admin/network/site-themes.php:32 +msgid "Support Forums" +msgstr "Foros de soporte" + +#: wp-admin/network/themes.php:142 +msgid "Yes, Delete this theme" +msgid_plural "Yes, Delete these themes" +msgstr[0] "Sí, borrar este tema" +msgstr[1] "Sí, borrar estos temas" + +#: wp-admin/network/themes.php:128 +msgid "You are about to remove the following theme:" +msgid_plural "You are about to remove the following themes:" +msgstr[0] "Estás a punto de borrar el siguiente tema:" +msgstr[1] "Estás a punto de borrar los siguientes temas:" + +#: wp-admin/network/themes.php:145 +msgid "No, Return me to the theme list" +msgstr "No, devuélveme a la lista de temas" + +#: wp-admin/network/themes.php:214 +msgid "You cannot delete a theme while it is active on the main site." +msgstr "No puedes borrar un tema si está activo en el sitio principal." + +#: wp-admin/network/themes.php:125 +msgid "Delete Theme" +msgid_plural "Delete Themes" +msgstr[0] "Borrar tema" +msgstr[1] "Borrar temas" + +#: wp-admin/network/themes.php:81 +msgid "You do not have sufficient permissions to delete themes for this site." +msgstr "No tienes suficientes permisos para borrar temas en este sitio." + +#: wp-admin/network/themes.php:127 +msgid "This theme may be active on other sites in the network." +msgid_plural "These themes may be active on other sites in the network." +msgstr[0] "Este tema podría estar activo en otros sitios de la red." +msgstr[1] "Estos temas podrían estar activos en otros sitios de la red." + +#: wp-admin/includes/class-wp-ms-themes-list-table.php:291 +msgid "Delete this theme" +msgstr "Borrar este tema" + +#: wp-admin/network/themes.php:133 +msgid "Are you sure you wish to delete these themes?" +msgstr "¿Estás seguro de que quieres borrar estos temas?" + +#: wp-admin/network/site-users.php:26 wp-admin/network/site-settings.php:21 +#: wp-admin/network/site-info.php:21 wp-admin/network/site-themes.php:26 +msgid "Info - The domain and path are rarely edited as this can cause the site to not work properly. The Registered date and Last Updated date are displayed. Network admins can mark a site as archived, spam, deleted and mature, to remove from public listings or disable." +msgstr "Información: El dominio y la ruta raramente se editan porque podría provocar que el sistema no funcionase correctamente. Se muestran las fechas de registro y de la última actualización. Los administradores de red puede marcar un sitio como guardado, spam, borrado y de contenido pata adultos, para borrarlo de las listas públicas o desactivado." + +#: wp-admin/network/site-users.php:28 wp-admin/network/site-settings.php:23 +#: wp-admin/network/site-info.php:23 wp-admin/network/site-themes.php:28 +msgid "Themes - This area shows themes that are not already enabled across the network. Enabling a theme in this menu makes it accessible to this site. It does not activate the theme, but allows it to show in the site’s Appearance menu. To enable a theme for the entire network, see the Network Themes screen." +msgstr "Temas - Esta área muestra temas que yo no están activos en la red. Activando un tema en este menú hará que esté disponible para este sitio. No activa el tema pero permite que se muestre en el menú de Aspecto del sitio. Para activar un tema para toda la red ve a la pantalla de Temas de la red." + +#: wp-admin/network/menu.php:74 +msgid "Updates" +msgstr "Actualizar" + +#: wp-admin/network/themes.php:183 +msgid "Documentation on Network Themes" +msgstr "Documentación sobre Temas de la red" + +#: wp-admin/network/upgrade.php:26 +msgid "Documentation on Update Network" +msgstr "Documentación sobre Actualizar red" + +#: wp-admin/network.php:114 +msgid "Documentation on Creating a Network" +msgstr "Documentación sobre Crear una red" + +#: wp-admin/network/site-users.php:27 wp-admin/network/site-settings.php:22 +#: wp-admin/network/site-info.php:22 wp-admin/network/site-themes.php:27 +msgid "Users - This displays the users associated with this site. You can also change their role, reset their password, or remove them from the site. Removing the user from the site does not remove the user from the network." +msgstr "Usuarios - Esto muestra los usuarios asociados a este sitio. También puedes cambiar su perfil, reiniciar su contraseña o borrarlos del sitio. Borrar un usuario del sitio no borra al usuario de la red." + +#: wp-admin/network/index.php:31 +msgid "Documentation on the Network Admin" +msgstr "Documentación sobre Administrador de la red" + +#: wp-admin/network/settings.php:33 +msgid "Documentation on Network Settings" +msgstr "Documentación sobre Ajustes de la red" + +#: wp-admin/network/user-new.php:24 wp-admin/network/users.php:41 +msgid "Documentation on Network Users" +msgstr "Documentación sobre Usuarios de la red" + +#: wp-admin/network/menu.php:29 +msgid "Themes %s" +msgstr "Temas %s" + +#: wp-admin/network/site-users.php:31 wp-admin/network/site-settings.php:26 +#: wp-admin/network/site-new.php:23 wp-admin/network/sites.php:39 +#: wp-admin/network/site-info.php:26 wp-admin/network/site-themes.php:31 +msgid "Documentation on Site Management" +msgstr "Documentación sobre Gestión del sitio" + +#: wp-admin/network/site-new.php:20 +msgid "This screen is for Super Admins to add new sites to the network. This is not affected by the registration settings." +msgstr "Esta pantalla es para que los Super administradores añadan nuevos sitios a la red. No le afectan los ajustes de registro." + +#: wp-admin/network/site-users.php:25 wp-admin/network/site-settings.php:20 +#: wp-admin/network/site-info.php:20 wp-admin/network/site-themes.php:25 +msgid "The menu is for editing information specific to individual sites, particularly if the admin area of a site is unavailable." +msgstr "El meno es para editar información específica de sitios individuadles, especialmente si el área de administrador de un sitio no está disponible." + +#: wp-admin/network/site-users.php:29 wp-admin/network/site-settings.php:24 +#: wp-admin/network/site-info.php:24 wp-admin/network/site-themes.php:29 +msgid "Settings - This page shows a list of all settings associated with this site. Some are created by WordPress and others are created by plugins you activate. Note that some fields are grayed out and say Serialized Data. You cannot modify these values due to the way the setting is stored in the database." +msgstr "Ajustes - Esta página muestra una lista de todos los ajustes asociados a este sitio. Algunos han sido creados por WordPerss y otros los crean los plugins que activas. Observa que algunos campos están oscurecidos y muestran Serialized data. No puedes modificar estos valores por el modo en que el ajuste está almacenado en la base de datos." + +#: wp-includes/ms-functions.php:930 +msgid "The user is already active." +msgstr "El usuario ya esta activo." + +#: wp-admin/network/site-users.php:242 +msgid "You may add from existing network users, or set up a new user to add to this site." +msgstr "Puedes añadir usuarios que ya sean de la red, o añadir uno nuevo para incorporarlo a este sitio." + +#: wp-admin/network/site-users.php:240 +msgid "Add User to This Site" +msgstr "Añadir un usuario a este sitio" + +#: wp-admin/network/site-users.php:244 +msgid "You may add from existing network users to this site." +msgstr "Puedes añadir usuarios que ya sean de la red a este sitio." + +#: wp-admin/network.php:343 wp-admin/network.php:345 +msgid "Caution: We recommend you back up your existing wp-config.php and %s files." +msgstr "Cuidado: Te recomendamos que hagas copia de seguridad de tus archivos wp-config.php y %s." + +#: wp-admin/includes/class-wp-ms-themes-list-table.php:236 +#: wp-admin/includes/class-wp-ms-themes-list-table.php:283 +msgid "Network Enable" +msgstr "Activar para la red" + +#: wp-admin/includes/class-wp-ms-themes-list-table.php:238 +#: wp-admin/includes/class-wp-ms-themes-list-table.php:285 +msgid "Network Disable" +msgstr "Desactivar para la red" + +#: wp-signup.php:87 +msgid "Your address will be %s." +msgstr "Tu dirección será %s." + +#: wp-signup.php:86 +msgid "domain" +msgstr "dominio" + +#: wp-admin/network/settings.php:105 +msgid "Allow site administrators to add new users to their site via the \"Users → Add New\" page." +msgstr "Permite a los administradores de sitio añadir nuevos usuarios a su sitio a través de la página \"Usuarios → Añadir nuevo\"." + +#: wp-admin/network/sites.php:99 wp-admin/network/menu.php:18 +msgctxt "site" +msgid "Add New" +msgstr "Añadir nuevo" + +#: wp-admin/includes/class-wp-ms-themes-list-table.php:201 +msgctxt "themes" +msgid "All (%s)" +msgid_plural "All (%s)" +msgstr[0] "(%s)" +msgstr[1] "Todos (%s)" + +#: wp-admin/includes/class-wp-ms-themes-list-table.php:204 +msgid "Enabled (%s)" +msgid_plural "Enabled (%s)" +msgstr[0] "(%s) activo" +msgstr[1] "(%s) activos" + +#: wp-admin/includes/class-wp-ms-users-list-table.php:97 +msgid "Super Admin (%s)" +msgid_plural "Super Admins (%s)" +msgstr[0] "(%s) Super administrador" +msgstr[1] "(%s) Super administradores" + +#: wp-admin/includes/class-wp-ms-themes-list-table.php:238 +#: wp-admin/includes/class-wp-ms-themes-list-table.php:285 +msgid "Disable" +msgstr "Desactivar" + +#: wp-admin/includes/class-wp-ms-themes-list-table.php:337 +msgid "Visit Theme Site" +msgstr "Visitar el sitio del tema" + +#: wp-admin/network/site-themes.php:22 +msgid "You do not have sufficient permissions to manage themes for this site." +msgstr "No tienes suficentes permisos para administrar temas en este sitio." + +#: wp-admin/network/themes.php:22 +msgid "You do not have sufficient permissions to manage network themes." +msgstr "No tienes suficientes permisos para administrar temas de la red." + +#: wp-admin/includes/class-wp-ms-themes-list-table.php:170 +msgid "No themes found." +msgstr "No se han encontrado temas." + +#: wp-admin/includes/class-wp-ms-themes-list-table.php:172 +msgid "You do not appear to have any themes available at this time." +msgstr "Parece ser que no hay temas disponibles en este momento." + +#: wp-admin/includes/class-wp-ms-themes-list-table.php:288 +msgid "Open this theme in the Theme Editor" +msgstr "Abre este tema en el editor de temas" + +#: wp-admin/includes/class-wp-ms-themes-list-table.php:285 +msgid "Disable this theme" +msgstr "Desactiva este tema" + +#: wp-admin/includes/class-wp-ms-themes-list-table.php:283 +msgid "Enable this theme" +msgstr "Activa este tema" + +#: wp-admin/includes/class-wp-ms-themes-list-table.php:337 +msgid "Visit theme homepage" +msgstr "Visita el sitio del tema" + +#: wp-admin/includes/class-wp-ms-themes-list-table.php:207 +msgid "Disabled (%s)" +msgid_plural "Disabled (%s)" +msgstr[0] "(%s) desactivado" +msgstr[1] "(%s) desactivados" + +#: wp-admin/network/themes.php:212 wp-admin/network/site-themes.php:161 +msgid "No theme selected." +msgstr "Ningún tema seleccionado." + +#: wp-admin/network/themes.php:207 wp-admin/network/site-themes.php:159 +msgid "Theme disabled." +msgid_plural "%s themes disabled." +msgstr[0] "Tema desactivado." +msgstr[1] "%s temas desactivados." + +#: wp-admin/network/themes.php:204 wp-admin/network/site-themes.php:156 +msgid "Theme enabled." +msgid_plural "%s themes enabled." +msgstr[0] "Tema activado" +msgstr[1] "%s temas activados." + +#: wp-admin/network/site-users.php:214 +msgid "Enter the username and email." +msgstr "Introduce el nombre de usuario y email." + +#: wp-admin/network/site-users.php:211 +msgid "User created." +msgstr "Usuario creado." + +#: wp-admin/network/site-users.php:202 +msgid "Select a user to change role." +msgstr "Elige un usuario para cambiar su perfil." + +#: wp-admin/network/site-users.php:208 +msgid "Select a user to remove." +msgstr "Elige un usuario para borrarlo." + +#: wp-admin/network/site-users.php:193 +msgid "User is already a member of this site." +msgstr "El usuario ya es miembro de este sitio." + +#: wp-admin/network/site-users.php:196 +msgid "Enter the username of an existing user." +msgstr "Introduce el nombre de usuario de un usuario existente." + +#: wp-admin/network/sites.php:61 +msgid "You do not have permission to delete that site." +msgstr "No tienes permisos para borrar ese sitio." + +#: wp-admin/network/edit.php:204 +msgid "You are not allowed to delete the site." +msgstr "No tienes permisos para borrar este sitio." + +#: wp-admin/network/edit.php:42 +msgid "Warning! User %s cannot be deleted." +msgstr "¡Aviso! El usuario %s no puede borrarse." + +#: wp-admin/network/settings.php:240 +msgid "Language Settings" +msgstr "Ajustes de idioma" + +#: wp-admin/network/site-themes.php:164 +msgid "Network enabled themes are not shown on this screen." +msgstr "Los temas activos de la red no se muestran en esta pantalla." + +#: wp-admin/network/user-new.php:17 +msgid "You do not have sufficient permissions to add users to this network." +msgstr "No tienes suficientes permisos para añadir usuarios a esta red." + +#: wp-admin/network/themes.php:176 wp-admin/network/site-themes.php:125 +msgctxt "themes per page (screen options)" +msgid "Themes" +msgstr "Temas" + +#: wp-admin/network.php:145 +msgid "The constant DO_NOT_UPGRADE_GLOBAL_TABLES cannot be defined when creating a network." +msgstr "La constante DO_NOT_UPGRADE_GLOBAL_TABLES no puede definirse al crear una red." + +#: wp-admin/network/user-new.php:98 wp-admin/network/site-users.php:270 +msgid "Add User" +msgstr "Añadir usuario" + +#: wp-admin/network/sites.php:32 +msgid "Dashboard leads to the Dashboard for that site." +msgstr "Escritorio te lleva al escritorio de ese sitio." + +#: wp-admin/network/sites.php:34 +msgid "Delete which is a permanent action after the confirmation screens." +msgstr "Borrar es una acción permanente tras las pantallas de confirmación." + +#: wp-admin/network/site-users.php:175 wp-admin/network/site-settings.php:88 +#: wp-admin/network/site-info.php:98 wp-admin/network/site-themes.php:142 +msgid "Info" +msgstr "Información" + +#: wp-admin/network/site-info.php:78 +msgid "Site info updated." +msgstr "Información del sitio actualizada." + +#: wp-admin/network/site-users.php:38 wp-admin/network/site-settings.php:33 +#: wp-admin/network/site-info.php:33 wp-admin/network/site-themes.php:49 +msgid "Invalid site ID." +msgstr "ID de sitio no válido." + +#: wp-admin/network/site-users.php:17 wp-admin/network/site-settings.php:17 +#: wp-admin/network/site-info.php:17 +msgid "You do not have sufficient permissions to edit this site." +msgstr "No tienes suficientes permisos para editar este sitio." + +#: wp-admin/network/site-settings.php:68 +msgid "Site options updated." +msgstr "Opciones del sitio actualizadas." + +#: wp-admin/network/site-users.php:162 wp-admin/network/site-settings.php:73 +#: wp-admin/network/site-info.php:83 wp-admin/network/site-themes.php:129 +msgid "Edit Site: %s" +msgstr "Editar sitio: %s" + +#: wp-admin/network/themes.php:196 wp-admin/network/menu.php:34 +msgctxt "theme" +msgid "Add New" +msgstr "Añadir nuevo" + +#: wp-admin/network/sites.php:28 +msgid "Add New takes you to the Add New Site screen. You can search for a site by Name, ID number, or IP address. Screen Options allows you to choose how many sites to display on one page." +msgstr "Añadir nuevo te lleva a la pantalla de Añadir nuevo sitiio. Puedes buscar un sitio por nombre, número de ID o dirección IP. Las Opciones de pantalla te permiten elegir cuantos sitios mostrar por página." + +#: wp-admin/network/site-new.php:98 wp-admin/network/site-new.php:107 +msgid "Add New Site" +msgstr "Añadir nuevo sitio" + +#: wp-admin/network/site-new.php:17 +msgid "You do not have sufficient permissions to add sites to this network." +msgstr "No tienes suficientes permisos para añadir sitios a esta red." + +#: wp-admin/network/menu.php:46 +msgctxt "plugin editor" +msgid "Add New" +msgstr "Añadir nuevo" + +#: wp-admin/network/sites.php:25 +msgctxt "sites per page (screen options)" +msgid "Sites" +msgstr "Sitios" + +#: wp-admin/network/sites.php:31 +msgid "An Edit link to a separate Edit Site screen." +msgstr "Un enlace de Editar que lleva a otra pantalla de Editar sitio." + +#: wp-admin/network.php:354 +msgid "Create a blogs.dir directory at %s/blogs.dir. This directory is used to store uploaded media for your additional sites and must be writeable by the web server." +msgstr "Crea un directorio blogs.dir en %s/blogs.dir. Este directorio se utiliza para almacenar los archivos de medios subidos en tus sitios adicionales y el servidor web debe tener permisos de escritura." + +#: wp-includes/ms-functions.php:527 +msgid "Only lowercase letters (a-z) and numbers are allowed." +msgstr "Sólo se permiten minúsculas (a-z) y números." + +#: wp-activate.php:66 +msgid "Your account has been activated. You may now log in to the site using your chosen username of “%2$s”. Please check your email inbox at %3$s for your password and login instructions. If you do not receive an email, please check your junk or spam folder. If you still do not receive an email within an hour, you can reset your password." +msgstr "Se ha activado tu cuenta. Ahora puedes acceder al sitio usando el nombre de usuario que elegiste de “%2$s”. Por favor, revisa tu bandeja de entrada del correo electrónico %3$s para obtener tu contraseña e instrucciones de acceso. Si no recibes un correo electrónico revisa la carpeta de spam. Si aún así no recibes un correo electrónico en una hora puedes reiniciar tu contraseña aquí." + +#: wp-includes/ms-load.php:238 +msgid "Read the bug report page. Some of the guidelines there may help you figure out what went wrong." +msgstr "Lee la página de errores. Algunas de las guías que hay ahí pueden ayudarte a hacerte una idea sobre qué ha ido mal." + +#: wp-includes/ms-functions.php:839 wp-includes/ms-functions.php:890 +msgid "[%1$s] Activate %2$s" +msgstr "[%1$s] Activar %2$s" + +#: wp-includes/ms-load.php:213 +msgid "No site defined on this host. If you are the owner of this site, please check Debugging a WordPress Network for help." +msgstr "No se ha definido un sitio para este servidor. Si eres el propietario de este sitio, por favor, consulta Arreglando una red de WordPress para tener ayuda." + +#: wp-admin/includes/ms.php:35 +msgid "This file is too big. Files must be less than %1$s KB in size." +msgstr "Este archivo es demasiado grande. Los archivos deben ser de un tamaño menor a %1$s KB." + +#: wp-admin/network/edit.php:52 +msgid "What should be done with posts and links owned by %s?" +msgstr "¿Qué debe hacerse con las entradas y enlaces de %s?" + +#: wp-admin/network/edit.php:45 +msgid "Warning! User cannot be deleted. The user %s is a network admnistrator." +msgstr "¡Atención! Este usuario no puede borrarse. El usuario %s es el administrador de la red." + +#: wp-admin/network/edit.php:29 +msgid "Transfer or delete posts and links before deleting users." +msgstr "Transfiere o borra las entradas y enlaces antes de borrar usuarios." + +#: wp-admin/includes/ms.php:40 +msgid "Back" +msgstr "Atrás" + +#: wp-admin/includes/ms.php:37 +msgid "You have used your space quota. Please delete files before uploading." +msgstr "Has usado tu cuota de espacio asignada. Por favor, borra archivos antes de subir alguno más." + +#: wp-admin/network/edit.php:405 +msgid "Warning! User cannot be modified. The user %s is a network administrator." +msgstr "¡Atención! El usuario no puede modificarse. El usuario %s es el administrador de la red." + +#: wp-admin/includes/ms.php:33 +msgid "Not enough space to upload. %1$s KB needed." +msgstr "No hay espacio suficiente para subir. Se necesitan %1$s KB." + +#: wp-admin/network/edit.php:70 +msgid "Site: %s" +msgstr "Sitio: %s" + +#: wp-admin/includes/ms.php:221 +msgid "" +"Dear user,\n" +"\n" +"You recently requested to have the administration email address on\n" +"your site changed.\n" +"If this is correct, please click on the following link to change it:\n" +"###ADMIN_URL###\n" +"\n" +"You can safely ignore and delete this email if you do not want to\n" +"take this action.\n" +"\n" +"This email has been sent to ###EMAIL###\n" +"\n" +"Regards,\n" +"All at ###SITENAME###\n" +"###SITEURL### " +msgstr "" +"Estimado usuario,\n" +"\n" +"Has solicitado recientemente el cambio de la \n" +"dirección de correo electrónico de administración de tu sitio.\n" +"Si es correcto, haz clic en el siguiente enlace para cambiarla:\n" +"###ADMIN_URL###\n" +"\n" +"Si no quieres hacerlo, puedes ignorar el correo y borrarlo tranquilamente.\n" +"\n" +"Este correo ha sido enviado a ###EMAIL###\n" +"\n" +"Saludos,\n" +"La gente de ###SITENAME###\n" +"###SITEURL### " + +#: wp-admin/includes/ms.php:242 +msgid "[%s] New Admin Email Address" +msgstr "[%s] Nueva dirección de correo electrónico del administrador." + +#: wp-admin/includes/ms.php:258 +msgid "ERROR: The e-mail address isn't correct." +msgstr "ERROR: La dirección de correo electrónico no es correcta." + +#: wp-admin/includes/ms.php:263 +msgid "ERROR: The e-mail address is already used." +msgstr "ERROR: Esa dirección de correo electrónico ya está siendo utilizada." + +#: wp-admin/includes/ms.php:275 +msgid "" +"Dear user,\n" +"\n" +"You recently requested to have the email address on your account changed.\n" +"If this is correct, please click on the following link to change it:\n" +"###ADMIN_URL###\n" +"\n" +"You can safely ignore and delete this email if you do not want to\n" +"take this action.\n" +"\n" +"This email has been sent to ###EMAIL###\n" +"\n" +"Regards,\n" +"All at ###SITENAME###\n" +"###SITEURL###" +msgstr "" +"Estimado usuario,\n" +"\n" +"Recientemente has solicitado el cambio de dirección de correo electrónico de tu cuenta..\n" +"Si es así haz clic en el siguiente enlace para cambiarla:\n" +"###ADMIN_URL###\n" +"\n" +"Si no quieres hacerlo puedes ignorar y borrar este correo electrónico con tranquilidad.\n" +"\n" +"Este correo electrónico se ha enviado a ###EMAIL###\n" +"\n" +"Atentamente,\n" +"El equipo de ###SITENAME###\n" +"###SITEURL###" + +#: wp-admin/includes/ms.php:295 +msgid "[%s] New Email Address" +msgstr "[%s] Nuevo correo electrónico" + +#: wp-admin/includes/ms.php:303 +msgid "Your email address has not been updated yet. Please check your inbox at %s for a confirmation email." +msgstr "Tu correo electrónico no ha sido actualizado todavía. Por favor, revisa tu bandeja de entrada de %s para ver el correo electrónico de confirmación." + +#: wp-admin/includes/ms.php:413 +msgid "GB" +msgstr "GB" + +#: wp-admin/includes/ms.php:416 +msgid "MB" +msgstr "MB" + +#: wp-admin/includes/ms.php:419 +msgid "Used: %1s%% of %2s" +msgstr "Utilizado: %1s%% de %2s" + +#: wp-admin/includes/ms.php:556 +msgid "British English" +msgstr "Inglés británico" + +#: wp-admin/includes/ms.php:566 +msgid "English" +msgstr "Inglés" + +#: wp-admin/includes/ms.php:586 +msgid "Warning! WordPress encrypts user cookies, but you must add the following lines to wp-config.php for it to be more secure." +msgstr "¡Atención! WordPress encripta las cookies de los usuarios, pero debes añadir las siguientes líneas a wp-config.php para que sea más seguro." + +#: wp-admin/includes/ms.php:587 +msgid "Before the line /* That's all, stop editing! Happy blogging. */ please add this code:" +msgstr "Antes de la línea /* ¡Eso es todo, deja de editar! ¡Feliz blogging!. */ por favor, añade el siguiente código:" + +#: wp-admin/includes/ms.php:600 +msgid "Thank you for Updating! Please visit the Update Network page to update all your sites." +msgstr "¡Gracias por actualizar!. Por favor, visita Actualizar red para actualizar todos tus sitios." + +#: wp-admin/includes/ms.php:633 +msgid "Primary Site" +msgstr "Sitio principal" + +#: wp-admin/includes/ms.php:552 +msgid "American English" +msgstr "Inglés americano" + +#: wp-admin/includes/ms.php:432 +msgid "MB (Leave blank for network default)" +msgstr "MB (Déjalo en blanco para dejar la cuota de la red por defecto)" + +#: wp-admin/includes/ms.php:431 +msgid "Site Upload Space Quota " +msgstr "Cuota de espacio de subida del sitio" + +#: wp-admin/includes/ms.php:680 +msgid "The %1$s file is deprecated. Please remove it and update your server rewrite rules to use %2$s instead." +msgstr "El archivo %1$s es obsoleto. Por favor, elimínalo y actualiza las reglas de re-escritura de tu servidor para usar %2$s en su lugar." + +#: wp-admin/network/settings.php:25 +msgid "Dashboard Site is an option to give a site to users who do not have a site on the system. Their default role is Subscriber, but that default can be changed. The Admin Notice Feed can provide a notice on all dashboards of the latest post via RSS or Atom, or provide no such notice if left blank." +msgstr "El escritorio del sitio es una opción para dar un sitio a usuarios que no tienen uno en el sistema. Su perfil por defecto es suscriptor, pero puede cambiarse. El feed de avisos del administrador puede, a través de RSS o Atom, ofrecer avisos de las últimas entradas en todos los escritorios o, si lo dejas en blanco, no mostrar aviso alguno." + +#: wp-admin/network/site-new.php:21 +msgid "If the admin email for the new site does not exist in the database, a new user will also be created." +msgstr "Si el correo electrónico del administrador para el nuevo sitio no existe en la base de datos también se creará un nuevo usuario." + +#: wp-admin/network/sites.php:33 +msgid "Deactivate, Archive, and Spam which lead to confirmation screens. These actions can be reversed later." +msgstr "Desactivar, Archivar y Spam te llevan a pantallas de confirmación. Estas acciones pueden revertirse más tarde." + +#: wp-admin/network/sites.php:36 +msgid "The site ID is used internally, and is not shown on the front end of the site or to users/viewers." +msgstr "El ID de sitio se usa internamente, y no se muestra en la parte visible del sitio o a los usuarios/visitantes." + +#: wp-admin/network/sites.php:30 +msgid "Hovering over each site reveals seven options (three for the primary site):" +msgstr "Al pasar el cursor sobre cada sitio se muestran siete opciones (tres para el sitio primario):" + +#: wp-admin/network.php:110 +msgid "Add a blogs.dir directory under /wp-content and add the designated lines of code to wp-config.php (just before /*...stop editing...*/) and .htaccess (replacing the existing WordPress rules)." +msgstr "Crea un directorio blogs.dir bajo /wp-content y añade las líneas de código definidas a wp-config.php (justo antes de /*...deja de editar...*/) y a .htaccess (reemplazando las reglas existentes de WordPress)." + +#: wp-admin/network.php:107 +msgid "This screen allows you to configure a network as having subdomains (site1.example.com) or subdirectories (example.com/site1). Subdomains require wildcard subdomains to be enabled in Apache and DNS records, if your host allows it." +msgstr "Esta pantalla te permite configurar una red que contenga subdominios (site1.example.com) or subdirectories (example.com/site1). Los subdominios requieren registros DNS y activar los comodines (wildcards) en Apache, si tu alojamiento lo permite." + +#: wp-admin/network/settings.php:24 +msgid "Operational settings has fields for the network’s name and admin email." +msgstr "Los ajustes operacionales tienen campos para el nombre de red y el correo electrónico del administrador." + +#: wp-admin/network/users.php:36 +msgid "You can also go to the user’s profile page by clicking on the individual username." +msgstr "También puedes ir a la página de perfil del usuario haciendo clic en el nombre de usuario concreto." + +#: wp-admin/network/users.php:38 +msgid "The bulk action will permanently delete selected users, or mark/unmark those selected as spam. Spam users will have posts removed and will be unable to sign up again with the same email addresses." +msgstr "La acción en lote borrará permanentemente los usuarios seleccionados, o marca/desmarca los seleccionados como spam. Se borrarán las entradas de los usuarios spam y no podrán acceder de nuevo con la misma dirección de correo electrónico. " + +#: wp-admin/network/settings.php:28 +msgid "Upload settings control the size of the uploaded files and the amount of available upload space for each site. You can change the default value for specific sites when you edit a particular site. Allowed file types are also listed (space separated only)." +msgstr "Los ajustes de subida controlan el tamaño para la subida de archivos y la cantidad de espacio de subida disponible para cada sitio. Puedes cambiar el valor por defecto para sitios específicos cuando edites un sitio en concreto. También se listan los tipos de archivo permitidos (separados solo por espacios)." + +#: wp-admin/my-sites.php:43 +msgid "Up until WordPress version 3.0, what is now called a Multi-site Network had to be installed separately as WordPress MU (multi-user)." +msgstr "Hasta la versión 3.0 de WordPress, lo que ahora se le llama red multisitio tenía que instalarse aparte como WordPress MU (multiusuario)." + +#: wp-admin/includes/class-wp-ms-themes-list-table.php:180 +msgid "Theme" +msgstr "Tema" + +#: wp-admin/network/index.php:28 +msgid "Blogs are now called Sites; Site is now called Network." +msgstr "Los blogs se llaman ahora sitios; al sitio ahora se le llama red." + +#: wp-admin/network/index.php:27 +msgid "Site Admin is now Super Admin (we highly encourage you to get yourself a cape!)." +msgstr "El administrador del sitio es ahora Super administrador (te recomendamos encarecidamente que te protejas)" + +#: wp-includes/ms-load.php:232 +msgid "If you are the owner of this network please check that MySQL is running properly and all tables are error free." +msgstr "Si eres el propietario de esta red comprueba que MySQL se está ejecutando adecuadamente y que niguna de las tablas tiene errores." + +#: wp-includes/ms-load.php:231 +msgid "If your site does not display, please contact the owner of this network." +msgstr "Si tu sitio no se muestra contacta con el propietario de esta red." + +#: wp-admin/includes/class-wp-ms-users-list-table.php:76 +msgctxt "user" +msgid "Not Spam" +msgstr "No es spam" + +#: wp-admin/includes/class-wp-ms-users-list-table.php:75 +msgctxt "user" +msgid "Mark as Spam" +msgstr "Marcar como spam" + +#: wp-admin/network.php:153 +msgid "Once the network is created, you may reactivate your plugins." +msgstr "Una vez que se cree la red podrás reactivar tus plugins." + +#: wp-admin/network/sites.php:35 +msgid "Visit to go to the frontend site live." +msgstr "Visitar para ir a la portada del sitio público." + +#: wp-admin/network.php:347 +msgid "Caution: We recommend you back up your existing wp-config.php file." +msgstr "Atención: Recomendamos realizar una copia de seguridad de tu archivo wp-config.php." + +#: wp-admin/network/index.php:26 +msgid "Until WordPress 3.0, running multiple sites required using WordPress MU instead of regular WordPress. In version 3.0, these applications have merged. If you are a former MU user, you should be aware of the following changes:" +msgstr "Antes de WordPress 3.0, para hacer funcionar múltiples sitios se requería usar WordPress MU en vez de WordPress normal. En la versión 3.0, estas aplicaciones se han fusionado. Si eres usuario o conocedor de MU debes ser consciente de los siguientes cambios:" + +#: wp-admin/network/settings.php:29 +msgid "Checkboxes for media upload buttons set which are shown in the visual editor. If unchecked, a generic upload button is still visible; other media types can still be uploaded if on the allowed file types list." +msgstr "Las casillas seleccionables para los botones de subida de multimedia hacen que se muestren en el editor visual. Si está desmarcado, un botón genérico se mantendrá visible. Otros tipos de archivos multimedia pueden continuar subiéndose." + +#: wp-admin/network/settings.php:27 +msgid "New site settings are defaults applied when a new site is created in the network. These include welcome email for when a new site or user account is registered, and what᾿s put in the first post, page, comment, comment author, and comment URL." +msgstr "Los ajustes para nuevos sitios se aplican cuando se crea un nuevo sitio en la red. Esto incluye correo electrónico de bienvenida cuando se registra un nuevo sitio o cuenta de usuario y que poner en la primera entrada, página, comentario, autor del comentario y la URL del comentario." + +#: wp-admin/network/themes.php:179 +msgid "This screen enables and disables the inclusion of themes available to choose in the Appearance menu for each site. It does not activate or deactivate which theme a site is currently using." +msgstr "Esta pantalla activa o desactiva la inclusión en la disponibilidad de Temas para los sitios en el menú Apariencia de cada sitio. No activa o desactiva que temas se están usando en cada sitio." + +#: wp-admin/my-sites.php:42 +msgid "This screen shows an individual user all of their sites in this network, and also allows that user to set a primary site. He or she can use the links under each site to visit either the frontend or the dashboard for that site." +msgstr "Esta pantalla muestra los usuarios de forma individual con todos sus sitios en la red y también permite al usuario marcar un sitio como principal. Él o ella pueden usar los enlaces bajo cada sitio para visitar la portada o el escritorio de cada sitio." + +#: wp-admin/network/themes.php:180 +msgid "If the network admin disables a theme that is in use, it can still remain selected on that site. If another theme is chosen, the disabled theme will not appear in the site’s Appearance > Themes screen." +msgstr "Si el administrador de la red desactiva un tema que está en uso, podrá continuar seleccionado en el sitio que lo tenga en uso. Si en el sitio selecciona otro tema, el tema ya no le aparecerá en la pantalla Apariencia > Temas." + +#: wp-admin/network/settings.php:23 +msgid "This screen sets and changes options for the network as a whole. The first site is the main site in the network and network options are pulled from that original site’s options." +msgstr "Esta pantalla establece y cambia las opciones para toda la red. El primer sitio es el sitio principal de la red y las opciones de red serán pasadas desde las opciones del sitio original." + +#: wp-admin/network/settings.php:26 +msgid "Registration settings can disable/enable public signups. If you let others sign up for a site, install spam plugins. Spaces, not commas, should separate names banned as sites for this network." +msgstr "Los ajustes de registro pueden activar/desactivar el registro público. Si permites que la gente registre un sitio, instala un plugins de spam. Espacio, sin comas, debes separar los nombres para sitios no permitidos para esta red." + +#: wp-admin/network/settings.php:30 +msgid "Menu setting enables/disables the plugin menus from appearing for non super admins, so that only super admins, not site admins, have access to activate plugins." +msgstr "En ajustes de menú se activa o desactiva que aparezca o no el menú plugins para los usuarios que no son Super Admin. Es decir, solo los Super Admins, no los Admin, tienen acceso a los plugins." + +#: wp-admin/network/sites.php:29 +msgid "This is the main table of all sites on this network. Switch between list and excerpt views by using the icons above the right side of the table." +msgstr "Esta es la tabla principal de todos los sitios de la red. Cambia de vista listado o fragmento usando los iconos de la parte superior derecha de la tabla." + +#: wp-admin/network/user-new.php:22 +msgid "Users who are signed up to the network without a site are added as subscribers to the main or primary dashboard site, giving them profile pages to manage their accounts. These users will only see Dashboard and My Sites in the main navigation until a site is created for them." +msgstr "Los usuarios que se registran en la red sin crear un sitio son añadidos al escritorio del sitio principal, dándoles unas páginas de perfil para gestionar sus cuentas. Estos usuarios solo verán el escritorio y Mis sitios en la navegación principal hasta que creen su propio sitio." + +#: wp-admin/network/users.php:37 +msgid "You can sort the table by clicking on any of the bold headings and switch between list and excerpt views by using the icons in the upper right." +msgstr "Puedes ordenar la tabla haciendo clic en cualquiera de las cabeceras en negritas y cambiando entre listado y extracto haciendo clic en los iconos de arriba a la derecha." + +#: wp-admin/network/users.php:35 +msgid "Hover over any user on the list to make the edit links appear. The Edit link on the left will take you to his or her Edit User profile page; the Edit link on the right by any site name goes to an Edit Site screen for that site." +msgstr "Pasa el cursor por encima de cualquiera de los usuarios de este listado para que aparezcan los enlaces de edición. El enlace Editar de la izquierda te llevará a su página de perfil Editar Usuario. El enlace Editar de la derecha de cualquiera de los nombre de los sitios te lleva a la pantalla del sitio Editar Sitio." + +#: wp-admin/network/upgrade.php:24 +msgid "If this process fails for any reason, users logging in to their sites will force the same update." +msgstr "Si este proceso falla por cualquier circunstancia, cuando los usuarios accedan a su sitio forzaran esta misma actualización." + +#: wp-admin/network/upgrade.php:23 +msgid "If a version update to core has not happened, clicking this button won’t affect anything." +msgstr "Si no se ha actualizado el núcleo, hacer clic en este botón no afectará en nada." + +#: wp-admin/network/users.php:34 +msgid "This table shows all users across the network and the sites to which they are assigned." +msgstr "Esta tabla muestra todos los usuarios de la red y los sitios que tienen asignados." + +#: wp-admin/network/users.php:39 +msgid "You can make an existing user an additional super admin by going to the Edit User profile page and checking the box to grant that privilege." +msgstr "Puedes hacer a un usuario existente Super Admin. Ve a la página del perfil Editar usuario y marca la casilla para darle este privilegio." + +#: wp-admin/network.php:108 +msgid "Choose subdomains or subdirectories; this can only be switched afterwards by reconfiguring your install. Fill out the network details, and click install. If this does not work, you may have to add a wildcard DNS record (for subdomains) or change to another setting in Permalinks (for subdirectories)." +msgstr "Elige subdominios o subdirectorios. Esto solo puede cambiarse reconfigurando tu instalación. Rellena los detalles de la red y haz clic en instalar. Si no funciona, deberás añadir un registro DNS (para los subdominios) o cambiar a otro ajuste de enlaces permanentes (para los subdirectorios)." + +#: wp-admin/network.php:112 +msgid "The choice of subdirectory sites is disabled if this setup is more than a month old because of permalink problems with “/blog/” from the main site. This disabling will be addressed soon in a future version." +msgstr "La posibilidad de sitios en subdirectorios está desactivada si el sitio tiene más de un mes ya que hay un problema con los enlaces permanentes que incluyen “/blog/” en el sitio principal. Esta desactivación se resolverá pronto en futuras versiones." + +#: wp-admin/network/site-new.php:44 +msgid "The following words are reserved for use by WordPress functions and cannot be used as blog names: %s" +msgstr "Las siguientes palabras están reservadas para el uso en las funciones de WordPress y no pueden ser usadas como nombre del sitio: %s" + +#: wp-admin/network/upgrade.php:61 +msgid "Warning! Problem updating %1$s. Your server may not be able to connect to sites running on it. Error message: %2$s" +msgstr "¡Atención! Problema al actualizar %1$s. Tu servidor no puede conectar con el sitio que está funcionando en él. Mensaje de Error: %2$s" + +#: wp-signup.php:391 +msgctxt "Multisite active signup type" +msgid "user" +msgstr "usuario" + +#: wp-signup.php:390 +msgctxt "Multisite active signup type" +msgid "blog" +msgstr "blog" + +#: wp-signup.php:389 +msgctxt "Multisite active signup type" +msgid "none" +msgstr "ninguno" + +#: wp-signup.php:388 +msgctxt "Multisite active signup type" +msgid "all" +msgstr "todo" + +#: wp-admin/network.php:252 wp-admin/network.php:262 wp-admin/network.php:269 +msgid "The main site in a sub-directory install will need to use a modified permalink structure, potentially breaking existing links." +msgstr "El sitio principal en un subdirectorio de instalación tendrá que utilizar una estructura de enlaces permanentes modificada, lo que podría romper los vínculos existentes." + +#: wp-admin/network.php:268 +msgid "Because your install is not new, the sites in your WordPress network must use sub-domains." +msgstr "Cómo como tu instalación no es nueva, los sitios de tu red deberán utilizar subdominios." + +#: wp-admin/network.php:474 +msgid "Add the following to your web.config file in %s, replacing other WordPress rules:" +msgstr "Añade lo siguiente a tu archivo web.config en %s, remplazando las reglas existentes de WordPress:" + +#: wp-admin/network.php:184 wp-admin/network.php:356 +msgid "Networks may not be fully compatible with custom wp-content directories." +msgstr "Las redes puede que no sean totalmente compatibles con directorios wp-content personalizados" + +#: wp-admin/network.php:216 +msgid "Sub-domains" +msgstr "Subdominios" + +#: wp-admin/network.php:220 +msgid "Sub-directories" +msgstr "Subdirectorios" + +#: wp-admin/includes/class-wp-ms-sites-list-table.php:127 +msgctxt "site" +msgid "Mark as Spam" +msgstr "Marcar como spam" + +#: wp-signup.php:435 +msgid "Sorry, new registrations are not allowed at this time." +msgstr "Disculpa, los nuevos registros están deshabilitados." + +#: wp-signup.php:365 +msgid "Check your inbox at %s and click the link given." +msgstr "Comprueba la bandeja de entrada de %s y haz clic en el enlace que encontrarás." + +#: wp-signup.php:371 +msgid "Wait a little longer. Sometimes delivery of email can be delayed by processes outside of our control." +msgstr "Espera un poco más. Hay veces, que el correo electrónico puede tardar en salir, por razones que escapan a nuestro control." + +#: wp-signup.php:372 +msgid "Check the junk or spam folder of your email client. Sometime emails wind up there by mistake." +msgstr "Comprueba la carpeta de correo basura, correo no deseado o spam de tu cliente de correo electrónico o correo web. A veces los correos electrónicos acaban ahí por equivocación." + +#: wp-signup.php:394 +msgid "Greetings Site Administrator! You are currently allowing “%s” registrations. To change or disable registration go to your Options page." +msgstr "¡Felicidades administrador del sitio! Ahora ya permites registros de “%s”. Para cambiarlo o desactivar los registros ve a tu página de opciones." + +#: wp-signup.php:373 +msgid "Have you entered your email correctly? You have entered %s, if it’s incorrect, you will not receive your email." +msgstr "¿Has introducido tu correo electrónico correctamente? Has introducido %s, si es incorrecto no lo recibirás." + +#: wp-signup.php:102 +msgid "Allow my site to appear in search engines like Google, Technorati, and in public listings around this network." +msgstr "Permitir que mi sitio aparezca en motores de búsqueda como Google y Technorati y en los listados públicos de esta red." + +#: wp-signup.php:141 +msgid "We send your registration email to this address. (Double-check your email address before continuing.)" +msgstr "Enviaremos los datos de registro a esta dirección de correo electrónico. Comprueba bien esta dirección antes de continuar." + +#: wp-admin/network.php:511 +msgid "Once you complete these steps, your network is enabled and configured. You will have to log in again." +msgstr "Una vez que completes estos pasos tu red estará activa y configurada. Deberás acceder de nuevo." + +#: wp-admin/network.php:267 +msgid "Sub-domain Install" +msgstr "Instalación en subdominio" + +#: wp-admin/network.php:153 +msgid "Please deactivate your plugins before enabling the Network feature." +msgstr "Por favor, desactiva tus plugins antes de activar la función de red." + +#: wp-includes/ms-default-constants.php:113 +msgid "The constant VHOST is deprecated. Use the boolean constant SUBDOMAIN_INSTALL in wp-config.php to enable a subdomain configuration. Use is_subdomain_install() to check whether a subdomain configuration is enabled." +msgstr "La constante VHOST está obsoleta. Usa la constante booleana/lógica SUBDOMAIN_INSTALL en wp-config.php para habilitar la configuración de subdominios. Usa is_subdomain_install() para comprobar si la configuración de subdominios está activada." + +#: wp-includes/ms-default-constants.php:115 +msgid "Conflicting values for the constants VHOST and SUBDOMAIN_INSTALL. The value of SUBDOMAIN_INSTALL will be assumed to be your subdomain configuration setting." +msgstr "Hay valores en conflicto para las constantes VHOST y SUBDOMAIN_INSTALL. Se asumirá que el valor de la configuración de subdominio es SUBDOMAIN_INSTALL." + +#: wp-admin/includes/class-wp-ms-themes-list-table.php:236 +#: wp-admin/includes/class-wp-ms-themes-list-table.php:283 +msgid "Enable" +msgstr "Activar" + +#: wp-admin/includes/class-wp-ms-sites-list-table.php:232 +msgctxt "%1$s: site name. %2$s: site tagline." +msgid "%1$s – %2$s" +msgstr "%1$s – %2$s" + +#: wp-admin/includes/class-wp-ms-sites-list-table.php:148 +#: wp-admin/network/site-info.php:138 +msgctxt "site" +msgid "Registered" +msgstr "Registrado" + +#: wp-admin/includes/class-wp-ms-sites-list-table.php:128 +#: wp-admin/includes/class-wp-ms-sites-list-table.php:258 +msgctxt "site" +msgid "Not Spam" +msgstr "No es Spam" + +#: wp-admin/includes/class-wp-ms-users-list-table.php:117 +msgctxt "user" +msgid "Registered" +msgstr "Registrado" + +#: wp-admin/includes/class-wp-ms-sites-list-table.php:255 +msgctxt "verb; site" +msgid "Archive" +msgstr "Archivar" + +#: wp-admin/includes/class-wp-ms-sites-list-table.php:173 +#: wp-admin/includes/class-wp-ms-sites-list-table.php:260 +#: wp-admin/network/site-info.php:149 +msgctxt "site" +msgid "Spam" +msgstr "Spam" + +#: wp-includes/ms-load.php:236 +msgid "Could not find site %1$s. Searched for table %2$s in database %3$s. Is that right?" +msgstr "No podemos encontrar el sitio %1$s. Buscamos la tabla %2$sen la base de datos %3$s. ¿Es correcto?" + +#: wp-includes/ms-load.php:227 +msgid "Error establishing database connection" +msgstr "Error estableciendo conexión con la base de datos" + +#: wp-includes/ms-load.php:234 +msgid "Database tables are missing. This means that MySQL is not running, WordPress was not installed properly, or someone deleted %s. You really should look at your database now." +msgstr "Se han perdido las tablas de la base de datos. Esto quiere decir que MySQL no está funcionando, WordPress no ha sido instalado correctamente, o alguien ha eliminado %s. Realmente, debes revisar tu base de datos ahora mismo." + +#: wp-includes/ms-functions.php:1116 +msgid "" +"New Site: %1s\n" +"URL: %2s\n" +"Remote IP: %3s\n" +"\n" +"Disable these notifications: %4s" +msgstr "" +"Nuevo sitio: %1s\n" +"URL: %2s\n" +"IP Remota: %3s\n" +"\n" +"Desactivar estas notificaciones: %4s" + +#: wp-includes/ms-functions.php:691 +msgid "Sorry, that site already exists!" +msgstr "Disculpa, este sitio ya existe." + +#: wp-includes/ms-functions.php:829 +msgid "" +"To activate your blog, please click the following link:\n" +"\n" +"%s\n" +"\n" +"After you activate, you will receive *another email* with your login.\n" +"\n" +"After you activate, you can visit your site here:\n" +"\n" +"%s" +msgstr "" +"Para activar tu sitio haz clic en el siguiente enlace:\n" +"\n" +"%s\n" +"\n" +"Después de activarlo recibirás *otro correo electrónico* con tus datos de acceso.\n" +"\n" +"Después de activarlo, podrás visitar tu sitio aquí:\n" +"\n" +"%s" + +#: wp-includes/ms-functions.php:1123 +msgid "New Site Registration: %s" +msgstr "Nuevo sitio registrado: %s" + +#: wp-includes/ms-functions.php:663 +msgid "Sorry, site names may not contain the character “_”!" +msgstr "¡Lo sentimos, el nombre del sitio no puede contener el caracter “_”!" + +#: wp-includes/ms-functions.php:649 +msgid "Please enter a site name" +msgstr "Por favor, introduce un nombre de sitio" + +#: wp-includes/ms-functions.php:1343 +msgid "New %1$s Site: %2$s" +msgstr "Nuevo sitio en %1$s: %2$s" + +#: wp-includes/ms-functions.php:1057 +msgid "Site already exists." +msgstr "El sitio ya existe." + +#: wp-includes/ms-functions.php:932 +msgid "The site is already active." +msgstr "El sitio ya está activado." + +#: wp-includes/ms-functions.php:660 +msgid "Site name must be at least 4 characters" +msgstr "El nombre del sitio debe tener una extensión mínima de 4 caracteres." + +#: wp-includes/ms-functions.php:1063 +msgid "Could not create site." +msgstr "No se pudo crear el sitio." + +#: wp-includes/ms-functions.php:680 +msgid "Please enter a site title" +msgstr "Por favor, introduce un título para el sitio" + +#: wp-includes/ms-functions.php:673 +msgid "Sorry, site names must have letters too!" +msgstr "Disculpa, el nombre del sitio, también debe contener letras." + +#: wp-includes/ms-functions.php:667 +msgid "Sorry, you may not use that site name." +msgstr "Lo sentimos, no puedes utilizar este nombre para el sitio." + +#: wp-includes/ms-functions.php:695 +msgid "Sorry, that site is reserved!" +msgstr "Disculpa, este nombre de sitio está reservado" + +#: wp-includes/ms-functions.php:706 +msgid "That site is currently reserved but may be available in a couple days." +msgstr "Este nombre de sitio está reservado, pero puede estar libre en un par de días." + +#: wp-includes/ms-functions.php:324 +msgid "Error: problem creating site entry." +msgstr "Error: problema al crear entrada el el sitio." + +#: wp-includes/ms-functions.php:317 +msgid "Error: Site URL already taken." +msgstr "Error: URL del sitio ya escogida." + +#: wp-admin/includes/class-wp-ms-sites-list-table.php:120 +msgid "No sites found." +msgstr "No se encontraron sitios." + +#: wp-includes/ms-load.php:101 +msgid "This site has been archived or suspended." +msgstr "Este sitio ha sido archivado o suspendido." + +#: wp-includes/ms-settings.php:124 +msgid "No site by that name on this system." +msgstr "No existe ningún sitio en el sistema con este nombre." + +#: wp-includes/ms-load.php:211 +msgid "That site does not exist. Please try %s." +msgstr "Este sitio no existe. Por favor, prueba %s." + +#: wp-includes/ms-functions.php:1829 +msgid "You have been added to this site. Please visit the homepage or login using your username and password." +msgstr "Has sido añadido a este sitio. Por favor, visita la página de Inicio o Identifícate usando tu nombre de usuario y contraseña." + +#: wp-includes/ms-functions.php:1827 +msgid "An error occurred adding you to this site. Back to the homepage." +msgstr "Hubo un error añadiéndote a este sitio. Volver a la página de inicio." + +#: wp-includes/ms-functions.php:1829 +msgid "Success" +msgstr "¡Lo lograste!" + +#: wp-includes/ms-functions.php:1751 +msgid "This file is too big. Files must be less than %d KB in size." +msgstr "Este archivo es demasiado grande. Los archivos deben tener un tamaño inferior a %d KB." + +#: wp-activate.php:68 +msgid "Your site at %2$s is active. You may now log in to your site using your chosen username of “%3$s”. Please check your email inbox at %4$s for your password and login instructions. If you do not receive an email, please check your junk or spam folder. If you still do not receive an email within an hour, you can reset your password." +msgstr "Tu sitio en %2$s está activo. Ahora puedes acceder a tu sitio usando el nombre de usuario elegido de “%3$s”. Por favor, revisa la bandeja de entrada de %4$s para ver tu contraseña e instrucciones de acceso. Si no recibes un correo electrónico revisa la bandeja de spam. Si ni aún así recibieras un correo electrónico en una hora puedes reiniciar tu contraseña." + +#: wp-signup.php:87 +msgid "Must be at least 4 characters, letters and numbers only. It cannot be changed, so choose carefully!" +msgstr "Debe tener al menos 4 caracteres, letras y números solamente. ¡No se puede cambiar, así que elige con cuidado!" + +#: wp-signup.php:407 +msgid "You must first log in, and then you can create a new site." +msgstr "Primero debes iniciar sesión, después podrás crear un sitio nuevo." + +#: wp-signup.php:437 +msgid "You are logged in already. No need to register again!" +msgstr "Ya te has identificado. ¡No necesitas registrarte de nuevo!" + +#: wp-signup.php:173 +msgid "Welcome back, %s. By filling out the form below, you can add another site to your account. There is no limit to the number of sites you can have, so create to your heart’s content, but write responsibly!" +msgstr "Bienvenido de nuevo %s. Rellenando el siguiente formulario, puedes añadir otro sitio a tu cuenta. No hay límite en el número de sitios que puedas tener, por tanto, crea los que necesites, pero escribe con responsabilidad." + +#: wp-signup.php:443 +msgid "

    The site you were looking for, %s does not exist, but you can create it now!

    " +msgstr "

    El sitio que estás buscando, %s no existe pero puedes crearlo ahora.

    " + +#: wp-includes/ms-functions.php:551 +msgid "Sorry, usernames may not contain the character “_”!" +msgstr "¡Lo sentimos, nombres de usuario no puede contener el caracter “_”!" + +#: wp-signup.php:445 +msgid "

    The site you were looking for, %s, does not exist.

    " +msgstr "

    El sitio que has estado buscando, %s, no existe.

    " + +#: wp-signup.php:369 +msgid "If you haven’t received your email yet, there are a number of things you can do:" +msgstr "Si todavía no has recibido el correo electrónico, hay una serie de acciones que puedes realizar:" + +#: wp-includes/ms-settings.php:15 +msgid "Configuration error in wp-config.php. $base is set to BASE when it should be like / or /blogs/." +msgstr "Error de configuración en wp-config.php. $base está definido como BASE cuando debería ser parecido a / o /sitios/." + +#: wp-includes/ms-load.php:239 +msgid "If you’re still stuck with this message, then check that your database contains the following tables:" +msgstr "Si todavía estás atascado con este mensaje, comprueba que tu base de datos contiene las siguientes tablas:" + +#: wp-signup.php:225 +msgid "http://%2$s is your new site. Log in as “%4$s” using your existing password." +msgstr "http://%2$s es tu nuevo sitio. Accede como “%4$s” usando tu contraseña actual." + +#: wp-admin/my-sites.php:34 +msgid "The primary site you chose does not exist." +msgstr "El sitio principal que has elegido no existe." + +#: wp-admin/network/settings.php:126 +msgid "If you want to limit site registrations to certain domains. One domain per line." +msgstr "Si quieres limitar el registro de sitios a determinados dominios. Un dominio por línea." + +#: wp-admin/network/settings.php:136 +msgid "If you want to ban domains from site registrations. One domain per line." +msgstr "Si quieres banear dominios del registro de sitios. Un dominio por línea." + +#: wp-admin/network/settings.php:214 +msgid "The media upload buttons to display on the “Write Post” page. Make sure you update the allowed upload file types below as well." +msgstr "Los botones de subida de archivos a mostrar en la página de “Nueva entrada”. Asegúrate de actualizar también los tipos de archivo permitidos." + +#: wp-admin/network.php:237 wp-admin/network.php:277 +msgid "The internet address of your network will be %s." +msgstr "La dirección en internet de tu red será %s." + +#: wp-admin/network.php:190 +msgid "Fill in the information below and you’ll be on your way to creating a network of WordPress sites. We will create configuration files in the next step." +msgstr "Completa la información siguiente y estarás en el camino de crear una red de sitios con WordPress. Crearemos los archivos de configuración en el siguiente paso." + +#: wp-admin/network/settings.php:86 +msgid "If registration is disabled, please set NOBLOGREDIRECT in wp-config.php to a URL you will redirect visitors to if they visit a non-existent site." +msgstr "Si el registro está deshabilitado, por favor, define NOBLOGREDIRECT en wp-config.php con la URL que quieres que se redirija a los visitantes que visitan un sitio inexistente." + +#: wp-admin/network/site-new.php:34 +msgid "Can’t create an empty site." +msgstr "No se puede crear un sitio vacío." + +#: wp-admin/network/upgrade.php:66 +msgid "If your browser doesn’t start loading the next page automatically, click this link:" +msgstr "Si tu navegador no carga la siguiente página de forma automática haz clic en este enlace:" + +#: wp-admin/network.php:212 +msgid "You will need a wildcard DNS record if you are going to use the virtual host (sub-domain) functionality." +msgstr "Necesitarás crear un registro DNS si vas a utilizar la funcionalidad de servidor vitual (sub-dominios)." + +#: wp-admin/network.php:232 +msgid "We recommend you change your siteurl to %1$s before enabling the network feature. It will still be possible to visit your site using the www prefix with an address like %2$s but any links will not have the www prefix." +msgstr "Te recomendamos que cambies la URL de tu sitio a %1$s antes de activar la función de red. Seguirá siendo posible visitar tu sitio con el prefijo www con una dirección como %2$s, pero ningún enlace tendrá el prefijo www." + +#: wp-admin/network.php:202 +msgid "Please make sure the Apache mod_rewrite module is installed as it will be used at the end of this installation." +msgstr "Por favor, asegúrate de que el módulo Apache mod_rewrite está instalado, ya que será utilizado al finalizar la instalación." + +#: wp-admin/network.php:358 +msgid "Add the following to your wp-config.php file in %s above the line reading /* That’s all, stop editing! Happy blogging. */:" +msgstr "Añade lo siguiente a tu archivo wp-config.php en %s sobre la línea que dice /* ¡Eso es todo, no hay que editar nada más! Feliz blogging. */:" + +#: wp-admin/network/sites.php:79 +msgid "Site marked as spam." +msgstr "Sitio marcado como spam." + +#: wp-admin/network/sites.php:52 +msgid "Sites marked as spam." +msgstr "Sitios marcados como spam." + +#: wp-admin/network/sites.php:49 +msgid "Sites removed from spam." +msgstr "Sitios eliminados de spam." + +#: wp-admin/network/users.php:59 +msgid "Users removed from spam." +msgstr "Usuarios eliminados de spam." + +#: wp-admin/network/sites.php:76 +msgid "Site removed from spam." +msgstr "Sitio eliminado de spam." + +#: wp-admin/network.php:138 +msgid "Your WordPress address must match your Site address before creating a Network. See General Settings." +msgstr "Tu dirección de WordPress debe coincidir con la dirección de tu sitio antes de crear una red. Mira en Ajustes generales." + +#: wp-admin/network.php:259 +msgid "Because your install is in a directory, the sites in your WordPress network must use sub-directories." +msgstr "Cómo lo has instalado en un subdirectorio, los sitios en tu red de WordPress, deben usar subdirectorios." + +#: wp-admin/network/sites.php:55 +msgid "Sites deleted." +msgstr "Sitios eliminados." + +#: wp-admin/network/sites.php:58 +msgid "Site deleted." +msgstr "Sitio eliminado." + +#: wp-admin/network/site-new.php:95 +msgid "Site added." +msgstr "Sitio añadido." + +#: wp-admin/includes/class-wp-ms-sites-list-table.php:255 +msgid "You are about to archive the site %s." +msgstr "Estás apunto de archivar el sitio %s." + +#: wp-admin/network/users.php:56 +msgid "Users marked as spam." +msgstr "Usuario marcado como spam." + +#: wp-admin/includes/class-wp-ms-sites-list-table.php:258 +msgid "You are about to unspam the site %s." +msgstr "Estás a punto de sacar el sitio %s de spam." + +#: wp-admin/network/site-info.php:134 +msgid "Update siteurl and home as well." +msgstr "Actualizar siteurl y portada" + +#: wp-admin/includes/class-wp-ms-sites-list-table.php:260 +msgid "You are about to mark the site %s as spam." +msgstr "Estás a punto de marcar el sitio %s como spam." + +#: wp-admin/network/sites.php:73 +msgid "Site deactivated." +msgstr "Sitio desactivado." + +#: wp-admin/network/sites.php:70 +msgid "Site activated." +msgstr "Sitio activado." + +#: wp-admin/network/sites.php:67 +msgid "Site unarchived." +msgstr "Sitio desarchivado." + +#: wp-admin/includes/class-wp-ms-sites-list-table.php:263 +msgid "You are about to delete the site %s." +msgstr "Estás a punto de eliminar el sitio %s." + +#: wp-admin/network/users.php:62 +msgid "Users deleted." +msgstr "Usuarios eliminados." + +#: wp-admin/includes/class-wp-ms-sites-list-table.php:253 +msgid "You are about to unarchive the site %s." +msgstr "Estás a punto de desarchiva el sitio %s." + +#: wp-admin/network/users.php:53 +msgid "User deleted." +msgstr "Usuario eliminado." + +#: wp-admin/network/sites.php:64 +msgid "Site archived." +msgstr "Sitio archivado." + +#: wp-admin/ms-delete-site.php:17 +msgid "You do not have sufficient permissions to delete this site." +msgstr "No tienes suficientes permisos para eliminar este sitio." + +#: wp-admin/ms-delete-site.php:44 +msgid "" +"Dear User,\n" +"You recently clicked the 'Delete Site' link on your site and filled in a\n" +"form on that page.\n" +"If you really want to delete your site, click the link below. You will not\n" +"be asked to confirm again so only click this link if you are absolutely certain:\n" +"###URL_DELETE###\n" +"\n" +"If you delete your site, please consider opening a new site here\n" +"some time in the future! (But remember your current site and username\n" +"are gone forever.)\n" +"\n" +"Thanks for using the site,\n" +"Webmaster\n" +"###SITE_NAME###" +msgstr "" +"Apreciado usuario,\n" +"Recientemente has hecho clic en el enlace \"Eliminar sitio\" de tu sitio, y has completado\n" +"un formulario en esa página.\n" +"Si realmente quieres eliminar tu sitio, sigue el enlace siguiente. No serás\n" +"preguntado de nuevo para confirmar esta acción, es decir, haz clic si estás totalmente seguro:\n" +"###URL_DELETE###\n" +"\n" +"Si eliminas tu sitio, por favor, considera crear uno nuevo aquí mismo\n" +"en el futuro. (Pero recuerda que tu nombre de usuario y tu sitio\n" +"desaparecerán para siempre.)\n" +"\n" +"Gracias por usar nuestro sitio,\n" +"Webmaster\n" +"###SITE_NAME###" + +#: wp-admin/ms-delete-site.php:75 +msgid "I'm sure I want to permanently disable my site, and I am aware I can never get it back or use %s again." +msgstr "Estoy seguro que quiero desactivar mi sitio de forma permanente y estoy avisado que NUNCA MÃS podré usar de nuevo %s." + +#: wp-admin/ms-delete-site.php:76 +msgid "Delete My Site Permanently" +msgstr "Eliminar mi sitio de forma permanente" + +#: wp-admin/network/edit.php:105 +msgid "You probably need to go back to the options page." +msgstr "Probablemente debes volver a opciones de página." + +#: wp-admin/network/site-new.php:55 +msgid "Invalid email address." +msgstr "Dirección de correo electrónico no válida." + +#: wp-admin/network/site-new.php:71 +msgid "There was an error creating the user." +msgstr "Hubo un error al crear el usuario." + +#: wp-admin/network/edit.php:222 wp-admin/network/edit.php:323 +msgid "You are not allowed to change the current site." +msgstr "No estás autorizado a cambiar el sitio actual." + +#: wp-admin/ms-delete-site.php:70 +msgid "Remember, once deleted your site cannot be restored." +msgstr "Recuerda, una vez que elimines tu sitio, no se podrá recuperar." + +#: wp-admin/ms-delete-site.php:69 +msgid "If you do not want to use your %s site any more, you can delete it using the form below. When you click Delete My Site Permanently you will be sent an email with a link in it. Click on this link to delete your site." +msgstr "Si no quieres usar más tu sitio %s, puedes eliminarlo mediante el formulario siguiente. Cuando hagas clic en Eliminar mi sitio de forma permanente enviarás un correo electrónico con un enlace en él. Siguiendo ese enlace, tu sitio será eliminado." + +#: wp-admin/ms-delete-site.php:65 +msgid "Thank you. Please check your email for a link to confirm your action. Your site will not be deleted until this link is clicked. " +msgstr "Gracias. Por favor, comprueba tu correo electrónico para seguir el enlace. Tu sitio no será eliminado hasta que hagas clic en ese enlace." + +#: wp-admin/ms-delete-site.php:62 +msgid "Delete My Site" +msgstr "Eliminar mi sitio" + +#: wp-admin/ms-delete-site.php:22 +msgid "Thank you for using %s, your site has been deleted. Happy trails to you until we meet again." +msgstr "Gracias por usar %s, tu sitio ha sido eliminado. Seremos muy felices si volvemos a saber de ti." + +#: wp-admin/network.php:217 +msgctxt "subdomain examples" +msgid "like site1.%1$s and site2.%1$s" +msgstr "cómo sitio1.%1$s y sitio2.%1$s" + +#: wp-admin/network.php:221 +msgctxt "subdirectory examples" +msgid "like %1$s/site1 and %1$s/site2" +msgstr "cómo %1$s/sitio1 and %1$s/sitio2" + +#: wp-includes/ms-settings.php:38 +msgid "Multisite only works without the port number in the URL." +msgstr "El multisitio sólo funciona sin el número del puerto en la URL." + +#: wp-admin/network/settings.php:231 +msgctxt "File size in kilobytes" +msgid "%s KB" +msgstr "%s KB" + +#: wp-admin/network/settings.php:67 +msgid "Registration and support emails will come from this address. An address such as support@%s is recommended." +msgstr "Los correo electrónicos de registro y de soporte vendrán de esta dirección. Se recomienda un correo electrónico del tipo soporte@%s." + +#: wp-admin/network/settings.php:209 +msgid "Media upload buttons" +msgstr "Botones de subida de archivos" + +#: wp-admin/network/settings.php:225 +msgid "Upload file types" +msgstr "Tipos de archivo permitidos" + +#: wp-admin/network/settings.php:220 +msgid "Limit total size of files uploaded to %s MB" +msgstr "Tamaño máximo de espacio para archivos subidos %s MB" + +#: wp-admin/network.php:184 wp-admin/network.php:204 wp-admin/network.php:252 +#: wp-admin/network.php:262 +msgid "Warning!" +msgstr "¡Aviso!" + +#: wp-admin/network.php:202 +msgid "Note:" +msgstr "Nota:" + +#: wp-admin/network.php:206 +msgid "If mod_rewrite is disabled, ask your administrator to enable that module, or look at the Apache documentation or elsewhere for help setting it up." +msgstr "Si mod_rewrite está deshabilitado, pide a su administrador que active ese módulo, o revise la documentación de Apache o en otros sitios para conseguir ayuda para su configuración." + +#: wp-admin/network.php:204 +msgid "It looks like the Apache mod_rewrite module is not installed." +msgstr "Parece que el módulo mod_rewrite de Apache no está instalado." + +#: wp-admin/network/settings.php:194 +msgid "The author of the first comment on a new site." +msgstr "El autor del primer comentario en un sitio nuevo." + +#: wp-admin/network/settings.php:168 +msgid "The first post on a new site." +msgstr "La primera entrada en un sitio nuevo." + +#: wp-admin/network/settings.php:177 +msgid "The first page on a new site." +msgstr "La primera página en un sitio nuevo." + +#: wp-admin/network/settings.php:186 +msgid "The first comment on a new site." +msgstr "El primer comentario en un sitio nuevo." + +#: wp-admin/network/settings.php:202 +msgid "The URL for the first comment on a new site." +msgstr "La URL para el primer comentario en un nuevo sitio." + +#: wp-admin/network/upgrade.php:52 +msgid "All done!" +msgstr "¡Todo hecho!" + +#: wp-admin/network.php:27 +msgid "The Network creation panel is not for WordPress MU networks." +msgstr "El panel de creación de la Red no es para redes de WordPress MU." + +#: wp-admin/network.php:186 +msgctxt "Default network name" +msgid "%s Sites" +msgstr "%s sitios" + +#: wp-admin/network.php:176 +msgid "ERROR: The network could not be created." +msgstr "ERROR: La red no ha podido crearse." + +#: wp-admin/network/settings.php:83 +msgid "Logged in users may register new sites." +msgstr "Solo los usuarios identificados, pueden crear sitios." + +#: wp-admin/network/settings.php:84 +msgid "Both sites and user accounts can be registered." +msgstr "Pueden ser creados sitios y usuarios." + +#: wp-admin/network/settings.php:82 +msgid "User accounts may be registered." +msgstr "Solo las cuentas de usuario pueden ser creadas." + +#: wp-admin/network/settings.php:81 +msgid "Registration is disabled." +msgstr "Los registros están deshabilitados." + +#: wp-admin/network/settings.php:258 +msgid "Enable administration menus" +msgstr "Activar menús de administración" + +#: wp-admin/network/settings.php:51 +msgid "Operational Settings" +msgstr "Ajustes operacionales" + +#: wp-admin/network/settings.php:255 +msgid "Menu Settings" +msgstr "Ajustes de menú" + +#: wp-admin/network/settings.php:206 +msgid "Upload Settings" +msgstr "Ajustes de subidas" + +#: wp-admin/network/settings.php:141 +msgid "New Site Settings" +msgstr "Ajustes para sitios nuevos" + +#: wp-admin/network/settings.php:71 +msgid "Registration Settings" +msgstr "Ajustes de registro" + +#: wp-admin/network.php:326 +msgid "The original configuration steps are shown here for reference." +msgstr "Los pasos de configuración originales se muestran aquí para tenerlos como referencia." + +#: wp-admin/network.php:164 +msgid "Return to Dashboard" +msgstr "Volver al escritorio" + +#: wp-admin/network.php:163 +msgid "You cannot use port numbers such as %s." +msgstr "No puedes usar números de puerto como %s." + +#: wp-admin/network.php:153 wp-admin/network.php:331 wp-admin/network.php:356 +msgid "Warning:" +msgstr "Advertencia:" + +#: wp-admin/network.php:331 +msgid "An existing WordPress network was detected." +msgstr "Se ha detectado una red de WordPress existente." + +#: wp-admin/network.php:332 +msgid "Please complete the configuration steps. To create a new network, you will need to empty or remove the network database tables." +msgstr "Por favor, completa los pasos de configuración. Para crear una nueva red necesitarás vaciar o eliminar las tablas de la red en la base de datos." + +#: wp-admin/network.php:96 +msgid "You must define the WP_ALLOW_MULTISITE constant as true in your wp-config.php file to allow creation of a Network." +msgstr "Debes definir la constante WP_ALLOW_MULTISITE como true en tu archivo wp-config.php para permitir la creación de una red." + +#: wp-admin/network/site-new.php:51 +msgid "Missing or invalid site address." +msgstr "La dirección del sitio no está o no es válida." + +#: wp-admin/network/site-new.php:53 +msgid "Missing email address." +msgstr "Falta la dirección de correo electrónico." + +#: wp-admin/network.php:249 +msgid "Because you are using localhost, the sites in your WordPress network must use sub-directories. Consider using localhost.localdomain if you wish to use sub-domains." +msgstr "Cómo estás usando localhost los sitios en tu red de WordPress deben estar en subdirectorios. Considera usar localhost.localdomain si deseas usar subdominios." + +#: wp-admin/network.php:247 wp-admin/network.php:257 +msgid "Sub-directory Install" +msgstr "Instalación en subdirectorio" + +#: wp-admin/network.php:389 +msgid "To make your installation more secure, you should also add:" +msgstr "Para hacer tu instalación más segura debes añadir lo siguiente:" + +#: wp-admin/network.php:389 +msgid "This unique authentication key is also missing from your wp-config.php file." +msgid_plural "These unique authentication keys are also missing from your wp-config.php file." +msgstr[0] "Esta clave de autentificación tampoco se encuentra en tu archivo wp-config.php" +msgstr[1] "Estas claves de autentificación tampoco se encuentran en tu archivo wp-config.php" + +#: wp-admin/network.php:503 +msgid "Add the following to your .htaccess file in %s, replacing other WordPress rules:" +msgstr "Añade lo siguiente a tu archivo .htaccess en %s, remplazando las reglas existentes de WordPress:" + +#: wp-admin/network.php:340 +msgid "Complete the following steps to enable the features for creating a network of sites." +msgstr "Completa los siguientes pasos para activar la función de creación de red de sitios." + +#: wp-admin/network/upgrade.php:18 wp-admin/network/upgrade.php:37 +#: wp-admin/network/upgrade.php:79 wp-admin/network/menu.php:78 +msgid "Update Network" +msgstr "Actualizar red" + +#: wp-admin/network/upgrade.php:78 +msgid "You can update all the sites on your network through this page. It works by calling the update script of each site automatically. Hit the link below to update." +msgstr "Puedes actualizar todos los sitios de tu red mediante esta página. Funciona haciendo una llamada al script de actualización de forma automatizada. Haz clic en el enlace siguiente para actualizarlos." + +#: wp-admin/network.php:102 +msgid "Create a Network of WordPress Sites" +msgstr "Crear una red de sitios de WordPress" + +#: wp-admin/network.php:162 +msgid "You cannot install a network of sites with your server address." +msgstr "No puedes instalar una red de sitios con tu dirección de servidor." + +#: wp-admin/network.php:189 +msgid "Welcome to the Network installation process!" +msgstr "¡Bienvenido al proceso de instalación de la red!" + +#: wp-admin/network.php:210 +msgid "Addresses of Sites in your Network" +msgstr "Direcciones de los sitios en tu red" + +#: wp-admin/network.php:285 +msgid "What would you like to call your network?" +msgstr "¿Cómo quieres llamar a tu red?" + +#: wp-admin/network.php:211 +msgid "Please choose whether you would like sites in your WordPress network to use sub-domains or sub-directories. You cannot change this later." +msgstr "Por favor, elige como quieres que estén los sitios en tu red de WordPress, subdominios o subdirectorios. No podrás cambiarlo más tarde." + +#: wp-admin/network.php:243 +msgid "Network Details" +msgstr "Detalles de la red" + +#: wp-admin/network.php:282 +msgid "Network Title" +msgstr "Título de la red" + +#: wp-admin/network.php:289 +msgid "Admin E-mail Address" +msgstr "Dirección de correo electrónico del Administrador" + +#: wp-admin/network.php:339 +msgid "Enabling the Network" +msgstr "Activando la red" + +#: wp-signup.php:223 +msgid "The site %s is yours." +msgstr "El sitio %s es tuyo." + +#: wp-signup.php:193 +msgid "Create Site" +msgstr "Crear sitio" + +#: wp-signup.php:188 +msgid "If you’re not going to use a great site domain, leave it for a new user. Now have at it!" +msgstr "Si no vas a usar un dominio de un sitio, por favor, libéralo para que otro lo pueda usar. Ahora ¡consigue uno!" + +#: wp-signup.php:179 +msgid "Sites you are already a member of:" +msgstr "Eres miembro de los siguientes sitios:" + +#: wp-includes/ms-load.php:94 +msgid "This site has not been activated yet. If you are having problems activating your site, please contact %1$s." +msgstr "Este sitio aún no ha sido activado. Si estas teniendo problemas en el proceso de activación, por favor contacta con %1$s." + +#: wp-signup.php:92 +msgid "Site Title:" +msgstr "Título del sitio:" + +#: wp-signup.php:71 +msgid "Site Domain:" +msgstr "Dominio del sitio:" + +#: wp-signup.php:69 +msgid "Site Name:" +msgstr "Nombre del sitio:" + +#: wp-signup.php:84 +msgid "sitename" +msgstr "nombresitio" + +#: wp-signup.php:167 +msgid "Get another %s site in seconds" +msgstr "Consigue otro sitio en %s en segundos" + +#: wp-signup.php:362 +msgid "Congratulations! Your new site, %s, is almost ready." +msgstr "¡Felicidades! Tu nuevo sitio , %s, ya está listo." + +#: wp-signup.php:421 +msgid "Site registration has been disabled." +msgstr "No se permiten nuevos registros de sitios." + +#: wp-signup.php:265 +msgid "Gimme a site!" +msgstr "¡Dame un sitio!" + +#: wp-signup.php:364 +msgid "But, before you can start using your site, you must activate it." +msgstr "Pero, antes de que puedas comenzar a usar tu sitio, debes activarlo." + +#: wp-signup.php:366 +msgid "If you do not activate your site within two days, you will have to sign up again." +msgstr "Si no activas tu sitio en dos días, deberás registrarte de nuevo." + +#: wp-admin/network/settings.php:63 +msgid "Network Admin Email" +msgstr "Correo electrónico del administrador de la red" + +#: wp-admin/network/settings.php:54 +msgid "Network Name" +msgstr "Nombre de la red" + +#: wp-admin/network/site-new.php:83 +msgid "[%s] New Site Created" +msgstr "[%s] Nuevo sitio creado" + +#: wp-admin/network/site-new.php:82 +msgid "" +"New site created by %1s\n" +"\n" +"Address: http://%2s\n" +"Name: %3s" +msgstr "" +"Nuevo sitio creado por %1s\n" +"\n" +"Dirección: http://%2s\n" +"Nombre: %3s" + +#: wp-admin/network/edit.php:328 +msgid "WordPress › Confirm your action" +msgstr "WordPress › Confirma tu acción" + +#: wp-admin/network/settings.php:150 +msgid "The welcome email sent to new site owners." +msgstr "El correo electrónico de bienvenida enviado a los dueños de sitios nuevos." + +#: wp-admin/network/settings.php:218 +msgid "Site upload space" +msgstr "Espacio de subidas para el sitio" + +#: wp-admin/includes/class-wp-ms-sites-list-table.php:248 +msgid "You are about to activate the site %s" +msgstr "Estás a punto de activar el sitio %s" + +#: wp-admin/network/settings.php:98 +msgid "Send the network admin an email notification every time someone registers a site or user account." +msgstr "Enviar al administrador un correo electrónico cada vez que alguien se registre o registre un sitio." + +#: wp-admin/network/settings.php:114 +msgid "Users are not allowed to register these sites. Separate names by spaces." +msgstr "Los usuarios no tienes permiso para crear estos sitios. Separa los nombres mediante espacios." + +#: wp-admin/includes/class-wp-ms-sites-list-table.php:250 +msgid "You are about to deactivate the site %s" +msgstr "Estás a punto desactivar el sitio %s" + +#: wp-admin/network/upgrade.php:66 +msgid "Next Sites" +msgstr "Sitios siguientes" + +#: wp-includes/ms-functions.php:214 wp-includes/ms-functions.php:276 +msgid "That user does not exist." +msgstr "Este usuario no existe" + +#: wp-includes/ms-functions.php:534 +msgid "Please enter a username" +msgstr "Por favor, introduce un nombre de usuario." + +#: wp-includes/ms-functions.php:654 +msgid "Only lowercase letters and numbers allowed" +msgstr "Solo se permiten minúsculas y números" + +#: wp-includes/ms-functions.php:542 +msgid "That username is not allowed" +msgstr "Este nombre de usuario no está permitido" + +#: wp-includes/ms-functions.php:545 +msgid "You cannot use that email address to signup. We are having problems with them blocking some of our email. Please use another email provider." +msgstr "No puedes usar este correo electrónico para registrarte. Estamos teniendo problemas con él, bloquea nuestros correos electrónicos. Por favor, usa otro proveedor." + +#: wp-includes/ms-functions.php:548 +msgid "Username must be at least 4 characters" +msgstr "El nombre de usuario debe tener una extensión mínima de 4 caracteres." + +#: wp-includes/ms-functions.php:557 +msgid "Sorry, usernames must have letters too!" +msgstr "Disculpa, el nombre de usuario, también debe contener letras." + +#: wp-includes/ms-functions.php:560 +msgid "Please enter a correct email address" +msgstr "Por favor, introduce un correo electrónico válido" + +#: wp-includes/ms-functions.php:566 +msgid "Sorry, that email address is not allowed!" +msgstr "Disculpa, este correo electrónico no está permitido" + +#: wp-includes/ms-functions.php:571 +msgid "Sorry, that username already exists!" +msgstr "Disculpa, este usuario ya existe." + +#: wp-includes/ms-functions.php:575 +msgid "Sorry, that email address is already used!" +msgstr "Disculpa, este correo electrónico ya está en uso." + +#: wp-includes/ms-functions.php:587 +msgid "That username is currently reserved but may be available in a couple of days." +msgstr "Este nombre de usuario está reservado, pero podría estar libre en un par de días" + +#: wp-includes/ms-functions.php:590 +msgid "username and email used" +msgstr "nombre de usuario y correo electrónico en uso" + +#: wp-includes/ms-functions.php:600 +msgid "That email address has already been used. Please check your inbox for an activation email. It will become available in a couple of days if you do nothing." +msgstr "Este correo electrónico ya ha sido usado. Por favor, comprueba tu bandeja de entrada. Podría estar libre en un par de días si no haces nada." + +#: wp-includes/ms-functions.php:657 +msgid "That name is not allowed" +msgstr "Este nombre no está permitido" + +#: wp-includes/ms-functions.php:882 +msgid "" +"To activate your user, please click the following link:\n" +"\n" +"%s\n" +"\n" +"After you activate, you will receive *another email* with your login.\n" +"\n" +msgstr "" +"Para activar tu usuario, por favor, sigue el siguiente enlace:\n" +"\n" +"%s\n" +"\n" +"Después de la activación, recibirás *otro correo electrónico* con tu identificación.\n" +"\n" + +#: wp-includes/ms-functions.php:926 +msgid "Invalid activation key." +msgstr "Clave de activación inválida" + +#: wp-includes/ms-functions.php:948 +msgid "Could not create user" +msgstr "No podemos crear el usuario" + +#: wp-includes/ms-functions.php:956 +msgid "That username is already activated." +msgstr "Este usuario, ya está activado." + +#: wp-includes/ms-functions.php:1150 +msgid "" +"New User: %1s\n" +"Remote IP: %2s\n" +"\n" +"Disable these notifications: %3s" +msgstr "" +"Nuevo usuario: %1s\n" +"IP Remota: %2s\n" +"\n" +"Desactivar estas notificaciones: %3s" + +#: wp-includes/ms-functions.php:1156 +msgid "New User Registration: %s" +msgstr "Nuevo registro de usuario: %s" + +#: wp-includes/ms-functions.php:1229 +msgid "

    Already Installed

    You appear to have already installed WordPress. To reinstall please clear your old database tables first.

    " +msgstr "

    Ya instalado

    WordPress parece estar instalado. Si deseas reinstalar, por favor, borra las tablas de la base de datos.

    " + +#: wp-includes/ms-functions.php:1391 +msgid "New %1$s User: %2$s" +msgstr "Nuevo %1$s usuario: %2$s" + +#: wp-includes/ms-functions.php:1572 +msgid "Sorry, you have used your space allocation. Please delete some files to upload more files." +msgstr "Disculpa. Has usado todo tu espacio. Por favor, borra algunos archivos para poder subir nuevos." + +#: wp-includes/ms-functions.php:1782 +msgid "Please try again!" +msgstr "Por favor, vuelve a intentarlo." + +#: wp-includes/ms-functions.php:1989 +msgid "" +"Dear User,\n" +"\n" +"Your new account is set up.\n" +"\n" +"You can log in with the following information:\n" +"Username: USERNAME\n" +"Password: PASSWORD\n" +"LOGINLINK\n" +"\n" +"Thanks!\n" +"\n" +"--The Team @ SITE_NAME" +msgstr "" +"Apreciado usuario,\n" +"\n" +"Tu nueva cuenta está configurada.\n" +"\n" +"Puedes identificarte con la siguiente información:\n" +"Usuario: USERNAME\n" +"Clave: PASSWORD\n" +"LOGINLINK\n" +"\n" +"¡Gracias!\n" +"\n" +"--El equipo de SITE_NAME" + +#: wp-includes/ms-load.php:87 +msgid "This user has elected to delete their account and the content is no longer available." +msgstr "Este usuario ha decidido eliminar su cuenta y ya no están los contenidos." + +#: wp-includes/ms-settings.php:123 +msgid "Database tables are missing." +msgstr "No se encuentran tablas de la base de datos." + +#: wp-admin/network.php:138 wp-admin/network.php:145 wp-admin/network.php:162 +msgid "Error:" +msgstr "Error:" + +#: wp-signup.php:101 +msgid "Privacy:" +msgstr "Privacidad:" + +#: wp-signup.php:134 +msgid "(Must be at least 4 characters, letters and numbers only.)" +msgstr "(Deben tener como mínimo 4 caracteres, solo letras y números.)" + +#: wp-signup.php:137 +msgid "Email Address:" +msgstr "Dirección de correo electrónico:" + +#: wp-signup.php:170 +msgid "There was a problem, please correct the form below and try again." +msgstr "Hubo un problema, revisa el formulario y prueba de nuevo." + +#: wp-signup.php:252 +msgid "Get your own %s account in seconds" +msgstr "Consigue tu propia cuenta %s en segundos." + +#: wp-signup.php:268 +msgid "Just a username, please." +msgstr "Solo el nombre de usuario, gracias." + +#: wp-signup.php:272 +msgid "Next" +msgstr "Siguiente" + +#: wp-signup.php:299 +msgid "%s is your new username" +msgstr "%s es tu nuevo nombre de usuario" + +#: wp-signup.php:300 +msgid "But, before you can start using your new username, you must activate it." +msgstr "Pero, antes de poder comenzar a usar tu nuevo nombre de usuario, debes activarlo." + +#: wp-signup.php:301 +msgid "Check your inbox at %1$s and click the link given." +msgstr "Comprueba la bandeja de entrada de %1$s y haz clic en el enlace que encontrarás." + +#: wp-signup.php:302 +msgid "If you do not activate your username within two days, you will have to sign up again." +msgstr "Si no activas tu nombre de usuario en dos días, deberás registrarte de nuevo." + +#: wp-signup.php:328 +msgid "Signup" +msgstr "Registrarse" + +#: wp-signup.php:367 +msgid "Still waiting for your email?" +msgstr "¿Continúas esperando el correo electrónico?" + +#: wp-signup.php:400 +msgid "Registration has been disabled." +msgstr "Los registros están deshabilitados." + +#: wp-signup.php:415 +msgid "User registration has been disabled." +msgstr "No se permite el registro de nuevos usuarios." + +#: wp-admin/my-sites.php:13 wp-admin/ms-delete-site.php:13 +#: wp-admin/network/user-new.php:14 wp-admin/network/index.php:17 +#: wp-admin/network/themes.php:14 wp-admin/network/plugin-editor.php:14 +#: wp-admin/network/plugin-install.php:17 wp-admin/network/site-users.php:14 +#: wp-admin/network/theme-editor.php:14 wp-admin/network/setup.php:14 +#: wp-admin/network/site-settings.php:14 wp-admin/network/site-new.php:14 +#: wp-admin/network/edit.php:14 wp-admin/network/theme-install.php:17 +#: wp-admin/network/users.php:14 wp-admin/network/upgrade.php:14 +#: wp-admin/network/update-core.php:14 wp-admin/network/sites.php:14 +#: wp-admin/network/settings.php:14 wp-admin/network/user-edit.php:14 +#: wp-admin/network/site-info.php:14 wp-admin/network/plugins.php:14 +#: wp-admin/network/profile.php:14 wp-admin/network/update.php:17 +#: wp-admin/network/site-themes.php:14 wp-admin/network/admin.php:16 +msgid "Multisite support is not enabled." +msgstr "El soporte multisitio no está activado." + +#: wp-admin/network/user-new.php:31 wp-admin/network/index.php:20 +#: wp-admin/network/site-users.php:42 wp-admin/network/site-settings.php:37 +#: wp-admin/network/site-new.php:31 wp-admin/network/edit.php:102 +#: wp-admin/network/edit.php:175 wp-admin/network/edit.php:192 +#: wp-admin/network/edit.php:236 wp-admin/network/edit.php:246 +#: wp-admin/network/edit.php:256 wp-admin/network/edit.php:267 +#: wp-admin/network/edit.php:278 wp-admin/network/edit.php:288 +#: wp-admin/network/edit.php:298 wp-admin/network/edit.php:308 +#: wp-admin/network/edit.php:355 wp-admin/network/edit.php:376 +#: wp-admin/network/edit.php:391 wp-admin/network/edit.php:442 +#: wp-admin/network/users.php:17 wp-admin/network/upgrade.php:33 +#: wp-admin/network/sites.php:17 wp-admin/network/settings.php:17 +#: wp-admin/network/site-info.php:37 wp-admin/network/site-themes.php:55 +msgid "You do not have permission to access this page." +msgstr "No tienes autorización para acceder a esta página" + +#: wp-admin/ms-delete-site.php:24 +msgid "I'm sorry, the link you clicked is stale. Please select another option." +msgstr "Lo sentimos, el enlace pulsado está caducado. Por favor, elige otra opción." + +#: wp-admin/network/edit.php:344 +msgid "Confirm" +msgstr "Confirmar" + +#: wp-admin/network/user-new.php:34 +msgid "Cannot create an empty user." +msgstr "No se puede crear un usuario vacio" + +#: wp-admin/network/site-users.php:217 +msgid "Duplicated username or email address." +msgstr "Nombre de usuario o correo electrónico duplicado." + +#: wp-admin/network/settings.php:58 +msgid "What you would like to call this website." +msgstr "Como quieres llamar a este sitio." + +#: wp-admin/network/settings.php:74 +msgid "Allow new registrations" +msgstr "Permitir nuevos registros" + +#: wp-admin/network/settings.php:92 +msgid "Registration notification" +msgstr "Notificación de registro" + +#: wp-admin/network/settings.php:103 +msgid "Add New Users" +msgstr "Añadir nuevo usuario" + +#: wp-admin/network/settings.php:110 +msgid "Banned Names" +msgstr "Nombre no permitidos" + +#: wp-admin/network/settings.php:119 +msgid "Limited Email Registrations" +msgstr "Limitar el registro de correo electrónico a" + +#: wp-admin/network/settings.php:131 +msgid "Banned Email Domains" +msgstr "Dominios de correo electrónico no permitidos" + +#: wp-admin/network/settings.php:145 +msgid "Welcome Email" +msgstr "Correo electrónico de bienvenida" + +#: wp-admin/network/settings.php:154 +msgid "Welcome User Email" +msgstr "Correo electrónico de bienvenida al usuario" + +#: wp-admin/network/settings.php:159 +msgid "The welcome email sent to new users." +msgstr "El correo electrónico de bienvenida enviado a los nuevos usuarios." + +#: wp-admin/network/settings.php:172 +msgid "First Page" +msgstr "Primera página" + +#: wp-admin/network/settings.php:181 +msgid "First Comment" +msgstr "Primer comentario" + +#: wp-admin/network/settings.php:190 +msgid "First Comment Author" +msgstr "Autor del primer comentario" + +#: wp-admin/network/settings.php:198 +msgid "First Comment URL" +msgstr "URL del primer comentario" + +#: wp-admin/network/settings.php:212 +msgid "Videos" +msgstr "Vídeos" + +#: wp-admin/network/settings.php:213 +msgid "Music" +msgstr "Música" + +#: wp-admin/network/settings.php:230 +msgid "Max upload file size" +msgstr "Tamaño máximo de archivo" + +#: wp-admin/network/settings.php:243 +msgid "Default Language" +msgstr "Idioma prederterminado." + +#: wp-admin/includes/class-wp-ms-sites-list-table.php:143 +#: wp-admin/network/site-new.php:120 wp-admin/network/site-new.php:122 +#: wp-admin/network/site-info.php:119 +msgid "Domain" +msgstr "Dominio" + +#: wp-admin/includes/class-wp-ms-sites-list-table.php:147 +#: wp-admin/network/site-info.php:142 +msgid "Last Updated" +msgstr "Última actualización" + +#: wp-admin/includes/class-wp-ms-sites-list-table.php:172 +#: wp-admin/network/site-info.php:148 +msgid "Archived" +msgstr "Archivado" + +#: wp-admin/includes/class-wp-ms-sites-list-table.php:175 +#: wp-admin/network/site-info.php:152 +msgid "Mature" +msgstr "Adulto" + +#: wp-admin/includes/class-wp-ms-sites-list-table.php:174 +#: wp-admin/network/site-info.php:150 +msgid "Deleted" +msgstr "Borrado" + +#: wp-admin/includes/class-wp-ms-sites-list-table.php:253 +msgid "Unarchive" +msgstr "Desarchivar" + +#: wp-admin/my-sites.php:95 +#: wp-admin/includes/class-wp-ms-sites-list-table.php:266 +msgid "Visit" +msgstr "Visitar" + +#: wp-admin/includes/class-wp-ms-sites-list-table.php:281 +msgid "Never" +msgstr "Nunca" + +#: wp-admin/includes/class-wp-ms-sites-list-table.php:302 +msgid "Only showing first 5 users." +msgstr "Mostrando solo los 5 primeros usuarios." + +#: wp-admin/includes/class-wp-ms-sites-list-table.php:302 +msgid "More" +msgstr "Más" + +#: wp-admin/network/site-new.php:140 +msgid "Add Site" +msgstr "Añadir sitio" + +#: wp-admin/network/site-new.php:117 +msgid "Site Address" +msgstr "Dirección del sitio" + +#: wp-admin/network/site-new.php:124 +msgid "Only the characters a-z and 0-9 recommended." +msgstr "Solo se recomiendan los caracters a-z y 0-9." + +#: wp-admin/network/site-new.php:133 +msgid "Admin Email" +msgstr "Correo electrónico del administrador" + +#: wp-admin/network/site-new.php:137 +msgid "A new user will be created if the above email address is not in the database." +msgstr "Se creará un usuario nuevo si el correo electrónico no está en la base de datos" + +#: wp-admin/network/site-new.php:137 +msgid "The username and password will be mailed to this email address." +msgstr "El nombre de usuario y la contraseña se enviarán a este correo electrónico." + +#: wp-admin/includes/class-wp-ms-users-list-table.php:82 +msgid "No users found." +msgstr "No se encontraron usuarios." + +#: wp-admin/network/user-new.php:94 wp-admin/network/site-users.php:302 +msgid "Username and password will be mailed to the above email address." +msgstr "Se enviarán el nombre de usuario y la contraseña a esta dirección de correo electrónico." + +#: wp-admin/my-sites.php:16 +msgid "You do not have sufficient permissions to view this page." +msgstr "No tienes permisos suficientes para ver esta página" + +#: wp-admin/my-sites.php:23 +msgid "You must be a member of at least one site to use this page." +msgstr "Debes ser miembro de, al menos, un sitio para usar esta página." + +#: wp-admin/my-sites.php:68 +msgid "Global Settings" +msgstr "Ajustes globales" + +#: wp-admin/network.php:231 wp-admin/network.php:235 wp-admin/network.php:275 +msgid "Server Address" +msgstr "Dirección del servidor" + +#: wp-admin/network.php:292 +msgid "Your email address." +msgstr "Tu dirección de correo electrónico." + +#: wp-admin/includes/ms-deprecated.php:30 +msgid "Sorry, you must delete files before you can upload any more." +msgstr "Disculpa, debes borrar archivos antes de subir nuevos." + +#: wp-activate.php:43 +msgid "Activation Key Required" +msgstr "Requiere clave de activación" + +#: wp-activate.php:46 +msgid "Activation Key:" +msgstr "Clave de activación:" + +#: wp-activate.php:62 wp-activate.php:82 +msgid "Your account is now active!" +msgstr "¡Tu cuenta ahora está activada!" + +#: wp-activate.php:73 +msgid "An error occurred during the activation" +msgstr "Ha habido un error en la activación" + +#: wp-activate.php:85 wp-signup.php:129 +msgid "Username:" +msgstr "Nombre de usuario:" \ No newline at end of file diff --git a/src/wp-content/plugins/akismet/admin.php b/src/wp-content/plugins/akismet/admin.php new file mode 100644 index 0000000..91cedb2 --- /dev/null +++ b/src/wp-content/plugins/akismet/admin.php @@ -0,0 +1,750 @@ +

    ".sprintf(__('Akismet %s requires WordPress 3.0 or higher.'), AKISMET_VERSION) ." ".sprintf(__('Please upgrade WordPress to a current version, or downgrade to version 2.4 of the Akismet plugin.'), 'http://codex.wordpress.org/Upgrading_WordPress', 'http://wordpress.org/extend/plugins/akismet/download/'). "

    + "; + } + add_action('admin_notices', 'akismet_version_warning'); + + return; + } + + if ( function_exists( 'get_plugin_page_hook' ) ) + $hook = get_plugin_page_hook( 'akismet-stats-display', 'index.php' ); + else + $hook = 'dashboard_page_akismet-stats-display'; + add_action('admin_head-'.$hook, 'akismet_stats_script'); + add_meta_box('akismet-status', __('Comment History'), 'akismet_comment_status_meta_box', 'comment', 'normal'); + wp_register_style('akismet.css', AKISMET_PLUGIN_URL . 'akismet.css'); + wp_enqueue_style('akismet.css'); + wp_register_script('akismet.js', AKISMET_PLUGIN_URL . 'akismet.js', array('jquery')); + wp_enqueue_script('akismet.js'); +} +add_action('admin_init', 'akismet_admin_init'); + +function akismet_nonce_field($action = -1) { return wp_nonce_field($action); } +$akismet_nonce = 'akismet-update-key'; + +function akismet_config_page() { + if ( function_exists('add_submenu_page') ) + add_submenu_page('plugins.php', __('Akismet Configuration'), __('Akismet Configuration'), 'manage_options', 'akismet-key-config', 'akismet_conf'); +} + +function akismet_plugin_action_links( $links, $file ) { + if ( $file == plugin_basename( dirname(__FILE__).'/akismet.php' ) ) { + $links[] = ''.__('Settings').''; + } + + return $links; +} + +add_filter( 'plugin_action_links', 'akismet_plugin_action_links', 10, 2 ); + +function akismet_conf() { + global $akismet_nonce, $wpcom_api_key; + + if ( isset($_POST['submit']) ) { + if ( function_exists('current_user_can') && !current_user_can('manage_options') ) + die(__('Cheatin’ uh?')); + + check_admin_referer( $akismet_nonce ); + $key = preg_replace( '/[^a-h0-9]/i', '', $_POST['key'] ); + $home_url = parse_url( get_bloginfo('url') ); + + if ( empty($key) ) { + $key_status = 'empty'; + $ms[] = 'new_key_empty'; + delete_option('wordpress_api_key'); + } elseif ( empty($home_url['host']) ) { + $key_status = 'empty'; + $ms[] = 'bad_home_url'; + } else { + $key_status = akismet_verify_key( $key ); + } + + if ( $key_status == 'valid' ) { + update_option('wordpress_api_key', $key); + $ms[] = 'new_key_valid'; + } else if ( $key_status == 'invalid' ) { + $ms[] = 'new_key_invalid'; + } else if ( $key_status == 'failed' ) { + $ms[] = 'new_key_failed'; + } + + if ( isset( $_POST['akismet_discard_month'] ) ) + update_option( 'akismet_discard_month', 'true' ); + else + update_option( 'akismet_discard_month', 'false' ); + + if ( isset( $_POST['akismet_show_user_comments_approved'] ) ) + update_option( 'akismet_show_user_comments_approved', 'true' ); + else + update_option( 'akismet_show_user_comments_approved', 'false' ); + + } elseif ( isset($_POST['check']) ) { + akismet_get_server_connectivity(0); + } + + if ( empty( $key_status) || $key_status != 'valid' ) { + $key = get_option('wordpress_api_key'); + if ( empty( $key ) ) { + if ( empty( $key_status ) || $key_status != 'failed' ) { + if ( akismet_verify_key( '1234567890ab' ) == 'failed' ) + $ms[] = 'no_connection'; + else + $ms[] = 'key_empty'; + } + $key_status = 'empty'; + } else { + $key_status = akismet_verify_key( $key ); + } + if ( $key_status == 'valid' ) { + $ms[] = 'key_valid'; + } else if ( $key_status == 'invalid' ) { + delete_option('wordpress_api_key'); + $ms[] = 'key_empty'; + } else if ( !empty($key) && $key_status == 'failed' ) { + $ms[] = 'key_failed'; + } + } + + $messages = array( + 'new_key_empty' => array('color' => 'aa0', 'text' => __('Your key has been cleared.')), + 'new_key_valid' => array('color' => '4AB915', 'text' => __('Your key has been verified. Happy blogging!')), + 'new_key_invalid' => array('color' => '888', 'text' => __('The key you entered is invalid. Please double-check it.')), + 'new_key_failed' => array('color' => '888', 'text' => __('The key you entered could not be verified because a connection to akismet.com could not be established. Please check your server configuration.')), + 'no_connection' => array('color' => '888', 'text' => __('There was a problem connecting to the Akismet server. Please check your server configuration.')), + 'key_empty' => array('color' => 'aa0', 'text' => sprintf(__('Please enter an API key. (Get your key.)'), 'http://akismet.com/get/')), + 'key_valid' => array('color' => '4AB915', 'text' => __('This key is valid.')), + 'key_failed' => array('color' => 'aa0', 'text' => __('The key below was previously validated but a connection to akismet.com can not be established at this time. Please check your server configuration.')), + 'bad_home_url' => array('color' => '888', 'text' => sprintf( __('Your WordPress home URL %s is invalid. Please fix the home option.'), esc_html( get_bloginfo('url') ), admin_url('options.php#home') ) ), + ); +?> + +

    + +
    +

    + +

    Sign up success! Please check your email for your Akismet API Key and enter it below.' ); ?>

    + +
    +
    + +

    Akismet will greatly reduce or even completely eliminate the comment and trackback spam you get on your site. If one does happen to get through, simply mark it as "spam" on the moderation screen and Akismet will learn from the mistakes. If you don\'t have an API key yet, you can get one at Akismet.com.'), 'http://akismet.com/', 'http://akismet.com/get/'); ?>

    + +

    + +

    + +

    (What is this?'); ?>)

    + +

    +

    + + + +

    +

    +

    +
    + +
    + +

    + +

    +

    fsockopen or gethostbynamel functions. Akismet cannot work correctly until this is fixed. Please contact your web host or firewall administrator and give them this information about Akismet\'s system requirements.'), 'http://blog.akismet.com/akismet-hosting-faq/'); ?>

    + 0 ) { + // some connections work, some fail + if ( $fail_count > 0 && $fail_count < count($servers) ) { ?> +

    +

    this information about Akismet and firewalls.'), 'http://blog.akismet.com/akismet-hosting-faq/'); ?>

    + 0 ) { ?> +

    +

    Akismet cannot work correctly until this is fixed. Please contact your web host or firewall administrator and give them this information about Akismet and firewalls.'), 'http://blog.akismet.com/akismet-hosting-faq/'); ?>

    + +

    +

    + +

    +

    Akismet cannot work correctly until this is fixed. Please contact your web host or firewall administrator and give them this information about Akismet and firewalls.'), 'http://blog.akismet.com/akismet-hosting-faq/'); ?>

    + + + + + $status ) { + $color = ( $status ? '#4AB915' : '#888'); + ?> + + + + + + +
    +

    +

    +

    Click here to confirm that Akismet.com is up.'), 'http://status.automattic.com/9931/136079/Akismet-API', 'http://status.automattic.com/9931/136079/Akismet-API' ); ?>

    +
    + +
    +
    + + +
    + +
    + ' . _x( 'Spam', 'comments' ) . ''; + global $submenu; + if ( isset( $submenu['edit-comments.php'] ) ) + $link = 'edit-comments.php'; + else + $link = 'edit.php'; + echo '

    '.sprintf( _n( 'Akismet has protected your site from %3$s spam comments.', 'Akismet has protected your site from %3$s spam comments.', $count ), 'http://akismet.com/', clean_url("$link?page=akismet-admin"), number_format_i18n($count) ).'

    '; +} +add_action('activity_box_end', 'akismet_stats'); + +function akismet_admin_warnings() { + global $wpcom_api_key; + if ( !get_option('wordpress_api_key') && !$wpcom_api_key && !isset($_POST['submit']) ) { + function akismet_warning() { + echo " +

    ".__('Akismet is almost ready.')." ".sprintf(__('You must enter your Akismet API key for it to work.'), "plugins.php?page=akismet-key-config")."

    + "; + } + add_action('admin_notices', 'akismet_warning'); + return; + } elseif ( ( empty($_SERVER['SCRIPT_FILENAME']) || basename($_SERVER['SCRIPT_FILENAME']) == 'edit-comments.php' ) && wp_next_scheduled('akismet_schedule_cron_recheck') ) { + function akismet_warning() { + global $wpdb; + $waiting = $wpdb->get_var( $wpdb->prepare( "SELECT COUNT(*) FROM $wpdb->commentmeta WHERE meta_key = 'akismet_error'" ) ); + $next_check = human_time_diff( wp_next_scheduled('akismet_schedule_cron_recheck') ); + if ( $waiting > 0 ) + echo " +

    ".__('Akismet has detected a problem.')." ".sprintf(_n('A server or network problem prevented Akismet from checking %d comment. It has been temporarily held for moderation and will be automatically re-checked in %s.', 'A server or network problem prevented Akismet from checking %d comments. They have been temporarily held for moderation and will be automatically re-checked in %s.', $waiting), number_format_i18n( $waiting ), $next_check)."

    + "; + } + add_action('admin_notices', 'akismet_warning'); + return; + } +} + +// FIXME placeholder + +function akismet_comment_row_action( $a, $comment ) { + + // failsafe for old WP versions + if ( !function_exists('add_comment_meta') ) + return $a; + + $akismet_result = get_comment_meta( $comment->comment_ID, 'akismet_result', true ); + $user_result = get_comment_meta( $comment->comment_ID, 'akismet_user_result', true); + $comment_status = wp_get_comment_status( $comment->comment_ID ); + $desc = null; + if ( !$user_result || $user_result == $akismet_result ) { + // Show the original Akismet result if the user hasn't overridden it, or if their decision was the same + if ( $akismet_result == 'true' && $comment_status != 'spam' && $comment_status != 'trash' ) + $desc = __( 'Flagged as spam by Akismet' ); + elseif ( $akismet_result == 'false' && $comment_status == 'spam' ) + $desc = __( 'Cleared by Akismet' ); + } else { + $who = get_comment_meta( $comment->comment_ID, 'akismet_user', true ); + if ( $user_result == 'true' ) + $desc = sprintf( __('Flagged as spam by %s'), $who ); + else + $desc = sprintf( __('Un-spammed by %s'), $who ); + } + + // add a History item to the hover links, just after Edit + if ( $akismet_result ) { + $b = array(); + foreach ( $a as $k => $item ) { + $b[ $k ] = $item; + if ( $k == 'edit' ) + $b['history'] = ' '. __('History') . ''; + } + + $a = $b; + } + + if ( $desc ) + echo ''.htmlspecialchars($desc).''; + + if ( apply_filters( 'akismet_show_user_comments_approved', get_option('akismet_show_user_comments_approved') ) == 'true' ) { + $comment_count = akismet_get_user_comments_approved( $comment->user_id, $comment->comment_author_email, $comment->comment_author, $comment->comment_author_url ); + $comment_count = intval( $comment_count ); + echo ''; + } + + return $a; +} + +add_filter( 'comment_row_actions', 'akismet_comment_row_action', 10, 2 ); + +function akismet_comment_status_meta_box($comment) { + $history = akismet_get_comment_history( $comment->comment_ID ); + + if ( $history ) { + echo '
    '; + foreach ( $history as $row ) { + $time = date( 'D d M Y @ h:i:m a', $row['time'] ) . ' GMT'; + echo '
    ' . sprintf( __('%s ago'), human_time_diff( $row['time'] ) ) . ' - '; + echo htmlspecialchars( $row['message'] ) . '
    '; + } + + echo '
    '; + + } +} + + +// add an extra column header to the comments screen +function akismet_comments_columns( $columns ) { + $columns[ 'akismet' ] = __( 'Akismet' ); + return $columns; +} + +#add_filter( 'manage_edit-comments_columns', 'akismet_comments_columns' ); + +// Show stuff in the extra column +function akismet_comment_column_row( $column, $comment_id ) { + if ( $column != 'akismet' ) + return; + + $history = akismet_get_comment_history( $comment_id ); + + if ( $history ) { + echo '
    '; + foreach ( $history as $row ) { + echo '
    ' . sprintf( __('%s ago'), human_time_diff( $row['time'] ) ) . '
    '; + echo '
    ' . htmlspecialchars( $row['message'] ) . '
    '; + } + + echo '
    '; + } +} + +#add_action( 'manage_comments_custom_column', 'akismet_comment_column_row', 10, 2 ); + +// END FIXME + +// call out URLS in comments +function akismet_text_add_link_callback( $m ) { + + // bare link? + if ( $m[4] == $m[2] ) + return ''.$m[4].''; + else + return ''.$m[4].''; +} + +function akismet_text_add_link_class( $comment_text ) { + + return preg_replace_callback( '#]*)href="([^"]+)"([^>]*)>(.*?)#i', 'akismet_text_add_link_callback', $comment_text ); +} + +add_filter('comment_text', 'akismet_text_add_link_class'); + + +// WP 2.5+ +function akismet_rightnow() { + global $submenu, $wp_db_version; + + // clean_url was deprecated in WP 3.0 + $esc_url = 'clean_url'; + if ( function_exists( 'esc_url' ) ) + $esc_url = 'esc_url'; + + if ( 8645 < $wp_db_version ) // 2.7 + $link = 'edit-comments.php?comment_status=spam'; + elseif ( isset( $submenu['edit-comments.php'] ) ) + $link = 'edit-comments.php?page=akismet-admin'; + else + $link = 'edit.php?page=akismet-admin'; + + if ( $count = get_option('akismet_spam_count') ) { + $intro = sprintf( _n( + 'Akismet has protected your site from %2$s spam comment already. ', + 'Akismet has protected your site from %2$s spam comments already. ', + $count + ), 'http://akismet.com/', number_format_i18n( $count ) ); + } else { + $intro = sprintf( __('Akismet blocks spam from getting to your blog. '), 'http://akismet.com/' ); + } + + if ( $queue_count = akismet_spam_count() ) { + $queue_text = sprintf( _n( + 'There\'s %1$s comment in your spam queue right now.', + 'There are %1$s comments in your spam queue right now.', + $queue_count + ), number_format_i18n( $queue_count ), $esc_url($link) ); + } else { + $queue_text = sprintf( __( "There's nothing in your spam queue at the moment." ), $esc_url($link) ); + } + + $text = $intro . '
    ' . $queue_text; + echo "

    $text

    \n"; +} + +add_action('rightnow_end', 'akismet_rightnow'); + + +// For WP >= 2.5 +function akismet_check_for_spam_button($comment_status) { + if ( 'approved' == $comment_status ) + return; + if ( function_exists('plugins_url') ) + $link = 'admin.php?action=akismet_recheck_queue'; + else + $link = 'edit-comments.php?page=akismet-admin&recheckqueue=true&noheader=true'; + echo "
    " . __('Check for Spam') . ""; +} +add_action('manage_comments_nav', 'akismet_check_for_spam_button'); + +function akismet_submit_nonspam_comment ( $comment_id ) { + global $wpdb, $akismet_api_host, $akismet_api_port, $current_user, $current_site; + $comment_id = (int) $comment_id; + + $comment = $wpdb->get_row("SELECT * FROM $wpdb->comments WHERE comment_ID = '$comment_id'"); + if ( !$comment ) // it was deleted + return; + + // use the original version stored in comment_meta if available + $as_submitted = get_comment_meta( $comment_id, 'akismet_as_submitted', true); + if ( $as_submitted && is_array($as_submitted) && isset($as_submitted['comment_content']) ) { + $comment = (object) array_merge( (array)$comment, $as_submitted ); + } + + $comment->blog = get_bloginfo('url'); + $comment->blog_lang = get_locale(); + $comment->blog_charset = get_option('blog_charset'); + $comment->permalink = get_permalink($comment->comment_post_ID); + $comment->reporter_ip = $_SERVER['REMOTE_ADDR']; + if ( is_object($current_user) ) { + $comment->reporter = $current_user->user_login; + } + if ( is_object($current_site) ) { + $comment->site_domain = $current_site->domain; + } + + $comment->user_role = ''; + if ( isset( $comment->user_ID ) ) + $comment->user_role = akismet_get_user_roles($comment->user_ID); + + if ( akismet_test_mode() ) + $comment->is_test = 'true'; + + $query_string = ''; + foreach ( $comment as $key => $data ) + $query_string .= $key . '=' . urlencode( stripslashes($data) ) . '&'; + + $response = akismet_http_post($query_string, $akismet_api_host, "/1.1/submit-ham", $akismet_api_port); + if ( $comment->reporter ) { + akismet_update_comment_history( $comment_id, sprintf( __('%s reported this comment as not spam'), $comment->reporter ), 'report-ham' ); + update_comment_meta( $comment_id, 'akismet_user_result', 'false' ); + update_comment_meta( $comment_id, 'akismet_user', $comment->reporter ); + } + + do_action('akismet_submit_nonspam_comment', $comment_id, $response[1]); +} + +function akismet_submit_spam_comment ( $comment_id ) { + global $wpdb, $akismet_api_host, $akismet_api_port, $current_user, $current_site; + $comment_id = (int) $comment_id; + + $comment = $wpdb->get_row("SELECT * FROM $wpdb->comments WHERE comment_ID = '$comment_id'"); + if ( !$comment ) // it was deleted + return; + if ( 'spam' != $comment->comment_approved ) + return; + + // use the original version stored in comment_meta if available + $as_submitted = get_comment_meta( $comment_id, 'akismet_as_submitted', true); + if ( $as_submitted && is_array($as_submitted) && isset($as_submitted['comment_content']) ) { + $comment = (object) array_merge( (array)$comment, $as_submitted ); + } + + $comment->blog = get_bloginfo('url'); + $comment->blog_lang = get_locale(); + $comment->blog_charset = get_option('blog_charset'); + $comment->permalink = get_permalink($comment->comment_post_ID); + $comment->reporter_ip = $_SERVER['REMOTE_ADDR']; + if ( is_object($current_user) ) { + $comment->reporter = $current_user->user_login; + } + if ( is_object($current_site) ) { + $comment->site_domain = $current_site->domain; + } + + $comment->user_role = ''; + if ( isset( $comment->user_ID ) ) + $comment->user_role = akismet_get_user_roles($comment->user_ID); + + if ( akismet_test_mode() ) + $comment->is_test = 'true'; + + $query_string = ''; + foreach ( $comment as $key => $data ) + $query_string .= $key . '=' . urlencode( stripslashes($data) ) . '&'; + + $response = akismet_http_post($query_string, $akismet_api_host, "/1.1/submit-spam", $akismet_api_port); + if ( $comment->reporter ) { + akismet_update_comment_history( $comment_id, sprintf( __('%s reported this comment as spam'), $comment->reporter ), 'report-spam' ); + update_comment_meta( $comment_id, 'akismet_user_result', 'true' ); + update_comment_meta( $comment_id, 'akismet_user', $comment->reporter ); + } + do_action('akismet_submit_spam_comment', $comment_id, $response[1]); +} + +// For WP 2.7+ +function akismet_transition_comment_status( $new_status, $old_status, $comment ) { + if ( $new_status == $old_status ) + return; + + # we don't need to record a history item for deleted comments + if ( $new_status == 'delete' ) + return; + + if ( !is_admin() ) + return; + + if ( !current_user_can( 'edit_post', $comment->comment_post_ID ) && !current_user_can( 'moderate_comments' ) ) + return; + + if ( defined('WP_IMPORTING') && WP_IMPORTING == true ) + return; + + global $current_user; + $reporter = ''; + if ( is_object( $current_user ) ) + $reporter = $current_user->user_login; + + // Assumption alert: + // We want to submit comments to Akismet only when a moderator explicitly spams or approves it - not if the status + // is changed automatically by another plugin. Unfortunately WordPress doesn't provide an unambiguous way to + // determine why the transition_comment_status action was triggered. And there are several different ways by which + // to spam and unspam comments: bulk actions, ajax, links in moderation emails, the dashboard, and perhaps others. + // We'll assume that this is an explicit user action if POST or GET has an 'action' key. + if ( isset($_POST['action']) || isset($_GET['action']) ) { + if ( $new_status == 'spam' && ( $old_status == 'approved' || $old_status == 'unapproved' || !$old_status ) ) { + return akismet_submit_spam_comment( $comment->comment_ID ); + } elseif ( $old_status == 'spam' && ( $new_status == 'approved' || $new_status == 'unapproved' ) ) { + return akismet_submit_nonspam_comment( $comment->comment_ID ); + } + } + + if ( !get_comment_meta( $comment->comment_ID, 'akismet_rechecking' ) ) + akismet_update_comment_history( $comment->comment_ID, sprintf( __('%s changed the comment status to %s'), $reporter, $new_status ), 'status-' . $new_status ); +} + +add_action( 'transition_comment_status', 'akismet_transition_comment_status', 10, 3 ); + +// Total spam in queue +// get_option( 'akismet_spam_count' ) is the total caught ever +function akismet_spam_count( $type = false ) { + global $wpdb; + + if ( !$type ) { // total + $count = wp_cache_get( 'akismet_spam_count', 'widget' ); + if ( false === $count ) { + if ( function_exists('wp_count_comments') ) { + $count = wp_count_comments(); + $count = $count->spam; + } else { + $count = (int) $wpdb->get_var("SELECT COUNT(comment_ID) FROM $wpdb->comments WHERE comment_approved = 'spam'"); + } + wp_cache_set( 'akismet_spam_count', $count, 'widget', 3600 ); + } + return $count; + } elseif ( 'comments' == $type || 'comment' == $type ) { // comments + $type = ''; + } else { // pingback, trackback, ... + $type = $wpdb->escape( $type ); + } + + return (int) $wpdb->get_var("SELECT COUNT(comment_ID) FROM $wpdb->comments WHERE comment_approved = 'spam' AND comment_type='$type'"); +} + + +function akismet_recheck_queue() { + global $wpdb, $akismet_api_host, $akismet_api_port; + + if ( ! ( isset( $_GET['recheckqueue'] ) || ( isset( $_REQUEST['action'] ) && 'akismet_recheck_queue' == $_REQUEST['action'] ) ) ) + return; + + $moderation = $wpdb->get_results( "SELECT * FROM $wpdb->comments WHERE comment_approved = '0'", ARRAY_A ); + foreach ( (array) $moderation as $c ) { + $c['user_ip'] = $c['comment_author_IP']; + $c['user_agent'] = $c['comment_agent']; + $c['referrer'] = ''; + $c['blog'] = get_bloginfo('url'); + $c['blog_lang'] = get_locale(); + $c['blog_charset'] = get_option('blog_charset'); + $c['permalink'] = get_permalink($c['comment_post_ID']); + + $c['user_role'] = ''; + if ( isset( $c['user_ID'] ) ) + $c['user_role'] = akismet_get_user_roles($c['user_ID']); + + if ( akismet_test_mode() ) + $c['is_test'] = 'true'; + + $id = (int) $c['comment_ID']; + + $query_string = ''; + foreach ( $c as $key => $data ) + $query_string .= $key . '=' . urlencode( stripslashes($data) ) . '&'; + + $response = akismet_http_post($query_string, $akismet_api_host, '/1.1/comment-check', $akismet_api_port); + if ( 'true' == $response[1] ) { + wp_set_comment_status($c['comment_ID'], 'spam'); + update_comment_meta( $c['comment_ID'], 'akismet_result', 'true' ); + akismet_update_comment_history( $c['comment_ID'], __('Akismet re-checked and caught this comment as spam'), 'check-spam' ); + + } elseif ( 'false' == $response[1] ) { + update_comment_meta( $c['comment_ID'], 'akismet_result', 'false' ); + akismet_update_comment_history( $c['comment_ID'], __('Akismet re-checked and cleared this comment'), 'check-ham' ); + // abnormal result: error + } else { + update_comment_meta( $c['comment_ID'], 'akismet_result', 'error' ); + akismet_update_comment_history( $c['comment_ID'], sprintf( __('Akismet was unable to re-check this comment (response: %s)'), $response[1]), 'check-error' ); + } + + } + wp_redirect( $_SERVER['HTTP_REFERER'] ); + exit; +} + +add_action('admin_action_akismet_recheck_queue', 'akismet_recheck_queue'); + +// Check connectivity between the WordPress blog and Akismet's servers. +// Returns an associative array of server IP addresses, where the key is the IP address, and value is true (available) or false (unable to connect). +function akismet_check_server_connectivity() { + global $akismet_api_host, $akismet_api_port, $wpcom_api_key; + + $test_host = 'rest.akismet.com'; + + // Some web hosts may disable one or both functions + if ( !function_exists('fsockopen') || !function_exists('gethostbynamel') ) + return array(); + + $ips = gethostbynamel($test_host); + if ( !$ips || !is_array($ips) || !count($ips) ) + return array(); + + $servers = array(); + foreach ( $ips as $ip ) { + $response = akismet_verify_key( akismet_get_key(), $ip ); + // even if the key is invalid, at least we know we have connectivity + if ( $response == 'valid' || $response == 'invalid' ) + $servers[$ip] = true; + else + $servers[$ip] = false; + } + + return $servers; +} + +// Check the server connectivity and store the results in an option. +// Cached results will be used if not older than the specified timeout in seconds; use $cache_timeout = 0 to force an update. +// Returns the same associative array as akismet_check_server_connectivity() +function akismet_get_server_connectivity( $cache_timeout = 86400 ) { + $servers = get_option('akismet_available_servers'); + if ( (time() - get_option('akismet_connectivity_time') < $cache_timeout) && $servers !== false ) + return $servers; + + // There's a race condition here but the effect is harmless. + $servers = akismet_check_server_connectivity(); + update_option('akismet_available_servers', $servers); + update_option('akismet_connectivity_time', time()); + return $servers; +} + +// Returns true if server connectivity was OK at the last check, false if there was a problem that needs to be fixed. +function akismet_server_connectivity_ok() { + // skip the check on WPMU because the status page is hidden + global $wpcom_api_key; + if ( $wpcom_api_key ) + return true; + $servers = akismet_get_server_connectivity(); + return !( empty($servers) || !count($servers) || count( array_filter($servers) ) < count($servers) ); +} + diff --git a/src/wp-content/plugins/akismet/akismet.css b/src/wp-content/plugins/akismet/akismet.css new file mode 100644 index 0000000..6bc8458 --- /dev/null +++ b/src/wp-content/plugins/akismet/akismet.css @@ -0,0 +1,7 @@ +#submitted-on { position: relative; } +#the-comment-list .author .akismet-user-comment-count { display: inline; } +#dashboard_recent_comments .akismet-status { display: none; } /* never show the flagged by text on the dashboard */ +.akismet-status { float: right; } +.akismet-status a { color: #AAA; font-style: italic; } +span.comment-link a { text-decoration: underline; } +span.comment-link:after { content: " " attr(title) " "; color: #aaa; text-decoration: none; } diff --git a/src/wp-content/plugins/akismet/akismet.gif b/src/wp-content/plugins/akismet/akismet.gif new file mode 100644 index 0000000000000000000000000000000000000000..0b93a89b9a0f089342cecaf4deaef48382523d03 GIT binary patch literal 2777 zcmd^;`9Bj31HdQ4Ts=<*DM!dFx6;8gL{i0M7_vVie=xFO=u_EPd?_QQgdSZy9ETZAt7NC(r&4gtWE?XQJ05`=NWhMV zK)3eBY?S1{8EtQ6c-DxQ^8KAHSqe_nrR zZeM!UbW-_5IC3B?kCIR}9**pf$1tLcXrD^QK9w?{1w*kVBa!(-X#_U3fErUwPbeFU z%pZ&`p~quJqY7z3S=}+k!_h^M0Am<3qgpk{r&xn>KRzo40)KFQ9b+n_wSvZ zoz2b7t*xyL;%wJ2HxS;%;c$37-pa~K3U-*w-pC5(IkT#Q_9)N^jmM;_!p=Bgr7!q) zb!>@TxYu`zq-Z^9RPR8Zkm2Sv&S;6}PUFMW9-YeyLG z3)$mLU3=!vvv7I&AKpMTtiOux=)3k_9PXG3a@k6shJ@%tazcKco(R4D;<^er>UB2 z^06_GrzuK{BzCGjyZ{Z?ct7$&00B~GL1wY>B~ZxKpCuVqcY@AkK3a}{0e6BkXAnZu z*iw|0u|QnbIRd@NMM6jYS+ox%NGa2{cjp;0V4`WRL}(q{j?Qv+Y{$Fa0^GFS==2CRF+hOxOF1OyL0uP>cNhmG5+^CAZl9O|;9DC~w7D3>P-o_CJ z9JzSyX$}05AzOpMvTJ!c?UyH!tY;WmQ*%oeUkkS9zLwy1Xm+-&-Rj^* zcf2&i6<0tYuk*X~5|?Wlh}`8bt3QlaTEs6eR(0yO06>+AM>Wqk?kn%<;;N70biOPp zJof1j)BVl+b*!|zldNgTe5cyt?0{=LQ0;pAlN07$MH+&6^MCzODtEC<`-^vN{{z#) z_JLSl&PCK!5iQ?d3bfm=Z&gQ2kYXZ!Z@u5eFl~L{xh}GO#KWB_QYoAJQHLtDqDAa8 z^7|S=(G8KmIsic&`UH%+4=Oe?4Np272qJl&%WYDe>)L(q2faRYI&;4^&_nkm1DR2S zF56QQ(K^8#gU^;Cm9^It^rl6d4Btaew7fQNqxemh|# zQrYB;H=dSYNPd}dJ^#dTq+#wLXr=hjxtZ5_YUReNar7TRi3_}TE+21k5Im#Rce8#n zTySD%&d^1-d2{T;VdyF=_5RHrIZy!rOo_V7^9;err<=%xo)qvK*Sj$lD;e8!b&KhD!k_g)Wx0O9oVlC;_L014x~c zW6U^xU%|@5qMyc+HgCeTzM;fjWjYUbR>H5SxQO_bbt)|X8E=#qDeayXp%eV}cnc9J zmJVu`w!9E{@pIv}hs<|b>tlkp(@N3}Ww&)l`xCE_o+PH)(?pT1Qc ztN%?&ip}W+53Htq7-B2zlnDau`7p$LU}bmX4KYlA+UX$|;=4 zM~e9lq4m8N}H@=Z>|>}N2-b2lA!{P>u5m=u<}6E)a{)O47krR@c~=IY%>aV46uJa3_b!U zoWz*|vD0)6fzGh2=O99>e7aT=$X{wjokHp{emJ6JLG`abg1YA*f zZa+h7)u_WoN@=-LJ?WjQn>EtB2#>p(jut!(xRTVo;W>-@Ewfk9nRSbRgB*vGhu-j- zSRo%b^Dc(+Hm%_fh~P_Y(oQ`rpT4kQv`t7ips3n!?(Q)r#q1j8NrZp~h5*aW z&rEZw{P|ai1DqUCpXI;oCrWV`R}N?{!t3}}dI6V58wCF*y$M6KJv~^6v{QRT2-4oO zYb)PsTJqNoxuH0zOlfG{q7uS37?TIP%nq4eo^te1K4#jrEmYh0<#5*o2Xd-a67wdy z!EkEdHc<3*%Eef;G5d@~yO=G{)Z4f=*5vZ6DB=n?{#c&VR;=`Q{-f1|8it!{i_8zb zl~{yUdTTNI zKJ)5q;w(7p!x4haMF~E84PRbU@MK&VaUKKPW=Q^j%tG>xNrv)!E3r4)N#A zZ@4}{gq!Rhon%>0MD#4aG~64Zgaw=iDgyLE1WbYR=4W_T!T_s12J>h`protect your blog from comment and trackback spam. It keeps your site protected from spam even while you sleep. To get started: 1) Click the "Activate" link to the left of this description, 2) Sign up for an Akismet API key, and 3) Go to your Akismet configuration page, and save your API key. +Version: 2.5.3 +Author: Automattic +Author URI: http://automattic.com/wordpress-plugins/ +License: GPLv2 or later +*/ + +/* +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. +*/ + +define('AKISMET_VERSION', '2.5.3'); +define('AKISMET_PLUGIN_URL', plugin_dir_url( __FILE__ )); + +/** If you hardcode a WP.com API key here, all key config screens will be hidden */ +if ( defined('WPCOM_API_KEY') ) + $wpcom_api_key = constant('WPCOM_API_KEY'); +else + $wpcom_api_key = ''; + +// Make sure we don't expose any info if called directly +if ( !function_exists( 'add_action' ) ) { + echo "Hi there! I'm just a plugin, not much I can do when called directly."; + exit; +} + +if ( isset($wp_db_version) && $wp_db_version <= 9872 ) + include_once dirname( __FILE__ ) . '/legacy.php'; + +include_once dirname( __FILE__ ) . '/widget.php'; + +if ( is_admin() ) + require_once dirname( __FILE__ ) . '/admin.php'; + +function akismet_init() { + global $wpcom_api_key, $akismet_api_host, $akismet_api_port; + + if ( $wpcom_api_key ) + $akismet_api_host = $wpcom_api_key . '.rest.akismet.com'; + else + $akismet_api_host = get_option('wordpress_api_key') . '.rest.akismet.com'; + + $akismet_api_port = 80; +} +add_action('init', 'akismet_init'); + +function akismet_get_key() { + global $wpcom_api_key; + if ( !empty($wpcom_api_key) ) + return $wpcom_api_key; + return get_option('wordpress_api_key'); +} + +function akismet_verify_key( $key, $ip = null ) { + global $akismet_api_host, $akismet_api_port, $wpcom_api_key; + $blog = urlencode( get_option('home') ); + if ( $wpcom_api_key ) + $key = $wpcom_api_key; + $response = akismet_http_post("key=$key&blog=$blog", 'rest.akismet.com', '/1.1/verify-key', $akismet_api_port, $ip); + if ( !is_array($response) || !isset($response[1]) || $response[1] != 'valid' && $response[1] != 'invalid' ) + return 'failed'; + return $response[1]; +} + +// if we're in debug or test modes, use a reduced service level so as not to polute training or stats data +function akismet_test_mode() { + if ( defined('AKISMET_TEST_MODE') && AKISMET_TEST_MODE ) + return true; + return false; +} + +// return a comma-separated list of role names for the given user +function akismet_get_user_roles($user_id ) { + $roles = false; + + if ( !class_exists('WP_User') ) + return false; + + if ( $user_id > 0 ) { + $comment_user = new WP_User($user_id); + if ( isset($comment_user->roles) ) + $roles = join(',', $comment_user->roles); + } + + if ( is_multisite() && is_super_admin( $user_id ) ) { + if ( empty( $roles ) ) { + $roles = 'super_admin'; + } else { + $comment_user->roles[] = 'super_admin'; + $roles = join( ',', $comment_user->roles ); + } + } + + return $roles; +} + +// Returns array with headers in $response[0] and body in $response[1] +function akismet_http_post($request, $host, $path, $port = 80, $ip=null) { + global $wp_version; + + $akismet_ua = "WordPress/{$wp_version} | "; + $akismet_ua .= 'Akismet/' . constant( 'AKISMET_VERSION' ); + + $content_length = strlen( $request ); + + $http_host = $host; + // use a specific IP if provided + // needed by akismet_check_server_connectivity() + if ( $ip && long2ip( ip2long( $ip ) ) ) { + $http_host = $ip; + } else { + $http_host = $host; + } + + // use the WP HTTP class if it is available + if ( function_exists( 'wp_remote_post' ) ) { + $http_args = array( + 'body' => $request, + 'headers' => array( + 'Content-Type' => 'application/x-www-form-urlencoded; ' . + 'charset=' . get_option( 'blog_charset' ), + 'Host' => $host, + 'User-Agent' => $akismet_ua + ), + 'httpversion' => '1.0', + 'timeout' => 15 + ); + $akismet_url = "http://{$http_host}{$path}"; + $response = wp_remote_post( $akismet_url, $http_args ); + if ( is_wp_error( $response ) ) + return ''; + + return array( $response['headers'], $response['body'] ); + } else { + $http_request = "POST $path HTTP/1.0\r\n"; + $http_request .= "Host: $host\r\n"; + $http_request .= 'Content-Type: application/x-www-form-urlencoded; charset=' . get_option('blog_charset') . "\r\n"; + $http_request .= "Content-Length: {$content_length}\r\n"; + $http_request .= "User-Agent: {$akismet_ua}\r\n"; + $http_request .= "\r\n"; + $http_request .= $request; + + $response = ''; + if( false != ( $fs = @fsockopen( $http_host, $port, $errno, $errstr, 10 ) ) ) { + fwrite( $fs, $http_request ); + + while ( !feof( $fs ) ) + $response .= fgets( $fs, 1160 ); // One TCP-IP packet + fclose( $fs ); + $response = explode( "\r\n\r\n", $response, 2 ); + } + return $response; + } +} + +// filter handler used to return a spam result to pre_comment_approved +function akismet_result_spam( $approved ) { + // bump the counter here instead of when the filter is added to reduce the possibility of overcounting + if ( $incr = apply_filters('akismet_spam_count_incr', 1) ) + update_option( 'akismet_spam_count', get_option('akismet_spam_count') + $incr ); + // this is a one-shot deal + remove_filter( 'pre_comment_approved', 'akismet_result_spam' ); + return 'spam'; +} + +function akismet_result_hold( $approved ) { + // once only + remove_filter( 'pre_comment_approved', 'akismet_result_hold' ); + return '0'; +} + +// how many approved comments does this author have? +function akismet_get_user_comments_approved( $user_id, $comment_author_email, $comment_author, $comment_author_url ) { + global $wpdb; + + if ( !empty($user_id) ) + return $wpdb->get_var( $wpdb->prepare( "SELECT COUNT(*) FROM $wpdb->comments WHERE user_id = %d AND comment_approved = 1", $user_id ) ); + + if ( !empty($comment_author_email) ) + return $wpdb->get_var( $wpdb->prepare( "SELECT COUNT(*) FROM $wpdb->comments WHERE comment_author_email = %s AND comment_author = %s AND comment_author_url = %s AND comment_approved = 1", $comment_author_email, $comment_author, $comment_author_url ) ); + + return 0; +} + +function akismet_microtime() { + $mtime = explode( ' ', microtime() ); + return $mtime[1] + $mtime[0]; +} + +// log an event for a given comment, storing it in comment_meta +function akismet_update_comment_history( $comment_id, $message, $event=null ) { + global $current_user; + + // failsafe for old WP versions + if ( !function_exists('add_comment_meta') ) + return false; + + $user = ''; + if ( is_object($current_user) && isset($current_user->user_login) ) + $user = $current_user->user_login; + + $event = array( + 'time' => akismet_microtime(), + 'message' => $message, + 'event' => $event, + 'user' => $user, + ); + + // $unique = false so as to allow multiple values per comment + $r = add_comment_meta( $comment_id, 'akismet_history', $event, false ); +} + +// get the full comment history for a given comment, as an array in reverse chronological order +function akismet_get_comment_history( $comment_id ) { + + // failsafe for old WP versions + if ( !function_exists('add_comment_meta') ) + return false; + + $history = get_comment_meta( $comment_id, 'akismet_history', false ); + usort( $history, 'akismet_cmp_time' ); + return $history; +} + +function akismet_cmp_time( $a, $b ) { + return $a['time'] > $b['time'] ? -1 : 1; +} + +// this fires on wp_insert_comment. we can't update comment_meta when akismet_auto_check_comment() runs +// because we don't know the comment ID at that point. +function akismet_auto_check_update_meta( $id, $comment ) { + global $akismet_last_comment; + + // failsafe for old WP versions + if ( !function_exists('add_comment_meta') ) + return false; + + // wp_insert_comment() might be called in other contexts, so make sure this is the same comment + // as was checked by akismet_auto_check_comment + if ( is_object($comment) && !empty($akismet_last_comment) && is_array($akismet_last_comment) ) { + if ( intval($akismet_last_comment['comment_post_ID']) == intval($comment->comment_post_ID) + && $akismet_last_comment['comment_author'] == $comment->comment_author + && $akismet_last_comment['comment_author_email'] == $comment->comment_author_email ) { + // normal result: true or false + if ( $akismet_last_comment['akismet_result'] == 'true' ) { + update_comment_meta( $comment->comment_ID, 'akismet_result', 'true' ); + akismet_update_comment_history( $comment->comment_ID, __('Akismet caught this comment as spam'), 'check-spam' ); + if ( $comment->comment_approved != 'spam' ) + akismet_update_comment_history( $comment->comment_ID, sprintf( __('Comment status was changed to %s'), $comment->comment_approved), 'status-changed'.$comment->comment_approved ); + } elseif ( $akismet_last_comment['akismet_result'] == 'false' ) { + update_comment_meta( $comment->comment_ID, 'akismet_result', 'false' ); + akismet_update_comment_history( $comment->comment_ID, __('Akismet cleared this comment'), 'check-ham' ); + if ( $comment->comment_approved == 'spam' ) { + if ( wp_blacklist_check($comment->comment_author, $comment->comment_author_email, $comment->comment_author_url, $comment->comment_content, $comment->comment_author_IP, $comment->comment_agent) ) + akismet_update_comment_history( $comment->comment_ID, __('Comment was caught by wp_blacklist_check'), 'wp-blacklisted' ); + else + akismet_update_comment_history( $comment->comment_ID, sprintf( __('Comment status was changed to %s'), $comment->comment_approved), 'status-changed-'.$comment->comment_approved ); + } + // abnormal result: error + } else { + update_comment_meta( $comment->comment_ID, 'akismet_error', time() ); + akismet_update_comment_history( $comment->comment_ID, sprintf( __('Akismet was unable to check this comment (response: %s), will automatically retry again later.'), $akismet_last_comment['akismet_result']), 'check-error' ); + } + + // record the complete original data as submitted for checking + if ( isset($akismet_last_comment['comment_as_submitted']) ) + update_comment_meta( $comment->comment_ID, 'akismet_as_submitted', $akismet_last_comment['comment_as_submitted'] ); + } + } +} + +add_action( 'wp_insert_comment', 'akismet_auto_check_update_meta', 10, 2 ); + + +function akismet_auto_check_comment( $commentdata ) { + global $akismet_api_host, $akismet_api_port, $akismet_last_comment; + + $comment = $commentdata; + $comment['user_ip'] = $_SERVER['REMOTE_ADDR']; + $comment['user_agent'] = $_SERVER['HTTP_USER_AGENT']; + $comment['referrer'] = $_SERVER['HTTP_REFERER']; + $comment['blog'] = get_option('home'); + $comment['blog_lang'] = get_locale(); + $comment['blog_charset'] = get_option('blog_charset'); + $comment['permalink'] = get_permalink($comment['comment_post_ID']); + + $comment['user_role'] = akismet_get_user_roles($comment['user_ID']); + + $akismet_nonce_option = apply_filters( 'akismet_comment_nonce', get_option( 'akismet_comment_nonce' ) ); + $comment['akismet_comment_nonce'] = 'inactive'; + if ( $akismet_nonce_option == 'true' || $akismet_nonce_option == '' ) { + $comment['akismet_comment_nonce'] = 'failed'; + if ( isset( $_POST['akismet_comment_nonce'] ) && wp_verify_nonce( $_POST['akismet_comment_nonce'], 'akismet_comment_nonce_' . $comment['comment_post_ID'] ) ) + $comment['akismet_comment_nonce'] = 'passed'; + + // comment reply in wp-admin + if ( isset( $_POST['_ajax_nonce-replyto-comment'] ) && check_ajax_referer( 'replyto-comment', '_ajax_nonce-replyto-comment' ) ) + $comment['akismet_comment_nonce'] = 'passed'; + + } + + if ( akismet_test_mode() ) + $comment['is_test'] = 'true'; + + foreach ($_POST as $key => $value ) { + if ( is_string($value) ) + $comment["POST_{$key}"] = $value; + } + + $ignore = array( 'HTTP_COOKIE', 'HTTP_COOKIE2', 'PHP_AUTH_PW' ); + + foreach ( $_SERVER as $key => $value ) { + if ( !in_array( $key, $ignore ) && is_string($value) ) + $comment["$key"] = $value; + else + $comment["$key"] = ''; + } + + $query_string = ''; + foreach ( $comment as $key => $data ) + $query_string .= $key . '=' . urlencode( stripslashes($data) ) . '&'; + + $commentdata['comment_as_submitted'] = $comment; + + $response = akismet_http_post($query_string, $akismet_api_host, '/1.1/comment-check', $akismet_api_port); + $commentdata['akismet_result'] = $response[1]; + if ( 'true' == $response[1] ) { + // akismet_spam_count will be incremented later by akismet_result_spam() + add_filter('pre_comment_approved', 'akismet_result_spam'); + + do_action( 'akismet_spam_caught' ); + + $post = get_post( $comment['comment_post_ID'] ); + $last_updated = strtotime( $post->post_modified_gmt ); + $diff = time() - $last_updated; + $diff = $diff / 86400; + + if ( $post->post_type == 'post' && $diff > 30 && get_option( 'akismet_discard_month' ) == 'true' && empty($comment['user_ID']) ) { + // akismet_result_spam() won't be called so bump the counter here + if ( $incr = apply_filters('akismet_spam_count_incr', 1) ) + update_option( 'akismet_spam_count', get_option('akismet_spam_count') + $incr ); + wp_redirect( $_SERVER['HTTP_REFERER'] ); + die(); + } + } + + // if the response is neither true nor false, hold the comment for moderation and schedule a recheck + if ( 'true' != $response[1] && 'false' != $response[1] ) { + add_filter('pre_comment_approved', 'akismet_result_hold'); + wp_schedule_single_event( time() + 1200, 'akismet_schedule_cron_recheck' ); + } + + if ( function_exists('wp_next_scheduled') && function_exists('wp_schedule_event') ) { + // WP 2.1+: delete old comments daily + if ( !wp_next_scheduled('akismet_scheduled_delete') ) + wp_schedule_event(time(), 'daily', 'akismet_scheduled_delete'); + } elseif ( (mt_rand(1, 10) == 3) ) { + // WP 2.0: run this one time in ten + akismet_delete_old(); + } + $akismet_last_comment = $commentdata; + return $commentdata; +} + +add_action('preprocess_comment', 'akismet_auto_check_comment', 1); + +function akismet_delete_old() { + global $wpdb; + $now_gmt = current_time('mysql', 1); + $comment_ids = $wpdb->get_col("SELECT comment_id FROM $wpdb->comments WHERE DATE_SUB('$now_gmt', INTERVAL 15 DAY) > comment_date_gmt AND comment_approved = 'spam'"); + if ( empty( $comment_ids ) ) + return; + + $comma_comment_ids = implode( ', ', array_map('intval', $comment_ids) ); + + do_action( 'delete_comment', $comment_ids ); + $wpdb->query("DELETE FROM $wpdb->comments WHERE comment_id IN ( $comma_comment_ids )"); + $wpdb->query("DELETE FROM $wpdb->commentmeta WHERE comment_id IN ( $comma_comment_ids )"); + clean_comment_cache( $comment_ids ); + $n = mt_rand(1, 5000); + if ( apply_filters('akismet_optimize_table', ($n == 11)) ) // lucky number + $wpdb->query("OPTIMIZE TABLE $wpdb->comments"); + +} + +add_action('akismet_scheduled_delete', 'akismet_delete_old'); + +function akismet_check_db_comment( $id, $recheck_reason = 'recheck_queue' ) { + global $wpdb, $akismet_api_host, $akismet_api_port; + + $id = (int) $id; + $c = $wpdb->get_row( "SELECT * FROM $wpdb->comments WHERE comment_ID = '$id'", ARRAY_A ); + if ( !$c ) + return; + + $c['user_ip'] = $c['comment_author_IP']; + $c['user_agent'] = $c['comment_agent']; + $c['referrer'] = ''; + $c['blog'] = get_option('home'); + $c['blog_lang'] = get_locale(); + $c['blog_charset'] = get_option('blog_charset'); + $c['permalink'] = get_permalink($c['comment_post_ID']); + $id = $c['comment_ID']; + if ( akismet_test_mode() ) + $c['is_test'] = 'true'; + $c['recheck_reason'] = $recheck_reason; + + $query_string = ''; + foreach ( $c as $key => $data ) + $query_string .= $key . '=' . urlencode( stripslashes($data) ) . '&'; + + $response = akismet_http_post($query_string, $akismet_api_host, '/1.1/comment-check', $akismet_api_port); + return $response[1]; +} + +function akismet_cron_recheck() { + global $wpdb; + + delete_option('akismet_available_servers'); + + $comment_errors = $wpdb->get_col( " + SELECT comment_id + FROM {$wpdb->prefix}commentmeta + WHERE meta_key = 'akismet_error' + LIMIT 100 + " ); + + foreach ( (array) $comment_errors as $comment_id ) { + // if the comment no longer exists, remove the meta entry from the queue to avoid getting stuck + if ( !get_comment( $comment_id ) ) { + delete_comment_meta( $comment_id, 'akismet_error' ); + continue; + } + + add_comment_meta( $comment_id, 'akismet_rechecking', true ); + $status = akismet_check_db_comment( $comment_id, 'retry' ); + + $msg = ''; + if ( $status == 'true' ) { + $msg = __( 'Akismet caught this comment as spam during an automatic retry.' ); + } elseif ( $status == 'false' ) { + $msg = __( 'Akismet cleared this comment during an automatic retry.' ); + } + + // If we got back a legit response then update the comment history + // other wise just bail now and try again later. No point in + // re-trying all the comments once we hit one failure. + if ( !empty( $msg ) ) { + delete_comment_meta( $comment_id, 'akismet_error' ); + akismet_update_comment_history( $comment_id, $msg, 'cron-retry' ); + update_comment_meta( $comment_id, 'akismet_result', $status ); + // make sure the comment status is still pending. if it isn't, that means the user has already moved it elsewhere. + $comment = get_comment( $comment_id ); + if ( $comment && 'unapproved' == wp_get_comment_status( $comment_id ) ) { + if ( $status == 'true' ) { + wp_spam_comment( $comment_id ); + } elseif ( $status == 'false' ) { + // comment is good, but it's still in the pending queue. depending on the moderation settings + // we may need to change it to approved. + if ( check_comment($comment->comment_author, $comment->comment_author_email, $comment->comment_author_url, $comment->comment_content, $comment->comment_author_IP, $comment->comment_agent, $comment->comment_type) ) + wp_set_comment_status( $comment_id, 1 ); + } + } + } else { + delete_comment_meta( $comment_id, 'akismet_rechecking' ); + wp_schedule_single_event( time() + 1200, 'akismet_schedule_cron_recheck' ); + return; + } + } + + $remaining = $wpdb->get_var( $wpdb->prepare( "SELECT COUNT(*) FROM $wpdb->commentmeta WHERE meta_key = 'akismet_error'" ) ); + if ( $remaining && !wp_next_scheduled('akismet_schedule_cron_recheck') ) { + wp_schedule_single_event( time() + 1200, 'akismet_schedule_cron_recheck' ); + } +} +add_action( 'akismet_schedule_cron_recheck', 'akismet_cron_recheck' ); + +function akismet_add_comment_nonce( $post_id ) { + echo '

    '; + wp_nonce_field( 'akismet_comment_nonce_' . $post_id, 'akismet_comment_nonce', FALSE ); + echo '

    '; +} + +$akismet_comment_nonce_option = apply_filters( 'akismet_comment_nonce', get_option( 'akismet_comment_nonce' ) ); + +if ( $akismet_comment_nonce_option == 'true' || $akismet_comment_nonce_option == '' ) + add_action( 'comment_form', 'akismet_add_comment_nonce' ); + +if ( '3.0.5' == $wp_version ) { + remove_filter( 'comment_text', 'wp_kses_data' ); + if ( is_admin() ) + add_filter( 'comment_text', 'wp_kses_post' ); +} diff --git a/src/wp-content/plugins/akismet/legacy.php b/src/wp-content/plugins/akismet/legacy.php new file mode 100644 index 0000000..d5d53b0 --- /dev/null +++ b/src/wp-content/plugins/akismet/legacy.php @@ -0,0 +1,396 @@ +escape( $type ); + return $wpdb->get_results( "SELECT * FROM $wpdb->comments WHERE comment_approved = 'spam' AND comment_type='$type' ORDER BY comment_date DESC LIMIT $start, $end"); + } + + // All + return $wpdb->get_results( "SELECT * FROM $wpdb->comments WHERE comment_approved = 'spam' ORDER BY comment_date DESC LIMIT $start, $end"); +} + +// Totals for each comment type +// returns array( type => count, ... ) +function akismet_spam_totals() { + global $wpdb; + $totals = $wpdb->get_results( "SELECT comment_type, COUNT(*) AS cc FROM $wpdb->comments WHERE comment_approved = 'spam' GROUP BY comment_type" ); + $return = array(); + foreach ( $totals as $total ) + $return[$total->comment_type ? $total->comment_type : 'comment'] = $total->cc; + return $return; +} + +function akismet_manage_page() { + global $wpdb, $submenu, $wp_db_version; + + // WP 2.7 has its own spam management page + if ( 8645 <= $wp_db_version ) + return; + + $count = sprintf(__('Akismet Spam (%s)'), akismet_spam_count()); + if ( isset( $submenu['edit-comments.php'] ) ) + add_submenu_page('edit-comments.php', __('Akismet Spam'), $count, 'moderate_comments', 'akismet-admin', 'akismet_caught' ); + elseif ( function_exists('add_management_page') ) + add_management_page(__('Akismet Spam'), $count, 'moderate_comments', 'akismet-admin', 'akismet_caught'); +} + +function akismet_caught() { + global $wpdb, $comment, $akismet_caught, $akismet_nonce; + + akismet_recheck_queue(); + if (isset($_POST['submit']) && 'recover' == $_POST['action'] && ! empty($_POST['not_spam'])) { + check_admin_referer( $akismet_nonce ); + if ( function_exists('current_user_can') && !current_user_can('moderate_comments') ) + die(__('You do not have sufficient permission to moderate comments.')); + + $i = 0; + foreach ($_POST['not_spam'] as $comment): + $comment = (int) $comment; + if ( function_exists('wp_set_comment_status') ) + wp_set_comment_status($comment, 'approve'); + else + $wpdb->query("UPDATE $wpdb->comments SET comment_approved = '1' WHERE comment_ID = '$comment'"); + akismet_submit_nonspam_comment($comment); + ++$i; + endforeach; + $to = add_query_arg( 'recovered', $i, $_SERVER['HTTP_REFERER'] ); + wp_redirect( $to ); + exit; + } + if ('delete' == $_POST['action']) { + check_admin_referer( $akismet_nonce ); + if ( function_exists('current_user_can') && !current_user_can('moderate_comments') ) + die(__('You do not have sufficient permission to moderate comments.')); + + $delete_time = $wpdb->escape( $_POST['display_time'] ); + $comment_ids = $wpdb->get_col( "SELECT comment_id FROM $wpdb->comments WHERE comment_approved = 'spam' AND '$delete_time' > comment_date_gmt" ); + if ( !empty( $comment_ids ) ) { + do_action( 'delete_comment', $comment_ids ); + $wpdb->query( "DELETE FROM $wpdb->comments WHERE comment_id IN ( " . implode( ', ', $comment_ids ) . " )"); + wp_cache_delete( 'akismet_spam_count', 'widget' ); + } + $to = add_query_arg( 'deleted', 'all', $_SERVER['HTTP_REFERER'] ); + wp_redirect( $to ); + exit; + } + +if ( isset( $_GET['recovered'] ) ) { + $i = (int) $_GET['recovered']; + echo '

    ' . sprintf(__('%1$s comments recovered.'), $i) . "

    "; +} + +if (isset( $_GET['deleted'] ) ) + echo '

    ' . __('All spam deleted.') . '

    '; + +if ( isset( $GLOBALS['submenu']['edit-comments.php'] ) ) + $link = 'edit-comments.php'; +else + $link = 'edit.php'; +?> + +
    +

    + +

    %1$s spam for you since you first installed it.'), number_format_i18n($count) ); ?>

    +'.__('You have no spam currently in the queue. Must be your lucky day. :)').'

    '; + echo '
    '; +} else { + echo '

    '.__('You can delete all of the spam from your database with a single click. This operation cannot be undone, so you may wish to check to ensure that no legitimate comments got through first. Spam is automatically deleted after 15 days, so don’t sweat it.').'

    '; +?> + +
    + + +    + +
    + +
    +
    + +

    + +'.__('These are the latest comments identified as spam by Akismet. If you see any mistakes, simply mark the comment as "not spam" and Akismet will learn from the submission. If you wish to recover a comment from spam, simply select the comment, and click Not Spam. After 15 days we clean out the junk for you.').'

    '; ?> + +escape($_POST['s']); + $comments = $wpdb->get_results("SELECT * FROM $wpdb->comments WHERE + (comment_author LIKE '%$s%' OR + comment_author_email LIKE '%$s%' OR + comment_author_url LIKE ('%$s%') OR + comment_author_IP LIKE ('%$s%') OR + comment_content LIKE ('%$s%') ) AND + comment_approved = 'spam' + ORDER BY comment_date DESC"); +} else { + if ( isset( $_GET['apage'] ) ) + $page = (int) $_GET['apage']; + else + $page = 1; + + if ( $page < 2 ) + $page = 1; + + $current_type = false; + if ( isset( $_GET['ctype'] ) ) + $current_type = preg_replace( '|[^a-z]|', '', $_GET['ctype'] ); + + $comments = akismet_spam_comments( $current_type, $page ); + $total = akismet_spam_count( $current_type ); + $totals = akismet_spam_totals(); +?> +
      +
    • >
    • + $type_count ) { + if ( 'comment' == $type ) { + $type = 'comments'; + $show = __('Comments'); + } else { + $show = ucwords( $type ); + } + $type_count = number_format_i18n( $type_count ); + $extra = $current_type === $type ? ' class="active"' : ''; + echo "
    • $show ($type_count)
    • "; +} +do_action( 'akismet_tabs' ); // so plugins can add more tabs easily +?> +
    + +
    " id="akismetsearch"> +

    +

    +
    + 50 ) { +$total_pages = ceil( $total / 50 ); +$r = ''; +if ( 1 < $page ) { + $args['apage'] = ( 1 == $page - 1 ) ? '' : $page - 1; + $r .= '' . "\n"; +} +if ( ( $total_pages = ceil( $total / 50 ) ) > 1 ) { + for ( $page_num = 1; $page_num <= $total_pages; $page_num++ ) : + if ( $page == $page_num ) : + $r .= "$page_num\n"; + else : + $p = false; + if ( $page_num < 3 || ( $page_num >= $page - 3 && $page_num <= $page + 3 ) || $page_num > $total_pages - 3 ) : + $args['apage'] = ( 1 == $page_num ) ? '' : $page_num; + $r .= '' . ( $page_num ) . "\n"; + $in = true; + elseif ( $in == true ) : + $r .= "...\n"; + $in = false; + endif; + endif; + endfor; +} +if ( ( $page ) * 50 < $total || -1 == $total ) { + $args['apage'] = $page + 1; + $r .= '' . "\n"; +} +echo "

    $r

    "; +?> + + +
    + + +
      +comment_date); + $post = get_post($comment->comment_post_ID); + $post_title = $post->post_title; + if ($i % 2) $class = 'class="alternate"'; + else $class = ''; + echo "\n\t
    • "; + ?> + +

      comment_author_email) { ?>| comment_author_url && 'http://' != $comment->comment_author_url) { ?> | |

      + + + +

      — [ +comment_post_ID); +$post_title = wp_specialchars( $post->post_title, 'double' ); +$post_title = ('' == $post_title) ? "# $comment->comment_post_ID" : $post_title; +?> + ]

      + + + +
    + 50 ) { +$total_pages = ceil( $total / 50 ); +$r = ''; +if ( 1 < $page ) { + $args['apage'] = ( 1 == $page - 1 ) ? '' : $page - 1; + $r .= '' . "\n"; +} +if ( ( $total_pages = ceil( $total / 50 ) ) > 1 ) { + for ( $page_num = 1; $page_num <= $total_pages; $page_num++ ) : + if ( $page == $page_num ) : + $r .= "$page_num\n"; + else : + $p = false; + if ( $page_num < 3 || ( $page_num >= $page - 3 && $page_num <= $page + 3 ) || $page_num > $total_pages - 3 ) : + $args['apage'] = ( 1 == $page_num ) ? '' : $page_num; + $r .= '' . ( $page_num ) . "\n"; + $in = true; + elseif ( $in == true ) : + $r .= "...\n"; + $in = false; + endif; + endif; + endfor; +} +if ( ( $page ) * 50 < $total || -1 == $total ) { + $args['apage'] = $page + 1; + $r .= '' . "\n"; +} +echo "

    $r

    "; +} +?> +

    + +

    +

    +
    + +

    + + + +
    + +

    +    +

    +
    + +
    +" . __('Recheck Queue for Spam') . ""; + $page = str_replace( '
    ', '
    ' . $button, $page ); + return $page; + } + + if ( $wpdb->get_var( "SELECT COUNT(*) FROM $wpdb->comments WHERE comment_approved = '0'" ) ) + ob_start( 'akismet_recheck_button' ); +} + +// This option causes tons of FPs, was removed in 2.1 +function akismet_kill_proxy_check( $option ) { return 0; } +add_filter('option_open_proxy_check', 'akismet_kill_proxy_check'); diff --git a/src/wp-content/plugins/akismet/readme.txt b/src/wp-content/plugins/akismet/readme.txt new file mode 100644 index 0000000..fbd3513 --- /dev/null +++ b/src/wp-content/plugins/akismet/readme.txt @@ -0,0 +1,130 @@ +=== Akismet === +Contributors: matt, ryan, andy, mdawaffe, tellyworth, josephscott, lessbloat, automattic +Tags: akismet, comments, spam +Requires at least: 3.0 +Tested up to: 3.1 +Stable tag: 2.5.3 +License: GPLv2 or later + +Akismet checks your comments against the Akismet web service to see if they look like spam or not. + +== Description == + +Akismet checks your comments against the Akismet web service to see if they look like spam or not and lets you +review the spam it catches under your blog's "Comments" admin screen. + +Major new features in Akismet 2.5 include: + +* A comment status history, so you can easily see which comments were caught or cleared by Akismet, and which were spammed or unspammed by a moderator +* Links are highlighted in the comment body, to reveal hidden or misleading links +* If your web host is unable to reach Akismet's servers, the plugin will automatically retry when your connection is back up +* Moderators can see the number of approved comments for each user +* Spam and Unspam reports now include more information, to help improve accuracy + +PS: You'll need an [Akismet.com API key](http://akismet.com/get/) to use it. Keys are free for personal blogs, with paid subscriptions available for businesses and commercial sites. + +== Installation == + +Upload the Akismet plugin to your blog, Activate it, then enter your [Akismet.com API key](http://akismet.com/get/). + +1, 2, 3: You're done! + +== Changelog == + += 2.5.3 = +* Specify the license is GPL v2 or later +* Fix a bug that could result in orphaned commentmeta entries +* Include hotfix for WordPress 3.0.5 filter issue + += 2.5.2 = + +* Properly format the comment count for author counts +* Look for super admins on multisite installs when looking up user roles +* Increase the HTTP request timeout +* Removed padding for author approved count +* Fix typo in function name +* Set Akismet stats iframe height to fixed 2500px. Better to have one tall scroll bar than two side by side. + += 2.5.1 = + +* Fix a bug that caused the "Auto delete" option to fail to discard comments correctly +* Remove the comment nonce form field from the 'Akismet Configuration' page in favor of using a filter, akismet_comment_nonce +* Fixed padding bug in "author" column of posts screen +* Added margin-top to "cleared by ..." badges on dashboard +* Fix possible error when calling akismet_cron_recheck() +* Fix more PHP warnings +* Clean up XHTML warnings for comment nonce +* Fix for possible condition where scheduled comment re-checks could get stuck +* Clean up the comment meta details after deleting a comment +* Only show the status badge if the comment status has been changed by someone/something other than Akismet +* Show a 'History' link in the row-actions +* Translation fixes +* Reduced font-size on author name +* Moved "flagged by..." notification to top right corner of comment container and removed heavy styling +* Hid "flagged by..." notification while on dashboard + += 2.5.0 = + +* Track comment actions under 'Akismet Status' on the edit comment screen +* Fix a few remaining deprecated function calls ( props Mike Glendinning ) +* Use HTTPS for the stats IFRAME when wp-admin is using HTTPS +* Use the WordPress HTTP class if available +* Move the admin UI code to a separate file, only loaded when needed +* Add cron retry feature, to replace the old connectivity check +* Display Akismet status badge beside each comment +* Record history for each comment, and display it on the edit page +* Record the complete comment as originally submitted in comment_meta, to use when reporting spam and ham +* Highlight links in comment content +* New option, "Show the number of comments you've approved beside each comment author." +* New option, "Use a nonce on the comment form." + += 2.4.0 = + +* Spell out that the license is GPLv2 +* Fix PHP warnings +* Fix WordPress deprecated function calls +* Fire the delete_comment action when deleting comments +* Move code specific for older WP versions to legacy.php +* General code clean up + += 2.3.0 = + +* Fix "Are you sure" nonce message on config screen in WPMU +* Fix XHTML compliance issue in sidebar widget +* Change author link; remove some old references to WordPress.com accounts +* Localize the widget title (core ticket #13879) + += 2.2.9 = + +* Eliminate a potential conflict with some plugins that may cause spurious reports + += 2.2.8 = + +* Fix bug in initial comment check for ipv6 addresses +* Report comments as ham when they are moved from spam to moderation +* Report comments as ham when clicking undo after spam +* Use transition_comment_status action when available instead of older actions for spam/ham submissions +* Better diagnostic messages when PHP network functions are unavailable +* Better handling of comments by logged-in users + += 2.2.7 = + +* Add a new AKISMET_VERSION constant +* Reduce the possibility of over-counting spam when another spam filter plugin is in use +* Disable the connectivity check when the API key is hard-coded for WPMU + += 2.2.6 = + +* Fix a global warning introduced in 2.2.5 +* Add changelog and additional readme.txt tags +* Fix an array conversion warning in some versions of PHP +* Support a new WPCOM_API_KEY constant for easier use with WordPress MU + += 2.2.5 = + +* Include a new Server Connectivity diagnostic check, to detect problems caused by firewalls + += 2.2.4 = + +* Fixed a key problem affecting the stats feature in WordPress MU +* Provide additional blog information in Akismet API calls diff --git a/src/wp-content/plugins/akismet/widget.php b/src/wp-content/plugins/akismet/widget.php new file mode 100644 index 0000000..e9a3f62 --- /dev/null +++ b/src/wp-content/plugins/akismet/widget.php @@ -0,0 +1,90 @@ + + + + + + + + +

    + + + +
    ', '', $count ), number_format_i18n( $count ) ); +} diff --git a/src/wp-content/plugins/hello.php b/src/wp-content/plugins/hello.php new file mode 100644 index 0000000..d2287e2 --- /dev/null +++ b/src/wp-content/plugins/hello.php @@ -0,0 +1,82 @@ +Hello, Dolly in the upper right of your admin screen on every page. +Author: Matt Mullenweg +Version: 1.6 +Author URI: http://ma.tt/ +*/ + +function hello_dolly_get_lyric() { + /** These are the lyrics to Hello Dolly */ + $lyrics = "Hello, Dolly +Well, hello, Dolly +It's so nice to have you back where you belong +You're lookin' swell, Dolly +I can tell, Dolly +You're still glowin', you're still crowin' +You're still goin' strong +We feel the room swayin' +While the band's playin' +One of your old favourite songs from way back when +So, take her wrap, fellas +Find her an empty lap, fellas +Dolly'll never go away again +Hello, Dolly +Well, hello, Dolly +It's so nice to have you back where you belong +You're lookin' swell, Dolly +I can tell, Dolly +You're still glowin', you're still crowin' +You're still goin' strong +We feel the room swayin' +While the band's playin' +One of your old favourite songs from way back when +Golly, gee, fellas +Find her a vacant knee, fellas +Dolly'll never go away +Dolly'll never go away +Dolly'll never go away again"; + + // Here we split it into lines + $lyrics = explode( "\n", $lyrics ); + + // And then randomly choose a line + return wptexturize( $lyrics[ mt_rand( 0, count( $lyrics ) - 1 ) ] ); +} + +// This just echoes the chosen line, we'll position it later +function hello_dolly() { + $chosen = hello_dolly_get_lyric(); + echo "

    $chosen

    "; +} + +// Now we set that function up to execute when the admin_notices action is called +add_action( 'admin_notices', 'hello_dolly' ); + +// We need some CSS to position the paragraph +function dolly_css() { + // This makes sure that the positioning is also good for right-to-left languages + $x = is_rtl() ? 'left' : 'right'; + + echo " + + "; +} + +add_action( 'admin_head', 'dolly_css' ); + +?> diff --git a/src/wp-content/plugins/index.php b/src/wp-content/plugins/index.php new file mode 100644 index 0000000..4e6c07c --- /dev/null +++ b/src/wp-content/plugins/index.php @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/src/wp-content/themes/index.php b/src/wp-content/themes/index.php new file mode 100644 index 0000000..4e6c07c --- /dev/null +++ b/src/wp-content/themes/index.php @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/src/wp-content/themes/twentyeleven/404.php b/src/wp-content/themes/twentyeleven/404.php new file mode 100644 index 0000000..03e0651 --- /dev/null +++ b/src/wp-content/themes/twentyeleven/404.php @@ -0,0 +1,48 @@ + + +
    +
    + +
    +
    +

    +
    + +
    +

    + + + + 10 ), array( 'widget_id' => '404' ) ); ?> + +
    +

    +
      + 'count', 'order' => 'DESC', 'show_count' => 1, 'title_li' => '', 'number' => 10 ) ); ?> +
    +
    + + ' . sprintf( __( 'Try looking in the monthly archives. %1$s', 'twentyeleven' ), convert_smilies( ':)' ) ) . '

    '; + the_widget( 'WP_Widget_Archives', array('count' => 0 , 'dropdown' => 1 ), array( 'after_title' => ''.$archive_content ) ); + ?> + + + +
    +
    + +
    +
    + + \ No newline at end of file diff --git a/src/wp-content/themes/twentyeleven/archive.php b/src/wp-content/themes/twentyeleven/archive.php new file mode 100644 index 0000000..22873b6 --- /dev/null +++ b/src/wp-content/themes/twentyeleven/archive.php @@ -0,0 +1,72 @@ + + +
    +
    + + + + + + + + + + + + + + + + + + +
    +
    +

    +
    + +
    +

    + +
    +
    + + + +
    +
    + + + \ No newline at end of file diff --git a/src/wp-content/themes/twentyeleven/author.php b/src/wp-content/themes/twentyeleven/author.php new file mode 100644 index 0000000..f9a2bfd --- /dev/null +++ b/src/wp-content/themes/twentyeleven/author.php @@ -0,0 +1,89 @@ + + +
    +
    + + + + + + + + + + + + +
    +
    + +
    +
    +

    + +
    +
    + + + + + + + + + + + + + +
    +
    +

    +
    + +
    +

    + +
    +
    + + + +
    +
    + + + \ No newline at end of file diff --git a/src/wp-content/themes/twentyeleven/category.php b/src/wp-content/themes/twentyeleven/category.php new file mode 100644 index 0000000..539cbbd --- /dev/null +++ b/src/wp-content/themes/twentyeleven/category.php @@ -0,0 +1,65 @@ + + +
    +
    + + + +
    ' ); + ?> + + + + + + + + + + + + + + + +
    +
    +

    +
    + +
    +

    + +
    +
    + + + +
    + + + + diff --git a/src/wp-content/themes/twentyeleven/colors/dark.css b/src/wp-content/themes/twentyeleven/colors/dark.css new file mode 100644 index 0000000..c2b35e8 --- /dev/null +++ b/src/wp-content/themes/twentyeleven/colors/dark.css @@ -0,0 +1,618 @@ +/* + A dark color scheme for Twenty Eleven +*/ + +/* =Global +----------------------------------------------- */ + +body { + background: #1d1d1d; + color: #bbb; +} +#page { + background: #0f0f0f; +} + +/* Headings */ +hr { + background-color: #333; +} + +/* Text elements */ +blockquote cite { + color: #999; +} +pre { + background: #0b0b0b; +} +code, kbd { + font: 13px Monaco, Consolas, "Andale Mono", "DejaVu Sans Mono", monospace; +} +abbr, acronym, dfn { + border-bottom: 1px dotted #999; +} +ins { + background: #00063f; +} +input[type=text], +.post-password-required input[type=password], +textarea { + border: 1px solid #222; +} +input[type=text]:focus, +textarea:focus { +} +input#s { + background-color: #ddd; +} + +/* Links */ +a { +} + + +/* =Header +----------------------------------------------- */ + +#branding { + border-top: 2px solid #0a0a0a; +} +#site-title a { + color: #eee; +} +#site-title a:hover, +#site-title a:focus, +#site-title a:active { +} +#site-description { + color: #858585; +} +#branding #s { + background-color: #ddd; +} + + +/* =Menu +----------------------------------------------- */ + +#access { + background: #333; /* Show a solid color for older browsers */ + background: -moz-linear-gradient(#383838, #272727); + background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#383838), to(#272727)); /* older webkit syntax */ + background: -webkit-linear-gradient(#383838, #272727); + border-bottom: 1px solid #222; +} + +/* =Content +----------------------------------------------- */ + +.page-title { + color: #ccc; +} +.hentry { + border-color: #222; +} +.entry-title { + color: #ddd; +} +.entry-title, +.entry-title a { + color: #ddd; +} +.entry-title a:hover, +.entry-title a:focus, +.entry-title a:active { +} +.entry-meta { + color: #999; +} +.entry-content h1, +.entry-content h2, +.comment-content h1, +.comment-content h2 { + color: #fff; +} +.entry-content table, +.comment-content table { + border-color: #222; +} +.entry-content th, +.comment-content th { + color: #999; +} +.entry-content td, +.comment-content td { + border-color: #222; +} +.page-link { +} +.page-link a { + background: #242424; + color: #bbb; +} +.page-link a:hover { + background: #999; + color: #000; +} +.entry-meta .edit-link a { + background: #242424; + color: #bbb; +} +.entry-meta .edit-link a:hover, +.entry-meta .edit-link a:focus, +.entry-meta .edit-link a:active { + background: #999; + color: #000; +} + +/* Images */ +.wp-caption { + background: #2c2c2c; +} +.wp-caption .wp-caption-text { + color: #999; +} +.wp-caption .wp-caption-text:before { + color: #999; +} + +/* Image borders */ +img[class*="wp-image-"], +#content .gallery .gallery-icon img { + border-color: #2c2c2c; +} +.wp-caption img { + border-color: #2c2c2c; +} +a:focus img[class*="wp-image-"], +a:hover img[class*="wp-image-"], +a:active img[class*="wp-image-"] { + background: #2c2c2c; + border-color: #444; +} +.wp-caption a:focus img, +.wp-caption a:active img, +.wp-caption a:hover img { + background: #0f0f0f; + border-color: #2c2c2c; +} + +/* Password Protected Posts */ +.post-password-required input[type=password] { + background: #ddd; +} +.post-password-required input[type=password]:focus { + background: #fff; +} + +/* Author Info */ +.singular #author-info { + background: #060606; + border-color: #222; +} +.archive #author-info { + border-color: #222; +} +#author-avatar img { + background: #000; + -webkit-box-shadow: 0 1px 2px #444; + -moz-box-shadow: 0 1px 2px #444; + box-shadow: 0 1px 2px #444; +} +#author-description h2 { + color: #fff; +} + +/* Comments link */ +.entry-header .comments-link a { + background: #282828 url(../images/comment-bubble-dark.png) no-repeat; + border-color: #222; + color: #888; +} + +.rtl .entry-header .comments-link a { + background-image: url(../images/comment-bubble-dark-rtl.png); +} +/* Singular content styles for Posts and Pages */ +.singular .entry-title { + color: #fff; +} + + +/* =Status +----------------------------------------------- */ + +.format-status img.avatar { + -webkit-box-shadow: 0 1px 2px #333; + -moz-box-shadow: 0 1px 2px #333; + box-shadow: 0 1px 2px #333; +} + + +/* =Quote +----------------------------------------------- */ + +.format-quote blockquote { + color: #aaa; +} + + +/* =Image +----------------------------------------------- */ + +.indexed.format-image .wp-caption { + background: #242424; +} +.indexed.format-image .entry-meta .edit-link a { + color: #ddd; +} +.indexed.format-image .entry-meta .edit-link a:hover { + color: #fff; +} + + +/* =error404 +----------------------------------------------- */ +.error404 #main #searchform { + background: #060606; + border-color: #222; +} + + +/* =Showcase +----------------------------------------------- */ + +h1.showcase-heading { + color: #ccc; +} + +/* Intro */ +article.intro { + background: #060606; +} +article.intro .entry-content { + color: #eee; +} +article.intro .edit-link a { + background: #555; + color: #000; +} +article.intro .edit-link a:hover { + background: #888; +} + +/* Featured post */ +section.featured-post .hentry { + color: #999; +} + +/* Small featured post */ +section.featured-post .attachment-small-feature { + border-color: #444; +} +section.featured-post .attachment-small-feature:hover { + border-color: #777; +} +article.feature-image.small .entry-summary { + color: #aaa; +} +article.feature-image.small .entry-summary p a { + background: #ddd; + color: #111; +} +article.feature-image.small .entry-summary p a:hover { + color: #40220c; +} + +/* Large featured post */ +article.feature-image.large .entry-title a { + background: #ddd; + background: rgba(0,0,0,0.8); + color: #fff; +} +section.feature-image.large:hover .entry-title a, +section.feature-image.large .entry-title:hover a { + background: #111; + background: rgba(255,255,255,0.8); + color: #000; +} +section.feature-image.large img { + border-bottom: 1px solid #222; +} + +/* Featured Slider */ +.featured-posts { + border-color: #222; +} +.featured-posts section.featured-post { + background: #000; +} +.featured-post .feature-text:after, +.featured-post .feature-image.small:after { + background: -moz-linear-gradient(top, rgba(0,0,0,0) 0%, rgba(0,0,0,1) 100%); /* FF3.6+ */ + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,rgba(0,0,0,0)), color-stop(100%,rgba(0,0,0,1))); /* Chrome,Safari4+ */ + background: -webkit-linear-gradient(top, rgba(0,0,0,0) 0%,rgba(0,0,0,1) 100%); /* Chrome10+,Safari5.1+ */ + background: -o-linear-gradient(top, rgba(0,0,0,0) 0%,rgba(0,0,0,1) 100%); /* Opera11.10+ */ + background: -ms-linear-gradient(top, rgba(0,0,0,0) 0%,rgba(0,0,0,1) 100%); /* IE10+ */ + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#00000000', endColorstr='#000000',GradientType=0 ); /* IE6-9 */ + background: linear-gradient(top, rgba(0,0,0,0) 0%,rgba(0,0,0,1) 100%); /* W3C */ +} +.feature-slider a { + background: #c3c3c3; + background: rgba(60,60,60,0.9); + -webkit-box-shadow: inset 1px 1px 5px rgba(0,0,0,0.5), inset 0 0 2px rgba(255,255,255,0.5); + -moz-box-shadow: inset 1px 1px 5px rgba(0,0,0,0.5), inset 0 0 2px rgba(255,255,255,0.5); + box-shadow: inset 1px 1px 5px rgba(0,0,0,0.5), inset 0 0 2px rgba(255,255,255,0.5); +} +.feature-slider a.active { + background: #000; + background: rgba(255,255,255,0.8); + -webkit-box-shadow: inset 1px 1px 5px rgba(0,0,0,0.4), inset 0 0 2px rgba(255,255,255,0.8); + -moz-box-shadow: inset 1px 1px 5px rgba(0,0,0,0.4), inset 0 0 2px rgba(255,255,255,0.8); + box-shadow: inset 1px 1px 5px rgba(0,0,0,0.4), inset 0 0 2px rgba(255,255,255,0.8); +} + +/* Recent Posts */ +section.recent-posts .other-recent-posts { + border-color: #222; +} +section.recent-posts .other-recent-posts .entry-title { + border-color: #222; +} +section.recent-posts .other-recent-posts a[rel="bookmark"] { + color: #ccc; +} +section.recent-posts .other-recent-posts a[rel="bookmark"]:hover { +} +section.recent-posts .other-recent-posts .comments-link a, +section.recent-posts .other-recent-posts .comments-link > span { + border-color: #959595; + color: #bbb; +} +section.recent-posts .other-recent-posts .comments-link > span { + border-color: #444; + color: #777; +} +section.recent-posts .other-recent-posts .comments-link a:hover { +} + + +/* =Attachments +----------------------------------------------- */ + +.image-attachment div.attachment { + background: #060606; + border-color: #222; +} +.image-attachment div.attachment a img { + border-color: #060606; +} +.image-attachment div.attachment a:focus img, +.image-attachment div.attachment a:hover img, +.image-attachment div.attachment a:active img { + border-color: #2c2c2c; + background: #0f0f0f; +} + + +/* =Widgets +----------------------------------------------- */ + +.widget-title { + color: #ccc; +} +.widget ul li { + color: #888; +} + +/* Search Widget */ +.widget_search #searchsubmit { + background: #222; + border-color: #333; + -webkit-box-shadow: inset 0px -1px 1px rgba(0, 0, 0, 0.09); + -moz-box-shadow: inset 0px -1px 1px rgba(0, 0, 0, 0.09); + box-shadow: inset 0px -1px 1px rgba(0, 0, 0, 0.09); + color: #777; +} +.widget_search #searchsubmit:active { + -webkit-box-shadow: inset 0px 1px 1px rgba(0, 0, 0, 0.1); + -moz-box-shadow: inset 0px 1px 1px rgba(0, 0, 0, 0.1); + box-shadow: inset 0px 1px 1px rgba(0, 0, 0, 0.1); + color: #40220c; +} + +/* Calendar Widget */ +.widget_calendar #wp-calendar { + color: #aaa; +} +.widget_calendar #wp-calendar th { + background: #0b0b0b; + border-color: #333; +} +.widget_calendar #wp-calendar tfoot td { + background: #0b0b0b; + border-color: #333; +} + + +/* =Comments +----------------------------------------------- */ + +#comments-title { + color: #bbb; +} +.nocomments { + color: #555; +} +.commentlist > li.comment { + background: #090909; + border-color: #222; +} +.commentlist .children li.comment { + background: #000; + border-color: #222; +} +.rtl .commentlist .children li.comment { + border-color: #222; +} +.comment-meta { + color: #999; +} +a.comment-reply-link { + background: #242424; + color: #bbb; +} +li.bypostauthor a.comment-reply-link { + background: #111; +} +a.comment-reply-link:hover, +a.comment-reply-link:focus, +a.comment-reply-link:active, +li.bypostauthor a.comment-reply-link:hover, +li.bypostauthor a.comment-reply-link:focus, +li.bypostauthor a.comment-reply-link:active { + background: #999; + color: #000; +} +.commentlist > li:before { + content: url(../images/comment-arrow-dark.png); +} +.rtl .commentlist > li:before { + content: url(../images/comment-arrow-dark-rtl.png); +} + +/* Post author highlighting */ +.commentlist > li.bypostauthor { + background: #222; + border-color: #2c2c2c; +} +.commentlist > li.bypostauthor:before { + content: url(../images/comment-arrow-bypostauthor-dark.png); +} +.rtl .commentlist > li.bypostauthor:before { + content: url(../images/comment-arrow-bypostauthor-dark-rtl.png); +} + +/* Post Author threaded comments */ +.commentlist .children > li.bypostauthor { + background: #222; + border-color: #2c2c2c; +} +.commentlist > li.bypostauthor .comment-meta { + color: #a8a8a8; +} + +/* Comment Form */ +#respond { + background: #222; + border-color: #2c2c2c; +} +#respond input[type="text"], +#respond textarea { + background: #000; + border: 4px solid #111; + -webkit-box-shadow: inset 0 1px 3px rgba(51,51,51,0.95); + -moz-box-shadow: inset 0 1px 3px rgba(51,51,51,0.95); + box-shadow: inset 0 1px 3px rgba(51,51,51,0.95); + color: #bbb; +} +#respond .comment-form-author label, +#respond .comment-form-email label, +#respond .comment-form-url label, +#respond .comment-form-comment label { + background: #111; + -webkit-box-shadow: 1px 2px 2px rgba(51,51,51,0.8); + -moz-box-shadow: 1px 2px 2px rgba(51,51,51,0.8); + box-shadow: 1px 1px 2px rgba(51,51,51,0.8); + color: #aaa; +} +.rtl #respond .comment-form-author label, +.rtl #respond .comment-form-email label, +.rtl #respond .comment-form-url label, +.rtl #respond .comment-form-comment label { + -webkit-box-shadow: -1px 2px 2px rgba(51,51,51,0.8); + -moz-box-shadow: -1px 2px 2px rgba(51,51,51,0.8); + box-shadow: -1px 1px 2px rgba(51,51,51,0.8); +} +#respond .comment-form-author .required, +#respond .comment-form-email .required { + color: #42caff; +} +#respond input#submit { + background: #ddd; + -webkit-box-shadow: 0px 1px 2px rgba(0,0,0,0.3); + -moz-box-shadow: 0px 1px 2px rgba(0,0,0,0.3); + box-shadow: 0px 1px 2px rgba(0,0,0,0.3); + color: #111; + text-shadow: 0 -1px 0 rgba(0,0,0,0.3); +} +#respond input#submit:active { + color: #40220c; +} +#respond #cancel-comment-reply-link { + color: #999; +} +#reply-title { + color: #ccc; +} +#cancel-comment-reply-link { + color: #777; +} +#cancel-comment-reply-link:focus, +#cancel-comment-reply-link:active, +#cancel-comment-reply-link:hover { + color: #00b4cc; +} + + +/* =Footer +----------------------------------------------- */ + +#supplementary { + border-color: #222; +} + +/* Site Generator Line */ +#site-generator { + background: #060606; + border-color: #000; +} + + +/* =Print +----------------------------------------------- */ + +@media print { + body { + color: #333; + background: none !important; + } + #page { + background: none !important; + } + + /* Comments */ + .commentlist > li.comment { + } + + /* Post author highlighting */ + .commentlist > li.bypostauthor { + color: #333; + } + .commentlist > li.bypostauthor .comment-meta { + color: #959595; + } + .commentlist > li:before { + content: none !important; + } + + /* Post Author threaded comments */ + .commentlist .children > li.bypostauthor { + background: #fff; + border-color: #ddd; + } + .commentlist .children > li.bypostauthor > article, + .commentlist .children > li.bypostauthor > article .comment-meta { + color: #959595; + } +} \ No newline at end of file diff --git a/src/wp-content/themes/twentyeleven/comments.php b/src/wp-content/themes/twentyeleven/comments.php new file mode 100644 index 0000000..359b001 --- /dev/null +++ b/src/wp-content/themes/twentyeleven/comments.php @@ -0,0 +1,77 @@ + +
    + +

    +
    + + + + + +

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

    + + 1 && get_option( 'page_comments' ) ) : // are there comments to navigate through ?> + + + +
      + 'twentyeleven_comment' ) ); + ?> +
    + + 1 && get_option( 'page_comments' ) ) : // are there comments to navigate through ?> + + + + +

    + + + + + diff --git a/src/wp-content/themes/twentyeleven/content-aside.php b/src/wp-content/themes/twentyeleven/content-aside.php new file mode 100644 index 0000000..a70638a --- /dev/null +++ b/src/wp-content/themes/twentyeleven/content-aside.php @@ -0,0 +1,46 @@ + + +
    > +
    +
    +

    +

    +
    + + + + +
    + + +
    + +
    + +
    + →', 'twentyeleven' ) ); ?> + '' ) ); ?> +
    + + +
    + + + | + ' . __( 'Leave a reply', 'twentyeleven' ) . '', __( '1 Reply', 'twentyeleven' ), __( '% Replies', 'twentyeleven' ) ); ?> + + ', '' ); ?> +
    +
    diff --git a/src/wp-content/themes/twentyeleven/content-featured.php b/src/wp-content/themes/twentyeleven/content-featured.php new file mode 100644 index 0000000..ce92641 --- /dev/null +++ b/src/wp-content/themes/twentyeleven/content-featured.php @@ -0,0 +1,47 @@ + +
    > +
    +

    + + +
    + +
    + + '' ) ); ?> +
    + +
    + permalink.', 'twentyeleven' ); + } else { + $utility_text = __( 'This entry was posted in %1$s. Bookmark the permalink.', 'twentyeleven' ); + } + printf( + $utility_text, + /* translators: used between list items, there is a space after the comma */ + get_the_category_list( __( ', ', 'twentyeleven' ) ), + $tag_list, + esc_url( get_permalink() ), + the_title_attribute( 'echo=0' ) + ); + ?> + + ', '' ); ?> +
    +
    diff --git a/src/wp-content/themes/twentyeleven/content-gallery.php b/src/wp-content/themes/twentyeleven/content-gallery.php new file mode 100644 index 0000000..302a51e --- /dev/null +++ b/src/wp-content/themes/twentyeleven/content-gallery.php @@ -0,0 +1,92 @@ + + +
    > +
    +
    +

    +

    +
    + + +
    + + +
    + +
    + +
    + + →', 'twentyeleven' ) ); ?> + + + $post->ID, 'post_type' => 'attachment', 'post_mime_type' => 'image', 'orderby' => 'menu_order', 'order' => 'ASC', 'numberposts' => 999 ) ); + if ( $images ) : + $total_images = count( $images ); + $image = array_shift( $images ); + $image_img_tag = wp_get_attachment_image( $image->ID, 'thumbnail' ); + ?> + + + +

    %2$s photo.', 'This gallery contains %2$s photos.', $total_images, 'twentyeleven' ), + 'href="' . esc_url( get_permalink() ) . '" title="' . sprintf( esc_attr__( 'Permalink to %s', 'twentyeleven' ), the_title_attribute( 'echo=0' ) ) . '" rel="bookmark"', + number_format_i18n( $total_images ) + ); ?>

    + + + + '' ) ); ?> +
    + + +
    + + + + Posted in %2$s', 'twentyeleven' ), 'entry-utility-prep entry-utility-prep-cat-links', $categories_list ); + $show_sep = true; ?> + + + + | + + + Tagged %2$s', 'twentyeleven' ), 'entry-utility-prep entry-utility-prep-tag-links', $tags_list ); + $show_sep = true; ?> + + + + + + | + + ' . __( 'Leave a Reply', 'twentyeleven' ) . '', __( '1 Reply', 'twentyeleven' ), __( '% Replies', 'twentyeleven' ) ); ?> + + + ', '' ); ?> +
    +
    diff --git a/src/wp-content/themes/twentyeleven/content-image.php b/src/wp-content/themes/twentyeleven/content-image.php new file mode 100644 index 0000000..58aaf12 --- /dev/null +++ b/src/wp-content/themes/twentyeleven/content-image.php @@ -0,0 +1,70 @@ + +
    > +
    +
    +

    +

    +
    + + + + +
    + +
    + →', 'twentyeleven' ) ); ?> + '' ) ); ?> +
    + +
    + + + + ', '' ); ?> +
    +
    diff --git a/src/wp-content/themes/twentyeleven/content-intro.php b/src/wp-content/themes/twentyeleven/content-intro.php new file mode 100644 index 0000000..573112d --- /dev/null +++ b/src/wp-content/themes/twentyeleven/content-intro.php @@ -0,0 +1,21 @@ + + +
    > +
    +

    +
    + +
    + + '' ) ); ?> + ', '' ); ?> +
    +
    diff --git a/src/wp-content/themes/twentyeleven/content-link.php b/src/wp-content/themes/twentyeleven/content-link.php new file mode 100644 index 0000000..4981ec6 --- /dev/null +++ b/src/wp-content/themes/twentyeleven/content-link.php @@ -0,0 +1,46 @@ + + +
    > +
    +
    +

    +

    +
    + + + + +
    + + +
    + +
    + +
    + →', 'twentyeleven' ) ); ?> + '' ) ); ?> +
    + + +
    + + + | + ' . __( 'Leave a reply', 'twentyeleven' ) . '', __( '1 Reply', 'twentyeleven' ), __( '% Replies', 'twentyeleven' ) ); ?> + + ', '' ); ?> +
    +
    diff --git a/src/wp-content/themes/twentyeleven/content-page.php b/src/wp-content/themes/twentyeleven/content-page.php new file mode 100644 index 0000000..c499842 --- /dev/null +++ b/src/wp-content/themes/twentyeleven/content-page.php @@ -0,0 +1,23 @@ + + +
    > +
    +

    +
    + +
    + + '' ) ); ?> +
    +
    + ', '' ); ?> +
    +
    diff --git a/src/wp-content/themes/twentyeleven/content-quote.php b/src/wp-content/themes/twentyeleven/content-quote.php new file mode 100644 index 0000000..a4d600a --- /dev/null +++ b/src/wp-content/themes/twentyeleven/content-quote.php @@ -0,0 +1,74 @@ + + +
    > +
    +
    +

    +

    +
    + + + + + + +
    + + +
    + +
    + +
    + →', 'twentyeleven' ) ); ?> + '' ) ); ?> +
    + + +
    + + + + Posted in %2$s', 'twentyeleven' ), 'entry-utility-prep entry-utility-prep-cat-links', $categories_list ); + $show_sep = true; ?> + + + + | + + + Tagged %2$s', 'twentyeleven' ), 'entry-utility-prep entry-utility-prep-tag-links', $tags_list ); + $show_sep = true; ?> + + + + + + | + + ' . __( 'Leave a reply', 'twentyeleven' ) . '', __( '1 Reply', 'twentyeleven' ), __( '% Replies', 'twentyeleven' ) ); ?> + + + ', '' ); ?> +
    +
    diff --git a/src/wp-content/themes/twentyeleven/content-single.php b/src/wp-content/themes/twentyeleven/content-single.php new file mode 100644 index 0000000..c246b74 --- /dev/null +++ b/src/wp-content/themes/twentyeleven/content-single.php @@ -0,0 +1,71 @@ + + +
    > +
    +

    + + + + +
    + +
    + + '' ) ); ?> +
    + +
    + %5$s. Bookmark the permalink.', 'twentyeleven' ); + } elseif ( '' != $categories_list ) { + $utility_text = __( 'This entry was posted in %1$s by %5$s. Bookmark the permalink.', 'twentyeleven' ); + } else { + $utility_text = __( 'This entry was posted by %5$s. Bookmark the permalink.', 'twentyeleven' ); + } + + printf( + $utility_text, + $categories_list, + $tag_list, + esc_url( get_permalink() ), + the_title_attribute( 'echo=0' ), + get_the_author(), + esc_url( get_author_posts_url( get_the_author_meta( 'ID' ) ) ) + ); + ?> + ', '' ); ?> + + + + +
    +
    diff --git a/src/wp-content/themes/twentyeleven/content-status.php b/src/wp-content/themes/twentyeleven/content-status.php new file mode 100644 index 0000000..c6b2e80 --- /dev/null +++ b/src/wp-content/themes/twentyeleven/content-status.php @@ -0,0 +1,47 @@ + + +
    > +
    +
    +

    +

    +
    + + + + +
    + + +
    + +
    + +
    +
    + + →', 'twentyeleven' ) ); ?> + '' ) ); ?> +
    + + +
    + + + | + ' . __( 'Leave a reply', 'twentyeleven' ) . '', __( '1 Reply', 'twentyeleven' ), __( '% Replies', 'twentyeleven' ) ); ?> + + ', '' ); ?> +
    +
    diff --git a/src/wp-content/themes/twentyeleven/content.php b/src/wp-content/themes/twentyeleven/content.php new file mode 100644 index 0000000..3631e78 --- /dev/null +++ b/src/wp-content/themes/twentyeleven/content.php @@ -0,0 +1,82 @@ + + +
    > +
    + +
    +

    +

    +
    + +

    + + + + + + + + + +
    + + +
    + +
    + +
    + →', 'twentyeleven' ) ); ?> + '' ) ); ?> +
    + + +
    + + + + + Posted in %2$s', 'twentyeleven' ), 'entry-utility-prep entry-utility-prep-cat-links', $categories_list ); + $show_sep = true; ?> + + + + | + + + Tagged %2$s', 'twentyeleven' ), 'entry-utility-prep entry-utility-prep-tag-links', $tags_list ); + $show_sep = true; ?> + + + + + + + | + + ' . __( 'Leave a reply', 'twentyeleven' ) . '', __( '1 Reply', 'twentyeleven' ), __( '% Replies', 'twentyeleven' ) ); ?> + + + ', '' ); ?> +
    +
    diff --git a/src/wp-content/themes/twentyeleven/editor-style-rtl.css b/src/wp-content/themes/twentyeleven/editor-style-rtl.css new file mode 100644 index 0000000..5783776 --- /dev/null +++ b/src/wp-content/themes/twentyeleven/editor-style-rtl.css @@ -0,0 +1,24 @@ +/* +Theme Name: Twenty Eleven +*/ +/* +Used to style the TinyMCE editor. +*/ +html .mceContentBody { + direction: rtl; + unicode-bidi: embed; + float: right; + max-width: 584px; +} +* { + font-family: Arial, Tahoma, sans-serif; +} +ul, ol { + margin: 0 2.5em 1.625em 0; +} +blockquote { + font-style: normal; +} +table { + text-align: right; +} \ No newline at end of file diff --git a/src/wp-content/themes/twentyeleven/editor-style.css b/src/wp-content/themes/twentyeleven/editor-style.css new file mode 100644 index 0000000..2641a07 --- /dev/null +++ b/src/wp-content/themes/twentyeleven/editor-style.css @@ -0,0 +1,311 @@ +/* +Theme Name: Twenty Eleven +Description: Used to style the TinyMCE editor. +*/ + +html .mceContentBody { + max-width: 584px; +} +* { + color: inherit; + font: 15px "Helvetica Neue", Helvetica, Arial, sans-serif; + font-style: inherit; + font-weight: inherit; + line-height: 1.625; +} +body { + color: #333; + font: 15px "Helvetica Neue", Helvetica, Arial, "Nimbus Sans L", sans-serif; + font-weight: 300; + line-height: 1.625; +} + +/* Headings */ +h1,h2,h3,h4,h5,h6 { + clear: both; +} +h1, +h2 { + color: #000; + font-size: 15px; + font-weight: bold; + margin: 0 0 .8125em; +} +h3 { + font-size: 10px; + letter-spacing: 0.1em; + line-height: 2.6em; + text-transform: uppercase; +} +h4, h5, h6 { + font-size: 14px; + margin: 0; +} +hr { + background-color: #ccc; + border: 0; + height: 1px; + margin-bottom: 1.625em; +} + +/* Text elements */ +p, ul, ol, dl { + font-weight: 300; +} +p { + margin-bottom: 1.625em; +} +ul, ol { + margin: 0 0 1.625em 2.5em; + padding: 0; +} +ul { + list-style: square; +} +ol { + list-style-type: decimal; +} +ol ol { + list-style: upper-alpha; +} +ol ol ol { + list-style: lower-roman; +} +ol ol ol ol { + list-style: lower-alpha; +} +ul ul, ol ol, ul ol, ol ul { + margin-bottom: 0; +} +dl { + margin: 0 1.625em; +} +dt { + font-size: 15px; + font-weight: bold; +} +dd { + margin: 0 0 1.625em; +} +strong { + font-weight: bold; +} +cite, em, i { + font-style: italic; +} +cite { + border: none; +} +big { + font-size: 131.25%; +} +.mceContentBody blockquote, +.mceContentBody blockquote p { + font-family: Georgia, "Bitstream Charter", serif !important; + font-style: italic !important; + font-weight: normal; + margin: 0 3em; +} +.mceContentBody blockquote em, +.mceContentBody blockquote i, +.mceContentBody blockquote cite { + font-style: normal; +} +.mceContentBody blockquote cite { + color: #666; + font: 12px "Helvetica Neue", Helvetica, Arial, sans-serif; + font-weight: 300; + letter-spacing: 0.05em; + text-transform: uppercase; +} +pre { + background: #f4f4f4; + font: 13px "Courier 10 Pitch", Courier, monospace; + line-height: 1.5; + margin-bottom: 1.625em; + padding: 0.75em 1.625em; +} +code, kbd, code var { + font: 13px Monaco, Consolas, "Andale Mono", "DejaVu Sans Mono", monospace; +} +abbr, acronym, dfn { + border-bottom: 1px dotted #666; + cursor: help; +} +address { + display: block; + margin: 0 0 1.625em; +} +del { + color: #333; +} +ins { + background: #fff9c0; + border: none; + color: #333; + text-decoration: none; +} +sup, +sub { + font-size: 10px; + height: 0; + line-height: 1; + position: relative; + vertical-align: baseline; +} +sup { + bottom: 1ex; +} +sub { + top: .5ex; +} +input[type=text], +textarea { + background: #fafafa; + -moz-box-shadow: inset 0 1px 1px rgba(0,0,0,0.1); + -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,0.1); + box-shadow: inset 0 1px 1px rgba(0,0,0,0.1); + border: 1px solid #ddd; + color: #888; +} +input[type=text]:focus, +textarea:focus { + color: #333; +} +textarea { + padding-left: 3px; + width: 98%; +} +input[type=text] { + padding: 3px; +} + +/* Links */ +a, +a em, +a strong { + color: #1b8be0; + text-decoration: none; +} +a:focus, +a:active, +a:hover { + text-decoration: underline; +} + +/* Alignment */ +.alignleft { + display: inline; + float: left; + margin-right: 1.625em; +} +.alignright { + display: inline; + float: right; + margin-left: 1.625em; +} +.aligncenter { + clear: both; + display: block; + margin-left: auto; + margin-right: auto; +} + +/* Tables */ +table { + border: none !important; + border-bottom: 1px solid #ddd !important; + border-collapse: collapse; + border-spacing: 0; + text-align: left; + margin: 0 0 1.625em; + width: 100%; +} +tr th { + border: none !important; + color: #666; + font-size: 10px; + font-weight: 500; + letter-spacing: 0.1em; + line-height: 2.6em; + text-transform: uppercase; +} +td { + border: none !important; + border-top: 1px solid #ddd !important; + padding: 6px 10px 6px 0; +} + +/* Images */ +img[class*="wp-image-"] { + height: auto; + max-width: 97.5%; +} +img.size-full { + width: auto; /* Prevent stretching of full-size images in IE8 */ +} +img.wp-smiley { + border: none; + margin-bottom: 0; + margin-top: 0; + padding: 0; +} +p img, +.wp-caption { + margin-top: 0.4em; +} +img { + border: 1px solid #ddd; + padding: 6px; +} +img.alignleft, +img.alignright, +img.aligncenter { + margin-bottom: 1.625em; +} +.wp-caption { + background: #eee; + border: none; + margin-bottom: 1.625em; + max-width: 96%; + padding: 9px; +} +.wp-caption img { + display: block; + margin: 5px auto 0 !important; + max-width: 98%; + border-color: #eee; +} +.wp-caption .wp-caption-text, +.wp-caption-dd { + color: #666; + font-family: Georgia, serif !important; + font-size: 12px; + margin: 0 0 0.6em 0 !important; + padding: 0 0 5px 40px; + position: relative; + text-align: left; +} +.wp-caption .wp-caption-text:before { + color: #666; + content: '\2014'; + font-size: 14px; + font-style: normal; + font-weight: bold; + margin-right: 5px; + position: absolute; + left: 10px; + top: 7px; +} +a:focus img[class*="wp-image-"], +a:hover img[class*="wp-image-"], +a:active img[class*="wp-image-"] { + background: #eee; + border-color: #bbb; +} +.wp-caption a:focus img, +.wp-caption a:active img, +.wp-caption a:hover img { + background: #fff; + border-color: #ddd; +} \ No newline at end of file diff --git a/src/wp-content/themes/twentyeleven/footer.php b/src/wp-content/themes/twentyeleven/footer.php new file mode 100644 index 0000000..9fa6225 --- /dev/null +++ b/src/wp-content/themes/twentyeleven/footer.php @@ -0,0 +1,34 @@ + + + + +
    + + + +
    + + +
    +
    + + + + + + \ No newline at end of file diff --git a/src/wp-content/themes/twentyeleven/functions.php b/src/wp-content/themes/twentyeleven/functions.php new file mode 100644 index 0000000..1997eb2 --- /dev/null +++ b/src/wp-content/themes/twentyeleven/functions.php @@ -0,0 +1,593 @@ + + * add_action( 'after_setup_theme', 'my_child_theme_setup' ); + * function my_child_theme_setup() { + * // We are providing our own filter for excerpt_length (or using the unfiltered value) + * remove_filter( 'excerpt_length', 'twentyeleven_excerpt_length' ); + * ... + * } + * + * + * For more information on hooks, actions, and filters, see http://codex.wordpress.org/Plugin_API. + * + * @package WordPress + * @subpackage Twenty_Eleven + * @since Twenty Eleven 1.0 + */ + +/** + * Set the content width based on the theme's design and stylesheet. + */ +if ( ! isset( $content_width ) ) + $content_width = 584; + +/** + * Tell WordPress to run twentyeleven_setup() when the 'after_setup_theme' hook is run. + */ +add_action( 'after_setup_theme', 'twentyeleven_setup' ); + +if ( ! function_exists( 'twentyeleven_setup' ) ): +/** + * Sets up theme defaults and registers support for various WordPress features. + * + * Note that this function is hooked into the after_setup_theme hook, which runs + * before the init hook. The init hook is too late for some features, such as indicating + * support post thumbnails. + * + * To override twentyeleven_setup() in a child theme, add your own twentyeleven_setup to your child theme's + * functions.php file. + * + * @uses load_theme_textdomain() For translation/localization support. + * @uses add_editor_style() To style the visual editor. + * @uses add_theme_support() To add support for post thumbnails, automatic feed links, and Post Formats. + * @uses register_nav_menus() To add support for navigation menus. + * @uses add_custom_background() To add support for a custom background. + * @uses add_custom_image_header() To add support for a custom header. + * @uses register_default_headers() To register the default custom header images provided with the theme. + * @uses set_post_thumbnail_size() To set a custom post thumbnail size. + * + * @since Twenty Eleven 1.0 + */ +function twentyeleven_setup() { + + /* Make Twenty Eleven available for translation. + * Translations can be added to the /languages/ directory. + * If you're building a theme based on Twenty Eleven, use a find and replace + * to change 'twentyeleven' to the name of your theme in all the template files. + */ + load_theme_textdomain( 'twentyeleven', TEMPLATEPATH . '/languages' ); + + $locale = get_locale(); + $locale_file = TEMPLATEPATH . "/languages/$locale.php"; + if ( is_readable( $locale_file ) ) + require_once( $locale_file ); + + // This theme styles the visual editor with editor-style.css to match the theme style. + add_editor_style(); + + // Load up our theme options page and related code. + require( dirname( __FILE__ ) . '/inc/theme-options.php' ); + + // Grab Twenty Eleven's Ephemera widget. + require( dirname( __FILE__ ) . '/inc/widgets.php' ); + + // Add default posts and comments RSS feed links to . + add_theme_support( 'automatic-feed-links' ); + + // This theme uses wp_nav_menu() in one location. + register_nav_menu( 'primary', __( 'Primary Menu', 'twentyeleven' ) ); + + // Add support for a variety of post formats + add_theme_support( 'post-formats', array( 'aside', 'link', 'gallery', 'status', 'quote', 'image' ) ); + + // Add support for custom backgrounds + add_custom_background(); + + // This theme uses Featured Images (also known as post thumbnails) for per-post/per-page Custom Header images + add_theme_support( 'post-thumbnails' ); + + // The next four constants set how Twenty Eleven supports custom headers. + + // The default header text color + define( 'HEADER_TEXTCOLOR', '000' ); + + // By leaving empty, we allow for random image rotation. + define( 'HEADER_IMAGE', '' ); + + // The height and width of your custom header. + // Add a filter to twentyeleven_header_image_width and twentyeleven_header_image_height to change these values. + define( 'HEADER_IMAGE_WIDTH', apply_filters( 'twentyeleven_header_image_width', 1000 ) ); + define( 'HEADER_IMAGE_HEIGHT', apply_filters( 'twentyeleven_header_image_height', 288 ) ); + + // We'll be using post thumbnails for custom header images on posts and pages. + // We want them to be the size of the header image that we just defined + // Larger images will be auto-cropped to fit, smaller ones will be ignored. See header.php. + set_post_thumbnail_size( HEADER_IMAGE_WIDTH, HEADER_IMAGE_HEIGHT, true ); + + // Add Twenty Eleven's custom image sizes + add_image_size( 'large-feature', HEADER_IMAGE_WIDTH, HEADER_IMAGE_HEIGHT, true ); // Used for large feature (header) images + add_image_size( 'small-feature', 500, 300 ); // Used for featured posts if a large-feature doesn't exist + + // Turn on random header image rotation by default. + add_theme_support( 'custom-header', array( 'random-default' => true ) ); + + // Add a way for the custom header to be styled in the admin panel that controls + // custom headers. See twentyeleven_admin_header_style(), below. + add_custom_image_header( 'twentyeleven_header_style', 'twentyeleven_admin_header_style', 'twentyeleven_admin_header_image' ); + + // ... and thus ends the changeable header business. + + // Default custom headers packaged with the theme. %s is a placeholder for the theme template directory URI. + register_default_headers( array( + 'wheel' => array( + 'url' => '%s/images/headers/wheel.jpg', + 'thumbnail_url' => '%s/images/headers/wheel-thumbnail.jpg', + /* translators: header image description */ + 'description' => __( 'Wheel', 'twentyeleven' ) + ), + 'shore' => array( + 'url' => '%s/images/headers/shore.jpg', + 'thumbnail_url' => '%s/images/headers/shore-thumbnail.jpg', + /* translators: header image description */ + 'description' => __( 'Shore', 'twentyeleven' ) + ), + 'trolley' => array( + 'url' => '%s/images/headers/trolley.jpg', + 'thumbnail_url' => '%s/images/headers/trolley-thumbnail.jpg', + /* translators: header image description */ + 'description' => __( 'Trolley', 'twentyeleven' ) + ), + 'pine-cone' => array( + 'url' => '%s/images/headers/pine-cone.jpg', + 'thumbnail_url' => '%s/images/headers/pine-cone-thumbnail.jpg', + /* translators: header image description */ + 'description' => __( 'Pine Cone', 'twentyeleven' ) + ), + 'chessboard' => array( + 'url' => '%s/images/headers/chessboard.jpg', + 'thumbnail_url' => '%s/images/headers/chessboard-thumbnail.jpg', + /* translators: header image description */ + 'description' => __( 'Chessboard', 'twentyeleven' ) + ), + 'lanterns' => array( + 'url' => '%s/images/headers/lanterns.jpg', + 'thumbnail_url' => '%s/images/headers/lanterns-thumbnail.jpg', + /* translators: header image description */ + 'description' => __( 'Lanterns', 'twentyeleven' ) + ), + 'willow' => array( + 'url' => '%s/images/headers/willow.jpg', + 'thumbnail_url' => '%s/images/headers/willow-thumbnail.jpg', + /* translators: header image description */ + 'description' => __( 'Willow', 'twentyeleven' ) + ), + 'hanoi' => array( + 'url' => '%s/images/headers/hanoi.jpg', + 'thumbnail_url' => '%s/images/headers/hanoi-thumbnail.jpg', + /* translators: header image description */ + 'description' => __( 'Hanoi Plant', 'twentyeleven' ) + ) + ) ); +} +endif; // twentyeleven_setup + +if ( ! function_exists( 'twentyeleven_header_style' ) ) : +/** + * Styles the header image and text displayed on the blog + * + * @since Twenty Eleven 1.0 + */ +function twentyeleven_header_style() { + + // If no custom options for text are set, let's bail + // get_header_textcolor() options: HEADER_TEXTCOLOR is default, hide text (returns 'blank') or any hex value + if ( HEADER_TEXTCOLOR == get_header_textcolor() ) + return; + // If we get this far, we have custom styles. Let's do this. + ?> + + Header admin panel. + * + * Referenced via add_custom_image_header() in twentyeleven_setup(). + * + * @since Twenty Eleven 1.0 + */ +function twentyeleven_admin_header_style() { +?> + + Header admin panel. + * + * Referenced via add_custom_image_header() in twentyeleven_setup(). + * + * @since Twenty Eleven 1.0 + */ +function twentyeleven_admin_header_image() { ?> + +' . __( 'Continue reading ', 'twentyeleven' ) . ''; +} + +/** + * Replaces "[...]" (appended to automatically generated excerpts) with an ellipsis and twentyeleven_continue_reading_link(). + * + * To override this in a child theme, remove the filter and add your own + * function tied to the excerpt_more filter hook. + */ +function twentyeleven_auto_excerpt_more( $more ) { + return ' …' . twentyeleven_continue_reading_link(); +} +add_filter( 'excerpt_more', 'twentyeleven_auto_excerpt_more' ); + +/** + * Adds a pretty "Continue Reading" link to custom post excerpts. + * + * To override this link in a child theme, remove the filter and add your own + * function tied to the get_the_excerpt filter hook. + */ +function twentyeleven_custom_excerpt_more( $output ) { + if ( has_excerpt() && ! is_attachment() ) { + $output .= twentyeleven_continue_reading_link(); + } + return $output; +} +add_filter( 'get_the_excerpt', 'twentyeleven_custom_excerpt_more' ); + +/** + * Get our wp_nav_menu() fallback, wp_page_menu(), to show a home link. + */ +function twentyeleven_page_menu_args( $args ) { + $args['show_home'] = true; + return $args; +} +add_filter( 'wp_page_menu_args', 'twentyeleven_page_menu_args' ); + +/** + * Register our sidebars and widgetized areas. Also register the default Epherma widget. + * + * @since Twenty Eleven 1.0 + */ +function twentyeleven_widgets_init() { + + register_widget( 'Twenty_Eleven_Ephemera_Widget' ); + + register_sidebar( array( + 'name' => __( 'Main Sidebar', 'twentyeleven' ), + 'id' => 'sidebar-1', + 'before_widget' => '", + 'before_title' => '

    ', + 'after_title' => '

    ', + ) ); + + register_sidebar( array( + 'name' => __( 'Showcase Sidebar', 'twentyeleven' ), + 'id' => 'sidebar-2', + 'description' => __( 'The sidebar for the optional Showcase Template', 'twentyeleven' ), + 'before_widget' => '", + 'before_title' => '

    ', + 'after_title' => '

    ', + ) ); + + register_sidebar( array( + 'name' => __( 'Footer Area One', 'twentyeleven' ), + 'id' => 'sidebar-3', + 'description' => __( 'An optional widget area for your site footer', 'twentyeleven' ), + 'before_widget' => '", + 'before_title' => '

    ', + 'after_title' => '

    ', + ) ); + + register_sidebar( array( + 'name' => __( 'Footer Area Two', 'twentyeleven' ), + 'id' => 'sidebar-4', + 'description' => __( 'An optional widget area for your site footer', 'twentyeleven' ), + 'before_widget' => '", + 'before_title' => '

    ', + 'after_title' => '

    ', + ) ); + + register_sidebar( array( + 'name' => __( 'Footer Area Three', 'twentyeleven' ), + 'id' => 'sidebar-5', + 'description' => __( 'An optional widget area for your site footer', 'twentyeleven' ), + 'before_widget' => '", + 'before_title' => '

    ', + 'after_title' => '

    ', + ) ); +} +add_action( 'widgets_init', 'twentyeleven_widgets_init' ); + +/** + * Display navigation to next/previous pages when applicable + */ +function twentyeleven_content_nav( $nav_id ) { + global $wp_query; + + if ( $wp_query->max_num_pages > 1 ) : ?> + + ]*?href=[\'"](.+?)[\'"]/is', get_the_content(), $matches ) ) + return false; + + return esc_url_raw( $matches[1] ); +} + +/** + * Count the number of footer sidebars to enable dynamic classes for the footer + */ +function twentyeleven_footer_sidebar_class() { + $count = 0; + + if ( is_active_sidebar( 'sidebar-3' ) ) + $count++; + + if ( is_active_sidebar( 'sidebar-4' ) ) + $count++; + + if ( is_active_sidebar( 'sidebar-5' ) ) + $count++; + + $class = ''; + + switch ( $count ) { + case '1': + $class = 'one'; + break; + case '2': + $class = 'two'; + break; + case '3': + $class = 'three'; + break; + } + + if ( $class ) + echo 'class="' . $class . '"'; +} + +if ( ! function_exists( 'twentyeleven_comment' ) ) : +/** + * Template for comments and pingbacks. + * + * To override this walker in a child theme without modifying the comments template + * simply create your own twentyeleven_comment(), and that function will be used instead. + * + * Used as a callback by wp_list_comments() for displaying the comments. + * + * @since Twenty Eleven 1.0 + */ +function twentyeleven_comment( $comment, $args, $depth ) { + $GLOBALS['comment'] = $comment; + switch ( $comment->comment_type ) : + case 'pingback' : + case 'trackback' : + ?> +
  • +

    ', '' ); ?>

    + +
  • id="li-comment-"> +
    +
    +
    + comment_parent ) + $avatar_size = 39; + + echo get_avatar( $comment, $avatar_size ); + + /* translators: 1: comment author, 2: date and time */ + printf( __( '%1$s on %2$s said:', 'twentyeleven' ), + sprintf( '%s', get_comment_author_link() ), + sprintf( '', + esc_url( get_comment_link( $comment->comment_ID ) ), + get_comment_time( 'c' ), + /* translators: 1: date, 2: time */ + sprintf( __( '%1$s at %2$s', 'twentyeleven' ), get_comment_date(), get_comment_time() ) + ) + ); + ?> + + ', '' ); ?> +
    + + comment_approved == '0' ) : ?> + +
    + + +
    + +
    + +
    + __( 'Reply ', 'twentyeleven' ), 'depth' => $depth, 'max_depth' => $args['max_depth'] ) ) ); ?> +
    +
    + + Posted on by ', 'twentyeleven' ), + esc_url( get_permalink() ), + esc_attr( get_the_time() ), + esc_attr( get_the_date( 'c' ) ), + esc_html( get_the_date() ), + esc_url( get_author_posts_url( get_the_author_meta( 'ID' ) ) ), + sprintf( esc_attr__( 'View all posts by %s', 'twentyeleven' ), get_the_author() ), + esc_html( get_the_author() ) + ); +} +endif; + +/** + * Adds two classes to the array of body classes. + * The first is if the site has only had one author with published posts. + * The second is if a singular post being displayed + * + * @since Twenty Eleven 1.0 + */ +function twentyeleven_body_classes( $classes ) { + + if ( ! is_multi_author() ) { + $classes[] = 'single-author'; + } + + if ( is_singular() && ! is_home() && ! is_page_template( 'showcase.php' ) && ! is_page_template( 'sidebar-page.php' ) ) + $classes[] = 'singular'; + + return $classes; +} +add_filter( 'body_class', 'twentyeleven_body_classes' ); + diff --git a/src/wp-content/themes/twentyeleven/header.php b/src/wp-content/themes/twentyeleven/header.php new file mode 100644 index 0000000..b1be094 --- /dev/null +++ b/src/wp-content/themes/twentyeleven/header.php @@ -0,0 +1,123 @@ + section and everything up till
    + * + * @package WordPress + * @subpackage Twenty_Eleven + * @since Twenty Eleven 1.0 + */ +?> + + + + +> + + + + +<?php + /* + * Print the <title> tag based on what is being viewed. + */ + global $page, $paged; + + wp_title( '|', true, 'right' ); + + // Add the blog name. + bloginfo( 'name' ); + + // Add the blog description for the home/front page. + $site_description = get_bloginfo( 'description', 'display' ); + if ( $site_description && ( is_home() || is_front_page() ) ) + echo " | $site_description"; + + // Add a page number if necessary: + if ( $paged >= 2 || $page >= 2 ) + echo ' | ' . sprintf( __( 'Page %s', 'twentyeleven' ), max( $paged, $page ) ); + + ?> + + + + + + * tag of your theme, or you will break many plugins, which + * generally use this hook to add elements to such + * as styles, scripts, and meta tags. + */ + wp_head(); +?> + + +> +
    + + + +
    \ No newline at end of file diff --git a/src/wp-content/themes/twentyeleven/image.php b/src/wp-content/themes/twentyeleven/image.php new file mode 100644 index 0000000..c6c8544 --- /dev/null +++ b/src/wp-content/themes/twentyeleven/image.php @@ -0,0 +1,101 @@ + + +
    +
    + + + + + +
    > +
    +

    + + + +
    + +
    + +
    +
    + $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; + } + $k++; + // If there is more than 1 attachment in a gallery + if ( count( $attachments ) > 1 ) { + 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 ); + } else { + // or, if there's only 1 image, get the URL of the image + $next_attachment_url = wp_get_attachment_url(); + } +?> + ID, array( $attachment_size, 1024 ) ); // filterable image width with 1024px limit for image height. + ?> + + post_excerpt ) ) : ?> +
    + +
    + +
    + +
    + +
    + + '' ) ); ?> +
    + +
    + +
    + + + +
    +
    + + \ No newline at end of file diff --git a/src/wp-content/themes/twentyeleven/images/comment-arrow-bypostauthor-dark-rtl.png b/src/wp-content/themes/twentyeleven/images/comment-arrow-bypostauthor-dark-rtl.png new file mode 100644 index 0000000000000000000000000000000000000000..46dac85bb9137e6c24f1de1d7af83eee0bf5e0e6 GIT binary patch literal 255 zcmVupsNC)b2}l(khJj;@C3t`-kSglE zFR>S_BvKvi`(DPqz#K>umB;wPP7Z3KGVUD~Ky}ga-#bDFq>0M7Z&=GlO;m1o1rJmg z9sj*OOn@{|d5kA4nYlV9=s)fmW+m7pie)RYW>G|%`vE)a0$UN1P8Ek1Hl0VTfs`O65{`a10iKn{Mv_* zWK?Utmr_Vmiw?v{T!agz7Dl--?D|jZM1knnSil2E nREzfT6i!%&TJ%4@(TFl%+sASVGdSm|00000NkvXXu0mjfrW|10 literal 0 HcmV?d00001 diff --git a/src/wp-content/themes/twentyeleven/images/comment-arrow-bypostauthor-rtl.png b/src/wp-content/themes/twentyeleven/images/comment-arrow-bypostauthor-rtl.png new file mode 100644 index 0000000000000000000000000000000000000000..9ae83f08debfdef4d617cbd5cf2166096c782910 GIT binary patch literal 257 zcmV+c0sj7pP)B^Q2!`w?*bP%M>qbjdZ+C?m zP+oNS_x3OXvPAVUp0H%*?3kkexM!G1ut*fkR%6AYh!pn&O&&a-l2t1z00000NkvXX Hu0mjfmw9Nm literal 0 HcmV?d00001 diff --git a/src/wp-content/themes/twentyeleven/images/comment-arrow-bypostauthor.png b/src/wp-content/themes/twentyeleven/images/comment-arrow-bypostauthor.png new file mode 100644 index 0000000000000000000000000000000000000000..bf9d3d92d6b872ccf327d7f675c4cba041275842 GIT binary patch literal 239 zcmV+(HaRep>5j|yrLN~6Iv97@B5zM z9z}#qXkFLDo@lAa-)NE~`Wa{BkeJZ2EQx*4Rxg^+rfCS?&>V>g&9Y3Ndq6o73#zmC zLMuJ^HyX#W&fW!0k(f}0VaY7xz5Ga?8VxdqX!TSOY W09(jPZ8i!30000Bg8iWsjdK@5LYE7rT_o`14&u{2?+@S z0Rd4_Q4tXladB}WAt4?f9x*X7US3{4K0Z!PPA)DkDJdywX=zzmS%V3stAVbPFA4Gs zW?*3BY^Tegi5^@^o+S&g#SxpfzJGh@ z%cahxcVdrD()n{&ug9-9;*;<1EvFN{@s$-`RqQH#dFuAxnGdGu^YTjlZ0mdKI;Vst03fPp^8f$< literal 0 HcmV?d00001 diff --git a/src/wp-content/themes/twentyeleven/images/comment-arrow-rtl.png b/src/wp-content/themes/twentyeleven/images/comment-arrow-rtl.png new file mode 100644 index 0000000000000000000000000000000000000000..e3fb1fddb245d383b4655c3ccf1dfd0d30725f0c GIT binary patch literal 271 zcmV+q0r38bP)d7cxzp~#F@RYlCB0}^IJi=rU-LTh3sv}u} zniDdi&N*T=+9@&`?fYIo zulk*n8Jx?qOkLLrqudsp zwN@DA7I3E{h7g2N?g$^}oG{9*;ng&aFv?|cq3`JXUKr(e5U^=slv~1sHa!dji%Lx4 zR1^hmS}6)C{TdsvcxurxJck>Os22T?AJn7d3oe;-5CCX#od5s;07*qoM6N<$f=wM^ A`2YX_ literal 0 HcmV?d00001 diff --git a/src/wp-content/themes/twentyeleven/images/comment-bubble-dark-rtl.png b/src/wp-content/themes/twentyeleven/images/comment-bubble-dark-rtl.png new file mode 100644 index 0000000000000000000000000000000000000000..3a43135ded872846746d03fdb526f785df14758f GIT binary patch literal 1868 zcmV-S2ebHzP)4Tx0C)j~RL^S@K@|QrZmG~B2wH0nvUrdpNm;9CMbtL^5n^i$+aIn^?(HA4aZWV5ov6ELTdbo0FI&wK{O>*+w4vx20?>!`FrQsdJlnHR>OPy zcd~b_n$otK2Za4V;76L-DzNVtaSB-y0*E}{p()372;bw_^6ZZ}PI-92wGS&j#91PI zKs7DSe@(bk%_Y-7gGe}(^>I=@oY#w#*Bu9GZf3^F5WP>3rn}7Ut74&?PWBFvy`A)a zPP5)V!Xd&78LdA?xQ(9mjMYElVd13a#D+Z_7&Y|xU=_C-srWU*6kiZcC!$nw*)9$7 zn6CX+@=AhmkT}X@VSsa5NKe;HZuq)~1$`#h6R+ZTR#D-3j}vF!)ZOnz+5)dI4jl{{ z44Mr{P!L4~VVJN`K!!XTF*LGrKO?IK8z<8w`3e3jI8lUGNUta*C8 zn(P`s>{pjD=7Kek#B;Fw@hxAK%$F&Q6vg9J^Xf~4by_hu-=A!MJ3Znq&n~srbFGPs zH&&aMXZ>nO`|hf|ljc?VPhR!${AbO?W8x_>CU%PFA&Hm8F7cAsOREdwU~R_;ot1_u z(ruCYB-LPGn!NQdT|ZlRy+(fw^-+`=%+gee_kY4FWHg<*4sZI8+sFJD270UUORdLHO0nA4V) z%{fwsET5CQ>B?eK%uw4yQc~9?*JVo2}ze(;aRcp*ceL#HUJSllrgm5wQKR zQu+C;QrUh^8rFfA`ftFz{YAidi-`aL010qNS#tmY3ljhU3ljkVnw%H_00aa{L_t(o z3GJB8OH@%5z@2g4%+$;fMNmOv*$Al%`v7xM3|5#(Q5$L5x=sH>3l{~oj5h5fqD6}k zQ82;~!4%SvaWKtPh|;LWalYR4JI|Ttn=hNMH>1#nGxxrG&pqci=iPhXz1QOLcoKDc zBw6MH&Ikgt)eMc7cRR_g)u-4=`G2x2dyZ(TvKi9{j-*jzjw{~Qj7 z1#}t_&}Afs6q+0;9z_lzO%8{n*=DnO`2)>7TaX>ozhI*PP60SgK8U3$#1DKi(aZ}# zWLvP^p(si>(q3O*-->cxXiL5cMkH4vk;q6i8hwR<0RV$}y_VSk^f65Mi1cl{-F}6# zCzr{bkp=WqFc=)A!&4wX4C6bR@~;mACek?a0>#->V=Z$y-pj;el{m#J(IG5aWNFwS>;aw! zY6+Ob_Zy-+17AeiG*~9pJmn!OE3$s(a9UCoJRyd|0DOKiputihu%<6jB@x4w8vRE;bFnQH=5BkON{(68;--d>0-cWjPURDGiny7srX~l?#d2KVU z0xuUGKU0bo%6*K{_I#k?W2eZbF-TOId`rj|wv?-!*93MYsU%1Ccv^?;2iYr+(f`+W zRdz`t3+y8z+n3$CRkKrM)B0dczR_M0URNFCN>&Uly5w^2l@nGV`D1hRpFn2}nWQdj zI8nER&Iq90000~vW;IQl;W|M3Mq8xCi|lVVt(w;Aa5!pgHd`aD znGbOMD{Kb9xAA!VRVtMl;d+7?f431X4F-c2KD>q24rpIRMTNk(bIWe@j@f8{;ocw7 zXmk|Vdt8q3+~-on;qvmb30M!OCkTx}m&!4Y1%3Fw=0q$m3R zBw+`~IKl;tU=xu@WR!<*0XkLAdnPT8-R z1w~=!;9FW5vk5{Vt|BRHNj)64))MhQY)N5RK-gKbIaLIN&6Qp2{(@zNvjbDFsGxqk z-M%Xa%S9umT~XL0@HMSewh5{G2?e`iA>g-IEWN_FGG^UQr*j{t1B$8IL*>wwEfR9s zfcmF{uQ-pohZRwE0H(93>i;8kantE`yL&jj3~*hULHnq~E>c7uH_Wp#KIp@d4xWF+Btj=|I>W5;Okz;KfTS5y--hfrAl=*~t0B0v?Uh1LdaH<_pf z$b+13TlbC(CB`5XW5Mo0A-QWDGk6@0R6bIKHnzVrom=a1yZKpPQYZ83ZP%6=5kFIwl!4!u4&o} nV(W^GQUTt00000NkvXXu0mjfz+box literal 0 HcmV?d00001 diff --git a/src/wp-content/themes/twentyeleven/images/comment-bubble-rtl.png b/src/wp-content/themes/twentyeleven/images/comment-bubble-rtl.png new file mode 100644 index 0000000000000000000000000000000000000000..bdfde17ad14125829fdd95b81c75179177578f8c GIT binary patch literal 1782 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 literal 0 HcmV?d00001 diff --git a/src/wp-content/themes/twentyeleven/images/headers/chessboard-thumbnail.jpg b/src/wp-content/themes/twentyeleven/images/headers/chessboard-thumbnail.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e8c84d3f4d9c68ffac39e385a898a0cc8ffc5800 GIT binary patch literal 6420 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 EKeW5-0{{R3 literal 0 HcmV?d00001 diff --git a/src/wp-content/themes/twentyeleven/images/headers/chessboard.jpg b/src/wp-content/themes/twentyeleven/images/headers/chessboard.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4fd9377c3ce1c8ba819711493aa99b5e59804cd6 GIT binary patch literal 53906 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 j$E|9rMr*RJLRG2;Ip-1HivfA$ccQ?0-7pxJ7m9 literal 0 HcmV?d00001 diff --git a/src/wp-content/themes/twentyeleven/images/headers/hanoi-thumbnail.jpg b/src/wp-content/themes/twentyeleven/images/headers/hanoi-thumbnail.jpg new file mode 100644 index 0000000000000000000000000000000000000000..9fc963f59bcec47c25765c1719783983bb11ace2 GIT binary patch literal 4584 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 WvbhOaKH)1;3B2R`bf{;K3;ze5v!v1h literal 0 HcmV?d00001 diff --git a/src/wp-content/themes/twentyeleven/images/headers/lanterns.jpg b/src/wp-content/themes/twentyeleven/images/headers/lanterns.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3a25db4afb64883ef7062de69a552eb7c7642560 GIT binary patch literal 95061 zcmb4qd9zXSNY29N=uAR!?mA)+87Bcr0Cpkd%+ zVxXgAkl^BB;Zu-OQBshSlT*`iFj9YFqa`P25@crM;^yPyqhb^m6XFr&;N|1_Ung*= zsHhm|7{r*E#5^?QG(7*`^0ya&g91kle+&A>ieW;cdn2K=&pGQ`82 z=Nbnd2Ot5sSu>IF!olWET*k>#qZ8(I;?VjmzpX&glm2xYrqi~U#vy&r{#k`X!-dUS zSpJ@J`x)xcP9&>@MOT6o#YUD?U~lMGNWdCEpW; z-)z_b7e+Fzuvs<`s2Ue*l-XvbZVbrUIZ?O9epeR2L(j39jAQY#x33X7;P}9mlZQ)n zERgPJrnMqlWti<#I=){{Gu^Tr$I4NpfqtCca5M4MC~WZpIp`;;b+!wJph6YJM6>sB zSmaE6;0l7@lEfTGv!<)d$@|c1`yK>17Lu%yF%Bk0NOUDsJ2dth`Bn2y$n|v!N#JwS z1nZcesnbMgMBk)kiy{%ZOvv&nU7o(9ciPLqAlm504NH1yzRH!sQ%1=WLxw*Xd64UMBdqls@|mzwRmJO=}IAgz@QY+Xo*e>AW} z0#rW2ZS3V3mwv3$$%_aoitVh^&`rgC1-lE3guh`rakJ zTsFCe4LR3tYsSU)c6O?rf{2?fwh_6JrV%3FNgG*wsLKz{-Gi&eQNR^qeXJ4fN17)6SSU?mxMw_2VbN}+u( zdT@UM`^<_xPOv{WcCYXb-BQm3nyrxf>tuBYTiU+<(nHV|{A>40HOF7Th<)<}k4f

    H0J7~tDu%4BgWX(>+R_J5;5wG6aPg;x4siU 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 z zzr}MkbGoY{d zy0s*_@qx3x@+|^ zSzA%wFVnRd?Om<)6-$`kk|ZT0A7XHSy>v3sLc=``wQCD5o3)ni-Q=~|;o+Dw0gewJ z9=`SDZ`0XkvTCQ#XI`nsx>J!G#<#NRxxd40WST38${0v94o3}~@G0qOy8TMear4mi zHbp}}CNoXx`@KTWd#E5GVLM$jlb`xWb6%3&Z8X^$=J46cR7!Dkk4P$RkknU3I-!kx z6%1KRVblYHO8xWuRZG=0&i??zr_26B{5_jDU`ZBYY5kMT z-)wIF7u27J{s>=OcJg9%8%w(gMZ8z?TkIr~Ll^v^``5TjX`x;iW zOP!)ukbrk!IRKw}%{?7bd$Eib!s$nXonp}0XqQ*E^USXVdxDoF9(`(yJwBXe7twU5 zH5qvkY1)OSQ$uNMbp8d@ZXCLfSgsC7xj60ju65K;O652##~<9;Y&gWcn{7fdtZCvG z)T6YJH;T;x3PJ93pGxLw-0Qb7j(l^`3t<+q(VvRiDXi|bJu2!s5ipX)BQtN7Jomu~jIpe3|uiN&Q(oj%kZtOSy|=}|Q8B~&P08k^SRAzuG zZsgDhI0L-^R>M5f1LZtW2S$HN0PO%k@Mr^|ag#s>q_TJCiZCFE+~*|miZCK;FNWae zmH>GVQ_i-&1{Ju*=I=`aXb;Cp;#J&B9^)OUZApnD4`Mdw(A1M2KyGb}Ns;fG891<= zI`y>s$nF&b6gdh_LfZYvIDC?fwo4|a(_LBQ@u!W8?d^~Cu2lUtNn$U9YSyfBxgJcA zYB0w>o{@|J;se|tYUa4ki8$J9qS#psrZu*_(zR=Z(y#Q@mQ_u@BM-~=tkPH07j09* z3o3;8XvAJvn=9Lka9hKULaI;puTiJB-L5iyvxPWqlS4fk)h_R#w=1|Y;Nv@fYc{?c zD|W@2w6=5Yv9z5hWG^EYu2|ek$`$wk08VrIRy{YW%MIMPOC^?RdHNqL%Jt5jaiqkM zNJ}G-K^|fI{{W?Rbh^6rG2I4dbf!*f#6r5H_N<4)wqZ-{a+@Nd@2fbYwtl&CX2=VNswb_*u zG0U81arpMBK0z!C?k(=S2K8Lkd-U*Vlj{N{_`5^n%KIUIUc*#4-uTbT(2k%zJ z#ga&!j-@)1zfj11hZQ^%X2(aow7D@wD>Jb@-Mwh!I5vM-Y>^OA0|oY}3@bs_BTpld zhCEbX)F$vT*0qSBv@EVWXT3!&qRvd_oz;kwZD-(~Iiq$#qng&Nw^q(0eC{3SY;i(( z-WIk-Q;#Uk1lb6*!ErN62mp!_5cj9GIjru5l%(KiY51vU!4{3obE`+Vkx+4Y0%;&~ zfl0>!lHW>+G<`tDTIPXeuUWJgC=t#!&Wbm#525z>s;#CrEHp|JaA~0xui?&%ZRVY( znY{=;7$5#MmcLD{KdHHXrP9?;q_7Wv&=5Jzk@e6Ng2&N0EjKA(Ecs?)~oeJ(HO28B4| zhE=ENeHVYPU(0!E^-@mYt-M6W5Ru4S931|YvrXzcjWtk&;kk8|`7&FjjN578ai{(n zejn?1v%_O`d2e+I#MTnXQdp0%R_FB@A2sRo_Bq>LPp|&~3A#E9p9EfN3)?J`sqgx8 zTwPbL>Gbxh@a6YiBTO`wPA#T#=kOa$y0}QlL zi^DTle}X+-Xh^o2#_dO9l9VU(VOHiZ$g?Hj#olz+QfaRvUFjF7u@5_lizpv)#Wx&w z3R&eB=v_|QRIY{y=1B(ER~(Q%0rVAzTcM7sDK^txV7{xJX1Au6^6K(9 zsL!@>xO@ucdZoH}P^jFTxcl^I(|eA4vA}eeuymC2UQZ)QEZGVimPOpe`A2YgtW@e} zu7|Z>5ncWGE|eo&w?4);_Y*LYscK(Izpxr@mWd7Q()lDLG%7K_(;4rdTIF3EmZj4O z^Nt_i=N|@zH7IYFMOsHv%c|E}e0Z&EQFaDlc|l_o^?YSsZyT zs@GhyZS>t&OVnbINqgI%E*o}Z3^ssrLH5tT-njQsbxqo$xJN_XuGXU;CbHu2Xkx+s zx#zZ?R!GYc#(NC+?Sc2K6vgUgC^+I#SsdlDawyks=9gI$E4YpU7%75xCVb2D&2&9B zQL3CjETZ^1GLEj(*QxAn?sRw}Yl~6*Sj&GG2eOY&GI*_8N>-ZLVqZ+UUjvmEUsmX@ zyD_$UUsBoLq&8Mk3FIRYGAnNO%C{BJosh1#WZn|;VTzXRsd8*?7pNuEUr)Z#WQ$RB zW?7+7V<7Nzjui8cwP331H4l9<%3Yl&ZLzOx*Cu89Ls)4|v{vtTyKkB?!r*cZZiTU) zaAC7gD)FBt#?C9PJ4uEHweaPFKRSW5o@POiEqF&yO|7zt;=kQ6JKl=6)C7`898!6GK8CigC2P1IqJ`H)DL($I0w3A9}{_u2bm78&D;Ky|vTU~0iG!Y2mAbDS~By;^u zdL2A0u9X{JS~#+jo!N&07a9u-SR%T$Robed?1LTO{{Yh*XSX%TT7|v3rTa_#9hD5n z_>1(wyHV7yAO}phxnTvogvTIX4o=>q{{V{HrJ-lvYwBe;UB|Y%Mw3bEo3i$*jOJF_ zvPR&OD<4pPYnQFisX0nq`TY%aT^AI(X2LryUPrpPxU{#puyx#RC3a~E9k2+%2>n zHFX`$teY+&mKh3$+bAkG)kxowVM#lE=QHuJ(OVnqP*-jLo#W;JNWxEbenQZAW_;C z%ihPj;EypLUVg&58hs@1{I3xqZlPDlY+I?#j}>QAEHC+^EyZu1fhea3hK$hEbBT1t z(q7xV(OcinVul7D6n3lmN2;;MJ^ck_txg%0OPBNh4Gs!;QZzRjPM;;Qz0)C;QZbpM z0H0iL1HL`|sv0j+oNV@WFSo=001SotZZ|-My_Jrm0kyo0OKT^6z5d|(8tm$9lqrGD(!_0{;L?xmyiCS4puW6t=xh*id)@hDbR70NAbt_p9NXV%HtTo8wQn`ClJ% zL(~v8-i0-+(_6uDc^H8i`7!Ed7ghlKvEB9}GO|me)GHwfuKwSpe7@^Dn(({5h|A?+noc7IYZp_IoKjH&*sa}EIFMxj04Y0oN%ubWv(xT`H4WJ= z(T`PE(6*x=r1eT@*AsY<%+j#%_&C}L4XN?jj+y&X&Ifk7_4cizK$>w| zYlyFMPVDC@NXq{JO66Iku8VVLDa6+cC2He`knXI!xjg{|wxbG7JoBVtVA$Hjoa4FU zHJ?FLUb}Tq2`-7=+OH3mDuYc)Es+(#7{)-aO61YUa^#89)**t$hsda@u_+a8wp~u# z9mu5!Vy6c*bJ+6nle(3P!^CbTR$auuaqZfsrGQh{CsgSIUb5B#g;_+&r6bI zP(X9;cqXN|d>Sh*m9>~DCTL~$&N=w26o|APdDGgIN#VnPE;0PaHD>-gBe9FE-&C=W zWWih^#^pFQ458ta-fJ_rl5N0t4rgU56iZO$KtTTSY@WuXp-(E3i5cns1R=VDwsWGLsi zHHxoGlm7tsFFj!|x5=W-Ztg2sC)Q1-*!Xg4Ht|m!ia>J^XH)maNAFhpo%ce$l}Gb& zob>+y$zGO~DP_KoJG;~4)#OX96I^?Ag-B>FU7tMUVCN(3O?le&Hff{n>S|KYl$Z54 zPMyt4GQqFXb^UKju~`nIrM;?_X%<*nPhrO3#~-z5()xuuO8vN2+i$G+`6{(Gx&Gbv^QekXyrqU~ zii~(b@ax))dUe;=u$fAdtnrrTu+H8{9~ES@RoQHPrHA$j$wn=+3Oc`2g7#S@a_H=L zTed>}o}#<&)2Vgs$1Bg1o%osV$TjCw-%R_XV+3afQ9qL%hI`euXzGf?S!5@4+sF<6 zrFp2LJ=M#~K*kvHS5-xIeno;ZvQzxbYoh6Tw_R!y+AYY6IN~lh1K}wgD*R@!>aVBM z>-QXU&+qz{!ZW?&JO`)YcDv#T{98nn0l6Mb9OoDw{`si?0PX2&GJa*D!B$K1JkMLElCZkm78#)%}h zz$wawwq8Ef2-6(ooV_}fv4JM9)7qV^vff(ly-73T#TdbLJ^23sYUo#FQb^$H{U+FE zP~{k#wSgj5cwR`(LY@0re&ZE+#%ZU4cKxVSA1OVvOCu`-9=XSAU`b6yjD4Y8KA(7( zu&;@63EW}-0PaS>h99+6eG2N`Z^@qJMkFD4Y&Jz6Rr+C zw~!{(EM$dlB07XypJ7>}+8FxzhXcR8P7%Hm#$x{fMp+vY>0onZvr2|hG|Mx}cgE~I z$_N7iy@B@kr#)otj@&Lh6spu-NZVgSZ7U_+%t}jOpE7~*l5lF@#My=IL4P63mCG@` zMXO%vt~A3e@vqbeQmut(^T#8;f6}_zFR5@!{CqRB_;&1Zk3Zz6 zrZi24<|uUyfG$8F@O=+@yI*{gQgp!2{6e?OvZxblOr~zRyuA^qP$+7C-_I z)RR!2o-=ty-5;;tL_N9vUk#gkb)B@8wr!At<=1O&Eyu-q?NY63T$0O646|3NmGj>w zpXe&V74#l&+m1LqOT zz&`jQy(}ZKZ7|91<+9xw^nFWGj@6p#J=r6-By)`VRa(2Os+TydvDFC5NgkP`^#s%F z3vD91LYHQ-9F26lIuJDO5O-B67m~`ZLDFJgOBe}vq`76PCIb^O;Ebnt=TKNo-J#r zVo6wsk%FXQ%Yc1wYU*o_j+dTrRXMw-`ks*$%-UUzrLCR3AHshMMRAu^&vp05e{S{V z?AfVul;3?|=_oiQ72rvA2CDr=CjS5smNi}ql16_@b-LkB-JF)UlIfI% z^@=`|tfy?KpBc{&`msA;_?i*)R*b1@GnvX;E`N(EY&rJ9^&b`Kwf?6aEL2k6H{ls6 z)48{fjRcx-NeuAa#Lz-_oE}{)Kny@P>Rp|mr2EaPqC;|JLN_MlZ z5WX2F`Inv#zuvgo{{T&?*D1%3Ke@7B#OZKAP`UyAXvQStRilG2DQ82e;a_ zy?moR>I)@5hfQHKHLB@rb|XY>u)x`jCTIxr%#|(MPZlcs={qLrqkwh9vT2x@vOD6K*0* zcILE|7VZaw-he9YoKOXOuqXlyz9j%e#>2`e0w{rbJ?If;;f#Sm6tfa{8UU#NZfFCf zVX!Fy!UX_yfJHDm4g~;ku6d<^Ba9jVZydJ3@XPyDfuhrKYQ5QWK@!+*tiy9E)RP_q zL&VC=jgh%?Sns*s@gO^;KY)u-ZiVZVdjxbD;N_PkD zD}nV}Q+*_LcO>!hIU2s8nw$bMBeni>o@M-63f#+`mbNOzbzaVWr*>1 z{(O3mdhC8VXtdFeH%s8>`yTZ3(kRyYB0it6Tl+mxo^9a@r<8zm+aDD4eyRA&eXA?N z6`F5qJCiV%b6i|%F-JYjvaCcZ2Xc0gjP|a?YJ?xqlF64Xu1!vzsdxobaBPeLR=6Ua zxp){{YOpZcM%Ek=ijTLRP_{Ji#coTmoB2j@f!>;|A07)<=f$@%?i-ILhY=|G7QUO} zK16_I`%+0053{vI4n{>i;kBBsn43^H9vQTbOmm&Z zO*J&c;?bkjFD~tnmeb_`3~|U6Cx$M54Be+x{T{&fGLh1o~WUn2x zRkFv$((kPwLedG&dFrsKIcNkQPDqd{Cym3B+G* zqs=UV+1o!Ynm2-o-04%r9u`yfElFB~U=Zo=sFWF7Jmlo&q~K4{SSMmQn6Sx7Ydp63R$mnk<-qQJsX3(ZG@0A|Gf&qv z;ct3^NRMDn3ZM6^*V7vo*`n&^;mTs~{RyHgPSIQVek>~p00JWe`Ip&_JJxrkrKYjt zANTHC@7eNZHP6F2u5X{|E}>01uy#)8C~?oHBZ|#E15(XAex=aWD6g-u?u+T`O&Gj( z&bQaGo^B(^hAe^#=lPG=R=PAQxqG(1tHDO2RPB3UxHOV<9&8A3)R^II<=3Sc+m((76*D}9LjDD!UsdQ`nTThk2 zp0(-gJq|}3o@BuQ5HW*WA*76C3ye3P{NS`wC59 zu{LFd5yi1=&l;)?f1d1=(}*d20)N4 zfQ+=Tm10=73-{y^@mS{^+q*lu2urREjr`j#rj94w7;h;A9FM(vI;STEyR+8mmip6Z zT{P^aSaN%E)oNw3iik{COch9DpKa8$$u$Ll$n^(I7Gef_lBfIBlWeBN7%a$LsA&nU zrR=ex7t0~rxklMW2bHn?54~R*?ZM~uKA#Ozoa^FAo^tTO&PR-5U~pDNJRi8NUvtYf zhlW7E>ZVfy+fAl$jNW{P z1#&sZ?_JFnk4ZT0i`@AzTd2D@YXQ;f2UNEO_bkz>hEy2?9f;!35=^=L!`isA^vgZJb9d}-Q^Vj(d2u@5&TS#^qhrCC z=Og~n{`K3U5tR{EJhRb8y+*Qy2_%=#Y#ns_h%7EIX1bh2%n26g6`#<7>IFAAO2u4K z&)>ns^&J&jM53nUFM)#Sx+UI|B$f~xdzC?hGaTbSySS{+Q>d!n;!AXX%ll)KK8?aQ zDNE^J%o^88o;XL1dtuKD8WJ17>zcND`rP)YOZ7Vy`o)!FElGZufA{tiYkePN@vX&; z+NAEsDiErlo_>BSZkt^u+*;uo=c1$3n=02c!Xg4lZxeC=ns;Jck2rMHc zrsVR<$=IO_9iZnK;-(>u{-;td{w!ciR*BH0T^YUko zs!CgttLdJhI;*^qTieB`Td51@z-Z1m0Gtz%T%S9HU1q}K z-trLNPznjqs5w*4F_FRjYaLZtMUizrxx+1%*B)7!)YBu6u;cpU|Q1jmh zkbd6v(4pCDm6J)e`!cCNZ78lXGSaNmq)o-0%1H4|9#VBvBwUPVw;v$XZG^RsHdlh9yC1+A!>Ei!250|S|rW-aMJ13bIi ziUdJR79xN?0MG=3ZE66RlMl$GG7^wlm;@C?waM>53t73qq$B1Am=N91G=TVXKod|+ zFg_!SKzBY&Qv>Ds^`r#hT=Hp%xWs0bfFUKhg@K@X8QIGmhylmzNQ*@iLOd|zw=^&W zj4M75y*z<@mZuq0K*-xqb8P3smD4@;oMx+?ai8Wy;U^xMWVe@6Mq_K4ULtpFW+Y~m zYOOq_$VyUc4U`8X1a}o-0mZLZY8H0h50XY7mEX9mR%k1nw{&TSs&S42EH(S4z8f`meMfI`Yj0~am?D4xsE5jN?rW8)^!cgE*mIL^pIHc{ z86noAaV6AfbmxJtC;waN~o1=(!d7ajieGa(R_Yk{C803ya zeT{lrudZ<47s1V(B_1St2941%2xGg{Ci*}?WI)+`*C$o$9Jo@lT~?j`XThGkjN58+ z#pH0TcDQWr9+|Gbp66w0vn8BKrb0W{wchIhJYeOsin?oZ?*gjz3FjFAZAtuMMnOHe zrMnA}HQnBL0%Yji5HqXX%h2(gqsLvat3z=xhZ)GQB>3;j~!_CQ$z`~yS46(o`b!3LHP zA|;#xaB1NU6?l>#Lq-rEG>!*uDPRi3?Yn?!;S$RmX!@MClPM9i0(~i@h_hvPtH~{% z)I+$A_^I$mlN)ObuC~JF4;RJc9CK0fNZvuE#BG#9CW*1>RwmH~zQ7adddyM-WvR~_ z=d%FA`qb3^O58FLZ!cHcozhJd>OBhWG@PRR4MI!FZPvf4DiHQZAaX-yp~EGK6-Cyj z&K%rZ$&vn1LW*K?Yr*pVCD>dx&*Gzd6*Vof`4;9Mr}b=;PDrD2)S}3^$#PgA z7d~n2Vsq}mW}@)AV_UqPO*R!`;L4f)RhfYOvq{+c9>i8Oi$!ta+sBOMjD)#AY|~ah zBH7Q<8w?TK#3PA9sOJD`UijCVb~Yn2^tq1Wx|mgO(o2Ix~%C%GfG zx~`#bZmm0Somju13VnygYq!(rn)+8~W*(cGlikP^m$S&ud|jc=NDZF#bTswCDJ9X+ zqeD~@ZDo|G$Rqy%XP4?QY&dxI{wps8AcVjozs>H=hw&)-Okd7N%Pl3!=?i#1?xoI&8X@n{u70$2HqL$kwlx&u|O>m6N^4wm>F_}v| zkCMl^J@Z{;lw-AYVQ(_Y4GU45NYz)&RaotC4mhf9susnF|edF@O+i1W%lEcCwJakft}VLFsBIeDU;oWxnfqQvQIp5nSsB>8}Bb0OTJD zPUHUcuAFIG>*buCi7e#0T_KduJQy~yAXMbBVaFra9sBm?rB&-HGyKfzXeiT4aFpei z{Cs}D>;euuS3vdKQsAQI)(iVtA-Iov;E~T`k4n0>(^xR;sjk{(8x~d!4BBkg`I0QM zsm~q7bkCP%X9kz2%>79qw(wj!VP54EDudI1?NsVDP}9S7pY8Hay4{Zm-&l0sl^Kbr zY34BF_;TZEVVvjS`&Xa8)wK^Q80W9Cy=fx50oFQB-&{|q(poDiVoja_L$*Q>eEJ-5 z+NY-VD|E|k`I>%y1#Xrz<{Tbrbrs#M+?LZvwpiG!u5*Gu)#%}5Y>Je6XEsr3?R}tW zOqjtRu&Lx(D_3PwHk{Brm6ef)*{m?aLGy@}Hdl07~UuOthMhrM#}6hG>IUz^3;`(%3O( zRGeeNl0IbIdmo?HyC3@)`%#|9&wpbdu=li|KsG%nZ1mfRY+Y^c@AjkJ<7b3HB#a#4 zPqqelu6@3yrDBwm#CgK!CF+M5ymrgY)&BrW^yGS4$gAOQ{{V`KHP5?c}xU2mt3XNQYy$FWK6@IJ4J3J*vTDf;UkBxirKt*hHTc2(lH+F(!eX3Qm2f5mPP!GyxTS_n->hi9ApTT0+}F zJP%3$;Q+ZllmX4fvN1prc<`Y6(gF)W7J>k#2MOYUI!Bg(A-e|@fG9|+pnB5~ZMu)m z@j#gw`N$%Hi`2YtU~tO;wY3hmX>)i+Cp z3em;5`EmNyk!_-AsKSK#N&V`1V=j)_Tlw0Iv0%K}liAx8_Y59OM~o7${VDDmSqCt= zU(Pf3qi~Wc5Xz^x%?d>Jjx_5>@gv^D&CN+jt)oT!c-PD$BA!Ty9$SN~c*6jLf$d9i zB#n-ps%jWm$|etEx~7<#V`$*LoO zUIvpF+%$4Swn(rD=Zc8lO!WFbobSB&ip2UF1XlKvTYxOJJIHhCyCR{Uh>2Ueu7a)3L2Bo$yv3*OX5eMSUy0J^$HsT^ZR}3mHh(4Ir zlU<_OzZNuYxL*(-`jCoV%wx_$StrH-Z+{mwyFdhI#*qI2DxL@2(Y7p;Y$s3rRMBoQ z_jf0Eq9PEZ{Y^hLv+5s9SxCMkOh%!lsF#6>q>jaCt7!qeq%`;IC5 zHLlpb%O8Oy-{Wo6z@@!}QIB?Ff3-ClkY>l(p1k}*y}cyMHZ$m}PjUqjOr1(3W4>1= zks^lF579cS^JQjF^}@U>P0x>IW6rx8(Xr5ZKPv@a!2}CH%sa|)q8XLp`3ro=We1KaJXWp z)L^u=X`19ehNX(A?~3)wyd1MV6dom-TuuJ~?rx_NH^Dxir)ngL$FanEcAq_*mX|WJ zPq};|y~a;}(z*KEuBE9#apcidAwC~vcN)yvMda4^mf}l<+lR*vF@S$jQiN#N)TI9a z`XMJeC4n9Oss14|O2cV6I46bsdsf+jVe@spFo_ znpnljsT%04mrZElkH+v}QU{DVagXIbxU34<>Z@tvKX3AOp{Z+6_-EIG`>nQdO7cgv z%$UjJbzq_{$t0iUHE1ZZcSXab`4b5l5z3roV!Gbio5MXevJjPclFukM!tP@%p(aRX zbtlDdVdw{H!>Ot&D~zS#9RC1R(Jy6tOY-<%a)Ebmr^fQ?iFn3L5SiQJkA6GUHqLEE zj4Xdc&B9WuYH{rnp3=><C;`bOd=j#<#@^Tu7z$c#a?+V^&MqU)5-2#8I-x;1+KQ!=2#8WZfDb{lH$?I zZ&Dr|#Zp6z0>FD_sMKjIzBrk6S4y|Rt+Jl(_fEGP)eMW400lYD2*~#I&!uoIrAFC9 z9UXdFvMNYzpj=L?sL6c5M2?~{AD1cyNj~}QSoM&`$kzGtG@6&x2YIDv-9>FZ^|VQ4 zEFs*qYs9A+!O6hw-n8kpT8$jlQ+w0L>{F@JLQ5;N2P0bT$t#oXUaaH+NcQW_3Hwo$ zFllb%LFGb4Jb_TYC-R{EX=DgVJF(mV27olZBWDa>Q`DN2YWBKt%t*tDX8uw7cl+X^ z$;EjcY4;L!E|scHexgY(5Vj9sM=SdfDK)_Jklj96EOcuKP!I%Qaq>+<%Ass_&1Djd zoL*3CXf{{wCD|kw1b@we_A&eVAJ(B_uB!7T!X%ufF8MieZ*yiPSG_V$zFNH-n z7yS4z%S~ioMV9?dt>`i=8pWHs;|kJ@5_y7F|T4CoXpX0Nx4NWv!&RH5Xc5 zr6rqvOqTMfZ{m1ratD3~rEuXorDodlo9iaDWTFq$D%8p4{ z6>-P^05v~Ls>CCuVLNbV>BbFuLV9kW3o_~c_4j07Jcc|WZtLmcG4!pe4~fCqapYD3A}c>F18 zWO+4OPL*jbjF-2DLmK2LPk(yl>$Nk4)pho6(bA@zq*<=%8Wf#4`h}sI8;J3b5Rc*< z`&AlkR;B7ax#6er;GOzv;a=szfoxZB=c4$4VTxS|k(D-{D99SU52&xw-W@hbh1^J< zL}BJ%We3{1x}61cld(KDZqr?6R3frCn@??3_v$kXdvzg}))SDY+@F87LYPK{^z!~r z?S73rp6x@&*?+ioyI9yJEp5>-KRM-(>r<4aF4@+n)3o$2q9v=SmRDvVu=hQwBx#jv z1eaFbfw=7*^T?wFRcN*buvvbtD|pgUFvUE(s!^Px_%Yw0s`%n)A~@}}Eyg>CS%-Cg zN9k63^74)~-}wAjk43`L?b_-E>B(vlb{Cp_G-Glcuu!99n z)E0_z*Gf;`j36kJs%+HpD>v9tgaFcYgkXOU#6PYm${qnE>dDyoL*wPB-YuZd)E6># zLH+4D634(Km$w&wQy4k)0;8OOeTPQsx~>c`q66y9PiUJocAtcL%K*)Mk%Q>DH1LGn zz6Q|#7F|R?kEyd`&?Pn%o?oXVGO`+mMFFy!nf)dcrHtc=sJQBo=tlbf) zTgu5S7j2Hrkd_rKqRF@Dy%x^dRc`E^7jLoM&pCtNjLlT2^N~4jBIcQKHr^>?~~y&J~Mr zsJP32#4$mXiVztyYLw@$q3n&3F+D3EYka8MB`|h@Lg5FX80Od_SNXk4iFafi&_xGmA z!EjnsW3c@ik|xne3@3gh8Blzu?^b`L#MUmC-7oSKZ|1RxNfP*nAQW}2!p|zKmMq1=sqf1O#;)&wJf8^U8;5@nibtaDmj8ueB9-G9y47W zlzxMKJ{aa`pTyg3Y`Mwo@)6EH1uW&0=wm&d)YmZFLlld!W;3&v{{Y2PZ0VF-Ce{f> zO<~0iE%fD?;J>}Zmodkch@l%wu>=w8!5mkczU5PuI)BRi{;R>hwCr2#>`i;8==znD zU+HKgkY{`?Zp#(>VpC5%cNk zKrp?^paCvrVcZWfG_mD|LUk^mzSFG@<--2}1-5@3Td`r0SgY4*?z7rYo_PHWeVZb; zBXMOl&ZD43Z8Y$Umxwm@e1P7WKAEl^)kjIFbB`(ZjnS98UnMtF%-S#0-Z=V%AP}b@ zny#oNe&{Y4-1Id+#3zn0Bn_12x^Z7o>oplwyd9{Ptfk3F2{`^ZXWPP@@&NSb(xWJ2 z@|?|grNdIx;P%V=hg)vGMYWD5mB7eGY(_E0aqGu?nxe+2{wMzcW(|EmgsW{SbHjdc z{#e&XFlxfwNhC0F%#qQE}S(1pffg8Z+FwS?cme zp+*F%8!h+aiq#Ka)j}!TR(bL8WR`+2^0HRl8)K(Tl4{r9B9PgNFDTEZ53dzsVvH=10QU5%s`ZUTEKgG$ zLR@~Ia=GZCx9EJHYTH|aPujgoM?9ug1OO?Bqh~aLyJ0KaCV(Dmw-VWO_MM}7R3K^O zR0MLzjOV%a{i$}zw}pdI&=!qzrMMg`WlIx*&&_4k>uJ+0*#7`;CA8H$AJS;8boni; zqqn&Mq>CyWAnpM0e{53H>gv?2*2iU1gXFQI+@*IigX*USud)ir?UzJjCl|R3E;Ngo ziz3{g44kNLNawfru50xDt+dt+YgC$9T!2fZT-(JeULws7+7$-Bg*@be_V>xsI@QRVqe^$+Xnueqt$f#>pMGZ5h*g<+(ZK@ z^8gMHulKJheHTu1is2@2guax;nymU%x6fgJD#>okyZ#_%Jm;`(+5WZM&^g0O0RKP$ zzxK!K{$IZ)OTMY)z65%nrnlu9!eY-7?L|i%W3U-N6)iT2S0^d1897_K5RYKCmscG} z4aJS!u}`PY%WZ}jvybLs=Fb_yC%C9?wfx?0;- zjUGEs4Y16rkHP2HIQ8xETIH>_m6^+fGoljVE=6}%%c5MOOQFLY>QA0jF1xYmlaKFK zM%SrLs~!ZZQ1O;&Gz}`w?#^4A`)H9jU`w?Jn2>y<91h%?!K&0w5>SIJg-TB?33|ph zw7f7V-3oIXs%=sT{l9AI`cvHv@3v;u<$X9ZQcJZ*x%aNYgsxW%dr$=^SZCUS7DdbR zKoPm*@j$@|phpmHlOFT|CXD2PKoJYKy#Q8N7Bm6CJJ1I}9<+dy5snQoIgE+`i5Lcu z5%d%Rd5G@FQ%nL1m58YX6F`?IAXdQ`Gy@{`vX;n=vG$`33)UyVWJlb4jlb(p3_+V` z@c4(X|+0N$e-uWR52xdz^Np#*=F(FHO4Ct?>>CgLYXMaapg@S8vrW z{!6L8b$(uoHJRqrFO8^SwGZ&sds5SB<5yj>ciQai1ZY<*dl6eUvo=F*x@L2N#EO2~ z7Df>CyEO48H?ue!Nyi?)(y6{mm^sL@s5>U2jh3~iXttBZ4x0koUQE%)u{(QYn)A9n zMe2Dwgc{MRSgEO+=>4u?!qp@GyO7XmOe?OWm=uWbkP?jy6SQ z61UV^+T~?dH%bB5i|CYJrBtCt82PY zeDrbko{wGW$~;J0b#VG^!GdW~Sa$gy_0opPtfR+jG}ESgCV|^kf&TzC!v2D%u@vC= z>UN*~)<0oFiWynd?U$Unr-T_kI>or`jrz452(9(FG5-K9e^#S`@>1I59*H0CPjFzZ zx`9Vw82u@3L4vc?j5}@r0P&-6V5s#Z-i&{0TZ08H)E6Z1Sm)-A;ew~u?%1AN_ocir zRNAHMdYU&d!2^4G{{YR8y)DdmL`;`${{Yn|?M6j|raPA$mo&0G9Zf!Y59L3t832oI zA)4wnxZIGI8`uND{VFn(#~qT2P2r7)NG;9ODQR%RIe7j$l_38BZhb2}br{dN!F{yF zW7>H(HXnwXJ+S`(^$WI^LBUiw#d5Fz0LZk}tk$=4{{UHJG&W1V2NHA#P1?K>x+n3$ z*v%&y9*6Y))zz!iDY6l=En)uv+!THqSeMEzewotxc^759yLipL8Hj8V+aJAg{eIh2 zAu8pB`@y3{2)Q`OO<@;LB;^f+Lg9(tvjA8(tzy<|b&`se4-sD;e^X-7*9P;>PfF>{ zBH65#b+iz!aJeAv9{hIZy%vj8Wwfc-u+CMrD9;gQj9aR%00Z=`JJ}7T64^#U%VMOg zV%mh-i+uu?OO3b{V&!K98cWEY%c$ph$a%}4?}R_zp*w4XN=+>Azfq_+%F8six}BuJ z7G=#!QEQ>5iAk#I0rs@fmiDZli>WssadG!8_NLZUS(WRPrrv0nju9iud_E5>q#oYn zQGMz)d#XvV=vhP)p4lvA8T&hkG#wh!8+k)akpi|bz;~-3{^Mi?=bAqfpwvJG$ zUrb?#^2O6#T;4}@Jcq{ABqlc7yJSi|7d^+WYlZ5T&gsHae@A%ZvqqK>hH$wM>8UM^ zl;-l}VU(2&-ly898h;UN93#SfvfFG?gHN%1J3>gnr!U;{dwN%1^Q->=kN!!oxycFe z+XasvgB6(`m%&>8Kz90inu{!g;I&HZdv5GM?agPNs+dpPa^$iwn_IEL=r$VEv)D8EZwa?ets9InJ^ui1 zE6D3~__gKdb2_z4FkfL-kJLJ*v#V^lxB6Rk@gr$GGnXeA=eBqiJM?sE=-n5&@bRC5 zF_fh)uz>oiM6xCea~>{NZ-tEP`+e)9=}>m!R%hw*QK@PR3HE2xqxH$H+H}(;C>L-i z)O=S~eyOB{{kd4OVN}@GQZu_>#3;&Dfx!pR*5xH7mC;|=HWP7esV(FZ1ZY4Aah`wn zDidkP3~AuqJ>J zwzIG4p1CbI@aAn$lJmsN|ondvVKHGSSP|B|7 zfVr$U-wI>8Ox1s=QA*}q{0*V$kzuLEE~OV1r_QdJP+KF)!1Mc8Ir^KrnR{yzTyydA za<28A)cq?GV{3yZr(rY}Yj0;fWVAA}aECmM4@1Z`hPZncD=cnF_P&4mI2Kzro*9kO zI-=20ZKeVnxe1P0m3*8NgU`Ks4M(QU=1}H6rR2jMT4_dIhFRI%S>4Yd@mb^LmAeeq zODv6$Q8Y)6OSKnEtsL6i&H@=ki0u1H{k_g9>GM^dEPT(-H>@8s}diGy!d#~*)88uR-lM5Aqdwsq{OHMOCyO=wnHZPIEZ zQWDE7AwW(8Dea$pR(*D|cfr@Q7-VauLFF?Gtn|*csq0#d_Bsr<(Ib=LrZ(f#Z@<44 z-_mO7u82lni^h%8MDOG|t<-wGHd*bo;@`=Z zdU-`|?Ccj%Tf;Q6A$bD-01RV1`_w&RT7?)Yo+95b{C?!Lk&BlgTF$Kn_JiYGN{J&r z)DGKneQ-T%ndvplPpa7-uxQmJ;giiHne3&wlG(+@#GH5tr}F33kMoy8mXO0B!l=)c20c%F*B4Xi@`9C(<$3uu*LHCP2YY{{PpO}+)0*j|;J93< zJ-vU@vBDSoe?;(W*u0?T(6qLaCl>b7sZ+;?`E%HFlUsc*R@pf@H--I7+O3g_!sV3e z5LxK<&e1K@F}@3UPnF2*aM|bmD_*A*PFMyn|oK2ES0D~*yL=-k;}5(T^!jWPHq~zGki$#8A~_;0*yLuRIQcKr*}E|d)(h%-H;BLU z?azF76>gq;C6AMr>pCTME>T}pc``%CZp`1Hu8vO=!Em>^W8MD%dNKq}oxwQC{pn;5 zuAeg=O&J+#X)-^*?M6fpnj;bBEkM!t_&N;allsyb!==KV@%zviIxL~j@`^Ghi#~!g z`9VKnNwC2r(*w2wF{5zsUNlDk0PUKKm^Faw9+@-0nS0XQK+@XuOa?LH3VC6Ii=LXd zv>6S+q2zHWg38`E1dRR78Dz%RqQzU7V;?O`060t7pjB8xjmIMcfyH>gQTK1MUha6| zBdbb`Vz!w(==CeDMk|!LWPlzJ90T{ODE2FZgO4T7PqYiGbv^Zk>@d7WUqg|eGwD~+ zpssLhILG%Zl>Fe;=&AlRlLeK~Yz?uAAbbyMojOVCpSLH44vH+XRm$y=Zke;QxoPe- z0>Gyjj|^ld0ZnSFOHHe9xVH8C{0eu@JZ@M22Kq~w-LQ>glce->+)ngBe?BLRr`$75WbNB%)na|)Ja%IB}t(+w1x%%24@ zb!FbA6o*Z|N0Ju7g5+V?eZZ(y>w1ko*y^E_{{Ymw9hw-vV8P|;9Yvvx-RUnRj@aAd z0Hf}4U8?;~i=!`UNwxPfy)%njz%@RmxwO|KvA2N)J3}+F_CD3)s;bRJPWjE}Ev$HF zX+|mGF9U1Np|`YIBQVM00g)nGyRUCT7QG&tQ`Y)?RGU)ye{Ux$QTFa{92s~zy7y4H zb7^BcDsE{U+Z9v*bCTq9_O4XD9!WoPU)R5rV$?^3x-Hdup5*A!gpw(le~A%^aJck8 zC+3ZoOJx$wVIDF5-uA8Y>f zM^l9z-a@+5qU`jYB1`=`=Il=zoJ8{O4#(F$$NJY@XeyW3#rTQG?tXgIZ?y)Tw6n;} zyk(ASR3R8FMPRMT$>omvUh-R*E|NxKP^lY7KD9=nbb3GhdS9J>gSi*@ZRKOft5#Fg zu8L#E(ZUbEG^ASx!FrLi^DpSN0_6DY>ra9M%`>WQEbYaM5#f49$WK29+PS)~ zO{)7n&Y7aCt}e+myTL^Nyhw({&Bx_WOJnlX8{perwu#ZFWOR2-(_44^Y#! zxbyz0roH|gzK^co7~H#zf<27OhshX}^Jh_UhByXQD#Vbr(Qkt9iU zaId@1=E>uOpFxlBSuD^|V{TFGv0XT4;H&D8f74(3aE^4;1zum1ov z{{Z#SkL7H#I?4Y4sTvNRx=Vv@mhvz*#am(WvFAK{)*WRMf^KWGby}EN^rUN^^Hq`V zFWG!Z0)Q=|a~y;Z<_D3SRt-O~2&!M~`@;((Ebc^ZI?=TFwEI0O31oo^_=~e_ioV1i zJ-MX)8Qo;k0Bc{B|S?y6aB&fI+M9AwmVy6t5W_MEbp z$mK;-d1%gc2TWRM-8Y*l1*~^+sGa7MJ8{?p-}LmZ&V$q?eU7U;UQD`*BU;Ql5NQ@r zHn9WVS=(z7g3NxJQQ|iT85!gQ?_0H-l``8czjHlFZ%M44lVx$@gt#Fs?V~sY)%m~~ z{p-nHxhE9z+1W{8j<2a(tTzhMDshvO-}kHMrnf|#>v?aF*ovCD?Ph;Z zlcy~%o@RhO*z%Q;x8Udey}0AON?(q@5sSor-|k0kFy}d7_szN%bvVOhU}OIPitMQU zIDZCK`N|tgVtfWwjQJ&(O(vqa^}W{<_? zVWNxPuD^y6Z5(m5Wq~fBa6NzkVALV$$})13BK0e%pv@0o(#-6$Oxqk1RgO0M_pDl- zE!a;T8ex1Nkky*@{tZG~OCXWL*olj7EV%oh{hEcEWme7azRA^o=GTN@VH@6Pj~PXd zWMJG5SPxD;eQ8xF*Q$CnRw|7d4;b@ z3V8$Xs<{6E?g}y(ERO2ojyzC4^khfhQF0gfbAY3;%^6^bt;OMB1gDxZ$Ao%!Nc8Q# znE}-`*@V)C4GaOe2fk0auQ%#mrDWf;L;YFN(`i4|F{||soR=TsnuH%uBt-aRlFUc2 zu5@(wPxw{5r`fW5Dp{9jmFt?Mnx?gNdXFMUE0$F!u&-OCrPEAnehw{?-zOnyXFcU( z`qqL63~J1Km01m-IZ|M%!~Tlaj7S2E7vICbc}xvZrxo zcq>Ui;v4?jZ=$Hr_^rD>i}(T&TdN(Rnz||FWcj_3+czJA)L^5CPwP@3S(A<XU}?M4wSnmZ1P)o)`A^N92R08VO2M2=)MkD;{- zG&^qD_j(lUek&%gMOLLOyfj%|)2oy&pQkS)#C|ON5`3c-ReqmMPc3KlCp|>xj|3p; zBY*z@IPH;60dbsEY|z4Ta*M`E!&5k{c5gIZosUh^`~;Z@Zdl`zdsdx25uz?DFC}(Z z=JLcEze~pq^4v$MDmmprU+Leqb8Yl^%1y=LKOb{MHI6AJ1OEUMC5VY`L~e4Vt}sWT zta_hGvdZAv-6;IG(Pes=#%~>dfSPuncNNiFtwJWY02AfT?t5duYKruiY@BBezkl{D zp0Wx#i~Ww=+FD!7ES8TZ^Z7rAj(%#(Jswf5t=qm4Ts6CzSirW+RMaA!;=BTApY9UpL!W^}RU3-k7l`f058SL$1S?*+C6r6xO+56Nk)5g0MRK?+Zk*dkgEy;`^ z>MMz%SBrMm7z(T9A8%^tXsy&cnxEwTIy2u0MmSxNzP+DUgj-B@whD&y$H=XEy)WV= z8K;JdsJq)uGzY45ztU*3Ut7Tt-o0BX~u(>fb%a>_2bSdtlQiww4M+g{x$h>R?R_x}LRFHqP15~n1y zFM&}?vE#wxonz5|M_?y`(rC_n%DBM!tp1(qmFsgA#Fv80^zx|3bhKq8zCal8rwhla z?^|^pBeVYikH6wi^h5Vh5xj~x^=ig?)zMTZ%iVkW3Q{evpn;ve+w>J#p>^9i%OT{AZNdY)41{E^eMMUp!#TFeEkq*xroXcq z=@#bl;M=5;26SP$hB3uasI^rOariQNyj---E9?cR>Gu{FEpIx7Vn7%@!9JC{OR0vU z3UE9Bda-^~SxkIF#oPjOgp(ARC7 z-(}y4oEFpxdDN1_4i*TEs&cH^z~|I@)lu}AZqDbAf?tfA?G{+Z+WWQczI>7{%QQk) zV}FQg;E`Po9aPKs$#PMsor!I4 zf?YMETi!gT=rh{euHd-teX~*ZO=R@&Uf}ApJvTcglon*GQ&ub=EUer9^{JjZfP99)CXG9F{ND27l?7#{Nj_baG5Bq z^dZvWc`TkrD-^;xGspkV|*YwVxJ^azj6{7zDhm7x*S6$DK`g4#waac9l zm_jZM{YTTd7>h8L9!s(A++y(^|< zz&Y@ceswMDLJ;?-wPn%nmhdW-!AIbJQ{TU1S+%-VsioHc0B_W?n?1Ry8t7w9M)?5| zmSr0q*o*_%{p-z7HASPkr^Zo()T6w<)UHEEG`A}+guq5}$FLiHI2Gx1@~#y}ZwnbX zb}342zQXM~OI0Z}v)M|i59ips$m6#jzpW{2wDD;Xurm9n%a!?pK~Z*{swjr?N^}U%6vWa9eQ5 ztG=0a3cj->R%OC6TtrpK=kjCFed=y1_`jnv`A_?XeY|tPo2;&`tnDrBZY39XS0v1b z!q`=TBN_Mxwfb}`bCix^$Tm1)8=VW#|Gnr>Dw8urLgxP;@<{H zOKg)zr!}6Vao`C@&_<)kxej)o{lLR_uP-|^@srrHbyJg%C4c&NO|*@tou{~M!Tfn- z=RY{Dnw>|}1*d!z)fU@R1saRW;Sw37RZ@|NhX5RB+aj|2OFlBo`d?wLlc?#BXEm%h zpYfZ9^l`MeZr-@7bky3laGar-^N+XOs_Ca&N#K?0W)|Zk73iFE+0M@=o7$iM09~AX znwNq-ns$$Ut7qDQ;J-m#(XjS3Fv#G?v8fHPe0@dgLOXiYgk!q78Vy{G@I?rWjPo|t zEPK-sAVDeQ4ANuB<3-bMuC5GL+KbywjK(m0=i7?Ssk_;Z?YUk{DO=@?;BH^5G^Y_Q z<-Ct6#=^>3zE19I8q{en`rLZ^8vTpo!ex5(pHxR`pW@NPA=(%i*-svwt8SlBUGa0R z<#cAU6NAKz!Ow}gy(>Xb9MbNSo+uIXoc0s})&xc<0s&5F0x~h(iU8{HrhqzxFPQhB z2$C7{XaLw}R6r;KPjEJ5ng9s5icJ7R7@!V2c|`y~9z`G~duEsgHNMf`nqiVF5YIFL zazL!upjikOsy(O!gThb?5kMDP$sWmO2Z)CsCX;*(4r1!K-WZMCay*d$qi+C;o z-raA8bZXZq#}Zi=Yg*j8-Po0*DH<-+Kzk4Ot-4Jr(?f4;$$ie*WKvbjb~UV^>%hSY z&py-!NXD;@dyYj#p{7mp!6J;DzBr??^fv=+dr9YRD>RoUt<%XmBL2npx|PM9ywSxW zSfyREE;1NZHd6~4a$N=3l}{)$OzNxaXIFO;?HCH`KV$k;7U(ONTp8<)cEt#;B@ms-DErZYkQW7c43rG}>s*idi$(yb z+_5;_pVF8YqBNMnIW%MfqtotX{Hkc&g9Q`m_YvnH{`B%D58>QL&e4yWTZooNB3tbvWcFz7hHp}RX~nif2;7@JJA%=U2N|h-LBXBXqSNLs zs;DvSXpk%!`&gDa&xacA2ZM@KHq^*m5qW} zAotTkHm%M9_^5AUY>HgF4EXMS@kZ$Z!b|!{PsyRC1$kJ8S|OivM&B%CTJ|;=Xpr{q z0qsz9!c$XglucPAu!%L)jUW8LtLz3U)dWT5_5nTEi0)U*ed=3K72WkgZ3^gdaaQq9k$)UK>TEa83*;hC@+%PyC)n1F~_ETiF7Qd;I)!iAT z81#=a(e0iI?)*sb3XEFU$Ff8T1sSSpx7p zy_@%{%?WUPsz}Du{{ZDczSt^+VH=NM^HiAxmJ5jg0H^k9NSj438yTX1;$cb8IrOVz zC$*g0Xs$NF$Btj`z;%@W08cW?SmAr_UVlo3l`CT4{F(h#<4q|JuP(HGWi8;jn*kgV zAY3p5l7F>x=%ZJq%Y;uMWUI5uOpMW8G*Gh77SPDx;fVPa*3(}*VVfg{W4a12hrvT4 zmS=3Q+*RpvRF@>TqeXzjk?L_$apxpvgwMC@5X_4tNlY7VeKkn^KAxZUlDe8mQy}jMt8ZGnUsmXOpt_uDCH;jjYmWNhDV6<{O49 zAmo^vkWbq<{VULEH4%;2l(ChDzUafKsqD(<{ewDc=F)DQM`+}E1f^wQ*=0W9dsSNd zwH4}qnQ`ErlB(^m4RS5ju42)zCW_?6J+#Bjg-%MhueTMtsl8naONlS;W}5ab!|1~4 z^V_#jBvY|AMfQP=0Gad^z3=w^`2MANif3{BrCBWkbhp)wO^owRHco`rN;R;j)Sxgg=;&u zz0}{uNJi-6R_?>zvU-=SCk0gtm*?zCog>|umUVs2t=CN4UR_wn70R$!TW(Hs+xD#9 zl&z~&p$X+a%k^p=-dg1Hd2S?>fg_Tm`9}a(vPk3P9rlC8F$DvgZKKwofu6Z%qNat@ zQC!?=(aU=t!xWPr;i2RBe)#q$n(`J|Emoz*5X5=U%ln;JKW??TT(>=lr}52S2?PZmtTryu9IjC;tBcapo<#HNiH&me$JNPpvlg}rcBuFfQjVPvDzHCFva2+>yN_T07D zBuBPd<$Bo#b@D{JJefzZ8?@(dzFo2mjDGIaB+&_zfQGETXBr= zZ?9P$sWd$LNYdBAXK6VEw{CvbDm^iNd%O5To~gI=3U6b$wu)D_P&Z@)wBboLRoYm> zX=f#{xy?L;TiQXWy4lZUjRaB_nq^q~fiW_Hk1^~hU|De*LmI$7@5ik# zB+3>wBZV}`mMVlCr~~BF0>_3y3d&-_KjmULH68J93Gx^RWj>~u9f8p$CDbzD$W6(_wYa z!A9ZWq4ekhK2b(k&c|tNryBvJM6vBqu2le`A*M<;MI(R+_NRnAj3Buqwt1jscM8*X z2lb;QUqG#3O7aaXkOz{;#=Ht?lSml@c)JM$nld(xu886b74YX|Bfcn7BZE(6s6jMg zCY|5kCm5-zFv2Lmn@^p*3uN5G^D#7=z;+R5;XwvuQGwc_kPWfdp@qCWu0>5T4uACo zO&<)o_@f9}Guqa;1PnJ5pFvNSBL_aBH?tpqT87d>+4U0d<>XO>GU)XQSuwGR_oVPg zC2aCYe8d6rYB@r{;@0xY(gEU3rLpN#L&3|grnB(&Mw^emDq+B$T~_Mk?T!X<_N3Y# zL1mLulgf~Y$Gt(yC^8eL=~p*Ry5@8L0BAKIb3F-6UJJkU z#*2Fl&_;iVq-DpTuQ7kE-x(*f5ocB!D94uhCwpUIrfKF&E4GZn24Y!u?jL^jW`orA zGrdA<>3(omeHEy;9>Da?Xn68W={5@a8K!1dKW6^`YU%ovuXTR~76?(g!@J!OGs>bk5Gacyjaz68ObDaIQ!S5s@Ywq zjgnYwyU}8!s+?EH`7S+=oc@bZJ!(Y}jDy1-e$=E{1YQOg^8W2rnioeS3Ox{hv@lp9 z2peDWcd0TFU6znP>7bG5bc3m0*c{=Ji#Bx^~62~_tO z^KuSqb$(=K^=SV9@htraMfww`GTQd;$U}E=b-PZuk7~xGWPDa>QwyZvqxG*Ps>K-YZ-zC{ zx_3p>;Xm;bwbjAg3X(SGup+X0hObvS@fEftXsQwAK3RwBEhcz%OMxZGl%@#u;QI>i z`faecPNx-vpQ%!fyJYfV?jvZWR~69782ydLiPZNtO>ZU5%9~}63$-%JagKfKm#p;Y z*%sirW{R~^jMQb&-%R{Nhfk326WkK#JGcOQiotKAO3rvjxofLjMGWqG?@YGS>qLDPDK7ji5Uf%OFWN&ae#m%yx!R|lf$fGlNkjCxTO#syzP zh@y#NStU^>@>NihJ9jm~^-ocTYE^bTKj_4>(c3j^Vx! z#Z#x$Hy5k3m(u-7%DCs-Oco27?QVXZQdr|%qzM;3U85ZT09u80OI0NE&)Bw3HAJgY z&EqJzB*I)fkTOB{_pSP!455cg>0qLp(rW}q%L-9p+CJQ4joL1J=vkY^`yo=3Jt zXVN(7RHYpKPnG`6vfAZ7&!e~TE($6#%!Ggx=eM(VZ~gIIwR|v~o-^`d*z<+RP|+o| zvVBa3bswJ#f}__X;;{b!?P~l-u--lkKMeM6MOHR<8q8BkWSiDCB$LN#)qb{`5_Uey z<6NcCewAZBoUSfoF}dfsJbsmB8k(<;>Yhl-xk2Hh2h{f~cdU>OLh)KrRDhBQ_GBCy z2$n?;pDTv@Q$QDL=$BFWor4X-*A%3l*MN^_q|J9D>Xz?e8A}#iv||gnW1J7$_OB5t z++!%-^ELaPf-WuzN6CfjJL^&&D{EARNC0_4cJ@)*x2<>mKS^XUWsj4ceaWq<7zTgM zU2_pZZ1X@LZy~4vhar_f??4icA-^9K0m)(mK9m3{LxO!N0StlKfGpffV;oZg0OEi- z-jD=Z5Ug3LfpbY5jB!8|gBs`FfGW5uNXKdbp}r{q+(#pf7Xq0Ok*2YWcr*_n(pbrm zdBp*ezX?^qZ03L)#}rUoMKqv?apWKCNw7=F_0$OQ2391R7X)$v9wBcwPwPx$SS^}V zj&-$?R0I>{Bpi1YT<0Ik<%Ttr(9^4Q4OTepTR@UnkuYOO$MDa_E6iD;)lnyBxO5>p z>|1u2JyJa{{6b-3C-4E|#7(3hQC^Em?UhN}jQxyrf>LP-bry{sRwI(bo-tZqMRAT9 z^j4C1B?9@6n?BTS9^t2t{v)Ht;xH$Hin#-p6-43wqjrw}0B(C_=VN{ zHnxK+l5*saistII-pswY$1*zZSmb@BSx;)0HrAKRExtj9L>!ZjYX+j|*@@0Leo8Xi zY|r(qth$||I0i+4E4FjHo-_0Ju7{@MWSZ+FdTE)t24Z2Jaa|OGPmCW%e2dSeDI)5p z!ah&=%zcF?!X*#?03#(S;3zzr7s)$(Bz#Yx?@0rASU&DT4@!|7u92tGG{=rV7DU6a z@{jV0ab8YVw^6_7k4Sd~xg=*4+rfoIC9RQ2&IJlVg4m-BrFT)eh#KZ4QNc8BWU-KF z(M$HDBw83oso`U2?M6ueNwsI%Dnk#5`9>%iZu5#w5oDG98x(CLf{V`&!z6HNq{f6u z%k>4b>r=pFX${Mu{t-F$q@pZ^TgiNLv^dXvaZjKOx4E7N{ESbo1tun4KB;*qDzUIX zJPKS3v11$3`;3aeb4@Z>8tKz8z>@FwrkNKI`SlGx81p2X+vMh@$YBU>uPrXy7WV2` z@C_Ja1#Kq%`HmzR_7rUskxS`%n)ygM_NY7|A}2xAPnt#md{kVp0akhx1%bMei1o!+ z?s7*XsO)rGL6H!4`4wW3ETV05Y@_&bDEP%fQX691sdp0Il~b1_Gsq-&CO68qG3`q{ z@H__FTxvJXn@EcypEQm6N5J>0ueK43gx@T-s^sOB;JFs?-3ViapnHTTapdFPxO0U{ zJEZqu>pLXUT{Dx|X^Uj)7FW59oXX=QpZ2L~uD#r|jjzHez7Y2Q;wh1m-LabQL491D z)z}i=+=w;_TaU}}QhHjP^5S3bPZ-D*qB>p8BeC4;$s;85Q?(@wBd_RE{{ZDY`9YwZ za9sYFtcSCRJY&98{-%_RAYH&y!VlJ~FFuTqb^WLsWMU)F<{ka2Oi}V!TaU~S=}2s% zM!`T9GD`u2RztH6wK+mDi{-ReeVFu%wg9OKkjmYTYIS~eW%X760K>CC0zE5OSZ%H# zoU`wBbv^bl&QJBOjt`ywhpO~lrOVi^q|-+n5`viSNcXQT>$-~n0R6j*Z?k@qxj(Hw z1~<S)p~`mzNfG^w-8v=fOql#jQQ1t@KgJc6{w5XOe@ssp%svGL+NA zf5^28yBdn+i+bm$G&`P`c{E5;JIh84=sz;;)N3QC{yWShQ*}_=^e#_1(wtn{ zy{R9>LAgKFSEFV&vX6zll1vgLXJgq^WSUK=tiA{${{RAL9LF?o8;H54HZM~fG#|^#Ww2JOeiwr~9o)>m7J^t0f z)!(O`vYb|2IQuvLapd1jEKp0N$lUbqll~nf%X2HbM$Hq>L`BXx7(Z{n^r=;^)H_r* zq`1mlg!J&)yCz&K2n>g{cg}Ws70TqcO$2~$=PociP%y17$;uf-Z07{|RGtM6N zoF;D5+qOGdMVzFGk70`G`i8k_ zAf%S&{21z`*(_%R>+K(<@9kx@u#y`a$N(NJj@VDRlKc6nl0Etm=ARv1yAO!w_weNU*@L|2(faEx%%PIKCaS6UZN-(Q<+OaA}| z>ER{c8=0Szlju0~AJVyS^&Mnmy2!3y^frDHJ_S8JtKVN=+v)M@ivqfp6Gb>~BF@hG?x6Vv4 zY-CpQf*!O1@KRoY3yDA=&;^^qxjCQ;r8~Kx3TEOw3IL!AKwKCE1Bzf$Pc(q|XT1Pl z5^h>!!2-Jt0xCHtG=Sk80qsB>ZfF6Qg*y?nG5ZR55v0?tXOhi8T(cYnJ?T7j4ll5? zrnE}J?pPon^)S!vLJh1}GuT-nogIp z{{RQJi&bTcSmsh1IR^>sYtMRyq1h=>7lW;)sykHVTlCj9x@G;$`f{5$m&8vBOza2L z4{FW2Hck*y`mykIRQD{%%-?GU7~+ddo=Acn%Ztn|*u+XVKc$=9Ba!paM=?V5uwrb#y@PrGhD zy@dq(dzm<4mU%YBjP88^?N0<{H6B@{(sUti;%l&_`-JWX-kR*^U8>IzG*0NN$0nv= zWlJf|MUN!du^A`&)JVQbTRz!_=D;+t@<+)#woRNGu_9@JEXt%FXxa^gt?YQ>p3!7q zade_^K@}v2kmznpMlcWPDeyeAjV#$XR-=I*31=V5KUxG)awl=jfDei?O90VYv$hE} z9I(P0>GsjbIB#!r-i}1gEO&Nr$C5_ucE@UHO@dr%@SY1(`>f{J==sIb4kcBIncD5Xx=S@ zaP5*kX=Hdk1|2#yhyaW7aZ@6|H5)k5!NATvs-}gWMKZz|?Z@7e8x+j|@ts$&s%4Co zuxV{sPJJm26)m*$ZV<-KK*<19ExNjvX7Elha(GA*`qK8@m1c>PaLCB2DZZ=o?aMd` zS17-!U;wC+KM%|~<$f4AJbFhaiwg6##*cNkU}BxY`4u{rW{N#tc+uJV8SO7nv5t3+?$F5` zot=L&e2;qRCXbuWGVpKoN$+ed76rRwXioHnhvofiovG5%bhk=8{FZ)#Jj zHbKHmfyPcU%Iwy`t0t?Xz1^jZUMqPWWalT>n)3GP<)*uArNP*$#dJ3%$>qA`oVq7a zvjp&w@ge|t!St_3q`6yGSAzxBxJ=&k9J+LKUC6NSyZ}6G!}5=c=6cj@aEeb6@?D}) z-2P2Yqhn{(np3URQ9*Q1mTV2exSDHi(c8KWxcnO~rZ%iT%$~W@mbz7{-PzrEv1B7D z@1J__dVi_UQDd&i;hgdS;!pt8p4LwKzFyKqJb_pSbw zRI=^y(N40(EJX;Vk(SL<(z_-s3MFws9MiO`y=MFAtf4Zp4a^6kSKl}DNyH#-dQRW>(r$?r} zghE#{%>a_(H(Yp3Nx%o!iuC$R-OhY)o)_Ha+a0+17iu=~3q*Lx-RoM)S0z?jfrb?f z#DH)|!Jrx$3+32UoP$Y`z+I0^e~a6FO{A+8!mv1h%EL6J#7iN|!MNA$^?QiomdnCR z7=T=Zv^n`6i(X?#Z52(sKQsRTzs%{*6Ou|HmiL9Mga$ZWVgMFXkge;*U#HQ2B5ujI zkMKszJ-Fd^K+Uy2?yg2FJi1oRK$7QXFWvZsa*0@ z_aAzff+ptD6_P9-*!1G7oFg@fETVCfi^>7Mnq54ox0*=NjvEYl{c4}V(DC$^JLmFE zZjt405f*2V4W>-C55Ib=SEZGTKHJ6zP1{>?7+Y8)+zBu2mD6&FXJ!QObAWq}Yl~&p zLG4oIcsA^?$1!-5EiiMp&=~733TGHy(YO71f$yBVOmex5fy6Rmn+Tu8@;LI5YQ@H;C5cfO% z%{8Ia*%vDx>Hh!%jr7N^%=G<6uuE{37V11*$|Qe4d*D{e{XNM=+W!DyTdv{82w!Fl z061n0KbRaE>ol6fIoW<0eyyrpU)!WI%3d_#RG!tIoh@}q$}6(hbmtsM%gYl9PaW$? zS!KKmmo8tj5jGxlDO=Oia9ct=Gy{@8232z;;b6vw%+W(q^n``-yP`7 zBPEfD)jU{;b|jJBmn3jK>HeWfZQDtBC7NjgNR@osv+0WD>$JI-yqaGpLrti}b~IX+ zx{bTNwDL<6#lu4*91-X-S}2t^eNai1-CUB$%07{YP>MUbZefBf{{R#wOOMjC>b3sM za8Y^j@L!|%Wy+TYNzz&_qS8aBYVK}Skdez6QSb?@-}@Wjld>Ee;*xJ1nEhW)xzXqF z?iESgR26KDitJT2WK@?-%=Hm%d2cY9L_7q#Lm-n+iw!5r^%(W1}WPqb0$gUZQbc*B0JGUw}mh> z_QgsvOq!NUZOckC<|d-%kTyT$xqgx98se=*yw~L~5hT zqa0VGQs*ZXzD=H+G;Or!IjvD>c^*iSv^h#^Nlrm%gFp~gw1(NeZ1U=MzH6rV+qe3ynL2+Mxe15S7(taJR| z(t)Nz5`5pAy$n$&$X@1=F95U1Li3*E(ypy#obOPc+H?0`-3ztZ&-i-651L0Ehd3Ym z6?UFKR!&F$Lwb&#SDs}50I{C8j0psp@q9~DiDER2hx$9^g*0>CDs6rlqZJR&j>$h$`r$RT|5^R|`=BvNMb_NyYs zNjKy$IHn`(qb<_mw&ZpIVy7NaUlC&Xt}d+H_%lf!cp+OA3D*h!Ws>OF*D+w7K_%77 zLp9SgFc?yOs#Vn*)*!Gr*yQEE7R1$0py*rv{|q8LhHeM6%P$80no$E}44I zbY-~=r7&Ebx%Cy3RiTZrQHBw9I)@2ve2gx7rYo3|+6YO6Hsj)Y)mlvqs-F3FTdLK@ z*r>$>+lAE=WLC45?fgDPZnD_cvo>OkcW{xQ(RzOW084Ag;Xm_ZQd&bKTxFayr=y}!Z*uJ97CNYDB$_#%07`gk<-j})dsPZ`OBiW0Rjoy0DU(84!b?0i`WkeLhRv0|)X#ooXo|w)Ck>qE(EHaG zRV|oZo3gf;zPGxUQR+h$0FKTv5-vF&r~B8S^omt_ecoF+dbwtJGS0h|qxAN!m)y(+ z;N!{1JX2##>JqFKiT0@xJr|?mk?k_90Hn!8WoL7!+-lRwX(sy!Wbmbl_(?z>Y<%Q_ z`Woiyv=!W(qOmWNRXT}5gGpVWs@wdRp`EEcmVcS%5Et^QmSf;0P8dbO`lLRT(& z{{X)QwpH#;xUt5mYX1O2^IEdp-P@*Tg4i6n$DkR-MxRyPW-M5X>mfZWjB>j(+Ew+< z?w;3$0;7^PApE%ZKK0r${-#+ZEz}YplTspYYz|=`YD9oF*uk~k>}Wz@77{BJkeuxm zArAU>{(0|Zh_?G+bFsba4y!{|{{U0r{FhgBqr&L>s5KaL-CilK5VTUShU9kx(2uoK zeuX+zYV8(RekYl98Pt{T8XV z+`C7d2+rPX)iaPmU@|`fkYu_{fFngEj{pyPmQq;+Q+Z{1V9J-4@CDpr8trZg33%6EP8h1}Fe++#VyRN#l^)yagvvHA3 z2uy@d{O6O%pb+<^x>|msxR(~0;3rnrXtDRBG4U4V@@E9l+Wl`F>G(lkp>9Qb95;KolbBh};l1PIB z&O6Yc$h?u3=Gi$7#aR?Mlz)uEfT$H_(#0Sfjaa$zjwnbokVAblpDMO#@C0RR$MnX1 zb4E}X+uGeoFwk^i9Je2)vt2B-ly5;__B;k6oZ(ckKbpHSos4Zo?k(%B#W8uWP zJHYidx;r#>s^Ygd=ir6PSJ$43;9?FvtFV#B$kN{Bq9Chd;;oBlX^i33OCb)~;;d36 zn33mME+>ClZ?a3V41*5G=BJXxB$nON|Ny_|AftOy*8f89{QdXi}F;61;332sGkNs!&U{L_*n31=jk@I61REE00y5_y!y zTXDjifs^~zn$hR|O321CoT2{!`!Dh%zM1Z&5_U{&Kx<8K*sytjQP#a(yZkN?9vJT+ zV2<@+fZ6or;?1XcLxx^)@PGDdixwC*YP8h}8#{gJAVqI*T1NZS8(9L_?pOni;**jS zU{_a+Uj~HoR>383%5hR6DUk`0jUq=C31BKn14Kk1Ca1u`XOV&2r*7WFRQwQYj89T5U-S@6-o|_A1Q_$K0}d%C_ZpCe;4`5GQ*!32r0Q zCL3O0cmv>lt95>h2u*YJuLftXZWzZSEhn!cLj&HyG?$=+j6y#?c;>U}{Tb!^ZEb%( z3o6$AJ7&2xdcEe6rRlfOPjt~oG-X;ld;+A7KtBBX*E3I6t5G<(ugm3@%2BQ?@r(Oe zG)7w?6!5MDs?v-X&t?PkuU}N_y=E;x2R2!NeWzC6*w{*}sc`T49$x8@j@^xCx6^8} zYDTnM^*>a4Y4D?F-6&mi&l z_^o$U@4-SSj{U8+#P@n`yQ5xDcV{S;DP5h`F@ed>3fFeHY=V!$%9G1%5-o2`p6|uK zvM|rto*p^-RLJET%NjM@cfG8u*SJHqljRq(JP63RNXaaB&so&CoATC0d+-Lw<4)-iOPy|so zgGdfK;Dw+F?B;+tMF2QRV)038WJ}gK9F`n$SDK<2T+u*Cpa1UWip~xO-TpslDBz*aAZp?fmDxAnyTrl;O8!oMlMpqJsR(&wOtC^>MXT!c+rAp5-$oqK5NaxSw^B; zXAETOC|gu>8E5qyLG;>|n;S!M;=IfJKt^yeS*Hh7+LFc%Ftc=1Kw3mLT7COPY?2X@ zlCus5eX4g#c122Gu=b{!To^rXNWIhNl2aQh7hpen^tx+fWogBnOKWkHOi3iy4IVeJ z{c80TMM>?#WbE2V&m^4lPXrnp#?i?c4auc|!8=QzrIYgU_o2j2IT*>S8I&rV;-j$y zV}NNcXLZ0V;3QdhNxh>*F;xIo-nq<*RgkgX%Xc-yvfG7g{LB&Y`TyL<{XUPzkyYS)1t~=Fg zAdrIg=f;X2Yaz!S{c;<5?ipK=AkqxvZ-$rf@%sSXa-x}Kl4q%cmb00JZ7Y# zGCnbXT5dd%WY$Ip8K|^GX{TMu49l`JCV1FAYbL6Q&KQ%ycAd&LDMbg|Nh;ej$8OM; z1V~RHRw^{`bNZy8!M^+KlG>w!tqWAPlFI8%3i*(qIqbs~KT^}p&NjvHg`{=IFnzMv zZl6Mdteejthx|769~E3Q%T(3T;rS&!M5xVgpMhn)!4J=^cN8#kLd4{AnrQ+oNg1-h z`cuI)0S&?N(0F4T%_PHWE>b{F;;#`HWUhUd#x`xo52kv(52|~S+iJr?qcMQ; zaK9(DPZ{X!#{6^OvFA}4ec2e}nvNcDXm%wX&G1oeDA;)!&%H`Wri(J4B{w(7ib*6d z$8%GKZJ71Gqg^q~o)`BO%XuX1pU9c~z5f7u)e6*4A+7ZrHBTK!UMi2luE=4DK-W}Bm4^$xDKc0mlGOOoxiKpy6*)M_i!!`!o?$X4d?hnF2aspvA>Ts^mo za0YHIU_uV1mn3Ydu2x_D`#jtN0fg%N%mMar=F% zpKX@cy1L`^uY*ifWRsU;En4?Yj_EFL?NWaZF>NEt0SKh>K==D|#bndhbfV!2V?6%l z(~Kj`(Uyy%ukQ8qvHE!IH9ZdE+o{Hzrn{FU7@f|;$j^Un z{MU0&tBu-UdhBD#&bF6byI^0cN7Vf_6gPJU)@VFW4=DV$MsnH56^56h)=k%5Q#UzZ zTys89CHGj#C8I3Xv4to+B#uny-?w2}Bk5R{cXCEL&Ai}$)4JPUSj6^3qpWz57;&HS z{{ZHo{VvBTHva%mxc>kb8DWg{$gQms;bOPDg{NZf9rA(4sP_K=#X;$>xv0r?_7-6b z$up7#R(A>mvCi*W*-xg%yEiwL@J3pfC~ZIv*f<@9bg_<%z?V~D8As-(CVAwrq`Kpz zs2CH@YD7nG(lA`XzS4GvPh-fWJPL0#Jzq+7m1J2!JQOs;0RyP*E)`+atUM_fgCrwq zKXFTt$~C%9ucSOGBD_TkJ3j`FN5OAWYxjCxvdO2&l0_y2ibmi?WYlQt)MI+(7DDM% z^Ak9|LvMepY4hINqQMbhc6yRH&)Cw_Xx5)NdC2X(+ScSExVaZM(@GZ`nBaQ~)q^yi zSzLv&jL<|KBxq$+ExVR|>Z_k@XEnjE z)vvOC=TZ2<(0Uw4to_XOmq2P$!!-Fw;}Q6ZSpIR2!n#&^wK1B4<>v-y>1N}&Lg>*W zBljFvQGA&?6!>AJAdgyk8Obc$x{T99IU{%};fVHs4O`Wpab*lY?=RX!dyR(^t2*@&e!ScQd?z)yc=}4N>OR7nohaWZ>G_qxziRoMX22=2hERcde=YF^^mUj z8#r&Tf_j>phGJrEuWc@7w~1_Gc9Ax;VSh6o{{XFe3nw_e-U_RP96ATQ>D!BV_n2Na zB;Y#W)a%s3&&cv*vJ!`7Hg+mo4%Ks$!A?V^)1d%hcBGz5BC=g?ZxmqRN9{vnz-&>6 z$N+xTTYQi{F%;xf`$X48(a1-yHCsbSrg@p1d{gj3MYj8xjlzUQA~$>ru@-}&00T@J zMa$sOkdE3)b5lW()rM-%1dt@K?L1P)BEcQZIHZveBv_MIt_#-)q15LYsPxnP`EN71+9N^){pIXeBSYii_GEwOM($v-vUh8IR9&tR)) zd~bnPV|w63paIRd^}~ zt#iE^zphnVEX8&I00sJqY{a42meuT*T|F?!j?6g&&4K>_&3Xw}8m7Jq;cb?|t->U? zWLHIH8;0G*vPU$Vi{v)TtgxLkOz&t_n&#_^J;X*dKQV_icD+1-Ai?#Kjp#Q=(y zJ*=m2%XSnGC@)Qy!PFvVB}kBRPo+hnrh0|KgJ`dSNFGyESn!7@ge(k1z8ONiWlnM$ zv-iH(qdLD%O_M_l5hA34_$lwA%?ZEfVWY+4|nyvl61@zSH zmeWyj&>9>%G_#2>1hB@<^(Td9^vdAicCIXaV^b@XaFTuv??+mT=aFAcX@PC-6zLFO zToM<3%almQJrwd!&mF6yuDx!KENOkbndqtE<#KK`_{FWGLbph>nASBI3W@;00C)T3 zl52;oZdN9j4YqEkDKF3-9X9Jzwl32`v&Y+iXqRMaDz3iQsSO;cBzacd-#n{|#Q zQM+ad&RC2J)qkh^6ey{2oWK5z)!pt}mV}eX)DboGb4?7fo!`Qj42;Lv_EI>js<%xY zyCeISI_zn-{{Ufh8a|x5WcN438QHfyuOkqPp1|Xb{AY^MX0pd(jeQg?I#JBVeGRwi zT#RFJ?c2R}JR>4DE=XPtB1i(^xF^I60RB~=OwFadcbdeJv|>O`F^=>$lH^EfbJ56=_%YkvM=Ym1M+!bpYctf> zE+HgXp!}gut)S{1G_aX3Qb^_FU}OEN{O5u=6eg(llm7t9R$oEwQbOsIZCW28ip@Mu zbCPgq!5#s=wplJ2q>nDgu;35Ui~~7v<98IWM7GBcS(}_xi6ZHhbN8TS85}3g0zRC9 zfCT^xCQp9U0Z<-?wE$eq004796^y);0n&ChJ!k-xkoabR1S`8Hft6&dj8G!|+qpCW zTMlzT5zhvY5flL+<#UPvb#e+2P|<=RYjn>LR>{Dnfhe2ZGWG2`Ia^4D7IDO{>P>ll zeS5Wdx&0?!MTJ{wav;6b;rds&)F;L98&WkL^Xr<^Mw(7)HLs+y{X|qguEcY79-`=w z$#ClgV`u@7BD(R>QyIDAmU88Mo?bKWT5wbiAq$tLA}M>jfDT7$2hb$s zwB^oE-j)euft>#UmYzgJ+%fi~2L#T2X@JK~)b2FPxbH3B5~sMxH47l87Zy0p!R|)F zU&QI#W5=gPvu(pZ?)AxjnVhFS4PT7^0Q!jRbw<3umg3+Bl2$Cnx^S&m6&Uz2&Q49q zo`D_h#Ci>^Hd}V1dA9aE*PYeWzY{4>$=uLNKF$zym-lkY9WSARGYMHnGD-VZO6!7L z$1fwd&K?owiFfpx>{Hq?{v3p;FD8Yea*BRQN6{|##tWOpiXbv1 z$8+t?PTyIAr+sTO_#+)8w_)@k*7S*VElAotqD3QeF#cg%v^vP@>h~7~R@UJx6kEAM zYgRcZXevhqK59u4T@-*BfT5umq$*E7l~V+=UV&2vk`q`5xR1onD%8fo8a9qRkxels z2IIu34Hv-<-c3mZ4Nx#DG8!7_w%=WTw(LBBWsPOk>OT)xx!HAa-z}zs??lqIEjCL# zbXezzaVYosuRSeZqPvyp<`VE~biz?^@_E|E@k;TNousZsdT7gZRE}p)1&SMYe$?9{ z!lLr})l!ihj4k8`jMXfI>|(MhPW3nqHc@a9jzOylXCSJ(veeQXS0_#vnwu=}dv18wU{7~9}9M01F)=`>%E#KHQFal zd+bp)nx?A+bIGMa0b5m%nNWlJSCyuVCjS5vIekyT+Kv*~mjX>MRI-P3FLZ5rJ{g!~ z1NW}7(YyJXT&EbkBHc>rLE*_^JW|BV=5-+RR%!h?MSl>@s=jOTbT5G=l3x~S8b|kI zn%ttGu@!@pCfmyx5CnBNNJ)Z*RgmY_w8li!Cek8~;-=aqkXB+ced>n!5@2wj<1=T{ zt}a3g0&n_??(Bk65K#}MPr);Dp;_A`EvQ{wG-{2s1s&^w>l(SmtvztgP1;&h`rF0_ z8om4I>uWxj43o(z+UVyhQ1gTB_pT0}ABdEreiC0DEZwI(sX zBhDM(`&Vm5=dr2Jci-$rD+?IGOqPrx4!ceX$sZ()R*!NyXon{RMJG|}8@K66@_|Ud zQr>j)5G}FzZM{ z720W4&w|}QPr1LBz_(RtHkR`+QGxfV->9!oA98&a*IcZ4h;wwM%O{@d(PqKKJ|HZ_ z4B&j$Z~fIN;xTP}c zNDCfl5u?y`OMMppGbBbyWgAo|$wBIV)z9?}G_@6CFQZPHYPn_fXa`x`{b7!KS8GOG z9}Tfw5B+pD_w^lQ)S{&xg}3^&I&V;1%>p!b_b`Ta2Y;U(@tzHIboyyurciG!K0I(? zvejMLeF0i((rZ^ALj}V{I|an7q+pYR08n#`=bzH7o{>aNP zMv@f>rI_#l^)(quMK<~*v(gN?(Jrj?Iq&8wkN*JMJ@M~c_U8m%y+KjUnxIA-G zwH9~N+wTq|k&|%s!LMCR{mRt-PE6yrO%>TT*?R+45MwLEQxJ6nw|r8;6lbL*xuFsa z)6tpu$sB>32~o)a;-28jCM}8l)Uqs* zdoUEyk>p(>6>=&>j-br|%Nv105f!8{mX_ixwPV_oBF&ww_Z}RA8C?{d;2sTCZ8h2X zktkazepUm1mvVz4ZOp&OI0RH`rWO8FN>@&QnTa?TtAT@`T5Ru7w#F;$Xl>?_&f+;^ z{K!ESDZx$-FUi5njIueOTk)=8zh*u<9><#Ff9q!q!F0}~HL%;yVUu-5yu@7Gt4!#8 zu@h9s(ydQw;Xfq*02u`y1ov8<#;V^P{r6qi7*4MFh8kbE)Xk8mN9}2VEZHjvteHwi1$xDc0b)ztkXO07XP) z&tdC<^U0^8*;Q>RXFQ5|&nR6cgMDo~EK;e6oRCih{{Zt^VXdxfmC0PIYmvm73QZcY zxs4|P$s+q4cKcN@*0nvYahxGKvYRvdh|R04r*3_XcXX7_xwiT;+hkl!9;+ETlfKdw zfFS$VNXT@k0ZVqyG43g_OMpVCF2b+?1KyAZM{5%ymtfqy=NS}+XnJS(k=@%ID*@tp zy+HP--vnH9$nMcI&umo^k0Kn!b7>Mr^F~aOws#KXS07dB_D*fq@R`1yN`yADt9M(i zH&IBWScI-{3;B+HD<-PBS32^t()i%BOJrM<`+`jjw$^Z2LovofHmNm;5R{IL&V|4;bSChtIBSjWwvT`_6c4qoWGoqSg#PqAacYg7P~^4ppiuZ6i~oX@BAxbIrWK7lm1N<&HiLW!8F(bk->CZzSr|d#fpn zx{IJ7y4$Ge_fuTDxLKpZ@ITBs_w=l~Us`T^H4)qJT|E}n^!6{*ba&FcBXW}gB5oTH zFwSs6A-n$oy>&GD%CApj=*w*`9gJ-{VWzT{efuRL3<)R+xE|#9^sLu#EEu^tpz9+-7Yf$J<&cI)+(#qQv+FdE zP~y|Z4HVw1PbhYJw@fj;)ylM2D0fDOkVy5%Z2D*BxsTKDi&2j#*tIpuW?l>zQ*|u; zORJ^S(TI{X2^?VOZ>i_x*JDMbj+z@+Etsyg*({6BB#$1ou%sPM#=)coqD`)(cLyS# z0CcyFJRup0A9}4<6!MUqo9&too$#&oYdedDEd*{EfEmqa)xvY8QHN}dWR#PUuGX($ zn(F4_#`W6vRa`p%0QB+L59?lHojsMsM%eNF&h2(rHuf={jQ4u1Hql60Yq-$(jf?|b zA5N88RXI0^wrABRIVBWM_QvAMAk!uTcCMzMTSlR^T(Z%QRZ0u$Mpsjnq?f`@=CzPH z3V28t+JNwOc}l6{ieStw$OU1Ixh!M*nrn-z zIOJCpv1u9{mu?%wnMm+?4Z9w`)hJOtMZ06;$nLpU477P{+oX`U&3cINaY~|gicFp= zKpJlgd3%FE5t7HmA%_6dz!%06-qDaAOMhxik}5!aJdwo!eIC&pXV!oRK4;rN9FY}4 z8Rmci*|~{43PLB3Kq-On1aL<*0cj_Npb1FI5M#Xn3dEMp06~c@KoJ~L1C#;P??4kR K#V{dA5C7TH=u`v% literal 0 HcmV?d00001 diff --git a/src/wp-content/themes/twentyeleven/images/headers/pine-cone-thumbnail.jpg b/src/wp-content/themes/twentyeleven/images/headers/pine-cone-thumbnail.jpg new file mode 100644 index 0000000000000000000000000000000000000000..248fe00a14d04291255257853ee34ce0ab12e59c GIT binary patch literal 3770 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 literal 0 HcmV?d00001 diff --git a/src/wp-content/themes/twentyeleven/images/headers/shore-thumbnail.jpg b/src/wp-content/themes/twentyeleven/images/headers/shore-thumbnail.jpg new file mode 100644 index 0000000000000000000000000000000000000000..5e5e740e9b4226e3824caebcdd2e7187d6dd91b0 GIT binary patch literal 6035 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[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�^kP>Ce;GLirE1aLLONnWYcT$Ee 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 #@Hu^3zp_uP( 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 R#RRf5y%RB7DsOvO{(m`SsUH9U literal 0 HcmV?d00001 diff --git a/src/wp-content/themes/twentyeleven/images/headers/trolley.jpg b/src/wp-content/themes/twentyeleven/images/headers/trolley.jpg new file mode 100644 index 0000000000000000000000000000000000000000..61c8956fc21e73b1b366cac47e02a416db64df55 GIT binary patch literal 62979 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 ZTj?Q~VS&LFx@noviRF-y(250T|JfwtkmUdX literal 0 HcmV?d00001 diff --git a/src/wp-content/themes/twentyeleven/images/headers/wheel-thumbnail.jpg b/src/wp-content/themes/twentyeleven/images/headers/wheel-thumbnail.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d7fa9713588b437c9ac0cb2f1123a3b3e622b586 GIT binary patch literal 6460 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 rYyI?kn3o6d%Rw(+Lt1kRjt+G;p_hcRB0Mp literal 0 HcmV?d00001 diff --git a/src/wp-content/themes/twentyeleven/images/headers/wheel.jpg b/src/wp-content/themes/twentyeleven/images/headers/wheel.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a6155ff122140ed71244da90b467992336c999aa GIT binary patch literal 60901 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

  • mE>Z&k6WD&&&XZ-%v|t)9JaJU4ck@Gew)d-X?C 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 F{{fqdtwjI; literal 0 HcmV?d00001 diff --git a/src/wp-content/themes/twentyeleven/images/headers/willow.jpg b/src/wp-content/themes/twentyeleven/images/headers/willow.jpg new file mode 100644 index 0000000000000000000000000000000000000000..61bd538b1ac75f388d3ae22e8cddbda590cacd45 GIT binary patch literal 68450 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 literal 0 HcmV?d00001 diff --git a/src/wp-content/themes/twentyeleven/images/search.png b/src/wp-content/themes/twentyeleven/images/search.png new file mode 100644 index 0000000000000000000000000000000000000000..1f9d8288bcd369aec1561e625cf2d87caca62f39 GIT binary patch literal 441 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc3?z4jzqJQaivoN?T>t<74`fmZ*x1O2n0B|IY0nNA|Y;GZnrtPszB4tN`m}?85o(E zSy1Xuw)0nBClsVDat??u3A~haPBCK7;!RKFnhtAg8Mg^ko!Rx{MnQMf z5m~RpJ!V;D2PeN?6Wo@uf>YaFwpUa#Ht!&dZrZss4Js z0)T7?0CG)COkg|^ot2dZBsXo^v~lCc_3PII*^eJTo-=38g9i`p-Mcq?_UsumW&j1J zPoMtd#}6Rm)2C0zgoP z!o-OaCrz3(dGh2bQ>ILvIu&R&&^C>k#U%Gtd%9ZQauiw0J_ckbM|d-pCdG#&!MqlZ9G0mJ9T zix+R+ya9&5#}6Mqe*6dw6JUTqeEsX!uiw9a1B2r4-@pI<{sV&lK=l8A3g7boz|c1@ z3GxHR6$2ZWn3}qlu6b%v?}W))x9{D5;LMq`XV0C#a`oEv8#iv=ymkBbqsKrS-o1PG z{sYMLZ$JMeZ@6U*)cVWQ#W6%elJ($eze5fpY!Cj=nHiL)St6ySc27a7w^O=&PgC~% z1MMZt`!8lB?K#rIC7P9)cxsD5ojha1?To$;fwOcO7#F?UQF3S365&`u78m^u<)==4 zKAA0jOlVJD#T+JvV;4=%yS`pCZ^ti>pT4!#!Yk*@{qZn}GbVPjMuEKbo74U#Z*&?@ z-#?Mke^?>1G}`Dce_6E7p$5e#L2@_D{w$j;dSuQy>;2WKPjVuEn*Yj%f;U|&n%6XDe(7~ecAWVIFld8z5AyuET3r;^m;0AMIEc)I$ztaD0e0sz2z${hdz literal 0 HcmV?d00001 diff --git a/src/wp-content/themes/twentyeleven/inc/images/content-sidebar.png b/src/wp-content/themes/twentyeleven/inc/images/content-sidebar.png new file mode 100644 index 0000000000000000000000000000000000000000..f4d4794712d0264a2e960d46b2328a2979b19181 GIT binary patch literal 273 zcmeAS@N?(olHy`uVBq!ia0vp^9Y9>g!3-pW?OqoFDajJoh?3y^w370~qErUQl>DSr z1<%~X^wgl##FWaylc_d9MWO*dA+FC~y!ikB|K~4X-oAVH?c2AXKYxDu^eHK5$4Q`q zNuDl_Ar-gY+&1Jopupo0xOn4t`=W)>+pRhp_tiJCUv%~9R@&+`;byzopr03A?Uy8r+H literal 0 HcmV?d00001 diff --git a/src/wp-content/themes/twentyeleven/inc/images/content.png b/src/wp-content/themes/twentyeleven/inc/images/content.png new file mode 100644 index 0000000000000000000000000000000000000000..6cf1da4aacaa8aad7cec2551c720ef9117456f05 GIT binary patch literal 3682 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 literal 0 HcmV?d00001 diff --git a/src/wp-content/themes/twentyeleven/inc/images/dark.png b/src/wp-content/themes/twentyeleven/inc/images/dark.png new file mode 100644 index 0000000000000000000000000000000000000000..55eda6679807a1657550b7f5ce03e97d47bd4edc GIT binary patch literal 6884 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 literal 0 HcmV?d00001 diff --git a/src/wp-content/themes/twentyeleven/inc/images/light.png b/src/wp-content/themes/twentyeleven/inc/images/light.png new file mode 100644 index 0000000000000000000000000000000000000000..51b1b7a80af9e43f33b09d45f337b985635848a2 GIT binary patch literal 7052 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 bIDkGOhnT07m&3pJ8bC%uQT&IfQQ-doKU1b` literal 0 HcmV?d00001 diff --git a/src/wp-content/themes/twentyeleven/inc/images/sidebar-content.png b/src/wp-content/themes/twentyeleven/inc/images/sidebar-content.png new file mode 100644 index 0000000000000000000000000000000000000000..de520237019aeb2a2756f96e3796dff0a8ec8f0f GIT binary patch literal 272 zcmeAS@N?(olHy`uVBq!ia0vp^9Y9>g!3-pW?OqoFDajJoh?3y^w370~qErUQl>DSr z1<%~X^wgl##FWaylc_d9MWO*dA+FC~y!ikB|K~4X-oAVH?c2AXKYxDu^eHK5$4Q`q ziJmTwAr-gY+;-$Tpuof6xOn6L`l5x~'); + + farbtastic = $.farbtastic('#colorPickerDiv', pickColor); + + pickColor( $('#link-color').val() ); + + $('.pickcolor').click( function(e) { + $('#colorPickerDiv').show(); + e.preventDefault(); + }); + + $('#link-color').keyup( function() { + var a = $('#link-color').val(), + b = a; + + a = a.replace(/[^a-fA-F0-9]/, ''); + if ( '#' + a !== b ) + $('#link-color').val(a); + if ( a.length === 3 || a.length === 6 ) + pickColor( '#' + a ); + }); + + $(document).mousedown( function() { + $('#colorPickerDiv').hide(); + }); + + $('#default-color a').click( function(e) { + pickColor( '#' + this.innerHTML.replace(/[^a-fA-F0-9]/, '') ); + e.preventDefault(); + }); + + $('.image-radio-option.color-scheme input:radio').change( function() { + var currentDefault = $('#default-color a'), + newDefault = $(this).next().val(); + + if ( $('#link-color').val() == currentDefault.text() ) + pickColor( newDefault ); + + currentDefault.text( newDefault ); + }); + }); +})(jQuery); \ No newline at end of file diff --git a/src/wp-content/themes/twentyeleven/inc/theme-options.php b/src/wp-content/themes/twentyeleven/inc/theme-options.php new file mode 100644 index 0000000..34e29f7 --- /dev/null +++ b/src/wp-content/themes/twentyeleven/inc/theme-options.php @@ -0,0 +1,408 @@ +' . __( 'Some themes provide customization options that are grouped together on a Theme Options screen. If you change themes, options may change or disappear, as they are theme-specific. Your current theme, Twenty Eleven, provides the following Theme Options:', 'twentyeleven' ) . '

    ' . + '
      ' . + '
    1. ' . __( 'Color Scheme: You can choose a color palette of "Light" (light background with dark text) or "Dark" (dark background with light text) for your site.', 'twentyeleven' ) . '
    2. ' . + '
    3. ' . __( 'Link Color: You can choose the color used for text links on your site. You can enter the HTML color or hex code, or you can choose visually by clicking the "Select a Color" button to pick from a color wheel.', 'twentyeleven' ) . '
    4. ' . + '
    5. ' . __( 'Default Layout: You can choose if you want your site’s default layout to have a sidebar on the left, the right, or not at all.', 'twentyeleven' ) . '
    6. ' . + '
    ' . + '

    ' . __( 'Remember to click "Save Changes" to save any changes you have made to the theme options.', 'twentyeleven' ) . '

    ' . + '

    ' . __( 'For more information:', 'twentyeleven' ) . '

    ' . + '
    ' . + '

    ' . __( 'Support Forums', 'twentyeleven' ) . '

    '; + + add_contextual_help( $theme_page, $help ); +} +add_action( 'admin_menu', 'twentyeleven_theme_options_add_page' ); + +/** + * Returns an array of color schemes registered for Twenty Eleven. + * + * @since Twenty Eleven 1.0 + */ +function twentyeleven_color_schemes() { + $color_scheme_options = array( + 'light' => array( + 'value' => 'light', + 'label' => __( 'Light', 'twentyeleven' ), + 'thumbnail' => get_template_directory_uri() . '/inc/images/light.png', + 'default_link_color' => '#1b8be0', + ), + 'dark' => array( + 'value' => 'dark', + 'label' => __( 'Dark', 'twentyeleven' ), + 'thumbnail' => get_template_directory_uri() . '/inc/images/dark.png', + 'default_link_color' => '#e4741f', + ), + ); + + return apply_filters( 'twentyeleven_color_schemes', $color_scheme_options ); +} + +/** + * Returns an array of layout options registered for Twenty Eleven. + * + * @since Twenty Eleven 1.0 + */ +function twentyeleven_layouts() { + $layout_options = array( + 'content-sidebar' => array( + 'value' => 'content-sidebar', + 'label' => __( 'Content on left', 'twentyeleven' ), + 'thumbnail' => get_template_directory_uri() . '/inc/images/content-sidebar.png', + ), + 'sidebar-content' => array( + 'value' => 'sidebar-content', + 'label' => __( 'Content on right', 'twentyeleven' ), + 'thumbnail' => get_template_directory_uri() . '/inc/images/sidebar-content.png', + ), + 'content' => array( + 'value' => 'content', + 'label' => __( 'One-column, no sidebar', 'twentyeleven' ), + 'thumbnail' => get_template_directory_uri() . '/inc/images/content.png', + ), + ); + + return apply_filters( 'twentyeleven_layouts', $layout_options ); +} + +/** + * Returns the default options for Twenty Eleven. + * + * @since Twenty Eleven 1.0 + */ +function twentyeleven_get_default_theme_options() { + $default_theme_options = array( + 'color_scheme' => 'light', + 'link_color' => twentyeleven_get_default_link_color( 'light' ), + 'theme_layout' => 'content-sidebar', + ); + + if ( is_rtl() ) + $default_theme_options['theme_layout'] = 'sidebar-content'; + + return apply_filters( 'twentyeleven_default_theme_options', $default_theme_options ); +} + +/** + * Returns the default link color for Twenty Eleven, based on color scheme. + * + * @since Twenty Eleven 1.0 + * + * @param $string $color_scheme Color scheme. Defaults to the active color scheme. + * @return $string Color. +*/ +function twentyeleven_get_default_link_color( $color_scheme = null ) { + if ( null === $color_scheme ) { + $options = twentyeleven_get_theme_options(); + $color_scheme = $options['color_scheme']; + } + + $color_schemes = twentyeleven_color_schemes(); + if ( ! isset( $color_schemes[ $color_scheme ] ) ) + return false; + + return $color_schemes[ $color_scheme ]['default_link_color']; +} + +/** + * Returns the options array for Twenty Eleven. + * + * @since Twenty Eleven 1.0 + */ +function twentyeleven_get_theme_options() { + return get_option( 'twentyeleven_theme_options', twentyeleven_get_default_theme_options() ); +} + +/** + * Returns the options array for Twenty Eleven. + * + * @since Twenty Eleven 1.2 + */ +function twentyeleven_theme_options_render_page() { + ?> +
    + +

    + + +
    + + + + + + + + + + + + + + + +
    +
    + +
    + +
    + +
    +
    +
    + + + + +
    + ' . twentyeleven_get_default_link_color( $options['color_scheme'] ) . '' ); ?> +
    +
    +
    + +
    + +
    + +
    +
    + + +
    +
    + + + 'widget_twentyeleven_ephemera', 'description' => __( 'Use this widget to list your recent Aside, Status, Quote, and Link posts', 'twentyeleven' ) ); + $this->WP_Widget( 'widget_twentyeleven_ephemera', __( 'Twenty Eleven Ephemera', 'twentyeleven' ), $widget_ops ); + $this->alt_option_name = 'widget_twentyeleven_ephemera'; + + add_action( 'save_post', array(&$this, 'flush_widget_cache' ) ); + add_action( 'deleted_post', array(&$this, 'flush_widget_cache' ) ); + add_action( 'switch_theme', array(&$this, 'flush_widget_cache' ) ); + } + + /** + * Outputs the HTML for this widget. + * + * @param array An array of standard parameters for widgets in this theme + * @param array An array of settings for this widget instance + * @return void Echoes it's output + **/ + function widget( $args, $instance ) { + $cache = wp_cache_get( 'widget_twentyeleven_ephemera', 'widget' ); + + if ( !is_array( $cache ) ) + $cache = array(); + + if ( ! isset( $args['widget_id'] ) ) + $args['widget_id'] = null; + + if ( isset( $cache[$args['widget_id']] ) ) { + echo $cache[$args['widget_id']]; + return; + } + + ob_start(); + extract( $args, EXTR_SKIP ); + + $title = apply_filters( 'widget_title', empty( $instance['title'] ) ? __( 'Ephemera', 'twentyeleven' ) : $instance['title'], $instance, $this->id_base); + + if ( ! isset( $instance['number'] ) ) + $instance['number'] = '10'; + + if ( ! $number = absint( $instance['number'] ) ) + $number = 10; + + $ephemera_args = 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-aside', 'post-format-link', 'post-format-status', 'post-format-quote' ), + 'field' => 'slug', + 'operator' => 'IN', + ), + ), + ); + $ephemera = new WP_Query( $ephemera_args ); + + if ( $ephemera->have_posts() ) : + + echo $before_widget; + echo $before_title; + echo $title; // Can set this with a widget option, or omit altogether + echo $after_title; + + ?> +
      + have_posts() ) : $ephemera->the_post(); ?> + + + +
    1. + + + comments →', 'twentyeleven' ), __( '1 comment →', 'twentyeleven' ), __( '% comments →', 'twentyeleven' ) ); ?> + +
    2. + + + +
    3. + +   + + comments →', 'twentyeleven' ), __( '1 comment →', 'twentyeleven' ), __( '% comments →', 'twentyeleven' ) ); ?> + +
    4. + + + + +
    + flush_widget_cache(); + + $alloptions = wp_cache_get( 'alloptions', 'options' ); + if ( isset( $alloptions['widget_twentyeleven_ephemera'] ) ) + delete_option( 'widget_twentyeleven_ephemera' ); + + return $instance; + } + + function flush_widget_cache() { + wp_cache_delete( 'widget_twentyeleven_ephemera', 'widget' ); + } + + /** + * Displays the form for this widget on the Widgets page of the WP Admin area. + **/ + function form( $instance ) { + $title = isset( $instance['title']) ? esc_attr( $instance['title'] ) : ''; + $number = isset( $instance['number'] ) ? absint( $instance['number'] ) : 10; +?> +

    +

    + +

    +

    + + +
    +
    + + + + + + + + + + + + + + + + +
    +
    +

    +
    + +
    +

    + +
    +
    + + + +
    +
    + + + \ No newline at end of file diff --git a/src/wp-content/themes/twentyeleven/js/html5.js b/src/wp-content/themes/twentyeleven/js/html5.js new file mode 100644 index 0000000..6dd03a4 --- /dev/null +++ b/src/wp-content/themes/twentyeleven/js/html5.js @@ -0,0 +1,3 @@ +// html5shiv MIT @rem remysharp.com/html5-enabling-script +// iepp v1.6.2 MIT @jon_neal iecss.com/print-protector +/*@cc_on(function(a,b){function r(a){var b=-1;while(++b";return a.childNodes.length!==1}())){a.iepp=a.iepp||{};var c=a.iepp,d=c.html5elements||"abbr|article|aside|audio|canvas|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",e=d.split("|"),f=e.length,g=new RegExp("(^|\\s)("+d+")","gi"),h=new RegExp("<(/*)("+d+")","gi"),i=/^\s*[\{\}]\s*$/,j=new RegExp("(^|[^\\n]*?\\s)("+d+")([^\\n]*)({[\\n\\w\\W]*?})","gi"),k=b.createDocumentFragment(),l=b.documentElement,m=l.firstChild,n=b.createElement("body"),o=b.createElement("style"),p=/print|all/,q;c.getCSS=function(a,b){if(a+""===undefined)return"";var d=-1,e=a.length,f,g=[]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 EU!Y(DSO5S3 literal 0 HcmV?d00001 diff --git a/src/wp-content/themes/twentyeleven/languages/es_ES.po b/src/wp-content/themes/twentyeleven/languages/es_ES.po new file mode 100644 index 0000000..3d0a9e7 --- /dev/null +++ b/src/wp-content/themes/twentyeleven/languages/es_ES.po @@ -0,0 +1,566 @@ +# Translation of Twenty Eleven in Spanish (Spain) +# This file is distributed under the same license as the Twenty Eleven package. +msgid "" +msgstr "" +"PO-Revision-Date: 2011-07-05 06:01:17+0000\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: GlotPress/0.1\n" +"Project-Id-Version: Twenty Eleven\n" + +#: content-single.php:39 +msgid "This entry was posted by %5$s. Bookmark the permalink." +msgstr "Esta entrada fue publicada por %5$s. Guarda el enlace permanente." + +#: functions.php:544 +msgid "Reply " +msgstr "Responder " + +#: single.php:20 +msgid "Next " +msgstr "Siguiente " + +#: single.php:19 +msgid " Previous" +msgstr " Anterior" + +#: content-image.php:64 +msgid "1 Reply" +msgstr "1 Respuesta" + +#: content-quote.php:24 content.php:30 content-image.php:21 +#: content-aside.php:22 content-status.php:21 content-link.php:22 +msgctxt "comments number" +msgid "%" +msgstr "%" + +#: content-quote.php:24 content.php:30 content-image.php:21 +#: content-aside.php:22 content-status.php:21 content-link.php:22 +msgctxt "comments number" +msgid "1" +msgstr "1" + +#: content-gallery.php:87 +msgid "Leave a Reply" +msgstr "Deja una respuesta" + +#: content-quote.php:24 content.php:30 content-image.php:21 +#: content-image.php:64 content-aside.php:22 content-status.php:21 +#: content-link.php:22 +msgid "Reply" +msgstr "Responder" + +#: content-image.php:64 +msgid "% Replies" +msgstr "% Respuestas" + +#: image.php:18 +msgid "Image navigation" +msgstr "Navegador de imágenes" + +#: functions.php:526 +msgid "%1$s at %2$s" +msgstr "%1$s en %2$s" + +#: functions.php:520 +msgid "%1$s on %2$s said:" +msgstr "%1$s en %2$s dijo:" + +#: index.php:41 category.php:54 tag.php:54 author.php:78 archive.php:61 +msgid "Apologies, but no results were found for the requested archive. Perhaps searching will help find a related post." +msgstr "Disculpa, pero no se han encontrado resultados para el archivo solicitado. Tal vez una nueva búsqueda ayudará a encontrar una entrada relacionada." + +#: content-image.php:34 +msgid " by %6$s" +msgstr " por %6$s" + +#: functions.php:562 +msgid "Posted on by %7$s" +msgstr "Publicado el por %7$s" + +#: inc/theme-options.php:261 +msgid "Default Layout" +msgstr "Diseño por defecto" + +#: inc/theme-options.php:98 +msgid "Documentation on Theme Options" +msgstr "Documentación de Opciones del Tema" + +#: inc/theme-options.php:99 +msgid "Support Forums" +msgstr "Foros de soporte" + +#: inc/theme-options.php:97 +msgid "For more information:" +msgstr "Para más información:" + +#: inc/theme-options.php:96 +msgid "Remember to click \"Save Changes\" to save any changes you have made to the theme options." +msgstr "Recuerde hacer clic en \"Guardar cambios\" para guardar los cambios realizados a las opciones del tema." + +#: header.php:115 +msgid "Skip to primary content" +msgstr "Ir al contenido principal" + +#: header.php:116 +msgid "Skip to secondary content" +msgstr "Ir al contenido secundario" + +#: inc/theme-options.php:148 +msgid "One-column, no sidebar" +msgstr "Una columna, sin barra lateral" + +#: inc/theme-options.php:90 +msgid "Some themes provide customization options that are grouped together on a Theme Options screen. If you change themes, options may change or disappear, as they are theme-specific. Your current theme, Twenty Eleven, provides the following Theme Options:" +msgstr "Algunos temas ofrecen opciones de personalización que se agrupan en una pantalla de Opciones del tema. Si cambias los temas, las opciones pueden cambiar o desaparecer, ya que pertenecen a un tema específico. El tema actual, Twenty Eleven, ofrece las siguientes opciones:" + +#: inc/theme-options.php:92 +msgid "Color Scheme: You can choose a color palette of \"Light\" (light background with dark text) or \"Dark\" (dark background with light text) for your site." +msgstr "Combinación de colores: Puedes elegir una paleta de colores para \"Light\" (fondo blanco y texto oscuro) o \"Dark\" (fondo oscuro y texto claro) para su sitio." + +#: inc/theme-options.php:93 +msgid "Link Color: You can choose the color used for text links on your site. You can enter the HTML color or hex code, or you can choose visually by clicking the \"Select a Color\" button to pick from a color wheel." +msgstr "Color de enlace: Puedes elegir el color que se utiliza para los enlaces en el texto de su sitio. Puedes introducir el código de color HTML en hexadecimal, o puedes elegirlo visualmente haciendo clic en \"Seleccionar un color\" para elegir de la rueda de color." + +#: inc/theme-options.php:94 +msgid "Default Layout: You can choose if you want your site’s default layout to have a sidebar on the left, the right, or not at all." +msgstr "Diseño por defecto: Puedes elegir si deseas que el diseño de tu sitio web por defecto tenga una barra lateral a la izquierda, a la derecha, o que no tenga barra lateral." + +#: content-quote.php:44 content-quote.php:54 content.php:51 content.php:61 +#: content-image.php:47 content-image.php:56 content-single.php:30 +#: content-single.php:33 content-gallery.php:62 content-gallery.php:72 +#: content-featured.php:29 content-featured.php:38 +msgid ", " +msgstr ", " + +#: content-quote.php:48 content.php:55 content-image.php:51 +#: content-gallery.php:66 +msgid "Posted in %2$s" +msgstr "Publicado en %2$s" + +#: content-quote.php:60 content.php:67 content-image.php:59 +#: content-gallery.php:78 +msgid "Tagged %2$s" +msgstr "Etiquetado %2$s" + +#: footer.php:26 +msgid "Semantic Personal Publishing Platform" +msgstr "Plataforma semántica de publicación personal" + +#: footer.php:26 +msgid "Proudly powered by %s" +msgstr "Funciona con %s" + +#: content-status.php:16 +msgid "Status" +msgstr "Estado" + +#: content-quote.php:15 +msgid "Quote" +msgstr "Cita" + +#: content-gallery.php:17 +msgid "Gallery" +msgstr "Galería" + +#: content-link.php:17 +msgid "Link" +msgstr "Enlace" + +#: content-image.php:16 +msgid "Image" +msgstr "Imagen" + +#: content-aside.php:17 +msgid "Aside" +msgstr "Minientrada" + +msgid "The 2011 theme for WordPress is sophisticated, lightweight, and adaptable. Make it yours with a custom menu, header image, and background -- then go further with available theme options for light or dark color scheme, custom link colors, and three layout choices. Twenty Eleven comes equipped with a Showcase page template that transforms your front page into a showcase to show off your best content, widget support galore (sidebar, three footer areas, and a Showcase page widget area), and a custom \"Ephemera\" widget to display your Aside, Link, Quote, or Status posts. Included are styles for print and for the admin editor, support for featured images (as custom header images on posts and pages and as large images on featured \"sticky\" posts), and special styles for six different post formats." +msgstr "El tema de 2011 para WordPress es sofisticado, ligero y adaptable. Hazlo tuyo con un menú personalizado, imagen de cabecera, y el fondo – y puedes modificarlo con las opciones disponibles para el tema como colores claros u oscuros, colores personalizados para enlaces, y tres opciones de diseño. Twenty Eleven viene equipado con una plantilla para hacer de tu primera página en un escaparate y mostrar ty mejor contenido, soporte para muchos widgets (barra lateral, tres zonas de pie de página, y un área para la plantilla escaparate), y un widget, \"Ephemera\", para mostrar Minientradas, Enlaces, Citas o mensajes de estado. Se incluyen estilos para impresión y para el editor, soporte para imágenes destacadas (como imágenes de cabecera personalizada en blogs y páginas e imágenes de gran tamaño para mensajes \"fijos\"), y estilos especiales para seis formatos diferentes entradas." + +#: content.php:16 +msgid "Featured" +msgstr "Destacado" + +msgid "dark, light, white, black, gray, one-column, two-columns, left-sidebar, right-sidebar, fixed-width, flexible-width, custom-background, custom-colors, custom-header, custom-menu, editor-style, featured-image-header, featured-images, full-width-template, microformats, post-formats, rtl-language-support, sticky-post, theme-options, translation-ready" +msgstr "dark, light, white, black, gray, one-column, two-columns, left-sidebar, right-sidebar, fixed-width, flexible-width, custom-background, custom-colors, custom-header, custom-menu, editor-style, featured-image-header, featured-images, full-width-template, microformats, post-formats, rtl-language-support, sticky-post, theme-options, translation-ready" + +#: archive.php:25 +msgid "Daily Archives: %s" +msgstr "Archivos diarios: %s" + +#: inc/theme-options.php:248 inc/theme-options.php:250 +msgid "Link Color" +msgstr "Color de los enlaces" + +#: archive.php:27 +msgid "Monthly Archives: %s" +msgstr "Archivos Mensuales: %s" + +#: inc/widgets.php:19 +msgid "Use this widget to list your recent Aside, Status, Quote, and Link posts" +msgstr "Utiliza este widget para listar tus Minientradas, Estados, Citas y Enlaces recientes" + +#: inc/theme-options.php:253 +msgid "Select a Color" +msgstr "Selecciona un color" + +#: inc/theme-options.php:256 +msgid "Default color: %s" +msgstr "Color por defecto: %s" + +#: archive.php:29 +msgid "Yearly Archives: %s" +msgstr "Archivo Anual: %s" + +#: functions.php:191 +msgid "Hanoi Plant" +msgstr "Planta Hanoi" + +#: inc/theme-options.php:143 +msgid "Content on right" +msgstr "Contenido a la derecha" + +#: inc/theme-options.php:138 +msgid "Content on left" +msgstr "Contenido a la izquierda" + +#: inc/theme-options.php:120 +msgid "Dark" +msgstr "Oscuro" + +#: inc/theme-options.php:114 +msgid "Light" +msgstr "Claro" + +#: inc/theme-options.php:213 +msgid "%s Theme Options" +msgstr "Opciones del tema %s" + +#: inc/theme-options.php:80 inc/theme-options.php:81 +msgid "Theme Options" +msgstr "Opciones del tema" + +#: inc/theme-options.php:225 inc/theme-options.php:227 +#: inc/theme-options.php:263 +msgid "Color Scheme" +msgstr "Combinación de colores" + +#: functions.php:179 +msgid "Lanterns" +msgstr "Linternas" + +#: functions.php:185 +msgid "Willow" +msgstr "Sauce" + +#: functions.php:173 +msgid "Chessboard" +msgstr "Tablero de ajedrez" + +#: functions.php:167 +msgid "Pine Cone" +msgstr "Pino" + +#: functions.php:149 +msgid "Wheel" +msgstr "Rueda" + +#: showcase.php:143 +msgid "Featuring: %s" +msgstr "Destacando: %s" + +#: functions.php:155 +msgid "Shore" +msgstr "Tierra" + +#: functions.php:161 +msgid "Trolley" +msgstr "Carretilla" + +#: inc/widgets.php:93 inc/widgets.php:109 +msgid "1 comment →" +msgstr "1 comentario →" + +#: content-single.php:60 author.php:49 +msgid "About %s" +msgstr "Acerca de %s" + +#: inc/widgets.php:93 inc/widgets.php:109 +msgid "0 comments →" +msgstr "0 comentarios →" + +#: inc/widgets.php:52 +msgid "Ephemera" +msgstr "Ephemera" + +#: footer.php:26 +msgid "http://wordpress.org/" +msgstr "http://es.wordpress.org/" + +msgid "the WordPress team" +msgstr "el equipo de WordPress" + +#: comments.php:42 comments.php:62 +msgid "Newer Comments →" +msgstr "Comentarios recientes →" + +#: comments.php:41 comments.php:61 +msgid "← Older Comments" +msgstr "← Comentarios antiguos" + +#: comments.php:17 +msgid "This post is password protected. Enter the password to view any comments." +msgstr "Esta entrada está protegida. Introduce la contraseña para ver los comentarios." + +#: comments.php:72 +msgid "Comments are closed." +msgstr "Los comentarios están cerrados." + +#: content-quote.php:14 showcase.php:113 showcase.php:192 content.php:15 +#: content.php:19 content-image.php:15 content-gallery.php:16 +#: content-gallery.php:48 content-aside.php:16 content-status.php:15 +#: inc/widgets.php:91 content-link.php:16 content-featured.php:14 +msgid "Permalink to %s" +msgstr "Enlace permanente a %s" + +#: inc/widgets.php:107 +msgid "Link to %s" +msgstr "Enlace a %s" + +#: inc/widgets.php:159 +msgid "Title:" +msgstr "Título:" + +#: archive.php:31 +msgid "Blog Archives" +msgstr "Archivo del sitio" + +#: 404.php:17 +msgid "This is somewhat embarrassing, isn’t it?" +msgstr "Esto es algo embarazoso, ¿verdad?" + +#: category.php:19 +msgid "Category Archives: %s" +msgstr "Archivo de la categoría: %s" + +#: comments.php:40 comments.php:60 +msgid "Comment navigation" +msgstr "Navegación de comentarios" + +#: comments.php:33 +msgid "One thought on “%2$s”" +msgid_plural "%1$s thoughts on “%2$s”" +msgstr[0] "Un pensamiento en “%2$s”" +msgstr[1] "%1$s pensamientos en “%2$s”" + +#: search.php:46 +msgid "Sorry, but nothing matched your search criteria. Please try again with some different keywords." +msgstr "Lo sentimos, pero nada coincide con tus búsqueda. Por favor, prueba de nuevo con diferentes palabras clave." + +#: inc/widgets.php:20 +msgid "Twenty Eleven Ephemera" +msgstr "Twenty Eleven Ephemera" + +#: tag.php:19 +msgid "Tag Archives: %s" +msgstr "Archivo de la etiqueta: %s" + +#: author.php:28 +msgid "Author Archives: %s" +msgstr "Archivo del Autor: %s" + +#: search.php:18 +msgid "Search Results for: %s" +msgstr "Resultados de la búsqueda para: %s" + +#: index.php:37 category.php:50 tag.php:50 author.php:74 search.php:42 +#: archive.php:57 +msgid "Nothing Found" +msgstr "No se ha encontrado nada" + +#: searchform.php:11 searchform.php:12 searchform.php:13 +msgid "Search" +msgstr "Buscar" + +#: showcase.php:70 +msgid "Featured Post" +msgstr "Entradas destacadas" + +#: showcase.php:153 +msgid "Recent Posts" +msgstr "Entradas recientes" + +#: sidebar.php:19 +msgid "Archives" +msgstr "Archivos" + +#: sidebar.php:26 +msgid "Meta" +msgstr "Meta" + +#: 404.php:28 +msgid "Most Used Categories" +msgstr "Categorías más usadas" + +#: 404.php:36 +msgid "Try looking in the monthly archives. %1$s" +msgstr "Trata de buscar en los archivos mensuales. %1$s" + +#: 404.php:21 +msgid "It seems we can’t find what you’re looking for. Perhaps searching, or one of the links below, can help." +msgstr "Parece que no podemos encontrar lo que estás buscando. Tal vez una búsqueda, o uno de los enlaces que aparecen a continuación, pueden ayudarte." + +#: inc/widgets.php:162 +msgid "Number of posts to show:" +msgstr "Número de entradas a mostrar:" + +msgid "Twenty Eleven" +msgstr "Twenty Eleven" + +msgid "http://wordpress.org/extend/themes/twentyeleven" +msgstr "http://wordpress.org/extend/themes/twentyeleven" + +#: inc/widgets.php:93 inc/widgets.php:109 +msgid "% comments →" +msgstr "% comentarios →" + +#: content-quote.php:35 content.php:41 content-image.php:27 +#: content-gallery.php:32 content-aside.php:33 functions.php:327 +#: content-status.php:34 content-link.php:33 +msgid "Continue reading " +msgstr "Sigue leyendo " + +#: content-quote.php:36 content.php:42 content-image.php:28 +#: content-single.php:24 content-intro.php:18 content-gallery.php:54 +#: content-aside.php:34 image.php:89 content-status.php:35 content-page.php:18 +#: content-link.php:34 content-featured.php:23 +msgid "Pages:" +msgstr "Páginas:" + +#: content-image.php:39 functions.php:568 +msgid "View all posts by %s" +msgstr "Ver todas las entradas de %s" + +#: content-quote.php:69 showcase.php:194 content.php:77 content-gallery.php:87 +#: content-aside.php:42 content-status.php:43 content-link.php:42 +msgid "% Replies" +msgstr "% Respuestas" + +#: content-quote.php:69 showcase.php:194 content.php:77 content-gallery.php:87 +#: content-aside.php:42 content-status.php:43 content-link.php:42 +msgid "1 Reply" +msgstr "1 Respuesta" + +#: content-quote.php:72 content.php:80 content-image.php:68 +#: content-single.php:52 content-intro.php:19 content-gallery.php:90 +#: content-aside.php:44 image.php:40 functions.php:503 functions.php:531 +#: content-status.php:45 content-page.php:21 content-link.php:44 +#: content-featured.php:45 +msgid "Edit" +msgstr "Editar" + +#: content-single.php:37 +msgid "This entry was posted in %1$s by %5$s. Bookmark the permalink." +msgstr "Esta entrada fue publicada en %1$s por %5$s. Guarda el enlace permanente." + +#: content-single.php:35 +msgid "This entry was posted in %1$s and tagged %2$s by %5$s. Bookmark the permalink." +msgstr "Esta entrada fue publicada en %1$s y etiquetada %2$s por %5$s. Guarda enlace permanente." + +#: content-quote.php:69 showcase.php:194 content.php:77 content-aside.php:42 +#: content-status.php:43 content-link.php:42 +msgid "Leave a reply" +msgstr "Deja una respuesta" + +#: content-featured.php:33 +msgid "This entry was posted in %1$s. Bookmark the permalink." +msgstr "Esta entrada fue publicada en %1$s. Guarda el enlace permanente." + +#: content-gallery.php:47 +msgid "This gallery contains %2$s photo." +msgid_plural "This gallery contains %2$s photos." +msgstr[0] "Esta galería contiene %2$s foto " +msgstr[1] "Esta galería contiene %2$s fotos " + +#: image.php:30 +msgid "Published %2$s at %4$s × %5$s in %7$s" +msgstr "Publicado el %2$s en %4$s × %5$s en %7$s" + +#: image.php:20 +msgid "Next →" +msgstr "Siguiente →" + +#: image.php:19 +msgid "← Previous" +msgstr "← Anterior" + +#: header.php:113 +msgid "Main menu" +msgstr "Menú principal" + +#: header.php:45 +msgid "Page %s" +msgstr "Página %s" + +#: functions.php:503 +msgid "Pingback:" +msgstr "Pingback: " + +#: functions.php:535 +msgid "Your comment is awaiting moderation." +msgstr "Tu comentario está pendiente de moderación." + +#: functions.php:434 +msgid "Newer posts " +msgstr "Entradas más nuevas " + +#: functions.php:433 +msgid " Older posts" +msgstr " Entradas más antiguas" + +#: functions.php:432 single.php:18 +msgid "Post navigation" +msgstr "Navegador de artículos" + +#: functions.php:413 +msgid "Footer Area Three" +msgstr "Ãrea 3 del pie" + +#: functions.php:403 +msgid "Footer Area Two" +msgstr "Ãrea 2 del pie" + +#: functions.php:395 functions.php:405 functions.php:415 +msgid "An optional widget area for your site footer" +msgstr "Una zona opcional para widgets en el pie de tu sitio" + +#: functions.php:393 +msgid "Footer Area One" +msgstr "Ãrea 1 del pie" + +#: functions.php:385 +msgid "The sidebar for the optional Showcase Template" +msgstr "La barra lateral para la plantilla de Escaparate opcional" + +#: functions.php:383 +msgid "Showcase Sidebar" +msgstr "Barra lateral de la plantilla Escaparate" + +#: functions.php:374 +msgid "Main Sidebar" +msgstr "Barra lateral principal" + +#: functions.php:101 +msgid "Primary Menu" +msgstr "Menú Principal" + +#: content-single.php:64 +msgid "View all posts by %s " +msgstr "Ver todas las entradas por %s " + +#: content-featured.php:31 +msgid "This entry was posted in %1$s and tagged %2$s. Bookmark the permalink." +msgstr "Esta entrada fue publicada en %1$s y etiquetada %2$s. Guarda el enlace permanente." \ No newline at end of file diff --git a/src/wp-content/themes/twentyeleven/languages/twentyeleven.pot b/src/wp-content/themes/twentyeleven/languages/twentyeleven.pot new file mode 100644 index 0000000..1cdd5e2 --- /dev/null +++ b/src/wp-content/themes/twentyeleven/languages/twentyeleven.pot @@ -0,0 +1,654 @@ +# Copyright (C) 2010 Twenty Eleven +# This file is distributed under the same license as the Twenty Eleven package. +msgid "" +msgstr "" +"Project-Id-Version: Twenty Eleven 1.0\n" +"Report-Msgid-Bugs-To: http://wordpress.org/tag/twentyeleven\n" +"POT-Creation-Date: 2011-06-30 22:47:23+00:00\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"PO-Revision-Date: 2010-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" + +#: content-quote.php:14 showcase.php:113 showcase.php:192 content.php:15 +#: content.php:19 content-image.php:15 content-gallery.php:16 +#: content-gallery.php:48 content-aside.php:16 content-status.php:15 +#: inc/widgets.php:91 content-link.php:16 content-featured.php:14 +msgid "Permalink to %s" +msgstr "" + +#: content-quote.php:15 +msgid "Quote" +msgstr "" + +#: content-quote.php:24 content.php:30 content-image.php:21 +#: content-image.php:64 content-aside.php:22 content-status.php:21 +#: content-link.php:22 +msgid "Reply" +msgstr "" + +#: content-quote.php:24 content.php:30 content-image.php:21 +#: content-aside.php:22 content-status.php:21 content-link.php:22 +msgctxt "comments number" +msgid "1" +msgstr "" + +#: content-quote.php:24 content.php:30 content-image.php:21 +#: content-aside.php:22 content-status.php:21 content-link.php:22 +msgctxt "comments number" +msgid "%" +msgstr "" + +#: content-quote.php:35 content.php:41 content-image.php:27 +#: content-gallery.php:32 content-aside.php:33 functions.php:327 +#: content-status.php:34 content-link.php:33 +msgid "Continue reading " +msgstr "" + +#: content-quote.php:36 content.php:42 content-image.php:28 +#: content-single.php:24 content-intro.php:18 content-gallery.php:54 +#: content-aside.php:34 image.php:89 content-status.php:35 content-page.php:18 +#: content-link.php:34 content-featured.php:23 +msgid "Pages:" +msgstr "" + +#. translators: used between list items, there is a space after the comma +#: content-quote.php:44 content-quote.php:54 content.php:51 content.php:61 +#: content-image.php:47 content-image.php:56 content-single.php:30 +#: content-single.php:33 content-gallery.php:62 content-gallery.php:72 +#: content-featured.php:29 content-featured.php:38 +msgid ", " +msgstr "" + +#: content-quote.php:48 content.php:55 content-image.php:51 +#: content-gallery.php:66 +msgid "Posted in %2$s" +msgstr "" + +#: content-quote.php:60 content.php:67 content-image.php:59 +#: content-gallery.php:78 +msgid "Tagged %2$s" +msgstr "" + +#: content-quote.php:69 showcase.php:194 content.php:77 content-aside.php:42 +#: content-status.php:43 content-link.php:42 +msgid "Leave a reply" +msgstr "" + +#: content-quote.php:69 showcase.php:194 content.php:77 content-gallery.php:87 +#: content-aside.php:42 content-status.php:43 content-link.php:42 +msgid "1 Reply" +msgstr "" + +#: content-quote.php:69 showcase.php:194 content.php:77 content-gallery.php:87 +#: content-aside.php:42 content-status.php:43 content-link.php:42 +msgid "% Replies" +msgstr "" + +#: content-quote.php:72 content.php:80 content-image.php:68 +#: content-single.php:52 content-intro.php:19 content-gallery.php:90 +#: content-aside.php:44 image.php:40 functions.php:503 functions.php:531 +#: content-status.php:45 content-page.php:21 content-link.php:44 +#: content-featured.php:45 +msgid "Edit" +msgstr "" + +#: showcase.php:70 +msgid "Featured Post" +msgstr "" + +#: showcase.php:143 +msgid "Featuring: %s" +msgstr "" + +#: showcase.php:153 +msgid "Recent Posts" +msgstr "" + +#: index.php:37 category.php:50 tag.php:50 author.php:74 search.php:42 +#: archive.php:57 +msgid "Nothing Found" +msgstr "" + +#: index.php:41 category.php:54 tag.php:54 author.php:78 archive.php:61 +msgid "" +"Apologies, but no results were found for the requested archive. Perhaps " +"searching will help find a related post." +msgstr "" + +#: content.php:16 +msgid "Featured" +msgstr "" + +#. #-#-#-#-# twentyeleven.pot (Twenty Eleven 1.0) #-#-#-#-# +#. Author URI of the plugin/theme +#: footer.php:26 +msgid "http://wordpress.org/" +msgstr "" + +#: footer.php:26 +msgid "Semantic Personal Publishing Platform" +msgstr "" + +#: footer.php:26 +msgid "Proudly powered by %s" +msgstr "" + +#: category.php:19 +msgid "Category Archives: %s" +msgstr "" + +#: content-image.php:16 +msgid "Image" +msgstr "" + +#: content-image.php:34 +msgid "" +" by " +" %6$s" +msgstr "" + +#: content-image.php:39 functions.php:568 +msgid "View all posts by %s" +msgstr "" + +#: content-image.php:64 +msgid "1 Reply" +msgstr "" + +#: content-image.php:64 +msgid "% Replies" +msgstr "" + +#: sidebar.php:19 +msgid "Archives" +msgstr "" + +#: sidebar.php:26 +msgid "Meta" +msgstr "" + +#: content-single.php:35 +msgid "" +"This entry was posted in %1$s and tagged %2$s by %5$s. " +"Bookmark the permalink." +msgstr "" + +#: content-single.php:37 +msgid "" +"This entry was posted in %1$s by %5$s. Bookmark the permalink." +msgstr "" + +#: content-single.php:39 +msgid "" +"This entry was posted by %5$s. Bookmark the permalink." +msgstr "" + +#: content-single.php:60 author.php:49 +msgid "About %s" +msgstr "" + +#: content-single.php:64 +msgid "View all posts by %s " +msgstr "" + +#: tag.php:19 +msgid "Tag Archives: %s" +msgstr "" + +#: content-gallery.php:17 +msgid "Gallery" +msgstr "" + +#: content-gallery.php:47 +msgid "This gallery contains %2$s photo." +msgid_plural "This gallery contains %2$s photos." +msgstr[0] "" +msgstr[1] "" + +#: content-gallery.php:87 +msgid "Leave a Reply" +msgstr "" + +#: comments.php:17 +msgid "" +"This post is password protected. Enter the password to view any comments." +msgstr "" + +#: comments.php:33 +msgid "One thought on “%2$s”" +msgid_plural "%1$s thoughts on “%2$s”" +msgstr[0] "" +msgstr[1] "" + +#: comments.php:40 comments.php:60 +msgid "Comment navigation" +msgstr "" + +#: comments.php:41 comments.php:61 +msgid "← Older Comments" +msgstr "" + +#: comments.php:42 comments.php:62 +msgid "Newer Comments →" +msgstr "" + +#: comments.php:72 +msgid "Comments are closed." +msgstr "" + +#: content-aside.php:17 +msgid "Aside" +msgstr "" + +#: 404.php:17 +msgid "This is somewhat embarrassing, isn’t it?" +msgstr "" + +#: 404.php:21 +msgid "" +"It seems we can’t find what you’re looking for. Perhaps " +"searching, or one of the links below, can help." +msgstr "" + +#: 404.php:28 +msgid "Most Used Categories" +msgstr "" + +#. translators: %1$s: smilie +#: 404.php:36 +msgid "Try looking in the monthly archives. %1$s" +msgstr "" + +#: image.php:18 +msgid "Image navigation" +msgstr "" + +#: image.php:19 +msgid "← Previous" +msgstr "" + +#: image.php:20 +msgid "Next →" +msgstr "" + +#: image.php:30 +msgid "" +"Published %2$s " +"at %4$s × %5$s " +"in %7$s" +msgstr "" + +#: functions.php:101 +msgid "Primary Menu" +msgstr "" + +#. translators: header image description +#: functions.php:149 +msgid "Wheel" +msgstr "" + +#. translators: header image description +#: functions.php:155 +msgid "Shore" +msgstr "" + +#. translators: header image description +#: functions.php:161 +msgid "Trolley" +msgstr "" + +#. translators: header image description +#: functions.php:167 +msgid "Pine Cone" +msgstr "" + +#. translators: header image description +#: functions.php:173 +msgid "Chessboard" +msgstr "" + +#. translators: header image description +#: functions.php:179 +msgid "Lanterns" +msgstr "" + +#. translators: header image description +#: functions.php:185 +msgid "Willow" +msgstr "" + +#. translators: header image description +#: functions.php:191 +msgid "Hanoi Plant" +msgstr "" + +#: functions.php:374 +msgid "Main Sidebar" +msgstr "" + +#: functions.php:383 +msgid "Showcase Sidebar" +msgstr "" + +#: functions.php:385 +msgid "The sidebar for the optional Showcase Template" +msgstr "" + +#: functions.php:393 +msgid "Footer Area One" +msgstr "" + +#: functions.php:395 functions.php:405 functions.php:415 +msgid "An optional widget area for your site footer" +msgstr "" + +#: functions.php:403 +msgid "Footer Area Two" +msgstr "" + +#: functions.php:413 +msgid "Footer Area Three" +msgstr "" + +#: functions.php:432 single.php:18 +msgid "Post navigation" +msgstr "" + +#: functions.php:433 +msgid " Older posts" +msgstr "" + +#: functions.php:434 +msgid "Newer posts " +msgstr "" + +#: functions.php:503 +msgid "Pingback:" +msgstr "" + +#. translators: 1: comment author, 2: date and time +#: functions.php:520 +msgid "%1$s on %2$s said:" +msgstr "" + +#. translators: 1: date, 2: time +#: functions.php:526 +msgid "%1$s at %2$s" +msgstr "" + +#: functions.php:535 +msgid "Your comment is awaiting moderation." +msgstr "" + +#: functions.php:544 +msgid "Reply " +msgstr "" + +#: functions.php:562 +msgid "" +"Posted on by %7$s" +msgstr "" + +#: header.php:45 +msgid "Page %s" +msgstr "" + +#: header.php:113 +msgid "Main menu" +msgstr "" + +#: header.php:115 +msgid "Skip to primary content" +msgstr "" + +#: header.php:116 +msgid "Skip to secondary content" +msgstr "" + +#: author.php:28 +msgid "Author Archives: %s" +msgstr "" + +#: content-status.php:16 +msgid "Status" +msgstr "" + +#: inc/theme-options.php:80 inc/theme-options.php:81 +msgid "Theme Options" +msgstr "" + +#: inc/theme-options.php:90 +msgid "" +"Some themes provide customization options that are grouped together on a " +"Theme Options screen. If you change themes, options may change or disappear, " +"as they are theme-specific. Your current theme, Twenty Eleven, provides the " +"following Theme Options:" +msgstr "" + +#: inc/theme-options.php:92 +msgid "" +"Color Scheme: You can choose a color palette of \"Light" +"\" (light background with dark text) or \"Dark\" (dark background with light " +"text) for your site." +msgstr "" + +#: inc/theme-options.php:93 +msgid "" +"Link Color: You can choose the color used for text links on " +"your site. You can enter the HTML color or hex code, or you can choose " +"visually by clicking the \"Select a Color\" button to pick from a color " +"wheel." +msgstr "" + +#: inc/theme-options.php:94 +msgid "" +"Default Layout: You can choose if you want your site’" +"s default layout to have a sidebar on the left, the right, or not at all." +msgstr "" + +#: inc/theme-options.php:96 +msgid "" +"Remember to click \"Save Changes\" to save any changes you have made to the " +"theme options." +msgstr "" + +#: inc/theme-options.php:97 +msgid "For more information:" +msgstr "" + +#: inc/theme-options.php:98 +msgid "" +"Documentation on Theme Options" +msgstr "" + +#: inc/theme-options.php:99 +msgid "" +"Support Forums" +msgstr "" + +#: inc/theme-options.php:114 +msgid "Light" +msgstr "" + +#: inc/theme-options.php:120 +msgid "Dark" +msgstr "" + +#: inc/theme-options.php:138 +msgid "Content on left" +msgstr "" + +#: inc/theme-options.php:143 +msgid "Content on right" +msgstr "" + +#: inc/theme-options.php:148 +msgid "One-column, no sidebar" +msgstr "" + +#: inc/theme-options.php:213 +msgid "%s Theme Options" +msgstr "" + +#: inc/theme-options.php:225 inc/theme-options.php:227 +#: inc/theme-options.php:263 +msgid "Color Scheme" +msgstr "" + +#: inc/theme-options.php:248 inc/theme-options.php:250 +msgid "Link Color" +msgstr "" + +#: inc/theme-options.php:253 +msgid "Select a Color" +msgstr "" + +#: inc/theme-options.php:256 +msgid "Default color: %s" +msgstr "" + +#: inc/theme-options.php:261 +msgid "Default Layout" +msgstr "" + +#: inc/widgets.php:19 +msgid "" +"Use this widget to list your recent Aside, Status, Quote, and Link posts" +msgstr "" + +#: inc/widgets.php:20 +msgid "Twenty Eleven Ephemera" +msgstr "" + +#: inc/widgets.php:52 +msgid "Ephemera" +msgstr "" + +#: inc/widgets.php:93 inc/widgets.php:109 +msgid "0 comments →" +msgstr "" + +#: inc/widgets.php:93 inc/widgets.php:109 +msgid "1 comment →" +msgstr "" + +#: inc/widgets.php:93 inc/widgets.php:109 +msgid "% comments →" +msgstr "" + +#: inc/widgets.php:107 +msgid "Link to %s" +msgstr "" + +#: inc/widgets.php:159 +msgid "Title:" +msgstr "" + +#: inc/widgets.php:162 +msgid "Number of posts to show:" +msgstr "" + +#: search.php:18 +msgid "Search Results for: %s" +msgstr "" + +#: search.php:46 +msgid "" +"Sorry, but nothing matched your search criteria. Please try again with some " +"different keywords." +msgstr "" + +#: archive.php:25 +msgid "Daily Archives: %s" +msgstr "" + +#: archive.php:27 +msgid "Monthly Archives: %s" +msgstr "" + +#: archive.php:29 +msgid "Yearly Archives: %s" +msgstr "" + +#: archive.php:31 +msgid "Blog Archives" +msgstr "" + +#: content-link.php:17 +msgid "Link" +msgstr "" + +#: content-featured.php:31 +msgid "" +"This entry was posted in %1$s and tagged %2$s. Bookmark the permalink." +msgstr "" + +#: content-featured.php:33 +msgid "" +"This entry was posted in %1$s. Bookmark the permalink." +msgstr "" + +#: single.php:19 +msgid " Previous" +msgstr "" + +#: single.php:20 +msgid "Next " +msgstr "" + +#: searchform.php:11 searchform.php:12 searchform.php:13 +msgid "Search" +msgstr "" + +#. Theme Name of the plugin/theme +msgid "Twenty Eleven" +msgstr "" + +#. Theme URI of the plugin/theme +msgid "http://wordpress.org/extend/themes/twentyeleven" +msgstr "" + +#. Description of the plugin/theme +msgid "" +"The 2011 theme for WordPress is sophisticated, lightweight, and adaptable. " +"Make it yours with a custom menu, header image, and background -- then go " +"further with available theme options for light or dark color scheme, custom " +"link colors, and three layout choices. Twenty Eleven comes equipped with a " +"Showcase page template that transforms your front page into a showcase to " +"show off your best content, widget support galore (sidebar, three footer " +"areas, and a Showcase page widget area), and a custom \"Ephemera\" widget to " +"display your Aside, Link, Quote, or Status posts. Included are styles for " +"print and for the admin editor, support for featured images (as custom " +"header images on posts and pages and as large images on featured \"sticky\" " +"posts), and special styles for six different post formats." +msgstr "" + +#. Author of the plugin/theme +msgid "the WordPress team" +msgstr "" + +#. Tags of the plugin/theme +msgid "" +"dark, light, white, black, gray, one-column, two-columns, left-sidebar, " +"right-sidebar, fixed-width, flexible-width, custom-background, custom-" +"colors, custom-header, custom-menu, editor-style, featured-image-header, " +"featured-images, full-width-template, microformats, post-formats, rtl-" +"language-support, sticky-post, theme-options, translation-ready" +msgstr "" diff --git a/src/wp-content/themes/twentyeleven/license.txt b/src/wp-content/themes/twentyeleven/license.txt new file mode 100644 index 0000000..5fbe4a7 --- /dev/null +++ b/src/wp-content/themes/twentyeleven/license.txt @@ -0,0 +1,281 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 51 Franklin St, Fifth Floor, Boston, MA 02110, USA + + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + diff --git a/src/wp-content/themes/twentyeleven/page.php b/src/wp-content/themes/twentyeleven/page.php new file mode 100644 index 0000000..3b96e52 --- /dev/null +++ b/src/wp-content/themes/twentyeleven/page.php @@ -0,0 +1,29 @@ + + +
    +
    + + + + + + + +
    +
    + + \ No newline at end of file diff --git a/src/wp-content/themes/twentyeleven/readme.txt b/src/wp-content/themes/twentyeleven/readme.txt new file mode 100644 index 0000000..e803014 --- /dev/null +++ b/src/wp-content/themes/twentyeleven/readme.txt @@ -0,0 +1,5 @@ += TWENTY ELEVEN = + +* by the WordPress team, http://wordpress.org/ + +== ABOUT TWENTY ELEVEN == \ No newline at end of file diff --git a/src/wp-content/themes/twentyeleven/rtl.css b/src/wp-content/themes/twentyeleven/rtl.css new file mode 100644 index 0000000..7b67e1f --- /dev/null +++ b/src/wp-content/themes/twentyeleven/rtl.css @@ -0,0 +1,582 @@ +/* +Theme Name: Twenty Eleven + +Adding support for language written in a Right To Left (RTL) direction is easy - +it's just a matter of overwriting all the horizontal positioning attributes +of your CSS stylesheet in a separate stylesheet file named rtl.css. + +http://codex.wordpress.org/Right_to_Left_Language_Support + +*/ + +/* =Reset reset +----------------------------------------------- */ + +caption, th, td { + text-align: right; +} + +/* =Structure +----------------------------------------------- */ + +body { + direction:rtl; + unicode-bidi:embed; +} + +/* Showcase */ +.page-template-showcase-php section.recent-posts { + float: left; + margin: 0 31% 0 0; +} +.page-template-showcase-php #main .widget-area { + float: right; + margin: 0 0 0 -22.15%; +} + +/* One column */ + +.one-column article.feature-image.small .entry-summary a { + left: auto; + right: -9%; +} + +/* Simplify the pullquotes and pull styles */ +.one-column.singular .entry-meta .edit-link a { + right: 0px; + left: auto; +} +/* Make sure we have room for our comment avatars */ +.one-column .commentlist > li.comment { + margin-left: 0; + margin-right: 102px; +} +/* Make sure the logo and search form don't collide */ +.one-column #branding #searchform { + right: auto; + left: 40px; +} +/* Talking avatars take up too much room at this size */ +.one-column .commentlist > li.comment { + margin-right: 0; +} +.one-column .commentlist > li.comment .comment-meta, +.one-column .commentlist > li.comment .comment-content { + margin-right: 0; + margin-left: 85px; +} +.one-column .commentlist .avatar { + right: auto; + left: 1.625em; +} +.one-column .commentlist .children .avatar { + left: auto; + right: 2.2em; +} + +/* =Global +----------------------------------------------- */ + +/* Text elements */ +p { + margin-bottom: 1.625em; +} +ul, ol { + margin: 0 2.5em 1.625em 0; +} +.ltr ul, ol { + margin: 0 0 1.625em 2.5em; +} +blockquote { + font-family: Arial, sans-serif; +} +blockquote em, blockquote i, blockquote cite { + font-style: normal; +} + +/* Forms */ +textarea { + padding-left: 0; + padding-right: 3px; +} +input#s { + background-position: 97% 6px; + padding: 4px 28px 4px 10px; +} + +/* Assistive text */ +#access a.assistive-text:active, +#access a.assistive-text:focus { + left: auto; + right: 7.6%; +} + +/* =Header +----------------------------------------------- */ + +#site-title { + margin-right: 0; + margin-left: 270px; +} + +#site-description { + margin: 0 0 3.65625em 270px; +} + +/* =Menu +-------------------------------------------------------------- */ + +#access { + float: right; +} +#access ul { + margin: 0 -0.8125em 0 0; + padding-right: 0; +} +#access li { + float: right; +} +#access ul ul { + float: right; + left: auto; + right: 0; +} +#access ul ul ul { + left: auto; + right: 100%; +} + +/* Search Form */ +#branding #searchform { + right: auto; + left: 7.6%; + text-align: left; +} +#branding #s { + float: left; +} +#branding .only-search + #access div { + padding-right: 0; + padding-left: 205px; +} + + +/* =Content +----------------------------------------------- */ +.entry-title, +.entry-header .entry-meta { + padding-right: 0; + padding-left: 76px; +} +.entry-content td, +.comment-content td { + padding: 6px 0 6px 10px; +} +.page-link span { + margin-right: 0; + margin-left: 6px; +} +.entry-meta .edit-link a { + float: left; +} +/* Images */ + +.wp-caption .wp-caption-text, +.gallery-caption { + font-family: Arial, sans-serif; +} +.wp-caption .wp-caption-text { + padding: 10px 40px 5px 0px; +} +.wp-caption .wp-caption-text:before { + margin-right: 0; + margin-left: 5px; + left: auto; + right: 10px; +} +#content .gallery-columns-4 .gallery-item { + padding-right:0; + padding-left:2%; +} + +/* Author Info */ +.singular #author-info { + margin: 2.2em -35.4% 0 -35.6%; +} +#author-avatar { + float: right; + margin-right: 0; + margin-left: -78px; +} +#author-description { + float: right; + margin-left: 0; + margin-right: 108px; +} +/* Comments link */ +.entry-header .comments-link a { + background-image: url(images/comment-bubble-rtl.png); + right: auto; + left: 0; +} + +/* + Post Formats Headings +*/ +.singular .entry-title, +.singular .entry-header .entry-meta { + padding-left: 0; +} +.singular .entry-header .entry-meta { + left: auto; + right: 0; +} +.singular .entry-meta .edit-link a { + left: auto; + right: 50px; +} + + +/* =Gallery +----------------------------------------------- */ + +.format-gallery .gallery-thumb { + float: right; + margin: .375em 0 0 1.625em; +} + + +/* =Status +----------------------------------------------- */ + +.format-status img.avatar { + float: right; + margin: 4px 0 2px 10px; +} + + +/* =Image +----------------------------------------------- */ + +.indexed.format-image div.entry-meta { + float: right; +} +/* =error404 +---------------------- +------------------------- */ +.error404 #main .widget { + float: right; + margin-right: auto; + margin-left: 3.7%; +} +.error404 #main .widget_archive { + margin-left: 0; +} +.error404 #main .widget_tag_cloud { + margin-left: 0; +} + +/* =Showcase +----------------------------------------------- */ + +article.intro .edit-link a { + right: auto; + left: 20px; +} + +/* Featured post */ +section.featured-post { + float: right; +} + +/* Small featured post */ +section.featured-post .attachment-small-feature { + float: left; + margin: 0 0 1.625em -8.9%; + right: auto; + left: -15px; +} +article.feature-image.small { + float: right; +} +article.feature-image.small .entry-summary p a { + left:auto; + right: -23.8%; + padding: 9px 85px 9px 26px; +} + +/* Large featured post */ +section.feature-image.large .hentry { + left:auto; + right: 9%; + margin: 1.625em 0 0 9%; +} +/* Featured Slider */ +.featured-posts .showcase-heading { + padding-left: 0; + padding-right: 8.9%; +} +.featured-posts section.featured-post { + left: auto; + right: 0; +} +#content .feature-slider { + right: auto; + left: 8.9%; +} +.feature-slider li { + float: right; +} +/* Recent Posts */ +section.recent-posts .other-recent-posts a[rel="bookmark"] { + float: right; +} +section.recent-posts .other-recent-posts .comments-link a, +section.recent-posts .other-recent-posts .comments-link > span { + padding: 0.3125em 1em 0.3125em 0; + left: 0; + text-align: left; +} + +/* =Attachments +----------------------------------------------- */ + +/* =Navigation +-------------------------------------------------------------- */ + +.nav-previous { + float: right; +} +.nav-next { + float: left; + text-align: left; +} + +/* Singular navigation */ +#nav-single { + float: left; + text-align: left; +} +#nav-single .nav-next { + padding-left: 0; + padding-right: .5em; +} + + +/* =Widgets +----------------------------------------------- */ + +.widget ul ul { + margin-left: 0; + margin-right: 1.5em; +} + +/* Twitter */ +.widget_twitter .timesince { + margin-right: 0; + margin-left: -10px; + text-align: left; +} + +/* =Comments +----------------------------------------------- */ + +.commentlist .children li.comment { + border-left: none; + border-right: 1px solid #ddd; + -moz-border-radius: 3px 0 0 3px; + border-radius: 3px 0 0 3px; +} +.commentlist .children li.comment .comment-meta { + margin-left: 0; + margin-right: 50px; +} +.commentlist .avatar { + left: auto; + right: -102px; +} +.commentlist > li:before { + content: url(images/comment-arrow-rtl.png); + left:auto; + right: -21px; +} +.commentlist > li.pingback:before { + content: ''; +} +.commentlist .children .avatar { + left: auto; + right: 2.2em; +} + +/* Post author highlighting */ +.commentlist > li.bypostauthor:before { + content: url(images/comment-arrow-bypostauthor-rtl.png); +} + +/* sidebar-page.php comments */ +/* Make sure we have room for our comment avatars */ +.page-template-sidebar-page-php .commentlist > li.comment, +.page-template-sidebar-page-php.commentlist .pingback { + margin-left: 0; + margin-right: 102px; +} + +/* Comment Form */ +#respond .comment-form-author label, +#respond .comment-form-email label, +#respond .comment-form-url label, +#respond .comment-form-comment label { + left: auto; + right: 4px; +} +#respond .comment-form-author label, +#respond .comment-form-email label, +#respond .comment-form-url label, +#respond .comment-form-comment label { + -webkit-box-shadow: -1px 2px 2px rgba(204,204,204,0.8); + -moz-box-shadow: -1px 2px 2px rgba(204,204,204,0.8); + box-shadow: -1px 2px 2px rgba(204,204,204,0.8); +} +#respond .comment-form-author .required, +#respond .comment-form-email .required { + left: auto; + right: 75%; +} +#respond .form-submit { + float: left; +} +#respond input#submit { + left: auto; + right: 30px; + padding: 5px 22px 5px 42px; +} +#respond #cancel-comment-reply-link { + margin-left: 0; + margin-right: 10px; +} +#cancel-comment-reply-link { + right: auto; + left: 1.625em; +} + +/* =Footer +----------------------------------------------- */ + +/* Two Footer Widget Areas */ +#supplementary.two .widget-area { + float: right; + margin-right: 0; + margin-left: 3.7%; +} +#supplementary.two .widget-area + .widget-area { + margin-left: 0; +} + +/* Three Footer Widget Areas */ +#supplementary.three .widget-area { + float: right; + margin-right: 0; + margin-left: 3.7%; +} +#supplementary.three .widget-area + .widget-area + .widget-area { + margin-left: 0; +} + +/* Site Generator Line */ +#site-generator .sep { + background-position: right center; +} + + +/* =Responsive Structure +----------------------------------------------- */ + +@media (max-width: 800px) { + /* Simplify the showcase template when small feature */ + section.featured-post .attachment-small-feature, + .one-column section.featured-post .attachment-small-feature { + float: right; + } + article.feature-image.small { + float: left; + } + article.feature-image.small .entry-summary p a { + right: 0; + } + .singular .entry-meta .edit-link a { + left: auto; + right: 0px; + } + /* Make sure we have room for our comment avatars */ + .commentlist > li.comment, + .commentlist .pingback { + margin-left: 0; + margin-right: 102px; + } + /* No need to float footer widgets at this size */ + #colophon #supplementary .widget-area { + margin-left: 0; + } + /* No need to float 404 widgets at this size */ + .error404 #main .widget { + margin-left: 0; + } +} +@media (max-width: 650px) { + /* @media (max-width: 650px) Reduce font-sizes for better readability on smaller devices */ + #site-title, + #site-description { + margin-left: 0; + } + /* Talking avatars take up too much room at this size */ + .commentlist > li.comment, + .commentlist > li.pingback { + margin-right: 0 !important; + } + .commentlist .children .avatar { + left: auto; + right: 2.2em; + } + /* Use the available space in the smaller comment form */ + #respond .comment-form-author .required, + #respond .comment-form-email .required { + left: auto; + right: 95%; + } + #content .gallery-columns-3 .gallery-item { + padding-right: 0; + padding-left:2%; + } +} +@media (max-width: 450px) { + #content .gallery-columns-2 .gallery-item { + padding-right:0; + padding-left:4%; + } +} + +/* =Print +----------------------------------------------- */ + +@media print { + #primary { + float: right; + } + /* Comments */ + .commentlist .avatar { + left: auto; + right: 2.2em; + } + .commentlist li.comment .comment-meta { + margin-left: 0; + margin-right: 50px; + } +} + +/* =IE7 +----------------------------------------------- */ + +#ie7 section.recent-posts { + margin-right: 0; + margin-left: 7.6%; +} diff --git a/src/wp-content/themes/twentyeleven/screenshot.png b/src/wp-content/themes/twentyeleven/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..b1fb07f4b3b167988786e95e7c16663e04806264 GIT binary patch literal 62878 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 literal 0 HcmV?d00001 diff --git a/src/wp-content/themes/twentyeleven/search.php b/src/wp-content/themes/twentyeleven/search.php new file mode 100644 index 0000000..bf45c2f --- /dev/null +++ b/src/wp-content/themes/twentyeleven/search.php @@ -0,0 +1,57 @@ + + +

    +
    + + + + + + + + + + + + + + + + + + +
    +
    +

    +
    + +
    +

    + +
    +
    + + + +
    +
    + + + \ No newline at end of file diff --git a/src/wp-content/themes/twentyeleven/searchform.php b/src/wp-content/themes/twentyeleven/searchform.php new file mode 100644 index 0000000..b83ec1e --- /dev/null +++ b/src/wp-content/themes/twentyeleven/searchform.php @@ -0,0 +1,14 @@ + +
    + + + +
    diff --git a/src/wp-content/themes/twentyeleven/showcase.php b/src/wp-content/themes/twentyeleven/showcase.php new file mode 100644 index 0000000..58e85e2 --- /dev/null +++ b/src/wp-content/themes/twentyeleven/showcase.php @@ -0,0 +1,220 @@ + + +
    +
    + + + + + + $sticky, + 'post_status' => 'publish', + 'posts_per_page' => 10, + 'no_found_rows' => true, + ); + + // The Featured Posts query. + $featured = new WP_Query( $featured_args ); + + // Proceed only if published posts exist + if ( $featured->have_posts() ) : + + /** + * We will need to count featured posts starting from zero + * to create the slider navigation. + */ + $counter_slider = 0; + + ?> + + + + + +
    +

    + + 'DESC', + 'post__not_in' => get_option( 'sticky_posts' ), + 'tax_query' => array( + array( + 'taxonomy' => 'post_format', + 'terms' => array( 'post-format-aside', 'post-format-link', 'post-format-quote', 'post-format-status' ), + 'field' => 'slug', + 'operator' => 'NOT IN', + ), + ), + 'no_found_rows' => true, + ); + + // Our new query for the Recent Posts section. + $recent = new WP_Query( $recent_args ); + + // The first Recent post is displayed normally + if ( $recent->have_posts() ) : $recent->the_post(); + + // Set $more to 0 in order to only get the first part of the post. + global $more; + $more = 0; + + get_template_part( 'content', get_post_format() ); + + echo '
      '; + + endif; + + // For all other recent posts, just display the title and comment status. + while ( $recent->have_posts() ) : $recent->the_post(); ?> + +
    1. + + + ' . __( 'Leave a reply', 'twentyeleven' ) . '', __( '1 Reply', 'twentyeleven' ), __( '% Replies', 'twentyeleven' ) ); ?> + +
    2. + + + if ( $recent->post_count > 0 ) + echo '
    '; + ?> +
    + + + +
    +
    + + \ No newline at end of file diff --git a/src/wp-content/themes/twentyeleven/sidebar-footer.php b/src/wp-content/themes/twentyeleven/sidebar-footer.php new file mode 100644 index 0000000..cbcb49b --- /dev/null +++ b/src/wp-content/themes/twentyeleven/sidebar-footer.php @@ -0,0 +1,42 @@ + + + +
    > + + + + + + + + + + + +
    \ No newline at end of file diff --git a/src/wp-content/themes/twentyeleven/sidebar-page.php b/src/wp-content/themes/twentyeleven/sidebar-page.php new file mode 100644 index 0000000..d47e4ee --- /dev/null +++ b/src/wp-content/themes/twentyeleven/sidebar-page.php @@ -0,0 +1,26 @@ + + +
    +
    + + + + + + + +
    +
    + + + \ No newline at end of file diff --git a/src/wp-content/themes/twentyeleven/sidebar.php b/src/wp-content/themes/twentyeleven/sidebar.php new file mode 100644 index 0000000..0f08571 --- /dev/null +++ b/src/wp-content/themes/twentyeleven/sidebar.php @@ -0,0 +1,36 @@ + + + \ No newline at end of file diff --git a/src/wp-content/themes/twentyeleven/single.php b/src/wp-content/themes/twentyeleven/single.php new file mode 100644 index 0000000..01ab460 --- /dev/null +++ b/src/wp-content/themes/twentyeleven/single.php @@ -0,0 +1,32 @@ + + +
    +
    + + + + + + + + + + + +
    +
    + + \ No newline at end of file diff --git a/src/wp-content/themes/twentyeleven/style.css b/src/wp-content/themes/twentyeleven/style.css new file mode 100644 index 0000000..68254b5 --- /dev/null +++ b/src/wp-content/themes/twentyeleven/style.css @@ -0,0 +1,2670 @@ +/* +Theme Name: Twenty Eleven +Theme URI: http://wordpress.org/extend/themes/twentyeleven +Author: the WordPress team +Author URI: http://wordpress.org/ +Description: The 2011 theme for WordPress is sophisticated, lightweight, and adaptable. Make it yours with a custom menu, header image, and background -- then go further with available theme options for light or dark color scheme, custom link colors, and three layout choices. Twenty Eleven comes equipped with a Showcase page template that transforms your front page into a showcase to show off your best content, widget support galore (sidebar, three footer areas, and a Showcase page widget area), and a custom "Ephemera" widget to display your Aside, Link, Quote, or Status posts. Included are styles for print and for the admin editor, support for featured images (as custom header images on posts and pages and as large images on featured "sticky" posts), and special styles for six different post formats. +Version: 1.2 +License: GNU General Public License +License URI: license.txt +Tags: dark, light, white, black, gray, one-column, two-columns, left-sidebar, right-sidebar, fixed-width, flexible-width, custom-background, custom-colors, custom-header, custom-menu, editor-style, featured-image-header, featured-images, full-width-template, microformats, post-formats, rtl-language-support, sticky-post, theme-options, translation-ready +*/ + +/* =Reset default browser CSS. Based on work by Eric Meyer: http://meyerweb.com/eric/tools/css/reset/index.html +-------------------------------------------------------------- */ + +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; +} +:focus {/* remember to define focus styles! */ + outline: 0; +} +body { + background: #fff; + line-height: 1; +} +ol, ul { + list-style: none; +} +table {/* tables still need 'cellspacing="0"' in the markup */ + border-collapse: separate; + border-spacing: 0; +} +caption, th, td { + font-weight: normal; + text-align: left; +} +blockquote:before, blockquote:after, +q:before, q:after { + content: ""; +} +blockquote, q { + quotes: "" ""; +} +a img { + border: 0; +} +article, aside, details, figcaption, figure, +footer, header, hgroup, menu, nav, section { + display: block; +} + + +/* =Structure +----------------------------------------------- */ + +body { + padding: 0 2em; +} +#page { + margin: 2em auto; + max-width: 1000px; +} +#branding hgroup { + margin: 0 7.6%; +} +#access div { + margin: 0 7.6%; +} +#primary { + float: left; + margin: 0 -26.4% 0 0; + width: 100%; +} +#content { + margin: 0 34% 0 7.6%; + width: 58.4%; +} +#secondary { + float: right; + margin-right: 7.6%; + width: 18.8%; +} + +/* Singular */ +.singular #primary { + margin: 0; +} +.singular #content, +.left-sidebar.singular #content { + margin: 0 7.6%; + position: relative; + width: auto; +} +.singular .entry-header, +.singular .entry-content, +.singular footer.entry-meta, +.singular #comments-title { + margin: 0 auto; + width: 68.9%; +} + +/* Attachments */ +.singular .image-attachment .entry-content { + margin: 0 auto; + width: auto; +} +.singular .image-attachment .entry-description { + margin: 0 auto; + width: 68.9%; +} + +/* Showcase */ +.page-template-showcase-php #primary, +.left-sidebar.page-template-showcase-php #primary { + margin: 0; +} +.page-template-showcase-php #content, +.left-sidebar.page-template-showcase-php #content { + margin: 0 7.6%; + width: auto; +} +.page-template-showcase-php section.recent-posts { + float: right; + margin: 0 0 0 31%; + width: 69%; +} +.page-template-showcase-php #main .widget-area { + float: left; + margin: 0 -22.15% 0 0; + width: 22.15%; +} + +/* error404 */ +.error404 #primary { + float: none; + margin: 0; +} +.error404 #primary #content { + margin: 0 7.6%; + width: auto; +} + +/* Alignment */ +.alignleft { + display: inline; + float: left; + margin-right: 1.625em; +} +.alignright { + display: inline; + float: right; + margin-left: 1.625em; +} +.aligncenter { + clear: both; + display: block; + margin-left: auto; + margin-right: auto; +} + +/* Right Content */ +.left-sidebar #primary { + float: right; + margin: 0 0 0 -26.4%; + width: 100%; +} +.left-sidebar #content { + margin: 0 7.6% 0 34%; + width: 58.4%; +} +.left-sidebar #secondary { + float: left; + margin-left: 7.6%; + margin-right: 0; + width: 18.8%; +} + +/* One column */ +.one-column #page { + max-width: 690px; +} +.one-column #content { + margin: 0 7.6%; + width: auto; +} +.one-column #nav-below { + border-bottom: 1px solid #ddd; + margin-bottom: 1.625em; +} +.one-column #secondary { + float: none; + margin: 0 7.6%; + width: auto; +} +/* Simplify the showcase template */ +.one-column .page-template-showcase-php section.recent-posts { + float: none; + margin: 0; + width: 100%; +} +.one-column .page-template-showcase-php #main .widget-area { + float: none; + margin: 0; + width: auto; +} +.one-column .page-template-showcase-php .other-recent-posts { + border-bottom: 1px solid #ddd; +} +/* Simplify the showcase template when small feature */ +.one-column section.featured-post .attachment-small-feature { + border: none; + display: block; + height: auto; + max-width: 60%; + position: static; +} +.one-column article.feature-image.small { + margin: 0 0 1.625em; + padding: 0; +} +.one-column article.feature-image.small .entry-title { + font-size: 20px; + line-height: 1.3em; +} +.one-column article.feature-image.small .entry-summary { + height: 150px; + overflow: hidden; + padding: 0; + text-overflow: ellipsis; +} +.one-column article.feature-image.small .entry-summary a { + left: -9%; +} +/* Remove the margin on singular articles */ +.one-column.singular .entry-header, +.one-column.singular .entry-content, +.one-column.singular footer.entry-meta, +.one-column.singular #comments-title { + width: 100%; +} +/* Simplify the pullquotes and pull styles */ +.one-column.singular blockquote.pull { + margin: 0 0 1.625em; +} +.one-column.singular .pull.alignleft { + margin: 0 1.625em 0 0; +} +.one-column.singular .pull.alignright { + margin: 0 0 0 1.625em; +} +.one-column.singular .entry-meta .edit-link a { + position: absolute; + left: 0; + top: 40px; +} +.one-column.singular #author-info { + margin: 2.2em -8.8% 0; + padding: 20px 8.8%; +} +/* Make sure we have room for our comment avatars */ +.one-column .commentlist > li.comment { + margin-left: 102px; + width: auto; +} +/* Make sure the logo and search form don't collide */ +.one-column #branding #searchform { + right: 40px; + top: 4em; +} +/* Talking avatars take up too much room at this size */ +.one-column .commentlist > li.comment { + margin-left: 0; +} +.one-column .commentlist > li.comment .comment-meta, +.one-column .commentlist > li.comment .comment-content { + margin-right: 85px; +} +.one-column .commentlist .avatar { + background: transparent; + display: block; + padding: 0; + top: 1.625em; + left: auto; + right: 1.625em; +} +.one-column .commentlist .children .avatar { + background: none; + padding: 0; + position: absolute; + top: 2.2em; + left: 2.2em; +} +.one-column #respond { + width: auto; +} + + +/* =Global +----------------------------------------------- */ + +body, input, textarea { + color: #373737; + font: 15px "Helvetica Neue", Helvetica, Arial, sans-serif; + font-weight: 300; + line-height: 1.625; +} +body { + background: #e2e2e2; +} +#page { + background: #fff; +} + +/* Headings */ +h1,h2,h3,h4,h5,h6 { + clear: both; +} +hr { + background-color: #ccc; + border: 0; + height: 1px; + margin-bottom: 1.625em; +} + +/* Text elements */ +p { + margin-bottom: 1.625em; +} +ul, ol { + margin: 0 0 1.625em 2.5em; +} +ul { + list-style: square; +} +ol { + list-style-type: decimal; +} +ol ol { + list-style: upper-alpha; +} +ol ol ol { + list-style: lower-roman; +} +ol ol ol ol { + list-style: lower-alpha; +} +ul ul, ol ol, ul ol, ol ul { + margin-bottom: 0; +} +dl { + margin: 0 1.625em; +} +dt { + font-weight: bold; +} +dd { + margin-bottom: 1.625em; +} +strong { + font-weight: bold; +} +cite, em, i { + font-style: italic; +} +blockquote { + font-family: Georgia, "Bitstream Charter", serif; + font-style: italic; + font-weight: normal; + margin: 0 3em; +} +blockquote em, blockquote i, blockquote cite { + font-style: normal; +} +blockquote cite { + color: #666; + font: 12px "Helvetica Neue", Helvetica, Arial, sans-serif; + font-weight: 300; + letter-spacing: 0.05em; + text-transform: uppercase; +} +pre { + background: #f4f4f4; + font: 13px "Courier 10 Pitch", Courier, monospace; + line-height: 1.5; + margin-bottom: 1.625em; + overflow: auto; + padding: 0.75em 1.625em; +} +code, kbd { + font: 13px Monaco, Consolas, "Andale Mono", "DejaVu Sans Mono", monospace; +} +abbr, acronym, dfn { + border-bottom: 1px dotted #666; + cursor: help; +} +address { + display: block; + margin: 0 0 1.625em; +} +ins { + background: #fff9c0; + text-decoration: none; +} +sup, +sub { + font-size: 10px; + height: 0; + line-height: 1; + position: relative; + vertical-align: baseline; +} +sup { + bottom: 1ex; +} +sub { + top: .5ex; +} + +/* Forms */ +input[type=text], +input[type=password], +textarea { + background: #fafafa; + -moz-box-shadow: inset 0 1px 1px rgba(0,0,0,0.1); + -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,0.1); + box-shadow: inset 0 1px 1px rgba(0,0,0,0.1); + border: 1px solid #ddd; + color: #888; +} +input[type=text]:focus, +textarea:focus { + color: #373737; +} +textarea { + padding-left: 3px; + width: 98%; +} +input[type=text] { + padding: 3px; +} +input#s { + background: url(images/search.png) no-repeat 5px 6px; + -moz-border-radius: 2px; + border-radius: 2px; + font-size: 14px; + height: 22px; + line-height: 1.2em; + padding: 4px 10px 4px 28px; +} +input#searchsubmit { + display: none; +} + +/* Links */ +a { + color: #1982d1; + text-decoration: none; +} +a:focus, +a:active, +a:hover { + text-decoration: underline; +} + +/* Assistive text */ +.assistive-text { + position: absolute !important; + clip: rect(1px 1px 1px 1px); /* IE6, IE7 */ + clip: rect(1px, 1px, 1px, 1px); +} +#access a.assistive-text:active, +#access a.assistive-text:focus { + background: #eee; + border-bottom: 1px solid #ddd; + color: #1982d1; + clip: auto !important; + font-size: 12px; + position: absolute; + text-decoration: underline; + top: 0; + left: 7.6%; +} + + +/* =Header +----------------------------------------------- */ + +#branding { + border-top: 2px solid #bbb; + padding-bottom: 10px; + position: relative; + z-index: 2; +} +#site-title { + margin-right: 270px; + padding: 3.65625em 0 0; +} +#site-title a { + color: #111; + font-size: 30px; + font-weight: bold; + line-height: 36px; + text-decoration: none; +} +#site-title a:hover, +#site-title a:focus, +#site-title a:active { + color: #1982d1; +} +#site-description { + color: #7a7a7a; + font-size: 14px; + margin: 0 270px 3.65625em 0; +} +#branding img { + height: auto; + margin-bottom: -7px; + width: 100%; +} + + +/* =Menu +-------------------------------------------------------------- */ + +#access { + background: #222; /* Show a solid color for older browsers */ + background: -moz-linear-gradient(#252525, #0a0a0a); + background: -o-linear-gradient(#252525, #0a0a0a); + background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#252525), to(#0a0a0a)); /* older webkit syntax */ + background: -webkit-linear-gradient(#252525, #0a0a0a); + -webkit-box-shadow: rgba(0, 0, 0, 0.4) 0px 1px 2px; + -moz-box-shadow: rgba(0, 0, 0, 0.4) 0px 1px 2px; + box-shadow: rgba(0, 0, 0, 0.4) 0px 1px 2px; + clear: both; + display: block; + float: left; + margin: 0 auto 6px; + width: 100%; +} +#access ul { + font-size: 13px; + list-style: none; + margin: 0 0 0 -0.8125em; + padding-left: 0; +} +#access li { + float: left; + position: relative; +} +#access a { + color: #eee; + display: block; + line-height: 3.333em; + padding: 0 1.2125em; + text-decoration: none; +} +#access ul ul { + -moz-box-shadow: 0 3px 3px rgba(0,0,0,0.2); + -webkit-box-shadow: 0 3px 3px rgba(0,0,0,0.2); + box-shadow: 0 3px 3px rgba(0,0,0,0.2); + display: none; + float: left; + margin: 0; + position: absolute; + top: 3.333em; + left: 0; + width: 188px; + z-index: 99999; +} +#access ul ul ul { + left: 100%; + top: 0; +} +#access ul ul a { + background: #f9f9f9; + border-bottom: 1px dotted #ddd; + color: #444; + font-size: 13px; + font-weight: normal; + height: auto; + line-height: 1.4em; + padding: 10px 10px; + width: 168px; +} +#access li:hover > a, +#access ul ul :hover > a, +#access a:focus { + background: #efefef; +} +#access li:hover > a, +#access a:focus { + background: #f9f9f9; /* Show a solid color for older browsers */ + background: -moz-linear-gradient(#f9f9f9, #e5e5e5); + background: -o-linear-gradient(#f9f9f9, #e5e5e5); + background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#f9f9f9), to(#e5e5e5)); /* Older webkit syntax */ + background: -webkit-linear-gradient(#f9f9f9, #e5e5e5); + color: #373737; +} +#access ul li:hover > ul { + display: block; +} +#access .current_page_item > a, +#access .current_page_ancestor > a { + font-weight: bold; +} + +/* Search Form */ +#branding #searchform { + position: absolute; + top: 3.8em; + right: 7.6%; + text-align: right; +} +#branding #searchform div { + margin: 0; +} +#branding #s { + float: right; + -webkit-transition-duration: 400ms; + -webkit-transition-property: width, background; + -webkit-transition-timing-function: ease; + -moz-transition-duration: 400ms; + -moz-transition-property: width, background; + -moz-transition-timing-function: ease; + -o-transition-duration: 400ms; + -o-transition-property: width, background; + -o-transition-timing-function: ease; + width: 72px; +} +#branding #s:focus { + background-color: #f9f9f9; + width: 196px; +} +#branding #searchsubmit { + display: none; +} +#branding .only-search #searchform { + top: 5px; + z-index: 1; +} +#branding .only-search #s { + background-color: #666; + border-color: #000; + color: #222; +} +#branding .only-search #s, +#branding .only-search #s:focus { + width: 85%; +} +#branding .only-search #s:focus { + background-color: #bbb; +} +#branding .with-image #searchform { + top: auto; + bottom: -27px; + max-width: 195px; +} +#branding .only-search + #access div { + padding-right: 205px; +} + + +/* =Content +----------------------------------------------- */ + +#main { + clear: both; + padding: 1.625em 0 0; +} +.page-title { + color: #666; + font-size: 10px; + font-weight: 500; + letter-spacing: 0.1em; + line-height: 2.6em; + margin: 0 0 2.6em; + text-transform: uppercase; +} +.page-title a { + font-size: 12px; + font-weight: bold; + letter-spacing: 0; + text-transform: none; +} +.hentry, +.no-results { + border-bottom: 1px solid #ddd; + margin: 0 0 1.625em; + padding: 0 0 1.625em; + position: relative; +} +.hentry:last-child, +.no-results { + border-bottom: none; +} +.blog .sticky .entry-header .entry-meta { + clip: rect(1px 1px 1px 1px); /* IE6, IE7 */ + clip: rect(1px, 1px, 1px, 1px); + position: absolute !important; +} +.entry-title, +.entry-header .entry-meta { + padding-right: 76px; +} +.entry-title { + clear: both; + color: #222; + font-size: 26px; + font-weight: bold; + line-height: 1.5em; + padding-bottom: .3em; + padding-top: 15px; +} +.entry-title, +.entry-title a { + color: #222; + text-decoration: none; +} +.entry-title a:hover, +.entry-title a:focus, +.entry-title a:active { + color: #1982d1; +} +.entry-meta { + color: #666; + clear: both; + font-size: 12px; + line-height: 18px; +} +.entry-meta a { + font-weight: bold; +} +.single-author .entry-meta .by-author { + display: none; +} +.entry-content, +.entry-summary { + padding: 1.625em 0 0; +} +.entry-content h1, +.entry-content h2, +.comment-content h1, +.comment-content h2 { + color: #000; + font-weight: bold; + margin: 0 0 .8125em; +} +.entry-content h3, +.comment-content h3 { + font-size: 10px; + letter-spacing: 0.1em; + line-height: 2.6em; + text-transform: uppercase; +} +.entry-content table, +.comment-content table { + border-bottom: 1px solid #ddd; + margin: 0 0 1.625em; + width: 100%; +} +.entry-content th, +.comment-content th { + color: #666; + font-size: 10px; + font-weight: 500; + letter-spacing: 0.1em; + line-height: 2.6em; + text-transform: uppercase; +} +.entry-content td, +.comment-content td { + border-top: 1px solid #ddd; + padding: 6px 10px 6px 0; +} +.entry-content #s { + width: 75%; +} +.comment-content ul, +.comment-content ol { + margin-bottom: 1.625em; +} +.comment-content ul ul, +.comment-content ol ol, +.comment-content ul ol, +.comment-content ol ul { + margin-bottom: 0; +} +dl.gallery-item { + margin: 0; +} +.page-link { + clear: both; + display: block; + margin: 0 0 1.625em; +} +.page-link a { + background: #eee; + color: #373737; + margin: 0; + padding: 2px 3px; + text-decoration: none; +} +.page-link a:hover { + background: #888; + color: #fff; + font-weight: bold; +} +.page-link span { + margin-right: 6px; +} +.entry-meta .edit-link a, +.commentlist .edit-link a { + background: #eee; + -moz-border-radius: 3px; + border-radius: 3px; + color: #666; + float: right; + font-size: 12px; + line-height: 1.5em; + font-weight: 300; + text-decoration: none; + padding: 0 8px; +} +.entry-meta .edit-link a:hover, +.commentlist .edit-link a:hover { + background: #888; + color: #fff; +} +.entry-content .edit-link { + clear: both; + display: block; +} + +/* Images */ +.entry-content img, +.comment-content img, +.widget img { + max-width: 97.5%; /* Fluid images for posts, comments, and widgets */ +} +img[class*="align"], +img[class*="wp-image-"] { + height: auto; /* Make sure images with WordPress-added height and width attributes are scaled correctly */ +} +img.size-full { + max-width: 97.5%; + width: auto; /* Prevent stretching of full-size images with height and width attributes in IE8 */ +} +.entry-content img.wp-smiley { + border: none; + margin-bottom: 0; + margin-top: 0; + padding: 0; +} +img.alignleft, +img.alignright, +img.aligncenter { + margin-bottom: 1.625em; +} +p img, +.wp-caption { + margin-top: 0.4em; +} +.wp-caption { + background: #eee; + margin-bottom: 1.625em; + max-width: 96%; + padding: 9px; +} +.wp-caption img { + display: block; + margin: 0 auto; + max-width: 98%; +} +.wp-caption .wp-caption-text, +.gallery-caption { + color: #666; + font-family: Georgia, serif; + font-size: 12px; +} +.wp-caption .wp-caption-text { + margin-bottom: 0.6em; + padding: 10px 0 5px 40px; + position: relative; +} +.wp-caption .wp-caption-text:before { + color: #666; + content: '\2014'; + font-size: 14px; + font-style: normal; + font-weight: bold; + margin-right: 5px; + position: absolute; + left: 10px; + top: 7px; +} +#content .gallery { + margin: 0 auto 1.625em; +} +#content .gallery a img { + border: none; +} +img#wpstats { + display: block; + margin: 0 auto 1.625em; +} +#content .gallery-columns-4 .gallery-item { + width: 23%; + padding-right: 2%; +} +#content .gallery-columns-4 .gallery-item img { + width: 100%; + height: auto; +} + +/* Image borders */ +img[class*="align"], +img[class*="wp-image-"], +#content .gallery .gallery-icon img {/* Add fancy borders to all WordPress-added images but not things like badges and icons and the like */ + border: 1px solid #ddd; + padding: 6px; +} +.wp-caption img { + border-color: #eee; +} +a:focus img[class*="align"], +a:hover img[class*="align"], +a:active img[class*="align"], +a:focus img[class*="wp-image-"], +a:hover img[class*="wp-image-"], +a:active img[class*="wp-image-"], +#content .gallery .gallery-icon a:focus img, +#content .gallery .gallery-icon a:hover img, +#content .gallery .gallery-icon a:active img {/* Add some useful style to those fancy borders for linked images ... */ + background: #eee; + border-color: #bbb; +} +.wp-caption a:focus img, +.wp-caption a:active img, +.wp-caption a:hover img {/* ... including captioned images! */ + background: #fff; + border-color: #ddd; +} + +/* Password Protected Posts */ +.post-password-required .entry-header .comments-link { + margin: 1.625em 0 0; +} +.post-password-required input[type=password] { + margin: 0.8125em 0; +} +.post-password-required input[type=password]:focus { + background: #f7f7f7; +} + +/* Author Info */ +#author-info { + font-size: 12px; + overflow: hidden; +} +.singular #author-info { + background: #f9f9f9; + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 2.2em -35.6% 0 -35.4%; + padding: 20px 35.4%; +} +.archive #author-info { + border-bottom: 1px solid #ddd; + margin: 0 0 2.2em; + padding: 0 0 2.2em; +} +#author-avatar { + float: left; + margin-right: -78px; +} +#author-avatar img { + background: #fff; + -moz-border-radius: 3px; + border-radius: 3px; + -webkit-box-shadow: 0 1px 2px #bbb; + -moz-box-shadow: 0 1px 2px #bbb; + box-shadow: 0 1px 2px #bbb; + padding: 3px; +} +#author-description { + float: left; + margin-left: 108px; +} +#author-description h2 { + color: #000; + font-size: 15px; + font-weight: bold; + margin: 5px 0 10px; +} + +/* Comments link */ +.entry-header .comments-link a { + background: #eee url(images/comment-bubble.png) no-repeat; + color: #666; + font-size: 13px; + font-weight: normal; + line-height: 35px; + overflow: hidden; + padding: 0 0 0; + position: absolute; + top: 1.5em; + right: 0; + text-align: center; + text-decoration: none; + width: 43px; + height: 36px; +} +.entry-header .comments-link a:hover, +.entry-header .comments-link a:focus, +.entry-header .comments-link a:active { + background-color: #1982d1; + color: #fff; + color: rgba(255,255,255,0.8); +} +.entry-header .comments-link .leave-reply { + visibility: hidden; +} + +/* +Post Formats Headings +To hide the headings, display: none the ".entry-header .entry-format" selector, +and remove the padding rules below. +*/ +.entry-header .entry-format { + color: #666; + font-size: 10px; + font-weight: 500; + letter-spacing: 0.1em; + line-height: 2.6em; + position: absolute; + text-transform: uppercase; + top: -5px; +} +.entry-header hgroup .entry-title { + padding-top: 15px; +} +article.format-aside .entry-content, +article.format-link .entry-content, +article.format-status .entry-content { + padding: 20px 0 0; +} +.recent-posts .entry-header .entry-format { + display: none; +} +.recent-posts .entry-header hgroup .entry-title { + padding-top: 0; +} + +/* Singular content styles for Posts and Pages */ +.singular .hentry { + border-bottom: none; + padding: 4.875em 0 0; + position: relative; +} +.singular.page .hentry { + padding: 3.5em 0 0; +} +.singular .entry-title { + color: #000; + font-size: 36px; + font-weight: bold; + line-height: 48px; +} +.singular .entry-title, +.singular .entry-header .entry-meta { + padding-right: 0; +} +.singular .entry-header .entry-meta { + position: absolute; + top: 0; + left: 0; +} +blockquote.pull { + font-size: 21px; + font-weight: bold; + line-height: 1.6125em; + margin: 0 0 1.625em; + text-align: center; +} +.singular blockquote.pull { + margin: 0 -22.25% 1.625em; +} +.pull.alignleft { + margin: 0 1.625em 0 0; + text-align: right; + width: 33%; +} +.singular .pull.alignleft { + margin: 0 1.625em 0 -22.25%; +} +.pull.alignright { + margin: 0 0 0 1.625em; + text-align: left; + width: 33%; +} +.singular .pull.alignright { + margin: 0 -22.25% 0 1.625em; +} +.singular blockquote.pull.alignleft, +.singular blockquote.pull.alignright { + width: 33%; +} +.singular .entry-meta .edit-link a { + bottom: auto; + left: 50px; + position: absolute; + right: auto; + top: 80px; +} + + +/* =Aside +----------------------------------------------- */ + +.format-aside .entry-title, +.format-aside .entry-header .comments-link { + display: none; +} +.singular .format-aside .entry-title { + display: block; +} +.format-aside .entry-content { + padding: 0; +} +.singular .format-aside .entry-content { + padding: 1.625em 0 0; +} + + +/* =Link +----------------------------------------------- */ + +.format-link .entry-title, +.format-link .entry-header .comments-link { + display: none; +} +.singular .format-link .entry-title { + display: block; +} +.format-link .entry-content { + padding: 0; +} +.singular .format-link .entry-content { + padding: 1.625em 0 0; +} + + +/* =Gallery +----------------------------------------------- */ + +.format-gallery .gallery-thumb { + float: left; + display: block; + margin: .375em 1.625em 0 0; +} + + +/* =Status +----------------------------------------------- */ + +.format-status .entry-title, +.format-status .entry-header .comments-link { + display: none; +} +.singular .format-status .entry-title { + display: block; +} +.format-status .entry-content { + padding: 0; +} +.singular .format-status .entry-content { + padding: 1.625em 0 0; +} +.format-status img.avatar { + -moz-border-radius: 3px; + border-radius: 3px; + -webkit-box-shadow: 0 1px 2px #ccc; + -moz-box-shadow: 0 1px 2px #ccc; + box-shadow: 0 1px 2px #ccc; + float: left; + margin: 4px 10px 2px 0; + padding: 0; +} + + +/* =Quote +----------------------------------------------- */ + +.format-quote blockquote { + color: #555; + font-size: 17px; + margin: 0; +} + + +/* =Image +----------------------------------------------- */ + +.indexed.format-image .entry-header { + min-height: 61px; /* Prevent the comment icon from colliding with the image when there is no title */ +} +.indexed.format-image .entry-content { + padding-top: 0.5em; +} +.indexed.format-image p, +.indexed.format-image p img { + margin-bottom: 0; +} +.indexed.format-image footer.entry-meta { + background: #ddd; + margin-top: -7px; + padding: 20px 30px; + overflow: hidden; +} +.indexed.format-image div.entry-meta { + display: inline-block; + float: left; + width: 35%; +} +.indexed.format-image div.entry-meta + div.entry-meta { + float: none; + width: 65%; +} +.indexed.format-image .entry-meta span.cat-links, +.indexed.format-image .entry-meta span.tag-links, +.indexed.format-image .entry-meta span.comments-link { + display: block; +} +.indexed.format-image footer.entry-meta a { + color: #444; +} +.indexed.format-image footer.entry-meta a:hover { + color: #fff; +} +#content .indexed.format-image img { + border: none; + max-width: 100%; + padding: 0; +} +.indexed.format-image .wp-caption { + background: #111; + margin-bottom: 0; + max-width: 96%; + padding: 11px; +} +.indexed.format-image .wp-caption .wp-caption-text { + color: #ddd; +} +.indexed.format-image .wp-caption .wp-caption-text:before { + color: #444; +} +.indexed.format-image a:hover img { + opacity: 0.8; +} + + +/* =error404 +----------------------------------------------- */ + +.error404 #main #searchform { + background: #f9f9f9; + border: 1px solid #ddd; + border-width: 1px 0; + margin: 0 -8.9% 1.625em; + overflow: hidden; + padding: 1.625em 8.9%; +} +.error404 #main #s { + width: 95%; +} +.error404 #main .widget { + clear: none; + float: left; + margin-right: 3.7%; + width: 30.85%; +} +.error404 #main .widget_archive { + margin-right: 0; +} +.error404 #main .widget_tag_cloud { + float: none; + margin-right: 0; + width: 100%; +} +.error404 .widgettitle { + font-size: 10px; + letter-spacing: 0.1em; + line-height: 2.6em; + text-transform: uppercase; +} + + +/* =Showcase +----------------------------------------------- */ + +h1.showcase-heading { + color: #666; + font-size: 10px; + font-weight: 500; + letter-spacing: 0.1em; + line-height: 2.6em; + text-transform: uppercase; +} + +/* Intro */ +article.intro { + background: #f9f9f9; + border-bottom: none; + margin: -1.855em -8.9% 1.625em; + padding: 0 8.9%; +} +article.intro .entry-title { + display: none; +} +article.intro .entry-content { + color: #111; + font-size: 16px; + padding: 1.625em 0 0.625em; +} +article.intro .edit-link a { + background: #aaa; + -moz-border-radius: 3px; + border-radius: 3px; + color: #fff; + font-size: 12px; + padding: 0 8px; + position: absolute; + top: 30px; + right: 20px; + text-decoration: none; +} +article.intro .edit-link a:hover, +article.intro .edit-link a:focus, +article.intro .edit-link a:active { + background: #777; +} + +/* Featured post */ +section.featured-post { + float: left; + margin: -1.625em -8.9% 1.625em; + padding: 1.625em 8.9% 0; + position: relative; + width: 100%; +} +section.featured-post .hentry { + border: none; + color: #666; + margin: 0; +} +section.featured-post .entry-meta { + clip: rect(1px 1px 1px 1px); /* IE6, IE7 */ + clip: rect(1px, 1px, 1px, 1px); + position: absolute !important; +} + +/* Small featured post */ +section.featured-post .attachment-small-feature { + float: right; + height: auto; + margin: 0 -8.9% 1.625em 0; + max-width: 59%; + position: relative; + right: -15px; +} +section.featured-post.small { + padding-top: 0; +} +section.featured-post .attachment-small-feature:hover, +section.featured-post .attachment-small-feature:focus, +section.featured-post .attachment-small-feature:active { + opacity: .8; +} +article.feature-image.small { + float: left; + margin: 0 0 1.625em; + width: 45%; +} +article.feature-image.small .entry-title { + line-height: 1.2em; +} +article.feature-image.small .entry-summary { + color: #555; + font-size: 13px; +} +article.feature-image.small .entry-summary p a { + background: #222; + color: #eee; + display: block; + left: -23.8%; + padding: 9px 26px 9px 85px; + position: relative; + text-decoration: none; + top: 20px; + width: 180px; + z-index: 1; +} +article.feature-image.small .entry-summary p a:hover { + background: #1982d1; + color: #eee; + color: rgba(255,255,255,0.8); +} + +/* Large featured post */ +section.feature-image.large { + border: none; + max-height: 288px; + padding: 0; + width: 100%; +} +section.feature-image.large .showcase-heading { + display: none; +} +section.feature-image.large .hentry { + border-bottom: none; + left: 9%; + margin: 1.625em 9% 0 0; + position: absolute; + top: 0; +} +article.feature-image.large .entry-title a { + background: #222; + background: rgba(0,0,0,0.8); + -moz-border-radius: 3px; + border-radius: 3px; + color: #fff; + display: inline-block; + font-weight: 300; + padding: .2em 20px; +} +section.feature-image.large:hover .entry-title a, +section.feature-image.large .entry-title:hover a { + background: #eee; + background: rgba(255,255,255,0.8); + color: #222; +} +article.feature-image.large .entry-summary { + display: none; +} +section.feature-image.large img { + display: block; + height: auto; + max-width: 117.9%; + padding: 0 0 6px; +} + +/* Featured Slider */ +.featured-posts { + border-bottom: 1px solid #ddd; + display: block; + height: 328px; + margin: 1.625em -8.9% 20px; + max-width: 1000px; + padding: 0; + position: relative; + overflow: hidden; +} +.featured-posts .showcase-heading { + padding-left: 8.9%; +} +.featured-posts section.featured-post { + background: #fff; + height: 288px; + left: 0; + margin: 0; + position: absolute; + top: 30px; + width: auto; +} +.featured-posts section.featured-post.large { + max-width: 100%; + overflow: hidden; +} +.featured-posts section.featured-post { + -webkit-transition-duration: 200ms; + -webkit-transition-property: opacity, visibility; + -webkit-transition-timing-function: ease; + -moz-transition-duration: 200ms; + -moz-transition-property: opacity, visibility; + -moz-transition-timing-function: ease; +} +.featured-posts section.featured-post { + opacity: 0; + visibility: hidden; +} +.featured-posts #featured-post-1 { + opacity: 1; + visibility: visible; +} +.featured-post .feature-text:after, +.featured-post .feature-image.small:after { + content: ' '; + background: -moz-linear-gradient(top, rgba(255,255,255,0) 0%, rgba(255,255,255,1) 100%); /* FF3.6+ */ + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,rgba(255,255,255,0)), color-stop(100%,rgba(255,255,255,1))); /* Chrome,Safari4+ */ + background: -webkit-linear-gradient(top, rgba(255,255,255,0) 0%,rgba(255,255,255,1) 100%); /* Chrome10+,Safari5.1+ */ + background: -o-linear-gradient(top, rgba(255,255,255,0) 0%,rgba(255,255,255,1) 100%); /* Opera11.10+ */ + background: -ms-linear-gradient(top, rgba(255,255,255,0) 0%,rgba(255,255,255,1) 100%); /* IE10+ */ + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#00ffffff', endColorstr='#ffffff',GradientType=0 ); /* IE6-9 */ + background: linear-gradient(top, rgba(255,255,255,0) 0%,rgba(255,255,255,1) 100%); /* W3C */ + width: 100%; + height: 45px; + position: absolute; + top: 230px; +} +.featured-post .feature-image.small:after { + top: 253px; +} +#content .feature-slider { + top: 5px; + right: 8.9%; + overflow: visible; + position: absolute; +} +.feature-slider ul { + list-style-type: none; + margin: 0; +} +.feature-slider li { + float: left; + margin: 0 6px; +} +.feature-slider a { + background: #3c3c3c; + background: rgba(60,60,60,0.9); + -moz-border-radius: 12px; + border-radius: 12px; + -webkit-box-shadow: inset 1px 1px 5px rgba(0,0,0,0.5), inset 0 0 2px rgba(255,255,255,0.5); + -moz-box-shadow: inset 1px 1px 5px rgba(0,0,0,0.5), inset 0 0 2px rgba(255,255,255,0.5); + box-shadow: inset 1px 1px 5px rgba(0,0,0,0.5), inset 0 0 2px rgba(255,255,255,0.5); + display: block; + width: 14px; + height: 14px; +} +.feature-slider a.active { + background: #1982d1; + -webkit-box-shadow: inset 1px 1px 5px rgba(0,0,0,0.4), inset 0 0 2px rgba(255,255,255,0.8); + -moz-box-shadow: inset 1px 1px 5px rgba(0,0,0,0.4), inset 0 0 2px rgba(255,255,255,0.8); + box-shadow: inset 1px 1px 5px rgba(0,0,0,0.4), inset 0 0 2px rgba(255,255,255,0.8); + cursor: default; + opacity: 0.5; +} + +/* Recent Posts */ +section.recent-posts { + padding: 0 0 1.625em; +} +section.recent-posts .hentry { + border: none; + margin: 0; +} +section.recent-posts .other-recent-posts { + border-bottom: 1px solid #ddd; + list-style: none; + margin: 0; +} +section.recent-posts .other-recent-posts li { + padding: 0.3125em 0; + position: relative; +} +section.recent-posts .other-recent-posts .entry-title { + border-top: 1px solid #ddd; + font-size: 17px; +} +section.recent-posts .other-recent-posts a[rel="bookmark"] { + color: #373737; + float: left; + max-width: 84%; +} +section.recent-posts .other-recent-posts a[rel="bookmark"]:after { + content: '-'; + color: transparent; + font-size: 11px; +} +section.recent-posts .other-recent-posts a[rel="bookmark"]:hover { +} +section.recent-posts .other-recent-posts .comments-link a, +section.recent-posts .other-recent-posts .comments-link > span { + border-bottom: 2px solid #999; + bottom: -2px; + color: #444; + display: block; + font-size: 10px; + font-weight: 500; + line-height: 2.76333em; + padding: 0.3125em 0 0.3125em 1em; + position: absolute; + right: 0; + text-align: right; + text-transform: uppercase; + z-index: 1; +} +section.recent-posts .other-recent-posts .comments-link > span { + border-color: #bbb; + color: #888; +} +section.recent-posts .other-recent-posts .comments-link a:hover { + color: #1982d1; + border-color: #1982d1; +} +section.recent-posts .other-recent-posts li:after { + clear: both; + content: '.'; + display: block; + height: 0; + visibility: hidden; +} + + +/* =Attachments +----------------------------------------------- */ + +.image-attachment div.attachment { + background: #f9f9f9; + border: 1px solid #ddd; + border-width: 1px 0; + margin: 0 -8.9% 1.625em; + overflow: hidden; + padding: 1.625em 1.625em 0; + text-align: center; +} +.image-attachment div.attachment img { + display: block; + height: auto; + margin: 0 auto 1.625em; + max-width: 100%; +} +.image-attachment div.attachment a img { + border-color: #f9f9f9; +} +.image-attachment div.attachment a:focus img, +.image-attachment div.attachment a:hover img, +.image-attachment div.attachment a:active img { + border-color: #ddd; + background: #fff; +} +.image-attachment .entry-caption p { + font-size: 10px; + letter-spacing: 0.1em; + line-height: 2.6em; + margin: 0 0 2.6em; + text-transform: uppercase; +} + + +/* =Navigation +-------------------------------------------------------------- */ + +#content nav { + clear: both; + overflow: hidden; + padding: 0 0 1.625em; +} +#content nav a { + font-size: 12px; + font-weight: bold; + line-height: 2.2em; +} +#nav-above { + padding: 0 0 1.625em; +} +#nav-above { + display: none; +} +.paged #nav-above { + display: block; +} +.nav-previous { + float: left; + width: 50%; +} +.nav-next { + float: right; + text-align: right; + width: 50%; +} +#content nav .meta-nav { + font-weight: normal; +} + +/* Singular navigation */ +#nav-single { + float: right; + position: relative; + top: -0.3em; + text-align: right; + width: 100%; + z-index: 1; +} +#nav-single .nav-previous, +#nav-single .nav-next { + float: none; + width: auto; +} +#nav-single .nav-next { + padding-left: .5em; +} + + +/* =Widgets +----------------------------------------------- */ + +.widget-area { + font-size: 12px; +} +.widget { + clear: both; + margin: 0 0 2.2em; +} +.widget-title { + color: #666; + font-size: 10px; + font-weight: 500; + letter-spacing: 0.1em; + line-height: 2.6em; + text-transform: uppercase; +} +.widget ul { + font-size: 15px; + margin: 0; +} +.widget ul ul { + margin-left: 1.5em; +} +.widget ul li { + color: #777; + font-size: 13px; +} +.widget a { + font-weight: bold; + text-decoration: none; +} +.widget a:hover, +.widget a:focus, +.widget a:active { + text-decoration: underline; +} + +/* Search Widget */ +.widget_search form { + margin: 0 0 1.625em; +} +.widget_search #s { + width: 77%; +} +.widget_search #searchsubmit { + background: #ddd; + border: 1px solid #ccc; + -webkit-box-shadow: inset 0px -1px 1px rgba(0, 0, 0, 0.09); + -moz-box-shadow: inset 0px -1px 1px rgba(0, 0, 0, 0.09); + box-shadow: inset 0px -1px 1px rgba(0, 0, 0, 0.09); + color: #888; + font-size: 13px; + line-height: 25px; + position: relative; + top: -2px; +} +.widget_search #searchsubmit:active { + background: #1982d1; + border-color: #0861a5; + -webkit-box-shadow: inset 0px 1px 1px rgba(0, 0, 0, 0.1); + -moz-box-shadow: inset 0px 1px 1px rgba(0, 0, 0, 0.1); + box-shadow: inset 0px 1px 1px rgba(0, 0, 0, 0.1); + color: #bfddf3; +} + +/* Ephemera Widget */ +section.ephemera ol, +.widget_twentyeleven_ephemera ol { + list-style: square; + margin: 5px 0 0; +} +.widget_twentyeleven_ephemera .widget-entry-title { + font-size: 15px; + font-weight: bold; + padding: 0; +} +.widget_twentyeleven_ephemera .comments-link a, +.widget_twentyeleven_ephemera .comments-link > span { + color: #666; + display: block; + font-size: 10px; + font-weight: 500; + line-height: 2.76333em; + text-transform: uppercase; +} +section.ephemera .entry-title .comments-link a:hover, +.widget_twentyeleven_ephemera .entry-title .comments-link a:hover { +} +section.ephemera .entry-title a span { + color: #29628d; +} + +/* Twitter */ +.widget_twitter li { + list-style-type: none; + margin-bottom: 14px; +} +.widget_twitter .timesince { + display: block; + font-size: 11px; + margin-right: -10px; + text-align: right; +} + +/* Widget Image */ +.widget_image img { + height: auto; + max-width: 100%; +} + +/* Calendar Widget */ + +.widget_calendar #wp-calendar { + color: #555; + width: 95%; + text-align: center; +} +.widget_calendar #wp-calendar caption, +.widget_calendar #wp-calendar td, +.widget_calendar #wp-calendar th { + text-align: center; +} +.widget_calendar #wp-calendar caption { + font-size: 11px; + font-weight: 500; + padding: 5px 0 3px 0; + text-transform: uppercase; +} +.widget_calendar #wp-calendar th { + background: #f4f4f4; + border-top: 1px solid #ccc; + border-bottom: 1px solid #ccc; + font-weight: bold; +} +.widget_calendar #wp-calendar tfoot td { + background: #f4f4f4; + border-top: 1px solid #ccc; + border-bottom: 1px solid #ccc; +} + + +/* =Comments +----------------------------------------------- */ + +#comments-title { + color: #666; + font-size: 10px; + font-weight: 500; + line-height: 2.6em; + padding: 0 0 2.6em; + text-transform: uppercase; +} +.nopassword, +.nocomments { + color: #aaa; + font-size: 24px; + font-weight: 100; + margin: 26px 0; + text-align: center; +} +.commentlist { + list-style: none; + margin: 0 auto; + width: 68.9%; +} +.content .commentlist, +.page-template-sidebar-page-php .commentlist { + width: 100%; /* reset the width for the one-column and sidebar page layout */ +} +.commentlist > li.comment { + background: #f6f6f6; + border: 1px solid #ddd; + -moz-border-radius: 3px; + border-radius: 3px; + margin: 0 0 1.625em; + padding: 1.625em; + position: relative; +} +.commentlist .pingback { + margin: 0 0 1.625em; + padding: 0 1.625em; +} +.commentlist .children { + list-style: none; + margin: 0; +} +.commentlist .children li.comment { + background: #fff; + border-left: 1px solid #ddd; + -moz-border-radius: 0 3px 3px 0; + border-radius: 0 3px 3px 0; + margin: 1.625em 0 0; + padding: 1.625em; + position: relative; +} +.commentlist .children li.comment .fn { + display: block; +} +.comment-meta .fn { + font-style: normal; +} +.comment-meta { + color: #666; + font-size: 12px; + line-height: 2.2em; +} +.commentlist .children li.comment .comment-meta { + line-height: 1.625em; + margin-left: 50px; +} +.commentlist .children li.comment .comment-content { + margin: 1.625em 0 0; +} +.comment-meta a { + font-weight: bold; +} +.comment-meta a:focus, +.comment-meta a:active, +.comment-meta a:hover { +} +.commentlist .avatar { + -moz-border-radius: 3px; + border-radius: 3px; + -webkit-box-shadow: 0 1px 2px #ccc; + -moz-box-shadow: 0 1px 2px #ccc; + box-shadow: 0 1px 2px #ccc; + left: -102px; + padding: 0; + position: absolute; + top: 0; +} +.commentlist > li:before { + content: url(images/comment-arrow.png); + left: -21px; + position: absolute; +} +.commentlist > li.pingback:before { + content: ''; +} +.commentlist .children .avatar { + background: none; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; + left: 2.2em; + padding: 0; + top: 2.2em; +} +a.comment-reply-link { + background: #eee; + -moz-border-radius: 3px; + border-radius: 3px; + color: #666; + display: inline-block; + font-size: 12px; + padding: 0 8px; + text-decoration: none; +} +a.comment-reply-link:hover, +a.comment-reply-link:focus, +a.comment-reply-link:active { + background: #888; + color: #fff; +} +a.comment-reply-link > span { + display: inline-block; + position: relative; + top: -1px; +} + +/* Post author highlighting */ +.commentlist > li.bypostauthor { + background: #ddd; + border-color: #d3d3d3; +} +.commentlist > li.bypostauthor .comment-meta { + color: #575757; +} +.commentlist > li.bypostauthor .comment-meta a:focus, +.commentlist > li.bypostauthor .comment-meta a:active, +.commentlist > li.bypostauthor .comment-meta a:hover { +} +.commentlist > li.bypostauthor:before { + content: url(images/comment-arrow-bypostauthor.png); +} + +/* Post Author threaded comments */ +.commentlist .children > li.bypostauthor { + background: #ddd; + border-color: #d3d3d3; +} + +/* sidebar-page.php comments */ +/* Make sure we have room for our comment avatars */ +.page-template-sidebar-page-php .commentlist > li.comment, +.page-template-sidebar-page-php.commentlist .pingback { + margin-left: 102px; + width: auto; +} +/* And a full-width comment form */ +.page-template-sidebar-page-php #respond { + width: auto; +} + +/* Comment Form */ +#respond { + background: #ddd; + border: 1px solid #d3d3d3; + -moz-border-radius: 3px; + border-radius: 3px; + margin: 0 auto 1.625em; + padding: 1.625em; + position: relative; + width: 68.9%; +} +#respond input[type="text"], +#respond textarea { + background: #fff; + border: 4px solid #eee; + -moz-border-radius: 5px; + border-radius: 5px; + -webkit-box-shadow: inset 0 1px 3px rgba(204,204,204,0.95); + -moz-box-shadow: inset 0 1px 3px rgba(204,204,204,0.95); + box-shadow: inset 0 1px 3px rgba(204,204,204,0.95); + position: relative; + padding: 10px; + text-indent: 80px; +} +#respond .comment-form-author, +#respond .comment-form-email, +#respond .comment-form-url, +#respond .comment-form-comment { + position: relative; +} +#respond .comment-form-author label, +#respond .comment-form-email label, +#respond .comment-form-url label, +#respond .comment-form-comment label { + background: #eee; + -webkit-box-shadow: 1px 2px 2px rgba(204,204,204,0.8); + -moz-box-shadow: 1px 2px 2px rgba(204,204,204,0.8); + box-shadow: 1px 2px 2px rgba(204,204,204,0.8); + color: #555; + display: inline-block; + font-size: 13px; + left: 4px; + min-width: 60px; + padding: 4px 10px; + position: relative; + top: 40px; + z-index: 1; +} +#respond input[type="text"]:focus, +#respond textarea:focus { + text-indent: 0; + z-index: 1; +} +#respond textarea { + resize: vertical; + width: 95%; +} +#respond .comment-form-author .required, +#respond .comment-form-email .required { + color: #bd3500; + font-size: 22px; + font-weight: bold; + left: 75%; + position: absolute; + top: 45px; + z-index: 1; +} +#respond .comment-notes, +#respond .logged-in-as { + font-size: 13px; +} +#respond p { + margin: 10px 0; +} +#respond .form-submit { + float: right; + margin: -20px 0 10px; +} +#respond input#submit { + background: #222; + border: none; + -moz-border-radius: 3px; + border-radius: 3px; + -webkit-box-shadow: 0px 1px 2px rgba(0,0,0,0.3); + -moz-box-shadow: 0px 1px 2px rgba(0,0,0,0.3); + box-shadow: 0px 1px 2px rgba(0,0,0,0.3); + color: #eee; + cursor: pointer; + font-size: 15px; + margin: 20px 0; + padding: 5px 42px 5px 22px; + position: relative; + left: 30px; + text-shadow: 0 -1px 0 rgba(0,0,0,0.3); +} +#respond input#submit:active { + background: #1982d1; + color: #bfddf3; +} +#respond #cancel-comment-reply-link { + color: #666; + margin-left: 10px; + text-decoration: none; +} +#respond .logged-in-as a:hover, +#respond #cancel-comment-reply-link:hover { + text-decoration: underline; +} +.commentlist #respond { + margin: 1.625em 0 0; + width: auto; +} +#reply-title { + color: #373737; + font-size: 24px; + font-weight: bold; + line-height: 30px; +} +#cancel-comment-reply-link { + color: #888; + display: block; + font-size: 10px; + font-weight: normal; + line-height: 2.2em; + letter-spacing: 0.05em; + position: absolute; + right: 1.625em; + text-decoration: none; + text-transform: uppercase; + top: 1.1em; +} +#cancel-comment-reply-link:focus, +#cancel-comment-reply-link:active, +#cancel-comment-reply-link:hover { + color: #ff4b33; +} +#respond label { + line-height: 2.2em; +} +#respond input[type=text] { + display: block; + height: 24px; + width: 75%; +} +#respond p { + font-size: 12px; +} +p.comment-form-comment { + margin: 0; +} +.form-allowed-tags { + display: none; +} + + +/* =Footer +----------------------------------------------- */ + +#colophon { + clear: both; +} +#supplementary { + border-top: 1px solid #ddd; + padding: 1.625em 7.6%; + overflow: hidden; +} + +/* Two Footer Widget Areas */ +#supplementary.two .widget-area { + float: left; + margin-right: 3.7%; + width: 48.1%; +} +#supplementary.two .widget-area + .widget-area { + margin-right: 0; +} + +/* Three Footer Widget Areas */ +#supplementary.three .widget-area { + float: left; + margin-right: 3.7%; + width: 30.85%; +} +#supplementary.three .widget-area + .widget-area + .widget-area { + margin-right: 0; +} + +/* Site Generator Line */ +#site-generator { + background: #f9f9f9; + border-top: 1px solid #ddd; + color: #666; + font-size: 12px; + line-height: 2.2em; + padding: 2.2em 0.5em; + text-align: center; +} +#site-generator a { + color: #555; + font-weight: bold; +} +#site-generator .sep { + background: url(images/wordpress.png) center left no-repeat; + color: transparent; + display: inline-block; + height: 16px; + line-height: 16px; + margin: 0 7px; + width: 16px; +} + + +/* =Responsive Structure +----------------------------------------------- */ + +@media (max-width: 800px) { + /* Simplify the basic layout */ + #main #content { + margin: 0 7.6%; + width: auto; + } + #nav-below { + border-bottom: 1px solid #ddd; + margin-bottom: 1.625em; + } + #main #secondary { + float: none; + margin: 0 7.6%; + width: auto; + } + /* Simplify the showcase template */ + .page-template-showcase-php .featured-posts { + min-height: 280px; + } + .featured-posts section.featured-post { + height: auto; + } + .page-template-showcase-php section.recent-posts { + float: none; + margin: 0; + width: 100%; + } + .page-template-showcase-php #main .widget-area { + float: none; + margin: 0; + width: auto; + } + .page-template-showcase-php .other-recent-posts { + border-bottom: 1px solid #ddd; + } + /* Simplify the showcase template when small feature */ + section.featured-post .attachment-small-feature, + .one-column section.featured-post .attachment-small-feature { + border: none; + display: block; + float: left; + height: auto; + margin: 0.625em auto 1.025em; + max-width: 30%; + position: static; + } + article.feature-image.small { + float: right; + margin: 0 0 1.625em; + width: 64%; + } + .one-column article.feature-image.small .entry-summary { + height: auto; + } + article.feature-image.small .entry-summary p a { + left: 0; + padding-left: 20px; + padding-right: 20px; + width: auto; + } + /* Remove the margin on singular articles */ + .singular .entry-header, + .singular .entry-content, + .singular footer.entry-meta, + .singular #comments-title { + width: 100%; + } + /* Simplify the pullquotes and pull styles */ + .singular blockquote.pull { + margin: 0 0 1.625em; + } + .singular .pull.alignleft { + margin: 0 1.625em 0 0; + } + .singular .pull.alignright { + margin: 0 0 0 1.625em; + } + .singular .entry-meta .edit-link a { + left: 0; + position: absolute; + top: 40px; + } + .singular #author-info { + margin: 2.2em -8.8% 0; + padding: 20px 8.8%; + } + /* Make sure we have room for our comment avatars */ + .commentlist { + width: 100%; + } + .commentlist > li.comment, + .commentlist .pingback { + margin-left: 102px; + width: auto; + } + /* And a full-width comment form */ + #respond { + width: auto; + } + /* No need to float footer widgets at this size */ + #colophon #supplementary .widget-area { + float: none; + margin-right: 0; + width: auto; + } + /* No need to float 404 widgets at this size */ + .error404 #main .widget { + float: none; + margin-right: 0; + width: auto; + } + /* Make sure embeds fit their containers */ + embed, + object { + max-width: 100%; + } + +} +@media (max-width: 650px) { + /* @media (max-width: 650px) Reduce font-sizes for better readability on smaller devices */ + body, input, textarea { + font-size: 13px; + } + #site-title a { + font-size: 24px; + } + #site-description { + font-size: 12px; + } + #access ul { + font-size: 12px; + } + article.intro .entry-content { + font-size: 12px; + } + .entry-title { + font-size: 21px; + } + .featured-post .entry-title { + font-size: 14px; + } + .singular .entry-title { + font-size: 28px; + } + .entry-meta { + font-size: 12px; + } + blockquote { + margin: 0; + } + blockquote.pull { + font-size: 17px; + } + /* Reposition the site title and description slightly */ + #site-title { + padding: 5.30625em 0 0; + } + #site-title, + #site-description { + margin-right: 0; + } + /* Make sure the logo and search form don't collide */ + #branding #searchform { + top: 1.625em !important; + } + /* Floated content doesn't work well at this size */ + .alignleft, + .alignright { + float: none; + margin-left: 0; + margin-right: 0; + } + /* Make sure the post-post navigation doesn't collide with anything */ + #nav-single { + display: block; + position: static; + } + .singular .hentry { + padding: 1.625em 0 0; + } + .singular.page .hentry { + padding: 1.625em 0 0; + } + /* Talking avatars take up too much room at this size */ + .commentlist > li.comment, + .commentlist > li.pingback { + margin-left: 0 !important; + } + .commentlist .avatar { + background: transparent; + display: block; + padding: 0; + position: static; + } + .commentlist .children .avatar { + background: none; + left: 2.2em; + padding: 0; + position: absolute; + top: 2.2em; + } + /* Use the available space in the smaller comment form */ + #respond input[type="text"] { + width: 95%; + } + #respond .comment-form-author .required, + #respond .comment-form-email .required { + left: 95%; + } + #content .gallery-columns-3 .gallery-item { + width: 31%; + padding-right: 2%; + } + #content .gallery-columns-3 .gallery-item img { + width: 100%; + height: auto; + } + +} +@media (max-width: 450px) { + #content .gallery-columns-2 .gallery-item { + width: 45%; + padding-right: 4%; + } + #content .gallery-columns-2 .gallery-item img { + width: 100%; + height: auto; + } + +} +@media only screen and (min-device-width: 320px) and (max-device-width: 480px) { + body { + padding: 0; + } + #page { + margin-top: 0; + } + #branding { + border-top: none; + } + +} + + +/* =Print +----------------------------------------------- */ + +@media print { + body { + background: none !important; + font-size: 10pt; + } + footer.entry-meta a[rel=bookmark]:link:after, + footer.entry-meta a[rel=bookmark]:visited:after { + content: " [" attr(href) "] "; /* Show URLs */ + } + #page { + clear: both !important; + display: block !important; + float: none !important; + max-width: 100%; + position: relative !important; + } + #branding { + border-top: none !important; + padding: 0; + } + #branding hgroup { + margin: 0; + } + #site-title a { + font-size: 21pt; + } + #site-description { + font-size: 10pt; + } + #branding #searchform { + display: none; + } + #branding img { + display: none; + } + #access { + display: none; + } + #main { + border-top: none; + box-shadow: none; + } + #primary { + float: left; + margin: 0; + width: 100%; + } + #content { + margin: 0; + width: auto; + } + .singular #content { + margin: 0; + width: 100%; + } + .singular .entry-header .entry-meta { + position: static; + } + .entry-meta .edit-link a { + display: none; + } + #content nav { + display: none; + } + .singular .entry-header, + .singular .entry-content, + .singular footer.entry-meta, + .singular #comments-title { + margin: 0; + width: 100%; + } + .singular .hentry { + padding: 0; + } + .entry-title, + .singular .entry-title { + font-size: 21pt; + } + .entry-meta { + font-size: 10pt; + } + .entry-header .comments-link { + display: none; + } + .page-link { + display: none; + } + .singular #author-info { + background: none; + border-bottom: none; + border-top: none; + margin: 2.2em 0 0; + padding: 0; + } + #respond { + display: none; + } + .widget-area { + display: none; + } + #colophon { + display: none; + } + + /* Comments */ + .commentlist > li.comment { + background: none; + border: 1px solid #ddd; + -moz-border-radius: 3px 3px 3px 3px; + border-radius: 3px 3px 3px 3px; + margin: 0 auto 1.625em; + padding: 1.625em; + position: relative; + width: auto; + } + .commentlist .avatar { + height: 39px; + left: 2.2em; + top: 2.2em; + width: 39px; + } + .commentlist li.comment .comment-meta { + line-height: 1.625em; + margin-left: 50px; + } + .commentlist li.comment .fn { + display: block; + } + .commentlist li.comment .comment-content { + margin: 1.625em 0 0; + } + .commentlist .comment-edit-link { + display: none; + } + .commentlist > li::before, + .commentlist > li.bypostauthor::before { + content: ''; + } + .commentlist .reply { + display: none; + } + + /* Post author highlighting */ + .commentlist > li.bypostauthor { + color: #444; + } + .commentlist > li.bypostauthor .comment-meta { + color: #666; + } + .commentlist > li.bypostauthor:before { + content: none; + } + + /* Post Author threaded comments */ + .commentlist .children > li.bypostauthor { + background: #fff; + border-color: #ddd; + } + .commentlist .children > li.bypostauthor > article, + .commentlist .children > li.bypostauthor > article .comment-meta { + color: #666; + } + +} + + +/* =IE7 +----------------------------------------------- */ + +#ie7 article.intro { + margin-left: -7.6%; + margin-right: -7.6%; + padding-left: -7.6%; + padding-right: -7.6%; + max-width: 1000px; +} +#ie7 section.featured-post { + margin-left: -7.6%; + margin-right: -7.6%; + max-width: 850px; +} +#ie7 section.recent-posts { + margin-right: 7.6%; +} diff --git a/src/wp-content/themes/twentyeleven/tag.php b/src/wp-content/themes/twentyeleven/tag.php new file mode 100644 index 0000000..8180a8c --- /dev/null +++ b/src/wp-content/themes/twentyeleven/tag.php @@ -0,0 +1,65 @@ + + +
    +
    + + + +
    ' ); + ?> + + + + + + + + + + + + + + + +
    +
    +

    +
    + +
    +

    + +
    +
    + + + + +
    + + + diff --git a/src/wp-content/themes/twentyten/404.php b/src/wp-content/themes/twentyten/404.php new file mode 100644 index 0000000..3baea81 --- /dev/null +++ b/src/wp-content/themes/twentyten/404.php @@ -0,0 +1,30 @@ + + +
    +
    + +
    +

    +
    +

    + +
    +
    + +
    +
    + + + \ No newline at end of file diff --git a/src/wp-content/themes/twentyten/archive.php b/src/wp-content/themes/twentyten/archive.php new file mode 100644 index 0000000..0707e18 --- /dev/null +++ b/src/wp-content/themes/twentyten/archive.php @@ -0,0 +1,61 @@ + + +
    +
    + + + +

    + + %s', 'twentyten' ), get_the_date() ); ?> + + %s', 'twentyten' ), get_the_date( 'F Y' ) ); ?> + + %s', 'twentyten' ), get_the_date( 'Y' ) ); ?> + + + +

    + + + +
    +
    + + + diff --git a/src/wp-content/themes/twentyten/attachment.php b/src/wp-content/themes/twentyten/attachment.php new file mode 100644 index 0000000..5b35936 --- /dev/null +++ b/src/wp-content/themes/twentyten/attachment.php @@ -0,0 +1,26 @@ + + +
    +
    + + + +
    +
    + + diff --git a/src/wp-content/themes/twentyten/author.php b/src/wp-content/themes/twentyten/author.php new file mode 100644 index 0000000..2bd48c8 --- /dev/null +++ b/src/wp-content/themes/twentyten/author.php @@ -0,0 +1,60 @@ + + +
    +
    + + + +

    " . get_the_author() . "" ); ?>

    + + +
    +
    + +
    +
    +

    + +
    +
    + + + +
    +
    + + + diff --git a/src/wp-content/themes/twentyten/category.php b/src/wp-content/themes/twentyten/category.php new file mode 100644 index 0000000..0792e1f --- /dev/null +++ b/src/wp-content/themes/twentyten/category.php @@ -0,0 +1,34 @@ + + +
    +
    + +

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

    + ' . $category_description . '
    '; + + /* Run the loop for the category page to output the posts. + * If you want to overload this in a child theme then include a file + * called loop-category.php and that will be used instead. + */ + get_template_part( 'loop', 'category' ); + ?> + +
    + + + + diff --git a/src/wp-content/themes/twentyten/comments.php b/src/wp-content/themes/twentyten/comments.php new file mode 100644 index 0000000..7863ca1 --- /dev/null +++ b/src/wp-content/themes/twentyten/comments.php @@ -0,0 +1,79 @@ + + +
    + +

    +
    + + + + + +

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

    + + 1 && get_option( 'page_comments' ) ) : // Are there comments to navigate through? ?> + + + +
      + 'twentyten_comment' ) ); + ?> +
    + + 1 && get_option( 'page_comments' ) ) : // Are there comments to navigate through? ?> + + + + +

    + + + + + + + diff --git a/src/wp-content/themes/twentyten/editor-style-rtl.css b/src/wp-content/themes/twentyten/editor-style-rtl.css new file mode 100644 index 0000000..2c69a7c --- /dev/null +++ b/src/wp-content/themes/twentyten/editor-style-rtl.css @@ -0,0 +1,56 @@ +/* +Theme Name: Twenty Ten +*/ +/* +Used to style the TinyMCE editor. +*/ +html .mceContentBody{ + direction:rtl; + unicode-bidi:embed; + float:right; +} +* { + font-family: Arial, Tahoma, sans-serif; +} +/* Text elements */ +ul { + margin: 0 -18px 18px 0; +} +ol { + margin: 0 -18px 18px 0; +} +dd { + margin-right: 0; +} +blockquote { + font-style: normal; +} +table { + text-align: right; + margin: 0 0 24px -1px; +} +html .mceContentBody{ + direction:rtl; + unicode-bidi:embed; + float:right; +} +* { + font-family: Arial, Tahoma, sans-serif; +} +/* Text elements */ +ul { + margin: 0 -18px 18px 0; +} +ol { + margin: 0 -18px 18px 0; +} +dd { + margin-right: 0; +} +blockquote { + font-style: normal; +} +table { + text-align: right; + margin: 0 0 24px -1px; +} \ No newline at end of file diff --git a/src/wp-content/themes/twentyten/editor-style.css b/src/wp-content/themes/twentyten/editor-style.css new file mode 100644 index 0000000..7d05135 --- /dev/null +++ b/src/wp-content/themes/twentyten/editor-style.css @@ -0,0 +1,292 @@ +/* +Theme Name: Twenty Ten +Description: Used to style the TinyMCE editor. +*/ +html .mceContentBody { + max-width: 640px; +} +* { + color: #444; + font-family: Georgia, "Bitstream Charter", serif; + line-height: 1.5; +} +p, +dl, +td, +th, +ul, +ol, +blockquote { + font-size: 16px; +} +tr th, +thead th, +label, +tr th, +thead th { + font-family: "Helvetica Neue", Arial, Helvetica, "Nimbus Sans L", sans-serif; +} +pre { + font-family: "Courier 10 Pitch", Courier, monospace; +} +code, code var { + font-family: Monaco, Consolas, "Andale Mono", "DejaVu Sans Mono", monospace; +} +body, input, textarea { + font-size: 12px; + line-height: 18px; +} +hr { + background-color: #e7e7e7; + border: 0; + clear: both; + height: 1px; + margin-bottom: 18px; +} +/* Text elements */ +p { + margin-bottom: 18px; +} +ul { + list-style: square; + margin: 0 0 18px 1.5em; +} +ol { + list-style: decimal; + margin: 0 0 18px 1.5em; +} +ol ol { + list-style: upper-alpha; +} +ol ol ol { + list-style: lower-roman; +} +ol ol ol ol { + list-style: lower-alpha; +} +ul ul, +ol ol, +ul ol, +ol ul { + margin-bottom: 0; +} +dl { + margin: 0 0 24px 0; +} +dt { + font-weight: bold; +} +dd { + margin-bottom: 18px; +} +strong { + color: #000; + font-weight: bold; +} +cite, +em, +i { + border: none; + font-style: italic; +} +big { + font-size: 131.25%; +} +ins { + background: #ffc; + border: none; + color: #333; +} +del { + text-decoration: line-through; + color: #555; +} +blockquote { + font-style: italic; + padding: 0 3em; +} +blockquote cite, +blockquote em, +blockquote i { + font-style: normal; +} +pre { + background: #f7f7f7; + color: #222; + line-height: 18px; + margin-bottom: 18px; + padding: 1.5em; +} +abbr, +acronym { + border-bottom: 1px dotted #666; + cursor: help; +} +ins { + text-decoration: none; +} +sup, +sub { + font-size: 10px; + height: 0; + line-height: 1; + position: relative; + vertical-align: baseline; +} +sup { + bottom: 1ex; +} +sub { + top: .5ex; +} +a:link { + color: #06c; +} +a:visited { + color: #743399; +} +a:active, +a:hover { + color: #ff4b33; +} +p, +ul, +ol, +dd, +pre, +hr { + margin-bottom: 24px; +} +ul ul, +ol ol, +ul ol, +ol ul { + margin-bottom: 0; +} +pre, +kbd, +tt, +var { + font-size: 15px; + line-height: 21px; +} +code { + font-size: 13px; +} +strong, +b, +dt, +th { + color: #000; +} +h1, +h2, +h3, +h4, +h5, +h6 { + color: #000; + font-weight: normal; + line-height: 1.5em; + margin: 0 0 20px 0; +} +h1 { + font-size: 2.4em; +} +h2 { + font-size: 1.8em; +} +h3 { + font-size: 1.4em; +} +h4 { + font-size: 1.2em; +} +h5 { + font-size: 1em; +} +h6 { + font-size: 0.9em; +} +table { + border: 1px solid #e7e7e7 !important; + border-collapse: collapse; + border-spacing: 0; + margin: 0 -1px 24px 0; + text-align: left; + width: 100%; +} +tr th, +thead th { + border: none !important; + color: #888; + font-size: 12px; + font-weight: bold; + line-height: 18px; + padding: 9px 24px; +} +tr td { + border: none !important; + border-top: 1px solid #e7e7e7 !important; + padding: 6px 24px; +} +img { + margin: 0; +} +img.size-auto, +img.size-large, +img.size-full, +img.size-medium { + max-width: 100%; + height: auto; +} +.alignleft, +img.alignleft { + display: inline; + float: left; + margin-right: 24px; + margin-top: 4px; +} +.alignright, +img.alignright { + display: inline; + float: right; + margin-left: 24px; + margin-top: 4px; +} +.aligncenter, +img.aligncenter { + clear: both; + display: block; + margin-left: auto; + margin-right: auto; +} +img.alignleft, +img.alignright, +img.aligncenter { + margin-bottom: 12px; +} +.wp-caption { + background: #f1f1f1; + border: none; + -khtml-border-radius: 0; + -moz-border-radius: 0; + -webkit-border-radius: 0; + border-radius: 0; + color: #888; + font-size: 12px; + line-height: 18px; + margin-bottom: 20px; + max-width: 632px !important; /* prevent too-wide images from breaking layout */ + padding: 4px; + text-align: center; +} +.wp-caption img { + margin: 5px; +} +.wp-caption p.wp-caption-text { + margin: 0 0 4px; +} +.wp-smiley { + margin: 0; +} \ No newline at end of file diff --git a/src/wp-content/themes/twentyten/footer.php b/src/wp-content/themes/twentyten/footer.php new file mode 100644 index 0000000..6d0d1ab --- /dev/null +++ b/src/wp-content/themes/twentyten/footer.php @@ -0,0 +1,50 @@ + + + + + + + + + * tag of your theme, or you will break many plugins, which + * generally use this hook to reference JavaScript files. + */ + + wp_footer(); +?> + + diff --git a/src/wp-content/themes/twentyten/functions.php b/src/wp-content/themes/twentyten/functions.php new file mode 100644 index 0000000..36f5506 --- /dev/null +++ b/src/wp-content/themes/twentyten/functions.php @@ -0,0 +1,508 @@ + + * add_action( 'after_setup_theme', 'my_child_theme_setup' ); + * function my_child_theme_setup() { + * // We are providing our own filter for excerpt_length (or using the unfiltered value) + * remove_filter( 'excerpt_length', 'twentyten_excerpt_length' ); + * ... + * } + * + * + * For more information on hooks, actions, and filters, see http://codex.wordpress.org/Plugin_API. + * + * @package WordPress + * @subpackage Twenty_Ten + * @since Twenty Ten 1.0 + */ + +/** + * Set the content width based on the theme's design and stylesheet. + * + * Used to set the width of images and content. Should be equal to the width the theme + * is designed for, generally via the style.css stylesheet. + */ +if ( ! isset( $content_width ) ) + $content_width = 640; + +/** Tell WordPress to run twentyten_setup() when the 'after_setup_theme' hook is run. */ +add_action( 'after_setup_theme', 'twentyten_setup' ); + +if ( ! function_exists( 'twentyten_setup' ) ): +/** + * Sets up theme defaults and registers support for various WordPress features. + * + * Note that this function is hooked into the after_setup_theme hook, which runs + * before the init hook. The init hook is too late for some features, such as indicating + * support post thumbnails. + * + * To override twentyten_setup() in a child theme, add your own twentyten_setup to your child theme's + * functions.php file. + * + * @uses add_theme_support() To add support for post thumbnails and automatic feed links. + * @uses register_nav_menus() To add support for navigation menus. + * @uses add_custom_background() To add support for a custom background. + * @uses add_editor_style() To style the visual editor. + * @uses load_theme_textdomain() For translation/localization support. + * @uses add_custom_image_header() To add support for a custom header. + * @uses register_default_headers() To register the default custom header images provided with the theme. + * @uses set_post_thumbnail_size() To set a custom post thumbnail size. + * + * @since Twenty Ten 1.0 + */ +function twentyten_setup() { + + // This theme styles the visual editor with editor-style.css to match the theme style. + add_editor_style(); + + // Post Format support. You can also use the legacy "gallery" or "asides" (note the plural) categories. + add_theme_support( 'post-formats', array( 'aside', 'gallery' ) ); + + // This theme uses post thumbnails + add_theme_support( 'post-thumbnails' ); + + // Add default posts and comments RSS feed links to head + add_theme_support( 'automatic-feed-links' ); + + // Make theme available for translation + // Translations can be filed in the /languages/ directory + load_theme_textdomain( 'twentyten', TEMPLATEPATH . '/languages' ); + + $locale = get_locale(); + $locale_file = TEMPLATEPATH . "/languages/$locale.php"; + if ( is_readable( $locale_file ) ) + require_once( $locale_file ); + + // This theme uses wp_nav_menu() in one location. + register_nav_menus( array( + 'primary' => __( 'Primary Navigation', 'twentyten' ), + ) ); + + // This theme allows users to set a custom background + add_custom_background(); + + // Your changeable header business starts here + if ( ! defined( 'HEADER_TEXTCOLOR' ) ) + define( 'HEADER_TEXTCOLOR', '' ); + + // No CSS, just IMG call. The %s is a placeholder for the theme template directory URI. + if ( ! defined( 'HEADER_IMAGE' ) ) + define( 'HEADER_IMAGE', '%s/images/headers/path.jpg' ); + + // The height and width of your custom header. You can hook into the theme's own filters to change these values. + // Add a filter to twentyten_header_image_width and twentyten_header_image_height to change these values. + define( 'HEADER_IMAGE_WIDTH', apply_filters( 'twentyten_header_image_width', 940 ) ); + define( 'HEADER_IMAGE_HEIGHT', apply_filters( 'twentyten_header_image_height', 198 ) ); + + // We'll be using post thumbnails for custom header images on posts and pages. + // We want them to be 940 pixels wide by 198 pixels tall. + // Larger images will be auto-cropped to fit, smaller ones will be ignored. See header.php. + set_post_thumbnail_size( HEADER_IMAGE_WIDTH, HEADER_IMAGE_HEIGHT, true ); + + // Don't support text inside the header image. + if ( ! defined( 'NO_HEADER_TEXT' ) ) + define( 'NO_HEADER_TEXT', true ); + + // Add a way for the custom header to be styled in the admin panel that controls + // custom headers. See twentyten_admin_header_style(), below. + add_custom_image_header( '', 'twentyten_admin_header_style' ); + + // ... and thus ends the changeable header business. + + // Default custom headers packaged with the theme. %s is a placeholder for the theme template directory URI. + register_default_headers( array( + 'berries' => array( + 'url' => '%s/images/headers/berries.jpg', + 'thumbnail_url' => '%s/images/headers/berries-thumbnail.jpg', + /* translators: header image description */ + 'description' => __( 'Berries', 'twentyten' ) + ), + 'cherryblossom' => array( + 'url' => '%s/images/headers/cherryblossoms.jpg', + 'thumbnail_url' => '%s/images/headers/cherryblossoms-thumbnail.jpg', + /* translators: header image description */ + 'description' => __( 'Cherry Blossoms', 'twentyten' ) + ), + 'concave' => array( + 'url' => '%s/images/headers/concave.jpg', + 'thumbnail_url' => '%s/images/headers/concave-thumbnail.jpg', + /* translators: header image description */ + 'description' => __( 'Concave', 'twentyten' ) + ), + 'fern' => array( + 'url' => '%s/images/headers/fern.jpg', + 'thumbnail_url' => '%s/images/headers/fern-thumbnail.jpg', + /* translators: header image description */ + 'description' => __( 'Fern', 'twentyten' ) + ), + 'forestfloor' => array( + 'url' => '%s/images/headers/forestfloor.jpg', + 'thumbnail_url' => '%s/images/headers/forestfloor-thumbnail.jpg', + /* translators: header image description */ + 'description' => __( 'Forest Floor', 'twentyten' ) + ), + 'inkwell' => array( + 'url' => '%s/images/headers/inkwell.jpg', + 'thumbnail_url' => '%s/images/headers/inkwell-thumbnail.jpg', + /* translators: header image description */ + 'description' => __( 'Inkwell', 'twentyten' ) + ), + 'path' => array( + 'url' => '%s/images/headers/path.jpg', + 'thumbnail_url' => '%s/images/headers/path-thumbnail.jpg', + /* translators: header image description */ + 'description' => __( 'Path', 'twentyten' ) + ), + 'sunset' => array( + 'url' => '%s/images/headers/sunset.jpg', + 'thumbnail_url' => '%s/images/headers/sunset-thumbnail.jpg', + /* translators: header image description */ + 'description' => __( 'Sunset', 'twentyten' ) + ) + ) ); +} +endif; + +if ( ! function_exists( 'twentyten_admin_header_style' ) ) : +/** + * Styles the header image displayed on the Appearance > Header admin panel. + * + * Referenced via add_custom_image_header() in twentyten_setup(). + * + * @since Twenty Ten 1.0 + */ +function twentyten_admin_header_style() { +?> + +' . __( 'Continue reading ', 'twentyten' ) . ''; +} + +/** + * Replaces "[...]" (appended to automatically generated excerpts) with an ellipsis and twentyten_continue_reading_link(). + * + * To override this in a child theme, remove the filter and add your own + * function tied to the excerpt_more filter hook. + * + * @since Twenty Ten 1.0 + * @return string An ellipsis + */ +function twentyten_auto_excerpt_more( $more ) { + return ' …' . twentyten_continue_reading_link(); +} +add_filter( 'excerpt_more', 'twentyten_auto_excerpt_more' ); + +/** + * Adds a pretty "Continue Reading" link to custom post excerpts. + * + * To override this link in a child theme, remove the filter and add your own + * function tied to the get_the_excerpt filter hook. + * + * @since Twenty Ten 1.0 + * @return string Excerpt with a pretty "Continue Reading" link + */ +function twentyten_custom_excerpt_more( $output ) { + if ( has_excerpt() && ! is_attachment() ) { + $output .= twentyten_continue_reading_link(); + } + return $output; +} +add_filter( 'get_the_excerpt', 'twentyten_custom_excerpt_more' ); + +/** + * Remove inline styles printed when the gallery shortcode is used. + * + * Galleries are styled by the theme in Twenty Ten's style.css. This is just + * a simple filter call that tells WordPress to not use the default styles. + * + * @since Twenty Ten 1.2 + */ +add_filter( 'use_default_gallery_style', '__return_false' ); + +/** + * Deprecated way to remove inline styles printed when the gallery shortcode is used. + * + * This function is no longer needed or used. Use the use_default_gallery_style + * filter instead, as seen above. + * + * @since Twenty Ten 1.0 + * @deprecated Deprecated in Twenty Ten 1.2 for WordPress 3.1 + * + * @return string The gallery style filter, with the styles themselves removed. + */ +function twentyten_remove_gallery_css( $css ) { + return preg_replace( "##s", '', $css ); +} +// Backwards compatibility with WordPress 3.0. +if ( version_compare( $GLOBALS['wp_version'], '3.1', '<' ) ) + add_filter( 'gallery_style', 'twentyten_remove_gallery_css' ); + +if ( ! function_exists( 'twentyten_comment' ) ) : +/** + * Template for comments and pingbacks. + * + * To override this walker in a child theme without modifying the comments template + * simply create your own twentyten_comment(), and that function will be used instead. + * + * Used as a callback by wp_list_comments() for displaying the comments. + * + * @since Twenty Ten 1.0 + */ +function twentyten_comment( $comment, $args, $depth ) { + $GLOBALS['comment'] = $comment; + switch ( $comment->comment_type ) : + case '' : + ?> +

    ' . __( 'Documentation on Theme Options', 'twentyeleven' ) . '

  • id="li-comment-"> +
    +
    + + says:', 'twentyten' ), sprintf( '%s', get_comment_author_link() ) ); ?> +
    + comment_approved == '0' ) : ?> + +
    + + + + +
    + +
    + $depth, 'max_depth' => $args['max_depth'] ) ) ); ?> +
    +
    + + +
  • +

    + __( 'Primary Widget Area', 'twentyten' ), + 'id' => 'primary-widget-area', + 'description' => __( 'The primary widget area', 'twentyten' ), + 'before_widget' => '
  • ', + 'after_widget' => '
  • ', + 'before_title' => '

    ', + 'after_title' => '

    ', + ) ); + + // Area 2, located below the Primary Widget Area in the sidebar. Empty by default. + register_sidebar( array( + 'name' => __( 'Secondary Widget Area', 'twentyten' ), + 'id' => 'secondary-widget-area', + 'description' => __( 'The secondary widget area', 'twentyten' ), + 'before_widget' => '
  • ', + 'after_widget' => '
  • ', + 'before_title' => '

    ', + 'after_title' => '

    ', + ) ); + + // Area 3, located in the footer. Empty by default. + register_sidebar( array( + 'name' => __( 'First Footer Widget Area', 'twentyten' ), + 'id' => 'first-footer-widget-area', + 'description' => __( 'The first footer widget area', 'twentyten' ), + 'before_widget' => '
  • ', + 'after_widget' => '
  • ', + 'before_title' => '

    ', + 'after_title' => '

    ', + ) ); + + // Area 4, located in the footer. Empty by default. + register_sidebar( array( + 'name' => __( 'Second Footer Widget Area', 'twentyten' ), + 'id' => 'second-footer-widget-area', + 'description' => __( 'The second footer widget area', 'twentyten' ), + 'before_widget' => '
  • ', + 'after_widget' => '
  • ', + 'before_title' => '

    ', + 'after_title' => '

    ', + ) ); + + // Area 5, located in the footer. Empty by default. + register_sidebar( array( + 'name' => __( 'Third Footer Widget Area', 'twentyten' ), + 'id' => 'third-footer-widget-area', + 'description' => __( 'The third footer widget area', 'twentyten' ), + 'before_widget' => '
  • ', + 'after_widget' => '
  • ', + 'before_title' => '

    ', + 'after_title' => '

    ', + ) ); + + // Area 6, located in the footer. Empty by default. + register_sidebar( array( + 'name' => __( 'Fourth Footer Widget Area', 'twentyten' ), + 'id' => 'fourth-footer-widget-area', + 'description' => __( 'The fourth footer widget area', 'twentyten' ), + 'before_widget' => '
  • ', + 'after_widget' => '
  • ', + 'before_title' => '

    ', + 'after_title' => '

    ', + ) ); +} +/** Register sidebars by running twentyten_widgets_init() on the widgets_init hook. */ +add_action( 'widgets_init', 'twentyten_widgets_init' ); + +/** + * Removes the default styles that are packaged with the Recent Comments widget. + * + * To override this in a child theme, remove the filter and optionally add your own + * function tied to the widgets_init action hook. + * + * This function uses a filter (show_recent_comments_widget_style) new in WordPress 3.1 + * to remove the default style. Using Twenty Ten 1.2 in WordPress 3.0 will show the styles, + * but they won't have any effect on the widget in default Twenty Ten styling. + * + * @since Twenty Ten 1.0 + */ +function twentyten_remove_recent_comments_style() { + add_filter( 'show_recent_comments_widget_style', '__return_false' ); +} +add_action( 'widgets_init', 'twentyten_remove_recent_comments_style' ); + +if ( ! function_exists( 'twentyten_posted_on' ) ) : +/** + * Prints HTML with meta information for the current post-date/time and author. + * + * @since Twenty Ten 1.0 + */ +function twentyten_posted_on() { + printf( __( 'Posted on %2$s by %3$s', 'twentyten' ), + 'meta-prep meta-prep-author', + sprintf( '', + get_permalink(), + esc_attr( get_the_time() ), + get_the_date() + ), + sprintf( '%3$s', + get_author_posts_url( get_the_author_meta( 'ID' ) ), + sprintf( esc_attr__( 'View all posts by %s', 'twentyten' ), get_the_author() ), + get_the_author() + ) + ); +} +endif; + +if ( ! function_exists( 'twentyten_posted_in' ) ) : +/** + * Prints HTML with meta information for the current post (category, tags and permalink). + * + * @since Twenty Ten 1.0 + */ +function twentyten_posted_in() { + // Retrieves tag list of current post, separated by commas. + $tag_list = get_the_tag_list( '', ', ' ); + if ( $tag_list ) { + $posted_in = __( 'This entry was posted in %1$s and tagged %2$s. Bookmark the permalink.', 'twentyten' ); + } elseif ( is_object_in_taxonomy( get_post_type(), 'category' ) ) { + $posted_in = __( 'This entry was posted in %1$s. Bookmark the permalink.', 'twentyten' ); + } else { + $posted_in = __( 'Bookmark the permalink.', 'twentyten' ); + } + // Prints the string, replacing the placeholders. + printf( + $posted_in, + get_the_category_list( ', ' ), + $tag_list, + get_permalink(), + the_title_attribute( 'echo=0' ) + ); +} +endif; diff --git a/src/wp-content/themes/twentyten/header.php b/src/wp-content/themes/twentyten/header.php new file mode 100644 index 0000000..54971c9 --- /dev/null +++ b/src/wp-content/themes/twentyten/header.php @@ -0,0 +1,90 @@ + section and everything up till
    + * + * @package WordPress + * @subpackage Twenty_Ten + * @since Twenty Ten 1.0 + */ +?> +> + + +<?php + /* + * Print the <title> tag based on what is being viewed. + */ + global $page, $paged; + + wp_title( '|', true, 'right' ); + + // Add the blog name. + bloginfo( 'name' ); + + // Add the blog description for the home/front page. + $site_description = get_bloginfo( 'description', 'display' ); + if ( $site_description && ( is_home() || is_front_page() ) ) + echo " | $site_description"; + + // Add a page number if necessary: + if ( $paged >= 2 || $page >= 2 ) + echo ' | ' . sprintf( __( 'Page %s', 'twentyten' ), max( $paged, $page ) ); + + ?> + + + + + * tag of your theme, or you will break many plugins, which + * generally use this hook to add elements to such + * as styles, scripts, and meta tags. + */ + wp_head(); +?> + + +> +
    + + +
    diff --git a/src/wp-content/themes/twentyten/images/headers/berries-thumbnail.jpg b/src/wp-content/themes/twentyten/images/headers/berries-thumbnail.jpg new file mode 100644 index 0000000000000000000000000000000000000000..6e684f48b342b363654d66273e1810b302689bb6 GIT binary patch literal 5727 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 literal 0 HcmV?d00001 diff --git a/src/wp-content/themes/twentyten/images/headers/cherryblossoms-thumbnail.jpg b/src/wp-content/themes/twentyten/images/headers/cherryblossoms-thumbnail.jpg new file mode 100644 index 0000000000000000000000000000000000000000..710049a36e4c7af5634f849dc08b956d9857ad80 GIT binary patch literal 6542 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 OusH>1>h09OUHA_q9gPeC literal 0 HcmV?d00001 diff --git a/src/wp-content/themes/twentyten/images/headers/cherryblossoms.jpg b/src/wp-content/themes/twentyten/images/headers/cherryblossoms.jpg new file mode 100644 index 0000000000000000000000000000000000000000..56e9df0e2531986b1b72df20280fe5a966555e4e GIT binary patch literal 82037 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 X@=PYPf8;q|NA6~4%D(T2y;=G%Ks>`J literal 0 HcmV?d00001 diff --git a/src/wp-content/themes/twentyten/images/headers/concave.jpg b/src/wp-content/themes/twentyten/images/headers/concave.jpg new file mode 100644 index 0000000000000000000000000000000000000000..9970de267bec887f26d35aad2fda49aa156ca4a1 GIT binary patch literal 38532 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 Nd9{qq-SvF4|Jk}=xB378 literal 0 HcmV?d00001 diff --git a/src/wp-content/themes/twentyten/images/headers/fern-thumbnail.jpg b/src/wp-content/themes/twentyten/images/headers/fern-thumbnail.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c6113ab5b8f8c1335256517adc446c0bd72f9b6a GIT binary patch literal 5530 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 GXaCtdCWN&B literal 0 HcmV?d00001 diff --git a/src/wp-content/themes/twentyten/images/headers/inkwell-thumbnail.jpg b/src/wp-content/themes/twentyten/images/headers/inkwell-thumbnail.jpg new file mode 100644 index 0000000000000000000000000000000000000000..61e775ed620d6976f593bbdf248915d9b51d1546 GIT binary patch literal 4063 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 literal 0 HcmV?d00001 diff --git a/src/wp-content/themes/twentyten/images/headers/path-thumbnail.jpg b/src/wp-content/themes/twentyten/images/headers/path-thumbnail.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0585ec462db4509e4fa43240b1df2a591b41939b GIT binary patch literal 4560 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 Mu=DWeCuj5j1yEBx@Bjb+ literal 0 HcmV?d00001 diff --git a/src/wp-content/themes/twentyten/images/headers/path.jpg b/src/wp-content/themes/twentyten/images/headers/path.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d8694978864f13660982114378436732d9a725ab GIT binary patch literal 51727 zcmb4qQ;=oBw(Tz4wr$(CZFbpam%D84vTeJ|wr$(&etph+FXH~*x$+}d%!rKq88hd| zG4k))-#q}btfY)200aa80QvU;{%!)q0N`L?{~7-R0sT2$275_x}eN00a~q0ul=PUltbx0QN8W zKeGRlVE?jzHvsTpAOKKgFywy=JW#4AUnTI$gM+JSq33AVNk^tMgQrWx+3mFfO-o46 zPmn#>n;fPwbjrw0%mk*T)7S|$97~_=5@=Ye;RLNjyquiS%Aj?AX2hTpJ6!#48d4k| zfWJr4Z;4{X*KGtPhr#G4S438eR&yRl6ye@+^2j+PX4e(70AJ2r&9DO*O4*{5uOUnu zsKQGH0!v#FcX)K3uR$N-P>UELAr#57kd?Q`!$8}JlVGNlkV7q4L@}*{n@O6Do1x4> z7BNUyoa|$|9^FEGT28nUfC;5zb;ja0+g~?nHZdNNyk^3Ot_JAT0%(!b82J@yZJLd~ z^)oFT6%pieF%t=HuGff*8oVa4l?eP$#1xfbX;v|@npu|BOWBYY;ON-DaU+AN;}zfHD#-l5A22*r^J0DsY)x zJM?BYM{0>*>chlfm_6xyym}3@`XUMTx?^)uw9AWVjJRmxOv>d86HVna>cho!Eu+@R z+}N59*w!nUX}0jtV+xqDm=uZw=3XQE8{iej=zzz>pR`o?bQva?$?Oa03(3NfoiUqg zCNSFyV43-2!jZAqV~QfoQFF=UHbWYuu^gt;IF$>?rAMl;-8VWV9tP!*I9E#<@WeR@ zvPZ}zB>CjQmZ;qW5g9Qo17^rqkRW^<#5}wSm1_uh6;ugxD8ZC9B$&#PdfhLlLOOBO z!pak14o%5Vg}GQ#NbG}XG!eRX?$*gRTx94C%}q?aS(u}8bbLQ3P-C;k&-72FV=qnt zWE->A50eH7jo8qgI#Q5k1RB&G02NwiIE=YdEHv^N=4?xGh{B8q^N65Oc9nYe0&~@$ z&|E4&1)L$p2xi3@=#T`3kwX&O3@X!-=%{OMeS+WQSK-XF(gVt%UHo&oVkTsGtmlPY zV%f+$VAM(YB9hdUJoUx8uMw&fu+HAxIwiyf^5QOdDK)9{5B{%6rR-?k8z|yjPcvez zG(WXr+vB-7iam?>S!0pm+12N2W#uq0DBfpAGn5dO6X;S}(bftU6m4NKYj}_Z77v?H zBsNy@-I8Y*#=}`T(5D94Ntc#>H5Qa)igm$2(*E3lz!s6o0`@;#6kn&KJC0{au9y{G!$w(Xg%ro znq@F1mB`6`miy=*r!&cIhFoUeiBdQ5GOMg+qnj!RA&Uh)<|9NTz$xJ%oQ-*s{Xts_ z!VuI(zvTAI{5qAt9eyw(gUr;qR4rK5Xo$kv!Wl>^D2su3oZ;9JA0@z`^^e-*#$$R&MA;BxUKH z;IFXpp!potBB=f6*DAkzKwes93LiZB+bzxWElKw=R!yv{VLvgqVa< z-D6%q6iKN(fmV$-l@tY#tyRIg1riaZmd$?ylcBT3}{; z-Hsv4$6cB(pZu%hD~PX5%|Y<)^v65`@H@St%z*Jy>~*AzC%V(`Rp59bWO0UVl~(dQ+=?97sfl7mN^Ib`j4e%6tcW{$%bx z*7@Hf8hGWo-OUzy#FHNL?nrrkFpUHY+71%dMp)u+&uSG+*Wm@$22dQvTx&YE=M z5cbaTw-Ki+obGRux#@Z^6=vw4*xWSz;ikH-jBtwz3KCRgPmAJ}DkcNCof*rYVk)2r z6sl&fQwxASVpu0AbRMqFlq{bNy?t7f*Z12y5!Ds|HTXbzpY_d3f`LK7~8+Tn)+j zn-9D^RvyofwShx_a^Hbf^zm8`ffDEOW+DUkok9BoKhQ2++p6A~PZp=DKY~Vs+5sj%d^A9}b(_i;CkSNCa`YL>%!GK$#Hf!phWR{)NUd@w zq1Z(CK(miKM37f1AnV%00d_uOo=muKo|qvR^tU~d(B z=+?MWXT&byWDcKC49Exs^aS8MXL%6?ykSd`Ed6)dC>lm}y|CVk98He-1eLf>;P0P! zbh1UBdczU&h&rsz*3ym2jyq}mjI2+;DHkKo2z9oog7py$s63gIB3cdv+x9k(^DqO& zGDWH9bRGd`6^!=l>*78odvR{XA|88EaeT>&7`Or;J->cY2OZ7n)GN9tWLEc zrnfrI&iSVW{1m1J4GS8>eC=I6y+WhTo><#VvXxt^SG07stCw|D4ro_7Z8P-5M5xQa z8SZUE64zby#O+jaCx$62SFXDm>~bRy;qmuj;Gee`L~4XJOgtD=!xMl5P?7{xP_oOK z#t~MY*&m8-nMNX`StZuD_^V>0&X=dPMd!{VNPw5k?or3%S51F{t8|c_w)(u(XM$?g z{pZ%JfrC2tM7h+u6?G!2$1<78kM4Uf#_nm$kjjrur2&7l-&ecwSUF7dG~PEDvqlI0 zgq{KXU5?6EgX^74fTuvNx_Uu~S_5`lH5SU#58h{dpUdgO;hJizUfr1)0?GR~W8Noi zCq3!2(c#n_2TOFEx%Csfk~uI$U`;mum0{@e6ysExA(Ty8c)htV%MzydHG^!O12wol zYK+Kk6nM1;6t@0QH9n#fcV(9h)ekoldp&k8JzL zWfOVnWCg1*7BTZ*R8R#@Xri70PHrFcZ#*CVq0sIhk7X!o6`rxA&#y>|7kiDK^k_Lz5(3KA%W4rznXV6ngeb^RPL~l4K6`tZ-G` zHdZ+XzDNsA=`=o*Q;I&$BJ#$W{In%f3Wp=q9JU4BIhqnz+DJ{C1JwiZ%$CX|4E2iD z_Eb4mopu>&C3oui>JsIrg|%Y#T4?an5(|0)I2vO<3OK}AL* zfkY=|VHLq3BNxRaW}{%|5c|hBp#RYj5D3tw8DGiAW; zG2{SAc6V&+4*LgQ;G7#@wV+noqyK5-2wDRI4DgA_H<8DiQT{U||GfKg&YoX(%T9jB z5hS`JWo}_QmFc>eQ9WmeTLt`R0IUNRV|*n!$T?76rcv7!m8f11; zA4jf?iO>iD){&hB#Woc)$odavFr1FfJZw5kszaFV-jk#LuEB?pAt7pwe_iq?ytpwm zJ~;g%5T^Ie+e~%UD5KW|j{%mO`7N;S0EmalRMx;A#(Vc>=*tafMdrkc)Yfg+qD zwT8S1tQn?Tl9a>@_GlGhrJ(hXZC}b}>6e)wiV{%p<*qC`xdC3}oB5%I5R0Xy!`q0N z*y1C5mY_3W?a?8x(O8h`)>`i_ujZ5~VvCk?+jGZ(FEH{uoXv~BU(ZyG=5g@_esgHI z1VUYVQ_924gq{<1dfXB0uq7{D=og-_7oDFv5`D#{eTw5=PVk$`J@~t0e$v8Ky3_0yab#KyND@fm_C{hgp=XDFVAdm2yjV3 zsJUET11;;n02P{3ku$-z=+_rd0_ZKI^3s6zFL6T4t$lnLk+$5RP`bt|&dn5ykRzpC z5gL=;p{|>nHk>WIhnV594O9}o*>(eU1BYAfwcf39pr2CYkrD&vF*c#t5K*im#`r^C z0K5eF1D@+ov9U%~Lqs~JuT94fG_Git8V>4-14vnHyLE@wsslQbYsK-6gfu)ipbg=! zd0T_oT7ktAtjUhn4;=gcJQfpU3B6l`UOf|(x1<2FNo~?RSQ7|Bq+0#p+pg~?&Dg~& zl;%w@!NP0wE3cfg%x6J0@6rCBV)y5LBJDB5rFXyQM1NjsF0>G&zQ82{%^LTepwAq+~IZ+Q!T`WIkGssxBQ~c5v04@Tyn0CNr< zxfe3_Ft@ z|Cm<=Y#|FVyhhl^EnZ;${PmJ6EQc0#&9XRorAGxds__BR0> zL1e@)ynd5SCo+X0Cln9jDmj?7uc)8DrIP;O#$TG%?>Mh}PlQjFiy_68m8Onl+b`R7 zZVwjJD44ZkAXxn7Pd7^d+xDK|Xe?eg%Ztaoutl(_Il}qUNwl}e7??S9QOZ1-_(dxp zGy0nDbia-0mNk~nurB@ zO^J8)EaZ&$%-huH+1ZXPw0DNh!^cZw!EyE{SL6#!vk-1mQ@V-$zLU6t* z){(jc37M-kbB7CB$=OYna(TH52ZiF-H%!^`%%Q5w3s6g2kEpfMz%%pwURnN2kwepB zjgcLcl{E~`$d*R5^$y3tVxA6TrP(RXvp5LDPcSndT^qDwcWC!zm zkY_f)@TaIr;4cBF3@D|F?y941`L%(B+HEj=Mk-q@U4+)#;y@T~@Z?Al)HZq@4M(VULmeuxy+)ML?Q!+M`24X?ad!*fuqeHW( zi|ZFiu}_z;X+Gx-i@F!=!BGVc?!$QID`-VoO?z&!*AaWr*fHS!dGqFR^ODl5*rME< z8TRVGs$18r=f8VN(LY4M%ug2Nq-$5h$7qpJ)qg$dUn=0MYKs@+M1|IL3xbxAahTu& zzN2=+^X?ki1_txkmxz=bjij_h01oL;-)!CeU`jeXOzvSo;kCVg4b9WjZ9YVLw$@N} zNY|1CKYjxuu-t0+oOP@3$5p#9zZ+vozUW=OYtyhb+i5K5aZ))s=@l`I^ z=JujH@QUKE&nplzKoa{4Fd0EaO@j;UG(pq|YjA<3nK5_J${s!rR5EE+Y5!h&Lrm9;~9{ zL0J#`^~_uOf_;w9R++llC0e_qIA>>!3?i5{-I*~Th#2}8AWt?Om`JJfE)n^bz~>Pk zGb+0-iIR!UY1U?4;@%i16{v>nUV72zRf$NW!U?eF%=WwD;=8hyiVu-UIOqQS3qTT| zTA;rQge#AXE!$#YdGbpHUTnD!)FNg9M*qk>JoT)qEzm*fEOP!)BRH@TJv4M*kFD6u zS>JTXqC^Z()hIgF$qOl=G~_cmfamXgN(|r4yG4WJ+!n%69l+EB9yVQsA{NcHw>*z^c@M9Lict*1C2oVl6P#AnZE3I2Gk zKQoTJIJF$}8Fm1hQNBp*TAOWIBVp-*i@W{`*V`Jm|U-^)ok9lmX;{0Quf35=3@GMU;YVWJ4{ikdZ zldGD2A8*A=4sRu;J5ZPNFW^By^6%k$+kE84$UCjusJ?)>or?M zM%?H{Oa}e^b>fN9BbV}sP$!R*`R%!?$JEFU;LK}~300>>`~-&m^rS-X5z3ZyH=(aZ z?jlj-Z#6uaQ0^76xcmBCK^W~N<}k!9Y1C0QDeCD7t#^2OtxTECG1;z^_>!-#>5<8f z;*zM2(sGI<5-#dG=`|JUE>|?ek0eXAJwAzRHITtB>3O0Z&_>MUCPk+Yl)Ji(%;($}++!a?g;amKXe` zgiQeqKV&9b3D{^9v(ii~!TZN!^Ua!zq;<>gH;HT>c0I)_ziLvew+HL@?*m{2rlA8< zYG9Ay*6z`UuQ$wfFZ{dg!8Q`s?qQpaDaTvQoDDJ2q^was`E8AHdy&v`$88&0@X`aG z2@eK(R*{eCIhTff?fV8v&I<9-CZ<>$fA?2S`7JlN#J^(`_xLk+VX0YWlwdnMd5|zf z_*@}%4BIz+3sjj|r+vh$)u~T7HXtobF{l~(X|*k_l*X1_WVYy?_bA0hoZnX+uAW^9 z*A$r5l}nYl4d>=8+`G8g{vIrGyUTmk-WYl;vH#N#sw70Bo z5+M0*fqejdVcgXldHHb7_))lhVyN@Gh>7}Wmt8=Nber>5X~*m%kjBjFU5<8Si3L%x z%mQFp5)|dUN7d#(BY67u(%9A98iHPZB_F4K&%qyxgM)R%bIjG0YC4EAIf38{s2`Z+ zi{)z-A2UHHb8x=mV;D5k?QT+ZM#E2_rNsp5psvUmnnB*+i4hzNONuHvhN|qTd+>Fv zA1>X{FU*`OZNO$FjJlS!!6EH3lqRRp7QK_72L5@3hI5AGPB)9L89R*sQS!89xAg3Q zfvrRC#zGmabobuo)c;gEUVH@1!&(qRV9V;R^LRGpvp>)2YDuUn-tPT(`x)aeB;HM# zS7U+ubVX@oeX-e}mE4Ckl7>Cq~hL0tKA8;`{>;_5C+6z@hX zWNBBe=3)9zD%(Vx-14tIXTC}#Za5r&PCcPGuZ$Y;u3_L5-a^BUjPuU+2{dG_h;jYo zZt70_ef-6zL}#>{wGQz|zzwfpMOKRSpKOLN$uiqmwneJ&#HkIZ7bTUAvx@WR06FVM zt5+Zgf+u%2zAg9uW!k^OtGWF0@f`IL$!0}iWpMUKghCsugneJfqz;L|BAt_8uDboz z4o9%Ea)bB$wWodfC1*}d7rKdo+0!R-o=e_W19A3 z7zaoDT(QKqyk*<>%gjP&*cE${sUrVHNoa7l`6nwC(V2{eaeCv%p^n2Tc`Cz$vI+Tg zR8|eg)DJ1hTFqtQJP05dYzCafjnXYp@anEnbexAKqOI*IO&MljzQ!gS5%Zuy#9Aq%Tn$=U5z-(=)RZ1{i&_sq?}Y)6QTrbPRc zZ!>gF_tUyo|8r8jix1aaZf2K1l~H{yuuwBFdO0?>Cc)vQOzmBR=9Q zoDBi>QnUNWUkowZZ?jZ0`G(Gb=);x!HUIo)cM}A4tRV;AU9Ce8LClWNDDh_QHjArN zYnRS-bj#^gYeV_g`ylDNhd|UwBNa|W`O$t2Veyo$&8kyPWTpD(JFKTKbtA{+$aROW zoe6HWhbdu)eFp~bv5}QsG!H(I4z64`cw4#s_AzI=(7A?DqamyCVS*bW#@KT$O_?-4 zjl~3W7WA;s!!rpFdG?I0MStHaqO13o2WQ3;lhc92m54!y(Z|4^gzEKn`+B4$*V`(7 z6W!2YJw$PdKi`NS@}y6owsLcJ)pc_H)PH2S=&(Klz8RY;(DH|M1(t;$&6huW-`A~X zWs#dz*=!l>fVIy_J}Y}S+^}}m_jV7LQftcMb+dwyQWxyVNE2nZ0%^C6?PzK0t86R9 zvblyrE=&2W97mbIki6?@jiyH)9=D~+*i{`LP^@?5#B9ms`Qk!<3drhsetz}brsUGC z7TILJGa)8X8+Dwq#M2}-Sif1ckkk!68f~VgZOJ<6%yMvaUS0kclX}3G*8lLKA%O_0 zo_e6+=K~(VvD9r}V#Al>U!$kYx^BM2a~N%Bt07l#I%UxMH8atx8h6Bfj@d|sm8Z-) zz2XIoJaFFept3&&p-I}o< zO3DvVa9Y#R99U*cf@!SBc=r+J_c-%J$$T~T?t~G3vx-5Jew zDAW-B3&5r~I`H*e4yU7RL2FWpz8;5-0-GTQVm4u~YA?HUExG8`K6;-sh$#PBJH$V>$vQ|Ww3wN(PU$fW`x!WLu64Yw9g>cHg#B8+kTGw#-1J!r)DwN8 zZ))IKu^88@GCgd>y(?oaZAduQoWz{cA9kM@uh7zU4^hLPaoLhAYKhOWvp1t6)T^=J z(@Sw|8Q8+!F?pMqHw-kgwtmy-6iM-Xb+VXsfoIZ*XhK3k35BiUBgG9RjvO!J3O+&G zqQ5a?znzPF4bGW4_5|AUM>^b+GKuPhUu;*YF@@G~>tc>g>oK*7!HPOmI?TX=24XtF z@6Fp%y5g1Of=Ci_Hx<`3=peAORHnc(R}7Cn3xQ-wpKS}Eim56JV63L=#oZm*9h86f z+ts%>>Xm0@pJcExAYWW0{wu^bAJ3foY2g8_*_MlNBzKK&*NU;Kb0QyTk7h42zwLif=8?me4Z{l%#+*q z53Sg2>-@a_z}h4opkgaNu5uuO8p~o5zJ_{3rJlfG_suoWU1T6MJ*AGX_N|VMzCG-% zrw3fzKA|Akt$a#ZGo0ZhDG!E@@1A8&^+<MX_jCz`> zMKmkhoU66hg1KA=>tfDlQu>~azjDTqS16x4!34BnGH>})t`R^KRzkYb0^4H;p!ZsZvz-u?IJdU9_2|agEfnUTDYg+ocDZ_;V ze1w~`33+6&%?H~&&|Vpqw>|C;zBKp7W7-p+NUg3tmGKDVNcICUwlB57O8OG~ZSCt8 z#;LvAKNlc*7ekLm#pARQq-`N>uq6o#QCpaPWLJ%?iahIoMv1s68gJF$nf*U_#+IwF z`VEHq&Errm#cB5wm6)UMOF4;a!v{+M)OcP z5xN}FT^}h9XlcQ|SZo9gn>j4ttf_JO%yzU=%EQaQYF6vLi*kiZg;+`66+;jBYVAfx zNH%%4dD*Dpdt~=HMQIe&S+@?xXH~;j|HiQY0qz=uK00zh7)OGWH7Mrsj;rCpk{z}g1hywVJumT1S0Eha2rY;Z^P-GG?R2DR15mIIq6Jb;526R?Y z)u4jA{|YPrJYGT|SDHz7MLoXrS4;Qi#f7m&1RXC0@b30JZ0$%$1}TsI~B(Eb_3 z;vT}+(s{NoxIJu~TH&dgkT`M6Z`fp=b`#>C8VTE_lMUFNjb>Op*u#ECxksNwcCSi% z7+bn=GFQLbla$vkB+n03ji6-aA?~mrsL~}AxucaZ>la*-bh|N`>FF&|tJvsn+>D_+Ia;B2Ni@li6 zTQ$d3yl8Z1G?Rv&C>S&Z!6h#B!h8rQ(dKPEe-W1b1(4eOxn0|SpWe-TrJYQIkbT4b zXmQ0XHQulpV6UlqQVF-=f{dWBUD7{lS)j{ z2(E6-s<&=wUsf{3sNAcHraC9J{{2l}&QUp}gI6h_l!T+}oak!5RI5{?>Id`tyu!sz zW$s69u1p@-Xs`-e#8*oJVv6M0=wmHCE5`WbDbO`XCquWT-2**qf& z4%^Xq`C~K{cv&)7Wr~f4AcKT#k#(~hQ%KpJ7;Efb0C}kb_=53<*^zybTf&&Qf1=fu zw6xW5a_Pb?SBNcj!FUymkNUzd(uavHF9HTve*y6x`cQjbvjr)sE7`ilvL_x4v+|U$ zL|JC>2e*V}_PA0R`YK0rqP_lIH)IM5c0ZOy)uSY7Vz-2G>Z9d@r*6_xk{5Lw>P|Z) z3OP~|m{j;8Pz%3xmMKRR7>Y`wuSv6(Yd^ zp#N0J{{#pq3K%jf2{?-g8alBGDYFR~o3N=kF1B3- z(h=Rs>uN^7v>E*2xNCgwF=yAh>Mf6UaY3XC0jauin>ik-(?axiLhr5{9SoPWWMSbNzTT~K5GHL1GK{kk`lIkpWVg6?2 zHamJ%@H#feubu}G<6!O ze%~>efPa0#O!>%d8FerTf5^MB_Tb{AD`_0Ziv}eOh|_2Y0prbwTuPY{Nj^3Z%7Z9Q za85>1J3`X|FP&s7i(--18^-C-dyqs~#5fg7J=}59V_Af=X?f<*aAa`iT@z0aym4rD z;MI3PIhCvnp~t6c-uxzu3|!B^r1nN%WOKV=ZI5Mp6wOXgUQJ)`-p1N``jgpGM^*a8 zwwT!}8oC}2pL`^PA?h3Eq2t3Tahcdxlvjk`jh`ZiwMbL@5x7@gfL}QMyiR!RPeA`_ zep{zDBIz*Cw2!Z9IwA(o*D9&v-*Un0o}9R!t&k){;)tnVfeQ3L(0D_)O9Ss}Fq0~w z*xTf^&nTWNV`@S-@*s~wu70edAdyL2E+Q+!4@=O29G8{*ePI+t4V0i-v+JX8Hq3$5 ze7?kbXHO~+P=Wd#EZ;*J4@yos^s7)`5awYN!<>9UK*m2~JC;O(pjkYe1m4asSyWp0 z7&|xdhSlInA@N9zl!fRY{6&xfAYhiwHO}sfvj+8Zm1S znP?&eo2qF+13I%ya1#4(405sgeGXwW*O32vfPw%Zg+L$fk|^9Xg(2l@qb4A>Tty0} zaZ*(pxAM`F+$rBoQt7XBsyTzb*D>!7tmDv#3&X46;_=+I@m=(ZQ9+~s0@mdusl^gf z6$)81HG!6%2E37Td~TJ)5=a)aa_90>K7 znaZrnD@|K8k89*j@J%6-Lt5A%QFET_X3+l91VO%SeE%<7Mkac*a zpv=Z_%ThIbR-#H~<{+!18fMpR^9MU*#G`72jtURiDkCKn-@svB`!~;5EnzeelewbG zT)C{pKqGq7pjo$@%q__E5{O_p0N*i;Ag&SJ&&8 zE!g;z@}t7emuB=yGX-N&eCA-srwV`R;82wDpyeOWL{l!x%3eC98TCNP-RDWlzRcv! z7s6st2XU&aJpmetJ8eKlXO{yhPp614qQid+%*<-obrcC2uLOsqQDTfjKO*rik~n`{qonS08v zXfZ5yzEi7=OS>;Q1UFdKaHqDpi*qqiHr5uA&Ffdex#}F%)@r(-Pb3;Ia~tC?Izb;H zTYnC?9>w1Lg#NKCPt8d?N`aE)X}(+O%%4W$2mMUzdX}p$KGL0hz`P$8)@QIahHHgv zU-klvyRPd?H^Zp+;SHCuYRVs0fbX`2?>Hyk3C;|i-Qy%5oMjH8ll=!OGxWQxqO-up~bT;0U&00_iEFN_N zYcP}Cb!hmWq|ni5aZy8|_4WkOgR(or8XrL-(?!R7pE(cw~u zD7Mw%+cc_8svT-q8;9)QMXgz)Ik4a`jjNZ4=Yc6S60O2Cs-3lGgmTEsqCEOG#g2KD zIL+nCE~<|06E{7J;_DrBxs{(qZVtWgHob52dgCr!x?Dyc$YHP2TGK94(F|(QO}q}N z37X0nuX2rQ`D1h^%9kA@gQ2x34t}e`9p#X)p?FE*LG~)0#pHPS3DLE^T1#o+tqY1( zXn5@XQ-vqa?1*&QWP>bq6tY10C7$5|YzPw^G?Zyc=r0Lo%!Gxr;bqLeU@iCqIxxez zy?i_bP5N;hbYU~EaJ+4k`jm6!-O4G?lvA`{VLt_d1~JH6{NkPpW_R7}!2B1M=4(WF z@nuwY2zXR@l&fgnJrPM)t>EHTbI}RhlG=N+oJ8{4az_I6v$ERqv~|S*#i;cvMyndn zHlA%-IdVz8iTd7i)yCbSe@6gb%~w~&yyT^MgO$rRrZN!LME)ekyjgc$=7U7Asj$~K z!onil*j1%)fS$vUINFj+cs6U^L{r|w22px6MW@lxnP#S6fh~;Nob_nNt{sE<4{%7!I^PJOno%|Irp?UV*Ml9fXUg zQUM+TFqJ(KfFv3DyJqO1VabUDF>-+E$kwM+@cxn3qRAg+yw;{1hJ0c$vYk?)No6uC zb)B_D^3AOhD6sL#i0^R9sqM#1P`u3!B(U7)j!BJi*I5@)`*T5xB{8k*Y14O;Lpm{` z0OI3#~g?1 zykAOY-e6?{F-px>lI0{!PqX&$hL?F|Yr?5X^0+W-9R+*PlO`;Mq>%LV25pQN+FLS# zDFMqo=$?oRBo@Q)RvNKDiPBl#knljY!g7qqHn%x}r^)a@^UJQFUbWg#tvUonf57LJ zC;aKO|9bop7OQVs9$KjwPWyQY#sJnt3Bk_P-`H+v)@e?`dWXu=C~`a4xfvxI=R zbR@L$vhUwGAuxJTSX$ z$NYONMlieM`@X&|I_rGf4gsd{IL+64=?yA0I}N&(X1k=`d9lylwiu-18ro=FhZ+iX zK$t?LWQUk|?pj-fqf_7xxTJM9knyIFx~e;N`U_Zd+8lq4p|diH5fyS|K-Pu=s51N3 zb!rBtbSE*nNKpKBOqMQdd0q-N6GRz7UV8zEWw3RUZvi~L@h(|IwYNGIpCipyOQR`V-EoBMa5t+@|%HV_X~M>nEj+V=xoq37M!^H(DC~-`KQp;Llvy-g!T%N ztteFq6VKr4H|XU+KdVRU>5VRns!sbs5zIP zGs4tS{Q{`8!Dx-d5Tc^x+d604GQ^V61h=QjxWVv%?rEoFYxU;ngg!$ztI>+7S-i?I zTnF%}ZuK$lY1|S%2C@56DyKDN;g9mTxUou9=-xLQV!Yy(cu*fgW(K8lrzs{Gu+%UB zKkjI^Zr@Bo@Rd{2z{}#T#tG!3qpQ(k&Uf^6Bqt-|NUGOYi072>TRir7$sy<_7-8MT zU%`@hj2S?v;9QoY?Q4)a2#+hj2XjBylMgW39Cw$)T$gl;&or_t`K+=>TQ3P*ez9qx z9qp#ZBM|$(z^mVSba^wfMEkB)TtB<2zSjXVZ_%lk@$HM5c+BDG$LRiRG?yx7p9A+b ze!qkhA*?A-IsB)u7Og3Z4Wyt4WDp6I)1ffyVendQN*hoo!B3dS7$8K~voC%&*EukaevS*`8$^#EtcWU-f)m0g0uKTP`lOt`R4RlY?+P87aQ?$7g9mB9}eld*j zrKT*WQf;@1cd8aK3_GJ+D2uefE50daL6tmtQqX6LH?3sH0i0Cw`s2E8kvO|h2SZBv z*F$D=;;!>z6a0W9&@kCgybE=s%^PIH(!dk5@}_@wHVMNse;cy-F)3RkyR5H2cNn_P zJ^VvYtERBVhoKtxikMI0Px!At%dMSFH26$yk@@1VU3>x2R~NkuY?3K*;pu8$+An&R z%gP;BRov45Ox;B0+r6n!-NwIv7KL23jk3{}ueFkC)Va-|p3$~4{N$*C!fzt3Xfn&+ z-S5@H*2A-1D*2LhtN*IFbx!BrddJbTvdvMs5n|V|-=V-Z?09w-N;AF~ZDuGrV}gwE#&}dMM1d&-bLgsf1>b2;o0C zU|VH3H2W8TPO8&_%*Tk(viB!S!O85Q7B;WYbHFx&xvU?mnw~NIDeM86 zZQsaS{wcWk$>^c{9)xJ_r`)ZN$n!Sz+fmUV%1G=G--Ya-CQjJ zEb*wupuCK(FQY6Mt1;q5u|=dkAOPX%-gFrEC?^G7G*#v=fF%?J(tHZt7}%hCFmF#~ zW$jdvhMcLI;be;w5j`ocye?C^((f6Oq3CRFrVIZe>Ti(L7AD^bGaN4K9k7Fl!V)=A zqjil~7Pe*#lY*d7TKx$jX98J}ulH*=nnDocpRw>vbNf)uUe;}joq(~O(+8|ebH{oy zhG8;kW1GtswiJGQc!kbpAn+UyZ(<$9;*J($+r~7})+{gGG#W6KHm{xyzCvew&=yTq zd02tqE@F9-v3GZAj;4gpbHiN4uf}>2chTA@Z)Zvmw&}0$XqCj)xJdvpP&9>E4Isi; zD(YNc_h`&^dNxGcl?R-IV{2qs>Ynvpm*%1nhq!?;b5*!i_zuQ1fL3YNm?|n*)$g{l zbco4vRH6N(P0ayL-TWbpgI8}iKSOW1b|Fmit?T?&cIB6~;S3QuvRQ|)WE!7X77c$> z#E*IhTwoz1a|lO(+`2jSR-EBC)(u`Ym<`-ct0>)1k$=^&stg?7VA7T`VAR6ax9f;g zCsSBJeQ1?!i<$dYkLz?;o?Z0NE%adN5HnME{U~Iiz~Xxn-uHqKLXc|{tzU|_xXgf+ z6HDPKmZCr`*F}f@`3lReqyaI_pvV9S*WaXYK|TQChDyzfo}e5;v?`0vgudz0HNJ@d zZ3UGS=)d$9&RDr7qMbXX_*LR%j5(6j8gY#-b|-E+#*l6Iw5d>QG3a^RW#;V(ZTWuy z%s?~0MQu-Rl*vGyY8_Qzz%gMW>EYT`IV?6VzZZYOwlTvKqDVMTE?ucvgKcWC) z3>rA^G^y9{d{Gn4VyUzWj?)oSfv2%i;E~-5t)g8PEgGqH0@KS1gGN1+*mOe$L46k+ zfl-7+Xw?!!x*>yTcs&*t?I#KMLTlCbSFKcz>lg8%pnX%1@eVKj)rbKHIGE-X;<_2Q zYY4uaI1IqdEN*CkIjFE5l;dRgPzy@a{FR65vOh)3`&3zJzg4XEP!9@+WSlXW{Hqf& zFgH+F4-ovpS-E>IG4xU<${j0%B^vWm<0x@~(MO3PU0qn_ry8@=Ip76lh)kn9h<0UO z$;YnmQ3MtDj#j8{pK@Z$YQN4c39$zYBFBBzmc&3VCPV=6D}rmTSej6 z4@AKr3{FmPaRKqf7S?g%I9-dP=5S>&R@33rso=f#GnaJ0*)5xwFSM%+I9*d*)9|vS zVr)6W(zbcRF)#yoC1DN+6NC_{NdN(mRZCqX$kvR?r?a|*0NgnGFA1zJY~l?XEH54# zn~@@A4k3-dHcR06wLdGHD2=U-+1N4-)p$D|EH2gJR?AKGyh#P#`{_$u16bdCE+>6Z zA;Y*(O2+4iA5`*lCvz$^kU`Nhvo@FyY>P@@J4>1dd^xXOM-Hk-iqXq8G((?!mFYMj zF;!~^MBG*B$;=k4P{QOfHIvaxSPUWy0bde;AKI?a78^%6TqXE=6lc;oxXQIZ)o@Es zDPInw%eggik{o%XdjxK}BgsmTbI}s-`zfPUuoS+YF3wyui2l{D(Pn;&*B;8%Tl87e z{{R)~rsaAKUv>hpg`)KYG7BT!I`%oE4P8*E@(U&G8!Z0-Me8fopGBSbX1Lf9JB~S5A4EuOz{xoETSJ|hs$H6( z_J-keK3^`%2(wF?wvs6f1ZUMy;};UPrhVhE+nS^#Pa=hZlXzQu$uG6Yv|Vij0dc@? zM5?WOP2Dnxrtn}%(N_a1kCV+lgK=VzSx=cjx|SFiV$z%ZO+ejn`VMYJn8+u^0{4u# zGhYW|IJBIUHLq_l8l;xu9SzsrtF}At!%CrOC}XDAvM+#KuUQ0Vh-A37ia2>78HK@1 z!$2Q2tA3YXbB`BAJZ*O%gjcNI#c*wg`nf!fp|3oMQ0CMA<@b9!`>GBnk|Fc~Jrp{N zKwLX8P*_B)V7;fZBtH>c`ym)XTt-w|*;>npM|C1Ts{R*sog%#>*~`%X0PJoMUYouSE7mG5ONC+5)3G8mFdGGeUb5Gp6YRX6*f}b(8U3$ zjC?_GzI!Vb#R|c2n=Hil-KzBzbCuts-~}QNxeqb_1-X%JXI=?cjIo0I9 zg^eCoxMmEdKAlm<&~7FaS;&(BEXl?4s1T2dRhH8<@kB7VWr(NMs%7raeJWU+je;<% z;kUAw1N*F<$NuXX4Kj#6lgKPiYcPSDmbt=Kbuo1a9~iXr!)3rWchBTU_>F~xb80{G z)kO1GbymBhPzgW(P)#SQTRX(iZDx$GzCU87xgOu&^aM^g?xhGCOWK>GQTws4kMzps|8@V zg2`+3TCB?Zz@rdWA!fB%tkmkIg6BCZ@0dp&5PK(KnrzhOxOlyg#^M0cVl+!>&V1F6 z)dDQOE85rV!;&#jFI<7lLcI4=78H$#4Vo+>V?1f5BEpXKcs>dEq)kS7fJme{E289?JLCFAE z(f;bx*jv$Bm}F@xO*)S0HbWIQj{2x`K%FH9_;LnFwbLa=17!{+y;d3(>XD+8S;M(p zJ6{k{jzP%Hk*6ZxnP7e|st1b-mp#+ernFTeMXzPUw3!DbXJU8ssSRNMn;>g(bOmB& zFnKGMnO%A-z*fT?iVm@Ej3s36XDj0OR3ccb$l>Tjn7XL!*UIKUlNHq|6MNLQyV9aVsmGFU!tjaY-2Z;;Jm zb>TX52$witHCCMqxVP2kr(K?=8A78VJbIc=O6*~0e3mA*dn?8x$v~Gzr9+-iO%q6- z>P%n@LeyPO2Sp-rbXH+>^p!8!9$DE**&Z#KYK$Z|`c#)3N1{Ac9PY`nQlKA(GFU^4 zqnfZM*;ZA~lR>U8`A5pJY}COSo@i4PTv+RpG*z7DxKzo5pStkN14D1eWHG(Pr;}C+ zY^id&B<#6Ln2#+L%s60E3$kJd<%2z0LsfXqf7dTzahd zxdrNMpO#aw$d6NUO%5P1>a#J(g)9$zbcEJB$DHnrzf7TgAY5~^Rq3_PcQKOjeibv9 zswG2e9_tM{n6R%%;%I2+ zn(*_3Ha9`nry3nooHB)SR}82kc|x_20oZ$@8V7U%aRu3cnE*ecmryq9v0)(f-ICR6 zx%;fj;c;2hC3-GImsP0FXoE;h_$zVL?wW6g13Ed5iRU~Q5XlH-<$m;A%! zQ8|fBcmPR+TtLr6$AgCV3T=g_>ZF`N=&|L|0g0rYVIB%(eqkxh!X?+l0+4uNM*S5x zHPMSi8urqd%r@xpTTp;-8RsdtGQ+BC-GR*I8Lk?1x)Y*VWY?=C4pJSb}|9 zVQz}fh3hHJ4@69-Vy4@OSZ2rq-+4m`E$p!tgEm>FnXv{x|dWgZzOG+V`R&@_AS7n$lB8 zHDJI0!~iA`0RRF50s;a80s{d6000000RRypF+ovbae;|)6_doMQS+ns}&;t%$FvWV>WO(uyo` zrQRMR)(!svqz3X$upEyh)W&95(Uj_0<0@bx;czb)ujUbt$r!RFNVr4H!bPdPcUJ&w za(Hx1%2?=*)Ew(>i-iiV(JadsicIBs=45PwZBR9_?f~D$qFASt@zfz`Ok?#6D7+^D z@CW8#TxXYK;%vfa5o+(^S=1L*9uJv^xMOp6%Dqe!%sH^QKVveM2a_`yT4Jss7)(@b zZ`{hR{Ik4$B^QsxwxJrV!zR8iRpBx+{mcat26x&TXED^FiqK#u5i-UT3eH^1My+Rn zqFAlpxTKNpc3p8X{{S5q3()uxsnKt8iz6^*x{E@*m3|^^>DAP^wHy$NJl5M4SMEl} z*Oan>I3KtY#2m7MJ6`5!bH|BDt-o;nq4f$$%G>_{9^#)aq9Ki$fS?Qr?~BJ#3ej5p zM6Bwt7Xxe{om%r6&F;BxMl&vflEB1C$t<^WjA#xJ3_z@d?fxe=T{cB~fsGYg|^$xbJ-9rFkjPQCGvY1WyCb3BcEHV-n|%CA zBALRcFtywbf5td$z*4fWu`Fgv6;Wz=+_-dRC{gg`nOmPG>R_q=0CJYB>aP(?Kr@FE z06c-6=ML&1NU_{Ka~>R+S0uor48l2%VKf~AJ9jL=!-iJnotE(}V6Ew!7M=*o;1Vih z%j!{6{xLEH=)h=ZH7^GB<}#YIZXs$;Tui+pw#>xBY*cyXbC-oJk%$c%jVt}n?m;ua*NvyXEpKI&17 z#T4815q>npCkcorrlV^gsh;K#rA(Q^{{YlX9+CV;I+1_&GO!xKT}P>maVa?zAI!Aw z^(Abf0ID3N?tQCs0)4Q? z+h_Zi7MRXrQQB?`N7#NKeQOKud`k}ks(^66q4ISC zc0q}NrGZ=bP)b(vQ)_H!mfdXTU%ATzX?ZY(!^4Y}6+*Xo^Dv{z0J=_y;FmEld`&IF zYQm{w?mJOYFFEMuU|T5E!7gFqh-IG1q9$_7{l|lEsBSq0bHvKcda21x!w181p*f1L znRV~Du!|k{?U9Tuii`hR;tiwJY%oAC@L8huc!|FH!cgoO2olSD58~LV1?| z0L&i&s7&hhh-W5Z8(~Ls!XS7PPH<*nFcT$Z<1-j=#W3DA3uG<-02pxw>M|_yRKb_% zgGZrF{6UH90GDg#+|W#G8i38Hv+^1qVtT0*n*k3gRgU%bL;R*D7~CT2IlC| z#G=FHGTG%&64p4x)*>?5{{TW;ZJ9!r z+fZZy8yw1KXWm~i94__!z{cd);%4FgCDvBriEeE+sxVQ%Cvc+L>k|}Q#wu(j3Jdoy zVJ%AM8atkLC(jc36soN~#K}Th&U*C9MS7q-K4BPIs?WF-y9I_|09Car-!MazTIrWk z9*?}r!-xX|)IuMl`I{Vl0%Er$7LcN_d5Q;>FOMBP^yCqIb|)Q4uVw3QaGeM%t3gK<`mqxcj5>BQ$YEEjf{QJxJ|)1!RA8rbe9g?D zKk`>m?3$@yC_8?oQO&$ep}dT+>w0v=4>?Wk;sS~XM99ECCPDHDD1Jxk4yfe(`;5cH zO&oUKSGW#VKYYL+Kue;Ex{n~9W=G&uv!KfjN<}t)Qv$a)q{i@Rm@KmhFE`9Vl&ca^ z=OqxDLfv_Z)zsS%wXC9Q+u7z(#1-1UBfVE7zN)OTh+XF*+!eJ4CT1?0al#RH=%zkp z-sO%w(R5+tYYYxFM90~?O8aQP+!^yzg1ms<+IF@>9w9gF9-D2i_1&r*$2UEEu* zFiLL2PWU;D+Lo92i7K-Td}eHWpi7{S8Bn82i&fRKysOjKxRoxzsIbxQHNcpz5CG9u zzcIkK#LK$nQ$SIuWaWKhGh=R{hgi%9Ks`q5F6sVY(6#;@N)HJ^hV?K_xs=dB`Fn{0 zeo@7xEya1Jg-~%Q!F@p3xY?P!<|XoqB8Wh0Uah~0t(k$z>R8*^7dynrra1QvJ`K)_ z>ba82mLQYRm6tD5Ef>=T;x=gmT5Gv=7+`U4)l05r*LmU@9Ofj;J905mWvHF6F~RZ+^W)= z9AzB(l_Q7*snG7D^7VU}1f_5-wpTEQ23}=_)NzQ31Y05f%4j?xC^e5svW$jcEyHKx zVLqnimkrK4ZWwYLtjxGmK}dgb zAS|?8dLV0fD4Z=gQqu=%v)oFJ!qxgbvlJNU&$)ADkUBbMPKIiLtprQ9dw-c^Dy`}d5?Sp9CcaX|Bz|~C;N0{cr4F>P*Qm_1scEm6FxGs) zMMiF{m@2==U2GN1RGkS*6a+p~uJ^f65#ms%7;5E3oJ9b*-DYG@p)h3lE0}Ucv%+mW z%%vs3IZaj=TG#g~@Kmzo&W5Fxx|WtMZQdPAJDImB?hv$3xG7zE#I=X;CG|P(6)e|@ z!@}xW0iEt$atYs4bS|`frHx>9=4SzY+h?U<<^G7&Am;96`XDSllt8e1pV3_Z07c6> zd`gIV+)k|=0RsuRI(510h*No&A=59O<#&i%Zsq}v@uv6fDIS3~hucxAkUnM=-4hIM zWf~B@H#ja7wagQLg-sh~vHlHWae4Ianhs-!)+1E+7hS^y_W<97UmplqR!Z3G{lG?M z67syj&@=@ag3?@Q<}eh6cfcX{Y#j4ZSqp-)!c4@@J&@VO^KZ-*Zi1M(Oa`La=Jvo^czTu^1&7Sh-1D#$(&Bc=B+FG<^%%FVCH5hVypqG6hBWJn)05J@Wt{iT1r1q3T zyv^>Vn0*q9Gdzh!WT>wyV8Rv_Yt%*u_b@`~5D)k{o4iC1nrKwqz#IHbGaYUTkX$0L zFx0ZJt|fnxa!t6QSeXm6pm8{-gr|n!FV!ktk+>jt>HC~SA^^K9++1OS=7C_B%&tc* z#ujplaDB&$?roEECHWIUVCHihYATm?h}Y)rYU&(6MI4Vf|lmbfzApzlmPf(x@=#x6pfzJ%AM-r!b@Sc1K}J5Eb3%%-9e>a zJ|-1g*wkg#4rWCqc$8o|_c@0FYE?3+L0oqP=C4r2Q!eq3GN&cD#2KHqVgbB?`Kf{D zm&!vaN-e*C<6%PRidJUcXUq%4 z4UmS_iGnGO&&*95^zkq%qQ900YdnS$t4pHt{Y2lb#s1VI3m?4V$mKG$wOxLOCg4-;m#s2_-u|H5Wdd#o^ zl!4^30$TS{j9tcMy1FrmpRhIjMAN-JlEwx*h}G*8p#Z(SUCpKND2l7t5K(zWIBmIt z4NU6@pMF@x+GZ;NIt|T&z9VvP;&M0C+QY5Q0gu4}33whVV;#g{(3vZWIgAa|045O- zueiH0ya|(TUSJHHGDJd1MgTa>S;I$AqVVy#z^Di9mH}nyM6dwcb5@KJ z%QEo*gX+0w=}w;Dg0BI7(&OzgAi7ZT+$wq*IS^QV1%Rzo!90}LX=;VbT=q(8pMhxl zm_v7#G07ec?KJ@SD-d-9rI-Sep5ga6ABoUHwZzp%9HH%)B8(!KnMO~{(bn--61zTA58YI0xzJS4t@?|1VH#^C^(^b$ z(cwQOHz*1|vjK?b%($Rpzof}?e&8cyBNuhd3Je=%oHy=XQ!@bp#t)cp1n@ID&*CFR z?1FMfN)X%B;78QK!5E6)nV6-hIF@5?I)e)EX>x@QMk?+oa1S1e<%%T^>lG_D7%ZQe zb0(Iq&aQ93H)nc`=i7+yp8nzaIrw7qraW-PIHF`C>j7sS3|d=Hp- zQo3LFDjG5`5K&?t-XakUVdi-kp}thXVHZquD&-t=+)BECv^KI$FT_Fe4{}W9(ajK> z032sBusx#nEY@iP@%u`rZm9+QSSOu@r#MCi*fuaveP7>SZt_cG)>+zEw!%VoA9 zzl zJ4B+G?2HzwgE?_B@9tg9&9cf5=w>wQw*LS!m3jms6YLw5EE9=JA8-;SZ6+Q0YFz$T znNoVOf>xn1F)scIPMd1i6G8N&5b9<0SE*5_UZ*vV8i?C7BE`caA=FKDM09$YaG6xU zOh*&b@hH<(>SxTjP1VaB#i*Rh2paft04T4hs;RqzeZX?XM-(?<^`lICEs=Ala`|L@jp~Up^U-o8~?#es?oU7r$$^qXLDd zbm}IfrPvV9<~CP(|1DNN=54IE$812_&P%nP~D*u{|*Zlznh)WMUhX)+$9C6AoTpx`a{{> zV1Zk@X)RwK3B&-XJ_%Twt_Dqm-wi9Stx%dAjIo{w}n8O%7zAo%(-3I z(BXbu72!ZM8*`wGV9Z0)YW`Ff>d7?Sk(FblQZb)1GLDkq=XW zV3lL03Y0DaU8~Hb10WnqWo+~Ul(U(@sG5u{SSYQ+Q9DM-P8h18YU*18=KMcVS|DBh zPh=OFM-#-#IE%~T8csMz-Nr-o#1={9m_yqWd4^5IV$>y*UXeefQ)j4^B_n z71c~;L84e=qY*A6W+vOrP=L+xGg+9q9u{t}! z^*KW8>?O7LK`inHa!&*RAN4_Xl)K!!8l4_u$ZpPgq{=Hd8GtblDvu|wrBAm@7_|1% zz!v&Hn1fg7g?%J{5{aBbU)4gV=cu4|RIqn!`TbG+%qIj9O5KFidIjJcJH%VU9wS$Y z)Al76NMm8{=1rsuCmG&%A52Fr)=75*EX*S#lV7wYKWGbCY3c*(mc3LVJb>ZEMRLH_ba?J%j9Khrh>h!sd^uy2DBAYGZkLB- zc~-15H@Ebl-+m}Ez9t(7g92Lr5cQsm|O0^x>3j*PpDN0lDktP_lx0pzvfT^U}- znX`$`VU$ZSu*(waYSw6c#pRxb^2|w4I>O$2hLs(&0r{45vJ`WuWkl;wujX%PWqvW9 zu_yO3d2;pGB!{ggK_zt*_-QEMLq;6it&wSH!wF$yqA0K~~PH zPt?e12H8<#`m6pBn3nJ5XC`~~FgkI1US7kTm zRcdTh=3Uk!rCco=N;RVCI-U}0P;|)wSaGk9e=vXGx03`54d+swo4ra@-p4QZDA-*o za{mBx2+5gng4(z+`fGvbnW^oJHJBo@N<9Qc&0YludY-Xtrq<`dKr8D|T1({{Cb|8X zl~$#1CC|hQZ{Yr5$eN0Uv29I-9_h&h&03CTF#tOsC`krQcJ5zw%u|EM&f*PJGRz5) zl&ad*GnX+As=!f#RT#)PJPzQ}%Br{*05rNka5QeZ4dxtk)ZQ9^qR|S*#2dUn<41vA zH7j3y%%y!!?}LkfGSFq!;Z*03Q6aGLOO_!!Oe$93x2_ZYL7tEJIhRtcSw0S9R2J_l z^)6$BGqFB$L6jZXXQEvq{l1`_+`5*eB97llFy&dz7p^{{RAC*J6|&=3mO6ab#$T`7tg5)eHq^jVOyG zzC^HB(Nf*B+Y;Zn0Wb|u2%53*rYnF4@*q4v6PMaiofFhmJ@iB{z(0fv!2R6cd}u{{ z*z#iPyLC7eHjJ{WXuG)X=9PO`z?}h|9w0{m(KjqHq-W015MTIW4qmjmpgmMxPFb8- z<@qJAq`*v+Tfo4K@8Vef2%UPQxn9|fFmy3iE?_uMY~7i1-83dVCF)z$tZP_<`Gv~n zIg6avXjBxOHva%<3)C!6WVR}FuJ<=X)OComlrTs(bnYcL4UJ-0Y&|iS3V>*p-x9_H zhPyzV6$=!S*>OiuW>8?vHb30J?c|~y{Y$i00KW)U0aEriuf)Nsq-*C)v$@AYzG9hZ zqXuJ!RdM0O0;eKhXs?!CLeW}kP#_l0HJ?+GffaSU)W|z4D5rn!TYaaZt()&{U2DJz1}bf3fuSxTV*_(vGo z{KZgC2n`fr0Rv54X1@Ya0Kim)AF|<7A&Wpw`T|%Y_NJRN zwEKQw1+K<%_VTAvlOeH0{{T@j;j%w0@?lYgdn^6KSnH?~Ukgvfv*CkF`G|P4D;>Z+ zRA6}M8J^p~{Yr2`(m9uGahX)u_OoPdP7K5u)k(UF7>?-u^9HWoLQQeHU_clI&Gd+W zVh@tNq79!6p&Vf2a4h}=S%?5hgM?R!a~?pb^sq4iM48SHh-L;HrVygPKiLFc+YwZc z#$aaU=2`j_sAKTcR0r9CAohwxE|0sMB7Dq(#ak=Gb1`?s1>XS{ypy<)!`26yVwfQ0 z#O7X-n$oH{e~5uZ=G;l44|2;UY@PNzOCLvT2QSpgnyJDBydoXq2N`m`LStA(<^Wd# z$#FRd4HR0?OA*Gq&f`D?5gWY+5|dbhQ?ER+RnVoo0hE9N!GySLv_`|LGEX=A6{aRv6JA$kVkd57@N*GH5VrW$%0Kh`EyUadM8Zo&99P6)!gcq|4pP_2 zb;~gxR+c?M?LDFQ7gCL3S-*b1W)bG%Uh^o3*jw!?x`u92&ITcYm#6weEu#r?%v$qL z)HmD-{{R?{ve)I7_b-Ypsi{Cb-uiP0PG!pgT-_8RA-#-0DNIr6)U$db=gYVWWvdEG zKbgOytHn&L&!P}02AQIweub!2{6i6B5#pk~9*M`2+~?*7gKaE}%t@-eZ(frbYXMvidWurXE^Yl4IW@v zufZ>WMFnr?fNcCv^#-4$5j*&hzqCplKN8n@eALRWtv0LTr|fbcJ8icUBu*|2XcrfP zBL^53`VZzmr^{FSK;V8>^BT~-=@BaMQs)SLrfKg`&*rxj<%ecv-n=v5_;d9dpSn~V zeN?A8ImFIh-;|<~j_M$E?I<>1Nl$4nM!!&6AGTl&TQ2#UR&|&;`wYbVixT1%wuKpd zv~T#77kxaD%*zqQM0-pVF#u5u?^1;r7P@ZX4uwHfneI{t10K*U45>WD8sH3e936rD z;s6}W3h#+vWqL0jAjfRgZySR>GjaBmNEbrOV{go(L^v!%e~8z$Xt!|rf{MhIud{Ir zlNEDUiPRO%!xIu}{4z`DoX0S)&?tRM+qquHaL0j8Z;AE|iEnsF|C;;H@50~$~6QZ+gssER4cYF06 zJoa3tZCQf@0=NRD7C;$o{KoVK*kyNhNp&pU=I3>mcoQNZ^O;VYYY zeL0%L^q1!!Hxi0=#8X${MocAFJC}N5!Nb9Jz})Xj8pR;vXxSB@YF_ z!Cox!Z2AD1g3i#FU|M5Dk&xm+dM{PPcd4nT5R4EjPU~CDvf&LHQPfS+$``XxDKaw; z7cebB9l7ckDK}$YFSr*lb(eFQQa4Xb1Qo6e9&*Ib8vg(z{{SWP{{S2gWdbLE=$AjC zEA)%32wjeG0bUmYZrYi-zwmEl8i}c3-%~h&bQ$@T4IMsW@Ru3PT5F1?yu@-HI3V!p zO@;L~L55$b*jH&H_?nqNXUea25UIsh#kEd@AN@)hTP&(yi0eVp-w=DemVV&S@fK_1 zc_D&t)Ud9hhNAr}hx53Q=8g}`F!`7O1E_#c#Zf=vfZV`)jD~y}mOX8T2|+@O7k|XC zHmeN2lAY^=dHR-Oqjm%4;8zT~G(}$BgKzf3T9)&?d_l=_D+I>3s42n#f6`DQWOnb|$qeuR08vcT z?NWmD&D~2nj@({7#2q2ZKz8dHWA&O`;FI34A z5*E?TODfaB;-V7v>+1M`++3EfES}k$Pnd`@P16#tJE^E(&MyhUfR1H+1}hiR156zs zI+@=KtaxG&BMWW`WL7PxP~gm3^i9#F@bi6%#lM37Q7jPNf`7}$nSYO#Q8sd_hOCz% zh=)yqO7lKS{uHN9p#bx+;TBy87c5PXu^?{2`i-!hDoY;nEW=ya-9NGcLOd8g*_J(Y z`CQkxbw4l{E3s$#myR=fn=$Zy<#(HLXtoOEuHu(J-U!~`R2Q{f24TzL5ZQzlmVqRd0x%Q<|wnS@}a#>6hvWn9Q&({jPS>)fsp zU6z!Zfx$DwYnQr=cI`KQW=*P>n5&QF&EE*}v|88ZP!Yk2fCgB9*@6A=*9XM2iJoCj zdztkpyO%u0v<`o$9`^74u+P6iB}v6gX5qT>K43afTAGMhCMjOG5o7WMOo~}huQN5r z)e@jgf^@NFr-R7>tnik(TIHl`xKbDRa+XfYQo$2fnk?V-E-p3Em)@X7yobVLoS|C8 zThSL{`jk7S%VT2g*dd1n=ELtprofvTJbs`tZ+OSSAN?nyK+Ql|vB1ZluazZda&izmhyV${E0ihNYfCWf+d%%KL$UO@h1(*1U9laXT{AKZ%Ra8b4CmtL_!i z7=L8TgarNwko*aaS@x7GLG=3;QGbsdf5jVB%lrc0;L9*4gXVN8@ib8JnAw}d{j&=L z1-p;tRaR6${K{JaJNBf&qYs!Qao&ac`)Lx4mZ&KBchj^|`RfJX34Z=+aEXdO#NAaKVS zqjb0mwcsOZV&ELFga^;44rLUqt>$b;2IeV~In%Rhyu)5KBSuq-VW}Hn*=A}Oc^m*I zV31!0&w&K9+zJbT)9xXd;WO>jsZ~aXJlimYK+n9ufYTSSj%6XzY4W|>;vni{RqzVQfI_Z#aV+Y5A>7(nX^csHO33PsF!{1GCHxZfFP1OPV`c z75ad$LeTs}_mi9#*z+tPwtRd{v!j9T<&i;ZwIAFWXog zkQ6k?ivwQMDU*B{FHRK#pKyiR7CzlL>v=tVSumtMf9MM-9tueK~$2b#@WN zMMsXeGXp$gVjX&K=>YvKA8e=XRX(w{E=O}LeK7q%8DXTTI8bm#jE?G$EfU$luK}JKtE-uTc&OED?_c8Xy8azuk z#P)x|VJWX^J+84Hl?M(J4J(*1yN__p_>mgSH7WqU(#d!@M^$~K%}hWcF5x}-9M5pH zi~!dSA zsH5Ae`NRRUSWrY1q7>@25Rf-AxnZZZbVry4UdjsF#H9doQTc$8ku@i|TYQqT^TCnN z?pV5ISC~O|dmJU=$8{^#j?r2}AS@EjhF)=mb^>xZm$7cx$HXwj?^Oj?oG>aW(0aaQ zQBjp(jBF=}8o{cTT(}LhnUF)os=r9$U~E?7vvs8va=5WH)7%12Iyi;Mx0orRF^;$j zfy&Kl<$;i#N{9vF!4O&}7L3liX8SO#yFu4lk$AO*>k<@tnL@jz_c z14M2J?qEe)xOScbW?)gA-g3%qY~0W`AppZi3k?Hn*5x1{DN5_!OR#&B7^kGpgKOq) znatD#wuqRJX~eBtlNBhnL#u{;4;a*;Nu<|%p^VLf3vm|#+2$|?ubKba01N{G00IC5 z0000GfBX57Z_V*nLyV&A+|Xi1sRapD6+=@X8w`3-8~bF+&BSjmFOxJ(^uX@F{{Vr* zS~iV1L;9DO=Xi*yy8>jr*1=OG*P6E-c-u|&2)R$6eqtz{?K=F0;SAQHNRiLL(||kb zeROEBgj~AJ08?V1?@<61)1@$30{JSUSxU^FEw;R!x%D9e#ap-rzzwK@;UvNCnQG9K z6^v3vMu^-*POOfto{uGiB1<}URyA!YTX?g72%>$V=72d&8khocnC}%ea0oneid*A-crmk&`c6pScN(L05mTho3h}w zv41duMuMRn#yy4F{e||)#gS5I84r1Q^8{qqofR|5+ z(HV8=1Q~fukXS%Y*+maPp0sOkv-~4JbY189nkW2CZRa=lP}yxE96XEBST*38$E4ae z#1U{*?0qsH%*lzMIT4tTjQx~0j#>*-!FgwrQR|F{gl?X|g?vy@3T_z3h<-|+sV;`!i!xfa7u&HS~<( zDVr}jBeKTV!)f2ca_(Gh--E$zoNc`P9Nun-wGAVVNEuh)Q($_YUe+gZ?S*$?upBeyo-On) z<>xHkz79_8;y^Mxz1ZcJ0b^zw${FPt<&2E(9^rRlHW4F+$4uhj*miN^>B2q+dQKgY zrNZr``m&x`#n|g(pBC>D=Ws%9%R0SR&*9AG$T`LbJ|=zucrcFSMRg$q@>ukBZoJ8U zQ)xUw?P434xv>Uob7Z-UhcSZ33C^A+INLelvid?!VeuX_ zj;%^CEl)d#af3^Pa<;=M>gmjSvaA>eEX-h;KJyvz)2Ub|c30Kd*hd~G)qQM(uI1*{ zCt6QZcvvDHE@CeAc{Y43jNygm$NvCq%umnwvS{6h-diUH%MSSYpV;)DbNeXdPIYMa z_`SD2U+#Y#k?8%v!%kp0Kah8bImu~m9sCU*CEItqcZ-4yFtgewK9;>C$iaIABbkO_ z_OK@oq}!;=E$4}2J={kZpJ+p!g$oUD(LZuaVMEDi@Ap5FLr=Yb#z#W@zf1_=ne6`n zmg3z$!}n}*53lhHHRb;Rds__`-}oe=cjo{sfb;pE$PL5${#fq;`H}wsTRFHqzjntP z4vry<^0f7cV7A{0GYlPTWT$%ZEN3PfdqNtIw@cSgnAj_yL z_hlvb^_~#s2p*y`k36Jfg}egZgpJoe@nsh6kbi9WlJebUqqPa}Er?b@lb+??akqkf z?o$tx2a?hM0GK@=wBlwz_ttaR=l%1u9oN?xim~EyB;<#-LhmfM*3~(KShtYL3^!qB zZxVNi>ho^!F9gS%4tb3=9#+R0axNiq2_NWMIAPA_35X>0vq8Aq2p>d?#FEL6v`7O8 zeC|j>bCU8aPbb^_#A=&5ImzoExRAUAd54vcn%q2pWF8|7T1f5sNbUGfZXciIr?=kl zlkYomv!|xM9zKY4*Ps_>B3d`H`9v>#%+WwBg^ZW5Ph4!|XucPo$aO(qjkh zC}MME%FBE%6A3m?Qp46e&7Zx!!hbBDJt(i?{EuJI=4-1al{LPdyh8k zkpjd{l3paxfE-PhIF%iMaQJh1gz(io$Go0o$jhaxhD?>fS+L^inU9;FQ}^RMcXbShtAm?< zts&Vg0H{D$zZ>&pSz+9Hf*~dn<1*K{<;xzHgP!brB=*|d^9j}YwS(q(wQYL0!uWWc zxtGdmBq0)YCpg3oA!nPXh<19AA?N)ggadpD$BUu?W!H1fj-WFLaRG)phLRD(xY*6V z5bMOd$DTK0_mJTU?j7pc3FEH|F1haSg3KdA#P@K8oPZd3dyA-(JGx^bE%iB${ z@TTBF_W|wzusV^3VdG{ImN%Kf77&8<6{`jVG>&cvHO=nEZIR<3vgLf>mmFI>O9dua zI)`o&ZHYLR{a|%!2M}a~BrpTT>O)~;sP1fF?m#btb3r5)<#NM__(%hy2I6@57JjYA zdV}CCnwQd#fx6J~a_;RIUBWY0CsuT@=*c{?oLtB|w9UOk%$A292~V36B*=G=+!8(6 zT#%b+V?Kxbw6ytz@wV*v?eOyh?pM{x&-k73H!4D%K-R=_U#K3-PKLxQ%oC6DKumM~ z{muwKsNgvLOe9Tu{{X+u!W#rUzkl)Lq5yx1RR(l6;QnppvJ!&oSf%$ye(=t?-lP%_ z@>;x_{mgKGSN)KOMxV^#st(4#xieAE&AbDM4hg4M$!X#Rb%lVmx)+bcix>A8_5I%@ zxN)nq;#-EmM#Xn}vPMEC{KDQ-!&c(MztywU9B03{SOvZhQIW2Wr{$ah`i@}taT0Me zqwbKDjmM97p?`DI$^g4;To2`yam<6E>g&QRcVrT&cHluyPGT_*$Na~eGR6M@1`DD6 z+B82>oN@er<(oOd#|bXrq#mu9kJOnDM7JwgM|&4S9}@W+u9#V}-}}jj-LVIv8giGI^`=I_vf22O1Ga&%$p}N50&>n za1I0aXgj_LE8O8Q-mxdsJEoT4hFQ!%ao@Q^eO&mZ%yl{D1Igdr&;7z*%tMe^4#^IS ztp5NocdWukGpTzS1H-6a6ZD>Wv+mX5w@Z@9vja7C-Tf!AF7Fq_Y9fKDk&q{u=MeX3 zW=4C2Ap;e*Da+5kj##TX>Su}AAL1Wwe=$2jVhZ8#Za7O=gEuUGn?5nH+5JOtG3{Tt z@FGYIBiR1{HX#G}j`tS=Z}orUNOS#?xo?LjxMUx{e-|$fA~WJ-XFAR}e{$Z!GI4@I z>QuqzROFHDgz3$m*F@>eWQ^hmBZ>Ed8NkE#b0^|D+okw>fnUXk5e_D2)bVjRky_dN zh4V0=z<4-yVD1NYJ(L=o1Az<%-8LZRSF3+k3k%iK;_>6wZ-R}1%qC$GIFovtqX0OV zOlEB9dZfpQ&kV86$aeLYE!s|B|HJ?$5CH%J0s;a80|5a60RaF20096IAu&NwVR3%WS&PW|2Z=yAZa`;q!-dm}scFiWDMyJ@0Qgzw+XZzCs~3~RIk3Q3 zK4zUaNy<(t#J7iV{-|o97n2LypK^xM?CZ9CBhm<{7SPbt*M+4203)Ro%Beefo_oB* z8N%h;6`c;HDHvj84xZ(W$0k&qL=0lP5b6Iv{fEF;lOyi3k-TrjYC7FZY~#M zs+7>0rUBqJv3$TC&Gv4WQ=&5Pw)Y^9eae7P9+Njgva}$VK0_YrMoFJ59 zlC__4{;t>?-X&a%rK23M?4{hI?P8v(ih$wDt2s+r>M3W<%qoPpBGy{DPX)bRF6 z3Nt#`E?c5irg{@Ui1u9g11OY51}*2rc)N!D!Qvbh>mKT`9z4h}4 z4guxKrv~MzRHKT%7or#~xBmbN+^f=?>-~=3A2YFV`HWJq)XzjN!JFow=*xmCi=J7R zxdkzrmbp?aS%FdUr0V5gl(MyBRqio412v|jbcWx0nvZ>%w?PxUJM}36BZ0Tf;b4ah za!P(x8naor;2|k`$pDQd$B&pbcwHo{Gh1S~d_Ko{G@VwfqPY0GjQ#oE??Sc|l%vRrL%R zwV23>efmI$-9W?IG z2s$dQ)U-^zUQjo08J0SENLm8vdG2HIZDp_{%i?cttETPIQ&w>B=r_aMdhSc|aDuze zZE=3!*fm6g@qv~ZzEokZY!=gq(Rp`F6DHi;yKNSUT|{R_eqf3PRh9bHNAcwt3!)7y zM5<#mXEts0En8kM#LaySp;9gE=;|SLcL2H%EOt~` zctyb8fy@=bYlE=zT-huD3Fz3GKXwriW* zrn*iYM|5hDdc%2_sA)b->5qwu-F?0z{)7j1r zAn~ztj}a|0Nb__(OhG@?O?N=p#0?T*E3%DNq8mC=Fu|p=pF-hL%mOh$)H(OJyipcbMp({L0+CE<;bmz(b9NuwxHFfd8u)0 z7hPT|7P*|{tO_`a=D~ShSDD239n5(0#J5%4#oj)p{@GK*vTc8U{7ZG-fGHZ!mx#Nu zilEm;ZXt#b7Bed5rRkx(x26WZ!fl}Mtg}7Yc2!|JNVOI%_ChH4n^C~d5R~Qjv-H2NizksPi9wQt!90X@fX2UU)) zDMh?mQ_E2fg`GGH!*^XmGDR6XmfIk(xXz{cQUmGc4C*%3Lv6Bki-b{@@s^=w5wgR_ z6OOiC0Xvxe;}aEO=R7wQZ0I_|XVAbI$>f68W@L zEjD<+5gW5A`G(_cJg9JkS57w+M+}Fr65Smmn|q6Ti&!#TZ*T}eWh)logQ5$wrJH5a z-IU*$#*jF3TYjO7*)a1Sfd^x3)Zb}0{D-dddwsPqHL+0Dc#dA<&|q;GACxmKYSuyN zl~zYV`XMvG+f};3Os3Mn@5JYAGF9AQ12xg+9!h@Fv^a0WFE%;x6s({cJL02#O={Pr zd`1rQ1?{gAnyD);Ul4%W8Pmi!Kvj742E}35`!vj`ugtTmEu)3mP!h9yD)eS%abk)- z5pznax*W$rO!BK22h=iJ{up3dus^z)d#j6#%RPnHG-lRWHJ6T{aL=M)7#7jKN*E%o z-83TUd0eg8M+P~+DY)Kj1({iFV!E4Z-a@#HnHRx#p@)o^*#hJXZwmD}gf-B23nas_ ziAbXZ&@InV=L+_&s69qw1Qt^~OUbe1oCIq8LX1Z_Zt4pys>&Cy5YT8!?OP87rT83$ z+mFOGNXl@{)#yV&3$_3o_l6=4HXOp@2CykwG;!_+V4Xl;J;lgaD^;TM6%BSeY`2Y_ z%ht23=flNIu)^UZ z26ZlAvT<^k;On(WbXkh!?e#8%8K zbnp_nrRT&>F=ZQ`;@wJ1#8w;jdg3MnUm+eNbifVr9Pf#rwtAA?69m{`WA0eBIT^E( zX(d60kBAh>U*bL%Wlx9;p+Gw;aq{ZTa>JlxdzGw)?b!6M6CGv0heQTAnLmOAr4O=W z-==aRDu;uC;L2h(a|X;dmtRuzpz^EYQuIxe9CsXHMzHC6mU>ISRlkW|#)I_$vz87S zPKkPV%)LS-W1Ej-aIRnZ4cy$H>@gG@awH=f0M{^kNNgJtDP5*U3`MPh!?KxyY^=m_ zosNCMor7nJj}c+lh$*0R7e>M9E7n#U1?YN$VYN-OADA#~-I*~r;ms6{c;|=~mYLxl z(!?ok62pvV zEhSNeBVk3k#_D2z7TTo)uQ0$RJnDqxY9i(JOFgz`Z=_Jzb@3}ot8V~&_Z2p644&mL zpm1HATEx!^zC*?889yR6_=7=a+U)&9-VJ(qfpvLSHDxLDL7)efcZe5B-6&rk zaaHw!XLwh)SRl2o?YLNEq`)egu{KNFbRfFlwqiSN4xo69HB6t_Fm^hbPY4GY+%N-0 z*L|;uZUAPQx#&BT9)^^cTK@pU6=1CpC;(bNGrydj7+q&uBUFO!)q%(W!GNVRft|R zw57JzUiV_R~|uAhJIR&zE#R-IN05A!zu|}O#=O; zxm5sAw2x-XhsEM!S4C{f5 zb>2Z?73a0LDnZa2=#oQ5fs7Rbh?USxsWecv{U4tf2OLczMv7fGKdlDrsx#JP;Gs{?k_B0zwEe7D^580nA{4suxm4{+OzHIA!rOZe7<6u7|Ss_nFC!@ zx+V@gAz*6uMqyf2MC2drt=)0{ptXdvIrQpk^A!C)<}&kcy{Kgddh-qOO}4`L3-fZI z7ArYxqIri_nP>&@JJqncu2UtY+sn!t@~?+4D>aS7?q#_ybF6hL*{2g!te!kefXQfC zQdPXoHCil-ZO&Nythp)6gH;Je1DU+7Zll^uQi6uw_=fZG)@ie-DD9xpxJL#CNVYPH zssW|*4b&MZZ|8|pQ5rXXdh;7*2{Sy>>>|q!^mD&}ilLR^%AJBfs$I3>rE?})WqzaBMza;(T>A7tv@gKC zkz3mSQi%H$92D;CW04i2(QT2~X)~k=BE<xRsR5pHl~H7Dt%nfbmWRus12ncAF$*$da^WP?go+kM1Y z!s~3&h#X}(@|Ab(?JdXV5kxgk&PbPdKd$Xc^l^S2!?SDk0y}VOb9H5=D+54YrXr|m zEgGT-tzUC@MI2nASPq>qnQej(NYzt_tKdFmIHBbTnaJ}oA-Q!&NrA@@mO7|9jl0BN z!xQ4Jt=oM?V}Er`cU9h?i&tHiDEBFPGSIie>lVafJ!e>4QNvq+U_%b|g2!2v;9V0n zdx3t}svB}wTvjEO!@}73CFn-yFHoh7oY=}%1Y}l+c*UTb#K(s?F>0c&nZ6?uhTOLR z)B@pO3{;V7Li4AXUBM`1^_F+cM3(NX*?iAl4iCGW^U=X8K^&=hxGd-kH&KIv#L-&Q zgpR{v5`?U~E0_<7jo(uBaBWScNR&WvwL$f!oP@`;X>G0}w^rN!B6~!j==UAb>bQup zcxLW#)HenTWX}-VY517IwaxbdQiChq?i+azD1tnx=Klb)+7x-$xY;w06l0l_*C%<& zrBSa^sCd4*n3rFlaou*01@GbwWy7k>J>XtD`GR7+1@F_aq%zI!K)kWxvqR_rq45&Ln>2pd7!&{ZrZJ}dv`Gws%C6_5$qfT1~aGjiP zOSzI@(bT-F1Xq`?XKJ%Se+19W@57b_XjQ=Xa@&LpzSW0sfqX89KX7lLRTGte1b@qP zem@bt>OqKFw-Wv=#%%aw!7-J+@KCE@kbK1*IZU5N=QciA_&AE(Eu2@xW^SkAZbjNb zca!OYEULQQ5E~o4TvI0%4=Al?d4ido0>jaolHHQ@n!KTka(B*fv_Pcb&W$fn%|dLe0e)F!fPc?TrD z^8#*)cw%4Rx^}my2SEV{$W24gUCK`dr~%*xvD*NuOzVBvuZaHu+cNdMYb4nxl7~9f zV^J*&g37MpY=NhN^&C8#8xL}}MHcMr{Uxe&3*xvhaZ+Rw!y+{n*@nBA2OlrQRi0r8AM+4nq0(TZkRvT~UQ&OFZI`m8Jr(p~zA zod+n_LTa>is8w_!u#Y_UvR!O`Qr)dcr{Z4HDvrrmT#|1$bP$?w>JKlnQIRV6yN-Yk zPCd=7DQU$*>pc;rv!uz`h9+0$SOHuId`C<7>W&TovR^_CqKRUhVr|3@A%` z?ge1>wm2_E3o^NOXXN);?W&1ISj|< zA7j%ryt@(v!-FGj)pT(fWda$&%)CuTM6e<@Evesa-O1koebf_KuwIf?vckS*v%o<(b?F4IrUptKuHm;;li%?>dG502-!H z#tp$WzyoQrhcM~u^D8E@-`qCo)wnOp%H$s;dU={YzLIn=M}rZK#>$RL3>RF+xRDF? z;`M?ril>!Ld3u`T6~gOO^D<$bBwU-A4y}S((E{7^GO7mh;k0a*GPEgdwzgs(Z)Wf# zr;W!XRp2tVETc*%IUC}0Ibg1$O{%4lx=u)JJsJe(^f}4Bz9l}A-Px}Maq!T*khA7r zihyZ{0qe{o$Hiqav|J#bFLTdXnmB!#MDhpRv(3&@{lvPQ(WBeuUe&`a{K2K$wYTv1 z7c;vVW*6OwR=FDf!+}%Alab=>KB^6B#+<(qcjz0eXR4LwCeCJ}nahTwZe~t;fa{(v zRW~Ej7)~N)mPpv+nfM7U$?)9f=sTOkI-z!&xt@1J4fovF)LPRj)$SN@NQ#cLDG1-p zDZbbv;4hOF7?LWv7R@*%#;FPo#94@&t#tH=(}M&dM~wmqx+GE#Z*s?o@C`2~s4sx)&pzW-L}zUht^N$7RHG4~va0?f zD&lb2UBxO|o!EzRIeZu(FF<+5_n1O~(!%yJtbi*lt5J?&&B3-{6%G*0>GaF&O z`?1H=ss79qnCCPwWP4;lPcvRRPp5^c_UQmRjGD@&l4|9UR z?9q!yTAg%9jS&qNS^;`y?|^d!yhDpr{{UMb_!h1HU>C4=5RV+YV0jlZ((zGX$)(@P z%q5E)gA-WZ<;_c&7koIIuo0|jnCutDkCrVBRWEvhh7Lib)>aBT?T4a}Z9s3z5kQdCkU&WbDRXaT2x^l$=n87^*pR_ z?NYhibBiwMVf(qp;o#idvW&e#o_jcDYOZkjl-G?;&W*qMFBo4ATkab$jpr}22^h<> zyNv;wCCl9%UlR6QJ>&+iVdJW*_bK|9?r+F*Tp&4Nrp@;C1zMI)Nmj@XGa45S!Z8ke zroD6CW$|DfTSGv|_>}=0jpOExp}`$FeKG~M=*g++W{6ZV8ERg}ysWr_=J z7n^z^!C+nZQOV9F{w=<1wU==9rf?W9m_=K%TX0`E)LI#4&h9VRZ=k+NHnWa=#&rW! zpSZmNvXu@6n?*~Nj+cxw^zQnFbg7pZbqetfy0obN%3F}=7IR`6zRk-}@ZTDbhIH3Z z755B0bqB>sg|y>ruYoLY5F^m5U1w1H`06&e*YHK{E{yIl^HLp{8C67DP0b6avBih( z+lHEl&hs@7xq5BWh>Zhbg1x=h5#h1SsM&VMt4nY}+OA^h5NOwkkxA(*^on`0)G``M z_(Qdy?sE#di!0Sleu0;yEUE-s2e_APJwa|S#NO*sBo@A0vwhQ3>mUn1ZA3t#L-ZlG zB-kuxSZYvB(lc{GeuNb;9bYp8zN4#QX!Lg%LBzwr@i>%tidlK{49%FwriO6FGEXq7 zTf}%&Bh!>OATUI6%f@A<*-n0=Y%+#zsZRH}UcjIsj}kesdj$?wV)Z7bQZ1)b@TmBdvU1H(X@lvol?kMuD%G6oe!&8gy4hfj$ z??eKzk1!703vV#Fym19Br<}1cggVdmR1b;S`H5@jtNq2o*I~HpGe1E^ftfuQ35V_( zv;$*i*_X^6QkMNn-GYQA;K71Ks*HtUgt%~w&$2n2z65gYx#pq>iU~p~P7=DctW3Dh z<#N$4Ep=I!q8^zVlOpg;a(J8lTL`|n8sT#?AK*h@Lp%A-|2T7ZhSi%eqXE&&* zVC*=DD~rrehh)yB*l?E~3}2bBwdy|;m#Nb0a-Zu9@kD%Gk|D-cBchmkGZx68^O2T?q*;|u<0A0?{zE(wX{V18x` zHU9t-Rx^|>PvT=WU!DF)sI=Dge=u!#%q&ZKy8fYiBaI^_pt6>fAA6asTqd1RzmWts zdt2d8)U@Cy)bzCROw*$lt{@qX=12uZ%|~|lCO!juV0-h0aWTxi7ASzae8r#vRg6aQ zpI}r$gi$>0j-gbqm^NXv6i|)t@M<=S+;#=!8}1l|>YUjB0F%@OzS^+-%4t+q=i4!q zM0gM87^ge;F%=;y_yS(GFe$Z3ddM^HAEpp5}fO zHb%Thv@(V4-V92{b6dx$Sh!`{NIUQt?Gz!>F_oZ22XMzmnT4}YrXg1JW%8_PW(*8| zW@p9%UI}I9YB$pgt}Ok{`aR5FZYpCPL(F-C#RS#N0!NwQoWl=DW?8K!dH^468%1uS zgT6CxV=U(IgU~$U;>lH&F#RMkXbPOEpoi zSPIG+sfvNj)(H;n6wJ!!H!C;vy%A_kO42|I9XAh`gCa{9D`Yw)C6AFG*aiTB287q? z1B-$Xs;;8_h&be}L>E+Wdm=3&vv{t!BO$s_-@3g-7mn#`I+mNRY7&iyP^=1GbL3@U zse%SQu)GG|G(u6Kk-2ahD`(V0e=_(`x&>F_<}!_Zvo$P+*rFKQL8ctJ#Q_W|)IBOH z?%|yG~cPdD{ z24l+9DN&JXoK+c&@+o6{(#h^pAHYj=2;nNxCW^_cPYNYX$7CE?i0l4>ou;nJX8!=b z(=b>nw*~g%qrz>Fxnr7DG(dEg!)3+@TFldqW|LFHxqe$^kUe2UfTF|9qhyv1t#no* zv;B}QDOSKA?q{L~v@25k5LKL0U&(0bm-hnH;I}!K`4*C}pgE>kV=UE&tv+SvH_-_` z7iR!SdBfDDb&%D~7o1FnNZ>iBJla`+76r14sgcvf z6NXw~J87?RElK-^;b*j8i}N$jv}d}vi!OS{xN2txE?nyMa|q?ra;+x!#Y-qJAyC13 z{{V}Ij-iTrV~t__5drXX9kv^TvLJb=4RRFvfbv$U%QoTZyZD?1Ebr<&oc{pXSgV=R zgYqL3>Ad0$=Q;lXiGbtRQ&z?Z6XxaM`$w0CQx9amuOS*%bz=teWXbCgZRvu&y3ZMTJaiEsI18DtJsV&Ic?kWSEz6`NQ2U;IdtP($0suq4DQ;Bz>-a-p1 zTp=_nsPN=N!`4;GE#4Dzl;DOWQqb4LUYL2Qw?R=+Yb@9nkk!=>Ay5inN07Fh1-%de zwz~*B9WN1R8DqLo4e=HpcL79&p4A-iMagUf7l0;GkjK!<04n^%%Pdoh*u~Jv8WBdC zESqQ@Zyv-fIE5%HDyq3F97Q*-$qKsyjl{D$+(WU0EqvBd(Ue$wxg;TqK_+sltpWwG z0EU%{71aXCLa@Q->y4l|+jA=fnXq-4X>yuYeu$Tvx`aFLL{&nom_cyEi%QP$s)1jq z0!%Ip(#^42drTQM!pBOr+Dl3vT#~!1FPr5Y{6lZn(i-?D#Hc37Br-Z;`KYd%c#X=o z()*P-T);p8>_XI)u82X9cM6*8-bk>le=z^aT zmFx&lrZE=A_H9+Az0T~l>C56XZe0t#?q2-D-1t&sqik35W6=h%q0N%a{pHP-k~L7b z(~qcB*w2NXlEZO?S@_hbrQ09VT7`vCN`SszX7?Q(UBcw?X#Q?urgz3Qm1}jk;$!q( zAJTF9!A-K3)d!5g3P2DC!?>Erx87J$>Qm8iUuRJbEH$I=5nth)K9uG(ttQR< z{;TtG{HoSAz8EEs8BAw{E{>JHhZ0>aAH4LV7(5@-MmX)r&CT?cwd199G#kkly$V) zK*B_;f!f20#J}>HEgZwZL0<-nSy#D@+RIh4IHz&4!<16en)@Z{(s4x>gqM>EXU4dU zMjN0LjuKrxomd+Tlmz344u6V=QFmG_DMv_!`LNa%%mVs~&I>P`@<%0-z;?rl%(j8; zz^0lYdZC8ICGZ`Plf|AXOIDKnNBFFI8$m=cZj#JPY(gBYcQ!YKsi8+(;LiDFGB9=a4x1*(#jyivr*i!R0L%5HAwQwfX#<1 z=XVR4my<+l>F{}%mHPaFR2##H3rh%0Lztt8@6DtaWClyQT#*A}CrcLPF;t7DAcb8v zJ8yA=niY^$J3e7Im3$nV=HUwKmMviK;*) z-vw{VEAJN4Hi5TwyWt4H1tmHx5kh-h(@4pg*>PZmxwZvn@b{I|#5Q zH1{O+DQzbO9F$^j08^lOrOawFm8gew?U$X=)2kRYFF>*-J~seb;C`5iUiDTGg#%0m zN5KyoP7_AFsW-O933Q@E0J4ltZrV&3LkQQZ_L1HSXS~I$IQI&g4K7Mym%py9QjtB1xE3jZ9=Z7>JL?wr2haS97tnV z1}zm8&%5H`@$_aT=7rSP&h_Fd#2g*9^)dkBc}4QWQ3&Po5{Q>E3&D6?4^jkf z9HKGph|nCa#~JDYriVz|kE(_e0v%bqac~alLsgcC29k?f?pmHrO@}TRx9x1F5iSJ^ zn$j@)wFcN-xR!r1AqPficM~6BDGC^HjRU+(i&*T%vRJW>0Bvj;%c%vXQG&uSCJ-+n z%bXI&pxCJ_IYNRnw5g+bCO6lp1D|ux=JCP-ak9`iItT z#@RCQHoTa1%NYvXZfh!hsDEI_L@vkpen#AB#D zR@0V)64(H5)-79u3(OZ^ScPq=lW+_|Sy9_AB7y5(Vf<`Cnhs){Pz#^oBeLqp)izjjMW zaUFip!et{ci=s>8F-Q)-J6j_btpp0U$x`R3fmV6b@eaI0BJkM_HZxQ&;Vb!$(dNOc zg;v?Z$l2Opt2k8)Gg+k)Z^k85^;Dk-QJj=(4bkP8QBD_ma#+@-vDnQa?%L)A%KD9? z^DBZV2N%sV!co6aRKujYrGdNo>Rb?%!Zih)o&Yi~C7^R`AiEQKNyoqx_a!`$W=L zxu}?VKZt6nv01+{9s?%hTDq8WYRQ3qkN|Nt-Vkqy_C@mtVHHQXIfSZ0&z>XuZOV#@ zrKx>8L{rIGj#^R1D~wbkj>YHllE;}!=sbd4;xu#5ip=pumtRDGRbk)^QOow)vZKz zN3dbykfb8Kyxag|lL>O9s*szDV7u25h(8Yl79PCx* z>I;n=ypgrj#Ajg5%x*)BIES&-iaMwc=1O zMvfz>@CFzOK?uM6Ffsv@$Q_m?J;0?W*O8I1>Mz@6f-M2GaZ=W;dr?3qqf(;&R$A}_ z8DVVF(stbHfzBft(O3gAAvf!Zl!IEYVx#v%KPfNo(lu+IwEY6 zWL(!s8Fhq+&Iw;LTT!|h{EDw+L*MghO;GNZR9?F{#&#+f5~9Yn+O-D8Lwk;~Y;%XH z<1(3FqLA9It>#+zTr5XEMzh(? zKw$7ugNB{_M_%zzon|8s*pZywLi?;V+_W7*u82^^x9S^~^ZDiZjOSvhQL9#lqKAqbd_ZOM2DSu?3s<;^aKudQcSJ=$& zN8j+nX)bJkaH0<&{{Y!qu}w_y8ApEh3^ciOQT!0s9<~a{-oT2#ZDsk1%ht1OQ~j00 zG18X~ZtfokNT@}+FzTdQJsQI19pDr<>!T0|^QMIAW3Irx+Qhq38Z3N?5$Sshzcspo zXsXjeXBNe{<4i4bkxc|c>$<0LT~+Bu<$X5=KXIa$1Q`jg);0r&Q-|{eAm0%-u`3m*{7{7F5vV_90w=ZVBe8k5cVGuJ@ZX#Ec%m)KJye zF@L7yfCaf!EpwkLjsm&a)c0;@NG0V!mWp81YAuUEU|2gHHe|W+DXKB9PDKY0tf+~4 z<+G9T6}h%9JPm>4GQ~K}93wx3$C+1)eLoSz2V@Nd-UEOmqi?v;Z5#Q5%idWO$xjl- zVdUND=KRLs!T_@k4(8?nst3`#m0>$VX`mML%QoGgiy!QH@Q3S3WaL@di9rhKJI^A{ zaWlA$m76;2QP&_YO>aa~c-{uy(2Ds1leiLWn4pL zW?lqza#wP>YMTWc?h&>QQ18T6u9EBUS(#b7JHs(qAQVWTQyhi$q%RT=9GAozD zte1ke%b5FsS^+!58;G5i?8776BqS?)l>IX^7h6Dcp;4`Eo=fJU`@hf<_BijU^*DWqYclpI4f{sA`k5b&jed!ewVeRMvZn@bVOA z;t}Qo%_lF9nCYYf;PBBD?lXqoT*vT((95x!J`$F@MJ4rzDar&C9*?=*&ue+la^PX1 ztevp^iEenIjZk)gRM%>b!(p`~x?Z+l^v>ObyHtBcqPc+Ed^NYOs(Tgr}QD%rAT#;Sg2jOL3i>{DyYoJGCOP0sok41ETxylhNRI~4JD zWs1l^DXUum#9dl#n@HP?e0R+|3R=oH-$_}ec6Nd&)Uz?Z|Ua$S8_H}-~E&*0Ks%z?dSg(iF z4Ei0mzUmhNTni78n4g>x4`aH~_%{YxT5} zi&%KSg|^q|Co%=5FBEVkB!7xSADbt5HN{0p1lob%#Ky(d)ISiVyFzga z4GYA$^tTi%=h!3V;2R^{OD(qj6De!jDOP3t5W50d2oxAsx|PiIo()e@6K~`g%*FWX zp`b5i%lV@NpV1roPRvmk)io?3uFc;Vj~{)!)Qyf zrmkFGEAhIJFC5&eAY`6Wvh;Nq8qjh~Wa|2Ys#E}Pv1BQLt8iY|)XkLY52i_o!6{(KfXB@7%2}`nfRA?lp=$e; zQz2xBOm;9P-onw%T|gz8YgFaDzLC3y)+lJEYs7N3D!`knyBMKT#|gWpv=y!=CAxJ;Ld*%!#eCF8+X5mahv9q;?y++incihI(o8zS(`-hFFuP*VJ zu2H~XL+DN5F?FvEf0J&bj8D{c$j${s$wc#)^uZhlIDW`y?5jrq03^PKaH!YRaH+*O zmdsWf!>NA;Hx@dy$v|bwK1Gvdc&1|sEI3zm96fW4mhFwzmSL*bP_nl!{03Ts37-IZSN0!jM;HOkOa5Tl z4|g7Lw69J)OU3o7*|U)Fqv;ZBH_h z1KRf$u|bV`COm95REA1URLo5pO;BCm7Gp7S%LKNh)U8`BPx2+DQ?rqPmGKQ3Eq%0T z3Y@?fg_-mgkEFRNC?*`B;d!Y^mvy!tnuX_;zs&^LFr^GU<<~_-7(Bqz6uvWI`Gk)N1 zDy`JrEBP9DYfiy@C9vg7QT;6(c_$4#6Dos2B1n8?v zd^wd8cqGT3BlXa{+^&mgUQ?)^!xX%-N`sLs67Vpd<;3Cu!-mW1UaK;j{fjTuq~AoA zuKPU4z33@8c72h2ngxgA^EV`nwKzyreo`TQ`5opW&}k%JP^k=B-;0a10Rt_hM4~VRK=$33%HVV zWE)N+b%Ny;s%J6*eJ8eD(BY(;sAI1li-Lj*GZ}NabDjedaoRmsdCg-NDKO}U&u;O= z&i!-4_i=dp71|o2_bCgDg}kcjxB?7Cb1Zt%G4L%Us=J9J5TJtN-;#{YO zb9XH-isgnagbQ`9Ur|S9l;_wP zK4Gg>OS-Ya^Etb4cVOXFxmsq{&t)}Pz9Ge!3k@8rDDjC&#k>+N0n6rDvk0x zEdug!oy_S}R~{%GW@oM-Va`^b<=&iPa{=B5A^08jF!v2;G!SRgFKuEVg*BrunS2*V zj?Ac3x147su#35{SeM_qhLq|W<2FS2rnjA{#+aQ{5S3zqE;S+8QQFl{+|(r37{g(o z#3gR)<;^YWeM);g<$Vr+G%EfHcFh}4BK3$QjRB{2hO6AE zEmW$dwR3mXX*u-FZb=14qq$jF>Kv zL^oGR;#{SsELpdxGzq$P@=iXZ#Ey7)9p4a2VsnEd2!TssHILSR(p#a4*CWYae|m8FgL8KbL+ zY&Mriwf#q{xOiFGO8y!cFPhvd&9Q1Pp@dW|;QYt3g0IJtHF`ui%T*5$6eESJij2-! z8+E#=x)$30!e!jAduT|Ds}zcc zM*wVad4u#kF5wufZlJKzL|8>R%%ZWrfBdaOe8$tn(~Yz+(mpO3IUG)u--xKW0xEB> zoI`a*I?sTaxrW7W3f)_Y%0y_|0%Z?aOR)vMECb5Ut{ zAZf*ohc_{ksL|lpA5y(?sxjW^W^<3tLg>q1a{9Rmwz^r{MAGTcc-@go6G~76h2%^_ zme`h}ZJ2UvYF@&jOiP4V*m+xsZ74_F^G8vh@MVTVu`6;nCKqT1LSCR!Lyo&D6%dSV z9c72`8Fe&?(sRT=fkq9E3O0;-SRhF?z?hZCg#ui4PUYx>fo7XFc$@SY1=&s(K4@oE zos4&6*oE2GnC}v|y4(~qKUpC8XkuV2(l2<+(y`^4FJ^`7M5_Qi_oQd-Gg=EkIvepX z`>WX01y#&+J8EY^pb4Jf&?V1w;3CB}N>_KEQpBOBq16f=dSoL;5wKNbDxR-t!!AKH zuy}^eV3Jg{!#HdroX(!C3X=vaVf-o>dT6ZUL z!<*m3DD7%hGJav6ljO|pXPbZG8BJA!`ITBb?@^1r>4TLXbTfzvryL9|O-mQp5qS?? zi%cA#s3DUybC_gy=8WaO)3=1L?YV*~xmNeuyMt_(9r$8e!6{_FiB`(Cx}Ds;nFB8K z57SzelZ6|i4dpl1V)Xz0e`b>wjej5>~5f>#7@CvNIoN{caZywo`{!F3-%RV0e~n=C5R zwkwKM=P}Aq3@WbK&TqQDCOECTcI&9-_`bB~tInX*BX`oi4jF07`-2O!b2Bor3`ftZ zW^e*;$V(JusH}Hb`iphw3BW((E{y~-*PKIP`=U1Qm}NCcCoXCNDMN?>ROgr^qXyAz z^7)HZv?^Yf&2|!?f~igYvN!mSPOHt8)8~=Iyvf62h2X%95b>NUuTB1;3bmBkRcm-~ z7IDN9jSB#`t;&TM#Y1*9`H3q8k_GUtDnGSwI=*;;iW1GI)FDhdxYi1KIcJ7rXfU&s z)!EOPhCpZmShH(^s8O((?0bp1%KB+=A99fpSza5|ZJEUgxyMm41q{%&~R+!WRugP~vmdDv&$2*z&3AA%yla(xv! ztx8nKcS62b8puvYnQv%aoc0NAJ_=1@@P)tmD<7#P+3qCzu3rFnaXuPJ6zP!;!! Tr|KIFZEgH9DnYuYc%T2-h!MJJ literal 0 HcmV?d00001 diff --git a/src/wp-content/themes/twentyten/images/headers/sunset-thumbnail.jpg b/src/wp-content/themes/twentyten/images/headers/sunset-thumbnail.jpg new file mode 100644 index 0000000000000000000000000000000000000000..416c11a855663bee0945f511235c458397604f8c GIT binary patch literal 2209 zcma)4c{CL28~$b`>x>~;rZ5^Ap)64dS+b42E8LhE5m`oqwA|2Gl5LDVS+g%iV@V?= z7pZH>PFb5&BulOwO>^hobI(1$KY!1AzVCeJdEV!|&w0u|$1|usYBO`m@KS22S_=JUo_n}bxq$SW2(*Ftn?}Pgc zp!vZO@Bs!v11K5-LqoV-Ad43p3WGp+IsXL=Kp}7h9})t1^#2Nf_rVcJ6ii& zCj5_uw+b{2E{`~B>>zfYf{89x5SKvGL(?0cdktxva*S!jX_{!6I`i?SLSTOb4*Pc$ z1j;iyh&jq*#Es889ilu0)k*9^FUd;bfbDjKnt7D}jp2g=r;>lR zBWc^eR(slg>o0hjoz2L}eR}IDN=Nv~>>p-oS3X}Wi1NEgB&(Ypded$_!N_QF`d;`; z{e4(BYbjUpD&>^Q?Eyu%LuRcfEUXX?ln`6@G!=CETz>j(a=dj3vG|RYXCKbQ{)}H8 z|6sMLIS%DWD(kuAVC`&kq~^#cZTWQJd~*wOj4wJJD>vCijajaw;c^>TV5 zjkhs=_{i}f#rrV<1)B9}oFYd5V~aF5Ddx+H~AlvvpYp zX|5VIiy|4l53p13q+ZJW?f$)2)N1qi$uW0LIdhB~Ta8DRF9Vddm{^5~- zG5sTFd~sVonosws`sVIU#>yz&A+WMU75V^xd0lCPb4;=6K~R#Y3sE|hL~~D8oIB%e z7EaG>Z1AeS1auN#+*obWuEG!rcVP zS&nGezhmUylG0^ZMM==#hZUw)oEY%oIBcwyk1dr!FmaN%poVC6k3xRR+VQ(A7ZeB3w2O()(adc@ZCd~Zpf zciE?b!;v_@oR`#2gzgi1A5c14mv(*0RHBCQVX==vB}@=A+D%KMlB0MQDWlVhf^2nK7!sEU*dp^X=M6Y^ zlE<@OLEV^giOZGq28=}lb^W*b*QyuKC8K_r?#IQ7LNpRab*g5FU1(2tlZEq5!tb(5 z>KE;{20m*ZQ$@Oz)nGmcT3vr${1d0y%#`UZ#0zs)&VIpfiV+F>UNkcibOX<~XWlt9 z?Zk+F(3Z$;@C&A^x>DK#$}KrWk*UF8{PkS=lXhyK|CZ3uHHSf;?2|UetXWyj16x}C zuc?O~1zo;Lk-XY>;>Tv{7cH06{kYoYd@fMHbMl0dbDjBwFX%;+L{-^c78l@BAGaX5 zK=gB7!MXQ^llZkS9Xls*oXpYTR%*y^ivun~5eSlUsrHR7Tldyu@2ehuJG!}g+4J(( zW-j2kNA88r?8dMY1qemq_Q&m&fgNFKYa4T4=gSbWwC=P-{li2UOm-=LaTx#k+J@{}mGiP1t@a^lx z&DXH*mlb!IK7kbc*N%*ykp$@=!@Yu4h0lcTYXJwt?Ear>m zHEUxJlO3t(wg>usyBGeM}qnor zr>0KRih9NtA;K`>fYYoF(>Hxff5UlRjTQ&rk0rs9UiGz?T7}%TKm2$*U_E3l*63k> zTUVUFGFu>8-DmqAl3D%`#FzfS(C@Yl=K^9sXbd$+d4d@9GN&?nXv3+@}jm|!wWx8F&=m7q`RK&kLwE-E~Coo z{yufi(?>P&xT^s|XhA7lNhzd{&lY@Uf`5YK>C;tLp{j4nj literal 0 HcmV?d00001 diff --git a/src/wp-content/themes/twentyten/images/headers/sunset.jpg b/src/wp-content/themes/twentyten/images/headers/sunset.jpg new file mode 100644 index 0000000000000000000000000000000000000000..66eddaa7fc2a7c7528ddbde6a65647f79418e40f GIT binary patch literal 22830 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' ); ?> + +
  • +
      + 'monthly')); ?> +
    +
  • + + 1, 'title_li' => '

    ' . __('Categories') . '

    ')); ?> + + +

    gfZt3r&MF}BPRE88S$|BS`HYABz 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 b`6IvpNzqsrv0+8800000NkvXXu0mjf%yy4m literal 0 HcmV?d00001 diff --git a/src/wp-content/themes/twentyten/index.php b/src/wp-content/themes/twentyten/index.php new file mode 100644 index 0000000..7bc3fd4 --- /dev/null +++ b/src/wp-content/themes/twentyten/index.php @@ -0,0 +1,32 @@ + + +
    +
    + + +
    +
    + + + diff --git a/src/wp-content/themes/twentyten/languages/es_ES.mo b/src/wp-content/themes/twentyten/languages/es_ES.mo new file mode 100644 index 0000000000000000000000000000000000000000..cbe868b676be9db239c0e6993cb3401f49293d89 GIT binary patch literal 8888 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 literal 0 HcmV?d00001 diff --git a/src/wp-content/themes/twentyten/languages/es_ES.po b/src/wp-content/themes/twentyten/languages/es_ES.po new file mode 100644 index 0000000..392f37d --- /dev/null +++ b/src/wp-content/themes/twentyten/languages/es_ES.po @@ -0,0 +1,364 @@ +# Translation of Twenty Ten in Spanish (Spain) +# This file is distributed under the same license as the Twenty Ten package. +msgid "" +msgstr "" +"PO-Revision-Date: 2011-07-05 06:00:17+0000\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: GlotPress/0.1\n" +"Project-Id-Version: Twenty Ten\n" + +#: loop.php:82 +msgid "This gallery contains
    %2$s photo." +msgid_plural "This gallery contains %2$s photos." +msgstr[0] "Esta galería contiene %2$s foto " +msgstr[1] "Esta galería contiene %2$s fotos " + +#: loop.php:93 +msgid "View Galleries" +msgstr "Ver galerías" + +msgid "black, blue, white, two-columns, fixed-width, custom-header, custom-background, threaded-comments, sticky-post, translation-ready, microformats, rtl-language-support, editor-style, custom-menu" +msgstr "negro, azul, blanco, dos-columnas, ancho-fijo, cabecera-personalizada, fondo-personalizado, comentarios-anidados, entrada-fija, microformatos, soporte-idiomas-rtl, editor-estilos, menú-personalizado" + +msgid "The 2010 theme for WordPress is stylish, customizable, simple, and readable -- make it yours with a custom menu, header image, and background. Twenty Ten supports six widgetized areas (two in the sidebar, four in the footer) and featured images (thumbnails for gallery posts and custom header images for posts and pages). It includes stylesheets for print and the admin Visual Editor, special styles for posts in the \"Asides\" and \"Gallery\" categories, and has an optional one-column page template that removes the sidebar." +msgstr "El tema 2010 para WordPress, es elegante, personalizable, sencillo y legible -- hazlo tuyo con un menú, una imagen de cabecera, y un fondo personalizados. Twenty Ten soporta seis áreas para widgets (dos en la barra lateral, cuatro en el pie de página) e imágenes destacadas (miniaturas para las entradas de la galería e imágenes de cabecera personalizadas para las entradas y páginas). Incluye hojas de estilo para impresión y el editor visual del administrador, estilos especiales para las entradas de las categorías \"Citas\" y \"Galería\", y tiene una plantilla opcional de página de una columna que quita la barra lateral." + +#: loop.php:151 +msgid "Posted in %2$s" +msgstr "Publicado en %2$s" + +#: functions.php:467 +msgid "Posted on %2$s by %3$s" +msgstr "Publicado el %2$s por %3$s" + +#: loop.php:160 +msgid "Tagged %2$s" +msgstr "Etiquetado %2$s" + +#: functions.php:497 +msgid "Bookmark the permalink." +msgstr "Guarda el enlace permanente." + +#: loop-single.php:47 +msgid "View all posts by %s " +msgstr "Ver todas las entradas por %s " + +#: comments.php:41 comments.php:60 +msgid " Older Comments" +msgstr " Comentarios antiguos" + +#: loop-attachment.php:23 +msgid " %s" +msgstr " %s" + +#: comments.php:42 comments.php:61 +msgid "Newer Comments " +msgstr "Comentarios nuevos " + +#: functions.php:100 +msgid "Primary Navigation" +msgstr "Navegación primaria" + +#: loop.php:35 +msgid "Apologies, but no results were found for the requested archive. Perhaps searching will help find a related post." +msgstr "Lo sentimos, pero no hay resultados para el archivo solicitado. Puede que la búsqueda te ayude a encontrar una entrada relacionada." + +#: functions.php:330 +msgid "%s says:" +msgstr "%s dijo:" + +#: loop-attachment.php:32 +msgid "By %2$s" +msgstr "Por %2$s" + +#: loop-attachment.php:43 +msgid "Published %2$s" +msgstr "Publicado %2$s" + +#: loop-attachment.php:53 +msgid "Full size is %s pixels" +msgstr "El tamaño completo es de %s pixels" + +#: loop-attachment.php:56 +msgid "Link to full-size image" +msgstr "Enlace a la imagen completa" + +#: author.php:27 +msgid "Author Archives: %s" +msgstr "Archivo del Autor: %s" + +#: footer.php:33 +msgid "Proudly powered by %s." +msgstr "Funciona con %s." + +#: functions.php:357 +msgid "Pingback:" +msgstr "Pingback: " + +#: functions.php:493 +msgid "This entry was posted in %1$s and tagged %2$s. Bookmark the permalink." +msgstr "Esta entrada fue publicada en %1$s y etiquetada %2$s. Guarda el enlace permanente." + +#: functions.php:495 +msgid "This entry was posted in %1$s. Bookmark the permalink." +msgstr "Esta entrada fue publicada en %1$s. Guarda el enlace permanente." + +#: comments.php:35 +msgid "One Response to %2$s" +msgid_plural "%1$s Responses to %2$s" +msgstr[0] "Una respuesta a %2$s" +msgstr[1] "%1$s respuestas a %2$s" + +#: loop.php:106 +msgctxt "asides category slug" +msgid "asides" +msgstr "citas" + +#: loop.php:60 loop.php:95 loop.php:96 +msgctxt "gallery category slug" +msgid "gallery" +msgstr "galería" + +#: functions.php:409 +msgid "Second Footer Widget Area" +msgstr "Segunda área de widgets del pie" + +#: functions.php:398 +msgid "First Footer Widget Area" +msgstr "Primera área de widgets del pie" + +#: functions.php:376 +msgid "Primary Widget Area" +msgstr "Ãrea primaria de widgets" + +#: functions.php:387 +msgid "Secondary Widget Area" +msgstr "Ãrea secundaria de widgets" + +#: functions.php:431 +msgid "Fourth Footer Widget Area" +msgstr "Cuarta área de widgets del pie" + +#: functions.php:420 +msgid "Third Footer Widget Area" +msgstr "Tercera área de widgets del pie" + +#: loop-single.php:22 loop-single.php:62 +msgctxt "Next post link" +msgid "→" +msgstr "→" + +#: loop-single.php:21 loop-single.php:61 +msgctxt "Previous post link" +msgid "←" +msgstr "←" + +#: functions.php:340 functions.php:357 +msgid "(Edit)" +msgstr "(Editar)" + +#: comments.php:72 +msgid "Comments are closed." +msgstr "Los comentarios están cerrados." + +#: loop.php:99 loop.php:122 loop.php:164 +msgid "% Comments" +msgstr "% comentarios" + +#: sidebar.php:34 +msgid "Meta" +msgstr "Meta" + +#: sidebar.php:27 +msgid "Archives" +msgstr "Archivos" + +#: functions.php:333 +msgid "Your comment is awaiting moderation." +msgstr "Tu comentario está pendiente de moderación." + +#: functions.php:340 +msgid "%1$s at %2$s" +msgstr "%1$s en %2$s" + +#: functions.php:182 +msgid "Sunset" +msgstr "Puesta del sol" + +#: functions.php:176 +msgid "Path" +msgstr "Camino" + +#: functions.php:170 +msgid "Inkwell" +msgstr "Tintero" + +#: functions.php:164 +msgid "Forest Floor" +msgstr "Suelo forestal" + +#: functions.php:158 +msgid "Fern" +msgstr "Helecho" + +#: functions.php:152 +msgid "Concave" +msgstr "Cóncavo" + +#: functions.php:146 +msgid "Cherry Blossoms" +msgstr "Cerezos en flor" + +#: functions.php:140 +msgid "Berries" +msgstr "Bayas" + +#: footer.php:33 +msgid "Semantic Personal Publishing Platform" +msgstr "Plataforma semántica de publicación personal" + +#: header.php:33 +msgid "Page %s" +msgstr "Página %s" + +#: loop.php:99 loop.php:122 loop.php:164 +msgid "1 Comment" +msgstr "1 comentario" + +#: loop.php:99 loop.php:122 loop.php:164 +msgid "Leave a comment" +msgstr "Deja un comentario" + +#: loop.php:93 loop.php:96 +msgid "More Galleries" +msgstr "Más galerías" + +#: loop.php:96 +msgid "View posts in the Gallery category" +msgstr "Ver las entradas en la categoría de la galería" + +#: loop.php:62 loop.php:83 loop.php:131 +msgid "Permalink to %s" +msgstr "Enlace permanente a %s" + +#: loop.php:26 loop.php:179 +msgid "Newer posts " +msgstr "Entradas más nuevas " + +#: loop.php:25 loop.php:178 +msgid " Older posts" +msgstr " Entradas más antiguas" + +#: header.php:83 +msgid "Skip to content" +msgstr "Saltar al contenido" + +#: functions.php:433 +msgid "The fourth footer widget area" +msgstr "Cuarta área de widgets del pie" + +#: functions.php:422 +msgid "The third footer widget area" +msgstr "Tercera área de widgets del pie" + +#: functions.php:411 +msgid "The second footer widget area" +msgstr "Segunda área de widgets del pie" + +#: functions.php:400 +msgid "The first footer widget area" +msgstr "Primera área de widgets del pie" + +#: functions.php:389 +msgid "The secondary widget area" +msgstr "Ãrea secundaria de widgets" + +#: functions.php:378 +msgid "The primary widget area" +msgstr "Ãrea primaria de widgets" + +#: comments.php:18 +msgid "This post is password protected. Enter the password to view any comments." +msgstr "Esta entrada está protegida. Introduce la contraseña para ver los comentarios." + +#: category.php:16 +msgid "Category Archives: %s" +msgstr "Archivo de la categoría: %s" + +#: author.php:37 loop-single.php:43 +msgid "About %s" +msgstr "Acerca de %s" + +#: 404.php:16 loop.php:33 +msgid "Not Found" +msgstr "No encontrado" + +#: 404.php:18 +msgid "Apologies, but the page you requested could not be found. Perhaps searching will help." +msgstr "Lo sentimos, pero no podemos encontrar lo que estás buscando. Quizás la búsqueda te ayudará." + +#: archive.php:33 +msgid "Daily Archives: %s" +msgstr "Archivo diario: %s" + +#: archive.php:35 +msgid "Monthly Archives: %s" +msgstr "Archivo mensual: %s" + +#: archive.php:37 +msgid "Yearly Archives: %s" +msgstr "Archivo anual: %s" + +#: archive.php:39 +msgid "Blog Archives" +msgstr "Archivo del sitio" + +#: loop-attachment.php:21 +msgid "Return to %s" +msgstr "Volver a %s" + +#: loop-attachment.php:36 functions.php:476 +msgid "View all posts by %s" +msgstr "Ver todas las entradas de %s" + +#: loop-attachment.php:63 loop-attachment.php:111 loop.php:100 loop.php:123 +#: loop.php:165 loop-page.php:30 loop-single.php:56 +msgid "Edit" +msgstr "Editar" + +#: loop-attachment.php:104 loop.php:115 loop.php:143 functions.php:248 +msgid "Continue reading " +msgstr "Sigue leyendo " + +#: loop-attachment.php:105 loop.php:144 loop-page.php:29 loop-single.php:34 +msgid "Pages:" +msgstr "Páginas:" + +#: tag.php:16 +msgid "Tag Archives: %s" +msgstr "Archivo de la etiqueta: %s" + +msgid "Twenty Ten" +msgstr "Twenty Ten" + +#: footer.php:33 +msgid "http://wordpress.org/" +msgstr "http://es.wordpress.org/" + +msgid "the WordPress team" +msgstr "el equipo de WordPress" + +#: search.php:16 +msgid "Search Results for: %s" +msgstr "Resultados de la búsqueda para: %s" + +#: search.php:26 +msgid "Nothing Found" +msgstr "No se ha encontrado nada" + +#: search.php:28 +msgid "Sorry, but nothing matched your search criteria. Please try again with some different keywords." +msgstr "Lo sentimos, pero nada coincide con tus búsqueda. Por favor, prueba de nuevo con diferentes palabras clave." \ No newline at end of file diff --git a/src/wp-content/themes/twentyten/languages/twentyten.pot b/src/wp-content/themes/twentyten/languages/twentyten.pot new file mode 100644 index 0000000..1384ef1 --- /dev/null +++ b/src/wp-content/themes/twentyten/languages/twentyten.pot @@ -0,0 +1,408 @@ +# Copyright (C) 2010 Twenty Ten +# This file is distributed under the same license as the Twenty Ten package. +msgid "" +msgstr "" +"Project-Id-Version: Twenty Ten 1.2\n" +"Report-Msgid-Bugs-To: http://wordpress.org/tag/twentyten\n" +"POT-Creation-Date: 2011-06-13 13:27:43+00:00\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"PO-Revision-Date: 2010-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" + +#: loop-attachment.php:21 +msgid "Return to %s" +msgstr "" + +#. translators: %s - title of parent post +#: loop-attachment.php:23 +msgid " %s" +msgstr "" + +#: loop-attachment.php:32 +msgid "By %2$s" +msgstr "" + +#: loop-attachment.php:36 functions.php:476 +msgid "View all posts by %s" +msgstr "" + +#: loop-attachment.php:43 +msgid "Published %2$s" +msgstr "" + +#: loop-attachment.php:53 +msgid "Full size is %s pixels" +msgstr "" + +#: loop-attachment.php:56 +msgid "Link to full-size image" +msgstr "" + +#: loop-attachment.php:63 loop-attachment.php:111 loop.php:100 loop.php:123 +#: loop.php:165 loop-page.php:30 loop-single.php:56 +msgid "Edit" +msgstr "" + +#: loop-attachment.php:104 loop.php:115 loop.php:143 functions.php:248 +msgid "Continue reading " +msgstr "" + +#: loop-attachment.php:105 loop.php:144 loop-page.php:29 loop-single.php:34 +msgid "Pages:" +msgstr "" + +#. #-#-#-#-# twentyten.pot (Twenty Ten 1.2) #-#-#-#-# +#. Theme URI of the plugin/theme +#: footer.php:33 +msgid "http://wordpress.org/" +msgstr "" + +#: footer.php:33 +msgid "Semantic Personal Publishing Platform" +msgstr "" + +#: footer.php:33 +msgid "Proudly powered by %s." +msgstr "" + +#: category.php:16 +msgid "Category Archives: %s" +msgstr "" + +#: sidebar.php:27 +msgid "Archives" +msgstr "" + +#: sidebar.php:34 +msgid "Meta" +msgstr "" + +#: tag.php:16 +msgid "Tag Archives: %s" +msgstr "" + +#: comments.php:18 +msgid "" +"This post is password protected. Enter the password to view any comments." +msgstr "" + +#: comments.php:35 +msgid "One Response to %2$s" +msgid_plural "%1$s Responses to %2$s" +msgstr[0] "" +msgstr[1] "" + +#: comments.php:41 comments.php:60 +msgid " Older Comments" +msgstr "" + +#: comments.php:42 comments.php:61 +msgid "Newer Comments " +msgstr "" + +#: comments.php:72 +msgid "Comments are closed." +msgstr "" + +#: 404.php:16 loop.php:33 +msgid "Not Found" +msgstr "" + +#: 404.php:18 +msgid "" +"Apologies, but the page you requested could not be found. Perhaps searching " +"will help." +msgstr "" + +#: loop.php:25 loop.php:178 +msgid " Older posts" +msgstr "" + +#: loop.php:26 loop.php:179 +msgid "Newer posts " +msgstr "" + +#: loop.php:35 +msgid "" +"Apologies, but no results were found for the requested archive. Perhaps " +"searching will help find a related post." +msgstr "" + +#: loop.php:60 loop.php:95 loop.php:96 +msgctxt "gallery category slug" +msgid "gallery" +msgstr "" + +#: loop.php:62 loop.php:83 loop.php:131 +msgid "Permalink to %s" +msgstr "" + +#: loop.php:82 +msgid "This gallery contains %2$s photo." +msgid_plural "This gallery contains %2$s photos." +msgstr[0] "" +msgstr[1] "" + +#: loop.php:93 +msgid "View Galleries" +msgstr "" + +#: loop.php:93 loop.php:96 +msgid "More Galleries" +msgstr "" + +#: loop.php:96 +msgid "View posts in the Gallery category" +msgstr "" + +#: loop.php:99 loop.php:122 loop.php:164 +msgid "Leave a comment" +msgstr "" + +#: loop.php:99 loop.php:122 loop.php:164 +msgid "1 Comment" +msgstr "" + +#: loop.php:99 loop.php:122 loop.php:164 +msgid "% Comments" +msgstr "" + +#: loop.php:106 +msgctxt "asides category slug" +msgid "asides" +msgstr "" + +#: loop.php:151 +msgid "Posted in %2$s" +msgstr "" + +#: loop.php:160 +msgid "Tagged %2$s" +msgstr "" + +#: functions.php:100 +msgid "Primary Navigation" +msgstr "" + +#. translators: header image description +#: functions.php:140 +msgid "Berries" +msgstr "" + +#. translators: header image description +#: functions.php:146 +msgid "Cherry Blossoms" +msgstr "" + +#. translators: header image description +#: functions.php:152 +msgid "Concave" +msgstr "" + +#. translators: header image description +#: functions.php:158 +msgid "Fern" +msgstr "" + +#. translators: header image description +#: functions.php:164 +msgid "Forest Floor" +msgstr "" + +#. translators: header image description +#: functions.php:170 +msgid "Inkwell" +msgstr "" + +#. translators: header image description +#: functions.php:176 +msgid "Path" +msgstr "" + +#. translators: header image description +#: functions.php:182 +msgid "Sunset" +msgstr "" + +#: functions.php:330 +msgid "%s says:" +msgstr "" + +#: functions.php:333 +msgid "Your comment is awaiting moderation." +msgstr "" + +#. translators: 1: date, 2: time +#: functions.php:340 +msgid "%1$s at %2$s" +msgstr "" + +#: functions.php:340 functions.php:357 +msgid "(Edit)" +msgstr "" + +#: functions.php:357 +msgid "Pingback:" +msgstr "" + +#: functions.php:376 +msgid "Primary Widget Area" +msgstr "" + +#: functions.php:378 +msgid "The primary widget area" +msgstr "" + +#: functions.php:387 +msgid "Secondary Widget Area" +msgstr "" + +#: functions.php:389 +msgid "The secondary widget area" +msgstr "" + +#: functions.php:398 +msgid "First Footer Widget Area" +msgstr "" + +#: functions.php:400 +msgid "The first footer widget area" +msgstr "" + +#: functions.php:409 +msgid "Second Footer Widget Area" +msgstr "" + +#: functions.php:411 +msgid "The second footer widget area" +msgstr "" + +#: functions.php:420 +msgid "Third Footer Widget Area" +msgstr "" + +#: functions.php:422 +msgid "The third footer widget area" +msgstr "" + +#: functions.php:431 +msgid "Fourth Footer Widget Area" +msgstr "" + +#: functions.php:433 +msgid "The fourth footer widget area" +msgstr "" + +#: functions.php:467 +msgid "" +"Posted on %2$s by %3$s" +msgstr "" + +#: functions.php:493 +msgid "" +"This entry was posted in %1$s and tagged %2$s. Bookmark the permalink." +msgstr "" + +#: functions.php:495 +msgid "" +"This entry was posted in %1$s. Bookmark the permalink." +msgstr "" + +#: functions.php:497 +msgid "" +"Bookmark the permalink." +msgstr "" + +#: header.php:33 +msgid "Page %s" +msgstr "" + +#: header.php:83 +msgid "Skip to content" +msgstr "" + +#: author.php:27 +msgid "Author Archives: %s" +msgstr "" + +#: author.php:37 loop-single.php:43 +msgid "About %s" +msgstr "" + +#: search.php:16 +msgid "Search Results for: %s" +msgstr "" + +#: search.php:26 +msgid "Nothing Found" +msgstr "" + +#: search.php:28 +msgid "" +"Sorry, but nothing matched your search criteria. Please try again with some " +"different keywords." +msgstr "" + +#: loop-single.php:21 loop-single.php:61 +msgctxt "Previous post link" +msgid "←" +msgstr "" + +#: loop-single.php:22 loop-single.php:62 +msgctxt "Next post link" +msgid "→" +msgstr "" + +#: loop-single.php:47 +msgid "View all posts by %s " +msgstr "" + +#: archive.php:33 +msgid "Daily Archives: %s" +msgstr "" + +#: archive.php:35 +msgid "Monthly Archives: %s" +msgstr "" + +#: archive.php:37 +msgid "Yearly Archives: %s" +msgstr "" + +#: archive.php:39 +msgid "Blog Archives" +msgstr "" + +#. Theme Name of the plugin/theme +msgid "Twenty Ten" +msgstr "" + +#. Description of the plugin/theme +msgid "" +"The 2010 theme for WordPress is stylish, customizable, simple, and readable " +"-- make it yours with a custom menu, header image, and background. Twenty " +"Ten supports six widgetized areas (two in the sidebar, four in the footer) " +"and featured images (thumbnails for gallery posts and custom header images " +"for posts and pages). It includes stylesheets for print and the admin Visual " +"Editor, special styles for posts in the \"Asides\" and \"Gallery\" " +"categories, and has an optional one-column page template that removes the " +"sidebar." +msgstr "" + +#. Author of the plugin/theme +msgid "the WordPress team" +msgstr "" + +#. Tags of the plugin/theme +msgid "" +"black, blue, white, two-columns, fixed-width, custom-header, custom-" +"background, threaded-comments, sticky-post, translation-ready, microformats, " +"rtl-language-support, editor-style, custom-menu" +msgstr "" diff --git a/src/wp-content/themes/twentyten/license.txt b/src/wp-content/themes/twentyten/license.txt new file mode 100644 index 0000000..5fbe4a7 --- /dev/null +++ b/src/wp-content/themes/twentyten/license.txt @@ -0,0 +1,281 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 51 Franklin St, Fifth Floor, Boston, MA 02110, USA + + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + diff --git a/src/wp-content/themes/twentyten/loop-attachment.php b/src/wp-content/themes/twentyten/loop-attachment.php new file mode 100644 index 0000000..7368200 --- /dev/null +++ b/src/wp-content/themes/twentyten/loop-attachment.php @@ -0,0 +1,117 @@ + + + + + post_parent ) ) : ?> +

    ← %s', 'twentyten' ), 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; + } + $k++; + // If there is more than 1 image attachment in a gallery + if ( count( $attachments ) > 1 ) { + 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 ); + } else { + // or, if there's only 1 image attachment, get the URL of the image + $next_attachment_url = wp_get_attachment_url(); + } +?> +

    ID, array( $attachment_width, $attachment_height ) ); // filterable image width with, essentially, no limit for image height. + ?>

    + + + + + +
    +
    post_excerpt ) ) the_excerpt(); ?>
    + +→', 'twentyten' ) ); ?> + '' ) ); ?> + +
    + +
    + + ', '' ); ?> +
    +
    + + + + \ No newline at end of file diff --git a/src/wp-content/themes/twentyten/loop-page.php b/src/wp-content/themes/twentyten/loop-page.php new file mode 100644 index 0000000..252a1d0 --- /dev/null +++ b/src/wp-content/themes/twentyten/loop-page.php @@ -0,0 +1,36 @@ + + + + +
    > + +

    + +

    + + +
    + + '' ) ); ?> + ', '' ); ?> +
    +
    + + + + \ No newline at end of file diff --git a/src/wp-content/themes/twentyten/loop-single.php b/src/wp-content/themes/twentyten/loop-single.php new file mode 100644 index 0000000..c12d47b --- /dev/null +++ b/src/wp-content/themes/twentyten/loop-single.php @@ -0,0 +1,67 @@ + + + + + + +
    > +

    + + + +
    + + '' ) ); ?> +
    + + +
    +
    + +
    + +
    + + +
    + + ', '' ); ?> +
    +
    + + + + + + \ No newline at end of file diff --git a/src/wp-content/themes/twentyten/loop.php b/src/wp-content/themes/twentyten/loop.php new file mode 100644 index 0000000..9dc6297 --- /dev/null +++ b/src/wp-content/themes/twentyten/loop.php @@ -0,0 +1,181 @@ +get_template_part( 'loop', 'index' ); + * + * @package WordPress + * @subpackage Twenty_Ten + * @since Twenty Ten 1.0 + */ +?> + + +max_num_pages > 1 ) : ?> + + + + + +
    +

    +
    +

    + +
    +
    + + + + + + + + ID ) ) || in_category( _x( 'gallery', 'gallery category slug', 'twentyten' ) ) ) : ?> +
    > +

    + + + +
    + + + + $post->ID, 'post_type' => 'attachment', 'post_mime_type' => 'image', 'orderby' => 'menu_order', 'order' => 'ASC', 'numberposts' => 999 ) ); + if ( $images ) : + $total_images = count( $images ); + $image = array_shift( $images ); + $image_img_tag = wp_get_attachment_image( $image->ID, 'thumbnail' ); + ?> + +

    %2$s photo.', 'This gallery contains %2$s photos.', $total_images, 'twentyten' ), + 'href="' . get_permalink() . '" title="' . sprintf( esc_attr__( 'Permalink to %s', 'twentyten' ), the_title_attribute( 'echo=0' ) ) . '" rel="bookmark"', + number_format_i18n( $total_images ) + ); ?>

    + + + +
    + +
    + ID ) ) : ?> + + | + + + | + + + | ', '' ); ?> +
    +
    + + + + ID ) ) || in_category( _x( 'asides', 'asides category slug', 'twentyten' ) ) ) : ?> +
    > + + +
    + +
    + +
    + →', 'twentyten' ) ); ?> +
    + + +
    + + | + + | ', '' ); ?> +
    +
    + + + + +
    > +

    + + + + +
    + +
    + +
    + →', 'twentyten' ) ); ?> + '' ) ); ?> +
    + + +
    + + + Posted in %2$s', 'twentyten' ), 'entry-utility-prep entry-utility-prep-cat-links', get_the_category_list( ', ' ) ); ?> + + | + + + + Tagged %2$s', 'twentyten' ), 'entry-utility-prep entry-utility-prep-tag-links', $tags_list ); ?> + + | + + + | ', '' ); ?> +
    +
    + + + + + + + + +max_num_pages > 1 ) : ?> + + diff --git a/src/wp-content/themes/twentyten/onecolumn-page.php b/src/wp-content/themes/twentyten/onecolumn-page.php new file mode 100644 index 0000000..1a8d5b7 --- /dev/null +++ b/src/wp-content/themes/twentyten/onecolumn-page.php @@ -0,0 +1,31 @@ + + +
    +
    + + + +
    +
    + + diff --git a/src/wp-content/themes/twentyten/page.php b/src/wp-content/themes/twentyten/page.php new file mode 100644 index 0000000..1a55042 --- /dev/null +++ b/src/wp-content/themes/twentyten/page.php @@ -0,0 +1,32 @@ + + +
    +
    + + + +
    +
    + + + diff --git a/src/wp-content/themes/twentyten/rtl.css b/src/wp-content/themes/twentyten/rtl.css new file mode 100644 index 0000000..339e6e5 --- /dev/null +++ b/src/wp-content/themes/twentyten/rtl.css @@ -0,0 +1,285 @@ +/* +Theme Name: Twenty Ten +*/ + + +/* +RTL Basics +*/ + + +body { + direction:rtl; + unicode-bidi:embed; +} + + +/* +LAYOUT: Two-Column (Right) +DESCRIPTION: Two-column fixed layout with one sidebar right of content +*/ + +#container { + float: right; + margin: 0 0 0 -240px; +} +#content { + margin: 0 20px 36px 280px; +} +#primary, +#secondary { + float: left; +} +#secondary { + clear: left; +} + + +/* =Fonts +-------------------------------------------------------------- */ +body, +input, +textarea, +.page-title span, +.pingback a.url, +h3#comments-title, +h3#reply-title, +#access .menu, +#access div.menu ul, +#cancel-comment-reply-link, +.form-allowed-tags, +#site-info, +#site-title, +#wp-calendar, +.comment-meta, +.comment-body tr th, +.comment-body thead th, +.entry-content label, +.entry-content tr th, +.entry-content thead th, +.entry-meta, +.entry-title, +.entry-utility, +#respond label, +.navigation, +.page-title, +.pingback p, +.reply, +.widget-title, +input[type=submit] { + font-family: Arial, Tahoma, sans-serif; +} + +/* =Structure +-------------------------------------------------------------- */ + +/* The main theme structure */ +#footer-widget-area .widget-area { + float: right; + margin-left: 20px; + margin-right: 0; +} +#footer-widget-area #fourth { + margin-left: 0; +} +#site-info { + float: right; +} +#site-generator { + float: left; +} + + +/* =Global Elements +-------------------------------------------------------------- */ + +/* Text elements */ +ul, ol { + margin: 0 1.5em 18px 0; +} +blockquote { + font-style: normal; +} + +/* Text meant only for screen readers */ +.screen-reader-text { + left: auto; + text-indent:-9000px; + overflow:hidden; +} + + +/* =Header +-------------------------------------------------------------- */ + +#site-title { + float: right; +} +#site-description { + clear: left; + float: left; + font-style: normal; +} +#branding img { + float: right; +} + +/* =Menu +-------------------------------------------------------------- */ + +#access { + float:right; +} + +#access .menu-header, +div.menu { + margin-right: 12px; + margin-left: 0; +} + +#access .menu-header li, +div.menu li{ + float:right; +} + +#access ul ul { + left:auto; + right:0; + float:right; +} +#access ul ul ul { + left:auto; + right:100%; +} + +/* =Content +-------------------------------------------------------------- */ + +#content table { + text-align: right; + margin: 0 0 24px -1px; +} +.page-title span { + font-style:normal; +} +.entry-title, +.entry-meta { + clear: right; + float: right; + margin-left: 68px; + margin-right: 0; +} + +.entry-content input.file, +.entry-content input.button { + margin-left: 24px; + margin-right:0; +} +.entry-content blockquote.left { + float: right; + margin-right: 0; + margin-left: 24px; + text-align: left; +} +.entry-content blockquote.right { + float: left; + margin-right: 24px; + margin-left: 0; + text-align: right; +} +#entry-author-info #author-avatar { + float: right; + margin: 0 0 0 -104px; +} +#entry-author-info #author-description { + float: right; + margin: 0 104px 0 0; +} + +/* Gallery listing +-------------------------------------------------------------- */ + +.category-gallery .gallery-thumb { + float: right; + margin-left:20px; + margin-right:0; +} + + +/* Images +-------------------------------------------------------------- */ + +#content .gallery .gallery-caption { + margin-right: 0; +} + +#content .gallery .gallery-item { + float: right; +} + +/* =Navigation +-------------------------------------------------------------- */ +.nav-previous { + float: right; +} +.nav-next { + float: left; + text-align:left; +} + +/* =Comments +-------------------------------------------------------------- */ + +.commentlist li.comment { + padding: 0 56px 0 0; +} +.commentlist .avatar { + right: 0; + left: auto; +} +.comment-author .says, #comments .pingback .url { + font-style: normal; +} + +/* Comments form */ +.children #respond { + margin: 0 0 0 48px; +} + +/* =Widget Areas +-------------------------------------------------------------- */ + +.widget-area ul { + margin-right: 0; +} +.widget-area ul ul { + margin-right: 1.3em; + margin-left: 0; +} +#wp-calendar caption { + text-align: right; +} +#wp-calendar tfoot #next { + text-align: left; +} + +/* Main sidebars */ +#main .widget-area ul { + margin-right: 0; + padding: 0 0 0 20px; +} +#main .widget-area ul ul { + margin-right: 1.3em; + margin-left: 0; +} + +/* =Footer +-------------------------------------------------------------- */ +#site-generator { + font-style:normal; +} +#site-generator a { + background-position: right center; + padding-right: 20px; + padding-left: 0; +} \ No newline at end of file diff --git a/src/wp-content/themes/twentyten/screenshot.png b/src/wp-content/themes/twentyten/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..256069fc5963f7ed9f2cbd25fc2f6741db1db859 GIT binary patch literal 34923 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 literal 0 HcmV?d00001 diff --git a/src/wp-content/themes/twentyten/search.php b/src/wp-content/themes/twentyten/search.php new file mode 100644 index 0000000..3b198bb --- /dev/null +++ b/src/wp-content/themes/twentyten/search.php @@ -0,0 +1,37 @@ + + +
    +
    + + +

    ' . get_search_query() . '' ); ?>

    + + +
    +

    +
    +

    + +
    +
    + +
    +
    + + + diff --git a/src/wp-content/themes/twentyten/sidebar-footer.php b/src/wp-content/themes/twentyten/sidebar-footer.php new file mode 100644 index 0000000..0e9f702 --- /dev/null +++ b/src/wp-content/themes/twentyten/sidebar-footer.php @@ -0,0 +1,60 @@ + + + + + diff --git a/src/wp-content/themes/twentyten/sidebar.php b/src/wp-content/themes/twentyten/sidebar.php new file mode 100644 index 0000000..8a1664f --- /dev/null +++ b/src/wp-content/themes/twentyten/sidebar.php @@ -0,0 +1,56 @@ + + + + + + + + + diff --git a/src/wp-content/themes/twentyten/single.php b/src/wp-content/themes/twentyten/single.php new file mode 100644 index 0000000..a0dea11 --- /dev/null +++ b/src/wp-content/themes/twentyten/single.php @@ -0,0 +1,27 @@ + + +
    +
    + + + +
    +
    + + + diff --git a/src/wp-content/themes/twentyten/style.css b/src/wp-content/themes/twentyten/style.css new file mode 100644 index 0000000..ee5d61d --- /dev/null +++ b/src/wp-content/themes/twentyten/style.css @@ -0,0 +1,1357 @@ +/* +Theme Name: Twenty Ten +Theme URI: http://wordpress.org/ +Description: The 2010 theme for WordPress is stylish, customizable, simple, and readable -- make it yours with a custom menu, header image, and background. Twenty Ten supports six widgetized areas (two in the sidebar, four in the footer) and featured images (thumbnails for gallery posts and custom header images for posts and pages). It includes stylesheets for print and the admin Visual Editor, special styles for posts in the "Asides" and "Gallery" categories, and has an optional one-column page template that removes the sidebar. +Author: the WordPress team +Version: 1.2 +License: GNU General Public License +License URI: license.txt +Tags: black, blue, white, two-columns, fixed-width, custom-header, custom-background, threaded-comments, sticky-post, translation-ready, microformats, rtl-language-support, editor-style, custom-menu +*/ + + +/* =Reset default browser CSS. Based on work by Eric Meyer: http://meyerweb.com/eric/tools/css/reset/index.html +-------------------------------------------------------------- */ + +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, img, ins, kbd, q, s, samp, +small, strike, strong, sub, sup, tt, var, +b, u, i, center, +dl, dt, dd, ol, ul, li, +fieldset, form, label, legend, +table, caption, tbody, tfoot, thead, tr, th, td { + background: transparent; + border: 0; + margin: 0; + padding: 0; + vertical-align: baseline; +} +body { + line-height: 1; +} +h1, h2, h3, h4, h5, h6 { + clear: both; + font-weight: normal; +} +ol, ul { + list-style: none; +} +blockquote { + quotes: none; +} +blockquote:before, blockquote:after { + content: ''; + content: none; +} +del { + text-decoration: line-through; +} +/* tables still need 'cellspacing="0"' in the markup */ +table { + border-collapse: collapse; + border-spacing: 0; +} +a img { + border: none; +} + +/* =Layout +-------------------------------------------------------------- */ + +/* +LAYOUT: Two columns +DESCRIPTION: Two-column fixed layout with one sidebar right of content +*/ + +#container { + float: left; + margin: 0 -240px 0 0; + width: 100%; +} +#content { + margin: 0 280px 0 20px; +} +#primary, +#secondary { + float: right; + overflow: hidden; + width: 220px; +} +#secondary { + clear: right; +} +#footer { + clear: both; + width: 100%; +} + +/* +LAYOUT: One column, no sidebar +DESCRIPTION: One centered column with no sidebar +*/ + +.one-column #content { + margin: 0 auto; + width: 640px; +} + +/* +LAYOUT: Full width, no sidebar +DESCRIPTION: Full width content with no sidebar; used for attachment pages +*/ + +.single-attachment #content { + margin: 0 auto; + width: 900px; +} + + +/* =Fonts +-------------------------------------------------------------- */ +body, +input, +textarea, +.page-title span, +.pingback a.url { + font-family: Georgia, "Bitstream Charter", serif; +} +h3#comments-title, +h3#reply-title, +#access .menu, +#access div.menu ul, +#cancel-comment-reply-link, +.form-allowed-tags, +#site-info, +#site-title, +#wp-calendar, +.comment-meta, +.comment-body tr th, +.comment-body thead th, +.entry-content label, +.entry-content tr th, +.entry-content thead th, +.entry-meta, +.entry-title, +.entry-utility, +#respond label, +.navigation, +.page-title, +.pingback p, +.reply, +.widget-title, +.wp-caption-text { + font-family: "Helvetica Neue", Arial, Helvetica, "Nimbus Sans L", sans-serif; +} +input[type=submit] { + font-family: "Helvetica Neue", Arial, Helvetica, "Nimbus Sans L", sans-serif; +} +pre { + font-family: "Courier 10 Pitch", Courier, monospace; +} +code { + font-family: Monaco, Consolas, "Andale Mono", "DejaVu Sans Mono", monospace; +} + + +/* =Structure +-------------------------------------------------------------- */ + +/* The main theme structure */ +#access .menu-header, +div.menu, +#colophon, +#branding, +#main, +#wrapper { + margin: 0 auto; + width: 940px; +} +#wrapper { + background: #fff; + margin-top: 20px; + padding: 0 20px; +} + +/* Structure the footer area */ +#footer-widget-area { + overflow: hidden; +} +#footer-widget-area .widget-area { + float: left; + margin-right: 20px; + width: 220px; +} +#footer-widget-area #fourth { + margin-right: 0; +} +#site-info { + float: left; + font-size: 14px; + font-weight: bold; + width: 700px; +} +#site-generator { + float: right; + width: 220px; +} + + +/* =Global Elements +-------------------------------------------------------------- */ + +/* Main global 'theme' and typographic styles */ +body { + background: #f1f1f1; +} +body, +input, +textarea { + color: #666; + font-size: 12px; + line-height: 18px; +} +hr { + background-color: #e7e7e7; + border: 0; + clear: both; + height: 1px; + margin-bottom: 18px; +} + +/* Text elements */ +p { + margin-bottom: 18px; +} +ul { + list-style: square; + margin: 0 0 18px 1.5em; +} +ol { + list-style: decimal; + margin: 0 0 18px 1.5em; +} +ol ol { + list-style: upper-alpha; +} +ol ol ol { + list-style: lower-roman; +} +ol ol ol ol { + list-style: lower-alpha; +} +ul ul, +ol ol, +ul ol, +ol ul { + margin-bottom: 0; +} +dl { + margin: 0 0 24px 0; +} +dt { + font-weight: bold; +} +dd { + margin-bottom: 18px; +} +strong { + font-weight: bold; +} +cite, +em, +i { + font-style: italic; +} +big { + font-size: 131.25%; +} +ins { + background: #ffc; + text-decoration: none; +} +blockquote { + font-style: italic; + padding: 0 3em; +} +blockquote cite, +blockquote em, +blockquote i { + font-style: normal; +} +pre { + background: #f7f7f7; + color: #222; + line-height: 18px; + margin-bottom: 18px; + padding: 1.5em; +} +abbr, +acronym { + border-bottom: 1px dotted #666; + cursor: help; +} +sup, +sub { + height: 0; + line-height: 1; + position: relative; + vertical-align: baseline; +} +sup { + bottom: 1ex; +} +sub { + top: .5ex; +} +input[type="text"], +textarea { + background: #f9f9f9; + border: 1px solid #ccc; + box-shadow: inset 1px 1px 1px rgba(0,0,0,0.1); + -moz-box-shadow: inset 1px 1px 1px rgba(0,0,0,0.1); + -webkit-box-shadow: inset 1px 1px 1px rgba(0,0,0,0.1); + padding: 2px; +} +a:link { + color: #0066cc; +} +a:visited { + color: #743399; +} +a:active, +a:hover { + color: #ff4b33; +} + +/* Text meant only for screen readers */ +.screen-reader-text { + position: absolute; + left: -9000px; +} + + +/* =Header +-------------------------------------------------------------- */ + +#header { + padding: 30px 0 0 0; +} +#site-title { + float: left; + font-size: 30px; + line-height: 36px; + margin: 0 0 18px 0; + width: 700px; +} +#site-title a { + color: #000; + font-weight: bold; + text-decoration: none; +} +#site-description { + clear: right; + float: right; + font-style: italic; + margin: 15px 0 18px 0; + width: 220px; +} + +/* This is the custom header image */ +#branding img { + border-top: 4px solid #000; + border-bottom: 1px solid #000; + display: block; + float: left; +} + + +/* =Menu +-------------------------------------------------------------- */ + +#access { + background: #000; + display: block; + float: left; + margin: 0 auto; + width: 940px; +} +#access .menu-header, +div.menu { + font-size: 13px; + margin-left: 12px; + width: 928px; +} +#access .menu-header ul, +div.menu ul { + list-style: none; + margin: 0; +} +#access .menu-header li, +div.menu li { + float: left; + position: relative; +} +#access a { + color: #aaa; + display: block; + line-height: 38px; + padding: 0 10px; + text-decoration: none; +} +#access ul ul { + box-shadow: 0px 3px 3px rgba(0,0,0,0.2); + -moz-box-shadow: 0px 3px 3px rgba(0,0,0,0.2); + -webkit-box-shadow: 0px 3px 3px rgba(0,0,0,0.2); + display: none; + position: absolute; + top: 38px; + left: 0; + float: left; + width: 180px; + z-index: 99999; +} +#access ul ul li { + min-width: 180px; +} +#access ul ul ul { + left: 100%; + top: 0; +} +#access ul ul a { + background: #333; + line-height: 1em; + padding: 10px; + width: 160px; + height: auto; +} +#access li:hover > a, +#access ul ul :hover > a { + background: #333; + color: #fff; +} +#access ul li:hover > ul { + display: block; +} +#access ul li.current_page_item > a, +#access ul li.current-menu-ancestor > a, +#access ul li.current-menu-item > a, +#access ul li.current-menu-parent > a { + color: #fff; +} +* html #access ul li.current_page_item a, +* html #access ul li.current-menu-ancestor a, +* html #access ul li.current-menu-item a, +* html #access ul li.current-menu-parent a, +* html #access ul li a:hover { + color: #fff; +} + + +/* =Content +-------------------------------------------------------------- */ + +#main { + clear: both; + overflow: hidden; + padding: 40px 0 0 0; +} +#content { + margin-bottom: 36px; +} +#content, +#content input, +#content textarea { + color: #333; + font-size: 16px; + line-height: 24px; +} +#content p, +#content ul, +#content ol, +#content dd, +#content pre, +#content hr { + margin-bottom: 24px; +} +#content ul ul, +#content ol ol, +#content ul ol, +#content ol ul { + margin-bottom: 0; +} +#content pre, +#content kbd, +#content tt, +#content var { + font-size: 15px; + line-height: 21px; +} +#content code { + font-size: 13px; +} +#content dt, +#content th { + color: #000; +} +#content h1, +#content h2, +#content h3, +#content h4, +#content h5, +#content h6 { + color: #000; + line-height: 1.5em; + margin: 0 0 20px 0; +} +#content table { + border: 1px solid #e7e7e7; + margin: 0 -1px 24px 0; + text-align: left; + width: 100%; +} +#content tr th, +#content thead th { + color: #888; + font-size: 12px; + font-weight: bold; + line-height: 18px; + padding: 9px 24px; +} +#content tr td { + border-top: 1px solid #e7e7e7; + padding: 6px 24px; +} +#content tr.odd td { + background: #f2f7fc; +} +.hentry { + margin: 0 0 48px 0; +} +.home .sticky { + background: #f2f7fc; + border-top: 4px solid #000; + margin-left: -20px; + margin-right: -20px; + padding: 18px 20px; +} +.single .hentry { + margin: 0 0 36px 0; +} +.page-title { + color: #000; + font-size: 14px; + font-weight: bold; + margin: 0 0 36px 0; +} +.page-title span { + color: #333; + font-size: 16px; + font-style: italic; + font-weight: normal; +} +.page-title a:link, +.page-title a:visited { + color: #888; + text-decoration: none; +} +.page-title a:active, +.page-title a:hover { + color: #ff4b33; +} +#content .entry-title { + color: #000; + font-size: 21px; + font-weight: bold; + line-height: 1.3em; + margin-bottom: 0; +} +.entry-title a:link, +.entry-title a:visited { + color: #000; + text-decoration: none; +} +.entry-title a:active, +.entry-title a:hover { + color: #ff4b33; +} +.entry-meta { + color: #888; + font-size: 12px; +} +.entry-meta abbr, +.entry-utility abbr { + border: none; +} +.entry-meta abbr:hover, +.entry-utility abbr:hover { + border-bottom: 1px dotted #666; +} +.entry-content, +.entry-summary { + clear: both; + padding: 12px 0 0 0; +} +#content .entry-summary p:last-child { + margin-bottom: 12px; +} +.entry-content fieldset { + border: 1px solid #e7e7e7; + margin: 0 0 24px 0; + padding: 24px; +} +.entry-content fieldset legend { + background: #fff; + color: #000; + font-weight: bold; + padding: 0 24px; +} +.entry-content input { + margin: 0 0 24px 0; +} +.entry-content input.file, +.entry-content input.button { + margin-right: 24px; +} +.entry-content label { + color: #888; + font-size: 12px; +} +.entry-content select { + margin: 0 0 24px 0; +} +.entry-content sup, +.entry-content sub { + font-size: 10px; +} +.entry-content blockquote.left { + float: left; + margin-left: 0; + margin-right: 24px; + text-align: right; + width: 33%; +} +.entry-content blockquote.right { + float: right; + margin-left: 24px; + margin-right: 0; + text-align: left; + width: 33%; +} +.page-link { + clear: both; + color: #000; + font-weight: bold; + margin: 0 0 22px 0; + word-spacing: 0.5em; +} +.page-link a:link, +.page-link a:visited { + background: #f1f1f1; + color: #333; + font-weight: normal; + padding: 0.5em 0.75em; + text-decoration: none; +} +.home .sticky .page-link a { + background: #d9e8f7; +} +.page-link a:active, +.page-link a:hover { + color: #ff4b33; +} +body.page .edit-link { + clear: both; + display: block; +} +#entry-author-info { + background: #f2f7fc; + border-top: 4px solid #000; + clear: both; + font-size: 14px; + line-height: 20px; + margin: 24px 0; + overflow: hidden; + padding: 18px 20px; +} +#entry-author-info #author-avatar { + background: #fff; + border: 1px solid #e7e7e7; + float: left; + height: 60px; + margin: 0 -104px 0 0; + padding: 11px; +} +#entry-author-info #author-description { + float: left; + margin: 0 0 0 104px; +} +#entry-author-info h2 { + color: #000; + font-size: 100%; + font-weight: bold; + margin-bottom: 0; +} +.entry-utility { + clear: both; + color: #888; + font-size: 12px; + line-height: 18px; +} +.entry-meta a, +.entry-utility a { + color: #888; +} +.entry-meta a:hover, +.entry-utility a:hover { + color: #ff4b33; +} +#content .video-player { + padding: 0; +} + + +/* =Asides +-------------------------------------------------------------- */ + +.home #content .format-aside p, +.home #content .category-asides p { + font-size: 14px; + line-height: 20px; + margin-bottom: 10px; + margin-top: 0; +} +.home .hentry.format-aside, +.home .hentry.category-asides { + padding: 0; +} +.home #content .format-aside .entry-content, +.home #content .category-asides .entry-content { + padding-top: 0; +} + + +/* =Gallery listing +-------------------------------------------------------------- */ + +.format-gallery .size-thumbnail img, +.category-gallery .size-thumbnail img { + border: 10px solid #f1f1f1; + margin-bottom: 0; +} +.format-gallery .gallery-thumb, +.category-gallery .gallery-thumb { + float: left; + margin-right: 20px; + margin-top: -4px; +} +.home #content .format-gallery .entry-utility, +.home #content .category-gallery .entry-utility { + padding-top: 4px; +} + + +/* =Attachment pages +-------------------------------------------------------------- */ + +.attachment .entry-content .entry-caption { + font-size: 140%; + margin-top: 24px; +} +.attachment .entry-content .nav-previous a:before { + content: '\2190\00a0'; +} +.attachment .entry-content .nav-next a:after { + content: '\00a0\2192'; +} + + +/* =Images +-------------------------------------------------------------- */ + +/* +Resize images to fit the main content area. +- Applies only to images uploaded via WordPress by targeting size-* classes. +- Other images will be left alone. Use "size-auto" class to apply to other images. +*/ +img.size-auto, +img.size-full, +img.size-large, +img.size-medium, +.attachment img { + max-width: 100%; /* When images are too wide for containing element, force them to fit. */ + height: auto; /* Override height to match resized width for correct aspect ratio. */ +} +.alignleft, +img.alignleft { + display: inline; + float: left; + margin-right: 24px; + margin-top: 4px; +} +.alignright, +img.alignright { + display: inline; + float: right; + margin-left: 24px; + margin-top: 4px; +} +.aligncenter, +img.aligncenter { + clear: both; + display: block; + margin-left: auto; + margin-right: auto; +} +img.alignleft, +img.alignright, +img.aligncenter { + margin-bottom: 12px; +} +.wp-caption { + background: #f1f1f1; + line-height: 18px; + margin-bottom: 20px; + max-width: 632px !important; /* prevent too-wide images from breaking layout */ + padding: 4px; + text-align: center; +} +.wp-caption img { + margin: 5px 5px 0; +} +.wp-caption p.wp-caption-text { + color: #888; + font-size: 12px; + margin: 5px; +} +.wp-smiley { + margin: 0; +} +.gallery { + margin: 0 auto 18px; +} +.gallery .gallery-item { + float: left; + margin-top: 0; + text-align: center; + width: 33%; +} +.gallery-columns-2 .gallery-item { + width: 50%; +} +.gallery-columns-4 .gallery-item { + width: 25%; +} +.gallery img { + border: 2px solid #cfcfcf; +} +.gallery-columns-2 .attachment-medium { + max-width: 92%; + height: auto; +} +.gallery-columns-4 .attachment-thumbnail { + max-width: 84%; + height: auto; +} +.gallery .gallery-caption { + color: #888; + font-size: 12px; + margin: 0 0 12px; +} +.gallery dl { + margin: 0; +} +.gallery img { + border: 10px solid #f1f1f1; +} +.gallery br+br { + display: none; +} +#content .attachment img {/* single attachment images should be centered */ + display: block; + margin: 0 auto; +} + + +/* =Navigation +-------------------------------------------------------------- */ + +.navigation { + color: #888; + font-size: 12px; + line-height: 18px; + overflow: hidden; +} +.navigation a:link, +.navigation a:visited { + color: #888; + text-decoration: none; +} +.navigation a:active, +.navigation a:hover { + color: #ff4b33; +} +.nav-previous { + float: left; + width: 50%; +} +.nav-next { + float: right; + text-align: right; + width: 50%; +} +#nav-above { + margin: 0 0 18px 0; +} +#nav-above { + display: none; +} +.paged #nav-above, +.single #nav-above { + display: block; +} +#nav-below { + margin: -18px 0 0 0; +} + + +/* =Comments +-------------------------------------------------------------- */ +#comments { + clear: both; +} +#comments .navigation { + padding: 0 0 18px 0; +} +h3#comments-title, +h3#reply-title { + color: #000; + font-size: 20px; + font-weight: bold; + margin-bottom: 0; +} +h3#comments-title { + padding: 24px 0; +} +.commentlist { + list-style: none; + margin: 0; +} +.commentlist li.comment { + border-bottom: 1px solid #e7e7e7; + line-height: 24px; + margin: 0 0 24px 0; + padding: 0 0 0 56px; + position: relative; +} +.commentlist li:last-child { + border-bottom: none; + margin-bottom: 0; +} +#comments .comment-body ul, +#comments .comment-body ol { + margin-bottom: 18px; +} +#comments .comment-body p:last-child { + margin-bottom: 6px; +} +#comments .comment-body blockquote p:last-child { + margin-bottom: 24px; +} +.commentlist ol { + list-style: decimal; +} +.commentlist .avatar { + position: absolute; + top: 4px; + left: 0; +} +.comment-author { +} +.comment-author cite { + color: #000; + font-style: normal; + font-weight: bold; +} +.comment-author .says { + font-style: italic; +} +.comment-meta { + font-size: 12px; + margin: 0 0 18px 0; +} +.comment-meta a:link, +.comment-meta a:visited { + color: #888; + text-decoration: none; +} +.comment-meta a:active, +.comment-meta a:hover { + color: #ff4b33; +} +.commentlist .even { +} +.commentlist .bypostauthor { +} +.reply { + font-size: 12px; + padding: 0 0 24px 0; +} +.reply a, +a.comment-edit-link { + color: #888; +} +.reply a:hover, +a.comment-edit-link:hover { + color: #ff4b33; +} +.commentlist .children { + list-style: none; + margin: 0; +} +.commentlist .children li { + border: none; + margin: 0; +} +.nopassword, +.nocomments { + display: none; +} +#comments .pingback { + border-bottom: 1px solid #e7e7e7; + margin-bottom: 18px; + padding-bottom: 18px; +} +.commentlist li.comment+li.pingback { + margin-top: -6px; +} +#comments .pingback p { + color: #888; + display: block; + font-size: 12px; + line-height: 18px; + margin: 0; +} +#comments .pingback .url { + font-size: 13px; + font-style: italic; +} + +/* Comments form */ +input[type=submit] { + color: #333; +} +#respond { + border-top: 1px solid #e7e7e7; + margin: 24px 0; + overflow: hidden; + position: relative; +} +#respond p { + margin: 0; +} +#respond .comment-notes { + margin-bottom: 1em; +} +.form-allowed-tags { + line-height: 1em; +} +.children #respond { + margin: 0 48px 0 0; +} +h3#reply-title { + margin: 18px 0; +} +#comments-list #respond { + margin: 0 0 18px 0; +} +#comments-list ul #respond { + margin: 0; +} +#cancel-comment-reply-link { + font-size: 12px; + font-weight: normal; + line-height: 18px; +} +#respond .required { + color: #ff4b33; + font-weight: bold; +} +#respond label { + color: #888; + font-size: 12px; +} +#respond input { + margin: 0 0 9px; + width: 98%; +} +#respond textarea { + width: 98%; +} +#respond .form-allowed-tags { + color: #888; + font-size: 12px; + line-height: 18px; +} +#respond .form-allowed-tags code { + font-size: 11px; +} +#respond .form-submit { + margin: 12px 0; +} +#respond .form-submit input { + font-size: 14px; + width: auto; +} + + +/* =Widget Areas +-------------------------------------------------------------- */ + +.widget-area ul { + list-style: none; + margin-left: 0; +} +.widget-area ul ul { + list-style: square; + margin-left: 1.3em; +} +.widget-area select { + max-width: 100%; +} +.widget_search #s {/* This keeps the search inputs in line */ + width: 60%; +} +.widget_search label { + display: none; +} +.widget-container { + margin: 0 0 18px 0; +} +.widget-title { + color: #222; + font-weight: bold; +} +.widget-area a:link, +.widget-area a:visited { + text-decoration: none; +} +.widget-area a:active, +.widget-area a:hover { + text-decoration: underline; +} +.widget-area .entry-meta { + font-size: 11px; +} +#wp_tag_cloud div { + line-height: 1.6em; +} +#wp-calendar { + width: 100%; +} +#wp-calendar caption { + color: #222; + font-size: 14px; + font-weight: bold; + padding-bottom: 4px; + text-align: left; +} +#wp-calendar thead { + font-size: 11px; +} +#wp-calendar thead th { +} +#wp-calendar tbody { + color: #aaa; +} +#wp-calendar tbody td { + background: #f5f5f5; + border: 1px solid #fff; + padding: 3px 0 2px; + text-align: center; +} +#wp-calendar tbody .pad { + background: none; +} +#wp-calendar tfoot #next { + text-align: right; +} +.widget_rss a.rsswidget { + color: #000; +} +.widget_rss a.rsswidget:hover { + color: #ff4b33; +} +.widget_rss .widget-title img { + width: 11px; + height: 11px; +} + +/* Main sidebars */ +#main .widget-area ul { + margin-left: 0; + padding: 0 20px 0 0; +} +#main .widget-area ul ul { + border: none; + margin-left: 1.3em; + padding: 0; +} +#primary { +} +#secondary { +} + +/* Footer widget areas */ +#footer-widget-area { +} + + +/* =Footer +-------------------------------------------------------------- */ + +#footer { + margin-bottom: 20px; +} +#colophon { + border-top: 4px solid #000; + margin-top: -4px; + overflow: hidden; + padding: 18px 0; +} +#site-info { + font-weight: bold; +} +#site-info a { + color: #000; + text-decoration: none; +} +#site-generator { + font-style: italic; + position: relative; +} +#site-generator a { + background: url(images/wordpress.png) center left no-repeat; + color: #666; + display: inline-block; + line-height: 16px; + padding-left: 20px; + text-decoration: none; +} +#site-generator a:hover { + text-decoration: underline; +} +img#wpstats { + display: block; + margin: 0 auto 10px; +} + + +/* =Mobile Safari ( iPad, iPhone and iPod Touch ) +-------------------------------------------------------------- */ + +pre { + -webkit-text-size-adjust: 140%; +} +code { + -webkit-text-size-adjust: 160%; +} +#access, +.entry-meta, +.entry-utility, +.navigation, +.widget-area { + -webkit-text-size-adjust: 120%; +} +#site-description { + -webkit-text-size-adjust: none; +} + + +/* =Print Style +-------------------------------------------------------------- */ + +@media print { + body { + background: none !important; + } + #wrapper { + clear: both !important; + display: block !important; + float: none !important; + position: relative !important; + } + #header { + border-bottom: 2pt solid #000; + padding-bottom: 18pt; + } + #colophon { + border-top: 2pt solid #000; + } + #site-title, + #site-description { + float: none; + line-height: 1.4em; + margin: 0; + padding: 0; + } + #site-title { + font-size: 13pt; + } + .entry-content { + font-size: 14pt; + line-height: 1.6em; + } + .entry-title { + font-size: 21pt; + } + #access, + #branding img, + #respond, + .comment-edit-link, + .edit-link, + .navigation, + .page-link, + .widget-area { + display: none !important; + } + #container, + #header, + #footer { + margin: 0; + width: 100%; + } + #content, + .one-column #content { + margin: 24pt 0 0; + width: 100%; + } + .wp-caption p { + font-size: 11pt; + } + #site-info, + #site-generator { + float: none; + width: auto; + } + #colophon { + width: auto; + } + img#wpstats { + display: none; + } + #site-generator a { + margin: 0; + padding: 0; + } + #entry-author-info { + border: 1px solid #e7e7e7; + } + #main { + display: inline; + } + .home .sticky { + border: none; + } +} \ No newline at end of file diff --git a/src/wp-content/themes/twentyten/tag.php b/src/wp-content/themes/twentyten/tag.php new file mode 100644 index 0000000..2c0cb87 --- /dev/null +++ b/src/wp-content/themes/twentyten/tag.php @@ -0,0 +1,30 @@ + + +
    +
    + +

    ' . single_tag_title( '', false ) . '' ); + ?>

    + + +
    +
    + + + diff --git a/src/wp-cron.php b/src/wp-cron.php new file mode 100644 index 0000000..19427c5 --- /dev/null +++ b/src/wp-cron.php @@ -0,0 +1,60 @@ + $local_time ) + die(); + +foreach ($crons as $timestamp => $cronhooks) { + if ( $timestamp > $local_time ) + break; + + foreach ($cronhooks as $hook => $keys) { + + foreach ($keys as $k => $v) { + + $schedule = $v['schedule']; + + if ($schedule != false) { + $new_args = array($timestamp, $schedule, $hook, $v['args']); + call_user_func_array('wp_reschedule_event', $new_args); + } + + wp_unschedule_event($timestamp, $hook, $v['args']); + + do_action_ref_array($hook, $v['args']); + } + } +} + +die(); diff --git a/src/wp-feed.php b/src/wp-feed.php new file mode 100644 index 0000000..afce8cd --- /dev/null +++ b/src/wp-feed.php @@ -0,0 +1,12 @@ + diff --git a/src/wp-includes/Text/Diff.php b/src/wp-includes/Text/Diff.php new file mode 100644 index 0000000..3ba7b4c --- /dev/null +++ b/src/wp-includes/Text/Diff.php @@ -0,0 +1,450 @@ +, and is used/adapted with his permission. + * + * Copyright 2004 Geoffrey T. Dairiki + * 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 + */ +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 Text_Diff($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); + } + + /** + * 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: + * + * $diff = new Text_Diff($lines1, $lines2); + * $rev = $diff->reverse(); + * + * + * @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. + */ + 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 + */ +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 Text_MappedDiff($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); + } + } + } + +} + +/** + * @package Text_Diff + * @author Geoffrey T. Dairiki + * + * @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 + * + * @access private + */ +class Text_Diff_Op_copy extends Text_Diff_Op { + + function Text_Diff_Op_copy($orig, $final = false) + { + if (!is_array($final)) { + $final = $orig; + } + $this->orig = $orig; + $this->final = $final; + } + + function &reverse() + { + $reverse = &new Text_Diff_Op_copy($this->final, $this->orig); + return $reverse; + } + +} + +/** + * @package Text_Diff + * @author Geoffrey T. Dairiki + * + * @access private + */ +class Text_Diff_Op_delete extends Text_Diff_Op { + + function Text_Diff_Op_delete($lines) + { + $this->orig = $lines; + $this->final = false; + } + + function &reverse() + { + $reverse = &new Text_Diff_Op_add($this->orig); + return $reverse; + } + +} + +/** + * @package Text_Diff + * @author Geoffrey T. Dairiki + * + * @access private + */ +class Text_Diff_Op_add extends Text_Diff_Op { + + function Text_Diff_Op_add($lines) + { + $this->final = $lines; + $this->orig = false; + } + + function &reverse() + { + $reverse = &new Text_Diff_Op_delete($this->final); + return $reverse; + } + +} + +/** + * @package Text_Diff + * @author Geoffrey T. Dairiki + * + * @access private + */ +class Text_Diff_Op_change extends Text_Diff_Op { + + function Text_Diff_Op_change($orig, $final) + { + $this->orig = $orig; + $this->final = $final; + } + + function &reverse() + { + $reverse = &new Text_Diff_Op_change($this->final, $this->orig); + return $reverse; + } + +} diff --git a/src/wp-includes/Text/Diff/Engine/native.php b/src/wp-includes/Text/Diff/Engine/native.php new file mode 100644 index 0000000..93eaef2 --- /dev/null +++ b/src/wp-includes/Text/Diff/Engine/native.php @@ -0,0 +1,436 @@ + 2, and some optimizations) are from + * Geoffrey T. Dairiki . 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 + * @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/src/wp-includes/Text/Diff/Engine/shell.php b/src/wp-includes/Text/Diff/Engine/shell.php new file mode 100644 index 0000000..faf3870 --- /dev/null +++ b/src/wp-includes/Text/Diff/Engine/shell.php @@ -0,0 +1,162 @@ + + * @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/src/wp-includes/Text/Diff/Engine/string.php b/src/wp-includes/Text/Diff/Engine/string.php new file mode 100644 index 0000000..59eb8ad --- /dev/null +++ b/src/wp-includes/Text/Diff/Engine/string.php @@ -0,0 +1,248 @@ + + * $patch = file_get_contents('example.patch'); + * $diff = new Text_Diff('string', array($patch)); + * $renderer = new Text_Diff_Renderer_inline(); + * echo $renderer->render($diff); + * + * + * Copyright 2005 Örjan Persson + * 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 + * @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/src/wp-includes/Text/Diff/Engine/xdiff.php b/src/wp-includes/Text/Diff/Engine/xdiff.php new file mode 100644 index 0000000..b9f1736 --- /dev/null +++ b/src/wp-includes/Text/Diff/Engine/xdiff.php @@ -0,0 +1,64 @@ + + * @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/src/wp-includes/Text/Diff/Renderer.php b/src/wp-includes/Text/Diff/Renderer.php new file mode 100644 index 0000000..922f4c0 --- /dev/null +++ b/src/wp-includes/Text/Diff/Renderer.php @@ -0,0 +1,235 @@ + $value) { + $v = '_' . $param; + if (isset($this->$v)) { + $this->$v = $value; + } + } + } + + /** + * 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/src/wp-includes/Text/Diff/Renderer/inline.php b/src/wp-includes/Text/Diff/Renderer/inline.php new file mode 100644 index 0000000..392bd57 --- /dev/null +++ b/src/wp-includes/Text/Diff/Renderer/inline.php @@ -0,0 +1,206 @@ +'; + + /** + * Suffix for inserted text. + * + * @var string + */ + var $_ins_suffix = ''; + + /** + * Prefix for deleted text. + * + * @var string + */ + var $_del_prefix = ''; + + /** + * Suffix for deleted text. + * + * @var string + */ + var $_del_suffix = ''; + + /** + * 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/src/wp-includes/admin-bar.php b/src/wp-includes/admin-bar.php new file mode 100644 index 0000000..99caaa7 --- /dev/null +++ b/src/wp-includes/admin-bar.php @@ -0,0 +1,450 @@ +initialize(); + $wp_admin_bar->add_menus(); + + return true; +} +add_action( 'init', '_wp_admin_bar_init' ); // Don't remove. Wrong way to disable. + +/** + * Render 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 action "admin_bar_menu" 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 + */ +function wp_admin_bar_render() { + global $wp_admin_bar; + + if ( ! is_admin_bar_showing() || ! is_object( $wp_admin_bar ) ) + return false; + + $wp_admin_bar->load_user_locale_translations(); + + do_action_ref_array( 'admin_bar_menu', array( &$wp_admin_bar ) ); + + do_action( 'wp_before_admin_bar_render' ); + + $wp_admin_bar->render(); + + do_action( 'wp_after_admin_bar_render' ); + + $wp_admin_bar->unload_user_locale_translations(); +} +add_action( 'wp_footer', 'wp_admin_bar_render', 1000 ); +add_action( 'admin_footer', 'wp_admin_bar_render', 1000 ); + +/** + * Add the "My Account" menu and all submenus. + * + * @since 3.1.0 + */ +function wp_admin_bar_my_account_menu( $wp_admin_bar ) { + global $user_identity; + + $user_id = get_current_user_id(); + + if ( 0 != $user_id ) { + /* Add the 'My Account' menu */ + $avatar = get_avatar( get_current_user_id(), 16 ); + $id = ( ! empty( $avatar ) ) ? 'my-account-with-avatar' : 'my-account'; + + $wp_admin_bar->add_menu( array( 'id' => $id, 'title' => $avatar . $user_identity, 'href' => get_edit_profile_url( $user_id ) ) ); + + /* Add the "My Account" sub menus */ + $wp_admin_bar->add_menu( array( 'id' => 'edit-profile', 'parent' => $id, 'title' => __( 'Edit My Profile' ), 'href' => get_edit_profile_url( $user_id ) ) ); + $wp_admin_bar->add_menu( array( 'id' => 'logout', 'parent' => $id, 'title' => __( 'Log Out' ), 'href' => wp_logout_url() ) ); + } +} + +/** + * Add the "Dashboard"/"Visit Site" menu. + * + * @since 3.2.0 + */ +function wp_admin_bar_dashboard_view_site_menu( $wp_admin_bar ) { + $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() ) ); + } +} + +/** + * Add the "My Sites/[Site Name]" menu and all submenus. + * + * @since 3.1.0 + */ +function wp_admin_bar_my_sites_menu( $wp_admin_bar ) { + global $wpdb; + + /* Add the 'My Sites' menu if the user has more than one site. */ + if ( count( $wp_admin_bar->user->blogs ) <= 1 ) + return; + + $wp_admin_bar->add_menu( array( 'id' => 'my-blogs', 'title' => __( 'My Sites' ), 'href' => admin_url( 'my-sites.php' ) ) ); + + $default = includes_url('images/wpmini-blue.png'); + + foreach ( (array) $wp_admin_bar->user->blogs as $blog ) { + // @todo Replace with some favicon lookup. + //$blavatar = 'Blavatar'; + $blavatar = '' . esc_attr__( 'Blavatar' ) . ''; + + $blogname = empty( $blog->blogname ) ? $blog->domain : $blog->blogname; + + $wp_admin_bar->add_menu( array( 'parent' => 'my-blogs', 'id' => 'blog-' . $blog->userblog_id, 'title' => $blavatar . $blogname, 'href' => get_admin_url($blog->userblog_id) ) ); + $wp_admin_bar->add_menu( array( 'parent' => 'blog-' . $blog->userblog_id, 'id' => 'blog-' . $blog->userblog_id . '-d', 'title' => __( 'Dashboard' ), 'href' => get_admin_url($blog->userblog_id) ) ); + + if ( current_user_can_for_blog( $blog->userblog_id, 'edit_posts' ) ) { + $wp_admin_bar->add_menu( array( 'parent' => 'blog-' . $blog->userblog_id, 'id' => 'blog-' . $blog->userblog_id . '-n', 'title' => __( 'New Post' ), 'href' => get_admin_url($blog->userblog_id, 'post-new.php') ) ); + $wp_admin_bar->add_menu( array( 'parent' => 'blog-' . $blog->userblog_id, 'id' => 'blog-' . $blog->userblog_id . '-c', 'title' => __( 'Manage Comments' ), 'href' => get_admin_url($blog->userblog_id, 'edit-comments.php') ) ); + } + + $wp_admin_bar->add_menu( array( 'parent' => 'blog-' . $blog->userblog_id, 'id' => 'blog-' . $blog->userblog_id . '-v', 'title' => __( 'Visit Site' ), 'href' => get_home_url($blog->userblog_id) ) ); + } +} + +/** + * Provide a shortlink. + * + * @since 3.1.0 + */ +function wp_admin_bar_shortlink_menu( $wp_admin_bar ) { + $short = wp_get_shortlink( 0, 'query' ); + $id = 'get-shortlink'; + + if ( empty( $short ) ) + return; + + $html = ''; + + $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 + */ +function wp_admin_bar_edit_menu( $wp_admin_bar ) { + global $post, $tag; + + if ( is_admin() ) { + $current_screen = get_current_screen(); + + if ( 'post' == $current_screen->base + && 'add' != $current_screen->action + && ( $post_type_object = get_post_type_object( $post->post_type ) ) + && current_user_can( $post_type_object->cap->read_post, $post->ID ) + && ( $post_type_object->public ) ) + { + $wp_admin_bar->add_menu( array( + 'id' => 'view', + 'title' => $post_type_object->labels->view_item, + 'href' => get_permalink( $post->ID ) + ) ); + } elseif ( 'edit-tags' == $current_screen->base + && isset( $tag ) && is_object( $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 = 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( $post_type_object->cap->edit_post, $current_object->ID ) + && ( $post_type_object->show_ui || 'attachment' == $current_object->post_type ) ) + { + $wp_admin_bar->add_menu( array( + 'id' => 'edit', + 'title' => $post_type_object->labels->edit_item, + 'href' => get_edit_post_link( $current_object->ID ) + ) ); + } elseif ( ! empty( $current_object->taxonomy ) + && ( $tax = get_taxonomy( $current_object->taxonomy ) ) + && current_user_can( $tax->cap->edit_terms ) + && $tax->show_ui ) + { + $wp_admin_bar->add_menu( array( + 'id' => 'edit', + 'title' => $tax->labels->edit_item, + 'href' => get_edit_term_link( $current_object->term_id, $current_object->taxonomy ) + ) ); + } + } +} + +/** + * Add "Add New" menu. + * + * @since 3.1.0 + */ +function wp_admin_bar_new_content_menu( $wp_admin_bar ) { + $actions = array(); + foreach ( (array) get_post_types( array( 'show_in_admin_bar' => true ), 'objects' ) as $ptype_obj ) { + if ( ! current_user_can( $ptype_obj->cap->edit_posts ) ) + continue; + + $actions[ 'post-new.php?post_type=' . $ptype_obj->name ] = array( $ptype_obj->labels->name_admin_bar, $ptype_obj->cap->edit_posts, 'new-' . $ptype_obj->name ); + } + + if ( current_user_can( 'upload_files' ) ) + $actions[ 'media-new.php' ] = array( _x( 'Media', 'add new from admin bar' ), 'upload_files', 'new-media' ); + + if ( current_user_can( 'manage_links' ) ) + $actions[ 'link-add.php' ] = array( _x( 'Link', 'add new from admin bar' ), 'manage_links', 'new-link' ); + + if ( current_user_can( 'create_users' ) || current_user_can( 'promote_users' ) ) + $actions[ 'user-new.php' ] = array( _x( 'User', 'add new from admin bar' ), 'create_users', 'new-user' ); + + if ( ! is_multisite() && current_user_can( 'install_themes' ) ) + $actions[ 'theme-install.php' ] = array( _x( 'Theme', 'add new from admin bar' ), 'install_themes', 'new-theme' ); + + if ( ! is_multisite() && current_user_can( 'install_plugins' ) ) + $actions[ 'plugin-install.php' ] = array( _x( 'Plugin', 'add new from admin bar' ), 'install_plugins', 'new-plugin' ); + + if ( empty( $actions ) ) + return; + + $wp_admin_bar->add_menu( array( 'id' => 'new-content', 'title' => _x( 'Add New', 'admin bar menu group label' ), 'href' => admin_url( array_shift( array_keys( $actions ) ) ) ) ); + + foreach ( $actions as $link => $action ) { + $wp_admin_bar->add_menu( array( 'parent' => 'new-content', 'id' => $action[2], 'title' => $action[0], 'href' => admin_url($link) ) ); + } +} + +/** + * Add edit comments link with awaiting moderation count bubble. + * + * @since 3.1.0 + */ +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_mod = $awaiting_mod ? "" . number_format_i18n( $awaiting_mod ) . "" : ''; + $wp_admin_bar->add_menu( array( 'id' => 'comments', 'title' => sprintf( __('Comments %s'), $awaiting_mod ), 'href' => admin_url('edit-comments.php') ) ); +} + +/** + * Add "Appearance" menu with widget and nav menu submenu. + * + * @since 3.1.0 + */ +function wp_admin_bar_appearance_menu( $wp_admin_bar ) { + // You can have edit_theme_options but not switch_themes. + if ( ! current_user_can('switch_themes') && ! current_user_can( 'edit_theme_options' ) ) + return; + + $wp_admin_bar->add_menu( array( 'id' => 'appearance', 'title' => __('Appearance'), 'href' => admin_url('themes.php') ) ); + + if ( ! current_user_can( 'edit_theme_options' ) ) + return; + + 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_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') ) ); + + 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') ) ); +} + +/** + * Provide an update link if theme/plugin/core updates are available. + * + * @since 3.1.0 + */ +function wp_admin_bar_updates_menu( $wp_admin_bar ) { + if ( !current_user_can('install_plugins') ) + return; + + $plugin_update_count = $theme_update_count = $wordpress_update_count = 0; + $update_plugins = get_site_transient( 'update_plugins' ); + if ( !empty($update_plugins->response) ) + $plugin_update_count = count( $update_plugins->response ); + $update_themes = get_site_transient( 'update_themes' ); + if ( !empty($update_themes->response) ) + $theme_update_count = count( $update_themes->response ); + /* @todo get_core_updates() is only available on admin page loads + $update_wordpress = get_core_updates( array('dismissed' => false) ); + if ( !empty($update_wordpress) && !in_array( $update_wordpress[0]->response, array('development', 'latest') ) ) + $wordpress_update_count = 1; + */ + + $update_count = $plugin_update_count + $theme_update_count + $wordpress_update_count; + + if ( !$update_count ) + return; + + $update_title = array(); + if ( $wordpress_update_count ) + $update_title[] = sprintf(__('%d WordPress Update'), $wordpress_update_count); + if ( $plugin_update_count ) + $update_title[] = sprintf(_n('%d Plugin Update', '%d Plugin Updates', $plugin_update_count), $plugin_update_count); + if ( $theme_update_count ) + $update_title[] = sprintf(_n('%d Theme Update', '%d Theme Updates', $theme_update_count), $theme_update_count); + + $update_title = !empty($update_title) ? esc_attr(implode(', ', $update_title)) : ''; + + $update_title = ""; + $update_title .= sprintf( __('Updates %s'), "" . number_format_i18n($update_count) . '' ); + $update_title .= ''; + + $wp_admin_bar->add_menu( array( 'id' => 'updates', 'title' => $update_title, 'href' => network_admin_url( 'update-core.php' ) ) ); +} + +/** + * Style and scripts for the admin bar. + * + * @since 3.1.0 + * + */ +function wp_admin_bar_header() { ?> + + + + \ No newline at end of file diff --git a/src/wp-includes/atomlib.php b/src/wp-includes/atomlib.php new file mode 100644 index 0000000..e75ca39 --- /dev/null +++ b/src/wp-includes/atomlib.php @@ -0,0 +1,354 @@ + + * @version 0.4 + * @since 2.3 + */ + +/** + * 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; + + function AtomParser() { + + $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]}\"";'); + } + + 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()); + + $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))) { + trigger_error(sprintf(__('XML error: %s at line %d')."\n", + xml_error_string(xml_get_error_code($xml_parser)), + xml_get_current_line_number($xml_parser))); + $ret = false; + break; + } + } + fclose($fp); + + xml_parser_free($parser); + + restore_error_handler(); + + return $ret; + } + + function start_element($parser, $name, $attrs) { + + $tag = array_pop(split(":", $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(split(":", $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, "")); + } + } + + 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 = split(":", $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/src/wp-includes/author-template.php b/src/wp-includes/author-template.php new file mode 100644 index 0000000..f082fb2 --- /dev/null +++ b/src/wp-includes/author-template.php @@ -0,0 +1,401 @@ +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, backwards compatiability has to be maintained. + * + * @since 0.71 + * @see get_the_author() + * @link http://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 The author's display name, from get_the_author(). + */ +function the_author( $deprecated = '', $deprecated_echo = true ) { + if ( !empty( $deprecated ) ) + _deprecated_argument( __FUNCTION__, '2.1' ); + if ( $deprecated_echo !== true ) + _deprecated_argument( __FUNCTION__, '1.5', __('Use get_the_author() instead if you do not want the value echoed.') ); + if ( $deprecated_echo ) + echo get_the_author(); + return get_the_author(); +} + +/** + * Retrieve the author who last edited the current post. + * + * @since 2.8 + * @uses $post The current post's DB object. + * @uses get_post_meta() Retrieves the ID of the author who last edited the current post. + * @uses get_userdata() Retrieves the author's DB object. + * @uses apply_filters() Calls 'the_modified_author' hook on the author display name. + * @return string The author's display name. + */ +function get_the_modified_author() { + global $post; + if ( $last_id = get_post_meta($post->ID, '_edit_last', true) ) { + $last_user = get_userdata($last_id); + return apply_filters('the_modified_author', $last_user->display_name); + } +} + +/** + * Display the name of the author who last edited the current post. + * + * @since 2.8 + * @see get_the_author() + * @return string The author's display name, from get_the_modified_author(). + */ +function the_modified_author() { + echo get_the_modified_author(); +} + +/** + * Retrieve the requested data of the author of the current post. + * @link http://codex.wordpress.org/Template_Tags/the_author_meta + * @since 2.8.0 + * @uses $authordata The current author's DB object (if $user_id not specified). + * @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) { + if ( ! $user_id ) + global $authordata; + else + $authordata = get_userdata( $user_id ); + + // Keys used as object vars cannot have dashes. + $field = str_replace('-', '', $field); + $field = strtolower($field); + $user_field = "user_$field"; + + if ( 'id' == $field ) + $value = isset($authordata->ID) ? (int)$authordata->ID : 0; + elseif ( isset($authordata->$user_field) ) + $value = $authordata->$user_field; + else + $value = isset($authordata->$field) ? $authordata->$field : ''; + + return apply_filters('get_the_author_' . $field, $value, $user_id); +} + +/** + * Retrieve the requested data of the author of the current post. + * @link http://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. + * @echo string The author's field from the current author's DB object. + */ +function the_author_meta($field = '', $user_id = false) { + echo apply_filters('the_author_' . $field, get_the_author_meta($field, $user_id), $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. + * + * @uses get_the_author_meta() + * @uses get_the_author() + */ +function get_the_author_link() { + if ( get_the_author_meta('url') ) { + return '' . 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 http://codex.wordpress.org/Template_Tags/the_author_link + * @since 2.1 + * @uses get_the_author_link() + */ +function the_author_link() { + echo get_the_author_link(); +} + +/** + * Retrieve the number of posts by the author of the current post. + * + * @since 1.5 + * @uses $post The current post in the Loop's DB object. + * @uses count_user_posts() + * @return int The number of posts by the author. + */ +function get_the_author_posts() { + global $post; + return count_user_posts($post->post_author); +} + +/** + * Display the number of posts by the author of the current post. + * + * @link http://codex.wordpress.org/Template_Tags/the_author_posts + * @since 0.71 + * @uses get_the_author_posts() Echoes returned value from function. + */ +function the_author_posts() { + echo get_the_author_posts(); +} + +/** + * Display an HTML link to the author page of the author of the current post. + * + * Does just echo get_author_posts_url() function, like the others do. The + * reason for this, is that another function is used to help in printing the + * link to the author's posts. + * + * @link http://codex.wordpress.org/Template_Tags/the_author_posts_link + * @since 1.2.0 + * @uses $authordata The current author's DB object. + * @uses get_author_posts_url() + * @uses get_the_author() + * @param string $deprecated Deprecated. + */ +function the_author_posts_link($deprecated = '') { + if ( !empty( $deprecated ) ) + _deprecated_argument( __FUNCTION__, '2.1' ); + + global $authordata; + if ( !is_object( $authordata ) ) + return false; + $link = sprintf( + '', + get_author_posts_url( $authordata->ID, $authordata->user_nicename ), + esc_attr( sprintf( __( 'Posts by %s' ), get_the_author() ) ), + get_the_author() + ); + echo apply_filters( 'the_author_posts_link', $link ); +} + +/** + * Retrieve the URL to the author page for the user with the ID provided. + * + * @since 2.1.0 + * @uses $wp_rewrite WP_Rewrite + * @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 ) ); + } + + $link = apply_filters('author_link', $link, $author_id, $author_nicename); + + return $link; +} + +/** + * List all the authors of the blog, with several options available. + * + *
      + *
    • optioncount (boolean) (false): Show the count in parenthesis next to the + * author's name.
    • + *
    • exclude_admin (boolean) (true): Exclude the 'admin' user that is + * installed bydefault.
    • + *
    • show_fullname (boolean) (false): Show their full names.
    • + *
    • hide_empty (boolean) (true): Don't show authors without any posts.
    • + *
    • feed (string) (''): If isn't empty, show links to author's feeds.
    • + *
    • feed_image (string) (''): If isn't empty, use this image to link to + * feeds.
    • + *
    • echo (boolean) (true): Set to false to return the output, instead of + * echoing.
    • + *
    • style (string) ('list'): Whether to display list of authors in list form + * or as a string.
    • + *
    • html (bool) (true): Whether to list the items in html form or plaintext. + *
    • + *
    + * + * @link http://codex.wordpress.org/Template_Tags/wp_list_authors + * @since 1.2.0 + * @param array $args The argument array. + * @return null|string 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 + ); + + $args = wp_parse_args( $args, $defaults ); + extract( $args, EXTR_SKIP ); + + $return = ''; + + $query_args = wp_array_slice_assoc( $args, array( 'orderby', 'order', 'number' ) ); + $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 post_type = 'post' AND " . 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 ( $exclude_admin && 'admin' == $author->display_name ) + continue; + + $posts = isset( $author_count[$author->ID] ) ? $author_count[$author->ID] : 0; + + if ( !$posts && $hide_empty ) + continue; + + $link = ''; + + if ( $show_fullname && $author->first_name && $author->last_name ) + $name = "$author->first_name $author->last_name"; + else + $name = $author->display_name; + + if ( !$html ) { + $return .= $name . ', '; + + continue; // No need to go further to process HTML. + } + + if ( 'list' == $style ) { + $return .= '
  • '; + } + + $link = 'display_name) ) . '">' . $name . ''; + + if ( !empty( $feed_image ) || !empty( $feed ) ) { + $link .= ' '; + if ( empty( $feed_image ) ) { + $link .= '('; + } + + $link .= ''; + else + $link .= $name; + + $link .= ''; + + if ( empty( $feed_image ) ) + $link .= ')'; + } + + if ( $optioncount ) + $link .= ' ('. $posts . ')'; + + $return .= $link; + $return .= ( 'list' == $style ) ? '
  • ' : ', '; + } + + $return = rtrim($return, ', '); + + if ( !$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 + * @return bool Whether or not we have more than one author + */ +function is_multi_author() { + global $wpdb; + + if ( false === ( $is_multi_author = wp_cache_get('is_multi_author', 'posts') ) ) { + $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; + wp_cache_set('is_multi_author', $is_multi_author, 'posts'); + } + + return (bool) $is_multi_author; +} + +/** + * Helper function to clear the cache for number of authors. + * + * @private + */ +function __clear_multi_author_cache() { + wp_cache_delete('is_multi_author', 'posts'); +} +add_action('transition_post_status', '__clear_multi_author_cache'); + +?> diff --git a/src/wp-includes/bookmark-template.php b/src/wp-includes/bookmark-template.php new file mode 100644 index 0000000..7c5949c --- /dev/null +++ b/src/wp-includes/bookmark-template.php @@ -0,0 +1,256 @@ +' (string). The html or text to prepend to each + * bookmarks. + * 'after' - Default is '' (string). The html or text to append to each + * bookmarks. + * 'link_before' - Default is '' (string). The html or text to prepend to each + * bookmarks inside the tag. + * 'link_after' - Default is '' (string). The html or text to append to each + * bookmarks inside the tag. + * 'between' - Default is '\n' (string). The string for use in between the link, + * description, and image. + * 'show_rating' - Default is 0 (integer). Whether to show the link rating. + * + * @since 2.1.0 + * @access private + * @usedby wp_list_bookmarks() + * + * @param array $bookmarks List of bookmarks to traverse + * @param string|array $args Optional. Overwrite the defaults. + * @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' => '
  • ', 'after' => '
  • ', 'between' => "\n", + 'show_rating' => 0, 'link_before' => '', 'link_after' => '' + ); + + $r = wp_parse_args( $args, $defaults ); + extract( $r, EXTR_SKIP ); + + $output = ''; // Blank string to start with. + + foreach ( (array) $bookmarks as $bookmark ) { + if ( !isset($bookmark->recently_updated) ) + $bookmark->recently_updated = false; + $output .= $before; + if ( $show_updated && $bookmark->recently_updated ) + $output .= get_option('links_recently_updated_prepend'); + + $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 ( $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') * 3600))); + $title .= ')'; + } + + $alt = ' alt="' . $name . ( $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 .= '
    '; + + $output .= $link_before; + + if ( $bookmark->link_image != null && $show_images ) { + if ( strpos($bookmark->link_image, 'http') === 0 ) + $output .= "link_image\" $alt $title />"; + else // If it's a relative path + $output .= "link_image\" $alt $title />"; + + if ( $show_name ) + $output .= " $name"; + } else { + $output .= $name; + } + + $output .= $link_after; + + $output .= ''; + + if ( $show_updated && $bookmark->recently_updated ) + $output .= get_option('links_recently_updated_append'); + + if ( $show_description && '' != $desc ) + $output .= $between . $desc; + + if ( $show_rating ) + $output .= $between . sanitize_bookmark_field('link_rating', $bookmark->link_rating, $bookmark->link_id, 'display'); + + $output .= "$after\n"; + } // end while + + return $output; +} + +/** + * Retrieve or echo all of the bookmarks. + * + * List of default arguments are as follows: + * 'orderby' - Default is 'name' (string). How to order the links by. String is + * based off of the bookmark scheme. + * 'order' - Default is 'ASC' (string). Either 'ASC' or 'DESC'. Orders in either + * ascending or descending order. + * 'limit' - Default is -1 (integer) or show all. The amount of bookmarks to + * display. + * 'category' - Default is empty string (string). Include the links in what + * category ID(s). + * 'category_name' - Default is empty string (string). Get links by category + * name. + * 'hide_invisible' - Default is 1 (integer). Whether to show (default) or hide + * links marked as 'invisible'. + * 'show_updated' - Default is 0 (integer). Will show the time of when the + * bookmark was last updated. + * 'echo' - Default is 1 (integer). Whether to echo (default) or return the + * formatted bookmarks. + * 'categorize' - Default is 1 (integer). Whether to show links listed by + * category (default) or show links in one column. + * 'show_description' - Default is 0 (integer). Whether to show the description + * of the bookmark. + * + * 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. + * 'title_li' - Default is 'Bookmarks' (translatable string). What to show + * before the links appear. + * 'title_before' - Default is '

    ' (string). The HTML or text to show before + * the 'title_li' string. + * 'title_after' - Default is '

    ' (string). The HTML or text to show after + * the 'title_li' string. + * 'class' - Default is 'linkcat' (string). The CSS class to use for the + * 'title_li'. + * + * 'category_before' - Default is '
  • '. String must + * contain '%id' and '%class' to get + * the id of the category and the 'class' argument. These are used for + * formatting in themes. + * Argument will be displayed before the 'title_before' argument. + * 'category_after' - Default is '
  • ' (string). The HTML or text that will + * appear after the list of links. + * + * These are only used if 'categorize' is set to 1 or true. + * 'category_orderby' - Default is 'name'. How to order the bookmark category + * based on term scheme. + * 'category_order' - Default is 'ASC'. Set the order by either ASC (ascending) + * or DESC (descending). + * + * @see _walk_bookmarks() For other arguments that can be set in this function + * and passed to _walk_bookmarks(). + * @see get_bookmarks() For other arguments that can be set in this function and + * passed to get_bookmarks(). + * @link http://codex.wordpress.org/Template_Tags/wp_list_bookmarks + * + * @since 2.1.0 + * @uses _list_bookmarks() Used to iterate over all of the bookmarks and return + * the html + * @uses get_terms() Gets all of the categories that are for links. + * + * @param string|array $args Optional. Overwrite the defaults of the function + * @return string|null 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' => '

    ', 'title_after' => '

    ', + 'category_orderby' => 'name', 'category_order' => 'ASC', + 'class' => 'linkcat', 'category_before' => '
  • ', + 'category_after' => '
  • ' + ); + + $r = wp_parse_args( $args, $defaults ); + extract( $r, EXTR_SKIP ); + + $output = ''; + + if ( $categorize ) { + //Split the bookmarks into ul's for each category + $cats = get_terms('link_category', array('name__like' => $category_name, 'include' => $category, 'exclude' => $exclude_category, 'orderby' => $category_orderby, 'order' => $category_order, 'hierarchical' => 0)); + + 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", $class), $category_before); + $catname = apply_filters( "link_category", $cat->name ); + $output .= "$title_before$catname$title_after\n\t
      \n"; + $output .= _walk_bookmarks($bookmarks, $r); + $output .= "\n\t
    \n$category_after\n"; + } + } else { + //output one single list using title_li for the title + $bookmarks = get_bookmarks($r); + + if ( !empty($bookmarks) ) { + if ( !empty( $title_li ) ){ + $output .= str_replace(array('%id', '%class'), array("linkcat-$category", $class), $category_before); + $output .= "$title_before$title_li$title_after\n\t
      \n"; + $output .= _walk_bookmarks($bookmarks, $r); + $output .= "\n\t
    \n$category_after\n"; + } else { + $output .= _walk_bookmarks($bookmarks, $r); + } + } + } + + $output = apply_filters( 'wp_list_bookmarks', $output ); + + if ( !$echo ) + return $output; + echo $output; +} + +?> diff --git a/src/wp-includes/bookmark.php b/src/wp-includes/bookmark.php new file mode 100644 index 0000000..e118423 --- /dev/null +++ b/src/wp-includes/bookmark.php @@ -0,0 +1,380 @@ +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)); + $_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'); + } + } + + $_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 + * @uses get_bookmark() Gets bookmark object using $bookmark as ID + * @uses sanitize_bookmark_field() Sanitizes Bookmark field based on $context. + * + * @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 + */ +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. + * + * List of default arguments are as follows: + * 'orderby' - Default is 'name' (string). How to order the links by. String is + * based off of the bookmark scheme. + * 'order' - Default is 'ASC' (string). Either 'ASC' or 'DESC'. Orders in either + * ascending or descending order. + * 'limit' - Default is -1 (integer) or show all. The amount of bookmarks to + * display. + * 'category' - Default is empty string (string). Include the links in what + * category ID(s). + * 'category_name' - Default is empty string (string). Get links by category + * name. + * 'hide_invisible' - Default is 1 (integer). Whether to show (default) or hide + * links marked as 'invisible'. + * 'show_updated' - Default is 0 (integer). Will show the time of when the + * bookmark was last updated. + * 'include' - Default is empty string (string). Include other categories + * separated by commas. + * 'exclude' - Default is empty string (string). Exclude other categories + * separated by commas. + * + * @since 2.1.0 + * @uses $wpdb Database Object + * @link http://codex.wordpress.org/Template_Tags/get_bookmarks + * + * @param string|array $args List of arguments to overwrite the defaults + * @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 ); + extract( $r, EXTR_SKIP ); + + $cache = array(); + $key = md5( serialize( $r ) ); + if ( $cache = wp_cache_get( 'get_bookmarks', 'bookmark' ) ) { + if ( is_array($cache) && isset( $cache[ $key ] ) ) + return apply_filters('get_bookmarks', $cache[ $key ], $r ); + } + + if ( !is_array($cache) ) + $cache = array(); + + $inclusions = ''; + if ( !empty($include) ) { + $exclude = ''; //ignore exclude, category, and category_name params if using include + $category = ''; + $category_name = ''; + $inclinks = preg_split('/[\s,]+/',$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($exclude) ) { + $exlinks = preg_split('/[\s,]+/',$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($category_name) ) { + if ( $category = get_term_by('name', $category_name, 'link_category') ) { + $category = $category->term_id; + } else { + $cache[ $key ] = array(); + wp_cache_set( 'get_bookmarks', $cache, 'bookmark' ); + return apply_filters( 'get_bookmarks', array(), $r ); + } + } + + if ( ! empty($search) ) { + $search = like_escape($search); + $search = " AND ( (link_url LIKE '%$search%') OR (link_name LIKE '%$search%') OR (link_description LIKE '%$search%') ) "; + } + + $category_query = ''; + $join = ''; + if ( !empty($category) ) { + $incategories = preg_split('/[\s,]+/',$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 ( $show_updated && get_option('links_recently_updated_time') ) { + $recently_updated_test = ", IF (DATE_ADD(link_updated, INTERVAL " . get_option('links_recently_updated_time') . " MINUTE) >= NOW(), 1,0) as recently_updated "; + } else { + $recently_updated_test = ''; + } + + $get_updated = ( $show_updated ) ? ', UNIX_TIMESTAMP(link_updated) AS link_updated_f ' : ''; + + $orderby = strtolower($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(); + foreach ( explode(',', $orderby) as $ordparam ) { + $ordparam = trim($ordparam); + if ( in_array( $ordparam, array( 'name', 'url', 'visible', 'rating', 'owner', 'updated' ) ) ) + $orderparams[] = 'link_' . $ordparam; + } + $orderby = implode(',', $orderparams); + } + + if ( empty( $orderby ) ) + $orderby = 'link_name'; + + $order = strtoupper( $order ); + if ( '' !== $order && !in_array( $order, array( 'ASC', 'DESC' ) ) ) + $order = 'ASC'; + + $visible = ''; + if ( $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 ($limit != -1) + $query .= " LIMIT $limit"; + + $results = $wpdb->get_results($query); + + $cache[ $key ] = $results; + wp_cache_set( 'get_bookmarks', $cache, 'bookmark' ); + + return apply_filters('get_bookmarks', $results, $r); +} + +/** + * Sanitizes all bookmark fields + * + * @since 2.3.0 + * + * @param object|array $bookmark Bookmark row + * @param string $context Optional, default is 'display'. How to filter the + * fields + * @return object|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 + * 'edit_$field' filter will be called and passed the $value and $bookmark_id + * respectively. With the 'db' context, the '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. Either '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; + break; + 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 ) { + $value = apply_filters("edit_$field", $value, $bookmark_id); + + if ( 'link_notes' == $field ) { + $value = esc_html( $value ); // textarea_escaped + } else { + $value = esc_attr($value); + } + } else if ( 'db' == $context ) { + $value = apply_filters("pre_$field", $value); + } else { + // Use display filters by default. + $value = apply_filters($field, $value, $bookmark_id, $context); + + if ( 'attribute' == $context ) + $value = esc_attr($value); + else if ( 'js' == $context ) + $value = esc_js($value); + } + + return $value; +} + +/** + * Deletes bookmark cache + * + * @since 2.7.0 + * @uses wp_cache_delete() Deletes the contents of 'get_bookmarks' + */ +function clean_bookmark_cache($bookmark_id) { + wp_cache_delete( $bookmark_id, 'bookmark' ); + wp_cache_delete( 'get_bookmarks', 'bookmark' ); +} + +?> diff --git a/src/wp-includes/cache.php b/src/wp-includes/cache.php new file mode 100644 index 0000000..f73f02b --- /dev/null +++ b/src/wp-includes/cache.php @@ -0,0 +1,486 @@ +add($key, $data, $flag, $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 persistant 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 bool Always returns True + */ +function wp_cache_close() { + return true; +} + +/** + * Removes the cache contents matching ID and flag. + * + * @since 2.0.0 + * @uses $wp_object_cache Object Cache Class + * @see WP_Object_Cache::delete() + * + * @param int|string $id What the contents in the cache are called + * @param string $flag Where the cache contents are grouped + * @return bool True on successful removal, false on failure + */ +function wp_cache_delete($id, $flag = '') { + global $wp_object_cache; + + return $wp_object_cache->delete($id, $flag); +} + +/** + * Removes all cache items. + * + * @since 2.0.0 + * @uses $wp_object_cache Object Cache Class + * @see WP_Object_Cache::flush() + * + * @return bool Always returns true + */ +function wp_cache_flush() { + global $wp_object_cache; + + return $wp_object_cache->flush(); +} + +/** + * Retrieves the cache contents from the cache by ID and flag. + * + * @since 2.0.0 + * @uses $wp_object_cache Object Cache Class + * @see WP_Object_Cache::get() + * + * @param int|string $id What the contents in the cache are called + * @param string $flag Where the cache contents are grouped + * @return bool|mixed False on failure to retrieve contents or the cache + * contents on success + */ +function wp_cache_get($id, $flag = '') { + global $wp_object_cache; + + return $wp_object_cache->get($id, $flag); +} + +/** + * Sets up Object Cache Global and assigns it. + * + * @since 2.0.0 + * @global WP_Object_Cache $wp_object_cache WordPress 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 + * @uses $wp_object_cache Object Cache Class + * @see WP_Object_Cache::replace() + * + * @param int|string $key What to call the contents in the cache + * @param mixed $data The contents to store in the cache + * @param string $flag Where to group the cache contents + * @param int $expire When to expire the cache contents + * @return bool False if cache ID and group already exists, true on success + */ +function wp_cache_replace($key, $data, $flag = '', $expire = 0) { + global $wp_object_cache; + + return $wp_object_cache->replace($key, $data, $flag, $expire); +} + +/** + * Saves the data to the cache. + * + * @since 2.0 + * @uses $wp_object_cache Object Cache Class + * @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 $flag Where to group the cache contents + * @param int $expire When to expire the cache contents + * @return bool False if cache ID and group already exists, true on success + */ +function wp_cache_set($key, $data, $flag = '', $expire = 0) { + global $wp_object_cache; + + return $wp_object_cache->set($key, $data, $flag, $expire); +} + +/** + * Adds a group or set of groups to the list of global groups. + * + * @since 2.6.0 + * + * @param string|array $groups A group or an array of groups to add + */ +function wp_cache_add_global_groups( $groups ) { + global $wp_object_cache; + + return $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. + return; +} + +/** + * Reset internal cache keys and structures. If the cache backend uses global blog or site IDs as part of its cache keys, + * this function instructs the backend to reset those keys and perform any cleanup since blog or site IDs have changed since cache init. + * + * @since 2.6.0 + */ +function wp_cache_reset() { + global $wp_object_cache; + + return $wp_object_cache->reset(); +} + +/** + * WordPress 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 + */ +class WP_Object_Cache { + + /** + * Holds the cached objects + * + * @var array + * @access private + * @since 2.0.0 + */ + var $cache = array (); + + /** + * Cache objects that do not exist in the cache + * + * @var array + * @access private + * @since 2.0.0 + */ + var $non_existent_objects = array (); + + /** + * The amount of times the cache data was already stored in the cache. + * + * @since 2.5.0 + * @access private + * @var int + */ + var $cache_hits = 0; + + /** + * Amount of times the cache did not have the request in cache + * + * @var int + * @access public + * @since 2.0.0 + */ + var $cache_misses = 0; + + /** + * List of global groups + * + * @var array + * @access protected + * @since 3.0.0 + */ + var $global_groups = array(); + + /** + * Adds data to the cache if it doesn't already exist. + * + * @uses WP_Object_Cache::get Checks to see if the cache already has data. + * @uses WP_Object_Cache::set Sets the data after the checking the cache + * contents existance. + * + * @since 2.0.0 + * + * @param int|string $id What to call the contents in the cache + * @param mixed $data The contents to store in the cache + * @param string $group Where to group the cache contents + * @param int $expire When to expire the cache contents + * @return bool False if cache ID and group already exists, true on success + */ + function add( $id, $data, $group = 'default', $expire = '' ) { + if ( empty ($group) ) + $group = 'default'; + + if (false !== $this->get($id, $group)) + return false; + + return $this->set($id, $data, $group, $expire); + } + + /** + * Sets the list of global groups. + * + * @since 3.0.0 + * + * @param array $groups List of groups that are global. + */ + function add_global_groups( $groups ) { + $groups = (array) $groups; + + $this->global_groups = array_merge($this->global_groups, $groups); + $this->global_groups = array_unique($this->global_groups); + } + + /** + * Remove the contents of the cache ID in the group + * + * If the cache ID does not exist in the group and $force parameter is set + * to false, then nothing will happen. The $force parameter is set to false + * by default. + * + * On success the group and the id will be added to the + * $non_existent_objects property in the class. + * + * @since 2.0.0 + * + * @param int|string $id What the contents in the cache are called + * @param string $group Where the cache contents are grouped + * @param bool $force Optional. Whether to force the unsetting of the cache + * ID in the group + * @return bool False if the contents weren't deleted and true on success + */ + function delete($id, $group = 'default', $force = false) { + if (empty ($group)) + $group = 'default'; + + if (!$force && false === $this->get($id, $group)) + return false; + + unset ($this->cache[$group][$id]); + $this->non_existent_objects[$group][$id] = true; + return true; + } + + /** + * Clears the object cache of all data + * + * @since 2.0.0 + * + * @return bool Always returns true + */ + 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 + * ID in the cache group. If the cache is hit (success) then the contents + * are returned. + * + * On failure, the $non_existent_objects property is checked and if the + * cache group and ID exist in there the cache misses will not be + * incremented. If not in the nonexistent objects property, then the cache + * misses will be incremented and the cache group and ID will be added to + * the nonexistent objects. + * + * @since 2.0.0 + * + * @param int|string $id What the contents in the cache are called + * @param string $group Where the cache contents are grouped + * @return bool|mixed False on failure to retrieve contents or the cache + * contents on success + */ + function get($id, $group = 'default') { + if ( empty ($group) ) + $group = 'default'; + + if ( isset ($this->cache[$group][$id]) ) { + $this->cache_hits += 1; + if ( is_object($this->cache[$group][$id]) ) + return clone $this->cache[$group][$id]; + else + return $this->cache[$group][$id]; + } + + if ( isset ($this->non_existent_objects[$group][$id]) ) + return false; + + $this->non_existent_objects[$group][$id] = true; + $this->cache_misses += 1; + return false; + } + + /** + * Replace the contents in the cache, if contents already exist + * + * @since 2.0.0 + * @see WP_Object_Cache::set() + * + * @param int|string $id What to call the contents in the cache + * @param mixed $data The contents to store in the cache + * @param string $group Where to group the cache contents + * @param int $expire When to expire the cache contents + * @return bool False if not exists, true if contents were replaced + */ + function replace($id, $data, $group = 'default', $expire = '') { + if (empty ($group)) + $group = 'default'; + + if ( false === $this->get($id, $group) ) + return false; + + return $this->set($id, $data, $group, $expire); + } + + /** + * Reset keys + * + * @since 3.0.0 + */ + function reset() { + // Clear out non-global caches since the blog ID has changed. + foreach ( array_keys($this->cache) as $group ) { + if ( !in_array($group, $this->global_groups) ) + unset($this->cache[$group]); + } + } + + /** + * Sets the data contents into the cache + * + * The cache contents is grouped by the $group parameter followed by the + * $id. 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 + * + * @param int|string $id What to call the contents in the cache + * @param mixed $data The contents to store in the cache + * @param string $group Where to group the cache contents + * @param int $expire Not Used + * @return bool Always returns true + */ + function set($id, $data, $group = 'default', $expire = '') { + if ( empty ($group) ) + $group = 'default'; + + if ( NULL === $data ) + $data = ''; + + if ( is_object($data) ) + $data = clone $data; + + $this->cache[$group][$id] = $data; + + if ( isset($this->non_existent_objects[$group][$id]) ) + unset ($this->non_existent_objects[$group][$id]); + + 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 + */ + function stats() { + echo "

    "; + echo "Cache Hits: {$this->cache_hits}
    "; + echo "Cache Misses: {$this->cache_misses}
    "; + echo "

    "; + echo '
      '; + foreach ($this->cache as $group => $cache) { + echo "
    • Group: $group - ( " . number_format( strlen( serialize( $cache ) ) / 1024, 2 ) . 'k )
    • '; + } + echo '
    '; + } + + /** + * Sets up object properties; PHP 5 style constructor + * + * @since 2.0.8 + * @return null|WP_Object_Cache If cache is disabled, returns null. + */ + function __construct() { + /** + * @todo This should be moved to the PHP4 style constructor, PHP5 + * already calls __destruct() + */ + register_shutdown_function(array(&$this, "__destruct")); + } + + /** + * Will save the object cache before object is completely destroyed. + * + * Called upon object destruction, which should be when PHP ends. + * + * @since 2.0.8 + * + * @return bool True value. Won't be used by PHP + */ + function __destruct() { + return true; + } +} +?> diff --git a/src/wp-includes/canonical.php b/src/wp-includes/canonical.php new file mode 100644 index 0000000..453641a --- /dev/null +++ b/src/wp-includes/canonical.php @@ -0,0 +1,433 @@ + $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_query_arg(array('p', 'page_id', 'attachment_id', 'post_type'), $redirect['query']); + } + } + + // 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 ) { + $redirect_url = get_permalink($redirect_post); + $redirect['query'] = remove_query_arg(array('p', 'page_id', 'attachment_id', 'post_type'), $redirect['query']); + } + } + + if ( ! $redirect_url ) + $redirect_url = redirect_guess_404_permalink(); + + } elseif ( is_object($wp_rewrite) && $wp_rewrite->using_permalinks() ) { + // rewriting of old ?p=X, ?m=2004, ?m=200401, ?m=20040101 + if ( is_attachment() && !empty($_GET['attachment_id']) && ! $redirect_url ) { + if ( $redirect_url = get_attachment_link(get_query_var('attachment_id')) ) + $redirect['query'] = remove_query_arg('attachment_id', $redirect['query']); + } 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() && isset($wp_query->queried_object) && 'page' == get_option('show_on_front') && $wp_query->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->queries 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 accessable 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 accessable 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 ) { + $category = get_category_by_path(get_query_var('category_name')); + $post_terms = wp_get_object_terms($wp_query->get_queried_object_id(), 'category', array('fields' => 'tt_ids')); + if ( (!$category || is_wp_error($category)) || ( !is_wp_error($post_terms) && !empty($post_terms) && !in_array($category->term_taxonomy_id, $post_terms) ) ) + $redirect_url = get_permalink($wp_query->get_queried_object_id()); + } + + // Post Paging + if ( is_singular() && get_query_var('page') && $redirect_url ) { + $redirect_url = trailingslashit( $redirect_url ) . user_trailingslashit( get_query_var( '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( '#/comment-page-[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('#/comment-page-[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 ( get_query_var( 'withcomments' ) ) + $addl_path .= 'comments/'; + $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'] ); + } + + 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( 'comment-page-' . get_query_var('cpage'), 'commentpaged' ); + $redirect['query'] = remove_query_arg( 'cpage', $redirect['query'] ); + } + + $redirect['path'] = user_trailingslashit( preg_replace('|/index.php/?$|', '/', $redirect['path']) ); // strip off trailing /index.php/ + if ( !empty( $addl_path ) && $wp_rewrite->using_index_permalinks() && strpos($redirect['path'], '/index.php/') === false ) + $redirect['path'] = trailingslashit($redirect['path']) . 'index.php/'; + if ( !empty( $addl_path ) ) + $redirect['path'] = trailingslashit($redirect['path']) . $addl_path; + $redirect_url = $redirect['scheme'] . '://' . $redirect['host'] . $redirect['path']; + } + } + + // 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'] ); + } + + $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('|/index.php/*?$|', '/', $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']), '&'); + + // 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('/index.php/', '/', $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 false; + + // Hex encoded octets are case-insensitive. + if ( false !== strpos($requested_url, '%') ) { + if ( !function_exists('lowercase_octets') ) { + 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); + } + + // Note that you can use the "redirect_canonical" filter to cancel a canonical redirect for whatever reason by returning FALSE + $redirect_url = apply_filters('redirect_canonical', $redirect_url, $requested_url); + + if ( !$redirect_url || $redirect_url == $requested_url ) // yes, again -- in case the filter aborted the request + return false; + + 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
    2: " . redirect_canonical( $redirect_url, false ) ); + return false; + } + } else { + return $redirect_url; + } +} + +/** + * Attempts to guess correct post based on query vars. + * + * @since 2.3.0 + * @uses $wpdb + * + * @return bool|string Returns False, if it can't find post, returns correct + * location on success. + */ +function redirect_guess_404_permalink() { + global $wpdb; + + if ( !get_query_var('name') ) + return false; + + $where = $wpdb->prepare("post_name LIKE %s", like_escape( 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')); + 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; + return get_permalink($post_id); +} + +add_action('template_redirect', 'redirect_canonical'); + +?> diff --git a/src/wp-includes/capabilities.php b/src/wp-includes/capabilities.php new file mode 100644 index 0000000..28e7541 --- /dev/null +++ b/src/wp-includes/capabilities.php @@ -0,0 +1,1226 @@ + + * array ( + * 'rolename' => array ( + * 'name' => 'rolename', + * 'capabilities' => array() + * ) + * ) + * + * + * @since 2.0.0 + * @package WordPress + * @subpackage User + */ +class WP_Roles { + /** + * List of roles and capabilities. + * + * @since 2.0.0 + * @access public + * @var array + */ + var $roles; + + /** + * List of the role objects. + * + * @since 2.0.0 + * @access public + * @var array + */ + var $role_objects = array(); + + /** + * List of role names. + * + * @since 2.0.0 + * @access public + * @var array + */ + var $role_names = array(); + + /** + * Option name for storing role list. + * + * @since 2.0.0 + * @access public + * @var string + */ + var $role_key; + + /** + * Whether to use the database for retrieval and storage. + * + * @since 2.1.0 + * @access public + * @var bool + */ + var $use_db = true; + + /** + * Constructor + * + * @since 2.0.0 + */ + function __construct() { + $this->_init(); + } + + /** + * 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 + * @uses $wpdb Used to get the database prefix. + * @global array $wp_user_roles Used to set the 'roles' property value. + */ + function _init () { + global $wpdb, $wp_user_roles; + $this->role_key = $wpdb->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) $this->roles as $role => $data ) { + $this->role_objects[$role] = new WP_Role( $role, $this->roles[$role]['capabilities'] ); + $this->role_names[$role] = $this->roles[$role]['name']; + } + } + + /** + * 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 null|WP_Role WP_Role object if role is added, null if already exists. + */ + function add_role( $role, $display_name, $capabilities = array() ) { + if ( 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. + */ + 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 ); + } + + /** + * 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. + */ + function add_cap( $role, $cap, $grant = true ) { + $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. + */ + function remove_cap( $role, $cap ) { + 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 object|null Null, if role does not exist. WP_Role object, if found. + */ + 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. + */ + 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 + */ + function is_role( $role ) + { + return isset( $this->role_names[$role] ); + } +} + +/** + * WordPress Role class. + * + * @since 2.0.0 + * @package WordPress + * @subpackage User + */ +class WP_Role { + /** + * Role name. + * + * @since 2.0.0 + * @access public + * @var string + */ + var $name; + + /** + * List of capabilities the role contains. + * + * @since 2.0.0 + * @access public + * @var array + */ + var $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. + */ + function __construct( $role, $capabilities ) { + $this->name = $role; + $this->capabilities = $capabilities; + } + + /** + * Assign role a capability. + * + * @see WP_Roles::add_cap() Method uses implementation for role. + * @since 2.0.0 + * @access public + * + * @param string $cap Capability name. + * @param bool $grant Whether role has capability privilege. + */ + function add_cap( $cap, $grant = true ) { + global $wp_roles; + + if ( ! isset( $wp_roles ) ) + $wp_roles = new WP_Roles(); + + $this->capabilities[$cap] = $grant; + $wp_roles->add_cap( $this->name, $cap, $grant ); + } + + /** + * Remove capability from role. + * + * This is a container for {@link WP_Roles::remove_cap()} to remove the + * capability from the role. That is to say, that {@link + * 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. + */ + function remove_cap( $cap ) { + global $wp_roles; + + if ( ! isset( $wp_roles ) ) + $wp_roles = new WP_Roles(); + + unset( $this->capabilities[$cap] ); + $wp_roles->remove_cap( $this->name, $cap ); + } + + /** + * Whether role has capability. + * + * The capabilities is passed through the '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 user has capability. False, if doesn't have capability. + */ + function has_cap( $cap ) { + $capabilities = apply_filters( 'role_has_cap', $this->capabilities, $cap, $this->name ); + if ( !empty( $capabilities[$cap] ) ) + return $capabilities[$cap]; + else + return false; + } + +} + +/** + * WordPress User class. + * + * @since 2.0.0 + * @package WordPress + * @subpackage User + */ +class WP_User { + /** + * User data container. + * + * This will be set as properties of the object. + * + * @since 2.0.0 + * @access private + * @var array + */ + var $data; + + /** + * The user's ID. + * + * @since 2.1.0 + * @access public + * @var int + */ + var $ID = 0; + + /** + * The deprecated user's ID. + * + * @since 2.0.0 + * @access public + * @deprecated Use WP_User::$ID + * @see WP_User::$ID + * @var int + */ + var $id = 0; + + /** + * The individual capabilities the user has been given. + * + * @since 2.0.0 + * @access public + * @var array + */ + var $caps = array(); + + /** + * User metadata option name. + * + * @since 2.0.0 + * @access public + * @var string + */ + var $cap_key; + + /** + * The roles the user is part of. + * + * @since 2.0.0 + * @access public + * @var array + */ + var $roles = array(); + + /** + * All capabilities the user has, including individual and role based. + * + * @since 2.0.0 + * @access public + * @var array + */ + var $allcaps = array(); + + /** + * First name of the user. + * + * Created to prevent notices. + * + * @since 2.7.0 + * @access public + * @var string + */ + var $first_name = ''; + + /** + * Last name of the user. + * + * Created to prevent notices. + * + * @since 2.7.0 + * @access public + * @var string + */ + var $last_name = ''; + + /** + * The filter context applied to user data fields. + * + * @since 2.9.0 + * @access private + * @var string + */ + var $filter = null; + + /** + * Constructor - Sets up the object properties. + * + * Retrieves the userdata and then assigns all of the data keys to direct + * properties of the object. Calls {@link WP_User::_init_caps()} after + * setting up the object's user data properties. + * + * @since 2.0.0 + * @access public + * + * @param int|string $id User's ID or username + * @param int $name Optional. User's username + * @param int $blog_id Optional Blog ID, defaults to current blog. + * @return WP_User + */ + function __construct( $id, $name = '', $blog_id = '' ) { + + if ( empty( $id ) && empty( $name ) ) + return; + + if ( ! is_numeric( $id ) ) { + $name = $id; + $id = 0; + } + + if ( ! empty( $id ) ) + $this->data = get_userdata( $id ); + else + $this->data = get_userdatabylogin( $name ); + + if ( empty( $this->data->ID ) ) + return; + + foreach ( get_object_vars( $this->data ) as $key => $value ) { + $this->{$key} = $value; + } + + $this->id = $this->ID; + $this->for_blog( $blog_id ); + } + + /** + * 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. + * + * @since 2.1.0 + * + * @param string $cap_key Optional capability key + * @access protected + */ + function _init_caps( $cap_key = '' ) { + global $wpdb; + if ( empty($cap_key) ) + $this->cap_key = $wpdb->prefix . 'capabilities'; + else + $this->cap_key = $cap_key; + $this->caps = &$this->{$this->cap_key}; + 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 + * @uses $wp_roles + * @access public + */ + function get_role_caps() { + global $wp_roles; + + if ( ! isset( $wp_roles ) ) + $wp_roles = new 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 ); + } + + /** + * 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. + */ + function add_role( $role ) { + $this->caps[$role] = true; + update_user_meta( $this->ID, $this->cap_key, $this->caps ); + $this->get_role_caps(); + $this->update_user_level_from_caps(); + } + + /** + * Remove role from user. + * + * @since 2.0.0 + * @access public + * + * @param string $role Role name. + */ + 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(); + } + + /** + * 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. + */ + function set_role( $role ) { + foreach ( (array) $this->roles as $oldrole ) + unset( $this->caps[$oldrole] ); + + if ( 1 == count( $this->roles ) && $role == $this->roles[0] ) + return; + + 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(); + do_action( 'set_user_role', $this->ID, $role ); + } + + /** + * 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. + */ + 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 + */ + 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->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. + */ + function add_cap( $cap, $grant = true ) { + $this->caps[$cap] = $grant; + update_user_meta( $this->ID, $this->cap_key, $this->caps ); + } + + /** + * Remove capability from user. + * + * @since 2.0.0 + * @access public + * + * @param string $cap Capability name. + */ + function remove_cap( $cap ) { + if ( empty( $this->caps[$cap] ) ) + return; + unset( $this->caps[$cap] ); + update_user_meta( $this->ID, $this->cap_key, $this->caps ); + } + + /** + * Remove all of the capabilities of the user. + * + * @since 2.1.0 + * @access public + */ + function remove_all_caps() { + global $wpdb; + $this->caps = array(); + delete_user_meta( $this->ID, $this->cap_key ); + delete_user_meta( $this->ID, $wpdb->prefix . 'user_level' ); + $this->get_role_caps(); + } + + /** + * Whether user has capability or role name. + * + * This is useful for looking up whether the user has a specific role + * assigned to the user. The second optional parameter can also be used to + * check for capabilities against a specfic post. + * + * @since 2.0.0 + * @access public + * + * @param string|int $cap Capability or role name to search. + * @param int $post_id Optional. Post ID to check capability against specific post. + * @return bool True, if user has capability; false, if user does not have capability. + */ + function has_cap( $cap ) { + if ( is_numeric( $cap ) ) { + _deprecated_argument( __FUNCTION__, '2.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; + } + + // Must have ALL requested caps + $capabilities = apply_filters( 'user_has_cap', $this->allcaps, $caps, $args ); + $capabilities['exist'] = true; // Everyone is allowed to exist + foreach ( (array) $caps as $cap ) { + //echo "Checking cap $cap
    "; + if ( empty( $capabilities[$cap] ) || !$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 + */ + function translate_level_to_cap( $level ) { + return 'level_' . $level; + } + + /** + * Set the blog to operate on. Defaults to the current blog. + * + * @since 3.0.0 + * + * @param int $blog_id Optional Blog ID, defaults to current blog. + */ + 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 ); + } +} + +/** + * 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 + * + * @param string $cap Capability name. + * @param int $user_id User ID. + * @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': + $caps[] = 'promote_users'; + break; + case 'edit_user': + // Allow user to edit itself + if ( isset( $args[0] ) && $user_id == $args[0] ) + break; + // Fall through + case 'edit_users': + // If multisite these caps are allowed only for super admins. + if ( is_multisite() && !is_super_admin( $user_id ) ) + $caps[] = 'do_not_allow'; + else + $caps[] = 'edit_users'; // Explicit due to primitive fall through + break; + case 'delete_post': + case 'delete_page': + $author_data = get_userdata( $user_id ); + $post = get_post( $args[0] ); + + if ( 'revision' == $post->post_type ) { + $post = get_post( $post->post_parent ); + } + + $post_type = get_post_type_object( $post->post_type ); + + 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 ( '' != $post->post_author ) { + $post_author_data = get_userdata( $post->post_author ); + } else { + // No author set yet, so default to current user for cap checks. + $post_author_data = $author_data; + } + + // If the user is the author... + if ( is_object( $post_author_data ) && $user_id == $post_author_data->ID ) { + // If the post is published... + if ( 'publish' == $post->post_status ) { + $caps[] = $post_type->cap->delete_published_posts; + } elseif ( 'trash' == $post->post_status ) { + if ('publish' == get_post_meta($post->ID, '_wp_trash_meta_status', true) ) + $caps[] = $post_type->cap->delete_published_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, extra cap required. + if ( 'publish' == $post->post_status ) + $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': + $author_data = get_userdata( $user_id ); + $post = get_post( $args[0] ); + + if ( 'revision' == $post->post_type ) { + $post = get_post( $post->post_parent ); + } + + $post_type = get_post_type_object( $post->post_type ); + + 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 ( '' != $post->post_author ) { + $post_author_data = get_userdata( $post->post_author ); + } else { + // No author set yet, so default to current user for cap checks. + $post_author_data = $author_data; + } + + //echo "current user id : $user_id, post author id: " . $post_author_data->ID . "
    "; + // If the user is the author... + if ( is_object( $post_author_data ) && $user_id == $post_author_data->ID ) { + // If the post is published... + if ( 'publish' == $post->post_status ) { + $caps[] = $post_type->cap->edit_published_posts; + } elseif ( 'trash' == $post->post_status ) { + if ('publish' == get_post_meta($post->ID, '_wp_trash_meta_status', true) ) + $caps[] = $post_type->cap->edit_published_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, extra cap required. + if ( 'publish' == $post->post_status ) + $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': + $author_data = get_userdata( $user_id ); + $post = get_post( $args[0] ); + + if ( 'revision' == $post->post_type ) { + $post = get_post( $post->post_parent ); + } + + $post_type = get_post_type_object( $post->post_type ); + + 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; + } + + if ( 'private' != $post->post_status ) { + $caps[] = $post_type->cap->read; + break; + } + + if ( '' != $post->post_author ) { + $post_author_data = get_userdata( $post->post_author ); + } else { + // No author set yet, so default to current user for cap checks. + $post_author_data = $author_data; + } + + if ( is_object( $post_author_data ) && $user_id == $post_author_data->ID ) + $caps[] = $post_type->cap->read; + else + $caps[] = $post_type->cap->read_private_posts; + break; + case 'edit_comment': + $comment = get_comment( $args[0] ); + $post = get_post( $comment->comment_post_ID ); + $post_type_object = get_post_type_object( $post->post_type ); + + $caps = map_meta_cap( $post_type_object->cap->edit_post, $user_id, $post->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_files': + case 'edit_plugins': + case 'edit_themes': + if ( defined('DISALLOW_FILE_EDIT') && DISALLOW_FILE_EDIT ) { + $caps[] = 'do_not_allow'; + break; + } + // Fall through if not DISALLOW_FILE_EDIT. + case 'update_plugins': + case 'delete_plugins': + case 'install_plugins': + case 'update_themes': + case 'delete_themes': + case 'install_themes': + case 'update_core': + // Disallow anything that creates, deletes, or edits core, plugin, or theme files. + // Files in uploads are excepted. + if ( defined('DISALLOW_FILE_MODS') && DISALLOW_FILE_MODS ) { + $caps[] = 'do_not_allow'; + break; + } + // Fall through if not DISALLOW_FILE_MODS. + 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'; + break; + } + // Fall through if not DISALLOW_UNFILTERED_HTML + case 'delete_user': + case 'delete_users': + // If multisite these caps are allowed only for super admins. + if ( is_multisite() && !is_super_admin( $user_id ) ) { + $caps[] = 'do_not_allow'; + } else { + if ( 'delete_user' == $cap ) + $cap = 'delete_users'; + $caps[] = $cap; + } + break; + case 'create_users': + if ( !is_multisite() ) + $caps[] = $cap; + elseif ( is_super_admin() || get_site_option( 'add_new_users' ) ) + $caps[] = $cap; + else + $caps[] = 'do_not_allow'; + break; + default: + // Handle meta capabilities for custom post types. + $post_type_meta_caps = _post_type_meta_capabilities(); + 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; + } + + return apply_filters('map_meta_cap', $caps, $cap, $user_id, $args); +} + +/** + * Whether current user has capability or role. + * + * @since 2.0.0 + * + * @param string $capability Capability or role name. + * @return bool + */ +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 blog. + * + * @since 3.0.0 + * + * @param int $blog_id Blog ID + * @param string $capability Capability or role name. + * @return bool + */ +function current_user_can_for_blog( $blog_id, $capability ) { + $current_user = wp_get_current_user(); + + if ( empty( $current_user ) ) + return false; + + // Create new object to avoid stomping the global current_user. + $user = new WP_User( $current_user->id) ; + + // Set the blog id. @todo add blog id arg to WP_User constructor? + $user->for_blog( $blog_id ); + + $args = array_slice( func_get_args(), 2 ); + $args = array_merge( array( $capability ), $args ); + + return call_user_func_array( array( &$user, 'has_cap' ), $args ); +} + +/** + * 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 = new WP_User( $post->post_author ); + + if ( empty( $author->ID ) ) + 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 = new WP_User( $user ); + + if ( ! $user || ! $user->ID ) + 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 ); +} + +/** + * Retrieve role object. + * + * @see WP_Roles::get_role() Uses method to retrieve role object. + * @since 2.0.0 + * + * @param string $role Role name. + * @return object + */ +function get_role( $role ) { + global $wp_roles; + + if ( ! isset( $wp_roles ) ) + $wp_roles = new WP_Roles(); + + return $wp_roles->get_role( $role ); +} + +/** + * Add role, if it does not exist. + * + * @see WP_Roles::add_role() Uses method to add role. + * @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 null|WP_Role WP_Role object if role is added, null if already exists. + */ +function add_role( $role, $display_name, $capabilities = array() ) { + global $wp_roles; + + if ( ! isset( $wp_roles ) ) + $wp_roles = new WP_Roles(); + + return $wp_roles->add_role( $role, $display_name, $capabilities ); +} + +/** + * Remove role, if it exists. + * + * @see WP_Roles::remove_role() Uses method to remove role. + * @since 2.0.0 + * + * @param string $role Role name. + * @return null + */ +function remove_role( $role ) { + global $wp_roles; + + if ( ! isset( $wp_roles ) ) + $wp_roles = new WP_Roles(); + + return $wp_roles->remove_role( $role ); +} + +/** + * Retrieve a list of super admins. + * + * @since 3.0.0 + * + * @uses $super_admins Super admins global variable, if set. + * + * @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 = new WP_User( $user_id ); + else + $user = wp_get_current_user(); + + if ( empty( $user->id ) ) + 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; +} + +?> diff --git a/src/wp-includes/category-template.php b/src/wp-includes/category-template.php new file mode 100644 index 0000000..39e6859 --- /dev/null +++ b/src/wp-includes/category-template.php @@ -0,0 +1,1215 @@ +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 .= 'name ) ) . '">'.$name.'' . $separator; + else + $chain .= $name.$separator; + return $chain; +} + +/** + * Retrieve post categories. + * + * @since 0.71 + * @uses $post + * + * @param int $id Optional, default to current post ID. The post ID. + * @return array + */ +function get_the_category( $id = false ) { + $categories = get_the_terms( $id, 'category' ); + if ( ! $categories ) + $categories = array(); + + $categories = array_values( $categories ); + + foreach ( array_keys( $categories ) as $key ) { + _make_cat_compat( $categories[$key] ); + } + + // Filter name is plural because we return alot of categories (possibly more than #13237) not just one + return apply_filters( 'get_the_categories', $categories ); +} + +/** + * 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 + * @access private + * + * @param object $a + * @param object $b + * @return int + */ +function _usort_terms_by_name( $a, $b ) { + return strcmp( $a->name, $b->name ); +} + +/** + * 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 + * @access private + * + * @param object $a + * @param object $b + * @return int + */ +function _usort_terms_by_ID( $a, $b ) { + if ( $a->term_id > $b->term_id ) + return 1; + elseif ( $a->term_id < $b->term_id ) + return -1; + else + return 0; +} + +/** + * Retrieve category name based on category ID. + * + * @since 0.71 + * + * @param int $cat_ID Category ID. + * @return string Category name. + */ +function get_the_category_by_ID( $cat_ID ) { + $cat_ID = (int) $cat_ID; + $category = &get_category( $cat_ID ); + if ( is_wp_error( $category ) ) + return $category; + return $category->name; +} + +/** + * Retrieve category list in either HTML list or custom format. + * + * @since 1.5.1 + * + * @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; + $categories = get_the_category( $post_id ); + if ( !is_object_in_taxonomy( get_post_type( $post_id ), 'category' ) ) + return apply_filters( 'the_category', '', $separator, $parents ); + + if ( empty( $categories ) ) + 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 .= ''; + } 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 .= 'name ) ) . '" ' . $rel . '>' . $category->name.''; + break; + case 'single': + $thelist .= 'name ) ) . '" ' . $rel . '>'; + if ( $category->parent ) + $thelist .= get_category_parents( $category->parent, false, $separator ); + $thelist .= "$category->name"; + break; + case '': + default: + $thelist .= 'name ) ) . '" ' . $rel . '>' . $category->name.''; + } + ++$i; + } + } + return apply_filters( 'the_category', $thelist, $separator, $parents ); +} + + +/** + * Check if the current post in 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_term( $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 list of arguments is below: + * 'show_option_all' (string) - Text to display for showing all categories. + * 'show_option_none' (string) - Text to display for showing no categories. + * 'orderby' (string) default is 'ID' - What column to use for ordering the + * categories. + * 'order' (string) default is 'ASC' - What direction to order categories. + * 'show_last_update' (bool|int) default is 0 - See {@link get_categories()} + * 'show_count' (bool|int) default is 0 - Whether to show how many posts are + * in the category. + * 'hide_empty' (bool|int) default is 1 - Whether to hide categories that + * don't have any posts attached to them. + * 'child_of' (int) default is 0 - See {@link get_categories()}. + * 'exclude' (string) - See {@link get_categories()}. + * 'echo' (bool|int) default is 1 - Whether to display or retrieve content. + * 'depth' (int) - The max depth. + * 'tab_index' (int) - Tab index for select element. + * 'name' (string) - The name attribute value for select element. + * 'id' (string) - The ID attribute value for select element. Defaults to name if omitted. + * 'class' (string) - The class attribute value for select element. + * 'selected' (int) - Which category ID is selected. + * 'taxonomy' (string) - The name of the taxonomy to retrieve. Defaults to category. + * + * 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 + * + * @param string|array $args Optional. Override default arguments. + * @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_last_update' => 0, '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 + ); + + $defaults['selected'] = ( is_category() ) ? get_query_var( 'cat' ) : 0; + + // Back compat. + if ( isset( $args['type'] ) && 'link' == $args['type'] ) { + _deprecated_argument( __FUNCTION__, '3.0', '' ); + $args['taxonomy'] = 'link_category'; + } + + $r = wp_parse_args( $args, $defaults ); + + if ( !isset( $r['pad_counts'] ) && $r['show_count'] && $r['hierarchical'] ) { + $r['pad_counts'] = true; + } + + $r['include_last_update_time'] = $r['show_last_update']; + extract( $r ); + + $tab_index_attribute = ''; + if ( (int) $tab_index > 0 ) + $tab_index_attribute = " tabindex=\"$tab_index\""; + + $categories = get_terms( $taxonomy, $r ); + $name = esc_attr( $name ); + $class = esc_attr( $class ); + $id = $id ? esc_attr( $id ) : $name; + + if ( ! $r['hide_if_empty'] || ! empty($categories) ) + $output = "\n"; + + + $output = apply_filters( 'wp_dropdown_cats', $output ); + + if ( $echo ) + echo $output; + + return $output; +} + +/** + * Display or retrieve the HTML list of categories. + * + * The list of arguments is below: + * 'show_option_all' (string) - Text to display for showing all categories. + * 'orderby' (string) default is 'ID' - What column to use for ordering the + * categories. + * 'order' (string) default is 'ASC' - What direction to order categories. + * 'show_last_update' (bool|int) default is 0 - See {@link + * walk_category_dropdown_tree()} + * 'show_count' (bool|int) default is 0 - Whether to show how many posts are + * in the category. + * 'hide_empty' (bool|int) default is 1 - Whether to hide categories that + * don't have any posts attached to them. + * 'use_desc_for_title' (bool|int) default is 1 - Whether to use the + * description instead of the category title. + * 'feed' - See {@link get_categories()}. + * 'feed_type' - See {@link get_categories()}. + * 'feed_image' - See {@link get_categories()}. + * 'child_of' (int) default is 0 - See {@link get_categories()}. + * 'exclude' (string) - See {@link get_categories()}. + * 'exclude_tree' (string) - See {@link get_categories()}. + * 'echo' (bool|int) default is 1 - Whether to display or retrieve content. + * 'current_category' (int) - See {@link get_categories()}. + * 'hierarchical' (bool) - See {@link get_categories()}. + * 'title_li' (string) - See {@link get_categories()}. + * 'depth' (int) - The max depth. + * + * @since 2.1.0 + * + * @param string|array $args Optional. Override default arguments. + * @return string HTML content only if 'echo' argument is 0. + */ +function wp_list_categories( $args = '' ) { + $defaults = array( + 'show_option_all' => '', 'show_option_none' => __('No categories'), + 'orderby' => 'name', 'order' => 'ASC', + 'show_last_update' => 0, 'style' => 'list', + 'show_count' => 0, 'hide_empty' => 1, + 'use_desc_for_title' => 1, 'child_of' => 0, + 'feed' => '', 'feed_type' => '', + 'feed_image' => '', 'exclude' => '', + 'exclude_tree' => '', 'current_category' => 0, + 'hierarchical' => true, 'title_li' => __( 'Categories' ), + 'echo' => 1, 'depth' => 0, + 'taxonomy' => 'category' + ); + + $r = wp_parse_args( $args, $defaults ); + + if ( !isset( $r['pad_counts'] ) && $r['show_count'] && $r['hierarchical'] ) + $r['pad_counts'] = true; + + if ( isset( $r['show_date'] ) ) + $r['include_last_update_time'] = $r['show_date']; + + if ( true == $r['hierarchical'] ) { + $r['exclude_tree'] = $r['exclude']; + $r['exclude'] = ''; + } + + if ( !isset( $r['class'] ) ) + $r['class'] = ( 'category' == $r['taxonomy'] ) ? 'categories' : $r['taxonomy']; + + extract( $r ); + + if ( !taxonomy_exists($taxonomy) ) + return false; + + $categories = get_categories( $r ); + + $output = ''; + if ( $title_li && 'list' == $style ) + $output = '
  • ' . $title_li . '
      '; + + if ( empty( $categories ) ) { + if ( ! empty( $show_option_none ) ) { + if ( 'list' == $style ) + $output .= '
    • ' . $show_option_none . '
    • '; + else + $output .= $show_option_none; + } + } else { + if( !empty( $show_option_all ) ) + if ( 'list' == $style ) + $output .= '
    • ' . $show_option_all . '
    • '; + else + $output .= '' . $show_option_all . ''; + + if ( empty( $r['current_category'] ) && ( is_category() || is_tax() || is_tag() ) ) { + $current_term_object = get_queried_object(); + if ( $r['taxonomy'] == $current_term_object->taxonomy ) + $r['current_category'] = get_queried_object_id(); + } + + if ( $hierarchical ) + $depth = $r['depth']; + else + $depth = -1; // Flat. + + $output .= walk_category_tree( $categories, $depth, $r ); + } + + if ( $title_li && 'list' == $style ) + $output .= '
  • '; + + $output = apply_filters( 'wp_list_categories', $output, $args ); + + if ( $echo ) + echo $output; + else + return $output; +} + +/** + * 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_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 'exclude' and 'include' arguments are used for the {@link 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 $args Optional. Override default arguments. + * @return array Generated tag cloud, only if no failures and 'array' is set for the 'format' argument. + */ +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', '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_tag_link( $tag->term_id, $tag->taxonomy ); + else + $link = get_term_link( intval($tag->term_id), $tag->taxonomy ); + if ( is_wp_error( $link ) ) + return false; + + $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 + + $return = apply_filters( 'wp_tag_cloud', $return, $args ); + + if ( 'array' == $args['format'] || empty($args['echo']) ) + return $return; + + echo $return; +} + +/** + * Default text for tooltip for tag links + * + * @param integer $count number of posts with that tag + * @return string text for the tooltip of a tag link. + */ +function default_topic_count_text( $count ) { + return sprintf( _n('%s topic', '%s topics', $count), number_format_i18n( $count ) ); +} + +/** + * Default topic count scaling for tag links + * + * @param integer $count number of posts with that tag + * @return integer scaled count + */ +function default_topic_count_scale( $count ) { + return round(log10($count + 1) * 100); +} + + +/** + * Generates a tag cloud (heatmap) from provided data. + * + * 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 'tag_cloud_sort' filter allows you to override the sorting. + * Passed to the filter: $tags array and $args array, has to return the $tags array + * after sorting it. + * + * 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' or + * 'RAND'. + * + * The 'number' argument is how many tags to return. By default, the limit will + * be to return the entire tag cloud list. + * + * 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. + * + * @todo Complete functionality. + * @since 2.3.0 + * + * @param array $tags List of tags. + * @param string|array $args Optional, override default arguments. + * @return string + */ +function wp_generate_tag_cloud( $tags, $args = '' ) { + global $wp_rewrite; + $defaults = array( + 'smallest' => 8, 'largest' => 22, 'unit' => 'pt', 'number' => 0, + 'format' => 'flat', 'separator' => "\n", 'orderby' => 'name', 'order' => 'ASC', + 'topic_count_text_callback' => 'default_topic_count_text', + 'topic_count_scale_callback' => 'default_topic_count_scale', 'filter' => 1, + ); + + if ( !isset( $args['topic_count_text_callback'] ) && isset( $args['single_text'] ) && isset( $args['multiple_text'] ) ) { + $body = 'return sprintf ( + _n(' . var_export($args['single_text'], true) . ', ' . var_export($args['multiple_text'], true) . ', $count), + number_format_i18n( $count ));'; + $args['topic_count_text_callback'] = create_function('$count', $body); + } + + $args = wp_parse_args( $args, $defaults ); + extract( $args ); + + if ( empty( $tags ) ) + return; + + $tags_sorted = apply_filters( 'tag_cloud_sort', $tags, $args ); + if ( $tags_sorted != $tags ) { // the tags have been sorted by a plugin + $tags = $tags_sorted; + unset($tags_sorted); + } else { + if ( 'RAND' == $order ) { + shuffle($tags); + } else { + // SQL cannot save you; this is a second (potentially different) sort on a subset of data. + if ( 'name' == $orderby ) + uasort( $tags, create_function('$a, $b', 'return strnatcasecmp($a->name, $b->name);') ); + else + uasort( $tags, create_function('$a, $b', 'return ($a->count > $b->count);') ); + + if ( 'DESC' == $order ) + $tags = array_reverse( $tags, true ); + } + } + + if ( $number > 0 ) + $tags = array_slice($tags, 0, $number); + + $counts = array(); + $real_counts = array(); // For the alt tag + foreach ( (array) $tags as $key => $tag ) { + $real_counts[ $key ] = $tag->count; + $counts[ $key ] = $topic_count_scale_callback($tag->count); + } + + $min_count = min( $counts ); + $spread = max( $counts ) - $min_count; + if ( $spread <= 0 ) + $spread = 1; + $font_spread = $largest - $smallest; + if ( $font_spread < 0 ) + $font_spread = 1; + $font_step = $font_spread / $spread; + + $a = array(); + + foreach ( $tags as $key => $tag ) { + $count = $counts[ $key ]; + $real_count = $real_counts[ $key ]; + $tag_link = '#' != $tag->link ? esc_url( $tag->link ) : '#'; + $tag_id = isset($tags[ $key ]->id) ? $tags[ $key ]->id : $key; + $tag_name = $tags[ $key ]->name; + $a[] = "$tag_name"; + } + + switch ( $format ) : + case 'array' : + $return =& $a; + break; + case 'list' : + $return = "
      \n\t
    • "; + $return .= join( "
    • \n\t
    • ", $a ); + $return .= "
    • \n
    \n"; + break; + default : + $return = join( $separator, $a ); + break; + endswitch; + + if ( $filter ) + return apply_filters( 'wp_generate_tag_cloud', $return, $tags, $args ); + else + return $return; +} + +/** + * Callback for comparing tags based on name + * + * @since 3.1.0 + * @access private + */ +function _wp_tag_cloud_name_sort_cb( $a, $b ) { + return strnatcasecmp( $a->name, $b->name ); +} + +/** + * Callback for comparing tags based on count + * + * @since 3.1.0 + * @access private + */ +function _wp_tag_cloud_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. + */ +function walk_category_tree() { + $args = func_get_args(); + // the user's options are the third parameter + if ( empty($args[2]['walker']) || !is_a($args[2]['walker'], '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. + */ +function walk_category_dropdown_tree() { + $args = func_get_args(); + // the user's options are the third parameter + if ( empty($args[2]['walker']) || !is_a($args[2]['walker'], 'Walker') ) + $walker = new Walker_CategoryDropdown; + else + $walker = $args[2]['walker']; + + return call_user_func_array(array( &$walker, 'walk' ), $args ); +} + +/** + * Create HTML list of categories. + * + * @package WordPress + * @since 2.1.0 + * @uses Walker + */ +class Walker_Category extends Walker { + /** + * @see Walker::$tree_type + * @since 2.1.0 + * @var string + */ + var $tree_type = 'category'; + + /** + * @see Walker::$db_fields + * @since 2.1.0 + * @todo Decouple this + * @var array + */ + var $db_fields = array ('parent' => 'parent', 'id' => 'term_id'); + + /** + * @see Walker::start_lvl() + * @since 2.1.0 + * + * @param string $output Passed by reference. Used to append additional content. + * @param int $depth Depth of category. Used for tab indentation. + * @param array $args Will only append content if style argument value is 'list'. + */ + function start_lvl(&$output, $depth, $args) { + if ( 'list' != $args['style'] ) + return; + + $indent = str_repeat("\t", $depth); + $output .= "$indent
      \n"; + } + + /** + * @see Walker::end_lvl() + * @since 2.1.0 + * + * @param string $output Passed by reference. Used to append additional content. + * @param int $depth Depth of category. Used for tab indentation. + * @param array $args Will only append content if style argument value is 'list'. + */ + function end_lvl(&$output, $depth, $args) { + if ( 'list' != $args['style'] ) + return; + + $indent = str_repeat("\t", $depth); + $output .= "$indent
    \n"; + } + + /** + * @see Walker::start_el() + * @since 2.1.0 + * + * @param string $output Passed by reference. Used to append additional content. + * @param object $category Category data object. + * @param int $depth Depth of category in reference to parents. + * @param array $args + */ + function start_el(&$output, $category, $depth, $args) { + extract($args); + + $cat_name = esc_attr( $category->name ); + $cat_name = apply_filters( 'list_cats', $cat_name, $category ); + $link = 'description) ) + $link .= 'title="' . esc_attr( sprintf(__( 'View all posts filed under %s' ), $cat_name) ) . '"'; + else + $link .= 'title="' . esc_attr( strip_tags( apply_filters( 'category_description', $category->description, $category ) ) ) . '"'; + $link .= '>'; + $link .= $cat_name . ''; + + if ( !empty($feed_image) || !empty($feed) ) { + $link .= ' '; + + if ( empty($feed_image) ) + $link .= '('; + + $link .= ''; + + $link .= ''; + + if ( empty($feed_image) ) + $link .= ')'; + } + + if ( !empty($show_count) ) + $link .= ' (' . intval($category->count) . ')'; + + if ( !empty($show_date) ) + $link .= ' ' . gmdate('Y-m-d', $category->last_update_timestamp); + + if ( 'list' == $args['style'] ) { + $output .= "\tterm_id; + if ( !empty($current_category) ) { + $_current_category = get_term( $current_category, $category->taxonomy ); + if ( $category->term_id == $current_category ) + $class .= ' current-cat'; + elseif ( $category->term_id == $_current_category->parent ) + $class .= ' current-cat-parent'; + } + $output .= ' class="' . $class . '"'; + $output .= ">$link\n"; + } else { + $output .= "\t$link
    \n"; + } + } + + /** + * @see Walker::end_el() + * @since 2.1.0 + * + * @param string $output Passed by reference. Used to append additional content. + * @param object $page Not used. + * @param int $depth Depth of category. Not used. + * @param array $args Only uses 'list' for whether should append to output. + */ + function end_el(&$output, $page, $depth, $args) { + if ( 'list' != $args['style'] ) + return; + + $output .= "\n"; + } + +} + +/** + * Create HTML dropdown list of Categories. + * + * @package WordPress + * @since 2.1.0 + * @uses Walker + */ +class Walker_CategoryDropdown extends Walker { + /** + * @see Walker::$tree_type + * @since 2.1.0 + * @var string + */ + var $tree_type = 'category'; + + /** + * @see Walker::$db_fields + * @since 2.1.0 + * @todo Decouple this + * @var array + */ + var $db_fields = array ('parent' => 'parent', 'id' => 'term_id'); + + /** + * @see Walker::start_el() + * @since 2.1.0 + * + * @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 'show_last_update' keys, if they exist. + */ + function start_el(&$output, $category, $depth, $args) { + $pad = str_repeat(' ', $depth * 3); + + $cat_name = apply_filters('list_cats', $category->name, $category); + $output .= "\t\n"; + } +} + +// +// 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 + * @uses apply_filters() Calls 'get_the_tags' filter on the list of post tags. + * + * @param int $id Post ID. + * @return array + */ +function get_the_tags( $id = 0 ) { + 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 + * @uses apply_filters() Calls 'the_tags' filter on string list of tags. + * + * @param string $before Optional. Before tags. + * @param string $sep Optional. Between tags. + * @param string $after Optional. After tags. + * @return string + */ +function get_the_tag_list( $before = '', $sep = '', $after = '' ) { + return apply_filters( 'the_tags', get_the_term_list( 0, 'post_tag', $before, $sep, $after ), $before, $sep, $after); +} + +/** + * 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. + * @return string + */ +function the_tags( $before = null, $sep = ', ', $after = '' ) { + if ( null === $before ) + $before = __('Tags: '); + echo get_the_tag_list($before, $sep, $after); +} + +/** + * Retrieve tag description. + * + * @since 2.8 + * + * @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 + * + * @param int $term Optional. Term ID. Will use global term ID by default. + * @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(); + $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 $id Post ID. Is not optional. + * @param string $taxonomy Taxonomy name. + * @return array|bool False on failure. Array of term objects on success. + */ +function get_the_terms( $id = 0, $taxonomy ) { + global $post; + + $id = (int) $id; + + if ( !$id ) { + if ( !$post->ID ) + return false; + else + $id = (int) $post->ID; + } + + $terms = get_object_term_cache( $id, $taxonomy ); + if ( false === $terms ) { + $terms = wp_get_object_terms( $id, $taxonomy ); + wp_cache_add($id, $terms, $taxonomy . '_relationships'); + } + + $terms = apply_filters( 'get_the_terms', $terms, $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 + */ +function get_the_term_list( $id = 0, $taxonomy, $before = '', $sep = '', $after = '' ) { + $terms = get_the_terms( $id, $taxonomy ); + + if ( is_wp_error( $terms ) ) + return $terms; + + if ( empty( $terms ) ) + return false; + + foreach ( $terms as $term ) { + $link = get_term_link( $term, $taxonomy ); + if ( is_wp_error( $link ) ) + return $link; + $term_links[] = ''; + } + + $term_links = apply_filters( "term_links-$taxonomy", $term_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 null|bool False on WordPress error. Returns null when displaying. + */ +function the_terms( $id = 0, $taxonomy, $before = '', $sep = ', ', $after = '' ) { + $term_list = get_the_term_list( $id, $taxonomy, $before, $sep, $after ); + + if ( is_wp_error( $term_list ) ) + return false; + + 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 $tag 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/src/wp-includes/category.php b/src/wp-includes/category.php new file mode 100644 index 0000000..4d02277 --- /dev/null +++ b/src/wp-includes/category.php @@ -0,0 +1,359 @@ + 'ids', 'get' => 'all') ); + wp_cache_add( 'all_category_ids', $cat_ids, 'category' ); + } + + return $cat_ids; +} + +/** + * 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 backwards + * compatible with pre-2.3 plugins and themes. + * + * @since 2.1.0 + * @see get_terms() Type of arguments that can be changed. + * @link http://codex.wordpress.org/Function_Reference/get_categories + * + * @param string|array $args Optional. Change the defaults retrieving categories. + * @return array List of categories. + */ +function &get_categories( $args = '' ) { + $defaults = array( 'taxonomy' => 'category' ); + $args = wp_parse_args( $args, $defaults ); + + $taxonomy = apply_filters( 'get_categories_taxonomy', $args['taxonomy'], $args ); + + // Back compat + if ( isset($args['type']) && 'link' == $args['type'] ) { + _deprecated_argument( __FUNCTION__, '3.0', '' ); + $taxonomy = $args['taxonomy'] = 'link_category'; + } + + $categories = (array) get_terms( $taxonomy, $args ); + + 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 backwards compatibility. + * + * @since 1.5.1 + * @uses get_term() Used to get the category data from the taxonomy. + * + * @param int|object $category Category ID or Category row object + * @param string $output Optional. Constant OBJECT, ARRAY_A, or ARRAY_N + * @param string $filter Optional. Default is raw or no WordPress defined filter will applied. + * @return mixed Category data in type defined by $output parameter. + */ +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. Constant OBJECT, ARRAY_A, or ARRAY_N + * @return null|object|array Null on failure. 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 null; + + 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 ) + return get_category( $category->term_id, $output ); + } + + // If full matching is not required, return the first cat that matches the leaf. + if ( ! $full_match ) + return get_category( $categories[0]->term_id, $output ); + + return null; +} + +/** + * 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 Optional. Default is 'General' and can be any category name. + * @return int 0, if failure and ID of category on success. + */ +function get_cat_ID( $cat_name='General' ) { + $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_category( $cat_id ); + 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 ) { + if ( ! isset($cat1->term_id) ) + $cat1 = &get_category( $cat1 ); + if ( ! isset($cat2->parent) ) + $cat2 = &get_category( $cat2 ); + + if ( empty($cat1->term_id) || empty($cat2->parent) ) + return false; + if ( $cat2->parent == $cat1->term_id ) + return true; + + return cat_is_ancestor_of( $cat1, get_category( $cat2->parent ) ); +} + + +/** + * Sanitizes category data based on context. + * + * @since 2.3.0 + * @uses sanitize_term() See this function for what context are supported. + * + * @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 + * @uses sanitize_term_field() See function for more details. + * + * @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. + * @uses apply_filters() Calls 'get_tags' hook on array of tags and with $args. + * + * @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; + } + + $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|object $tag + * @param string $output Optional. Constant OBJECT, ARRAY_A, or ARRAY_N + * @param string $filter Optional. Default is raw or no WordPress defined filter will applied. + * @return object|array Return type based on $output value. + */ +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 + * @uses clean_term_cache() Clears the cache for the category based on ID + * + * @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 + * @access private + * + * @param array|object $category Category Row object or array + */ +function _make_cat_compat( &$category ) { + if ( is_object( $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/src/wp-includes/class-IXR.php b/src/wp-includes/class-IXR.php new file mode 100644 index 0000000..9d89f0c --- /dev/null +++ b/src/wp-includes/class-IXR.php @@ -0,0 +1,1065 @@ +data = $data; + if (!$type) { + $type = $this->calculateType(); + } + $this->type = $type; + if ($type == 'struct') { + // Turn all the values in the array in to new IXR_Value objects + foreach ($this->data as $key => $value) { + $this->data[$key] = new IXR_Value($value); + } + } + if ($type == 'array') { + for ($i = 0, $j = count($this->data); $i < $j; $i++) { + $this->data[$i] = new IXR_Value($this->data[$i]); + } + } + } + + function calculateType() + { + if ($this->data === true || $this->data === false) { + return 'boolean'; + } + if (is_integer($this->data)) { + return 'int'; + } + if (is_double($this->data)) { + return 'double'; + } + + // Deal with IXR object types base64 and date + if (is_object($this->data) && is_a($this->data, 'IXR_Date')) { + return 'date'; + } + if (is_object($this->data) && is_a($this->data, 'IXR_Base64')) { + return 'base64'; + } + + // If it is a normal PHP object convert it in to a struct + if (is_object($this->data)) { + $this->data = get_object_vars($this->data); + return 'struct'; + } + if (!is_array($this->data)) { + return 'string'; + } + + // We have an array - is it an array or a struct? + if ($this->isStruct($this->data)) { + return 'struct'; + } else { + return 'array'; + } + } + + function getXml() + { + // Return XML for this value + switch ($this->type) { + case 'boolean': + return ''.(($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 unknown_type $array + * @return boolean + */ + function isStruct($array) + { + $expected = 0; + foreach ($array as $key => $value) { + if ((string)$key != (string)$expected) { + return true; + } + $expected++; + } + return false; + } +} + +/** + * IXR_MESSAGE + * + * @package IXR + * @since 1.5 + * + */ +class IXR_Message +{ + var $message; + var $messageType; // methodCall / methodResponse / fault + var $faultCode; + var $faultString; + var $methodName; + var $params; + + // Current variable stacks + var $_arraystructs = array(); // The stack used to keep track of the current array/struct + var $_arraystructstypes = array(); // Stack keeping track of if things are structs or array + var $_currentStructName = array(); // A stack as well + var $_param; + var $_value; + var $_currentTag; + var $_currentTagContents; + // The XML parser + var $_parser; + + function IXR_Message($message) + { + $this->message =& $message; + } + + function parse() + { + // first remove the XML declaration + // merged from WP #10698 - this method avoids the RAM usage of preg_replace on very large messages + $header = preg_replace( '/<\?xml.*?\?'.'>/', '', substr($this->message, 0, 100), 1); + $this->message = substr_replace($this->message, $header, 0, 100); + if (trim($this->message) == '') { + return false; + } + $this->_parser = xml_parser_create(); + // Set XML parser to take the case of tags in to account + xml_parser_set_option($this->_parser, XML_OPTION_CASE_FOLDING, false); + // Set XML parser callback functions + xml_set_object($this->_parser, $this); + xml_set_element_handler($this->_parser, 'tag_open', 'tag_close'); + xml_set_character_data_handler($this->_parser, 'cdata'); + $chunk_size = 262144; // 256Kb, parse in chunks to avoid the RAM usage on very large messages + $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 paramater + $this->params[] = $value; + } + } + $this->_currentTagContents = ''; + } +} + +/** + * IXR_Server + * + * @package IXR + * @since 1.5 + */ +class IXR_Server +{ + var $data; + var $callbacks = array(); + var $message; + var $capabilities; + + function IXR_Server($callbacks = false, $data = false, $wait = false) + { + $this->setCapabilities(); + if ($callbacks) { + $this->callbacks = $callbacks; + } + $this->setCallbacks(); + if (!$wait) { + $this->serve($data); + } + } + + function serve($data = false) + { + if (!$data) { + if (isset($_SERVER['REQUEST_METHOD']) && $_SERVER['REQUEST_METHOD'] !== 'POST') { + header('Content-Type: text/plain'); // merged from WP #9093 + die('XML-RPC server accepts POST requests only.'); + } + + global $HTTP_RAW_POST_DATA; + if (empty($HTTP_RAW_POST_DATA)) { + // workaround for a bug in PHP 5.2.2 - http://bugs.php.net/bug.php?id=41293 + $data = file_get_contents('php://input'); + } else { + $data =& $HTTP_RAW_POST_DATA; + } + } + $this->message = new IXR_Message($data); + if (!$this->message->parse()) { + $this->error(-32700, 'parse error. not well formed'); + } + if ($this->message->messageType != 'methodCall') { + $this->error(-32600, 'server error. invalid xml-rpc. not conforming to spec. Request must be a methodCall'); + } + $result = $this->call($this->message->methodName, $this->message->params); + + // Is the result an error? + if (is_a($result, 'IXR_Error')) { + $this->error($result); + } + + // Encode the result + $r = new IXR_Value($result); + $resultxml = $r->getXml(); + + // Create the XML + $xml = << + + + + $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 paramater just send that instead of the whole array + $args = $args[0]; + } + + // Are we dealing with a function or a method? + if (is_string($method) && substr($method, 0, 5) == 'this:') { + // It's a class method - check it exists + $method = substr($method, 5); + if (!method_exists($this, $method)) { + return new IXR_Error(-32601, 'server error. requested class method "'.$method.'" does not exist.'); + } + + //Call the method + $result = $this->$method($args); + } else { + // It's a function - does it exist? + if (is_array($method)) { + if (!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) + { + $xml = ''."\n".$xml; + $length = strlen($xml); + header('Connection: close'); + header('Content-Length: '.$length); + header('Content-Type: text/xml'); + header('Date: '.date('r')); + echo $xml; + exit; + } + + function hasMethod($method) + { + return in_array($method, array_keys($this->callbacks)); + } + + function setCapabilities() + { + // Initialises capabilities array + $this->capabilities = array( + 'xmlrpc' => array( + 'specUrl' => 'http://www.xmlrpc.com/spec', + 'specVersion' => 1 + ), + 'faults_interop' => array( + 'specUrl' => 'http://xmlrpc-epi.sourceforge.net/specs/rfc.fault_codes.php', + 'specVersion' => 20010516 + ), + 'system.multicall' => array( + 'specUrl' => 'http://www.xmlrpc.com/discuss/msgReader$1208', + 'specVersion' => 1 + ), + ); + } + + function getCapabilities($args) + { + return $this->capabilities; + } + + function setCallbacks() + { + $this->callbacks['system.getCapabilities'] = 'this:getCapabilities'; + $this->callbacks['system.listMethods'] = 'this:listMethods'; + $this->callbacks['system.multicall'] = 'this:multiCall'; + } + + function listMethods($args) + { + // Returns a list of methods - uses array_reverse to ensure user defined + // methods are listed before server defined methods + return array_reverse(array_keys($this->callbacks)); + } + + function multiCall($methodcalls) + { + // See http://www.xmlrpc.com/discuss/msgReader$1208 + $return = array(); + foreach ($methodcalls as $call) { + $method = $call['methodName']; + $params = $call['params']; + if ($method == 'system.multicall') { + $result = new IXR_Error(-32600, 'Recursive calls to system.multicall are forbidden'); + } else { + $result = $this->call($method, $params); + } + if (is_a($result, 'IXR_Error')) { + $return[] = array( + 'faultCode' => $result->code, + 'faultString' => $result->message + ); + } else { + $return[] = array($result); + } + } + return $return; + } +} + +/** + * IXR_Request + * + * @package IXR + * @since 1.5 + */ +class IXR_Request +{ + var $method; + var $args; + var $xml; + + function IXR_Request($method, $args) + { + $this->method = $method; + $this->args = $args; + $this->xml = << + +{$this->method} + + +EOD; + foreach ($this->args as $arg) { + $this->xml .= ''; + $v = new IXR_Value($arg); + $this->xml .= $v->getXml(); + $this->xml .= "\n"; + } + $this->xml .= ''; + } + + function getLength() + { + return strlen($this->xml); + } + + function getXml() + { + return $this->xml; + } +} + +/** + * IXR_Client + * + * @package IXR + * @since 1.5 + * + */ +class IXR_Client +{ + var $server; + var $port; + var $path; + var $useragent; + var $response; + var $message = false; + var $debug = false; + var $timeout; + var $headers = array(); + + // Storage place for an error message + var $error = false; + + function IXR_Client($server, $path = false, $port = 80, $timeout = 15) + { + if (!$path) { + // Assume we have been given a URL instead + $bits = parse_url($server); + $this->server = $bits['host']; + $this->port = isset($bits['port']) ? $bits['port'] : 80; + $this->path = isset($bits['path']) ? $bits['path'] : '/'; + + // Make absolutely sure we have a path + if (!$this->path) { + $this->path = '/'; + } + } else { + $this->server = $server; + $this->path = $path; + $this->port = $port; + } + $this->useragent = 'The Incutio XML-RPC PHP Library'; + $this->timeout = $timeout; + } + + function query() + { + $args = func_get_args(); + $method = array_shift($args); + $request = new IXR_Request($method, $args); + $length = $request->getLength(); + $xml = $request->getXml(); + $r = "\r\n"; + $request = "POST {$this->path} HTTP/1.0$r"; + + // Merged from WP #8145 - allow custom headers + $this->headers['Host'] = $this->server; + $this->headers['Content-Type'] = 'text/xml'; + $this->headers['User-Agent'] = $this->useragent; + $this->headers['Content-Length']= $length; + + foreach( $this->headers as $header => $value ) { + $request .= "{$header}: {$value}{$r}"; + } + $request .= $r; + + $request .= $xml; + + // Now send the request + if ($this->debug) { + echo '
    '.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; + } +} + + +/** + * IXR_Error + * + * @package IXR + * @since 1.5 + */ +class IXR_Error +{ + var $code; + var $message; + + function IXR_Error($code, $message) + { + $this->code = $code; + $this->message = htmlspecialchars($message); + } + + function getXml() + { + $xml = << + + + + + faultCode + {$this->code} + + + faultString + {$this->message} + + + + + + +EOD; + return $xml; + } +} + +/** + * IXR_Date + * + * @package IXR + * @since 1.5 + */ +class IXR_Date { + var $year; + var $month; + var $day; + var $hour; + var $minute; + var $second; + var $timezone; + + function IXR_Date($time) + { + // $time can be a PHP timestamp or an ISO one + if (is_numeric($time)) { + $this->parseTimestamp($time); + } else { + $this->parseIso($time); + } + } + + function parseTimestamp($timestamp) + { + $this->year = date('Y', $timestamp); + $this->month = date('m', $timestamp); + $this->day = date('d', $timestamp); + $this->hour = date('H', $timestamp); + $this->minute = date('i', $timestamp); + $this->second = date('s', $timestamp); + $this->timezone = ''; + } + + function parseIso($iso) + { + $this->year = substr($iso, 0, 4); + $this->month = substr($iso, 4, 2); + $this->day = substr($iso, 6, 2); + $this->hour = substr($iso, 9, 2); + $this->minute = substr($iso, 12, 2); + $this->second = substr($iso, 15, 2); + $this->timezone = substr($iso, 17); + } + + function getIso() + { + return $this->year.$this->month.$this->day.'T'.$this->hour.':'.$this->minute.':'.$this->second.$this->timezone; + } + + function getXml() + { + return ''.$this->getIso().''; + } + + function getTimestamp() + { + return mktime($this->hour, $this->minute, $this->second, $this->month, $this->day, $this->year); + } +} + +/** + * IXR_Base64 + * + * @package IXR + * @since 1.5 + */ +class IXR_Base64 +{ + var $data; + + function IXR_Base64($data) + { + $this->data = $data; + } + + function getXml() + { + return ''.base64_encode($this->data).''; + } +} + +/** + * IXR_IntrospectionServer + * + * @package IXR + * @since 1.5 + */ +class IXR_IntrospectionServer extends IXR_Server +{ + var $signatures; + var $help; + + function IXR_IntrospectionServer() + { + $this->setCallbacks(); + $this->setCapabilities(); + $this->capabilities['introspection'] = array( + 'specUrl' => 'http://xmlrpc.usefulinc.com/doc/reserved.html', + 'specVersion' => 1 + ); + $this->addCallback( + 'system.methodSignature', + 'this:methodSignature', + array('array', 'string'), + 'Returns an array describing the return type and required parameters of a method' + ); + $this->addCallback( + 'system.getCapabilities', + 'this:getCapabilities', + array('struct'), + 'Returns a struct describing the XML-RPC specifications supported by this server' + ); + $this->addCallback( + 'system.listMethods', + 'this:listMethods', + array('array'), + 'Returns an array of available methods on this server' + ); + $this->addCallback( + 'system.methodHelp', + 'this:methodHelp', + array('string', 'string'), + 'Returns a documentation string for the specified method' + ); + } + + function addCallback($method, $callback, $args, $help) + { + $this->callbacks[$method] = $callback; + $this->signatures[$method] = $args; + $this->help[$method] = $help; + } + + function call($methodname, $args) + { + // Make sure it's in an array + if ($args && !is_array($args)) { + $args = array($args); + } + + // Over-rides default call method, adds signature check + if (!$this->hasMethod($methodname)) { + return new IXR_Error(-32601, 'server error. requested method "'.$this->message->methodName.'" not specified.'); + } + $method = $this->callbacks[$methodname]; + $signature = $this->signatures[$methodname]; + $returnType = array_shift($signature); + + // Check the number of arguments + if (count($args) != count($signature)) { + return new IXR_Error(-32602, 'server error. wrong number of method parameters'); + } + + // Check the argument types + $ok = true; + $argsbackup = $args; + for ($i = 0, $j = count($args); $i < $j; $i++) { + $arg = array_shift($args); + $type = array_shift($signature); + switch ($type) { + case 'int': + case 'i4': + if (is_array($arg) || !is_int($arg)) { + $ok = false; + } + break; + case 'base64': + case 'string': + if (!is_string($arg)) { + $ok = false; + } + break; + case 'boolean': + if ($arg !== false && $arg !== true) { + $ok = false; + } + break; + case 'float': + case 'double': + if (!is_float($arg)) { + $ok = false; + } + break; + case 'date': + case 'dateTime.iso8601': + if (!is_a($arg, 'IXR_Date')) { + $ok = false; + } + break; + } + if (!$ok) { + return new IXR_Error(-32602, 'server error. invalid method parameters'); + } + } + // It passed the test - run the "real" method call + return parent::call($methodname, $argsbackup); + } + + function methodSignature($method) + { + if (!$this->hasMethod($method)) { + return new IXR_Error(-32601, 'server error. requested method "'.$method.'" not specified.'); + } + // We should be returning an array of types + $types = $this->signatures[$method]; + $return = array(); + foreach ($types as $type) { + switch ($type) { + case 'string': + $return[] = 'string'; + break; + case 'int': + case 'i4': + $return[] = 42; + break; + case 'double': + $return[] = 3.1415; + break; + case 'dateTime.iso8601': + $return[] = new IXR_Date(time()); + break; + case 'boolean': + $return[] = true; + break; + case 'base64': + $return[] = new IXR_Base64('base64'); + break; + case 'array': + $return[] = array('array'); + break; + case 'struct': + $return[] = array('struct' => 'struct'); + break; + } + } + return $return; + } + + function methodHelp($method) + { + return $this->help[$method]; + } +} + +/** + * IXR_ClientMulticall + * + * @package IXR + * @since 1.5 + */ +class IXR_ClientMulticall extends IXR_Client +{ + var $calls = array(); + + function IXR_ClientMulticall($server, $path = false, $port = 80) + { + parent::IXR_Client($server, $path, $port); + $this->useragent = 'The Incutio XML-RPC PHP Library (multicall client)'; + } + + function addCall() + { + $args = func_get_args(); + $methodName = array_shift($args); + $struct = array( + 'methodName' => $methodName, + 'params' => $args + ); + $this->calls[] = $struct; + } + + function query() + { + // Prepare multicall, then call the parent::query() method + return parent::query('system.multicall', $this->calls); + } +} + +?> diff --git a/src/wp-includes/class-feed.php b/src/wp-includes/class-feed.php new file mode 100644 index 0000000..067f36c --- /dev/null +++ b/src/wp-includes/class-feed.php @@ -0,0 +1,94 @@ +name = 'feed_' . $filename; + $this->mod_name = 'feed_mod_' . $filename; + $this->lifetime = apply_filters('wp_feed_cache_transient_lifetime', $this->lifetime, $filename); + } + + function save($data) { + if ( is_a($data, 'SimplePie') ) + $data = $data->data; + + set_transient($this->name, $data, $this->lifetime); + set_transient($this->mod_name, time(), $this->lifetime); + return true; + } + + function load() { + return get_transient($this->name); + } + + function mtime() { + return get_transient($this->mod_name); + } + + function touch() { + return set_transient($this->mod_name, time(), $this->lifetime); + } + + function unlink() { + delete_transient($this->name); + delete_transient($this->mod_name); + return true; + } +} + +class WP_SimplePie_File extends SimplePie_File { + + 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_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 { + if ( ! $this->body = file_get_contents($url) ) { + $this->error = 'file_get_contents could not read the file'; + $this->success = false; + } + } + } +} diff --git a/src/wp-includes/class-http.php b/src/wp-includes/class-http.php new file mode 100644 index 0000000..1cf4404 --- /dev/null +++ b/src/wp-includes/class-http.php @@ -0,0 +1,1725 @@ + 'GET', + 'timeout' => apply_filters( 'http_request_timeout', 5), + 'redirection' => apply_filters( 'http_request_redirection_count', 5), + 'httpversion' => apply_filters( 'http_request_version', '1.0'), + 'user-agent' => apply_filters( 'http_headers_useragent', 'WordPress/' . $wp_version . '; ' . get_bloginfo( 'url' ) ), + 'blocking' => true, + 'headers' => array(), + 'cookies' => array(), + 'body' => null, + 'compress' => false, + 'decompress' => true, + 'sslverify' => true, + 'stream' => false, + 'filename' => 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 ); + $r = apply_filters( 'http_request_args', $r, $url ); + + // Certain classes decrement this, store a copy of the original value for loop purposes. + $r['_redirection'] = $r['redirection']; + + // Allow plugins to short-circuit the request + $pre = apply_filters( 'pre_http_request', false, $r, $url ); + if ( false !== $pre ) + return $pre; + + $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.' ) ); + + // Determine if this is a https call and pass that on to the transport functions + // so that we can blacklist the transports that do not support ssl verification + $r['ssl'] = $arrURL['scheme'] == 'https' || $arrURL['scheme'] == 'ssl'; + + // Determine if this request is to OUR install of WordPress + $homeURL = parse_url( get_bloginfo( 'url' ) ); + $r['local'] = $homeURL['host'] == $arrURL['host'] || 'localhost' == $arrURL['host']; + unset( $homeURL ); + + // If we are streaming to a file but no filename was given drop it in the WP temp dir + // and pick it's name using the basename of the $url + if ( $r['stream'] && 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 + if ( $r['stream'] ) { + $r['blocking'] = true; + if ( ! 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(); + + if ( ! is_array( $r['headers'] ) ) { + $processedHeaders = WP_Http::processHeaders( $r['headers'] ); + $r['headers'] = $processedHeaders['headers']; + } + + if ( isset( $r['headers']['User-Agent'] ) ) { + $r['user-agent'] = $r['headers']['User-Agent']; + unset( $r['headers']['User-Agent'] ); + } + + if ( 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 ); + + if ( WP_Http_Encoding::is_available() ) + $r['headers']['Accept-Encoding'] = WP_Http_Encoding::accept_encoding(); + + if ( empty($r['body']) ) { + $r['body'] = null; + // Some servers fail when sending content without the content-length header being set. + // Also, to fix another bug, we only send when doing POST and PUT and the content-length + // header isn't already set. + if ( ($r['method'] == 'POST' || $r['method'] == 'PUT') && ! isset( $r['headers']['Content-Length'] ) ) + $r['headers']['Content-Length'] = 0; + } else { + if ( is_array( $r['body'] ) || is_object( $r['body'] ) ) { + $r['body'] = http_build_query( $r['body'], null, '&' ); + $r['headers']['Content-Type'] = 'application/x-www-form-urlencoded; charset=' . get_option( 'blog_charset' ); + $r['headers']['Content-Length'] = strlen( $r['body'] ); + } + + if ( ! isset( $r['headers']['Content-Length'] ) && ! isset( $r['headers']['content-length'] ) ) + $r['headers']['Content-Length'] = strlen( $r['body'] ); + } + + return $this->_dispatch_request($url, $r); + } + + /** + * Tests which transports are capable of supporting the request. + * + * @since 3.2.0 + * @access private + * + * @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 ) { + $request_order = array( 'curl', 'streams', 'fsockopen' ); + + // Loop over each transport on each HTTP request looking for one which will serve this request's needs + foreach ( $request_order as $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 arguements. + * Also caches the transport instance to be used later. + * + * The order for blocking requests is cURL, Streams, and finally Fsockopen. + * The order for non-blocking requests is cURL, Streams and Fsockopen(). + * + * There are currently issues with "localhost" not resolving correctly with DNS. This may cause + * an error "failed to open stream: A connection attempt failed because the connected party did + * not properly respond after a period of time, or established connection failed because [the] + * connected host has failed to respond." + * + * @since 3.2.0 + * @access private + * + * @param string $url URL to Request + * @param array $args Request arguments + * @return array|object 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 ); + + do_action( 'http_api_debug', $response, 'response', $class ); + + if ( is_wp_error( $response ) ) + return $response; + + 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 URI resource. + * @param str|array $args Optional. Override the defaults. + * @return array|object Array containing 'headers', 'body', 'response', 'cookies', 'filename'. A WP_Error instance upon error + */ + 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 URI resource. + * @param str|array $args Optional. Override the defaults. + * @return array|object Array containing 'headers', 'body', 'response', 'cookies', 'filename'. A WP_Error instance upon error + */ + 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 URI resource. + * @param str|array $args Optional. Override the defaults. + * @return array|object Array containing 'headers', 'body', 'response', 'cookies', 'filename'. A WP_Error instance upon error + */ + 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. + */ + 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 + * @return array Processed string headers. If duplicate headers are encountered, + * Then a numbered array is returned as the value of that header-key. + */ + function processHeaders($headers) { + // 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 ) , (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); + + if ( !empty( $value ) ) { + $key = strtolower( $key ); + if ( isset( $newheaders[$key] ) ) { + if ( !is_array($newheaders[$key]) ) + $newheaders[$key] = array($newheaders[$key]); + $newheaders[$key][] = trim( $value ); + } else { + $newheaders[$key] = trim( $value ); + } + if ( 'set-cookie' == $key ) + $cookies[] = new WP_Http_Cookie( $value ); + } + } + + 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's assumed to contain WP_Http_Cookie objects, 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() + */ + function buildCookieHeader( &$r ) { + if ( ! empty($r['cookies']) ) { + $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. Does not support UTF-8. Does not support + * returning footer headers. Shouldn't be too difficult to support it though. + * + * @todo Add support for footer chunked headers. + * @access public + * @since 2.7.0 + * @static + * + * @param string $body Body content + * @return string Chunked decoded body on success or raw body on failure. + */ + function chunkTransferDecode($body) { + $body = str_replace(array("\r\n", "\r"), "\n", $body); + // The body is not chunked encoding or is malformed. + if ( ! preg_match( '/^[0-9a-f]+(\s|\n)+/mi', trim($body) ) ) + return $body; + + $parsedBody = ''; + //$parsedHeaders = array(); Unsupported + + while ( true ) { + $hasChunk = (bool) preg_match( '/^([0-9a-f]+)(\s|\n)+/mi', $body, $match ); + + if ( $hasChunk ) { + if ( empty( $match[1] ) ) + return $body; + + $length = hexdec( $match[1] ); + $chunkLength = strlen( $match[0] ); + + $strBody = substr($body, $chunkLength, $length); + $parsedBody .= $strBody; + + $body = ltrim(str_replace(array($match[0], $strBody), '', $body), "\n"); + + if ( "0" == trim($body) ) + return $parsedBody; // Ignore footer headers. + } else { + return $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 blog 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 http://core.trac.wordpress.org/ticket/8927 Allow preventing external requests. + * @link http://core.trac.wordpress.org/ticket/14636 Allow wildcard domains in WP_ACCESSIBLE_HOSTS + * + * @param string $uri URI of url. + * @return bool True to block, false to allow. + */ + 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; + + // parse_url() only handles http, https type URLs, and will emit E_WARNING on failure. + // This will be displayed on blogs, which is not reasonable. + $check = @parse_url($uri); + + /* Malformed URL, can not process, but this could mean ssl, so let through anyway. + * + * This isn't very security sound. There are instances where a hacker might attempt + * to bypass the proxy and this check. However, the reason for this behavior is that + * WordPress does not do any checking currently for non-proxy requests, so it is keeps with + * the default unsecure nature of the HTTP request. + */ + if ( $check === false ) + return false; + + $home = parse_url( get_option('siteurl') ); + + // Don't block requests back to ourselves by default + if ( $check['host'] == 'localhost' || $check['host'] == $home['host'] ) + return apply_filters('block_local_requests', false); + + if ( !defined('WP_ACCESSIBLE_HOSTS') ) + return true; + + static $accessible_hosts; + static $wildcard_regex = false; + 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('\*', '[\w.]+?', 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 its in the array, then we can't access it. + + + + } +} + +/** + * HTTP request method uses fsockopen function to retrieve the url. + * + * This would be the preferred method, but the fsockopen implementation has the most overhead of all + * the HTTP transport implementations. + * + * @package WordPress + * @subpackage HTTP + * @since 2.7.0 + */ +class WP_Http_Fsockopen { + /** + * Send a HTTP request to a URI using fsockopen(). + * + * Does not support non-blocking mode. + * + * @see WP_Http::request For default options descriptions. + * + * @since 2.7 + * @access public + * @param string $url URI resource. + * @param str|array $args Optional. Override the defaults. + * @return array 'headers', 'body', 'response', 'cookies' and 'filename' keys. + */ + 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']); + } else if ( 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 ); + + $iError = null; // Store error number + $strError = null; // Store error string + + $arrURL = parse_url($url); + + $fsockopen_host = $arrURL['host']; + + $secure_transport = false; + + if ( ! isset( $arrURL['port'] ) ) { + if ( ( $arrURL['scheme'] == 'ssl' || $arrURL['scheme'] == 'https' ) && extension_loaded('openssl') ) { + $fsockopen_host = "ssl://$fsockopen_host"; + $arrURL['port'] = 443; + $secure_transport = true; + } else { + $arrURL['port'] = 80; + } + } + + //fsockopen has issues with 'localhost' with IPv6 with certain versions of PHP, 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($fsockopen_host) ) + $fsockopen_host = '127.0.0.1'; + + // There are issues with the HTTPS and SSL protocols that cause errors that can be safely + // ignored and should be ignored. + if ( true === $secure_transport ) + $error_reporting = error_reporting(0); + + $startDelay = time(); + + $proxy = new WP_HTTP_Proxy(); + + if ( !WP_DEBUG ) { + if ( $proxy->is_enabled() && $proxy->send_through_proxy( $url ) ) + $handle = @fsockopen( $proxy->host(), $proxy->port(), $iError, $strError, $r['timeout'] ); + else + $handle = @fsockopen( $fsockopen_host, $arrURL['port'], $iError, $strError, $r['timeout'] ); + } else { + if ( $proxy->is_enabled() && $proxy->send_through_proxy( $url ) ) + $handle = fsockopen( $proxy->host(), $proxy->port(), $iError, $strError, $r['timeout'] ); + else + $handle = fsockopen( $fsockopen_host, $arrURL['port'], $iError, $strError, $r['timeout'] ); + } + + $endDelay = time(); + + // If the delay is greater than the timeout then fsockopen should't be used, because it will + // cause a long delay. + $elapseDelay = ($endDelay-$startDelay) > $r['timeout']; + if ( true === $elapseDelay ) + add_option( 'disable_fsockopen', $endDelay, null, true ); + + if ( false === $handle ) + return new WP_Error('http_request_failed', $iError . ': ' . $strError); + + $timeout = (int) floor( $r['timeout'] ); + $utimeout = $timeout == $r['timeout'] ? 0 : 1000000 * $r['timeout'] % 1000000; + 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'] : '' ); + + if ( empty($requestPath) ) + $requestPath .= '/'; + + $strHeaders = strtoupper($r['method']) . ' ' . $requestPath . ' HTTP/' . $r['httpversion'] . "\r\n"; + + if ( $proxy->is_enabled() && $proxy->send_through_proxy( $url ) ) + $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'] ) { + fclose($handle); + return array( 'headers' => array(), 'body' => '', 'response' => array('code' => false, 'message' => false), 'cookies' => array() ); + } + + $strResponse = ''; + $bodyStarted = false; + + // 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'] ) ); + + while ( ! feof($handle) ) { + $block = fread( $handle, 4096 ); + if ( $bodyStarted ) { + fwrite( $stream_handle, $block ); + } else { + $strResponse .= $block; + if ( strpos( $strResponse, "\r\n\r\n" ) ) { + $process = WP_Http::processResponse( $strResponse ); + $bodyStarted = true; + fwrite( $stream_handle, $process['body'] ); + unset( $strResponse ); + $process['body'] = ''; + } + } + } + + fclose( $stream_handle ); + + } else { + while ( ! feof($handle) ) + $strResponse .= fread( $handle, 4096 ); + + $process = WP_Http::processResponse( $strResponse ); + unset( $strResponse ); + } + + fclose( $handle ); + + if ( true === $secure_transport ) + error_reporting($error_reporting); + + $arrHeaders = WP_Http::processHeaders( $process['headers'] ); + + // If location is found, then assume redirect and redirect to location. + if ( isset($arrHeaders['headers']['location']) && 0 !== $r['_redirection'] ) { + if ( $r['redirection']-- > 0 ) { + return $this->request($arrHeaders['headers']['location'], $r); + } else { + return new WP_Error('http_request_failed', __('Too many redirects.')); + } + } + + // 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'] ); + + return array( 'headers' => $arrHeaders['headers'], 'body' => $process['body'], 'response' => $arrHeaders['response'], 'cookies' => $arrHeaders['cookies'], 'filename' => $r['filename'] ); + } + + /** + * Whether this class can be used for retrieving an URL. + * + * @since 2.7.0 + * @static + * @return boolean False means this class can not be used, true means it can. + */ + function test( $args = array() ) { + if ( ! function_exists( 'fsockopen' ) ) + return false; + + if ( false !== ($option = get_option( 'disable_fsockopen' )) && time()-$option < 43200 ) // 12 hours + return false; + + $is_ssl = isset( $args['ssl'] ) && $args['ssl']; + + if ( $is_ssl && ! extension_loaded( 'openssl' ) ) + return false; + + return apply_filters( 'use_fsockopen_transport', true, $args ); + } +} + +/** + * HTTP request method uses Streams to retrieve the url. + * + * Requires PHP 5.0+ and uses fopen with stream context. Requires that 'allow_url_fopen' PHP setting + * to be enabled. + * + * Second preferred method for getting the URL, for PHP 5. + * + * @package WordPress + * @subpackage HTTP + * @since 2.7.0 + */ +class WP_Http_Streams { + /** + * Send a HTTP request to a URI using streams with fopen(). + * + * @access public + * @since 2.7.0 + * + * @param string $url + * @param str|array $args Optional. Override the defaults. + * @return array 'headers', 'body', 'response', 'cookies' and 'filename' keys. + */ + 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']); + } else if ( 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); + + if ( false === $arrURL ) + return new WP_Error('http_request_failed', sprintf(__('Malformed URL: %s'), $url)); + + if ( 'http' != $arrURL['scheme'] && 'https' != $arrURL['scheme'] ) + $url = preg_replace('|^' . preg_quote($arrURL['scheme'], '|') . '|', 'http', $url); + + // Convert Header array to string. + $strHeaders = ''; + if ( is_array( $r['headers'] ) ) + foreach ( $r['headers'] as $name => $value ) + $strHeaders .= "{$name}: $value\r\n"; + else if ( is_string( $r['headers'] ) ) + $strHeaders = $r['headers']; + + $is_local = isset($args['local']) && $args['local']; + $ssl_verify = isset($args['sslverify']) && $args['sslverify']; + if ( $is_local ) + $ssl_verify = apply_filters('https_local_ssl_verify', $ssl_verify); + elseif ( ! $is_local ) + $ssl_verify = apply_filters('https_ssl_verify', $ssl_verify); + + $arrContext = array('http' => + array( + 'method' => strtoupper($r['method']), + 'user_agent' => $r['user-agent'], + 'max_redirects' => $r['redirection'] + 1, // See #11557 + 'protocol_version' => (float) $r['httpversion'], + 'header' => $strHeaders, + 'ignore_errors' => true, // Return non-200 requests. + 'timeout' => $r['timeout'], + 'ssl' => array( + 'verify_peer' => $ssl_verify, + 'verify_host' => $ssl_verify + ) + ) + ); + + $proxy = new WP_HTTP_Proxy(); + + if ( $proxy->is_enabled() && $proxy->send_through_proxy( $url ) ) { + $arrContext['http']['proxy'] = 'tcp://' . $proxy->host() . ':' . $proxy->port(); + $arrContext['http']['request_fulluri'] = true; + + // We only support Basic authentication so this will only work if that is what your proxy supports. + if ( $proxy->use_authentication() ) + $arrContext['http']['header'] .= $proxy->authentication_header() . "\r\n"; + } + + if ( ! empty($r['body'] ) ) + $arrContext['http']['content'] = $r['body']; + + $context = stream_context_create($arrContext); + + if ( !WP_DEBUG ) + $handle = @fopen($url, 'r', false, $context); + else + $handle = fopen($url, 'r', false, $context); + + if ( ! $handle ) + return new WP_Error('http_request_failed', sprintf(__('Could not open handle for fopen() to %s'), $url)); + + $timeout = (int) floor( $r['timeout'] ); + $utimeout = $timeout == $r['timeout'] ? 0 : 1000000 * $r['timeout'] % 1000000; + stream_set_timeout( $handle, $timeout, $utimeout ); + + if ( ! $r['blocking'] ) { + stream_set_blocking($handle, 0); + fclose($handle); + return array( 'headers' => array(), 'body' => '', 'response' => array('code' => false, 'message' => false), 'cookies' => array() ); + } + + 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'] ) ); + + stream_copy_to_stream( $handle, $stream_handle ); + + fclose( $stream_handle ); + $strResponse = ''; + } else { + $strResponse = stream_get_contents( $handle ); + } + + $meta = stream_get_meta_data( $handle ); + + fclose( $handle ); + + $processedHeaders = array(); + if ( isset( $meta['wrapper_data']['headers'] ) ) + $processedHeaders = WP_Http::processHeaders($meta['wrapper_data']['headers']); + else + $processedHeaders = WP_Http::processHeaders($meta['wrapper_data']); + + // Streams does not provide an error code which we can use to see why the request stream stoped. + // We can however test to see if a location header is present and return based on that. + if ( isset($processedHeaders['headers']['location']) && 0 !== $args['_redirection'] ) + return new WP_Error('http_request_failed', __('Too many redirects.')); + + if ( ! empty( $strResponse ) && isset( $processedHeaders['headers']['transfer-encoding'] ) && 'chunked' == $processedHeaders['headers']['transfer-encoding'] ) + $strResponse = WP_Http::chunkTransferDecode($strResponse); + + if ( true === $r['decompress'] && true === WP_Http_Encoding::should_decode($processedHeaders['headers']) ) + $strResponse = WP_Http_Encoding::decompress( $strResponse ); + + return array( 'headers' => $processedHeaders['headers'], 'body' => $strResponse, 'response' => $processedHeaders['response'], 'cookies' => $processedHeaders['cookies'], 'filename' => $r['filename'] ); + } + + /** + * Whether this class can be used for retrieving an URL. + * + * @static + * @access public + * @since 2.7.0 + * + * @return boolean False means this class can not be used, true means it can. + */ + function test( $args = array() ) { + if ( ! function_exists( 'fopen' ) ) + return false; + + if ( ! function_exists( 'ini_get' ) || true != ini_get( 'allow_url_fopen' ) ) + return false; + + $is_ssl = isset( $args['ssl'] ) && $args['ssl']; + + if ( $is_ssl && ! extension_loaded( 'openssl' ) ) + return false; + + return apply_filters( 'use_streams_transport', true, $args ); + } +} + +/** + * HTTP request method uses Curl extension to retrieve the url. + * + * Requires the Curl extension to be installed. + * + * @package WordPress + * @subpackage HTTP + * @since 2.7 + */ +class WP_Http_Curl { + + /** + * Temporary header storage for use with streaming to a file. + * + * @since 3.2.0 + * @access private + * @var string + */ + private $headers = ''; + + /** + * Send a HTTP request to a URI using cURL extension. + * + * @access public + * @since 2.7.0 + * + * @param string $url + * @param str|array $args Optional. Override the defaults. + * @return array 'headers', 'body', 'response', 'cookies' and 'filename' keys. + */ + 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']); + } else if ( 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($args['local']) && $args['local']; + $ssl_verify = isset($args['sslverify']) && $args['sslverify']; + if ( $is_local ) + $ssl_verify = apply_filters('https_local_ssl_verify', $ssl_verify); + elseif ( ! $is_local ) + $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 ulimited 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 ); + curl_setopt( $handle, CURLOPT_USERAGENT, $r['user-agent'] ); + curl_setopt( $handle, CURLOPT_MAXREDIRS, $r['redirection'] ); + + 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; + } + + if ( true === $r['blocking'] ) + curl_setopt( $handle, CURLOPT_HEADERFUNCTION, array( &$this, 'stream_headers' ) ); + + curl_setopt( $handle, CURLOPT_HEADER, false ); + + // If streaming to a file open a file handle, and setup our curl streaming handler + 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'] ) ); + curl_setopt( $handle, CURLOPT_FILE, $stream_handle ); + } + + // The option doesn't work with safe mode or when open_basedir is set. + if ( !ini_get('safe_mode') && !ini_get('open_basedir') && 0 !== $r['_redirection'] ) + curl_setopt( $handle, CURLOPT_FOLLOWLOCATION, true ); + + 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 ); + + // Cookies are not handled by the HTTP API currently. Allow for plugin authors to handle it + // themselves... Although, it is somewhat pointless without some reference. + do_action_ref_array( 'http_api_curl', array(&$handle) ); + + // We don't need to return the body, so don't. Just execute request and return. + if ( ! $r['blocking'] ) { + curl_exec( $handle ); + curl_close( $handle ); + return array( 'headers' => array(), 'body' => '', 'response' => array('code' => false, 'message' => false), 'cookies' => array() ); + } + + $theResponse = curl_exec( $handle ); + $theBody = ''; + $theHeaders = WP_Http::processHeaders( $this->headers ); + + if ( strlen($theResponse) > 0 && ! is_bool( $theResponse ) ) // is_bool: when using $args['stream'], curl_exec will return (bool)true + $theBody = $theResponse; + + // If no response, and It's not a HEAD request with valid headers returned + if ( 0 == strlen($theResponse) && ('HEAD' != $args['method'] || empty($this->headers)) ) { + if ( $curl_error = curl_error($handle) ) + return new WP_Error('http_request_failed', $curl_error); + if ( in_array( curl_getinfo( $handle, CURLINFO_HTTP_CODE ), array(301, 302) ) ) + return new WP_Error('http_request_failed', __('Too many redirects.')); + } + + unset( $this->headers ); + + $response = array(); + $response['code'] = curl_getinfo( $handle, CURLINFO_HTTP_CODE ); + $response['message'] = get_status_header_desc($response['code']); + + curl_close( $handle ); + + if ( $r['stream'] ) + fclose( $stream_handle ); + + // See #11305 - When running under safe mode, redirection is disabled above. Handle it manually. + if ( ! empty( $theHeaders['headers']['location'] ) && ( ini_get( 'safe_mode' ) || ini_get( 'open_basedir' ) ) && 0 !== $r['_redirection'] ) { + if ( $r['redirection']-- > 0 ) { + return $this->request( $theHeaders['headers']['location'], $r ); + } else { + return new WP_Error( 'http_request_failed', __( 'Too many redirects.' ) ); + } + } + + if ( true === $r['decompress'] && true === WP_Http_Encoding::should_decode($theHeaders['headers']) ) + $theBody = WP_Http_Encoding::decompress( $theBody ); + + return array( 'headers' => $theHeaders['headers'], 'body' => $theBody, 'response' => $response, 'cookies' => $theHeaders['cookies'], 'filename' => $r['filename'] ); + } + + /** + * Grab 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 + * @return int + */ + private function stream_headers( $handle, $headers ) { + $this->headers .= $headers; + return strlen( $headers ); + } + + /** + * Whether this class can be used for retrieving an URL. + * + * @static + * @since 2.7.0 + * + * @return boolean False means this class can not be used, true means it can. + */ + 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(); + if ( ! (CURL_VERSION_SSL & $curl_version['features']) ) // Does this cURL version support SSL requests? + return false; + } + + return apply_filters( 'use_curl_transport', true, $args ); + } +} + +/** + * Adds Proxy support to the WordPress HTTP API. + * + * 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: + *
      + *
    1. WP_PROXY_HOST - Enable proxy support and host for connecting.
    2. + *
    3. WP_PROXY_PORT - Proxy port for connection. No default, must be defined.
    4. + *
    5. WP_PROXY_USERNAME - Proxy username, if it requires authentication.
    6. + *
    7. WP_PROXY_PASSWORD - Proxy password, if it requires authentication.
    8. + *
    9. 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 blog 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
    10. + *
    + * + * 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 http://core.trac.wordpress.org/ticket/4011 Proxy support ticket in WordPress. + * @link http://core.trac.wordpress.org/ticket/14636 Allow wildcard domains in WP_PROXY_BYPASS_HOSTS + * @since 2.8 + */ +class WP_HTTP_Proxy { + + /** + * Whether proxy connection should be used. + * + * @since 2.8 + * @use WP_PROXY_HOST + * @use WP_PROXY_PORT + * + * @return bool + */ + function is_enabled() { + return defined('WP_PROXY_HOST') && defined('WP_PROXY_PORT'); + } + + /** + * Whether authentication should be used. + * + * @since 2.8 + * @use WP_PROXY_USERNAME + * @use WP_PROXY_PASSWORD + * + * @return bool + */ + function use_authentication() { + return defined('WP_PROXY_USERNAME') && defined('WP_PROXY_PASSWORD'); + } + + /** + * Retrieve the host for the proxy server. + * + * @since 2.8 + * + * @return string + */ + function host() { + if ( defined('WP_PROXY_HOST') ) + return WP_PROXY_HOST; + + return ''; + } + + /** + * Retrieve the port for the proxy server. + * + * @since 2.8 + * + * @return string + */ + function port() { + if ( defined('WP_PROXY_PORT') ) + return WP_PROXY_PORT; + + return ''; + } + + /** + * Retrieve the username for proxy authentication. + * + * @since 2.8 + * + * @return string + */ + function username() { + if ( defined('WP_PROXY_USERNAME') ) + return WP_PROXY_USERNAME; + + return ''; + } + + /** + * Retrieve the password for proxy authentication. + * + * @since 2.8 + * + * @return string + */ + function password() { + if ( defined('WP_PROXY_PASSWORD') ) + return WP_PROXY_PASSWORD; + + return ''; + } + + /** + * Retrieve authentication string for proxy authentication. + * + * @since 2.8 + * + * @return string + */ + function authentication() { + return $this->username() . ':' . $this->password(); + } + + /** + * Retrieve header string for proxy authentication. + * + * @since 2.8 + * + * @return string + */ + 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 blog 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. + * + * @uses WP_PROXY_BYPASS_HOSTS + * @since 2.8.0 + * + * @param string $uri URI to check. + * @return bool True, to send through the proxy and false if, the proxy should not be used. + */ + 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 blogs, 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') ); + + if ( $check['host'] == 'localhost' || $check['host'] == $home['host'] ) + return false; + + if ( !defined('WP_PROXY_BYPASS_HOSTS') ) + return true; + + static $bypass_hosts; + static $wildcard_regex = false; + 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('\*', '[\w.]+?', 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 ); + } +} +/** + * Internal representation of a single cookie. + * + * 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. + * + * @package WordPress + * @subpackage HTTP + * @since 2.8.0 + */ +class WP_Http_Cookie { + + /** + * Cookie name. + * + * @since 2.8.0 + * @var string + */ + var $name; + + /** + * Cookie value. + * + * @since 2.8.0 + * @var string + */ + var $value; + + /** + * When the cookie expires. + * + * @since 2.8.0 + * @var string + */ + var $expires; + + /** + * Cookie URL path. + * + * @since 2.8.0 + * @var string + */ + var $path; + + /** + * Cookie Domain. + * + * @since 2.8.0 + * @var string + */ + var $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. + * + * If it's an array, it should include the following elements: + *
      + *
    1. Name
    2. + *
    3. Value - should NOT be urlencoded already.
    4. + *
    5. Expires - (optional) String or int (UNIX timestamp).
    6. + *
    7. Path (optional)
    8. + *
    9. Domain (optional)
    10. + *
    + * + * @access public + * @since 2.8.0 + * + * @param string|array $data Raw cookie data. + */ + function __construct( $data ) { + 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 ); + array_shift( $pairs ); //Removes name=value from items. + + // Set everything else as a property + foreach ( $pairs as $pair ) { + $pair = rtrim($pair); + if ( empty($pair) ) //Handles the cookie ending in ; which results in a empty final 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 false; + + // Set properties based directly on parameters + $this->name = $data['name']; + $this->value = isset( $data['value'] ) ? $data['value'] : ''; + $this->path = isset( $data['path'] ) ? $data['path'] : ''; + $this->domain = isset( $data['domain'] ) ? $data['domain'] : ''; + + 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 boolean TRUE if allowed, FALSE otherwise. + */ + function test( $url ) { + // Expires - if expired then nothing else matters + if ( 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'] : 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 : 80; + $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 ( !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. + */ + function getHeaderValue() { + if ( empty( $this->name ) || empty( $this->value ) ) + return ''; + + return $this->name . '=' . urlencode( $this->value ); + } + + /** + * Retrieve cookie header for usage in the rest of the WordPress HTTP API. + * + * @access public + * @since 2.8.0 + * + * @return string + */ + function getFullHeader() { + return 'Cookie: ' . $this->getHeaderValue(); + } +} + +/** + * Implementation for deflate and gzip transfer encodings. + * + * Includes RFC 1950, RFC 1951, and RFC 1952. + * + * @since 2.8 + * @package WordPress + * @subpackage HTTP + */ +class WP_Http_Encoding { + + /** + * Compress raw string using the deflate format. + * + * Supports the RFC 1951 standard. + * + * @since 2.8 + * + * @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|bool False on failure. + */ + 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 + * + * @param string $compressed String to decompress. + * @param int $length The optional length of the compressed data. + * @return string|bool False on failure. + */ + function decompress( $compressed, $length = null ) { + + if ( empty($compressed) ) + return $compressed; + + if ( false !== ( $decompressed = @gzinflate( $compressed ) ) ) + return $decompressed; + + if ( false !== ( $decompressed = WP_Http_Encoding::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 gziniflate() + * function cannot handle out of the box. The following function lifted from + * http://au2.php.net/manual/en/function.gzinflate.php#77336 will attempt to deflate + * the various return forms used. + * + * @since 2.8.1 + * @link http://au2.php.net/manual/en/function.gzinflate.php#77336 + * + * @param string $gzData String to decompress. + * @return string|bool False on failure. + */ + function compatible_gzinflate($gzData) { + 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; + } + return gzinflate( substr($gzData, $i, -8) ); + } else { + return false; + } + } + + /** + * What encoding types to accept and their priority values. + * + * @since 2.8 + * + * @return string Types of encoding to accept. + */ + function accept_encoding() { + $type = array(); + 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'; + + return implode(', ', $type); + } + + /** + * What enconding the content used when it was compressed to send in the headers. + * + * @since 2.8 + * + * @return string Content-Encoding string to send in the header. + */ + function content_encoding() { + return 'deflate'; + } + + /** + * Whether the content be decoded based on the headers. + * + * @since 2.8 + * + * @param array|string $headers All of the available headers. + * @return bool + */ + function should_decode($headers) { + if ( is_array( $headers ) ) { + if ( array_key_exists('content-encoding', $headers) && ! empty( $headers['content-encoding'] ) ) + return true; + } else if ( 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 + * + * @return bool + */ + function is_available() { + return ( function_exists('gzuncompress') || function_exists('gzdeflate') || function_exists('gzinflate') ); + } +} diff --git a/src/wp-includes/class-json.php b/src/wp-includes/class-json.php new file mode 100644 index 0000000..75010df --- /dev/null +++ b/src/wp-includes/class-json.php @@ -0,0 +1,863 @@ + + * @author Matt Knapp + * @author Brett Stimmerman + * @copyright 2005 Michal Migurski + * @version CVS: $Id: JSON.php 288200 2009-09-09 15:41:29Z 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); + +/** + * 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() + */ + function Services_JSON($use = 0) + { + $this->use = $use; + } + + /** + * 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(function_exists('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(function_exists('mb_convert_encoding')) { + return mb_convert_encoding($utf8, 'UTF-16', 'UTF-8'); + } + + switch(strlen($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->_encode($var); + } + /** + * encodes an arbitrary variable into JSON format without JSON Header - warning - may allow CSS!!!!) + * + * @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) + { + return $this->_encode($var); + } + /** + * 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 = strlen($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': + $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 = substr($str, 0, 1); + $chrs = substr($str, 1, -1); + $utf8 = ''; + $strlen_chrs = strlen($chrs); + + for ($c = 0; $c < $strlen_chrs; ++$c) { + + $substr_chrs_c_2 = substr($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', substr($chrs, $c, 6)): + // single, escaped unicode character + $utf16 = chr(hexdec(substr($chrs, ($c + 2), 2))) + . chr(hexdec(substr($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 .= substr($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 .= substr($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 .= substr($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 .= substr($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 .= substr($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 = substr($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 = strlen($chrs); + + for ($c = 0; $c <= $strlen_chrs; ++$c) { + + $top = end($stk); + $substr_chrs_c_2 = substr($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 = substr($chrs, $top['where'], ($c - $top['where'])); + array_push($stk, array('what' => SERVICES_JSON_SLICE, 'where' => ($c + 1), 'delim' => false)); + //print("Found split at {$c}: ".substr($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*:\s*(\S.*),?$/Uis', $slice, $parts)) { + // "name":value pair + $key = $this->decode($parts[1]); + $val = $this->decode($parts[2]); + + if ($this->use & SERVICES_JSON_LOOSE_TYPE) { + $obj[$key] = $val; + } else { + $obj->$key = $val; + } + } elseif (preg_match('/^\s*(\w+)\s*:\s*(\S.*),?$/Uis', $slice, $parts)) { + // name:value pair, where name is unquoted + $key = $parts[1]; + $val = $this->decode($parts[2]); + + 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) && + ((strlen(substr($chrs, 0, $c)) - strlen(rtrim(substr($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}: ".substr($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}: ".substr($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}: ".substr($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}: ".substr($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; + } +} + +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) + { + + } + } + +} +endif; +?> diff --git a/src/wp-includes/class-oembed.php b/src/wp-includes/class-oembed.php new file mode 100644 index 0000000..8bfe258 --- /dev/null +++ b/src/wp-includes/class-oembed.php @@ -0,0 +1,295 @@ +providers = apply_filters( 'oembed_providers', array( + '#http://(www\.)?youtube.com/watch.*#i' => array( 'http://www.youtube.com/oembed', true ), + 'http://youtu.be/*' => array( 'http://www.youtube.com/oembed', false ), + 'http://blip.tv/*' => array( 'http://blip.tv/oembed/', false ), + '#http://(www\.)?vimeo\.com/.*#i' => array( 'http://www.vimeo.com/api/oembed.{format}', true ), + '#http://(www\.)?dailymotion\.com/.*#i' => array( 'http://www.dailymotion.com/api/oembed', true ), + '#http://(www\.)?flickr\.com/.*#i' => array( 'http://www.flickr.com/services/oembed/', true ), + '#http://(.+)?smugmug\.com/.*#i' => array( 'http://api.smugmug.com/services/oembed/', true ), + '#http://(www\.)?hulu\.com/watch/.*#i' => array( 'http://www.hulu.com/api/oembed.{format}', true ), + '#http://(www\.)?viddler\.com/.*#i' => array( 'http://lab.viddler.com/services/oembed/', true ), + 'http://qik.com/*' => array( 'http://qik.com/api/oembed.{format}', false ), + 'http://revision3.com/*' => array( 'http://revision3.com/api/oembed/', false ), + 'http://i*.photobucket.com/albums/*' => array( 'http://photobucket.com/oembed', false ), + 'http://gi*.photobucket.com/groups/*' => array( 'http://photobucket.com/oembed', false ), + '#http://(www\.)?scribd\.com/.*#i' => array( 'http://www.scribd.com/services/oembed', true ), + 'http://wordpress.tv/*' => array( 'http://wordpress.tv/oembed/', false ), + '#http://(answers|surveys)\.polldaddy.com/.*#i' => array( 'http://polldaddy.com/oembed/', true ), + '#http://(www\.)?funnyordie\.com/videos/.*#i' => array( 'http://www.funnyordie.com/oembed', true ), + ) ); + + // 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 ); + } + + /** + * The do-it-all function that takes a URL and attempts to return the HTML. + * + * @see WP_oEmbed::discover() + * @see WP_oEmbed::fetch() + * @see WP_oEmbed::data2html() + * + * @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. + * @return bool|string False on failure, otherwise the UNSANITIZED (and potentially unsafe) HTML that should be used to embed. + */ + function get_html( $url, $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'; + + 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 ); + + if ( !$provider || false === $data = $this->fetch( $provider, $url, $args ) ) + return false; + + return apply_filters( 'oembed_result', $this->data2html( $data, $url ), $url, $args ); + } + + /** + * Attempts to find oEmbed provider discovery tags at the given URL. + * + * @param string $url The URL that should be inspected for discovery tags. + * @return bool|string False on failure, otherwise the oEmbed provider URL. + */ + function discover( $url ) { + $providers = array(); + + // Fetch URL content + if ( $html = wp_remote_retrieve_body( wp_remote_get( $url ) ) ) { + + // types that contain oEmbed provider URLs + $linktypes = apply_filters( 'oembed_linktypes', array( + 'application/json+oembed' => 'json', + 'text/xml+oembed' => 'xml', + 'application/xml+oembed' => 'xml', // Incorrect, but used by at least Vimeo + ) ); + + // Strip + $html = substr( $html, 0, stripos( $html, '' ) ); + + // Do a quick check + $tagfound = false; + foreach ( $linktypes as $linktype => $format ) { + if ( stripos($html, $linktype) ) { + $tagfound = true; + break; + } + } + + if ( $tagfound && preg_match_all( '/]+)>/i', $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']]] = $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. + * + * @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 $args Optional arguments. Usually passed from a shortcode. + * @return bool|object False on failure, otherwise the result in the form of an object. + */ + function fetch( $provider, $url, $args = '' ) { + $args = wp_parse_args( $args, wp_embed_defaults() ); + + $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 ); + + 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 bool|object False on failure, otherwise the result in the form of an object. + */ + function _fetch_with_format( $provider_url_with_args, $format ) { + $provider_url_with_args = add_query_arg( 'format', $format, $provider_url_with_args ); + $response = wp_remote_get( $provider_url_with_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 + */ + function _parse_json( $response_body ) { + return ( ( $data = json_decode( trim( $response_body ) ) ) && is_object( $data ) ) ? $data : false; + } + + /** + * Parses an XML response body. + * + * @since 3.0.0 + * @access private + */ + function _parse_xml( $response_body ) { + if ( function_exists('simplexml_load_string') ) { + $errors = libxml_use_internal_errors( 'true' ); + $data = simplexml_load_string( $response_body ); + libxml_use_internal_errors( $errors ); + if ( is_object( $data ) ) + return $data; + } + return false; + } + + /** + * Converts a data object from {@link WP_oEmbed::fetch()} and returns the HTML. + * + * @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 bool|string False on error, otherwise the HTML needed to embed. + */ + function data2html( $data, $url ) { + if ( !is_object($data) || empty($data->type) ) + return false; + + switch ( $data->type ) { + case 'photo': + if ( empty($data->url) || empty($data->width) || empty($data->height) ) + return false; + + $title = ( !empty($data->title) ) ? $data->title : ''; + $return = '' . esc_attr($title) . ''; + break; + + case 'video': + case 'rich': + $return = ( !empty($data->html) ) ? $data->html : false; + break; + + case 'link': + $return = ( !empty($data->title) ) ? '' . esc_html($data->title) . '' : false; + break; + + default; + $return = false; + } + + // You can use this filter to add support for custom data types or to filter the result + return apply_filters( 'oembed_dataparse', $return, $data, $url ); + } + + /** + * Strip any new lines from the HTML. + * + * @access private + * @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 + */ + function _strip_newlines( $html, $data, $url ) { + if ( false !== strpos( $html, "\n" ) ) + $html = str_replace( array( "\r\n", "\n" ), '', $html ); + + return $html; + } +} + +/** + * Returns the initialized {@link WP_oEmbed} object + * + * @since 2.9.0 + * @access private + * + * @see WP_oEmbed + * @uses WP_oEmbed + * + * @return WP_oEmbed object. + */ +function &_wp_oembed_get_object() { + static $wp_oembed; + + if ( is_null($wp_oembed) ) + $wp_oembed = new WP_oEmbed(); + + return $wp_oembed; +} + +?> \ No newline at end of file diff --git a/src/wp-includes/class-phpass.php b/src/wp-includes/class-phpass.php new file mode 100644 index 0000000..ad474bc --- /dev/null +++ b/src/wp-includes/class-phpass.php @@ -0,0 +1,260 @@ + 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 + */ +class PasswordHash { + var $itoa64; + var $iteration_count_log2; + var $portable_hashes; + var $random_state; + + function PasswordHash($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 compability reasons + } + + 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) + { + $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) + { + $hash = $this->crypt_private($password, $stored_hash); + if ($hash[0] == '*') + $hash = crypt($password, $stored_hash); + + return $hash == $stored_hash; + } +} + +?> diff --git a/src/wp-includes/class-phpmailer.php b/src/wp-includes/class-phpmailer.php new file mode 100644 index 0000000..70de3de --- /dev/null +++ b/src/wp-includes/class-phpmailer.php @@ -0,0 +1,2320 @@ +exceptions = ($exceptions == true); + } + + /** + * Sets message type to HTML. + * @param bool $ishtml + * @return void + */ + public function IsHTML($ishtml = true) { + if ($ishtml) { + $this->ContentType = 'text/html'; + } else { + $this->ContentType = 'text/plain'; + } + } + + /** + * Sets Mailer to send message using SMTP. + * @return void + */ + public function IsSMTP() { + $this->Mailer = 'smtp'; + } + + /** + * Sets Mailer to send message using PHP mail() function. + * @return void + */ + public function IsMail() { + $this->Mailer = 'mail'; + } + + /** + * Sets Mailer to send message using the $Sendmail program. + * @return void + */ + public function IsSendmail() { + if (!stristr(ini_get('sendmail_path'), 'sendmail')) { + $this->Sendmail = '/var/qmail/bin/sendmail'; + } + $this->Mailer = 'sendmail'; + } + + /** + * Sets Mailer to send message using the qmail MTA. + * @return void + */ + public function IsQmail() { + if (stristr(ini_get('sendmail_path'), 'qmail')) { + $this->Sendmail = '/var/qmail/bin/sendmail'; + } + $this->Mailer = 'sendmail'; + } + + ///////////////////////////////////////////////// + // METHODS, RECIPIENTS + ///////////////////////////////////////////////// + + /** + * Adds a "To" address. + * @param string $address + * @param string $name + * @return boolean true on success, false if address already used + */ + public function AddAddress($address, $name = '') { + return $this->AddAnAddress('to', $address, $name); + } + + /** + * Adds a "Cc" address. + * Note: this function works with the SMTP mailer on win32, not with the "mail" mailer. + * @param string $address + * @param string $name + * @return boolean true on success, false if address already used + */ + public function AddCC($address, $name = '') { + return $this->AddAnAddress('cc', $address, $name); + } + + /** + * Adds a "Bcc" address. + * Note: this function works with the SMTP mailer on win32, not with the "mail" mailer. + * @param string $address + * @param string $name + * @return boolean true on success, false if address already used + */ + public function AddBCC($address, $name = '') { + return $this->AddAnAddress('bcc', $address, $name); + } + + /** + * Adds a "Reply-to" address. + * @param string $address + * @param string $name + * @return boolean + */ + public function AddReplyTo($address, $name = '') { + return $this->AddAnAddress('ReplyTo', $address, $name); + } + + /** + * Adds an address to one of the recipient arrays + * Addresses that have been added already return false, but do not throw exceptions + * @param string $kind One of 'to', 'cc', 'bcc', 'ReplyTo' + * @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 + * @access private + */ + private function AddAnAddress($kind, $address, $name = '') { + if (!preg_match('/^(to|cc|bcc|ReplyTo)$/', $kind)) { + echo 'Invalid recipient array: ' . $kind; + return false; + } + $address = trim($address); + $name = trim(preg_replace('/[\r\n]+/', '', $name)); //Strip breaks and trim + if (!self::ValidateAddress($address)) { + $this->SetError($this->Lang('invalid_address').': '. $address); + if ($this->exceptions) { + throw new phpmailerException($this->Lang('invalid_address').': '.$address); + } + echo $this->Lang('invalid_address').': '.$address; + return false; + } + if ($kind != 'ReplyTo') { + if (!isset($this->all_recipients[strtolower($address)])) { + 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; +} + +/** + * Set the From and FromName properties + * @param string $address + * @param string $name + * @return boolean + */ + public function SetFrom($address, $name = '',$auto=1) { + $address = trim($address); + $name = trim(preg_replace('/[\r\n]+/', '', $name)); //Strip breaks and trim + if (!self::ValidateAddress($address)) { + $this->SetError($this->Lang('invalid_address').': '. $address); + if ($this->exceptions) { + throw new phpmailerException($this->Lang('invalid_address').': '.$address); + } + echo $this->Lang('invalid_address').': '.$address; + return false; + } + $this->From = $address; + $this->FromName = $name; + if ($auto) { + if (empty($this->ReplyTo)) { + $this->AddAnAddress('ReplyTo', $address, $name); + } + if (empty($this->Sender)) { + $this->Sender = $address; + } + } + return true; + } + + /** + * Check that a string looks roughly like an email address should + * Static so it can be used without instantiation + * Tries to use PHP built-in validator in the filter extension (from PHP 5.2), falls back to a reasonably competent regex validator + * Conforms approximately to RFC2822 + * @link http://www.hexillion.com/samples/#Regex Original pattern found here + * @param string $address The email address to check + * @return boolean + * @static + * @access public + */ + public static function ValidateAddress($address) { + if (function_exists('filter_var')) { //Introduced in PHP 5.2 + if(filter_var($address, FILTER_VALIDATE_EMAIL) === FALSE) { + return false; + } else { + return true; + } + } else { + return preg_match('/^(?:[\w\!\#\$\%\&\'\*\+\-\/\=\?\^\`\{\|\}\~]+\.)*[\w\!\#\$\%\&\'\*\+\-\/\=\?\^\`\{\|\}\~]+@(?:(?:(?:[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_]?)|(?:\[(?:(?:[01]?\d{1,2}|2[0-4]\d|25[0-5])\.){3}(?:[01]?\d{1,2}|2[0-4]\d|25[0-5])\]))$/', $address); + } + } + + ///////////////////////////////////////////////// + // METHODS, MAIL SENDING + ///////////////////////////////////////////////// + + /** + * Creates message and assigns Mailer. If the message is + * not sent successfully then it returns false. Use the ErrorInfo + * variable to view description of the error. + * @return bool + */ + public function Send() { + try { + if ((count($this->to) + count($this->cc) + count($this->bcc)) < 1) { + throw new phpmailerException($this->Lang('provide_address'), self::STOP_CRITICAL); + } + + // Set whether the message is multipart/alternative + if(!empty($this->AltBody)) { + $this->ContentType = 'multipart/alternative'; + } + + $this->error_count = 0; // reset errors + $this->SetMessageType(); + $header = $this->CreateHeader(); + $body = $this->CreateBody(); + + if (empty($this->Body)) { + throw new phpmailerException($this->Lang('empty_message'), self::STOP_CRITICAL); + } + + // digitally sign with DKIM if enabled + if ($this->DKIM_domain && $this->DKIM_private) { + $header_dkim = $this->DKIM_Add($header,$this->Subject,$body); + $header = str_replace("\r\n","\n",$header_dkim) . $header; + } + + // Choose the mailer and send through it + switch($this->Mailer) { + case 'sendmail': + return $this->SendmailSend($header, $body); + case 'smtp': + return $this->SmtpSend($header, $body); + default: + return $this->MailSend($header, $body); + } + + } catch (phpmailerException $e) { + $this->SetError($e->getMessage()); + if ($this->exceptions) { + throw $e; + } + echo $e->getMessage()."\n"; + return false; + } + } + + /** + * Sends mail using the $Sendmail program. + * @param string $header The message headers + * @param string $body The message body + * @access protected + * @return bool + */ + protected function SendmailSend($header, $body) { + if ($this->Sender != '') { + $sendmail = sprintf("%s -oi -f %s -t", escapeshellcmd($this->Sendmail), escapeshellarg($this->Sender)); + } else { + $sendmail = sprintf("%s -oi -t", escapeshellcmd($this->Sendmail)); + } + if ($this->SingleTo === true) { + foreach ($this->SingleToArray as $key => $val) { + if(!@$mail = popen($sendmail, 'w')) { + throw new phpmailerException($this->Lang('execute') . $this->Sendmail, self::STOP_CRITICAL); + } + fputs($mail, "To: " . $val . "\n"); + fputs($mail, $header); + fputs($mail, $body); + $result = pclose($mail); + // implement call back function if it exists + $isSent = ($result == 0) ? 1 : 0; + $this->doCallback($isSent,$val,$this->cc,$this->bcc,$this->Subject,$body); + 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); + // implement call back function if it exists + $isSent = ($result == 0) ? 1 : 0; + $this->doCallback($isSent,$this->to,$this->cc,$this->bcc,$this->Subject,$body); + if($result != 0) { + throw new phpmailerException($this->Lang('execute') . $this->Sendmail, self::STOP_CRITICAL); + } + } + return true; + } + + /** + * Sends mail using the PHP mail() function. + * @param string $header The message headers + * @param string $body The message body + * @access protected + * @return bool + */ + protected function MailSend($header, $body) { + $toArr = array(); + foreach($this->to as $t) { + $toArr[] = $this->AddrFormat($t); + } + $to = implode(', ', $toArr); + + $params = sprintf("-oi -f %s", $this->Sender); + if ($this->Sender != '' && strlen(ini_get('safe_mode'))< 1) { + $old_from = ini_get('sendmail_from'); + ini_set('sendmail_from', $this->Sender); + if ($this->SingleTo === true && count($toArr) > 1) { + foreach ($toArr as $key => $val) { + $rt = @mail($val, $this->EncodeHeader($this->SecureHeader($this->Subject)), $body, $header, $params); + // implement call back function if it exists + $isSent = ($rt == 1) ? 1 : 0; + $this->doCallback($isSent,$val,$this->cc,$this->bcc,$this->Subject,$body); + } + } else { + $rt = @mail($to, $this->EncodeHeader($this->SecureHeader($this->Subject)), $body, $header, $params); + // implement call back function if it exists + $isSent = ($rt == 1) ? 1 : 0; + $this->doCallback($isSent,$to,$this->cc,$this->bcc,$this->Subject,$body); + } + } else { + if ($this->SingleTo === true && count($toArr) > 1) { + foreach ($toArr as $key => $val) { + $rt = @mail($val, $this->EncodeHeader($this->SecureHeader($this->Subject)), $body, $header, $params); + // implement call back function if it exists + $isSent = ($rt == 1) ? 1 : 0; + $this->doCallback($isSent,$val,$this->cc,$this->bcc,$this->Subject,$body); + } + } else { + $rt = @mail($to, $this->EncodeHeader($this->SecureHeader($this->Subject)), $body, $header); + // implement call back function if it exists + $isSent = ($rt == 1) ? 1 : 0; + $this->doCallback($isSent,$to,$this->cc,$this->bcc,$this->Subject,$body); + } + } + if (isset($old_from)) { + ini_set('sendmail_from', $old_from); + } + if(!$rt) { + throw new phpmailerException($this->Lang('instantiate'), self::STOP_CRITICAL); + } + return true; + } + + /** + * Sends mail via SMTP using PhpSMTP + * Returns false if there is a bad MAIL FROM, RCPT, or DATA input. + * @param string $header The message headers + * @param string $body The message body + * @uses SMTP + * @access protected + * @return bool + */ + protected function SmtpSend($header, $body) { + require_once $this->PluginDir . 'class-smtp.php'; + $bad_rcpt = array(); + + if(!$this->SmtpConnect()) { + throw new phpmailerException($this->Lang('smtp_connect_failed'), self::STOP_CRITICAL); + } + $smtp_from = ($this->Sender == '') ? $this->From : $this->Sender; + if(!$this->smtp->Mail($smtp_from)) { + throw new phpmailerException($this->Lang('from_failed') . $smtp_from, self::STOP_CRITICAL); + } + + // Attempt to send attach all recipients + foreach($this->to as $to) { + if (!$this->smtp->Recipient($to[0])) { + $bad_rcpt[] = $to[0]; + // implement call back function if it exists + $isSent = 0; + $this->doCallback($isSent,$to[0],'','',$this->Subject,$body); + } else { + // implement call back function if it exists + $isSent = 1; + $this->doCallback($isSent,$to[0],'','',$this->Subject,$body); + } + } + foreach($this->cc as $cc) { + if (!$this->smtp->Recipient($cc[0])) { + $bad_rcpt[] = $cc[0]; + // implement call back function if it exists + $isSent = 0; + $this->doCallback($isSent,'',$cc[0],'',$this->Subject,$body); + } else { + // implement call back function if it exists + $isSent = 1; + $this->doCallback($isSent,'',$cc[0],'',$this->Subject,$body); + } + } + foreach($this->bcc as $bcc) { + if (!$this->smtp->Recipient($bcc[0])) { + $bad_rcpt[] = $bcc[0]; + // implement call back function if it exists + $isSent = 0; + $this->doCallback($isSent,'','',$bcc[0],$this->Subject,$body); + } else { + // implement call back function if it exists + $isSent = 1; + $this->doCallback($isSent,'','',$bcc[0],$this->Subject,$body); + } + } + + + if (count($bad_rcpt) > 0 ) { //Create error message for any bad addresses + $badaddresses = implode(', ', $bad_rcpt); + throw new phpmailerException($this->Lang('recipients_failed') . $badaddresses); + } + if(!$this->smtp->Data($header . $body)) { + throw new phpmailerException($this->Lang('data_not_accepted'), self::STOP_CRITICAL); + } + if($this->SMTPKeepAlive == true) { + $this->smtp->Reset(); + } + return true; + } + + /** + * Initiates a connection to an SMTP server. + * Returns false if the operation failed. + * @uses SMTP + * @access public + * @return bool + */ + public function SmtpConnect() { + if(is_null($this->smtp)) { + $this->smtp = new SMTP(); + } + + $this->smtp->do_debug = $this->SMTPDebug; + $hosts = explode(';', $this->Host); + $index = 0; + $connection = $this->smtp->Connected(); + + // Retry while there is no connection + try { + while($index < count($hosts) && !$connection) { + $hostinfo = array(); + if (preg_match('/^(.+):([0-9]+)$/', $hosts[$index], $hostinfo)) { + $host = $hostinfo[1]; + $port = $hostinfo[2]; + } else { + $host = $hosts[$index]; + $port = $this->Port; + } + + $tls = ($this->SMTPSecure == 'tls'); + $ssl = ($this->SMTPSecure == 'ssl'); + + if ($this->smtp->Connect(($ssl ? 'ssl://':'').$host, $port, $this->Timeout)) { + + $hello = ($this->Helo != '' ? $this->Helo : $this->ServerHostname()); + $this->smtp->Hello($hello); + + if ($tls) { + if (!$this->smtp->StartTLS()) { + throw new phpmailerException($this->Lang('tls')); + } + + //We must resend HELO after tls negotiation + $this->smtp->Hello($hello); + } + + $connection = true; + if ($this->SMTPAuth) { + if (!$this->smtp->Authenticate($this->Username, $this->Password)) { + throw new phpmailerException($this->Lang('authenticate')); + } + } + } + $index++; + if (!$connection) { + throw new phpmailerException($this->Lang('connect_host')); + } + } + } catch (phpmailerException $e) { + $this->smtp->Reset(); + throw $e; + } + return true; + } + + /** + * Closes the active SMTP session if one exists. + * @return void + */ + public function SmtpClose() { + if(!is_null($this->smtp)) { + if($this->smtp->Connected()) { + $this->smtp->Quit(); + $this->smtp->Close(); + } + } + } + + /** + * Sets the language for all class 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. Portuguese: "br") + * @param string $lang_path Path to the language file directory + * @access public + */ + function SetLanguage($langcode = 'en', $lang_path = 'language/') { + //Define full set of translatable strings + $PHPMAILER_LANG = array( + 'provide_address' => 'You must provide at least one recipient email address.', + 'mailer_not_supported' => ' mailer is not supported.', + 'execute' => 'Could not execute: ', + 'instantiate' => 'Could not instantiate mail function.', + 'authenticate' => 'SMTP Error: Could not authenticate.', + 'from_failed' => 'The following From address failed: ', + 'recipients_failed' => 'SMTP Error: The following recipients failed: ', + 'data_not_accepted' => 'SMTP Error: Data not accepted.', + 'connect_host' => 'SMTP Error: Could not connect to SMTP host.', + 'file_access' => 'Could not access file: ', + 'file_open' => 'File Error: Could not open file: ', + 'encoding' => 'Unknown encoding: ', + 'signing' => 'Signing Error: ', + 'smtp_error' => 'SMTP server error: ', + 'empty_message' => 'Message body empty', + 'invalid_address' => 'Invalid address', + 'variable_set' => 'Cannot set or reset variable: ' + ); + //Overwrite language-specific strings. This way we'll never have missing translations - no more "language string failed to load"! + $l = true; + if ($langcode != 'en') { //There is no English translation file + $l = @include $lang_path.'phpmailer.lang-'.$langcode.'.php'; + } + $this->language = $PHPMAILER_LANG; + return ($l == true); //Returns false if language not found + } + + /** + * Return the current array of language strings + * @return array + */ + public function GetTranslations() { + return $this->language; + } + + ///////////////////////////////////////////////// + // METHODS, MESSAGE CREATION + ///////////////////////////////////////////////// + + /** + * Creates recipient headers. + * @access public + * @return string + */ + public function AddrAppend($type, $addr) { + $addr_str = $type . ': '; + $addresses = array(); + foreach ($addr as $a) { + $addresses[] = $this->AddrFormat($a); + } + $addr_str .= implode(', ', $addresses); + $addr_str .= $this->LE; + + return $addr_str; + } + + /** + * Formats an address correctly. + * @access public + * @return string + */ + public function AddrFormat($addr) { + if (empty($addr[1])) { + return $this->SecureHeader($addr[0]); + } else { + return $this->EncodeHeader($this->SecureHeader($addr[1]), 'phrase') . " <" . $this->SecureHeader($addr[0]) . ">"; + } + } + + /** + * Wraps message for use with mailers that do not + * automatically perform wrapping and for quoted-printable. + * 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) { + $soft_break = ($qp_mode) ? sprintf(" =%s", $this->LE) : $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"); + + $message = $this->FixEOL($message); + if (substr($message, -1) == $this->LE) { + $message = substr($message, 0, -1); + } + + $line = explode($this->LE, $message); + $message = ''; + for ($i=0 ;$i < count($line); $i++) { + $line_part = explode(' ', $line[$i]); + $buf = ''; + for ($e = 0; $e $length)) { + $space_left = $length - strlen($buf) - 1; + if ($e != 0) { + 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", $this->LE); + } else { + $message .= $buf . $soft_break; + } + $buf = ''; + } + while (strlen($word) > 0) { + $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", $this->LE); + } else { + $buf = $part; + } + } + } else { + $buf_o = $buf; + $buf .= ($e == 0) ? $word : (' ' . $word); + + if (strlen($buf) > $length and $buf_o != '') { + $message .= $buf_o . $soft_break; + $buf = $word; + } + } + } + $message .= $buf . $this->LE; + } + + return $message; + } + + /** + * Finds 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 int $maxLength find last character boundary prior to this length + * @return int + */ + public function UTF8CharBoundary($encodedText, $maxLength) { + $foundSplitPos = false; + $lookBack = 3; + while (!$foundSplitPos) { + $lastChunk = substr($encodedText, $maxLength - $lookBack, $lookBack); + $encodedCharPos = strpos($lastChunk, "="); + if ($encodedCharPos !== false) { + // 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 + $maxLength = ($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; + } + + + /** + * Set the body wrapping. + * @access public + * @return void + */ + public function SetWordWrap() { + if($this->WordWrap < 1) { + return; + } + + switch($this->message_type) { + case 'alt': + case 'alt_attachments': + $this->AltBody = $this->WrapText($this->AltBody, $this->WordWrap); + break; + default: + $this->Body = $this->WrapText($this->Body, $this->WordWrap); + break; + } + } + + /** + * Assembles message header. + * @access public + * @return string The assembled header + */ + public function CreateHeader() { + $result = ''; + + // Set the boundaries + $uniq_id = md5(uniqid(time())); + $this->boundary[1] = 'b1_' . $uniq_id; + $this->boundary[2] = 'b2_' . $uniq_id; + + $result .= $this->HeaderLine('Date', self::RFCDate()); + if($this->Sender == '') { + $result .= $this->HeaderLine('Return-Path', trim($this->From)); + } else { + $result .= $this->HeaderLine('Return-Path', trim($this->Sender)); + } + + // To be created automatically by mail() + if($this->Mailer != 'mail') { + if ($this->SingleTo === true) { + foreach($this->to as $t) { + $this->SingleToArray[] = $this->AddrFormat($t); + } + } else { + if(count($this->to) > 0) { + $result .= $this->AddrAppend('To', $this->to); + } elseif (count($this->cc) == 0) { + $result .= $this->HeaderLine('To', 'undisclosed-recipients:;'); + } + } + } + + $from = array(); + $from[0][0] = trim($this->From); + $from[0][1] = $this->FromName; + $result .= $this->AddrAppend('From', $from); + + // 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') || ($this->Mailer == 'mail')) && (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))); + } + + if($this->MessageID != '') { + $result .= $this->HeaderLine('Message-ID',$this->MessageID); + } else { + $result .= sprintf("Message-ID: <%s@%s>%s", $uniq_id, $this->ServerHostname(), $this->LE); + } + $result .= $this->HeaderLine('X-Priority', $this->Priority); + $result .= $this->HeaderLine('X-Mailer', 'PHPMailer '.$this->Version.' (phpmailer.sourceforge.net)'); + + if($this->ConfirmReadingTo != '') { + $result .= $this->HeaderLine('Disposition-Notification-To', '<' . trim($this->ConfirmReadingTo) . '>'); + } + + // Add custom headers + for($index = 0; $index < count($this->CustomHeader); $index++) { + $result .= $this->HeaderLine(trim($this->CustomHeader[$index][0]), $this->EncodeHeader(trim($this->CustomHeader[$index][1]))); + } + if (!$this->sign_key_file) { + $result .= $this->HeaderLine('MIME-Version', '1.0'); + $result .= $this->GetMailMIME(); + } + + return $result; + } + + /** + * Returns the message MIME. + * @access public + * @return string + */ + public function GetMailMIME() { + $result = ''; + switch($this->message_type) { + case 'plain': + $result .= $this->HeaderLine('Content-Transfer-Encoding', $this->Encoding); + $result .= sprintf("Content-Type: %s; charset=\"%s\"", $this->ContentType, $this->CharSet); + break; + case 'attachments': + case 'alt_attachments': + if($this->InlineImageExists()){ + $result .= sprintf("Content-Type: %s;%s\ttype=\"text/html\";%s\tboundary=\"%s\"%s", 'multipart/related', $this->LE, $this->LE, $this->boundary[1], $this->LE); + } else { + $result .= $this->HeaderLine('Content-Type', 'multipart/mixed;'); + $result .= $this->TextLine("\tboundary=\"" . $this->boundary[1] . '"'); + } + break; + case 'alt': + $result .= $this->HeaderLine('Content-Type', 'multipart/alternative;'); + $result .= $this->TextLine("\tboundary=\"" . $this->boundary[1] . '"'); + break; + } + + if($this->Mailer != 'mail') { + $result .= $this->LE.$this->LE; + } + + return $result; + } + + /** + * Assembles the message body. Returns an empty string on failure. + * @access public + * @return string The assembled message body + */ + public function CreateBody() { + $body = ''; + + if ($this->sign_key_file) { + $body .= $this->GetMailMIME(); + } + + $this->SetWordWrap(); + + switch($this->message_type) { + case 'alt': + $body .= $this->GetBoundary($this->boundary[1], '', 'text/plain', ''); + $body .= $this->EncodeString($this->AltBody, $this->Encoding); + $body .= $this->LE.$this->LE; + $body .= $this->GetBoundary($this->boundary[1], '', 'text/html', ''); + $body .= $this->EncodeString($this->Body, $this->Encoding); + $body .= $this->LE.$this->LE; + $body .= $this->EndBoundary($this->boundary[1]); + break; + case 'plain': + $body .= $this->EncodeString($this->Body, $this->Encoding); + break; + case 'attachments': + $body .= $this->GetBoundary($this->boundary[1], '', '', ''); + $body .= $this->EncodeString($this->Body, $this->Encoding); + $body .= $this->LE; + $body .= $this->AttachAll(); + break; + case 'alt_attachments': + $body .= sprintf("--%s%s", $this->boundary[1], $this->LE); + $body .= sprintf("Content-Type: %s;%s" . "\tboundary=\"%s\"%s", 'multipart/alternative', $this->LE, $this->boundary[2], $this->LE.$this->LE); + $body .= $this->GetBoundary($this->boundary[2], '', 'text/plain', '') . $this->LE; // Create text body + $body .= $this->EncodeString($this->AltBody, $this->Encoding); + $body .= $this->LE.$this->LE; + $body .= $this->GetBoundary($this->boundary[2], '', 'text/html', '') . $this->LE; // Create the HTML body + $body .= $this->EncodeString($this->Body, $this->Encoding); + $body .= $this->LE.$this->LE; + $body .= $this->EndBoundary($this->boundary[2]); + $body .= $this->AttachAll(); + break; + } + + if ($this->IsError()) { + $body = ''; + } elseif ($this->sign_key_file) { + try { + $file = tempnam('', 'mail'); + file_put_contents($file, $body); //TODO check this worked + $signed = tempnam("", "signed"); + if (@openssl_pkcs7_sign($file, $signed, "file://".$this->sign_cert_file, array("file://".$this->sign_key_file, $this->sign_key_pass), NULL)) { + @unlink($file); + @unlink($signed); + $body = file_get_contents($signed); + } else { + @unlink($file); + @unlink($signed); + throw new phpmailerException($this->Lang("signing").openssl_error_string()); + } + } catch (phpmailerException $e) { + $body = ''; + if ($this->exceptions) { + throw $e; + } + } + } + + return $body; + } + + /** + * Returns the start of a message boundary. + * @access private + */ + private 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; + $result .= $this->HeaderLine('Content-Transfer-Encoding', $encoding); + $result .= $this->LE; + + return $result; + } + + /** + * Returns the end of a message boundary. + * @access private + */ + private function EndBoundary($boundary) { + return $this->LE . '--' . $boundary . '--' . $this->LE; + } + + /** + * Sets the message type. + * @access private + * @return void + */ + private function SetMessageType() { + if(count($this->attachment) < 1 && strlen($this->AltBody) < 1) { + $this->message_type = 'plain'; + } else { + if(count($this->attachment) > 0) { + $this->message_type = 'attachments'; + } + if(strlen($this->AltBody) > 0 && count($this->attachment) < 1) { + $this->message_type = 'alt'; + } + if(strlen($this->AltBody) > 0 && count($this->attachment) > 0) { + $this->message_type = 'alt_attachments'; + } + } + } + + /** + * Returns a formatted header line. + * @access public + * @return string + */ + public function HeaderLine($name, $value) { + return $name . ': ' . $value . $this->LE; + } + + /** + * Returns a formatted mail line. + * @access public + * @return string + */ + public function TextLine($value) { + return $value . $this->LE; + } + + ///////////////////////////////////////////////// + // CLASS METHODS, ATTACHMENTS + ///////////////////////////////////////////////// + + /** + * Adds an attachment from a path on the filesystem. + * Returns false if the file could not be found + * or accessed. + * @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. + * @return bool + */ + public function AddAttachment($path, $name = '', $encoding = 'base64', $type = 'application/octet-stream') { + try { + if ( !@is_file($path) ) { + throw new phpmailerException($this->Lang('file_access') . $path, self::STOP_CONTINUE); + } + $filename = basename($path); + if ( $name == '' ) { + $name = $filename; + } + + $this->attachment[] = array( + 0 => $path, + 1 => $filename, + 2 => $name, + 3 => $encoding, + 4 => $type, + 5 => false, // isStringAttachment + 6 => 'attachment', + 7 => 0 + ); + + } catch (phpmailerException $e) { + $this->SetError($e->getMessage()); + if ($this->exceptions) { + throw $e; + } + echo $e->getMessage()."\n"; + if ( $e->getCode() == self::STOP_CRITICAL ) { + return false; + } + } + return true; + } + + /** + * Return the current array of attachments + * @return array + */ + public function GetAttachments() { + return $this->attachment; + } + + /** + * Attaches all fs, string, and binary attachments to the message. + * Returns an empty string on failure. + * @access private + * @return string + */ + private function AttachAll() { + // Return text of body + $mime = array(); + $cidUniq = array(); + $incl = array(); + + // Add all attachments + foreach ($this->attachment as $attachment) { + // Check for string attachment + $bString = $attachment[5]; + if ($bString) { + $string = $attachment[0]; + } else { + $path = $attachment[0]; + } + + if (in_array($attachment[0], $incl)) { continue; } + $filename = $attachment[1]; + $name = $attachment[2]; + $encoding = $attachment[3]; + $type = $attachment[4]; + $disposition = $attachment[6]; + $cid = $attachment[7]; + $incl[] = $attachment[0]; + if ( $disposition == 'inline' && isset($cidUniq[$cid]) ) { continue; } + $cidUniq[$cid] = true; + + $mime[] = sprintf("--%s%s", $this->boundary[1], $this->LE); + $mime[] = sprintf("Content-Type: %s; name=\"%s\"%s", $type, $this->EncodeHeader($this->SecureHeader($name)), $this->LE); + $mime[] = sprintf("Content-Transfer-Encoding: %s%s", $encoding, $this->LE); + + if($disposition == 'inline') { + $mime[] = sprintf("Content-ID: <%s>%s", $cid, $this->LE); + } + + $mime[] = sprintf("Content-Disposition: %s; filename=\"%s\"%s", $disposition, $this->EncodeHeader($this->SecureHeader($name)), $this->LE.$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", $this->boundary[1], $this->LE); + + return join('', $mime); + } + + /** + * Encodes 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' + * @see EncodeFile() + * @access private + * @return string + */ + private function EncodeFile($path, $encoding = 'base64') { + try { + if (!is_readable($path)) { + throw new phpmailerException($this->Lang('file_open') . $path, self::STOP_CONTINUE); + } + if (function_exists('get_magic_quotes')) { + function get_magic_quotes() { + return false; + } + } + if (PHP_VERSION < 6) { + $magic_quotes = get_magic_quotes_runtime(); + set_magic_quotes_runtime(0); + } + $file_buffer = file_get_contents($path); + $file_buffer = $this->EncodeString($file_buffer, $encoding); + if (PHP_VERSION < 6) { set_magic_quotes_runtime($magic_quotes); } + return $file_buffer; + } catch (Exception $e) { + $this->SetError($e->getMessage()); + return ''; + } + } + + /** + * Encodes string to 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 to best (shortest) of Q, B, quoted or none. + * @access public + * @return string + */ + public function EncodeHeader($str, $position = 'text') { + $x = 0; + + switch (strtolower($position)) { + case 'phrase': + if (!preg_match('/[\200-\377]/', $str)) { + // Can't use addslashes as we don't know what value has magic_quotes_sybase + $encoded = addcslashes($str, "\0..\37\177\\\""); + if (($str == $encoded) && !preg_match('/[^A-Za-z0-9!#$%&\'*+\/=?^_`{|}~ -]/', $str)) { + return ($encoded); + } else { + return ("\"$encoded\""); + } + } + $x = preg_match_all('/[^\040\041\043-\133\135-\176]/', $str, $matches); + break; + case 'comment': + $x = preg_match_all('/[()"]/', $str, $matches); + // Fall-through + case 'text': + default: + $x += preg_match_all('/[\000-\010\013\014\016-\037\177-\377]/', $str, $matches); + break; + } + + if ($x == 0) { + return ($str); + } + + $maxlen = 75 - 7 - strlen($this->CharSet); + // Try to select the encoding which should produce the shortest output + if (strlen($str)/3 < $x) { + $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); + } 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('='.$this->LE, "\n", trim($encoded)); + } + + $encoded = preg_replace('/^(.*)$/m', " =?".$this->CharSet."?$encoding?\\1?=", $encoded); + $encoded = trim(str_replace("\n", $this->LE, $encoded)); + + return $encoded; + } + + /** + * Checks if a string contains multibyte characters. + * @access public + * @param string $str multi-byte text to wrap encode + * @return bool + */ + 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; + } + } + + /** + * Correctly encodes and wraps long multibyte strings for mail headers + * without breaking lines within a character. + * Adapted from a function by paravoid at http://uk.php.net/manual/en/function.mb-encode-mimeheader.php + * @access public + * @param string $str multi-byte text to wrap encode + * @return string + */ + public function Base64EncodeWrapMB($str) { + $start = "=?".$this->CharSet."?B?"; + $end = "?="; + $encoded = ""; + + $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 + $offset = $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 . $this->LE; + } + + // Chomp the last linefeed + $encoded = substr($encoded, 0, -strlen($this->LE)); + return $encoded; + } + + /** + * Encode string to quoted-printable. + * Only uses standard PHP, slow, but will always work + * @access public + * @param string $string the text to encode + * @param integer $line_max Number of chars allowed on a line before wrapping + * @return string + */ + public function EncodeQPphp( $input = '', $line_max = 76, $space_conv = false) { + $hex = array('0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'); + $lines = preg_split('/(?:\r\n|\r|\n)/', $input); + $eol = "\r\n"; + $escape = '='; + $output = ''; + while( list(, $line) = each($lines) ) { + $linlen = strlen($line); + $newline = ''; + for($i = 0; $i < $linlen; $i++) { + $c = substr( $line, $i, 1 ); + $dec = ord( $c ); + if ( ( $i == 0 ) && ( $dec == 46 ) ) { // convert first point in the line into =2E + $c = '=2E'; + } + if ( $dec == 32 ) { + if ( $i == ( $linlen - 1 ) ) { // convert space at eol only + $c = '=20'; + } else if ( $space_conv ) { + $c = '=20'; + } + } elseif ( ($dec == 61) || ($dec < 32 ) || ($dec > 126) ) { // always encode "\t", which is *not* required + $h2 = floor($dec/16); + $h1 = floor($dec%16); + $c = $escape.$hex[$h2].$hex[$h1]; + } + if ( (strlen($newline) + strlen($c)) >= $line_max ) { // CRLF is not counted + $output .= $newline.$escape.$eol; // soft line break; " =\r\n" is okay + $newline = ''; + // check if newline first character will be point or not + if ( $dec == 46 ) { + $c = '=2E'; + } + } + $newline .= $c; + } // end of for + $output .= $newline.$eol; + } // end of while + return $output; + } + + /** + * Encode string to RFC2045 (6.7) quoted-printable format + * Uses a PHP5 stream filter to do the encoding about 64x faster than the old version + * Also results in same content as you started with after decoding + * @see EncodeQPphp() + * @access public + * @param string $string the text to encode + * @param integer $line_max Number of chars allowed on a line before wrapping + * @param boolean $space_conv Dummy param for compatibility with existing EncodeQP function + * @return string + * @author Marcus Bointon + */ + public function EncodeQP($string, $line_max = 76, $space_conv = false) { + if (function_exists('quoted_printable_encode')) { //Use native function if it's available (>= PHP5.3) + return quoted_printable_encode($string); + } + $filters = stream_get_filters(); + if (!in_array('convert.*', $filters)) { //Got convert stream filter? + return $this->EncodeQPphp($string, $line_max, $space_conv); //Fall back to old implementation + } + $fp = fopen('php://temp/', 'r+'); + $string = preg_replace('/\r\n?/', $this->LE, $string); //Normalise line breaks + $params = array('line-length' => $line_max, 'line-break-chars' => $this->LE); + $s = stream_filter_append($fp, 'convert.quoted-printable-encode', STREAM_FILTER_READ, $params); + fputs($fp, $string); + rewind($fp); + $out = stream_get_contents($fp); + stream_filter_remove($s); + $out = preg_replace('/^\./m', '=2E', $out); //Encode . if it is first char on a line, workaround for bug in Exchange + fclose($fp); + return $out; + } + + /** + * Encode string to 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 + $encoded = preg_replace('/[\r\n]*/', '', $str); + + switch (strtolower($position)) { + case 'phrase': + $encoded = preg_replace("/([^A-Za-z0-9!*+\/ -])/e", "'='.sprintf('%02X', ord('\\1'))", $encoded); + break; + case 'comment': + $encoded = preg_replace("/([\(\)\"])/e", "'='.sprintf('%02X', ord('\\1'))", $encoded); + case 'text': + default: + // Replace every high ascii, control =, ? and _ characters + //TODO using /e (equivalent to eval()) is probably not a good idea + $encoded = preg_replace('/([\000-\011\013\014\016-\037\075\077\137\177-\377])/e', + "'='.sprintf('%02X', ord('\\1'))", $encoded); + break; + } + + // Replace every spaces to _ (more readable than =20) + $encoded = str_replace(' ', '_', $encoded); + + return $encoded; + } + + /** + * Adds a string or binary attachment (non-filesystem) to the list. + * 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. + * @return void + */ + public function AddStringAttachment($string, $filename, $encoding = 'base64', $type = 'application/octet-stream') { + // Append to $attachment array + $this->attachment[] = array( + 0 => $string, + 1 => $filename, + 2 => basename($filename), + 3 => $encoding, + 4 => $type, + 5 => true, // isStringAttachment + 6 => 'attachment', + 7 => 0 + ); + } + + /** + * Adds an embedded attachment. This can include images, sounds, and + * just about any other document. Make sure to set the $type to an + * image type. For JPEG images use "image/jpeg" and for GIF images + * use "image/gif". + * @param string $path Path to the attachment. + * @param string $cid Content ID of the attachment. Use this to identify + * the Id for accessing the image in an HTML form. + * @param string $name Overrides the attachment name. + * @param string $encoding File encoding (see $Encoding). + * @param string $type File extension (MIME) type. + * @return bool + */ + public function AddEmbeddedImage($path, $cid, $name = '', $encoding = 'base64', $type = 'application/octet-stream') { + + if ( !@is_file($path) ) { + $this->SetError($this->Lang('file_access') . $path); + return false; + } + + $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 => 'inline', + 7 => $cid + ); + + return true; + } + + /** + * Returns true if an inline attachment is present. + * @access public + * @return bool + */ + public function InlineImageExists() { + foreach($this->attachment as $attachment) { + if ($attachment[6] == 'inline') { + return true; + } + } + return false; + } + + ///////////////////////////////////////////////// + // CLASS METHODS, MESSAGE RESET + ///////////////////////////////////////////////// + + /** + * Clears all recipients assigned in the TO array. Returns void. + * @return void + */ + public function ClearAddresses() { + foreach($this->to as $to) { + unset($this->all_recipients[strtolower($to[0])]); + } + $this->to = array(); + } + + /** + * Clears all recipients assigned in the CC array. Returns void. + * @return void + */ + public function ClearCCs() { + foreach($this->cc as $cc) { + unset($this->all_recipients[strtolower($cc[0])]); + } + $this->cc = array(); + } + + /** + * Clears all recipients assigned in the BCC array. Returns void. + * @return void + */ + public function ClearBCCs() { + foreach($this->bcc as $bcc) { + unset($this->all_recipients[strtolower($bcc[0])]); + } + $this->bcc = array(); + } + + /** + * Clears all recipients assigned in the ReplyTo array. Returns void. + * @return void + */ + public function ClearReplyTos() { + $this->ReplyTo = array(); + } + + /** + * Clears all recipients assigned in the TO, CC and BCC + * array. Returns void. + * @return void + */ + public function ClearAllRecipients() { + $this->to = array(); + $this->cc = array(); + $this->bcc = array(); + $this->all_recipients = array(); + } + + /** + * Clears all previously set filesystem, string, and binary + * attachments. Returns void. + * @return void + */ + public function ClearAttachments() { + $this->attachment = array(); + } + + /** + * Clears all custom headers. Returns void. + * @return void + */ + public function ClearCustomHeaders() { + $this->CustomHeader = array(); + } + + ///////////////////////////////////////////////// + // CLASS METHODS, MISCELLANEOUS + ///////////////////////////////////////////////// + + /** + * Adds the error message to the error container. + * @access protected + * @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) and array_key_exists('smtp_msg', $lasterror)) { + $msg .= '

    ' . $this->Lang('smtp_error') . $lasterror['smtp_msg'] . "

    \n"; + } + } + $this->ErrorInfo = $msg; + } + + /** + * Returns the proper RFC 822 formatted date. + * @access public + * @return string + * @static + */ + public static function RFCDate() { + $tz = date('Z'); + $tzs = ($tz < 0) ? '-' : '+'; + $tz = abs($tz); + $tz = (int)($tz/3600)*100 + ($tz%3600)/60; + $result = sprintf("%s %s%04d", date('D, j M Y H:i:s'), $tzs, $tz); + + return $result; + } + + /** + * Returns the server hostname or 'localhost.localdomain' if unknown. + * @access private + * @return string + */ + private function ServerHostname() { + if (!empty($this->Hostname)) { + $result = $this->Hostname; + } elseif (isset($_SERVER['SERVER_NAME'])) { + $result = $_SERVER['SERVER_NAME']; + } else { + $result = 'localhost.localdomain'; + } + + return $result; + } + + /** + * Returns a message in the appropriate language. + * @access private + * @return string + */ + private function Lang($key) { + if(count($this->language) < 1) { + $this->SetLanguage('en'); // set the default language + } + + if(isset($this->language[$key])) { + return $this->language[$key]; + } else { + return 'Language string failed to load: ' . $key; + } + } + + /** + * Returns true if an error occurred. + * @access public + * @return bool + */ + public function IsError() { + return ($this->error_count > 0); + } + + /** + * Changes every end of line from CR or LF to CRLF. + * @access private + * @return string + */ + private function FixEOL($str) { + $str = str_replace("\r\n", "\n", $str); + $str = str_replace("\r", "\n", $str); + $str = str_replace("\n", $this->LE, $str); + return $str; + } + + /** + * Adds a custom header. + * @access public + * @return void + */ + public function AddCustomHeader($custom_header) { + $this->CustomHeader[] = explode(':', $custom_header, 2); + } + + /** + * Evaluates the message and returns modifications for inline images and backgrounds + * @access public + * @return $message + */ + public function MsgHTML($message, $basedir = '') { + preg_match_all("/(src|background)=\"(.*)\"/Ui", $message, $images); + if(isset($images[2])) { + foreach($images[2] as $i => $url) { + // do not change urls for absolute images (thanks to corvuscorax) + if (!preg_match('#^[A-z]+://#',$url)) { + $filename = basename($url); + $directory = dirname($url); + ($directory == '.')?$directory='':''; + $cid = 'cid:' . md5($filename); + $ext = pathinfo($filename, PATHINFO_EXTENSION); + $mimeType = self::_mime_types($ext); + if ( strlen($basedir) > 1 && substr($basedir,-1) != '/') { $basedir .= '/'; } + if ( strlen($directory) > 1 && substr($directory,-1) != '/') { $directory .= '/'; } + if ( $this->AddEmbeddedImage($basedir.$directory.$filename, md5($filename), $filename, 'base64',$mimeType) ) { + $message = preg_replace("/".$images[1][$i]."=\"".preg_quote($url, '/')."\"/Ui", $images[1][$i]."=\"".$cid."\"", $message); + } + } + } + } + $this->IsHTML(true); + $this->Body = $message; + $textMsg = trim(strip_tags(preg_replace('/<(head|title|style|script)[^>]*>.*?<\/\\1>/s','',$message))); + if (!empty($textMsg) && empty($this->AltBody)) { + $this->AltBody = html_entity_decode($textMsg); + } + if (empty($this->AltBody)) { + $this->AltBody = 'To view this email message, open it in a program that understands HTML!' . "\n\n"; + } + } + + /** + * Gets the MIME type of the embedded or inline image + * @param string File extension + * @access public + * @return string MIME type of ext + * @static + */ + public static function _mime_types($ext = '') { + $mimes = array( + 'hqx' => 'application/mac-binhex40', + 'cpt' => 'application/mac-compactpro', + 'doc' => 'application/msword', + 'bin' => 'application/macbinary', + 'dms' => 'application/octet-stream', + 'lha' => 'application/octet-stream', + 'lzh' => 'application/octet-stream', + 'exe' => 'application/octet-stream', + 'class' => 'application/octet-stream', + 'psd' => 'application/octet-stream', + 'so' => 'application/octet-stream', + 'sea' => 'application/octet-stream', + 'dll' => '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', + 'php' => 'application/x-httpd-php', + 'php4' => 'application/x-httpd-php', + 'php3' => 'application/x-httpd-php', + 'phtml' => 'application/x-httpd-php', + 'phps' => 'application/x-httpd-php-source', + 'js' => 'application/x-javascript', + 'swf' => 'application/x-shockwave-flash', + 'sit' => 'application/x-stuffit', + 'tar' => 'application/x-tar', + 'tgz' => 'application/x-tar', + 'xhtml' => 'application/xhtml+xml', + 'xht' => 'application/xhtml+xml', + 'zip' => 'application/zip', + 'mid' => 'audio/midi', + 'midi' => 'audio/midi', + 'mpga' => 'audio/mpeg', + 'mp2' => 'audio/mpeg', + 'mp3' => 'audio/mpeg', + 'aif' => 'audio/x-aiff', + 'aiff' => 'audio/x-aiff', + 'aifc' => 'audio/x-aiff', + 'ram' => 'audio/x-pn-realaudio', + 'rm' => 'audio/x-pn-realaudio', + 'rpm' => 'audio/x-pn-realaudio-plugin', + 'ra' => 'audio/x-realaudio', + 'rv' => 'video/vnd.rn-realvideo', + 'wav' => 'audio/x-wav', + 'bmp' => 'image/bmp', + 'gif' => 'image/gif', + 'jpeg' => 'image/jpeg', + 'jpg' => 'image/jpeg', + 'jpe' => 'image/jpeg', + 'png' => 'image/png', + 'tiff' => 'image/tiff', + 'tif' => 'image/tiff', + 'css' => 'text/css', + 'html' => 'text/html', + 'htm' => 'text/html', + 'shtml' => 'text/html', + 'txt' => 'text/plain', + 'text' => 'text/plain', + 'log' => 'text/plain', + 'rtx' => 'text/richtext', + 'rtf' => 'text/rtf', + 'xml' => 'text/xml', + 'xsl' => 'text/xml', + 'mpeg' => 'video/mpeg', + 'mpg' => 'video/mpeg', + 'mpe' => 'video/mpeg', + 'qt' => 'video/quicktime', + 'mov' => 'video/quicktime', + 'avi' => 'video/x-msvideo', + 'movie' => 'video/x-sgi-movie', + 'doc' => 'application/msword', + 'word' => 'application/msword', + 'xl' => 'application/excel', + 'eml' => 'message/rfc822' + ); + return (!isset($mimes[strtolower($ext)])) ? 'application/octet-stream' : $mimes[strtolower($ext)]; + } + + /** + * Set (or reset) Class Objects (variables) + * + * Usage Example: + * $page->set('X-Priority', '3'); + * + * @access public + * @param string $name Parameter Name + * @param mixed $value Parameter Value + * NOTE: will not work with arrays, there are no arrays to set/reset + * @todo Should this not be using __set() magic function? + */ + public function set($name, $value = '') { + try { + if (isset($this->$name) ) { + $this->$name = $value; + } else { + throw new phpmailerException($this->Lang('variable_set') . $name, self::STOP_CRITICAL); + } + } catch (Exception $e) { + $this->SetError($e->getMessage()); + if ($e->getCode() == self::STOP_CRITICAL) { + return false; + } + } + return true; + } + + /** + * Strips newlines to prevent header injection. + * @access public + * @param string $str String + * @return string + */ + public function SecureHeader($str) { + $str = str_replace("\r", '', $str); + $str = str_replace("\n", '', $str); + return trim($str); + } + + /** + * Set the private key file and password to sign the message. + * + * @access public + * @param string $key_filename Parameter File Name + * @param string $key_pass Password for private key + */ + public function Sign($cert_filename, $key_filename, $key_pass) { + $this->sign_cert_file = $cert_filename; + $this->sign_key_file = $key_filename; + $this->sign_key_pass = $key_pass; + } + + /** + * Set the private key file and password to sign the message. + * + * @access public + * @param string $key_filename Parameter File Name + * @param string $key_pass Password for private key + */ + public function DKIM_QP($txt) { + $tmp=""; + $line=""; + for ($i=0;$iDKIM_private); + if ($this->DKIM_passphrase!='') { + $privKey = openssl_pkey_get_private($privKeyStr,$this->DKIM_passphrase); + } else { + $privKey = $privKeyStr; + } + if (openssl_sign($s, $signature, $privKey)) { + return base64_encode($signature); + } + } + + /** + * Generate DKIM Canonicalization Header + * + * @access public + * @param string $s Header + */ + public function DKIM_HeaderC($s) { + $s=preg_replace("/\r\n\s+/"," ",$s); + $lines=explode("\r\n",$s); + foreach ($lines as $key=>$line) { + list($heading,$value)=explode(":",$line,2); + $heading=strtolower($heading); + $value=preg_replace("/\s+/"," ",$value) ; // Compress useless spaces + $lines[$key]=$heading.":".trim($value) ; // Don't forget to remove WSP around the value + } + $s=implode("\r\n",$lines); + return $s; + } + + /** + * Generate DKIM Canonicalization Body + * + * @access public + * @param string $body Message Body + */ + 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, body, as new header + * + * @access public + * @param string $headers_line Header lines + * @param string $subject Subject + * @param string $body Body + */ + public function DKIM_Add($headers_line,$subject,$body) { + $DKIMsignatureType = 'rsa-sha1'; // 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("\r\n",$headers_line); + foreach($headers as $header) { + if (strpos($header,'From:') === 0) { + $from_header=$header; + } elseif (strpos($header,'To:') === 0) { + $to_header=$header; + } + } + $from = str_replace('|','=7C',$this->DKIM_QP($from_header)); + $to = str_replace('|','=7C',$this->DKIM_QP($to_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*", sha1($body))) ; // Base64 of packed binary SHA-1 hash of body + $ident = ($this->DKIM_identity == '')? '' : " 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:Subject;\r\n". + "\td=" . $this->DKIM_domain . ";" . $ident . "\r\n". + "\tz=$from\r\n". + "\t|$to\r\n". + "\t|$subject;\r\n". + "\tbh=" . $DKIMb64 . ";\r\n". + "\tb="; + $toSign = $this->DKIM_HeaderC($from_header . "\r\n" . $to_header . "\r\n" . $subject_header . "\r\n" . $dkimhdrs); + $signed = $this->DKIM_Sign($toSign); + return "X-PHPMAILER-DKIM: phpmailer.worxware.com\r\n".$dkimhdrs.$signed."\r\n"; + } + + protected function doCallback($isSent,$to,$cc,$bcc,$subject,$body) { + if (!empty($this->action_function) && function_exists($this->action_function)) { + $params = array($isSent,$to,$cc,$bcc,$subject,$body); + call_user_func_array($this->action_function,$params); + } + } +} + +class phpmailerException extends Exception { + public function errorMessage() { + $errorMsg = '' . $this->getMessage() . "
    \n"; + return $errorMsg; + } +} +?> \ No newline at end of file diff --git a/src/wp-includes/class-pop3.php b/src/wp-includes/class-pop3.php new file mode 100644 index 0000000..d0455d7 --- /dev/null +++ b/src/wp-includes/class-pop3.php @@ -0,0 +1,652 @@ +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; + } + + 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 it's 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 truely + // 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/src/wp-includes/class-simplepie.php b/src/wp-includes/class-simplepie.php new file mode 100644 index 0000000..275033a --- /dev/null +++ b/src/wp-includes/class-simplepie.php @@ -0,0 +1,15002 @@ +' . SIMPLEPIE_NAME . ''); + +/** + * 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 + */ +define('SIMPLEPIE_NAMESPACE_MEDIARSS_WRONG', 'http://search.yahoo.com/mrss'); + +/** + * 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/'); + +/** + * Whether we're running on PHP5 + */ +define('SIMPLEPIE_PHP5', version_compare(PHP_VERSION, '5.0.0', '>=')); + +/** + * 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 + */ +class SimplePie +{ + /** + * @var array Raw data + * @access private + */ + var $data = array(); + + /** + * @var mixed Error string + * @access private + */ + var $error; + + /** + * @var object Instance of SimplePie_Sanitize (or other class) + * @see SimplePie::set_sanitize_class() + * @access private + */ + var $sanitize; + + /** + * @var string SimplePie Useragent + * @see SimplePie::set_useragent() + * @access private + */ + var $useragent = SIMPLEPIE_USERAGENT; + + /** + * @var string Feed URL + * @see SimplePie::set_feed_url() + * @access private + */ + var $feed_url; + + /** + * @var object Instance of SimplePie_File to use as a feed + * @see SimplePie::set_file() + * @access private + */ + var $file; + + /** + * @var string Raw feed data + * @see SimplePie::set_raw_data() + * @access private + */ + var $raw_data; + + /** + * @var int Timeout for fetching remote files + * @see SimplePie::set_timeout() + * @access private + */ + var $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 + */ + var $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 + */ + var $force_feed = false; + + /** + * @var bool Enable/Disable XML dump + * @see SimplePie::enable_xml_dump() + * @access private + */ + var $xml_dump = false; + + /** + * @var bool Enable/Disable Caching + * @see SimplePie::enable_cache() + * @access private + */ + var $cache = true; + + /** + * @var int Cache duration (in seconds) + * @see SimplePie::set_cache_duration() + * @access private + */ + var $cache_duration = 3600; + + /** + * @var int Auto-discovery cache duration (in seconds) + * @see SimplePie::set_autodiscovery_cache_duration() + * @access private + */ + var $autodiscovery_cache_duration = 604800; // 7 Days. + + /** + * @var string Cache location (relative to executing script) + * @see SimplePie::set_cache_location() + * @access private + */ + var $cache_location = './cache'; + + /** + * @var string Function that creates the cache filename + * @see SimplePie::set_cache_name_function() + * @access private + */ + var $cache_name_function = 'md5'; + + /** + * @var bool Reorder feed by date descending + * @see SimplePie::enable_order_by_date() + * @access private + */ + var $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 + */ + var $input_encoding = false; + + /** + * @var int Feed Autodiscovery Level + * @see SimplePie::set_autodiscovery_level() + * @access private + */ + var $autodiscovery = SIMPLEPIE_LOCATOR_ALL; + + /** + * @var string Class used for caching feeds + * @see SimplePie::set_cache_class() + * @access private + */ + var $cache_class = 'SimplePie_Cache'; + + /** + * @var string Class used for locating feeds + * @see SimplePie::set_locator_class() + * @access private + */ + var $locator_class = 'SimplePie_Locator'; + + /** + * @var string Class used for parsing feeds + * @see SimplePie::set_parser_class() + * @access private + */ + var $parser_class = 'SimplePie_Parser'; + + /** + * @var string Class used for fetching feeds + * @see SimplePie::set_file_class() + * @access private + */ + var $file_class = 'SimplePie_File'; + + /** + * @var string Class used for items + * @see SimplePie::set_item_class() + * @access private + */ + var $item_class = 'SimplePie_Item'; + + /** + * @var string Class used for authors + * @see SimplePie::set_author_class() + * @access private + */ + var $author_class = 'SimplePie_Author'; + + /** + * @var string Class used for categories + * @see SimplePie::set_category_class() + * @access private + */ + var $category_class = 'SimplePie_Category'; + + /** + * @var string Class used for enclosures + * @see SimplePie::set_enclosures_class() + * @access private + */ + var $enclosure_class = 'SimplePie_Enclosure'; + + /** + * @var string Class used for Media RSS captions + * @see SimplePie::set_caption_class() + * @access private + */ + var $caption_class = 'SimplePie_Caption'; + + /** + * @var string Class used for Media RSS + * @see SimplePie::set_copyright_class() + * @access private + */ + var $copyright_class = 'SimplePie_Copyright'; + + /** + * @var string Class used for Media RSS + * @see SimplePie::set_credit_class() + * @access private + */ + var $credit_class = 'SimplePie_Credit'; + + /** + * @var string Class used for Media RSS + * @see SimplePie::set_rating_class() + * @access private + */ + var $rating_class = 'SimplePie_Rating'; + + /** + * @var string Class used for Media RSS + * @see SimplePie::set_restriction_class() + * @access private + */ + var $restriction_class = 'SimplePie_Restriction'; + + /** + * @var string Class used for content-type sniffing + * @see SimplePie::set_content_type_sniffer_class() + * @access private + */ + var $content_type_sniffer_class = 'SimplePie_Content_Type_Sniffer'; + + /** + * @var string Class used for item sources. + * @see SimplePie::set_source_class() + * @access private + */ + var $source_class = 'SimplePie_Source'; + + /** + * @var mixed Set javascript query string parameter (false, or + * anything type-cast to false, disables this feature) + * @see SimplePie::set_javascript() + * @access private + */ + var $javascript = 'js'; + + /** + * @var int Maximum number of feeds to check with autodiscovery + * @see SimplePie::set_max_checked_feeds() + * @access private + */ + var $max_checked_feeds = 10; + + /** + * @var array All the feeds found during the autodiscovery process + * @see SimplePie::get_all_discovered_feeds() + * @access private + */ + var $all_discovered_feeds = array(); + + /** + * @var string Web-accessible path to the handler_favicon.php file. + * @see SimplePie::set_favicon_handler() + * @access private + */ + var $favicon_handler = ''; + + /** + * @var string Web-accessible path to the handler_image.php file. + * @see SimplePie::set_image_handler() + * @access private + */ + var $image_handler = ''; + + /** + * @var array Stores the URLs when multiple feeds are being initialized. + * @see SimplePie::set_feed_url() + * @access private + */ + var $multifeed_url = array(); + + /** + * @var array Stores SimplePie objects when multiple feeds initialized. + * @access private + */ + var $multifeed_objects = array(); + + /** + * @var array Stores the get_object_vars() array for use with multifeeds. + * @see SimplePie::set_feed_url() + * @access private + */ + var $config_settings = null; + + /** + * @var integer Stores the number of items to return per-feed with multifeeds. + * @see SimplePie::set_item_limit() + * @access private + */ + var $item_limit = 0; + + /** + * @var array Stores the default attributes to be stripped by strip_attributes(). + * @see SimplePie::strip_attributes() + * @access private + */ + var $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 + */ + var $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 + * + * There are two ways that you can create a new SimplePie object. The first + * is by passing a feed URL as a parameter to the SimplePie constructor + * (as well as optionally setting the cache location and cache expiry). This + * will initialise the whole feed with all of the default settings, and you + * can begin accessing methods and properties immediately. + * + * The second way is to create the SimplePie object with no parameters + * at all. This will enable you to set configuration options. 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. This format is + * what is used throughout this documentation. + * + * @access public + * @since 1.0 Preview Release + * @param string $feed_url This is the URL you want to parse. + * @param string $cache_location This is where you want the cache to be stored. + * @param int $cache_duration This is the number of seconds that you want to store the cache file for. + */ + function SimplePie($feed_url = null, $cache_location = null, $cache_duration = null) + { + // Other objects, instances created here so we can set options on them + $this->sanitize =& new SimplePie_Sanitize; + + // Set options if they're passed to the constructor + if ($cache_location !== null) + { + $this->set_cache_location($cache_location); + } + + if ($cache_duration !== null) + { + $this->set_cache_duration($cache_duration); + } + + // Only init the script if we're passed a feed URL + if ($feed_url !== null) + { + $this->set_feed_url($feed_url); + $this->init(); + } + } + + /** + * Used for converting object to a string + */ + function __toString() + { + return md5(serialize($this->data)); + } + + /** + * Remove items that link back to this before destroying this object + */ + 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 no matter what it + * appears like + * + * @access public + * @since 1.1 + * @param bool $enable Force the given data/URL to be treated as a feed + */ + function force_feed($enable = false) + { + $this->force_feed = (bool) $enable; + } + + /** + * This is 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. + * + * @access public + * @since 1.0 Preview Release + * @param mixed $url This is the URL (or array of URLs) that you want to parse. + * @see SimplePie::set_raw_data() + */ + function set_feed_url($url) + { + if (is_array($url)) + { + $this->multifeed_url = array(); + foreach ($url as $value) + { + $this->multifeed_url[] = SimplePie_Misc::fix_protocol($value, 1); + } + } + else + { + $this->feed_url = SimplePie_Misc::fix_protocol($url, 1); + } + } + + /** + * Provides an instance of SimplePie_File to use as a feed + * + * @access public + * @param object &$file Instance of SimplePie_File (or subclass) + * @return bool True on success, false on failure + */ + function set_file(&$file) + { + if (is_a($file, 'SimplePie_File')) + { + $this->feed_url = $file->url; + $this->file =& $file; + return true; + } + return false; + } + + /** + * 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. + * + * @access public + * @since 1.0 Beta 3 + * @param string $data RSS or Atom data as a string. + * @see SimplePie::set_feed_url() + */ + function set_raw_data($data) + { + $this->raw_data = $data; + } + + /** + * Allows you to override 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. + * + * @access public + * @since 1.0 Beta 3 + * @param int $timeout The maximum number of seconds to spend waiting to retrieve a feed. + */ + function set_timeout($timeout = 10) + { + $this->timeout = (int) $timeout; + } + + /** + * Forces SimplePie to use fsockopen() instead of the preferred cURL + * functions. + * + * @access public + * @since 1.0 Beta 3 + * @param bool $enable Force fsockopen() to be used + */ + function force_fsockopen($enable = false) + { + $this->force_fsockopen = (bool) $enable; + } + + /** + * Outputs the raw XML content of the feed, after it has gone through + * SimplePie's filters. + * + * Used only for debugging, this function will output the XML content as + * text/xml. When SimplePie reads in a feed, it does a bit of cleaning up + * before trying to parse it. Many parts of the feed are re-written in + * memory, and in the end, you have a parsable feed. XML dump shows you the + * actual XML that SimplePie tries to parse, which may or may not be very + * different from the original feed. + * + * @access public + * @since 1.0 Preview Release + * @param bool $enable Enable XML dump + */ + function enable_xml_dump($enable = false) + { + $this->xml_dump = (bool) $enable; + } + + /** + * Enables/disables caching in SimplePie. + * + * This option allows you to disable caching all-together in SimplePie. + * However, disabling the cache can lead to longer load times. + * + * @access public + * @since 1.0 Preview Release + * @param bool $enable Enable caching + */ + 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. + * + * @access public + * @param int $seconds The feed content cache duration. + */ + 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. + * + * @access public + * @param int $seconds The autodiscovered feed URL cache duration. + */ + 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. + * + * @access public + * @param string $location The file system location. + */ + function set_cache_location($location = './cache') + { + $this->cache_location = (string) $location; + } + + /** + * Determines whether feed items should be sorted into reverse chronological order. + * + * @access public + * @param bool $enable Sort as reverse chronological order. + */ + function enable_order_by_date($enable = true) + { + $this->order_by_date = (bool) $enable; + } + + /** + * Allows you to override the character encoding reported by the feed. + * + * @access public + * @param string $encoding Character encoding. + */ + 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 + * + * @access public + * @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) + */ + function set_autodiscovery_level($level = SIMPLEPIE_LOCATOR_ALL) + { + $this->autodiscovery = (int) $level; + } + + /** + * Allows you to change which class SimplePie uses for caching. + * Useful when you are overloading or extending SimplePie's default classes. + * + * @access public + * @param string $class Name of custom class. + * @link http://php.net/manual/en/keyword.extends.php PHP4 extends documentation + * @link http://php.net/manual/en/language.oop5.basic.php#language.oop5.basic.extends PHP5 extends documentation + */ + function set_cache_class($class = 'SimplePie_Cache') + { + if (SimplePie_Misc::is_subclass_of($class, 'SimplePie_Cache')) + { + $this->cache_class = $class; + return true; + } + return false; + } + + /** + * Allows you to change which class SimplePie uses for auto-discovery. + * Useful when you are overloading or extending SimplePie's default classes. + * + * @access public + * @param string $class Name of custom class. + * @link http://php.net/manual/en/keyword.extends.php PHP4 extends documentation + * @link http://php.net/manual/en/language.oop5.basic.php#language.oop5.basic.extends PHP5 extends documentation + */ + function set_locator_class($class = 'SimplePie_Locator') + { + if (SimplePie_Misc::is_subclass_of($class, 'SimplePie_Locator')) + { + $this->locator_class = $class; + return true; + } + return false; + } + + /** + * Allows you to change which class SimplePie uses for XML parsing. + * Useful when you are overloading or extending SimplePie's default classes. + * + * @access public + * @param string $class Name of custom class. + * @link http://php.net/manual/en/keyword.extends.php PHP4 extends documentation + * @link http://php.net/manual/en/language.oop5.basic.php#language.oop5.basic.extends PHP5 extends documentation + */ + function set_parser_class($class = 'SimplePie_Parser') + { + if (SimplePie_Misc::is_subclass_of($class, 'SimplePie_Parser')) + { + $this->parser_class = $class; + return true; + } + return false; + } + + /** + * Allows you to change which class SimplePie uses for remote file fetching. + * Useful when you are overloading or extending SimplePie's default classes. + * + * @access public + * @param string $class Name of custom class. + * @link http://php.net/manual/en/keyword.extends.php PHP4 extends documentation + * @link http://php.net/manual/en/language.oop5.basic.php#language.oop5.basic.extends PHP5 extends documentation + */ + function set_file_class($class = 'SimplePie_File') + { + if (SimplePie_Misc::is_subclass_of($class, 'SimplePie_File')) + { + $this->file_class = $class; + return true; + } + return false; + } + + /** + * Allows you to change which class SimplePie uses for data sanitization. + * Useful when you are overloading or extending SimplePie's default classes. + * + * @access public + * @param string $class Name of custom class. + * @link http://php.net/manual/en/keyword.extends.php PHP4 extends documentation + * @link http://php.net/manual/en/language.oop5.basic.php#language.oop5.basic.extends PHP5 extends documentation + */ + function set_sanitize_class($class = 'SimplePie_Sanitize') + { + if (SimplePie_Misc::is_subclass_of($class, 'SimplePie_Sanitize')) + { + $this->sanitize =& new $class; + return true; + } + return false; + } + + /** + * Allows you to change which class SimplePie uses for handling feed items. + * Useful when you are overloading or extending SimplePie's default classes. + * + * @access public + * @param string $class Name of custom class. + * @link http://php.net/manual/en/keyword.extends.php PHP4 extends documentation + * @link http://php.net/manual/en/language.oop5.basic.php#language.oop5.basic.extends PHP5 extends documentation + */ + function set_item_class($class = 'SimplePie_Item') + { + if (SimplePie_Misc::is_subclass_of($class, 'SimplePie_Item')) + { + $this->item_class = $class; + return true; + } + return false; + } + + /** + * Allows you to change which class SimplePie uses for handling author data. + * Useful when you are overloading or extending SimplePie's default classes. + * + * @access public + * @param string $class Name of custom class. + * @link http://php.net/manual/en/keyword.extends.php PHP4 extends documentation + * @link http://php.net/manual/en/language.oop5.basic.php#language.oop5.basic.extends PHP5 extends documentation + */ + function set_author_class($class = 'SimplePie_Author') + { + if (SimplePie_Misc::is_subclass_of($class, 'SimplePie_Author')) + { + $this->author_class = $class; + return true; + } + return false; + } + + /** + * Allows you to change which class SimplePie uses for handling category data. + * Useful when you are overloading or extending SimplePie's default classes. + * + * @access public + * @param string $class Name of custom class. + * @link http://php.net/manual/en/keyword.extends.php PHP4 extends documentation + * @link http://php.net/manual/en/language.oop5.basic.php#language.oop5.basic.extends PHP5 extends documentation + */ + function set_category_class($class = 'SimplePie_Category') + { + if (SimplePie_Misc::is_subclass_of($class, 'SimplePie_Category')) + { + $this->category_class = $class; + return true; + } + return false; + } + + /** + * Allows you to change which class SimplePie uses for feed enclosures. + * Useful when you are overloading or extending SimplePie's default classes. + * + * @access public + * @param string $class Name of custom class. + * @link http://php.net/manual/en/keyword.extends.php PHP4 extends documentation + * @link http://php.net/manual/en/language.oop5.basic.php#language.oop5.basic.extends PHP5 extends documentation + */ + function set_enclosure_class($class = 'SimplePie_Enclosure') + { + if (SimplePie_Misc::is_subclass_of($class, 'SimplePie_Enclosure')) + { + $this->enclosure_class = $class; + return true; + } + return false; + } + + /** + * Allows you to change which class SimplePie uses for captions + * Useful when you are overloading or extending SimplePie's default classes. + * + * @access public + * @param string $class Name of custom class. + * @link http://php.net/manual/en/keyword.extends.php PHP4 extends documentation + * @link http://php.net/manual/en/language.oop5.basic.php#language.oop5.basic.extends PHP5 extends documentation + */ + function set_caption_class($class = 'SimplePie_Caption') + { + if (SimplePie_Misc::is_subclass_of($class, 'SimplePie_Caption')) + { + $this->caption_class = $class; + return true; + } + return false; + } + + /** + * Allows you to change which class SimplePie uses for + * Useful when you are overloading or extending SimplePie's default classes. + * + * @access public + * @param string $class Name of custom class. + * @link http://php.net/manual/en/keyword.extends.php PHP4 extends documentation + * @link http://php.net/manual/en/language.oop5.basic.php#language.oop5.basic.extends PHP5 extends documentation + */ + function set_copyright_class($class = 'SimplePie_Copyright') + { + if (SimplePie_Misc::is_subclass_of($class, 'SimplePie_Copyright')) + { + $this->copyright_class = $class; + return true; + } + return false; + } + + /** + * Allows you to change which class SimplePie uses for + * Useful when you are overloading or extending SimplePie's default classes. + * + * @access public + * @param string $class Name of custom class. + * @link http://php.net/manual/en/keyword.extends.php PHP4 extends documentation + * @link http://php.net/manual/en/language.oop5.basic.php#language.oop5.basic.extends PHP5 extends documentation + */ + function set_credit_class($class = 'SimplePie_Credit') + { + if (SimplePie_Misc::is_subclass_of($class, 'SimplePie_Credit')) + { + $this->credit_class = $class; + return true; + } + return false; + } + + /** + * Allows you to change which class SimplePie uses for + * Useful when you are overloading or extending SimplePie's default classes. + * + * @access public + * @param string $class Name of custom class. + * @link http://php.net/manual/en/keyword.extends.php PHP4 extends documentation + * @link http://php.net/manual/en/language.oop5.basic.php#language.oop5.basic.extends PHP5 extends documentation + */ + function set_rating_class($class = 'SimplePie_Rating') + { + if (SimplePie_Misc::is_subclass_of($class, 'SimplePie_Rating')) + { + $this->rating_class = $class; + return true; + } + return false; + } + + /** + * Allows you to change which class SimplePie uses for + * Useful when you are overloading or extending SimplePie's default classes. + * + * @access public + * @param string $class Name of custom class. + * @link http://php.net/manual/en/keyword.extends.php PHP4 extends documentation + * @link http://php.net/manual/en/language.oop5.basic.php#language.oop5.basic.extends PHP5 extends documentation + */ + function set_restriction_class($class = 'SimplePie_Restriction') + { + if (SimplePie_Misc::is_subclass_of($class, 'SimplePie_Restriction')) + { + $this->restriction_class = $class; + return true; + } + return false; + } + + /** + * Allows you to change which class SimplePie uses for content-type sniffing. + * Useful when you are overloading or extending SimplePie's default classes. + * + * @access public + * @param string $class Name of custom class. + * @link http://php.net/manual/en/keyword.extends.php PHP4 extends documentation + * @link http://php.net/manual/en/language.oop5.basic.php#language.oop5.basic.extends PHP5 extends documentation + */ + function set_content_type_sniffer_class($class = 'SimplePie_Content_Type_Sniffer') + { + if (SimplePie_Misc::is_subclass_of($class, 'SimplePie_Content_Type_Sniffer')) + { + $this->content_type_sniffer_class = $class; + return true; + } + return false; + } + + /** + * Allows you to change which class SimplePie uses item sources. + * Useful when you are overloading or extending SimplePie's default classes. + * + * @access public + * @param string $class Name of custom class. + * @link http://php.net/manual/en/keyword.extends.php PHP4 extends documentation + * @link http://php.net/manual/en/language.oop5.basic.php#language.oop5.basic.extends PHP5 extends documentation + */ + function set_source_class($class = 'SimplePie_Source') + { + if (SimplePie_Misc::is_subclass_of($class, 'SimplePie_Source')) + { + $this->source_class = $class; + return true; + } + return false; + } + + /** + * Allows you to override the default user agent string. + * + * @access public + * @param string $ua New user agent string. + */ + function set_useragent($ua = SIMPLEPIE_USERAGENT) + { + $this->useragent = (string) $ua; + } + + /** + * Set callback function to create cache filename with + * + * @access public + * @param mixed $function Callback function + */ + function set_cache_name_function($function = 'md5') + { + if (is_callable($function)) + { + $this->cache_name_function = $function; + } + } + + /** + * Set javascript query string parameter + * + * @access public + * @param mixed $get Javascript query string parameter + */ + function set_javascript($get = 'js') + { + if ($get) + { + $this->javascript = (string) $get; + } + else + { + $this->javascript = false; + } + } + + /** + * Set options to make SP as fast as possible. Forgoes a + * substantial amount of data sanitization in favor of speed. + * + * @access public + * @param bool $set Whether to set them or not + */ + 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 + * + * @access public + * @param int $max Maximum number of feeds to check + */ + function set_max_checked_feeds($max = 10) + { + $this->max_checked_feeds = (int) $max; + } + + function remove_div($enable = true) + { + $this->sanitize->remove_div($enable); + } + + 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); + } + } + + function encode_instead_of_strip($enable = true) + { + $this->sanitize->encode_instead_of_strip($enable); + } + + function strip_attributes($attribs = '') + { + if ($attribs === '') + { + $attribs = $this->strip_attributes; + } + $this->sanitize->strip_attributes($attribs); + } + + function set_output_encoding($encoding = 'UTF-8') + { + $this->sanitize->set_output_encoding($encoding); + } + + 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 + * + * @access public + * @since 1.0 + * @param array $element_attribute Element/attribute key/value pairs + */ + function set_url_replacements($element_attribute = array('a' => 'href', 'area' => 'href', 'blockquote' => 'cite', 'del' => 'cite', 'form' => 'action', 'img' => array('longdesc', 'src'), 'input' => 'src', 'ins' => 'cite', 'q' => 'cite')) + { + $this->sanitize->set_url_replacements($element_attribute); + } + + /** + * Set the handler to enable the display of cached favicons. + * + * @access public + * @param str $page Web-accessible path to the handler_favicon.php file. + * @param str $qs The query string that the value should be passed to. + */ + function set_favicon_handler($page = false, $qs = 'i') + { + if ($page !== false) + { + $this->favicon_handler = $page . '?' . $qs . '='; + } + else + { + $this->favicon_handler = ''; + } + } + + /** + * Set the handler to enable the display of cached images. + * + * @access public + * @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. + */ + 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. + * + * @access public + * @param integer $limit The maximum number of items to return. + */ + function set_item_limit($limit = 0) + { + $this->item_limit = (int) $limit; + } + + function init() + { + // Check absolute bare minimum requirements. + if ((function_exists('version_compare') && version_compare(PHP_VERSION, '4.3.0', '<')) || !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, '&', $values); + xml_parser_free($parser_check); + $xml_is_sane = isset($values[0]['value']); + } + if (!$xml_is_sane) + { + return false; + } + } + + if (isset($_GET[$this->javascript])) + { + SimplePie_Misc::output_javascript(); + exit; + } + + // Pass whatever was set with config options over to the sanitizer. + $this->sanitize->pass_cache_data($this->cache, $this->cache_location, $this->cache_name_function, $this->cache_class); + $this->sanitize->pass_file_data($this->file_class, $this->timeout, $this->useragent, $this->force_fsockopen); + + if ($this->feed_url !== null || $this->raw_data !== null) + { + $this->data = array(); + $this->multifeed_objects = array(); + $cache = false; + + if ($this->feed_url !== null) + { + $parsed_feed_url = SimplePie_Misc::parse_url($this->feed_url); + // Decide whether to enable caching + if ($this->cache && $parsed_feed_url['scheme'] !== '') + { + $cache = call_user_func(array($this->cache_class, 'create'), $this->cache_location, call_user_func($this->cache_name_function, $this->feed_url), 'spc'); + } + // If it's enabled and we don't want an XML dump, use the cache + if ($cache && !$this->xml_dump) + { + // 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']) + { + $cache->unlink(); + $this->data = array(); + } + else + { + $this->set_feed_url($this->data['feed_url']); + return $this->init(); + } + } + } + // 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(); + 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 =& new $this->file_class($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 + { + $headers = $file->headers; + } + } + else + { + unset($file); + } + } + } + // If the cache is still valid, just return true + else + { + 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 (is_a($this->file, 'SimplePie_File') && $this->file->url === $this->feed_url) + { + $file =& $this->file; + } + else + { + $file =& new $this->file_class($this->feed_url, $this->timeout, 5, null, $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; + if (!empty($this->data)) + { + return true; + } + else + { + return false; + } + } + + if (!$this->force_feed) + { + // Check if the supplied URL is a feed, if it isn't, look for it. + $locate =& new $this->locator_class($file, $this->timeout, $this->useragent, $this->file_class, $this->max_checked_feeds, $this->content_type_sniffer_class); + 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); + if ($file = $locate->find($this->autodiscovery, $this->all_discovered_feeds)) + { + 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", E_USER_WARNING); + } + $cache = call_user_func(array($this->cache_class, 'create'), $this->cache_location, call_user_func($this->cache_name_function, $file->url), 'spc'); + } + $this->feed_url = $file->url; + } + else + { + $this->error = "A feed could not be found at $this->feed_url"; + SimplePie_Misc::error($this->error, E_USER_NOTICE, __FILE__, __LINE__); + return false; + } + } + $locate = null; + } + + $headers = $file->headers; + $data = $file->body; + $sniffer =& new $this->content_type_sniffer_class($file); + $sniffed = $sniffer->get_type(); + } + else + { + $data = $this->raw_data; + } + + // 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, SimplePie_Misc::xml_encoding($data)); + $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, SimplePie_Misc::xml_encoding($data)); + $encodings[] = 'UTF-8'; + $encodings[] = 'ISO-8859-1'; + + // There's no point in trying an encoding twice + $encodings = array_unique($encodings); + + // If we want the XML, just output that with the most likely encoding and quit + if ($this->xml_dump) + { + header('Content-type: text/xml; charset=' . $encodings[0]); + echo $data; + exit; + } + + // 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 = SimplePie_Misc::change_encoding($data, $encoding, 'UTF-8')) + { + // Create new parser + $parser =& new $this->parser_class(); + + // If it's parsed fine + if ($parser->parse($utf8_data, 'UTF-8')) + { + $this->data = $parser->get_data(); + if ($this->get_type() & ~SIMPLEPIE_TYPE_NONE) + { + 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("$cache->name is not writeable", E_USER_WARNING); + } + return true; + } + else + { + $this->error = "A feed could not be found at $this->feed_url"; + SimplePie_Misc::error($this->error, E_USER_NOTICE, __FILE__, __LINE__); + return false; + } + } + } + } + if(isset($parser)) + { + // We have an error, just set SimplePie_Misc::error to it and quit + $this->error = sprintf('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'; + } + SimplePie_Misc::error($this->error, E_USER_NOTICE, __FILE__, __LINE__); + return false; + } + elseif (!empty($this->multifeed_url)) + { + $i = 0; + $success = 0; + $this->multifeed_objects = array(); + foreach ($this->multifeed_url as $url) + { + if (SIMPLEPIE_PHP5) + { + // This keyword needs to defy coding standards for PHP4 compatibility + $this->multifeed_objects[$i] = clone($this); + } + else + { + $this->multifeed_objects[$i] = $this; + } + $this->multifeed_objects[$i]->set_feed_url($url); + $success |= $this->multifeed_objects[$i]->init(); + $i++; + } + return (bool) $success; + } + else + { + return false; + } + } + + /** + * Return the error message for the occurred error + * + * @access public + * @return string Error message + */ + function error() + { + return $this->error; + } + + function get_encoding() + { + return $this->sanitize->output_encoding; + } + + 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); + } + } + + 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']; + } + + /** + * Returns the URL for the favicon of the feed's website. + * + * @todo Cache atom:icon + * @access public + * @since 1.0 + */ + function get_favicon() + { + if ($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 (($url = $this->get_link()) !== null && preg_match('/^http(s)?:\/\//i', $url)) + { + $favicon = SimplePie_Misc::absolutize_url('/favicon.ico', $url); + + if ($this->cache && $this->favicon_handler) + { + $favicon_filename = call_user_func($this->cache_name_function, $favicon); + $cache = call_user_func(array($this->cache_class, 'create'), $this->cache_location, $favicon_filename, 'spi'); + + if ($cache->load()) + { + return $this->sanitize($this->favicon_handler . $favicon_filename, SIMPLEPIE_CONSTRUCT_IRI); + } + else + { + $file =& new $this->file_class($favicon, $this->timeout / 10, 5, array('X-FORWARDED-FOR' => $_SERVER['REMOTE_ADDR']), $this->useragent, $this->force_fsockopen); + + if ($file->success && ($file->method & SIMPLEPIE_FILE_SOURCE_REMOTE === 0 || ($file->status_code === 200 || $file->status_code > 206 && $file->status_code < 300)) && strlen($file->body) > 0) + { + $sniffer =& new $this->content_type_sniffer_class($file); + if (substr($sniffer->get_type(), 0, 6) === 'image/') + { + if ($cache->save(array('headers' => $file->headers, 'body' => $file->body))) + { + return $this->sanitize($this->favicon_handler . $favicon_filename, SIMPLEPIE_CONSTRUCT_IRI); + } + else + { + trigger_error("$cache->name is not writeable", E_USER_WARNING); + return $this->sanitize($favicon, SIMPLEPIE_CONSTRUCT_IRI); + } + } + // not an image + else + { + return false; + } + } + } + } + else + { + return $this->sanitize($favicon, SIMPLEPIE_CONSTRUCT_IRI); + } + } + return false; + } + + /** + * @todo If we have a perm redirect we should return the new URL + * @todo When we make the above change, let's support as well + * @todo Also, |atom:link|@rel=self + */ + function subscribe_url() + { + if ($this->feed_url !== null) + { + return $this->sanitize($this->feed_url, SIMPLEPIE_CONSTRUCT_IRI); + } + else + { + return null; + } + } + + function subscribe_feed() + { + if ($this->feed_url !== null) + { + return $this->sanitize(SimplePie_Misc::fix_protocol($this->feed_url, 2), SIMPLEPIE_CONSTRUCT_IRI); + } + else + { + return null; + } + } + + function subscribe_outlook() + { + if ($this->feed_url !== null) + { + return $this->sanitize('outlook' . SimplePie_Misc::fix_protocol($this->feed_url, 2), SIMPLEPIE_CONSTRUCT_IRI); + } + else + { + return null; + } + } + + function subscribe_podcast() + { + if ($this->feed_url !== null) + { + return $this->sanitize(SimplePie_Misc::fix_protocol($this->feed_url, 3), SIMPLEPIE_CONSTRUCT_IRI); + } + else + { + return null; + } + } + + function subscribe_itunes() + { + if ($this->feed_url !== null) + { + return $this->sanitize(SimplePie_Misc::fix_protocol($this->feed_url, 4), SIMPLEPIE_CONSTRUCT_IRI); + } + else + { + return null; + } + } + + /** + * Creates the subscribe_* methods' return data + * + * @access private + * @param string $feed_url String to prefix to the feed URL + * @param string $site_url String to prefix to the site URL (and + * suffix to the feed URL) + * @return mixed URL if feed exists, false otherwise + */ + function subscribe_service($feed_url, $site_url = null) + { + if ($this->subscribe_url()) + { + $return = $feed_url . rawurlencode($this->feed_url); + if ($site_url !== null && $this->get_link() !== null) + { + $return .= $site_url . rawurlencode($this->get_link()); + } + return $this->sanitize($return, SIMPLEPIE_CONSTRUCT_IRI); + } + else + { + return null; + } + } + + function subscribe_aol() + { + return $this->subscribe_service('http://feeds.my.aol.com/add.jsp?url='); + } + + function subscribe_bloglines() + { + return $this->subscribe_service('http://www.bloglines.com/sub/'); + } + + function subscribe_eskobo() + { + return $this->subscribe_service('http://www.eskobo.com/?AddToMyPage='); + } + + function subscribe_feedfeeds() + { + return $this->subscribe_service('http://www.feedfeeds.com/add?feed='); + } + + function subscribe_feedster() + { + return $this->subscribe_service('http://www.feedster.com/myfeedster.php?action=addrss&confirm=no&rssurl='); + } + + function subscribe_google() + { + return $this->subscribe_service('http://fusion.google.com/add?feedurl='); + } + + function subscribe_gritwire() + { + return $this->subscribe_service('http://my.gritwire.com/feeds/addExternalFeed.aspx?FeedUrl='); + } + + function subscribe_msn() + { + return $this->subscribe_service('http://my.msn.com/addtomymsn.armx?id=rss&ut=', '&ru='); + } + + function subscribe_netvibes() + { + return $this->subscribe_service('http://www.netvibes.com/subscribe.php?url='); + } + + function subscribe_newsburst() + { + return $this->subscribe_service('http://www.newsburst.com/Source/?add='); + } + + function subscribe_newsgator() + { + return $this->subscribe_service('http://www.newsgator.com/ngs/subscriber/subext.aspx?url='); + } + + function subscribe_odeo() + { + return $this->subscribe_service('http://www.odeo.com/listen/subscribe?feed='); + } + + function subscribe_podnova() + { + return $this->subscribe_service('http://www.podnova.com/index_your_podcasts.srf?action=add&url='); + } + + function subscribe_rojo() + { + return $this->subscribe_service('http://www.rojo.com/add-subscription?resource='); + } + + function subscribe_yahoo() + { + return $this->subscribe_service('http://add.my.yahoo.com/rss?url='); + } + + 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; + } + + 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; + } + + 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; + } + + 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(); + } + } + + function sanitize($data, $type, $base = '') + { + return $this->sanitize->sanitize($data, $type, $base); + } + + function get_title() + { + if ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'title')) + { + return $this->sanitize($return[0]['data'], SimplePie_Misc::atom_10_construct_type($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'], SimplePie_Misc::atom_03_construct_type($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; + } + } + + function get_category($key = 0) + { + $categories = $this->get_categories(); + if (isset($categories[$key])) + { + return $categories[$key]; + } + else + { + return null; + } + } + + 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[] =& new $this->category_class($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[] =& new $this->category_class($term, $scheme, null); + } + foreach ((array) $this->get_channel_tags(SIMPLEPIE_NAMESPACE_DC_11, 'subject') as $category) + { + $categories[] =& new $this->category_class($this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null); + } + foreach ((array) $this->get_channel_tags(SIMPLEPIE_NAMESPACE_DC_10, 'subject') as $category) + { + $categories[] =& new $this->category_class($this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null); + } + + if (!empty($categories)) + { + return SimplePie_Misc::array_unique($categories); + } + else + { + return null; + } + } + + function get_author($key = 0) + { + $authors = $this->get_authors(); + if (isset($authors[$key])) + { + return $authors[$key]; + } + else + { + return null; + } + } + + 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[] =& new $this->author_class($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[] =& new $this->author_class($name, $url, $email); + } + } + foreach ((array) $this->get_channel_tags(SIMPLEPIE_NAMESPACE_DC_11, 'creator') as $author) + { + $authors[] =& new $this->author_class($this->sanitize($author['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null); + } + foreach ((array) $this->get_channel_tags(SIMPLEPIE_NAMESPACE_DC_10, 'creator') as $author) + { + $authors[] =& new $this->author_class($this->sanitize($author['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null); + } + foreach ((array) $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'author') as $author) + { + $authors[] =& new $this->author_class($this->sanitize($author['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null); + } + + if (!empty($authors)) + { + return SimplePie_Misc::array_unique($authors); + } + else + { + return null; + } + } + + function get_contributor($key = 0) + { + $contributors = $this->get_contributors(); + if (isset($contributors[$key])) + { + return $contributors[$key]; + } + else + { + return null; + } + } + + 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[] =& new $this->author_class($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[] =& new $this->author_class($name, $url, $email); + } + } + + if (!empty($contributors)) + { + return SimplePie_Misc::array_unique($contributors); + } + else + { + return null; + } + } + + 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. + */ + function get_permalink() + { + return $this->get_link(0); + } + + 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 (SimplePie_Misc::is_isegment_nz_nc($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; + } + } + + function get_all_discovered_feeds() + { + return $this->all_discovered_feeds; + } + + function get_description() + { + if ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'subtitle')) + { + return $this->sanitize($return[0]['data'], SimplePie_Misc::atom_10_construct_type($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'], SimplePie_Misc::atom_03_construct_type($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; + } + } + + function get_copyright() + { + if ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'rights')) + { + return $this->sanitize($return[0]['data'], SimplePie_Misc::atom_10_construct_type($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'], SimplePie_Misc::atom_03_construct_type($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; + } + } + + 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; + } + } + + 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]+))$/', $return[0]['data'], $match)) + { + return (float) $match[1]; + } + else + { + return null; + } + } + + 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]+))$/', $return[0]['data'], $match)) + { + return (float) $match[2]; + } + else + { + return null; + } + } + + 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; + } + } + + 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; + } + } + + 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; + } + } + + 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; + } + } + + 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; + } + } + + 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; + } + } + + function get_item($key = 0) + { + $items = $this->get_items(); + if (isset($items[$key])) + { + return $items[$key]; + } + else + { + return null; + } + } + + 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'][] =& new $this->item_class($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'][] =& new $this->item_class($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'][] =& new $this->item_class($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'][] =& new $this->item_class($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'][] =& new $this->item_class($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(&$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(); + } + } + + /** + * @static + */ + function sort_items($a, $b) + { + return $a->get_date('U') <= $b->get_date('U'); + } + + /** + * @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 (is_a($arg, '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('SimplePie', '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(); + } + } +} + +class SimplePie_Item +{ + var $feed; + var $data = array(); + + function SimplePie_Item($feed, $data) + { + $this->feed = $feed; + $this->data = $data; + } + + function __toString() + { + return md5(serialize($this->data)); + } + + /** + * Remove items that link back to this before destroying this object + */ + function __destruct() + { + if ((version_compare(PHP_VERSION, '5.3', '<') || !gc_enabled()) && !ini_get('zend.ze1_compatibility_mode')) + { + unset($this->feed); + } + } + + function get_item_tags($namespace, $tag) + { + if (isset($this->data['child'][$namespace][$tag])) + { + return $this->data['child'][$namespace][$tag]; + } + else + { + return null; + } + } + + function get_base($element = array()) + { + return $this->feed->get_base($element); + } + + function sanitize($data, $type, $base = '') + { + return $this->feed->sanitize($data, $type, $base); + } + + function get_feed() + { + return $this->feed; + } + + 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 (($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)); + } + } + + 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'], SimplePie_Misc::atom_10_construct_type($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'], SimplePie_Misc::atom_03_construct_type($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']; + } + + function get_description($description_only = false) + { + if ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'summary')) + { + return $this->sanitize($return[0]['data'], SimplePie_Misc::atom_10_construct_type($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'], SimplePie_Misc::atom_03_construct_type($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 (!$description_only) + { + return $this->get_content(true); + } + else + { + return null; + } + } + + function get_content($content_only = false) + { + if ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'content')) + { + return $this->sanitize($return[0]['data'], SimplePie_Misc::atom_10_content_construct_type($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'], SimplePie_Misc::atom_03_construct_type($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; + } + } + + function get_category($key = 0) + { + $categories = $this->get_categories(); + if (isset($categories[$key])) + { + return $categories[$key]; + } + else + { + return null; + } + } + + 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[] =& new $this->feed->category_class($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[] =& new $this->feed->category_class($term, $scheme, null); + } + foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_11, 'subject') as $category) + { + $categories[] =& new $this->feed->category_class($this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null); + } + foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_10, 'subject') as $category) + { + $categories[] =& new $this->feed->category_class($this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null); + } + + if (!empty($categories)) + { + return SimplePie_Misc::array_unique($categories); + } + else + { + return null; + } + } + + function get_author($key = 0) + { + $authors = $this->get_authors(); + if (isset($authors[$key])) + { + return $authors[$key]; + } + else + { + return null; + } + } + + function get_contributor($key = 0) + { + $contributors = $this->get_contributors(); + if (isset($contributors[$key])) + { + return $contributors[$key]; + } + else + { + return null; + } + } + + 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[] =& new $this->feed->author_class($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[] =& new $this->feed->author_class($name, $url, $email); + } + } + + if (!empty($contributors)) + { + return SimplePie_Misc::array_unique($contributors); + } + else + { + return null; + } + } + + 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[] =& new $this->feed->author_class($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[] =& new $this->feed->author_class($name, $url, $email); + } + } + if ($author = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'author')) + { + $authors[] =& new $this->feed->author_class(null, null, $this->sanitize($author[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT)); + } + foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_11, 'creator') as $author) + { + $authors[] =& new $this->feed->author_class($this->sanitize($author['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null); + } + foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_10, 'creator') as $author) + { + $authors[] =& new $this->feed->author_class($this->sanitize($author['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null); + } + foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'author') as $author) + { + $authors[] =& new $this->feed->author_class($this->sanitize($author['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null); + } + + if (!empty($authors)) + { + return SimplePie_Misc::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; + } + } + + function get_copyright() + { + if ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'rights')) + { + return $this->sanitize($return[0]['data'], SimplePie_Misc::atom_10_construct_type($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; + } + } + + 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 = SimplePie_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; + } + } + + 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) + { + return strftime($date_format, $date); + } + else + { + return null; + } + } + + 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; + } + } + + function get_link($key = 0, $rel = 'alternate') + { + $links = $this->get_links($rel); + if ($links[$key] !== null) + { + return $links[$key]; + } + else + { + return null; + } + } + + 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 (SimplePie_Misc::is_isegment_nz_nc($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; + } + } + + /** + * @todo Add ability to prefer one type of content over another (in a media group). + */ + function get_enclosure($key = 0, $prefer = null) + { + $enclosures = $this->get_enclosures(); + if (isset($enclosures[$key])) + { + return $enclosures[$key]; + } + else + { + return null; + } + } + + /** + * Grabs all available enclosures (podcasts, etc.) + * + * Supports the 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. + * + * @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). + */ + 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[] =& new $this->feed->caption_class($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[] =& new $this->feed->caption_class($caption_type, $caption_lang, $caption_startTime, $caption_endTime, $caption_text); + } + } + if (is_array($captions_parent)) + { + $captions_parent = array_values(SimplePie_Misc::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[] =& new $this->feed->category_class($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[] =& new $this->feed->category_class($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[] =& new $this->feed->category_class($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[] =& new $this->feed->category_class($term, $scheme, $label); + } + } + } + if (is_array($categories_parent)) + { + $categories_parent = array_values(SimplePie_Misc::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 =& new $this->feed->copyright_class($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 =& new $this->feed->copyright_class($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[] =& new $this->feed->credit_class($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[] =& new $this->feed->credit_class($credit_role, $credit_scheme, $credit_name); + } + } + if (is_array($credits_parent)) + { + $credits_parent = array_values(SimplePie_Misc::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(SimplePie_Misc::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(SimplePie_Misc::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[] =& new $this->feed->rating_class($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[] =& new $this->feed->rating_class($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[] =& new $this->feed->rating_class($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[] =& new $this->feed->rating_class($rating_scheme, $rating_value); + } + } + if (is_array($ratings_parent)) + { + $ratings_parent = array_values(SimplePie_Misc::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[] =& new $this->feed->restriction_class($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[] =& new $this->feed->restriction_class($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[] =& new $this->feed->restriction_class($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[] =& new $this->feed->restriction_class($restriction_relationship, $restriction_type, $restriction_value); + } + } + if (is_array($restrictions_parent)) + { + $restrictions_parent = array_values(SimplePie_Misc::array_unique($restrictions_parent)); + } + + // 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 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[] =& new $this->feed->caption_class($caption_type, $caption_lang, $caption_startTime, $caption_endTime, $caption_text); + } + if (is_array($captions)) + { + $captions = array_values(SimplePie_Misc::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[] =& new $this->feed->caption_class($caption_type, $caption_lang, $caption_startTime, $caption_endTime, $caption_text); + } + if (is_array($captions)) + { + $captions = array_values(SimplePie_Misc::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[] =& new $this->feed->category_class($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[] =& new $this->feed->category_class($term, $scheme, $label); + } + } + if (is_array($categories) && is_array($categories_parent)) + { + $categories = array_values(SimplePie_Misc::array_unique(array_merge($categories, $categories_parent))); + } + elseif (is_array($categories)) + { + $categories = array_values(SimplePie_Misc::array_unique($categories)); + } + elseif (is_array($categories_parent)) + { + $categories = array_values(SimplePie_Misc::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 =& new $this->feed->copyright_class($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 =& new $this->feed->copyright_class($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[] =& new $this->feed->credit_class($credit_role, $credit_scheme, $credit_name); + } + if (is_array($credits)) + { + $credits = array_values(SimplePie_Misc::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[] =& new $this->feed->credit_class($credit_role, $credit_scheme, $credit_name); + } + if (is_array($credits)) + { + $credits = array_values(SimplePie_Misc::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(SimplePie_Misc::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(SimplePie_Misc::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(SimplePie_Misc::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(SimplePie_Misc::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[] =& new $this->feed->rating_class($rating_scheme, $rating_value); + } + if (is_array($ratings)) + { + $ratings = array_values(SimplePie_Misc::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[] =& new $this->feed->rating_class($rating_scheme, $rating_value); + } + if (is_array($ratings)) + { + $ratings = array_values(SimplePie_Misc::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[] =& new $this->feed->restriction_class($restriction_relationship, $restriction_type, $restriction_value); + } + if (is_array($restrictions)) + { + $restrictions = array_values(SimplePie_Misc::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[] =& new $this->feed->restriction_class($restriction_relationship, $restriction_type, $restriction_value); + } + if (is_array($restrictions)) + { + $restrictions = array_values(SimplePie_Misc::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(SimplePie_Misc::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(SimplePie_Misc::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'][] =& new $this->feed->enclosure_class($url, $type, $length, $this->feed->javascript, $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'])) + { + // 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[] =& new $this->feed->caption_class($caption_type, $caption_lang, $caption_startTime, $caption_endTime, $caption_text); + } + if (is_array($captions)) + { + $captions = array_values(SimplePie_Misc::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[] =& new $this->feed->category_class($term, $scheme, $label); + } + } + if (is_array($categories) && is_array($categories_parent)) + { + $categories = array_values(SimplePie_Misc::array_unique(array_merge($categories, $categories_parent))); + } + elseif (is_array($categories)) + { + $categories = array_values(SimplePie_Misc::array_unique($categories)); + } + elseif (is_array($categories_parent)) + { + $categories = array_values(SimplePie_Misc::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 =& new $this->feed->copyright_class($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[] =& new $this->feed->credit_class($credit_role, $credit_scheme, $credit_name); + } + if (is_array($credits)) + { + $credits = array_values(SimplePie_Misc::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(SimplePie_Misc::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(SimplePie_Misc::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[] =& new $this->feed->rating_class($rating_scheme, $rating_value); + } + if (is_array($ratings)) + { + $ratings = array_values(SimplePie_Misc::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[] =& new $this->feed->restriction_class($restriction_relationship, $restriction_type, $restriction_value); + } + if (is_array($restrictions)) + { + $restrictions = array_values(SimplePie_Misc::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(SimplePie_Misc::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'][] =& new $this->feed->enclosure_class($url, $type, $length, $this->feed->javascript, $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'][] =& new $this->feed->enclosure_class($url, $type, $length, $this->feed->javascript, $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'][] =& new $this->feed->enclosure_class($url, $type, $length, $this->feed->javascript, $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'][] =& new $this->feed->enclosure_class($url, $type, $length, $this->feed->javascript, $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'][] =& new $this->feed->enclosure_class($url, $type, $length, $this->feed->javascript, $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(SimplePie_Misc::array_unique($this->data['enclosures'])); + } + if (!empty($this->data['enclosures'])) + { + return $this->data['enclosures']; + } + else + { + return null; + } + } + + 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]+))$/', $return[0]['data'], $match)) + { + return (float) $match[1]; + } + else + { + return null; + } + } + + 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]+))$/', $return[0]['data'], $match)) + { + return (float) $match[2]; + } + else + { + return null; + } + } + + function get_source() + { + if ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'source')) + { + return new $this->feed->source_class($this, $return[0]); + } + else + { + return null; + } + } + + /** + * Creates the add_to_* methods' return data + * + * @access private + * @param string $item_url String to prefix to the item permalink + * @param string $title_url String to prefix to the item title + * (and suffix to the item permalink) + * @return mixed URL if feed exists, false otherwise + */ + function add_to_service($item_url, $title_url = null, $summary_url = null) + { + if ($this->get_permalink() !== null) + { + $return = $item_url . rawurlencode($this->get_permalink()); + if ($title_url !== null && $this->get_title() !== null) + { + $return .= $title_url . rawurlencode($this->get_title()); + } + if ($summary_url !== null && $this->get_description() !== null) + { + $return .= $summary_url . rawurlencode($this->get_description()); + } + return $this->sanitize($return, SIMPLEPIE_CONSTRUCT_IRI); + } + else + { + return null; + } + } + + function add_to_blinklist() + { + return $this->add_to_service('http://www.blinklist.com/index.php?Action=Blink/addblink.php&Description=&Url=', '&Title='); + } + + function add_to_blogmarks() + { + return $this->add_to_service('http://blogmarks.net/my/new.php?mini=1&simple=1&url=', '&title='); + } + + function add_to_delicious() + { + return $this->add_to_service('http://del.icio.us/post/?v=4&url=', '&title='); + } + + function add_to_digg() + { + return $this->add_to_service('http://digg.com/submit?url=', '&title=', '&bodytext='); + } + + function add_to_furl() + { + return $this->add_to_service('http://www.furl.net/storeIt.jsp?u=', '&t='); + } + + function add_to_magnolia() + { + return $this->add_to_service('http://ma.gnolia.com/bookmarklet/add?url=', '&title='); + } + + function add_to_myweb20() + { + return $this->add_to_service('http://myweb2.search.yahoo.com/myresults/bookmarklet?u=', '&t='); + } + + function add_to_newsvine() + { + return $this->add_to_service('http://www.newsvine.com/_wine/save?u=', '&h='); + } + + function add_to_reddit() + { + return $this->add_to_service('http://reddit.com/submit?url=', '&title='); + } + + function add_to_segnalo() + { + return $this->add_to_service('http://segnalo.com/post.html.php?url=', '&title='); + } + + function add_to_simpy() + { + return $this->add_to_service('http://www.simpy.com/simpy/LinkAdd.do?href=', '&title='); + } + + function add_to_spurl() + { + return $this->add_to_service('http://www.spurl.net/spurl.php?v=3&url=', '&title='); + } + + function add_to_wists() + { + return $this->add_to_service('http://wists.com/r.php?c=&r=', '&title='); + } + + function search_technorati() + { + return $this->add_to_service('http://www.technorati.com/search/'); + } +} + +class SimplePie_Source +{ + var $item; + var $data = array(); + + function SimplePie_Source($item, $data) + { + $this->item = $item; + $this->data = $data; + } + + function __toString() + { + return md5(serialize($this->data)); + } + + function get_source_tags($namespace, $tag) + { + if (isset($this->data['child'][$namespace][$tag])) + { + return $this->data['child'][$namespace][$tag]; + } + else + { + return null; + } + } + + function get_base($element = array()) + { + return $this->item->get_base($element); + } + + function sanitize($data, $type, $base = '') + { + return $this->item->sanitize($data, $type, $base); + } + + function get_item() + { + return $this->item; + } + + function get_title() + { + if ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'title')) + { + return $this->sanitize($return[0]['data'], SimplePie_Misc::atom_10_construct_type($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'], SimplePie_Misc::atom_03_construct_type($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; + } + } + + function get_category($key = 0) + { + $categories = $this->get_categories(); + if (isset($categories[$key])) + { + return $categories[$key]; + } + else + { + return null; + } + } + + 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[] =& new $this->item->feed->category_class($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[] =& new $this->item->feed->category_class($term, $scheme, null); + } + foreach ((array) $this->get_source_tags(SIMPLEPIE_NAMESPACE_DC_11, 'subject') as $category) + { + $categories[] =& new $this->item->feed->category_class($this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null); + } + foreach ((array) $this->get_source_tags(SIMPLEPIE_NAMESPACE_DC_10, 'subject') as $category) + { + $categories[] =& new $this->item->feed->category_class($this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null); + } + + if (!empty($categories)) + { + return SimplePie_Misc::array_unique($categories); + } + else + { + return null; + } + } + + function get_author($key = 0) + { + $authors = $this->get_authors(); + if (isset($authors[$key])) + { + return $authors[$key]; + } + else + { + return null; + } + } + + 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[] =& new $this->item->feed->author_class($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[] =& new $this->item->feed->author_class($name, $url, $email); + } + } + foreach ((array) $this->get_source_tags(SIMPLEPIE_NAMESPACE_DC_11, 'creator') as $author) + { + $authors[] =& new $this->item->feed->author_class($this->sanitize($author['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null); + } + foreach ((array) $this->get_source_tags(SIMPLEPIE_NAMESPACE_DC_10, 'creator') as $author) + { + $authors[] =& new $this->item->feed->author_class($this->sanitize($author['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null); + } + foreach ((array) $this->get_source_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'author') as $author) + { + $authors[] =& new $this->item->feed->author_class($this->sanitize($author['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null); + } + + if (!empty($authors)) + { + return SimplePie_Misc::array_unique($authors); + } + else + { + return null; + } + } + + function get_contributor($key = 0) + { + $contributors = $this->get_contributors(); + if (isset($contributors[$key])) + { + return $contributors[$key]; + } + else + { + return null; + } + } + + 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[] =& new $this->item->feed->author_class($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[] =& new $this->item->feed->author_class($name, $url, $email); + } + } + + if (!empty($contributors)) + { + return SimplePie_Misc::array_unique($contributors); + } + else + { + return null; + } + } + + 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. + */ + function get_permalink() + { + return $this->get_link(0); + } + + 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 (SimplePie_Misc::is_isegment_nz_nc($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; + } + } + + function get_description() + { + if ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'subtitle')) + { + return $this->sanitize($return[0]['data'], SimplePie_Misc::atom_10_construct_type($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'], SimplePie_Misc::atom_03_construct_type($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; + } + } + + function get_copyright() + { + if ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'rights')) + { + return $this->sanitize($return[0]['data'], SimplePie_Misc::atom_10_construct_type($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'], SimplePie_Misc::atom_03_construct_type($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; + } + } + + 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; + } + } + + 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]+))$/', $return[0]['data'], $match)) + { + return (float) $match[1]; + } + else + { + return null; + } + } + + 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]+))$/', $return[0]['data'], $match)) + { + return (float) $match[2]; + } + else + { + return null; + } + } + + 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; + } + } +} + +class SimplePie_Author +{ + var $name; + var $link; + var $email; + + // Constructor, used to input the data + function SimplePie_Author($name = null, $link = null, $email = null) + { + $this->name = $name; + $this->link = $link; + $this->email = $email; + } + + function __toString() + { + // There is no $this->data here + return md5(serialize($this)); + } + + function get_name() + { + if ($this->name !== null) + { + return $this->name; + } + else + { + return null; + } + } + + function get_link() + { + if ($this->link !== null) + { + return $this->link; + } + else + { + return null; + } + } + + function get_email() + { + if ($this->email !== null) + { + return $this->email; + } + else + { + return null; + } + } +} + +class SimplePie_Category +{ + var $term; + var $scheme; + var $label; + + // Constructor, used to input the data + function SimplePie_Category($term = null, $scheme = null, $label = null) + { + $this->term = $term; + $this->scheme = $scheme; + $this->label = $label; + } + + function __toString() + { + // There is no $this->data here + return md5(serialize($this)); + } + + function get_term() + { + if ($this->term !== null) + { + return $this->term; + } + else + { + return null; + } + } + + function get_scheme() + { + if ($this->scheme !== null) + { + return $this->scheme; + } + else + { + return null; + } + } + + function get_label() + { + if ($this->label !== null) + { + return $this->label; + } + else + { + return $this->get_term(); + } + } +} + +class SimplePie_Enclosure +{ + var $bitrate; + var $captions; + var $categories; + var $channels; + var $copyright; + var $credits; + var $description; + var $duration; + var $expression; + var $framerate; + var $handler; + var $hashes; + var $height; + var $javascript; + var $keywords; + var $lang; + var $length; + var $link; + var $medium; + var $player; + var $ratings; + var $restrictions; + var $samplingrate; + var $thumbnails; + var $title; + var $type; + var $width; + + // Constructor, used to input the data + function SimplePie_Enclosure($link = null, $type = null, $length = null, $javascript = null, $bitrate = null, $captions = null, $categories = null, $channels = null, $copyright = null, $credits = null, $description = null, $duration = null, $expression = null, $framerate = null, $hashes = null, $height = null, $keywords = null, $lang = null, $medium = null, $player = null, $ratings = null, $restrictions = null, $samplingrate = null, $thumbnails = null, $title = null, $width = null) + { + $this->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->javascript = $javascript; + $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 + } + + function __toString() + { + // There is no $this->data here + return md5(serialize($this)); + } + + function get_bitrate() + { + if ($this->bitrate !== null) + { + return $this->bitrate; + } + else + { + return null; + } + } + + function get_caption($key = 0) + { + $captions = $this->get_captions(); + if (isset($captions[$key])) + { + return $captions[$key]; + } + else + { + return null; + } + } + + function get_captions() + { + if ($this->captions !== null) + { + return $this->captions; + } + else + { + return null; + } + } + + function get_category($key = 0) + { + $categories = $this->get_categories(); + if (isset($categories[$key])) + { + return $categories[$key]; + } + else + { + return null; + } + } + + function get_categories() + { + if ($this->categories !== null) + { + return $this->categories; + } + else + { + return null; + } + } + + function get_channels() + { + if ($this->channels !== null) + { + return $this->channels; + } + else + { + return null; + } + } + + function get_copyright() + { + if ($this->copyright !== null) + { + return $this->copyright; + } + else + { + return null; + } + } + + function get_credit($key = 0) + { + $credits = $this->get_credits(); + if (isset($credits[$key])) + { + return $credits[$key]; + } + else + { + return null; + } + } + + function get_credits() + { + if ($this->credits !== null) + { + return $this->credits; + } + else + { + return null; + } + } + + function get_description() + { + if ($this->description !== null) + { + return $this->description; + } + else + { + return null; + } + } + + 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; + } + } + + function get_expression() + { + if ($this->expression !== null) + { + return $this->expression; + } + else + { + return 'full'; + } + } + + 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; + } + + function get_framerate() + { + if ($this->framerate !== null) + { + return $this->framerate; + } + else + { + return null; + } + } + + function get_handler() + { + return $this->get_real_type(true); + } + + function get_hash($key = 0) + { + $hashes = $this->get_hashes(); + if (isset($hashes[$key])) + { + return $hashes[$key]; + } + else + { + return null; + } + } + + function get_hashes() + { + if ($this->hashes !== null) + { + return $this->hashes; + } + else + { + return null; + } + } + + function get_height() + { + if ($this->height !== null) + { + return $this->height; + } + else + { + return null; + } + } + + function get_language() + { + if ($this->lang !== null) + { + return $this->lang; + } + else + { + return null; + } + } + + function get_keyword($key = 0) + { + $keywords = $this->get_keywords(); + if (isset($keywords[$key])) + { + return $keywords[$key]; + } + else + { + return null; + } + } + + function get_keywords() + { + if ($this->keywords !== null) + { + return $this->keywords; + } + else + { + return null; + } + } + + function get_length() + { + if ($this->length !== null) + { + return $this->length; + } + else + { + return null; + } + } + + function get_link() + { + if ($this->link !== null) + { + return urldecode($this->link); + } + else + { + return null; + } + } + + function get_medium() + { + if ($this->medium !== null) + { + return $this->medium; + } + else + { + return null; + } + } + + function get_player() + { + if ($this->player !== null) + { + return $this->player; + } + else + { + return null; + } + } + + function get_rating($key = 0) + { + $ratings = $this->get_ratings(); + if (isset($ratings[$key])) + { + return $ratings[$key]; + } + else + { + return null; + } + } + + function get_ratings() + { + if ($this->ratings !== null) + { + return $this->ratings; + } + else + { + return null; + } + } + + function get_restriction($key = 0) + { + $restrictions = $this->get_restrictions(); + if (isset($restrictions[$key])) + { + return $restrictions[$key]; + } + else + { + return null; + } + } + + function get_restrictions() + { + if ($this->restrictions !== null) + { + return $this->restrictions; + } + else + { + return null; + } + } + + function get_sampling_rate() + { + if ($this->samplingrate !== null) + { + return $this->samplingrate; + } + else + { + return null; + } + } + + function get_size() + { + $length = $this->get_length(); + if ($length !== null) + { + return round($length/1048576, 2); + } + else + { + return null; + } + } + + function get_thumbnail($key = 0) + { + $thumbnails = $this->get_thumbnails(); + if (isset($thumbnails[$key])) + { + return $thumbnails[$key]; + } + else + { + return null; + } + } + + function get_thumbnails() + { + if ($this->thumbnails !== null) + { + return $this->thumbnails; + } + else + { + return null; + } + } + + function get_title() + { + if ($this->title !== null) + { + return $this->title; + } + else + { + return null; + } + } + + function get_type() + { + if ($this->type !== null) + { + return $this->type; + } + else + { + return null; + } + } + + function get_width() + { + if ($this->width !== null) + { + return $this->width; + } + else + { + return null; + } + } + + function native_embed($options='') + { + return $this->embed($options, true); + } + + /** + * @todo If the dimensions for media:content are defined, use them when width/height are set to 'auto'. + */ + 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 = ''; + + // Make sure the JS library is included + if (!$native) + { + static $javascript_outputted = null; + if (!$javascript_outputted && $this->javascript) + { + $embed .= ''; + $javascript_outputted = true; + } + } + + // Odeo Feed MP3's + if ($handler === 'odeo') + { + if ($native) + { + $embed .= ''; + } + else + { + $embed .= ''; + } + } + + // Flash + elseif ($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; + } + + function get_real_type($find_handler = false) + { + // If it's Odeo, let's get it out of the way. + if (substr(strtolower($this->get_link()), 0, 15) === 'http://odeo.com') + { + return 'odeo'; + } + + // 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; + } + } +} + +class SimplePie_Caption +{ + var $type; + var $lang; + var $startTime; + var $endTime; + var $text; + + // Constructor, used to input the data + function SimplePie_Caption($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; + } + + function __toString() + { + // There is no $this->data here + return md5(serialize($this)); + } + + function get_endtime() + { + if ($this->endTime !== null) + { + return $this->endTime; + } + else + { + return null; + } + } + + function get_language() + { + if ($this->lang !== null) + { + return $this->lang; + } + else + { + return null; + } + } + + function get_starttime() + { + if ($this->startTime !== null) + { + return $this->startTime; + } + else + { + return null; + } + } + + function get_text() + { + if ($this->text !== null) + { + return $this->text; + } + else + { + return null; + } + } + + function get_type() + { + if ($this->type !== null) + { + return $this->type; + } + else + { + return null; + } + } +} + +class SimplePie_Credit +{ + var $role; + var $scheme; + var $name; + + // Constructor, used to input the data + function SimplePie_Credit($role = null, $scheme = null, $name = null) + { + $this->role = $role; + $this->scheme = $scheme; + $this->name = $name; + } + + function __toString() + { + // There is no $this->data here + return md5(serialize($this)); + } + + function get_role() + { + if ($this->role !== null) + { + return $this->role; + } + else + { + return null; + } + } + + function get_scheme() + { + if ($this->scheme !== null) + { + return $this->scheme; + } + else + { + return null; + } + } + + function get_name() + { + if ($this->name !== null) + { + return $this->name; + } + else + { + return null; + } + } +} + +class SimplePie_Copyright +{ + var $url; + var $label; + + // Constructor, used to input the data + function SimplePie_Copyright($url = null, $label = null) + { + $this->url = $url; + $this->label = $label; + } + + function __toString() + { + // There is no $this->data here + return md5(serialize($this)); + } + + function get_url() + { + if ($this->url !== null) + { + return $this->url; + } + else + { + return null; + } + } + + function get_attribution() + { + if ($this->label !== null) + { + return $this->label; + } + else + { + return null; + } + } +} + +class SimplePie_Rating +{ + var $scheme; + var $value; + + // Constructor, used to input the data + function SimplePie_Rating($scheme = null, $value = null) + { + $this->scheme = $scheme; + $this->value = $value; + } + + function __toString() + { + // There is no $this->data here + return md5(serialize($this)); + } + + function get_scheme() + { + if ($this->scheme !== null) + { + return $this->scheme; + } + else + { + return null; + } + } + + function get_value() + { + if ($this->value !== null) + { + return $this->value; + } + else + { + return null; + } + } +} + +class SimplePie_Restriction +{ + var $relationship; + var $type; + var $value; + + // Constructor, used to input the data + function SimplePie_Restriction($relationship = null, $type = null, $value = null) + { + $this->relationship = $relationship; + $this->type = $type; + $this->value = $value; + } + + function __toString() + { + // There is no $this->data here + return md5(serialize($this)); + } + + function get_relationship() + { + if ($this->relationship !== null) + { + return $this->relationship; + } + else + { + return null; + } + } + + function get_type() + { + if ($this->type !== null) + { + return $this->type; + } + else + { + return null; + } + } + + function get_value() + { + if ($this->value !== null) + { + return $this->value; + } + else + { + return null; + } + } +} + +/** + * @todo Move to properly supporting RFC2616 (HTTP/1.1) + */ +class SimplePie_File +{ + var $url; + var $useragent; + var $success = true; + var $headers = array(); + var $body; + var $status_code; + var $redirects = 0; + var $error; + var $method = SIMPLEPIE_FILE_SOURCE_NONE; + + function SimplePie_File($url, $timeout = 10, $redirects = 5, $headers = null, $useragent = null, $force_fsockopen = false) + { + if (class_exists('idna_convert')) + { + $idn =& new idna_convert; + $parsed = SimplePie_Misc::parse_url($url); + $url = SimplePie_Misc::compress_parse_url($parsed['scheme'], $idn->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->SimplePie_File($location, $timeout, $redirects, $headers, $useragent, $force_fsockopen); + } + } + } + } + else + { + $this->method = SIMPLEPIE_FILE_SOURCE_REMOTE | SIMPLEPIE_FILE_SOURCE_FSOCKOPEN; + $url_parts = parse_url($url); + if (isset($url_parts['scheme']) && strtolower($url_parts['scheme']) === 'https') + { + $url_parts['host'] = "ssl://$url_parts[host]"; + $url_parts['port'] = 443; + } + if (!isset($url_parts['port'])) + { + $url_parts['port'] = 80; + } + $fp = @fsockopen($url_parts['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.0\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->SimplePie_File($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 (($body = gzuncompress($this->body)) === false) + { + if (($body = gzinflate($this->body)) === false) + { + $this->error = 'Unable to decode HTTP "deflate" stream'; + $this->success = false; + } + } + $this->body = $body; + 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; + } + } + } +} + +/** + * HTTP Response Parser + * + * @package SimplePie + */ +class SimplePie_HTTP_Parser +{ + /** + * HTTP Version + * + * @access public + * @var float + */ + var $http_version = 0.0; + + /** + * Status code + * + * @access public + * @var int + */ + var $status_code = 0; + + /** + * Reason phrase + * + * @access public + * @var string + */ + var $reason = ''; + + /** + * Key/value pairs of the headers + * + * @access public + * @var array + */ + var $headers = array(); + + /** + * Body of the response + * + * @access public + * @var string + */ + var $body = ''; + + /** + * Current state of the state machine + * + * @access private + * @var string + */ + var $state = 'http_version'; + + /** + * 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; + + /** + * Name of the hedaer currently being parsed + * + * @access private + * @var string + */ + var $name = ''; + + /** + * Value of the hedaer currently being parsed + * + * @access private + * @var string + */ + var $value = ''; + + /** + * Create an instance of the class with the input data + * + * @access public + * @param string $data Input data + */ + function SimplePie_HTTP_Parser($data) + { + $this->data = $data; + $this->data_length = strlen($this->data); + } + + /** + * Parse the input data + * + * @access public + * @return bool true on success, false on failure + */ + 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 + * + * @access private + * @return bool true if there is further data, false if not + */ + function has_data() + { + return (bool) ($this->position < $this->data_length); + } + + /** + * See if the next character is LWS + * + * @access private + * @return bool true if the next character is LWS, false if not + */ + 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 + * + * @access private + */ + 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 + * + * @access private + */ + 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 + * + * @access private + */ + 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 + * + * @access private + */ + function new_line() + { + $this->value = trim($this->value, "\x0D\x20"); + if ($this->name !== '' && $this->value !== '') + { + $this->name = strtolower($this->name); + if (isset($this->headers[$this->name])) + { + $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 + * + * @access private + */ + 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 + * + * @access private + */ + 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 + * + * @access private + */ + function value() + { + if ($this->is_linear_whitespace()) + { + $this->linear_whitespace(); + } + else + { + switch ($this->data[$this->position]) + { + case '"': + $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 + * + * @access private + */ + 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 + * + * @access private + */ + 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 + * + * @access private + */ + 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 + * + * @access private + */ + function quote_escaped() + { + $this->value .= $this->data[$this->position]; + $this->position++; + $this->state = 'quote'; + } + + /** + * Parse the body + * + * @access private + */ + function body() + { + $this->body = substr($this->data, $this->position); + $this->state = 'emit'; + } +} + +/** + * gzdecode + * + * @package SimplePie + */ +class SimplePie_gzdecode +{ + /** + * Compressed data + * + * @access private + * @see gzdecode::$data + */ + var $compressed_data; + + /** + * Size of compressed data + * + * @access private + */ + var $compressed_size; + + /** + * Minimum size of a valid gzip string + * + * @access private + */ + var $min_compressed_size = 18; + + /** + * Current position of pointer + * + * @access private + */ + var $position = 0; + + /** + * Flags (FLG) + * + * @access private + */ + var $flags; + + /** + * Uncompressed data + * + * @access public + * @see gzdecode::$compressed_data + */ + var $data; + + /** + * Modified time + * + * @access public + */ + var $MTIME; + + /** + * Extra Flags + * + * @access public + */ + var $XFL; + + /** + * Operating System + * + * @access public + */ + var $OS; + + /** + * Subfield ID 1 + * + * @access public + * @see gzdecode::$extra_field + * @see gzdecode::$SI2 + */ + var $SI1; + + /** + * Subfield ID 2 + * + * @access public + * @see gzdecode::$extra_field + * @see gzdecode::$SI1 + */ + var $SI2; + + /** + * Extra field content + * + * @access public + * @see gzdecode::$SI1 + * @see gzdecode::$SI2 + */ + var $extra_field; + + /** + * Original filename + * + * @access public + */ + var $filename; + + /** + * Human readable comment + * + * @access public + */ + var $comment; + + /** + * Don't allow anything to be set + * + * @access public + */ + function __set($name, $value) + { + trigger_error("Cannot write property $name", E_USER_ERROR); + } + + /** + * Set the compressed string and related properties + * + * @access public + */ + function SimplePie_gzdecode($data) + { + $this->compressed_data = $data; + $this->compressed_size = strlen($data); + } + + /** + * Decode the GZIP stream + * + * @access 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))); + $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; + } + } +} + +class SimplePie_Cache +{ + /** + * Don't call the constructor. Please. + * + * @access private + */ + function SimplePie_Cache() + { + trigger_error('Please call SimplePie_Cache::create() instead of the constructor', E_USER_ERROR); + } + + /** + * Create a new SimplePie_Cache object + * + * @static + * @access public + */ + function create($location, $filename, $extension) + { + $location_iri =& new SimplePie_IRI($location); + switch ($location_iri->get_scheme()) + { + case 'mysql': + if (extension_loaded('mysql')) + { + return new SimplePie_Cache_MySQL($location_iri, $filename, $extension); + } + break; + + default: + return new SimplePie_Cache_File($location, $filename, $extension); + } + } +} + +class SimplePie_Cache_File +{ + var $location; + var $filename; + var $extension; + var $name; + + function SimplePie_Cache_File($location, $filename, $extension) + { + $this->location = $location; + $this->filename = $filename; + $this->extension = $extension; + $this->name = "$this->location/$this->filename.$this->extension"; + } + + function save($data) + { + if (file_exists($this->name) && is_writeable($this->name) || file_exists($this->location) && is_writeable($this->location)) + { + if (is_a($data, 'SimplePie')) + { + $data = $data->data; + } + + $data = serialize($data); + + if (function_exists('file_put_contents')) + { + return (bool) file_put_contents($this->name, $data); + } + else + { + $fp = fopen($this->name, 'wb'); + if ($fp) + { + fwrite($fp, $data); + fclose($fp); + return true; + } + } + } + return false; + } + + function load() + { + if (file_exists($this->name) && is_readable($this->name)) + { + return unserialize(file_get_contents($this->name)); + } + return false; + } + + function mtime() + { + if (file_exists($this->name)) + { + return filemtime($this->name); + } + return false; + } + + function touch() + { + if (file_exists($this->name)) + { + return touch($this->name); + } + return false; + } + + function unlink() + { + if (file_exists($this->name)) + { + return unlink($this->name); + } + return false; + } +} + +class SimplePie_Cache_DB +{ + function prepare_simplepie_object_for_cache($data) + { + $items = $data->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); + } +} + +class SimplePie_Cache_MySQL extends SimplePie_Cache_DB +{ + var $mysql; + var $options; + var $id; + + function SimplePie_Cache_MySQL($mysql_location, $name, $extension) + { + $host = $mysql_location->get_host(); + if (SimplePie_Misc::stripos($host, 'unix(') === 0 && substr($host, -1) === ')') + { + $server = ':' . substr($host, 5, -1); + } + else + { + $server = $host; + if ($mysql_location->get_port() !== null) + { + $server .= ':' . $mysql_location->get_port(); + } + } + + if (strpos($mysql_location->get_userinfo(), ':') !== false) + { + list($username, $password) = explode(':', $mysql_location->get_userinfo(), 2); + } + else + { + $username = $mysql_location->get_userinfo(); + $password = null; + } + + if ($this->mysql = mysql_connect($server, $username, $password)) + { + $this->id = $name . $extension; + $this->options = SimplePie_Misc::parse_str($mysql_location->get_query()); + if (!isset($this->options['prefix'][0])) + { + $this->options['prefix'][0] = ''; + } + + if (mysql_select_db(ltrim($mysql_location->get_path(), '/')) + && mysql_query('SET NAMES utf8') + && ($query = mysql_unbuffered_query('SHOW TABLES'))) + { + $db = array(); + while ($row = mysql_fetch_row($query)) + { + $db[] = $row[0]; + } + + if (!in_array($this->options['prefix'][0] . 'cache_data', $db)) + { + if (!mysql_query('CREATE TABLE `' . $this->options['prefix'][0] . '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)))')) + { + $this->mysql = null; + } + } + + if (!in_array($this->options['prefix'][0] . 'items', $db)) + { + if (!mysql_query('CREATE TABLE `' . $this->options['prefix'][0] . '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)))')) + { + $this->mysql = null; + } + } + } + else + { + $this->mysql = null; + } + } + } + + function save($data) + { + if ($this->mysql) + { + $feed_id = "'" . mysql_real_escape_string($this->id) . "'"; + + if (is_a($data, 'SimplePie')) + { + if (SIMPLEPIE_PHP5) + { + // This keyword needs to defy coding standards for PHP4 compatibility + $data = clone($data); + } + + $prepared = $this->prepare_simplepie_object_for_cache($data); + + if ($query = mysql_query('SELECT `id` FROM `' . $this->options['prefix'][0] . 'cache_data` WHERE `id` = ' . $feed_id, $this->mysql)) + { + if (mysql_num_rows($query)) + { + $items = count($prepared[1]); + if ($items) + { + $sql = 'UPDATE `' . $this->options['prefix'][0] . 'cache_data` SET `items` = ' . $items . ', `data` = \'' . mysql_real_escape_string($prepared[0]) . '\', `mtime` = ' . time() . ' WHERE `id` = ' . $feed_id; + } + else + { + $sql = 'UPDATE `' . $this->options['prefix'][0] . 'cache_data` SET `data` = \'' . mysql_real_escape_string($prepared[0]) . '\', `mtime` = ' . time() . ' WHERE `id` = ' . $feed_id; + } + + if (!mysql_query($sql, $this->mysql)) + { + return false; + } + } + elseif (!mysql_query('INSERT INTO `' . $this->options['prefix'][0] . 'cache_data` (`id`, `items`, `data`, `mtime`) VALUES(' . $feed_id . ', ' . count($prepared[1]) . ', \'' . mysql_real_escape_string($prepared[0]) . '\', ' . time() . ')', $this->mysql)) + { + return false; + } + + $ids = array_keys($prepared[1]); + if (!empty($ids)) + { + foreach ($ids as $id) + { + $database_ids[] = mysql_real_escape_string($id); + } + + if ($query = mysql_unbuffered_query('SELECT `id` FROM `' . $this->options['prefix'][0] . 'items` WHERE `id` = \'' . implode('\' OR `id` = \'', $database_ids) . '\' AND `feed_id` = ' . $feed_id, $this->mysql)) + { + $existing_ids = array(); + while ($row = mysql_fetch_row($query)) + { + $existing_ids[] = $row[0]; + } + + $new_ids = array_diff($ids, $existing_ids); + + foreach ($new_ids as $new_id) + { + if (!($date = $prepared[1][$new_id]->get_date('U'))) + { + $date = time(); + } + + if (!mysql_query('INSERT INTO `' . $this->options['prefix'][0] . 'items` (`feed_id`, `id`, `data`, `posted`) VALUES(' . $feed_id . ', \'' . mysql_real_escape_string($new_id) . '\', \'' . mysql_real_escape_string(serialize($prepared[1][$new_id]->data)) . '\', ' . $date . ')', $this->mysql)) + { + return false; + } + } + return true; + } + } + else + { + return true; + } + } + } + elseif ($query = mysql_query('SELECT `id` FROM `' . $this->options['prefix'][0] . 'cache_data` WHERE `id` = ' . $feed_id, $this->mysql)) + { + if (mysql_num_rows($query)) + { + if (mysql_query('UPDATE `' . $this->options['prefix'][0] . 'cache_data` SET `items` = 0, `data` = \'' . mysql_real_escape_string(serialize($data)) . '\', `mtime` = ' . time() . ' WHERE `id` = ' . $feed_id, $this->mysql)) + { + return true; + } + } + elseif (mysql_query('INSERT INTO `' . $this->options['prefix'][0] . 'cache_data` (`id`, `items`, `data`, `mtime`) VALUES(\'' . mysql_real_escape_string($this->id) . '\', 0, \'' . mysql_real_escape_string(serialize($data)) . '\', ' . time() . ')', $this->mysql)) + { + return true; + } + } + } + return false; + } + + function load() + { + if ($this->mysql && ($query = mysql_query('SELECT `items`, `data` FROM `' . $this->options['prefix'][0] . 'cache_data` WHERE `id` = \'' . mysql_real_escape_string($this->id) . "'", $this->mysql)) && ($row = mysql_fetch_row($query))) + { + $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['prefix'][0] . 'items` WHERE `feed_id` = \'' . mysql_real_escape_string($this->id) . '\' ORDER BY `posted` DESC'; + if ($items > 0) + { + $sql .= ' LIMIT ' . $items; + } + + if ($query = mysql_unbuffered_query($sql, $this->mysql)) + { + while ($row = mysql_fetch_row($query)) + { + $feed['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['entry'][] = unserialize($row[0]); + } + } + else + { + return false; + } + } + } + return $data; + } + return false; + } + + function mtime() + { + if ($this->mysql && ($query = mysql_query('SELECT `mtime` FROM `' . $this->options['prefix'][0] . 'cache_data` WHERE `id` = \'' . mysql_real_escape_string($this->id) . "'", $this->mysql)) && ($row = mysql_fetch_row($query))) + { + return $row[0]; + } + else + { + return false; + } + } + + function touch() + { + if ($this->mysql && ($query = mysql_query('UPDATE `' . $this->options['prefix'][0] . 'cache_data` SET `mtime` = ' . time() . ' WHERE `id` = \'' . mysql_real_escape_string($this->id) . "'", $this->mysql)) && mysql_affected_rows($this->mysql)) + { + return true; + } + else + { + return false; + } + } + + function unlink() + { + if ($this->mysql && ($query = mysql_query('DELETE FROM `' . $this->options['prefix'][0] . 'cache_data` WHERE `id` = \'' . mysql_real_escape_string($this->id) . "'", $this->mysql)) && ($query2 = mysql_query('DELETE FROM `' . $this->options['prefix'][0] . 'items` WHERE `feed_id` = \'' . mysql_real_escape_string($this->id) . "'", $this->mysql))) + { + return true; + } + else + { + return false; + } + } +} + +class SimplePie_Misc +{ + 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; + } + + function absolutize_url($relative, $base) + { + $iri = SimplePie_IRI::absolutize(new SimplePie_IRI($base), $relative); + return $iri->get_iri(); + } + + 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_replace($input, '/', 0, 3); + } + 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_replace($input, '/', 0, 4); + $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; + } + + 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]), 'UTF-8'); + } + } + } + } + return $return; + } + + 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]"; + } + return $full; + } + + 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; + } + error_log("$note: $message in $file on line $line", 0); + } + return $message; + } + + /** + * If a file has been cached, retrieve and display it. + * + * This is most useful for caching images (get_favicon(), etc.), + * however it works for all cached files. This WILL NOT display ANY + * file/image/page/whatever, but rather only display what has already + * been cached by SimplePie. + * + * @access public + * @see SimplePie::get_favicon() + * @param str $identifier_url URL that is used to identify the content. + * This may or may not be the actual URL of the live content. + * @param str $cache_location Location of SimplePie's cache. Defaults + * to './cache'. + * @param str $cache_extension The file extension that the file was + * cached with. Defaults to 'spc'. + * @param str $cache_class Name of the cache-handling class being used + * in SimplePie. Defaults to 'SimplePie_Cache', and should be left + * as-is unless you've overloaded the class. + * @param str $cache_name_function Obsolete. Exists for backwards + * compatibility reasons only. + */ + function display_cached_file($identifier_url, $cache_location = './cache', $cache_extension = 'spc', $cache_class = 'SimplePie_Cache', $cache_name_function = 'md5') + { + $cache = call_user_func(array($cache_class, 'create'), $cache_location, $identifier_url, $cache_extension); + + if ($file = $cache->load()) + { + if (isset($file['headers']['content-type'])) + { + header('Content-type:' . $file['headers']['content-type']); + } + else + { + header('Content-type: application/octet-stream'); + } + header('Expires: ' . gmdate('D, d M Y H:i:s', time() + 604800) . ' GMT'); // 7 days + echo $file['body']; + exit; + } + + die('Cached file for ' . $identifier_url . ' cannot be found.'); + } + + 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; + } + } + + function parse_url($url) + { + $iri =& new SimplePie_IRI($url); + return array( + 'scheme' => (string) $iri->get_scheme(), + 'authority' => (string) $iri->get_authority(), + 'path' => (string) $iri->get_path(), + 'query' => (string) $iri->get_query(), + 'fragment' => (string) $iri->get_fragment() + ); + } + + function compress_parse_url($scheme = '', $authority = '', $path = '', $query = '', $fragment = '') + { + $iri =& new SimplePie_IRI(''); + $iri->set_scheme($scheme); + $iri->set_authority($authority); + $iri->set_path($path); + $iri->set_query($query); + $iri->set_fragment($fragment); + return $iri->get_iri(); + } + + function normalize_url($url) + { + $iri =& new SimplePie_IRI($url); + return $iri->get_iri(); + } + + 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]); + } + } + + /** + * Remove bad UTF-8 bytes + * + * PCRE Pattern to locate bad bytes in a UTF-8 string comes from W3C + * FAQ: Multilingual Forms (modified to include full ASCII range) + * + * @author Geoffrey Sneddon + * @see http://www.w3.org/International/questions/qa-forms-utf-8 + * @param string $str String to remove bad UTF-8 bytes from + * @return string UTF-8 string + */ + function utf8_bad_replace($str) + { + if (function_exists('iconv') && ($return = @iconv('UTF-8', 'UTF-8//IGNORE', $str))) + { + return $return; + } + elseif (function_exists('mb_convert_encoding') && ($return = @mb_convert_encoding($str, 'UTF-8', 'UTF-8'))) + { + return $return; + } + elseif (preg_match_all('/(?:[\x00-\x7F]|[\xC2-\xDF][\x80-\xBF]|\xE0[\xA0-\xBF][\x80-\xBF]|[\xE1-\xEC\xEE\xEF][\x80-\xBF]{2}|\xED[\x80-\x9F][\x80-\xBF]|\xF0[\x90-\xBF][\x80-\xBF]{2}|[\xF1-\xF3][\x80-\xBF]{3}|\xF4[\x80-\x8F][\x80-\xBF]{2})+/', $str, $matches)) + { + return implode("\xEF\xBF\xBD", $matches[0]); + } + elseif ($str !== '') + { + return "\xEF\xBF\xBD"; + } + else + { + return ''; + } + } + + /** + * Converts a Windows-1252 encoded string to a UTF-8 encoded string + * + * @static + * @access public + * @param string $string Windows-1252 encoded string + * @return string UTF-8 encoded string + */ + 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); + } + + 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') && @mb_convert_encoding("\x80", 'UTF-16BE', $input) !== "\x00\x80" && ($return = @mb_convert_encoding($data, $output, $input))) + { + return $return; + } + // This is last, as behaviour of this varies with OS userland and PHP version + elseif (function_exists('iconv') && ($return = @iconv($input, $output, $data))) + { + return $return; + } + // If we can't do anything, just fail + else + { + return false; + } + } + + 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': + case 'xxbig5': + 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 'cseucfixwidjapanese': + case 'extendedunixcodefixedwidthforjapanese': + return 'Extended_UNIX_Code_Fixed_Width_for_Japanese'; + + case 'cseucpkdfmtjapanese': + case 'eucjp': + case 'extendedunixcodepackedformatforjapanese': + return 'Extended_UNIX_Code_Packed_Format_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 'ccsid858': + case 'cp858': + case 'ibm858': + case 'pcmultilingual850euro': + return 'IBM00858'; + + case 'ccsid924': + case 'cp924': + case 'ebcdiclatin9euro': + case 'ibm924': + return 'IBM00924'; + + 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 '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 '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 'cp1026': + case 'csibm1026': + case 'ibm1026': + return 'IBM1026'; + + case 'ibm1047': + return 'IBM1047'; + + 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 'csshiftjis': + case 'mskanji': + case 'shiftjis': + return 'Shift_JIS'; + + 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 'cswindows31j': + 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; + } + } + + 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; + } + + function is_subclass_of($class1, $class2) + { + if (func_num_args() !== 2) + { + trigger_error('Wrong parameter count for SimplePie_Misc::is_subclass_of()', E_USER_WARNING); + } + elseif (version_compare(PHP_VERSION, '5.0.3', '>=') || is_object($class1)) + { + return is_subclass_of($class1, $class2); + } + elseif (is_string($class1) && is_string($class2)) + { + if (class_exists($class1)) + { + if (class_exists($class2)) + { + $class2 = strtolower($class2); + while ($class1 = strtolower(get_parent_class($class1))) + { + if ($class1 === $class2) + { + return true; + } + } + } + } + else + { + trigger_error('Unknown class passed as parameter', E_USER_WARNNG); + } + } + return false; + } + + /** + * Strip HTML comments + * + * @access public + * @param string $data Data to strip comments from + * @return string Comment stripped string + */ + function strip_comments($data) + { + $output = ''; + while (($start = strpos($data, '', $start)) !== false) + { + $data = substr_replace($data, '', 0, $end + 3); + } + else + { + $data = ''; + } + } + return $output . $data; + } + + function parse_date($dt) + { + $parser = SimplePie_Parse_Date::get(); + return $parser->parse($dt); + } + + /** + * Decode HTML entities + * + * @static + * @access public + * @param string $data Input data + * @return string Output data + */ + function entities_decode($data) + { + $decoder =& new SimplePie_Decode_HTML_Entities($data); + return $decoder->parse(); + } + + /** + * Remove RFC822 comments + * + * @access public + * @param string $data Data to strip comments from + * @return string Comment stripped string + */ + 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; + } + + function parse_mime($mime) + { + if (($pos = strpos($mime, ';')) === false) + { + return trim($mime); + } + else + { + return trim(substr($mime, 0, $pos)); + } + } + + function htmlspecialchars_decode($string, $quote_style) + { + if (function_exists('htmlspecialchars_decode')) + { + return htmlspecialchars_decode($string, $quote_style); + } + else + { + return strtr($string, array_flip(get_html_translation_table(HTML_SPECIALCHARS, $quote_style))); + } + } + + 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; + } + } + + 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; + } + + 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; + } + } + + 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); + } + + 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; + } + + function array_unique($array) + { + if (version_compare(PHP_VERSION, '5.2', '>=')) + { + return array_unique($array); + } + else + { + $array = (array) $array; + $new_array = array(); + $new_array_strings = array(); + foreach ($array as $key => $value) + { + if (is_object($value)) + { + if (method_exists($value, '__toString')) + { + $cmp = $value->__toString(); + } + else + { + trigger_error('Object of class ' . get_class($value) . ' could not be converted to string', E_USER_ERROR); + } + } + elseif (is_array($value)) + { + $cmp = (string) reset($value); + } + else + { + $cmp = (string) $value; + } + if (!in_array($cmp, $new_array_strings)) + { + $new_array[$key] = $value; + $new_array_strings[] = $cmp; + } + } + return $new_array; + } + } + + /** + * Converts a unicode codepoint to a UTF-8 character + * + * @static + * @access public + * @param int $codepoint Unicode codepoint + * @return string UTF-8 character + */ + 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"; + } + } + + /** + * Re-implementation of PHP 5's stripos() + * + * Returns the numeric position of the first occurrence of needle in the + * haystack string. + * + * @static + * @access string + * @param object $haystack + * @param string $needle Note that the needle may be a string of one or more + * characters. If needle is not a string, it is converted to an integer + * and applied as the ordinal value of a character. + * @param int $offset The optional offset parameter allows you to specify which + * character in haystack to start searching. The position returned is still + * relative to the beginning of haystack. + * @return bool If needle is not found, stripos() will return boolean false. + */ + function stripos($haystack, $needle, $offset = 0) + { + if (function_exists('stripos')) + { + return stripos($haystack, $needle, $offset); + } + else + { + if (is_string($needle)) + { + $needle = strtolower($needle); + } + elseif (is_int($needle) || is_bool($needle) || is_double($needle)) + { + $needle = strtolower(chr($needle)); + } + else + { + trigger_error('needle is not a string or an integer', E_USER_WARNING); + return false; + } + + return strpos(strtolower($haystack), $needle, $offset); + } + } + + /** + * 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 + * @access string + * @param string $str The input string. + * @return array + */ + 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 + * @return array Possible encodings + */ + function xml_encoding($data) + { + // 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 =& new SimplePie_XML_Declaration_Parser(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 =& new SimplePie_XML_Declaration_Parser(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 =& new SimplePie_XML_Declaration_Parser(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 =& new SimplePie_XML_Declaration_Parser(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 =& new SimplePie_XML_Declaration_Parser(substr($data, 5, $pos - 5)); + if ($parser->parse()) + { + $encoding[] = $parser->encoding; + } + } + $encoding[] = 'UTF-8'; + } + // Fallback to UTF-8 + else + { + $encoding[] = 'UTF-8'; + } + return $encoding; + } + + 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_odeo(link) { + document.writeln(''); +} + +function embed_quicktime(type, bgcolor, width, height, link, placeholder, loop) { + if (placeholder != '') { + document.writeln(''); + } + else { + document.writeln(''); + } +} + +function embed_flash(bgcolor, width, height, link, loop, type) { + document.writeln(''); +} + +function embed_flv(width, height, link, placeholder, loop, player) { + document.writeln(''); +} + +function embed_wmedia(width, height, link) { + document.writeln(''); +} + data = $data; + } + + /** + * Parse the input data + * + * @access public + * @return string Output data + */ + 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 + */ + 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 + */ + 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 + */ + function unconsume() + { + $this->consumed = substr($this->consumed, 0, -1); + $this->position--; + } + + /** + * Decode an entity + * + * @access private + */ + 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; + } + } +} + +/** + * IRI parser/serialiser + * + * @package SimplePie + */ +class SimplePie_IRI +{ + /** + * Scheme + * + * @access private + * @var string + */ + var $scheme; + + /** + * User Information + * + * @access private + * @var string + */ + var $userinfo; + + /** + * Host + * + * @access private + * @var string + */ + var $host; + + /** + * Port + * + * @access private + * @var string + */ + var $port; + + /** + * Path + * + * @access private + * @var string + */ + var $path; + + /** + * Query + * + * @access private + * @var string + */ + var $query; + + /** + * Fragment + * + * @access private + * @var string + */ + var $fragment; + + /** + * Whether the object represents a valid IRI + * + * @access private + * @var array + */ + var $valid = array(); + + /** + * Return the entire IRI when you try and read the object as a string + * + * @access public + * @return string + */ + function __toString() + { + return $this->get_iri(); + } + + /** + * Create a new IRI object, from a specified string + * + * @access public + * @param string $iri + * @return SimplePie_IRI + */ + function SimplePie_IRI($iri) + { + $iri = (string) $iri; + if ($iri !== '') + { + $parsed = $this->parse_iri($iri); + $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']); + } + } + + /** + * Create a new IRI object by resolving a relative IRI + * + * @static + * @access public + * @param SimplePie_IRI $base Base IRI + * @param string $relative Relative IRI + * @return SimplePie_IRI + */ + function absolutize($base, $relative) + { + $relative = (string) $relative; + if ($relative !== '') + { + $relative =& new SimplePie_IRI($relative); + if ($relative->get_scheme() !== null) + { + $target = $relative; + } + elseif ($base->get_iri() !== null) + { + if ($relative->get_authority() !== null) + { + $target = $relative; + $target->set_scheme($base->get_scheme()); + } + else + { + $target =& new SimplePie_IRI(''); + $target->set_scheme($base->get_scheme()); + $target->set_userinfo($base->get_userinfo()); + $target->set_host($base->get_host()); + $target->set_port($base->get_port()); + if ($relative->get_path() !== null) + { + if (strpos($relative->get_path(), '/') === 0) + { + $target->set_path($relative->get_path()); + } + elseif (($base->get_userinfo() !== null || $base->get_host() !== null || $base->get_port() !== null) && $base->get_path() === null) + { + $target->set_path('/' . $relative->get_path()); + } + elseif (($last_segment = strrpos($base->get_path(), '/')) !== false) + { + $target->set_path(substr($base->get_path(), 0, $last_segment + 1) . $relative->get_path()); + } + else + { + $target->set_path($relative->get_path()); + } + $target->set_query($relative->get_query()); + } + else + { + $target->set_path($base->get_path()); + if ($relative->get_query() !== null) + { + $target->set_query($relative->get_query()); + } + elseif ($base->get_query() !== null) + { + $target->set_query($base->get_query()); + } + } + } + $target->set_fragment($relative->get_fragment()); + } + else + { + // No base URL, just return the relative URL + $target = $relative; + } + } + else + { + $target = $base; + } + return $target; + } + + /** + * Parse an IRI into scheme/authority/path/query/fragment segments + * + * @access private + * @param string $iri + * @return array + */ + function parse_iri($iri) + { + preg_match('/^(([^:\/?#]+):)?(\/\/([^\/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?$/', $iri, $match); + for ($i = count($match); $i <= 9; $i++) + { + $match[$i] = ''; + } + return array('scheme' => $match[2], 'authority' => $match[4], 'path' => $match[5], 'query' => $match[7], 'fragment' => $match[9]); + } + + /** + * Remove dot segments from a path + * + * @access private + * @param string $input + * @return string + */ + 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_replace($input, '/', 0, 3); + } + 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_replace($input, '/', 0, 4); + $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 + * + * @access private + * @param string $string Input string + * @param string $valid_chars Valid characters + * @param int $case Normalise case + * @return string + */ + function replace_invalid_with_pct_encoding($string, $valid_chars, $case = SIMPLEPIE_SAME_CASE) + { + // Normalise case + if ($case & SIMPLEPIE_LOWERCASE) + { + $string = strtolower($string); + } + elseif ($case & SIMPLEPIE_UPPERCASE) + { + $string = strtoupper($string); + } + + // Store position and string length (to avoid constantly recalculating this) + $position = 0; + $strlen = strlen($string); + + // Loop as long as we have invalid characters, advancing the position to the next invalid character + while (($position += strspn($string, $valid_chars, $position)) < $strlen) + { + // If we have a % character + if ($string[$position] === '%') + { + // If we have a pct-encoded section + if ($position + 2 < $strlen && strspn($string, '0123456789ABCDEFabcdef', $position + 1, 2) === 2) + { + // Get the the represented character + $chr = chr(hexdec(substr($string, $position + 1, 2))); + + // If the character is valid, replace the pct-encoded with the actual character while normalising case + if (strpos($valid_chars, $chr) !== false) + { + if ($case & SIMPLEPIE_LOWERCASE) + { + $chr = strtolower($chr); + } + elseif ($case & SIMPLEPIE_UPPERCASE) + { + $chr = strtoupper($chr); + } + $string = substr_replace($string, $chr, $position, 3); + $strlen -= 2; + $position++; + } + + // Otherwise just normalise the pct-encoded to uppercase + else + { + $string = substr_replace($string, strtoupper(substr($string, $position + 1, 2)), $position + 1, 2); + $position += 3; + } + } + // If we don't have a pct-encoded section, just replace the % with its own esccaped form + else + { + $string = substr_replace($string, '%25', $position, 1); + $strlen += 2; + $position += 3; + } + } + // If we have an invalid character, change into its pct-encoded form + else + { + $replacement = sprintf("%%%02X", ord($string[$position])); + $string = str_replace($string[$position], $replacement, $string); + $strlen = strlen($string); + } + } + return $string; + } + + /** + * Check if the object represents a valid IRI + * + * @access public + * @return bool + */ + function is_valid() + { + return array_sum($this->valid) === count($this->valid); + } + + /** + * Set the scheme. Returns true on success, false on failure (if there are + * any invalid characters). + * + * @access public + * @param string $scheme + * @return bool + */ + function set_scheme($scheme) + { + if ($scheme === null || $scheme === '') + { + $this->scheme = null; + } + else + { + $len = strlen($scheme); + switch (true) + { + case $len > 1: + if (!strspn($scheme, 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+-.', 1)) + { + $this->scheme = null; + $this->valid[__FUNCTION__] = false; + return false; + } + + case $len > 0: + if (!strspn($scheme, 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz', 0, 1)) + { + $this->scheme = null; + $this->valid[__FUNCTION__] = false; + return false; + } + } + $this->scheme = strtolower($scheme); + } + $this->valid[__FUNCTION__] = true; + return true; + } + + /** + * Set the authority. Returns true on success, false on failure (if there are + * any invalid characters). + * + * @access public + * @param string $authority + * @return bool + */ + function set_authority($authority) + { + if (($userinfo_end = strrpos($authority, '@')) !== false) + { + $userinfo = substr($authority, 0, $userinfo_end); + $authority = substr($authority, $userinfo_end + 1); + } + else + { + $userinfo = null; + } + + if (($port_start = strpos($authority, ':')) !== false) + { + $port = substr($authority, $port_start + 1); + $authority = substr($authority, 0, $port_start); + } + else + { + $port = null; + } + + return $this->set_userinfo($userinfo) && $this->set_host($authority) && $this->set_port($port); + } + + /** + * Set the userinfo. + * + * @access public + * @param string $userinfo + * @return bool + */ + function set_userinfo($userinfo) + { + if ($userinfo === null || $userinfo === '') + { + $this->userinfo = null; + } + else + { + $this->userinfo = $this->replace_invalid_with_pct_encoding($userinfo, 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~!$&\'()*+,;=:'); + } + $this->valid[__FUNCTION__] = true; + return true; + } + + /** + * Set the host. Returns true on success, false on failure (if there are + * any invalid characters). + * + * @access public + * @param string $host + * @return bool + */ + function set_host($host) + { + if ($host === null || $host === '') + { + $this->host = null; + $this->valid[__FUNCTION__] = true; + return true; + } + elseif ($host[0] === '[' && substr($host, -1) === ']') + { + if (Net_IPv6::checkIPv6(substr($host, 1, -1))) + { + $this->host = $host; + $this->valid[__FUNCTION__] = true; + return true; + } + else + { + $this->host = null; + $this->valid[__FUNCTION__] = false; + return false; + } + } + else + { + $this->host = $this->replace_invalid_with_pct_encoding($host, 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~!$&\'()*+,;=', SIMPLEPIE_LOWERCASE); + $this->valid[__FUNCTION__] = true; + return true; + } + } + + /** + * Set the port. Returns true on success, false on failure (if there are + * any invalid characters). + * + * @access public + * @param string $port + * @return bool + */ + function set_port($port) + { + if ($port === null || $port === '') + { + $this->port = null; + $this->valid[__FUNCTION__] = true; + return true; + } + elseif (strspn($port, '0123456789') === strlen($port)) + { + $this->port = (int) $port; + $this->valid[__FUNCTION__] = true; + return true; + } + else + { + $this->port = null; + $this->valid[__FUNCTION__] = false; + return false; + } + } + + /** + * Set the path. + * + * @access public + * @param string $path + * @return bool + */ + function set_path($path) + { + if ($path === null || $path === '') + { + $this->path = null; + $this->valid[__FUNCTION__] = true; + return true; + } + elseif (substr($path, 0, 2) === '//' && $this->userinfo === null && $this->host === null && $this->port === null) + { + $this->path = null; + $this->valid[__FUNCTION__] = false; + return false; + } + else + { + $this->path = $this->replace_invalid_with_pct_encoding($path, 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~!$&\'()*+,;=@/'); + if ($this->scheme !== null) + { + $this->path = $this->remove_dot_segments($this->path); + } + $this->valid[__FUNCTION__] = true; + return true; + } + } + + /** + * Set the query. + * + * @access public + * @param string $query + * @return bool + */ + function set_query($query) + { + if ($query === null || $query === '') + { + $this->query = null; + } + else + { + $this->query = $this->replace_invalid_with_pct_encoding($query, 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~!$&\'()*+,;=:@/?'); + } + $this->valid[__FUNCTION__] = true; + return true; + } + + /** + * Set the fragment. + * + * @access public + * @param string $fragment + * @return bool + */ + function set_fragment($fragment) + { + if ($fragment === null || $fragment === '') + { + $this->fragment = null; + } + else + { + $this->fragment = $this->replace_invalid_with_pct_encoding($fragment, 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~!$&\'()*+,;=:@/?'); + } + $this->valid[__FUNCTION__] = true; + return true; + } + + /** + * Get the complete IRI + * + * @access public + * @return string + */ + function get_iri() + { + $iri = ''; + if ($this->scheme !== null) + { + $iri .= $this->scheme . ':'; + } + if (($authority = $this->get_authority()) !== null) + { + $iri .= '//' . $authority; + } + if ($this->path !== null) + { + $iri .= $this->path; + } + if ($this->query !== null) + { + $iri .= '?' . $this->query; + } + if ($this->fragment !== null) + { + $iri .= '#' . $this->fragment; + } + + if ($iri !== '') + { + return $iri; + } + else + { + return null; + } + } + + /** + * Get the scheme + * + * @access public + * @return string + */ + function get_scheme() + { + return $this->scheme; + } + + /** + * Get the complete authority + * + * @access public + * @return string + */ + function get_authority() + { + $authority = ''; + if ($this->userinfo !== null) + { + $authority .= $this->userinfo . '@'; + } + if ($this->host !== null) + { + $authority .= $this->host; + } + if ($this->port !== null) + { + $authority .= ':' . $this->port; + } + + if ($authority !== '') + { + return $authority; + } + else + { + return null; + } + } + + /** + * Get the user information + * + * @access public + * @return string + */ + function get_userinfo() + { + return $this->userinfo; + } + + /** + * Get the host + * + * @access public + * @return string + */ + function get_host() + { + return $this->host; + } + + /** + * Get the port + * + * @access public + * @return string + */ + function get_port() + { + return $this->port; + } + + /** + * Get the path + * + * @access public + * @return string + */ + function get_path() + { + return $this->path; + } + + /** + * Get the query + * + * @access public + * @return string + */ + function get_query() + { + return $this->query; + } + + /** + * Get the fragment + * + * @access public + * @return string + */ + function get_fragment() + { + return $this->fragment; + } +} + +/** + * Class to validate and to work with IPv6 addresses. + * + * @package SimplePie + * @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 + * @author elfrink at introweb dot nl + * @author Josh Peck + * @author Geoffrey Sneddon + */ +class SimplePie_Net_IPv6 +{ + /** + * Removes a possible existing netmask specification of an IP address. + * + * @param string $ip the (compressed) IP as Hex representation + * @return string the IP the without netmask + * @since 1.1.0 + * @access public + * @static + */ + function removeNetmaskSpec($ip) + { + if (strpos($ip, '/') !== false) + { + list($addr, $nm) = explode('/', $ip); + } + else + { + $addr = $ip; + } + return $addr; + } + + /** + * Uncompresses an IPv6 address + * + * RFC 2373 allows you to compress zeros in an address to '::'. This + * function expects an valid IPv6 address and expands the '::' to + * the required zeros. + * + * Example: FF01::101 -> FF01:0:0:0:0:0:0:101 + * ::1 -> 0:0:0:0:0:0:0:1 + * + * @access public + * @static + * @param string $ip a valid IPv6-address (hex format) + * @return string the uncompressed IPv6-address (hex format) + */ + function Uncompress($ip) + { + $uip = SimplePie_Net_IPv6::removeNetmaskSpec($ip); + $c1 = -1; + $c2 = -1; + if (strpos($ip, '::') !== false) + { + list($ip1, $ip2) = explode('::', $ip); + if ($ip1 === '') + { + $c1 = -1; + } + else + { + $pos = 0; + if (($pos = substr_count($ip1, ':')) > 0) + { + $c1 = $pos; + } + else + { + $c1 = 0; + } + } + if ($ip2 === '') + { + $c2 = -1; + } + else + { + $pos = 0; + if (($pos = substr_count($ip2, ':')) > 0) + { + $c2 = $pos; + } + else + { + $c2 = 0; + } + } + if (strstr($ip2, '.')) + { + $c2++; + } + // :: + if ($c1 === -1 && $c2 === -1) + { + $uip = '0:0:0:0:0:0:0:0'; + } + // ::xxx + else if ($c1 === -1) + { + $fill = str_repeat('0:', 7 - $c2); + $uip = str_replace('::', $fill, $uip); + } + // xxx:: + else if ($c2 === -1) + { + $fill = str_repeat(':0', 7 - $c1); + $uip = str_replace('::', $fill, $uip); + } + // xxx::xxx + else + { + $fill = str_repeat(':0:', 6 - $c2 - $c1); + $uip = str_replace('::', $fill, $uip); + $uip = str_replace('::', ':', $uip); + } + } + return $uip; + } + + /** + * Splits an IPv6 address into the IPv6 and a possible IPv4 part + * + * RFC 2373 allows you to note the last two parts of an IPv6 address as + * an IPv4 compatible address + * + * Example: 0:0:0:0:0:0:13.1.68.3 + * 0:0:0:0:0:FFFF:129.144.52.38 + * + * @access public + * @static + * @param string $ip a valid IPv6-address (hex format) + * @return array [0] contains the IPv6 part, [1] the IPv4 part (hex format) + */ + function SplitV64($ip) + { + $ip = SimplePie_Net_IPv6::Uncompress($ip); + if (strstr($ip, '.')) + { + $pos = strrpos($ip, ':'); + $ip[$pos] = '_'; + $ipPart = explode('_', $ip); + return $ipPart; + } + else + { + return array($ip, ''); + } + } + + /** + * Checks an IPv6 address + * + * Checks if the given IP is IPv6-compatible + * + * @access public + * @static + * @param string $ip a valid IPv6-address + * @return bool true if $ip is an IPv6 address + */ + function checkIPv6($ip) + { + $ipPart = SimplePie_Net_IPv6::SplitV64($ip); + $count = 0; + if (!empty($ipPart[0])) + { + $ipv6 = explode(':', $ipPart[0]); + for ($i = 0; $i < count($ipv6); $i++) + { + $dec = hexdec($ipv6[$i]); + $hex = strtoupper(preg_replace('/^[0]{1,3}(.*[0-9a-fA-F])$/', '\\1', $ipv6[$i])); + if ($ipv6[$i] >= 0 && $dec <= 65535 && $hex === strtoupper(dechex($dec))) + { + $count++; + } + } + if ($count === 8) + { + return true; + } + elseif ($count === 6 && !empty($ipPart[1])) + { + $ipv4 = explode('.', $ipPart[1]); + $count = 0; + foreach ($ipv4 as $ipv4_part) + { + if ($ipv4_part >= 0 && $ipv4_part <= 255 && preg_match('/^\d{1,3}$/', $ipv4_part)) + { + $count++; + } + } + if ($count === 4) + { + return true; + } + } + else + { + return false; + } + + } + else + { + return false; + } + } +} + +/** + * Date Parser + * + * @package SimplePie + */ +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, + '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 + */ + function SimplePie_Parse_Date() + { + $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 + */ + 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 + */ + 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 callback $callback + */ + 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 + */ + 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 + */ + 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 + */ + 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 + */ + 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 + */ + 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 + */ + function date_strtotime($date) + { + $strtotime = strtotime($date); + if ($strtotime === -1 || $strtotime === false) + { + return false; + } + else + { + return $strtotime; + } + } +} + +/** + * Content-type sniffing + * + * @package SimplePie + */ +class SimplePie_Content_Type_Sniffer +{ + /** + * File object + * + * @var SimplePie_File + * @access private + */ + var $file; + + /** + * Create an instance of the class with the input file + * + * @access public + * @param SimplePie_Content_Type_Sniffer $file Input file + */ + function SimplePie_Content_Type_Sniffer($file) + { + $this->file = $file; + } + + /** + * Get the Content-Type of the specified file + * + * @access public + * @return string Actual Content-Type + */ + 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')) + { + 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 = 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 + * + * @access private + * @return string Actual Content-Type + */ + 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 + * + * @access private + * @return string Actual Content-Type + */ + 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'; + } + else + { + return $this->text_or_binary(); + } + } + + /** + * Sniff images + * + * @access private + * @return string Actual Content-Type + */ + 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'; + } + else + { + return false; + } + } + + /** + * Sniff HTML + * + * @access private + * @return string Actual Content-Type + */ + 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'; + } +} + +/** + * Parses the XML Declaration + * + * @package SimplePie + */ +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 + */ + function SimplePie_XML_Declaration_Parser($data) + { + $this->data = $data; + $this->data_length = strlen($this->data); + } + + /** + * Parse the input data + * + * @access public + * @return bool true on success, false on failure + */ + 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 + */ + function has_data() + { + return (bool) ($this->position < $this->data_length); + } + + /** + * Advance past any whitespace + * + * @return int Number of whitespace characters passed + */ + function skip_whitespace() + { + $whitespace = strspn($this->data, "\x09\x0A\x0D\x20", $this->position); + $this->position += $whitespace; + return $whitespace; + } + + /** + * Read value + */ + 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; + } + + function before_version_name() + { + if ($this->skip_whitespace()) + { + $this->state = 'version_name'; + } + else + { + $this->state = false; + } + } + + 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; + } + } + + function version_equals() + { + if (substr($this->data, $this->position, 1) === '=') + { + $this->position++; + $this->skip_whitespace(); + $this->state = 'version_value'; + } + else + { + $this->state = false; + } + } + + 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 = 'standalone_name'; + } + } + + function encoding_name() + { + if (substr($this->data, $this->position, 8) === 'encoding') + { + $this->position += 8; + $this->skip_whitespace(); + $this->state = 'encoding_equals'; + } + else + { + $this->state = false; + } + } + + function encoding_equals() + { + if (substr($this->data, $this->position, 1) === '=') + { + $this->position++; + $this->skip_whitespace(); + $this->state = 'encoding_value'; + } + else + { + $this->state = false; + } + } + + 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; + } + } + + 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; + } + } + + function standalone_equals() + { + if (substr($this->data, $this->position, 1) === '=') + { + $this->position++; + $this->skip_whitespace(); + $this->state = 'standalone_value'; + } + else + { + $this->state = false; + } + } + + 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; + } + } +} + +class SimplePie_Locator +{ + var $useragent; + var $timeout; + var $file; + var $local = array(); + var $elsewhere = array(); + var $file_class = 'SimplePie_File'; + var $cached_entities = array(); + var $http_base; + var $base; + var $base_location = 0; + var $checked_feeds = 0; + var $max_checked_feeds = 10; + var $content_type_sniffer_class = 'SimplePie_Content_Type_Sniffer'; + + function SimplePie_Locator(&$file, $timeout = 10, $useragent = null, $file_class = 'SimplePie_File', $max_checked_feeds = 10, $content_type_sniffer_class = 'SimplePie_Content_Type_Sniffer') + { + $this->file =& $file; + $this->file_class = $file_class; + $this->useragent = $useragent; + $this->timeout = $timeout; + $this->max_checked_feeds = $max_checked_feeds; + $this->content_type_sniffer_class = $content_type_sniffer_class; + } + + 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 =& new $this->content_type_sniffer_class($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; + } + + function is_feed(&$file) + { + if ($file->method & SIMPLEPIE_FILE_SOURCE_REMOTE) + { + $sniffer =& new $this->content_type_sniffer_class($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; + } + } + + function get_base() + { + $this->http_base = $this->file->url; + $this->base = $this->http_base; + $elements = SimplePie_Misc::get_element('base', $this->file->body); + foreach ($elements as $element) + { + if ($element['attribs']['href']['data'] !== '') + { + $this->base = SimplePie_Misc::absolutize_url(trim($element['attribs']['href']['data']), $this->http_base); + $this->base_location = $element['offset']; + break; + } + } + } + + function autodiscovery() + { + $links = array_merge(SimplePie_Misc::get_element('link', $this->file->body), SimplePie_Misc::get_element('a', $this->file->body), SimplePie_Misc::get_element('area', $this->file->body)); + $done = array(); + $feeds = array(); + foreach ($links as $link) + { + if ($this->checked_feeds === $this->max_checked_feeds) + { + break; + } + if (isset($link['attribs']['href']['data']) && isset($link['attribs']['rel']['data'])) + { + $rel = array_unique(SimplePie_Misc::space_seperated_tokens(strtolower($link['attribs']['rel']['data']))); + + if ($this->base_location < $link['offset']) + { + $href = SimplePie_Misc::absolutize_url(trim($link['attribs']['href']['data']), $this->base); + } + else + { + $href = SimplePie_Misc::absolutize_url(trim($link['attribs']['href']['data']), $this->http_base); + } + + if (!in_array($href, $done) && in_array('feed', $rel) || (in_array('alternate', $rel) && !empty($link['attribs']['type']['data']) && in_array(strtolower(SimplePie_Misc::parse_mime($link['attribs']['type']['data'])), array('application/rss+xml', 'application/atom+xml'))) && !isset($feeds[$href])) + { + $this->checked_feeds++; + $feed =& new $this->file_class($href, $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)) + { + $feeds[$href] = $feed; + } + } + $done[] = $href; + } + } + + if (!empty($feeds)) + { + return array_values($feeds); + } + else { + return null; + } + } + + function get_links() + { + $links = SimplePie_Misc::get_element('a', $this->file->body); + foreach ($links as $link) + { + if (isset($link['attribs']['href']['data'])) + { + $href = trim($link['attribs']['href']['data']); + $parsed = SimplePie_Misc::parse_url($href); + if ($parsed['scheme'] === '' || preg_match('/^(http(s)|feed)?$/i', $parsed['scheme'])) + { + if ($this->base_location < $link['offset']) + { + $href = SimplePie_Misc::absolutize_url(trim($link['attribs']['href']['data']), $this->base); + } + else + { + $href = SimplePie_Misc::absolutize_url(trim($link['attribs']['href']['data']), $this->http_base); + } + + $current = SimplePie_Misc::parse_url($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; + } + + 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++; + $feed =& new $this->file_class($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; + } + + 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++; + $feed =& new $this->file_class($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; + } +} + +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; + + 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) === '')) !== false) + { + $declaration =& new SimplePie_XML_Declaration_Parser(substr($data, 5, $pos - 5)); + if ($declaration->parse()) + { + $data = substr($data, $pos + 2); + $data = '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, '&', $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; + } + } + } + + function get_error_code() + { + return $this->error_code; + } + + function get_error_string() + { + return $this->error_string; + } + + function get_current_line() + { + return $this->current_line; + } + + function get_current_column() + { + return $this->current_column; + } + + function get_current_byte() + { + return $this->current_byte; + } + + function get_data() + { + return $this->data; + } + + 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'])) + { + $this->xml_base[] = SimplePie_Misc::absolutize_url($attribs[SIMPLEPIE_NAMESPACE_XML]['base'], end($this->xml_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')) + { + $this->current_xhtml_construct = 0; + } + } + } + + function cdata($parser, $cdata) + { + if ($this->current_xhtml_construct >= 0) + { + $this->data['data'] .= htmlspecialchars($cdata, ENT_QUOTES, $this->encoding); + } + else + { + $this->data['data'] .= $cdata; + } + } + + 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'] .= '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); + } + + 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; + } + $cache[$string] = array($namespace, $local_name); + } + else + { + $cache[$string] = array('', $string); + } + } + return $cache[$string]; + } +} + +/** + * @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 $cache_class = 'SimplePie_Cache'; + var $file_class = 'SimplePie_File'; + var $timeout = 10; + var $useragent = ''; + var $force_fsockopen = false; + + var $replace_url_attributes = array( + 'a' => 'href', + 'area' => 'href', + 'blockquote' => 'cite', + 'del' => 'cite', + 'form' => 'action', + 'img' => array('longdesc', 'src'), + 'input' => 'src', + 'ins' => 'cite', + 'q' => 'cite' + ); + + function remove_div($enable = true) + { + $this->remove_div = (bool) $enable; + } + + function set_image_handler($page = false) + { + if ($page) + { + $this->image_handler = (string) $page; + } + else + { + $this->image_handler = false; + } + } + + 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; + } + + if ($cache_class) + { + $this->cache_class = (string) $cache_class; + } + } + + function pass_file_data($file_class = 'SimplePie_File', $timeout = 10, $useragent = '', $force_fsockopen = false) + { + if ($file_class) + { + $this->file_class = (string) $file_class; + } + + if ($timeout) + { + $this->timeout = (string) $timeout; + } + + if ($useragent) + { + $this->useragent = (string) $useragent; + } + + if ($force_fsockopen) + { + $this->force_fsockopen = (string) $force_fsockopen; + } + } + + 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; + } + } + + function encode_instead_of_strip($encode = false) + { + $this->encode_instead_of_strip = (bool) $encode; + } + + 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; + } + } + + function strip_comments($strip = false) + { + $this->strip_comments = (bool) $strip; + } + + 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 + * + * @access public + * @since 1.0 + * @param array $element_attribute Element/attribute key/value pairs + */ + function set_url_replacements($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; + } + + 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_XHTML) + { + if ($this->remove_div) + { + $data = preg_replace('/^/', '', $data); + $data = preg_replace('/<\/div>$/', '', $data); + } + else + { + $data = preg_replace('/^/', '
    ', $data); + } + } + + if ($type & (SIMPLEPIE_CONSTRUCT_HTML | SIMPLEPIE_CONSTRUCT_XHTML)) + { + // Strip comments + if ($this->strip_comments) + { + $data = SimplePie_Misc::strip_comments($data); + } + + // 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) + { + $pcre = "/<($tag)" . SIMPLEPIE_PCRE_HTML_ATTRIBUTE . "(>(.*)<\/$tag" . SIMPLEPIE_PCRE_HTML_ATTRIBUTE . '>|(\/)?>)/siU'; + while (preg_match($pcre, $data)) + { + $data = preg_replace_callback($pcre, array(&$this, 'do_strip_htmltags'), $data); + } + } + } + + if ($this->strip_attributes) + { + foreach ($this->strip_attributes as $attrib) + { + $data = preg_replace('/(<[A-Za-z][^\x09\x0A\x0B\x0C\x0D\x20\x2F\x3E]*)' . SIMPLEPIE_PCRE_HTML_ATTRIBUTE . trim($attrib) . '(?:\s*=\s*(?:"(?:[^"]*)"|\'(?:[^\']*)\'|(?:[^\x09\x0A\x0B\x0C\x0D\x20\x22\x27\x3E][^\x09\x0A\x0B\x0C\x0D\x20\x3E]*)?))?' . SIMPLEPIE_PCRE_HTML_ATTRIBUTE . '>/', '\1\2\3>', $data); + } + } + + // Replace relative URLs + $this->base = $base; + foreach ($this->replace_url_attributes as $element => $attributes) + { + $data = $this->replace_urls($data, $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 = SimplePie_Misc::get_element('img', $data); + foreach ($images as $img) + { + if (isset($img['attribs']['src']['data'])) + { + $image_url = call_user_func($this->cache_name_function, $img['attribs']['src']['data']); + $cache = call_user_func(array($this->cache_class, 'create'), $this->cache_location, $image_url, 'spi'); + + if ($cache->load()) + { + $img['attribs']['src']['data'] = $this->image_handler . $image_url; + $data = str_replace($img['full'], SimplePie_Misc::element_implode($img), $data); + } + else + { + $file =& new $this->file_class($img['attribs']['src']['data'], $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['attribs']['src']['data'] = $this->image_handler . $image_url; + $data = str_replace($img['full'], SimplePie_Misc::element_implode($img), $data); + } + else + { + trigger_error("$this->cache_location is not writeable", E_USER_WARNING); + } + } + } + } + } + } + + // Having (possibly) taken stuff out, there may now be whitespace at the beginning/end of the data + $data = trim($data); + } + + if ($type & SIMPLEPIE_CONSTRUCT_IRI) + { + $data = SimplePie_Misc::absolutize_url($data, $base); + } + + if ($type & (SIMPLEPIE_CONSTRUCT_TEXT | SIMPLEPIE_CONSTRUCT_IRI)) + { + $data = htmlspecialchars($data, ENT_COMPAT, 'UTF-8'); + } + + if ($this->output_encoding !== 'UTF-8') + { + $data = SimplePie_Misc::change_encoding($data, 'UTF-8', $this->output_encoding); + } + } + return $data; + } + + function replace_urls($data, $tag, $attributes) + { + if (!is_array($this->strip_htmltags) || !in_array($tag, $this->strip_htmltags)) + { + $elements = SimplePie_Misc::get_element($tag, $data); + foreach ($elements as $element) + { + if (is_array($attributes)) + { + foreach ($attributes as $attribute) + { + if (isset($element['attribs'][$attribute]['data'])) + { + $element['attribs'][$attribute]['data'] = SimplePie_Misc::absolutize_url($element['attribs'][$attribute]['data'], $this->base); + $new_element = SimplePie_Misc::element_implode($element); + $data = str_replace($element['full'], $new_element, $data); + $element['full'] = $new_element; + } + } + } + elseif (isset($element['attribs'][$attributes]['data'])) + { + $element['attribs'][$attributes]['data'] = SimplePie_Misc::absolutize_url($element['attribs'][$attributes]['data'], $this->base); + $data = str_replace($element['full'], SimplePie_Misc::element_implode($element), $data); + } + } + } + return $data; + } + + 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 ''; + } + } +} +endif; +?> diff --git a/src/wp-includes/class-smtp.php b/src/wp-includes/class-smtp.php new file mode 100644 index 0000000..c664d97 --- /dev/null +++ b/src/wp-includes/class-smtp.php @@ -0,0 +1,814 @@ +smtp_conn = 0; + $this->error = null; + $this->helo_rply = null; + + $this->do_debug = 0; + } + + ///////////////////////////////////////////////// + // CONNECTION FUNCTIONS + ///////////////////////////////////////////////// + + /** + * Connect to the server specified on the port specified. + * If the port is not specified use the default SMTP_PORT. + * If tval is specified then a connection will try and be + * established with the server for that number of seconds. + * If tval is not specified the default is 30 seconds to + * try on the connection. + * + * SMTP CODE SUCCESS: 220 + * SMTP CODE FAILURE: 421 + * @access public + * @return bool + */ + public function Connect($host, $port = 0, $tval = 30) { + // set the error val to null so there is no confusion + $this->error = null; + + // make sure we are __not__ connected + if($this->connected()) { + // already connected, generate error + $this->error = array("error" => "Already connected to a server"); + return false; + } + + if(empty($port)) { + $port = $this->SMTP_PORT; + } + + // connect to the smtp server + $this->smtp_conn = @fsockopen($host, // the host of the server + $port, // the port to use + $errno, // error number if any + $errstr, // error message if any + $tval); // give up after ? secs + // verify we connected properly + if(empty($this->smtp_conn)) { + $this->error = array("error" => "Failed to connect to server", + "errno" => $errno, + "errstr" => $errstr); + if($this->do_debug >= 1) { + echo "SMTP -> ERROR: " . $this->error["error"] . ": $errstr ($errno)" . $this->CRLF . '
    '; + } + return false; + } + + // 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") + socket_set_timeout($this->smtp_conn, $tval, 0); + + // get any announcement + $announce = $this->get_lines(); + + if($this->do_debug >= 2) { + echo "SMTP -> FROM SERVER:" . $announce . $this->CRLF . '
    '; + } + + return true; + } + + /** + * Initiate a TLS communication with the server. + * + * SMTP CODE 220 Ready to start TLS + * SMTP CODE 501 Syntax error (no parameters allowed) + * SMTP CODE 454 TLS not available due to temporary reason + * @access public + * @return bool success + */ + public function StartTLS() { + $this->error = null; # to avoid confusion + + if(!$this->connected()) { + $this->error = array("error" => "Called StartTLS() without being connected"); + return false; + } + + fputs($this->smtp_conn,"STARTTLS" . $this->CRLF); + + $rply = $this->get_lines(); + $code = substr($rply,0,3); + + if($this->do_debug >= 2) { + echo "SMTP -> FROM SERVER:" . $rply . $this->CRLF . '
    '; + } + + if($code != 220) { + $this->error = + array("error" => "STARTTLS not accepted from server", + "smtp_code" => $code, + "smtp_msg" => substr($rply,4)); + if($this->do_debug >= 1) { + echo "SMTP -> ERROR: " . $this->error["error"] . ": " . $rply . $this->CRLF . '
    '; + } + return false; + } + + // Begin encrypted connection + if(!stream_socket_enable_crypto($this->smtp_conn, true, STREAM_CRYPTO_METHOD_TLS_CLIENT)) { + return false; + } + + return true; + } + + /** + * Performs SMTP authentication. Must be run after running the + * Hello() method. Returns true if successfully authenticated. + * @access public + * @return bool + */ + public function Authenticate($username, $password) { + // Start authentication + fputs($this->smtp_conn,"AUTH LOGIN" . $this->CRLF); + + $rply = $this->get_lines(); + $code = substr($rply,0,3); + + if($code != 334) { + $this->error = + array("error" => "AUTH not accepted from server", + "smtp_code" => $code, + "smtp_msg" => substr($rply,4)); + if($this->do_debug >= 1) { + echo "SMTP -> ERROR: " . $this->error["error"] . ": " . $rply . $this->CRLF . '
    '; + } + return false; + } + + // Send encoded username + fputs($this->smtp_conn, base64_encode($username) . $this->CRLF); + + $rply = $this->get_lines(); + $code = substr($rply,0,3); + + if($code != 334) { + $this->error = + array("error" => "Username not accepted from server", + "smtp_code" => $code, + "smtp_msg" => substr($rply,4)); + if($this->do_debug >= 1) { + echo "SMTP -> ERROR: " . $this->error["error"] . ": " . $rply . $this->CRLF . '
    '; + } + return false; + } + + // Send encoded password + fputs($this->smtp_conn, base64_encode($password) . $this->CRLF); + + $rply = $this->get_lines(); + $code = substr($rply,0,3); + + if($code != 235) { + $this->error = + array("error" => "Password not accepted from server", + "smtp_code" => $code, + "smtp_msg" => substr($rply,4)); + if($this->do_debug >= 1) { + echo "SMTP -> ERROR: " . $this->error["error"] . ": " . $rply . $this->CRLF . '
    '; + } + return false; + } + + return true; + } + + /** + * Returns true if connected to a server otherwise false + * @access public + * @return bool + */ + public function Connected() { + if(!empty($this->smtp_conn)) { + $sock_status = socket_get_status($this->smtp_conn); + if($sock_status["eof"]) { + // the socket is valid but we are not connected + if($this->do_debug >= 1) { + echo "SMTP -> NOTICE:" . $this->CRLF . "EOF caught while checking if connected"; + } + $this->Close(); + return false; + } + return true; // everything looks good + } + return false; + } + + /** + * Closes the socket and cleans up the state of the class. + * It is not considered good to use this function without + * first trying to use QUIT. + * @access public + * @return void + */ + public function Close() { + $this->error = null; // so there is no confusion + $this->helo_rply = null; + if(!empty($this->smtp_conn)) { + // close the connection and cleanup + fclose($this->smtp_conn); + $this->smtp_conn = 0; + } + } + + ///////////////////////////////////////////////// + // SMTP COMMANDS + ///////////////////////////////////////////////// + + /** + * 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 with the message headers + * and the message body being seperated by and additional . + * + * Implements rfc 821: DATA + * + * SMTP CODE INTERMEDIATE: 354 + * [data] + * . + * SMTP CODE SUCCESS: 250 + * SMTP CODE FAILURE: 552,554,451,452 + * SMTP CODE FAILURE: 451,554 + * SMTP CODE ERROR : 500,501,503,421 + * @access public + * @return bool + */ + public function Data($msg_data) { + $this->error = null; // so no confusion is caused + + if(!$this->connected()) { + $this->error = array( + "error" => "Called Data() without being connected"); + return false; + } + + fputs($this->smtp_conn,"DATA" . $this->CRLF); + + $rply = $this->get_lines(); + $code = substr($rply,0,3); + + if($this->do_debug >= 2) { + echo "SMTP -> FROM SERVER:" . $rply . $this->CRLF . '
    '; + } + + if($code != 354) { + $this->error = + array("error" => "DATA command not accepted from server", + "smtp_code" => $code, + "smtp_msg" => substr($rply,4)); + if($this->do_debug >= 1) { + echo "SMTP -> ERROR: " . $this->error["error"] . ": " . $rply . $this->CRLF . '
    '; + } + return false; + } + + /* the server is ready to accept data! + * according to rfc 821 we should not send more than 1000 + * including the CRLF + * characters on a single line 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. + * in addition we will be looking for lines that start with + * a period '.' and append and additional period '.' to that + * line. NOTE: this does not count towards limit. + */ + + // normalize the line breaks so we know the explode works + $msg_data = str_replace("\r\n","\n",$msg_data); + $msg_data = str_replace("\r","\n",$msg_data); + $lines = explode("\n",$msg_data); + + /* we need to find a good way to determine is headers are + * in the msg_data or if it is a straight msg body + * currently I am assuming rfc 822 definitions of msg headers + * and if the first field of the first line (':' sperated) + * does not contain a space then it _should_ be a header + * and we can process all lines before a blank "" line as + * headers. + */ + + $field = substr($lines[0],0,strpos($lines[0],":")); + $in_headers = false; + if(!empty($field) && !strstr($field," ")) { + $in_headers = true; + } + + $max_line_length = 998; // used below; set here for ease in change + + while(list(,$line) = @each($lines)) { + $lines_out = null; + if($line == "" && $in_headers) { + $in_headers = false; + } + // ok we need to break this line up into several smaller lines + while(strlen($line) > $max_line_length) { + $pos = strrpos(substr($line,0,$max_line_length)," "); + + // Patch to fix DOS attack + if(!$pos) { + $pos = $max_line_length - 1; + $lines_out[] = substr($line,0,$pos); + $line = substr($line,$pos); + } else { + $lines_out[] = substr($line,0,$pos); + $line = substr($line,$pos + 1); + } + + /* if processing headers add a LWSP-char to the front of new line + * rfc 822 on long msg headers + */ + if($in_headers) { + $line = "\t" . $line; + } + } + $lines_out[] = $line; + + // send the lines to the server + while(list(,$line_out) = @each($lines_out)) { + if(strlen($line_out) > 0) + { + if(substr($line_out, 0, 1) == ".") { + $line_out = "." . $line_out; + } + } + fputs($this->smtp_conn,$line_out . $this->CRLF); + } + } + + // message data has been sent + fputs($this->smtp_conn, $this->CRLF . "." . $this->CRLF); + + $rply = $this->get_lines(); + $code = substr($rply,0,3); + + if($this->do_debug >= 2) { + echo "SMTP -> FROM SERVER:" . $rply . $this->CRLF . '
    '; + } + + if($code != 250) { + $this->error = + array("error" => "DATA not accepted from server", + "smtp_code" => $code, + "smtp_msg" => substr($rply,4)); + if($this->do_debug >= 1) { + echo "SMTP -> ERROR: " . $this->error["error"] . ": " . $rply . $this->CRLF . '
    '; + } + return false; + } + return true; + } + + /** + * Sends the HELO command to the smtp server. + * This makes sure that we and the server are in + * the same known state. + * + * Implements from rfc 821: HELO + * + * SMTP CODE SUCCESS: 250 + * SMTP CODE ERROR : 500, 501, 504, 421 + * @access public + * @return bool + */ + public function Hello($host = '') { + $this->error = null; // so no confusion is caused + + if(!$this->connected()) { + $this->error = array( + "error" => "Called Hello() without being connected"); + return false; + } + + // if hostname for HELO was not specified send default + if(empty($host)) { + // determine appropriate default to send to server + $host = "localhost"; + } + + // Send extended hello first (RFC 2821) + if(!$this->SendHello("EHLO", $host)) { + if(!$this->SendHello("HELO", $host)) { + return false; + } + } + + return true; + } + + /** + * Sends a HELO/EHLO command. + * @access private + * @return bool + */ + private function SendHello($hello, $host) { + fputs($this->smtp_conn, $hello . " " . $host . $this->CRLF); + + $rply = $this->get_lines(); + $code = substr($rply,0,3); + + if($this->do_debug >= 2) { + echo "SMTP -> FROM SERVER: " . $rply . $this->CRLF . '
    '; + } + + if($code != 250) { + $this->error = + array("error" => $hello . " not accepted from server", + "smtp_code" => $code, + "smtp_msg" => substr($rply,4)); + if($this->do_debug >= 1) { + echo "SMTP -> ERROR: " . $this->error["error"] . ": " . $rply . $this->CRLF . '
    '; + } + return false; + } + + $this->helo_rply = $rply; + + return true; + } + + /** + * 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 FROM: + * + * SMTP CODE SUCCESS: 250 + * SMTP CODE SUCCESS: 552,451,452 + * SMTP CODE SUCCESS: 500,501,421 + * @access public + * @return bool + */ + public function Mail($from) { + $this->error = null; // so no confusion is caused + + if(!$this->connected()) { + $this->error = array( + "error" => "Called Mail() without being connected"); + return false; + } + + $useVerp = ($this->do_verp ? "XVERP" : ""); + fputs($this->smtp_conn,"MAIL FROM:<" . $from . ">" . $useVerp . $this->CRLF); + + $rply = $this->get_lines(); + $code = substr($rply,0,3); + + if($this->do_debug >= 2) { + echo "SMTP -> FROM SERVER:" . $rply . $this->CRLF . '
    '; + } + + if($code != 250) { + $this->error = + array("error" => "MAIL not accepted from server", + "smtp_code" => $code, + "smtp_msg" => substr($rply,4)); + if($this->do_debug >= 1) { + echo "SMTP -> ERROR: " . $this->error["error"] . ": " . $rply . $this->CRLF . '
    '; + } + return false; + } + return true; + } + + /** + * Sends the quit command to the server and then closes the socket + * if there is no error or the $close_on_error argument is true. + * + * Implements from rfc 821: QUIT + * + * SMTP CODE SUCCESS: 221 + * SMTP CODE ERROR : 500 + * @access public + * @return bool + */ + public function Quit($close_on_error = true) { + $this->error = null; // so there is no confusion + + if(!$this->connected()) { + $this->error = array( + "error" => "Called Quit() without being connected"); + return false; + } + + // send the quit command to the server + fputs($this->smtp_conn,"quit" . $this->CRLF); + + // get any good-bye messages + $byemsg = $this->get_lines(); + + if($this->do_debug >= 2) { + echo "SMTP -> FROM SERVER:" . $byemsg . $this->CRLF . '
    '; + } + + $rval = true; + $e = null; + + $code = substr($byemsg,0,3); + if($code != 221) { + // use e as a tmp var cause Close will overwrite $this->error + $e = array("error" => "SMTP server rejected quit command", + "smtp_code" => $code, + "smtp_rply" => substr($byemsg,4)); + $rval = false; + if($this->do_debug >= 1) { + echo "SMTP -> ERROR: " . $e["error"] . ": " . $byemsg . $this->CRLF . '
    '; + } + } + + if(empty($e) || $close_on_error) { + $this->Close(); + } + + return $rval; + } + + /** + * Sends the command RCPT to the SMTP server with the TO: argument of $to. + * Returns true if the recipient was accepted false if it was rejected. + * + * Implements from rfc 821: RCPT TO: + * + * SMTP CODE SUCCESS: 250,251 + * SMTP CODE FAILURE: 550,551,552,553,450,451,452 + * SMTP CODE ERROR : 500,501,503,421 + * @access public + * @return bool + */ + public function Recipient($to) { + $this->error = null; // so no confusion is caused + + if(!$this->connected()) { + $this->error = array( + "error" => "Called Recipient() without being connected"); + return false; + } + + fputs($this->smtp_conn,"RCPT TO:<" . $to . ">" . $this->CRLF); + + $rply = $this->get_lines(); + $code = substr($rply,0,3); + + if($this->do_debug >= 2) { + echo "SMTP -> FROM SERVER:" . $rply . $this->CRLF . '
    '; + } + + if($code != 250 && $code != 251) { + $this->error = + array("error" => "RCPT not accepted from server", + "smtp_code" => $code, + "smtp_msg" => substr($rply,4)); + if($this->do_debug >= 1) { + echo "SMTP -> ERROR: " . $this->error["error"] . ": " . $rply . $this->CRLF . '
    '; + } + return false; + } + return true; + } + + /** + * Sends the RSET command to abort and transaction that is + * currently in progress. Returns true if successful false + * otherwise. + * + * Implements rfc 821: RSET + * + * SMTP CODE SUCCESS: 250 + * SMTP CODE ERROR : 500,501,504,421 + * @access public + * @return bool + */ + public function Reset() { + $this->error = null; // so no confusion is caused + + if(!$this->connected()) { + $this->error = array( + "error" => "Called Reset() without being connected"); + return false; + } + + fputs($this->smtp_conn,"RSET" . $this->CRLF); + + $rply = $this->get_lines(); + $code = substr($rply,0,3); + + if($this->do_debug >= 2) { + echo "SMTP -> FROM SERVER:" . $rply . $this->CRLF . '
    '; + } + + if($code != 250) { + $this->error = + array("error" => "RSET failed", + "smtp_code" => $code, + "smtp_msg" => substr($rply,4)); + if($this->do_debug >= 1) { + echo "SMTP -> ERROR: " . $this->error["error"] . ": " . $rply . $this->CRLF . '
    '; + } + return false; + } + + return true; + } + + /** + * 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 FROM: + * + * SMTP CODE SUCCESS: 250 + * SMTP CODE SUCCESS: 552,451,452 + * SMTP CODE SUCCESS: 500,501,502,421 + * @access public + * @return bool + */ + public function SendAndMail($from) { + $this->error = null; // so no confusion is caused + + if(!$this->connected()) { + $this->error = array( + "error" => "Called SendAndMail() without being connected"); + return false; + } + + fputs($this->smtp_conn,"SAML FROM:" . $from . $this->CRLF); + + $rply = $this->get_lines(); + $code = substr($rply,0,3); + + if($this->do_debug >= 2) { + echo "SMTP -> FROM SERVER:" . $rply . $this->CRLF . '
    '; + } + + if($code != 250) { + $this->error = + array("error" => "SAML not accepted from server", + "smtp_code" => $code, + "smtp_msg" => substr($rply,4)); + if($this->do_debug >= 1) { + echo "SMTP -> ERROR: " . $this->error["error"] . ": " . $rply . $this->CRLF . '
    '; + } + return false; + } + return true; + } + + /** + * 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 implimented in the future + * + * Implements from rfc 821: TURN + * + * SMTP CODE SUCCESS: 250 + * SMTP CODE FAILURE: 502 + * SMTP CODE ERROR : 500, 503 + * @access public + * @return bool + */ + public function Turn() { + $this->error = array("error" => "This method, TURN, of the SMTP ". + "is not implemented"); + if($this->do_debug >= 1) { + echo "SMTP -> NOTICE: " . $this->error["error"] . $this->CRLF . '
    '; + } + return false; + } + + /** + * Get the current error + * @access public + * @return array + */ + public function getError() { + return $this->error; + } + + ///////////////////////////////////////////////// + // INTERNAL FUNCTIONS + ///////////////////////////////////////////////// + + /** + * Read in as many lines as possible + * 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 private + * @return string + */ + private function get_lines() { + $data = ""; + while($str = @fgets($this->smtp_conn,515)) { + if($this->do_debug >= 4) { + echo "SMTP -> get_lines(): \$data was \"$data\"" . $this->CRLF . '
    '; + echo "SMTP -> get_lines(): \$str is \"$str\"" . $this->CRLF . '
    '; + } + $data .= $str; + if($this->do_debug >= 4) { + echo "SMTP -> get_lines(): \$data is \"$data\"" . $this->CRLF . '
    '; + } + // if 4th character is a space, we are done reading, break the loop + if(substr($str,3,1) == " ") { break; } + } + return $data; + } + +} + +?> \ No newline at end of file diff --git a/src/wp-includes/class-snoopy.php b/src/wp-includes/class-snoopy.php new file mode 100644 index 0000000..66ff71f --- /dev/null +++ b/src/wp-includes/class-snoopy.php @@ -0,0 +1,1256 @@ + +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;$xresults);$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;$xresults);$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;$xresults);$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;$xresults);$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;$xresults);$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 ]+)) # 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("']*?>.*?'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 a redirect meta tag + + if(preg_match("']*?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("']+)'i",$results,$match)) + { + $this->results[] = $results; + for($x=0; $x_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); + + for($curr_header = 0; $curr_header < count($headers); $curr_header++) { + $safer_header = strtr( $headers[$curr_header], "\"", " " ); + $cmdline_params .= " -H \"".$safer_header."\""; + } + + if(!empty($body)) + $cmdline_params .= " -d \"$body\""; + + if($this->read_timeout > 0) + $cmdline_params .= " -m ".$this->read_timeout; + + $headerfile = tempnam($temp_dir, "sno"); + + exec($this->curl_path." -k -D \"$headerfile\"".$cmdline_params." \"".escapeshellcmd($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 a redirect meta tag + + if(preg_match("']*?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("']+)'i",$results,$match)) + { + $this->results[] = $results; + for($x=0; $x_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; $xheaders); $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/src/wp-includes/class-wp-admin-bar.php b/src/wp-includes/class-wp-admin-bar.php new file mode 100644 index 0000000..7db0fa2 --- /dev/null +++ b/src/wp-includes/class-wp-admin-bar.php @@ -0,0 +1,237 @@ +proto = 'https://'; + + $this->user = new stdClass; + $this->menu = new stdClass; + + /* 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; + } + $this->user->locale = get_locale(); + + add_action( 'wp_head', 'wp_admin_bar_header' ); + + add_action( 'admin_head', 'wp_admin_bar_header' ); + + if ( current_theme_supports( 'admin-bar' ) ) { + $admin_bar_args = get_theme_support( 'admin-bar' ); // add_theme_support( 'admin-bar', array( 'callback' => '__return_false') ); + $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' ); + + do_action( 'admin_bar_init' ); + } + + function add_menu( $args = array() ) { + $defaults = array( + 'title' => false, + 'href' => false, + 'parent' => false, // false for a root menu, pass the ID value for a submenu of that menu. + 'id' => false, // defaults to a sanitized title value. + 'meta' => false // array of any of the following options: array( 'html' => '', 'class' => '', 'onclick' => '', target => '', title => '' ); + ); + + $r = wp_parse_args( $args, $defaults ); + extract( $r, EXTR_SKIP ); + + if ( empty( $title ) ) + return false; + + /* Make sure we have a valid ID */ + if ( empty( $id ) ) + $id = esc_attr( sanitize_title( trim( $title ) ) ); + + if ( ! empty( $parent ) ) { + /* Add the menu to the parent item */ + $child = array( 'id' => $id, 'title' => $title, 'href' => $href ); + + if ( ! empty( $meta ) ) + $child['meta'] = $meta; + + $this->add_node( $parent, $this->menu, $child ); + } else { + /* Add the menu item */ + $this->menu->{$id} = array( 'title' => $title, 'href' => $href ); + + if ( ! empty( $meta ) ) + $this->menu->{$id}['meta'] = $meta; + } + } + + function remove_menu( $id ) { + return $this->remove_node( $id, $this->menu ); + } + + function render() { + ?> +
    + + +
    +
    + + +
    +
    +
    + + menu = null; + } + + /* Helpers */ + function recursive_render( $id, &$menu_item ) { ?> + + +
  • " class=""> + onclick="" target="" title=""> + + +
      + $child_menu_item ) : ?> + recursive_render( $child_id, $child_menu_item ); ?> + +
    + + + + + +
  • $menu_item ) { + if ( $parent_id == $id ) { + $menu->{$parent_id}['children']->{$child['id']} = $child; + $child = null; + return true; + } + + if ( ! empty( $menu->{$id}['children'] ) ) + $this->add_node( $parent_id, $menu->{$id}['children'], $child ); + } + + $child = null; + + return false; + } + + function add_menus() { + add_action( 'admin_bar_menu', 'wp_admin_bar_my_account_menu', 10 ); + add_action( 'admin_bar_menu', 'wp_admin_bar_my_sites_menu', 20 ); + add_action( 'admin_bar_menu', 'wp_admin_bar_dashboard_view_site_menu', 25 ); + add_action( 'admin_bar_menu', 'wp_admin_bar_edit_menu', 30 ); + add_action( 'admin_bar_menu', 'wp_admin_bar_shortlink_menu', 80 ); + add_action( 'admin_bar_menu', 'wp_admin_bar_updates_menu', 70 ); + + if ( !is_network_admin() && !is_user_admin() ) { + add_action( 'admin_bar_menu', 'wp_admin_bar_new_content_menu', 40 ); + add_action( 'admin_bar_menu', 'wp_admin_bar_comments_menu', 50 ); + add_action( 'admin_bar_menu', 'wp_admin_bar_appearance_menu', 60 ); + } + + do_action( 'add_admin_bar_menus' ); + } + + function remove_node( $id, &$menu ) { + if ( isset( $menu->$id ) ) { + unset( $menu->$id ); + return true; + } + + foreach( $menu as $menu_item_id => $menu_item ) { + if ( ! empty( $menu->{$menu_item_id}['children'] ) ) + $this->remove_node( $id, $menu->{$menu_item_id}['children'] ); + } + + return false; + } + + // TODO: Convert to a core feature for multisite or remove + function load_user_locale_translations() { + $this->need_to_change_locale = ( get_locale() != $this->user->locale ); + if ( ! $this->need_to_change_locale ) + return; + /* + $this->previous_translations = get_translations_for_domain( 'default' ); + $this->adminbar_locale_filter = lambda( '$_', '$GLOBALS["wp_admin_bar"]->user->locale;' ); + unload_textdomain( 'default' ); + add_filter( 'locale', $this->adminbar_locale_filter ); + load_default_textdomain(); + $this->changed_locale = true; + */ + } + + function unload_user_locale_translations() { + global $l10n; + if ( ! $this->changed_locale ) + return; + /* + remove_filter( 'locale', $this->adminbar_locale_filter ); + $l10n['default'] = &$this->previous_translations; + */ + } +} +?> diff --git a/src/wp-includes/class-wp-ajax-response.php b/src/wp-includes/class-wp-ajax-response.php new file mode 100644 index 0000000..9c225c1 --- /dev/null +++ b/src/wp-includes/class-wp-ajax-response.php @@ -0,0 +1,138 @@ +add($args); + } + + /** + * Append to XML response based on given arguments. + * + * The arguments that can be passed in the $args parameter are below. It is + * also possible to pass a WP_Error object in either the 'id' or 'data' + * argument. The parameter isn't actually optional, content should be given + * in order to send the correct response. + * + * 'what' argument is a string that is the XMLRPC response type. + * 'action' argument is a boolean or string that acts like a nonce. + * 'id' argument can be WP_Error or an integer. + * 'old_id' argument is false by default or an integer of the previous ID. + * 'position' argument is an integer or a string with -1 = top, 1 = bottom, + * html ID = after, -html ID = before. + * 'data' argument is a string with the content or message. + * 'supplemental' argument is an array of strings that will be children of + * the supplemental element. + * + * @since 2.1.0 + * + * @param string|array $args Override defaults. + * @return string XML response. + */ + 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 ); + extract( $r, EXTR_SKIP ); + $position = preg_replace( '/[^a-z0-9:_-]/i', '', $position ); + + if ( is_wp_error($id) ) { + $data = $id; + $id = 0; + } + + $response = ''; + if ( is_wp_error($data) ) { + foreach ( (array) $data->get_error_codes() as $code ) { + $response .= "get_error_message($code) . "]]>"; + 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 .= ""; + + if ( is_scalar($error_data) ) { + $response .= ""; + } elseif ( is_array($error_data) ) { + foreach ( $error_data as $k => $v ) + $response .= "<$k>"; + } + + $response .= ""; + } + } else { + $response = ""; + } + + $s = ''; + if ( is_array($supplemental) ) { + foreach ( $supplemental as $k => $v ) + $s .= "<$k>"; + $s = "$s"; + } + + if ( false === $action ) + $action = $_POST['action']; + + $x = ''; + $x .= ""; // 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 .= ""; + $x .= ""; + + $this->responses[] = $x; + return $x; + } + + /** + * Display XML formatted responses. + * + * Sets the content type header to text/xml. + * + * @since 2.1.0 + */ + function send() { + header('Content-Type: text/xml'); + echo ""; + foreach ( (array) $this->responses as $response ) + echo $response; + echo ''; + die(); + } +} + +?> diff --git a/src/wp-includes/class-wp-error.php b/src/wp-includes/class-wp-error.php new file mode 100644 index 0000000..ba4de05 --- /dev/null +++ b/src/wp-includes/class-wp-error.php @@ -0,0 +1,212 @@ +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 avaiable. + */ + 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. + */ + 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 codee parameter). + */ + 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 + */ + 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 Null, if no errors. + */ + function get_error_data($code = '') { + if ( empty($code) ) + $code = $this->get_error_code(); + + if ( isset($this->error_data[$code]) ) + return $this->error_data[$code]; + return null; + } + + /** + * Append more error messages to list of error messages. + * + * @since 2.1.0 + * @access public + * + * @param string|int $code Error code. + * @param string $message Error message. + * @param mixed $data Optional. Error data. + */ + 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. + */ + function add_data($data, $code = '') { + if ( empty($code) ) + $code = $this->get_error_code(); + + $this->error_data[$code] = $data; + } +} + +/** + * Check whether variable is a WordPress Error. + * + * Looks at the object and if a WP_Error class. Does not check to see if the + * parent is also WP_Error, so can't inherit WP_Error and still use this + * function. + * + * @since 2.1.0 + * + * @param mixed $thing Check if unknown variable is WordPress Error object. + * @return bool True, if WP_Error. False, if not WP_Error. + */ +function is_wp_error($thing) { + if ( is_object($thing) && is_a($thing, 'WP_Error') ) + return true; + return false; +} + +?> \ No newline at end of file diff --git a/src/wp-includes/class-wp-http-ixr-client.php b/src/wp-includes/class-wp-http-ixr-client.php new file mode 100644 index 0000000..9e202ed --- /dev/null +++ b/src/wp-includes/class-wp-http-ixr-client.php @@ -0,0 +1,93 @@ +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 = '/'; + } else { + $this->scheme = 'http'; + $this->server = $server; + $this->path = $path; + $this->port = $port; + } + $this->useragent = 'The Incutio XML-RPC PHP Library'; + $this->timeout = $timeout; + } + + function query() { + $args = func_get_args(); + $method = array_shift($args); + $request = new IXR_Request($method, $args); + $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; + + if ( $this->timeout !== false ) + $args['timeout'] = $this->timeout; + + // Now send the request + if ( $this->debug ) + echo '
    ' . htmlspecialchars($xml) . "\n
    \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 '
    ' . htmlspecialchars( wp_remote_retrieve_body( $response ) ) . "\n
    \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/src/wp-includes/class-wp-walker.php b/src/wp-includes/class-wp-walker.php new file mode 100644 index 0000000..25e0405 --- /dev/null +++ b/src/wp-includes/class-wp-walker.php @@ -0,0 +1,399 @@ +db_fields['id']; + + //display this element + if ( is_array( $args[0] ) ) + $args[0]['has_children'] = ! empty( $children_elements[$element->$id_field] ); + $cb_args = array_merge( array(&$output, $element, $depth), $args); + call_user_func_array(array(&$this, 'start_el'), $cb_args); + + $id = $element->$id_field; + + // 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. + * + * It is a generic function which 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 + * @param int $max_depth + * @return string + */ + function walk( $elements, $max_depth) { + + $args = array_slice(func_get_args(), 2); + $output = ''; + + if ($max_depth < -1) //invalid parameter + return $output; + + if (empty($elements)) //nothing to walk + return $output; + + $id_field = $this->db_fields['id']; + $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 ( 0 == $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. + * + * @package WordPress + * @since 2.7 + * @param int $max_depth = 0 means display all levels; $max_depth > 0 specifies the number of display levels. + * @param int $page_num the specific page number, beginning with 1. + * @return XHTML of the specified page of elements + */ + function paged_walk( $elements, $max_depth, $page_num, $per_page ) { + + /* sanity check */ + if ( empty($elements) || $max_depth < -1 ) + return ''; + + $args = array_slice( func_get_args(), 4 ); + $output = ''; + + $id_field = $this->db_fields['id']; + $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, eg. + * 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; + } + + 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 + 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 ); + + if ( isset($children_elements[$id]) ) + unset( $children_elements[$id] ); + + } +} + +?> \ No newline at end of file diff --git a/src/wp-includes/class-wp-xmlrpc-server.php b/src/wp-includes/class-wp-xmlrpc-server.php new file mode 100644 index 0000000..9d92cec --- /dev/null +++ b/src/wp-includes/class-wp-xmlrpc-server.php @@ -0,0 +1,3615 @@ +methods = array( + // WordPress API + 'wp.getUsersBlogs' => 'this:wp_getUsersBlogs', + '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.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', + + // Blogger API + 'blogger.getUsersBlogs' => 'this:blogger_getUsersBlogs', + 'blogger.getUserInfo' => 'this:blogger_getUserInfo', + 'blogger.getPost' => 'this:blogger_getPost', + 'blogger.getRecentPosts' => 'this:blogger_getRecentPosts', + 'blogger.getTemplate' => 'this:blogger_getTemplate', + 'blogger.setTemplate' => 'this:blogger_setTemplate', + '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.getTemplate' => 'this:blogger_getTemplate', + 'metaWeblog.setTemplate' => 'this:blogger_setTemplate', + '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( ); + $this->methods = apply_filters('xmlrpc_methods', $this->methods); + } + + function serve_request() { + $this->IXR_Server($this->methods); + } + + /** + * Test XMLRPC API by saying, "Hello!" to client. + * + * @since 1.5.0 + * + * @param array $args Method Parameters. + * @return string + */ + function sayHello($args) { + return 'Hello!'; + } + + /** + * Test XMLRPC API by adding two numbers for client. + * + * @since 1.5.0 + * + * @param array $args Method Parameters. + * @return int + */ + function addTwoNumbers($args) { + $number1 = $args[0]; + $number2 = $args[1]; + return $number1 + $number2; + } + + /** + * Check user's credentials. + * + * @since 1.5.0 + * + * @param string $user_login User's username. + * @param string $user_pass User's password. + * @return bool Whether authentication passed. + * @deprecated use wp_xmlrpc_server::login + * @see wp_xmlrpc_server::login + */ + function login_pass_ok($user_login, $user_pass) { + if ( !get_option( 'enable_xmlrpc' ) ) { + $this->error = new IXR_Error( 405, sprintf( __( 'XML-RPC services are disabled on this site. An admin user can enable them at %s'), admin_url('options-writing.php') ) ); + return false; + } + + if (!user_pass_ok($user_login, $user_pass)) { + $this->error = new IXR_Error(403, __('Bad login/pass combination.')); + return false; + } + return true; + } + + /** + * Log user in. + * + * @since 2.8 + * + * @param string $username User's username. + * @param string $password User's password. + * @return mixed WP_User object if authentication passed, false otherwise + */ + function login($username, $password) { + if ( !get_option( 'enable_xmlrpc' ) ) { + $this->error = new IXR_Error( 405, sprintf( __( 'XML-RPC services are disabled on this site. An admin user can enable them at %s'), admin_url('options-writing.php') ) ); + return false; + } + + $user = wp_authenticate($username, $password); + + if (is_wp_error($user)) { + $this->error = new IXR_Error(403, __('Bad login/pass combination.')); + return false; + } + + wp_set_current_user( $user->ID ); + return $user; + } + + /** + * Sanitize string or array of strings for database. + * + * @since 1.5.2 + * + * @param string|array $array Sanitize single string or array of strings. + * @return string|array Type matches $array and sanitized for the database. + */ + function escape(&$array) { + global $wpdb; + + if (!is_array($array)) { + return($wpdb->escape($array)); + } else { + foreach ( (array) $array as $k => $v ) { + if ( is_array($v) ) { + $this->escape($array[$k]); + } else if ( is_object($v) ) { + //skip + } else { + $array[$k] = $wpdb->escape($v); + } + } + } + } + + /** + * Retrieve custom fields for post. + * + * @since 2.5.0 + * + * @param int $post_id Post ID. + * @return array Custom fields, if exist. + */ + 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 ( strpos($meta['meta_key'], '_wp_') === 0 ) { + 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. + */ + 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']; + + if ( isset($meta['key']) ) { + update_meta($meta['id'], $meta['key'], $meta['value']); + } + else { + delete_meta($meta['id']); + } + } + else { + $_POST['metakeyinput'] = $meta['key']; + $_POST['metavalue'] = $meta['value']; + add_meta($post_id); + } + } + } + + /** + * Set up blog options property. + * + * Passes property through 'xmlrpc_blog_options' filter. + * + * @since 2.6.0 + */ + function initialise_blog_option_info( ) { + global $wp_version; + + $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' => $wp_version + ), + 'blog_url' => array( + 'desc' => __( 'Site URL' ), + 'readonly' => true, + 'option' => 'siteurl' + ), + + // 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' + ), + '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' + ) + ); + + $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 parameters. Contains: + * - username + * - password + * @return array. Contains: + * - 'isAdmin' + * - 'url' + * - 'blogid' + * - 'blogName' + * - 'xmlrpc' - url of xmlrpc endpoint + */ + function wp_getUsersBlogs( $args ) { + global $current_site; + // 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; + + + do_action( 'xmlrpc_call', 'wp.getUsersBlogs' ); + + $blogs = (array) get_blogs_of_user( $user->ID ); + $struct = array( ); + + foreach ( $blogs as $blog ) { + // Don't include blogs that aren't hosted at this site + if ( $blog->site_id != $current_site->id ) + continue; + + $blog_id = $blog->userblog_id; + switch_to_blog($blog_id); + $is_admin = current_user_can('manage_options'); + + $struct[] = array( + 'isAdmin' => $is_admin, + 'url' => get_option( 'home' ) . '/', + 'blogid' => (string) $blog_id, + 'blogName' => get_option( 'blogname' ), + 'xmlrpc' => site_url( 'xmlrpc.php' ) + ); + + restore_current_blog( ); + } + + return $struct; + } + + /** + * Retrieve page. + * + * @since 2.2.0 + * + * @param array $args Method parameters. Contains: + * - blog_id + * - page_id + * - username + * - password + * @return array + */ + function wp_getPage($args) { + $this->escape($args); + + $blog_id = (int) $args[0]; + $page_id = (int) $args[1]; + $username = $args[2]; + $password = $args[3]; + + if ( !$user = $this->login($username, $password) ) { + return $this->error; + } + + if ( !current_user_can( 'edit_page', $page_id ) ) + return new IXR_Error( 401, __( 'Sorry, you cannot edit this page.' ) ); + + do_action('xmlrpc_call', 'wp.getPage'); + + // Lookup page info. + $page = get_page($page_id); + + // If we found the page then format the data. + if ( $page->ID && ($page->post_type == 'page') ) { + // Get all of the page content and link. + $full_page = get_extended($page->post_content); + $link = post_permalink($page->ID); + + // Get info the page parent if there is one. + $parent_title = ""; + if ( !empty($page->post_parent) ) { + $parent = get_page($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 = mysql2date('Ymd\TH:i:s', $page->post_date, false); + $page_date_gmt = mysql2date('Ymd\TH:i:s', $page->post_date_gmt, false); + + // For drafts use the GMT version of the date + if ( $page->post_status == 'draft' ) + $page_date_gmt = get_gmt_from_date( mysql2date( 'Y-m-d H:i:s', $page->post_date ), 'Ymd\TH:i:s' ); + + // Pull the categories info together. + $categories = array(); + 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_post_meta( $page->ID, '_wp_page_template', true ); + if ( empty( $page_template ) ) + $page_template = 'default'; + + $page_struct = array( + 'dateCreated' => new IXR_Date($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' => $author->ID, + 'wp_author_display_name' => $author->display_name, + 'date_created_gmt' => new IXR_Date($page_date_gmt), + 'custom_fields' => $this->get_custom_fields($page_id), + 'wp_page_template' => $page_template + ); + + return($page_struct); + } + // 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 parameters. Contains: + * - blog_id + * - username + * - password + * - num_pages + * @return array + */ + function wp_getPages($args) { + $this->escape($args); + + $blog_id = (int) $args[0]; + $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 cannot edit pages.' ) ); + + 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(); + + for ( $i = 0; $i < $num_pages; $i++ ) { + $page = wp_xmlrpc_server::wp_getPage(array( + $blog_id, $pages[$i]->ID, $username, $password + )); + $pages_struct[] = $page; + } + + return($pages_struct); + } + // If no pages were found return an error. + else { + return(array()); + } + } + + /** + * Create new page. + * + * @since 2.2.0 + * + * @param array $args Method parameters. See {@link wp_xmlrpc_server::mw_newPost()} + * @return unknown + */ + function wp_newPage($args) { + // Items not escaped here will be escaped in newPost. + $username = $this->escape($args[1]); + $password = $this->escape($args[2]); + $page = $args[3]; + $publish = $args[4]; + + if ( !$user = $this->login($username, $password) ) + return $this->error; + + do_action('xmlrpc_call', 'wp.newPage'); + + // Make sure the user is allowed to add new pages. + if ( !current_user_can('publish_pages') ) + return(new IXR_Error(401, __('Sorry, you cannot add new pages.'))); + + // 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 parameters. + * @return bool True, if success. + */ + function wp_deletePage($args) { + $this->escape($args); + + $blog_id = (int) $args[0]; + $username = $args[1]; + $password = $args[2]; + $page_id = (int) $args[3]; + + if ( !$user = $this->login($username, $password) ) + return $this->error; + + 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 = wp_get_single_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 do not have the right 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.'))); + + return(true); + } + + /** + * Edit page. + * + * @since 2.2.0 + * + * @param array $args Method parameters. + * @return unknown + */ + function wp_editPage($args) { + // Items not escaped here will be escaped in editPost. + $blog_id = (int) $args[0]; + $page_id = (int) $this->escape($args[1]); + $username = $this->escape($args[2]); + $password = $this->escape($args[3]); + $content = $args[4]; + $publish = $args[5]; + + if ( !$user = $this->login($username, $password) ) + return $this->error; + + do_action('xmlrpc_call', 'wp.editPage'); + + // Get the page data and make sure it is a page. + $actual_page = wp_get_single_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 do not have the right 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 + * + * @param array $args Method parameters. + * @return unknown + */ + function wp_getPageList($args) { + global $wpdb; + + $this->escape($args); + + $blog_id = (int) $args[0]; + $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 cannot edit pages.' ) ); + + 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 formated properly. + $num_pages = count($page_list); + for ( $i = 0; $i < $num_pages; $i++ ) { + $post_date = mysql2date('Ymd\TH:i:s', $page_list[$i]->post_date, false); + $post_date_gmt = mysql2date('Ymd\TH:i:s', $page_list[$i]->post_date_gmt, false); + + $page_list[$i]->dateCreated = new IXR_Date($post_date); + $page_list[$i]->date_created_gmt = new IXR_Date($post_date_gmt); + + // For drafts use the GMT version of the date + if ( $page_list[$i]->post_status == 'draft' ) { + $page_list[$i]->date_created_gmt = get_gmt_from_date( mysql2date( 'Y-m-d H:i:s', $page_list[$i]->post_date ), 'Ymd\TH:i:s' ); + $page_list[$i]->date_created_gmt = new IXR_Date( $page_list[$i]->date_created_gmt ); + } + + 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 parameters. + * @return array + */ + function wp_getAuthors($args) { + + $this->escape($args); + + $blog_id = (int) $args[0]; + $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 cannot edit posts on this site.'))); + + 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 + * + * @param array $args Method parameters. + * @return array + */ + function wp_getTags( $args ) { + $this->escape( $args ); + + $blog_id = (int) $args[0]; + $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.' ) ); + + do_action( 'xmlrpc_call', 'wp.getKeywords' ); + + $tags = array( ); + + if ( $all_tags = get_tags() ) { + foreach( (array) $all_tags as $tag ) { + $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 parameters. + * @return int Category ID. + */ + function wp_newCategory($args) { + $this->escape($args); + + $blog_id = (int) $args[0]; + $username = $args[1]; + $password = $args[2]; + $category = $args[3]; + + if ( !$user = $this->login($username, $password) ) + return $this->error; + + 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 do not have the right 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.'))); + } + + return($cat_id); + } + + /** + * Remove category. + * + * @since 2.5.0 + * + * @param array $args Method parameters. + * @return mixed See {@link wp_delete_term()} for return info. + */ + function wp_deleteCategory($args) { + $this->escape($args); + + $blog_id = (int) $args[0]; + $username = $args[1]; + $password = $args[2]; + $category_id = (int) $args[3]; + + if ( !$user = $this->login($username, $password) ) + return $this->error; + + do_action('xmlrpc_call', 'wp.deleteCategory'); + + if ( !current_user_can('manage_categories') ) + return new IXR_Error( 401, __( 'Sorry, you do not have the right to delete a category.' ) ); + + return wp_delete_term( $category_id, 'category' ); + } + + /** + * Retrieve category list. + * + * @since 2.2.0 + * + * @param array $args Method parameters. + * @return array + */ + function wp_suggestCategories($args) { + $this->escape($args); + + $blog_id = (int) $args[0]; + $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 to this site in order to view categories.' ) ); + + 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 parameters. + * @return array + */ + function wp_getComment($args) { + $this->escape($args); + + $blog_id = (int) $args[0]; + $username = $args[1]; + $password = $args[2]; + $comment_id = (int) $args[3]; + + if ( !$user = $this->login($username, $password) ) + return $this->error; + + if ( !current_user_can( 'moderate_comments' ) ) + return new IXR_Error( 403, __( 'You are not allowed to moderate comments on this site.' ) ); + + do_action('xmlrpc_call', 'wp.getComment'); + + if ( ! $comment = get_comment($comment_id) ) + return new IXR_Error( 404, __( 'Invalid comment ID.' ) ); + + // Format page date. + $comment_date = mysql2date('Ymd\TH:i:s', $comment->comment_date, false); + $comment_date_gmt = mysql2date('Ymd\TH:i:s', $comment->comment_date_gmt, false); + + if ( '0' == $comment->comment_approved ) + $comment_status = 'hold'; + else if ( 'spam' == $comment->comment_approved ) + $comment_status = 'spam'; + else if ( '1' == $comment->comment_approved ) + $comment_status = 'approve'; + else + $comment_status = $comment->comment_approved; + + $link = get_comment_link($comment); + + $comment_struct = array( + 'date_created_gmt' => new IXR_Date($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' => $link, + '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, + ); + + return $comment_struct; + } + + /** + * Retrieve comments. + * + * Besides the common blog_id, 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 {@link WP_Query::query()} for more. + * + * @since 2.7.0 + * + * @param array $args Method parameters. + * @return array. Contains a collection of comments. See {@link wp_xmlrpc_server::wp_getComment()} for a description of each item contents + */ + function wp_getComments($args) { + $raw_args = $args; + $this->escape($args); + + $blog_id = (int) $args[0]; + $username = $args[1]; + $password = $args[2]; + $struct = $args[3]; + + if ( !$user = $this->login($username, $password) ) + return $this->error; + + if ( !current_user_can( 'moderate_comments' ) ) + return new IXR_Error( 401, __( 'Sorry, you cannot edit comments.' ) ); + + do_action('xmlrpc_call', 'wp.getComments'); + + if ( isset($struct['status']) ) + $status = $struct['status']; + else + $status = ''; + + $post_id = ''; + if ( isset($struct['post_id']) ) + $post_id = absint($struct['post_id']); + + $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 ) ); + $num_comments = count($comments); + + if ( ! $num_comments ) + return array(); + + $comments_struct = array(); + + // FIXME: we already have the comments, why query them again? + for ( $i = 0; $i < $num_comments; $i++ ) { + $comment = wp_xmlrpc_server::wp_getComment(array( + $raw_args[0], $raw_args[1], $raw_args[2], $comments[$i]->comment_ID, + )); + $comments_struct[] = $comment; + } + + return $comments_struct; + } + + /** + * Delete a comment. + * + * By default, the comment will be moved to the trash instead of deleted. + * See {@link wp_delete_comment()} for more information on + * this behavior. + * + * @since 2.7.0 + * + * @param array $args Method parameters. Contains: + * - blog_id + * - username + * - password + * - comment_id + * @return mixed {@link wp_delete_comment()} + */ + function wp_deleteComment($args) { + $this->escape($args); + + $blog_id = (int) $args[0]; + $username = $args[1]; + $password = $args[2]; + $comment_ID = (int) $args[3]; + + if ( !$user = $this->login($username, $password) ) + return $this->error; + + if ( !current_user_can( 'moderate_comments' ) ) + return new IXR_Error( 403, __( 'You are not allowed to moderate comments on this site.' ) ); + + if ( !current_user_can( 'edit_comment', $comment_ID ) ) + return new IXR_Error( 403, __( 'You are not allowed to moderate comments on this site.' ) ); + + do_action('xmlrpc_call', 'wp.deleteComment'); + + if ( ! get_comment($comment_ID) ) + return new IXR_Error( 404, __( 'Invalid comment ID.' ) ); + + return wp_delete_comment($comment_ID); + } + + /** + * Edit comment. + * + * Besides the common blog_id, 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 {@link get_comment_statuses()} for more details + * + * @since 2.7.0 + * + * @param array $args. Contains: + * - blog_id + * - username + * - password + * - comment_id + * - content_struct + * @return bool True, on success. + */ + function wp_editComment($args) { + $this->escape($args); + + $blog_id = (int) $args[0]; + $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 ( !current_user_can( 'moderate_comments' ) ) + return new IXR_Error( 403, __( 'You are not allowed to moderate comments on this site.' ) ); + + if ( !current_user_can( 'edit_comment', $comment_ID ) ) + return new IXR_Error( 403, __( 'You are not allowed to moderate comments on this site.' ) ); + + do_action('xmlrpc_call', 'wp.editComment'); + + if ( ! get_comment($comment_ID) ) + return new IXR_Error( 404, __( 'Invalid comment ID.' ) ); + + 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'] ) ) { + $dateCreated = str_replace( 'Z', '', $content_struct['date_created_gmt']->getIso() ) . 'Z'; // We know this is supposed to be GMT, so we're going to slap that Z on there by force + $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. Something wrong happened.')); + + return true; + } + + /** + * Create new comment. + * + * @since 2.7.0 + * + * @param array $args Method parameters. + * @return mixed {@link wp_new_comment()} + */ + function wp_newComment($args) { + global $wpdb; + + $this->escape($args); + + $blog_id = (int) $args[0]; + $username = $args[1]; + $password = $args[2]; + $post = $args[3]; + $content_struct = $args[4]; + + $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' ) ); + else if ( !$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.' ) ); + + $comment['comment_post_ID'] = $post_id; + + if ( $logged_in ) { + $comment['comment_author'] = $wpdb->escape( $user->display_name ); + $comment['comment_author_email'] = $wpdb->escape( $user->user_email ); + $comment['comment_author_url'] = $wpdb->escape( $user->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; + + $comment['comment_content'] = isset($content_struct['content']) ? $content_struct['content'] : null; + + do_action('xmlrpc_call', 'wp.newComment'); + + return wp_new_comment($comment); + } + + /** + * Retrieve all of the comment status. + * + * @since 2.7.0 + * + * @param array $args Method parameters. + * @return array + */ + function wp_getCommentStatusList($args) { + $this->escape( $args ); + + $blog_id = (int) $args[0]; + $username = $args[1]; + $password = $args[2]; + + if ( !$user = $this->login($username, $password) ) + return $this->error; + + if ( !current_user_can( 'moderate_comments' ) ) + return new IXR_Error( 403, __( 'You are not allowed access to details about this site.' ) ); + + do_action('xmlrpc_call', 'wp.getCommentStatusList'); + + return get_comment_statuses( ); + } + + /** + * Retrieve comment count. + * + * @since 2.5.0 + * + * @param array $args Method parameters. + * @return array + */ + function wp_getCommentCount( $args ) { + $this->escape($args); + + $blog_id = (int) $args[0]; + $username = $args[1]; + $password = $args[2]; + $post_id = (int) $args[3]; + + if ( !$user = $this->login($username, $password) ) + return $this->error; + + if ( !current_user_can( 'edit_posts' ) ) + return new IXR_Error( 403, __( 'You are not allowed access to details about comments.' ) ); + + 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 parameters. + * @return array + */ + function wp_getPostStatusList( $args ) { + $this->escape( $args ); + + $blog_id = (int) $args[0]; + $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, __( 'You are not allowed access to details about this site.' ) ); + + do_action('xmlrpc_call', 'wp.getPostStatusList'); + + return get_post_statuses( ); + } + + /** + * Retrieve page statuses. + * + * @since 2.5.0 + * + * @param array $args Method parameters. + * @return array + */ + function wp_getPageStatusList( $args ) { + $this->escape( $args ); + + $blog_id = (int) $args[0]; + $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, __( 'You are not allowed access to details about this site.' ) ); + + do_action('xmlrpc_call', 'wp.getPageStatusList'); + + return get_page_statuses( ); + } + + /** + * Retrieve page templates. + * + * @since 2.6.0 + * + * @param array $args Method parameters. + * @return array + */ + function wp_getPageTemplates( $args ) { + $this->escape( $args ); + + $blog_id = (int) $args[0]; + $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, __( '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 parameters. + * @return array + */ + function wp_getOptions( $args ) { + $this->escape( $args ); + + $blog_id = (int) $args[0]; + $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 + */ + function _getOptions($options) { + $data = array( ); + 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']); + } + } + } + + return $data; + } + + /** + * Update blog options. + * + * @since 2.6.0 + * + * @param array $args Method parameters. + * @return unknown + */ + function wp_setOptions( $args ) { + $this->escape( $args ); + + $blog_id = (int) $args[0]; + $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, __( 'You are not allowed to update options.' ) ); + + 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'], $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 parameters. Contains: + * - blog_id + * - username + * - password + * - attachment_id + * @return array. Assocciative array containing: + * - 'date_created_gmt' + * - 'parent' + * - 'link' + * - 'thumbnail' + * - 'title' + * - 'caption' + * - 'description' + * - 'metadata' + */ + function wp_getMediaItem($args) { + $this->escape($args); + + $blog_id = (int) $args[0]; + $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, __( 'You are not allowed to upload files to this site.' ) ); + + do_action('xmlrpc_call', 'wp.getMediaItem'); + + if ( ! $attachment = get_post($attachment_id) ) + return new IXR_Error( 404, __( 'Invalid attachment ID.' ) ); + + // Format page date. + $attachment_date = mysql2date('Ymd\TH:i:s', $attachment->post_date, false); + $attachment_date_gmt = mysql2date('Ymd\TH:i:s', $attachment->post_date_gmt, false); + + $link = wp_get_attachment_url($attachment->ID); + $thumbnail_link = wp_get_attachment_thumb_url($attachment->ID); + + $attachment_struct = array( + 'date_created_gmt' => new IXR_Date($attachment_date_gmt), + 'parent' => $attachment->post_parent, + 'link' => $link, + 'thumbnail' => $thumbnail_link, + 'title' => $attachment->post_title, + 'caption' => $attachment->post_excerpt, + 'description' => $attachment->post_content, + 'metadata' => wp_get_attachment_metadata($attachment->ID), + ); + + return $attachment_struct; + } + + /** + * Retrieves a collection of media library items (or attachments) + * + * Besides the common blog_id, 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 {@link 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 parameters. Contains: + * - blog_id + * - username + * - password + * - filter + * @return array. Contains a collection of media items. See {@link wp_xmlrpc_server::wp_getMediaItem()} for a description of each item contents + */ + function wp_getMediaLibrary($args) { + $raw_args = $args; + $this->escape($args); + + $blog_id = (int) $args[0]; + $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 cannot upload files.' ) ); + + 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 ) ); + $num_attachments = count($attachments); + + if ( ! $num_attachments ) + return array(); + + $attachments_struct = array(); + + foreach ($attachments as $attachment ) + $attachments_struct[] = $this->wp_getMediaItem( array( $raw_args[0], $raw_args[1], $raw_args[2], $attachment->ID ) ); + + return $attachments_struct; + } + + /** + * Retrives a list of post formats used by the site + * + * @since 3.1 + * + * @param array $args Method parameters. Contains: + * - blog_id + * - username + * - password + * @return array + */ + function wp_getPostFormats( $args ) { + $this->escape( $args ); + + $blog_id = (int) $args[0]; + $username = $args[1]; + $password = $args[2]; + + if ( !$user = $this->login( $username, $password ) ) + return $this->error; + + 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['all'] = $formats; + $data['supported'] = $supported[0]; + + $formats = $data; + } + } + } + + return $formats; + } + + /* Blogger API functions. + * specs on http://plant.blogger.com/api and http://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 parameters. + * @return array + */ + function blogger_getUsersBlogs($args) { + 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; + + 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' ) + ); + + return array($struct); + } + + /** + * Private function for retrieving a users blogs for multisite setups + * + * @access protected + */ + function _multisite_getUsersBlogs($args) { + global $current_blog; + $domain = $current_blog->domain; + $path = $current_blog->path . 'xmlrpc.php'; + $protocol = is_ssl() ? 'https' : 'http'; + + $rpc = new IXR_Client("$protocol://{$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 parameters. + * @return array + */ + 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 do not have access to user data on this site.' ) ); + + 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 parameters. + * @return array + */ + 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; + + if ( !current_user_can( 'edit_post', $post_ID ) ) + return new IXR_Error( 401, __( 'Sorry, you cannot edit this post.' ) ); + + do_action('xmlrpc_call', 'blogger.getPost'); + + $post_data = wp_get_single_post($post_ID, ARRAY_A); + + $categories = implode(',', wp_get_post_categories($post_ID)); + + $content = ''.stripslashes($post_data['post_title']).''; + $content .= ''.$categories.''; + $content .= stripslashes($post_data['post_content']); + + $struct = array( + 'userid' => $post_data['post_author'], + 'dateCreated' => new IXR_Date(mysql2date('Ymd\TH:i:s', $post_data['post_date'], false)), + 'content' => $content, + 'postid' => (string) $post_data['ID'] + ); + + return $struct; + } + + /** + * Retrieve list of recent posts. + * + * @since 1.5.0 + * + * @param array $args Method parameters. + * @return array + */ + function blogger_getRecentPosts($args) { + + $this->escape($args); + + // $args[0] = appkey - ignored + $blog_ID = (int) $args[1]; /* though we don't use it yet */ + $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; + + 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; + } + + foreach ($posts_list as $entry) { + if ( !current_user_can( 'edit_post', $entry['ID'] ) ) + continue; + + $post_date = mysql2date('Ymd\TH:i:s', $entry['post_date'], false); + $categories = implode(',', wp_get_post_categories($entry['ID'])); + + $content = ''.stripslashes($entry['post_title']).''; + $content .= ''.$categories.''; + $content .= stripslashes($entry['post_content']); + + $struct[] = array( + 'userid' => $entry['post_author'], + 'dateCreated' => new IXR_Date($post_date), + 'content' => $content, + 'postid' => (string) $entry['ID'], + ); + + } + + $recent_posts = array(); + for ( $j=0; $jescape($args); + + $blog_ID = (int) $args[1]; + $username = $args[2]; + $password = $args[3]; + $template = $args[4]; /* could be 'main' or 'archiveIndex', but we don't use it */ + + if ( !$user = $this->login($username, $password) ) + return $this->error; + + do_action('xmlrpc_call', 'blogger.getTemplate'); + + if ( !current_user_can('edit_themes') ) + return new IXR_Error(401, __('Sorry, this user can not edit the template.')); + + /* warning: here we make the assumption that the blog's URL is on the same server */ + $filename = get_option('home') . '/'; + $filename = preg_replace('#https?://.+?/#', $_SERVER['DOCUMENT_ROOT'].'/', $filename); + + $f = fopen($filename, 'r'); + $content = fread($f, filesize($filename)); + fclose($f); + + /* so it is actually editable with a windows/mac client */ + // FIXME: (or delete me) do we really want to cater to bad clients at the expense of good ones by BEEPing up their line breaks? commented. $content = str_replace("\n", "\r\n", $content); + + return $content; + } + + /** + * Updates the content of blog_filename. + * + * @since 1.5.0 + * + * @param array $args Method parameters. + * @return bool True when done. + */ + function blogger_setTemplate($args) { + + $this->escape($args); + + $blog_ID = (int) $args[1]; + $username = $args[2]; + $password = $args[3]; + $content = $args[4]; + $template = $args[5]; /* could be 'main' or 'archiveIndex', but we don't use it */ + + if ( !$user = $this->login($username, $password) ) + return $this->error; + + do_action('xmlrpc_call', 'blogger.setTemplate'); + + if ( !current_user_can('edit_themes') ) + return new IXR_Error(401, __('Sorry, this user cannot edit the template.')); + + /* warning: here we make the assumption that the blog's URL is on the same server */ + $filename = get_option('home') . '/'; + $filename = preg_replace('#https?://.+?/#', $_SERVER['DOCUMENT_ROOT'].'/', $filename); + + if ($f = fopen($filename, 'w+')) { + fwrite($f, $content); + fclose($f); + } else { + return new IXR_Error(500, __('Either the file is not writable, or something wrong happened. The file has not been updated.')); + } + + return true; + } + + /** + * Create new post. + * + * @since 1.5.0 + * + * @param array $args Method parameters. + * @return int + */ + function blogger_newPost($args) { + + $this->escape($args); + + $blog_ID = (int) $args[1]; /* though we don't use it yet */ + $username = $args[2]; + $password = $args[3]; + $content = $args[4]; + $publish = $args[5]; + + if ( !$user = $this->login($username, $password) ) + return $this->error; + + do_action('xmlrpc_call', 'blogger.newPost'); + + $cap = ($publish) ? 'publish_posts' : 'edit_posts'; + if ( !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('blog_ID', '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. Something wrong happened.')); + + $this->attach_uploads( $post_ID, $post_content ); + + logIO('O', "Posted ! ID: $post_ID"); + + return $post_ID; + } + + /** + * Edit a post. + * + * @since 1.5.0 + * + * @param array $args Method parameters. + * @return bool true when done. + */ + 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; + + do_action('xmlrpc_call', 'blogger.editPost'); + + $actual_post = wp_get_single_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 do not have the right to edit this post.')); + + extract($actual_post, EXTR_SKIP); + + if ( ('publish' == $post_status) && !current_user_can('publish_posts') ) + return new IXR_Error(401, __('Sorry, you do not have the right to publish this post.')); + + $post_title = xmlrpc_getposttitle($content); + $post_category = xmlrpc_getpostcategory($content); + $post_content = xmlrpc_removepostdata($content); + + $postdata = compact('ID', 'post_content', 'post_title', 'post_category', 'post_status', 'post_excerpt'); + + $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( $ID, $post_content ); + + return true; + } + + /** + * Remove a post. + * + * @since 1.5.0 + * + * @param array $args Method parameters. + * @return bool True when post is deleted. + */ + function blogger_deletePost($args) { + $this->escape($args); + + $post_ID = (int) $args[1]; + $username = $args[2]; + $password = $args[3]; + $publish = $args[4]; + + if ( !$user = $this->login($username, $password) ) + return $this->error; + + do_action('xmlrpc_call', 'blogger.deletePost'); + + $actual_post = wp_get_single_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 do not have the right to delete this post.')); + + $result = wp_delete_post($post_ID); + + if ( !$result ) + return new IXR_Error(500, __('For some strange yet very annoying reason, this post could not be deleted.')); + + 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 + * + * @since 1.5.0 + * + * @param array $args Method parameters. Contains: + * - blog_id + * - username + * - password + * - content_struct + * - publish + * @return int + */ + function mw_newPost($args) { + $this->escape($args); + + $blog_ID = (int) $args[0]; // we will support this in the near future + $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; + + 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 ('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 ('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 ('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( $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, __('You are not allowed to post as this user'))); + break; + case "page": + if ( !current_user_can('edit_others_pages') ) + return(new IXR_Error(401, __('You are not allowed to create pages as this user'))); + break; + default: + return(new IXR_Error(401, __('Invalid post type.'))); + break; + } + $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_option('default_comment_status'); + 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_option('default_comment_status'); + break; + } + } + } else { + $comment_status = get_option('default_comment_status'); + } + + 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_option('default_ping_status'); + 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_option('default_ping_status'); + break; + } + } + } else { + $ping_status = get_option('default_ping_status'); + } + + 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'] ) ) + $dateCreated = str_replace( 'Z', '', $content_struct['date_created_gmt']->getIso() ) . 'Z'; // We know this is supposed to be GMT, so we're going to slap that Z on there by force + 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 = current_time('mysql'); + $post_date_gmt = current_time('mysql', 1); + } + + $post_category = array(); + if ( isset( $content_struct['categories'] ) ) { + $catnames = $content_struct['categories']; + logIO('O', 'Post cats: ' . var_export($catnames,true)); + + if ( is_array($catnames) ) { + foreach ($catnames as $cat) { + $post_category[] = get_cat_ID($cat); + } + } + } + + // We've got all the data -- post it: + $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 = 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. Something wrong happened.')); + + // Only posts can be sticky + if ( $post_type == 'post' && isset( $content_struct['sticky'] ) ) { + if ( $content_struct['sticky'] == true ) + stick_post( $post_ID ); + elseif ( $content_struct['sticky'] == false ) + unstick_post( $post_ID ); + } + + if ( isset($content_struct['custom_fields']) ) + $this->set_custom_fields($post_ID, $content_struct['custom_fields']); + + // 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'] ) ) + wp_set_post_terms( $post_ID, array( 'post-format-' . $content_struct['wp_post_format'] ), 'post_format' ); + + logIO('O', "Posted ! ID: $post_ID"); + + return strval($post_ID); + } + + 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']; + $found = false; + foreach ( (array) get_post_custom($post_ID) as $key => $val) { + if ($key == 'enclosure') { + foreach ( (array) $val as $enc ) { + if ($enc == $encstring) { + $found = true; + break 2; + } + } + } + } + if (!$found) + add_post_meta( $post_ID, 'enclosure', $encstring ); + } + } + + /** + * Attach upload to a post. + * + * @since 2.1.0 + * + * @param int $post_ID Post ID. + * @param string $post_content Post Content for attachment. + */ + 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 ( 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 parameters. + * @return bool True on success. + */ + function mw_editPost($args) { + + $this->escape($args); + + $post_ID = (int) $args[0]; + $username = $args[1]; + $password = $args[2]; + $content_struct = $args[3]; + $publish = $args[4]; + + if ( !$user = $this->login($username, $password) ) + return $this->error; + + do_action('xmlrpc_call', 'metaWeblog.editPost'); + + $cap = ( $publish ) ? 'publish_posts' : 'edit_posts'; + $error_message = __( 'Sorry, you are not allowed to publish posts on this site.' ); + $post_type = 'post'; + $page_template = ''; + if ( !empty( $content_struct['post_type'] ) ) { + if ( $content_struct['post_type'] == 'page' ) { + if ( $publish || '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 || '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 || '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( $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' ) ); + } + } + + $postdata = wp_get_single_post($post_ID, ARRAY_A); + + // If there is no post data for the give post id, stop + // now and return an error. Other wise a new post will be + // created (which was the old behavior). + if ( empty($postdata["ID"]) ) + return(new IXR_Error(404, __('Invalid post ID.'))); + + $this->escape($postdata); + extract($postdata, EXTR_SKIP); + + // Let WordPress manage slug if none was provided. + $post_name = ""; + $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']; + + $post_author = $postdata['post_author']; + + // Only set the post_author if one is set. + 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, __('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, __('You are not allowed to change the page author as this user.'))); + break; + default: + return(new IXR_Error(401, __('Invalid post type.'))); + break; + } + $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_option('default_comment_status'); + 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_option('default_comment_status'); + 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_option('default_ping_status'); + 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_option('default_ping_status'); + break; + } + } + } + + $post_title = isset( $content_struct['title'] ) ? $content_struct['title'] : null; + $post_content = isset( $content_struct['description'] ) ? $content_struct['description'] : null; + + $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); + } + } + } + + $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; + + $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) ) { + if ( ( 'page' == $post_type ) && !current_user_can('publish_pages') ) + return new IXR_Error(401, __('Sorry, you do not have the right to publish this page.')); + else if ( !current_user_can('publish_posts') ) + return new IXR_Error(401, __('Sorry, you do not have the right 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'] ) ) + $dateCreated = str_replace( 'Z', '', $content_struct['date_created_gmt']->getIso() ) . 'Z'; // We know this is supposed to be GMT, so we're going to slap that Z on there by force + 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 = $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', '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. Something wrong happened.')); + + // Only posts can be sticky + if ( $post_type == 'post' && isset( $content_struct['sticky'] ) ) { + if ( $content_struct['sticky'] == true ) + stick_post( $post_ID ); + elseif ( $content_struct['sticky'] == false ) + unstick_post( $post_ID ); + } + + if ( isset($content_struct['custom_fields']) ) + $this->set_custom_fields($post_ID, $content_struct['custom_fields']); + + // 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'] ) ) + wp_set_post_terms( $post_ID, array( 'post-format-' . $content_struct['wp_post_format'] ), 'post_format' ); + + logIO('O',"(MW) Edited ! ID: $post_ID"); + + return true; + } + + /** + * Retrieve post. + * + * @since 1.5.0 + * + * @param array $args Method parameters. + * @return array + */ + 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; + + if ( !current_user_can( 'edit_post', $post_ID ) ) + return new IXR_Error( 401, __( 'Sorry, you cannot edit this post.' ) ); + + do_action('xmlrpc_call', 'metaWeblog.getPost'); + + $postdata = wp_get_single_post($post_ID, ARRAY_A); + + if ($postdata['post_date'] != '') { + $post_date = mysql2date('Ymd\TH:i:s', $postdata['post_date'], false); + $post_date_gmt = mysql2date('Ymd\TH:i:s', $postdata['post_date_gmt'], false); + + // For drafts use the GMT version of the post date + if ( $postdata['post_status'] == 'draft' ) + $post_date_gmt = get_gmt_from_date( mysql2date( 'Y-m-d H:i:s', $postdata['post_date'] ), 'Ymd\TH:i:s' ); + + $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 = post_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 = split("\n", $enc); + $enclosure['url'] = trim(htmlspecialchars($encdata[0])); + $enclosure['length'] = (int) trim($encdata[1]); + $enclosure['type'] = trim($encdata[2]); + break 2; + } + } + } + + $resp = array( + 'dateCreated' => new IXR_Date($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'], + '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' => $author->ID, + 'wp_author_display_name' => $author->display_name, + 'date_created_gmt' => new IXR_Date($post_date_gmt), + 'post_status' => $postdata['post_status'], + 'custom_fields' => $this->get_custom_fields($post_ID), + 'wp_post_format' => $post_format, + 'sticky' => $sticky + ); + + if ( !empty($enclosure) ) $resp['enclosure'] = $enclosure; + + 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 parameters. + * @return array + */ + function mw_getRecentPosts($args) { + + $this->escape($args); + + $blog_ID = (int) $args[0]; + $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; + + do_action('xmlrpc_call', 'metaWeblog.getRecentPosts'); + + $posts_list = wp_get_recent_posts( $query ); + + if ( !$posts_list ) + return array( ); + + foreach ($posts_list as $entry) { + if ( !current_user_can( 'edit_post', $entry['ID'] ) ) + continue; + + $post_date = mysql2date('Ymd\TH:i:s', $entry['post_date'], false); + $post_date_gmt = mysql2date('Ymd\TH:i:s', $entry['post_date_gmt'], false); + + // For drafts use the GMT version of the date + if ( $entry['post_status'] == 'draft' ) + $post_date_gmt = get_gmt_from_date( mysql2date( 'Y-m-d H:i:s', $entry['post_date'] ), 'Ymd\TH:i:s' ); + + $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 = post_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'; + + $struct[] = array( + 'dateCreated' => new IXR_Date($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'], + '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' => $author->ID, + 'wp_author_display_name' => $author->display_name, + 'date_created_gmt' => new IXR_Date($post_date_gmt), + 'post_status' => $entry['post_status'], + 'custom_fields' => $this->get_custom_fields($entry['ID']), + 'wp_post_format' => $post_format + ); + + } + + $recent_posts = array(); + for ( $j=0; $jescape($args); + + $blog_ID = (int) $args[0]; + $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.' ) ); + + do_action('xmlrpc_call', 'metaWeblog.getCategories'); + + $categories_struct = array(); + + if ( $cats = get_categories(array('get' => 'all')) ) { + foreach ( $cats as $cat ) { + $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 + * + * @param array $args Method parameters. + * @return array + */ + function mw_newMediaObject($args) { + global $wpdb; + + $blog_ID = (int) $args[0]; + $username = $wpdb->escape($args[1]); + $password = $wpdb->escape($args[2]); + $data = $args[3]; + + $name = sanitize_file_name( $data['name'] ); + $type = $data['type']; + $bits = $data['bits']; + + logIO('O', '(MW) Received '.strlen($bits).' bytes'); + + if ( !$user = $this->login($username, $password) ) + return $this->error; + + do_action('xmlrpc_call', 'metaWeblog.newMediaObject'); + + if ( !current_user_can('upload_files') ) { + logIO('O', '(MW) User does not have upload_files capability'); + $this->error = new IXR_Error(401, __('You are not allowed to upload files to this site.')); + return $this->error; + } + + if ( $upload_err = apply_filters( 'pre_upload_error', false ) ) + return new IXR_Error(500, $upload_err); + + if ( !empty($data['overwrite']) && ($data['overwrite'] == true) ) { + // Get postmeta info on the object. + $old_file = $wpdb->get_row(" + SELECT ID + FROM {$wpdb->posts} + WHERE post_title = '{$name}' + AND post_type = 'attachment' + "); + + // Delete previous file. + wp_delete_attachment($old_file->ID); + + // Make sure the new name is different by pre-pending the + // previous post id. + $filename = preg_replace('/^wpid\d+-/', '', $name); + $name = "wpid{$old_file->ID}-{$filename}"; + } + + $upload = wp_upload_bits($name, NULL, $bits); + if ( ! empty($upload['error']) ) { + $errorString = sprintf(__('Could not write file %1$s (%2$s)'), $name, $upload['error']); + logIO('O', '(MW) ' . $errorString); + return new IXR_Error(500, $errorString); + } + // Construct the attachment array + // attach to post_id 0 + $post_id = 0; + $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'] ) ); + + return apply_filters( 'wp_handle_upload', array( 'file' => $name, 'url' => $upload[ 'url' ], 'type' => $type ), 'upload' ); + } + + /* 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 parameters. + * @return array + */ + function mt_getRecentPostTitles($args) { + + $this->escape($args); + + $blog_ID = (int) $args[0]; + $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; + + 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; + } + + foreach ($posts_list as $entry) { + if ( !current_user_can( 'edit_post', $entry['ID'] ) ) + continue; + + $post_date = mysql2date('Ymd\TH:i:s', $entry['post_date'], false); + $post_date_gmt = mysql2date('Ymd\TH:i:s', $entry['post_date_gmt'], false); + + // For drafts use the GMT version of the date + if ( $entry['post_status'] == 'draft' ) + $post_date_gmt = get_gmt_from_date( mysql2date( 'Y-m-d H:i:s', $entry['post_date'] ), 'Ymd\TH:i:s' ); + + $struct[] = array( + 'dateCreated' => new IXR_Date($post_date), + 'userid' => $entry['post_author'], + 'postid' => (string) $entry['ID'], + 'title' => $entry['post_title'], + 'post_status' => $entry['post_status'], + 'date_created_gmt' => new IXR_Date($post_date_gmt) + ); + + } + + $recent_posts = array(); + for ( $j=0; $jescape($args); + + $blog_ID = (int) $args[0]; + $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.' ) ); + + do_action('xmlrpc_call', 'mt.getCategoryList'); + + $categories_struct = array(); + + if ( $cats = get_categories(array('hide_empty' => 0, 'hierarchical' => 0)) ) { + foreach ( $cats as $cat ) { + $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 parameters. + * @return array + */ + 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 ( !current_user_can( 'edit_post', $post_ID ) ) + return new IXR_Error( 401, __( 'Sorry, you can not edit this post.' ) ); + + 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 parameters. + * @return bool True on success. + */ + 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; + + do_action('xmlrpc_call', 'mt.setPostCategories'); + + if ( !current_user_can('edit_post', $post_ID) ) + return new IXR_Error(401, __('Sorry, you cannot edit this post.')); + + 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 + * + * @param array $args Method parameters. + * @return array + */ + function mt_supportedMethods($args) { + + do_action('xmlrpc_call', 'mt.supportedMethods'); + + $supported_methods = array(); + foreach ( $this->methods as $key => $value ) { + $supported_methods[] = $key; + } + + return $supported_methods; + } + + /** + * Retrieve an empty array because we don't support per-post text filters. + * + * @since 1.5.0 + * + * @param array $args Method parameters. + */ + function mt_supportedTextFilters($args) { + do_action('xmlrpc_call', 'mt.supportedTextFilters'); + return apply_filters('xmlrpc_text_filters', array()); + } + + /** + * Retrieve trackbacks sent to a given post. + * + * @since 1.5.0 + * + * @param array $args Method parameters. + * @return mixed + */ + function mt_getTrackbackPings($args) { + + global $wpdb; + + $post_ID = intval($args); + + do_action('xmlrpc_call', 'mt.getTrackbackPings'); + + $actual_post = wp_get_single_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 parameters. + * @return int + */ + 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; + + do_action('xmlrpc_call', 'mt.publishPost'); + + if ( !current_user_can('publish_posts') || !current_user_can('edit_post', $post_ID) ) + return new IXR_Error(401, __('Sorry, you cannot publish this post.')); + + $postdata = wp_get_single_post($post_ID,ARRAY_A); + + $postdata['post_status'] = 'publish'; + + // retain old cats + $cats = wp_get_post_categories($post_ID); + $postdata['post_category'] = $cats; + $this->escape($postdata); + + $result = wp_update_post($postdata); + + return $result; + } + + /* PingBack functions + * specs on www.hixie.ch/specs/pingback/pingback + */ + + /** + * Retrieves a pingback and registers it. + * + * @since 1.5.0 + * + * @param array $args Method parameters. + * @return array + */ + function pingback_ping($args) { + global $wpdb; + + do_action('xmlrpc_call', 'pingback.ping'); + + $this->escape($args); + + $pagelinkedfrom = $args[0]; + $pagelinkedto = $args[1]; + + $title = ''; + + $pagelinkedfrom = str_replace('&', '&', $pagelinkedfrom); + $pagelinkedto = str_replace('&', '&', $pagelinkedto); + $pagelinkedto = str_replace('&', '&', $pagelinkedto); + + // 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 new IXR_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 = 'url_to_postid()'; + } elseif ( 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]; + $way = 'from the path'; + } elseif ( 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]; + $way = 'from the querystring'; + } elseif ( isset($urltest['fragment']) ) { + // an #anchor is there, it's either... + if ( intval($urltest['fragment']) ) { + // ...an integer #XXXX (simpliest case) + $post_ID = (int) $urltest['fragment']; + $way = 'from the fragment (numeric)'; + } elseif ( preg_match('/post-[0-9]+/',$urltest['fragment']) ) { + // ...a post id in the form 'post-###' + $post_ID = preg_replace('/[^0-9]+/', '', $urltest['fragment']); + $way = 'from the fragment (post-###)'; + } 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", like_escape( $title ) ); + if (! ($post_ID = $wpdb->get_var($sql)) ) { + // returning unknown error '0' is better than die()ing + return new IXR_Error(0, ''); + } + $way = 'from the fragment (title)'; + } + } else { + // TODO: Attempt to extract a post ID from the given URL + return new IXR_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; + + + logIO("O","(PB) URL='$pagelinkedto' ID='$post_ID' Found='$way'"); + + $post = get_post($post_ID); + + if ( !$post ) // Post_ID not found + return new IXR_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 new IXR_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 new IXR_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 new IXR_Error( 48, __( 'The pingback has already been registered.' ) ); + + // very stupid, but gives time to the 'from' server to publish ! + sleep(1); + + // Let's check the remote site + $linea = wp_remote_fopen( $pagelinkedfrom ); + if ( !$linea ) + return new IXR_Error(16, __('The source URL does not exist.')); + + $linea = apply_filters('pre_remote_source', $linea, $pagelinkedto); + + // Work around bug in strip_tags(): + $linea = str_replace(']*>/", "\n\n", $linea ); + + preg_match('|([^<]*?)|is', $linea, $matchtitle); + $title = $matchtitle[1]; + if ( empty( $title ) ) + return new IXR_Error(32, __('We cannot find a title on that page.')); + + $linea = strip_tags( $linea, '' ); // just keep the tag we need + + $p = explode( "\n\n", $linea ); + + $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 new IXR_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 = $wpdb->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'); + + $comment_ID = wp_new_comment($commentdata); + do_action('pingback_post', $comment_ID); + + 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 + * + * @param array $args Method parameters. + * @return array + */ + function pingback_extensions_getPingbacks($args) { + + global $wpdb; + + do_action('xmlrpc_call', 'pingback.extensions.getPingbacks'); + + $this->escape($args); + + $url = $args; + + $post_ID = url_to_postid($url); + if ( !$post_ID ) { + // We aren't sure that the resource is available and/or pingback enabled + return new IXR_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 = wp_get_single_post($post_ID, ARRAY_A); + + if ( !$actual_post ) { + // No such post = resource not found + return new IXR_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; + } +} +?> diff --git a/src/wp-includes/class-wp.php b/src/wp-includes/class-wp.php new file mode 100644 index 0000000..cf671bd --- /dev/null +++ b/src/wp-includes/class-wp.php @@ -0,0 +1,599 @@ +public_query_vars) ) + $this->public_query_vars[] = $qv; + } + + /** + * Set the value of a query variable. + * + * @since 2.3.0 + * + * @param string $key Query variable name. + * @param mixed $value Query variable value. + */ + 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 + * + * @param array|string $extra_query_vars Set the extra query variables. + */ + function parse_request($extra_query_vars = '') { + global $wp_rewrite; + + $this->query_vars = array(); + $post_type_query_vars = array(); + + if ( is_array($extra_query_vars) ) + $this->extra_query_vars = & $extra_query_vars; + else if (! 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; + + if ( isset($_SERVER['PATH_INFO']) ) + $pathinfo = $_SERVER['PATH_INFO']; + else + $pathinfo = ''; + $pathinfo_array = explode('?', $pathinfo); + $pathinfo = str_replace("%", "%25", $pathinfo_array[0]); + $req_uri = $_SERVER['REQUEST_URI']; + $req_uri_array = explode('?', $req_uri); + $req_uri = $req_uri_array[0]; + $self = $_SERVER['PHP_SELF']; + $home_path = parse_url(home_url()); + if ( isset($home_path['path']) ) + $home_path = $home_path['path']; + else + $home_path = ''; + $home_path = trim($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|", '', $req_uri); + $req_uri = trim($req_uri, '/'); + $pathinfo = trim($pathinfo, '/'); + $pathinfo = preg_replace("|^$home_path|", '', $pathinfo); + $pathinfo = trim($pathinfo, '/'); + $self = trim($self, '/'); + $self = preg_replace("|^$home_path|", '', $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) ) { + $request = $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 = ''; + $request = $req_uri; + } + + $this->request = $request; + + // Look for matches. + $request_match = $request; + foreach ( (array) $rewrite as $match => $query) { + // Don't try to match against AtomPub calls + if ( $req_uri == 'wp-app.php' ) + break; + + // If the requesting file is the anchor of the match, prepend it + // to the path info. + if ( (! empty($req_uri)) && (strpos($match, $req_uri) === 0) && ($req_uri != $request) ) + $request_match = $req_uri . '/' . $request; + + if ( preg_match("#^$match#", $request_match, $matches) || + preg_match("#^$match#", urldecode($request_match), $matches) ) { + // Got a match. + $this->matched_rule = $match; + + // 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 ( isset($_GET['error']) ) + unset($_GET['error']); + + if ( isset($error) ) + unset($error); + + break; + } + } + + // If req_uri is empty or if it is a request for ourself, unset error. + if ( empty($request) || $req_uri == $self || strpos($_SERVER['PHP_SELF'], 'wp-admin/') !== false ) { + if ( isset($_GET['error']) ) + unset($_GET['error']); + + if ( isset($error) ) + unset($error); + + if ( isset($perma_query_vars) && strpos($_SERVER['PHP_SELF'], 'wp-admin/') !== false ) + unset($perma_query_vars); + + $this->did_permalink = false; + } + } + + $this->public_query_vars = apply_filters('query_vars', $this->public_query_vars); + + foreach ( $GLOBALS['wp_post_types'] as $post_type => $t ) + if ( $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 ( $GLOBALS['wp_taxonomies'] 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] ); + + // 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 ); + } + } + + 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; + + $this->query_vars = apply_filters('request', $this->query_vars); + + do_action_ref_array('parse_request', array(&$this)); + } + + /** + * Send additional HTTP headers for caching, content type, etc. + * + * Sets the X-Pingback header, 404 status (if 404), Content-type. If showing + * a feed, it will also send last-modified, etag, and 304 status if needed. + * + * @since 2.0.0 + */ + function send_headers() { + $headers = array('X-Pingback' => get_bloginfo('pingback_url')); + $status = null; + $exit_required = false; + + if ( is_user_logged_in() ) + $headers = array_merge($headers, wp_get_nocache_headers()); + if ( !empty($this->query_vars['error']) && '404' == $this->query_vars['error'] ) { + $status = 404; + 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'); + } else if ( empty($this->query_vars['feed']) ) { + $headers['Content-Type'] = get_option('html_type') . '; charset=' . get_option('blog_charset'); + } else { + // We're showing a feed, so WP is indeed the only thing that last changed + if ( !empty($this->query_vars['withcomments']) + || ( 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'), 0).' GMT'; + else + $wp_last_modified = mysql2date('D, d M Y H:i:s', get_lastpostmodified('GMT'), 0).' 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 = stripslashes(stripslashes($_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; + } + } + + $headers = apply_filters('wp_headers', $headers, $this); + + if ( ! empty( $status ) ) + status_header( $status ); + foreach( (array) $headers as $name => $field_value ) + @header("{$name}: {$field_value}"); + + if ( $exit_required ) + exit(); + + do_action_ref_array('send_headers', array(&$this)); + } + + /** + * Sets the query string property based off of the query variable property. + * + * The 'query_string' filter is deprecated, but still works. Plugins should + * use the 'request' filter instead. + * + * @since 2.0.0 + */ + 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]); + } + } + + // query_string filter deprecated. Use request filter instead. + if ( has_filter('query_string') ) { // Don't bother filtering and parsing if no plugins are hooked in. + $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. + * + * @global string $query_string Query string for the loop. + * @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. + * + * @since 2.0.0 + */ + 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 ( is_single() || is_page() ) { + $GLOBALS['more'] = 1; + $GLOBALS['single'] = 1; + } + } + + /** + * Set up the current user. + * + * @since 2.0.0 + */ + function init() { + wp_get_current_user(); + } + + /** + * Set up the Loop based on the query variables. + * + * @uses WP::$query_vars + * @since 2.0.0 + */ + 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. + * + * @since 2.0.0 + */ + function handle_404() { + global $wp_query; + + if ( !is_admin() && ( 0 == count( $wp_query->posts ) ) && !is_404() && !is_robots() && !is_search() && !is_home() ) { + // Don't 404 for these queries if they matched an object. + if ( ( is_tag() || is_category() || is_tax() || is_author() || is_post_type_archive() ) && $wp_query->get_queried_object() && !is_paged() ) { + if ( !is_404() ) + status_header( 200 ); + return; + } + $wp_query->set_404(); + status_header( 404 ); + nocache_headers(); + } elseif ( !is_404() ) { + status_header( 200 ); + } + } + + /** + * Sets up all of the variables required by the WordPress environment. + * + * The action '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 + * + * @param string|array $query_args Passed to {@link parse_request()} + */ + function main($query_args = '') { + $this->init(); + $this->parse_request($query_args); + $this->send_headers(); + $this->query_posts(); + $this->handle_404(); + $this->register_globals(); + do_action_ref_array('wp', array(&$this)); + } + +} + +/** + * 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 + */ + var $_matches; + + /** + * store for mapping result + * + * @access public + * @var string + */ + var $output; + + /** + * subject to perform mapping on (query string containing $matches[] references + * + * @access private + * @var string + */ + var $_subject; + + /** + * regexp pattern to match $matches[] references + * + * @var string + */ + var $_pattern = '(\$matches\[[1-9]+[0-9]*\])'; // magic number + + /** + * constructor + * + * @param string $subject subject if regex + * @param array $matches data to use in map + * @return self + */ + function WP_MatchesMapRegex($subject, $matches) { + $this->_subject = $subject; + $this->_matches = $matches; + $this->output = $this->_map(); + } + + /** + * Substitute substring matches in subject. + * + * static helper function to ease use + * + * @access public + * @param string $subject subject + * @param array $matches data used for subsitution + * @return string + */ + function apply($subject, $matches) { + $oSelf =& new WP_MatchesMapRegex($subject, $matches); + return $oSelf->output; + } + + /** + * do the actual mapping + * + * @access private + * @return string + */ + 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 + */ + function callback($matches) { + $index = intval(substr($matches[0], 9, -1)); + return ( isset( $this->_matches[$index] ) ? urlencode($this->_matches[$index]) : '' ); + } + +} + +?> diff --git a/src/wp-includes/class.wp-dependencies.php b/src/wp-includes/class.wp-dependencies.php new file mode 100644 index 0000000..0e3f51e --- /dev/null +++ b/src/wp-includes/class.wp-dependencies.php @@ -0,0 +1,236 @@ +queue : (array) $handles; + $this->all_deps( $handles ); + + foreach( $this->to_do as $key => $handle ) { + if ( !in_array($handle, $this->done) && isset($this->registered[$handle]) ) { + + if ( ! $this->registered[$handle]->src ) { // Defines a group. + $this->done[] = $handle; + continue; + } + + if ( $this->do_item( $handle, $group ) ) + $this->done[] = $handle; + + unset( $this->to_do[$key] ); + } + } + + return $this->done; + } + + function do_item( $handle ) { + return isset($this->registered[$handle]); + } + + /** + * Determines dependencies + * + * Recursively builds array of items to process taking dependencies into account. Does NOT catch infinite loops. + * + * + * @param mixed $handles Accepts (string) dep name or (array of strings) dep names + * @param bool $recursion Used internally when function calls itself + */ + 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 ); + + if ( $queued && !$moved ) // already queued and in the right group + continue; + + $keep_going = true; + if ( !isset($this->registered[$handle]) ) + $keep_going = false; // Script doesn't exist + elseif ( $this->registered[$handle]->deps && array_diff($this->registered[$handle]->deps, array_keys($this->registered)) ) + $keep_going = false; // Script requires deps which don't exist (not a necessary check. efficiency?) + elseif ( $this->registered[$handle]->deps && !$this->all_deps( $this->registered[$handle]->deps, true, $group ) ) + $keep_going = false; // Script requires deps which don't exist + + if ( !$keep_going ) { // Either script or its deps 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 grobbed it and its deps + continue; + + if ( isset($handle_parts[1]) ) + $this->args[$handle] = $handle_parts[1]; + + $this->to_do[] = $handle; + } + + return true; + } + + /** + * Adds item + * + * Adds the item only if no item of that name already exists + * + * @param string $handle Script name + * @param string $src Script url + * @param array $deps (optional) Array of script names on which this script depends + * @param string $ver (optional) Script version (used for cache busting) + * @return array Hierarchical array of dependencies + */ + 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; + } + + /** + * Adds extra data + * + * Adds data only if script has already been added + * + * @param string $handle Script name + * @param string $data_name Name of object in which to store extra data + * @param array $data Array of extra data + * @return bool success + */ + function add_data( $handle, $data_name, $data ) { + if ( !isset($this->registered[$handle]) ) + return false; + return $this->registered[$handle]->add_data( $data_name, $data ); + } + + function remove( $handles ) { + foreach ( (array) $handles as $handle ) + unset($this->registered[$handle]); + } + + 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]; + } + } + } + + 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]]); + } + } + } + + function query( $handle, $list = 'registered' ) { // registered, queue, done, to_do + switch ( $list ) : + case 'registered': + case 'scripts': // back compat + if ( isset($this->registered[$handle]) ) + return $this->registered[$handle]; + break; + case 'to_print': // back compat + case 'printed': // back compat + if ( 'to_print' == $list ) + $list = 'to_do'; + else + $list = 'printed'; + default: + if ( in_array($handle, $this->$list) ) + return true; + break; + endswitch; + return false; + } + + function set_group( $handle, $recursion, $group ) { + $group = (int) $group; + + if ( $recursion ) + $group = min($this->group, $group); + else + $this->group = $group; + + if ( isset($this->groups[$handle]) && $this->groups[$handle] <= $group ) + return false; + + $this->groups[$handle] = $group; + return true; + } + +} + +class _WP_Dependency { + var $handle; + var $src; + var $deps = array(); + var $ver = false; + var $args = null; + + var $extra = array(); + + function __construct() { + @list($this->handle, $this->src, $this->deps, $this->ver, $this->args) = func_get_args(); + if ( !is_array($this->deps) ) + $this->deps = array(); + } + + function add_data( $name, $data ) { + if ( !is_scalar($name) ) + return false; + $this->extra[$name] = $data; + return true; + } +} diff --git a/src/wp-includes/class.wp-scripts.php b/src/wp-includes/class.wp-scripts.php new file mode 100644 index 0000000..681a824 --- /dev/null +++ b/src/wp-includes/class.wp-scripts.php @@ -0,0 +1,205 @@ +do_items( $handles, $group ); + } + + function print_scripts_l10n( $handle, $echo = true ) { + if ( empty($this->registered[$handle]->extra['l10n']) || empty($this->registered[$handle]->extra['l10n'][0]) || !is_array($this->registered[$handle]->extra['l10n'][1]) ) + return false; + + $object_name = $this->registered[$handle]->extra['l10n'][0]; + + $data = "var $object_name = {\n"; + $eol = ''; + foreach ( $this->registered[$handle]->extra['l10n'][1] as $var => $val ) { + if ( 'l10n_print_after' == $var ) { + $after = $val; + continue; + } + $data .= "$eol\t$var: \"" . esc_js( $val ) . '"'; + $eol = ",\n"; + } + $data .= "\n};\n"; + $data .= isset($after) ? "$after\n" : ''; + + if ( $echo ) { + echo "\n"; + return true; + } else { + return $data; + } + } + + 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 ); + + if ( null === $this->registered[$handle]->ver ) + $ver = ''; + else + $ver = $this->registered[$handle]->ver ? $this->registered[$handle]->ver : $this->default_version; + + if ( isset($this->args[$handle]) ) + $ver = $ver ? $ver . '&' . $this->args[$handle] : $this->args[$handle]; + + $src = $this->registered[$handle]->src; + + if ( $this->do_concat ) { + $srce = apply_filters( 'script_loader_src', $src, $handle ); + if ( $this->in_default_dir($srce) ) { + $this->print_code .= $this->print_scripts_l10n( $handle, false ); + $this->concat .= "$handle,"; + $this->concat_version .= "$handle$ver"; + return true; + } else { + $this->ext_handles .= "$handle,"; + $this->ext_version .= "$handle$ver"; + } + } + + $this->print_scripts_l10n( $handle ); + 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); + $src = esc_url(apply_filters( 'script_loader_src', $src, $handle )); + + if ( $this->do_concat ) + $this->print_html .= "\n"; + else + echo "\n"; + + return true; + } + + /** + * Localizes a script + * + * Localizes only if script has already been added + * + * @param string $handle Script name + * @param string $object_name Name of JS object to hold l10n info + * @param array $l10n Array of JS var name => localized string + * @return bool Successful localization + */ + function localize( $handle, $object_name, $l10n ) { + if ( !$object_name || !$l10n ) + return false; + return $this->add_data( $handle, 'l10n', array( $object_name, $l10n ) ); + } + + function set_group( $handle, $recursion, $group = false ) { + $grp = isset($this->registered[$handle]->extra['group']) ? (int) $this->registered[$handle]->extra['group'] : 0; + if ( false !== $group && $grp > $group ) + $grp = $group; + + return parent::set_group( $handle, $recursion, $grp ); + } + + function all_deps( $handles, $recursion = false, $group = false ) { + $r = parent::all_deps( $handles, $recursion ); + if ( !$recursion ) + $this->to_do = apply_filters( 'print_scripts_array', $this->to_do ); + return $r; + } + + function do_head_items() { + $this->do_items(false, 0); + return $this->done; + } + + function do_footer_items() { + if ( !empty($this->in_footer) ) { + foreach( $this->in_footer as $key => $handle ) { + if ( !in_array($handle, $this->done, true) && isset($this->registered[$handle]) ) { + $this->do_item($handle); + $this->done[] = $handle; + unset( $this->in_footer[$key] ); + } + } + } + return $this->done; + } + + function in_default_dir($src) { + if ( ! $this->default_dirs ) + return true; + + if ( 0 === strpos( $src, '/wp-includes/js/l10n' ) ) + return false; + + foreach ( (array) $this->default_dirs as $test ) { + if ( 0 === strpos($src, $test) ) + return true; + } + return false; + } + + 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/src/wp-includes/class.wp-styles.php b/src/wp-includes/class.wp-styles.php new file mode 100644 index 0000000..ecc0bb9 --- /dev/null +++ b/src/wp-includes/class.wp-styles.php @@ -0,0 +1,126 @@ +registered[$handle]->ver ) + $ver = ''; + else + $ver = $this->registered[$handle]->ver ? $this->registered[$handle]->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($this->registered[$handle]->src) && !isset($this->registered[$handle]->extra['conditional']) && !isset($this->registered[$handle]->extra['alt']) ) { + $this->concat .= "$handle,"; + $this->concat_version .= "$handle$ver"; + return true; + } + } + + if ( isset($this->registered[$handle]->args) ) + $media = esc_attr( $this->registered[$handle]->args ); + else + $media = 'all'; + + $href = $this->_css_href( $this->registered[$handle]->src, $ver, $handle ); + $rel = isset($this->registered[$handle]->extra['alt']) && $this->registered[$handle]->extra['alt'] ? 'alternate stylesheet' : 'stylesheet'; + $title = isset($this->registered[$handle]->extra['title']) ? "title='" . esc_attr( $this->registered[$handle]->extra['title'] ) . "'" : ''; + + $end_cond = $tag = ''; + if ( isset($this->registered[$handle]->extra['conditional']) && $this->registered[$handle]->extra['conditional'] ) { + $tag .= "\n"; + } + + $tag .= apply_filters( 'style_loader_tag', "\n", $handle ); + if ( 'rtl' === $this->text_direction && isset($this->registered[$handle]->extra['rtl']) && $this->registered[$handle]->extra['rtl'] ) { + if ( is_bool( $this->registered[$handle]->extra['rtl'] ) ) { + $suffix = isset( $this->registered[$handle]->extra['suffix'] ) ? $this->registered[$handle]->extra['suffix'] : ''; + $rtl_href = str_replace( "{$suffix}.css", "-rtl{$suffix}.css", $this->_css_href( $this->registered[$handle]->src , $ver, "$handle-rtl" )); + } else { + $rtl_href = $this->_css_href( $this->registered[$handle]->extra['rtl'], $ver, "$handle-rtl" ); + } + + $tag .= apply_filters( 'style_loader_tag', "\n", $handle ); + } + + $tag .= $end_cond; + + if ( $this->do_concat ) + $this->print_html .= $tag; + else + echo $tag; + + // Could do something with $this->registered[$handle]->extra here to print out extra CSS rules +// echo "\n"; + + return true; + } + + function all_deps( $handles, $recursion = false, $group = false ) { + $r = parent::all_deps( $handles, $recursion ); + if ( !$recursion ) + $this->to_do = apply_filters( 'print_styles_array', $this->to_do ); + return $r; + } + + 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); + $src = apply_filters( 'style_loader_src', $src, $handle ); + return esc_url( $src ); + } + + 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; + } + +} diff --git a/src/wp-includes/comment-template.php b/src/wp-includes/comment-template.php new file mode 100644 index 0000000..ce0f9dd --- /dev/null +++ b/src/wp-includes/comment-template.php @@ -0,0 +1,1590 @@ +comment_author) ) { + if (!empty($comment->user_id)){ + $user=get_userdata($comment->user_id); + $author=$user->user_login; + } else { + $author = __('Anonymous'); + } + } else { + $author = $comment->comment_author; + } + return apply_filters('get_comment_author', $author); +} + +/** + * Displays the author of the current comment. + * + * @since 0.71 + * @uses apply_filters() Calls 'comment_author' on comment author before displaying + * + * @param int $comment_ID The ID of the comment for which to print the author. Optional. + */ +function comment_author( $comment_ID = 0 ) { + $author = apply_filters('comment_author', get_comment_author( $comment_ID ) ); + echo $author; +} + +/** + * Retrieve the email of the author of the current comment. + * + * @since 1.5.0 + * @uses apply_filters() Calls the 'get_comment_author_email' hook on the comment author email + * @uses $comment + * + * @param int $comment_ID The ID of the comment for which to get the author's email. Optional. + * @return string The current comment author's email + */ +function get_comment_author_email( $comment_ID = 0 ) { + $comment = get_comment( $comment_ID ); + return apply_filters('get_comment_author_email', $comment->comment_author_email); +} + +/** + * 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 blog. 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 + * @uses apply_filters() Calls 'author_email' hook on the author email + * + * @param int $comment_ID The ID of the comment for which to print the author's email. Optional. + */ +function comment_author_email( $comment_ID = 0 ) { + echo apply_filters('author_email', get_comment_author_email( $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 blog. 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 + * @uses apply_filters() Calls 'comment_email' hook for the display of the comment author's email + * @uses get_comment_author_email_link() For generating the link + * @global object $comment The current Comment row object + * + * @param string $linktext The text to display instead of the comment author's email address + * @param string $before The text or HTML to display before the email link. + * @param string $after The text or HTML to display after the email link. + */ +function comment_author_email_link($linktext='', $before='', $after='') { + if ( $link = get_comment_author_email_link( $linktext, $before, $after ) ) + 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 blog. 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 + * @uses apply_filters() Calls 'comment_email' hook for the display of the comment author's email + * @global object $comment The current Comment row object + * + * @param string $linktext The text to display instead of the comment author's email address + * @param string $before The text or HTML to display before the email link. + * @param string $after The text or HTML to display after the email link. + */ +function get_comment_author_email_link($linktext='', $before='', $after='') { + global $comment; + $email = apply_filters('comment_email', $comment->comment_author_email); + if ((!empty($email)) && ($email != '@')) { + $display = ($linktext != '') ? $linktext : $email; + $return = $before; + $return .= "$display"; + $return .= $after; + return $return; + } else { + return ''; + } +} + +/** + * Retrieve the html link to the url of the author of the current comment. + * + * @since 1.5.0 + * @uses apply_filters() Calls 'get_comment_author_link' hook on the complete link HTML or author + * + * @param int $comment_ID The ID of the comment for which to get the author's link. Optional. + * @return string Comment Author name or HTML link for author's URL + */ +function get_comment_author_link( $comment_ID = 0 ) { + /** @todo Only call these functions when they are needed. Include in if... else blocks */ + $url = get_comment_author_url( $comment_ID ); + $author = get_comment_author( $comment_ID ); + + if ( empty( $url ) || 'http://' == $url ) + $return = $author; + else + $return = "$author"; + return apply_filters('get_comment_author_link', $return); +} + +/** + * Display the html link to the url of the author of the current comment. + * + * @since 0.71 + * @see get_comment_author_link() Echoes result + * + * @param int $comment_ID The ID of the comment for which to print the author's link. Optional. + */ +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 + * @uses $comment + * @uses apply_filters() + * + * @param int $comment_ID The ID of the comment for which to get the author's IP address. Optional. + * @return string The comment author's IP address. + */ +function get_comment_author_IP( $comment_ID = 0 ) { + $comment = get_comment( $comment_ID ); + return apply_filters('get_comment_author_IP', $comment->comment_author_IP); +} + +/** + * Display the IP address of the author of the current comment. + * + * @since 0.71 + * @see get_comment_author_IP() Echoes Result + * + * @param int $comment_ID The ID of the comment for which to print the author's IP address. Optional. + */ +function comment_author_IP( $comment_ID = 0 ) { + echo get_comment_author_IP( $comment_ID ); +} + +/** + * Retrieve the url of the author of the current comment. + * + * @since 1.5.0 + * @uses apply_filters() Calls 'get_comment_author_url' hook on the comment author's URL + * + * @param int $comment_ID The ID of the comment for which to get the author's URL. Optional. + * @return string + */ +function get_comment_author_url( $comment_ID = 0 ) { + $comment = get_comment( $comment_ID ); + $url = ('http://' == $comment->comment_author_url) ? '' : $comment->comment_author_url; + $url = esc_url( $url, array('http', 'https') ); + return apply_filters('get_comment_author_url', $url); +} + +/** + * Display the url of the author of the current comment. + * + * @since 0.71 + * @uses apply_filters() + * @uses get_comment_author_url() Retrieves the comment author's URL + * + * @param int $comment_ID The ID of the comment for which to print the author's URL. Optional. + */ +function comment_author_url( $comment_ID = 0 ) { + echo apply_filters('comment_url', get_comment_author_url( $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 + * @uses apply_filters() Calls the 'get_comment_author_url_link' on the complete HTML before returning. + * + * @param string $linktext The text to display instead of the comment author's email address + * @param string $before The text or HTML to display before the email link. + * @param string $after The text or HTML to display after the email link. + * @return string The HTML link between the $before and $after parameters + */ +function get_comment_author_url_link( $linktext = '', $before = '', $after = '' ) { + $url = get_comment_author_url(); + $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"; + 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 + * @see get_comment_author_url_link() Echoes result + * + * @param string $linktext The text to display instead of the comment author's email address + * @param string $before The text or HTML to display before the email link. + * @param string $after The text or HTML to display after the email link. + */ +function comment_author_url_link( $linktext = '', $before = '', $after = '' ) { + echo get_comment_author_url_link( $linktext, $before, $after ); +} + +/** + * Generates semantic classes for each comment element + * + * @since 2.7.0 + * + * @param string|array $class One or more classes to add to the class list + * @param int $comment_id An optional comment ID + * @param int $post_id An optional post ID + * @param bool $echo Whether comment_class should echo or return + */ +function comment_class( $class = '', $comment_id = 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_id, $post_id ) ) . '"'; + if ( $echo) + echo $class; + else + return $class; +} + +/** + * Returns the classes for the comment div as an array + * + * @since 2.7.0 + * + * @param string|array $class One or more classes to add to the class list + * @param int $comment_id An optional comment ID + * @param int $post_id An optional post ID + * @return array Array of classes + */ +function get_comment_class( $class = '', $comment_id = null, $post_id = null ) { + global $comment_alt, $comment_depth, $comment_thread_alt; + + $comment = get_comment($comment_id); + + $classes = array(); + + // Get the comment type (comment, trackback), + $classes[] = ( empty( $comment->comment_type ) ) ? 'comment' : $comment->comment_type; + + // If the comment author has an id (registered), then print the log in name + if ( $comment->user_id > 0 && $user = get_userdata($comment->user_id) ) { + // For all registered users, 'byuser' + $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); + + return apply_filters('comment_class', $classes, $class, $comment_id, $post_id); +} + +/** + * Retrieve the comment date of the current comment. + * + * @since 1.5.0 + * @uses apply_filters() Calls 'get_comment_date' hook with the formated date and the $d parameter respectively + * @uses $comment + * + * @param string $d The format of the date (defaults to user's config) + * @param int $comment_ID The ID of the comment for which to get the date. Optional. + * @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); + return apply_filters('get_comment_date', $date, $d); +} + +/** + * Display the comment date of the current comment. + * + * @since 0.71 + * + * @param string $d The format of the date (defaults to user's config) + * @param int $comment_ID The ID of the comment for which to print the date. Optional. + */ +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 + * @uses $comment + * @uses apply_filters() Calls 'get_comment_excerpt' on truncated comment + * + * @param int $comment_ID The ID of the comment for which to get the excerpt. Optional. + * @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($comment->comment_content); + $blah = explode(' ', $comment_text); + if (count($blah) > 20) { + $k = 20; + $use_dotdotdot = 1; + } else { + $k = count($blah); + $use_dotdotdot = 0; + } + $excerpt = ''; + for ($i=0; $i<$k; $i++) { + $excerpt .= $blah[$i] . ' '; + } + $excerpt .= ($use_dotdotdot) ? '...' : ''; + return apply_filters('get_comment_excerpt', $excerpt); +} + +/** + * Display the excerpt of the current comment. + * + * @since 1.2.0 + * @uses apply_filters() Calls 'comment_excerpt' hook before displaying excerpt + * + * @param int $comment_ID The ID of the comment for which to print the excerpt. Optional. + */ +function comment_excerpt( $comment_ID = 0 ) { + echo apply_filters('comment_excerpt', get_comment_excerpt($comment_ID) ); +} + +/** + * Retrieve the comment id of the current comment. + * + * @since 1.5.0 + * @uses $comment + * @uses apply_filters() Calls the 'get_comment_ID' hook for the comment ID + * + * @return int The comment ID + */ +function get_comment_ID() { + global $comment; + return apply_filters('get_comment_ID', $comment->comment_ID); +} + +/** + * Displays the comment id of the current comment. + * + * @since 0.71 + * @see get_comment_ID() Echoes Result + */ +function comment_ID() { + echo get_comment_ID(); +} + +/** + * Retrieve the link to a given comment. + * + * @since 1.5.0 + * @uses $comment + * + * @param object|string|int $comment Comment to retrieve. + * @param array $args Optional args. + * @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); + + // Backwards compat + if ( !is_array($args) ) { + $page = $args; + $args = array(); + $args['page'] = $page; + } + + $defaults = array( 'type' => 'all', 'page' => '', 'per_page' => '', 'max_depth' => '' ); + $args = wp_parse_args( $args, $defaults ); + + 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; + } + + if ( $args['per_page'] ) { + if ( '' == $args['page'] ) + $args['page'] = ( !empty($in_comment_loop) ) ? get_query_var('cpage') : get_page_of_comment( $comment->comment_ID, $args ); + + if ( $wp_rewrite->using_permalinks() ) + $link = user_trailingslashit( trailingslashit( get_permalink( $comment->comment_post_ID ) ) . 'comment-page-' . $args['page'], 'comment' ); + else + $link = add_query_arg( 'cpage', $args['page'], get_permalink( $comment->comment_post_ID ) ); + } else { + $link = get_permalink( $comment->comment_post_ID ); + } + + return apply_filters( 'get_comment_link', $link . '#comment-' . $comment->comment_ID, $comment, $args ); +} + +/** + * Retrieves the link to the current post comments. + * + * @since 1.5.0 + * + * @param int $post_id Optional post id + * @return string The link to the comments + */ +function get_comments_link($post_id = 0) { + return get_permalink($post_id) . '#comments'; +} + +/** + * Displays the link to the current post comments. + * + * @since 0.71 + * + * @param string $deprecated Not Used + * @param bool $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' ); + echo get_comments_link(); +} + +/** + * Retrieve the amount of comments a post has. + * + * @since 1.5.0 + * @uses apply_filters() Calls the 'get_comments_number' hook on the number of comments + * + * @param int $post_id The Post ID + * @return int The number of comments a post has + */ +function get_comments_number( $post_id = 0 ) { + $post_id = absint( $post_id ); + + if ( !$post_id ) + $post_id = get_the_ID(); + + $post = get_post($post_id); + if ( ! isset($post->comment_count) ) + $count = 0; + else + $count = $post->comment_count; + + 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 + * @uses apply_filters() Calls the 'comments_number' hook on the output and number of comments respectively. + * + * @param string $zero Text for no comments + * @param string $one Text for one comment + * @param string $more Text for more than one comment + * @param string $deprecated Not used. + */ +function comments_number( $zero = false, $one = false, $more = false, $deprecated = '' ) { + if ( !empty( $deprecated ) ) + _deprecated_argument( __FUNCTION__, '1.3' ); + + $number = get_comments_number(); + + if ( $number > 1 ) + $output = str_replace('%', number_format_i18n($number), ( false === $more ) ? __('% Comments') : $more); + elseif ( $number == 0 ) + $output = ( false === $zero ) ? __('No Comments') : $zero; + else // must be one + $output = ( false === $one ) ? __('1 Comment') : $one; + + echo apply_filters('comments_number', $output, $number); +} + +/** + * Retrieve the text of the current comment. + * + * @since 1.5.0 + * @uses $comment + * + * @param int $comment_ID The ID of the comment for which to get the text. Optional. + * @return string The comment content + */ +function get_comment_text( $comment_ID = 0 ) { + $comment = get_comment( $comment_ID ); + return apply_filters( 'get_comment_text', $comment->comment_content, $comment ); +} + +/** + * Displays the text of the current comment. + * + * @since 0.71 + * @uses apply_filters() Passes the comment content through the 'comment_text' hook before display + * @uses get_comment_text() Gets the comment content + * + * @param int $comment_ID The ID of the comment for which to print the text. Optional. + */ +function comment_text( $comment_ID = 0 ) { + $comment = get_comment( $comment_ID ); + echo apply_filters( 'comment_text', get_comment_text( $comment_ID ), $comment ); +} + +/** + * Retrieve the comment time of the current comment. + * + * @since 1.5.0 + * @uses $comment + * @uses apply_filter() Calls 'get_comment_time' hook with the formatted time, the $d parameter, and $gmt parameter passed. + * + * @param string $d Optional. The format of the time (defaults to user's config) + * @param bool $gmt Whether to use the GMT date + * @param bool $translate Whether to translate the time (for use in feeds) + * @return string The formatted time + */ +function get_comment_time( $d = '', $gmt = false, $translate = true ) { + global $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); + return apply_filters('get_comment_time', $date, $d, $gmt, $translate); +} + +/** + * Display the comment time of the current comment. + * + * @since 0.71 + * + * @param string $d Optional. The format of the time (defaults to user's config) + */ +function comment_time( $d = '' ) { + echo get_comment_time($d); +} + +/** + * Retrieve the comment type of the current comment. + * + * @since 1.5.0 + * @uses $comment + * @uses apply_filters() Calls the 'get_comment_type' hook on the comment type + * + * @param int $comment_ID The ID of the comment for which to get the type. Optional. + * @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'; + + return apply_filters('get_comment_type', $comment->comment_type); +} + +/** + * Display the comment type of the current comment. + * + * @since 0.71 + * + * @param string $commenttxt The string to display for comment type + * @param string $trackbacktxt The string to display for trackback type + * @param string $pingbacktxt The string to display for pingback type + */ +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 + * @uses apply_filters() Calls 'trackback_url' on the resulting trackback URL + * + * @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(); + } + return apply_filters('trackback_url', $tb_url); +} + +/** + * Displays the current post's trackback URL. + * + * @since 0.71 + * @uses get_trackback_url() Gets the trackback url for the current post + * + * @param bool $deprecated_echo Remove backwards compat in 2.5 + * @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 ( $deprecated_echo !== true ) + _deprecated_argument( __FUNCTION__, '2.5', __('Use get_trackback_url() instead if you do not want the value echoed.') ); + if ( $deprecated_echo ) + echo get_trackback_url(); + else + return get_trackback_url(); +} + +/** + * Generates and displays 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' ); + + if ( false !== stripos($_SERVER['HTTP_USER_AGENT'], 'W3C_Validator') ) + return; + + echo ' + \n"; + echo ''; +} + +/** + * Whether the current post is open for comments. + * + * @since 1.5.0 + * @uses $post + * + * @param int $post_id An optional post ID to check instead of the 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 ); + return apply_filters( 'comments_open', $open, $post_id ); +} + +/** + * Whether the current post is open for pings. + * + * @since 1.5.0 + * @uses $post + * + * @param int $post_id An optional post ID to check instead of the 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 ); + return apply_filters( 'pings_open', $open, $post_id ); +} + +/** + * Displays 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 + * @uses $post Gets the ID of the current post for the token + */ +function wp_comment_form_unfiltered_html_nonce() { + global $post; + + $post_id = 0; + if ( !empty($post) ) + $post_id = $post->ID; + + if ( current_user_can('unfiltered_html') ) + wp_nonce_field('unfiltered-html-comment_' . $post_id, '_wp_unfiltered_html_comment', false); +} + +/** + * Loads 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 'comments_array' filter hook with the list of comments + * and the post ID respectively. + * + * The $file path is passed through a filter hook called, 'comments_template' + * which includes the TEMPLATEPATH and $file combined. Tries the $filtered path + * first and if it fails it will require the default comment themplate 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. + * + * @since 1.5.0 + * @global array $comment List of comment objects for the current post + * @uses $wpdb + * @uses $post + * @uses $withcomments Will not try to get the comments if the post has none. + * + * @param string $file Optional, default '/comments.php'. The file to load + * @param bool $separate_comments Optional, whether to separate the comments by comment type. Default is false. + * @return null Returns null if no comments appear + */ +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. + * + * @uses wp_get_current_commenter() + */ + $commenter = wp_get_current_commenter(); + + /** + * The name of the current comment author escaped for use in attributes. + */ + $comment_author = $commenter['comment_author']; // Escaped by sanitize_comment_cookies() + + /** + * The email address of the current comment author escaped for use in attributes. + */ + $comment_author_email = $commenter['comment_author_email']; // Escaped by sanitize_comment_cookies() + + /** + * The url of the current comment author escaped for use in attributes. + */ + $comment_author_url = esc_url($commenter['comment_author_url']); + + /** @todo Use API instead of SELECTs. */ + if ( $user_ID) { + $comments = $wpdb->get_results($wpdb->prepare("SELECT * FROM $wpdb->comments WHERE comment_post_ID = %d AND (comment_approved = '1' OR ( user_id = %d AND comment_approved = '0' ) ) ORDER BY comment_date_gmt", $post->ID, $user_ID)); + } else if ( empty($comment_author) ) { + $comments = get_comments( array('post_id' => $post->ID, 'status' => 'approve', 'order' => 'ASC') ); + } else { + $comments = $wpdb->get_results($wpdb->prepare("SELECT * FROM $wpdb->comments WHERE comment_post_ID = %d AND ( comment_approved = '1' OR ( comment_author = %s AND comment_author_email = %s AND comment_approved = '0' ) ) ORDER BY comment_date_gmt", $post->ID, wp_specialchars_decode($comment_author,ENT_QUOTES), $comment_author_email)); + } + + // keep $comments for legacy's sake + $wp_query->comments = apply_filters( 'comments_array', $comments, $post->ID ); + $comments = &$wp_query->comments; + $wp_query->comment_count = count($wp_query->comments); + update_comment_cache($wp_query->comments); + + if ( $separate_comments ) { + $wp_query->comments_by_type = &separate_comments($comments); + $comments_by_type = &$wp_query->comments_by_type; + } + + $overridden_cpage = FALSE; + if ( '' == get_query_var('cpage') && get_option('page_comments') ) { + set_query_var( 'cpage', 'newest' == get_option('default_comments_page') ? get_comment_pages_count() : 1 ); + $overridden_cpage = TRUE; + } + + if ( !defined('COMMENTS_TEMPLATE') || !COMMENTS_TEMPLATE) + define('COMMENTS_TEMPLATE', true); + + $include = apply_filters('comments_template', STYLESHEETPATH . $file ); + 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 JS popup script to show a comment. + * + * If the $file parameter is empty, then the home page is assumed. The defaults + * for the window are 400px by 400px. + * + * For the comment link popup to work, this function has to be called or the + * normal comment link will be assumed. + * + * @since 0.71 + * @global string $wpcommentspopupfile The URL to use for the popup window + * @global int $wpcommentsjavascript Whether to use JavaScript. Set when function is called + * + * @param int $width Optional. The width of the popup window + * @param int $height Optional. The height of the popup window + * @param string $file Optional. Sets the location of the popup window + */ +function comments_popup_script($width=400, $height=400, $file='') { + global $wpcommentspopupfile, $wpcommentsjavascript; + + if (empty ($file)) { + $wpcommentspopupfile = ''; // Use the index. + } else { + $wpcommentspopupfile = $file; + } + + $wpcommentsjavascript = 1; + $javascript = "\n"; + echo $javascript; +} + +/** + * Displays the link to the comments popup window for the current post ID. + * + * Is not meant to be displayed on single posts and pages. Should be used on the + * lists of posts + * + * @since 0.71 + * @uses $wpcommentspopupfile + * @uses $wpcommentsjavascript + * @uses $post + * + * @param string $zero The string to display when no comments + * @param string $one The string to display when only one comment is available + * @param string $more The string to display when there are more than one comment + * @param string $css_class The CSS class to use for comments + * @param string $none The string to display when comments have been turned off + * @return null Returns null on single posts and pages. + */ +function comments_popup_link( $zero = false, $one = false, $more = false, $css_class = '', $none = false ) { + global $wpcommentspopupfile, $wpcommentsjavascript; + + $id = get_the_ID(); + + if ( false === $zero ) $zero = __( 'No Comments' ); + if ( false === $one ) $one = __( '1 Comment' ); + if ( false === $more ) $more = __( '% Comments' ); + if ( false === $none ) $none = __( 'Comments Off' ); + + $number = get_comments_number( $id ); + + if ( 0 == $number && !comments_open() && !pings_open() ) { + echo '' . $none . ''; + return; + } + + if ( post_password_required() ) { + echo __('Enter your password to view comments.'); + return; + } + + echo ' 0 ) ); + + echo apply_filters( 'comments_popup_link_attributes', '' ); + + echo ' title="' . esc_attr( sprintf( __('Comment on %s'), $title ) ) . '">'; + comments_number( $zero, $one, $more ); + echo ''; +} + +/** + * Retrieve HTML content for reply to comment link. + * + * The default arguments that can be override are 'add_below', 'respond_id', + * 'reply_text', 'login_text', and 'depth'. The 'login_text' argument will be + * used, if the user must log in or register first before posting a comment. The + * 'reply_text' will be used, if they can post a reply. The 'add_below' and + * 'respond_id' arguments are for the JavaScript moveAddCommentForm() function + * parameters. + * + * @since 2.7.0 + * + * @param array $args Optional. Override default options. + * @param int $comment Optional. Comment being replied to. + * @param int $post Optional. Post that the comment is going to be displayed on. + * @return string|bool|null Link to show comment form, if successful. False, if comments are closed. + */ +function get_comment_reply_link($args = array(), $comment = null, $post = null) { + global $user_ID; + + $defaults = array('add_below' => 'comment', 'respond_id' => 'respond', 'reply_text' => __('Reply'), + 'login_text' => __('Log in to Reply'), 'depth' => 0, 'before' => '', 'after' => ''); + + $args = wp_parse_args($args, $defaults); + + if ( 0 == $args['depth'] || $args['max_depth'] <= $args['depth'] ) + return; + + extract($args, EXTR_SKIP); + + $comment = get_comment($comment); + if ( empty($post) ) + $post = $comment->comment_post_ID; + $post = get_post($post); + + if ( !comments_open($post->ID) ) + return false; + + $link = ''; + + if ( get_option('comment_registration') && !$user_ID ) + $link = ''; + else + $link = "comment_ID ) ) . "#" . $respond_id . "' onclick='return addComment.moveForm(\"$add_below-$comment->comment_ID\", \"$comment->comment_ID\", \"$respond_id\", \"$post->ID\")'>$reply_text"; + return apply_filters('comment_reply_link', $before . $link . $after, $args, $comment, $post); +} + +/** + * Displays the HTML content for reply to comment link. + * + * @since 2.7.0 + * @see get_comment_reply_link() Echoes result + * + * @param array $args Optional. Override default options. + * @param int $comment Optional. Comment being replied to. + * @param int $post Optional. Post that the comment is going to be displayed on. + * @return string|bool|null 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. + * + * The default arguments that can be override are 'add_below', 'respond_id', + * 'reply_text', 'login_text', and 'depth'. The 'login_text' argument will be + * used, if the user must log in or register first before posting a comment. The + * 'reply_text' will be used, if they can post a reply. The 'add_below' and + * 'respond_id' arguments are for the JavaScript moveAddCommentForm() function + * parameters. + * + * @since 2.7.0 + * + * @param array $args Optional. Override default options. + * @param int|object $post Optional. Post that the comment is going to be displayed on. Defaults to current post. + * @return string|bool|null Link to show comment form, if successful. False, if comments are closed. + */ +function get_post_reply_link($args = array(), $post = null) { + global $user_ID; + + $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); + extract($args, EXTR_SKIP); + $post = get_post($post); + + if ( !comments_open($post->ID) ) + return false; + + if ( get_option('comment_registration') && !$user_ID ) { + $link = '' . $login_text . ''; + } else { + $link = "$reply_text"; + } + return apply_filters('post_comments_link', $before . $link . $after, $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|object $post Optional. Post that the comment is going to be displayed on. + * @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. + */ +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'; + return apply_filters('cancel_comment_reply_link', '' . $text . '', $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. + */ +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 + * + * @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"; + return apply_filters('comment_id_fields', $result, $id, $replytoid); +} + +/** + * Output hidden input HTML for replying to comments. + * + * @since 2.7.0 + * @see get_comment_id_fields() Echoes result + */ +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. + * + * @since 2.7.0 + * + * @param string $noreplytext Optional. Text to display when not replying to a comment. + * @param string $replytext Optional. Text to display when replying to a comment. 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. + */ +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 { + $comment = get_comment($replytoid); + $author = ( $linktoparent ) ? '' . get_comment_author() . '' : get_comment_author(); + printf( $replytext, $author ); + } +} + +/** + * HTML comment list class. + * + * @package WordPress + * @uses Walker + * @since 2.7.0 + */ +class Walker_Comment extends Walker { + /** + * @see Walker::$tree_type + * @since 2.7.0 + * @var string + */ + var $tree_type = 'comment'; + + /** + * @see Walker::$db_fields + * @since 2.7.0 + * @var array + */ + var $db_fields = array ('parent' => 'comment_parent', 'id' => 'comment_ID'); + + /** + * @see Walker::start_lvl() + * @since 2.7.0 + * + * @param string $output Passed by reference. Used to append additional content. + * @param int $depth Depth of comment. + * @param array $args Uses 'style' argument for type of HTML list. + */ + function start_lvl(&$output, $depth, $args) { + $GLOBALS['comment_depth'] = $depth + 1; + + switch ( $args['style'] ) { + case 'div': + break; + case 'ol': + echo "
      \n"; + break; + default: + case 'ul': + echo "
        \n"; + break; + } + } + + /** + * @see Walker::end_lvl() + * @since 2.7.0 + * + * @param string $output Passed by reference. Used to append additional content. + * @param int $depth Depth of comment. + * @param array $args Will only append content if style argument value is 'ol' or 'ul'. + */ + function end_lvl(&$output, $depth, $args) { + $GLOBALS['comment_depth'] = $depth + 1; + + switch ( $args['style'] ) { + case 'div': + break; + case 'ol': + echo "
    \n"; + break; + default: + case 'ul': + echo "\n"; + break; + } + } + + /** + * 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 + * + */ + function display_element( $element, &$children_elements, $max_depth, $depth=0, $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 we're 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 ] ); + } + + } + + /** + * @see Walker::start_el() + * @since 2.7.0 + * + * @param string $output Passed by reference. Used to append additional content. + * @param object $comment Comment data object. + * @param int $depth Depth of comment in reference to parents. + * @param array $args + */ + function start_el(&$output, $comment, $depth, $args) { + $depth++; + $GLOBALS['comment_depth'] = $depth; + + if ( !empty($args['callback']) ) { + call_user_func($args['callback'], $comment, $args, $depth); + return; + } + + $GLOBALS['comment'] = $comment; + extract($args, EXTR_SKIP); + + if ( 'div' == $args['style'] ) { + $tag = 'div'; + $add_below = 'comment'; + } else { + $tag = 'li'; + $add_below = 'div-comment'; + } +?> + < id="comment-"> + +
    + +
    + + %s says:'), get_comment_author_link()) ?> +
    +comment_approved == '0') : ?> + +
    + + + + + + +
    + $add_below, 'depth' => $depth, 'max_depth' => $args['max_depth']))) ?> +
    + +
    + +\n"; + else + echo "\n"; + } + +} + +/** + * List comments + * + * Used in the comments.php template to list comments for a particular post + * + * @since 2.7.0 + * @uses Walker_Comment + * + * @param string|array $args Formatting options + * @param array $comments Optional array of comment objects. Defaults to $wp_query->comments + */ +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' => ''); + + $r = wp_parse_args( $args, $defaults ); + + // 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 ( 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 ( '' === $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') ); + + extract( $r, EXTR_SKIP ); + + if ( empty($walker) ) + $walker = new Walker_Comment; + + $walker->paged_walk($_comments, $max_depth, $page, $per_page, $r); + $wp_query->max_num_comment_pages = $walker->max_pages; + + $in_comment_loop = false; +} + +/** + * 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 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 form comment_form_field_$name where $name is the key used + * in the array of fields. + * + * @since 3.0.0 + * @param array $args Options for strings, fields etc in the form + * @param mixed $post_id Post ID to generate the form for, uses the current post if null + * @return void + */ +function comment_form( $args = array(), $post_id = null ) { + global $user_identity, $id; + + if ( null === $post_id ) + $post_id = $id; + else + $id = $post_id; + + $commenter = wp_get_current_commenter(); + + $req = get_option( 'require_name_email' ); + $aria_req = ( $req ? " aria-required='true'" : '' ); + $fields = array( + 'author' => '

    ' . ' ' . ( $req ? '*' : '' ) . + '

    ', + 'email' => '', + 'url' => '

    ' . + '

    ', + ); + + $required_text = sprintf( ' ' . __('Required fields are marked %s'), '*' ); + $defaults = array( + 'fields' => apply_filters( 'comment_form_default_fields', $fields ), + 'comment_field' => '

    ', + 'must_log_in' => '', + 'logged_in_as' => '

    ' . sprintf( __( 'Logged in as %2$s. Log out?' ), admin_url( 'profile.php' ), $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' => '

    ' . sprintf( __( 'You may use these HTML tags and attributes: %s' ), ' ' . allowed_tags() . '' ) . '

    ', + 'id_form' => 'commentform', + 'id_submit' => 'submit', + 'title_reply' => __( 'Leave a Reply' ), + 'title_reply_to' => __( 'Leave a Reply to %s' ), + 'cancel_reply_link' => __( 'Cancel reply' ), + 'label_submit' => __( 'Post Comment' ), + ); + + $args = wp_parse_args( $args, apply_filters( 'comment_form_defaults', $defaults ) ); + + ?> + + +
    +

    + + + + +
    + + + + + + + $field ) { + echo apply_filters( "comment_form_field_{$name}", $field ) . "\n"; + } + do_action( 'comment_form_after_fields' ); + ?> + + + +

    + + +

    + +
    + +
    + + + + + diff --git a/src/wp-includes/comment.php b/src/wp-includes/comment.php new file mode 100644 index 0000000..8e17000 --- /dev/null +++ b/src/wp-includes/comment.php @@ -0,0 +1,2017 @@ +]*href/i', $comment, $out ); + $num_links = apply_filters( 'comment_max_links_url', $num_links, $url ); // provide for counting of $url as a link + if ( $num_links >= $max_links ) + return false; + } + + $mod_keys = trim(get_option('moderation_keys')); + 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 '#' chars in the + // spam words don't break things: + $word = preg_quote($word, '#'); + + $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; + } + } + + // Comment whitelisting: + if ( 1 == get_option('comment_whitelist')) { + if ( 'trackback' != $comment_type && 'pingback' != $comment_type && $author != '' && $email != '' ) { + // expected_slashed ($author, $email) + $ok_to_comment = $wpdb->get_var("SELECT comment_approved FROM $wpdb->comments WHERE comment_author = '$author' AND comment_author_email = '$email' and comment_approved = '1' LIMIT 1"); + 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 + * @uses $wpdb + * + * @param int $post_id The ID of the post + * @return array $comments The approved comments + */ +function get_approved_comments($post_id) { + global $wpdb; + return $wpdb->get_results($wpdb->prepare("SELECT * FROM $wpdb->comments WHERE comment_post_ID = %d AND comment_approved = '1' ORDER BY comment_date", $post_id)); +} + +/** + * 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. + * + * If the comment is empty, then the global comment variable will be used, if it + * is set. + * + * @since 2.0.0 + * @uses $wpdb + * + * @param object|string|int $comment Comment to retrieve. + * @param string $output Optional. OBJECT or ARRAY_A or ARRAY_N constants. + * @return object|array|null Depends on $output value. + */ +function &get_comment(&$comment, $output = OBJECT) { + global $wpdb; + $null = null; + + if ( empty($comment) ) { + if ( isset($GLOBALS['comment']) ) + $_comment = & $GLOBALS['comment']; + else + $_comment = null; + } elseif ( is_object($comment) ) { + wp_cache_add($comment->comment_ID, $comment, 'comment'); + $_comment = $comment; + } else { + if ( isset($GLOBALS['comment']) && ($GLOBALS['comment']->comment_ID == $comment) ) { + $_comment = & $GLOBALS['comment']; + } elseif ( ! $_comment = wp_cache_get($comment, 'comment') ) { + $_comment = $wpdb->get_row($wpdb->prepare("SELECT * FROM $wpdb->comments WHERE comment_ID = %d LIMIT 1", $comment)); + if ( ! $_comment ) + return $null; + wp_cache_add($_comment->comment_ID, $_comment, 'comment'); + } + } + + $_comment = apply_filters('get_comment', $_comment); + + if ( $output == OBJECT ) { + return $_comment; + } elseif ( $output == ARRAY_A ) { + $__comment = get_object_vars($_comment); + return $__comment; + } elseif ( $output == ARRAY_N ) { + $__comment = array_values(get_object_vars($_comment)); + return $__comment; + } else { + return $_comment; + } +} + +/** + * Retrieve a list of comments. + * + * The comment list can be for the blog as a whole or for an individual post. + * + * The list of comment arguments are 'status', 'orderby', 'comment_date_gmt', + * 'order', 'number', 'offset', and 'post_id'. + * + * @since 2.7.0 + * @uses $wpdb + * + * @param mixed $args Optional. Array or string of options to override defaults. + * @return array List of comments. + */ +function get_comments( $args = '' ) { + $query = new WP_Comment_Query; + return $query->query( $args ); +} + +/** + * WordPress Comment Query class. + * + * @since 3.1.0 + */ +class WP_Comment_Query { + + /** + * Execute the query + * + * @since 3.1.0 + * + * @param string|array $query_vars + * @return int|array + */ + function query( $query_vars ) { + global $wpdb; + + $defaults = array( + 'author_email' => '', + 'ID' => '', + 'karma' => '', + 'number' => '', + 'offset' => '', + 'orderby' => '', + 'order' => 'DESC', + 'parent' => '', + 'post_ID' => '', + 'post_id' => 0, + 'post_author' => '', + 'post_name' => '', + 'post_parent' => '', + 'post_status' => '', + 'post_type' => '', + 'status' => '', + 'type' => '', + 'user_id' => '', + 'search' => '', + 'count' => false + ); + + $this->query_vars = wp_parse_args( $query_vars, $defaults ); + do_action_ref_array( 'pre_get_comments', array( &$this ) ); + extract( $this->query_vars, EXTR_SKIP ); + + // $args can be whatever, only use the args defined in defaults to compute the key + $key = md5( serialize( compact(array_keys($defaults)) ) ); + $last_changed = wp_cache_get('last_changed', 'comment'); + if ( !$last_changed ) { + $last_changed = time(); + wp_cache_set('last_changed', $last_changed, 'comment'); + } + $cache_key = "get_comments:$key:$last_changed"; + + if ( $cache = wp_cache_get( $cache_key, 'comment' ) ) { + return $cache; + } + + $post_id = absint($post_id); + + if ( 'hold' == $status ) + $approved = "comment_approved = '0'"; + elseif ( 'approve' == $status ) + $approved = "comment_approved = '1'"; + elseif ( 'spam' == $status ) + $approved = "comment_approved = 'spam'"; + elseif ( 'trash' == $status ) + $approved = "comment_approved = 'trash'"; + else + $approved = "( comment_approved = '0' OR comment_approved = '1' )"; + + $order = ( 'ASC' == strtoupper($order) ) ? 'ASC' : 'DESC'; + + if ( ! empty( $orderby ) ) { + $ordersby = is_array($orderby) ? $orderby : preg_split('/[,\s]/', $orderby); + $ordersby = array_intersect( + $ordersby, + 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', + ) + ); + $orderby = empty( $ordersby ) ? 'comment_date_gmt' : implode(', ', $ordersby); + } else { + $orderby = 'comment_date_gmt'; + } + + $number = absint($number); + $offset = absint($offset); + + if ( !empty($number) ) { + if ( $offset ) + $limits = 'LIMIT ' . $offset . ',' . $number; + else + $limits = 'LIMIT ' . $number; + } else { + $limits = ''; + } + + if ( $count ) + $fields = 'COUNT(*)'; + else + $fields = '*'; + + $join = ''; + $where = $approved; + + if ( ! empty($post_id) ) + $where .= $wpdb->prepare( ' AND comment_post_ID = %d', $post_id ); + if ( '' !== $author_email ) + $where .= $wpdb->prepare( ' AND comment_author_email = %s', $author_email ); + if ( '' !== $karma ) + $where .= $wpdb->prepare( ' AND comment_karma = %d', $karma ); + if ( 'comment' == $type ) { + $where .= " AND comment_type = ''"; + } elseif( 'pings' == $type ) { + $where .= ' AND comment_type IN ("pingback", "trackback")'; + } elseif ( ! empty( $type ) ) { + $where .= $wpdb->prepare( ' AND comment_type = %s', $type ); + } + if ( '' !== $parent ) + $where .= $wpdb->prepare( ' AND comment_parent = %d', $parent ); + if ( '' !== $user_id ) + $where .= $wpdb->prepare( ' AND user_id = %d', $user_id ); + if ( '' !== $search ) + $where .= $this->get_search_sql( $search, array( 'comment_author', 'comment_author_email', 'comment_author_url', 'comment_author_IP', 'comment_content' ) ); + + $post_fields = array_filter( compact( array( 'post_author', 'post_name', 'post_parent', 'post_status', 'post_type', ) ) ); + if ( ! empty( $post_fields ) ) { + $join = "JOIN $wpdb->posts ON $wpdb->posts.ID = $wpdb->comments.comment_post_ID"; + foreach( $post_fields as $field_name => $field_value ) + $where .= $wpdb->prepare( " AND {$wpdb->posts}.{$field_name} = %s", $field_value ); + } + + $pieces = array( 'fields', 'join', 'where', 'orderby', 'order', 'limits' ); + $clauses = apply_filters_ref_array( 'comments_clauses', array( compact( $pieces ), &$this ) ); + foreach ( $pieces as $piece ) + $$piece = isset( $clauses[ $piece ] ) ? $clauses[ $piece ] : ''; + + $query = "SELECT $fields FROM $wpdb->comments $join WHERE $where ORDER BY $orderby $order $limits"; + + if ( $count ) + return $wpdb->get_var( $query ); + + $comments = $wpdb->get_results( $query ); + $comments = apply_filters_ref_array( 'the_comments', array( $comments, &$this ) ); + + wp_cache_add( $cache_key, $comments, 'comment' ); + + return $comments; + } + + /* + * Used internally to generate an SQL string for searching across multiple columns + * + * @access protected + * @since 3.1.0 + * + * @param string $string + * @param array $cols + * @return string + */ + function get_search_sql( $string, $cols ) { + $string = esc_sql( like_escape( $string ) ); + + $searches = array(); + foreach ( $cols as $col ) + $searches[] = "$col LIKE '%$string%'"; + + return ' AND (' . implode(' OR ', $searches) . ')'; + } +} + +/** + * 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. + * + * @package WordPress + * @subpackage Post + * @since 2.7.0 + * + * @return array List of comment statuses. + */ +function get_comment_statuses( ) { + $status = array( + 'hold' => __('Unapproved'), + /* translators: comment status */ + 'approve' => _x('Approved', 'adjective'), + /* translators: comment status */ + 'spam' => _x('Spam', 'adjective'), + ); + + return $status; +} + + +/** + * The date the last comment was modified. + * + * @since 1.5.0 + * @uses $wpdb + * @global array $cache_lastcommentmodified + * + * @param string $timezone Which timezone to use in reference to 'gmt', 'blog', + * or 'server' locations. + * @return string Last comment modified date. + */ +function get_lastcommentmodified($timezone = 'server') { + global $cache_lastcommentmodified, $wpdb; + + if ( isset($cache_lastcommentmodified[$timezone]) ) + return $cache_lastcommentmodified[$timezone]; + + $add_seconds_server = date('Z'); + + switch ( strtolower($timezone)) { + case 'gmt': + $lastcommentmodified = $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': + $lastcommentmodified = $wpdb->get_var("SELECT comment_date FROM $wpdb->comments WHERE comment_approved = '1' ORDER BY comment_date_gmt DESC LIMIT 1"); + break; + case 'server': + $lastcommentmodified = $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; + } + + $cache_lastcommentmodified[$timezone] = $lastcommentmodified; + + return $lastcommentmodified; +} + +/** + * The amount of comments in a post or total comments. + * + * A lot like {@link wp_count_comments()}, in that they both return comment + * stats (albeit with different types). The {@link wp_count_comments()} actual + * caches, but this function does not. + * + * @since 2.0.0 + * @uses $wpdb + * + * @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, + "total_comments" => 0 + ); + + foreach ( $totals as $row ) { + switch ( $row['comment_approved'] ) { + 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']; + break; + case 0: + $comment_count['awaiting_moderation'] = $row['total']; + $comment_count['total_comments'] += $row['total']; + break; + default: + break; + } + } + + return $comment_count; +} + +// +// Comment meta functions +// + +/** + * Add meta data field to a comment. + * + * @since 2.9.0 + * @uses add_metadata + * @link http://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 bool False for failure. True for success. + */ +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 + * @uses delete_metadata + * @link http://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 False for failure. True for success. + */ +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 + * @uses get_metadata + * @link http://codex.wordpress.org/Function_Reference/get_comment_meta + * + * @param int $comment_id Comment ID. + * @param string $key The meta key to retrieve. + * @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 + * @uses update_metadata + * @link http://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 bool False on failure, true if success. + */ +function update_comment_meta($comment_id, $meta_key, $meta_value, $prev_value = '') { + return update_metadata('comment', $comment_id, $meta_key, $meta_value, $prev_value); +} + +/** + * 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]) ) { + $comment_author = apply_filters('pre_comment_author_name', $_COOKIE['comment_author_'.COOKIEHASH]); + $comment_author = stripslashes($comment_author); + $comment_author = esc_attr($comment_author); + $_COOKIE['comment_author_'.COOKIEHASH] = $comment_author; + } + + if ( isset($_COOKIE['comment_author_email_'.COOKIEHASH]) ) { + $comment_author_email = apply_filters('pre_comment_author_email', $_COOKIE['comment_author_email_'.COOKIEHASH]); + $comment_author_email = stripslashes($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]) ) { + $comment_author_url = apply_filters('pre_comment_author_url', $_COOKIE['comment_author_url_'.COOKIEHASH]); + $comment_author_url = stripslashes($comment_author_url); + $_COOKIE['comment_author_url_'.COOKIEHASH] = $comment_author_url; + } +} + +/** + * Validates whether this comment is allowed to be made. + * + * @since 2.0.0 + * @uses $wpdb + * @uses apply_filters() Calls 'pre_comment_approved' hook on the type of comment + * @uses apply_filters() Calls 'comment_duplicate_trigger' hook on commentdata. + * @uses do_action() Calls 'check_comment_flood' hook on $comment_author_IP, $comment_author_email, and $comment_date_gmt + * + * @param array $commentdata Contains information on the comment + * @return mixed Signifies the approval status (0|1|'spam') + */ +function wp_allow_comment($commentdata) { + global $wpdb; + extract($commentdata, EXTR_SKIP); + + // Simple duplicate check + // expected_slashed ($comment_post_ID, $comment_author, $comment_author_email, $comment_content) + $dupe = "SELECT comment_ID FROM $wpdb->comments WHERE comment_post_ID = '$comment_post_ID' AND comment_approved != 'trash' AND ( comment_author = '$comment_author' "; + if ( $comment_author_email ) + $dupe .= "OR comment_author_email = '$comment_author_email' "; + $dupe .= ") AND comment_content = '$comment_content' LIMIT 1"; + if ( $wpdb->get_var($dupe) ) { + do_action( 'comment_duplicate_trigger', $commentdata ); + if ( defined('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!') ); + } + + do_action( 'check_comment_flood', $comment_author_IP, $comment_author_email, $comment_date_gmt ); + + if ( isset($user_id) && $user_id) { + $userdata = get_userdata($user_id); + $user = new WP_User($user_id); + $post_author = $wpdb->get_var($wpdb->prepare("SELECT post_author FROM $wpdb->posts WHERE ID = %d LIMIT 1", $comment_post_ID)); + } + + if ( isset($userdata) && ( $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($comment_author, $comment_author_email, $comment_author_url, $comment_content, $comment_author_IP, $comment_agent, $comment_type) ) + $approved = 1; + else + $approved = 0; + if ( wp_blacklist_check($comment_author, $comment_author_email, $comment_author_url, $comment_content, $comment_author_IP, $comment_agent) ) + $approved = 'spam'; + } + + $approved = apply_filters( 'pre_comment_approved', $approved, $commentdata ); + return $approved; +} + +/** + * Check whether comment flooding is occurring. + * + * Won't run, if current user can manage options, so to not block + * administrators. + * + * @since 2.3.0 + * @uses $wpdb + * @uses apply_filters() Calls 'comment_flood_filter' filter with first + * parameter false, last comment timestamp, new comment timestamp. + * @uses do_action() Calls 'comment_flood_trigger' action with parameters with + * last comment timestamp and new comment timestamp. + * + * @param string $ip Comment IP. + * @param string $email Comment author email address. + * @param string $date MySQL time string. + */ +function check_comment_flood_db( $ip, $email, $date ) { + global $wpdb; + if ( current_user_can( 'manage_options' ) ) + return; // don't throttle admins + $hour_ago = gmdate( 'Y-m-d H:i:s', time() - 3600 ); + if ( $lasttime = $wpdb->get_var( $wpdb->prepare( "SELECT `comment_date_gmt` FROM `$wpdb->comments` WHERE `comment_date_gmt` >= %s AND ( `comment_author_IP` = %s OR `comment_author_email` = %s ) ORDER BY `comment_date_gmt` DESC LIMIT 1", $hour_ago, $ip, $email ) ) ) { + $time_lastcomment = mysql2date('U', $lasttime, false); + $time_newcomment = mysql2date('U', $date, false); + $flood_die = apply_filters('comment_flood_filter', false, $time_lastcomment, $time_newcomment); + if ( $flood_die ) { + do_action('comment_flood_trigger', $time_lastcomment, $time_newcomment); + + if ( defined('DOING_AJAX') ) + die( __('You are posting comments too quickly. Slow down.') ); + + wp_die( __('You are posting comments too quickly. Slow down.'), '', array('response' => 403) ); + } + } +} + +/** + * 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 get_query_var() Used to fill in the default for $per_page parameter. + * @uses get_option() Used to fill in defaults for parameters. + * @uses Walker_Comment + * + * @param array $comments Optional array of comment objects. Defaults to $wp_query->comments + * @param int $per_page Optional comments per page. + * @param boolean $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) ) + $comments = $wp_query->comments; + + if ( empty($comments) ) + return 0; + + 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 + * @uses get_comment() Gets the full comment of the $comment_ID parameter. + * @uses get_option() Get various settings to control function and defaults. + * @uses get_page_of_comment() Used to loop up to top level comment. + * + * @param int $comment_ID Comment ID. + * @param array $args Optional args. + * @return int|null Comment page number or null on error. + */ +function get_page_of_comment( $comment_ID, $args = array() ) { + global $wpdb; + + if ( !$comment = get_comment( $comment_ID ) ) + return; + + $defaults = array( 'type' => 'all', 'page' => '', 'per_page' => '', 'max_depth' => '' ); + $args = wp_parse_args( $args, $defaults ); + + if ( '' === $args['per_page'] && get_option('page_comments') ) + $args['per_page'] = get_query_var('comments_per_page'); + if ( empty($args['per_page']) ) { + $args['per_page'] = 0; + $args['page'] = 0; + } + if ( $args['per_page'] < 1 ) + return 1; + + 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 ); + + $allowedtypes = array( + 'comment' => '', + 'pingback' => 'pingback', + 'trackback' => 'trackback', + ); + + $comtypewhere = ( 'all' != $args['type'] && isset($allowedtypes[$args['type']]) ) ? " AND comment_type = '" . $allowedtypes[$args['type']] . "'" : ''; + + // Count comments older than this one + $oldercoms = $wpdb->get_var( $wpdb->prepare( "SELECT COUNT(comment_ID) FROM $wpdb->comments WHERE comment_post_ID = %d AND comment_parent = 0 AND comment_approved = '1' AND comment_date_gmt < '%s'" . $comtypewhere, $comment->comment_post_ID, $comment->comment_date_gmt ) ); + + // No older comments? Then it's page #1. + if ( 0 == $oldercoms ) + return 1; + + // Divide comments older than this one by comments per page to get this comment's page number + return ceil( ( $oldercoms + 1 ) / $args['per_page'] ); +} + +/** + * Does comment contain blacklisted characters or words. + * + * @since 1.5.0 + * @uses do_action() Calls 'wp_blacklist_check' hook for all parameters. + * + * @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) { + 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 + $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, $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 Comment stats. + */ +function wp_count_comments( $post_id = 0 ) { + global $wpdb; + + $post_id = (int) $post_id; + + $stats = apply_filters('wp_count_comments', array(), $post_id); + if ( !empty($stats) ) + return $stats; + + $count = wp_cache_get("comments-{$post_id}", 'counts'); + + if ( false !== $count ) + return $count; + + $where = ''; + if ( $post_id > 0 ) + $where = $wpdb->prepare( "WHERE comment_post_ID = %d", $post_id ); + + $count = $wpdb->get_results( "SELECT comment_approved, COUNT( * ) AS num_comments FROM {$wpdb->comments} {$where} GROUP BY comment_approved", ARRAY_A ); + + $total = 0; + $approved = array('0' => 'moderated', '1' => 'approved', 'spam' => 'spam', 'trash' => 'trash', 'post-trashed' => 'post-trashed'); + foreach ( (array) $count as $row ) { + // Don't count post-trashed toward totals + if ( 'post-trashed' != $row['comment_approved'] && 'trash' != $row['comment_approved'] ) + $total += $row['num_comments']; + if ( isset( $approved[$row['comment_approved']] ) ) + $stats[$approved[$row['comment_approved']]] = $row['num_comments']; + } + + $stats['total_comments'] = $total; + foreach ( $approved as $key ) { + if ( empty($stats[$key]) ) + $stats[$key] = 0; + } + + $stats = (object) $stats; + wp_cache_set("comments-{$post_id}", $stats, 'counts'); + + return $stats; +} + +/** + * 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 + * @uses $wpdb + * @uses do_action() Calls 'delete_comment' hook on comment ID + * @uses do_action() Calls 'deleted_comment' hook on comment ID after deletion, on success + * @uses do_action() Calls 'wp_set_comment_status' hook on comment ID with 'delete' set for the second parameter + * @uses wp_transition_comment_status() Passes new and old comment status along with $comment object + * + * @param int $comment_id Comment ID + * @param bool $force_delete Whether to bypass trash and force deletion. Default is false. + * @return bool False if delete comment query failure, true on success. + */ +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_id), array( 'trash', 'spam' ) ) ) + return wp_trash_comment($comment_id); + + do_action('delete_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_id) ); + if ( !empty($children) ) { + $wpdb->update($wpdb->comments, array('comment_parent' => $comment->comment_parent), array('comment_parent' => $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_id ) ); + if ( !empty($meta_ids) ) { + do_action( 'delete_commentmeta', $meta_ids ); + $in_meta_ids = "'" . implode("', '", $meta_ids) . "'"; + $wpdb->query( "DELETE FROM $wpdb->commentmeta WHERE meta_id IN ($in_meta_ids)" ); + do_action( 'deleted_commentmeta', $meta_ids ); + } + + if ( ! $wpdb->query( $wpdb->prepare("DELETE FROM $wpdb->comments WHERE comment_ID = %d LIMIT 1", $comment_id) ) ) + return false; + do_action('deleted_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_id); + + do_action('wp_set_comment_status', $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 + * @uses do_action() on 'trash_comment' before trashing + * @uses do_action() on 'trashed_comment' after trashing + * @uses wp_delete_comment() if trash is disabled + * + * @param int $comment_id Comment ID. + * @return mixed 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; + + do_action('trash_comment', $comment_id); + + if ( wp_set_comment_status($comment_id, 'trash') ) { + add_comment_meta($comment_id, '_wp_trash_meta_status', $comment->comment_approved); + add_comment_meta($comment_id, '_wp_trash_meta_time', time() ); + do_action('trashed_comment', $comment_id); + return true; + } + + return false; +} + +/** + * Removes a comment from the Trash + * + * @since 2.9.0 + * @uses do_action() on 'untrash_comment' before untrashing + * @uses do_action() on 'untrashed_comment' after untrashing + * + * @param int $comment_id Comment ID. + * @return mixed False on failure + */ +function wp_untrash_comment($comment_id) { + if ( ! (int)$comment_id ) + return false; + + do_action('untrash_comment', $comment_id); + + $status = (string) get_comment_meta($comment_id, '_wp_trash_meta_status', true); + if ( empty($status) ) + $status = '0'; + + if ( wp_set_comment_status($comment_id, $status) ) { + delete_comment_meta($comment_id, '_wp_trash_meta_time'); + delete_comment_meta($comment_id, '_wp_trash_meta_status'); + do_action('untrashed_comment', $comment_id); + return true; + } + + return false; +} + +/** + * Marks a comment as Spam + * + * @since 2.9.0 + * @uses do_action() on 'spam_comment' before spamming + * @uses do_action() on 'spammed_comment' after spamming + * + * @param int $comment_id Comment ID. + * @return mixed False on failure + */ +function wp_spam_comment($comment_id) { + if ( !$comment = get_comment($comment_id) ) + return false; + + do_action('spam_comment', $comment_id); + + if ( wp_set_comment_status($comment_id, 'spam') ) { + add_comment_meta($comment_id, '_wp_trash_meta_status', $comment->comment_approved); + do_action('spammed_comment', $comment_id); + return true; + } + + return false; +} + +/** + * Removes a comment from the Spam + * + * @since 2.9.0 + * @uses do_action() on 'unspam_comment' before unspamming + * @uses do_action() on 'unspammed_comment' after unspamming + * + * @param int $comment_id Comment ID. + * @return mixed False on failure + */ +function wp_unspam_comment($comment_id) { + if ( ! (int)$comment_id ) + return false; + + do_action('unspam_comment', $comment_id); + + $status = (string) get_comment_meta($comment_id, '_wp_trash_meta_status', true); + if ( empty($status) ) + $status = '0'; + + if ( wp_set_comment_status($comment_id, $status) ) { + delete_comment_meta($comment_id, '_wp_trash_meta_status'); + do_action('unspammed_comment', $comment_id); + return true; + } + + return false; +} + +/** + * The status of a comment by ID. + * + * @since 1.0.0 + * + * @param int $comment_id Comment ID + * @return string|bool 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 + * 'transition_comment_status' with new status, old status, and comment data. The + * next action called is 'comment_OLDSTATUS_to_NEWSTATUS' the NEWSTATUS is the + * $new_status parameter and the OLDSTATUS is $old_status parameter; it has the + * comment data. + * + * The final action will run whether or not the comment statuses are the same. The + * action is named 'comment_NEWSTATUS_COMMENTTYPE', NEWSTATUS is from the $new_status + * parameter and COMMENTTYPE is comment_type comment data. + * + * @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 ) { + do_action('transition_comment_status', $new_status, $old_status, $comment); + do_action("comment_{$old_status}_to_{$new_status}", $comment); + } + do_action("comment_{$new_status}_{$comment->comment_type}", $comment->comment_ID, $comment); +} + +/** + * 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]; + + return apply_filters('wp_get_current_commenter', compact('comment_author', 'comment_author_email', 'comment_author_url')); +} + +/** + * Inserts a comment to the database. + * + * The available comment data key names are 'comment_author_IP', 'comment_date', + * 'comment_date_gmt', 'comment_parent', 'comment_approved', and 'user_id'. + * + * @since 2.0.0 + * @uses $wpdb + * + * @param array $commentdata Contains information on the comment. + * @return int The new comment's ID. + */ +function wp_insert_comment($commentdata) { + global $wpdb; + extract(stripslashes_deep($commentdata), EXTR_SKIP); + + if ( ! isset($comment_author_IP) ) + $comment_author_IP = ''; + if ( ! isset($comment_date) ) + $comment_date = current_time('mysql'); + if ( ! isset($comment_date_gmt) ) + $comment_date_gmt = get_gmt_from_date($comment_date); + if ( ! isset($comment_parent) ) + $comment_parent = 0; + if ( ! isset($comment_approved) ) + $comment_approved = 1; + if ( ! isset($comment_karma) ) + $comment_karma = 0; + if ( ! isset($user_id) ) + $user_id = 0; + if ( ! isset($comment_type) ) + $comment_type = ''; + + $data = 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'); + $wpdb->insert($wpdb->comments, $data); + + $id = (int) $wpdb->insert_id; + + if ( $comment_approved == 1 ) + wp_update_comment_count($comment_post_ID); + + $comment = get_comment($id); + 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 + * @uses apply_filters() Calls 'pre_user_id' hook on comment author's user ID + * @uses apply_filters() Calls 'pre_comment_user_agent' hook on comment author's user agent + * @uses apply_filters() Calls 'pre_comment_author_name' hook on comment author's name + * @uses apply_filters() Calls 'pre_comment_content' hook on the comment's content + * @uses apply_filters() Calls 'pre_comment_user_ip' hook on comment author's IP + * @uses apply_filters() Calls 'pre_comment_author_url' hook on comment author's URL + * @uses apply_filters() Calls 'pre_comment_author_email' hook on comment author's email address + * + * @param array $commentdata Contains information on the comment. + * @return array Parsed comment information. + */ +function wp_filter_comment($commentdata) { + if ( isset($commentdata['user_ID']) ) + $commentdata['user_id'] = apply_filters('pre_user_id', $commentdata['user_ID']); + elseif ( isset($commentdata['user_id']) ) + $commentdata['user_id'] = apply_filters('pre_user_id', $commentdata['user_id']); + $commentdata['comment_agent'] = apply_filters('pre_comment_user_agent', ( isset( $commentdata['comment_agent'] ) ? $commentdata['comment_agent'] : '' ) ); + $commentdata['comment_author'] = apply_filters('pre_comment_author_name', $commentdata['comment_author']); + $commentdata['comment_content'] = apply_filters('pre_comment_content', $commentdata['comment_content']); + $commentdata['comment_author_IP'] = apply_filters('pre_comment_user_ip', $commentdata['comment_author_IP']); + $commentdata['comment_author_url'] = apply_filters('pre_comment_author_url', $commentdata['comment_author_url']); + $commentdata['comment_author_email'] = apply_filters('pre_comment_author_email', $commentdata['comment_author_email']); + $commentdata['filtered'] = true; + return $commentdata; +} + +/** + * Whether 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 'comment_post' action with comment ID + * and whether comment is approved by WordPress. Also has '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 http://core.trac.wordpress.org/ticket/9235} + * + * @since 1.5.0 + * @uses apply_filters() Calls 'preprocess_comment' hook on $commentdata parameter array before processing + * @uses do_action() Calls 'comment_post' hook on $comment_ID returned from adding the comment and if the comment was approved. + * @uses wp_filter_comment() Used to filter comment before adding comment. + * @uses wp_allow_comment() checks to see if comment is approved. + * @uses wp_insert_comment() Does the actual comment insertion to the database. + * + * @param array $commentdata Contains information on the comment. + * @return int The ID of the comment after adding. + */ +function wp_new_comment( $commentdata ) { + $commentdata = apply_filters('preprocess_comment', $commentdata); + + $commentdata['comment_post_ID'] = (int) $commentdata['comment_post_ID']; + if ( isset($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; + + $commentdata['comment_author_IP'] = preg_replace( '/[^0-9a-fA-F:., ]/', '',$_SERVER['REMOTE_ADDR'] ); + $commentdata['comment_agent'] = substr($_SERVER['HTTP_USER_AGENT'], 0, 254); + + $commentdata['comment_date'] = current_time('mysql'); + $commentdata['comment_date_gmt'] = current_time('mysql', 1); + + $commentdata = wp_filter_comment($commentdata); + + $commentdata['comment_approved'] = wp_allow_comment($commentdata); + + $comment_ID = wp_insert_comment($commentdata); + + do_action('comment_post', $comment_ID, $commentdata['comment_approved']); + + if ( 'spam' !== $commentdata['comment_approved'] ) { // If it's spam save it silently for later crunching + if ( '0' == $commentdata['comment_approved'] ) + wp_notify_moderator($comment_ID); + + $post = &get_post($commentdata['comment_post_ID']); // Don't notify if it's your own comment + + if ( get_option('comments_notify') && $commentdata['comment_approved'] && ( ! isset( $commentdata['user_id'] ) || $post->post_author != $commentdata['user_id'] ) ) + wp_notify_postauthor($comment_ID, isset( $commentdata['comment_type'] ) ? $commentdata['comment_type'] : '' ); + } + + return $comment_ID; +} + +/** + * Sets the status of a comment. + * + * The 'wp_set_comment_status' action is called after the comment is handled and + * will only be called, if the comment status is either 'hold', 'approve', or + * 'spam'. If the comment status is not in the list, then false is returned and + * if the status is 'delete', then the comment is deleted without calling the + * action. + * + * @since 1.0.0 + * @uses wp_transition_comment_status() Passes new and old comment status along with $comment object + * + * @param int $comment_id Comment ID. + * @param string $comment_status New comment status, either 'hold', 'approve', 'spam', or 'delete'. + * @param bool $wp_error Whether to return a WP_Error object if there is a failure. Default is false. + * @return bool False on failure or deletion and true on success. + */ +function wp_set_comment_status($comment_id, $comment_status, $wp_error = false) { + global $wpdb; + + $status = '0'; + switch ( $comment_status ) { + case 'hold': + case '0': + $status = '0'; + break; + case 'approve': + case '1': + $status = '1'; + if ( get_option('comments_notify') ) { + $comment = get_comment($comment_id); + wp_notify_postauthor($comment_id, $comment->comment_type); + } + 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_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_id); + + $comment = get_comment($comment_id); + + do_action('wp_set_comment_status', $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 + * @uses $wpdb + * @uses wp_transition_comment_status() Passes new and old comment status along with $comment 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); + + // Escape data pulled from DB. + $comment = esc_sql($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. + extract(stripslashes_deep($commentarr), EXTR_SKIP); + + $comment_content = apply_filters('comment_save_pre', $comment_content); + + $comment_date_gmt = get_gmt_from_date($comment_date); + + if ( !isset($comment_approved) ) + $comment_approved = 1; + else if ( 'hold' == $comment_approved ) + $comment_approved = 0; + else if ( 'approve' == $comment_approved ) + $comment_approved = 1; + + $data = compact('comment_content', 'comment_author', 'comment_author_email', 'comment_approved', 'comment_karma', 'comment_author_url', 'comment_date', 'comment_date_gmt'); + $rval = $wpdb->update( $wpdb->comments, $data, compact( 'comment_ID' ) ); + + clean_comment_cache($comment_ID); + wp_update_comment_count($comment_post_ID); + do_action('edit_comment', $comment_ID); + $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 unknown + */ +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 + * + * @param int $post_id Post ID + * @param bool $do_deferred Whether to process previously deferred post comment counts + * @return bool True on success, false on failure + */ +function wp_update_comment_count($post_id, $do_deferred=false) { + static $_deferred = array(); + + 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 + * @uses $wpdb + * @uses do_action() Calls 'wp_update_comment_count' hook on $post_id, $new, and $old + * @uses do_action() Calls 'edit_posts' hook on $post_id and $post + * + * @param int $post_id Post ID + * @return bool False on '0' $post_id or if post with ID does not exist. True on success. + */ +function wp_update_comment_count_now($post_id) { + global $wpdb; + $post_id = (int) $post_id; + if ( !$post_id ) + return false; + if ( !$post = get_post($post_id) ) + return false; + + $old = (int) $post->comment_count; + $new = (int) $wpdb->get_var( $wpdb->prepare("SELECT COUNT(*) FROM $wpdb->comments WHERE comment_post_ID = %d AND comment_approved = '1'", $post_id) ); + $wpdb->update( $wpdb->posts, array('comment_count' => $new), array('ID' => $post_id) ); + + if ( 'page' == $post->post_type ) + clean_page_cache( $post_id ); + else + clean_post_cache( $post_id ); + + do_action('wp_update_comment_count', $post_id, $new, $old); + 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 bool|string False on failure, string containing URI on success. + */ +function discover_pingback_server_uri( $url, $deprecated = '' ) { + if ( !empty( $deprecated ) ) + _deprecated_argument( __FUNCTION__, '2.7' ); + + $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 an URL. This should never happen. + return false; + + //Do not search for a pingback server on our own uploads + $uploads_dir = wp_upload_dir(); + if ( 0 === strpos($url, $uploads_dir['baseurl']) ) + return false; + + $response = wp_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 its not a binary file) + $response = wp_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 + * @uses $wpdb + */ +function do_all_pings() { + global $wpdb; + + // Do pingbacks + while ($ping = $wpdb->get_row("SELECT * FROM {$wpdb->posts}, {$wpdb->postmeta} WHERE {$wpdb->posts}.ID = {$wpdb->postmeta}.post_id AND {$wpdb->postmeta}.meta_key = '_pingme' LIMIT 1")) { + $mid = $wpdb->get_var( "SELECT meta_id FROM {$wpdb->postmeta} WHERE post_id = {$ping->ID} AND meta_key = '_pingme' LIMIT 1"); + do_action( 'delete_postmeta', $mid ); + $wpdb->query( $wpdb->prepare( "DELETE FROM {$wpdb->postmeta} WHERE meta_id = %d", $mid ) ); + do_action( 'deleted_postmeta', $mid ); + pingback($ping->post_content, $ping->ID); + } + + // Do Enclosures + while ($enclosure = $wpdb->get_row("SELECT * FROM {$wpdb->posts}, {$wpdb->postmeta} WHERE {$wpdb->posts}.ID = {$wpdb->postmeta}.post_id AND {$wpdb->postmeta}.meta_key = '_encloseme' LIMIT 1")) { + $mid = $wpdb->get_var( $wpdb->prepare("SELECT meta_id FROM {$wpdb->postmeta} WHERE post_id = %d AND meta_key = '_encloseme'", $enclosure->ID) ); + do_action( 'delete_postmeta', $mid ); + $wpdb->query( $wpdb->prepare("DELETE FROM {$wpdb->postmeta} WHERE meta_id = %d", $mid) ); + do_action( 'deleted_postmeta', $mid ); + 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 + * @uses $wpdb + * + * @param int $post_id Post ID to do trackbacks on. + */ +function do_trackbacks($post_id) { + global $wpdb; + + $post = $wpdb->get_row( $wpdb->prepare("SELECT * FROM $wpdb->posts WHERE ID = %d", $post_id) ); + $to_ping = get_to_ping($post_id); + $pinged = get_pung($post_id); + if ( empty($to_ping) ) { + $wpdb->update($wpdb->posts, array('to_ping' => ''), array('ID' => $post_id) ); + return; + } + + if ( empty($post->post_excerpt) ) + $excerpt = apply_filters('the_content', $post->post_content); + else + $excerpt = apply_filters('the_excerpt', $post->post_excerpt); + $excerpt = str_replace(']]>', ']]>', $excerpt); + $excerpt = wp_html_excerpt($excerpt, 252) . '...'; + + $post_title = apply_filters('the_title', $post->post_title); + $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. Not actually used. + * @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 + * @uses $wp_version + * @uses IXR_Client + * + * @param string $content Post content to check for links. + * @param int $post_ID Post ID. + */ +function pingback($content, $post_ID) { + global $wp_version; + 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(); + + $pung = get_pung($post_ID); + + // Variables + $ltrs = '\w'; + $gunk = '/#~:.?+=&%@!\-'; + $punc = '.:?\-'; + $any = $ltrs . $gunk . $punc; + + // Step 1 + // Parsing the post, external links (if any) are stored in the $post_links array + // This regexp comes straight from phpfreaks.com + // http://www.phpfreaks.com/quickcode/Extract_All_URLs_on_a_Page/15.php + preg_match_all("{\b http : [$any] +? (?= [$punc] * [^$any] | $)}x", $content, $post_links_temp); + + // 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[0] 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; + + do_action_ref_array('pre_ping', array(&$post_links, &$pung)); + + 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_ID); + + // 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; + $client->useragent = apply_filters( 'pingback_useragent', $client->useragent . ' -- WordPress/' . $wp_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_ID, $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 + * @uses $wpdb + * + * @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 mixed Database query from update. + */ +function trackback($trackback_url, $title, $excerpt, $ID) { + global $wpdb; + + if ( empty($trackback_url) ) + return; + + $options = array(); + $options['timeout'] = 4; + $options['body'] = array( + 'title' => $title, + 'url' => get_permalink($ID), + 'blog_name' => get_option('blogname'), + 'excerpt' => $excerpt + ); + + $response = wp_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 + * @uses $wp_version + * @uses IXR_Client + * + * @param string $server Host of blog to connect to. + * @param string $path Path to send the ping. + */ +function weblog_ping($server = '', $path = '') { + global $wp_version; + 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/'.$wp_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); +} + +// +// Cache +// + +/** + * Removes comment ID from the comment cache. + * + * @since 2.3.0 + * @package WordPress + * @subpackage Cache + * + * @param int|array $ids Comment ID or array of comment IDs to remove from cache + */ +function clean_comment_cache($ids) { + foreach ( (array) $ids as $id ) + wp_cache_delete($id, 'comment'); + + wp_cache_set('last_changed', time(), '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 + * @package WordPress + * @subpackage Cache + * + * @param array $comments Array of comment row objects + */ +function update_comment_cache($comments) { + foreach ( (array) $comments as $comment ) + wp_cache_add($comment->comment_ID, $comment, 'comment'); +} + +// +// 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 object $posts Post data object. + * @return object + */ +function _close_comments_for_old_posts( $posts ) { + if ( empty($posts) || !is_singular() || !get_option('close_comments_for_old_posts') ) + return $posts; + + $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 * 24 * 60 * 60 ) ) { + $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); + + $post_types = apply_filters( 'close_comments_for_post_types', array( 'post' ) ); + if ( ! in_array( $post->post_type, $post_types ) ) + return $open; + + if ( time() - strtotime( $post->post_date_gmt ) > ( $days_old * 24 * 60 * 60 ) ) + return false; + + return $open; +} + +?> diff --git a/src/wp-includes/compat.php b/src/wp-includes/compat.php new file mode 100644 index 0000000..cb2a559 --- /dev/null +++ b/src/wp-includes/compat.php @@ -0,0 +1,96 @@ + '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 ( !is_a($wp_json, 'Services_JSON') ) { + require_once( ABSPATH . WPINC . '/class-json.php' ); + $wp_json = new Services_JSON(); + } + + return $wp_json->encodeUnsafe( $string ); + } +} + +if ( !function_exists('json_decode') ) { + function json_decode( $string, $assoc_array = false ) { + global $wp_json; + + if ( !is_a($wp_json, '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; + } + function _json_decode_object_helper($data) { + if ( is_object($data) ) + $data = get_object_vars($data); + return is_array($data) ? array_map(__FUNCTION__, $data) : $data; + } +} diff --git a/src/wp-includes/cron.php b/src/wp-includes/cron.php new file mode 100644 index 0000000..b7d04f2 --- /dev/null +++ b/src/wp-includes/cron.php @@ -0,0 +1,407 @@ + $hook, 'timestamp' => $timestamp, 'schedule' => false, 'args' => $args ); + $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 periodic 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 cron_schedules filter in wp_get_schedules(). + * + * Use wp_next_scheduled() to prevent duplicates + * + * @since 2.1.0 + * + * @param int $timestamp Timestamp for when to run the event. + * @param string $recurrence How often the event should recur. + * @param string $hook Action hook to execute when cron is run. + * @param array $args Optional. Arguments to pass to the hook's callback function. + * @return bool|null False on failure, null when complete with scheduling event. + */ +function wp_schedule_event( $timestamp, $recurrence, $hook, $args = array()) { + $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'] ); + $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 Timestamp for when to run the event. + * @param string $recurrence How often the event should recur. + * @param string $hook Action hook to execute when cron is run. + * @param array $args Optional. Arguments to pass to the hook's callback function. + * @return bool|null False on failure. Null when event is rescheduled. + */ +function wp_reschedule_event( $timestamp, $recurrence, $hook, $args = array()) { + $crons = _get_cron_array(); + $schedules = wp_get_schedules(); + $key = md5(serialize($args)); + $interval = 0; + + // First we try to get it from the schedule + if ( 0 == $interval ) + $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 cron job. + * + * The $timestamp and $hook parameters are required, so that the event can be + * identified. + * + * @since 2.1.0 + * + * @param int $timestamp Timestamp 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. + */ +function wp_unschedule_event( $timestamp, $hook, $args = array() ) { + $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 cron jobs attached to a specific 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 pass 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', __('This argument has changed to an array to match the behavior of the other cron functions.') ); + $args = array_slice( func_get_args(), 1 ); + } + + while ( $timestamp = wp_next_scheduled( $hook, $args ) ) + wp_unschedule_event( $timestamp, $hook, $args ); +} + +/** + * Retrieve the next timestamp for a cron event. + * + * @since 2.1.0 + * + * @param string $hook Action hook to execute when cron is run. + * @param array $args Optional. Arguments to pass to the hook's callback function. + * @return bool|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; +} + +/** + * Send request to run cron through HTTP request that doesn't halt page loading. + * + * @since 2.1.0 + * + * @return null Cron could not be spawned, because it is not needed to run. + */ +function spawn_cron( $local_time = 0 ) { + + if ( !$local_time ) + $local_time = time(); + + if ( defined('DOING_CRON') || isset($_GET['doing_wp_cron']) ) + return; + + /* + * multiple processes on multiple web servers can run this code concurrently + * try to make this as atomic as possible by setting doing_cron switch + */ + $flag = get_transient('doing_cron'); + + if ( $flag > $local_time + 10*60 ) + $flag = 0; + + // don't run if another process is currently running it or more than once every 60 sec. + if ( $flag + 60 > $local_time ) + return; + + //sanity check + $crons = _get_cron_array(); + if ( !is_array($crons) ) + return; + + $keys = array_keys( $crons ); + if ( isset($keys[0]) && $keys[0] > $local_time ) + return; + + if ( defined('ALTERNATE_WP_CRON') && ALTERNATE_WP_CRON ) { + if ( !empty($_POST) || defined('DOING_AJAX') ) + return; + + set_transient( 'doing_cron', $local_time ); + + ob_start(); + wp_redirect( add_query_arg('doing_wp_cron', '', stripslashes($_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_transient( 'doing_cron', $local_time ); + + $cron_url = get_option( 'siteurl' ) . '/wp-cron.php?doing_wp_cron'; + wp_remote_post( $cron_url, array('timeout' => 0.01, 'blocking' => false, 'sslverify' => apply_filters('https_local_ssl_verify', true)) ); +} + +/** + * Run scheduled callbacks or spawn cron for all scheduled events. + * + * @since 2.1.0 + * + * @return null When doesn't need to run Cron. + */ +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; + + $local_time = time(); + $keys = array_keys( $crons ); + if ( isset($keys[0]) && $keys[0] > $local_time ) + return; + + $schedules = wp_get_schedules(); + foreach ( $crons as $timestamp => $cronhooks ) { + if ( $timestamp > $local_time ) break; + foreach ( (array) $cronhooks as $hook => $args ) { + if ( isset($schedules[$hook]['callback']) && !call_user_func( $schedules[$hook]['callback'] ) ) + continue; + spawn_cron( $local_time ); + break 2; + } + } +} + +/** + * Retrieve supported and filtered Cron recurrences. + * + * The supported recurrences are 'hourly' and 'daily'. A plugin may add more by + * hooking into the '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' => 3600, 'display' => __('Once Hourly') ), + 'twicedaily' => array( 'interval' => 43200, 'display' => __('Twice Daily') ), + 'daily' => array( 'interval' => 86400, 'display' => __('Once Daily') ), + ); + return array_merge( apply_filters( 'cron_schedules', array() ), $schedules ); +} + +/** + * Retrieve Cron schedule for hook with arguments. + * + * @since 2.1.0 + * + * @param string $hook Action hook to execute when cron is run. + * @param array $args Optional. Arguments to pass to the hook's callback function. + * @return string|bool False, if no schedule. Schedule 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 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 {@link _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 {@link _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/src/wp-includes/css/admin-bar-rtl.css b/src/wp-includes/css/admin-bar-rtl.css new file mode 100644 index 0000000..59ad56a --- /dev/null +++ b/src/wp-includes/css/admin-bar-rtl.css @@ -0,0 +1 @@ +#wpadminbar{direction:rtl;font-family:Tahoma,Arial,Helvetica,sans-serif;right:0;left:auto;}#wpadminbar *{font-family:Tahoma,Arial,Helvetica,sans-serif;}#wpadminbar .quicklinks ul{text-align:right;}#wpadminbar .quicklinks ul li{float:right;}#wpadminbar .quicklinks>ul>li>a{border-left:1px solid #686868;border-right:1px solid #808080;}#wpadminbar .quicklinks>ul>li:last-child>a{border-left:none;border-right:1px solid #808080;}#wpadminbar .quicklinks>ul>li:hover>a{border-right-color:#707070;border-left-color:#686868;}#wpadminbar .quicklinks li#wp-admin-bar-my-account-with-avatar a img{margin:-2px -5px 0 23px;}#wpadminbar .quicklinks li#wp-admin-bar-my-account-with-avatar ul{left:auto;right:30px;}#wpadminbar .quicklinks li#wp-admin-bar-my-account-with-avatar ul ul{right:0;left:auto;}#wpadminbar .quicklinks .menupop li:hover>ul,#wpadminbar .quicklinks .menupop li.hover>ul{margin-right:100%;margin-left:0;}#wpadminbar .quicklinks .menupop a>span{background:url(../images/admin-bar-sprite-rtl.png?d=11122010) left -58px no-repeat;padding-right:0;padding-left:.8em;}#wpadminbar .quicklinks .menupop ul li a>span{background:url(../images/admin-bar-sprite-rtl.png?d=11122010) left -29px no-repeat;padding-right:0;padding-left:1.5em;}#wpadminbar .quicklinks a{font-family:Tahoma,Arial,Helvetica,sans-serif;}#wpadminbar .quicklinks .menupop li a img.blavatar{margin-right:0;margin-left:8px;}#wpadminbar .quicklinks li#wp-admin-bar-my-account-with-avatar>a{background:url(../images/admin-bar-sprite-rtl.png?d=11122010) top right no-repeat;}#wpadminbar .quicklinks li#wp-admin-bar-my-account>a,#wpadminbar .quicklinks li#wp-admin-bar-my-account-with-avatar>a{border-right:none;border-left:1px solid #686868;}#wpadminbar #adminbarsearch{float:left;}#wpadminbar #adminbarsearch .adminbar-input{float:right;font-family:Tahoma,Arial,Helvetica,sans-serif;margin-right:0;margin-left:3px;-moz-box-shadow:inset 2px -2px 1px #cdcdcd;-webkit-box-shadow:inset -2px 2px 1px #cdcdcd;box-shadow:inset 2px -2px 1px #cdcdcd;}#wpadminbar #adminbarsearch .adminbar-button{float:right;font-family:Tahoma,Arial,Helvetica,sans-serif;} \ No newline at end of file diff --git a/src/wp-includes/css/admin-bar-rtl.dev.css b/src/wp-includes/css/admin-bar-rtl.dev.css new file mode 100644 index 0000000..26138f5 --- /dev/null +++ b/src/wp-includes/css/admin-bar-rtl.dev.css @@ -0,0 +1,103 @@ +#wpadminbar { + direction: rtl; + font-family: Tahoma, Arial, Helvetica, sans-serif; + right: 0; + left: auto; +} + +#wpadminbar * { + font-family: Tahoma, Arial, Helvetica, sans-serif; +} + +#wpadminbar .quicklinks ul { + text-align: right; +} + +#wpadminbar .quicklinks ul li { + float: right; +} + +#wpadminbar .quicklinks > ul > li > a { + border-left: 1px solid #686868; + border-right: 1px solid #808080; +} + +#wpadminbar .quicklinks > ul > li:last-child > a { + border-left: none; + border-right: 1px solid #808080; +} + +#wpadminbar .quicklinks > ul > li:hover > a { + border-right-color: #707070; + border-left-color: #686868; +} + +#wpadminbar .quicklinks li#wp-admin-bar-my-account-with-avatar a img { + margin: -2px -5px 0 23px; +} + +#wpadminbar .quicklinks li#wp-admin-bar-my-account-with-avatar ul { + left: auto; + right: 30px; +} + +#wpadminbar .quicklinks li#wp-admin-bar-my-account-with-avatar ul ul { + right: 0; + left: auto; +} + +#wpadminbar .quicklinks .menupop li:hover > ul, +#wpadminbar .quicklinks .menupop li.hover > ul { + margin-right: 100%; + margin-left: 0; +} + +#wpadminbar .quicklinks .menupop a > span { + background: url(../images/admin-bar-sprite-rtl.png?d=11122010) left -58px no-repeat; + padding-right: 0; + padding-left: .8em; +} + +#wpadminbar .quicklinks .menupop ul li a > span { + background: url(../images/admin-bar-sprite-rtl.png?d=11122010) left -29px no-repeat; + padding-right: 0; + padding-left: 1.5em; +} + +#wpadminbar .quicklinks a { + font-family: Tahoma, Arial, Helvetica, sans-serif; +} + +#wpadminbar .quicklinks .menupop li a img.blavatar { + margin-right: 0; + margin-left: 8px; +} + +#wpadminbar .quicklinks li#wp-admin-bar-my-account-with-avatar > a { + background: url(../images/admin-bar-sprite-rtl.png?d=11122010) top right no-repeat; +} + +#wpadminbar .quicklinks li#wp-admin-bar-my-account > a, +#wpadminbar .quicklinks li#wp-admin-bar-my-account-with-avatar > a { + border-right: none; + border-left: 1px solid #686868; +} + +#wpadminbar #adminbarsearch { + float: left; +} + +#wpadminbar #adminbarsearch .adminbar-input { + float: right; + font-family: Tahoma, Arial, Helvetica, sans-serif; + margin-right: 0; + margin-left: 3px; + -moz-box-shadow: inset 2px -2px 1px #cdcdcd; + -webkit-box-shadow: inset -2px 2px 1px #cdcdcd; + box-shadow: inset 2px -2px 1px #cdcdcd; +} + +#wpadminbar #adminbarsearch .adminbar-button { + float: right; + font-family: Tahoma, Arial, Helvetica, sans-serif; +} diff --git a/src/wp-includes/css/admin-bar.css b/src/wp-includes/css/admin-bar.css new file mode 100644 index 0000000..d98ef3a --- /dev/null +++ b/src/wp-includes/css/admin-bar.css @@ -0,0 +1 @@ +#wpadminbar *{height:auto;width:auto;margin:0;padding:0;position:static;text-transform:none;letter-spacing:normal;line-height:1;font:normal 13px/28px Arial,Helvetica,sans-serif;color:#ddd;text-shadow:#555 0 -1px 0;}#wpadminbar :before,#wpadminbar :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{direction:ltr;background-color:#777;background-image:-moz-linear-gradient(bottom,#666,#7f7f7f);background-image:-webkit-gradient(linear,left bottom,left top,from(#666),to(#7f7f7f));color:#ddd;font:normal 12px/28px Arial,Helvetica,sans-serif;height:28px;position:fixed;top:0;left:0;width:100%;z-index:99999;min-width:960px;}#wpadminbar ul,#wpadminbar ul li{background:none;list-style:none;margin:0;padding:0;position:relative;z-index:99999;}#wpadminbar .quicklinks ul{text-align:left;}#wpadminbar .quicklinks ul li{float:left;}#wpadminbar .quicklinks>ul>li>a{border-right:1px solid #686868;border-left:1px solid #808080;}#wpadminbar .quicklinks>ul>li:last-child>a{border-right:none;}#wpadminbar .quicklinks>ul>li:hover>a{border-left-color:#707070;}#wpadminbar .quicklinks a,#wpadminbar .shortlink-input{height:28px;display:block;padding:0 .85em;margin:0;}#wpadminbar .quicklinks a>span{line-height:28px;}#wpadminbar .quicklinks .menupop ul,#wpadminbar .shortlink-input{-moz-box-shadow:0 4px 8px rgba(0,0,0,0.1);-webkit-box-shadow:0 4px 8px rgba(0,0,0,0.1);box-shadow:0 4px 8px rgba(0,0,0,0.1);background:#fff;background:rgba(255,255,255,0.97);display:none;position:absolute;border:1px solid #dfdfdf;border-top:none;float:none;}#wpadminbar .selected .shortlink-input{display:block;}#wpadminbar .quicklinks .menupop ul li{float:none;}#wpadminbar .quicklinks .menupop ul li a strong{font-weight:bold;}#wpadminbar .quicklinks .menupop ul li a,#wpadminbar .quicklinks .menupop ul li a span,#wpadminbar .quicklinks .menupop ul li a strong,#wpadminbar .shortlink-input{color:#555;text-shadow:none;white-space:nowrap;min-width:140px;}#wpadminbar .shortlink-input{width:200px;}#wpadminbar .quicklinks .menupop ul li:hover>a,#wpadminbar .quicklinks .menupop ul li:hover>a span,#wpadminbar .quicklinks .menupop ul li:hover>a strong{color:#fff;text-shadow:#666 0 -1px 0;}#wpadminbar .quicklinks li:hover>ul,#wpadminbar .quicklinks li.hover>ul{display:block;}#wpadminbar .quicklinks .menupop li:hover>ul,#wpadminbar .quicklinks .menupop li.hover>ul{margin-left:100%;margin-top:-28px;}#wpadminbar .quicklinks li:hover,#wpadminbar .quicklinks .selected{background:#555;background:-moz-linear-gradient(bottom,#555,#3e3e3e);background:-webkit-gradient(linear,left bottom,left top,from(#555),to(#3e3e3e));}#wpadminbar .quicklinks .menupop li:hover{background:#888;background:-moz-linear-gradient(bottom,#888,#9d9d9d);background:-webkit-gradient(linear,left bottom,left top,from(#888),to(#9d9d9d));}#wpadminbar .quicklinks .menupop a>span{display:inline;background:url(../images/admin-bar-sprite.png?d=11122010) right -58px no-repeat;padding-right:.8em;}#wpadminbar .quicklinks .menupop ul li a>span{display:block;background:url(../images/admin-bar-sprite.png?d=11122010) right -29px no-repeat;padding-right:1.5em;}#wpadminbar .quicklinks a span#ab-awaiting-mod,#wpadminbar .quicklinks a span#ab-updates{background:#eee;color:#333;text-shadow:none;display:inline;padding:2px 5px;font-size:10px;font-weight:bold;-moz-border-radius:10px;-khtml-border-radius:10px;-webkit-border-radius:10px;border-radius:10px;}#wpadminbar .quicklinks a:hover span#ab-awaiting-mod,#wpadminbar .quicklinks a:hover span#ab-updates{background:#fff;color:#000;}#wpadminbar .quicklinks li#wp-admin-bar-my-account>a{border-left:none;}#wpadminbar .quicklinks li#wp-admin-bar-my-account-with-avatar>a{border-left:none;background:url(../images/admin-bar-sprite.png?d=11122010) top left no-repeat;}#wpadminbar .quicklinks li#wp-admin-bar-my-account-with-avatar>a img{width:16px;height:16px;display:inline;border:1px solid #999;vertical-align:middle;margin:-2px 23px 0 -5px;padding:0;background:#eee;float:none;}#wpadminbar .quicklinks li#wp-admin-bar-my-account-with-avatar ul{left:30px;}#wpadminbar .quicklinks li#wp-admin-bar-my-account-with-avatar ul ul{left:0;}#wpadminbar .quicklinks .menupop li a img.blavatar{vertical-align:middle;margin:0 8px 0 0;padding:0;}#wpadminbar #adminbarsearch{float:right;height:18px;padding:3px;margin:0;}#wpadminbar #adminbarsearch .adminbar-input{width:140px;height:auto;float:left;font:12px Arial,Helvetica,sans-serif;color:#555;text-shadow:0 1px 0 #fff;border:1px solid #626262;padding:2px 3px;margin:0 3px 0 0;background:#ddd;-moz-box-shadow:inset 2px 2px 1px #cdcdcd;-webkit-box-shadow:inset 2px 2px 1px #cdcdcd;box-shadow:inset 2px 2px 1px #cdcdcd;-webkit-border-radius:0;-khtml-border-radius:0;-moz-border-radius:0;border-radius:0;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;-ms-box-sizing:border-box;box-sizing:border-box;outline:none;}#wpadminbar #adminbarsearch .adminbar-button{font:bold 12px Arial,Helvetica,sans-serif;color:#444;text-shadow:0 1px 0 #eee;cursor:pointer;float:left;background:#aaa;background:-moz-linear-gradient(bottom,#aaa,#cecece);background:-webkit-gradient(linear,left bottom,left top,from(#aaa),to(#cecece));-webkit-border-radius:10px;-khtml-border-radius:10px;-moz-border-radius:10px;border-radius:10px;border:1px solid #626262;padding:2px 13px;margin:0;width:auto;height:auto;}#wpadminbar #adminbarsearch .adminbar-button:active{background:#a0a0a0;background:-moz-linear-gradient(bottom,#a0a0a0,#c1c1c1);background:-webkit-gradient(linear,left bottom,left top,from(#a0a0a0),to(#c1c1c1));-moz-box-shadow:inset 1px 1px 1px #9b9b9b;-webkit-box-shadow:inset 1px 1px 1px #9b9b9b;box-shadow:inset 1px 1px 1px #9b9b9b;}#wpadminbar #adminbarsearch .adminbar-button:hover{color:#000;}#wpadminbar #adminbarsearch .adminbar-button::-moz-focus-inner{border:none;}* html #wpadminbar{overflow:hidden;position:absolute;}* html #wpadminbar .quicklinks ul li a{float:left;}* html #wpadminbar .menupop a span{background-image:none;} \ No newline at end of file diff --git a/src/wp-includes/css/admin-bar.dev.css b/src/wp-includes/css/admin-bar.dev.css new file mode 100644 index 0000000..e94d80e --- /dev/null +++ b/src/wp-includes/css/admin-bar.dev.css @@ -0,0 +1,312 @@ +#wpadminbar * { + height: auto; + width: auto; + margin: 0; + padding: 0; + position: static; + text-transform: none; + letter-spacing: normal; + line-height: 1; + font: normal 13px/28px Arial, Helvetica, sans-serif; + color: #ddd; + text-shadow: #555 0px -1px 0px; +} + +#wpadminbar :before, +#wpadminbar :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 { + direction: ltr; + background-color: #777; + background-image: -moz-linear-gradient(bottom, #666, #7f7f7f); + background-image: -webkit-gradient(linear, left bottom, left top, from(#666), to(#7f7f7f)); + color: #ddd; + font: normal 12px/28px Arial, Helvetica, sans-serif; + height: 28px; + position: fixed; + top: 0; + left: 0; + width: 100%; + z-index: 99999; + min-width: 960px; +} + +#wpadminbar ul, +#wpadminbar ul li { + background: none; + list-style: none; + margin: 0; + padding: 0; + position: relative; + z-index: 99999; +} + +#wpadminbar .quicklinks ul { + text-align: left; +} + +#wpadminbar .quicklinks ul li { + float: left; +} + +#wpadminbar .quicklinks > ul > li > a { + border-right: 1px solid #686868; + border-left: 1px solid #808080; +} + +#wpadminbar .quicklinks > ul > li:last-child > a { + border-right: none; +} + +#wpadminbar .quicklinks > ul > li:hover > a { + border-left-color: #707070; +} + +#wpadminbar .quicklinks a, +#wpadminbar .shortlink-input { + height: 28px; + display: block; + padding: 0 0.85em; + margin: 0; +} + +#wpadminbar .quicklinks a > span { + line-height: 28px; +} + +#wpadminbar .quicklinks .menupop ul, +#wpadminbar .shortlink-input { + -moz-box-shadow: 0 4px 8px rgba(0,0,0,0.1); + -webkit-box-shadow: 0 4px 8px rgba(0,0,0,0.1); + box-shadow: 0 4px 8px rgba(0,0,0,0.1); + background: #fff; + background: rgba(255,255,255,0.97); + display: none; + position: absolute; + border: 1px solid #dfdfdf; + border-top: none; + float: none; +} + +#wpadminbar .selected .shortlink-input { + display: block; +} + +#wpadminbar .quicklinks .menupop ul li { + float: none; +} + +#wpadminbar .quicklinks .menupop ul li a strong { + font-weight: bold; +} + +#wpadminbar .quicklinks .menupop ul li a, +#wpadminbar .quicklinks .menupop ul li a span, +#wpadminbar .quicklinks .menupop ul li a strong, +#wpadminbar .shortlink-input { + color: #555; + text-shadow: none; + white-space: nowrap; + min-width: 140px; +} + +#wpadminbar .shortlink-input { + width: 200px; +} + +#wpadminbar .quicklinks .menupop ul li:hover > a, +#wpadminbar .quicklinks .menupop ul li:hover > a span, +#wpadminbar .quicklinks .menupop ul li:hover > a strong { + color: #fff; + text-shadow: #666 0px -1px 0px; +} + +#wpadminbar .quicklinks li:hover > ul, +#wpadminbar .quicklinks li.hover > ul { + display: block; +} + +#wpadminbar .quicklinks .menupop li:hover > ul, +#wpadminbar .quicklinks .menupop li.hover > ul { + margin-left: 100%; + margin-top: -28px; +} + +#wpadminbar .quicklinks li:hover, +#wpadminbar .quicklinks .selected { + background: #555; + background: -moz-linear-gradient(bottom, #555, #3e3e3e); + background: -webkit-gradient(linear, left bottom, left top, from(#555), to(#3e3e3e)); +} + +#wpadminbar .quicklinks .menupop li:hover { + background: #888; + background: -moz-linear-gradient(bottom, #888, #9d9d9d); + background: -webkit-gradient(linear, left bottom, left top, from(#888), to(#9d9d9d)); +} + +#wpadminbar .quicklinks .menupop a > span { + display: inline; + background: url(../images/admin-bar-sprite.png?d=11122010) right -58px no-repeat; + padding-right: .8em; +} + +#wpadminbar .quicklinks .menupop ul li a > span { + display: block; + background: url(../images/admin-bar-sprite.png?d=11122010) right -29px no-repeat; + padding-right: 1.5em; +} + +#wpadminbar .quicklinks a span#ab-awaiting-mod, +#wpadminbar .quicklinks a span#ab-updates { + background: #eee; + color: #333; + text-shadow: none; + display: inline; + padding: 2px 5px; + font-size: 10px; + font-weight: bold; + -moz-border-radius: 10px; + -khtml-border-radius: 10px; + -webkit-border-radius: 10px; + border-radius: 10px; +} + +#wpadminbar .quicklinks a:hover span#ab-awaiting-mod, +#wpadminbar .quicklinks a:hover span#ab-updates { + background: #fff; + color: #000; +} + +#wpadminbar .quicklinks li#wp-admin-bar-my-account > a { + border-left: none; +} + +#wpadminbar .quicklinks li#wp-admin-bar-my-account-with-avatar > a { + border-left: none; + background: url(../images/admin-bar-sprite.png?d=11122010) top left no-repeat; +} + +#wpadminbar .quicklinks li#wp-admin-bar-my-account-with-avatar > a img { + width: 16px; + height: 16px; + display: inline; + border: 1px solid #999; + vertical-align: middle; + margin: -2px 23px 0 -5px; + padding: 0; + background: #eee; + float: none; +} + +#wpadminbar .quicklinks li#wp-admin-bar-my-account-with-avatar ul { + left: 30px; +} + +#wpadminbar .quicklinks li#wp-admin-bar-my-account-with-avatar ul ul { + left: 0; +} + +#wpadminbar .quicklinks .menupop li a img.blavatar { + vertical-align: middle; + margin: 0 8px 0 0; + padding: 0; +} + +#wpadminbar #adminbarsearch { + float: right; + height: 18px; + padding: 3px; + margin: 0; +} + +#wpadminbar #adminbarsearch .adminbar-input { + width: 140px; + height: auto; + float: left; + font: 12px Arial, Helvetica, sans-serif; + color: #555; + text-shadow: 0 1px 0 #fff; + border: 1px solid #626262; + padding: 2px 3px; + margin: 0 3px 0 0; + background: #ddd; + -moz-box-shadow: inset 2px 2px 1px #cdcdcd; + -webkit-box-shadow: inset 2px 2px 1px #cdcdcd; + box-shadow: inset 2px 2px 1px #cdcdcd; + -webkit-border-radius: 0; + -khtml-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; + -moz-box-sizing: border-box; + -webkit-box-sizing: border-box; + -ms-box-sizing: border-box; + box-sizing: border-box; + outline: none; +} + +#wpadminbar #adminbarsearch .adminbar-button { + font: bold 12px Arial, Helvetica, sans-serif; + color: #444; + text-shadow: 0px 1px 0px #eee; + cursor: pointer; + float: left; + background: #aaa; + background: -moz-linear-gradient(bottom, #aaa, #cecece); + background: -webkit-gradient(linear, left bottom, left top, from(#aaa), to(#cecece)); + -webkit-border-radius: 10px; + -khtml-border-radius: 10px; + -moz-border-radius: 10px; + border-radius: 10px; + border: 1px solid #626262; + padding: 2px 13px; + margin: 0; + width: auto; + height: auto; +} + +#wpadminbar #adminbarsearch .adminbar-button:active { + background: #a0a0a0; + background:-moz-linear-gradient(bottom, #a0a0a0, #c1c1c1); + background:-webkit-gradient(linear, left bottom, left top, from(#a0a0a0), to(#c1c1c1)); + -moz-box-shadow: inset 1px 1px 1px #9b9b9b; + -webkit-box-shadow: inset 1px 1px 1px #9b9b9b; + box-shadow: inset 1px 1px 1px #9b9b9b; +} + +#wpadminbar #adminbarsearch .adminbar-button:hover { + color: #000; +} + +#wpadminbar #adminbarsearch .adminbar-button::-moz-focus-inner { + border: none; +} + + +/** + * 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; +} diff --git a/src/wp-includes/css/jquery-ui-dialog.css b/src/wp-includes/css/jquery-ui-dialog.css new file mode 100644 index 0000000..fa51cfb --- /dev/null +++ b/src/wp-includes/css/jquery-ui-dialog.css @@ -0,0 +1 @@ +.ui-helper-hidden{display:none;}.ui-helper-hidden-accessible{position:absolute;left:-99999999px;}.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:after{content:".";display:block;height:0;clear:both;visibility:hidden;}.ui-helper-clearfix{display:inline-block;}/* required comment for clearfix to work in Opera \*/ * html .ui-helper-clearfix{height:1%;}.ui-helper-clearfix{display:block;}/* end clearfix */ .ui-helper-zfix{width:100%;height:100%;top:0;left:0;position:absolute;opacity:0;filter:Alpha(Opacity=0);}.ui-state-disabled{cursor:default!important;}.ui-icon{display:block;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat;}.ui-widget-overlay{position:absolute;top:0;left:0;width:100%;height:100%;}.ui-resizable{position:relative;}.ui-resizable-handle{position:absolute;font-size:.1px;z-index:99999;display:block;}.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;}.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;}.wp-dialog{position:absolute;width:300px;overflow:hidden;}.wp-dialog .ui-dialog-titlebar{position:relative;}.wp-dialog .ui-dialog-titlebar-close span{display:block;margin:1px;}.wp-dialog .ui-dialog-content{position:relative;border:0;padding:0;background:none;overflow:auto;zoom:1;}.wp-dialog .ui-dialog-buttonpane{text-align:left;border-width:1px 0 0 0;background-image:none;margin:.5em 0 0 0;padding:.3em 1em .5em .4em;}.wp-dialog .ui-dialog-buttonpane .ui-dialog-buttonset{float:right;}.wp-dialog .ui-dialog-buttonpane button{margin:.5em .4em .5em 0;cursor:pointer;}.wp-dialog .ui-resizable-se{width:14px;height:14px;right:3px;bottom:3px;}.ui-draggable .ui-dialog-titlebar{cursor:move;}.wp-dialog{border:1px solid #999;-moz-box-shadow:0 0 16px rgba(0,0,0,0.3);-webkit-box-shadow:0 0 16px rgba(0,0,0,0.3);box-shadow:0 0 16px rgba(0,0,0,0.3);}.wp-dialog .ui-dialog-title{display:block;text-align:center;padding:1px 0 2px;}.wp-dialog .ui-dialog-titlebar{padding:0 1em;background-color:#444;font-weight:bold;font-size:11px;line-height:18px;color:#e5e5e5;}.wp-dialog{-moz-border-radius-topleft:4px;-webkit-border-top-left-radius:4px;-khtml-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topright:4px;-webkit-border-top-right-radius:4px;-khtml-border-top-right-radius:4px;border-top-right-radius:4px;}.wp-dialog .ui-dialog-titlebar{-moz-border-radius-topleft:3px;-webkit-border-top-left-radius:3px;-khtml-border-top-left-radius:3px;border-top-left-radius:3px;-moz-border-radius-topright:3px;-webkit-border-top-right-radius:3px;-khtml-border-top-right-radius:3px;border-top-right-radius:3px;}.wp-dialog .ui-dialog-titlebar-close{position:absolute;width:29px;height:16px;top:2px;right:6px;background:url('../js/tinymce/plugins/inlinepopups/skins/clearlooks2/img/buttons.gif') no-repeat -87px -16px;padding:0;}.wp-dialog .ui-dialog-titlebar-close:hover,.wp-dialog .ui-dialog-titlebar-close:focus{background-position:-87px -32px;}.ui-widget-overlay{background-color:#000;opacity:.6;filter:alpha(opacity=60);} \ No newline at end of file diff --git a/src/wp-includes/css/jquery-ui-dialog.dev.css b/src/wp-includes/css/jquery-ui-dialog.dev.css new file mode 100644 index 0000000..b5a0675 --- /dev/null +++ b/src/wp-includes/css/jquery-ui-dialog.dev.css @@ -0,0 +1,143 @@ +/* + * jQuery UI CSS Framework @VERSION + * + * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Theming/API + */ + +/* Layout helpers +----------------------------------*/ +.ui-helper-hidden { display: none; } +.ui-helper-hidden-accessible { position: absolute; left: -99999999px; } +.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:after { content: "."; display: block; height: 0; clear: both; visibility: hidden; } +.ui-helper-clearfix { display: inline-block; } +/* required comment for clearfix to work in Opera \*/ +* html .ui-helper-clearfix { height:1%; } +.ui-helper-clearfix { display:block; } +/* end clearfix */ +.ui-helper-zfix { width: 100%; height: 100%; top: 0; left: 0; position: absolute; opacity: 0; filter:Alpha(Opacity=0); } + + +/* 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: absolute; top: 0; left: 0; width: 100%; height: 100%; } + +/* + * jQuery UI Resizable + * + * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Resizable#theming + */ +.ui-resizable { position: relative;} +.ui-resizable-handle { position: absolute;font-size: 0.1px;z-index: 99999; display: block;} +.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; } +.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;} + +/* + * jQuery UI Dialog + * + * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Dialog#theming + */ +.wp-dialog { position: absolute; width: 300px; overflow: hidden; } +.wp-dialog .ui-dialog-titlebar { position: relative; } +.wp-dialog .ui-dialog-titlebar-close span { display: block; margin: 1px; } +.wp-dialog .ui-dialog-content { position: relative; border: 0; padding: 0; background: none; overflow: auto; zoom: 1; } +.wp-dialog .ui-dialog-buttonpane { text-align: left; border-width: 1px 0 0 0; background-image: none; margin: .5em 0 0 0; padding: .3em 1em .5em .4em; } +.wp-dialog .ui-dialog-buttonpane .ui-dialog-buttonset { float: right; } +.wp-dialog .ui-dialog-buttonpane button { margin: .5em .4em .5em 0; cursor: pointer; } +.wp-dialog .ui-resizable-se { width: 14px; height: 14px; right: 3px; bottom: 3px; } +.ui-draggable .ui-dialog-titlebar { cursor: move; } + + + +/* WP jQuery Dialog Theme */ +.wp-dialog { + border: 1px solid #999; + -moz-box-shadow: 0px 0px 16px rgba( 0,0,0,0.3 ); + -webkit-box-shadow: 0px 0px 16px rgba( 0,0,0,0.3 ); + box-shadow: 0px 0px 16px rgba( 0,0,0,0.3 ); +} +.wp-dialog .ui-dialog-title { + display: block; + text-align: center; + padding: 1px 0 2px; +} +.wp-dialog .ui-dialog-titlebar { + padding: 0 1em; + background-color: #444; + font-weight: bold; + font-size: 11px; + line-height: 18px; + color: #e5e5e5; +} +.wp-dialog { + -moz-border-radius-topleft: 4px; + -webkit-border-top-left-radius: 4px; + -khtml-border-top-left-radius: 4px; + border-top-left-radius: 4px; + -moz-border-radius-topright: 4px; + -webkit-border-top-right-radius: 4px; + -khtml-border-top-right-radius: 4px; + border-top-right-radius: 4px; +} +.wp-dialog .ui-dialog-titlebar { + -moz-border-radius-topleft: 3px; + -webkit-border-top-left-radius: 3px; + -khtml-border-top-left-radius: 3px; + border-top-left-radius: 3px; + -moz-border-radius-topright: 3px; + -webkit-border-top-right-radius: 3px; + -khtml-border-top-right-radius: 3px; + border-top-right-radius: 3px; +} + +.wp-dialog .ui-dialog-titlebar-close { + position: absolute; + width: 29px; + height: 16px; + top: 2px; + right: 6px; + background: url('../js/tinymce/plugins/inlinepopups/skins/clearlooks2/img/buttons.gif') no-repeat -87px -16px; + padding: 0; +} +.wp-dialog .ui-dialog-titlebar-close:hover, +.wp-dialog .ui-dialog-titlebar-close:focus { + background-position: -87px -32px; +} +.ui-widget-overlay { + background-color: #000; + opacity: 0.6; + filter: alpha(opacity=60); +} \ No newline at end of file diff --git a/src/wp-includes/default-constants.php b/src/wp-includes/default-constants.php new file mode 100644 index 0000000..0ba447f --- /dev/null +++ b/src/wp-includes/default-constants.php @@ -0,0 +1,301 @@ + diff --git a/src/wp-includes/default-filters.php b/src/wp-includes/default-filters.php new file mode 100644 index 0000000..a5b6150 --- /dev/null +++ b/src/wp-includes/default-filters.php @@ -0,0 +1,287 @@ + diff --git a/src/wp-includes/default-widgets.php b/src/wp-includes/default-widgets.php new file mode 100644 index 0000000..d9b932a --- /dev/null +++ b/src/wp-includes/default-widgets.php @@ -0,0 +1,1158 @@ + 'widget_pages', 'description' => __( 'Your site’s WordPress Pages') ); + parent::__construct('pages', __('Pages'), $widget_ops); + } + + function widget( $args, $instance ) { + extract( $args ); + + $title = apply_filters('widget_title', empty( $instance['title'] ) ? __( 'Pages' ) : $instance['title'], $instance, $this->id_base); + $sortby = empty( $instance['sortby'] ) ? 'menu_order' : $instance['sortby']; + $exclude = empty( $instance['exclude'] ) ? '' : $instance['exclude']; + + if ( $sortby == 'menu_order' ) + $sortby = 'menu_order, post_title'; + + $out = wp_list_pages( apply_filters('widget_pages_args', array('title_li' => '', 'echo' => 0, 'sort_column' => $sortby, 'exclude' => $exclude) ) ); + + if ( !empty( $out ) ) { + echo $before_widget; + if ( $title) + echo $before_title . $title . $after_title; + ?> +
      + +
    + 'post_title', 'title' => '', 'exclude' => '') ); + $title = esc_attr( $instance['title'] ); + $exclude = esc_attr( $instance['exclude'] ); + ?> +

    +

    + + +

    +

    + +
    + +

    + __( "Your blogroll" ) ); + parent::__construct('links', __('Links'), $widget_ops); + } + + function widget( $args, $instance ) { + extract($args, EXTR_SKIP); + + $show_description = isset($instance['description']) ? $instance['description'] : false; + $show_name = isset($instance['name']) ? $instance['name'] : false; + $show_rating = isset($instance['rating']) ? $instance['rating'] : false; + $show_images = isset($instance['images']) ? $instance['images'] : true; + $category = isset($instance['category']) ? $instance['category'] : false; + + if ( is_admin() && !$category ) { + // Display All Links widget as such in the widgets screen + echo $before_widget . $before_title. __('All Links') . $after_title . $after_widget; + return; + } + + $before_widget = preg_replace('/id="[^"]*"/','id="%id"', $before_widget); + wp_list_bookmarks(apply_filters('widget_links_args', array( + 'title_before' => $before_title, 'title_after' => $after_title, + 'category_before' => $before_widget, 'category_after' => $after_widget, + 'show_images' => $show_images, 'show_description' => $show_description, + 'show_name' => $show_name, 'show_rating' => $show_rating, + 'category' => $category, 'class' => 'linkcat widget' + ))); + } + + function update( $new_instance, $old_instance ) { + $new_instance = (array) $new_instance; + $instance = array( 'images' => 0, 'name' => 0, 'description' => 0, 'rating' => 0); + foreach ( $instance as $field => $val ) { + if ( isset($new_instance[$field]) ) + $instance[$field] = 1; + } + $instance['category'] = intval($new_instance['category']); + + return $instance; + } + + function form( $instance ) { + + //Defaults + $instance = wp_parse_args( (array) $instance, array( 'images' => true, 'name' => true, 'description' => false, 'rating' => false, 'category' => false ) ); + $link_cats = get_terms( 'link_category'); +?> +

    + +

    +

    + id="get_field_id('images'); ?>" name="get_field_name('images'); ?>" /> +
    + id="get_field_id('name'); ?>" name="get_field_name('name'); ?>" /> +
    + id="get_field_id('description'); ?>" name="get_field_name('description'); ?>" /> +
    + id="get_field_id('rating'); ?>" name="get_field_name('rating'); ?>" /> + +

    + 'widget_search', 'description' => __( "A search form for your site") ); + parent::__construct('search', __('Search'), $widget_ops); + } + + function widget( $args, $instance ) { + extract($args); + $title = apply_filters('widget_title', $instance['title'], $instance, $this->id_base); + + echo $before_widget; + if ( $title ) + echo $before_title . $title . $after_title; + + // Use current theme search form if it exists + get_search_form(); + + echo $after_widget; + } + + function form( $instance ) { + $instance = wp_parse_args( (array) $instance, array( 'title' => '') ); + $title = $instance['title']; +?> +

    + '')); + $instance['title'] = strip_tags($new_instance['title']); + return $instance; + } + +} + +/** + * Archives widget class + * + * @since 2.8.0 + */ +class WP_Widget_Archives extends WP_Widget { + + function __construct() { + $widget_ops = array('classname' => 'widget_archive', 'description' => __( 'A monthly archive of your site’s posts') ); + parent::__construct('archives', __('Archives'), $widget_ops); + } + + function widget( $args, $instance ) { + extract($args); + $c = $instance['count'] ? '1' : '0'; + $d = $instance['dropdown'] ? '1' : '0'; + $title = apply_filters('widget_title', empty($instance['title']) ? __('Archives') : $instance['title'], $instance, $this->id_base); + + echo $before_widget; + if ( $title ) + echo $before_title . $title . $after_title; + + if ( $d ) { +?> + + +
      + 'monthly', 'show_post_count' => $c))); ?> +
    + '', 'count' => 0, 'dropdown' => '') ); + $instance['title'] = strip_tags($new_instance['title']); + $instance['count'] = $new_instance['count'] ? 1 : 0; + $instance['dropdown'] = $new_instance['dropdown'] ? 1 : 0; + + return $instance; + } + + function form( $instance ) { + $instance = wp_parse_args( (array) $instance, array( 'title' => '', 'count' => 0, 'dropdown' => '') ); + $title = strip_tags($instance['title']); + $count = $instance['count'] ? 'checked="checked"' : ''; + $dropdown = $instance['dropdown'] ? 'checked="checked"' : ''; +?> +

    +

    + id="get_field_id('dropdown'); ?>" name="get_field_name('dropdown'); ?>" /> +
    + id="get_field_id('count'); ?>" name="get_field_name('count'); ?>" /> +

    + 'widget_meta', 'description' => __( "Log in/out, admin, feed and WordPress links") ); + parent::__construct('meta', __('Meta'), $widget_ops); + } + + function widget( $args, $instance ) { + extract($args); + $title = apply_filters('widget_title', empty($instance['title']) ? __('Meta') : $instance['title'], $instance, $this->id_base); + + echo $before_widget; + if ( $title ) + echo $before_title . $title . $after_title; +?> + + '' ) ); + $title = strip_tags($instance['title']); +?> +

    + 'widget_calendar', 'description' => __( 'A calendar of your site’s posts') ); + parent::__construct('calendar', __('Calendar'), $widget_ops); + } + + function widget( $args, $instance ) { + extract($args); + $title = apply_filters('widget_title', empty($instance['title']) ? ' ' : $instance['title'], $instance, $this->id_base); + echo $before_widget; + if ( $title ) + echo $before_title . $title . $after_title; + echo '
    '; + get_calendar(); + echo '
    '; + echo $after_widget; + } + + function update( $new_instance, $old_instance ) { + $instance = $old_instance; + $instance['title'] = strip_tags($new_instance['title']); + + return $instance; + } + + function form( $instance ) { + $instance = wp_parse_args( (array) $instance, array( 'title' => '' ) ); + $title = strip_tags($instance['title']); +?> +

    +

    + 'widget_text', 'description' => __('Arbitrary text or HTML')); + $control_ops = array('width' => 400, 'height' => 350); + parent::__construct('text', __('Text'), $widget_ops, $control_ops); + } + + function widget( $args, $instance ) { + extract($args); + $title = apply_filters( 'widget_title', empty($instance['title']) ? '' : $instance['title'], $instance, $this->id_base); + $text = apply_filters( 'widget_text', $instance['text'], $instance ); + echo $before_widget; + if ( !empty( $title ) ) { echo $before_title . $title . $after_title; } ?> +
    + '', 'text' => '' ) ); + $title = strip_tags($instance['title']); + $text = esc_textarea($instance['text']); +?> +

    +

    + + + +

    /> 

    + 'widget_categories', 'description' => __( "A list or dropdown of categories" ) ); + parent::__construct('categories', __('Categories'), $widget_ops); + } + + function widget( $args, $instance ) { + extract( $args ); + + $title = apply_filters('widget_title', empty( $instance['title'] ) ? __( 'Categories' ) : $instance['title'], $instance, $this->id_base); + $c = $instance['count'] ? '1' : '0'; + $h = $instance['hierarchical'] ? '1' : '0'; + $d = $instance['dropdown'] ? '1' : '0'; + + echo $before_widget; + if ( $title ) + echo $before_title . $title . $after_title; + + $cat_args = array('orderby' => 'name', 'show_count' => $c, 'hierarchical' => $h); + + if ( $d ) { + $cat_args['show_option_none'] = __('Select Category'); + wp_dropdown_categories(apply_filters('widget_categories_dropdown_args', $cat_args)); +?> + + + + +
      + +
    + '') ); + $title = esc_attr( $instance['title'] ); + $count = isset($instance['count']) ? (bool) $instance['count'] :false; + $hierarchical = isset( $instance['hierarchical'] ) ? (bool) $instance['hierarchical'] : false; + $dropdown = isset( $instance['dropdown'] ) ? (bool) $instance['dropdown'] : false; +?> +

    +

    + +

    /> +
    + + /> +
    + + /> +

    + 'widget_recent_entries', 'description' => __( "The most recent posts on your site") ); + parent::__construct('recent-posts', __('Recent Posts'), $widget_ops); + $this->alt_option_name = 'widget_recent_entries'; + + add_action( 'save_post', array(&$this, 'flush_widget_cache') ); + add_action( 'deleted_post', array(&$this, 'flush_widget_cache') ); + add_action( 'switch_theme', array(&$this, 'flush_widget_cache') ); + } + + function widget($args, $instance) { + $cache = wp_cache_get('widget_recent_posts', 'widget'); + + if ( !is_array($cache) ) + $cache = array(); + + if ( isset($cache[$args['widget_id']]) ) { + echo $cache[$args['widget_id']]; + return; + } + + ob_start(); + extract($args); + + $title = apply_filters('widget_title', empty($instance['title']) ? __('Recent Posts') : $instance['title'], $instance, $this->id_base); + if ( ! $number = absint( $instance['number'] ) ) + $number = 10; + + $r = new WP_Query(array('posts_per_page' => $number, 'no_found_rows' => true, 'post_status' => 'publish', 'ignore_sticky_posts' => true)); + if ($r->have_posts()) : +?> + + +
      + have_posts()) : $r->the_post(); ?> +
    • + +
    + +flush_widget_cache(); + + $alloptions = wp_cache_get( 'alloptions', 'options' ); + if ( isset($alloptions['widget_recent_entries']) ) + delete_option('widget_recent_entries'); + + return $instance; + } + + function flush_widget_cache() { + wp_cache_delete('widget_recent_posts', 'widget'); + } + + function form( $instance ) { + $title = isset($instance['title']) ? esc_attr($instance['title']) : ''; + $number = isset($instance['number']) ? absint($instance['number']) : 5; +?> +

    +

    + +

    +

    + 'widget_recent_comments', 'description' => __( 'The most recent comments' ) ); + parent::__construct('recent-comments', __('Recent Comments'), $widget_ops); + $this->alt_option_name = 'widget_recent_comments'; + + if ( is_active_widget(false, false, $this->id_base) ) + add_action( 'wp_head', array(&$this, 'recent_comments_style') ); + + add_action( 'comment_post', array(&$this, 'flush_widget_cache') ); + add_action( 'transition_comment_status', array(&$this, 'flush_widget_cache') ); + } + + function recent_comments_style() { + if ( ! current_theme_supports( 'widgets' ) // Temp hack #14876 + || ! apply_filters( 'show_recent_comments_widget_style', true, $this->id_base ) ) + return; + ?> + + $number, 'status' => 'approve', 'post_status' => 'publish' ) ); + $output .= $before_widget; + if ( $title ) + $output .= $before_title . $title . $after_title; + + $output .= '
      '; + if ( $comments ) { + foreach ( (array) $comments as $comment) { + $output .= '
    • ' . /* translators: comments widget: 1: comment author, 2: post link */ sprintf(_x('%1$s on %2$s', 'widgets'), get_comment_author_link(), '' . get_the_title($comment->comment_post_ID) . '') . '
    • '; + } + } + $output .= '
    '; + $output .= $after_widget; + + echo $output; + $cache[$args['widget_id']] = $output; + wp_cache_set('widget_recent_comments', $cache, 'widget'); + } + + function update( $new_instance, $old_instance ) { + $instance = $old_instance; + $instance['title'] = strip_tags($new_instance['title']); + $instance['number'] = absint( $new_instance['number'] ); + $this->flush_widget_cache(); + + $alloptions = wp_cache_get( 'alloptions', 'options' ); + if ( isset($alloptions['widget_recent_comments']) ) + delete_option('widget_recent_comments'); + + return $instance; + } + + function form( $instance ) { + $title = isset($instance['title']) ? esc_attr($instance['title']) : ''; + $number = isset($instance['number']) ? absint($instance['number']) : 5; +?> +

    +

    + +

    +

    + __('Entries from any RSS or Atom feed') ); + $control_ops = array( 'width' => 400, 'height' => 200 ); + parent::__construct( 'rss', __('RSS'), $widget_ops, $control_ops ); + } + + function widget($args, $instance) { + + if ( isset($instance['error']) && $instance['error'] ) + return; + + extract($args, EXTR_SKIP); + + $url = $instance['url']; + while ( stristr($url, 'http') != $url ) + $url = substr($url, 1); + + if ( empty($url) ) + return; + + // self-url destruction sequence + if ( in_array( untrailingslashit( $url ), array( site_url(), home_url() ) ) ) + return; + + $rss = fetch_feed($url); + $title = $instance['title']; + $desc = ''; + $link = ''; + + if ( ! is_wp_error($rss) ) { + $desc = esc_attr(strip_tags(@html_entity_decode($rss->get_description(), ENT_QUOTES, get_option('blog_charset')))); + if ( empty($title) ) + $title = esc_html(strip_tags($rss->get_title())); + $link = esc_url(strip_tags($rss->get_permalink())); + while ( stristr($link, 'http') != $link ) + $link = substr($link, 1); + } + + if ( empty($title) ) + $title = empty($desc) ? __('Unknown Feed') : $desc; + + $title = apply_filters('widget_title', $title, $instance, $this->id_base); + $url = esc_url(strip_tags($url)); + $icon = includes_url('images/rss.png'); + if ( $title ) + $title = "RSS $title"; + + echo $before_widget; + if ( $title ) + echo $before_title . $title . $after_title; + wp_widget_rss_output( $rss, $instance ); + echo $after_widget; + + if ( ! is_wp_error($rss) ) + $rss->__destruct(); + unset($rss); + } + + function update($new_instance, $old_instance) { + $testurl = ( isset($new_instance['url']) && ($new_instance['url'] != $old_instance['url']) ); + return wp_widget_rss_process( $new_instance, $testurl ); + } + + function form($instance) { + + if ( empty($instance) ) + $instance = array( 'title' => '', 'url' => '', 'items' => 10, 'error' => false, 'show_summary' => 0, 'show_author' => 0, 'show_date' => 0 ); + $instance['number'] = $this->number; + + wp_widget_rss_form( $instance ); + } +} + +/** + * Display the RSS entries in a list. + * + * @since 2.5.0 + * + * @param string|array|object $rss RSS url. + * @param array $args Widget arguments. + */ +function wp_widget_rss_output( $rss, $args = array() ) { + if ( is_string( $rss ) ) { + $rss = fetch_feed($rss); + } elseif ( is_array($rss) && isset($rss['url']) ) { + $args = $rss; + $rss = fetch_feed($rss['url']); + } elseif ( !is_object($rss) ) { + return; + } + + if ( is_wp_error($rss) ) { + if ( is_admin() || current_user_can('manage_options') ) + echo '

    ' . sprintf( __('RSS Error: %s'), $rss->get_error_message() ) . '

    '; + return; + } + + $default_args = array( 'show_author' => 0, 'show_date' => 0, 'show_summary' => 0 ); + $args = wp_parse_args( $args, $default_args ); + extract( $args, EXTR_SKIP ); + + $items = (int) $items; + if ( $items < 1 || 20 < $items ) + $items = 10; + $show_summary = (int) $show_summary; + $show_author = (int) $show_author; + $show_date = (int) $show_date; + + if ( !$rss->get_item_quantity() ) { + echo '
    • ' . __( 'An error has occurred; the feed is probably down. Try again later.' ) . '
    '; + $rss->__destruct(); + unset($rss); + return; + } + + echo '
      '; + foreach ( $rss->get_items(0, $items) as $item ) { + $link = $item->get_link(); + while ( stristr($link, 'http') != $link ) + $link = substr($link, 1); + $link = esc_url(strip_tags($link)); + $title = esc_attr(strip_tags($item->get_title())); + if ( empty($title) ) + $title = __('Untitled'); + + $desc = str_replace( array("\n", "\r"), ' ', esc_attr( strip_tags( @html_entity_decode( $item->get_description(), ENT_QUOTES, get_option('blog_charset') ) ) ) ); + $desc = wp_html_excerpt( $desc, 360 ); + + // Append ellipsis. Change existing [...] to […]. + if ( '[...]' == substr( $desc, -5 ) ) + $desc = substr( $desc, 0, -5 ) . '[…]'; + elseif ( '[…]' != substr( $desc, -10 ) ) + $desc .= ' […]'; + + $desc = esc_html( $desc ); + + if ( $show_summary ) { + $summary = "
      $desc
      "; + } else { + $summary = ''; + } + + $date = ''; + if ( $show_date ) { + $date = $item->get_date( 'U' ); + + if ( $date ) { + $date = ' ' . date_i18n( get_option( 'date_format' ), $date ) . ''; + } + } + + $author = ''; + if ( $show_author ) { + $author = $item->get_author(); + if ( is_object($author) ) { + $author = $author->get_name(); + $author = ' ' . esc_html( strip_tags( $author ) ) . ''; + } + } + + if ( $link == '' ) { + echo "
    • $title{$date}{$summary}{$author}
    • "; + } else { + echo "
    • $title{$date}{$summary}{$author}
    • "; + } + } + echo '
    '; + $rss->__destruct(); + unset($rss); +} + + + +/** + * Display RSS widget options form. + * + * The options for what fields are displayed for the RSS form are all booleans + * and are as follows: 'url', 'title', 'items', 'show_summary', 'show_author', + * 'show_date'. + * + * @since 2.5.0 + * + * @param array|string $args Values for input fields. + * @param array $inputs Override default display options. + */ +function wp_widget_rss_form( $args, $inputs = null ) { + + $default_inputs = array( 'url' => true, 'title' => true, 'items' => true, 'show_summary' => true, 'show_author' => true, 'show_date' => true ); + $inputs = wp_parse_args( $inputs, $default_inputs ); + extract( $args ); + extract( $inputs, EXTR_SKIP); + + $number = esc_attr( $number ); + $title = esc_attr( $title ); + $url = esc_url( $url ); + $items = (int) $items; + if ( $items < 1 || 20 < $items ) + $items = 10; + $show_summary = (int) $show_summary; + $show_author = (int) $show_author; + $show_date = (int) $show_date; + + if ( !empty($error) ) + echo '

    ' . sprintf( __('RSS Error: %s'), $error) . '

    '; + + if ( $inputs['url'] ) : +?> +

    +

    + +

    +

    + +

    +

    + +

    /> +

    + +

    /> +

    + +

    /> +

    + + +get_error_message(); + } else { + $link = esc_url(strip_tags($rss->get_permalink())); + while ( stristr($link, 'http') != $link ) + $link = substr($link, 1); + + $rss->__destruct(); + unset($rss); + } + } + + return compact( 'title', 'url', 'link', 'items', 'error', 'show_summary', 'show_author', 'show_date' ); +} + +/** + * Tag cloud widget class + * + * @since 2.8.0 + */ +class WP_Widget_Tag_Cloud extends WP_Widget { + + function __construct() { + $widget_ops = array( 'description' => __( "Your most used tags in cloud format") ); + parent::__construct('tag_cloud', __('Tag Cloud'), $widget_ops); + } + + function widget( $args, $instance ) { + extract($args); + $current_taxonomy = $this->_get_current_taxonomy($instance); + if ( !empty($instance['title']) ) { + $title = $instance['title']; + } else { + if ( 'post_tag' == $current_taxonomy ) { + $title = __('Tags'); + } else { + $tax = get_taxonomy($current_taxonomy); + $title = $tax->labels->name; + } + } + $title = apply_filters('widget_title', $title, $instance, $this->id_base); + + echo $before_widget; + if ( $title ) + echo $before_title . $title . $after_title; + echo '
    '; + wp_tag_cloud( apply_filters('widget_tag_cloud_args', array('taxonomy' => $current_taxonomy) ) ); + echo "
    \n"; + echo $after_widget; + } + + function update( $new_instance, $old_instance ) { + $instance['title'] = strip_tags(stripslashes($new_instance['title'])); + $instance['taxonomy'] = stripslashes($new_instance['taxonomy']); + return $instance; + } + + function form( $instance ) { + $current_taxonomy = $this->_get_current_taxonomy($instance); +?> +

    +

    +

    +

    __('Use this widget to add one of your custom menus as a widget.') ); + parent::__construct( 'nav_menu', __('Custom Menu'), $widget_ops ); + } + + function widget($args, $instance) { + // Get menu + $nav_menu = wp_get_nav_menu_object( $instance['nav_menu'] ); + + if ( !$nav_menu ) + return; + + $instance['title'] = apply_filters('widget_title', $instance['title'], $instance, $this->id_base); + + echo $args['before_widget']; + + if ( !empty($instance['title']) ) + echo $args['before_title'] . $instance['title'] . $args['after_title']; + + wp_nav_menu( array( 'fallback_cb' => '', 'menu' => $nav_menu ) ); + + echo $args['after_widget']; + } + + function update( $new_instance, $old_instance ) { + $instance['title'] = strip_tags( stripslashes($new_instance['title']) ); + $instance['nav_menu'] = (int) $new_instance['nav_menu']; + return $instance; + } + + function form( $instance ) { + $title = isset( $instance['title'] ) ? $instance['title'] : ''; + $nav_menu = isset( $instance['nav_menu'] ) ? $instance['nav_menu'] : ''; + + // Get menus + $menus = get_terms( 'nav_menu', array( 'hide_empty' => false ) ); + + // If no menus exists, direct the user to go and create some. + if ( !$menus ) { + echo '

    '. sprintf( __('No menus have been created yet. Create some.'), admin_url('nav-menus.php') ) .'

    '; + return; + } + ?> +

    + + +

    +

    + + +

    + $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. + * + * @since 1.0.1 + * @deprecated 1.5 + * @deprecated Use The Loop - {@link http://codex.wordpress.org/The_Loop Use new WordPress Loop} + */ +function start_wp() { + global $wp_query, $post; + + _deprecated_function( __FUNCTION__, '1.5', __('new WordPress Loop') ); + + // Since the old style loop is being used, advance the query iterator here. + $wp_query->next_post(); + + setup_postdata($post); +} + +/** + * Return or Print Category ID. + * + * @since 0.71 + * @deprecated 0.71 + * @deprecated use get_the_category() + * @see get_the_category() + * + * @param bool $echo + * @return null|int + */ +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; +} + +/** + * Print category with optional text before and after. + * + * @since 0.71 + * @deprecated 0.71 + * @deprecated use get_the_category_by_ID() + * @see get_the_category_by_ID() + * + * @param string $before + * @param string $after + */ +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 link to the previous post. + * + * @since 1.5 + * @deprecated 2.0 + * @deprecated 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', '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); + $string .= ''; + $format = str_replace('%', $string, $format); + echo $format; +} + +/** + * Prints link to the next post. + * + * @since 0.71 + * @deprecated 2.0 + * @deprecated 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', '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, $nextpost); + $string .= ''; + $format = str_replace('%', $string, $format); + echo $format; +} + +/** + * Whether user can create a post. + * + * @since 1.5 + * @deprecated 2.0 + * @deprecated 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', 'current_user_can()' ); + + $author_data = get_userdata($user_id); + return ($author_data->user_level > 1); +} + +/** + * Whether user can create a post. + * + * @since 1.5 + * @deprecated 2.0 + * @deprecated 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', 'current_user_can()' ); + + $author_data = get_userdata($user_id); + return ($author_data->user_level >= 1); +} + +/** + * Whether user can edit a post. + * + * @since 1.5 + * @deprecated 2.0 + * @deprecated 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', '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 + * @deprecated 2.0 + * @deprecated 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', '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 + * @deprecated 2.0 + * @deprecated 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', '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 + * @deprecated 2.0 + * @deprecated 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', '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 + * @deprecated 2.0 + * @deprecated 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', '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 + * @deprecated 2.0 + * @deprecated 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', '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 + * @deprecated 2.0 + * @deprecated 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', '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 + * @deprecated 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 it's 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', '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 + * @deprecated Use wp_list_bookmarks() + * @see wp_list_bookmarks() + * + * @param string $category The category to use. + * @param string $args + * @return bool|null + */ +function wp_get_linksbyname($category, $args = '') { + _deprecated_function(__FUNCTION__, '2.1', '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 + * @deprecated 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 unknown + */ +function get_linkobjectsbyname($cat_name = "noname" , $orderby = 'name', $limit = -1) { + _deprecated_function( __FUNCTION__, '2.1', '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: + *
      + *
    1. link_id
    2. + *
    3. link_url
    4. + *
    5. link_name
    6. + *
    7. link_image
    8. + *
    9. link_target
    10. + *
    11. link_category
    12. + *
    13. link_description
    14. + *
    15. link_visible
    16. + *
    17. link_owner
    18. + *
    19. link_rating
    20. + *
    21. link_updated
    22. + *
    23. link_rel
    24. + *
    25. link_notes
    26. + *
    + * + * @since 1.0.1 + * @deprecated 2.1 + * @deprecated 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 unknown + */ +function get_linkobjects($category = 0, $orderby = 'name', $limit = 0) { + _deprecated_function( __FUNCTION__, '2.1', '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 + * @deprecated 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 it's 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', '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 + * @deprecated 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 it's 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 string $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', '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 + * @deprecated No alternative function available + * + * @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' ); + return 0; +} + +/** + * @since 0.71 + * @deprecated 2.1 + * @deprecated 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 unknown + */ +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', '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); +} + +/** + * @since 1.2 + * @deprecated 2.1 + * @deprecated Use wp_list_categories() + * @see wp_list_categories() + * + * @param string|array $args + * @return unknown + */ +function wp_list_cats($args = '') { + _deprecated_function( __FUNCTION__, '2.1', '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); +} + +/** + * @since 0.71 + * @deprecated 2.1 + * @deprecated 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 unknown + */ +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', '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); +} + +/** + * @since 1.2 + * @deprecated 2.1 + * @deprecated 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 unknown + */ +function list_authors($optioncount = false, $exclude_admin = true, $show_fullname = false, $hide_empty = true, $feed = '', $feed_image = '') { + _deprecated_function( __FUNCTION__, '2.1', 'wp_list_authors()' ); + + $args = compact('optioncount', 'exclude_admin', 'show_fullname', 'hide_empty', 'feed', 'feed_image'); + return wp_list_authors($args); +} + +/** + * @since 1.0.1 + * @deprecated 2.1 + * @deprecated Use wp_get_post_categories() + * @see wp_get_post_categories() + * + * @param int $blogid Not Used + * @param int $post_ID + * @return unknown + */ +function wp_get_post_cats($blogid = '1', $post_ID = 0) { + _deprecated_function( __FUNCTION__, '2.1', '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 + * @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 unknown + */ +function wp_set_post_cats($blogid = '1', $post_ID = 0, $post_categories = array()) { + _deprecated_function( __FUNCTION__, '2.1', 'wp_set_post_categories()' ); + return wp_set_post_categories($post_ID, $post_categories); +} + +/** + * @since 0.71 + * @deprecated 2.1 + * @deprecated 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 unknown + */ +function get_archives($type='', $limit='', $format='html', $before = '', $after = '', $show_post_count = false) { + _deprecated_function( __FUNCTION__, '2.1', '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 + * @deprecated 2.1 + * @deprecated Use get_author_posts_url() + * @see get_author_posts_url() + * + * @param bool $echo Optional. + * @param int $author_id Required. + * @param string $author_nicename Optional. + * @return string|null + */ +function get_author_link($echo = false, $author_id, $author_nicename = '') { + _deprecated_function( __FUNCTION__, '2.1', '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 + * @deprecated 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', '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 + * @deprecated Use get_option() + * @see get_option() + * + * @param string $option + * @return string + */ +function get_settings($option) { + _deprecated_function( __FUNCTION__, '2.1', 'get_option()' ); + + return get_option($option); +} + +/** + * Print the permalink of the current post in the loop. + * + * @since 0.71 + * @deprecated 1.2 + * @deprecated Use the_permalink() + * @see the_permalink() + */ +function permalink_link() { + _deprecated_function( __FUNCTION__, '1.2', 'the_permalink()' ); + the_permalink(); +} + +/** + * Print the permalink to the RSS feed. + * + * @since 0.71 + * @deprecated 2.3 + * @deprecated Use the_permalink_rss() + * @see the_permalink_rss() + * + * @param string $deprecated + */ +function permalink_single_rss($deprecated = '') { + _deprecated_function( __FUNCTION__, '2.3', 'the_permalink_rss()' ); + the_permalink_rss(); +} + +/** + * Gets the links associated with category. + * + * @see get_links() for argument information that can be used in $args + * @since 1.0.1 + * @deprecated 2.1 + * @deprecated 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', '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 + * @deprecated 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', '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') * 3600)) . ')'; + + 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 + * @deprecated 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', '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 + * @deprecated {@internal Use function instead is unknown}} + * + * @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' ); + + if ( $count ) + $counts = $wpdb->get_var("SELECT COUNT(*) FROM $wpdb->links"); + + $javascript = ""; + $javascript .= $text; + + if ( $count ) + $javascript .= " ($counts)"; + + $javascript .= "\n\n"; + echo $javascript; +} + +/** + * @since 1.0.1 + * @deprecated 2.1 + * @deprecated Use sanitize_bookmark_field() + * @see sanitize_bookmark_field() + * + * @param object $link + * @return unknown + */ +function get_linkrating($link) { + _deprecated_function( __FUNCTION__, '2.1', '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 + * @deprecated 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', '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 + * @deprecated 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', 'post_comments_feed_link()' ); + post_comments_feed_link($link_text); +} + +/** + * Print/Return link to category RSS2 feed. + * + * @since 1.2 + * @deprecated 2.5 + * @deprecated Use get_category_feed_link() + * @see get_category_feed_link() + * + * @param bool $echo + * @param int $cat_ID + * @return string|null + */ +function get_category_rss_link($echo = false, $cat_ID = 1) { + _deprecated_function( __FUNCTION__, '2.5', '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 + * @deprecated 2.5 + * @deprecated Use get_author_feed_link() + * @see get_author_feed_link() + * + * @param bool $echo + * @param int $author_id + * @return string|null + */ +function get_author_rss_link($echo = false, $author_id = 1) { + _deprecated_function( __FUNCTION__, '2.5', '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 + * @deprecated 2.2 + * @deprecated Use get_post_comments_feed_link() + * @see get_post_comments_feed_link() + * + * @return string + */ +function comments_rss() { + _deprecated_function( __FUNCTION__, '2.2', 'get_post_comments_feed_link()' ); + return get_post_comments_feed_link(); +} + +/** + * An alias of wp_create_user(). + * + * @since 2.0 + * @deprecated 2.0 + * @deprecated 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 (optional). + * @return int The new user's ID. + */ +function create_user($username, $password, $email) { + _deprecated_function( __FUNCTION__, '2.0', 'wp_create_user()' ); + return wp_create_user($username, $password, $email); +} + +/** + * Unused function. + * + * @deprecated 2.5 +*/ +function gzip_compression() { + _deprecated_function( __FUNCTION__, '2.5' ); + return false; +} + +/** + * Retrieve an array of comment data about comment $comment_ID. + * + * @since 0.71 + * @deprecated 2.7 + * @deprecated 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', 'get_comment()' ); + return get_comment($comment_ID, ARRAY_A); +} + +/** + * Retrieve the category name by the category ID. + * + * @since 0.71 + * @deprecated 2.8 + * @deprecated 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', '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 + * @deprecated 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', '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; +} + +/** + * Retrieve the description of the author of the current post. + * + * @since 1.5 + * @deprecated 2.8 + * @deprecated Use get_the_author_meta('description') + * @see get_the_author_meta() + * + * @return string The author's description. + */ +function get_the_author_description() { + _deprecated_function( __FUNCTION__, '2.8', '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 + * @deprecated Use the_author_meta('description') + * @see the_author_meta() + */ +function the_author_description() { + _deprecated_function( __FUNCTION__, '2.8', 'the_author_meta(\'description\')' ); + the_author_meta('description'); +} + +/** + * Retrieve the login name of the author of the current post. + * + * @since 1.5 + * @deprecated 2.8 + * @deprecated Use get_the_author_meta('login') + * @see get_the_author_meta() + * + * @return string The author's login name (username). + */ +function get_the_author_login() { + _deprecated_function( __FUNCTION__, '2.8', '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 + * @deprecated Use the_author_meta('login') + * @see the_author_meta() + */ +function the_author_login() { + _deprecated_function( __FUNCTION__, '2.8', 'the_author_meta(\'login\')' ); + the_author_meta('login'); +} + +/** + * Retrieve the first name of the author of the current post. + * + * @since 1.5 + * @deprecated 2.8 + * @deprecated Use get_the_author_meta('first_name') + * @see get_the_author_meta() + * + * @return string The author's first name. + */ +function get_the_author_firstname() { + _deprecated_function( __FUNCTION__, '2.8', '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 + * @deprecated Use the_author_meta('first_name') + * @see the_author_meta() + */ +function the_author_firstname() { + _deprecated_function( __FUNCTION__, '2.8', 'the_author_meta(\'first_name\')' ); + the_author_meta('first_name'); +} + +/** + * Retrieve the last name of the author of the current post. + * + * @since 1.5 + * @deprecated 2.8 + * @deprecated Use get_the_author_meta('last_name') + * @see get_the_author_meta() + * + * @return string The author's last name. + */ +function get_the_author_lastname() { + _deprecated_function( __FUNCTION__, '2.8', '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 + * @deprecated Use the_author_meta('last_name') + * @see the_author_meta() + */ +function the_author_lastname() { + _deprecated_function( __FUNCTION__, '2.8', 'the_author_meta(\'last_name\')' ); + the_author_meta('last_name'); +} + +/** + * Retrieve the nickname of the author of the current post. + * + * @since 1.5 + * @deprecated 2.8 + * @deprecated Use get_the_author_meta('nickname') + * @see get_the_author_meta() + * + * @return string The author's nickname. + */ +function get_the_author_nickname() { + _deprecated_function( __FUNCTION__, '2.8', '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 + * @deprecated Use the_author_meta('nickname') + * @see the_author_meta() + */ +function the_author_nickname() { + _deprecated_function( __FUNCTION__, '2.8', 'the_author_meta(\'nickname\')' ); + the_author_meta('nickname'); +} + +/** + * Retrieve the email of the author of the current post. + * + * @since 1.5 + * @deprecated 2.8 + * @deprecated Use get_the_author_meta('email') + * @see get_the_author_meta() + * + * @return string The author's username. + */ +function get_the_author_email() { + _deprecated_function( __FUNCTION__, '2.8', '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 + * @deprecated Use the_author_meta('email') + * @see the_author_meta() + */ +function the_author_email() { + _deprecated_function( __FUNCTION__, '2.8', 'the_author_meta(\'email\')' ); + the_author_meta('email'); +} + +/** + * Retrieve the ICQ number of the author of the current post. + * + * @since 1.5 + * @deprecated 2.8 + * @deprecated Use get_the_author_meta('icq') + * @see get_the_author_meta() + * + * @return string The author's ICQ number. + */ +function get_the_author_icq() { + _deprecated_function( __FUNCTION__, '2.8', '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 + * @deprecated Use the_author_meta('icq') + * @see the_author_meta() + */ +function the_author_icq() { + _deprecated_function( __FUNCTION__, '2.8', 'the_author_meta(\'icq\')' ); + the_author_meta('icq'); +} + +/** + * Retrieve the Yahoo! IM name of the author of the current post. + * + * @since 1.5 + * @deprecated 2.8 + * @deprecated Use get_the_author_meta('yim') + * @see get_the_author_meta() + * + * @return string The author's Yahoo! IM name. + */ +function get_the_author_yim() { + _deprecated_function( __FUNCTION__, '2.8', '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 + * @deprecated Use the_author_meta('yim') + * @see the_author_meta() + */ +function the_author_yim() { + _deprecated_function( __FUNCTION__, '2.8', 'the_author_meta(\'yim\')' ); + the_author_meta('yim'); +} + +/** + * Retrieve the MSN address of the author of the current post. + * + * @since 1.5 + * @deprecated 2.8 + * @deprecated Use get_the_author_meta('msn') + * @see get_the_author_meta() + * + * @return string The author's MSN address. + */ +function get_the_author_msn() { + _deprecated_function( __FUNCTION__, '2.8', '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 + * @deprecated Use the_author_meta('msn') + * @see the_author_meta() + */ +function the_author_msn() { + _deprecated_function( __FUNCTION__, '2.8', 'the_author_meta(\'msn\')' ); + the_author_meta('msn'); +} + +/** + * Retrieve the AIM address of the author of the current post. + * + * @since 1.5 + * @deprecated 2.8 + * @deprecated Use get_the_author_meta('aim') + * @see get_the_author_meta() + * + * @return string The author's AIM address. + */ +function get_the_author_aim() { + _deprecated_function( __FUNCTION__, '2.8', '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 + * @see the_author_meta() + * @deprecated 2.8 + * @deprecated Use the_author_meta('aim') + */ +function the_author_aim() { + _deprecated_function( __FUNCTION__, '2.8', 'the_author_meta(\'aim\')' ); + the_author_meta('aim'); +} + +/** + * Retrieve the specified author's preferred display name. + * + * @since 1.0.0 + * @deprecated 2.8 + * @deprecated Use get_the_author_meta('display_name') + * @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', '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 + * @deprecated 2.8 + * @deprecated Use get_the_author_meta('url') + * @see get_the_author_meta() + * + * @return string The URL to the author's page. + */ +function get_the_author_url() { + _deprecated_function( __FUNCTION__, '2.8', '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 + * @deprecated Use the_author_meta('url') + * @see the_author_meta() + */ +function the_author_url() { + _deprecated_function( __FUNCTION__, '2.8', 'the_author_meta(\'url\')' ); + the_author_meta('url'); +} + +/** + * Retrieve the ID of the author of the current post. + * + * @since 1.5 + * @deprecated 2.8 + * @deprecated Use get_the_author_meta('ID') + * @see get_the_author_meta() + * + * @return int The author's ID. + */ +function get_the_author_ID() { + _deprecated_function( __FUNCTION__, '2.8', '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 + * @deprecated Use the_author_meta('ID') + * @see the_author_meta() +*/ +function the_author_ID() { + _deprecated_function( __FUNCTION__, '2.8', '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. + * + * @package WordPress + * @subpackage Feed + * @since 0.71 + * @uses apply_filters() Calls 'the_content_rss' on the content before processing. + * @see get_the_content() For the $more_link_text, $stripteaser, and $more_file + * parameters. + * + * @deprecated 2.9.0 + * @deprecated 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|bool $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', 'the_content_feed' ); + $content = get_the_content($more_link_text, $stripteaser, $more_file); + $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', '' ); + preg_match_all( '/(.+?)<\/a>/', $content, $matches ); + $links_summary = "\n"; + for ( $i=0; $ipost_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 + * @deprecated 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', '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); + $class = 'attachmentthumb'; + } elseif ( wp_attachment_is_image( $post->ID ) ) { + // We have an image without a thumbnail + + $src = wp_get_attachment_url( $post->ID ); + $src_file = & $file; + $class = 'attachmentimage'; + } 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 + * @deprecated 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 string HTML content. + */ +function get_attachment_icon( $id = 0, $fullsize = false, $max_dims = false ) { + _deprecated_function( __FUNCTION__, '2.5', '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 + * @deprecated 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 string + */ +function get_attachment_innerHTML($id = 0, $fullsize = false, $max_dims = false) { + _deprecated_function( __FUNCTION__, '2.5', '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); +} + +/** + * Retrieve bookmark data based on ID. + * + * @since 2.0.0 + * @deprecated 2.1.0 + * @deprecated Use get_bookmark() + * @see get_bookmark() + * + * @param int $bookmark_id ID of link + * @param string $output OBJECT, ARRAY_N, or ARRAY_A + * @return object|array + */ +function get_link($bookmark_id, $output = OBJECT, $filter = 'raw') { + _deprecated_function( __FUNCTION__, '2.1', '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 + * @deprecated 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', '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) amperstands are also replaced. The 'clean_url' filter + * is applied to the returned cleaned URL. + * + * @since 1.2.0 + * @deprecated 3.0.0 + * @deprecated Use esc_url() + * @see Alias for 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 'clean_url' filter is applied. + */ +function clean_url( $url, $protocols = null, $context = 'display' ) { + if ( $context == 'db' ) + _deprecated_function( 'clean_url( $context = \'db\' )', '3.0', 'esc_url_raw()' ); + else + _deprecated_function( __FUNCTION__, '3.0', 'esc_url()' ); + return esc_url( $url, $protocols, $context ); +} + +/** + * Escape single quotes, specialchar double quotes, and fix line endings. + * + * The filter 'js_escape' is also applied by esc_js() + * + * @since 2.0.4 + * @deprecated 2.8.0 + * @deprecated 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', 'esc_js()' ); + return esc_js( $text ); +} + +/** + * Escaping for HTML blocks. + * + * @deprecated 2.8.0 + * @deprecated Use esc_html() + * @see esc_html() + */ +function wp_specialchars( $string, $quote_style = ENT_NOQUOTES, $charset = false, $double_encode = false ) { + _deprecated_function( __FUNCTION__, '2.8', 'esc_html()' ); + if ( func_num_args() > 1 ) { // Maintain backwards compat for people passing additional args + $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 + * @deprecated Use esc_attr() + * @see esc_attr() + * + * @param string $text + * @return string + */ +function attribute_escape( $text ) { + _deprecated_function( __FUNCTION__, '2.8', 'esc_attr()' ); + return esc_attr( $text ); +} + +/** + * Register widget for sidebar with backwards 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 {@link wp_register_sidebar_widget()} after argument list and + * backwards compatibility is complete. + * + * @since 2.2.0 + * @deprecated 2.8.0 + * @deprecated Use wp_register_sidebar_widget() + * @see wp_register_sidebar_widget() + * + * @param string|int $name Widget ID. + * @param callback $output_callback Run when widget is called. + * @param string $classname Classname widget option. + * @param mixed $params,... Widget parameters. + */ +function register_sidebar_widget($name, $output_callback, $classname = '') { + _deprecated_function( __FUNCTION__, '2.8', '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); +} + +/** + * Alias of {@link wp_unregister_sidebar_widget()}. + * + * @since 2.2.0 + * @deprecated 2.8.0 + * @deprecated 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', '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 {@link wp_register_widget_control()} after the argument list has + * been compiled. + * + * @since 2.2.0 + * @deprecated 2.8.0 + * @deprecated Use wp_register_widget_control() + * @see wp_register_widget_control() + * + * @param int|string $name Sidebar ID. + * @param callback $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', '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 {@link wp_unregister_widget_control()}. + * + * @since 2.2.0 + * @deprecated 2.8.0 + * @deprecated 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', 'wp_unregister_widget_control()' ); + return wp_unregister_widget_control($id); +} + +/** + * Remove user meta data. + * + * @since 2.0.0 + * @deprecated 3.0.0 + * @deprecated 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', '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 + * @deprecated 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', '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 + * @deprecated 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', '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') ); + else if ( $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 blog. + * + * For setups that use the multi-blog feature. Can be used outside of the + * multi-blog feature. + * + * @since 2.2.0 + * @deprecated 3.1.0 + * @uses $wpdb WordPress database object for queries + * @uses $blog_id The Blog id of the blog for those that use more than one blog + * + * @param int $id Blog ID. + * @return array List of users that are part of that Blog ID + */ +function get_users_of_blog( $id = '' ) { + _deprecated_function( __FUNCTION__, '3.1', 'get_users()' ); + + global $wpdb, $blog_id; + if ( empty($id) ) + $id = (int) $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 + * @deprecated Use add_theme_support( 'automatic-feed-links' ) + * + * @param boolean $add Optional, default is true. Add or remove links. Defaults to true. + */ +function automatic_feed_links( $add = true ) { + _deprecated_function( __FUNCTION__, '3.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 + * @deprecated Use get_the_author_meta() + * @see get_the_author_meta() + */ +function get_profile( $field, $user = false ) { + _deprecated_function( __FUNCTION__, '3.0', 'get_the_author_meta()' ); + if ( $user ) { + $user = get_user_by( 'login', $user ); + $user = $user->ID; + } + return get_the_author_meta( $field, $user ); +} + +/** + * Number of posts user has written. + * + * @since 0.71 + * @deprecated 3.0.0 + * @deprecated Use count_user_posts() + * @see count_user_posts() + */ +function get_usernumposts( $userid ) { + _deprecated_function( __FUNCTION__, '3.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 + * @uses $is_macIE + * @uses $is_winIE + * @deprecated 3.0.0 + * + * @param string $text Text to be made safe. + * @return string Fixed text. + */ +function funky_javascript_fix($text) { + _deprecated_function( __FUNCTION__, '3.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 + * @deprecated 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', 'taxonomy_exists()' ); + return taxonomy_exists( $taxonomy ); +} + +/** + * Check if Term exists. + * + * @since 2.3.0 + * @deprecated 3.0.0 + * @deprecated 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', 'term_exists()' ); + return term_exists( $term, $taxonomy, $parent ); +} + +/** + * Is the current admin page generated by a plugin? + * + * @since 1.5.0 + * @deprecated 3.1 + * @deprecated Use global $plugin_page and/or get_plugin_page_hookname() hooks. + * + * @global $plugin_page + * + * @return bool + */ +function is_plugin_page() { + _deprecated_function( __FUNCTION__, '3.1' ); + + 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 + * + * @return bool Always return True + */ +function update_category_cache() { + _deprecated_function( __FUNCTION__, '3.1' ); + + return true; +} + +/** + * Check for PHP timezone support + * + * @since 2.9.0 + * @deprecated 3.2 + * + * @return bool + */ +function wp_timezone_supported() { + _deprecated_function( __FUNCTION__, '3.2' ); + + return true; +} diff --git a/src/wp-includes/feed-atom-comments.php b/src/wp-includes/feed-atom-comments.php new file mode 100644 index 0000000..e4a39d8 --- /dev/null +++ b/src/wp-includes/feed-atom-comments.php @@ -0,0 +1,87 @@ +'; +?> + +> + <?php + if ( is_singular() ) + printf(ent2ncr(__('Comments on %s')), get_the_title_rss()); + elseif ( is_search() ) + printf(ent2ncr(__('Comments for %1$s searching on %2$s')), get_bloginfo_rss( 'name' ), get_search_query() ); + else + printf(ent2ncr(__('Comments for %s')), get_bloginfo_rss( 'name' ) . get_wp_title_rss()); + ?> + + + + + + + + + + + + + + + + + + +comment_post_ID); + get_post_custom($comment_post->ID); +?> + + <?php + if ( !is_singular() ) { + $title = get_the_title($comment_post->ID); + $title = apply_filters('the_title_rss', $title); + printf(ent2ncr(__('Comment on %1$s by %2$s')), $title, get_comment_author_rss()); + } else { + 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, its more important that they both use the same system +?> + +comment_ID, $comment_post->ID); +?> + + + diff --git a/src/wp-includes/feed-atom.php b/src/wp-includes/feed-atom.php new file mode 100644 index 0000000..db8d66b --- /dev/null +++ b/src/wp-includes/feed-atom.php @@ -0,0 +1,55 @@ +'; ?> + + > + <?php bloginfo_rss('name'); wp_title_rss(); ?> + + + + + + + + + + + + + + + + + + <![CDATA[<?php the_title_rss() ?>]]> + + + + + + ]]> + + ]]> + + + + + + + + + diff --git a/src/wp-includes/feed-rdf.php b/src/wp-includes/feed-rdf.php new file mode 100644 index 0000000..3a0daf1 --- /dev/null +++ b/src/wp-includes/feed-rdf.php @@ -0,0 +1,54 @@ +'; ?> + +> +"> + <?php bloginfo_rss('name'); wp_title_rss(); ?> + + + + + + 2000-01-01T12:00+00:00 + + + + + + + + + + + + <?php the_title_rss() ?> + + post_date_gmt, false); ?> + + + + + + + ]]> + + + + + diff --git a/src/wp-includes/feed-rss.php b/src/wp-includes/feed-rss.php new file mode 100644 index 0000000..b26897d --- /dev/null +++ b/src/wp-includes/feed-rss.php @@ -0,0 +1,31 @@ +'; ?> + + + <?php bloginfo_rss('name'); wp_title_rss(); ?> + + + + http://backend.userland.com/rss092 + + + + + + <?php the_title_rss() ?> + ]]> + + + + + + diff --git a/src/wp-includes/feed-rss2-comments.php b/src/wp-includes/feed-rss2-comments.php new file mode 100644 index 0000000..74715b8 --- /dev/null +++ b/src/wp-includes/feed-rss2-comments.php @@ -0,0 +1,66 @@ +'; +?> + + > + + <?php + if ( is_singular() ) + printf(ent2ncr(__('Comments on: %s')), get_the_title_rss()); + elseif ( is_search() ) + printf(ent2ncr(__('Comments for %s searching on %s')), get_bloginfo_rss( 'name' ), esc_attr($wp_query->query_vars['s'])); + else + printf(ent2ncr(__('Comments for %s')), get_bloginfo_rss( 'name' ) . get_wp_title_rss()); + ?> + + + + + + + +comment_post_ID); + get_post_custom($comment_post->ID); +?> + + <?php + if ( !is_singular() ) { + $title = get_the_title($comment_post->ID); + $title = apply_filters('the_title_rss', $title); + printf(ent2ncr(__('Comment on %1$s by %2$s')), $title, get_comment_author_rss()); + } else { + printf(ent2ncr(__('By: %s')), get_comment_author_rss()); + } + ?> + + + + + + + ]]> + + + ]]> +comment_ID, $comment_post->ID); +?> + + + + diff --git a/src/wp-includes/feed-rss2.php b/src/wp-includes/feed-rss2.php new file mode 100644 index 0000000..5bf67f2 --- /dev/null +++ b/src/wp-includes/feed-rss2.php @@ -0,0 +1,60 @@ +'; ?> + + +> + + + <?php bloginfo_rss('name'); wp_title_rss(); ?> + + + + + + + + + + + <?php the_title_rss() ?> + + + + + + + + + ]]> + + ]]> + post_content ) > 0 ) : ?> + ]]> + + ]]> + + + + + + + + + + diff --git a/src/wp-includes/feed.php b/src/wp-includes/feed.php new file mode 100644 index 0000000..b94e347 --- /dev/null +++ b/src/wp-includes/feed.php @@ -0,0 +1,546 @@ +get_error_message(); + $title = apply_filters('get_wp_title_rss', $title); + return $title; +} + +/** + * Display the blog title for display of the feed title. + * + * @package WordPress + * @subpackage Feed + * @since 2.2.0 + * @uses apply_filters() Calls 'wp_title_rss' on the blog title. + * @see wp_title() $sep parameter usage. + * + * @param string $sep Optional. + */ +function wp_title_rss($sep = '»') { + echo apply_filters('wp_title_rss', get_wp_title_rss($sep)); +} + +/** + * Retrieve the current post title for the feed. + * + * @package WordPress + * @subpackage Feed + * @since 2.0.0 + * @uses apply_filters() Calls 'the_title_rss' on the post title. + * + * @return string Current post title. + */ +function get_the_title_rss() { + $title = get_the_title(); + $title = apply_filters('the_title_rss', $title); + return $title; +} + +/** + * Display the post title in the feed. + * + * @package WordPress + * @subpackage Feed + * @since 0.71 + * @uses get_the_title_rss() Used to retrieve current post title. + */ +function the_title_rss() { + echo get_the_title_rss(); +} + +/** + * Retrieve the post content for feeds. + * + * @package WordPress + * @subpackage Feed + * @since 2.9.0 + * @uses apply_filters() Calls 'the_content_feed' on the content before processing. + * @see get_the_content() + * + * @param string $feed_type The type of feed. rss2 | atom | rss | rdf + */ +function get_the_content_feed($feed_type = null) { + if ( !$feed_type ) + $feed_type = get_default_feed(); + + $content = apply_filters('the_content', get_the_content()); + $content = str_replace(']]>', ']]>', $content); + return apply_filters('the_content_feed', $content, $feed_type); +} + +/** + * Display the post content for feeds. + * + * @package WordPress + * @subpackage Feed + * @since 2.9.0 + * @uses apply_filters() Calls 'the_content_feed' on the content before processing. + * @see get_the_content() + * + * @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. + * + * @package WordPress + * @subpackage Feed + * @since 0.71 + * @uses apply_filters() Calls 'the_excerpt_rss' hook on the excerpt. + */ +function the_excerpt_rss() { + $output = get_the_excerpt(); + echo apply_filters('the_excerpt_rss', $output); +} + +/** + * Display the permalink to the post for use in feeds. + * + * @package WordPress + * @subpackage Feed + * @since 2.3.0 + * @uses apply_filters() Call 'the_permalink_rss' on the post permalink + */ +function the_permalink_rss() { + 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() { + echo esc_url( get_comments_link() ); +} + +/** + * Display the feed GUID for the current comment. + * + * @package WordPress + * @subpackage Feed + * @since 2.5.0 + * + * @param int|object $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. + * + * @package WordPress + * @subpackage Feed + * @since 2.5.0 + * + * @param int|object $comment_id Optional comment object or id. Defaults to global comment object. + * @return bool|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 + */ +function comment_link() { + echo esc_url( get_comment_link() ); +} + +/** + * Retrieve the current comment author for use in the feeds. + * + * @package WordPress + * @subpackage Feed + * @since 2.0.0 + * @uses apply_filters() Calls 'comment_author_rss' hook on comment author. + * @uses get_comment_author() + * + * @return string Comment Author + */ +function get_comment_author_rss() { + return apply_filters('comment_author_rss', get_comment_author() ); +} + +/** + * Display the current comment author in the feed. + * + * @package WordPress + * @subpackage Feed + * @since 1.0.0 + */ +function comment_author_rss() { + echo get_comment_author_rss(); +} + +/** + * Display the current comment content for use in the feeds. + * + * @package WordPress + * @subpackage Feed + * @since 1.0.0 + * @uses apply_filters() Calls 'comment_text_rss' filter on comment content. + * @uses get_comment_text() + */ +function comment_text_rss() { + $comment_text = get_comment_text(); + $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. + * + * @package WordPress + * @subpackage Feed + * @since 2.1.0 + * @uses apply_filters() + * + * @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( apply_filters( 'get_bloginfo_rss', get_bloginfo( 'url' ) ) ), esc_attr( $cat_name ) ); + else + $the_list .= "\t\t\n"; + } + + return apply_filters('the_category_rss', $the_list, $type); +} + +/** + * Display the post categories in the feed. + * + * @package WordPress + * @subpackage 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'. + * + * @package WordPress + * @subpackage Feed + * @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. + * + * @package WordPress + * @subpackage Template + * @since 1.5.0 + * @uses apply_filters() Calls 'rss_enclosure' hook on rss enclosure. + * @uses get_post_custom() To get the current post enclosure metadata. + */ +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 the first element eg, audio/mpeg from 'audio/mpeg mpga mp2 mp3' + $t = preg_split('/[ \t]/', trim($enclosure[2]) ); + $type = $t[0]; + + 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. + * + * @package WordPress + * @subpackage Template + * @since 2.2.0 + * @uses apply_filters() Calls 'atom_enclosure' hook on atom enclosure. + * @uses get_post_custom() To get the current post enclosure metadata. + */ +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 = split("\n", $enc); + 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 + * + * @package WordPress + * @subpackage Feed + * @since 2.5 + * + * @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); + } + + $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)); + } +} + +/** + * Display the link for the currently displayed feed in a XSS safe way. + * + * Generate a correct link for the atom:self element. + * + * @package WordPress + * @subpackage Feed + * @since 2.5 + */ +function self_link() { + $host = @parse_url(home_url()); + $host = $host['host']; + echo esc_url( + 'http' + . ( (isset($_SERVER['https']) && $_SERVER['https'] == 'on') ? 's' : '' ) . '://' + . $host + . stripslashes($_SERVER['REQUEST_URI']) + ); +} + +/** + * Return the content type for specified feed type. + * + * @package WordPress + * @subpackage Feed + * @since 2.8.0 + */ +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'; + + return apply_filters( 'feed_content_type', $content_type, $type ); +} + +/** + * Build SimplePie object based on RSS or Atom feed from URL. + * + * @since 2.8 + * + * @param string $url URL to retrieve feed + * @return WP_Error|SimplePie WP_Error object on failure or SimplePie object on success + */ +function fetch_feed($url) { + require_once (ABSPATH . WPINC . '/class-feed.php'); + + $feed = new SimplePie(); + $feed->set_feed_url($url); + $feed->set_cache_class('WP_Feed_Cache'); + $feed->set_file_class('WP_SimplePie_File'); + $feed->set_cache_duration(apply_filters('wp_feed_cache_transient_lifetime', 43200, $url)); + do_action_ref_array( 'wp_feed_options', array( &$feed, $url ) ); + $feed->init(); + $feed->handle_content_type(); + + if ( $feed->error() ) + return new WP_Error('simplepie-error', $feed->error()); + + return $feed; +} diff --git a/src/wp-includes/formatting.php b/src/wp-includes/formatting.php new file mode 100644 index 0000000..82a1b9b --- /dev/null +++ b/src/wp-includes/formatting.php @@ -0,0 +1,2926 @@ + + * 'cause today's effort makes it worth tomorrow's "holiday"... + * + * Becomes: + * + * ’cause today’s effort makes it worth tomorrow’s “holiday”… + * + * Code within certain html blocks are skipped. + * + * @since 0.71 + * @uses $wp_cockneyreplace Array of formatted entities for certain common phrases + * + * @param string $text The text to be formatted + * @return string The string replaced with html entities + */ +function wptexturize($text) { + global $wp_cockneyreplace; + static $opening_quote, $closing_quote, $default_no_texturize_tags, $default_no_texturize_shortcodes, $static_characters, $static_replacements, $dynamic_characters, $dynamic_replacements; + + // No need to set up these static variables more than once + if ( empty( $opening_quote ) ) { + /* translators: opening curly quote */ + $opening_quote = _x('“', 'opening curly quote'); + /* translators: closing curly quote */ + $closing_quote = _x('”', 'closing curly quote'); + + $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 { + $cockney = array("'tain't","'twere","'twas","'tis","'twill","'til","'bout","'nuff","'round","'cause"); + $cockneyreplace = array("’tain’t","’twere","’twas","’tis","’twill","’til","’bout","’nuff","’round","’cause"); + } + + $static_characters = array_merge(array('---', ' -- ', '--', ' - ', 'xn–', '...', '``', '\'\'', ' (tm)'), $cockney); + $static_replacements = array_merge(array('—', ' — ', '–', ' – ', 'xn--', '…', $opening_quote, $closing_quote, ' ™'), $cockneyreplace); + + $dynamic_characters = array('/\'(\d\d(?:’|\')?s)/', '/\'(\d)/', '/(\s|\A|[([{<]|")\'/', '/(\d)"/', '/(\d)\'/', '/(\S)\'([^\'\s])/', '/(\s|\A|[([{<])"(?!\s)/', '/"(\s|\S|\Z)/', '/\'([\s.]|\Z)/', '/\b(\d+)x(\d+)\b/'); + $dynamic_replacements = array('’$1','’$1', '$1‘', '$1″', '$1′', '$1’$2', '$1' . $opening_quote . '$2', $closing_quote . '$1', '’$1', '$1×$2'); + } + + // Transform into regexp sub-expression used in _wptexturize_pushpop_element + // Must do this everytime in case plugins use these filters in a context sensitive manner + $no_texturize_tags = '(' . implode('|', apply_filters('no_texturize_tags', $default_no_texturize_tags) ) . ')'; + $no_texturize_shortcodes = '(' . implode('|', apply_filters('no_texturize_shortcodes', $default_no_texturize_shortcodes) ) . ')'; + + $no_texturize_tags_stack = array(); + $no_texturize_shortcodes_stack = array(); + + $textarr = preg_split('/(<.*>|\[.*\])/Us', $text, -1, PREG_SPLIT_DELIM_CAPTURE); + + foreach ( $textarr as &$curl ) { + if ( empty( $curl ) ) + continue; + + // Only call _wptexturize_pushpop_element if first char is correct tag opening + $first = $curl[0]; + if ( '<' === $first ) { + _wptexturize_pushpop_element($curl, $no_texturize_tags_stack, $no_texturize_tags, '<', '>'); + } elseif ( '[' === $first ) { + _wptexturize_pushpop_element($curl, $no_texturize_shortcodes_stack, $no_texturize_shortcodes, '[', ']'); + } elseif ( empty($no_texturize_shortcodes_stack) && empty($no_texturize_tags_stack) ) { + // This is not a tag, nor is the texturization disabled static strings + $curl = str_replace($static_characters, $static_replacements, $curl); + // regular expressions + $curl = preg_replace($dynamic_characters, $dynamic_replacements, $curl); + } + $curl = preg_replace('/&([^#])(?![a-zA-Z1-4]{1,8};)/', '&$1', $curl); + } + return implode( '', $textarr ); +} + +/** + * Search for disabled element tags. Push element to stack on tag open and pop + * on tag close. Assumes first character of $text is tag opening. + * + * @access private + * @since 2.9.0 + * + * @param string $text Text to check. First character is assumed to be $opening + * @param array $stack Array used as stack of opened tag elements + * @param string $disabled_elements Tags to match against formatted as regexp sub-expression + * @param string $opening Tag opening character, assumed to be 1 character long + * @param string $opening Tag closing character + * @return object + */ +function _wptexturize_pushpop_element($text, &$stack, $disabled_elements, $opening = '<', $closing = '>') { + // Check if it is a closing tag -- otherwise assume opening tag + if (strncmp($opening . '/', $text, 2)) { + // Opening? Check $text+1 against disabled elements + if (preg_match('/^' . $disabled_elements . '\b/', substr($text, 1), $matches)) { + /* + * 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, $matches[1]); + } + } else { + // Closing? Check $text+2 against disabled elements + $c = preg_quote($closing, '/'); + if (preg_match('/^' . $disabled_elements . $c . '/', substr($text, 2), $matches)) { + $last = array_pop($stack); + + // Make sure it matches the opening tag + if ($last != $matches[1]) + array_push($stack, $last); + } + } +} + +/** + * 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 + * + * @param array|string $matches The array or string + * @return string The pre block without paragraph/line-break conversion. + */ +function clean_pre($matches) { + if ( is_array($matches) ) + $text = $matches[1] . $matches[2] . "
    "; + else + $text = $matches; + + $text = str_replace('
    ', '', $text); + $text = str_replace('

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

    ', '', $text); + + return $text; +} + +/** + * 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 int|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 = 1) { + + if ( trim($pee) === '' ) + return ''; + $pee = $pee . "\n"; // just to make things a little easier, pad the end + $pee = preg_replace('|
    \s*
    |', "\n\n", $pee); + // Space things out a little + $allblocks = '(?:table|thead|tfoot|caption|col|colgroup|tbody|tr|td|th|div|dl|dd|dt|ul|ol|li|pre|select|option|form|map|area|blockquote|address|math|style|input|p|h[1-6]|hr|fieldset|legend|section|article|aside|hgroup|header|footer|nav|figure|figcaption|details|menu|summary)'; + $pee = preg_replace('!(<' . $allblocks . '[^>]*>)!', "\n$1", $pee); + $pee = preg_replace('!()!', "$1\n\n", $pee); + $pee = str_replace(array("\r\n", "\r"), "\n", $pee); // cross-platform newlines + if ( strpos($pee, ']*)>\s*|', "", $pee); // no pee inside object/embed + $pee = preg_replace('|\s*\s*|', '', $pee); + } + $pee = preg_replace("/\n\n+/", "\n\n", $pee); // take care of duplicates + // make paragraphs, including one at the end + $pees = preg_split('/\n\s*\n/', $pee, -1, PREG_SPLIT_NO_EMPTY); + $pee = ''; + foreach ( $pees as $tinkle ) + $pee .= '

    ' . trim($tinkle, "\n") . "

    \n"; + $pee = preg_replace('|

    \s*

    |', '', $pee); // under certain strange conditions it could create a P of entirely whitespace + $pee = preg_replace('!

    ([^<]+)!', "

    $1

    ", $pee); + $pee = preg_replace('!

    \s*(]*>)\s*

    !', "$1", $pee); // don't pee all over a tag + $pee = preg_replace("|

    (|", "$1", $pee); // problem with nested lists + $pee = preg_replace('|

    ]*)>|i', "

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

    ', '

    ', $pee); + $pee = preg_replace('!

    \s*(]*>)!', "$1", $pee); + $pee = preg_replace('!(]*>)\s*

    !', "$1", $pee); + if ($br) { + $pee = preg_replace_callback('/<(script|style).*?<\/\\1>/s', '_autop_newline_preservation_helper', $pee); + $pee = preg_replace('|(?)\s*\n|', "
    \n", $pee); // optionally make line breaks + $pee = str_replace('', "\n", $pee); + } + $pee = preg_replace('!(]*>)\s*
    !', "$1", $pee); + $pee = preg_replace('!
    (\s*]*>)!', '$1', $pee); + if (strpos($pee, ']*>)(.*?)!is', 'clean_pre', $pee ); + $pee = preg_replace( "|\n

    $|", '

    ', $pee ); + + return $pee; +} + +/** + * Newline preservation help function for wpautop + * + * @since 3.1.0 + * @access private + * @param array $matches preg_replace_callback matches array + * @returns 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 + * + * @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) ) { + $tagnames = array_keys($shortcode_tags); + $tagregexp = join( '|', array_map('preg_quote', $tagnames) ); + $pee = preg_replace('/

    \\s*?(\\[(' . $tagregexp . ')\\b.*?\\/?\\](?:.+?\\[\\/\\2\\])?)\\s*<\\/p>/s', '$1', $pee); + } + + return $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) { + $length = strlen($str); + 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 + * + * @param string $string The text which is to be encoded. + * @param mixed $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 boolean $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; + 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; + } + + // Handle double encoding ourselves + if ( !$double_encode ) { + $string = wp_specialchars_decode( $string, $_quote_style ); + + /* Critical */ + // The previous line decodes &phrase; into &phrase; We must guarantee that &phrase; is valid before proceeding. + $string = wp_kses_normalize_entities($string); + + // Now proceed with custom double-encoding silliness + $string = preg_replace( '/&(#?x?[0-9a-z]+);/i', '|wp_entity|$1|/wp_entity|', $string ); + } + + $string = @htmlspecialchars( $string, $quote_style, $charset ); + + // Handle double encoding ourselves + if ( !$double_encode ) { + $string = str_replace( array( '|wp_entity|', '|/wp_entity|' ), array( '&', ';' ), $string ); + } + + // Backwards compatibility + 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 + * + * @param string $string The text which is to be decoded. + * @param mixed $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 + * + * @param string $string The text which is to be checked. + * @param boolean $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; + 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; + 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; + + $string_length = strlen( $utf8_string ); + 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 ) $num_octets = ( $value < 224 ) ? 2 : 3; + + $values[] = $value; + + if ( $length && ( $unicode_length + ($num_octets * 3) ) > $length ) + break; + if ( count( $values ) == $num_octets ) { + if ($num_octets == 3) { + $unicode .= '%' . dechex($values[0]) . '%' . dechex($values[1]) . '%' . dechex($values[2]); + $unicode_length += 9; + } else { + $unicode .= '%' . dechex($values[0]) . '%' . dechex($values[1]); + $unicode_length += 6; + } + + $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. + * + * @since 1.2.1 + * + * @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 + chr(195).chr(128) => 'A', chr(195).chr(129) => 'A', + chr(195).chr(130) => 'A', chr(195).chr(131) => 'A', + chr(195).chr(132) => 'A', chr(195).chr(133) => 'A', + chr(195).chr(134) => 'AE',chr(195).chr(135) => 'C', + chr(195).chr(136) => 'E', chr(195).chr(137) => 'E', + chr(195).chr(138) => 'E', chr(195).chr(139) => 'E', + chr(195).chr(140) => 'I', chr(195).chr(141) => 'I', + chr(195).chr(142) => 'I', chr(195).chr(143) => 'I', + chr(195).chr(144) => 'D', chr(195).chr(145) => 'N', + chr(195).chr(146) => 'O', chr(195).chr(147) => 'O', + chr(195).chr(148) => 'O', chr(195).chr(149) => 'O', + chr(195).chr(150) => 'O', chr(195).chr(153) => 'U', + chr(195).chr(154) => 'U', chr(195).chr(155) => 'U', + chr(195).chr(156) => 'U', chr(195).chr(157) => 'Y', + chr(195).chr(158) => 'TH',chr(195).chr(159) => 's', + chr(195).chr(160) => 'a', chr(195).chr(161) => 'a', + chr(195).chr(162) => 'a', chr(195).chr(163) => 'a', + chr(195).chr(164) => 'a', chr(195).chr(165) => 'a', + chr(195).chr(166) => 'ae',chr(195).chr(167) => 'c', + chr(195).chr(168) => 'e', chr(195).chr(169) => 'e', + chr(195).chr(170) => 'e', chr(195).chr(171) => 'e', + chr(195).chr(172) => 'i', chr(195).chr(173) => 'i', + chr(195).chr(174) => 'i', chr(195).chr(175) => 'i', + chr(195).chr(176) => 'd', chr(195).chr(177) => 'n', + chr(195).chr(178) => 'o', chr(195).chr(179) => 'o', + chr(195).chr(180) => 'o', chr(195).chr(181) => 'o', + chr(195).chr(182) => 'o', chr(195).chr(184) => 'o', + chr(195).chr(185) => 'u', chr(195).chr(186) => 'u', + chr(195).chr(187) => 'u', chr(195).chr(188) => 'u', + chr(195).chr(189) => 'y', chr(195).chr(190) => 'th', + chr(195).chr(191) => 'y', + // Decompositions for Latin Extended-A + chr(196).chr(128) => 'A', chr(196).chr(129) => 'a', + chr(196).chr(130) => 'A', chr(196).chr(131) => 'a', + chr(196).chr(132) => 'A', chr(196).chr(133) => 'a', + chr(196).chr(134) => 'C', chr(196).chr(135) => 'c', + chr(196).chr(136) => 'C', chr(196).chr(137) => 'c', + chr(196).chr(138) => 'C', chr(196).chr(139) => 'c', + chr(196).chr(140) => 'C', chr(196).chr(141) => 'c', + chr(196).chr(142) => 'D', chr(196).chr(143) => 'd', + chr(196).chr(144) => 'D', chr(196).chr(145) => 'd', + chr(196).chr(146) => 'E', chr(196).chr(147) => 'e', + chr(196).chr(148) => 'E', chr(196).chr(149) => 'e', + chr(196).chr(150) => 'E', chr(196).chr(151) => 'e', + chr(196).chr(152) => 'E', chr(196).chr(153) => 'e', + chr(196).chr(154) => 'E', chr(196).chr(155) => 'e', + chr(196).chr(156) => 'G', chr(196).chr(157) => 'g', + chr(196).chr(158) => 'G', chr(196).chr(159) => 'g', + chr(196).chr(160) => 'G', chr(196).chr(161) => 'g', + chr(196).chr(162) => 'G', chr(196).chr(163) => 'g', + chr(196).chr(164) => 'H', chr(196).chr(165) => 'h', + chr(196).chr(166) => 'H', chr(196).chr(167) => 'h', + chr(196).chr(168) => 'I', chr(196).chr(169) => 'i', + chr(196).chr(170) => 'I', chr(196).chr(171) => 'i', + chr(196).chr(172) => 'I', chr(196).chr(173) => 'i', + chr(196).chr(174) => 'I', chr(196).chr(175) => 'i', + chr(196).chr(176) => 'I', chr(196).chr(177) => 'i', + chr(196).chr(178) => 'IJ',chr(196).chr(179) => 'ij', + chr(196).chr(180) => 'J', chr(196).chr(181) => 'j', + chr(196).chr(182) => 'K', chr(196).chr(183) => 'k', + chr(196).chr(184) => 'k', chr(196).chr(185) => 'L', + chr(196).chr(186) => 'l', chr(196).chr(187) => 'L', + chr(196).chr(188) => 'l', chr(196).chr(189) => 'L', + chr(196).chr(190) => 'l', chr(196).chr(191) => 'L', + chr(197).chr(128) => 'l', chr(197).chr(129) => 'L', + chr(197).chr(130) => 'l', chr(197).chr(131) => 'N', + chr(197).chr(132) => 'n', chr(197).chr(133) => 'N', + chr(197).chr(134) => 'n', chr(197).chr(135) => 'N', + chr(197).chr(136) => 'n', chr(197).chr(137) => 'N', + chr(197).chr(138) => 'n', chr(197).chr(139) => 'N', + chr(197).chr(140) => 'O', chr(197).chr(141) => 'o', + chr(197).chr(142) => 'O', chr(197).chr(143) => 'o', + chr(197).chr(144) => 'O', chr(197).chr(145) => 'o', + chr(197).chr(146) => 'OE',chr(197).chr(147) => 'oe', + chr(197).chr(148) => 'R',chr(197).chr(149) => 'r', + chr(197).chr(150) => 'R',chr(197).chr(151) => 'r', + chr(197).chr(152) => 'R',chr(197).chr(153) => 'r', + chr(197).chr(154) => 'S',chr(197).chr(155) => 's', + chr(197).chr(156) => 'S',chr(197).chr(157) => 's', + chr(197).chr(158) => 'S',chr(197).chr(159) => 's', + chr(197).chr(160) => 'S', chr(197).chr(161) => 's', + chr(197).chr(162) => 'T', chr(197).chr(163) => 't', + chr(197).chr(164) => 'T', chr(197).chr(165) => 't', + chr(197).chr(166) => 'T', chr(197).chr(167) => 't', + chr(197).chr(168) => 'U', chr(197).chr(169) => 'u', + chr(197).chr(170) => 'U', chr(197).chr(171) => 'u', + chr(197).chr(172) => 'U', chr(197).chr(173) => 'u', + chr(197).chr(174) => 'U', chr(197).chr(175) => 'u', + chr(197).chr(176) => 'U', chr(197).chr(177) => 'u', + chr(197).chr(178) => 'U', chr(197).chr(179) => 'u', + chr(197).chr(180) => 'W', chr(197).chr(181) => 'w', + chr(197).chr(182) => 'Y', chr(197).chr(183) => 'y', + chr(197).chr(184) => 'Y', chr(197).chr(185) => 'Z', + chr(197).chr(186) => 'z', chr(197).chr(187) => 'Z', + chr(197).chr(188) => 'z', chr(197).chr(189) => 'Z', + chr(197).chr(190) => 'z', chr(197).chr(191) => 's', + // Decompositions for Latin Extended-B + chr(200).chr(152) => 'S', chr(200).chr(153) => 's', + chr(200).chr(154) => 'T', chr(200).chr(155) => 't', + // Euro Sign + chr(226).chr(130).chr(172) => 'E', + // GBP (Pound) Sign + chr(194).chr(163) => ''); + + $string = strtr($string, $chars); + } else { + // Assume ISO-8859-1 if not UTF-8 + $chars['in'] = chr(128).chr(131).chr(138).chr(142).chr(154).chr(158) + .chr(159).chr(162).chr(165).chr(181).chr(192).chr(193).chr(194) + .chr(195).chr(196).chr(197).chr(199).chr(200).chr(201).chr(202) + .chr(203).chr(204).chr(205).chr(206).chr(207).chr(209).chr(210) + .chr(211).chr(212).chr(213).chr(214).chr(216).chr(217).chr(218) + .chr(219).chr(220).chr(221).chr(224).chr(225).chr(226).chr(227) + .chr(228).chr(229).chr(231).chr(232).chr(233).chr(234).chr(235) + .chr(236).chr(237).chr(238).chr(239).chr(241).chr(242).chr(243) + .chr(244).chr(245).chr(246).chr(248).chr(249).chr(250).chr(251) + .chr(252).chr(253).chr(255); + + $chars['out'] = "EfSZszYcYuAAAAAACEEEEIIIINOOOOOOUUUUYaaaaaaceeeeiiiinoooooouuuuyy"; + + $string = strtr($string, $chars['in'], $chars['out']); + $double_chars['in'] = array(chr(140), chr(156), chr(198), chr(208), chr(222), chr(223), chr(230), chr(240), chr(254)); + $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. Trim period, dash and underscore from beginning + * and end of filename. + * + * @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)); + $special_chars = apply_filters('sanitize_file_name_chars', $special_chars, $filename_raw); + $filename = str_replace($special_chars, '', $filename); + $filename = preg_replace('/[\s-]+/', '-', $filename); + $filename = trim($filename, '.-_'); + + // Split the filename into a base and extension[s] + $parts = explode('.', $filename); + + // Return if only one extension + if ( count($parts) <= 2 ) + 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. Munge 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; + + return apply_filters('sanitize_file_name', $filename, $filename_raw); +} + +/** + * Sanitize 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 'sanitize_user' filter. + * + * @since 2.0.0 + * @uses apply_filters() Calls 'sanitize_user' hook on username, raw username, + * and $strict parameter. + * + * @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 ); + + return apply_filters( 'sanitize_user', $username, $raw_username, $strict ); +} + +/** + * Sanitize 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 ); + return apply_filters( 'sanitize_key', $key, $raw_key ); +} + +/** + * Sanitizes title or use 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); + + $title = apply_filters('sanitize_title', $title, $raw_title, $context); + + if ( '' === $title || false === $title ) + $title = $fallback_title; + + return $title; +} + +function sanitize_title_for_query($title) { + return sanitize_title($title, '', 'query'); +} + +/** + * Sanitizes title, replacing whitespace 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. + * @return string The sanitized title. + */ +function sanitize_title_with_dashes($title) { + $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); + $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 ASC/DESC, and also accepts + * RAND(). + * + * @since 2.5.1 + * + * @param string $orderby Order by string to be checked. + * @return string|false Returns the order by clause if it is a match, false otherwise. + */ +function sanitize_sql_orderby( $orderby ){ + preg_match('/^\s*([a-z0-9_]+(\s+(ASC|DESC))?(\s*,\s*|\s*$))+|^\s*RAND\(\s*\)\s*$/i', $orderby, $obmatches); + if ( !$obmatches ) + return false; + return $orderby; +} + +/** + * Santizes a 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 end's 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 ) + $sanitized = $fallback; + + return apply_filters( 'sanitize_html_class', $sanitized, $class, $fallback ); +} + +/** + * Converts a number of characters from a string. + * + * Metadata tags <> and <<category>> are removed, <<br>> and <<hr>> are + * converted into correct XHTML and Unicode characters are converted to the + * valid range. + * + * @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' ); + + // Translation of invalid Unicode references range to valid range + $wp_htmltranswinuni = array( + '€' => '€', // the Euro sign + '' => '', + '‚' => '‚', // these are Windows CP1252 specific characters + 'ƒ' => 'ƒ', // they would look weird on non-Windows browsers + '„' => '„', + '…' => '…', + '†' => '†', + '‡' => '‡', + 'ˆ' => 'ˆ', + '‰' => '‰', + 'Š' => 'Š', + '‹' => '‹', + 'Œ' => 'Œ', + '' => '', + 'Ž' => 'ž', + '' => '', + '' => '', + '‘' => '‘', + '’' => '’', + '“' => '“', + '”' => '”', + '•' => '•', + '–' => '–', + '—' => '—', + '˜' => '˜', + '™' => '™', + 'š' => 'š', + '›' => '›', + 'œ' => 'œ', + '' => '', + 'ž' => '', + 'Ÿ' => 'Ÿ' + ); + + // Remove metadata tags + $content = preg_replace('/<title>(.+?)<\/title>/','',$content); + $content = preg_replace('/<category>(.+?)<\/category>/','',$content); + + // Converts lone & characters into & (a.k.a. &) + $content = preg_replace('/&([^#])(?![a-z1-4]{1,8};)/i', '&$1', $content); + + // Fix Word pasting + $content = strtr($content, $wp_htmltranswinuni); + + // Just a little XHTML help + $content = str_replace('<br>', '<br />', $content); + $content = str_replace('<hr>', '<hr />', $content); + + return $content; +} + +/** + * Will only balance the tags if forced to and the option is set to balance tags. + * + * The option 'use_balanceTags' is used for whether the tags will be balanced. + * Both the $force parameter and 'use_balanceTags' option will have to be true + * before the tags will be balanced. + * + * @since 0.71 + * + * @param string $text Text to be balanced + * @param bool $force 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') == 0 ) + return $text; + return force_balance_tags( $text ); +} + +/** + * Balances tags of string using a modified stack. + * + * @since 2.0.4 + * + * @author Leonard Lin <leonard@acm.org> + * @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 = ''; + $single_tags = array('br', 'hr', 'img', 'input'); // Known single-entity/self-closing tags + $nestable_tags = array('blockquote', 'div', 'span'); // Tags that can be immediately nested within themselves + + // 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 + else if ( $tagstack[$stacksize - 1] == $tag ) { // found closing tag + $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 .= '</' . array_pop( $tagstack ) . '>'; + $stacksize--; + } + break; + } + } + $tag = ''; + } + } else { // Begin Tag + $tag = strtolower($regex[1]); + + // Tag Cleaning + + // If self-closing or '', don't do anything. + if ( substr($regex[2],-1) == '/' || $tag == '' ) { + // do nothing + } + // ElseIf it's a known single-entity tag but it doesn't close itself, do so + elseif ( in_array($tag, $single_tags) ) { + $regex[2] .= '/'; + } else { // Push the tag onto the stack + // If the top of the stack is the same as the tag we want to push, close previous tag + if ( $stacksize > 0 && !in_array($tag, $nestable_tags) && $tagstack[$stacksize - 1] == $tag ) { + $tagqueue = '</' . array_pop ($tagstack) . '>'; + $stacksize--; + } + $stacksize = array_push ($tagstack, $tag); + } + + // Attributes + $attributes = $regex[2]; + if( !empty($attributes) ) + $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 .= '</' . $x . '>'; // Add remaining tags to close + + // WP fix for the bug with HTML comments + $newtext = str_replace("< !--","<!--",$newtext); + $newtext = str_replace("< !--","< !--",$newtext); + + return $newtext; +} + +/** + * Acts on text which is about to be edited. + * + * Unless $richedit is set, it is simply a holder for the 'format_to_edit' + * filter. If $richedit is set true htmlspecialchars(), through esc_textarea(), + * will be run on the content, converting special characters to HTML entities. + * + * @since 0.71 + * + * @param string $content The text about to be edited. + * @param bool $richedit Whether the $content should pass through htmlspecialchars(). Default false. + * @return string The text after the filter (and possibly htmlspecialchars()) has been run. + */ +function format_to_edit( $content, $richedit = false ) { + $content = apply_filters( 'format_to_edit', $content ); + if ( ! $richedit ) + $content = esc_textarea( $content ); + return $content; +} + +/** + * Holder for the 'format_to_post' filter. + * + * @since 0.71 + * + * @param string $content The text to pass through the filter. + * @return string Text returned from the 'format_to_post' filter. + */ +function format_to_post($content) { + $content = apply_filters('format_to_post', $content); + return $content; +} + +/** + * Add leading zeros when necessary. + * + * If you set the threshold to '4' and the number is '10', then you will get + * back '0010'. If you set the number to '4' and the number is '5000', then you + * will get back '5000'. + * + * Uses sprintf to append the amount of zeros based on the $threshold parameter + * and the size of the number. If the number is large enough, then no zeros will + * be appended. + * + * @since 0.71 + * + * @param mixed $number Number to append zeros to if not greater than threshold. + * @param int $threshold Digit places number needs to be to not have zeros added. + * @return string Adds leading zeros to number if needed. + */ +function zeroise($number, $threshold) { + return sprintf('%0'.$threshold.'s', $number); +} + +/** + * Adds backslashes before letters and before a number at the start of a string. + * + * @since 0.71 + * + * @param string $string Value to which backslashes will be added. + * @return string String with backslashes inserted. + */ +function backslashit($string) { + $string = preg_replace('/^([0-9])/', '\\\\\\\\\1', $string); + $string = preg_replace('/([a-z])/i', '\\\\\1', $string); + return $string; +} + +/** + * Appends a trailing slash. + * + * Will remove trailing slash if it exists already before adding a trailing + * slash. This prevents double slashing a string or path. + * + * The primary use of this is for paths and thus should be used for paths. It is + * not restricted to paths and offers no specific path support. + * + * @since 1.2.0 + * @uses untrailingslashit() Unslashes string if it was slashed already. + * + * @param string $string What to add the trailing slash to. + * @return string String with trailing slash added. + */ +function trailingslashit($string) { + return untrailingslashit($string) . '/'; +} + +/** + * Removes trailing slash if it exists. + * + * The primary use of this is for paths and thus should be used for paths. It is + * not restricted to paths and offers no specific path support. + * + * @since 2.2.0 + * + * @param string $string What to remove the trailing slash from. + * @return string String without the trailing slash. + */ +function untrailingslashit($string) { + return rtrim($string, '/'); +} + +/** + * Adds slashes to escape strings. + * + * Slashes will first be removed if magic_quotes_gpc is set, see {@link + * http://www.php.net/magic_quotes} for more details. + * + * @since 0.71 + * + * @param string $gpc The string returned from HTTP request data. + * @return string Returns a string escaped with slashes. + */ +function addslashes_gpc($gpc) { + if ( get_magic_quotes_gpc() ) + $gpc = stripslashes($gpc); + + return esc_sql($gpc); +} + +/** + * Navigates through an array and removes slashes from the values. + * + * If an array is passed, the array_map() function causes a callback to pass the + * value back to the function. The slashes from this value will removed. + * + * @since 2.0.0 + * + * @param array|string $value The array or string to be stripped. + * @return array|string Stripped array (or string in the callback). + */ +function stripslashes_deep($value) { + if ( is_array($value) ) { + $value = array_map('stripslashes_deep', $value); + } elseif ( is_object($value) ) { + $vars = get_object_vars( $value ); + foreach ($vars as $key=>$data) { + $value->{$key} = stripslashes_deep( $data ); + } + } else { + $value = stripslashes($value); + } + + return $value; +} + +/** + * Navigates through an array and encodes the values to be used in a URL. + * + * Uses a callback to pass the value of the array back to the function as a + * string. + * + * @since 2.2.0 + * + * @param array|string $value The array or string to be encoded. + * @return array|string $value The encoded array (or string from the callback). + */ +function urlencode_deep($value) { + $value = is_array($value) ? array_map('urlencode_deep', $value) : urlencode($value); + return $value; +} + +/** + * Converts email addresses characters to HTML entities to block spam bots. + * + * @since 0.71 + * + * @param string $emailaddy Email address. + * @param int $mailto Optional. Range from 0 to 1. Used for encoding. + * @return string Converted email address. + */ +function antispambot($emailaddy, $mailto=0) { + $emailNOSPAMaddy = ''; + srand ((float) microtime() * 1000000); + for ($i = 0; $i < strlen($emailaddy); $i = $i + 1) { + $j = floor(rand(0, 1+$mailto)); + if ($j==0) { + $emailNOSPAMaddy .= '&#'.ord(substr($emailaddy,$i,1)).';'; + } elseif ($j==1) { + $emailNOSPAMaddy .= substr($emailaddy,$i,1); + } elseif ($j==2) { + $emailNOSPAMaddy .= '%'.zeroise(dechex(ord(substr($emailaddy, $i, 1))), 2); + } + } + $emailNOSPAMaddy = str_replace('@','@',$emailNOSPAMaddy); + return $emailNOSPAMaddy; +} + +/** + * Callback to convert URI match to HTML A element. + * + * This function was backported from 2.5.0 to 2.3.2. Regex callback for {@link + * make_clickable()}. + * + * @since 2.3.2 + * @access private + * + * @param array $matches Single Regex Match. + * @return string HTML A element with URI address. + */ +function _make_url_clickable_cb($matches) { + $url = $matches[2]; + $suffix = ''; + + /** Include parentheses in the URL only if paired **/ + while ( substr_count( $url, '(' ) < substr_count( $url, ')' ) ) { + $suffix = strrchr( $url, ')' ) . $suffix; + $url = substr( $url, 0, strrpos( $url, ')' ) ); + } + + $url = esc_url($url); + if ( empty($url) ) + return $matches[0]; + + return $matches[1] . "<a href=\"$url\" rel=\"nofollow\">$url</a>" . $suffix; +} + +/** + * Callback to convert URL match to HTML A element. + * + * This function was backported from 2.5.0 to 2.3.2. Regex callback for {@link + * make_clickable()}. + * + * @since 2.3.2 + * @access private + * + * @param array $matches Single Regex Match. + * @return string HTML A element with URL address. + */ +function _make_web_ftp_clickable_cb($matches) { + $ret = ''; + $dest = $matches[2]; + $dest = 'http://' . $dest; + $dest = esc_url($dest); + if ( empty($dest) ) + return $matches[0]; + + // removed trailing [.,;:)] from URL + if ( in_array( substr($dest, -1), array('.', ',', ';', ':', ')') ) === true ) { + $ret = substr($dest, -1); + $dest = substr($dest, 0, strlen($dest)-1); + } + return $matches[1] . "<a href=\"$dest\" rel=\"nofollow\">$dest</a>$ret"; +} + +/** + * Callback to convert email address match to HTML A element. + * + * This function was backported from 2.5.0 to 2.3.2. Regex callback for {@link + * make_clickable()}. + * + * @since 2.3.2 + * @access private + * + * @param array $matches Single Regex Match. + * @return string HTML A element with email address. + */ +function _make_email_clickable_cb($matches) { + $email = $matches[2] . '@' . $matches[3]; + return $matches[1] . "<a href=\"mailto:$email\">$email</a>"; +} + +/** + * Convert plaintext URI to HTML links. + * + * Converts URI, www and ftp, and email addresses. Finishes by fixing links + * within links. + * + * @since 0.71 + * + * @param string $ret Content to convert URIs. + * @return string Content with converted URIs. + */ +function make_clickable($ret) { + $ret = ' ' . $ret; + // in testing, using arrays here was found to be faster + $save = @ini_set('pcre.recursion_limit', 10000); + $retval = preg_replace_callback('#(?<!=[\'"])(?<=[*\')+.,;:!&$\s>])(\()?([\w]+?://(?:[\w\\x80-\\xff\#%~/?@\[\]-]{1,2000}|[\'*(+.,;:!=&$](?![\b\)]|(\))?([\s]|$))|(?(1)\)(?![\s<.,;:]|$)|\)))+)#is', '_make_url_clickable_cb', $ret); + if (null !== $retval ) + $ret = $retval; + @ini_set('pcre.recursion_limit', $save); + $ret = preg_replace_callback('#([\s>])((www|ftp)\.[\w\\x80-\\xff\#$%&~/.\-;:=,?@\[\]+]+)#is', '_make_web_ftp_clickable_cb', $ret); + $ret = preg_replace_callback('#([\s>])([.0-9a-z_+-]+)@(([0-9a-z-]+\.)+[0-9a-z]{2,})#i', '_make_email_clickable_cb', $ret); + // this one is not in an array because we need it to run last, for cleanup of accidental links within links + $ret = preg_replace("#(<a( [^>]+?>|>))<a [^>]+?>([^>]+?)</a></a>#i", "$1$3</a>", $ret); + $ret = trim($ret); + return $ret; +} + +/** + * Adds rel nofollow string to all HTML A elements in content. + * + * @since 1.5.0 + * + * @param string $text Content that may contain HTML A elements. + * @return string Converted content. + */ +function wp_rel_nofollow( $text ) { + // This is a pre save filter, so text is already escaped. + $text = stripslashes($text); + $text = preg_replace_callback('|<a (.+?)>|i', 'wp_rel_nofollow_callback', $text); + $text = esc_sql($text); + return $text; +} + +/** + * Callback to used to add rel=nofollow string to HTML A element. + * + * Will remove already existing rel="nofollow" and rel='nofollow' from the + * string to prevent from invalidating (X)HTML. + * + * @since 2.3.0 + * + * @param array $matches Single Match + * @return string HTML A Element with rel nofollow. + */ +function wp_rel_nofollow_callback( $matches ) { + $text = $matches[1]; + $text = str_replace(array(' rel="nofollow"', " rel='nofollow'"), '', $text); + return "<a $text rel=\"nofollow\">"; +} + +/** + * Convert one smiley code to the icon graphic file equivalent. + * + * Looks up one smiley code in the $wpsmiliestrans global array and returns an + * <img> string for that smiley. + * + * @global array $wpsmiliestrans + * @since 2.8.0 + * + * @param string $smiley Smiley code to convert to image. + * @return string Image string for smiley. + */ +function translate_smiley($smiley) { + global $wpsmiliestrans; + + if (count($smiley) == 0) { + return ''; + } + + $smiley = trim(reset($smiley)); + $img = $wpsmiliestrans[$smiley]; + $smiley_masked = esc_attr($smiley); + + $srcurl = apply_filters('smilies_src', includes_url("images/smilies/$img"), $img, site_url()); + + return " <img src='$srcurl' alt='$smiley_masked' class='wp-smiley' /> "; +} + +/** + * Convert text equivalent of smilies to images. + * + * Will only convert smilies if the option 'use_smilies' is true and the global + * used in the function isn't empty. + * + * @since 0.71 + * @uses $wp_smiliessearch + * + * @param string $text Content to convert smilies from text. + * @return string Converted content with text smilies replaced with images. + */ +function convert_smilies($text) { + global $wp_smiliessearch; + $output = ''; + if ( get_option('use_smilies') && !empty($wp_smiliessearch) ) { + // HTML loop taken from texturize function, could possible be consolidated + $textarr = preg_split("/(<.*>)/U", $text, -1, PREG_SPLIT_DELIM_CAPTURE); // capture the tags as well as in between + $stop = count($textarr);// loop stuff + for ($i = 0; $i < $stop; $i++) { + $content = $textarr[$i]; + if ((strlen($content) > 0) && ('<' != $content[0])) { // If it's not a tag + $content = preg_replace_callback($wp_smiliessearch, 'translate_smiley', $content); + } + $output .= $content; + } + } else { + // return default text. + $output = $text; + } + return $output; +} + +/** + * Verifies that an email is valid. + * + * Does not grok i18n domains. Not RFC compliant. + * + * @since 0.71 + * + * @param string $email Email address to verify. + * @param boolean $deprecated Deprecated. + * @return string|bool Either false or the valid email address. + */ +function is_email( $email, $deprecated = false ) { + if ( ! empty( $deprecated ) ) + _deprecated_argument( __FUNCTION__, '3.0' ); + + // Test for the minimum length the email can be + if ( strlen( $email ) < 3 ) { + return apply_filters( 'is_email', false, $email, 'email_too_short' ); + } + + // Test for an @ character after the first position + if ( strpos( $email, '@', 1 ) === false ) { + return apply_filters( 'is_email', false, $email, 'email_no_at' ); + } + + // Split out the local and domain parts + list( $local, $domain ) = explode( '@', $email, 2 ); + + // LOCAL PART + // Test for invalid characters + if ( !preg_match( '/^[a-zA-Z0-9!#$%&\'*+\/=?^_`{|}~\.-]+$/', $local ) ) { + return apply_filters( 'is_email', false, $email, 'local_invalid_chars' ); + } + + // DOMAIN PART + // Test for sequences of periods + if ( preg_match( '/\.{2,}/', $domain ) ) { + return apply_filters( 'is_email', false, $email, 'domain_period_sequence' ); + } + + // Test for leading and trailing periods and whitespace + if ( trim( $domain, " \t\n\r\0\x0B." ) !== $domain ) { + return apply_filters( 'is_email', false, $email, 'domain_period_limits' ); + } + + // Split the domain into subs + $subs = explode( '.', $domain ); + + // Assume the domain will have at least two subs + if ( 2 > count( $subs ) ) { + return apply_filters( 'is_email', false, $email, 'domain_no_periods' ); + } + + // Loop through each sub + foreach ( $subs as $sub ) { + // Test for leading and trailing hyphens and whitespace + if ( trim( $sub, " \t\n\r\0\x0B-" ) !== $sub ) { + return apply_filters( 'is_email', false, $email, 'sub_hyphen_limits' ); + } + + // Test for invalid characters + if ( !preg_match('/^[a-z0-9-]+$/i', $sub ) ) { + return apply_filters( 'is_email', false, $email, 'sub_invalid_chars' ); + } + } + + // Congratulations your email made it! + return apply_filters( 'is_email', $email, $email, null ); +} + +/** + * Convert to ASCII from email subjects. + * + * @since 1.2.0 + * @usedby wp_mail() handles charsets in email subjects + * + * @param string $string Subject line + * @return string Converted string to ASCII + */ +function wp_iso_descrambler($string) { + /* this may only work with iso-8859-1, I'm afraid */ + if (!preg_match('#\=\?(.+)\?Q\?(.+)\?\=#i', $string, $matches)) { + return $string; + } else { + $subject = str_replace('_', ' ', $matches[2]); + $subject = preg_replace_callback('#\=([0-9a-f]{2})#i', '_wp_iso_convert', $subject); + return $subject; + } +} + +/** + * Helper function to convert hex encoded chars to ascii + * + * @since 3.1.0 + * @access private + * @param array $match the preg_replace_callback matches array + */ +function _wp_iso_convert( $match ) { + return chr( hexdec( strtolower( $match[1] ) ) ); +} + +/** + * Returns a date in the GMT equivalent. + * + * Requires and returns a date in the Y-m-d H:i:s format. Simply subtracts the + * value of the 'gmt_offset' option. Return format can be overridden using the + * $format parameter. The DateTime and DateTimeZone classes are used to respect + * time zone differences in DST. + * + * @since 1.2.0 + * + * @uses get_option() to retrieve the the value of 'gmt_offset'. + * @param string $string The date to be converted. + * @param string $format The format string for the returned date (default is Y-m-d H:i:s) + * @return string GMT version of the date provided. + */ +function get_gmt_from_date($string, $format = 'Y-m-d H:i:s') { + preg_match('#([0-9]{1,4})-([0-9]{1,2})-([0-9]{1,2}) ([0-9]{1,2}):([0-9]{1,2}):([0-9]{1,2})#', $string, $matches); + $tz = get_option('timezone_string'); + if ( $tz ) { + date_default_timezone_set( $tz ); + $datetime = new DateTime( $string ); + $datetime->setTimezone( new DateTimeZone('UTC') ); + $offset = $datetime->getOffset(); + $datetime->modify( '+' . $offset / 3600 . ' hours'); + $string_gmt = gmdate($format, $datetime->format('U')); + + date_default_timezone_set('UTC'); + } else { + $string_time = gmmktime($matches[4], $matches[5], $matches[6], $matches[2], $matches[3], $matches[1]); + $string_gmt = gmdate($format, $string_time - get_option('gmt_offset') * 3600); + } + return $string_gmt; +} + +/** + * Converts a GMT date into the correct format for the blog. + * + * Requires and returns in the Y-m-d H:i:s format. Simply adds the value of + * gmt_offset.Return format can be overridden using the $format parameter + * + * @since 1.2.0 + * + * @param string $string The date to be converted. + * @param string $format The format string for the returned date (default is Y-m-d H:i:s) + * @return string Formatted date relative to the GMT offset. + */ +function get_date_from_gmt($string, $format = 'Y-m-d H:i:s') { + preg_match('#([0-9]{1,4})-([0-9]{1,2})-([0-9]{1,2}) ([0-9]{1,2}):([0-9]{1,2}):([0-9]{1,2})#', $string, $matches); + $string_time = gmmktime($matches[4], $matches[5], $matches[6], $matches[2], $matches[3], $matches[1]); + $string_localtime = gmdate($format, $string_time + get_option('gmt_offset')*3600); + return $string_localtime; +} + +/** + * Computes an offset in seconds from an iso8601 timezone. + * + * @since 1.5.0 + * + * @param string $timezone Either 'Z' for 0 offset or '±hhmm'. + * @return int|float The offset in seconds. + */ +function iso8601_timezone_to_offset($timezone) { + // $timezone is either 'Z' or '[+|-]hhmm' + if ($timezone == 'Z') { + $offset = 0; + } else { + $sign = (substr($timezone, 0, 1) == '+') ? 1 : -1; + $hours = intval(substr($timezone, 1, 2)); + $minutes = intval(substr($timezone, 3, 4)) / 60; + $offset = $sign * 3600 * ($hours + $minutes); + } + return $offset; +} + +/** + * Converts an iso8601 date to MySQL DateTime format used by post_date[_gmt]. + * + * @since 1.5.0 + * + * @param string $date_string Date and time in ISO 8601 format {@link http://en.wikipedia.org/wiki/ISO_8601}. + * @param string $timezone Optional. If set to GMT returns the time minus gmt_offset. Default is 'user'. + * @return string The date and time in MySQL DateTime format - Y-m-d H:i:s. + */ +function iso8601_to_datetime($date_string, $timezone = 'user') { + $timezone = strtolower($timezone); + + if ($timezone == 'gmt') { + + preg_match('#([0-9]{4})([0-9]{2})([0-9]{2})T([0-9]{2}):([0-9]{2}):([0-9]{2})(Z|[\+|\-][0-9]{2,4}){0,1}#', $date_string, $date_bits); + + if (!empty($date_bits[7])) { // we have a timezone, so let's compute an offset + $offset = iso8601_timezone_to_offset($date_bits[7]); + } else { // we don't have a timezone, so we assume user local timezone (not server's!) + $offset = 3600 * get_option('gmt_offset'); + } + + $timestamp = gmmktime($date_bits[4], $date_bits[5], $date_bits[6], $date_bits[2], $date_bits[3], $date_bits[1]); + $timestamp -= $offset; + + return gmdate('Y-m-d H:i:s', $timestamp); + + } else if ($timezone == 'user') { + return preg_replace('#([0-9]{4})([0-9]{2})([0-9]{2})T([0-9]{2}):([0-9]{2}):([0-9]{2})(Z|[\+|\-][0-9]{2,4}){0,1}#', '$1-$2-$3 $4:$5:$6', $date_string); + } +} + +/** + * Adds a element attributes to open links in new windows. + * + * Comment text in popup windows should be filtered through this. Right now it's + * a moderately dumb function, ideally it would detect whether a target or rel + * attribute was already there and adjust its actions accordingly. + * + * @since 0.71 + * + * @param string $text Content to replace links to open in a new window. + * @return string Content that has filtered links. + */ +function popuplinks($text) { + $text = preg_replace('/<a (.+?)>/i', "<a $1 target='_blank' rel='external'>", $text); + return $text; +} + +/** + * Strips out all characters that are not allowable in an email. + * + * @since 1.5.0 + * + * @param string $email Email address to filter. + * @return string Filtered email address. + */ +function sanitize_email( $email ) { + // Test for the minimum length the email can be + if ( strlen( $email ) < 3 ) { + return apply_filters( 'sanitize_email', '', $email, 'email_too_short' ); + } + + // Test for an @ character after the first position + if ( strpos( $email, '@', 1 ) === false ) { + return apply_filters( 'sanitize_email', '', $email, 'email_no_at' ); + } + + // Split out the local and domain parts + list( $local, $domain ) = explode( '@', $email, 2 ); + + // LOCAL PART + // Test for invalid characters + $local = preg_replace( '/[^a-zA-Z0-9!#$%&\'*+\/=?^_`{|}~\.-]/', '', $local ); + if ( '' === $local ) { + return apply_filters( 'sanitize_email', '', $email, 'local_invalid_chars' ); + } + + // DOMAIN PART + // Test for sequences of periods + $domain = preg_replace( '/\.{2,}/', '', $domain ); + if ( '' === $domain ) { + return apply_filters( 'sanitize_email', '', $email, 'domain_period_sequence' ); + } + + // Test for leading and trailing periods and whitespace + $domain = trim( $domain, " \t\n\r\0\x0B." ); + if ( '' === $domain ) { + return apply_filters( 'sanitize_email', '', $email, 'domain_period_limits' ); + } + + // Split the domain into subs + $subs = explode( '.', $domain ); + + // Assume the domain will have at least two subs + if ( 2 > count( $subs ) ) { + return apply_filters( 'sanitize_email', '', $email, 'domain_no_periods' ); + } + + // Create an array that will contain valid subs + $new_subs = array(); + + // Loop through each sub + foreach ( $subs as $sub ) { + // Test for leading and trailing hyphens + $sub = trim( $sub, " \t\n\r\0\x0B-" ); + + // Test for invalid characters + $sub = preg_replace( '/[^a-z0-9-]+/i', '', $sub ); + + // If there's anything left, add it to the valid subs + if ( '' !== $sub ) { + $new_subs[] = $sub; + } + } + + // If there aren't 2 or more valid subs + if ( 2 > count( $new_subs ) ) { + return apply_filters( 'sanitize_email', '', $email, 'domain_no_valid_subs' ); + } + + // Join valid subs into the new domain + $domain = join( '.', $new_subs ); + + // Put the email back together + $email = $local . '@' . $domain; + + // Congratulations your email made it! + return apply_filters( 'sanitize_email', $email, $email, null ); +} + +/** + * Determines the difference between two timestamps. + * + * The difference is returned in a human readable format such as "1 hour", + * "5 mins", "2 days". + * + * @since 1.5.0 + * + * @param int $from Unix timestamp from which the difference begins. + * @param int $to Optional. Unix timestamp to end the time difference. Default becomes time() if not set. + * @return string Human readable time difference. + */ +function human_time_diff( $from, $to = '' ) { + if ( empty($to) ) + $to = time(); + $diff = (int) abs($to - $from); + if ($diff <= 3600) { + $mins = round($diff / 60); + if ($mins <= 1) { + $mins = 1; + } + /* translators: min=minute */ + $since = sprintf(_n('%s min', '%s mins', $mins), $mins); + } else if (($diff <= 86400) && ($diff > 3600)) { + $hours = round($diff / 3600); + if ($hours <= 1) { + $hours = 1; + } + $since = sprintf(_n('%s hour', '%s hours', $hours), $hours); + } elseif ($diff >= 86400) { + $days = round($diff / 86400); + if ($days <= 1) { + $days = 1; + } + $since = sprintf(_n('%s day', '%s days', $days), $days); + } + return $since; +} + +/** + * Generates an excerpt from the content, if needed. + * + * The excerpt word amount will be 55 words and if the amount is greater than + * that, then the string ' [...]' will be appended to the excerpt. If the string + * is less than 55 words, then the content will be returned as is. + * + * The 55 word limit can be modified by plugins/themes using the excerpt_length filter + * The ' [...]' string can be modified by plugins/themes using the excerpt_more filter + * + * @since 1.5.0 + * + * @param string $text The excerpt. If set to empty an excerpt is generated. + * @return string The excerpt. + */ +function wp_trim_excerpt($text) { + $raw_excerpt = $text; + if ( '' == $text ) { + $text = get_the_content(''); + + $text = strip_shortcodes( $text ); + + $text = apply_filters('the_content', $text); + $text = str_replace(']]>', ']]>', $text); + $text = strip_tags($text); + $excerpt_length = apply_filters('excerpt_length', 55); + $excerpt_more = apply_filters('excerpt_more', ' ' . '[...]'); + $words = preg_split("/[\n\r\t ]+/", $text, $excerpt_length + 1, PREG_SPLIT_NO_EMPTY); + if ( count($words) > $excerpt_length ) { + array_pop($words); + $text = implode(' ', $words); + $text = $text . $excerpt_more; + } else { + $text = implode(' ', $words); + } + } + return apply_filters('wp_trim_excerpt', $text, $raw_excerpt); +} + +/** + * Converts named entities into numbered entities. + * + * @since 1.5.1 + * + * @param string $text The text within which entities will be converted. + * @return string Text with converted entities. + */ +function ent2ncr($text) { + $to_ncr = array( + '"' => '"', + '&' => '&', + '⁄' => '/', + '<' => '<', + '>' => '>', + '|' => '|', + ' ' => ' ', + '¡' => '¡', + '¢' => '¢', + '£' => '£', + '¤' => '¤', + '¥' => '¥', + '¦' => '¦', + '&brkbar;' => '¦', + '§' => '§', + '¨' => '¨', + '¨' => '¨', + '©' => '©', + 'ª' => 'ª', + '«' => '«', + '¬' => '¬', + '­' => '­', + '®' => '®', + '¯' => '¯', + '&hibar;' => '¯', + '°' => '°', + '±' => '±', + '²' => '²', + '³' => '³', + '´' => '´', + 'µ' => 'µ', + '¶' => '¶', + '·' => '·', + '¸' => '¸', + '¹' => '¹', + 'º' => 'º', + '»' => '»', + '¼' => '¼', + '½' => '½', + '¾' => '¾', + '¿' => '¿', + 'À' => 'À', + 'Á' => 'Á', + 'Â' => 'Â', + 'Ã' => 'Ã', + 'Ä' => 'Ä', + 'Å' => 'Å', + 'Æ' => 'Æ', + 'Ç' => 'Ç', + 'È' => 'È', + 'É' => 'É', + 'Ê' => 'Ê', + 'Ë' => 'Ë', + 'Ì' => 'Ì', + 'Í' => 'Í', + 'Î' => 'Î', + 'Ï' => 'Ï', + 'Ð' => 'Ð', + 'Ñ' => 'Ñ', + 'Ò' => 'Ò', + 'Ó' => 'Ó', + 'Ô' => 'Ô', + 'Õ' => 'Õ', + 'Ö' => 'Ö', + '×' => '×', + 'Ø' => 'Ø', + 'Ù' => 'Ù', + 'Ú' => 'Ú', + 'Û' => 'Û', + 'Ü' => 'Ü', + 'Ý' => 'Ý', + 'Þ' => 'Þ', + 'ß' => 'ß', + 'à' => 'à', + 'á' => 'á', + 'â' => 'â', + 'ã' => 'ã', + 'ä' => 'ä', + 'å' => 'å', + 'æ' => 'æ', + 'ç' => 'ç', + 'è' => 'è', + 'é' => 'é', + 'ê' => 'ê', + 'ë' => 'ë', + 'ì' => 'ì', + 'í' => 'í', + 'î' => 'î', + 'ï' => 'ï', + 'ð' => 'ð', + 'ñ' => 'ñ', + 'ò' => 'ò', + 'ó' => 'ó', + 'ô' => 'ô', + 'õ' => 'õ', + 'ö' => 'ö', + '÷' => '÷', + 'ø' => 'ø', + 'ù' => 'ù', + 'ú' => 'ú', + 'û' => 'û', + 'ü' => 'ü', + 'ý' => 'ý', + 'þ' => 'þ', + 'ÿ' => 'ÿ', + 'Œ' => 'Œ', + 'œ' => 'œ', + 'Š' => 'Š', + 'š' => 'š', + 'Ÿ' => 'Ÿ', + 'ƒ' => 'ƒ', + 'ˆ' => 'ˆ', + '˜' => '˜', + 'Α' => 'Α', + 'Β' => 'Β', + 'Γ' => 'Γ', + 'Δ' => 'Δ', + 'Ε' => 'Ε', + 'Ζ' => 'Ζ', + 'Η' => 'Η', + 'Θ' => 'Θ', + 'Ι' => 'Ι', + 'Κ' => 'Κ', + 'Λ' => 'Λ', + 'Μ' => 'Μ', + 'Ν' => 'Ν', + 'Ξ' => 'Ξ', + 'Ο' => 'Ο', + 'Π' => 'Π', + 'Ρ' => 'Ρ', + 'Σ' => 'Σ', + 'Τ' => 'Τ', + 'Υ' => 'Υ', + 'Φ' => 'Φ', + 'Χ' => 'Χ', + 'Ψ' => 'Ψ', + 'Ω' => 'Ω', + 'α' => 'α', + 'β' => 'β', + 'γ' => 'γ', + 'δ' => 'δ', + 'ε' => 'ε', + 'ζ' => 'ζ', + 'η' => 'η', + 'θ' => 'θ', + 'ι' => 'ι', + 'κ' => 'κ', + 'λ' => 'λ', + 'μ' => 'μ', + 'ν' => 'ν', + 'ξ' => 'ξ', + 'ο' => 'ο', + 'π' => 'π', + 'ρ' => 'ρ', + 'ς' => 'ς', + 'σ' => 'σ', + 'τ' => 'τ', + 'υ' => 'υ', + 'φ' => 'φ', + 'χ' => 'χ', + 'ψ' => 'ψ', + 'ω' => 'ω', + 'ϑ' => 'ϑ', + 'ϒ' => 'ϒ', + 'ϖ' => 'ϖ', + ' ' => ' ', + ' ' => ' ', + ' ' => ' ', + '‌' => '‌', + '‍' => '‍', + '‎' => '‎', + '‏' => '‏', + '–' => '–', + '—' => '—', + '‘' => '‘', + '’' => '’', + '‚' => '‚', + '“' => '“', + '”' => '”', + '„' => '„', + '†' => '†', + '‡' => '‡', + '•' => '•', + '…' => '…', + '‰' => '‰', + '′' => '′', + '″' => '″', + '‹' => '‹', + '›' => '›', + '‾' => '‾', + '⁄' => '⁄', + '€' => '€', + 'ℑ' => 'ℑ', + '℘' => '℘', + 'ℜ' => 'ℜ', + '™' => '™', + 'ℵ' => 'ℵ', + '↵' => '↵', + '⇐' => '⇐', + '⇑' => '⇑', + '⇒' => '⇒', + '⇓' => '⇓', + '⇔' => '⇔', + '∀' => '∀', + '∂' => '∂', + '∃' => '∃', + '∅' => '∅', + '∇' => '∇', + '∈' => '∈', + '∉' => '∉', + '∋' => '∋', + '∏' => '∏', + '∑' => '∑', + '−' => '−', + '∗' => '∗', + '√' => '√', + '∝' => '∝', + '∞' => '∞', + '∠' => '∠', + '∧' => '∧', + '∨' => '∨', + '∩' => '∩', + '∪' => '∪', + '∫' => '∫', + '∴' => '∴', + '∼' => '∼', + '≅' => '≅', + '≈' => '≈', + '≠' => '≠', + '≡' => '≡', + '≤' => '≤', + '≥' => '≥', + '⊂' => '⊂', + '⊃' => '⊃', + '⊄' => '⊄', + '⊆' => '⊆', + '⊇' => '⊇', + '⊕' => '⊕', + '⊗' => '⊗', + '⊥' => '⊥', + '⋅' => '⋅', + '⌈' => '⌈', + '⌉' => '⌉', + '⌊' => '⌊', + '⌋' => '⌋', + '⟨' => '〈', + '⟩' => '〉', + '←' => '←', + '↑' => '↑', + '→' => '→', + '↓' => '↓', + '↔' => '↔', + '◊' => '◊', + '♠' => '♠', + '♣' => '♣', + '♥' => '♥', + '♦' => '♦' + ); + + return str_replace( array_keys($to_ncr), array_values($to_ncr), $text ); +} + +/** + * Formats text for the rich text editor. + * + * The filter 'richedit_pre' is applied here. If $text is empty the filter will + * be applied to an empty string. + * + * @since 2.0.0 + * + * @param string $text The text to be formatted. + * @return string The formatted text after filter is applied. + */ +function wp_richedit_pre($text) { + // Filtering a blank results in an annoying <br />\n + if ( empty($text) ) return apply_filters('richedit_pre', ''); + + $output = convert_chars($text); + $output = wpautop($output); + $output = htmlspecialchars($output, ENT_NOQUOTES); + + return apply_filters('richedit_pre', $output); +} + +/** + * Formats text for the HTML editor. + * + * Unless $output is empty it will pass through htmlspecialchars before the + * 'htmledit_pre' filter is applied. + * + * @since 2.5.0 + * + * @param string $output The text to be formatted. + * @return string Formatted text after filter applied. + */ +function wp_htmledit_pre($output) { + if ( !empty($output) ) + $output = htmlspecialchars($output, ENT_NOQUOTES); // convert only < > & + + return apply_filters('htmledit_pre', $output); +} + +/** + * Perform a deep string replace operation to ensure the values in $search are no longer present + * + * Repeats the replacement operation until it no longer replaces anything so as to remove "nested" values + * e.g. $subject = '%0%0%0DDD', $search ='%0D', $result ='' rather than the '%0%0DD' that + * str_replace would return + * + * @since 2.8.1 + * @access private + * + * @param string|array $search + * @param string $subject + * @return string The processed string + */ +function _deep_replace( $search, $subject ) { + $found = true; + $subject = (string) $subject; + while ( $found ) { + $found = false; + foreach ( (array) $search as $val ) { + while ( strpos( $subject, $val ) !== false ) { + $found = true; + $subject = str_replace( $val, '', $subject ); + } + } + } + + return $subject; +} + +/** + * Escapes data for use in a MySQL query + * + * This is just a handy shortcut for $wpdb->escape(), for completeness' sake + * + * @since 2.8.0 + * @param string $sql Unescaped SQL data + * @return string The cleaned $sql + */ +function esc_sql( $sql ) { + global $wpdb; + return $wpdb->escape( $sql ); +} + +/** + * Checks and cleans a URL. + * + * A number of characters are removed from the URL. If the URL is for displaying + * (the default behaviour) amperstands are also replaced. The 'clean_url' filter + * is applied to the returned cleaned URL. + * + * @since 2.8.0 + * @uses wp_kses_bad_protocol() To only permit protocols in the URL set + * via $protocols or the common ones set in the function. + * + * @param string $url The URL to be cleaned. + * @param array $protocols Optional. An array of acceptable protocols. + * Defaults to 'http', 'https', 'ftp', 'ftps', 'mailto', 'news', 'irc', 'gopher', 'nntp', 'feed', 'telnet' if not set. + * @param string $_context Private. Use esc_url_raw() for database usage. + * @return string The cleaned $url after the 'clean_url' filter is applied. + */ +function esc_url( $url, $protocols = null, $_context = 'display' ) { + $original_url = $url; + + if ( '' == $url ) + return $url; + $url = preg_replace('|[^a-z0-9-~+_.?#=!&;,/:%@$\|*\'()\\x80-\\xff]|i', '', $url); + $strip = array('%0d', '%0a', '%0D', '%0A'); + $url = _deep_replace($strip, $url); + $url = str_replace(';//', '://', $url); + /* If the URL doesn't appear to contain a scheme, we + * presume it needs http:// appended (unless a relative + * link starting with / or a php file). + */ + if ( strpos($url, ':') === false && + substr( $url, 0, 1 ) != '/' && substr( $url, 0, 1 ) != '#' && !preg_match('/^[a-z0-9-]+?\.php/i', $url) ) + $url = 'http://' . $url; + + // Replace ampersands and single quotes only when displaying. + if ( 'display' == $_context ) { + $url = wp_kses_normalize_entities( $url ); + $url = str_replace( '&', '&', $url ); + $url = str_replace( "'", ''', $url ); + } + + if ( !is_array($protocols) ) + $protocols = array ('http', 'https', 'ftp', 'ftps', 'mailto', 'news', 'irc', 'gopher', 'nntp', 'feed', 'telnet', 'mms', 'rtsp', 'svn'); + if ( wp_kses_bad_protocol( $url, $protocols ) != $url ) + return ''; + + return apply_filters('clean_url', $url, $original_url, $_context); +} + +/** + * Performs esc_url() for database usage. + * + * @since 2.8.0 + * @uses esc_url() + * + * @param string $url The URL to be cleaned. + * @param array $protocols An array of acceptable protocols. + * @return string The cleaned URL. + */ +function esc_url_raw( $url, $protocols = null ) { + return esc_url( $url, $protocols, 'db' ); +} + +/** + * Convert entities, while preserving already-encoded entities. + * + * @link http://www.php.net/htmlentities Borrowed from the PHP Manual user notes. + * + * @since 1.2.2 + * + * @param string $myHTML The text to be converted. + * @return string Converted text. + */ +function htmlentities2($myHTML) { + $translation_table = get_html_translation_table( HTML_ENTITIES, ENT_QUOTES ); + $translation_table[chr(38)] = '&'; + return preg_replace( "/&(?![A-Za-z]{0,4}\w{2,3};|#[0-9]{2,3};)/", "&", strtr($myHTML, $translation_table) ); +} + +/** + * Escape single quotes, htmlspecialchar " < > &, and fix line endings. + * + * Escapes text strings for echoing in JS. It is intended to be used for inline JS + * (in a tag attribute, for example onclick="..."). Note that the strings have to + * be in single quotes. The filter 'js_escape' is also applied here. + * + * @since 2.8.0 + * + * @param string $text The text to be escaped. + * @return string Escaped text. + */ +function esc_js( $text ) { + $safe_text = wp_check_invalid_utf8( $text ); + $safe_text = _wp_specialchars( $safe_text, ENT_COMPAT ); + $safe_text = preg_replace( '/&#(x)?0*(?(1)27|39);?/i', "'", stripslashes( $safe_text ) ); + $safe_text = str_replace( "\r", '', $safe_text ); + $safe_text = str_replace( "\n", '\\n', addslashes( $safe_text ) ); + return apply_filters( 'js_escape', $safe_text, $text ); +} + +/** + * Escaping for HTML blocks. + * + * @since 2.8.0 + * + * @param string $text + * @return string + */ +function esc_html( $text ) { + $safe_text = wp_check_invalid_utf8( $text ); + $safe_text = _wp_specialchars( $safe_text, ENT_QUOTES ); + return apply_filters( 'esc_html', $safe_text, $text ); +} + +/** + * Escaping for HTML attributes. + * + * @since 2.8.0 + * + * @param string $text + * @return string + */ +function esc_attr( $text ) { + $safe_text = wp_check_invalid_utf8( $text ); + $safe_text = _wp_specialchars( $safe_text, ENT_QUOTES ); + return apply_filters( 'attribute_escape', $safe_text, $text ); +} + +/** + * Escaping for textarea values. + * + * @since 3.1 + * + * @param string $text + * @return string + */ +function esc_textarea( $text ) { + $safe_text = htmlspecialchars( $text, ENT_QUOTES ); + return apply_filters( 'esc_textarea', $safe_text, $text ); +} + +/** + * Escape a HTML tag name. + * + * @since 2.5.0 + * + * @param string $tag_name + * @return string + */ +function tag_escape($tag_name) { + $safe_tag = strtolower( preg_replace('/[^a-zA-Z_:]/', '', $tag_name) ); + return apply_filters('tag_escape', $safe_tag, $tag_name); +} + +/** + * Escapes text for SQL LIKE special characters % and _. + * + * @since 2.5.0 + * + * @param string $text The text to be escaped. + * @return string text, safe for inclusion in LIKE query. + */ +function like_escape($text) { + return str_replace(array("%", "_"), array("\\%", "\\_"), $text); +} + +/** + * Convert full URL paths to absolute paths. + * + * Removes the http or https protocols and the domain. Keeps the path '/' at the + * beginning, so it isn't a true relative link, but from the web root base. + * + * @since 2.1.0 + * + * @param string $link Full URL path. + * @return string Absolute path. + */ +function wp_make_link_relative( $link ) { + return preg_replace( '|https?://[^/]+(/.*)|i', '$1', $link ); +} + +/** + * Sanitises various option values based on the nature of the option. + * + * This is basically a switch statement which will pass $value through a number + * of functions depending on the $option. + * + * @since 2.0.5 + * + * @param string $option The name of the option. + * @param string $value The unsanitised value. + * @return string Sanitized value. + */ +function sanitize_option($option, $value) { + + switch ( $option ) { + case 'admin_email': + $value = sanitize_email($value); + if ( !is_email($value) ) { + $value = get_option( $option ); // Resets option to stored value in the case of failed sanitization + if ( function_exists('add_settings_error') ) + add_settings_error('admin_email', 'invalid_admin_email', __('The email address entered did not appear to be a valid email address. Please enter a valid email address.')); + } + break; + case 'new_admin_email': + $value = sanitize_email($value); + if ( !is_email($value) ) { + $value = get_option( $option ); // Resets option to stored value in the case of failed sanitization + if ( function_exists('add_settings_error') ) + add_settings_error('new_admin_email', 'invalid_admin_email', __('The email address entered did not appear to be a valid email address. Please enter a valid email address.')); + } + break; + case 'thumbnail_size_w': + case 'thumbnail_size_h': + case 'medium_size_w': + case 'medium_size_h': + case 'large_size_w': + case 'large_size_h': + case 'embed_size_h': + case 'default_post_edit_rows': + case 'mailserver_port': + case 'comment_max_links': + case 'page_on_front': + case 'page_for_posts': + case 'rss_excerpt_length': + case 'default_category': + case 'default_email_category': + case 'default_link_category': + case 'close_comments_days_old': + case 'comments_per_page': + case 'thread_comments_depth': + case 'users_can_register': + case 'start_of_week': + $value = absint( $value ); + break; + + case 'embed_size_w': + if ( '' !== $value ) + $value = absint( $value ); + break; + + case 'posts_per_page': + case 'posts_per_rss': + $value = (int) $value; + if ( empty($value) ) + $value = 1; + if ( $value < -1 ) + $value = abs($value); + break; + + case 'default_ping_status': + case 'default_comment_status': + // Options that if not there have 0 value but need to be something like "closed" + if ( $value == '0' || $value == '') + $value = 'closed'; + break; + + case 'blogdescription': + case 'blogname': + $value = addslashes($value); + $value = wp_filter_post_kses( $value ); // calls stripslashes then addslashes + $value = stripslashes($value); + $value = esc_html( $value ); + break; + + case 'blog_charset': + $value = preg_replace('/[^a-zA-Z0-9_-]/', '', $value); // strips slashes + break; + + case 'date_format': + case 'time_format': + case 'mailserver_url': + case 'mailserver_login': + case 'mailserver_pass': + case 'ping_sites': + case 'upload_path': + $value = strip_tags($value); + $value = addslashes($value); + $value = wp_filter_kses($value); // calls stripslashes then addslashes + $value = stripslashes($value); + break; + + case 'gmt_offset': + $value = preg_replace('/[^0-9:.-]/', '', $value); // strips slashes + break; + + case 'siteurl': + if ( (bool)preg_match( '#http(s?)://(.+)#i', $value) ) { + $value = esc_url_raw($value); + } else { + $value = get_option( $option ); // Resets option to stored value in the case of failed sanitization + if ( function_exists('add_settings_error') ) + add_settings_error('siteurl', 'invalid_siteurl', __('The WordPress address you entered did not appear to be a valid URL. Please enter a valid URL.')); + } + break; + + case 'home': + if ( (bool)preg_match( '#http(s?)://(.+)#i', $value) ) { + $value = esc_url_raw($value); + } else { + $value = get_option( $option ); // Resets option to stored value in the case of failed sanitization + if ( function_exists('add_settings_error') ) + add_settings_error('home', 'invalid_home', __('The Site address you entered did not appear to be a valid URL. Please enter a valid URL.')); + } + break; + case 'WPLANG': + $allowed = get_available_languages(); + if ( ! in_array( $value, $allowed ) && ! empty( $value ) ) + $value = get_option( $option ); + break; + + case 'timezone_string': + $allowed_zones = timezone_identifiers_list(); + if ( ! in_array( $value, $allowed_zones ) && ! empty( $value ) ) { + $value = get_option( $option ); // Resets option to stored value in the case of failed sanitization + if ( function_exists('add_settings_error') ) + add_settings_error('timezone_string', 'invalid_timezone_string', __('The timezone you have entered is not valid. Please select a valid timezone.') ); + } + break; + + default : + $value = apply_filters("sanitize_option_{$option}", $value, $option); + break; + } + + return $value; +} + +/** + * Parses a string into variables to be stored in an array. + * + * Uses {@link http://www.php.net/parse_str parse_str()} and stripslashes if + * {@link http://www.php.net/magic_quotes magic_quotes_gpc} is on. + * + * @since 2.2.1 + * @uses apply_filters() for the 'wp_parse_str' filter. + * + * @param string $string The string to be parsed. + * @param array $array Variables will be stored in this array. + */ +function wp_parse_str( $string, &$array ) { + parse_str( $string, $array ); + if ( get_magic_quotes_gpc() ) + $array = stripslashes_deep( $array ); + $array = apply_filters( 'wp_parse_str', $array ); +} + +/** + * Convert lone less than signs. + * + * KSES already converts lone greater than signs. + * + * @uses wp_pre_kses_less_than_callback in the callback function. + * @since 2.3.0 + * + * @param string $text Text to be converted. + * @return string Converted text. + */ +function wp_pre_kses_less_than( $text ) { + return preg_replace_callback('%<[^>]*?((?=<)|>|$)%', 'wp_pre_kses_less_than_callback', $text); +} + +/** + * Callback function used by preg_replace. + * + * @uses esc_html to format the $matches text. + * @since 2.3.0 + * + * @param array $matches Populated by matches to preg_replace. + * @return string The text returned after esc_html if needed. + */ +function wp_pre_kses_less_than_callback( $matches ) { + if ( false === strpos($matches[0], '>') ) + return esc_html($matches[0]); + return $matches[0]; +} + +/** + * WordPress implementation of PHP sprintf() with filters. + * + * @since 2.5.0 + * @link http://www.php.net/sprintf + * + * @param string $pattern The string which formatted args are inserted. + * @param mixed $args,... Arguments to be formatted into the $pattern string. + * @return string The formatted string. + */ +function wp_sprintf( $pattern ) { + $args = func_get_args( ); + $len = strlen($pattern); + $start = 0; + $result = ''; + $arg_index = 0; + while ( $len > $start ) { + // Last character: append and break + if ( strlen($pattern) - 1 == $start ) { + $result .= substr($pattern, -1); + break; + } + + // Literal %: append and continue + if ( substr($pattern, $start, 2) == '%%' ) { + $start += 2; + $result .= '%'; + continue; + } + + // Get fragment before next % + $end = strpos($pattern, '%', $start + 1); + if ( false === $end ) + $end = $len; + $fragment = substr($pattern, $start, $end - $start); + + // Fragment has a specifier + if ( $pattern[$start] == '%' ) { + // Find numbered arguments or take the next one in order + if ( preg_match('/^%(\d+)\$/', $fragment, $matches) ) { + $arg = isset($args[$matches[1]]) ? $args[$matches[1]] : ''; + $fragment = str_replace("%{$matches[1]}$", '%', $fragment); + } else { + ++$arg_index; + $arg = isset($args[$arg_index]) ? $args[$arg_index] : ''; + } + + // Apply filters OR sprintf + $_fragment = apply_filters( 'wp_sprintf', $fragment, $arg ); + if ( $_fragment != $fragment ) + $fragment = $_fragment; + else + $fragment = sprintf($fragment, strval($arg) ); + } + + // Append to result and move to next fragment + $result .= $fragment; + $start = $end; + } + return $result; +} + +/** + * Localize list items before the rest of the content. + * + * The '%l' must be at the first characters can then contain the rest of the + * content. The list items will have ', ', ', and', and ' and ' added depending + * on the amount of list items in the $args parameter. + * + * @since 2.5.0 + * + * @param string $pattern Content containing '%l' at the beginning. + * @param array $args List items to prepend to the content and replace '%l'. + * @return string Localized list items and rest of the content. + */ +function wp_sprintf_l($pattern, $args) { + // Not a match + if ( substr($pattern, 0, 2) != '%l' ) + return $pattern; + + // Nothing to work with + if ( empty($args) ) + return ''; + + // Translate and filter the delimiter set (avoid ampersands and entities here) + $l = apply_filters('wp_sprintf_l', array( + /* translators: used between list items, there is a space after the comma */ + 'between' => __(', '), + /* translators: used between list items, there is a space after the and */ + 'between_last_two' => __(', and '), + /* translators: used between only two list items, there is a space after the and */ + 'between_only_two' => __(' and '), + )); + + $args = (array) $args; + $result = array_shift($args); + if ( count($args) == 1 ) + $result .= $l['between_only_two'] . array_shift($args); + // Loop when more than two args + $i = count($args); + while ( $i ) { + $arg = array_shift($args); + $i--; + if ( 0 == $i ) + $result .= $l['between_last_two'] . $arg; + else + $result .= $l['between'] . $arg; + } + return $result . substr($pattern, 2); +} + +/** + * Safely extracts not more than the first $count characters from html string. + * + * UTF-8, tags and entities safe prefix extraction. Entities inside will *NOT* + * be counted as one character. For example & will be counted as 4, < as + * 3, etc. + * + * @since 2.5.0 + * + * @param integer $str String to get the excerpt from. + * @param integer $count Maximum number of characters to take. + * @return string The excerpt. + */ +function wp_html_excerpt( $str, $count ) { + $str = wp_strip_all_tags( $str, true ); + $str = mb_substr( $str, 0, $count ); + // remove part of an entity at the end + $str = preg_replace( '/&[^;\s]{0,6}$/', '', $str ); + return $str; +} + +/** + * Add a Base url to relative links in passed content. + * + * By default it supports the 'src' and 'href' attributes. However this can be + * changed via the 3rd param. + * + * @since 2.7.0 + * + * @param string $content String to search for links in. + * @param string $base The base URL to prefix to links. + * @param array $attrs The attributes which should be processed. + * @return string The processed content. + */ +function links_add_base_url( $content, $base, $attrs = array('src', 'href') ) { + global $_links_add_base; + $_links_add_base = $base; + $attrs = implode('|', (array)$attrs); + return preg_replace_callback( "!($attrs)=(['\"])(.+?)\\2!i", '_links_add_base', $content ); +} + +/** + * Callback to add a base url to relative links in passed content. + * + * @since 2.7.0 + * @access private + * + * @param string $m The matched link. + * @return string The processed link. + */ +function _links_add_base($m) { + global $_links_add_base; + //1 = attribute name 2 = quotation mark 3 = URL + return $m[1] . '=' . $m[2] . + (strpos($m[3], 'http://') === false ? + path_join($_links_add_base, $m[3]) : + $m[3]) + . $m[2]; +} + +/** + * Adds a Target attribute to all links in passed content. + * + * This function by default only applies to <a> tags, however this can be + * modified by the 3rd param. + * + * <b>NOTE:</b> Any current target attributed will be stripped and replaced. + * + * @since 2.7.0 + * + * @param string $content String to search for links in. + * @param string $target The Target to add to the links. + * @param array $tags An array of tags to apply to. + * @return string The processed content. + */ +function links_add_target( $content, $target = '_blank', $tags = array('a') ) { + global $_links_add_target; + $_links_add_target = $target; + $tags = implode('|', (array)$tags); + return preg_replace_callback( "!<($tags)(.+?)>!i", '_links_add_target', $content ); +} + +/** + * Callback to add a target attribute to all links in passed content. + * + * @since 2.7.0 + * @access private + * + * @param string $m The matched link. + * @return string The processed link. + */ +function _links_add_target( $m ) { + global $_links_add_target; + $tag = $m[1]; + $link = preg_replace('|(target=[\'"](.*?)[\'"])|i', '', $m[2]); + return '<' . $tag . $link . ' target="' . esc_attr( $_links_add_target ) . '">'; +} + +// normalize EOL characters and strip duplicate whitespace +function normalize_whitespace( $str ) { + $str = trim($str); + $str = str_replace("\r", "\n", $str); + $str = preg_replace( array( '/\n+/', '/[ \t]+/' ), array( "\n", ' ' ), $str ); + return $str; +} + +/** + * Properly strip all HTML tags including script and style + * + * @since 2.9.0 + * + * @param string $string String containing HTML tags + * @param bool $remove_breaks optional Whether to remove left over line breaks and white space chars + * @return string The processed string. + */ +function wp_strip_all_tags($string, $remove_breaks = false) { + $string = preg_replace( '@<(script|style)[^>]*?>.*?</\\1>@si', '', $string ); + $string = strip_tags($string); + + if ( $remove_breaks ) + $string = preg_replace('/[\r\n\t ]+/', ' ', $string); + + return trim($string); +} + +/** + * 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. + * + * @since 2.9.0 + * + * @param string $str + * @return string + */ +function sanitize_text_field($str) { + $filtered = wp_check_invalid_utf8( $str ); + + 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) ); + } + + $match = array(); + $found = false; + while ( preg_match('/%[a-f0-9]{2}/i', $filtered, $match) ) { + $filtered = str_replace($match[0], '', $filtered); + $found = true; + } + + if ( $found ) { + // Strip out the whitespace that may now exist after removing the octets. + $filtered = trim( preg_replace('/ +/', ' ', $filtered) ); + } + + return apply_filters('sanitize_text_field', $filtered, $str); +} + +/** + * i18n friendly version of basename() + * + * @since 3.1.0 + * + * @param string $path A path. + * @param string $suffix If the filename ends in suffix this will also be cut off. + * @return string + */ +function wp_basename( $path, $suffix = '' ) { + return urldecode( basename( str_replace( '%2F', '/', urlencode( $path ) ), $suffix ) ); +} + +/** + * Forever eliminate "Wordpress" from the planet (or at least the little bit we can influence). + * + * Violating our coding standards for a good function name. + * + * @since 3.0.0 + */ +function capital_P_dangit( $text ) { + // Simple replacement for titles + if ( 'the_title' === current_filter() ) + return str_replace( 'Wordpress', 'WordPress', $text ); + // Still here? Use the more judicious replacement + static $dblq = false; + if ( false === $dblq ) + $dblq = _x('“', 'opening curly quote'); + return str_replace( + array( ' Wordpress', '‘Wordpress', $dblq . 'Wordpress', '>Wordpress', '(Wordpress' ), + array( ' WordPress', '‘WordPress', $dblq . 'WordPress', '>WordPress', '(WordPress' ), + $text ); + +} + +/** + * Sanitize a mime type + * + * @since 3.1.3 + * + * @param string $mime_type Mime type + * @return string Sanitized mime type + */ +function sanitize_mime_type( $mime_type ) { + $sani_mime_type = preg_replace( '/[^-+*.a-zA-Z0-9\/]/', '', $mime_type ); + return apply_filters( 'sanitize_mime_type', $sani_mime_type, $mime_type ); +} + +?> diff --git a/src/wp-includes/functions.php b/src/wp-includes/functions.php new file mode 100644 index 0000000..910bd80 --- /dev/null +++ b/src/wp-includes/functions.php @@ -0,0 +1,4552 @@ +<?php +/** + * Main WordPress API + * + * @package WordPress + */ + +/** + * Converts MySQL DATETIME field to user specified date format. + * + * If $dateformatstring has 'G' value, then gmmktime() function will be used to + * make the time. If $dateformatstring is set to 'U', then mktime() function + * will be used to make the time. + * + * The $translate will only be used, if it is set to true and it is by default + * and if the $wp_locale object has the month and weekday set. + * + * @since 0.71 + * + * @param string $dateformatstring Either 'G', 'U', or php date format. + * @param string $mysqlstring Time from mysql DATETIME field. + * @param bool $translate Optional. Default is true. Will switch format to locale. + * @return string Date formated by $dateformatstring or locale (if available). + */ +function mysql2date( $dateformatstring, $mysqlstring, $translate = true ) { + $m = $mysqlstring; + if ( empty( $m ) ) + return false; + + if ( 'G' == $dateformatstring ) + return strtotime( $m . ' +0000' ); + + $i = strtotime( $m ); + + if ( 'U' == $dateformatstring ) + return $i; + + if ( $translate ) + return date_i18n( $dateformatstring, $i ); + else + return date( $dateformatstring, $i ); +} + +/** + * Retrieve the current time based on specified type. + * + * The 'mysql' type will return the time in the format for MySQL DATETIME field. + * The 'timestamp' type will return the current timestamp. + * + * If $gmt is set to either '1' or 'true', then both types will use GMT time. + * if $gmt is false, the output is adjusted with the GMT offset in the WordPress option. + * + * @since 1.0.0 + * + * @param string $type Either 'mysql' or 'timestamp'. + * @param int|bool $gmt Optional. Whether to use GMT timezone. Default is false. + * @return int|string String if $type is 'gmt', int if $type is 'timestamp'. + */ +function current_time( $type, $gmt = 0 ) { + switch ( $type ) { + case 'mysql': + return ( $gmt ) ? gmdate( 'Y-m-d H:i:s' ) : gmdate( 'Y-m-d H:i:s', ( time() + ( get_option( 'gmt_offset' ) * 3600 ) ) ); + break; + case 'timestamp': + return ( $gmt ) ? time() : time() + ( get_option( 'gmt_offset' ) * 3600 ); + break; + } +} + +/** + * Retrieve the date in localized format, based on timestamp. + * + * If the locale specifies the locale month and weekday, then the locale will + * take over the format for the date. If it isn't, then the date format string + * will be used instead. + * + * @since 0.71 + * + * @param string $dateformatstring Format to display the date. + * @param int $unixtimestamp Optional. Unix timestamp. + * @param bool $gmt Optional, default is false. Whether to convert to GMT for time. + * @return string The date, translated if locale specifies it. + */ +function date_i18n( $dateformatstring, $unixtimestamp = false, $gmt = false ) { + global $wp_locale; + $i = $unixtimestamp; + + if ( false === $i ) { + if ( ! $gmt ) + $i = current_time( 'timestamp' ); + else + $i = time(); + // we should not let date() interfere with our + // specially computed timestamp + $gmt = true; + } + + // store original value for language with untypical grammars + // see http://core.trac.wordpress.org/ticket/9396 + $req_format = $dateformatstring; + + $datefunc = $gmt? 'gmdate' : 'date'; + + if ( ( !empty( $wp_locale->month ) ) && ( !empty( $wp_locale->weekday ) ) ) { + $datemonth = $wp_locale->get_month( $datefunc( 'm', $i ) ); + $datemonth_abbrev = $wp_locale->get_month_abbrev( $datemonth ); + $dateweekday = $wp_locale->get_weekday( $datefunc( 'w', $i ) ); + $dateweekday_abbrev = $wp_locale->get_weekday_abbrev( $dateweekday ); + $datemeridiem = $wp_locale->get_meridiem( $datefunc( 'a', $i ) ); + $datemeridiem_capital = $wp_locale->get_meridiem( $datefunc( 'A', $i ) ); + $dateformatstring = ' '.$dateformatstring; + $dateformatstring = preg_replace( "/([^\\\])D/", "\\1" . backslashit( $dateweekday_abbrev ), $dateformatstring ); + $dateformatstring = preg_replace( "/([^\\\])F/", "\\1" . backslashit( $datemonth ), $dateformatstring ); + $dateformatstring = preg_replace( "/([^\\\])l/", "\\1" . backslashit( $dateweekday ), $dateformatstring ); + $dateformatstring = preg_replace( "/([^\\\])M/", "\\1" . backslashit( $datemonth_abbrev ), $dateformatstring ); + $dateformatstring = preg_replace( "/([^\\\])a/", "\\1" . backslashit( $datemeridiem ), $dateformatstring ); + $dateformatstring = preg_replace( "/([^\\\])A/", "\\1" . backslashit( $datemeridiem_capital ), $dateformatstring ); + + $dateformatstring = substr( $dateformatstring, 1, strlen( $dateformatstring ) -1 ); + } + $timezone_formats = array( 'P', 'I', 'O', 'T', 'Z', 'e' ); + $timezone_formats_re = implode( '|', $timezone_formats ); + if ( preg_match( "/$timezone_formats_re/", $dateformatstring ) ) { + $timezone_string = get_option( 'timezone_string' ); + if ( $timezone_string ) { + $timezone_object = timezone_open( $timezone_string ); + $date_object = date_create( null, $timezone_object ); + foreach( $timezone_formats as $timezone_format ) { + if ( false !== strpos( $dateformatstring, $timezone_format ) ) { + $formatted = date_format( $date_object, $timezone_format ); + $dateformatstring = ' '.$dateformatstring; + $dateformatstring = preg_replace( "/([^\\\])$timezone_format/", "\\1" . backslashit( $formatted ), $dateformatstring ); + $dateformatstring = substr( $dateformatstring, 1, strlen( $dateformatstring ) -1 ); + } + } + } + } + $j = @$datefunc( $dateformatstring, $i ); + // allow plugins to redo this entirely for languages with untypical grammars + $j = apply_filters('date_i18n', $j, $req_format, $i, $gmt); + return $j; +} + +/** + * Convert integer number to format based on the locale. + * + * @since 2.3.0 + * + * @param int $number The number to convert based on locale. + * @param int $decimals Precision of the number of decimal places. + * @return string Converted number in string format. + */ +function number_format_i18n( $number, $decimals = 0 ) { + global $wp_locale; + $formatted = number_format( $number, absint( $decimals ), $wp_locale->number_format['decimal_point'], $wp_locale->number_format['thousands_sep'] ); + return apply_filters( 'number_format_i18n', $formatted ); +} + +/** + * Convert number of bytes largest unit bytes will fit into. + * + * It is easier to read 1kB than 1024 bytes and 1MB than 1048576 bytes. Converts + * number of bytes to human readable number by taking the number of that unit + * that the bytes will go into it. Supports TB value. + * + * Please note that integers in PHP are limited to 32 bits, unless they are on + * 64 bit architecture, then they have 64 bit size. If you need to place the + * larger size then what PHP integer type will hold, then use a string. It will + * be converted to a double, which should always have 64 bit length. + * + * Technically the correct unit names for powers of 1024 are KiB, MiB etc. + * @link http://en.wikipedia.org/wiki/Byte + * + * @since 2.3.0 + * + * @param int|string $bytes Number of bytes. Note max integer size for integers. + * @param int $decimals Precision of number of decimal places. Deprecated. + * @return bool|string False on failure. Number string on success. + */ +function size_format( $bytes, $decimals = 0 ) { + $quant = array( + // ========================= Origin ==== + 'TB' => 1099511627776, // pow( 1024, 4) + 'GB' => 1073741824, // pow( 1024, 3) + 'MB' => 1048576, // pow( 1024, 2) + 'kB' => 1024, // pow( 1024, 1) + 'B ' => 1, // pow( 1024, 0) + ); + foreach ( $quant as $unit => $mag ) + if ( doubleval($bytes) >= $mag ) + return number_format_i18n( $bytes / $mag, $decimals ) . ' ' . $unit; + + return false; +} + +/** + * Get the week start and end from the datetime or date string from mysql. + * + * @since 0.71 + * + * @param string $mysqlstring Date or datetime field type from mysql. + * @param int $start_of_week Optional. Start of the week as an integer. + * @return array Keys are 'start' and 'end'. + */ +function get_weekstartend( $mysqlstring, $start_of_week = '' ) { + $my = substr( $mysqlstring, 0, 4 ); // Mysql string Year + $mm = substr( $mysqlstring, 8, 2 ); // Mysql string Month + $md = substr( $mysqlstring, 5, 2 ); // Mysql string day + $day = mktime( 0, 0, 0, $md, $mm, $my ); // The timestamp for mysqlstring day. + $weekday = date( 'w', $day ); // The day of the week from the timestamp + if ( !is_numeric($start_of_week) ) + $start_of_week = get_option( 'start_of_week' ); + + if ( $weekday < $start_of_week ) + $weekday += 7; + + $start = $day - 86400 * ( $weekday - $start_of_week ); // The most recent week start day on or before $day + $end = $start + 604799; // $start + 7 days - 1 second + return compact( 'start', 'end' ); +} + +/** + * Unserialize value only if it was serialized. + * + * @since 2.0.0 + * + * @param string $original Maybe unserialized original, if is needed. + * @return mixed Unserialized data can be any type. + */ +function maybe_unserialize( $original ) { + if ( is_serialized( $original ) ) // don't attempt to unserialize data that wasn't serialized going in + return @unserialize( $original ); + return $original; +} + +/** + * Check value to find if it was serialized. + * + * If $data is not an string, then returned value will always be false. + * Serialized data is always a string. + * + * @since 2.0.5 + * + * @param mixed $data Value to check to see if was serialized. + * @return bool False if not serialized and true if it was. + */ +function is_serialized( $data ) { + // if it isn't a string, it isn't serialized + if ( ! is_string( $data ) ) + return false; + $data = trim( $data ); + if ( 'N;' == $data ) + return true; + $length = strlen( $data ); + if ( $length < 4 ) + return false; + if ( ':' !== $data[1] ) + return false; + $lastc = $data[$length-1]; + if ( ';' !== $lastc && '}' !== $lastc ) + return false; + $token = $data[0]; + switch ( $token ) { + case 's' : + if ( '"' !== $data[$length-2] ) + return false; + case 'a' : + case 'O' : + return (bool) preg_match( "/^{$token}:[0-9]+:/s", $data ); + case 'b' : + case 'i' : + case 'd' : + return (bool) preg_match( "/^{$token}:[0-9.E-]+;\$/", $data ); + } + return false; +} + +/** + * Check whether serialized data is of string type. + * + * @since 2.0.5 + * + * @param mixed $data Serialized data + * @return bool False if not a serialized string, true if it is. + */ +function is_serialized_string( $data ) { + // if it isn't a string, it isn't a serialized string + if ( !is_string( $data ) ) + return false; + $data = trim( $data ); + $length = strlen( $data ); + if ( $length < 4 ) + return false; + elseif ( ':' !== $data[1] ) + return false; + elseif ( ';' !== $data[$length-1] ) + return false; + elseif ( $data[0] !== 's' ) + return false; + elseif ( '"' !== $data[$length-2] ) + return false; + else + return true; +} + +/** + * Retrieve option value based on name of option. + * + * If the option does not exist or does not have a value, then the return value + * will be false. This is useful to check whether you need to install an option + * and is commonly used during installation of plugin options and to test + * whether upgrading is required. + * + * If the option was serialized then it will be unserialized when it is returned. + * + * @since 1.5.0 + * @package WordPress + * @subpackage Option + * @uses apply_filters() Calls 'pre_option_$option' before checking the option. + * Any value other than false will "short-circuit" the retrieval of the option + * and return the returned value. You should not try to override special options, + * but you will not be prevented from doing so. + * @uses apply_filters() Calls 'option_$option', after checking the option, with + * the option value. + * + * @param string $option Name of option to retrieve. Expected to not be SQL-escaped. + * @return mixed Value set for the option. + */ +function get_option( $option, $default = false ) { + global $wpdb; + + // Allow plugins to short-circuit options. + $pre = apply_filters( 'pre_option_' . $option, false ); + if ( false !== $pre ) + return $pre; + + $option = trim($option); + if ( empty($option) ) + return false; + + if ( defined( 'WP_SETUP_CONFIG' ) ) + return false; + + if ( ! defined( 'WP_INSTALLING' ) ) { + // prevent non-existent options from triggering multiple queries + $notoptions = wp_cache_get( 'notoptions', 'options' ); + if ( isset( $notoptions[$option] ) ) + return $default; + + $alloptions = wp_load_alloptions(); + + if ( isset( $alloptions[$option] ) ) { + $value = $alloptions[$option]; + } else { + $value = wp_cache_get( $option, 'options' ); + + if ( false === $value ) { + $row = $wpdb->get_row( $wpdb->prepare( "SELECT option_value FROM $wpdb->options WHERE option_name = %s LIMIT 1", $option ) ); + + // Has to be get_row instead of get_var because of funkiness with 0, false, null values + if ( is_object( $row ) ) { + $value = $row->option_value; + wp_cache_add( $option, $value, 'options' ); + } else { // option does not exist, so we must cache its non-existence + $notoptions[$option] = true; + wp_cache_set( 'notoptions', $notoptions, 'options' ); + return $default; + } + } + } + } else { + $suppress = $wpdb->suppress_errors(); + $row = $wpdb->get_row( $wpdb->prepare( "SELECT option_value FROM $wpdb->options WHERE option_name = %s LIMIT 1", $option ) ); + $wpdb->suppress_errors( $suppress ); + if ( is_object( $row ) ) + $value = $row->option_value; + else + return $default; + } + + // If home is not set use siteurl. + if ( 'home' == $option && '' == $value ) + return get_option( 'siteurl' ); + + if ( in_array( $option, array('siteurl', 'home', 'category_base', 'tag_base') ) ) + $value = untrailingslashit( $value ); + + return apply_filters( 'option_' . $option, maybe_unserialize( $value ) ); +} + +/** + * Protect WordPress special option from being modified. + * + * Will die if $option is in protected list. Protected options are 'alloptions' + * and 'notoptions' options. + * + * @since 2.2.0 + * @package WordPress + * @subpackage Option + * + * @param string $option Option name. + */ +function wp_protect_special_option( $option ) { + $protected = array( 'alloptions', 'notoptions' ); + if ( in_array( $option, $protected ) ) + wp_die( sprintf( __( '%s is a protected WP option and may not be modified' ), esc_html( $option ) ) ); +} + +/** + * Print option value after sanitizing for forms. + * + * @uses attr Sanitizes value. + * @since 1.5.0 + * @package WordPress + * @subpackage Option + * + * @param string $option Option name. + */ +function form_option( $option ) { + echo esc_attr( get_option( $option ) ); +} + +/** + * Loads and caches all autoloaded options, if available or all options. + * + * @since 2.2.0 + * @package WordPress + * @subpackage Option + * + * @return array List of all options. + */ +function wp_load_alloptions() { + global $wpdb; + + if ( !defined( 'WP_INSTALLING' ) || !is_multisite() ) + $alloptions = wp_cache_get( 'alloptions', 'options' ); + else + $alloptions = false; + + if ( !$alloptions ) { + $suppress = $wpdb->suppress_errors(); + if ( !$alloptions_db = $wpdb->get_results( "SELECT option_name, option_value FROM $wpdb->options WHERE autoload = 'yes'" ) ) + $alloptions_db = $wpdb->get_results( "SELECT option_name, option_value FROM $wpdb->options" ); + $wpdb->suppress_errors($suppress); + $alloptions = array(); + foreach ( (array) $alloptions_db as $o ) { + $alloptions[$o->option_name] = $o->option_value; + } + if ( !defined( 'WP_INSTALLING' ) || !is_multisite() ) + wp_cache_add( 'alloptions', $alloptions, 'options' ); + } + + return $alloptions; +} + +/** + * Loads and caches certain often requested site options if is_multisite() and a peristent cache is not being used. + * + * @since 3.0.0 + * @package WordPress + * @subpackage Option + * + * @param int $site_id Optional site ID for which to query the options. Defaults to the current site. + */ +function wp_load_core_site_options( $site_id = null ) { + global $wpdb, $_wp_using_ext_object_cache; + + if ( !is_multisite() || $_wp_using_ext_object_cache || defined( 'WP_INSTALLING' ) ) + return; + + if ( empty($site_id) ) + $site_id = $wpdb->siteid; + + $core_options = array('site_name', 'siteurl', 'active_sitewide_plugins', '_site_transient_timeout_theme_roots', '_site_transient_theme_roots', 'site_admins', 'can_compress_scripts', 'global_terms_enabled' ); + + $core_options_in = "'" . implode("', '", $core_options) . "'"; + $options = $wpdb->get_results( $wpdb->prepare("SELECT meta_key, meta_value FROM $wpdb->sitemeta WHERE meta_key IN ($core_options_in) AND site_id = %d", $site_id) ); + + foreach ( $options as $option ) { + $key = $option->meta_key; + $cache_key = "{$site_id}:$key"; + $option->meta_value = maybe_unserialize( $option->meta_value ); + + wp_cache_set( $cache_key, $option->meta_value, 'site-options' ); + } +} + +/** + * Update the value of an option that was already added. + * + * You do not need to serialize values. If the value needs to be serialized, then + * it will be serialized before it is inserted into the database. Remember, + * resources can not be serialized or added as an option. + * + * If the option does not exist, then the option will be added with the option + * value, but you will not be able to set whether it is autoloaded. If you want + * to set whether an option is autoloaded, then you need to use the add_option(). + * + * @since 1.0.0 + * @package WordPress + * @subpackage Option + * + * @uses apply_filters() Calls 'pre_update_option_$option' hook to allow overwriting the + * option value to be stored. + * @uses do_action() Calls 'update_option' hook before updating the option. + * @uses do_action() Calls 'update_option_$option' and 'updated_option' hooks on success. + * + * @param string $option Option name. Expected to not be SQL-escaped. + * @param mixed $newvalue Option value. Expected to not be SQL-escaped. + * @return bool False if value was not updated and true if value was updated. + */ +function update_option( $option, $newvalue ) { + global $wpdb; + + $option = trim($option); + if ( empty($option) ) + return false; + + wp_protect_special_option( $option ); + + if ( is_object($newvalue) ) + $newvalue = clone $newvalue; + + $newvalue = sanitize_option( $option, $newvalue ); + $oldvalue = get_option( $option ); + $newvalue = apply_filters( 'pre_update_option_' . $option, $newvalue, $oldvalue ); + + // If the new and old values are the same, no need to update. + if ( $newvalue === $oldvalue ) + return false; + + if ( false === $oldvalue ) + return add_option( $option, $newvalue ); + + $notoptions = wp_cache_get( 'notoptions', 'options' ); + if ( is_array( $notoptions ) && isset( $notoptions[$option] ) ) { + unset( $notoptions[$option] ); + wp_cache_set( 'notoptions', $notoptions, 'options' ); + } + + $_newvalue = $newvalue; + $newvalue = maybe_serialize( $newvalue ); + + do_action( 'update_option', $option, $oldvalue, $_newvalue ); + if ( ! defined( 'WP_INSTALLING' ) ) { + $alloptions = wp_load_alloptions(); + if ( isset( $alloptions[$option] ) ) { + $alloptions[$option] = $_newvalue; + wp_cache_set( 'alloptions', $alloptions, 'options' ); + } else { + wp_cache_set( $option, $_newvalue, 'options' ); + } + } + + $result = $wpdb->update( $wpdb->options, array( 'option_value' => $newvalue ), array( 'option_name' => $option ) ); + + if ( $result ) { + do_action( "update_option_{$option}", $oldvalue, $_newvalue ); + do_action( 'updated_option', $option, $oldvalue, $_newvalue ); + return true; + } + return false; +} + +/** + * Add a new option. + * + * You do not need to serialize values. If the value needs to be serialized, then + * it will be serialized before it is inserted into the database. Remember, + * resources can not be serialized or added as an option. + * + * You can create options without values and then add values later. Does not + * check whether the option has already been added, but does check that you + * aren't adding a protected WordPress option. Care should be taken to not name + * options the same as the ones which are protected and to not add options + * that were already added. + * + * @package WordPress + * @subpackage Option + * @since 1.0.0 + * + * @uses do_action() Calls 'add_option' hook before adding the option. + * @uses do_action() Calls 'add_option_$option' and 'added_option' hooks on success. + * + * @param string $option Name of option to add. Expected to not be SQL-escaped. + * @param mixed $value Optional. Option value, can be anything. Expected to not be SQL-escaped. + * @param mixed $deprecated Optional. Description. Not used anymore. + * @param bool $autoload Optional. Default is enabled. Whether to load the option when WordPress starts up. + * @return null returns when finished. + */ +function add_option( $option, $value = '', $deprecated = '', $autoload = 'yes' ) { + global $wpdb; + + if ( !empty( $deprecated ) ) + _deprecated_argument( __FUNCTION__, '2.3' ); + + $option = trim($option); + if ( empty($option) ) + return false; + + wp_protect_special_option( $option ); + + if ( is_object($value) ) + $value = clone $value; + + $value = sanitize_option( $option, $value ); + + // Make sure the option doesn't already exist. We can check the 'notoptions' cache before we ask for a db query + $notoptions = wp_cache_get( 'notoptions', 'options' ); + if ( !is_array( $notoptions ) || !isset( $notoptions[$option] ) ) + if ( false !== get_option( $option ) ) + return; + + $_value = $value; + $value = maybe_serialize( $value ); + $autoload = ( 'no' === $autoload ) ? 'no' : 'yes'; + do_action( 'add_option', $option, $_value ); + if ( ! defined( 'WP_INSTALLING' ) ) { + if ( 'yes' == $autoload ) { + $alloptions = wp_load_alloptions(); + $alloptions[$option] = $value; + wp_cache_set( 'alloptions', $alloptions, 'options' ); + } else { + wp_cache_set( $option, $value, 'options' ); + } + } + + // This option exists now + $notoptions = wp_cache_get( 'notoptions', 'options' ); // yes, again... we need it to be fresh + if ( is_array( $notoptions ) && isset( $notoptions[$option] ) ) { + unset( $notoptions[$option] ); + wp_cache_set( 'notoptions', $notoptions, 'options' ); + } + + $result = $wpdb->query( $wpdb->prepare( "INSERT INTO `$wpdb->options` (`option_name`, `option_value`, `autoload`) VALUES (%s, %s, %s) ON DUPLICATE KEY UPDATE `option_name` = VALUES(`option_name`), `option_value` = VALUES(`option_value`), `autoload` = VALUES(`autoload`)", $option, $value, $autoload ) ); + + if ( $result ) { + do_action( "add_option_{$option}", $option, $_value ); + do_action( 'added_option', $option, $_value ); + return true; + } + return false; +} + +/** + * Removes option by name. Prevents removal of protected WordPress options. + * + * @package WordPress + * @subpackage Option + * @since 1.2.0 + * + * @uses do_action() Calls 'delete_option' hook before option is deleted. + * @uses do_action() Calls 'deleted_option' and 'delete_option_$option' hooks on success. + * + * @param string $option Name of option to remove. Expected to not be SQL-escaped. + * @return bool True, if option is successfully deleted. False on failure. + */ +function delete_option( $option ) { + global $wpdb; + + wp_protect_special_option( $option ); + + // Get the ID, if no ID then return + $row = $wpdb->get_row( $wpdb->prepare( "SELECT autoload FROM $wpdb->options WHERE option_name = %s", $option ) ); + if ( is_null( $row ) ) + return false; + do_action( 'delete_option', $option ); + $result = $wpdb->query( $wpdb->prepare( "DELETE FROM $wpdb->options WHERE option_name = %s", $option) ); + if ( ! defined( 'WP_INSTALLING' ) ) { + if ( 'yes' == $row->autoload ) { + $alloptions = wp_load_alloptions(); + if ( is_array( $alloptions ) && isset( $alloptions[$option] ) ) { + unset( $alloptions[$option] ); + wp_cache_set( 'alloptions', $alloptions, 'options' ); + } + } else { + wp_cache_delete( $option, 'options' ); + } + } + if ( $result ) { + do_action( "delete_option_$option", $option ); + do_action( 'deleted_option', $option ); + return true; + } + return false; +} + +/** + * Delete a transient + * + * @since 2.8.0 + * @package WordPress + * @subpackage Transient + * + * @uses do_action() Calls 'delete_transient_$transient' hook before transient is deleted. + * @uses do_action() Calls 'deleted_transient' hook on success. + * + * @param string $transient Transient name. Expected to not be SQL-escaped. + * @return bool true if successful, false otherwise + */ +function delete_transient( $transient ) { + global $_wp_using_ext_object_cache; + + do_action( 'delete_transient_' . $transient, $transient ); + + if ( $_wp_using_ext_object_cache ) { + $result = wp_cache_delete( $transient, 'transient' ); + } else { + $option_timeout = '_transient_timeout_' . $transient; + $option = '_transient_' . $transient; + $result = delete_option( $option ); + if ( $result ) + delete_option( $option_timeout ); + } + + if ( $result ) + do_action( 'deleted_transient', $transient ); + return $result; +} + +/** + * Get the value of a transient + * + * If the transient does not exist or does not have a value, then the return value + * will be false. + * + * @uses apply_filters() Calls 'pre_transient_$transient' hook before checking the transient. + * Any value other than false will "short-circuit" the retrieval of the transient + * and return the returned value. + * @uses apply_filters() Calls 'transient_$option' hook, after checking the transient, with + * the transient value. + * + * @since 2.8.0 + * @package WordPress + * @subpackage Transient + * + * @param string $transient Transient name. Expected to not be SQL-escaped + * @return mixed Value of transient + */ +function get_transient( $transient ) { + global $_wp_using_ext_object_cache; + + $pre = apply_filters( 'pre_transient_' . $transient, false ); + if ( false !== $pre ) + return $pre; + + if ( $_wp_using_ext_object_cache ) { + $value = wp_cache_get( $transient, 'transient' ); + } else { + $transient_option = '_transient_' . $transient; + if ( ! defined( 'WP_INSTALLING' ) ) { + // If option is not in alloptions, it is not autoloaded and thus has a timeout + $alloptions = wp_load_alloptions(); + if ( !isset( $alloptions[$transient_option] ) ) { + $transient_timeout = '_transient_timeout_' . $transient; + if ( get_option( $transient_timeout ) < time() ) { + delete_option( $transient_option ); + delete_option( $transient_timeout ); + return false; + } + } + } + + $value = get_option( $transient_option ); + } + + return apply_filters( 'transient_' . $transient, $value ); +} + +/** + * Set/update the value of a transient + * + * You do not need to serialize values. If the value needs to be serialized, then + * it will be serialized before it is set. + * + * @since 2.8.0 + * @package WordPress + * @subpackage Transient + * + * @uses apply_filters() Calls 'pre_set_transient_$transient' hook to allow overwriting the + * transient value to be stored. + * @uses do_action() Calls 'set_transient_$transient' and 'setted_transient' hooks on success. + * + * @param string $transient Transient name. Expected to not be SQL-escaped. + * @param mixed $value Transient value. Expected to not be SQL-escaped. + * @param int $expiration Time until expiration in seconds, default 0 + * @return bool False if value was not set and true if value was set. + */ +function set_transient( $transient, $value, $expiration = 0 ) { + global $_wp_using_ext_object_cache; + + $value = apply_filters( 'pre_set_transient_' . $transient, $value ); + + if ( $_wp_using_ext_object_cache ) { + $result = wp_cache_set( $transient, $value, 'transient', $expiration ); + } else { + $transient_timeout = '_transient_timeout_' . $transient; + $transient = '_transient_' . $transient; + if ( false === get_option( $transient ) ) { + $autoload = 'yes'; + if ( $expiration ) { + $autoload = 'no'; + add_option( $transient_timeout, time() + $expiration, '', 'no' ); + } + $result = add_option( $transient, $value, '', $autoload ); + } else { + if ( $expiration ) + update_option( $transient_timeout, time() + $expiration ); + $result = update_option( $transient, $value ); + } + } + if ( $result ) { + do_action( 'set_transient_' . $transient ); + do_action( 'setted_transient', $transient ); + } + return $result; +} + +/** + * Saves and restores user interface settings stored in a cookie. + * + * Checks if the current user-settings cookie is updated and stores it. When no + * cookie exists (different browser used), adds the last saved cookie restoring + * the settings. + * + * @package WordPress + * @subpackage Option + * @since 2.7.0 + */ +function wp_user_settings() { + + if ( ! is_admin() ) + return; + + if ( defined('DOING_AJAX') ) + return; + + if ( ! $user = wp_get_current_user() ) + return; + + $settings = get_user_option( 'user-settings', $user->ID ); + + if ( isset( $_COOKIE['wp-settings-' . $user->ID] ) ) { + $cookie = preg_replace( '/[^A-Za-z0-9=&_]/', '', $_COOKIE['wp-settings-' . $user->ID] ); + + if ( ! empty( $cookie ) && strpos( $cookie, '=' ) ) { + if ( $cookie == $settings ) + return; + + $last_time = (int) get_user_option( 'user-settings-time', $user->ID ); + $saved = isset( $_COOKIE['wp-settings-time-' . $user->ID]) ? preg_replace( '/[^0-9]/', '', $_COOKIE['wp-settings-time-' . $user->ID] ) : 0; + + if ( $saved > $last_time ) { + update_user_option( $user->ID, 'user-settings', $cookie, false ); + update_user_option( $user->ID, 'user-settings-time', time() - 5, false ); + return; + } + } + } + + setcookie( 'wp-settings-' . $user->ID, $settings, time() + 31536000, SITECOOKIEPATH ); + setcookie( 'wp-settings-time-' . $user->ID, time(), time() + 31536000, SITECOOKIEPATH ); + $_COOKIE['wp-settings-' . $user->ID] = $settings; +} + +/** + * Retrieve user interface setting value based on setting name. + * + * @package WordPress + * @subpackage Option + * @since 2.7.0 + * + * @param string $name The name of the setting. + * @param string $default Optional default value to return when $name is not set. + * @return mixed the last saved user setting or the default value/false if it doesn't exist. + */ +function get_user_setting( $name, $default = false ) { + + $all = get_all_user_settings(); + + return isset($all[$name]) ? $all[$name] : $default; +} + +/** + * Add or update user interface setting. + * + * Both $name and $value can contain only ASCII letters, numbers and underscores. + * This function has to be used before any output has started as it calls setcookie(). + * + * @package WordPress + * @subpackage Option + * @since 2.8.0 + * + * @param string $name The name of the setting. + * @param string $value The value for the setting. + * @return bool true if set successfully/false if not. + */ +function set_user_setting( $name, $value ) { + + if ( headers_sent() ) + return false; + + $all = get_all_user_settings(); + $name = preg_replace( '/[^A-Za-z0-9_]+/', '', $name ); + + if ( empty($name) ) + return false; + + $all[$name] = $value; + + return wp_set_all_user_settings($all); +} + +/** + * Delete user interface settings. + * + * Deleting settings would reset them to the defaults. + * This function has to be used before any output has started as it calls setcookie(). + * + * @package WordPress + * @subpackage Option + * @since 2.7.0 + * + * @param mixed $names The name or array of names of the setting to be deleted. + * @return bool true if deleted successfully/false if not. + */ +function delete_user_setting( $names ) { + + if ( headers_sent() ) + return false; + + $all = get_all_user_settings(); + $names = (array) $names; + + foreach ( $names as $name ) { + if ( isset($all[$name]) ) { + unset($all[$name]); + $deleted = true; + } + } + + if ( isset($deleted) ) + return wp_set_all_user_settings($all); + + return false; +} + +/** + * Retrieve all user interface settings. + * + * @package WordPress + * @subpackage Option + * @since 2.7.0 + * + * @return array the last saved user settings or empty array. + */ +function get_all_user_settings() { + global $_updated_user_settings; + + if ( ! $user = wp_get_current_user() ) + return array(); + + if ( isset($_updated_user_settings) && is_array($_updated_user_settings) ) + return $_updated_user_settings; + + $all = array(); + if ( isset($_COOKIE['wp-settings-' . $user->ID]) ) { + $cookie = preg_replace( '/[^A-Za-z0-9=&_]/', '', $_COOKIE['wp-settings-' . $user->ID] ); + + if ( $cookie && strpos($cookie, '=') ) // the '=' cannot be 1st char + parse_str($cookie, $all); + + } else { + $option = get_user_option('user-settings', $user->ID); + if ( $option && is_string($option) ) + parse_str( $option, $all ); + } + + return $all; +} + +/** + * Private. Set all user interface settings. + * + * @package WordPress + * @subpackage Option + * @since 2.8.0 + * + * @param unknown $all + * @return bool + */ +function wp_set_all_user_settings($all) { + global $_updated_user_settings; + + if ( ! $user = wp_get_current_user() ) + return false; + + $_updated_user_settings = $all; + $settings = ''; + foreach ( $all as $k => $v ) { + $v = preg_replace( '/[^A-Za-z0-9_]+/', '', $v ); + $settings .= $k . '=' . $v . '&'; + } + + $settings = rtrim($settings, '&'); + + update_user_option( $user->ID, 'user-settings', $settings, false ); + update_user_option( $user->ID, 'user-settings-time', time(), false ); + + return true; +} + +/** + * Delete the user settings of the current user. + * + * @package WordPress + * @subpackage Option + * @since 2.7.0 + */ +function delete_all_user_settings() { + if ( ! $user = wp_get_current_user() ) + return; + + update_user_option( $user->ID, 'user-settings', '', false ); + setcookie('wp-settings-' . $user->ID, ' ', time() - 31536000, SITECOOKIEPATH); +} + +/** + * Serialize data, if needed. + * + * @since 2.0.5 + * + * @param mixed $data Data that might be serialized. + * @return mixed A scalar data + */ +function maybe_serialize( $data ) { + if ( is_array( $data ) || is_object( $data ) ) + return serialize( $data ); + + if ( is_serialized( $data ) ) + return serialize( $data ); + + return $data; +} + +/** + * Retrieve post title from XMLRPC XML. + * + * If the title element is not part of the XML, then the default post title from + * the $post_default_title will be used instead. + * + * @package WordPress + * @subpackage XMLRPC + * @since 0.71 + * + * @global string $post_default_title Default XMLRPC post title. + * + * @param string $content XMLRPC XML Request content + * @return string Post title + */ +function xmlrpc_getposttitle( $content ) { + global $post_default_title; + if ( preg_match( '/<title>(.+?)<\/title>/is', $content, $matchtitle ) ) { + $post_title = $matchtitle[1]; + } else { + $post_title = $post_default_title; + } + return $post_title; +} + +/** + * Retrieve the post category or categories from XMLRPC XML. + * + * If the category element is not found, then the default post category will be + * used. The return type then would be what $post_default_category. If the + * category is found, then it will always be an array. + * + * @package WordPress + * @subpackage XMLRPC + * @since 0.71 + * + * @global string $post_default_category Default XMLRPC post category. + * + * @param string $content XMLRPC XML Request content + * @return string|array List of categories or category name. + */ +function xmlrpc_getpostcategory( $content ) { + global $post_default_category; + if ( preg_match( '/<category>(.+?)<\/category>/is', $content, $matchcat ) ) { + $post_category = trim( $matchcat[1], ',' ); + $post_category = explode( ',', $post_category ); + } else { + $post_category = $post_default_category; + } + return $post_category; +} + +/** + * XMLRPC XML content without title and category elements. + * + * @package WordPress + * @subpackage XMLRPC + * @since 0.71 + * + * @param string $content XMLRPC XML Request content + * @return string XMLRPC XML Request content without title and category elements. + */ +function xmlrpc_removepostdata( $content ) { + $content = preg_replace( '/<title>(.+?)<\/title>/si', '', $content ); + $content = preg_replace( '/<category>(.+?)<\/category>/si', '', $content ); + $content = trim( $content ); + return $content; +} + +/** + * Open the file handle for debugging. + * + * This function is used for XMLRPC feature, but it is general purpose enough + * to be used in anywhere. + * + * @see fopen() for mode options. + * @package WordPress + * @subpackage Debug + * @since 0.71 + * @uses $debug Used for whether debugging is enabled. + * + * @param string $filename File path to debug file. + * @param string $mode Same as fopen() mode parameter. + * @return bool|resource File handle. False on failure. + */ +function debug_fopen( $filename, $mode ) { + global $debug; + if ( 1 == $debug ) { + $fp = fopen( $filename, $mode ); + return $fp; + } else { + return false; + } +} + +/** + * Write contents to the file used for debugging. + * + * Technically, this can be used to write to any file handle when the global + * $debug is set to 1 or true. + * + * @package WordPress + * @subpackage Debug + * @since 0.71 + * @uses $debug Used for whether debugging is enabled. + * + * @param resource $fp File handle for debugging file. + * @param string $string Content to write to debug file. + */ +function debug_fwrite( $fp, $string ) { + global $debug; + if ( 1 == $debug ) + fwrite( $fp, $string ); +} + +/** + * Close the debugging file handle. + * + * Technically, this can be used to close any file handle when the global $debug + * is set to 1 or true. + * + * @package WordPress + * @subpackage Debug + * @since 0.71 + * @uses $debug Used for whether debugging is enabled. + * + * @param resource $fp Debug File handle. + */ +function debug_fclose( $fp ) { + global $debug; + if ( 1 == $debug ) + fclose( $fp ); +} + +/** + * Check content for video and audio links to add as enclosures. + * + * Will not add enclosures that have already been added and will + * remove enclosures that are no longer in the post. This is called as + * pingbacks and trackbacks. + * + * @package WordPress + * @since 1.5.0 + * + * @uses $wpdb + * + * @param string $content Post Content + * @param int $post_ID Post ID + */ +function do_enclose( $content, $post_ID ) { + global $wpdb; + + //TODO: Tidy this ghetto code up and make the debug code optional + include_once( ABSPATH . WPINC . '/class-IXR.php' ); + + $log = debug_fopen( ABSPATH . 'enclosures.log', 'a' ); + $post_links = array(); + debug_fwrite( $log, 'BEGIN ' . date( 'YmdHis', time() ) . "\n" ); + + $pung = get_enclosed( $post_ID ); + + $ltrs = '\w'; + $gunk = '/#~:.?+=&%@!\-'; + $punc = '.:?\-'; + $any = $ltrs . $gunk . $punc; + + preg_match_all( "{\b http : [$any] +? (?= [$punc] * [^$any] | $)}x", $content, $post_links_temp ); + + debug_fwrite( $log, 'Post contents:' ); + debug_fwrite( $log, $content . "\n" ); + + foreach ( $pung as $link_test ) { + if ( !in_array( $link_test, $post_links_temp[0] ) ) { // link no longer in post + $mid = $wpdb->get_col( $wpdb->prepare("SELECT meta_id FROM $wpdb->postmeta WHERE post_id = %d AND meta_key = 'enclosure' AND meta_value LIKE (%s)", $post_ID, like_escape( $link_test ) . '%') ); + do_action( 'delete_postmeta', $mid ); + $wpdb->query( $wpdb->prepare("DELETE FROM $wpdb->postmeta WHERE meta_id IN(%s)", implode( ',', $mid ) ) ); + do_action( 'deleted_postmeta', $mid ); + } + } + + foreach ( (array) $post_links_temp[0] as $link_test ) { + if ( !in_array( $link_test, $pung ) ) { // If we haven't pung it already + $test = @parse_url( $link_test ); + if ( false === $test ) + continue; + if ( isset( $test['query'] ) ) + $post_links[] = $link_test; + elseif ( isset($test['path']) && ( $test['path'] != '/' ) && ($test['path'] != '' ) ) + $post_links[] = $link_test; + } + } + + foreach ( (array) $post_links as $url ) { + if ( $url != '' && !$wpdb->get_var( $wpdb->prepare( "SELECT post_id FROM $wpdb->postmeta WHERE post_id = %d AND meta_key = 'enclosure' AND meta_value LIKE (%s)", $post_ID, like_escape( $url ) . '%' ) ) ) { + + if ( $headers = wp_get_http_headers( $url) ) { + $len = (int) $headers['content-length']; + $type = $headers['content-type']; + $allowed_types = array( 'video', 'audio' ); + + // Check to see if we can figure out the mime type from + // the extension + $url_parts = @parse_url( $url ); + if ( false !== $url_parts ) { + $extension = pathinfo( $url_parts['path'], PATHINFO_EXTENSION ); + if ( !empty( $extension ) ) { + foreach ( get_allowed_mime_types( ) as $exts => $mime ) { + if ( preg_match( '!^(' . $exts . ')$!i', $extension ) ) { + $type = $mime; + break; + } + } + } + } + + if ( in_array( substr( $type, 0, strpos( $type, "/" ) ), $allowed_types ) ) { + $meta_value = "$url\n$len\n$type\n"; + $wpdb->insert($wpdb->postmeta, array('post_id' => $post_ID, 'meta_key' => 'enclosure', 'meta_value' => $meta_value) ); + do_action( 'added_postmeta', $wpdb->insert_id, $post_ID, 'enclosure', $meta_value ); + } + } + } + } +} + +/** + * 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 + * + * @param string $url URL to fetch. + * @param string|bool $file_path Optional. File path to write request to. + * @param int $red (private) The number of Redirects followed, Upon 5 being hit, returns false. + * @return bool|string False on failure and string of headers if HEAD request. + */ +function wp_get_http( $url, $file_path = false, $red = 1 ) { + @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_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; +} + +/** + * Retrieve HTTP Headers from URL. + * + * @since 1.5.1 + * + * @param string $url + * @param bool $deprecated Not Used. + * @return bool|string False on failure, headers on success. + */ +function wp_get_http_headers( $url, $deprecated = false ) { + if ( !empty( $deprecated ) ) + _deprecated_argument( __FUNCTION__, '2.7' ); + + $response = wp_remote_head( $url ); + + if ( is_wp_error( $response ) ) + return false; + + return wp_remote_retrieve_headers( $response ); +} + +/** + * Whether today is a new day. + * + * @since 0.71 + * @uses $day Today + * @uses $previousday Previous day + * + * @return int 1 when new day, 0 if not a new day. + */ +function is_new_day() { + global $currentday, $previousday; + if ( $currentday != $previousday ) + return 1; + else + return 0; +} + +/** + * Build URL query based on an associative and, or indexed array. + * + * This is a convenient function for easily building url queries. It sets the + * separator to '&' and uses _http_build_query() function. + * + * @see _http_build_query() Used to build the query + * @link http://us2.php.net/manual/en/function.http-build-query.php more on what + * http_build_query() does. + * + * @since 2.3.0 + * + * @param array $data URL-encode key/value pairs. + * @return string URL encoded string + */ +function build_query( $data ) { + return _http_build_query( $data, null, '&', '', false ); +} + +// from php.net (modified by Mark Jaquith to behave like the native PHP5 function) +function _http_build_query($data, $prefix=null, $sep=null, $key='', $urlencode=true) { + $ret = array(); + + foreach ( (array) $data as $k => $v ) { + if ( $urlencode) + $k = urlencode($k); + if ( is_int($k) && $prefix != null ) + $k = $prefix.$k; + if ( !empty($key) ) + $k = $key . '%5B' . $k . '%5D'; + if ( $v === NULL ) + continue; + elseif ( $v === FALSE ) + $v = '0'; + + if ( is_array($v) || is_object($v) ) + array_push($ret,_http_build_query($v, '', $sep, $k, $urlencode)); + elseif ( $urlencode ) + array_push($ret, $k.'='.urlencode($v)); + else + array_push($ret, $k.'='.$v); + } + + if ( NULL === $sep ) + $sep = ini_get('arg_separator.output'); + + return implode($sep, $ret); +} + +/** + * Retrieve a modified URL query string. + * + * You can rebuild the URL and append a new query variable to the URL query by + * using this function. You can also retrieve the full URL with query data. + * + * Adding a single key & value or an associative array. Setting a key value to + * emptystring removes the key. Omitting oldquery_or_uri uses the $_SERVER + * value. + * + * @since 1.5.0 + * + * @param mixed $param1 Either newkey or an associative_array + * @param mixed $param2 Either newvalue or oldquery or uri + * @param mixed $param3 Optional. Old query or uri + * @return string New URL query string. + */ +function add_query_arg() { + $ret = ''; + if ( is_array( func_get_arg(0) ) ) { + if ( @func_num_args() < 2 || false === @func_get_arg( 1 ) ) + $uri = $_SERVER['REQUEST_URI']; + else + $uri = @func_get_arg( 1 ); + } else { + if ( @func_num_args() < 3 || false === @func_get_arg( 2 ) ) + $uri = $_SERVER['REQUEST_URI']; + else + $uri = @func_get_arg( 2 ); + } + + if ( $frag = strstr( $uri, '#' ) ) + $uri = substr( $uri, 0, -strlen( $frag ) ); + else + $frag = ''; + + if ( preg_match( '|^https?://|i', $uri, $matches ) ) { + $protocol = $matches[0]; + $uri = substr( $uri, strlen( $protocol ) ); + } else { + $protocol = ''; + } + + if ( strpos( $uri, '?' ) !== false ) { + $parts = explode( '?', $uri, 2 ); + if ( 1 == count( $parts ) ) { + $base = '?'; + $query = $parts[0]; + } else { + $base = $parts[0] . '?'; + $query = $parts[1]; + } + } elseif ( !empty( $protocol ) || strpos( $uri, '=' ) === false ) { + $base = $uri . '?'; + $query = ''; + } else { + $base = ''; + $query = $uri; + } + + wp_parse_str( $query, $qs ); + $qs = urlencode_deep( $qs ); // this re-URL-encodes things that were already in the query string + if ( is_array( func_get_arg( 0 ) ) ) { + $kayvees = func_get_arg( 0 ); + $qs = array_merge( $qs, $kayvees ); + } else { + $qs[func_get_arg( 0 )] = func_get_arg( 1 ); + } + + foreach ( (array) $qs as $k => $v ) { + if ( $v === false ) + unset( $qs[$k] ); + } + + $ret = build_query( $qs ); + $ret = trim( $ret, '?' ); + $ret = preg_replace( '#=(&|$)#', '$1', $ret ); + $ret = $protocol . $base . $ret . $frag; + $ret = rtrim( $ret, '?' ); + return $ret; +} + +/** + * Removes an item or list from the query string. + * + * @since 1.5.0 + * + * @param string|array $key Query key or keys to remove. + * @param bool $query When false uses the $_SERVER value. + * @return string New URL query string. + */ +function remove_query_arg( $key, $query=false ) { + if ( is_array( $key ) ) { // removing multiple keys + foreach ( $key as $k ) + $query = add_query_arg( $k, false, $query ); + return $query; + } + return add_query_arg( $key, false, $query ); +} + +/** + * Walks the array while sanitizing the contents. + * + * @since 0.71 + * + * @param array $array Array to used to walk while sanitizing contents. + * @return array Sanitized $array. + */ +function add_magic_quotes( $array ) { + foreach ( (array) $array as $k => $v ) { + if ( is_array( $v ) ) { + $array[$k] = add_magic_quotes( $v ); + } else { + $array[$k] = addslashes( $v ); + } + } + return $array; +} + +/** + * HTTP request for URI to retrieve content. + * + * @since 1.5.1 + * @uses wp_remote_get() + * + * @param string $uri URI/URL of web page to retrieve. + * @return bool|string HTTP content. False on failure. + */ +function wp_remote_fopen( $uri ) { + $parsed_url = @parse_url( $uri ); + + if ( !$parsed_url || !is_array( $parsed_url ) ) + return false; + + $options = array(); + $options['timeout'] = 10; + + $response = wp_remote_get( $uri, $options ); + + if ( is_wp_error( $response ) ) + return false; + + return wp_remote_retrieve_body( $response ); +} + +/** + * Set up the WordPress query. + * + * @since 2.0.0 + * + * @param string $query_vars Default WP_Query arguments. + */ +function wp( $query_vars = '' ) { + global $wp, $wp_query, $wp_the_query; + $wp->main( $query_vars ); + + if ( !isset($wp_the_query) ) + $wp_the_query = $wp_query; +} + +/** + * Retrieve the description for the HTTP status. + * + * @since 2.3.0 + * + * @param int $code HTTP status code. + * @return string Empty string if not found, or description if found. + */ +function get_status_header_desc( $code ) { + global $wp_header_to_desc; + + $code = absint( $code ); + + if ( !isset( $wp_header_to_desc ) ) { + $wp_header_to_desc = array( + 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' + ); + } + + if ( isset( $wp_header_to_desc[$code] ) ) + return $wp_header_to_desc[$code]; + else + return ''; +} + +/** + * Set HTTP status header. + * + * @since 2.0.0 + * @uses apply_filters() Calls 'status_header' on status header string, HTTP + * HTTP code, HTTP code description, and protocol string as separate + * parameters. + * + * @param int $header HTTP status code + * @return unknown + */ +function status_header( $header ) { + $text = get_status_header_desc( $header ); + + if ( empty( $text ) ) + return false; + + $protocol = $_SERVER["SERVER_PROTOCOL"]; + if ( 'HTTP/1.1' != $protocol && 'HTTP/1.0' != $protocol ) + $protocol = 'HTTP/1.0'; + $status_header = "$protocol $header $text"; + if ( function_exists( 'apply_filters' ) ) + $status_header = apply_filters( 'status_header', $status_header, $header, $text, $protocol ); + + return @header( $status_header, true, $header ); +} + +/** + * Gets the header information to prevent caching. + * + * The several different headers cover the different ways cache prevention is handled + * by different browsers + * + * @since 2.8.0 + * + * @uses apply_filters() + * @return array The associative array of header names and field values. + */ +function wp_get_nocache_headers() { + $headers = array( + 'Expires' => 'Wed, 11 Jan 1984 05:00:00 GMT', + 'Last-Modified' => gmdate( 'D, d M Y H:i:s' ) . ' GMT', + 'Cache-Control' => 'no-cache, must-revalidate, max-age=0', + 'Pragma' => 'no-cache', + ); + + if ( function_exists('apply_filters') ) { + $headers = (array) apply_filters('nocache_headers', $headers); + } + return $headers; +} + +/** + * Sets the headers to prevent caching for the different browsers. + * + * Different browsers support different nocache headers, so several headers must + * be sent so that all of them get the point that no caching should occur. + * + * @since 2.0.0 + * @uses wp_get_nocache_headers() + */ +function nocache_headers() { + $headers = wp_get_nocache_headers(); + foreach( $headers as $name => $field_value ) + @header("{$name}: {$field_value}"); +} + +/** + * Set the headers for caching for 10 days with JavaScript content type. + * + * @since 2.1.0 + */ +function cache_javascript_headers() { + $expiresOffset = 864000; // 10 days + header( "Content-Type: text/javascript; charset=" . get_bloginfo( 'charset' ) ); + header( "Vary: Accept-Encoding" ); // Handle proxies + header( "Expires: " . gmdate( "D, d M Y H:i:s", time() + $expiresOffset ) . " GMT" ); +} + +/** + * Retrieve the number of database queries during the WordPress execution. + * + * @since 2.0.0 + * + * @return int Number of database queries + */ +function get_num_queries() { + global $wpdb; + return $wpdb->num_queries; +} + +/** + * Whether input is yes or no. Must be 'y' to be true. + * + * @since 1.0.0 + * + * @param string $yn Character string containing either 'y' or 'n' + * @return bool True if yes, false on anything else + */ +function bool_from_yn( $yn ) { + return ( strtolower( $yn ) == 'y' ); +} + +/** + * Loads the feed template from the use of an action hook. + * + * If the feed action does not have a hook, then the function will die with a + * message telling the visitor that the feed is not valid. + * + * It is better to only have one hook for each feed. + * + * @since 2.1.0 + * @uses $wp_query Used to tell if the use a comment feed. + * @uses do_action() Calls 'do_feed_$feed' hook, if a hook exists for the feed. + */ +function do_feed() { + global $wp_query; + + $feed = get_query_var( 'feed' ); + + // Remove the pad, if present. + $feed = preg_replace( '/^_+/', '', $feed ); + + if ( $feed == '' || $feed == 'feed' ) + $feed = get_default_feed(); + + $hook = 'do_feed_' . $feed; + if ( !has_action($hook) ) { + $message = sprintf( __( 'ERROR: %s is not a valid feed template.' ), esc_html($feed)); + wp_die( $message, '', array( 'response' => 404 ) ); + } + + do_action( $hook, $wp_query->is_comment_feed ); +} + +/** + * Load the RDF RSS 0.91 Feed template. + * + * @since 2.1.0 + */ +function do_feed_rdf() { + load_template( ABSPATH . WPINC . '/feed-rdf.php' ); +} + +/** + * Load the RSS 1.0 Feed Template + * + * @since 2.1.0 + */ +function do_feed_rss() { + load_template( ABSPATH . WPINC . '/feed-rss.php' ); +} + +/** + * Load either the RSS2 comment feed or the RSS2 posts feed. + * + * @since 2.1.0 + * + * @param bool $for_comments True for the comment feed, false for normal feed. + */ +function do_feed_rss2( $for_comments ) { + if ( $for_comments ) + load_template( ABSPATH . WPINC . '/feed-rss2-comments.php' ); + else + load_template( ABSPATH . WPINC . '/feed-rss2.php' ); +} + +/** + * Load either Atom comment feed or Atom posts feed. + * + * @since 2.1.0 + * + * @param bool $for_comments True for the comment feed, false for normal feed. + */ +function do_feed_atom( $for_comments ) { + if ($for_comments) + load_template( ABSPATH . WPINC . '/feed-atom-comments.php'); + else + load_template( ABSPATH . WPINC . '/feed-atom.php' ); +} + +/** + * Display the robot.txt file content. + * + * The echo content should be with usage of the permalinks or for creating the + * robot.txt file. + * + * @since 2.1.0 + * @uses do_action() Calls 'do_robotstxt' hook for displaying robot.txt rules. + */ +function do_robots() { + header( 'Content-Type: text/plain; charset=utf-8' ); + + do_action( 'do_robotstxt' ); + + $output = ''; + $public = get_option( 'blog_public' ); + if ( '0' == $public ) { + $output .= "User-agent: *\n"; + $output .= "Disallow: /\n"; + } else { + $output .= "User-agent: *\n"; + $output .= "Disallow:\n"; + } + + echo apply_filters('robots_txt', $output, $public); +} + +/** + * Test whether blog is already installed. + * + * The cache will be checked first. If you have a cache plugin, which saves the + * cache values, then this will work. If you use the default WordPress cache, + * and the database goes away, then you might have problems. + * + * Checks for the option siteurl for whether WordPress is installed. + * + * @since 2.1.0 + * @uses $wpdb + * + * @return bool Whether blog is already installed. + */ +function is_blog_installed() { + global $wpdb; + + // Check cache first. If options table goes away and we have true cached, oh well. + if ( wp_cache_get( 'is_blog_installed' ) ) + return true; + + $suppress = $wpdb->suppress_errors(); + if ( ! defined( 'WP_INSTALLING' ) ) { + $alloptions = wp_load_alloptions(); + } + // If siteurl is not set to autoload, check it specifically + if ( !isset( $alloptions['siteurl'] ) ) + $installed = $wpdb->get_var( "SELECT option_value FROM $wpdb->options WHERE option_name = 'siteurl'" ); + else + $installed = $alloptions['siteurl']; + $wpdb->suppress_errors( $suppress ); + + $installed = !empty( $installed ); + wp_cache_set( 'is_blog_installed', $installed ); + + if ( $installed ) + return true; + + $suppress = $wpdb->suppress_errors(); + $tables = $wpdb->get_col('SHOW TABLES'); + $wpdb->suppress_errors( $suppress ); + + $wp_tables = $wpdb->tables(); + // Loop over the WP tables. If none exist, then scratch install is allowed. + // If one or more exist, suggest table repair since we got here because the options + // table could not be accessed. + foreach ( $wp_tables as $table ) { + // If one of the WP tables exist, then we are in an insane state. + if ( in_array( $table, $tables ) ) { + // The existence of custom user tables shouldn't suggest an insane state or prevent a clean install. + if ( defined( 'CUSTOM_USER_TABLE' ) && CUSTOM_USER_TABLE == $table ) + continue; + if ( defined( 'CUSTOM_USER_META_TABLE' ) && CUSTOM_USER_META_TABLE == $table ) + continue; + + // If visiting repair.php, return true and let it take over. + if ( defined('WP_REPAIRING') ) + return true; + // Die with a DB error. + $wpdb->error = sprintf( /*WP_I18N_NO_TABLES*/'Una tabla o más de la base de dato no están disponibles. La base de datos debe ser <a href="%s">reparada</a>.'/*/WP_I18N_NO_TABLES*/, 'maint/repair.php?referrer=is_blog_installed' ); + dead_db(); + } + } + + wp_cache_set( 'is_blog_installed', false ); + + return false; +} + +/** + * Retrieve URL with nonce added to URL query. + * + * @package WordPress + * @subpackage Security + * @since 2.0.4 + * + * @param string $actionurl URL to add nonce action + * @param string $action Optional. Nonce action name + * @return string URL with nonce action added. + */ +function wp_nonce_url( $actionurl, $action = -1 ) { + $actionurl = str_replace( '&', '&', $actionurl ); + return esc_html( add_query_arg( '_wpnonce', wp_create_nonce( $action ), $actionurl ) ); +} + +/** + * Retrieve or display nonce hidden field for forms. + * + * The nonce field is used to validate that the contents of the form came from + * the location on the current site and not somewhere else. The nonce does not + * offer absolute protection, but should protect against most cases. It is very + * important to use nonce field in forms. + * + * The $action and $name are optional, but if you want to have better security, + * it is strongly suggested to set those two parameters. It is easier to just + * call the function without any parameters, because validation of the nonce + * doesn't require any parameters, but since crackers know what the default is + * it won't be difficult for them to find a way around your nonce and cause + * damage. + * + * The input name will be whatever $name value you gave. The input value will be + * the nonce creation value. + * + * @package WordPress + * @subpackage Security + * @since 2.0.4 + * + * @param string $action Optional. Action name. + * @param string $name Optional. Nonce name. + * @param bool $referer Optional, default true. Whether to set the referer field for validation. + * @param bool $echo Optional, default true. Whether to display or return hidden form field. + * @return string Nonce field. + */ +function wp_nonce_field( $action = -1, $name = "_wpnonce", $referer = true , $echo = true ) { + $name = esc_attr( $name ); + $nonce_field = '<input type="hidden" id="' . $name . '" name="' . $name . '" value="' . wp_create_nonce( $action ) . '" />'; + + if ( $referer ) + $nonce_field .= wp_referer_field( false ); + + if ( $echo ) + echo $nonce_field; + + return $nonce_field; +} + +/** + * Retrieve or display referer hidden field for forms. + * + * The referer link is the current Request URI from the server super global. The + * input name is '_wp_http_referer', in case you wanted to check manually. + * + * @package WordPress + * @subpackage Security + * @since 2.0.4 + * + * @param bool $echo Whether to echo or return the referer field. + * @return string Referer field. + */ +function wp_referer_field( $echo = true ) { + $ref = esc_attr( $_SERVER['REQUEST_URI'] ); + $referer_field = '<input type="hidden" name="_wp_http_referer" value="'. $ref . '" />'; + + if ( $echo ) + echo $referer_field; + return $referer_field; +} + +/** + * Retrieve or display original referer hidden field for forms. + * + * The input name is '_wp_original_http_referer' and will be either the same + * value of {@link wp_referer_field()}, if that was posted already or it will + * be the current page, if it doesn't exist. + * + * @package WordPress + * @subpackage Security + * @since 2.0.4 + * + * @param bool $echo Whether to echo the original http referer + * @param string $jump_back_to Optional, default is 'current'. Can be 'previous' or page you want to jump back to. + * @return string Original referer field. + */ +function wp_original_referer_field( $echo = true, $jump_back_to = 'current' ) { + $jump_back_to = ( 'previous' == $jump_back_to ) ? wp_get_referer() : $_SERVER['REQUEST_URI']; + $ref = ( wp_get_original_referer() ) ? wp_get_original_referer() : $jump_back_to; + $orig_referer_field = '<input type="hidden" name="_wp_original_http_referer" value="' . esc_attr( stripslashes( $ref ) ) . '" />'; + if ( $echo ) + echo $orig_referer_field; + return $orig_referer_field; +} + +/** + * Retrieve referer from '_wp_http_referer', HTTP referer, or current page respectively. + * + * @package WordPress + * @subpackage Security + * @since 2.0.4 + * + * @return string|bool False on failure. Referer URL on success. + */ +function wp_get_referer() { + $ref = ''; + if ( ! empty( $_REQUEST['_wp_http_referer'] ) ) + $ref = $_REQUEST['_wp_http_referer']; + else if ( ! empty( $_SERVER['HTTP_REFERER'] ) ) + $ref = $_SERVER['HTTP_REFERER']; + + if ( $ref !== $_SERVER['REQUEST_URI'] ) + return $ref; + return false; +} + +/** + * Retrieve original referer that was posted, if it exists. + * + * @package WordPress + * @subpackage Security + * @since 2.0.4 + * + * @return string|bool False if no original referer or original referer if set. + */ +function wp_get_original_referer() { + if ( !empty( $_REQUEST['_wp_original_http_referer'] ) ) + return $_REQUEST['_wp_original_http_referer']; + return false; +} + +/** + * Recursive directory creation based on full path. + * + * Will attempt to set permissions on folders. + * + * @since 2.0.1 + * + * @param string $target Full path to attempt to create. + * @return bool Whether the path was created. True if path already exists. + */ +function wp_mkdir_p( $target ) { + // from php.net/mkdir user contributed notes + $target = str_replace( '//', '/', $target ); + + // safe mode fails with a trailing slash under certain PHP versions. + $target = rtrim($target, '/'); // Use rtrim() instead of untrailingslashit to avoid formatting.php dependency. + if ( empty($target) ) + $target = '/'; + + if ( file_exists( $target ) ) + return @is_dir( $target ); + + // Attempting to create the directory may clutter up our display. + if ( @mkdir( $target ) ) { + $stat = @stat( dirname( $target ) ); + $dir_perms = $stat['mode'] & 0007777; // Get the permission bits. + @chmod( $target, $dir_perms ); + return true; + } elseif ( is_dir( dirname( $target ) ) ) { + return false; + } + + // If the above failed, attempt to create the parent node, then try again. + if ( ( $target != '/' ) && ( wp_mkdir_p( dirname( $target ) ) ) ) + return wp_mkdir_p( $target ); + + return false; +} + +/** + * Test if a give filesystem path is absolute ('/foo/bar', 'c:\windows'). + * + * @since 2.5.0 + * + * @param string $path File path + * @return bool True if path is absolute, false is not absolute. + */ +function path_is_absolute( $path ) { + // this is definitive if true but fails if $path does not exist or contains a symbolic link + if ( realpath($path) == $path ) + return true; + + if ( strlen($path) == 0 || $path[0] == '.' ) + return false; + + // windows allows absolute paths like this + if ( preg_match('#^[a-zA-Z]:\\\\#', $path) ) + return true; + + // a path starting with / or \ is absolute; anything else is relative + return (bool) preg_match('#^[/\\\\]#', $path); +} + +/** + * Join two filesystem paths together (e.g. 'give me $path relative to $base'). + * + * If the $path is absolute, then it the full path is returned. + * + * @since 2.5.0 + * + * @param string $base + * @param string $path + * @return string The path with the base or absolute path. + */ +function path_join( $base, $path ) { + if ( path_is_absolute($path) ) + return $path; + + return rtrim($base, '/') . '/' . ltrim($path, '/'); +} + +/** + * Determines a writable directory for temporary files. + * Function's preference is to WP_CONTENT_DIR followed by the return value of <code>sys_get_temp_dir()</code>, before finally defaulting to /tmp/ + * + * In the event that this function does not find a writable location, It may be overridden by the <code>WP_TEMP_DIR</code> constant in your <code>wp-config.php</code> file. + * + * @since 2.5.0 + * + * @return string Writable temporary directory + */ +function get_temp_dir() { + static $temp; + if ( defined('WP_TEMP_DIR') ) + return trailingslashit(WP_TEMP_DIR); + + if ( $temp ) + return trailingslashit($temp); + + $temp = WP_CONTENT_DIR . '/'; + if ( is_dir($temp) && @is_writable($temp) ) + return $temp; + + if ( function_exists('sys_get_temp_dir') ) { + $temp = sys_get_temp_dir(); + if ( @is_writable($temp) ) + return trailingslashit($temp); + } + + $temp = ini_get('upload_tmp_dir'); + if ( is_dir($temp) && @is_writable($temp) ) + return trailingslashit($temp); + + $temp = '/tmp/'; + return $temp; +} + +/** + * Get an array containing the current upload directory's path and url. + * + * Checks the 'upload_path' option, which should be from the web root folder, + * and if it isn't empty it will be used. If it is empty, then the path will be + * 'WP_CONTENT_DIR/uploads'. If the 'UPLOADS' constant is defined, then it will + * override the 'upload_path' option and 'WP_CONTENT_DIR/uploads' path. + * + * The upload URL path is set either by the 'upload_url_path' option or by using + * the 'WP_CONTENT_URL' constant and appending '/uploads' to the path. + * + * If the 'uploads_use_yearmonth_folders' is set to true (checkbox if checked in + * the administration settings panel), then the time will be used. The format + * will be year first and then month. + * + * If the path couldn't be created, then an error will be returned with the key + * 'error' containing the error message. The error suggests that the parent + * directory is not writable by the server. + * + * On success, the returned array will have many indices: + * 'path' - base directory and sub directory or full path to upload directory. + * 'url' - base url and sub directory or absolute URL to upload directory. + * 'subdir' - sub directory if uploads use year/month folders option is on. + * 'basedir' - path without subdir. + * 'baseurl' - URL path without subdir. + * 'error' - set to false. + * + * @since 2.0.0 + * @uses apply_filters() Calls 'upload_dir' on returned array. + * + * @param string $time Optional. Time formatted in 'yyyy/mm'. + * @return array See above for description. + */ +function wp_upload_dir( $time = null ) { + global $switched; + $siteurl = get_option( 'siteurl' ); + $upload_path = get_option( 'upload_path' ); + $upload_path = trim($upload_path); + $main_override = is_multisite() && defined( 'MULTISITE' ) && is_main_site(); + if ( empty($upload_path) ) { + $dir = WP_CONTENT_DIR . '/uploads'; + } else { + $dir = $upload_path; + if ( 'wp-content/uploads' == $upload_path ) { + $dir = WP_CONTENT_DIR . '/uploads'; + } elseif ( 0 !== strpos($dir, ABSPATH) ) { + // $dir is absolute, $upload_path is (maybe) relative to ABSPATH + $dir = path_join( ABSPATH, $dir ); + } + } + + if ( !$url = get_option( 'upload_url_path' ) ) { + if ( empty($upload_path) || ( 'wp-content/uploads' == $upload_path ) || ( $upload_path == $dir ) ) + $url = WP_CONTENT_URL . '/uploads'; + else + $url = trailingslashit( $siteurl ) . $upload_path; + } + + if ( defined('UPLOADS') && !$main_override && ( !isset( $switched ) || $switched === false ) ) { + $dir = ABSPATH . UPLOADS; + $url = trailingslashit( $siteurl ) . UPLOADS; + } + + if ( is_multisite() && !$main_override && ( !isset( $switched ) || $switched === false ) ) { + if ( defined( 'BLOGUPLOADDIR' ) ) + $dir = untrailingslashit(BLOGUPLOADDIR); + $url = str_replace( UPLOADS, 'files', $url ); + } + + $bdir = $dir; + $burl = $url; + + $subdir = ''; + if ( get_option( 'uploads_use_yearmonth_folders' ) ) { + // Generate the yearly and monthly dirs + if ( !$time ) + $time = current_time( 'mysql' ); + $y = substr( $time, 0, 4 ); + $m = substr( $time, 5, 2 ); + $subdir = "/$y/$m"; + } + + $dir .= $subdir; + $url .= $subdir; + + $uploads = apply_filters( 'upload_dir', array( 'path' => $dir, 'url' => $url, 'subdir' => $subdir, 'basedir' => $bdir, 'baseurl' => $burl, 'error' => false ) ); + + // Make sure we have an uploads dir + if ( ! wp_mkdir_p( $uploads['path'] ) ) { + $message = sprintf( __( 'Unable to create directory %s. Is its parent directory writable by the server?' ), $uploads['path'] ); + return array( 'error' => $message ); + } + + return $uploads; +} + +/** + * Get a filename that is sanitized and unique for the given directory. + * + * If the filename is not unique, then a number will be added to the filename + * before the extension, and will continue adding numbers until the filename is + * unique. + * + * The callback is passed three parameters, the first one is the directory, the + * second is the filename, and the third is the extension. + * + * @since 2.5.0 + * + * @param string $dir + * @param string $filename + * @param mixed $unique_filename_callback Callback. + * @return string New filename, if given wasn't unique. + */ +function wp_unique_filename( $dir, $filename, $unique_filename_callback = null ) { + // sanitize the file name before we begin processing + $filename = sanitize_file_name($filename); + + // separate the filename into a name and extension + $info = pathinfo($filename); + $ext = !empty($info['extension']) ? '.' . $info['extension'] : ''; + $name = basename($filename, $ext); + + // edge case: if file is named '.ext', treat as an empty name + if ( $name === $ext ) + $name = ''; + + // Increment the file number until we have a unique file to save in $dir. Use callback if supplied. + if ( $unique_filename_callback && is_callable( $unique_filename_callback ) ) { + $filename = call_user_func( $unique_filename_callback, $dir, $name, $ext ); + } else { + $number = ''; + + // change '.ext' to lower case + if ( $ext && strtolower($ext) != $ext ) { + $ext2 = strtolower($ext); + $filename2 = preg_replace( '|' . preg_quote($ext) . '$|', $ext2, $filename ); + + // check for both lower and upper case extension or image sub-sizes may be overwritten + while ( file_exists($dir . "/$filename") || file_exists($dir . "/$filename2") ) { + $new_number = $number + 1; + $filename = str_replace( "$number$ext", "$new_number$ext", $filename ); + $filename2 = str_replace( "$number$ext2", "$new_number$ext2", $filename2 ); + $number = $new_number; + } + return $filename2; + } + + while ( file_exists( $dir . "/$filename" ) ) { + if ( '' == "$number$ext" ) + $filename = $filename . ++$number . $ext; + else + $filename = str_replace( "$number$ext", ++$number . $ext, $filename ); + } + } + + return $filename; +} + +/** + * Create a file in the upload folder with given content. + * + * If there is an error, then the key 'error' will exist with the error message. + * If success, then the key 'file' will have the unique file path, the 'url' key + * will have the link to the new file. and the 'error' key will be set to false. + * + * This function will not move an uploaded file to the upload folder. It will + * create a new file with the content in $bits parameter. If you move the upload + * file, read the content of the uploaded file, and then you can give the + * filename and content to this function, which will add it to the upload + * folder. + * + * The permissions will be set on the new file automatically by this function. + * + * @since 2.0.0 + * + * @param string $name + * @param null $deprecated Never used. Set to null. + * @param mixed $bits File content + * @param string $time Optional. Time formatted in 'yyyy/mm'. + * @return array + */ +function wp_upload_bits( $name, $deprecated, $bits, $time = null ) { + if ( !empty( $deprecated ) ) + _deprecated_argument( __FUNCTION__, '2.0' ); + + if ( empty( $name ) ) + return array( 'error' => __( 'Empty filename' ) ); + + $wp_filetype = wp_check_filetype( $name ); + if ( !$wp_filetype['ext'] ) + return array( 'error' => __( 'Invalid file type' ) ); + + $upload = wp_upload_dir( $time ); + + if ( $upload['error'] !== false ) + return $upload; + + $upload_bits_error = apply_filters( 'wp_upload_bits', array( 'name' => $name, 'bits' => $bits, 'time' => $time ) ); + if ( !is_array( $upload_bits_error ) ) { + $upload[ 'error' ] = $upload_bits_error; + return $upload; + } + + $filename = wp_unique_filename( $upload['path'], $name ); + + $new_file = $upload['path'] . "/$filename"; + if ( ! wp_mkdir_p( dirname( $new_file ) ) ) { + $message = sprintf( __( 'Unable to create directory %s. Is its parent directory writable by the server?' ), dirname( $new_file ) ); + return array( 'error' => $message ); + } + + $ifp = @ fopen( $new_file, 'wb' ); + if ( ! $ifp ) + return array( 'error' => sprintf( __( 'Could not write file %s' ), $new_file ) ); + + @fwrite( $ifp, $bits ); + fclose( $ifp ); + clearstatcache(); + + // Set correct file permissions + $stat = @ stat( dirname( $new_file ) ); + $perms = $stat['mode'] & 0007777; + $perms = $perms & 0000666; + @ chmod( $new_file, $perms ); + clearstatcache(); + + // Compute the URL + $url = $upload['url'] . "/$filename"; + + return array( 'file' => $new_file, 'url' => $url, 'error' => false ); +} + +/** + * Retrieve the file type based on the extension name. + * + * @package WordPress + * @since 2.5.0 + * @uses apply_filters() Calls 'ext2type' hook on default supported types. + * + * @param string $ext The extension to search. + * @return string|null The file type, example: audio, video, document, spreadsheet, etc. Null if not found. + */ +function wp_ext2type( $ext ) { + $ext2type = apply_filters( 'ext2type', array( + 'audio' => array( 'aac', 'ac3', 'aif', 'aiff', 'm3a', 'm4a', 'm4b', 'mka', 'mp1', 'mp2', 'mp3', 'ogg', 'oga', 'ram', 'wav', 'wma' ), + 'video' => array( 'asf', 'avi', 'divx', 'dv', 'flv', 'm4v', 'mkv', 'mov', 'mp4', 'mpeg', 'mpg', 'mpv', 'ogm', 'ogv', 'qt', 'rm', 'vob', 'wmv' ), + 'document' => array( 'doc', 'docx', 'docm', 'dotm', 'odt', 'pages', 'pdf', 'rtf', 'wp', 'wpd' ), + 'spreadsheet' => array( 'numbers', 'ods', 'xls', 'xlsx', 'xlsb', 'xlsm' ), + 'interactive' => array( 'key', 'ppt', 'pptx', 'pptm', 'odp', 'swf' ), + 'text' => array( 'asc', 'csv', 'tsv', 'txt' ), + 'archive' => array( 'bz2', 'cab', 'dmg', 'gz', 'rar', 'sea', 'sit', 'sqx', 'tar', 'tgz', 'zip' ), + 'code' => array( 'css', 'htm', 'html', 'php', 'js' ), + )); + foreach ( $ext2type as $type => $exts ) + if ( in_array( $ext, $exts ) ) + return $type; +} + +/** + * Retrieve the file type from the file name. + * + * You can optionally define the mime array, if needed. + * + * @since 2.0.4 + * + * @param string $filename File name or path. + * @param array $mimes Optional. Key is the file extension with value as the mime type. + * @return array Values with extension first and mime type. + */ +function wp_check_filetype( $filename, $mimes = null ) { + if ( empty($mimes) ) + $mimes = get_allowed_mime_types(); + $type = false; + $ext = false; + + foreach ( $mimes as $ext_preg => $mime_match ) { + $ext_preg = '!\.(' . $ext_preg . ')$!i'; + if ( preg_match( $ext_preg, $filename, $ext_matches ) ) { + $type = $mime_match; + $ext = $ext_matches[1]; + break; + } + } + + return compact( 'ext', 'type' ); +} + +/** + * Attempt to determine the real file type of a file. + * If unable to, the file name extension will be used to determine type. + * + * If it's determined that the extension does not match the file's real type, + * then the "proper_filename" value will be set with a proper filename and extension. + * + * Currently this function only supports validating images known to getimagesize(). + * + * @since 3.0.0 + * + * @param string $file Full path to the image. + * @param string $filename The filename of the image (may differ from $file due to $file being in a tmp directory) + * @param array $mimes Optional. Key is the file extension with value as the mime type. + * @return array Values for the extension, MIME, and either a corrected filename or false if original $filename is valid + */ +function wp_check_filetype_and_ext( $file, $filename, $mimes = null ) { + + $proper_filename = false; + + // Do basic extension validation and MIME mapping + $wp_filetype = wp_check_filetype( $filename, $mimes ); + extract( $wp_filetype ); + + // We can't do any further validation without a file to work with + if ( ! file_exists( $file ) ) + return compact( 'ext', 'type', 'proper_filename' ); + + // We're able to validate images using GD + if ( $type && 0 === strpos( $type, 'image/' ) && function_exists('getimagesize') ) { + + // Attempt to figure out what type of image it actually is + $imgstats = @getimagesize( $file ); + + // If getimagesize() knows what kind of image it really is and if the real MIME doesn't match the claimed MIME + if ( !empty($imgstats['mime']) && $imgstats['mime'] != $type ) { + // This is a simplified array of MIMEs that getimagesize() can detect and their extensions + // You shouldn't need to use this filter, but it's here just in case + $mime_to_ext = apply_filters( 'getimagesize_mimes_to_exts', array( + 'image/jpeg' => 'jpg', + 'image/png' => 'png', + 'image/gif' => 'gif', + 'image/bmp' => 'bmp', + 'image/tiff' => 'tif', + ) ); + + // Replace whatever is after the last period in the filename with the correct extension + if ( ! empty( $mime_to_ext[ $imgstats['mime'] ] ) ) { + $filename_parts = explode( '.', $filename ); + array_pop( $filename_parts ); + $filename_parts[] = $mime_to_ext[ $imgstats['mime'] ]; + $new_filename = implode( '.', $filename_parts ); + + if ( $new_filename != $filename ) + $proper_filename = $new_filename; // Mark that it changed + + // Redefine the extension / MIME + $wp_filetype = wp_check_filetype( $new_filename, $mimes ); + extract( $wp_filetype ); + } + } + } + + // Let plugins try and validate other types of files + // Should return an array in the style of array( 'ext' => $ext, 'type' => $type, 'proper_filename' => $proper_filename ) + return apply_filters( 'wp_check_filetype_and_ext', compact( 'ext', 'type', 'proper_filename' ), $file, $filename, $mimes ); +} + +/** + * Retrieve list of allowed mime types and file extensions. + * + * @since 2.8.6 + * + * @return array Array of mime types keyed by the file extension regex corresponding to those types. + */ +function get_allowed_mime_types() { + static $mimes = false; + + if ( !$mimes ) { + // Accepted MIME types are set here as PCRE unless provided. + $mimes = apply_filters( 'upload_mimes', array( + 'jpg|jpeg|jpe' => 'image/jpeg', + 'gif' => 'image/gif', + 'png' => 'image/png', + 'bmp' => 'image/bmp', + 'tif|tiff' => 'image/tiff', + 'ico' => 'image/x-icon', + 'asf|asx|wax|wmv|wmx' => 'video/asf', + 'avi' => 'video/avi', + 'divx' => 'video/divx', + 'flv' => 'video/x-flv', + 'mov|qt' => 'video/quicktime', + 'mpeg|mpg|mpe' => 'video/mpeg', + 'txt|asc|c|cc|h' => 'text/plain', + 'csv' => 'text/csv', + 'tsv' => 'text/tab-separated-values', + 'ics' => 'text/calendar', + 'rtx' => 'text/richtext', + 'css' => 'text/css', + 'htm|html' => 'text/html', + 'mp3|m4a|m4b' => 'audio/mpeg', + 'mp4|m4v' => 'video/mp4', + 'ra|ram' => 'audio/x-realaudio', + 'wav' => 'audio/wav', + 'ogg|oga' => 'audio/ogg', + 'ogv' => 'video/ogg', + 'mid|midi' => 'audio/midi', + 'wma' => 'audio/wma', + 'mka' => 'audio/x-matroska', + 'mkv' => 'video/x-matroska', + 'rtf' => 'application/rtf', + 'js' => 'application/javascript', + 'pdf' => 'application/pdf', + 'doc|docx' => 'application/msword', + 'pot|pps|ppt|pptx|ppam|pptm|sldm|ppsm|potm' => 'application/vnd.ms-powerpoint', + 'wri' => 'application/vnd.ms-write', + 'xla|xls|xlsx|xlt|xlw|xlam|xlsb|xlsm|xltm' => 'application/vnd.ms-excel', + 'mdb' => 'application/vnd.ms-access', + 'mpp' => 'application/vnd.ms-project', + 'docm|dotm' => 'application/vnd.ms-word', + 'pptx|sldx|ppsx|potx' => 'application/vnd.openxmlformats-officedocument.presentationml', + 'xlsx|xltx' => 'application/vnd.openxmlformats-officedocument.spreadsheetml', + 'docx|dotx' => 'application/vnd.openxmlformats-officedocument.wordprocessingml', + 'onetoc|onetoc2|onetmp|onepkg' => 'application/onenote', + 'swf' => 'application/x-shockwave-flash', + 'class' => 'application/java', + 'tar' => 'application/x-tar', + 'zip' => 'application/zip', + 'gz|gzip' => 'application/x-gzip', + 'exe' => 'application/x-msdownload', + // openoffice formats + 'odt' => 'application/vnd.oasis.opendocument.text', + 'odp' => 'application/vnd.oasis.opendocument.presentation', + 'ods' => 'application/vnd.oasis.opendocument.spreadsheet', + 'odg' => 'application/vnd.oasis.opendocument.graphics', + 'odc' => 'application/vnd.oasis.opendocument.chart', + 'odb' => 'application/vnd.oasis.opendocument.database', + 'odf' => 'application/vnd.oasis.opendocument.formula', + // wordperfect formats + 'wp|wpd' => 'application/wordperfect', + ) ); + } + + return $mimes; +} + +/** + * Retrieve nonce action "Are you sure" message. + * + * The action is split by verb and noun. The action format is as follows: + * verb-action_extra. The verb is before the first dash and has the format of + * letters and no spaces and numbers. The noun is after the dash and before the + * underscore, if an underscore exists. The noun is also only letters. + * + * The filter will be called for any action, which is not defined by WordPress. + * You may use the filter for your plugin to explain nonce actions to the user, + * when they get the "Are you sure?" message. The filter is in the format of + * 'explain_nonce_$verb-$noun' with the $verb replaced by the found verb and the + * $noun replaced by the found noun. The two parameters that are given to the + * hook are the localized "Are you sure you want to do this?" message with the + * extra text (the text after the underscore). + * + * @package WordPress + * @subpackage Security + * @since 2.0.4 + * + * @param string $action Nonce action. + * @return string Are you sure message. + */ +function wp_explain_nonce( $action ) { + if ( $action !== -1 && preg_match( '/([a-z]+)-([a-z]+)(_(.+))?/', $action, $matches ) ) { + $verb = $matches[1]; + $noun = $matches[2]; + + $trans = array(); + $trans['update']['attachment'] = array( __( 'Your attempt to edit this attachment: “%s” has failed.' ), 'get_the_title' ); + + $trans['add']['category'] = array( __( 'Your attempt to add this category has failed.' ), false ); + $trans['delete']['category'] = array( __( 'Your attempt to delete this category: “%s” has failed.' ), 'get_cat_name' ); + $trans['update']['category'] = array( __( 'Your attempt to edit this category: “%s” has failed.' ), 'get_cat_name' ); + + $trans['delete']['comment'] = array( __( 'Your attempt to delete this comment: “%s” has failed.' ), 'use_id' ); + $trans['unapprove']['comment'] = array( __( 'Your attempt to unapprove this comment: “%s” has failed.' ), 'use_id' ); + $trans['approve']['comment'] = array( __( 'Your attempt to approve this comment: “%s” has failed.' ), 'use_id' ); + $trans['update']['comment'] = array( __( 'Your attempt to edit this comment: “%s” has failed.' ), 'use_id' ); + $trans['bulk']['comments'] = array( __( 'Your attempt to bulk modify comments has failed.' ), false ); + $trans['moderate']['comments'] = array( __( 'Your attempt to moderate comments has failed.' ), false ); + + $trans['add']['bookmark'] = array( __( 'Your attempt to add this link has failed.' ), false ); + $trans['delete']['bookmark'] = array( __( 'Your attempt to delete this link: “%s” has failed.' ), 'use_id' ); + $trans['update']['bookmark'] = array( __( 'Your attempt to edit this link: “%s” has failed.' ), 'use_id' ); + $trans['bulk']['bookmarks'] = array( __( 'Your attempt to bulk modify links has failed.' ), false ); + + $trans['add']['page'] = array( __( 'Your attempt to add this page has failed.' ), false ); + $trans['delete']['page'] = array( __( 'Your attempt to delete this page: “%s” has failed.' ), 'get_the_title' ); + $trans['update']['page'] = array( __( 'Your attempt to edit this page: “%s” has failed.' ), 'get_the_title' ); + + $trans['edit']['plugin'] = array( __( 'Your attempt to edit this plugin file: “%s” has failed.' ), 'use_id' ); + $trans['activate']['plugin'] = array( __( 'Your attempt to activate this plugin: “%s” has failed.' ), 'use_id' ); + $trans['deactivate']['plugin'] = array( __( 'Your attempt to deactivate this plugin: “%s” has failed.' ), 'use_id' ); + $trans['upgrade']['plugin'] = array( __( 'Your attempt to update this plugin: “%s” has failed.' ), 'use_id' ); + + $trans['add']['post'] = array( __( 'Your attempt to add this post has failed.' ), false ); + $trans['delete']['post'] = array( __( 'Your attempt to delete this post: “%s” has failed.' ), 'get_the_title' ); + $trans['update']['post'] = array( __( 'Your attempt to edit this post: “%s” has failed.' ), 'get_the_title' ); + + $trans['add']['user'] = array( __( 'Your attempt to add this user has failed.' ), false ); + $trans['delete']['users'] = array( __( 'Your attempt to delete users has failed.' ), false ); + $trans['bulk']['users'] = array( __( 'Your attempt to bulk modify users has failed.' ), false ); + $trans['update']['user'] = array( __( 'Your attempt to edit this user: “%s” has failed.' ), 'get_the_author_meta', 'display_name' ); + $trans['update']['profile'] = array( __( 'Your attempt to modify the profile for: “%s” has failed.' ), 'get_the_author_meta', 'display_name' ); + + $trans['update']['options'] = array( __( 'Your attempt to edit your settings has failed.' ), false ); + $trans['update']['permalink'] = array( __( 'Your attempt to change your permalink structure to: %s has failed.' ), 'use_id' ); + $trans['edit']['file'] = array( __( 'Your attempt to edit this file: “%s” has failed.' ), 'use_id' ); + $trans['edit']['theme'] = array( __( 'Your attempt to edit this theme file: “%s” has failed.' ), 'use_id' ); + $trans['switch']['theme'] = array( __( 'Your attempt to switch to this theme: “%s” has failed.' ), 'use_id' ); + + $trans['log']['out'] = array( sprintf( __( 'You are attempting to log out of %s' ), get_bloginfo( 'sitename' ) ), false ); + + if ( isset( $trans[$verb][$noun] ) ) { + if ( !empty( $trans[$verb][$noun][1] ) ) { + $lookup = $trans[$verb][$noun][1]; + if ( isset($trans[$verb][$noun][2]) ) + $lookup_value = $trans[$verb][$noun][2]; + $object = $matches[4]; + if ( 'use_id' != $lookup ) { + if ( isset( $lookup_value ) ) + $object = call_user_func( $lookup, $lookup_value, $object ); + else + $object = call_user_func( $lookup, $object ); + } + return sprintf( $trans[$verb][$noun][0], esc_html($object) ); + } else { + return $trans[$verb][$noun][0]; + } + } + + return apply_filters( 'explain_nonce_' . $verb . '-' . $noun, __( 'Are you sure you want to do this?' ), isset($matches[4]) ? $matches[4] : '' ); + } else { + return apply_filters( 'explain_nonce_' . $action, __( 'Are you sure you want to do this?' ) ); + } +} + +/** + * Display "Are You Sure" message to confirm the action being taken. + * + * If the action has the nonce explain message, then it will be displayed along + * with the "Are you sure?" message. + * + * @package WordPress + * @subpackage Security + * @since 2.0.4 + * + * @param string $action The nonce action. + */ +function wp_nonce_ays( $action ) { + $title = __( 'WordPress Failure Notice' ); + $html = esc_html( wp_explain_nonce( $action ) ); + if ( 'log-out' == $action ) + $html .= "</p><p>" . sprintf( __( "Do you really want to <a href='%s'>log out</a>?"), wp_logout_url() ); + elseif ( wp_get_referer() ) + $html .= "</p><p><a href='" . esc_url( remove_query_arg( 'updated', wp_get_referer() ) ) . "'>" . __( 'Please try again.' ) . "</a>"; + + wp_die( $html, $title, array('response' => 403) ); +} + + +/** + * Kill WordPress execution and display HTML message with error message. + * + * This function complements the die() PHP function. The difference is that + * HTML will be displayed to the user. It is recommended to use this function + * only, when the execution should not continue any further. It is not + * recommended to call this function very often and try to handle as many errors + * as possible siliently. + * + * @since 2.0.4 + * + * @param string $message Error message. + * @param string $title Error title. + * @param string|array $args Optional arguements to control behaviour. + */ +function wp_die( $message, $title = '', $args = array() ) { + if ( defined( 'DOING_AJAX' ) && DOING_AJAX ) + die('-1'); + + if ( function_exists( 'apply_filters' ) ) { + $function = apply_filters( 'wp_die_handler', '_default_wp_die_handler'); + } else { + $function = '_default_wp_die_handler'; + } + + call_user_func( $function, $message, $title, $args ); +} + +/** + * Kill WordPress execution and display HTML message with error message. + * + * This is the default handler for wp_die if you want a custom one for your + * site then you can overload using the wp_die_handler filter in wp_die + * + * @since 3.0.0 + * @access private + * + * @param string $message Error message. + * @param string $title Error title. + * @param string|array $args Optional arguements to control behaviour. + */ +function _default_wp_die_handler( $message, $title = '', $args = array() ) { + $defaults = array( 'response' => 500 ); + $r = wp_parse_args($args, $defaults); + + $have_gettext = function_exists('__'); + + if ( function_exists( 'is_wp_error' ) && is_wp_error( $message ) ) { + if ( empty( $title ) ) { + $error_data = $message->get_error_data(); + if ( is_array( $error_data ) && isset( $error_data['title'] ) ) + $title = $error_data['title']; + } + $errors = $message->get_error_messages(); + switch ( count( $errors ) ) : + case 0 : + $message = ''; + break; + case 1 : + $message = "<p>{$errors[0]}</p>"; + break; + default : + $message = "<ul>\n\t\t<li>" . join( "</li>\n\t\t<li>", $errors ) . "</li>\n\t</ul>"; + break; + endswitch; + } elseif ( is_string( $message ) ) { + $message = "<p>$message</p>"; + } + + if ( isset( $r['back_link'] ) && $r['back_link'] ) { + $back_text = $have_gettext? __('« Back') : '« Back'; + $message .= "\n<p><a href='javascript:history.back()'>$back_text</p>"; + } + + if ( defined( 'WP_SITEURL' ) && '' != WP_SITEURL ) + $admin_dir = WP_SITEURL . '/wp-admin/'; + elseif ( function_exists( 'get_bloginfo' ) && '' != get_bloginfo( 'wpurl' ) ) + $admin_dir = get_bloginfo( 'wpurl' ) . '/wp-admin/'; + elseif ( strpos( $_SERVER['PHP_SELF'], 'wp-admin' ) !== false ) + $admin_dir = ''; + else + $admin_dir = 'wp-admin/'; + + if ( !function_exists( 'did_action' ) || !did_action( 'admin_head' ) ) : + if ( !headers_sent() ) { + status_header( $r['response'] ); + nocache_headers(); + header( 'Content-Type: text/html; charset=utf-8' ); + } + + if ( empty($title) ) + $title = $have_gettext ? __('WordPress › Error') : 'WordPress › Error'; + + $text_direction = 'ltr'; + if ( isset($r['text_direction']) && 'rtl' == $r['text_direction'] ) + $text_direction = 'rtl'; + elseif ( function_exists( 'is_rtl' ) && is_rtl() ) + $text_direction = 'rtl'; +?> +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<!-- Ticket #11289, IE bug fix: always pad the error page with enough characters such that it is greater than 512 bytes, even after gzip compression abcdefghijklmnopqrstuvwxyz1234567890aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz11223344556677889900abacbcbdcdcededfefegfgfhghgihihjijikjkjlklkmlmlnmnmononpopoqpqprqrqsrsrtstsubcbcdcdedefefgfabcadefbghicjkldmnoepqrfstugvwxhyz1i234j567k890laabmbccnddeoeffpgghqhiirjjksklltmmnunoovppqwqrrxsstytuuzvvw0wxx1yyz2z113223434455666777889890091abc2def3ghi4jkl5mno6pqr7stu8vwx9yz11aab2bcc3dd4ee5ff6gg7hh8ii9j0jk1kl2lmm3nnoo4p5pq6qrr7ss8tt9uuvv0wwx1x2yyzz13aba4cbcb5dcdc6dedfef8egf9gfh0ghg1ihi2hji3jik4jkj5lkl6kml7mln8mnm9ono --> +<html xmlns="http://www.w3.org/1999/xhtml" <?php if ( function_exists( 'language_attributes' ) && function_exists( 'is_rtl' ) ) language_attributes(); else echo "dir='$text_direction'"; ?>> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> + <title><?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(); +} + +/** + * Filter to enable special wp_die handler for xmlrpc requests. + * + * @since 3.2.0 + * @access private + */ +function _xmlrpc_wp_die_filter() { + return '_xmlrpc_wp_die_handler'; +} + + +/** + * Retrieve the WordPress home page URL. + * + * If the constant named 'WP_HOME' exists, then it willl be used and returned by + * the function. This can be used to counter the redirection on your local + * development environment. + * + * @access private + * @package WordPress + * @since 2.2.0 + * + * @param string $url URL for the home location + * @return string Homepage location. + */ +function _config_wp_home( $url = '' ) { + if ( defined( 'WP_HOME' ) ) + return 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. + * + * @access private + * @package WordPress + * @since 2.2.0 + * + * @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 WP_SITEURL; + return $url; +} + +/** + * 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', 'plugins', and 'theme_advanced_button1' array + * keys. These keys are then returned in the $input array. + * + * @access private + * @package WordPress + * @subpackage MCE + * @since 2.1.0 + * + * @param array $input MCE plugin array. + * @return array Direction set for 'rtl', if needed by locale. + */ +function _mce_set_direction( $input ) { + if ( is_rtl() ) { + $input['directionality'] = 'rtl'; + $input['plugins'] .= ',directionality'; + $input['theme_advanced_buttons1'] .= ',ltr'; + } + + return $input; +} + + +/** + * 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:' => 'icon_mrgreen.gif', + ':neutral:' => 'icon_neutral.gif', + ':twisted:' => 'icon_twisted.gif', + ':arrow:' => 'icon_arrow.gif', + ':shock:' => 'icon_eek.gif', + ':smile:' => 'icon_smile.gif', + ':???:' => 'icon_confused.gif', + ':cool:' => 'icon_cool.gif', + ':evil:' => 'icon_evil.gif', + ':grin:' => 'icon_biggrin.gif', + ':idea:' => 'icon_idea.gif', + ':oops:' => 'icon_redface.gif', + ':razz:' => 'icon_razz.gif', + ':roll:' => 'icon_rolleyes.gif', + ':wink:' => 'icon_wink.gif', + ':cry:' => 'icon_cry.gif', + ':eek:' => 'icon_surprised.gif', + ':lol:' => 'icon_lol.gif', + ':mad:' => 'icon_mad.gif', + ':sad:' => 'icon_sad.gif', + '8-)' => 'icon_cool.gif', + '8-O' => 'icon_eek.gif', + ':-(' => 'icon_sad.gif', + ':-)' => 'icon_smile.gif', + ':-?' => 'icon_confused.gif', + ':-D' => 'icon_biggrin.gif', + ':-P' => 'icon_razz.gif', + ':-o' => 'icon_surprised.gif', + ':-x' => 'icon_mad.gif', + ':-|' => 'icon_neutral.gif', + ';-)' => 'icon_wink.gif', + '8)' => 'icon_cool.gif', + '8O' => 'icon_eek.gif', + ':(' => 'icon_sad.gif', + ':)' => 'icon_smile.gif', + ':?' => 'icon_confused.gif', + ':D' => 'icon_biggrin.gif', + ':P' => 'icon_razz.gif', + ':o' => 'icon_surprised.gif', + ':x' => 'icon_mad.gif', + ':|' => 'icon_neutral.gif', + ';)' => 'icon_wink.gif', + ':!:' => 'icon_exclaim.gif', + ':?:' => 'icon_question.gif', + ); + } + + 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); + + $wp_smiliessearch = '/(?:\s|^)'; + + $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 .= ')|(?:\s|^)'; + } + $subchar = $firstchar; + $wp_smiliessearch .= preg_quote($firstchar, '/') . '(?:'; + } else { + $wp_smiliessearch .= '|'; + } + $wp_smiliessearch .= preg_quote($rest, '/'); + } + + $wp_smiliessearch .= ')(?:\s|$)/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 + * + * @param string|array $args Value to merge with $defaults + * @param array $defaults Array that serves as the defaults. + * @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 + * @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)); +} + +/** + * 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; +} + +/** + * Filters a list of objects, based on a set of key => value arguments + * + * @since 3.0.0 + * + * @param array $list An array of objects to filter + * @param array $args An array of key => value arguments to match against each object + * @param string $operator The logical operation to perform. 'or' means only one element + * from the array needs to match; 'and' means all elements must match. The default is 'and'. + * @param bool|string $field A field from the object to place instead of the entire object + * @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(); + + $list = wp_list_filter( $list, $args, $operator ); + + if ( $field ) + $list = wp_list_pluck( $list, $field ); + + return $list; +} + +/** + * Filters a list of objects, based on a set of key => value arguments + * + * @since 3.1.0 + * + * @param array $list An array of objects to filter + * @param array $args An array of key => value arguments to match against each object + * @param string $operator 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. + * The default is 'AND'. + * @return array + */ +function wp_list_filter( $list, $args = array(), $operator = 'AND' ) { + if ( ! is_array( $list ) ) + return array(); + + if ( empty( $args ) ) + return $list; + + $operator = strtoupper( $operator ); + $count = count( $args ); + $filtered = array(); + + foreach ( $list as $key => $obj ) { + $matched = count( array_intersect_assoc( (array) $obj, $args ) ); + if ( ( 'AND' == $operator && $matched == $count ) + || ( 'OR' == $operator && $matched <= $count ) + || ( 'NOT' == $operator && 0 == $matched ) ) { + $filtered[$key] = $obj; + } + } + + return $filtered; +} + +/** + * Pluck a certain field out of each object in a list + * + * @since 3.1.0 + * + * @param array $list A list of objects or arrays + * @param int|string $field A field from the object to place instead of the entire object + * @return array + */ +function wp_list_pluck( $list, $field ) { + foreach ( $list as $key => $value ) { + $value = (array) $value; + $list[ $key ] = $value[ $field ]; + } + + return $list; +} + +/** + * 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 + * @uses add_action() Calls '_admin_menu' hook with 'wp_widgets_add_menu' value. + */ +function wp_maybe_load_widgets() { + 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 + * @uses $submenu The administration submenu list. + */ +function wp_widgets_add_menu() { + global $submenu; + $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 our 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 the the WordPress 2.3.2, but originally was + * added in WordPress 2.5.0. + * + * @since 2.3.2 + * @uses $wpdb + */ +function dead_db() { + global $wpdb; + + // 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 ( defined('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' ); +?> + +> + + + Database Error + + + +

    Error establishing a database connection

    + + +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 file as deprecated and informs when it has been used. + * + * There is a hook 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. + * + * @package WordPress + * @subpackage Debug + * @since 2.5.0 + * @access private + * + * @uses do_action() Calls 'deprecated_file_included' and passes the file name, what to use instead, + * the version in which the file was deprecated, and any message regarding the change. + * @uses apply_filters() Calls 'deprecated_file_trigger_error' and expects boolean value of true to do + * trigger or false to not trigger error. + * + * @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 + * @param string $message Optional. A message regarding the change + */ +function _deprecated_file( $file, $version, $replacement = null, $message = '' ) { + + do_action( 'deprecated_file_included', $file, $replacement, $version, $message ); + + // Allow plugin to filter the output error trigger + if ( WP_DEBUG && apply_filters( 'deprecated_file_trigger_error', true ) ) { + $message = empty( $message ) ? '' : ' ' . $message; + 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 ); + } +} +/** + * Marks a function argument as deprecated and informs 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' ); + * + * + * 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. + * + * @package WordPress + * @subpackage Debug + * @since 3.0.0 + * @access private + * + * @uses do_action() Calls 'deprecated_argument_run' and passes the function name, a message on the change, + * and the version in which the argument was deprecated. + * @uses apply_filters() Calls 'deprecated_argument_trigger_error' and expects boolean value of true to do + * trigger or false to not trigger error. + * + * @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. + */ +function _deprecated_argument( $function, $version, $message = null ) { + + do_action( 'deprecated_argument_run', $function, $message, $version ); + + // Allow plugin to filter the output error trigger + if ( WP_DEBUG && apply_filters( 'deprecated_argument_trigger_error', true ) ) { + 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 something as being incorrectly called. + * + * There is a hook 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. + * + * @package WordPress + * @subpackage Debug + * @since 3.1.0 + * @access private + * + * @uses do_action() Calls 'doing_it_wrong_run' and passes the function arguments. + * @uses apply_filters() Calls 'doing_it_wrong_trigger_error' and expects boolean value of true to do + * trigger or false to not trigger error. + * + * @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 ) { + + do_action( 'doing_it_wrong_run', $function, $message, $version ); + + // Allow plugin to filter the output error trigger + if ( WP_DEBUG && apply_filters( 'doing_it_wrong_trigger_error', true ) ) { + $version = is_null( $version ) ? '' : sprintf( __( '(This message was added in version %s.)' ), $version ); + 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 + * + * @param string $mod e.g. mod_rewrite + * @param bool $default The default return value if the module is not found + * @return bool + */ +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') ) { + 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 + * + * @return bool + */ +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, + * which is the case for PHP 4.X, then we cannot easily update the xml configuration file, + * hence we just bail out and tell user that pretty permalinks cannot be used. + * This is not a big issue because PHP 4.X is going to be depricated and for IIS it + * is recommended to use PHP 5.X NTS. + * 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') && isset($_SERVER['IIS_UrlRewriteModule']) && ( php_sapi_name() == 'cgi-fcgi' ); + } + + 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; +} + +/** + * Determine if SSL is used. + * + * @since 2.6.0 + * + * @return bool True if SSL, false if not used. + */ +function is_ssl() { + if ( isset($_SERVER['HTTPS']) ) { + if ( 'on' == strtolower($_SERVER['HTTPS']) ) + return true; + if ( '1' == $_SERVER['HTTPS'] ) + return true; + } elseif ( isset($_SERVER['SERVER_PORT']) && ( '443' == $_SERVER['SERVER_PORT'] ) ) { + return true; + } + return false; +} + +/** + * Whether SSL login should be forced. + * + * @since 2.6.0 + * + * @param string|bool $force Optional. + * @return bool True if forced, false if not forced. + */ +function force_ssl_login( $force = null ) { + static $forced = false; + + if ( !is_null( $force ) ) { + $old_forced = $forced; + $forced = $force; + return $old_forced; + } + + return $forced; +} + +/** + * Whether to force SSL used for the Administration Screens. + * + * @since 2.6.0 + * + * @param string|bool $force + * @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 + */ +function wp_guess_url() { + if ( defined('WP_SITEURL') && '' != WP_SITEURL ) { + $url = WP_SITEURL; + } else { + $schema = is_ssl() ? 'https://' : 'http://'; + $url = preg_replace('|/wp-admin/.*|i', '', $schema . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']); + } + return rtrim($url, '/'); +} + +/** + * 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 + * + * @param bool $suspend Whether to suspend or enable cache invalidation + * @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; +} + +/** + * Retrieve site option value based on name of option. + * + * @see get_option() + * @package WordPress + * @subpackage Option + * @since 2.8.0 + * + * @uses apply_filters() Calls 'pre_site_option_$option' before checking the option. + * Any value other than false will "short-circuit" the retrieval of the option + * and return the returned value. + * @uses apply_filters() Calls 'site_option_$option', after checking the option, with + * the option value. + * + * @param string $option Name of option to retrieve. Expected to not be SQL-escaped. + * @param mixed $default Optional value to return if option doesn't exist. Default false. + * @param bool $use_cache Whether to use cache. Multisite only. Default true. + * @return mixed Value set for the option. + */ +function get_site_option( $option, $default = false, $use_cache = true ) { + global $wpdb; + + // Allow plugins to short-circuit site options. + $pre = apply_filters( 'pre_site_option_' . $option, false ); + if ( false !== $pre ) + return $pre; + + if ( !is_multisite() ) { + $value = get_option($option, $default); + } else { + $cache_key = "{$wpdb->siteid}:$option"; + if ( $use_cache ) + $value = wp_cache_get($cache_key, 'site-options'); + + if ( !isset($value) || (false === $value) ) { + $row = $wpdb->get_row( $wpdb->prepare("SELECT meta_value FROM $wpdb->sitemeta WHERE meta_key = %s AND site_id = %d", $option, $wpdb->siteid ) ); + + // Has to be get_row instead of get_var because of funkiness with 0, false, null values + if ( is_object( $row ) ) + $value = $row->meta_value; + else + $value = $default; + + $value = maybe_unserialize( $value ); + + wp_cache_set( $cache_key, $value, 'site-options' ); + } + } + + return apply_filters( 'site_option_' . $option, $value ); +} + +/** + * Add a new site option. + * + * @see add_option() + * @package WordPress + * @subpackage Option + * @since 2.8.0 + * + * @uses apply_filters() Calls 'pre_add_site_option_$option' hook to allow overwriting the + * option value to be stored. + * @uses do_action() Calls 'add_site_option_$option' and 'add_site_option' hooks on success. + * + * @param string $option Name of option to add. Expected to not be SQL-escaped. + * @param mixed $value Optional. Option value, can be anything. Expected to not be SQL-escaped. + * @return bool False if option was not added and true if option was added. + */ +function add_site_option( $option, $value ) { + global $wpdb; + + $value = apply_filters( 'pre_add_site_option_' . $option, $value ); + + if ( !is_multisite() ) { + $result = add_option( $option, $value ); + } else { + $cache_key = "{$wpdb->siteid}:$option"; + + if ( $wpdb->get_row( $wpdb->prepare( "SELECT meta_value FROM $wpdb->sitemeta WHERE meta_key = %s AND site_id = %d", $option, $wpdb->siteid ) ) ) + return update_site_option( $option, $value ); + + $value = sanitize_option( $option, $value ); + wp_cache_set( $cache_key, $value, 'site-options' ); + + $_value = $value; + $value = maybe_serialize($value); + $result = $wpdb->insert( $wpdb->sitemeta, array('site_id' => $wpdb->siteid, 'meta_key' => $option, 'meta_value' => $value ) ); + $value = $_value; + } + + do_action( "add_site_option_{$option}", $option, $value ); + do_action( "add_site_option", $option, $value ); + + return $result; +} + +/** + * Removes site option by name. + * + * @see delete_option() + * @package WordPress + * @subpackage Option + * @since 2.8.0 + * + * @uses do_action() Calls 'pre_delete_site_option_$option' hook before option is deleted. + * @uses do_action() Calls 'delete_site_option' and 'delete_site_option_$option' + * hooks on success. + * + * @param string $option Name of option to remove. Expected to not be SQL-escaped. + * @return bool True, if succeed. False, if failure. + */ +function delete_site_option( $option ) { + global $wpdb; + + // ms_protect_special_option( $option ); @todo + + do_action( 'pre_delete_site_option_' . $option ); + + if ( !is_multisite() ) { + $result = delete_option( $option ); + } else { + $row = $wpdb->get_row( $wpdb->prepare( "SELECT meta_id FROM {$wpdb->sitemeta} WHERE meta_key = %s AND site_id = %d", $option, $wpdb->siteid ) ); + if ( is_null( $row ) || !$row->meta_id ) + return false; + $cache_key = "{$wpdb->siteid}:$option"; + wp_cache_delete( $cache_key, 'site-options' ); + + $result = $wpdb->query( $wpdb->prepare( "DELETE FROM {$wpdb->sitemeta} WHERE meta_key = %s AND site_id = %d", $option, $wpdb->siteid ) ); + } + + if ( $result ) { + do_action( "delete_site_option_{$option}", $option ); + do_action( "delete_site_option", $option ); + return true; + } + return false; +} + +/** + * Update the value of a site option that was already added. + * + * @see update_option() + * @since 2.8.0 + * @package WordPress + * @subpackage Option + * + * @uses apply_filters() Calls 'pre_update_site_option_$option' hook to allow overwriting the + * option value to be stored. + * @uses do_action() Calls 'update_site_option_$option' and 'update_site_option' hooks on success. + * + * @param string $option Name of option. Expected to not be SQL-escaped. + * @param mixed $value Option value. Expected to not be SQL-escaped. + * @return bool False if value was not updated and true if value was updated. + */ +function update_site_option( $option, $value ) { + global $wpdb; + + $oldvalue = get_site_option( $option ); + $value = apply_filters( 'pre_update_site_option_' . $option, $value, $oldvalue ); + + if ( $value === $oldvalue ) + return false; + + if ( !is_multisite() ) { + $result = update_option( $option, $value ); + } else { + $cache_key = "{$wpdb->siteid}:$option"; + + if ( $value && !$wpdb->get_row( $wpdb->prepare( "SELECT meta_value FROM $wpdb->sitemeta WHERE meta_key = %s AND site_id = %d", $option, $wpdb->siteid ) ) ) + return add_site_option( $option, $value ); + $value = sanitize_option( $option, $value ); + wp_cache_set( $cache_key, $value, 'site-options' ); + + $_value = $value; + $value = maybe_serialize( $value ); + $result = $wpdb->update( $wpdb->sitemeta, array( 'meta_value' => $value ), array( 'site_id' => $wpdb->siteid, 'meta_key' => $option ) ); + $value = $_value; + } + + if ( $result ) { + do_action( "update_site_option_{$option}", $option, $value ); + do_action( "update_site_option", $option, $value ); + return true; + } + return false; +} + +/** + * Delete a site transient + * + * @since 2.9.0 + * @package WordPress + * @subpackage Transient + * + * @uses do_action() Calls 'delete_site_transient_$transient' hook before transient is deleted. + * @uses do_action() Calls 'deleted_site_transient' hook on success. + * + * @param string $transient Transient name. Expected to not be SQL-escaped. + * @return bool True if successful, false otherwise + */ +function delete_site_transient( $transient ) { + global $_wp_using_ext_object_cache; + + do_action( 'delete_site_transient_' . $transient, $transient ); + if ( $_wp_using_ext_object_cache ) { + $result = wp_cache_delete( $transient, 'site-transient' ); + } else { + $option_timeout = '_site_transient_timeout_' . $transient; + $option = '_site_transient_' . $transient; + $result = delete_site_option( $option ); + if ( $result ) + delete_site_option( $option_timeout ); + } + if ( $result ) + do_action( 'deleted_site_transient', $transient ); + return $result; +} + +/** + * Get the value of a site transient + * + * If the transient does not exist or does not have a value, then the return value + * will be false. + * + * @see get_transient() + * @since 2.9.0 + * @package WordPress + * @subpackage Transient + * + * @uses apply_filters() Calls 'pre_site_transient_$transient' hook before checking the transient. + * Any value other than false will "short-circuit" the retrieval of the transient + * and return the returned value. + * @uses apply_filters() Calls 'site_transient_$option' hook, after checking the transient, with + * the transient value. + * + * @param string $transient Transient name. Expected to not be SQL-escaped. + * @return mixed Value of transient + */ +function get_site_transient( $transient ) { + global $_wp_using_ext_object_cache; + + $pre = apply_filters( 'pre_site_transient_' . $transient, false ); + if ( false !== $pre ) + return $pre; + + if ( $_wp_using_ext_object_cache ) { + $value = wp_cache_get( $transient, 'site-transient' ); + } else { + // Core transients that do not have a timeout. Listed here so querying timeouts can be avoided. + $no_timeout = array('update_core', 'update_plugins', 'update_themes'); + $transient_option = '_site_transient_' . $transient; + if ( ! in_array( $transient, $no_timeout ) ) { + $transient_timeout = '_site_transient_timeout_' . $transient; + $timeout = get_site_option( $transient_timeout ); + if ( false !== $timeout && $timeout < time() ) { + delete_site_option( $transient_option ); + delete_site_option( $transient_timeout ); + return false; + } + } + + $value = get_site_option( $transient_option ); + } + + return apply_filters( 'site_transient_' . $transient, $value ); +} + +/** + * Set/update the value of a site transient + * + * You do not need to serialize values, if the value needs to be serialize, then + * it will be serialized before it is set. + * + * @see set_transient() + * @since 2.9.0 + * @package WordPress + * @subpackage Transient + * + * @uses apply_filters() Calls 'pre_set_site_transient_$transient' hook to allow overwriting the + * transient value to be stored. + * @uses do_action() Calls 'set_site_transient_$transient' and 'setted_site_transient' hooks on success. + * + * @param string $transient Transient name. Expected to not be SQL-escaped. + * @param mixed $value Transient value. Expected to not be SQL-escaped. + * @param int $expiration Time until expiration in seconds, default 0 + * @return bool False if value was not set and true if value was set. + */ +function set_site_transient( $transient, $value, $expiration = 0 ) { + global $_wp_using_ext_object_cache; + + $value = apply_filters( 'pre_set_site_transient_' . $transient, $value ); + + if ( $_wp_using_ext_object_cache ) { + $result = wp_cache_set( $transient, $value, 'site-transient', $expiration ); + } else { + $transient_timeout = '_site_transient_timeout_' . $transient; + $transient = '_site_transient_' . $transient; + if ( false === get_site_option( $transient ) ) { + if ( $expiration ) + add_site_option( $transient_timeout, time() + $expiration ); + $result = add_site_option( $transient, $value ); + } else { + if ( $expiration ) + update_site_option( $transient_timeout, time() + $expiration ); + $result = update_site_option( $transient, $value ); + } + } + if ( $result ) { + do_action( 'set_site_transient_' . $transient ); + do_action( 'setted_site_transient', $transient ); + } + return $result; +} + +/** + * is main site + * + * + * @since 3.0.0 + * @package WordPress + * + * @param int $blog_id optional blog id to test (default current blog) + * @return bool True if not multisite or $blog_id is main site + */ +function is_main_site( $blog_id = '' ) { + global $current_site, $current_blog; + + if ( !is_multisite() ) + return true; + + if ( !$blog_id ) + $blog_id = $current_blog->blog_id; + + return $blog_id == $current_site->blog_id; +} + +/** + * Whether global terms are enabled. + * + * + * @since 3.0.0 + * @package WordPress + * + * @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 ) ) { + $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|bool + */ +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 ) / 3600, 2 ); +} + +/** + * {@internal Missing Short Description}} + * + * @since 2.9.0 + * + * @param unknown_type $a + * @param unknown_type $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 // temporary! Not in final + * + * @since 2.9.0 + * + * @param string $selected_zone Selected Zone + * @return string + */ +function wp_timezone_choice( $selected_zone ) { + static $mo_loaded = false; + + $continents = array( 'Africa', 'America', 'Antarctica', 'Arctic', 'Asia', 'Atlantic', 'Australia', 'Europe', 'Indian', 'Pacific'); + + // Load translations for continents and cities + if ( !$mo_loaded ) { + $locale = get_locale(); + $mofile = WP_LANG_DIR . '/continents-cities-' . $locale . '.mo'; + 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 + * See http://core.trac.wordpress.org/ticket/8497 + * + * @since 2.8.0 + * + * @param string $str + * @return string + */ +function _cleanup_header_comment($str) { + return trim(preg_replace("/\s*(?:\*\/|\?>).*/", '', $str)); +} + +/** + * Permanently deletes posts, pages, attachments, and comments which have been in the trash for EMPTY_TRASH_DAYS. + * + * @since 2.9.0 + */ +function wp_scheduled_delete() { + global $wpdb; + + $delete_timestamp = time() - (60*60*24*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($comment_id); + } + } +} + +/** + * 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 multple + * 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. + * + * @see http://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 If specified adds filter hook "extra_{$context}_headers" + */ +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 ); + + if ( $context != '' ) { + $extra_headers = apply_filters( "extra_{$context}_headers", array() ); + + $extra_headers = array_flip( $extra_headers ); + foreach( $extra_headers as $key=>$value ) { + $extra_headers[$key] = $key; + } + $all_headers = array_merge( $extra_headers, (array) $default_headers ); + } else { + $all_headers = $default_headers; + } + + foreach ( $all_headers as $field => $regex ) { + preg_match( '/^[ \t\/*#@]*' . preg_quote( $regex, '/' ) . ':(.*)$/mi', $file_data, ${$field}); + if ( !empty( ${$field} ) ) + ${$field} = _cleanup_header_comment( ${$field}[1] ); + else + ${$field} = ''; + } + + $file_data = compact( array_keys( $all_headers ) ); + + return $file_data; +} + +/** + * Used internally to tidy up the search terms + * + * @access private + * @since 2.9.0 + * + * @param string $t + * @return string + */ +function _search_terms_tidy($t) { + return trim($t, "\"'\n\r "); +} + +/** + * Returns true + * + * Useful for returning true to filters easily + * + * @since 3.0.0 + * @see __return_false() + * @return bool true + */ +function __return_true() { + return true; +} + +/** + * Returns false + * + * Useful for returning false to filters easily + * + * @since 3.0.0 + * @see __return_true() + * @return bool false + */ +function __return_false() { + return false; +} + +/** + * Returns 0 + * + * Useful for returning 0 to filters easily + * + * @since 3.0.0 + * @see __return_zero() + * @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 + * @see __return_zero() + * @return array Empty array + */ +function __return_empty_array() { + return array(); +} + +/** + * Send a HTTP header to disable content type sniffing in browsers which support it. + * + * @link http://blogs.msdn.com/ie/archive/2008/07/02/ie8-security-part-v-comprehensive-protection.aspx + * @link http://src.chromium.org/viewvc/chrome?view=rev&revision=6985 + * + * @since 3.0.0 + * @return none + */ +function send_nosniff_header() { + @header( 'X-Content-Type-Options: nosniff' ); +} + +/** + * Returns a MySQL expression for selecting the week number based on the start_of_week option. + * + * @internal + * @since 3.0.0 + * @param string $column + * @return string + */ +function _wp_mysql_week( $column ) { + switch ( $start_of_week = (int) get_option( 'start_of_week' ) ) { + default : + case 0 : + return "WEEK( $column, 0 )"; + 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 )"; + } +} + +/** + * Finds hierarchy loops using a callback function that maps object IDs to parent IDs. + * + * @since 3.1.0 + * @access private + * + * @param callback $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 ); +} + +/** + * Uses 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 callback $callback function that accupts ( ID, callback_arg, ... ) and outputs parent_ID + * @param int $start The ID to start the loop check at + * @param array $override an array of ( ID => parent_ID, ... ) to use instead of $callback + * @param array $callback_args optional additional arguments to send to $callback + * @param bool $_return_loop 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) + * @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. + * + * @link https://developer.mozilla.org/en/the_x-frame-options_response_header + * + * @since 3.1.3 + * @return none + */ +function send_frame_options_header() { + @header( 'X-Frame-Options: SAMEORIGIN' ); +} + +?> diff --git a/src/wp-includes/functions.wp-scripts.php b/src/wp-includes/functions.wp-scripts.php new file mode 100644 index 0000000..af2055d --- /dev/null +++ b/src/wp-includes/functions.wp-scripts.php @@ -0,0 +1,147 @@ +do_items( $handles ); +} + +/** + * Register new JavaScript file. + * + * @since r16 + * @param string $handle Script name + * @param string $src Script url + * @param array $deps (optional) Array of script names on which this script depends + * @param string|bool $ver (optional) Script version (used for cache busting), set to NULL to disable + * @param bool $in_footer (optional) Whether to enqueue the script before or before + * @return null + */ +function wp_register_script( $handle, $src, $deps = array(), $ver = false, $in_footer = false ) { + global $wp_scripts; + if ( !is_a($wp_scripts, 'WP_Scripts') ) + $wp_scripts = new WP_Scripts(); + + $wp_scripts->add( $handle, $src, $deps, $ver ); + if ( $in_footer ) + $wp_scripts->add_data( $handle, 'group', 1 ); +} + +/** + * Localizes a script. + * + * Localizes only if script has already been added. + * + * @since r16 + * @see WP_Scripts::localize() + */ +function wp_localize_script( $handle, $object_name, $l10n ) { + global $wp_scripts; + if ( !is_a($wp_scripts, 'WP_Scripts') ) + return false; + + return $wp_scripts->localize( $handle, $object_name, $l10n ); +} + +/** + * Remove a registered script. + * + * @since r16 + * @see WP_Scripts::remove() For parameter information. + */ +function wp_deregister_script( $handle ) { + global $wp_scripts; + if ( !is_a($wp_scripts, 'WP_Scripts') ) + $wp_scripts = new WP_Scripts(); + + $wp_scripts->remove( $handle ); +} + +/** + * Enqueues script. + * + * Registers the script if src provided (does NOT overwrite) and enqueues. + * + * @since r16 + * @see wp_register_script() For parameter information. + */ +function wp_enqueue_script( $handle, $src = false, $deps = array(), $ver = false, $in_footer = false ) { + global $wp_scripts; + if ( !is_a($wp_scripts, 'WP_Scripts') ) + $wp_scripts = new WP_Scripts(); + + if ( $src ) { + $_handle = explode('?', $handle); + $wp_scripts->add( $_handle[0], $src, $deps, $ver ); + if ( $in_footer ) + $wp_scripts->add_data( $_handle[0], 'group', 1 ); + } + $wp_scripts->enqueue( $handle ); +} + +/** + * Remove an enqueued script. + * + * @since WP 3.1 + * @see WP_Scripts::dequeue() For parameter information. + */ +function wp_dequeue_script( $handle ) { + global $wp_scripts; + if ( !is_a($wp_scripts, 'WP_Scripts') ) + $wp_scripts = new WP_Scripts(); + + $wp_scripts->dequeue( $handle ); +} + +/** + * Check whether script has been added to WordPress Scripts. + * + * The values for list defaults to 'queue', which is the same as enqueue for + * scripts. + * + * @since WP unknown; BP unknown + * + * @param string $handle Handle used to add script. + * @param string $list Optional, defaults to 'queue'. Others values are 'registered', 'queue', 'done', 'to_do' + * @return bool + */ +function wp_script_is( $handle, $list = 'queue' ) { + global $wp_scripts; + if ( !is_a($wp_scripts, 'WP_Scripts') ) + $wp_scripts = new WP_Scripts(); + + $query = $wp_scripts->query( $handle, $list ); + + if ( is_object( $query ) ) + return true; + + return $query; +} diff --git a/src/wp-includes/functions.wp-styles.php b/src/wp-includes/functions.wp-styles.php new file mode 100644 index 0000000..630a112 --- /dev/null +++ b/src/wp-includes/functions.wp-styles.php @@ -0,0 +1,145 @@ +do_items( $handles ); +} + +/** + * Register CSS style file. + * + * @since r79 + * @see WP_Styles::add() For additional information. + * @global object $wp_styles The WP_Styles object for printing styles. + * @link http://www.w3.org/TR/CSS2/media.html#media-types List of CSS media types. + * + * @param string $handle Name of the stylesheet. + * @param string|bool $src Path to the stylesheet from the root directory of WordPress. Example: '/css/mystyle.css'. + * @param array $deps Array of handles of any stylesheet that this stylesheet depends on. + * (Stylesheets that must be loaded before this stylesheet.) Pass an empty array if there are no dependencies. + * @param string|bool $ver String specifying the stylesheet version number. Set to NULL to disable. + * Used to ensure that the correct version is sent to the client regardless of caching. + * @param string $media The media for which this stylesheet has been defined. + */ +function wp_register_style( $handle, $src, $deps = array(), $ver = false, $media = 'all' ) { + global $wp_styles; + if ( !is_a($wp_styles, 'WP_Styles') ) + $wp_styles = new WP_Styles(); + + $wp_styles->add( $handle, $src, $deps, $ver, $media ); +} + +/** + * Remove a registered CSS file. + * + * @since r79 + * @see WP_Styles::remove() For additional information. + * @global object $wp_styles The WP_Styles object for printing styles. + * + * @param string $handle Name of the stylesheet. + */ +function wp_deregister_style( $handle ) { + global $wp_styles; + if ( !is_a($wp_styles, 'WP_Styles') ) + $wp_styles = new WP_Styles(); + + $wp_styles->remove( $handle ); +} + +/** + * Enqueue a CSS style file. + * + * Registers the style if src provided (does NOT overwrite) and enqueues. + * + * @since r79 + * @see WP_Styles::add(), WP_Styles::enqueue() + * @global object $wp_styles The WP_Styles object for printing styles. + * @link http://www.w3.org/TR/CSS2/media.html#media-types List of CSS media types. + * + * @param string $handle Name of the stylesheet. + * @param string|bool $src Path to the stylesheet from the root directory of WordPress. Example: '/css/mystyle.css'. + * @param array $deps Array of handles (names) of any stylesheet that this stylesheet depends on. + * (Stylesheets that must be loaded before this stylesheet.) Pass an empty array if there are no dependencies. + * @param string|bool $ver String specifying the stylesheet version number, if it has one. This parameter + * is used to ensure that the correct version is sent to the client regardless of caching, and so should be included + * if a version number is available and makes sense for the stylesheet. + * @param string $media The media for which this stylesheet has been defined. + */ +function wp_enqueue_style( $handle, $src = false, $deps = array(), $ver = false, $media = 'all' ) { + global $wp_styles; + if ( !is_a($wp_styles, 'WP_Styles') ) + $wp_styles = new WP_Styles(); + + if ( $src ) { + $_handle = explode('?', $handle); + $wp_styles->add( $_handle[0], $src, $deps, $ver, $media ); + } + $wp_styles->enqueue( $handle ); +} + +/** + * Remove an enqueued style. + * + * @since WP 3.1 + * @see WP_Styles::dequeue() For parameter information. + */ +function wp_dequeue_style( $handle ) { + global $wp_styles; + if ( !is_a($wp_styles, 'WP_Styles') ) + $wp_styles = new WP_Styles(); + + $wp_styles->dequeue( $handle ); +} + +/** + * Check whether style has been added to WordPress Styles. + * + * The values for list defaults to 'queue', which is the same as wp_enqueue_style(). + * + * @since WP unknown; BP unknown + * @global object $wp_styles The WP_Styles object for printing styles. + * + * @param string $handle Name of the stylesheet. + * @param string $list Values are 'registered', 'done', 'queue' and 'to_do'. + * @return bool True on success, false on failure. + */ +function wp_style_is( $handle, $list = 'queue' ) { + global $wp_styles; + if ( !is_a($wp_styles, 'WP_Styles') ) + $wp_styles = new WP_Styles(); + + $query = $wp_styles->query( $handle, $list ); + + if ( is_object( $query ) ) + return true; + + return $query; +} diff --git a/src/wp-includes/general-template.php b/src/wp-includes/general-template.php new file mode 100644 index 0000000..be1af2a --- /dev/null +++ b/src/wp-includes/general-template.php @@ -0,0 +1,2327 @@ + +
    + + +
    + '; + + if ( $echo ) + echo apply_filters('get_search_form', $form); + else + return apply_filters('get_search_form', $form); +} + +/** + * 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 + * @uses apply_filters() Calls 'loginout' hook on HTML link content. + * + * @param string $redirect Optional path to redirect to on login/logout. + * @param boolean $echo Default to echo and not return the link. + */ +function wp_loginout($redirect = '', $echo = true) { + if ( ! is_user_logged_in() ) + $link = '' . __('Log in') . ''; + else + $link = '' . __('Log out') . ''; + + if ( $echo ) + echo apply_filters('loginout', $link); + else + return apply_filters('loginout', $link); +} + +/** + * Returns the Log Out URL. + * + * Returns the URL that allows the user to log out of the site + * + * @since 2.7.0 + * @uses wp_nonce_url() To protect against CSRF + * @uses site_url() To generate the log in URL + * @uses apply_filters() calls 'logout_url' hook on final logout url + * + * @param string $redirect Path to redirect to on logout. + */ +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' ); + + return apply_filters('logout_url', $logout_url, $redirect); +} + +/** + * Returns the Log In URL. + * + * Returns the URL that allows the user to log in to the site + * + * @since 2.7.0 + * @uses site_url() To generate the log in URL + * @uses apply_filters() calls 'login_url' hook on final login url + * + * @param string $redirect Path to redirect to on login. + * @param bool $force_reauth Whether to force reauthorization, even if a cookie is present. Default is false. + * @return string A log in url + */ +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); + + return apply_filters('login_url', $login_url, $redirect); +} + +/** + * Provides a simple login form for use anywhere within WordPress. By default, it echoes + * the HTML immediately. Pass array('echo'=>false) to return the string instead. + * + * @since 3.0.0 + * @param array $args Configuration options to modify the form output + * @return Void, or string containing the form + */ +function wp_login_form( $args = array() ) { + $defaults = array( 'echo' => true, + 'redirect' => site_url( $_SERVER['REQUEST_URI'] ), // Default redirect is back to the current page + 'form_id' => 'loginform', + 'label_username' => __( 'Username' ), + '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' => '', + 'value_remember' => false, // Set this to true to default the "Remember me" checkbox to checked + ); + $args = wp_parse_args( $args, apply_filters( 'login_form_defaults', $defaults ) ); + + $form = ' +
    + ' . apply_filters( 'login_form_top', '', $args ) . ' + + + ' . apply_filters( 'login_form_middle', '', $args ) . ' + ' . ( $args['remember'] ? '' : '' ) . ' + + ' . apply_filters( 'login_form_bottom', '', $args ) . ' +
    '; + + if ( $args['echo'] ) + echo $form; + else + return $form; +} + +/** + * Returns the Lost Password URL. + * + * Returns the URL that allows the user to retrieve the lost password + * + * @since 2.8.0 + * @uses site_url() To generate the lost password URL + * @uses apply_filters() calls 'lostpassword_url' hook on the lostpassword url + * + * @param string $redirect Path to redirect to on login. + */ +function wp_lostpassword_url($redirect = '') { + $args = array( 'action' => 'lostpassword' ); + if ( !empty($redirect) ) { + $args['redirect_to'] = $redirect; + } + + $lostpassword_url = add_query_arg($args, site_url('wp-login.php', '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 + * @uses apply_filters() Calls 'register' hook on register / admin link content. + * + * @param string $before Text to output before the link (defaults to
  • ). + * @param string $after Text to output after the link (defaults to
  • ). + * @param boolean $echo Default to echo and not return the link. + */ +function wp_register( $before = '
  • ', $after = '
  • ', $echo = true ) { + + if ( ! is_user_logged_in() ) { + if ( get_option('users_can_register') ) + $link = $before . '' . __('Register') . '' . $after; + else + $link = ''; + } else { + $link = $before . '' . __('Site Admin') . '' . $after; + } + + if ( $echo ) + echo apply_filters('register', $link); + else + return apply_filters('register', $link); +} + +/** + * Theme container function for the 'wp_meta' action. + * + * The '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 http://trac.wordpress.org/ticket/1458 Explanation of 'wp_meta' action. + * @uses do_action() Calls 'wp_meta' hook. + */ +function wp_meta() { + do_action('wp_meta'); +} + +/** + * Display information about the blog. + * + * @see get_bloginfo() For possible values for the parameter. + * @since 0.71 + * + * @param string $show What to display. + */ +function bloginfo( $show='' ) { + echo get_bloginfo( $show, 'display' ); +} + +/** + * Retrieve information about the blog. + * + * Some show parameter values are deprecated and will be removed in future + * versions. These options will trigger the _deprecated_argument() function. + * The deprecated blog info options are listed in the function contents. + * + * The possible values for the 'show' parameter are listed below. + *
      + *
    1. url - Blog URI to homepage.
    2. + *
    3. wpurl - Blog URI path to WordPress.
    4. + *
    5. description - Secondary title
    6. + *
    + * + * The feed URL options can be retrieved from 'rdf_url' (RSS 0.91), + * 'rss_url' (RSS 1.0), 'rss2_url' (RSS 2.0), or 'atom_url' (Atom feed). The + * comment feeds can be retrieved from the 'comments_atom_url' (Atom comment + * feed) or 'comments_rss2_url' (RSS 2.0 comment feed). + * + * @since 0.71 + * + * @param string $show Blog info to retrieve. + * @param string $filter How to filter what is retrieved. + * @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', sprintf( __('The %s option is deprecated for the family of bloginfo() functions.' ), $show ) . ' ' . sprintf( __( 'Use the %s option instead.' ), '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 = get_option('siteurl') .'/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': + $output = get_locale(); + $output = str_replace('_', '-', $output); + break; + case 'text_direction': + //_deprecated_argument( __FUNCTION__, '2.2', sprintf( __('The %s option is deprecated for the family of bloginfo() functions.' ), $show ) . ' ' . sprintf( __( 'Use the %s function instead.' ), '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 ) + $output = apply_filters('bloginfo_url', $output, $show); + else + $output = apply_filters('bloginfo', $output, $show); + } + + return $output; +} + +/** + * Retrieve the current blog id + * + * @since 3.1.0 + * + * @return int Blog id + */ +function get_current_blog_id() { + global $blog_id; + return absint($blog_id); +} + +/** + * 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' + * or 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 backwards compatibility of themes is + * important. + * + * @since 1.0.0 + * + * @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 $wpdb, $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_TITILE_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 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(); + $tax = get_taxonomy( $term->taxonomy ); + $title = single_term_title( $tax->labels->name . $t_sep, false ); + } + + // If there's an author + if ( is_author() ) { + $author = get_queried_object(); + $title = $author->display_name; + } + + // If there's a post type archive + if ( is_post_type_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 "; + + // Determines position of the separator and direction of the breadcrumb + if ( 'right' == $seplocation ) { // sep on right, so reverse the order + $title_array = explode( $t_sep, $title ); + $title_array = array_reverse( $title_array ); + $title = implode( " $sep ", $title_array ) . $prefix; + } else { + $title_array = explode( $t_sep, $title ); + $title = $prefix . implode( " $sep ", $title_array ); + } + + $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|null Title when retrieving, null when displaying or failure. + */ +function single_post_title($prefix = '', $display = true) { + $_post = get_queried_object(); + + if ( !isset($_post->post_title) ) + return; + + $title = apply_filters('single_post_title', $_post->post_title, $_post); + if ( $display ) + echo $prefix . $title; + else + return $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|null Title when retrieving, null when displaying or failure. + */ +function post_type_archive_title( $prefix = '', $display = true ) { + if ( ! is_post_type_archive() ) + return; + + $post_type_obj = get_queried_object(); + $title = apply_filters('post_type_archive_title', $post_type_obj->labels->name ); + + if ( $display ) + echo $prefix . $title; + else + return $title; +} + +/** + * Display or retrieve page title for category archive. + * + * This is useful for category template file or files, because it is optimized + * for category page title and with less overhead than {@link wp_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|null Title when retrieving, null when displaying or failure. + */ +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. It has less + * overhead than {@link wp_title()}, because of its limited implementation. + * + * 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 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|null Title when retrieving, null when displaying or failure. + */ +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. + * It has less overhead than {@link wp_title()}, because of its limited implementation. + * + * 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 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|null Title when retrieving, null when displaying or failure. + */ +function single_term_title( $prefix = '', $display = true ) { + $term = get_queried_object(); + + if ( !$term ) + return; + + if ( is_category() ) + $term_name = apply_filters( 'single_cat_title', $term->name ); + elseif ( is_tag() ) + $term_name = apply_filters( 'single_tag_title', $term->name ); + elseif ( is_tax() ) + $term_name = apply_filters( 'single_term_title', $term->name ); + else + return; + + if ( empty( $term_name ) ) + return; + + if ( $display ) + echo $prefix . $term_name; + else + return $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. Optimized for just this purpose, so if it is all that + * is needed, should be better than {@link wp_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|null Title when retrieving, null when displaying or failure. + */ +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; +} + +/** + * 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 link 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. + * @param string $after Optional. + * @return string HTML link content for archive. + */ +function get_archives_link($url, $text, $format = 'html', $before = '', $after = '') { + $text = wptexturize($text); + $title_text = esc_attr($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
  • $before$text$after
  • \n"; + else // custom + $link_html = "\t$before$text$after\n"; + + $link_html = apply_filters( 'get_archives_link', $link_html ); + + return $link_html; +} + +/** + * Display archive links based on type and format. + * + * The 'type' argument offers a few choices and by default will display monthly + * archive links. The other options for values are 'daily', 'weekly', 'monthly', + * 'yearly', 'postbypost' or 'alpha'. Both 'postbypost' and 'alpha' display the + * same archive link list, the difference between the two is that 'alpha' + * will order by post title and 'postbypost' will order by post date. + * + * The date archives will logically display dates with links to the archive post + * page. The 'postbypost' and 'alpha' values for 'type' argument will display + * the post titles. + * + * The 'limit' argument will only display a limited amount of links, specified + * by the 'limit' integer value. By default, there is no limit. The + * 'show_post_count' argument will show how many posts are within the archive. + * By default, the 'show_post_count' argument is set to false. + * + * For the 'format', 'before', and 'after' arguments, see {@link + * get_archives_link()}. The values of these arguments have to do with that + * function. + * + * @since 1.2.0 + * + * @param string|array $args Optional. Override defaults. + */ +function wp_get_archives($args = '') { + global $wpdb, $wp_locale; + + $defaults = array( + 'type' => 'monthly', 'limit' => '', + 'format' => 'html', 'before' => '', + 'after' => '', 'show_post_count' => false, + 'echo' => 1 + ); + + $r = wp_parse_args( $args, $defaults ); + extract( $r, EXTR_SKIP ); + + if ( '' == $type ) + $type = 'monthly'; + + if ( '' != $limit ) { + $limit = absint($limit); + $limit = ' LIMIT '.$limit; + } + + // this is what will separate dates on weekly archive links + $archive_week_separator = '–'; + + // over-ride general date format ? 0 = no: use the date format set in Options, 1 = yes: over-ride + $archive_date_format_over_ride = 0; + + // options for daily archive (only if you over-ride the general date format) + $archive_day_date_format = 'Y/m/d'; + + // options for weekly archive (only if you over-ride the general date format) + $archive_week_start_date_format = 'Y/m/d'; + $archive_week_end_date_format = 'Y/m/d'; + + if ( !$archive_date_format_over_ride ) { + $archive_day_date_format = get_option('date_format'); + $archive_week_start_date_format = get_option('date_format'); + $archive_week_end_date_format = get_option('date_format'); + } + + //filters + $where = apply_filters( 'getarchives_where', "WHERE post_type = 'post' AND post_status = 'publish'", $r ); + $join = apply_filters( 'getarchives_join', '', $r ); + + $output = ''; + + if ( 'monthly' == $type ) { + $query = "SELECT YEAR(post_date) AS `year`, MONTH(post_date) AS `month`, count(ID) as posts FROM $wpdb->posts $join $where GROUP BY YEAR(post_date), MONTH(post_date) ORDER BY post_date DESC $limit"; + $key = md5($query); + $cache = wp_cache_get( 'wp_get_archives' , 'general'); + if ( !isset( $cache[ $key ] ) ) { + $arcresults = $wpdb->get_results($query); + $cache[ $key ] = $arcresults; + wp_cache_set( 'wp_get_archives', $cache, 'general' ); + } else { + $arcresults = $cache[ $key ]; + } + if ( $arcresults ) { + $afterafter = $after; + foreach ( (array) $arcresults as $arcresult ) { + $url = get_month_link( $arcresult->year, $arcresult->month ); + /* translators: 1: month name, 2: 4-digit year */ + $text = sprintf(__('%1$s %2$d'), $wp_locale->get_month($arcresult->month), $arcresult->year); + if ( $show_post_count ) + $after = ' ('.$arcresult->posts.')' . $afterafter; + $output .= get_archives_link($url, $text, $format, $before, $after); + } + } + } elseif ('yearly' == $type) { + $query = "SELECT YEAR(post_date) AS `year`, count(ID) as posts FROM $wpdb->posts $join $where GROUP BY YEAR(post_date) ORDER BY post_date DESC $limit"; + $key = md5($query); + $cache = wp_cache_get( 'wp_get_archives' , 'general'); + if ( !isset( $cache[ $key ] ) ) { + $arcresults = $wpdb->get_results($query); + $cache[ $key ] = $arcresults; + wp_cache_set( 'wp_get_archives', $cache, 'general' ); + } else { + $arcresults = $cache[ $key ]; + } + if ($arcresults) { + $afterafter = $after; + foreach ( (array) $arcresults as $arcresult) { + $url = get_year_link($arcresult->year); + $text = sprintf('%d', $arcresult->year); + if ($show_post_count) + $after = ' ('.$arcresult->posts.')' . $afterafter; + $output .= get_archives_link($url, $text, $format, $before, $after); + } + } + } elseif ( 'daily' == $type ) { + $query = "SELECT YEAR(post_date) AS `year`, MONTH(post_date) AS `month`, DAYOFMONTH(post_date) AS `dayofmonth`, count(ID) as posts FROM $wpdb->posts $join $where GROUP BY YEAR(post_date), MONTH(post_date), DAYOFMONTH(post_date) ORDER BY post_date DESC $limit"; + $key = md5($query); + $cache = wp_cache_get( 'wp_get_archives' , 'general'); + if ( !isset( $cache[ $key ] ) ) { + $arcresults = $wpdb->get_results($query); + $cache[ $key ] = $arcresults; + wp_cache_set( 'wp_get_archives', $cache, 'general' ); + } else { + $arcresults = $cache[ $key ]; + } + if ( $arcresults ) { + $afterafter = $after; + foreach ( (array) $arcresults as $arcresult ) { + $url = get_day_link($arcresult->year, $arcresult->month, $arcresult->dayofmonth); + $date = sprintf('%1$d-%2$02d-%3$02d 00:00:00', $arcresult->year, $arcresult->month, $arcresult->dayofmonth); + $text = mysql2date($archive_day_date_format, $date); + if ($show_post_count) + $after = ' ('.$arcresult->posts.')'.$afterafter; + $output .= get_archives_link($url, $text, $format, $before, $after); + } + } + } elseif ( 'weekly' == $type ) { + $week = _wp_mysql_week( '`post_date`' ); + $query = "SELECT DISTINCT $week AS `week`, YEAR( `post_date` ) AS `yr`, DATE_FORMAT( `post_date`, '%Y-%m-%d' ) AS `yyyymmdd`, count( `ID` ) AS `posts` FROM `$wpdb->posts` $join $where GROUP BY $week, YEAR( `post_date` ) ORDER BY `post_date` DESC $limit"; + $key = md5($query); + $cache = wp_cache_get( 'wp_get_archives' , 'general'); + if ( !isset( $cache[ $key ] ) ) { + $arcresults = $wpdb->get_results($query); + $cache[ $key ] = $arcresults; + wp_cache_set( 'wp_get_archives', $cache, 'general' ); + } else { + $arcresults = $cache[ $key ]; + } + $arc_w_last = ''; + $afterafter = $after; + if ( $arcresults ) { + foreach ( (array) $arcresults as $arcresult ) { + if ( $arcresult->week != $arc_w_last ) { + $arc_year = $arcresult->yr; + $arc_w_last = $arcresult->week; + $arc_week = get_weekstartend($arcresult->yyyymmdd, get_option('start_of_week')); + $arc_week_start = date_i18n($archive_week_start_date_format, $arc_week['start']); + $arc_week_end = date_i18n($archive_week_end_date_format, $arc_week['end']); + $url = sprintf('%1$s/%2$s%3$sm%4$s%5$s%6$sw%7$s%8$d', home_url(), '', '?', '=', $arc_year, '&', '=', $arcresult->week); + $text = $arc_week_start . $archive_week_separator . $arc_week_end; + if ($show_post_count) + $after = ' ('.$arcresult->posts.')'.$afterafter; + $output .= get_archives_link($url, $text, $format, $before, $after); + } + } + } + } elseif ( ( 'postbypost' == $type ) || ('alpha' == $type) ) { + $orderby = ('alpha' == $type) ? 'post_title ASC ' : 'post_date DESC '; + $query = "SELECT * FROM $wpdb->posts $join $where ORDER BY $orderby $limit"; + $key = md5($query); + $cache = wp_cache_get( 'wp_get_archives' , 'general'); + if ( !isset( $cache[ $key ] ) ) { + $arcresults = $wpdb->get_results($query); + $cache[ $key ] = $arcresults; + wp_cache_set( 'wp_get_archives', $cache, 'general' ); + } else { + $arcresults = $cache[ $key ]; + } + if ( $arcresults ) { + foreach ( (array) $arcresults as $arcresult ) { + if ( $arcresult->post_date != '0000-00-00 00:00:00' ) { + $url = get_permalink($arcresult); + $arc_title = $arcresult->post_title; + if ( $arc_title ) + $text = strip_tags(apply_filters('the_title', $arc_title)); + else + $text = $arcresult->ID; + $output .= get_archives_link($url, $text, $format, $before, $after); + } + } + } + } + if ( $echo ) + echo $output; + else + return $output; +} + +/** + * Get number of days since the start of the week. + * + * @since 1.5.0 + * @usedby get_calendar() + * + * @param int $num Number of day. + * @return int Days since the start of the week. + */ +function calendar_week_mod($num) { + $base = 7; + return ($num - $base*floor($num/$base)); +} + +/** + * Display calendar with days that have posts as links. + * + * The calendar is cached, which will be retrieved, if it exists. If there are + * no posts for the month, then it will not be displayed. + * + * @since 1.0.0 + * + * @param bool $initial Optional, default is true. Use initial calendar names. + * @param bool $echo Optional, default is true. Set to false for return. + */ +function get_calendar($initial = true, $echo = true) { + global $wpdb, $m, $monthnum, $year, $wp_locale, $posts; + + $cache = array(); + $key = md5( $m . $monthnum . $year ); + if ( $cache = wp_cache_get( 'get_calendar', 'calendar' ) ) { + if ( is_array($cache) && isset( $cache[ $key ] ) ) { + if ( $echo ) { + echo apply_filters( 'get_calendar', $cache[$key] ); + return; + } else { + return apply_filters( 'get_calendar', $cache[$key] ); + } + } + } + + if ( !is_array($cache) ) + $cache = array(); + + // Quick check. If we have no posts at all, abort! + if ( !$posts ) { + $gotsome = $wpdb->get_var("SELECT 1 as test FROM $wpdb->posts WHERE post_type = 'post' AND post_status = 'publish' LIMIT 1"); + if ( !$gotsome ) { + $cache[ $key ] = ''; + wp_cache_set( 'get_calendar', $cache, 'calendar' ); + return; + } + } + + if ( isset($_GET['w']) ) + $w = ''.intval($_GET['w']); + + // week_begins = 0 stands for Sunday + $week_begins = intval(get_option('start_of_week')); + + // Let's figure out when we are + if ( !empty($monthnum) && !empty($year) ) { + $thismonth = ''.zeroise(intval($monthnum), 2); + $thisyear = ''.intval($year); + } elseif ( !empty($w) ) { + // We need to get the month from MySQL + $thisyear = ''.intval(substr($m, 0, 4)); + $d = (($w - 1) * 7) + 6; //it seems MySQL's weeks disagree with PHP's + $thismonth = $wpdb->get_var("SELECT DATE_FORMAT((DATE_ADD('{$thisyear}0101', INTERVAL $d DAY) ), '%m')"); + } elseif ( !empty($m) ) { + $thisyear = ''.intval(substr($m, 0, 4)); + if ( strlen($m) < 6 ) + $thismonth = '01'; + else + $thismonth = ''.zeroise(intval(substr($m, 4, 2)), 2); + } else { + $thisyear = gmdate('Y', current_time('timestamp')); + $thismonth = gmdate('m', current_time('timestamp')); + } + + $unixmonth = mktime(0, 0 , 0, $thismonth, 1, $thisyear); + $last_day = date('t', $unixmonth); + + // Get the next and previous month and year with at least one post + $previous = $wpdb->get_row("SELECT MONTH(post_date) AS month, YEAR(post_date) AS year + FROM $wpdb->posts + WHERE post_date < '$thisyear-$thismonth-01' + AND post_type = 'post' AND post_status = 'publish' + ORDER BY post_date DESC + LIMIT 1"); + $next = $wpdb->get_row("SELECT MONTH(post_date) AS month, YEAR(post_date) AS year + FROM $wpdb->posts + WHERE post_date > '$thisyear-$thismonth-{$last_day} 23:59:59' + AND post_type = 'post' AND post_status = 'publish' + ORDER BY post_date ASC + LIMIT 1"); + + /* translators: Calendar caption: 1: month name, 2: 4-digit year */ + $calendar_caption = _x('%1$s %2$s', 'calendar caption'); + $calendar_output = ' + + + '; + + $myweek = array(); + + for ( $wdcount=0; $wdcount<=6; $wdcount++ ) { + $myweek[] = $wp_locale->get_weekday(($wdcount+$week_begins)%7); + } + + foreach ( $myweek as $wd ) { + $day_name = (true == $initial) ? $wp_locale->get_weekday_initial($wd) : $wp_locale->get_weekday_abbrev($wd); + $wd = esc_attr($wd); + $calendar_output .= "\n\t\t"; + } + + $calendar_output .= ' + + + + + '; + + if ( $previous ) { + $calendar_output .= "\n\t\t".''; + } else { + $calendar_output .= "\n\t\t".''; + } + + $calendar_output .= "\n\t\t".''; + + if ( $next ) { + $calendar_output .= "\n\t\t".''; + } else { + $calendar_output .= "\n\t\t".''; + } + + $calendar_output .= ' + + + + + '; + + // Get days with posts + $dayswithposts = $wpdb->get_results("SELECT DISTINCT DAYOFMONTH(post_date) + FROM $wpdb->posts WHERE post_date >= '{$thisyear}-{$thismonth}-01 00:00:00' + AND post_type = 'post' AND post_status = 'publish' + AND post_date <= '{$thisyear}-{$thismonth}-{$last_day} 23:59:59'", ARRAY_N); + if ( $dayswithposts ) { + foreach ( (array) $dayswithposts as $daywith ) { + $daywithpost[] = $daywith[0]; + } + } else { + $daywithpost = array(); + } + + if (strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE') !== false || stripos($_SERVER['HTTP_USER_AGENT'], 'camino') !== false || stripos($_SERVER['HTTP_USER_AGENT'], 'safari') !== false) + $ak_title_separator = "\n"; + else + $ak_title_separator = ', '; + + $ak_titles_for_day = array(); + $ak_post_titles = $wpdb->get_results("SELECT ID, post_title, DAYOFMONTH(post_date) as dom " + ."FROM $wpdb->posts " + ."WHERE post_date >= '{$thisyear}-{$thismonth}-01 00:00:00' " + ."AND post_date <= '{$thisyear}-{$thismonth}-{$last_day} 23:59:59' " + ."AND post_type = 'post' AND post_status = 'publish'" + ); + if ( $ak_post_titles ) { + foreach ( (array) $ak_post_titles as $ak_post_title ) { + + $post_title = esc_attr( apply_filters( 'the_title', $ak_post_title->post_title, $ak_post_title->ID ) ); + + if ( empty($ak_titles_for_day['day_'.$ak_post_title->dom]) ) + $ak_titles_for_day['day_'.$ak_post_title->dom] = ''; + if ( empty($ak_titles_for_day["$ak_post_title->dom"]) ) // first one + $ak_titles_for_day["$ak_post_title->dom"] = $post_title; + else + $ak_titles_for_day["$ak_post_title->dom"] .= $ak_title_separator . $post_title; + } + } + + + // See how much we should pad in the beginning + $pad = calendar_week_mod(date('w', $unixmonth)-$week_begins); + if ( 0 != $pad ) + $calendar_output .= "\n\t\t".''; + + $daysinmonth = intval(date('t', $unixmonth)); + for ( $day = 1; $day <= $daysinmonth; ++$day ) { + if ( isset($newrow) && $newrow ) + $calendar_output .= "\n\t\n\t\n\t\t"; + $newrow = false; + + if ( $day == gmdate('j', current_time('timestamp')) && $thismonth == gmdate('m', current_time('timestamp')) && $thisyear == gmdate('Y', current_time('timestamp')) ) + $calendar_output .= ''; + + if ( 6 == calendar_week_mod(date('w', mktime(0, 0 , 0, $thismonth, $day, $thisyear))-$week_begins) ) + $newrow = true; + } + + $pad = 7 - calendar_week_mod(date('w', mktime(0, 0 , 0, $thismonth, $day, $thisyear))-$week_begins); + if ( $pad != 0 && $pad != 7 ) + $calendar_output .= "\n\t\t".''; + + $calendar_output .= "\n\t\n\t\n\t
    ' . sprintf($calendar_caption, $wp_locale->get_month($thismonth), date('Y', $unixmonth)) . '
    $day_name
    « ' . $wp_locale->get_month_abbrev($wp_locale->get_month($previous->month)) . '  ' . $wp_locale->get_month_abbrev($wp_locale->get_month($next->month)) . ' » 
     
    '; + else + $calendar_output .= ''; + + if ( in_array($day, $daywithpost) ) // any posts today? + $calendar_output .= '$day"; + else + $calendar_output .= $day; + $calendar_output .= ' 
    "; + + $cache[ $key ] = $calendar_output; + wp_cache_set( 'get_calendar', $cache, 'calendar' ); + + if ( $echo ) + echo apply_filters( 'get_calendar', $calendar_output ); + else + return apply_filters( 'get_calendar', $calendar_output ); + +} + +/** + * Purge the cached results of get_calendar. + * + * @see get_calendar + * @since 2.1.0 + */ +function delete_get_calendar_cache() { + wp_cache_delete( 'get_calendar', 'calendar' ); +} +add_action( 'save_post', 'delete_get_calendar_cache' ); +add_action( 'delete_post', 'delete_get_calendar_cache' ); +add_action( 'update_option_start_of_week', 'delete_get_calendar_cache' ); +add_action( 'update_option_gmt_offset', 'delete_get_calendar_cache' ); + +/** + * Display all of the allowed tags in HTML format with attributes. + * + * This is useful for displaying in the comment area, which elements and + * attributes are supported. As well as any plugins which want to display it. + * + * @since 1.0.1 + * @uses $allowedtags + * + * @return string HTML allowed tags entity encoded. + */ +function allowed_tags() { + global $allowedtags; + $allowed = ''; + foreach ( (array) $allowedtags as $tag => $attributes ) { + $allowed .= '<'.$tag; + if ( 0 < count($attributes) ) { + foreach ( $attributes as $attribute => $limits ) { + $allowed .= ' '.$attribute.'=""'; + } + } + $allowed .= '> '; + } + return htmlentities($allowed); +} + +/***** Date/Time tags *****/ + +/** + * Outputs the date in iso8601 format for xml files. + * + * @since 1.0.0 + */ +function the_date_xml() { + global $post; + echo mysql2date('Y-m-d', $post->post_date, false); +} + +/** + * Display or Retrieve the date the current $post was written (once per date) + * + * Will only output the date if the current post's date is different from the + * previous one output. + * + * i.e. Only one date listing will show per day worth of posts shown in the loop, even if the + * function is called several times for each post. + * + * HTML output can be filtered with 'the_date'. + * Date string output can be filtered with 'get_the_date'. + * + * @since 0.71 + * @uses get_the_date() + * @param string $d Optional. PHP date format defaults to the date_format option if not specified. + * @param string $before Optional. Output before the date. + * @param string $after Optional. Output after the date. + * @param bool $echo Optional, default is display. Whether to echo the date or return it. + * @return string|null Null if displaying, string if retrieving. + */ +function the_date( $d = '', $before = '', $after = '', $echo = true ) { + global $currentday, $previousday; + $the_date = ''; + if ( $currentday != $previousday ) { + $the_date .= $before; + $the_date .= get_the_date( $d ); + $the_date .= $after; + $previousday = $currentday; + + $the_date = apply_filters('the_date', $the_date, $d, $before, $after); + + if ( $echo ) + echo $the_date; + else + return $the_date; + } + + return null; +} + +/** + * Retrieve the date the current $post was written. + * + * Unlike the_date() this function will always return the date. + * Modify output with 'get_the_date' filter. + * + * @since 3.0.0 + * + * @param string $d Optional. PHP date format defaults to the date_format option if not specified. + * @return string|null Null if displaying, string if retrieving. + */ +function get_the_date( $d = '' ) { + global $post; + $the_date = ''; + + if ( '' == $d ) + $the_date .= mysql2date(get_option('date_format'), $post->post_date); + else + $the_date .= mysql2date($d, $post->post_date); + + return apply_filters('get_the_date', $the_date, $d); +} + +/** + * Display the date on which the post was last modified. + * + * @since 2.1.0 + * + * @param string $d Optional. PHP date format defaults to the date_format option if not specified. + * @param string $before Optional. Output before the date. + * @param string $after Optional. Output after the date. + * @param bool $echo Optional, default is display. Whether to echo the date or return it. + * @return string|null Null if displaying, string if retrieving. + */ +function the_modified_date($d = '', $before='', $after='', $echo = true) { + + $the_modified_date = $before . get_the_modified_date($d) . $after; + $the_modified_date = apply_filters('the_modified_date', $the_modified_date, $d, $before, $after); + + if ( $echo ) + echo $the_modified_date; + else + return $the_modified_date; + +} + +/** + * Retrieve the date on which the post was last modified. + * + * @since 2.1.0 + * + * @param string $d Optional. PHP date format. Defaults to the "date_format" option + * @return string + */ +function get_the_modified_date($d = '') { + if ( '' == $d ) + $the_time = get_post_modified_time(get_option('date_format'), null, null, true); + else + $the_time = get_post_modified_time($d, null, null, true); + return apply_filters('get_the_modified_date', $the_time, $d); +} + +/** + * Display the time at which the post was written. + * + * @since 0.71 + * + * @param string $d Either 'G', 'U', or php date format. + */ +function the_time( $d = '' ) { + echo apply_filters('the_time', get_the_time( $d ), $d); +} + +/** + * Retrieve the time at which the post was written. + * + * @since 1.5.0 + * + * @param string $d Optional Either 'G', 'U', or php date format defaults to the value specified in the time_format option. + * @param int|object $post Optional post ID or object. Default is global $post object. + * @return string + */ +function get_the_time( $d = '', $post = null ) { + $post = get_post($post); + + if ( '' == $d ) + $the_time = get_post_time(get_option('time_format'), false, $post, true); + else + $the_time = get_post_time($d, false, $post, true); + return apply_filters('get_the_time', $the_time, $d, $post); +} + +/** + * Retrieve the time at which the post was written. + * + * @since 2.0.0 + * + * @param string $d Optional Either 'G', 'U', or php date format. + * @param bool $gmt Optional, default is false. Whether to return the gmt time. + * @param int|object $post Optional post ID or object. Default is global $post object. + * @param bool $translate Whether to translate the time string + * @return string + */ +function get_post_time( $d = 'U', $gmt = false, $post = null, $translate = false ) { // returns timestamp + $post = get_post($post); + + if ( $gmt ) + $time = $post->post_date_gmt; + else + $time = $post->post_date; + + $time = mysql2date($d, $time, $translate); + return apply_filters('get_post_time', $time, $d, $gmt); +} + +/** + * Display the time at which the post was last modified. + * + * @since 2.0.0 + * + * @param string $d Optional Either 'G', 'U', or php date format defaults to the value specified in the time_format option. + */ +function the_modified_time($d = '') { + echo apply_filters('the_modified_time', get_the_modified_time($d), $d); +} + +/** + * Retrieve the time at which the post was last modified. + * + * @since 2.0.0 + * + * @param string $d Optional Either 'G', 'U', or php date format defaults to the value specified in the time_format option. + * @return string + */ +function get_the_modified_time($d = '') { + if ( '' == $d ) + $the_time = get_post_modified_time(get_option('time_format'), null, null, true); + else + $the_time = get_post_modified_time($d, null, null, true); + return apply_filters('get_the_modified_time', $the_time, $d); +} + +/** + * Retrieve the time at which the post was last modified. + * + * @since 2.0.0 + * + * @param string $d Optional, default is 'U'. Either 'G', 'U', or php date format. + * @param bool $gmt Optional, default is false. Whether to return the gmt time. + * @param int|object $post Optional, default is global post object. A post_id or post object + * @param bool $translate Optional, default is false. Whether to translate the result + * @return string Returns timestamp + */ +function get_post_modified_time( $d = 'U', $gmt = false, $post = null, $translate = false ) { + $post = get_post($post); + + if ( $gmt ) + $time = $post->post_modified_gmt; + else + $time = $post->post_modified; + $time = mysql2date($d, $time, $translate); + + return apply_filters('get_post_modified_time', $time, $d, $gmt); +} + +/** + * Display the weekday on which the post was written. + * + * @since 0.71 + * @uses $wp_locale + * @uses $post + */ +function the_weekday() { + global $wp_locale, $post; + $the_weekday = $wp_locale->get_weekday(mysql2date('w', $post->post_date, false)); + $the_weekday = apply_filters('the_weekday', $the_weekday); + echo $the_weekday; +} + +/** + * Display the weekday on which the post was written. + * + * Will only output the weekday if the current post's weekday is different from + * the previous one output. + * + * @since 0.71 + * + * @param string $before Optional Output before the date. + * @param string $after Optional Output after the date. + */ +function the_weekday_date($before='',$after='') { + global $wp_locale, $post, $day, $previousweekday; + $the_weekday_date = ''; + if ( $currentday != $previousweekday ) { + $the_weekday_date .= $before; + $the_weekday_date .= $wp_locale->get_weekday(mysql2date('w', $post->post_date, false)); + $the_weekday_date .= $after; + $previousweekday = $currentday; + } + $the_weekday_date = apply_filters('the_weekday_date', $the_weekday_date, $before, $after); + echo $the_weekday_date; +} + +/** + * Fire the wp_head action + * + * @since 1.2.0 + * @uses do_action() Calls 'wp_head' hook. + */ +function wp_head() { + do_action('wp_head'); +} + +/** + * Fire the wp_footer action + * + * @since 1.5.1 + * @uses do_action() Calls 'wp_footer' hook. + */ +function wp_footer() { + do_action('wp_footer'); +} + +/** + * Display the links to the general feeds. + * + * @since 2.8.0 + * + * @param array $args Optional arguments. + */ +function feed_links( $args = array() ) { + if ( !current_theme_supports('automatic-feed-links') ) + return; + + $defaults = array( + /* translators: Separator between blog name and feed type in feed links */ + 'separator' => _x('»', 'feed link'), + /* translators: 1: blog title, 2: separator (raquo) */ + 'feedtitle' => __('%1$s %2$s Feed'), + /* translators: %s: blog title, 2: separator (raquo) */ + 'comstitle' => __('%1$s %2$s Comments Feed'), + ); + + $args = wp_parse_args( $args, $defaults ); + + echo '\n"; + echo '\n"; +} + +/** + * Display the links to the extra feeds such as category feeds. + * + * @since 2.8.0 + * + * @param array $args Optional arguments. + */ +function feed_links_extra( $args = array() ) { + $defaults = array( + /* translators: Separator between blog name and feed type in feed links */ + 'separator' => _x('»', 'feed link'), + /* translators: 1: blog name, 2: separator(raquo), 3: post title */ + 'singletitle' => __('%1$s %2$s %3$s Comments Feed'), + /* translators: 1: blog name, 2: separator(raquo), 3: category name */ + 'cattitle' => __('%1$s %2$s %3$s Category Feed'), + /* translators: 1: blog name, 2: separator(raquo), 3: tag name */ + 'tagtitle' => __('%1$s %2$s %3$s Tag Feed'), + /* translators: 1: blog name, 2: separator(raquo), 3: author name */ + 'authortitle' => __('%1$s %2$s Posts by %3$s Feed'), + /* translators: 1: blog name, 2: separator(raquo), 3: search phrase */ + 'searchtitle' => __('%1$s %2$s Search Results for “%3$s” Feed'), + ); + + $args = wp_parse_args( $args, $defaults ); + + if ( is_single() || is_page() ) { + $post = &get_post( $id = 0 ); + + if ( comments_open() || pings_open() || $post->comment_count > 0 ) { + $title = esc_attr(sprintf( $args['singletitle'], get_bloginfo('name'), $args['separator'], esc_html( get_the_title() ) )); + $href = get_post_comments_feed_link( $post->ID ); + } + } elseif ( is_category() ) { + $term = get_queried_object(); + + $title = esc_attr(sprintf( $args['cattitle'], get_bloginfo('name'), $args['separator'], $term->name )); + $href = get_category_feed_link( $term->term_id ); + } elseif ( is_tag() ) { + $term = get_queried_object(); + + $title = esc_attr(sprintf( $args['tagtitle'], get_bloginfo('name'), $args['separator'], $term->name )); + $href = get_tag_feed_link( $term->term_id ); + } elseif ( is_author() ) { + $author_id = intval( get_query_var('author') ); + + $title = esc_attr(sprintf( $args['authortitle'], get_bloginfo('name'), $args['separator'], get_the_author_meta( 'display_name', $author_id ) )); + $href = get_author_feed_link( $author_id ); + } elseif ( is_search() ) { + $title = esc_attr(sprintf( $args['searchtitle'], get_bloginfo('name'), $args['separator'], get_search_query( false ) )); + $href = get_search_feed_link(); + } + + if ( isset($title) && isset($href) ) + echo '' . "\n"; +} + +/** + * Display the link to the Really Simple Discovery service endpoint. + * + * @link http://archipelago.phrasewise.com/rsd + * @since 2.0.0 + */ +function rsd_link() { + echo '\n"; +} + +/** + * Display the link to the Windows Live Writer manifest file. + * + * @link http://msdn.microsoft.com/en-us/library/bb463265.aspx + * @since 2.3.1 + */ +function wlwmanifest_link() { + echo ' ' . "\n"; +} + +/** + * Display a noindex meta tag if required by the blog configuration. + * + * If a blog is marked as not being public then the noindex meta tag will be + * output to tell web robots not to index the page content. + * + * @since 2.1.0 + */ +function noindex() { + // If the blog is not public, tell robots to go away. + if ( '0' == get_option('blog_public') ) + echo "\n"; +} + +/** + * Determine if TinyMCE is available. + * + * Checks to see if the user has deleted the tinymce files to slim down there WordPress install. + * + * @since 2.1.0 + * + * @return bool Whether TinyMCE exists. + */ +function rich_edit_exists() { + global $wp_rich_edit_exists; + if ( !isset($wp_rich_edit_exists) ) + $wp_rich_edit_exists = file_exists(ABSPATH . WPINC . '/js/tinymce/tiny_mce.js'); + return $wp_rich_edit_exists; +} + +/** + * Whether the user should have a WYSIWIG editor. + * + * Checks that the user requires a WYSIWIG editor and that the editor is + * supported in the users browser. + * + * @since 2.0.0 + * + * @return bool + */ +function user_can_richedit() { + global $wp_rich_edit, $pagenow, $is_iphone; + + if ( !isset( $wp_rich_edit) ) { + if ( get_user_option( 'rich_editing' ) == 'true' && + !$is_iphone && // this includes all Safari mobile browsers + ( ( preg_match( '!AppleWebKit/(\d+)!', $_SERVER['HTTP_USER_AGENT'], $match ) && intval($match[1]) >= 420 ) || + !preg_match( '!opera[ /][2-8]|konqueror|safari!i', $_SERVER['HTTP_USER_AGENT'] ) ) + && 'comment.php' != $pagenow ) { + $wp_rich_edit = true; + } else { + $wp_rich_edit = false; + } + } + + return apply_filters('user_can_richedit', $wp_rich_edit); +} + +/** + * Find out which editor should be displayed by default. + * + * Works out which of the two editors to display as the current editor for a + * user. + * + * @since 2.5.0 + * + * @return string Either 'tinymce', or 'html', or 'test' + */ +function wp_default_editor() { + $r = user_can_richedit() ? 'tinymce' : 'html'; // defaults + if ( $user = wp_get_current_user() ) { // look for cookie + $ed = get_user_setting('editor', 'tinymce'); + $r = ( in_array($ed, array('tinymce', 'html', 'test') ) ) ? $ed : $r; + } + return apply_filters( 'wp_default_editor', $r ); // filter +} + +/** + * Display visual editor forms: TinyMCE, or HTML, or both. + * + * The amount of rows the text area will have for the content has to be between + * 3 and 100 or will default at 12. There is only one option used for all users, + * named 'default_post_edit_rows'. + * + * If the user can not use the rich editor (TinyMCE), then the switch button + * will not be displayed. + * + * @since 2.1.0 + * + * @param string $content Textarea content. + * @param string $id Optional, default is 'content'. HTML ID attribute value. + * @param string $prev_id Optional, default is 'title'. HTML ID name for switching back and forth between visual editors. + * @param bool $media_buttons Optional, default is true. Whether to display media buttons. + * @param int $tab_index Optional, default is 2. Tabindex for textarea element. + */ +function the_editor($content, $id = 'content', $prev_id = 'title', $media_buttons = true, $tab_index = 2, $extended = true) { + $rows = get_option('default_post_edit_rows'); + if (($rows < 3) || ($rows > 100)) + $rows = 12; + + if ( !current_user_can( 'upload_files' ) ) + $media_buttons = false; + + $richedit = user_can_richedit(); + $class = ''; + + if ( $richedit || $media_buttons ) { ?> +
    + +
    + + + + + + + +
    + +
    + +
    + +
    + +
    + +
    \n"); + $the_editor_content = apply_filters('the_editor_content', $content); + + printf($the_editor, $the_editor_content); + +?> + + '%_%', // http://example.com/all_posts.php%_% : %_% is replaced by format (below) + 'format' => '?page=%#%', // ?page=%#% : %#% is replaced by the page number + 'total' => 1, + 'current' => 0, + 'show_all' => false, + 'prev_next' => true, + 'prev_text' => __('« Previous'), + 'next_text' => __('Next »'), + 'end_size' => 1, + 'mid_size' => 2, + 'type' => 'plain', + 'add_args' => false, // array of query args to add + 'add_fragment' => '' + ); + + $args = wp_parse_args( $args, $defaults ); + extract($args, EXTR_SKIP); + + // Who knows what else people pass in $args + $total = (int) $total; + if ( $total < 2 ) + return; + $current = (int) $current; + $end_size = 0 < (int) $end_size ? (int) $end_size : 1; // Out of bounds? Make it the default. + $mid_size = 0 <= (int) $mid_size ? (int) $mid_size : 2; + $add_args = is_array($add_args) ? $add_args : false; + $r = ''; + $page_links = array(); + $n = 0; + $dots = false; + + if ( $prev_next && $current && 1 < $current ) : + $link = str_replace('%_%', 2 == $current ? '' : $format, $base); + $link = str_replace('%#%', $current - 1, $link); + if ( $add_args ) + $link = add_query_arg( $add_args, $link ); + $link .= $add_fragment; + $page_links[] = ''; + endif; + for ( $n = 1; $n <= $total; $n++ ) : + $n_display = number_format_i18n($n); + if ( $n == $current ) : + $page_links[] = "$n_display"; + $dots = true; + else : + if ( $show_all || ( $n <= $end_size || ( $current && $n >= $current - $mid_size && $n <= $current + $mid_size ) || $n > $total - $end_size ) ) : + $link = str_replace('%_%', 1 == $n ? '' : $format, $base); + $link = str_replace('%#%', $n, $link); + if ( $add_args ) + $link = add_query_arg( $add_args, $link ); + $link .= $add_fragment; + $page_links[] = "$n_display"; + $dots = true; + elseif ( $dots && !$show_all ) : + $page_links[] = '...'; + $dots = false; + endif; + endif; + endfor; + if ( $prev_next && $current && ( $current < $total || -1 == $total ) ) : + $link = str_replace('%_%', $format, $base); + $link = str_replace('%#%', $current + 1, $link); + if ( $add_args ) + $link = add_query_arg( $add_args, $link ); + $link .= $add_fragment; + $page_links[] = ''; + endif; + switch ( $type ) : + case 'array' : + return $page_links; + break; + case 'list' : + $r .= "
      \n\t
    • "; + $r .= join("
    • \n\t
    • ", $page_links); + $r .= "
    • \n
    \n"; + break; + default : + $r = join("\n", $page_links); + break; + endswitch; + return $r; +} + +/** + * Registers an admin colour scheme css file. + * + * Allows a plugin to register a new admin colour scheme. For example: + * + * wp_admin_css_color('classic', __('Classic'), admin_url("css/colors-classic.css"), + * array('#07273E', '#14568A', '#D54E21', '#2683AE')); + * + * + * @since 2.5.0 + * + * @param string $key The unique key for this theme. + * @param string $name The name of the theme. + * @param string $url The url of the css file containing the colour scheme. + * @param array $colors Optional An array of CSS color definitions which are used to give the user a feel for the theme. + */ +function wp_admin_css_color($key, $name, $url, $colors = array()) { + global $_wp_admin_css_colors; + + if ( !isset($_wp_admin_css_colors) ) + $_wp_admin_css_colors = array(); + + $_wp_admin_css_colors[$key] = (object) array('name' => $name, 'url' => $url, 'colors' => $colors); +} + +/** + * Registers the default Admin color schemes + * + * @since 3.0.0 + */ +function register_admin_color_schemes() { + wp_admin_css_color( 'classic', __( 'Blue' ), admin_url( 'css/colors-classic.css' ), + array( '#5589aa', '#cfdfe9', '#d1e5ee', '#eff8ff' ) ); + wp_admin_css_color( 'fresh', __( 'Gray' ), admin_url( 'css/colors-fresh.css' ), + array( '#7c7976', '#c6c6c6', '#e0e0e0', '#f1f1f1' ) ); +} + +/** + * Display the URL of a WordPress admin CSS file. + * + * @see WP_Styles::_css_href and its style_loader_src filter. + * + * @since 2.3.0 + * + * @param string $file file relative to wp-admin/ without its ".css" extension. + */ +function wp_admin_css_uri( $file = 'wp-admin' ) { + if ( defined('WP_INSTALLING') ) { + $_file = "./$file.css"; + } else { + $_file = admin_url("$file.css"); + } + $_file = add_query_arg( 'version', get_bloginfo( 'version' ), $_file ); + + return apply_filters( 'wp_admin_css_uri', $_file, $file ); +} + +/** + * Enqueues or directly prints a stylesheet link to the specified CSS file. + * + * "Intelligently" decides to enqueue or to print the CSS file. If the + * 'wp_print_styles' action has *not* yet been called, the CSS file will be + * enqueued. If the wp_print_styles action *has* been called, the CSS link will + * be printed. Printing may be forced by passing TRUE as the $force_echo + * (second) parameter. + * + * For backward compatibility with WordPress 2.3 calling method: If the $file + * (first) parameter does not correspond to a registered CSS file, we assume + * $file is a file relative to wp-admin/ without its ".css" extension. A + * stylesheet link to that generated URL is printed. + * + * @package WordPress + * @since 2.3.0 + * @uses $wp_styles WordPress Styles Object + * + * @param string $file Optional. Style handle name or file name (without ".css" extension) relative + * to wp-admin/. Defaults to 'wp-admin'. + * @param bool $force_echo Optional. Force the stylesheet link to be printed rather than enqueued. + */ +function wp_admin_css( $file = 'wp-admin', $force_echo = false ) { + global $wp_styles; + if ( !is_a($wp_styles, 'WP_Styles') ) + $wp_styles = new WP_Styles(); + + // For backward compatibility + $handle = 0 === strpos( $file, 'css/' ) ? substr( $file, 4 ) : $file; + + if ( $wp_styles->query( $handle ) ) { + if ( $force_echo || did_action( 'wp_print_styles' ) ) // we already printed the style queue. Print this one immediately + wp_print_styles( $handle ); + else // Add to style queue + wp_enqueue_style( $handle ); + return; + } + + echo apply_filters( 'wp_admin_css', "\n", $file ); + if ( is_rtl() ) + echo apply_filters( 'wp_admin_css', "\n", "$file-rtl" ); +} + +/** + * Enqueues the default ThickBox js and css. + * + * If any of the settings need to be changed, this can be done with another js + * file similar to media-upload.js and theme-preview.js. That file should + * require array('thickbox') to ensure it is loaded after. + * + * @since 2.5.0 + */ +function add_thickbox() { + wp_enqueue_script( 'thickbox' ); + wp_enqueue_style( 'thickbox' ); + + if ( is_network_admin() ) + add_action( 'admin_head', '_thickbox_path_admin_subfolder' ); +} + +/** + * Display the XHTML generator that is generated on the wp_head hook. + * + * @since 2.5.0 + */ +function wp_generator() { + the_generator( apply_filters( 'wp_generator_type', 'xhtml' ) ); +} + +/** + * Display the generator XML or Comment for RSS, ATOM, etc. + * + * Returns the correct generator type for the requested output format. Allows + * for a plugin to filter generators overall the the_generator filter. + * + * @since 2.5.0 + * @uses apply_filters() Calls 'the_generator' hook. + * + * @param string $type The type of generator to output - (html|xhtml|atom|rss2|rdf|comment|export). + */ +function the_generator( $type ) { + echo apply_filters('the_generator', get_the_generator($type), $type) . "\n"; +} + +/** + * Creates the generator XML or Comment for RSS, ATOM, etc. + * + * Returns the correct generator type for the requested output format. Allows + * for a plugin to filter generators on an individual basis using the + * 'get_the_generator_{$type}' filter. + * + * @since 2.5.0 + * @uses apply_filters() Calls 'get_the_generator_$type' hook. + * + * @param string $type The type of generator to return - (html|xhtml|atom|rss2|rdf|comment|export). + * @return string The HTML content for the generator. + */ +function get_the_generator( $type = '' ) { + if ( empty( $type ) ) { + + $current_filter = current_filter(); + if ( empty( $current_filter ) ) + return; + + switch ( $current_filter ) { + case 'rss2_head' : + case 'commentsrss2_head' : + $type = 'rss2'; + break; + case 'rss_head' : + case 'opml_head' : + $type = 'comment'; + break; + case 'rdf_header' : + $type = 'rdf'; + break; + case 'atom_head' : + case 'comments_atom_head' : + case 'app_head' : + $type = 'atom'; + break; + } + } + + switch ( $type ) { + case 'html': + $gen = ''; + break; + case 'xhtml': + $gen = ''; + break; + case 'atom': + $gen = 'WordPress'; + break; + case 'rss2': + $gen = 'http://wordpress.org/?v=' . get_bloginfo_rss( 'version' ) . ''; + break; + case 'rdf': + $gen = ''; + break; + case 'comment': + $gen = ''; + break; + case 'export': + $gen = ''; + break; + } + return apply_filters( "get_the_generator_{$type}", $gen, $type ); +} + +/** + * Outputs the html checked attribute. + * + * Compares the first two arguments and if identical marks as checked + * + * @since 1.0.0 + * + * @param mixed $checked One of the values to compare + * @param mixed $current (true) The other value to compare if not just true + * @param bool $echo Whether to echo or just return the string + * @return string html attribute or empty string + */ +function checked( $checked, $current = true, $echo = true ) { + return __checked_selected_helper( $checked, $current, $echo, 'checked' ); +} + +/** + * Outputs the html selected attribute. + * + * Compares the first two arguments and if identical marks as selected + * + * @since 1.0.0 + * + * @param mixed $selected One of the values to compare + * @param mixed $current (true) The other value to compare if not just true + * @param bool $echo Whether to echo or just return the string + * @return string html attribute or empty string + */ +function selected( $selected, $current = true, $echo = true ) { + return __checked_selected_helper( $selected, $current, $echo, 'selected' ); +} + +/** + * Outputs the html disabled attribute. + * + * Compares the first two arguments and if identical marks as disabled + * + * @since 3.0.0 + * + * @param mixed $disabled One of the values to compare + * @param mixed $current (true) The other value to compare if not just true + * @param bool $echo Whether to echo or just return the string + * @return string html attribute or empty string + */ +function disabled( $disabled, $current = true, $echo = true ) { + return __checked_selected_helper( $disabled, $current, $echo, 'disabled' ); +} + +/** + * Private helper function for checked, selected, and disabled. + * + * Compares the first two arguments and if identical marks as $type + * + * @since 2.8.0 + * @access private + * + * @param any $helper One of the values to compare + * @param any $current (true) The other value to compare if not just true + * @param bool $echo Whether to echo or just return the string + * @param string $type The type of checked|selected|disabled we are doing + * @return string html attribute or empty string + */ +function __checked_selected_helper( $helper, $current, $echo, $type ) { + if ( (string) $helper === (string) $current ) + $result = " $type='$type'"; + else + $result = ''; + + if ( $echo ) + echo $result; + + return $result; +} + +?> diff --git a/src/wp-includes/http.php b/src/wp-includes/http.php new file mode 100644 index 0000000..a909e00 --- /dev/null +++ b/src/wp-includes/http.php @@ -0,0 +1,224 @@ + + * $res = array( 'headers' => array(), 'response' => array('code' => int, 'message' => string) ); + * + * + * All of the headers in $res['headers'] are with the name as the key and the + * value as the value. So to get the User-Agent, you would do the following. + * + * + * $user_agent = $res['headers']['user-agent']; + * + * + * The body is the raw response content and can be retrieved from $res['body']. + * + * This function is called first to make the request and there are other API + * functions to abstract out the above convoluted setup. + * + * @since 2.7.0 + * + * @param string $url Site URL to retrieve. + * @param array $args Optional. Override the defaults. + * @return WP_Error|array The response or WP_Error on failure. + */ +function wp_remote_request($url, $args = array()) { + $objFetchSite = _wp_http_get_object(); + return $objFetchSite->request($url, $args); +} + +/** + * Retrieve the raw response from the HTTP request using the GET method. + * + * @see wp_remote_request() For more information on the response array format. + * + * @since 2.7.0 + * + * @param string $url Site URL to retrieve. + * @param array $args Optional. Override the defaults. + * @return WP_Error|array The response or WP_Error on failure. + */ +function wp_remote_get($url, $args = array()) { + $objFetchSite = _wp_http_get_object(); + return $objFetchSite->get($url, $args); +} + +/** + * Retrieve the raw response from the HTTP request using the POST method. + * + * @see wp_remote_request() For more information on the response array format. + * + * @since 2.7.0 + * + * @param string $url Site URL to retrieve. + * @param array $args Optional. Override the defaults. + * @return WP_Error|array The response or WP_Error on failure. + */ +function wp_remote_post($url, $args = array()) { + $objFetchSite = _wp_http_get_object(); + return $objFetchSite->post($url, $args); +} + +/** + * Retrieve the raw response from the HTTP request using the HEAD method. + * + * @see wp_remote_request() For more information on the response array format. + * + * @since 2.7.0 + * + * @param string $url Site URL to retrieve. + * @param array $args Optional. Override the defaults. + * @return WP_Error|array The response or WP_Error on failure. + */ +function wp_remote_head($url, $args = array()) { + $objFetchSite = _wp_http_get_object(); + return $objFetchSite->head($url, $args); +} + +/** + * Retrieve only the headers from the raw response. + * + * @since 2.7.0 + * + * @param array $response HTTP response. + * @return array The headers of the response. Empty array if incorrect parameter given. + */ +function wp_remote_retrieve_headers(&$response) { + if ( is_wp_error($response) || ! isset($response['headers']) || ! is_array($response['headers'])) + return array(); + + return $response['headers']; +} + +/** + * Retrieve a single header by name from the raw response. + * + * @since 2.7.0 + * + * @param array $response + * @param string $header Header name to retrieve value from. + * @return string The header value. Empty string on if incorrect parameter given, or if the header doesnt exist. + */ +function wp_remote_retrieve_header(&$response, $header) { + if ( is_wp_error($response) || ! isset($response['headers']) || ! is_array($response['headers'])) + return ''; + + if ( array_key_exists($header, $response['headers']) ) + return $response['headers'][$header]; + + return ''; +} + +/** + * Retrieve only the response code from the raw response. + * + * Will return an empty array if incorrect parameter value is given. + * + * @since 2.7.0 + * + * @param array $response HTTP response. + * @return string the response code. Empty string on incorrect parameter given. + */ +function wp_remote_retrieve_response_code(&$response) { + if ( is_wp_error($response) || ! isset($response['response']) || ! is_array($response['response'])) + return ''; + + return $response['response']['code']; +} + +/** + * Retrieve only the response message from the raw response. + * + * Will return an empty array if incorrect parameter value is given. + * + * @since 2.7.0 + * + * @param array $response HTTP response. + * @return string The response message. Empty string on incorrect parameter given. + */ +function wp_remote_retrieve_response_message(&$response) { + if ( is_wp_error($response) || ! isset($response['response']) || ! is_array($response['response'])) + return ''; + + return $response['response']['message']; +} + +/** + * Retrieve only the body from the raw response. + * + * @since 2.7.0 + * + * @param array $response HTTP response. + * @return string The body of the response. Empty string if no body or incorrect parameter given. + */ +function wp_remote_retrieve_body(&$response) { + if ( is_wp_error($response) || ! isset($response['body']) ) + return ''; + + return $response['body']; +} + +/** + * Determines if there is an HTTP Transport that can process this request. + * + * @since 3.2.0 + * + * @param array $capabilities Array of capabilities to test or a wp_remote_request() $args array. + * @param string $url Optional. If given, will check if the URL requires SSL and adds that requirement to the capabilities array. + * + * @return bool + */ +function wp_http_supports( $capabilities = array(), $url = null ) { + $objFetchSite = _wp_http_get_object(); + + $capabilities = wp_parse_args( $capabilities ); + + $count = count( $capabilities ); + + // If we have a numeric $capabilities array, spoof a wp_remote_request() associative $args array + if ( $count && count( array_filter( array_keys( $capabilities ), 'is_numeric' ) ) == $count ) { + $capabilities = array_combine( array_values( $capabilities ), array_fill( 0, $count, true ) ); + } + + if ( $url && !isset( $capabilities['ssl'] ) ) { + $scheme = parse_url( $url, PHP_URL_SCHEME ); + if ( 'https' == $scheme || 'ssl' == $scheme ) { + $capabilities['ssl'] = true; + } + } + + return (bool) $objFetchSite->_get_first_available_transport( $capabilities ); +} diff --git a/src/wp-includes/images/admin-bar-sprite-rtl.png b/src/wp-includes/images/admin-bar-sprite-rtl.png new file mode 100644 index 0000000000000000000000000000000000000000..f49aae7a01741631161df6df5e3175afeea69406 GIT binary patch literal 732 zcmV<20wev2P)mLPTr32Bbtv|ALaF?MwUqcl-G z(ywy;cDX*LQBxHFz&B2d#R5?C`TRDzMC)C1dkq~?K?uNVHk$zoi)m~(HaVJ?)^qD< ztq3)lOu%S5oq|0#9`(68pFY$Rp~mAej7Fn7**?Z}9#_xxq!OW|1fxiHTCGB@Rs$SOY|Hqx&Yp8V?MZ#tp3&p0R4P%@9wpDt*?AgE zbDuqKUvzE*2_O!P`yd>oq))E|TvRTX@5K3LGds5H>|9(Ay7unnSt^xoNsNtbkIPGv zYAK-caAbdG3WWmLDi({8sBdzvSXw9b##sD8=9>9#^ynIz6QT0?JfN_M#&qOrsklCp z9)fZKNT6{*T)h)2m&_%%ZYDK+1=bsi`&4w}xVg*cJP|6J z&BC+7#;>dwp^}tBDU?DfltL-ge+RW(E+ehiYgBr(+58TI;QKp3rB>@DB1HA-d^mZFrGZ|pqKO+J#B6=2zEUZr;~ns z0bZ}nZ3fTk=p_zyz4z^}x0=*jKwZHyc-=B{eI+QALMfC&DU?F}J^cYm?HP(~ver%j O0000hl^Y&TDOJs!F8-D0Jv3*+wp(+f=SK%osmD z+T14I$ObF{xj=c{*Na{*mjT7^%EalsH1b;N+j>axn@>WiREj6eNQE&fTU-*&mFj5h z?&Dc37NJlm#6p|;lFU4>lWblm&53_A(t^G)kL0SsnDq}ipU;C$SS;DDJnHk2+ul&N z1#Do_!mgX}g39G`;3I58M^}z-zeG?z0KPZj($l|G(#6dqa^-kKNex^J`}z`~6)Ky} z!tV+jKT~govQ4C^02QDDRDcRl0V+WK&Bc{^+ithZ&1UnerB@Fq7b~2!b%{jWis`~2a8qp6v_+Wc`TS`ezIVh#%`yS4@cpQ%Q&oDC#IOmheL};z| z_xBlN*4mY;#ut|#Sh%vV_VPI%gag(c4u>Co^pSwk8AYW2SczldR=gg}ALBdifX74_ zfr`Rh@$B)E@pLQowETRy0{U(Nwcr*M1JA$}5w5n_V-vQshw*c6tu$P$?`8BYC0ZzK z+05}^nPn^IT{c1dd~3mQz{2q$oO@7KqIu!n(_V?q-JX}xv_}o)`BT4e;TNK57ds72 zc%GeQ>K}+EcClqNfheoF@}r}PL99g6K{?~p-y6+>v6j)SHqieL&1sIk$d&&Cn$x^# z1(Y8T4Q+>KMAPHSf4g4)6`Yw+T8C?^ozwnqd+`PFCfpJ$L)mEoJ}gX;XpV$69Ape* zts%r92&>@=F2FctDHkbaf>1#jTh37Jc@fGf3r810hnQKUm9U-x(Mg?vAmJHjw0{Jy zFj$RPZH)wA{s9gPQJylMz}TN@g9)>82W4fVLFsAGFkB?Kn3k2445mU6A(KHqle(Pf za?F#V7+x01kTM$d1W*vI!88l_iBp7@&Eyn?;t3NePcq7qo>m$(6amy1Kv3nSH(pjR zy{(*nI-h)7PQIaLQqIR#%?Z^!$+;LZu_5w3F?flk>q)lB^EJjfu?Wjr+hqC3hcg#g)yVJAK(=TMq$Wlw zVL$T<mf$j}5JW4MPT>)r=Tk{6KR08EBs_x`a+;;7QWe-p zQ>HYTPai#ba<7_$iOKbM{;+X*->L#>2#TSuhGJw%k`&_r6)efX{Ob4-qX_|KB_QSI zv~*Tn%C?A`J+UYE&z~D)gF%vmtSLeA0xR7HGFw?^LA^bT!?;O^zUE2=1Ad0R>9 zG)J-n{!+;)72iti>|+LH(0Ff5#D!q6e0bVL?HwQB*Jtcqy@ zPL!s)unlbi7tqalU3pTWrKxS5D_cJ=hC>+Y;_&!kiSEr40Zhp=AVI#FKRTK|`{&_w za;%FPCnn(}6^snH1>YeMiYSS;6Rj4`7@o()onY?H|hc-vGM5CCDz0uMm=(L|&kq^*~1!+ca1gqubi z&JdIZl!F9Vy<>_IHP@(^7g7XCTknp06k3;`D|hpxCoC{0%PT%Eoy9w04<1K z;X-EM7#p3R8^gE7t&VLXYMoA7tu#OgKBwTYni&)wP-TN`bZJ``B^P`;FH+Q#i-l%J z0+Nlix^w~!2QYb@rUn!sFI-` zY<@RBg2mgr@B>K?qO;ZY57MkYOZbf`8-GA!K9!(4;7;Xgu(mNoV;~nNXN<$(#fG~; zI+AADuqglX$3N}8aTDzfQ)|;JL4;L6W^YhhOX-?)LhBRlJhiGy^eD`+o}G;LGPAQT zu9eUPjSFe1Ha0fcboS-n{<^oj0~w-Un>hpy>Ss34&Sx$QmL{|Xg2W43SD4sXsx8GO z`>9yeo>RLV0<;>0tX$*;1q88FY@I&`q*u0IBf|4c0$GT$wZq~fo;=ZB43crZFNYHv z%?37566|9;+SUb%2Lv{N;BBet7k3c2cm=s+p+Ll_03}l6Kh!T6M1|~5>zczNIVeUv za0^*FV`x|{I$CG;W}@Jd4om=gq;#?GvbqlgW>*?(5mP@CS=z+aD@GKBNe3+MdAxXt z#+Pl|a#3gnD0bM{`aft9@Ri!`GwV@WFfby*CqR@+5 zQO+riw)dr{H;ngCM|+VL4e3eYITI4{0u<^C*Wg6>8Uu$_S}A7F)D2|bkbph}2ogc@ z8UujM4&F7)MOp2#NS-U!@hpEmE5`~_LE8wv3 z9(soNFtjojNIso4{DU$KA9CKypzP9BF)wDN67Y8oDUG6SU<(v{Afc|%KOLiIq%Eup zsi4!Vt!WlSLn=cQ0Spp`k|w?zNFYOnGG)O)w%h-~kzP=8CY*v&4OryErdy~&Vgmsb zlsD3Ow6ShV7T^=(1`6F-0a?Y05vO)lh{GIi1NW^iUwQZUGQ0Nd{wL+}znDIPy#(bM zY(1eDL)b-+uLRF}}<6lPqxw>??T&C7#D^Lu&%VD5g0VH*cW6S5;A!m2`Q2 z{?(lu@7?&>?Y(QSUA%a1Hk}hIYbT1(2ohZgod|7|E;R7`>XnN>xwcc?`Sr7>*mp58ut3mIBl-x35KLJDBP*@h=KA){tG9mf+8gg&xq9u~#u{uj zpj4Spj;ME{xNBmp?Q&3K);eFp(^&Xm(yBnqFI^h#zI^+=+jkDflLudab?@#cyzp44i68rEZ@Gkl_gmHTLV#}3i-9E^hx{mB@`hr7WjdqRu7b)2&J)% zYYQLmyFoQ1>a|3=bC|f{eOM_^_}=aoR>XQXSFTBrcBy6LOF7zZjC_D@dG5cCv_*nz z(X=bONKbX=r>@VNIfHIB?Y2BLMES7&ZNEf>PaQPuKtg4Q*&jAUp1+-ex{9AhlQsg- z6+Nj)OT8VPe>hZ$y^s<5R=py;jvY`IHSIX>L8QrGaSN`2kowHqJ zSZt>SK(5_~g~Fuq>#knu4AhE9SAE=B=pK?~jW!<8SSPT)+4qIl!HuAJ1(l$s(j=+t z71wVKE_`t6>#5s^cdGA0bWIfKtm!&evUM>}TUugEA$U;p@akr14`gJKc-(_aTeF5+ zw1M81x}oVxn&PCBaj98K+MQfeoYq0=)ZXqwgSoRrQ-}M2-XnTT>d>$3g}ClBCg~Bj zk+>d4qOaf(=^=}CN*7hxsMxuVodWXsXfzZ_683Wq^*R~4#ZLM5y)XnqN~KBvGv?xk zrT=?4$N+}e+1dH@^M|2(^Zc)u&;QEvL;kY>fZp5N`;Pzv0FLGwtsw~$9RL6T07*qo IM6N<$f{A<6rT_o{ literal 0 HcmV?d00001 diff --git a/src/wp-includes/images/crystal/audio.png b/src/wp-includes/images/crystal/audio.png new file mode 100644 index 0000000000000000000000000000000000000000..5a3d4d3afb2a58a5b3833e0568b1d3ab75631934 GIT binary patch literal 2647 zcmV-d3aIsoP)}}m0#XqVA%QABf&ft=B+5fbtx`2DB}gqF zTD3}?cbmp-(%QI*FL&pA?(N?0&hVezyUqG;ch8Q4Slj2h+1;7n|NR(r=FFLFHmhkG z<8vW|Ryb*2gph!-{fRMl&+|ObvMg_!=G4>_^Z&aH!vH8}&z|Mo0RPt)>}41xA@GS! z(=f3~Fu|CJl0bRmJOnIyfV=9t0sN-?hs6nIk##YMP=OGRV>wPRO&(yuS4ooKChvy) zK+u>bRvL|HUqle-;=pqZ^utA&0RuYL;UUwS#1x9CHQ@{2!N9enQJYPm5}2Z@s-YXe z2Hg4sjm6GJz%9^xdpkiC7)L-45Dn0-GYrphppUj#5MW@DWh``MK!FgpkXUmJ!_ghv z0s_R2eXbD=%W{84ZI6Hx3$4q(eZVNWs&0~9m?rO$V)(L)EmTc2ouD@e-79~ z2k^n##H03J4)qkM0N&PZ%nq70N-7eP?SU+b0bYl?JMga9(iV{r(j}m^qsiUPD-8_< zlF#P_QLI(#s;U)>C2%&gH*YHhdYI1+{la2~)jqiHCrT3%Yp=W`8J1r?TL zS@O{#UtHvAKbj9)M|zmvF~3%9o`SRB-26$z-@(REM4Or=c|uBC(#L}-nX2g+Y`nI4O#xma`Y_IQ$Rh@+#53% zlgYAI95f_AKqLT3m#(Z-UD`bHM8hz?XgC%xDrqRcPtI| ziu@D;%*%g4fjZ~=(iLwswxYNKLZ_qx)CHmY*A>tG5Tvaf^1h3Ll$RC*D;Lm8&_Gg* z{9myt_wY9iK|Q(B=@@#Up~*Z#K6f3~Fy3tn)Qc;tLj%OI$op(>rwvP-(x5=f#Gux&+l>7YMR?$SJKVP@lPQ70Q$3Kw|f<$yl`S&fQ#p zBEGte-(C3Fo0ZCyL_7xLbZVefEVc5MuG}xy7l9YwIe+Op-~G|(rj65|dvq`npLy%t zGe7*ruADyonjlG)Y6XZ{UB+K1mJUApRC?X;sc$`f;>ckz z!^w#cD;l@zJft+#Q}pVJUQT zetzRaW8HPQZ^qx$^?gUb3{GHr`qar7G)7?QdMh)WO-dCU2mwLE-p3{Wn$0H$%%=rn>ToN1$^_B z8#m`75m}JsLZMJs>hb>QK%yUF8B|>Hf&R(eQ+?r(=ZhPG`wwq4Sz@=GXu}+v;ZXRA zC!d@?K8+i-v5~B&*YMSq(REo>spoS!n3Q-iB8LrJhniy3=1q^Ed;%)qJ-c>zR@z@Y zdf=mNkAS(UjmGG3X3Lg`nwoxS|K2;f;+6B~e*V+%`PF{D#(ezX?yckFAI{F|S~EGA z7#+zB8~S=Ejz=<=E?)W4^dUdHJNVhX??3-1vx)cZ-kHs$k^}K#e(B}c|22F0+Q}2g z3i(2EFzMdQ5fks{$4(qS@|)lNao5DQ(Xr8ZBr-gdG@AO2k3V_!rI)vC7)hm4_DO-& z7NreRr#!CJmCx+mdHM2tm(RUh92*%(CTo>yglCT)J}^2qB8XxKOB{9a^(*lCg~yKl z%1gJ!T>+es(`IMFML%R z5Ol(uAKt+6yiDm8A>cuFNOOA{i%rv@35-dN*Ab5pc0Tbh5vAEJ!5Aa`8RRCZa zCu{Y$Xdf06jP6w-v}6Z&0_7SuJL6XXnrgKs(DohbT^$1JKt><}O=}vuZcpllY5(Y! z>KcZXb5Rt8Wl%@i6BtJws1+ zc+P3+2e+~8R=YjJcW2A)_u)~X+EROM?Dr^=d=_-Vg<-~jLm?yv^%2^c)>=~Ls#H=izQ4)>b%TNwX;UT zfM|F@5aCWoLoh&Zz#D=8@$EV}W5CPtRwamRwQ#hGv5)!HWu{U@vfY$YpeT71yO06!lkO5hG!&(#ow>Zi%>u?sMcBctgC5M3{@~TgffT)?7 znYp<+&vtFMpQZ<)h(Uo(5cg6fxJB502G}tq8Yln& literal 0 HcmV?d00001 diff --git a/src/wp-includes/images/crystal/code.png b/src/wp-includes/images/crystal/code.png new file mode 100644 index 0000000000000000000000000000000000000000..b67c600572ce284700e365e00a132e38110af02e GIT binary patch literal 2133 zcmV-b2&(sqP)?i3W`qz z@e$luskKaM^RFjgbgPo8#ElytBt{dT_(oCiiJ1M#-R+Ds!#JYZ`9L*2J>9p@z4!FF zGj(s?yopAmmzS4Ms$6w-bx&%&e*E~MZ_B0r%FHzC>+6q?kF~3-tI^TXC;#K6Y`VU_ z=C@ofd%fP*uU~8Y=e9ycVW0=Yd8Zx;Jq(8B^$mfCzb^Chme@M%6wAc8y8kYH+vRc@ z8fuKoX6l-)QBXOtMt*OZ^61u>anc)Pu*PW0qkGB>Pqpi(DfUx8qBYXcyT$^QJFTg~ zL>p_A5mjU5zUw{Q8Wl#Gf&23LqfBQ0{QRQ3yK7)z03MXP5YNoa%;90att~n-GUD-g z^mM7FQ|+y-?S+K}=%c?s)!W-cr|ffK;p^7cRv_RX8X9VBY}C`zEeEmE#KZ*FXqxu@ z`|_7BU)264C;wbqThp}qt*xD@slV*8+1uNjoSZm2J7bx-xw(yv4Owz#W|ldb{Nm#B z)2C0x;)(LkPgLYuU0v~b+=GLIkw}C?VRLf}RtA`Zg99EL7#Qs8>I9zUA?c*%jNci!A5IS+-^6ZwYRr3Q6LZ~ z6bj0(et$zW8fj~5!#KdxlfBs*<_QLa3}zB`vbkB7NjPi5;bu->+F+))-k8k2y}cff z7YDKRqobpimKI4fENg9z|je^uMgW>vBCn+p8duk(8GvWET+~N9ew8a2Z*@y^K%fkPapg;GLmM!ot>RvFvL#e zZhwD2bLMh6tnBFM@cDdtpJ;|;ZfIyA;0>J^POSCxbgO{3Pahhg%4MDh@0&eq;h@^c z<5Ae}er${54-O6qBg0)BK^T!BHCtotAhUdwPDtg$hbi&k*w|QSXNQcOot@2OJ`-5P z$E#O=kT_1R~h@#MJ=s`6I zc$hw!OvK}H+=MA4WQD%=u`iYCCmrz7w{PEZA0usGu))TWbP5C-NjzKwN3nadTJn%A zWnrH$0H@I(3I%D@tSB_g$S^eEw1I)t?(SY)U46M+ibPsjl3QdZU}Uo!rP2jX1RHbA zImbqG@-Pi(tx_(P8XB6wM&0FrJvlikm#;xcAaS^`*+H6R`dC_n1^CE(7uVS1>d=~B zE1jH7sQy~8ZJ|&^6+l^rhshmMhL~`;-qF$V;o+g-F4HnOKDA3`xuC4Y#l`x14cK42 z7$;)|LnH{)LK82Ijs4!$)n!A8T<_k!+uYpLG&jfZ%ap(l=zz@bC~upa`WOB&MhTCUJ&`pTe{BtHRb2_OD+TQAvG$38)VuUR+#~ zyB|M(B>723D2f5u?4}VFH4B+ZA|#U>O%0YOo~wD z#G#F_YH9hG;;N;qfVaNB&SEt1soYJcpRTU1Z){{S6l>VI9k2BFCq;E4d;}8dCr$}K z5N1zzQW^1)PN#9AAfzf7EK8>YY?2uiMO76E{3@MiSkGIzEUC<_?kXo&z&w)eN%?cP zNRaqqL+TZco)Rh?Up7PrP%&O!8P&#q#tahMmzI`D5dM)$NF)hQ`pLbisVO3fJ;5s? z)_IC*Z+?EB@i=~bd|Y;H4_Gzscj-AQo6XM8XDCIH=5DtKU7~P8!eJKq+1wmPwh0%* zn^dnv1Jx+*&tx)|^3;iDxKZ-@8&q1 zF8P^Cr8+udGX5db>6S=9`#?L5jRC?Fl}baB2t0^o{?ZWj1Y6KgMtHqDJViPXD-6&l z*L|(ImCT3|wgo#9n?xv;ri{jd-ro4$-ab2KKsekayn?EwXoZIuc6?mqZw=DPn)u-Z zs7%sC#G-nvuP;tNc2t z8Zh+B_y4DshZ5{HhM+0w98dr zC>)c|@@BD`*CE-1gPT`vSWqYwIGFCN?rf6Tbt{H7EtyQBvB3k903Lg|ttg5cwJpnH_jNP7dgirL zmgO)E)%*Q!+xC{R8K!xj*X`%?sq4Dyx@z5DhfP#W4D4Xw589Ei!{FTB?&$EWyXtto zH@3)wnoPqL|IO|zrJRmAM*&llX-udvGvbqr6a{ZQbk8EJIK zel(t_oYD{w0U84l%$3;trPG)+Qb5wdDM_PoI<_sT*r^lqX1k^3DCX&$i#d<`c~COY zc;y|;l?*gq_rr==&TmW;7c){*JZ{V4ezI;GrSPDb@dwl0&qZNLf<#R*mrf}({G}6_ zMx=D2(MXj}_)DN%$tGs#0kPi?GojhN#%)i;48Qb>x*sZ6vSslf3LI)_nq95{@820{ z+^9GMm(ZxtKsFjz%*TPt#Eg-Tocp;7I;9bHzYT@_)sM^lbbotOjPjKnr4wd~e5DiS zYzdm3n4{Qplunn^P<%zUbc&UXl-s6@ImP|_|3Mg=Vs}5(mxMg-mzpb#?)S?TXCnMh z=Tf-YDuM?{_zm$}94}2!%ru%r_xsf=u}RA7e!F@_RLqnYRaj|q?iZ~16LWUngx8jjLs661WZP=Y^Z9(eUV8N|DkNM@FL^&6kFNj& Y0Lib8)x+9c>i_@%07*qoM6N<$f_Y~&5C8xG literal 0 HcmV?d00001 diff --git a/src/wp-includes/images/crystal/document.png b/src/wp-includes/images/crystal/document.png new file mode 100644 index 0000000000000000000000000000000000000000..3295ccd388867461930044c0aa5ce9b7d8ad542d GIT binary patch literal 2305 zcmV+c3I6tpP)c-BGq>5x($lPNC3a|AuZ5{J_YT6(?6leLxH}u4GQ$3a9El}5S?D&YSTCt_d zwhl@*5Ao)5ui5F)n=aPNU2>(^9YgeRW;pZP@B4k%EWCE@T0WoGbsYpW2q8FbV~n}` zc5}YkJM#|4xYcSA(=^YXJq!Mi&B0_@7XPG_ilTV+>Q%zO^Jzyajttzw2tVkSgj)=r z@&D}=`c{8LUKpr$+ zC~sU-gW?Hld=2rKmfhdk*-;c_q)CSv^nhMjS+T{yd1|w@FOOGJA?|g~E;BPTzFQAk zO?aEKKlzk>&^P=*$T^n`{)SJq+imV|hClRhG(jFEo6UM2+i5-u;;q-~sjBL`^~i&V zqsirRZa?c@@1r2znV6XPHcA<;DO)Md0;lg)ko{v1ZG*NxhHO?>S3M@;BNg}D$&)8N zDjO~v$H9k@jlZB^k&0A?057+{z`B?hdcB7*u5Km-HBG!a9F#et|g(~u?rpi%?tGC^&{ z5}DP~X(Yi%{h)ZzjE|285w@qA7G#hi!2hER3IO(Ag;ok65fG&sjQ~QqKn!L9gUb#A zi?0I=!4|hlBy>4m!sUeg{fY<8?(QxZ%%FmnmzNC-n*FTQME&y-FfD@6SZXXHu|}<@ zYWy7a)wvi^NHI?c08@C!5-Dg?E!!vG%&ilK&v)z`Ri0X@~dBdbZ=w-$^G@M zjRQqDOFQ4c^s`G#xujuOs$uRv-J=xO8_oCLKiBMPttL<43?iao3Ua)yOWyJYjA(XAYAY?nDL3Be|f)^?f+5f<{}i759r+;G(hiEu|KWYR(e z0MpFKVxf=?#TD*tc_};So;g>9c!CH}*?ZpUsHKLoJU_vD#@fRtS}dQJMMbv+wTCgn zNYbIs%{n4dWCC85YK+@~L8%~NA)8Bddp#encmf2UR$sM2|JKh-jE+>Vb{geco9>nM z=@izW_};lQrCJj(O`gitRM6-d`v*N)#*nthl98M!b67;eA`t*avnO+FTczu_*M9Qh zMK4zdGf=MeAa6U_JGk@waQ&cbP((zr+~#$+Hh~Y)My=8`p6|xSPc6(Q6D#MZtK6KM z-G*Y8TkWJQh-N=REKI~Vp6&hSlh1zm<9B@&WpU&mW zweIsub0#OG%-WZmTjSX=k-)oK>mSbxckfq?$`nBCqstfDF!9;v+=vW`2(y!!uhxry zxN@Dy(sVu_Xw2@3LZJ|p2i^VWmmsn}w{rT#((0v^^oL8*Z$EtkBe85UR;w%3XWH-o zzV*TRsRx@JC%yCd<#Zw0Ba^Ac895&N%inI@d9*1-(?Et@l2jdcc)>crLbn3*4iL81}t4^ zbi_>bkV;9G+Wt?`tbUGic_~@2tipFs3fRzYJuC%U&`30P|IE9I?R^CZgqenzl3N|U z+w47Uck@}YxF8WpO2>I}pg-P$jY_vts#n+!NJty;aPIS$PDNBcqc9_i7F?c0p)HaK*Vx4T;7#riP^UYc=!mYV@f6 zqgL9^2nzY$;&?ASe0K;coBg?RaB$$z_DJ_zBNv}Jb7q(^`z8q?IdQ!EL4RW&$Ip4$@Ab z&dtpoDJ~9Pt`g5Rp}o{e62i;I_o2gk+y3j2@Q&*(c|Y$B<&cfuw)gY*w&7ohy%B+V z=z_w?WB8^)W;Jr$>*9D2mL$nAj3b3#&+YG!k&%7pMFCt}TPqfePO=kTByaF#y#21_ bzXA*ZKB)C%8z8H*00000NkvXXu0mjf7Upu~ literal 0 HcmV?d00001 diff --git a/src/wp-includes/images/crystal/interactive.png b/src/wp-includes/images/crystal/interactive.png new file mode 100644 index 0000000000000000000000000000000000000000..fd6de7d7a7ab67f5e528a9d4478e0adb9270c3a2 GIT binary patch literal 2808 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 KMNUMnLSTaBBU4WR literal 0 HcmV?d00001 diff --git a/src/wp-includes/images/crystal/license.txt b/src/wp-includes/images/crystal/license.txt new file mode 100644 index 0000000..cdabd2f --- /dev/null +++ b/src/wp-includes/images/crystal/license.txt @@ -0,0 +1,9 @@ +Crystal Project Icons +by Everaldo Coelho +http://everaldo.com + +Released under LGPL + +Modified February 2008 +for WordPress +http://wordpress.org \ No newline at end of file diff --git a/src/wp-includes/images/crystal/spreadsheet.png b/src/wp-includes/images/crystal/spreadsheet.png new file mode 100644 index 0000000000000000000000000000000000000000..f2c4d3093aeae2da0c158b006a38c6d43cea22a2 GIT binary patch literal 2725 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 literal 0 HcmV?d00001 diff --git a/src/wp-includes/images/crystal/text.png b/src/wp-includes/images/crystal/text.png new file mode 100644 index 0000000000000000000000000000000000000000..feaed5b47246586c51ffcea8a4be6b58c28ec246 GIT binary patch literal 999 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 Xq0QFqM~$u500000NkvXXu0mjf25>N; literal 0 HcmV?d00001 diff --git a/src/wp-includes/images/smilies/icon_arrow.gif b/src/wp-includes/images/smilies/icon_arrow.gif new file mode 100644 index 0000000000000000000000000000000000000000..2880055cc0f11c60f5688ade044df280856df9a7 GIT binary patch literal 170 zcmZ?wbhEHbtSLu;wYQ>TAs=jBP*FkflM?zCbCrVb+sjSbO~t9>%IUtM${ Pu}&Z@V%kj=CI)K&O7cC% literal 0 HcmV?d00001 diff --git a/src/wp-includes/images/smilies/icon_biggrin.gif b/src/wp-includes/images/smilies/icon_biggrin.gif new file mode 100644 index 0000000000000000000000000000000000000000..d3527723c6d8a0ddfa7ca0bfe1ab8fce0055918c GIT binary patch literal 172 zcmZ?wbhEHbgxLc6$23b2ZD19|4%af-@@>3F2nzSlmGt}{{R2@|NpQ5 zKLsg(0L7myj0_CC3_2h#$P5OS$PJ#HS#x(>T`Hg?&Q{P6{IT@*|fe Qt&nb$oR(_V$-rO@0AZ~_>i_@% literal 0 HcmV?d00001 diff --git a/src/wp-includes/images/smilies/icon_confused.gif b/src/wp-includes/images/smilies/icon_confused.gif new file mode 100644 index 0000000000000000000000000000000000000000..0c49e06983f1fff4bc0834b4d86ce39b8a36a914 GIT binary patch literal 171 zcmZ?wbhEHbZXiyV-#U P9L#x)b-Z(h7#XYqI2k)k literal 0 HcmV?d00001 diff --git a/src/wp-includes/images/smilies/icon_cool.gif b/src/wp-includes/images/smilies/icon_cool.gif new file mode 100644 index 0000000000000000000000000000000000000000..cead0306c0e38e57bdb0cc85a407b995dcbdc656 GIT binary patch literal 172 zcmZ?wbhEHb+|z`)C(1LA_rU|@;d;3=6kcSq>7bCTj>1sqIsoCSRx)8`fJ$~w+{ zJX`yX^?~=R4m2(o_)+HS{ItMiUIk0)fwE>-?dDgxjscmQ{AM&TEaGA7z8`VSO88#> SHjRW8(oK@nQq4LU7_0%kd_$xF literal 0 HcmV?d00001 diff --git a/src/wp-includes/images/smilies/icon_cry.gif b/src/wp-includes/images/smilies/icon_cry.gif new file mode 100644 index 0000000000000000000000000000000000000000..7d54b1f994bb20c2a17c6e9e53edb39e0444b380 GIT binary patch literal 498 zcmZ?wbhEHbivPL&TtkAL9RpmA^bD98ftnS6varfA2r%e?3<5cWfi*@! zrOPq0Pa{O{R3VSL)CLZwJI;bVj@ow|9P^f2{b_KV;g#sD#JTIhK{X4eRSZoFOA4&E zE?xGWjgRM;Ia^8kzR>%TOS23r6eRl<`~6;g|7yg@*31^DX`|+%tO&MH1Y{u#11keN z5Hhd|DyTR-@tBu#X^wBxK7*WjP8?uWTo6?pKs7*@va%&Sa#%9C1z8HDof#;_rJ&H~ zFsWx*ry9h3B%L5>ZUqL1B|!6=oIFuX25Dyj%JU{%Vn~@hA!8Mj(`_aU6Ueh0) literal 0 HcmV?d00001 diff --git a/src/wp-includes/images/smilies/icon_eek.gif b/src/wp-includes/images/smilies/icon_eek.gif new file mode 100644 index 0000000000000000000000000000000000000000..5d3978106a2da37441ed17c9d05383b367570d46 GIT binary patch literal 170 zcmZ?wbhEHbd`4m;$l6XN^_D8SRJJ2FugV_ z;@-1W`~Ak%x7W!T7_8VEVD?C1V$(vmHm-x7t|ENQXTMbHG-$9e9m-TqP;V|s+-sI@ SDB66dp*Gz_Y_|#%gEasOPe3vN literal 0 HcmV?d00001 diff --git a/src/wp-includes/images/smilies/icon_evil.gif b/src/wp-includes/images/smilies/icon_evil.gif new file mode 100644 index 0000000000000000000000000000000000000000..ab1aa8e123fe263608d06126ce08c560ad419f97 GIT binary patch literal 236 zcmZ?wbhEHbgxLc6$23bKgaO@B*VYC4FCTM|KGy!A1Lx~^8f$G|7kJ& z%VnN6ZQB2*4FCVX1}P;4DE?$&WMB|r&;e-z*~!3~slec{BxBNqoiq9;sWfXDwJwx! zTfpypu*1~B&zIRcFi`x-!pOiN%b)||f$U^p%}h}5a*XWD2sb-X$e}K^frar-lVFcywmLVPpS#r! z1_#Bw>()y8Q=}6Xa7!$m)>9ItA-k>bRM`by3r4gxLc6$23b2ZD19|4%af-@@?!ukgRQ4FCU4{{R2@|EEBy z*B}*Op!k!8k%57iK?lSGnZdvkyTOw)YwnKFWkE{fYz4;!=ddvOIHYqKtO`15eTQk+ zwr{=ctfC9V1Rm6}I;$2M@y*$pa`Z}#oqrI+!z(?kVh8VTo6X#$!E$I32lMi<45x(( UGxi&cHs4b?vq7goSdhUQ00}uk)&Kwi literal 0 HcmV?d00001 diff --git a/src/wp-includes/images/smilies/icon_lol.gif b/src/wp-includes/images/smilies/icon_lol.gif new file mode 100644 index 0000000000000000000000000000000000000000..374ba150fb238d6a33605bb26e86d4449625a46c GIT binary patch literal 336 zcmZ?wbhEHbgxLc6$23b2ZD19|4%af-@@>3F2n!7!vFtG{{R2@|NpQ5 zKLsg(0LA~@ey$E)D;vwK1$ZJE z)->GK{b0hvv^Z;7;HB1zIS=v}c`BF7qB`mkh55UYFL448CX~YJS?+%vC0^DXyTAT=mC2Y$ux)_YXI57TebiI literal 0 HcmV?d00001 diff --git a/src/wp-includes/images/smilies/icon_mad.gif b/src/wp-includes/images/smilies/icon_mad.gif new file mode 100644 index 0000000000000000000000000000000000000000..1f6c3c2fb401596ec44f4a1189bde2cbc45364aa GIT binary patch literal 174 zcmZ?wbhEHb3F2nzSlmGt}{tp7j|Nnpe z|0z%&3KV~`FfuUkGU$N#ATtF%wyNW~cLKD&UCI$nR5;ND%aoaG8jR+sH5 z;LGade6U~GQPko`gGJNAq7#;kr@G#2#;~znnVhs^*T0km#>C~4JR&=FdsEeR+|3R= Q;9xFbtmB<4#K>R`0GZ1@LjV8( literal 0 HcmV?d00001 diff --git a/src/wp-includes/images/smilies/icon_question.gif b/src/wp-includes/images/smilies/icon_question.gif new file mode 100644 index 0000000000000000000000000000000000000000..9d072265bb9d7d5d4eeaaa9aadb44a49a60e5fe3 GIT binary patch literal 248 zcmZ?wbhEHbgxLc6~q5?4F69u{F}@0e+$F^zrz3jO@4oyp}v#>2=1R{ z`2YX-`F#xhd<^^7GyH$bps&p^e-cpewY&^Nd^p4X4Gi!1Fzlbske>!pj|LQfvM@3* zNHOSu#6fm4u$C@R>vD+fTM_1WrjSFOYeSph9VW&ehisimT`Ynp-iELv_k~jmS4OEzz h1Q^5k8{BNVn8hT-nI{@Cu+CwP)wEG_S5{=O1_1NkQKJ9= literal 0 HcmV?d00001 diff --git a/src/wp-includes/images/smilies/icon_razz.gif b/src/wp-includes/images/smilies/icon_razz.gif new file mode 100644 index 0000000000000000000000000000000000000000..29da2a2fccc79981bc54db7513ca6d2374592f9d GIT binary patch literal 176 zcmZ?wbhEHb^3h|5y0`zsdjqAOHXV zwXw1B|EEADAfWh@g^_`Qk3k2-0hz(T5_`c@GHdRQt4o8V#Kj6YnC2W7^l?<@Q2(%O z^|TpzE=L6K%vq%4Qv0AgI88 ZPHWn(3w4)`M4Rs!oY|mbDlEug4FCb$KH>lX literal 0 HcmV?d00001 diff --git a/src/wp-includes/images/smilies/icon_redface.gif b/src/wp-includes/images/smilies/icon_redface.gif new file mode 100644 index 0000000000000000000000000000000000000000..ad7628320c3d15756c84794c8c0523f1072da640 GIT binary patch literal 650 zcmZ?wbhEHb&Qw$Gs7{2#K|NnmWcSgp)ZKdDmF#NyN{%1+%|LxoV z&6x4L*vr+`_5YJ6|9^e`f9A~pR}4QI8vg%z`Rh8vzsC$emo5AMNBH0A=KudDKaP*T z>0!pe!0`X+%wGqqfegj}+zPv3R$%UgcxPlMx(u7qxxxfZd?$&YQ;PGndxWo3ZY ziH`8-T?`B&DNk$k=JGRs=w-6FQO@h2ko&aap$ji#VOF!1O><{wyHRCMkfx2Ai?Slv zYA%q~j0}tnyg^Qv|J?fJ`y}Jo`B}5IcZU0i%+^)m>vp{!Bqu6#)+xQyYu&8=mRY(7 z)}5aCNL5gG*%{+AHF>K87ridk_T^KXg3qiu^$yZP~SpxtUz5smy literal 0 HcmV?d00001 diff --git a/src/wp-includes/images/smilies/icon_rolleyes.gif b/src/wp-includes/images/smilies/icon_rolleyes.gif new file mode 100644 index 0000000000000000000000000000000000000000..d7f5f2f4b18f8a141c7a5dd1e09ff106a2f9fa1e GIT binary patch literal 485 zcmZ?wbhEHbgxLc6$23bKgaO@B*Xvz|NqTp_`ikW|G&xq{~!PVSNQ)^ zpx|qe3NTRo&+X?L671|4;A*62z|05~RQ$=p%EiFTpaW6>GM0fQZi6Rh*4!PT(*&f% z*$TRZ<}@?I^CYG*?eW$Pd$isBan+(fO1gn0b6dW=x%w~q}~tKE&`I~ zWZ+_80zw8BmJOU2m9Ux1yJ3o3D&v+$ZG#t4ZLVMy3?Qu_ZQMY+8CYaDcq&S-H42Fh z{c)CE%Sn@EnS+n-#i)qLlhWcv5Vs)dU<2w9+u*4hy}}}Vq4ah~j;>ScENX^v3nduQ d4TmZP8gAjeGaoDCD!-THXQ zaD}Q`!Ef~@t%4VS^H`jpHe@qRnmW&T1rN_M_11z^Th4v=m-`t@{9)jl*%hj`3F2nzSlmGt}{tp7jjg5`} z|9}1eDNqRrDE?$&WMJT9&;fBkW-zcsU+|R7ntLO3**QsZu>uaJIn9DTj_MrhAC|2y zn^DM@#l<(@zDcWq`B+oyDaGR~0+SdoFXD`_(PqAxy<2o0Q>0^(jhH~$tb+>(~Mkip?iSJVUgxLc6$23bKgaNIF2n!7!vD80{0DM@;NRr`CxMLP|FjsU zO`B$HZ2T{m`TzgdAk{j*8D$QDUE*nK$ z7w|KG>@aokb7%R&!0WI`LE+V`jZbtHGVEq^HDzd8gshBhJhWk{9N&@6Gj#R{?N7d_ u@Ss3Q_U6Qmr`{j;vSH$AZf0`Va5JoNi_%bKV4KJmrQFw{HdRBB!5RP#AxjVd literal 0 HcmV?d00001 diff --git a/src/wp-includes/images/smilies/icon_wink.gif b/src/wp-includes/images/smilies/icon_wink.gif new file mode 100644 index 0000000000000000000000000000000000000000..d1482880421dde677d3302940aa875ff22a11b06 GIT binary patch literal 170 zcmZ?wbhEHba9D@n#Zhbsv zutHU>;J1F0R>6zE2`tV}8xE^#?@bGklrZsUYAp!;dbG*vY{CM88Jk-qvwbqQUtQFY Pm?x1IA$CiJiNP8Goi0B( literal 0 HcmV?d00001 diff --git a/src/wp-includes/images/upload.png b/src/wp-includes/images/upload.png new file mode 100644 index 0000000000000000000000000000000000000000..8ca02d7c1881c563c1fae78dbbf44fdbeecab979 GIT binary patch literal 814 zcmV+}1JV46P)l!*)3DHOTLG>Y{ep{TJDDY*%lT!rL2v_v&aQg;ldD^Wy@z=#NiM{vRv z=?}s5BP6xa60J+h{2G9%$W+b>Fj<9$(H7RB866V;%=Dpr$usdJb)y0Ko}Mx>i^LC{ z!%af`Evs~<(Sy*)q{X~3^KrRU>!`ZYsg>k-VcwX`Jg#Jt7y8!rMKV(vFVr@(n(%M0 znRI1s+n-byBqk@;1G(PUx3v59%z^c6@+8rI6KG(PzwUqAnMt%?gmKA#zS(9b9_^hY zWBY7>%*4lDXz@R~KQn2T2W;}+TQy32K-YFaBF`0CBIP6d9Xk1|4l=9g*zT^737`BX zGI!Cn-B}@f1udbxBzFp({F0aA0d(^FlGIzRU>y`okNC)?A&Xyg9y9T1Cx}e`kGo?g z=GHpU;&7uiE34MNr-Dg-#r?WHZ_HDhKbmjqoBYju#Ao~0n9M9vUi*^1wY_Bbrp2@5 z??&8PR(&O`TkdFgG5HTI{zSgo)Rk&J?ze>I*HPbf6`Bz8&b`J=qP`w#!3b^CnTZFl zLTw3$M9G=xf{D3lv!sG4+G)9gmZ+P_)PrN9 z<)#LvX{OCvv_#24E~yVD>7gh-`QxPGlV2qcx&`w6C0rpU9`1yYFVVx@5fgJ`9cXd1 z(RfOJ-vj1n;@-QE{3o{eNk!9FKvNO{+v&69zw|luPJV|k^*s5FVUIEFF@`@kKt|L3sh4^t-<^%Ny27X%zi zqzcqllvb1?pi*d~@^G58O+z9(X<|Em#cS`bcV}k#W<5@WKyU!o`e|k-^SyrGV?#X8 zga7l<{^oB4p&-;9P~^GriX+$#aC!cZ28dLqBSMIPTbThRCb$ zyzg%wtS!UL`41GSD1t~___3dnSHh1rJhp}fzhW0*^?2kb#8iq(D2mwt4 z$8n+6wxHQ+L!;4x{937?5%})tfzi)So;Z@rWHL3>(-F~VQn@0PCr^KT{>Alj_3iQf zLr?D;OhI~25~86X1a%!WRRxRyJnn%@DcFt!ZOewSk%5u?TJg=<+e?R*3+tb}_QJ%4 zL?Tg1r_+|YaPtb0wDf=Y>4oPD8^ux##aekrgTwbMAu)FahQpjD|xnJd}cJee0>8?-X81MD zHjzxkLC3HOo(hgB3R3itNeIt-dvPuzbHyEmNW3s4$-u1jk z(Zfm-&WP?Ntn+KT-8K{%fpu!)iOUZjlxIqt4Jp`FOhx$gFTkWBdAFCFQn?1Jg^i!$ znsc>Yuh)8Ud&iF*tfi8PoAY;;%PrIPl?cIY&!zV}_gyFGHeEvb?fIo8m9;OLt;VwJ zx>b<_k=5vWxt^*tn$KbO`vaQd3z=322OKsX?ukDpq&G6ro?lHK7|3~fvkt#473LIb zo)6HitEEb14a?LZcsX@?FZ=rEROjM%{t82w|?6g}U#rl$(ja;!&7nYlHeJ$vz+X;geT91cRQ zW?-u~4d!&_G=(&9dfG1YGDOjaL~Y|YA&N7oOJNRCwBK zQ{QXSQ53)Xel>NQY@>&0wl&?>%QjM~)l+Rt!^T=Rb!k7;evF<1A9{!gtmvUo(^x_f zF<*S1ji5*U18h@4kd1J{mTyyL2sZU}&&B&?MF$S|-g7_a+|Rl9b32|qe?zzhUOyG) zEVjqR!jJH;{e4m_7Fc|EWR&Q1qePU6p`D%Gx7l=RkA|Bxw?(i(yNGb@y6u~8yV`!r2SUCvIvIyVmwmma~!#s>8E_5zLl*Y$cml*?ss zxjkUDJ22Km7Oc)^V`CFg`dI>t#R5}PQxX{G=tDz8EQSZ5)oL{m1OXhbB`YzRXDj|d z5E6+5+r%RLL`*>E>rg1fFe@u7@Z#kwxaqu8Bm)D3kk98Cb)<)zJi+VrvINcmF?^lN zxsV*9gN^`V$JWeQG z7Ndz|dwZMBSL0vExycI!Vt2ScXoq#bISbym&*zh9BcoEO#26uFb90kDqs{4lKvbPw zee@}_C=MNLm|3Js0-;fMMozyQrO#ceN#Vx<58002ov JPDHLkV1kJ>Un>9r literal 0 HcmV?d00001 diff --git a/src/wp-includes/images/wlw/wp-watermark.png b/src/wp-includes/images/wlw/wp-watermark.png new file mode 100644 index 0000000000000000000000000000000000000000..c312a72562c7452f45439fe5f53227a2c55ea9ce GIT binary patch literal 8280 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 gwPcEr`A>iW0C727`Ns`5r2qf`07*qoM6N<$f 0) ) { autosave(); } + if ( tinyMCE.activeEditor && ! tinyMCE.activeEditor.isHidden() && dotabkey ) { + e.preventDefault(); + dotabkey = false; + tinyMCE.activeEditor.focus(); + return false; + } + } + }); + } + + // autosave new posts after a title is typed but not if Publish or Save Draft is clicked + if ( '1' == $('#auto_draft').val() ) { + $('#title').blur( function() { + if ( !this.value || $('#auto_draft').val() != '1' ) + return; + delayed_autosave(); + }); + } +}); + +function autosave_parse_response(response) { + var res = wpAjax.parseAjaxResponse(response, 'autosave'), message = '', postID, sup; + + if ( res && res.responses && res.responses.length ) { + message = res.responses[0].data; // The saved message or error. + // someone else is editing: disable autosave, set errors + if ( res.responses[0].supplemental ) { + sup = res.responses[0].supplemental; + if ( 'disable' == sup['disable_autosave'] ) { + autosave = function() {}; + res = { errors: true }; + } + + if ( sup['alert'] ) { + jQuery('#autosave-alert').remove(); + jQuery('#titlediv').after('

    ' + sup['alert'] + '

    '); + } + + jQuery.each(sup, function(selector, value) { + if ( selector.match(/^replace-/) ) { + jQuery('#'+selector.replace('replace-', '')).val(value); + } + }); + } + + // if no errors: add slug UI + if ( !res.errors ) { + postID = parseInt( res.responses[0].id, 10 ); + if ( !isNaN(postID) && postID > 0 ) { + autosave_update_slug(postID); + } + } + } + if ( message ) { // update autosave message + jQuery('.autosave-message').html(message); + } else if ( autosaveOldMessage && res ) { + jQuery('.autosave-message').html( autosaveOldMessage ); + } + return res; +} + +// called when autosaving pre-existing post +function autosave_saved(response) { + blockSave = false; + autosave_parse_response(response); // parse the ajax response + autosave_enable_buttons(); // re-enable disabled form buttons +} + +// called when autosaving new post +function autosave_saved_new(response) { + blockSave = false; + var res = autosave_parse_response(response), postID; + if ( res && res.responses.length && !res.errors ) { + // An ID is sent only for real auto-saves, not for autosave=0 "keepalive" saves + postID = parseInt( res.responses[0].id, 10 ); + if ( !isNaN(postID) && postID > 0 ) { + notSaved = false; + jQuery('#auto_draft').val('0'); // No longer an auto-draft + } + autosave_enable_buttons(); + if ( autosaveDelayPreview ) { + autosaveDelayPreview = false; + doPreview(); + } + } else { + autosave_enable_buttons(); // re-enable disabled form buttons + } +} + +function autosave_update_slug(post_id) { + // create slug area only if not already there + if ( 'undefined' != makeSlugeditClickable && jQuery.isFunction(makeSlugeditClickable) && !jQuery('#edit-slug-box > *').size() ) { + jQuery.post( ajaxurl, { + action: 'sample-permalink', + post_id: post_id, + new_title: fullscreen && fullscreen.settings.visible ? jQuery('#wp-fullscreen-title').val() : jQuery('#title').val(), + samplepermalinknonce: jQuery('#samplepermalinknonce').val() + }, + function(data) { + if ( data !== '-1' ) { + jQuery('#edit-slug-box').html(data); + makeSlugeditClickable(); + } + } + ); + } +} + +function autosave_loading() { + jQuery('.autosave-message').html(autosaveL10n.savingText); +} + +function autosave_enable_buttons() { + // delay that a bit to avoid some rare collisions while the DOM is being updated. + setTimeout(function(){ + jQuery(':button, :submit', '#submitpost').removeAttr('disabled'); + jQuery('.ajax-loading').css('visibility', 'hidden'); + }, 500); +} + +function autosave_disable_buttons() { + jQuery(':button, :submit', '#submitpost').prop('disabled', true); + // Re-enable 5 sec later. Just gives autosave a head start to avoid collisions. + setTimeout(autosave_enable_buttons, 5000); +} + +function delayed_autosave() { + setTimeout(function(){ + if ( blockSave ) + return; + autosave(); + }, 200); +} + +autosave = function() { + // (bool) is rich editor enabled and active + blockSave = true; + var rich = (typeof tinyMCE != "undefined") && tinyMCE.activeEditor && !tinyMCE.activeEditor.isHidden(), + post_data, doAutoSave, ed, origStatus, successCallback; + + autosave_disable_buttons(); + + post_data = { + action: "autosave", + post_ID: jQuery("#post_ID").val() || 0, + autosavenonce: jQuery('#autosavenonce').val(), + post_type: jQuery('#post_type').val() || "", + autosave: 1 + }; + + jQuery('.tags-input').each( function() { + post_data[this.name] = this.value; + } ); + + // We always send the ajax request in order to keep the post lock fresh. + // This (bool) tells whether or not to write the post to the DB during the ajax request. + doAutoSave = true; + + // No autosave while thickbox is open (media buttons) + if ( jQuery("#TB_window").css('display') == 'block' ) + doAutoSave = false; + + /* Gotta do this up here so we can check the length when tinyMCE is in use */ + if ( rich && doAutoSave ) { + ed = tinyMCE.activeEditor; + // Don't run while the TinyMCE spellcheck is on. It resets all found words. + if ( ed.plugins.spellchecker && ed.plugins.spellchecker.active ) { + doAutoSave = false; + } else { + if ( 'mce_fullscreen' == ed.id || 'wp_mce_fullscreen' == ed.id ) + tinyMCE.get('content').setContent(ed.getContent({format : 'raw'}), {format : 'raw'}); + tinyMCE.triggerSave(); + } + } + + if ( fullscreen && fullscreen.settings.visible ) { + post_data["post_title"] = jQuery('#wp-fullscreen-title').val(); + post_data["content"] = jQuery("#wp_mce_fullscreen").val(); + } else { + post_data["post_title"] = jQuery("#title").val() + post_data["content"] = jQuery("#content").val(); + } + + if ( jQuery('#post_name').val() ) + post_data["post_name"] = jQuery('#post_name').val(); + + // Nothing to save or no change. + if ( ( post_data["post_title"].length == 0 && post_data["content"].length == 0 ) || post_data["post_title"] + post_data["content"] == autosaveLast ) { + doAutoSave = false; + } + + origStatus = jQuery('#original_post_status').val(); + + goodcats = ([]); + jQuery("[name='post_category[]']:checked").each( function(i) { + goodcats.push(this.value); + } ); + post_data["catslist"] = goodcats.join(","); + + if ( jQuery("#comment_status").prop("checked") ) + post_data["comment_status"] = 'open'; + if ( jQuery("#ping_status").prop("checked") ) + post_data["ping_status"] = 'open'; + if ( jQuery("#excerpt").size() ) + post_data["excerpt"] = jQuery("#excerpt").val(); + if ( jQuery("#post_author").size() ) + post_data["post_author"] = jQuery("#post_author").val(); + if ( jQuery("#parent_id").val() ) + post_data["parent_id"] = jQuery("#parent_id").val(); + post_data["user_ID"] = jQuery("#user-id").val(); + if ( jQuery('#auto_draft').val() == '1' ) + post_data["auto_draft"] = '1'; + + if ( doAutoSave ) { + autosaveLast = post_data["post_title"] + post_data["content"]; + jQuery(document).triggerHandler('wpcountwords', [ post_data["content"] ]); + } else { + post_data['autosave'] = 0; + } + + if ( post_data["auto_draft"] == '1' ) { + successCallback = autosave_saved_new; // new post + } else { + successCallback = autosave_saved; // pre-existing post + } + + autosaveOldMessage = jQuery('#autosave').html(); + jQuery.ajax({ + data: post_data, + beforeSend: doAutoSave ? autosave_loading : null, + type: "POST", + url: ajaxurl, + success: successCallback + }); +} diff --git a/src/wp-includes/js/autosave.js b/src/wp-includes/js/autosave.js new file mode 100644 index 0000000..ee06aaf --- /dev/null +++ b/src/wp-includes/js/autosave.js @@ -0,0 +1 @@ +var autosave,autosaveLast="",autosavePeriodical,autosaveOldMessage="",autosaveDelayPreview=false,notSaved=true,blockSave=false,fullscreen;jQuery(document).ready(function(b){var a=true;autosaveLast=b("#post #title").val()+b("#post #content").val();autosavePeriodical=b.schedule({time:autosaveL10n.autosaveInterval*1000,func:function(){autosave()},repeat:true,protect:true});b("#post").submit(function(){b.cancel(autosavePeriodical)});b('input[type="submit"], a.submitdelete',"#submitpost").click(function(){blockSave=true;window.onbeforeunload=null;b(":button, :submit","#submitpost").each(function(){var c=b(this);if(c.hasClass("button-primary")){c.addClass("button-primary-disabled")}else{c.addClass("button-disabled")}});if(b(this).attr("id")=="publish"){b("#ajax-loading").css("visibility","visible")}else{b("#draft-ajax-loading").css("visibility","visible")}});window.onbeforeunload=function(){var c=typeof(tinyMCE)!="undefined"?tinyMCE.activeEditor:false,e,d;if(c&&!c.isHidden()){if(c.isDirty()){return autosaveL10n.saveAlert}}else{if(fullscreen&&fullscreen.settings.visible){e=b("#wp-fullscreen-title").val();d=b("#wp_mce_fullscreen").val()}else{e=b("#post #title").val();d=b("#post #content").val()}if((e||d)&&e+d!=autosaveLast){return autosaveL10n.saveAlert}}};b("#post-preview").click(function(){if(b("#auto_draft").val()=="1"&¬Saved){autosaveDelayPreview=true;autosave();return false}doPreview();return false});doPreview=function(){b("input#wp-preview").val("dopreview");b("form#post").attr("target","wp-preview").submit().attr("target","");b("input#wp-preview").val("")};if(typeof tinyMCE!="undefined"){b("#title")[b.browser.opera?"keypress":"keydown"](function(c){if(c.which==9&&!c.shiftKey&&!c.controlKey&&!c.altKey){if((b("#auto_draft").val()=="1")&&(b("#title").val().length>0)){autosave()}if(tinyMCE.activeEditor&&!tinyMCE.activeEditor.isHidden()&&a){c.preventDefault();a=false;tinyMCE.activeEditor.focus();return false}}})}if("1"==b("#auto_draft").val()){b("#title").blur(function(){if(!this.value||b("#auto_draft").val()!="1"){return}delayed_autosave()})}});function autosave_parse_response(c){var d=wpAjax.parseAjaxResponse(c,"autosave"),e="",a,b;if(d&&d.responses&&d.responses.length){e=d.responses[0].data;if(d.responses[0].supplemental){b=d.responses[0].supplemental;if("disable"==b.disable_autosave){autosave=function(){};d={errors:true}}if(b.alert){jQuery("#autosave-alert").remove();jQuery("#titlediv").after('

    '+b.alert+"

    ")}jQuery.each(b,function(f,g){if(f.match(/^replace-/)){jQuery("#"+f.replace("replace-","")).val(g)}})}if(!d.errors){a=parseInt(d.responses[0].id,10);if(!isNaN(a)&&a>0){autosave_update_slug(a)}}}if(e){jQuery(".autosave-message").html(e)}else{if(autosaveOldMessage&&d){jQuery(".autosave-message").html(autosaveOldMessage)}}return d}function autosave_saved(a){blockSave=false;autosave_parse_response(a);autosave_enable_buttons()}function autosave_saved_new(b){blockSave=false;var c=autosave_parse_response(b),a;if(c&&c.responses.length&&!c.errors){a=parseInt(c.responses[0].id,10);if(!isNaN(a)&&a>0){notSaved=false;jQuery("#auto_draft").val("0")}autosave_enable_buttons();if(autosaveDelayPreview){autosaveDelayPreview=false;doPreview()}}else{autosave_enable_buttons()}}function autosave_update_slug(a){if("undefined"!=makeSlugeditClickable&&jQuery.isFunction(makeSlugeditClickable)&&!jQuery("#edit-slug-box > *").size()){jQuery.post(ajaxurl,{action:"sample-permalink",post_id:a,new_title:fullscreen&&fullscreen.settings.visible?jQuery("#wp-fullscreen-title").val():jQuery("#title").val(),samplepermalinknonce:jQuery("#samplepermalinknonce").val()},function(b){if(b!=="-1"){jQuery("#edit-slug-box").html(b);makeSlugeditClickable()}})}}function autosave_loading(){jQuery(".autosave-message").html(autosaveL10n.savingText)}function autosave_enable_buttons(){setTimeout(function(){jQuery(":button, :submit","#submitpost").removeAttr("disabled");jQuery(".ajax-loading").css("visibility","hidden")},500)}function autosave_disable_buttons(){jQuery(":button, :submit","#submitpost").prop("disabled",true);setTimeout(autosave_enable_buttons,5000)}function delayed_autosave(){setTimeout(function(){if(blockSave){return}autosave()},200)}autosave=function(){blockSave=true;var c=(typeof tinyMCE!="undefined")&&tinyMCE.activeEditor&&!tinyMCE.activeEditor.isHidden(),d,f,b,e,a;autosave_disable_buttons();d={action:"autosave",post_ID:jQuery("#post_ID").val()||0,autosavenonce:jQuery("#autosavenonce").val(),post_type:jQuery("#post_type").val()||"",autosave:1};jQuery(".tags-input").each(function(){d[this.name]=this.value});f=true;if(jQuery("#TB_window").css("display")=="block"){f=false}if(c&&f){b=tinyMCE.activeEditor;if(b.plugins.spellchecker&&b.plugins.spellchecker.active){f=false}else{if("mce_fullscreen"==b.id||"wp_mce_fullscreen"==b.id){tinyMCE.get("content").setContent(b.getContent({format:"raw"}),{format:"raw"})}tinyMCE.triggerSave()}}if(fullscreen&&fullscreen.settings.visible){d.post_title=jQuery("#wp-fullscreen-title").val();d.content=jQuery("#wp_mce_fullscreen").val()}else{d.post_title=jQuery("#title").val();d.content=jQuery("#content").val()}if(jQuery("#post_name").val()){d.post_name=jQuery("#post_name").val()}if((d.post_title.length==0&&d.content.length==0)||d.post_title+d.content==autosaveLast){f=false}e=jQuery("#original_post_status").val();goodcats=([]);jQuery("[name='post_category[]']:checked").each(function(g){goodcats.push(this.value)});d.catslist=goodcats.join(",");if(jQuery("#comment_status").prop("checked")){d.comment_status="open"}if(jQuery("#ping_status").prop("checked")){d.ping_status="open"}if(jQuery("#excerpt").size()){d.excerpt=jQuery("#excerpt").val()}if(jQuery("#post_author").size()){d.post_author=jQuery("#post_author").val()}if(jQuery("#parent_id").val()){d.parent_id=jQuery("#parent_id").val()}d.user_ID=jQuery("#user-id").val();if(jQuery("#auto_draft").val()=="1"){d.auto_draft="1"}if(f){autosaveLast=d.post_title+d.content;jQuery(document).triggerHandler("wpcountwords",[d.content])}else{d.autosave=0}if(d.auto_draft=="1"){a=autosave_saved_new}else{a=autosave_saved}autosaveOldMessage=jQuery("#autosave").html();jQuery.ajax({data:d,beforeSend:f?autosave_loading:null,type:"POST",url:ajaxurl,success:a})}; \ No newline at end of file diff --git a/src/wp-includes/js/colorpicker.dev.js b/src/wp-includes/js/colorpicker.dev.js new file mode 100644 index 0000000..1fc32cf --- /dev/null +++ b/src/wp-includes/js/colorpicker.dev.js @@ -0,0 +1,707 @@ +// =================================================================== +// Author: Matt Kruse +// WWW: http://www.mattkruse.com/ +// +// NOTICE: You may use this code for any purpose, commercial or +// private, without any further permission from the author. You may +// remove this notice from your final code if you wish, however it is +// appreciated by the author if at least my web site address is kept. +// +// You may *NOT* re-distribute this code in any way except through its +// use. That means, you can include it in your product, or your web +// site, or any other form where the code is actually being used. You +// may not put the plain javascript up on your site for download or +// include it in your javascript libraries for download. +// If you wish to share this code with others, please just point them +// to the URL instead. +// Please DO NOT link directly to my .js files from your site. Copy +// the files to your server and use them there. Thank you. +// =================================================================== + + +/* SOURCE FILE: AnchorPosition.js */ + +/* +AnchorPosition.js +Author: Matt Kruse +Last modified: 10/11/02 + +DESCRIPTION: These functions find the position of an tag in a document, +so other elements can be positioned relative to it. + +COMPATABILITY: Netscape 4.x,6.x,Mozilla, IE 5.x,6.x on Windows. Some small +positioning errors - usually with Window positioning - occur on the +Macintosh platform. + +FUNCTIONS: +getAnchorPosition(anchorname) + Returns an Object() having .x and .y properties of the pixel coordinates + of the upper-left corner of the anchor. Position is relative to the PAGE. + +getAnchorWindowPosition(anchorname) + Returns an Object() having .x and .y properties of the pixel coordinates + of the upper-left corner of the anchor, relative to the WHOLE SCREEN. + +NOTES: + +1) For popping up separate browser windows, use getAnchorWindowPosition. + Otherwise, use getAnchorPosition + +2) Your anchor tag MUST contain both NAME and ID attributes which are the + same. For example: + + +3) There must be at least a space between for IE5.5 to see the + anchor tag correctly. Do not do with no space. +*/ + +// getAnchorPosition(anchorname) +// This function returns an object having .x and .y properties which are the coordinates +// of the named anchor, relative to the page. +function getAnchorPosition(anchorname) { + // This function will return an Object with x and y properties + var useWindow=false; + var coordinates=new Object(); + var x=0,y=0; + // Browser capability sniffing + var use_gebi=false, use_css=false, use_layers=false; + if (document.getElementById) { use_gebi=true; } + else if (document.all) { use_css=true; } + else if (document.layers) { use_layers=true; } + // Logic to find position + if (use_gebi && document.all) { + x=AnchorPosition_getPageOffsetLeft(document.all[anchorname]); + y=AnchorPosition_getPageOffsetTop(document.all[anchorname]); + } + else if (use_gebi) { + var o=document.getElementById(anchorname); + x=AnchorPosition_getPageOffsetLeft(o); + y=AnchorPosition_getPageOffsetTop(o); + } + else if (use_css) { + x=AnchorPosition_getPageOffsetLeft(document.all[anchorname]); + y=AnchorPosition_getPageOffsetTop(document.all[anchorname]); + } + else if (use_layers) { + var found=0; + for (var i=0; i tags may cause errors. + +USAGE: +// Create an object for a WINDOW popup +var win = new PopupWindow(); + +// Create an object for a DIV window using the DIV named 'mydiv' +var win = new PopupWindow('mydiv'); + +// Set the window to automatically hide itself when the user clicks +// anywhere else on the page except the popup +win.autoHide(); + +// Show the window relative to the anchor name passed in +win.showPopup(anchorname); + +// Hide the popup +win.hidePopup(); + +// Set the size of the popup window (only applies to WINDOW popups +win.setSize(width,height); + +// Populate the contents of the popup window that will be shown. If you +// change the contents while it is displayed, you will need to refresh() +win.populate(string); + +// set the URL of the window, rather than populating its contents +// manually +win.setUrl("http://www.site.com/"); + +// Refresh the contents of the popup +win.refresh(); + +// Specify how many pixels to the right of the anchor the popup will appear +win.offsetX = 50; + +// Specify how many pixels below the anchor the popup will appear +win.offsetY = 100; + +NOTES: +1) Requires the functions in AnchorPosition.js + +2) Your anchor tag MUST contain both NAME and ID attributes which are the + same. For example: + + +3) There must be at least a space between for IE5.5 to see the + anchor tag correctly. Do not do with no space. + +4) When a PopupWindow object is created, a handler for 'onmouseup' is + attached to any event handler you may have already defined. Do NOT define + an event handler for 'onmouseup' after you define a PopupWindow object or + the autoHide() will not work correctly. +*/ + +// Set the position of the popup window based on the anchor +function PopupWindow_getXYPosition(anchorname) { + var coordinates; + if (this.type == "WINDOW") { + coordinates = getAnchorWindowPosition(anchorname); + } + else { + coordinates = getAnchorPosition(anchorname); + } + this.x = coordinates.x; + this.y = coordinates.y; + } +// Set width/height of DIV/popup window +function PopupWindow_setSize(width,height) { + this.width = width; + this.height = height; + } +// Fill the window with contents +function PopupWindow_populate(contents) { + this.contents = contents; + this.populated = false; + } +// Set the URL to go to +function PopupWindow_setUrl(url) { + this.url = url; + } +// Set the window popup properties +function PopupWindow_setWindowProperties(props) { + this.windowProperties = props; + } +// Refresh the displayed contents of the popup +function PopupWindow_refresh() { + if (this.divName != null) { + // refresh the DIV object + if (this.use_gebi) { + document.getElementById(this.divName).innerHTML = this.contents; + } + else if (this.use_css) { + document.all[this.divName].innerHTML = this.contents; + } + else if (this.use_layers) { + var d = document.layers[this.divName]; + d.document.open(); + d.document.writeln(this.contents); + d.document.close(); + } + } + else { + if (this.popupWindow != null && !this.popupWindow.closed) { + if (this.url!="") { + this.popupWindow.location.href=this.url; + } + else { + this.popupWindow.document.open(); + this.popupWindow.document.writeln(this.contents); + this.popupWindow.document.close(); + } + this.popupWindow.focus(); + } + } + } +// Position and show the popup, relative to an anchor object +function PopupWindow_showPopup(anchorname) { + this.getXYPosition(anchorname); + this.x += this.offsetX; + this.y += this.offsetY; + if (!this.populated && (this.contents != "")) { + this.populated = true; + this.refresh(); + } + if (this.divName != null) { + // Show the DIV object + if (this.use_gebi) { + document.getElementById(this.divName).style.left = this.x + "px"; + document.getElementById(this.divName).style.top = this.y; + document.getElementById(this.divName).style.visibility = "visible"; + } + else if (this.use_css) { + document.all[this.divName].style.left = this.x; + document.all[this.divName].style.top = this.y; + document.all[this.divName].style.visibility = "visible"; + } + else if (this.use_layers) { + document.layers[this.divName].left = this.x; + document.layers[this.divName].top = this.y; + document.layers[this.divName].visibility = "visible"; + } + } + else { + if (this.popupWindow == null || this.popupWindow.closed) { + // If the popup window will go off-screen, move it so it doesn't + if (this.x<0) { this.x=0; } + if (this.y<0) { this.y=0; } + if (screen && screen.availHeight) { + if ((this.y + this.height) > screen.availHeight) { + this.y = screen.availHeight - this.height; + } + } + if (screen && screen.availWidth) { + if ((this.x + this.width) > screen.availWidth) { + this.x = screen.availWidth - this.width; + } + } + var avoidAboutBlank = window.opera || ( document.layers && !navigator.mimeTypes['*'] ) || navigator.vendor == 'KDE' || ( document.childNodes && !document.all && !navigator.taintEnabled ); + this.popupWindow = window.open(avoidAboutBlank?"":"about:blank","window_"+anchorname,this.windowProperties+",width="+this.width+",height="+this.height+",screenX="+this.x+",left="+this.x+",screenY="+this.y+",top="+this.y+""); + } + this.refresh(); + } + } +// Hide the popup +function PopupWindow_hidePopup() { + if (this.divName != null) { + if (this.use_gebi) { + document.getElementById(this.divName).style.visibility = "hidden"; + } + else if (this.use_css) { + document.all[this.divName].style.visibility = "hidden"; + } + else if (this.use_layers) { + document.layers[this.divName].visibility = "hidden"; + } + } + else { + if (this.popupWindow && !this.popupWindow.closed) { + this.popupWindow.close(); + this.popupWindow = null; + } + } + } +// Pass an event and return whether or not it was the popup DIV that was clicked +function PopupWindow_isClicked(e) { + if (this.divName != null) { + if (this.use_layers) { + var clickX = e.pageX; + var clickY = e.pageY; + var t = document.layers[this.divName]; + if ((clickX > t.left) && (clickX < t.left+t.clip.width) && (clickY > t.top) && (clickY < t.top+t.clip.height)) { + return true; + } + else { return false; } + } + else if (document.all) { // Need to hard-code this to trap IE for error-handling + var t = window.event.srcElement; + while (t.parentElement != null) { + if (t.id==this.divName) { + return true; + } + t = t.parentElement; + } + return false; + } + else if (this.use_gebi && e) { + var t = e.originalTarget; + while (t.parentNode != null) { + if (t.id==this.divName) { + return true; + } + t = t.parentNode; + } + return false; + } + return false; + } + return false; + } + +// Check an onMouseDown event to see if we should hide +function PopupWindow_hideIfNotClicked(e) { + if (this.autoHideEnabled && !this.isClicked(e)) { + this.hidePopup(); + } + } +// Call this to make the DIV disable automatically when mouse is clicked outside it +function PopupWindow_autoHide() { + this.autoHideEnabled = true; + } +// This global function checks all PopupWindow objects onmouseup to see if they should be hidden +function PopupWindow_hidePopupWindows(e) { + for (var i=0; i0) { + this.type="DIV"; + this.divName = arguments[0]; + } + else { + this.type="WINDOW"; + } + this.use_gebi = false; + this.use_css = false; + this.use_layers = false; + if (document.getElementById) { this.use_gebi = true; } + else if (document.all) { this.use_css = true; } + else if (document.layers) { this.use_layers = true; } + else { this.type = "WINDOW"; } + this.offsetX = 0; + this.offsetY = 0; + // Method mappings + this.getXYPosition = PopupWindow_getXYPosition; + this.populate = PopupWindow_populate; + this.setUrl = PopupWindow_setUrl; + this.setWindowProperties = PopupWindow_setWindowProperties; + this.refresh = PopupWindow_refresh; + this.showPopup = PopupWindow_showPopup; + this.hidePopup = PopupWindow_hidePopup; + this.setSize = PopupWindow_setSize; + this.isClicked = PopupWindow_isClicked; + this.autoHide = PopupWindow_autoHide; + this.hideIfNotClicked = PopupWindow_hideIfNotClicked; + } + +/* SOURCE FILE: ColorPicker2.js */ + +/* +Last modified: 02/24/2003 + +DESCRIPTION: This widget is used to select a color, in hexadecimal #RRGGBB +form. It uses a color "swatch" to display the standard 216-color web-safe +palette. The user can then click on a color to select it. + +COMPATABILITY: See notes in AnchorPosition.js and PopupWindow.js. +Only the latest DHTML-capable browsers will show the color and hex values +at the bottom as your mouse goes over them. + +USAGE: +// Create a new ColorPicker object using DHTML popup +var cp = new ColorPicker(); + +// Create a new ColorPicker object using Window Popup +var cp = new ColorPicker('window'); + +// Add a link in your page to trigger the popup. For example: +Pick + +// Or use the built-in "select" function to do the dirty work for you: +Pick + +// If using DHTML popup, write out the required DIV tag near the bottom +// of your page. + + +// Write the 'pickColor' function that will be called when the user clicks +// a color and do something with the value. This is only required if you +// want to do something other than simply populate a form field, which is +// what the 'select' function will give you. +function pickColor(color) { + field.value = color; + } + +NOTES: +1) Requires the functions in AnchorPosition.js and PopupWindow.js + +2) Your anchor tag MUST contain both NAME and ID attributes which are the + same. For example: + + +3) There must be at least a space between for IE5.5 to see the + anchor tag correctly. Do not do with no space. + +4) When a ColorPicker object is created, a handler for 'onmouseup' is + attached to any event handler you may have already defined. Do NOT define + an event handler for 'onmouseup' after you define a ColorPicker object or + the color picker will not hide itself correctly. +*/ +ColorPicker_targetInput = null; +function ColorPicker_writeDiv() { + document.writeln(""); + } + +function ColorPicker_show(anchorname) { + this.showPopup(anchorname); + } + +function ColorPicker_pickColor(color,obj) { + obj.hidePopup(); + pickColor(color); + } + +// A Default "pickColor" function to accept the color passed back from popup. +// User can over-ride this with their own function. +function pickColor(color) { + if (ColorPicker_targetInput==null) { + alert("Target Input is null, which means you either didn't use the 'select' function or you have no defined your own 'pickColor' function to handle the picked color!"); + return; + } + ColorPicker_targetInput.value = color; + } + +// This function is the easiest way to popup the window, select a color, and +// have the value populate a form field, which is what most people want to do. +function ColorPicker_select(inputobj,linkname) { + if (inputobj.type!="text" && inputobj.type!="hidden" && inputobj.type!="textarea") { + alert("colorpicker.select: Input object passed is not a valid form input object"); + window.ColorPicker_targetInput=null; + return; + } + window.ColorPicker_targetInput = inputobj; + this.show(linkname); + } + +// This function runs when you move your mouse over a color block, if you have a newer browser +function ColorPicker_highlightColor(c) { + var thedoc = (arguments.length>1)?arguments[1]:window.document; + var d = thedoc.getElementById("colorPickerSelectedColor"); + d.style.backgroundColor = c; + d = thedoc.getElementById("colorPickerSelectedColorValue"); + d.innerHTML = c; + } + +function ColorPicker() { + var windowMode = false; + // Create a new PopupWindow object + if (arguments.length==0) { + var divname = "colorPickerDiv"; + } + else if (arguments[0] == "window") { + var divname = ''; + windowMode = true; + } + else { + var divname = arguments[0]; + } + + if (divname != "") { + var cp = new PopupWindow(divname); + } + else { + var cp = new PopupWindow(); + cp.setSize(225,250); + } + + // Object variables + cp.currentValue = "#FFFFFF"; + + // Method Mappings + cp.writeDiv = ColorPicker_writeDiv; + cp.highlightColor = ColorPicker_highlightColor; + cp.show = ColorPicker_show; + cp.select = ColorPicker_select; + + // Code to populate color picker window + var colors = new Array( "#4180B6","#69AEE7","#000000","#000033","#000066","#000099","#0000CC","#0000FF","#330000","#330033","#330066","#330099", + "#3300CC","#3300FF","#660000","#660033","#660066","#660099","#6600CC","#6600FF","#990000","#990033","#990066","#990099", + "#9900CC","#9900FF","#CC0000","#CC0033","#CC0066","#CC0099","#CC00CC","#CC00FF","#FF0000","#FF0033","#FF0066","#FF0099", + "#FF00CC","#FF00FF","#7FFFFF","#7FFFFF","#7FF7F7","#7FEFEF","#7FE7E7","#7FDFDF","#7FD7D7","#7FCFCF","#7FC7C7","#7FBFBF", + "#7FB7B7","#7FAFAF","#7FA7A7","#7F9F9F","#7F9797","#7F8F8F","#7F8787","#7F7F7F","#7F7777","#7F6F6F","#7F6767","#7F5F5F", + "#7F5757","#7F4F4F","#7F4747","#7F3F3F","#7F3737","#7F2F2F","#7F2727","#7F1F1F","#7F1717","#7F0F0F","#7F0707","#7F0000", + + "#4180B6","#69AEE7","#003300","#003333","#003366","#003399","#0033CC","#0033FF","#333300","#333333","#333366","#333399", + "#3333CC","#3333FF","#663300","#663333","#663366","#663399","#6633CC","#6633FF","#993300","#993333","#993366","#993399", + "#9933CC","#9933FF","#CC3300","#CC3333","#CC3366","#CC3399","#CC33CC","#CC33FF","#FF3300","#FF3333","#FF3366","#FF3399", + "#FF33CC","#FF33FF","#FF7FFF","#FF7FFF","#F77FF7","#EF7FEF","#E77FE7","#DF7FDF","#D77FD7","#CF7FCF","#C77FC7","#BF7FBF", + "#B77FB7","#AF7FAF","#A77FA7","#9F7F9F","#977F97","#8F7F8F","#877F87","#7F7F7F","#777F77","#6F7F6F","#677F67","#5F7F5F", + "#577F57","#4F7F4F","#477F47","#3F7F3F","#377F37","#2F7F2F","#277F27","#1F7F1F","#177F17","#0F7F0F","#077F07","#007F00", + + "#4180B6","#69AEE7","#006600","#006633","#006666","#006699","#0066CC","#0066FF","#336600","#336633","#336666","#336699", + "#3366CC","#3366FF","#666600","#666633","#666666","#666699","#6666CC","#6666FF","#996600","#996633","#996666","#996699", + "#9966CC","#9966FF","#CC6600","#CC6633","#CC6666","#CC6699","#CC66CC","#CC66FF","#FF6600","#FF6633","#FF6666","#FF6699", + "#FF66CC","#FF66FF","#FFFF7F","#FFFF7F","#F7F77F","#EFEF7F","#E7E77F","#DFDF7F","#D7D77F","#CFCF7F","#C7C77F","#BFBF7F", + "#B7B77F","#AFAF7F","#A7A77F","#9F9F7F","#97977F","#8F8F7F","#87877F","#7F7F7F","#77777F","#6F6F7F","#67677F","#5F5F7F", + "#57577F","#4F4F7F","#47477F","#3F3F7F","#37377F","#2F2F7F","#27277F","#1F1F7F","#17177F","#0F0F7F","#07077F","#00007F", + + "#4180B6","#69AEE7","#009900","#009933","#009966","#009999","#0099CC","#0099FF","#339900","#339933","#339966","#339999", + "#3399CC","#3399FF","#669900","#669933","#669966","#669999","#6699CC","#6699FF","#999900","#999933","#999966","#999999", + "#9999CC","#9999FF","#CC9900","#CC9933","#CC9966","#CC9999","#CC99CC","#CC99FF","#FF9900","#FF9933","#FF9966","#FF9999", + "#FF99CC","#FF99FF","#3FFFFF","#3FFFFF","#3FF7F7","#3FEFEF","#3FE7E7","#3FDFDF","#3FD7D7","#3FCFCF","#3FC7C7","#3FBFBF", + "#3FB7B7","#3FAFAF","#3FA7A7","#3F9F9F","#3F9797","#3F8F8F","#3F8787","#3F7F7F","#3F7777","#3F6F6F","#3F6767","#3F5F5F", + "#3F5757","#3F4F4F","#3F4747","#3F3F3F","#3F3737","#3F2F2F","#3F2727","#3F1F1F","#3F1717","#3F0F0F","#3F0707","#3F0000", + + "#4180B6","#69AEE7","#00CC00","#00CC33","#00CC66","#00CC99","#00CCCC","#00CCFF","#33CC00","#33CC33","#33CC66","#33CC99", + "#33CCCC","#33CCFF","#66CC00","#66CC33","#66CC66","#66CC99","#66CCCC","#66CCFF","#99CC00","#99CC33","#99CC66","#99CC99", + "#99CCCC","#99CCFF","#CCCC00","#CCCC33","#CCCC66","#CCCC99","#CCCCCC","#CCCCFF","#FFCC00","#FFCC33","#FFCC66","#FFCC99", + "#FFCCCC","#FFCCFF","#FF3FFF","#FF3FFF","#F73FF7","#EF3FEF","#E73FE7","#DF3FDF","#D73FD7","#CF3FCF","#C73FC7","#BF3FBF", + "#B73FB7","#AF3FAF","#A73FA7","#9F3F9F","#973F97","#8F3F8F","#873F87","#7F3F7F","#773F77","#6F3F6F","#673F67","#5F3F5F", + "#573F57","#4F3F4F","#473F47","#3F3F3F","#373F37","#2F3F2F","#273F27","#1F3F1F","#173F17","#0F3F0F","#073F07","#003F00", + + "#4180B6","#69AEE7","#00FF00","#00FF33","#00FF66","#00FF99","#00FFCC","#00FFFF","#33FF00","#33FF33","#33FF66","#33FF99", + "#33FFCC","#33FFFF","#66FF00","#66FF33","#66FF66","#66FF99","#66FFCC","#66FFFF","#99FF00","#99FF33","#99FF66","#99FF99", + "#99FFCC","#99FFFF","#CCFF00","#CCFF33","#CCFF66","#CCFF99","#CCFFCC","#CCFFFF","#FFFF00","#FFFF33","#FFFF66","#FFFF99", + "#FFFFCC","#FFFFFF","#FFFF3F","#FFFF3F","#F7F73F","#EFEF3F","#E7E73F","#DFDF3F","#D7D73F","#CFCF3F","#C7C73F","#BFBF3F", + "#B7B73F","#AFAF3F","#A7A73F","#9F9F3F","#97973F","#8F8F3F","#87873F","#7F7F3F","#77773F","#6F6F3F","#67673F","#5F5F3F", + "#57573F","#4F4F3F","#47473F","#3F3F3F","#37373F","#2F2F3F","#27273F","#1F1F3F","#17173F","#0F0F3F","#07073F","#00003F", + + "#4180B6","#69AEE7","#FFFFFF","#FFEEEE","#FFDDDD","#FFCCCC","#FFBBBB","#FFAAAA","#FF9999","#FF8888","#FF7777","#FF6666", + "#FF5555","#FF4444","#FF3333","#FF2222","#FF1111","#FF0000","#FF0000","#FF0000","#FF0000","#EE0000","#DD0000","#CC0000", + "#BB0000","#AA0000","#990000","#880000","#770000","#660000","#550000","#440000","#330000","#220000","#110000","#000000", + "#000000","#000000","#000000","#001111","#002222","#003333","#004444","#005555","#006666","#007777","#008888","#009999", + "#00AAAA","#00BBBB","#00CCCC","#00DDDD","#00EEEE","#00FFFF","#00FFFF","#00FFFF","#00FFFF","#11FFFF","#22FFFF","#33FFFF", + "#44FFFF","#55FFFF","#66FFFF","#77FFFF","#88FFFF","#99FFFF","#AAFFFF","#BBFFFF","#CCFFFF","#DDFFFF","#EEFFFF","#FFFFFF", + + "#4180B6","#69AEE7","#FFFFFF","#EEFFEE","#DDFFDD","#CCFFCC","#BBFFBB","#AAFFAA","#99FF99","#88FF88","#77FF77","#66FF66", + "#55FF55","#44FF44","#33FF33","#22FF22","#11FF11","#00FF00","#00FF00","#00FF00","#00FF00","#00EE00","#00DD00","#00CC00", + "#00BB00","#00AA00","#009900","#008800","#007700","#006600","#005500","#004400","#003300","#002200","#001100","#000000", + "#000000","#000000","#000000","#110011","#220022","#330033","#440044","#550055","#660066","#770077","#880088","#990099", + "#AA00AA","#BB00BB","#CC00CC","#DD00DD","#EE00EE","#FF00FF","#FF00FF","#FF00FF","#FF00FF","#FF11FF","#FF22FF","#FF33FF", + "#FF44FF","#FF55FF","#FF66FF","#FF77FF","#FF88FF","#FF99FF","#FFAAFF","#FFBBFF","#FFCCFF","#FFDDFF","#FFEEFF","#FFFFFF", + + "#4180B6","#69AEE7","#FFFFFF","#EEEEFF","#DDDDFF","#CCCCFF","#BBBBFF","#AAAAFF","#9999FF","#8888FF","#7777FF","#6666FF", + "#5555FF","#4444FF","#3333FF","#2222FF","#1111FF","#0000FF","#0000FF","#0000FF","#0000FF","#0000EE","#0000DD","#0000CC", + "#0000BB","#0000AA","#000099","#000088","#000077","#000066","#000055","#000044","#000033","#000022","#000011","#000000", + "#000000","#000000","#000000","#111100","#222200","#333300","#444400","#555500","#666600","#777700","#888800","#999900", + "#AAAA00","#BBBB00","#CCCC00","#DDDD00","#EEEE00","#FFFF00","#FFFF00","#FFFF00","#FFFF00","#FFFF11","#FFFF22","#FFFF33", + "#FFFF44","#FFFF55","#FFFF66","#FFFF77","#FFFF88","#FFFF99","#FFFFAA","#FFFFBB","#FFFFCC","#FFFFDD","#FFFFEE","#FFFFFF", + + "#4180B6","#69AEE7","#FFFFFF","#FFFFFF","#FBFBFB","#F7F7F7","#F3F3F3","#EFEFEF","#EBEBEB","#E7E7E7","#E3E3E3","#DFDFDF", + "#DBDBDB","#D7D7D7","#D3D3D3","#CFCFCF","#CBCBCB","#C7C7C7","#C3C3C3","#BFBFBF","#BBBBBB","#B7B7B7","#B3B3B3","#AFAFAF", + "#ABABAB","#A7A7A7","#A3A3A3","#9F9F9F","#9B9B9B","#979797","#939393","#8F8F8F","#8B8B8B","#878787","#838383","#7F7F7F", + "#7B7B7B","#777777","#737373","#6F6F6F","#6B6B6B","#676767","#636363","#5F5F5F","#5B5B5B","#575757","#535353","#4F4F4F", + "#4B4B4B","#474747","#434343","#3F3F3F","#3B3B3B","#373737","#333333","#2F2F2F","#2B2B2B","#272727","#232323","#1F1F1F", + "#1B1B1B","#171717","#131313","#0F0F0F","#0B0B0B","#070707","#030303","#000000","#000000","#000000","#000000","#000000"); + var total = colors.length; + var width = 72; + var cp_contents = ""; + var windowRef = (windowMode)?"window.opener.":""; + if (windowMode) { + cp_contents += "Select Color"; + cp_contents += ""; + } + cp_contents += ""; + var use_highlight = (document.getElementById || document.all)?true:false; + for (var i=0; i '; + if ( ((i+1)>=total) || (((i+1) % width) == 0)) { + cp_contents += ""; + } + } + // If the browser supports dynamically changing TD cells, add the fancy stuff + if (document.getElementById) { + var width1 = Math.floor(width/2); + var width2 = width = width1; + cp_contents += ""; + } + cp_contents += "
     #FFFFFF
    "; + if (windowMode) { + cp_contents += "
    "; + } + // end populate code + + // Write the contents to the popup object + cp.populate(cp_contents+"\n"); + // Move the table down a bit so you can see it + cp.offsetY = 25; + cp.autoHide(); + return cp; + } diff --git a/src/wp-includes/js/colorpicker.js b/src/wp-includes/js/colorpicker.js new file mode 100644 index 0000000..acd88a3 --- /dev/null +++ b/src/wp-includes/js/colorpicker.js @@ -0,0 +1 @@ +function getAnchorPosition(b){var e=false;var k=new Object();var j=0,g=0;var d=false,f=false,h=false;if(document.getElementById){d=true}else{if(document.all){f=true}else{if(document.layers){h=true}}}if(d&&document.all){j=AnchorPosition_getPageOffsetLeft(document.all[b]);g=AnchorPosition_getPageOffsetTop(document.all[b])}else{if(d){var a=document.getElementById(b);j=AnchorPosition_getPageOffsetLeft(a);g=AnchorPosition_getPageOffsetTop(a)}else{if(f){j=AnchorPosition_getPageOffsetLeft(document.all[b]);g=AnchorPosition_getPageOffsetTop(document.all[b])}else{if(h){var l=0;for(var c=0;cscreen.availHeight){this.y=screen.availHeight-this.height}}if(screen&&screen.availWidth){if((this.x+this.width)>screen.availWidth){this.x=screen.availWidth-this.width}}var b=window.opera||(document.layers&&!navigator.mimeTypes["*"])||navigator.vendor=="KDE"||(document.childNodes&&!document.all&&!navigator.taintEnabled);this.popupWindow=window.open(b?"":"about:blank","window_"+a,this.windowProperties+",width="+this.width+",height="+this.height+",screenX="+this.x+",left="+this.x+",screenY="+this.y+",top="+this.y+"")}this.refresh()}}function PopupWindow_hidePopup(){if(this.divName!=null){if(this.use_gebi){document.getElementById(this.divName).style.visibility="hidden"}else{if(this.use_css){document.all[this.divName].style.visibility="hidden"}else{if(this.use_layers){document.layers[this.divName].visibility="hidden"}}}}else{if(this.popupWindow&&!this.popupWindow.closed){this.popupWindow.close();this.popupWindow=null}}}function PopupWindow_isClicked(c){if(this.divName!=null){if(this.use_layers){var d=c.pageX;var b=c.pageY;var a=document.layers[this.divName];if((d>a.left)&&(da.top)&&(b0){this.type="DIV";this.divName=arguments[0]}else{this.type="WINDOW"}this.use_gebi=false;this.use_css=false;this.use_layers=false;if(document.getElementById){this.use_gebi=true}else{if(document.all){this.use_css=true}else{if(document.layers){this.use_layers=true}else{this.type="WINDOW"}}}this.offsetX=0;this.offsetY=0;this.getXYPosition=PopupWindow_getXYPosition;this.populate=PopupWindow_populate;this.setUrl=PopupWindow_setUrl;this.setWindowProperties=PopupWindow_setWindowProperties;this.refresh=PopupWindow_refresh;this.showPopup=PopupWindow_showPopup;this.hidePopup=PopupWindow_hidePopup;this.setSize=PopupWindow_setSize;this.isClicked=PopupWindow_isClicked;this.autoHide=PopupWindow_autoHide;this.hideIfNotClicked=PopupWindow_hideIfNotClicked}ColorPicker_targetInput=null;function ColorPicker_writeDiv(){document.writeln('')}function ColorPicker_show(a){this.showPopup(a)}function ColorPicker_pickColor(a,b){b.hidePopup();pickColor(a)}function pickColor(a){if(ColorPicker_targetInput==null){alert("Target Input is null, which means you either didn't use the 'select' function or you have no defined your own 'pickColor' function to handle the picked color!");return}ColorPicker_targetInput.value=a}function ColorPicker_select(b,a){if(b.type!="text"&&b.type!="hidden"&&b.type!="textarea"){alert("colorpicker.select: Input object passed is not a valid form input object");window.ColorPicker_targetInput=null;return}window.ColorPicker_targetInput=b;this.show(a)}function ColorPicker_highlightColor(e){var a=(arguments.length>1)?arguments[1]:window.document;var b=a.getElementById("colorPickerSelectedColor");b.style.backgroundColor=e;b=a.getElementById("colorPickerSelectedColorValue");b.innerHTML=e}function ColorPicker(){var g=false;if(arguments.length==0){var e="colorPickerDiv"}else{if(arguments[0]=="window"){var e="";g=true}else{var e=arguments[0]}}if(e!=""){var m=new PopupWindow(e)}else{var m=new PopupWindow();m.setSize(225,250)}m.currentValue="#FFFFFF";m.writeDiv=ColorPicker_writeDiv;m.highlightColor=ColorPicker_highlightColor;m.show=ColorPicker_show;m.select=ColorPicker_select;var a=new Array("#4180B6","#69AEE7","#000000","#000033","#000066","#000099","#0000CC","#0000FF","#330000","#330033","#330066","#330099","#3300CC","#3300FF","#660000","#660033","#660066","#660099","#6600CC","#6600FF","#990000","#990033","#990066","#990099","#9900CC","#9900FF","#CC0000","#CC0033","#CC0066","#CC0099","#CC00CC","#CC00FF","#FF0000","#FF0033","#FF0066","#FF0099","#FF00CC","#FF00FF","#7FFFFF","#7FFFFF","#7FF7F7","#7FEFEF","#7FE7E7","#7FDFDF","#7FD7D7","#7FCFCF","#7FC7C7","#7FBFBF","#7FB7B7","#7FAFAF","#7FA7A7","#7F9F9F","#7F9797","#7F8F8F","#7F8787","#7F7F7F","#7F7777","#7F6F6F","#7F6767","#7F5F5F","#7F5757","#7F4F4F","#7F4747","#7F3F3F","#7F3737","#7F2F2F","#7F2727","#7F1F1F","#7F1717","#7F0F0F","#7F0707","#7F0000","#4180B6","#69AEE7","#003300","#003333","#003366","#003399","#0033CC","#0033FF","#333300","#333333","#333366","#333399","#3333CC","#3333FF","#663300","#663333","#663366","#663399","#6633CC","#6633FF","#993300","#993333","#993366","#993399","#9933CC","#9933FF","#CC3300","#CC3333","#CC3366","#CC3399","#CC33CC","#CC33FF","#FF3300","#FF3333","#FF3366","#FF3399","#FF33CC","#FF33FF","#FF7FFF","#FF7FFF","#F77FF7","#EF7FEF","#E77FE7","#DF7FDF","#D77FD7","#CF7FCF","#C77FC7","#BF7FBF","#B77FB7","#AF7FAF","#A77FA7","#9F7F9F","#977F97","#8F7F8F","#877F87","#7F7F7F","#777F77","#6F7F6F","#677F67","#5F7F5F","#577F57","#4F7F4F","#477F47","#3F7F3F","#377F37","#2F7F2F","#277F27","#1F7F1F","#177F17","#0F7F0F","#077F07","#007F00","#4180B6","#69AEE7","#006600","#006633","#006666","#006699","#0066CC","#0066FF","#336600","#336633","#336666","#336699","#3366CC","#3366FF","#666600","#666633","#666666","#666699","#6666CC","#6666FF","#996600","#996633","#996666","#996699","#9966CC","#9966FF","#CC6600","#CC6633","#CC6666","#CC6699","#CC66CC","#CC66FF","#FF6600","#FF6633","#FF6666","#FF6699","#FF66CC","#FF66FF","#FFFF7F","#FFFF7F","#F7F77F","#EFEF7F","#E7E77F","#DFDF7F","#D7D77F","#CFCF7F","#C7C77F","#BFBF7F","#B7B77F","#AFAF7F","#A7A77F","#9F9F7F","#97977F","#8F8F7F","#87877F","#7F7F7F","#77777F","#6F6F7F","#67677F","#5F5F7F","#57577F","#4F4F7F","#47477F","#3F3F7F","#37377F","#2F2F7F","#27277F","#1F1F7F","#17177F","#0F0F7F","#07077F","#00007F","#4180B6","#69AEE7","#009900","#009933","#009966","#009999","#0099CC","#0099FF","#339900","#339933","#339966","#339999","#3399CC","#3399FF","#669900","#669933","#669966","#669999","#6699CC","#6699FF","#999900","#999933","#999966","#999999","#9999CC","#9999FF","#CC9900","#CC9933","#CC9966","#CC9999","#CC99CC","#CC99FF","#FF9900","#FF9933","#FF9966","#FF9999","#FF99CC","#FF99FF","#3FFFFF","#3FFFFF","#3FF7F7","#3FEFEF","#3FE7E7","#3FDFDF","#3FD7D7","#3FCFCF","#3FC7C7","#3FBFBF","#3FB7B7","#3FAFAF","#3FA7A7","#3F9F9F","#3F9797","#3F8F8F","#3F8787","#3F7F7F","#3F7777","#3F6F6F","#3F6767","#3F5F5F","#3F5757","#3F4F4F","#3F4747","#3F3F3F","#3F3737","#3F2F2F","#3F2727","#3F1F1F","#3F1717","#3F0F0F","#3F0707","#3F0000","#4180B6","#69AEE7","#00CC00","#00CC33","#00CC66","#00CC99","#00CCCC","#00CCFF","#33CC00","#33CC33","#33CC66","#33CC99","#33CCCC","#33CCFF","#66CC00","#66CC33","#66CC66","#66CC99","#66CCCC","#66CCFF","#99CC00","#99CC33","#99CC66","#99CC99","#99CCCC","#99CCFF","#CCCC00","#CCCC33","#CCCC66","#CCCC99","#CCCCCC","#CCCCFF","#FFCC00","#FFCC33","#FFCC66","#FFCC99","#FFCCCC","#FFCCFF","#FF3FFF","#FF3FFF","#F73FF7","#EF3FEF","#E73FE7","#DF3FDF","#D73FD7","#CF3FCF","#C73FC7","#BF3FBF","#B73FB7","#AF3FAF","#A73FA7","#9F3F9F","#973F97","#8F3F8F","#873F87","#7F3F7F","#773F77","#6F3F6F","#673F67","#5F3F5F","#573F57","#4F3F4F","#473F47","#3F3F3F","#373F37","#2F3F2F","#273F27","#1F3F1F","#173F17","#0F3F0F","#073F07","#003F00","#4180B6","#69AEE7","#00FF00","#00FF33","#00FF66","#00FF99","#00FFCC","#00FFFF","#33FF00","#33FF33","#33FF66","#33FF99","#33FFCC","#33FFFF","#66FF00","#66FF33","#66FF66","#66FF99","#66FFCC","#66FFFF","#99FF00","#99FF33","#99FF66","#99FF99","#99FFCC","#99FFFF","#CCFF00","#CCFF33","#CCFF66","#CCFF99","#CCFFCC","#CCFFFF","#FFFF00","#FFFF33","#FFFF66","#FFFF99","#FFFFCC","#FFFFFF","#FFFF3F","#FFFF3F","#F7F73F","#EFEF3F","#E7E73F","#DFDF3F","#D7D73F","#CFCF3F","#C7C73F","#BFBF3F","#B7B73F","#AFAF3F","#A7A73F","#9F9F3F","#97973F","#8F8F3F","#87873F","#7F7F3F","#77773F","#6F6F3F","#67673F","#5F5F3F","#57573F","#4F4F3F","#47473F","#3F3F3F","#37373F","#2F2F3F","#27273F","#1F1F3F","#17173F","#0F0F3F","#07073F","#00003F","#4180B6","#69AEE7","#FFFFFF","#FFEEEE","#FFDDDD","#FFCCCC","#FFBBBB","#FFAAAA","#FF9999","#FF8888","#FF7777","#FF6666","#FF5555","#FF4444","#FF3333","#FF2222","#FF1111","#FF0000","#FF0000","#FF0000","#FF0000","#EE0000","#DD0000","#CC0000","#BB0000","#AA0000","#990000","#880000","#770000","#660000","#550000","#440000","#330000","#220000","#110000","#000000","#000000","#000000","#000000","#001111","#002222","#003333","#004444","#005555","#006666","#007777","#008888","#009999","#00AAAA","#00BBBB","#00CCCC","#00DDDD","#00EEEE","#00FFFF","#00FFFF","#00FFFF","#00FFFF","#11FFFF","#22FFFF","#33FFFF","#44FFFF","#55FFFF","#66FFFF","#77FFFF","#88FFFF","#99FFFF","#AAFFFF","#BBFFFF","#CCFFFF","#DDFFFF","#EEFFFF","#FFFFFF","#4180B6","#69AEE7","#FFFFFF","#EEFFEE","#DDFFDD","#CCFFCC","#BBFFBB","#AAFFAA","#99FF99","#88FF88","#77FF77","#66FF66","#55FF55","#44FF44","#33FF33","#22FF22","#11FF11","#00FF00","#00FF00","#00FF00","#00FF00","#00EE00","#00DD00","#00CC00","#00BB00","#00AA00","#009900","#008800","#007700","#006600","#005500","#004400","#003300","#002200","#001100","#000000","#000000","#000000","#000000","#110011","#220022","#330033","#440044","#550055","#660066","#770077","#880088","#990099","#AA00AA","#BB00BB","#CC00CC","#DD00DD","#EE00EE","#FF00FF","#FF00FF","#FF00FF","#FF00FF","#FF11FF","#FF22FF","#FF33FF","#FF44FF","#FF55FF","#FF66FF","#FF77FF","#FF88FF","#FF99FF","#FFAAFF","#FFBBFF","#FFCCFF","#FFDDFF","#FFEEFF","#FFFFFF","#4180B6","#69AEE7","#FFFFFF","#EEEEFF","#DDDDFF","#CCCCFF","#BBBBFF","#AAAAFF","#9999FF","#8888FF","#7777FF","#6666FF","#5555FF","#4444FF","#3333FF","#2222FF","#1111FF","#0000FF","#0000FF","#0000FF","#0000FF","#0000EE","#0000DD","#0000CC","#0000BB","#0000AA","#000099","#000088","#000077","#000066","#000055","#000044","#000033","#000022","#000011","#000000","#000000","#000000","#000000","#111100","#222200","#333300","#444400","#555500","#666600","#777700","#888800","#999900","#AAAA00","#BBBB00","#CCCC00","#DDDD00","#EEEE00","#FFFF00","#FFFF00","#FFFF00","#FFFF00","#FFFF11","#FFFF22","#FFFF33","#FFFF44","#FFFF55","#FFFF66","#FFFF77","#FFFF88","#FFFF99","#FFFFAA","#FFFFBB","#FFFFCC","#FFFFDD","#FFFFEE","#FFFFFF","#4180B6","#69AEE7","#FFFFFF","#FFFFFF","#FBFBFB","#F7F7F7","#F3F3F3","#EFEFEF","#EBEBEB","#E7E7E7","#E3E3E3","#DFDFDF","#DBDBDB","#D7D7D7","#D3D3D3","#CFCFCF","#CBCBCB","#C7C7C7","#C3C3C3","#BFBFBF","#BBBBBB","#B7B7B7","#B3B3B3","#AFAFAF","#ABABAB","#A7A7A7","#A3A3A3","#9F9F9F","#9B9B9B","#979797","#939393","#8F8F8F","#8B8B8B","#878787","#838383","#7F7F7F","#7B7B7B","#777777","#737373","#6F6F6F","#6B6B6B","#676767","#636363","#5F5F5F","#5B5B5B","#575757","#535353","#4F4F4F","#4B4B4B","#474747","#434343","#3F3F3F","#3B3B3B","#373737","#333333","#2F2F2F","#2B2B2B","#272727","#232323","#1F1F1F","#1B1B1B","#171717","#131313","#0F0F0F","#0B0B0B","#070707","#030303","#000000","#000000","#000000","#000000","#000000");var n=a.length;var c=72;var k="";var j=(g)?"window.opener.":"";if(g){k+="Select Color";k+=""}k+="";var l=(document.getElementById||document.all)?true:false;for(var h=0;h"}if(l){var f='onMouseOver="'+j+"ColorPicker_highlightColor('"+a[h]+"',window.document)\""}else{f=""}k+='";if(((h+1)>=n)||(((h+1)%c)==0)){k+=""}}if(document.getElementById){var d=Math.floor(c/2);var b=c=d;k+=""}k+="
     
     #FFFFFF
    ";if(g){k+="
    "}m.populate(k+"\n");m.offsetY=25;m.autoHide();return m}; \ No newline at end of file diff --git a/src/wp-includes/js/comment-reply.dev.js b/src/wp-includes/js/comment-reply.dev.js new file mode 100644 index 0000000..2015425 --- /dev/null +++ b/src/wp-includes/js/comment-reply.dev.js @@ -0,0 +1,48 @@ + +addComment = { + moveForm : function(commId, parentId, respondId, postId) { + var t = this, div, comm = t.I(commId), respond = t.I(respondId), cancel = t.I('cancel-comment-reply-link'), parent = t.I('comment_parent'), post = t.I('comment_post_ID'); + + if ( ! comm || ! respond || ! cancel || ! parent ) + return; + + t.respondId = respondId; + postId = postId || false; + + if ( ! t.I('wp-temp-form-div') ) { + div = document.createElement('div'); + div.id = 'wp-temp-form-div'; + div.style.display = 'none'; + respond.parentNode.insertBefore(div, respond); + } + + comm.parentNode.insertBefore(respond, comm.nextSibling); + if ( post && postId ) + post.value = postId; + parent.value = parentId; + cancel.style.display = ''; + + cancel.onclick = function() { + var t = addComment, temp = t.I('wp-temp-form-div'), respond = t.I(t.respondId); + + if ( ! temp || ! respond ) + return; + + t.I('comment_parent').value = '0'; + temp.parentNode.insertBefore(respond, temp); + temp.parentNode.removeChild(temp); + this.style.display = 'none'; + this.onclick = null; + return false; + } + + try { t.I('comment').focus(); } + catch(e) {} + + return false; + }, + + I : function(e) { + return document.getElementById(e); + } +} diff --git a/src/wp-includes/js/comment-reply.js b/src/wp-includes/js/comment-reply.js new file mode 100644 index 0000000..524f2ed --- /dev/null +++ b/src/wp-includes/js/comment-reply.js @@ -0,0 +1 @@ +addComment={moveForm:function(d,f,i,c){var m=this,a,h=m.I(d),b=m.I(i),l=m.I("cancel-comment-reply-link"),j=m.I("comment_parent"),k=m.I("comment_post_ID");if(!h||!b||!l||!j){return}m.respondId=i;c=c||false;if(!m.I("wp-temp-form-div")){a=document.createElement("div");a.id="wp-temp-form-div";a.style.display="none";b.parentNode.insertBefore(a,b)}h.parentNode.insertBefore(b,h.nextSibling);if(k&&c){k.value=c}j.value=f;l.style.display="";l.onclick=function(){var n=addComment,e=n.I("wp-temp-form-div"),o=n.I(n.respondId);if(!e||!o){return}n.I("comment_parent").value="0";e.parentNode.insertBefore(o,e);e.parentNode.removeChild(e);this.style.display="none";this.onclick=null;return false};try{m.I("comment").focus()}catch(g){}return false},I:function(a){return document.getElementById(a)}}; \ No newline at end of file diff --git a/src/wp-includes/js/crop/cropper.css b/src/wp-includes/js/crop/cropper.css new file mode 100644 index 0000000..973f178 --- /dev/null +++ b/src/wp-includes/js/crop/cropper.css @@ -0,0 +1,165 @@ +.imgCrop_wrap { + /* width: 500px; @done_in_js */ + /* height: 375px; @done_in_js */ + position: relative; + cursor: crosshair; +} + +/* an extra classname is applied for Opera < 9.0 to fix it's lack of opacity support */ +.imgCrop_wrap.opera8 .imgCrop_overlay, +.imgCrop_wrap.opera8 .imgCrop_clickArea { + background-color: transparent; +} + +/* fix for IE displaying all boxes at line-height by default, although they are still 1 pixel high until we combine them with the pointless span */ +.imgCrop_wrap, +.imgCrop_wrap * { + font-size: 0; +} + +.imgCrop_overlay { + background-color: #000; + opacity: 0.5; + filter:alpha(opacity=50); + position: absolute; + width: 100%; + height: 100%; +} + +.imgCrop_selArea { + position: absolute; + /* @done_in_js + top: 20px; + left: 20px; + width: 200px; + height: 200px; + background: transparent url(castle.jpg) no-repeat -210px -110px; + */ + cursor: move; + z-index: 2; +} + +/* clickArea is all a fix for IE 5.5 & 6 to allow the user to click on the given area */ +.imgCrop_clickArea { + width: 100%; + height: 100%; + background-color: #FFF; + opacity: 0.01; + filter:alpha(opacity=01); +} + +.imgCrop_marqueeHoriz { + position: absolute; + width: 100%; + height: 1px; + background: transparent url(marqueeHoriz.gif) repeat-x 0 0; + z-index: 3; +} + +.imgCrop_marqueeVert { + position: absolute; + height: 100%; + width: 1px; + background: transparent url(marqueeVert.gif) repeat-y 0 0; + z-index: 3; +} + +.imgCrop_marqueeNorth { top: 0; left: 0; } +.imgCrop_marqueeEast { top: 0; right: 0; } +.imgCrop_marqueeSouth { bottom: 0px; left: 0; } +.imgCrop_marqueeWest { top: 0; left: 0; } + + +.imgCrop_handle { + position: absolute; + border: 1px solid #333; + width: 6px; + height: 6px; + background: #FFF; + opacity: 0.5; + filter:alpha(opacity=50); + z-index: 4; +} + +/* fix IE 5 box model */ +* html .imgCrop_handle { + width: 8px; + height: 8px; + wid\th: 6px; + hei\ght: 6px; +} + +.imgCrop_handleN { + top: -3px; + left: 0; + /* margin-left: 49%; @done_in_js */ + cursor: n-resize; +} + +.imgCrop_handleNE { + top: -3px; + right: -3px; + cursor: ne-resize; +} + +.imgCrop_handleE { + top: 0; + right: -3px; + /* margin-top: 49%; @done_in_js */ + cursor: e-resize; +} + +.imgCrop_handleSE { + right: -3px; + bottom: -3px; + cursor: se-resize; +} + +.imgCrop_handleS { + right: 0; + bottom: -3px; + /* margin-right: 49%; @done_in_js */ + cursor: s-resize; +} + +.imgCrop_handleSW { + left: -3px; + bottom: -3px; + cursor: sw-resize; +} + +.imgCrop_handleW { + top: 0; + left: -3px; + /* margin-top: 49%; @done_in_js */ + cursor: e-resize; +} + +.imgCrop_handleNW { + top: -3px; + left: -3px; + cursor: nw-resize; +} + +/** + * Create an area to click & drag around on as the default browser behaviour is to let you drag the image + */ +.imgCrop_dragArea { + width: 100%; + height: 100%; + z-index: 200; + position: absolute; + top: 0; + left: 0; +} + +.imgCrop_previewWrap { + /* width: 200px; @done_in_js */ + /* height: 200px; @done_in_js */ + overflow: hidden; + position: relative; +} + +.imgCrop_previewWrap img { + position: absolute; +} \ No newline at end of file diff --git a/src/wp-includes/js/crop/cropper.js b/src/wp-includes/js/crop/cropper.js new file mode 100644 index 0000000..d0cb8e4 --- /dev/null +++ b/src/wp-includes/js/crop/cropper.js @@ -0,0 +1,516 @@ +/** + * Copyright (c) 2006, David Spurr (http://www.defusion.org.uk/) + * 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 David Spurr nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * http://www.opensource.org/licenses/bsd-license.php + * + * See scriptaculous.js for full scriptaculous licence + */ + +var CropDraggable=Class.create(); +Object.extend(Object.extend(CropDraggable.prototype,Draggable.prototype),{initialize:function(_1){ +this.options=Object.extend({drawMethod:function(){ +}},arguments[1]||{}); +this.element=$(_1); +this.handle=this.element; +this.delta=this.currentDelta(); +this.dragging=false; +this.eventMouseDown=this.initDrag.bindAsEventListener(this); +Event.observe(this.handle,"mousedown",this.eventMouseDown); +Draggables.register(this); +},draw:function(_2){ +var _3=Position.cumulativeOffset(this.element); +var d=this.currentDelta(); +_3[0]-=d[0]; +_3[1]-=d[1]; +var p=[0,1].map(function(i){ +return (_2[i]-_3[i]-this.offset[i]); +}.bind(this)); +this.options.drawMethod(p); +}}); +var Cropper={}; +Cropper.Img=Class.create(); +Cropper.Img.prototype={initialize:function(_7,_8){ +this.options=Object.extend({ratioDim:{x:0,y:0},minWidth:0,minHeight:0,displayOnInit:false,onEndCrop:Prototype.emptyFunction,captureKeys:true},_8||{}); +if(this.options.minWidth>0&&this.options.minHeight>0){ +this.options.ratioDim.x=this.options.minWidth; +this.options.ratioDim.y=this.options.minHeight; +} +this.img=$(_7); +this.clickCoords={x:0,y:0}; +this.dragging=false; +this.resizing=false; +this.isWebKit=/Konqueror|Safari|KHTML/.test(navigator.userAgent); +this.isIE=/MSIE/.test(navigator.userAgent); +this.isOpera8=/Opera\s[1-8]/.test(navigator.userAgent); +this.ratioX=0; +this.ratioY=0; +this.attached=false; +$A(document.getElementsByTagName("script")).each(function(s){ +if(s.src.match(/cropper\.js/)){ +var _a=s.src.replace(/cropper\.js(.*)?/,""); +var _b=document.createElement("link"); +_b.rel="stylesheet"; +_b.type="text/css"; +_b.href=_a+"cropper.css"; +_b.media="screen"; +document.getElementsByTagName("head")[0].appendChild(_b); +} +}); +if(this.options.ratioDim.x>0&&this.options.ratioDim.y>0){ +var _c=this.getGCD(this.options.ratioDim.x,this.options.ratioDim.y); +this.ratioX=this.options.ratioDim.x/_c; +this.ratioY=this.options.ratioDim.y/_c; +} +this.subInitialize(); +if(this.img.complete||this.isWebKit){ +this.onLoad(); +}else{ +Event.observe(this.img,"load",this.onLoad.bindAsEventListener(this)); +} +},getGCD:function(a,b){return 1; +if(b==0){ +return a; +} +return this.getGCD(b,a%b); +},onLoad:function(){ +var _f="imgCrop_"; +var _10=this.img.parentNode; +var _11=""; +if(this.isOpera8){ +_11=" opera8"; +} +this.imgWrap=Builder.node("div",{"class":_f+"wrap"+_11}); +if(this.isIE){ +this.north=Builder.node("div",{"class":_f+"overlay "+_f+"north"},[Builder.node("span")]); +this.east=Builder.node("div",{"class":_f+"overlay "+_f+"east"},[Builder.node("span")]); +this.south=Builder.node("div",{"class":_f+"overlay "+_f+"south"},[Builder.node("span")]); +this.west=Builder.node("div",{"class":_f+"overlay "+_f+"west"},[Builder.node("span")]); +var _12=[this.north,this.east,this.south,this.west]; +}else{ +this.overlay=Builder.node("div",{"class":_f+"overlay"}); +var _12=[this.overlay]; +} +this.dragArea=Builder.node("div",{"class":_f+"dragArea"},_12); +this.handleN=Builder.node("div",{"class":_f+"handle "+_f+"handleN"}); +this.handleNE=Builder.node("div",{"class":_f+"handle "+_f+"handleNE"}); +this.handleE=Builder.node("div",{"class":_f+"handle "+_f+"handleE"}); +this.handleSE=Builder.node("div",{"class":_f+"handle "+_f+"handleSE"}); +this.handleS=Builder.node("div",{"class":_f+"handle "+_f+"handleS"}); +this.handleSW=Builder.node("div",{"class":_f+"handle "+_f+"handleSW"}); +this.handleW=Builder.node("div",{"class":_f+"handle "+_f+"handleW"}); +this.handleNW=Builder.node("div",{"class":_f+"handle "+_f+"handleNW"}); +this.selArea=Builder.node("div",{"class":_f+"selArea"},[Builder.node("div",{"class":_f+"marqueeHoriz "+_f+"marqueeNorth"},[Builder.node("span")]),Builder.node("div",{"class":_f+"marqueeVert "+_f+"marqueeEast"},[Builder.node("span")]),Builder.node("div",{"class":_f+"marqueeHoriz "+_f+"marqueeSouth"},[Builder.node("span")]),Builder.node("div",{"class":_f+"marqueeVert "+_f+"marqueeWest"},[Builder.node("span")]),this.handleN,this.handleNE,this.handleE,this.handleSE,this.handleS,this.handleSW,this.handleW,this.handleNW,Builder.node("div",{"class":_f+"clickArea"})]); +Element.setStyle($(this.selArea),{backgroundColor:"transparent",backgroundRepeat:"no-repeat",backgroundPosition:"0 0"}); +this.imgWrap.appendChild(this.img); +this.imgWrap.appendChild(this.dragArea); +this.dragArea.appendChild(this.selArea); +this.dragArea.appendChild(Builder.node("div",{"class":_f+"clickArea"})); +_10.appendChild(this.imgWrap); +Event.observe(this.dragArea,"mousedown",this.startDrag.bindAsEventListener(this)); +Event.observe(document,"mousemove",this.onDrag.bindAsEventListener(this)); +Event.observe(document,"mouseup",this.endCrop.bindAsEventListener(this)); +var _13=[this.handleN,this.handleNE,this.handleE,this.handleSE,this.handleS,this.handleSW,this.handleW,this.handleNW]; +for(var i=0;i<_13.length;i++){ +Event.observe(_13[i],"mousedown",this.startResize.bindAsEventListener(this)); +} +if(this.options.captureKeys){ +Event.observe(document,"keydown",this.handleKeys.bindAsEventListener(this)); +} +new CropDraggable(this.selArea,{drawMethod:this.moveArea.bindAsEventListener(this)}); +this.setParams(); +},setParams:function(){ +this.imgW=this.img.width; +this.imgH=this.img.height; +if(!this.isIE){ +Element.setStyle($(this.overlay),{width:this.imgW+"px",height:this.imgH+"px"}); +Element.hide($(this.overlay)); +Element.setStyle($(this.selArea),{backgroundImage:"url("+this.img.src+")"}); +}else{ +Element.setStyle($(this.north),{height:0}); +Element.setStyle($(this.east),{width:0,height:0}); +Element.setStyle($(this.south),{height:0}); +Element.setStyle($(this.west),{width:0,height:0}); +} +Element.setStyle($(this.imgWrap),{"width":this.imgW+"px","height":this.imgH+"px"}); +Element.hide($(this.selArea)); +var _15=Position.positionedOffset(this.imgWrap); +this.wrapOffsets={"top":_15[1],"left":_15[0]}; +var _16={x1:0,y1:0,x2:0,y2:0}; +this.setAreaCoords(_16); +if(this.options.ratioDim.x>0&&this.options.ratioDim.y>0&&this.options.displayOnInit){ +_16.x1=Math.ceil((this.imgW-this.options.ratioDim.x)/2); +_16.y1=Math.ceil((this.imgH-this.options.ratioDim.y)/2); +_16.x2=_16.x1+this.options.ratioDim.x; +_16.y2=_16.y1+this.options.ratioDim.y; +Element.show(this.selArea); +this.drawArea(); +this.endCrop(); +} +this.attached=true; +},remove:function(){ +this.attached=false; +this.imgWrap.parentNode.insertBefore(this.img,this.imgWrap); +this.imgWrap.parentNode.removeChild(this.imgWrap); +Event.stopObserving(this.dragArea,"mousedown",this.startDrag.bindAsEventListener(this)); +Event.stopObserving(document,"mousemove",this.onDrag.bindAsEventListener(this)); +Event.stopObserving(document,"mouseup",this.endCrop.bindAsEventListener(this)); +var _17=[this.handleN,this.handleNE,this.handleE,this.handleSE,this.handleS,this.handleSW,this.handleW,this.handleNW]; +for(var i=0;i<_17.length;i++){ +Event.stopObserving(_17[i],"mousedown",this.startResize.bindAsEventListener(this)); +} +if(this.options.captureKeys){ +Event.stopObserving(document,"keydown",this.handleKeys.bindAsEventListener(this)); +} +},reset:function(){ +if(!this.attached){ +this.onLoad(); +}else{ +this.setParams(); +} +this.endCrop(); +},handleKeys:function(e){ +var dir={x:0,y:0}; +if(!this.dragging){ +switch(e.keyCode){ +case (37): +dir.x=-1; +break; +case (38): +dir.y=-1; +break; +case (39): +dir.x=1; +break; +case (40): +dir.y=1; +break; +} +if(dir.x!=0||dir.y!=0){ +if(e.shiftKey){ +dir.x*=10; +dir.y*=10; +} +this.moveArea([this.areaCoords.x1+dir.x,this.areaCoords.y1+dir.y]); +Event.stop(e); +} +} +},calcW:function(){ +return (this.areaCoords.x2-this.areaCoords.x1); +},calcH:function(){ +return (this.areaCoords.y2-this.areaCoords.y1); +},moveArea:function(_1b){ +this.setAreaCoords({x1:_1b[0],y1:_1b[1],x2:_1b[0]+this.calcW(),y2:_1b[1]+this.calcH()},true); +this.drawArea(); +},cloneCoords:function(_1c){ +return {x1:_1c.x1,y1:_1c.y1,x2:_1c.x2,y2:_1c.y2}; +},setAreaCoords:function(_1d,_1e,_1f,_20,_21){ +var _22=typeof _1e!="undefined"?_1e:false; +var _23=typeof _1f!="undefined"?_1f:false; +if(_1e){ +var _24=_1d.x2-_1d.x1; +var _25=_1d.y2-_1d.y1; +if(_1d.x1<0){ +_1d.x1=0; +_1d.x2=_24; +} +if(_1d.y1<0){ +_1d.y1=0; +_1d.y2=_25; +} +if(_1d.x2>this.imgW){ +_1d.x2=this.imgW; +_1d.x1=this.imgW-_24; +} +if(_1d.y2>this.imgH){ +_1d.y2=this.imgH; +_1d.y1=this.imgH-_25; +} +}else{ +if(_1d.x1<0){ +_1d.x1=0; +} +if(_1d.y1<0){ +_1d.y1=0; +} +if(_1d.x2>this.imgW){ +_1d.x2=this.imgW; +} +if(_1d.y2>this.imgH){ +_1d.y2=this.imgH; +} +if(typeof (_20)!="undefined"){ +if(this.ratioX>0){ +this.applyRatio(_1d,{x:this.ratioX,y:this.ratioY},_20,_21); +}else{ +if(_23){ +this.applyRatio(_1d,{x:1,y:1},_20,_21); +} +} +var _26={a1:_1d.x1,a2:_1d.x2}; +var _27={a1:_1d.y1,a2:_1d.y2}; +var _28=this.options.minWidth; +var _29=this.options.minHeight; +if((_28==0||_29==0)&&_23){ +if(_28>0){ +_29=_28; +}else{ +if(_29>0){ +_28=_29; +} +} +} +this.applyMinDimension(_26,_28,_20.x,{min:0,max:this.imgW}); +this.applyMinDimension(_27,_29,_20.y,{min:0,max:this.imgH}); +_1d={x1:_26.a1,y1:_27.a1,x2:_26.a2,y2:_27.a2}; +} +} +this.areaCoords=_1d; +},applyMinDimension:function(_2a,_2b,_2c,_2d){ +if((_2a.a2-_2a.a1)<_2b){ +if(_2c==1){ +_2a.a2=_2a.a1+_2b; +}else{ +_2a.a1=_2a.a2-_2b; +} +if(_2a.a1<_2d.min){ +_2a.a1=_2d.min; +_2a.a2=_2b; +}else{ +if(_2a.a2>_2d.max){ +_2a.a1=_2d.max-_2b; +_2a.a2=_2d.max; +} +} +} +},applyRatio:function(_2e,_2f,_30,_31){ +var _32; +if(_31=="N"||_31=="S"){ +_32=this.applyRatioToAxis({a1:_2e.y1,b1:_2e.x1,a2:_2e.y2,b2:_2e.x2},{a:_2f.y,b:_2f.x},{a:_30.y,b:_30.x},{min:0,max:this.imgW}); +_2e.x1=_32.b1; +_2e.y1=_32.a1; +_2e.x2=_32.b2; +_2e.y2=_32.a2; +}else{ +_32=this.applyRatioToAxis({a1:_2e.x1,b1:_2e.y1,a2:_2e.x2,b2:_2e.y2},{a:_2f.x,b:_2f.y},{a:_30.x,b:_30.y},{min:0,max:this.imgH}); +_2e.x1=_32.a1; +_2e.y1=_32.b1; +_2e.x2=_32.a2; +_2e.y2=_32.b2; +} +},applyRatioToAxis:function(_33,_34,_35,_36){ +var _37=Object.extend(_33,{}); +var _38=_37.a2-_37.a1; +var _3a=Math.floor(_38*_34.b/_34.a); +var _3b; +var _3c; +var _3d=null; +if(_35.b==1){ +_3b=_37.b1+_3a; +if(_3b>_36.max){ +_3b=_36.max; +_3d=_3b-_37.b1; +} +_37.b2=_3b; +}else{ +_3b=_37.b2-_3a; +if(_3b<_36.min){ +_3b=_36.min; +_3d=_3b+_37.b2; +} +_37.b1=_3b; +} +if(_3d!=null){ +_3c=Math.floor(_3d*_34.a/_34.b); +if(_35.a==1){ +_37.a2=_37.a1+_3c; +}else{ +_37.a1=_37.a1=_37.a2-_3c; +} +} +return _37; +},drawArea:function(){ +if(!this.isIE){ +Element.show($(this.overlay)); +} +var _3e=this.calcW(); +var _3f=this.calcH(); +var _40=this.areaCoords.x2; +var _41=this.areaCoords.y2; +var _42=this.selArea.style; +_42.left=this.areaCoords.x1+"px"; +_42.top=this.areaCoords.y1+"px"; +_42.width=_3e+"px"; +_42.height=_3f+"px"; +var _43=Math.ceil((_3e-6)/2)+"px"; +var _44=Math.ceil((_3f-6)/2)+"px"; +this.handleN.style.left=_43; +this.handleE.style.top=_44; +this.handleS.style.left=_43; +this.handleW.style.top=_44; +if(this.isIE){ +this.north.style.height=this.areaCoords.y1+"px"; +var _45=this.east.style; +_45.top=this.areaCoords.y1+"px"; +_45.height=_3f+"px"; +_45.left=_40+"px"; +_45.width=(this.img.width-_40)+"px"; +var _46=this.south.style; +_46.top=_41+"px"; +_46.height=(this.img.height-_41)+"px"; +var _47=this.west.style; +_47.top=this.areaCoords.y1+"px"; +_47.height=_3f+"px"; +_47.width=this.areaCoords.x1+"px"; +}else{ +_42.backgroundPosition="-"+this.areaCoords.x1+"px "+"-"+this.areaCoords.y1+"px"; +} +this.subDrawArea(); +this.forceReRender(); +},forceReRender:function(){ +if(this.isIE||this.isWebKit){ +var n=document.createTextNode(" "); +var d,el,fixEL,i; +if(this.isIE){ +fixEl=this.selArea; +}else{ +if(this.isWebKit){ +fixEl=document.getElementsByClassName("imgCrop_marqueeSouth",this.imgWrap)[0]; +d=Builder.node("div",""); +d.style.visibility="hidden"; +var _4a=["SE","S","SW"]; +for(i=0;i<_4a.length;i++){ +el=document.getElementsByClassName("imgCrop_handle"+_4a[i],this.selArea)[0]; +if(el.childNodes.length){ +el.removeChild(el.childNodes[0]); +} +el.appendChild(d); +} +} +} +fixEl.appendChild(n); +fixEl.removeChild(n); +} +},startResize:function(e){ +this.startCoords=this.cloneCoords(this.areaCoords); +this.resizing=true; +this.resizeHandle=Element.classNames(Event.element(e)).toString().replace(/([^N|NE|E|SE|S|SW|W|NW])+/,""); +Event.stop(e); +},startDrag:function(e){ +Element.show(this.selArea); +this.clickCoords=this.getCurPos(e); +this.setAreaCoords({x1:this.clickCoords.x,y1:this.clickCoords.y,x2:this.clickCoords.x,y2:this.clickCoords.y}); +this.dragging=true; +this.onDrag(e); +Event.stop(e); +},getCurPos:function(e){ +return curPos={x:Event.pointerX(e)-this.wrapOffsets.left,y:Event.pointerY(e)-this.wrapOffsets.top}; +},onDrag:function(e){ +var _4f=null; +if(this.dragging||this.resizing){ +var _50=this.getCurPos(e); +var _51=this.cloneCoords(this.areaCoords); +var _52={x:1,y:1}; +} +if(this.dragging){ +if(_50.x0&&this.options.minHeight>0){ +this.previewWrap=$(this.options.previewWrap); +this.previewImg=this.img.cloneNode(false); +this.options.displayOnInit=true; +this.hasPreviewImg=true; +Element.addClassName(this.previewWrap,"imgCrop_previewWrap"); +Element.setStyle(this.previewWrap,{width:this.options.minWidth+"px",height:this.options.minHeight+"px"}); +this.previewWrap.appendChild(this.previewImg); +} +},subDrawArea:function(){ +if(this.hasPreviewImg){ +var _58=this.calcW(); +var _59=this.calcH(); +var _5a={x:this.imgW/_58,y:this.imgH/_59}; +var _5b={x:_58/this.options.minWidth,y:_59/this.options.minHeight}; +var _5c={w:Math.ceil(this.options.minWidth*_5a.x)+"px",h:Math.ceil(this.options.minHeight*_5a.y)+"px",x:"-"+Math.ceil(this.areaCoords.x1/_5b.x)+"px",y:"-"+Math.ceil(this.areaCoords.y1/_5b.y)+"px"}; +var _5d=this.previewImg.style; +_5d.width=_5c.w; +_5d.height=_5c.h; +_5d.left=_5c.x; +_5d.top=_5c.y; +} +}}); diff --git a/src/wp-includes/js/crop/marqueeHoriz.gif b/src/wp-includes/js/crop/marqueeHoriz.gif new file mode 100644 index 0000000000000000000000000000000000000000..25317e5738bfcce43707ec0a0640533f69eb8fff GIT binary patch literal 1125 zcmZ?wbhEHbRA69a_|C|%YSpU$|Nk?Lg3%Bdks+Y?pWDwhB-q(8z|~04fSC~(2#P;h zI2nMsLkAQfplrgxA;j>X^AGz1g@#5JUL})?0)@j3*p!JdF#eJL!QbH6$ilBAvtmMm zV>2To4uuRq+&|2BXk_J;^QkCEaBRe>kmCWIsdRPP-tjm;Z-uJC{Q@u%EruuO{EwE;~(iC{0)wcEc{9` zD<&iyZ06% +* +* hoverIntent is currently available for use in all personal or commercial +* projects under both MIT and GPL licenses. This means that you can choose +* the license that best suits your project, and use it accordingly. +* +* // basic usage (just like .hover) receives onMouseOver and onMouseOut functions +* $("ul li").hoverIntent( showNav , hideNav ); +* +* // advanced usage receives configuration object only +* $("ul li").hoverIntent({ +* sensitivity: 7, // number = sensitivity threshold (must be 1 or higher) +* interval: 100, // number = milliseconds of polling interval +* over: showNav, // function = onMouseOver callback (required) +* timeout: 0, // number = milliseconds delay before onMouseOut function call +* out: hideNav // function = onMouseOut callback (required) +* }); +* +* @param f onMouseOver function || An object with configuration options +* @param g onMouseOut function || Nothing (use configuration options object) +* @author Brian Cherne +*/ +(function($) { + $.fn.hoverIntent = function(f,g) { + // default configuration options + var cfg = { + sensitivity: 7, + interval: 100, + timeout: 0 + }; + // override configuration options with user supplied object + cfg = $.extend(cfg, g ? { over: f, out: g } : f ); + + // instantiate variables + // cX, cY = current X and Y position of mouse, updated by mousemove event + // pX, pY = previous X and Y position of mouse, set by mouseover and polling interval + var cX, cY, pX, pY; + + // A private function for getting mouse position + var track = function(ev) { + cX = ev.pageX; + cY = ev.pageY; + }; + + // A private function for comparing current and previous mouse position + var compare = function(ev,ob) { + ob.hoverIntent_t = clearTimeout(ob.hoverIntent_t); + // compare mouse positions to see if they've crossed the threshold + if ( ( Math.abs(pX-cX) + Math.abs(pY-cY) ) < cfg.sensitivity ) { + $(ob).unbind("mousemove",track); + // set hoverIntent state to true (so mouseOut can be called) + ob.hoverIntent_s = 1; + return cfg.over.apply(ob,[ev]); + } else { + // set previous coordinates for next time + pX = cX; pY = cY; + // use self-calling timeout, guarantees intervals are spaced out properly (avoids JavaScript timer bugs) + ob.hoverIntent_t = setTimeout( function(){compare(ev, ob);} , cfg.interval ); + } + }; + + // A private function for delaying the mouseOut function + var delay = function(ev,ob) { + ob.hoverIntent_t = clearTimeout(ob.hoverIntent_t); + ob.hoverIntent_s = 0; + return cfg.out.apply(ob,[ev]); + }; + + // workaround for Mozilla bug: not firing mouseout/mouseleave on absolute positioned elements over textareas and input type="text" + var handleHover = function(e) { + var t = this; + + // next two lines copied from jQuery.hover, ignore children onMouseOver/onMouseOut + var p = (e.type == "mouseover" ? e.fromElement : e.toElement) || e.relatedTarget; + while ( p && p != this ) { try { p = p.parentNode; } catch(e) { p = this; } } + if ( p == this ) { + if ( $.browser.mozilla ) { + if ( e.type == "mouseout" ) { + t.mtout = setTimeout( function(){doHover(e,t);}, 30 ); + } else { + if (t.mtout) { t.mtout = clearTimeout(t.mtout); } + } + } + return; + } else { + if (t.mtout) { t.mtout = clearTimeout(t.mtout); } + doHover(e,t); + } + }; + + // A private function for handling mouse 'hovering' + var doHover = function(e,ob) { + + // copy objects to be passed into t (required for event object to be passed in IE) + var ev = jQuery.extend({},e); + + // cancel hoverIntent timer if it exists + if (ob.hoverIntent_t) { ob.hoverIntent_t = clearTimeout(ob.hoverIntent_t); } + + // else e.type == "onmouseover" + if (e.type == "mouseover") { + // set "previous" X and Y position based on initial entry point + pX = ev.pageX; pY = ev.pageY; + // update "current" X and Y position based on mousemove + $(ob).bind("mousemove",track); + // start polling interval (self-calling timeout) to compare mouse coordinates over time + if (ob.hoverIntent_s != 1) { ob.hoverIntent_t = setTimeout( function(){compare(ev,ob);} , cfg.interval );} + + // else e.type == "onmouseout" + } else { + // unbind expensive mousemove event + $(ob).unbind("mousemove",track); + // if hoverIntent state is true, then call the mouseOut function after the specified delay + if (ob.hoverIntent_s == 1) { ob.hoverIntent_t = setTimeout( function(){delay(ev,ob);} , cfg.timeout );} + } + }; + + // bind the function to the two event listeners + return this.mouseover(handleHover).mouseout(handleHover); + }; +})(jQuery); \ No newline at end of file diff --git a/src/wp-includes/js/hoverIntent.js b/src/wp-includes/js/hoverIntent.js new file mode 100644 index 0000000..bed4129 --- /dev/null +++ b/src/wp-includes/js/hoverIntent.js @@ -0,0 +1 @@ +(function(a){a.fn.hoverIntent=function(l,j){var m={sensitivity:7,interval:100,timeout:0};m=a.extend(m,j?{over:l,out:j}:l);var o,n,h,d;var e=function(f){o=f.pageX;n=f.pageY};var c=function(g,f){f.hoverIntent_t=clearTimeout(f.hoverIntent_t);if((Math.abs(h-o)+Math.abs(d-n))'); +} + +$.imgAreaSelect = function (img, options) { + var + + $img = $(img), + + imgLoaded, + + $box = div(), + $area = div(), + $border = div().add(div()).add(div()).add(div()), + $outer = div().add(div()).add(div()).add(div()), + $handles = $([]), + + $areaOpera, + + left, top, + + imgOfs = { left: 0, top: 0 }, + + imgWidth, imgHeight, + + $parent, + + parOfs = { left: 0, top: 0 }, + + zIndex = 0, + + position = 'absolute', + + startX, startY, + + scaleX, scaleY, + + resizeMargin = 10, + + resize, + + minWidth, minHeight, maxWidth, maxHeight, + + aspectRatio, + + shown, + + x1, y1, x2, y2, + + selection = { x1: 0, y1: 0, x2: 0, y2: 0, width: 0, height: 0 }, + + docElem = document.documentElement, + + $p, d, i, o, w, h, adjusted; + + function viewX(x) { + return x + imgOfs.left - parOfs.left; + } + + function viewY(y) { + return y + imgOfs.top - parOfs.top; + } + + function selX(x) { + return x - imgOfs.left + parOfs.left; + } + + function selY(y) { + return y - imgOfs.top + parOfs.top; + } + + function evX(event) { + return event.pageX - parOfs.left; + } + + function evY(event) { + return event.pageY - parOfs.top; + } + + function getSelection(noScale) { + var sx = noScale || scaleX, sy = noScale || scaleY; + + return { x1: round(selection.x1 * sx), + y1: round(selection.y1 * sy), + x2: round(selection.x2 * sx), + y2: round(selection.y2 * sy), + width: round(selection.x2 * sx) - round(selection.x1 * sx), + height: round(selection.y2 * sy) - round(selection.y1 * sy) }; + } + + function setSelection(x1, y1, x2, y2, noScale) { + var sx = noScale || scaleX, sy = noScale || scaleY; + + selection = { + x1: round(x1 / sx || 0), + y1: round(y1 / sy || 0), + x2: round(x2 / sx || 0), + y2: round(y2 / sy || 0) + }; + + selection.width = selection.x2 - selection.x1; + selection.height = selection.y2 - selection.y1; + } + + function adjust() { + if (!$img.width()) + return; + + imgOfs = { left: round($img.offset().left), top: round($img.offset().top) }; + + imgWidth = $img.innerWidth(); + imgHeight = $img.innerHeight(); + + imgOfs.top += ($img.outerHeight() - imgHeight) >> 1; + imgOfs.left += ($img.outerWidth() - imgWidth) >> 1; + + minWidth = options.minWidth || 0; + minHeight = options.minHeight || 0; + maxWidth = min(options.maxWidth || 1<<24, imgWidth); + maxHeight = min(options.maxHeight || 1<<24, imgHeight); + + if ($().jquery == '1.3.2' && position == 'fixed' && + !docElem['getBoundingClientRect']) + { + imgOfs.top += max(document.body.scrollTop, docElem.scrollTop); + imgOfs.left += max(document.body.scrollLeft, docElem.scrollLeft); + } + + parOfs = $.inArray($parent.css('position'), ['absolute', 'relative']) + 1 ? + { left: round($parent.offset().left) - $parent.scrollLeft(), + top: round($parent.offset().top) - $parent.scrollTop() } : + position == 'fixed' ? + { left: $(document).scrollLeft(), top: $(document).scrollTop() } : + { left: 0, top: 0 }; + + left = viewX(0); + top = viewY(0); + + if (selection.x2 > imgWidth || selection.y2 > imgHeight) + doResize(); + } + + function update(resetKeyPress) { + if (!shown) return; + + $box.css({ left: viewX(selection.x1), top: viewY(selection.y1) }) + .add($area).width(w = selection.width).height(h = selection.height); + + $area.add($border).add($handles).css({ left: 0, top: 0 }); + + $border + .width(max(w - $border.outerWidth() + $border.innerWidth(), 0)) + .height(max(h - $border.outerHeight() + $border.innerHeight(), 0)); + + $($outer[0]).css({ left: left, top: top, + width: selection.x1, height: imgHeight }); + $($outer[1]).css({ left: left + selection.x1, top: top, + width: w, height: selection.y1 }); + $($outer[2]).css({ left: left + selection.x2, top: top, + width: imgWidth - selection.x2, height: imgHeight }); + $($outer[3]).css({ left: left + selection.x1, top: top + selection.y2, + width: w, height: imgHeight - selection.y2 }); + + w -= $handles.outerWidth(); + h -= $handles.outerHeight(); + + switch ($handles.length) { + case 8: + $($handles[4]).css({ left: w >> 1 }); + $($handles[5]).css({ left: w, top: h >> 1 }); + $($handles[6]).css({ left: w >> 1, top: h }); + $($handles[7]).css({ top: h >> 1 }); + case 4: + $handles.slice(1,3).css({ left: w }); + $handles.slice(2,4).css({ top: h }); + } + + if (resetKeyPress !== false) { + if ($.imgAreaSelect.keyPress != docKeyPress) + $(document).unbind($.imgAreaSelect.keyPress, + $.imgAreaSelect.onKeyPress); + + if (options.keys) + $(document)[$.imgAreaSelect.keyPress]( + $.imgAreaSelect.onKeyPress = docKeyPress); + } + + if ($.browser.msie && $border.outerWidth() - $border.innerWidth() == 2) { + $border.css('margin', 0); + setTimeout(function () { $border.css('margin', 'auto'); }, 0); + } + } + + function doUpdate(resetKeyPress) { + adjust(); + update(resetKeyPress); + x1 = viewX(selection.x1); y1 = viewY(selection.y1); + x2 = viewX(selection.x2); y2 = viewY(selection.y2); + } + + function hide($elem, fn) { + options.fadeSpeed ? $elem.fadeOut(options.fadeSpeed, fn) : $elem.hide(); + + } + + function areaMouseMove(event) { + var x = selX(evX(event)) - selection.x1, + y = selY(evY(event)) - selection.y1; + + if (!adjusted) { + adjust(); + adjusted = true; + + $box.one('mouseout', function () { adjusted = false; }); + } + + resize = ''; + + if (options.resizable) { + if (y <= options.resizeMargin) + resize = 'n'; + else if (y >= selection.height - options.resizeMargin) + resize = 's'; + if (x <= options.resizeMargin) + resize += 'w'; + else if (x >= selection.width - options.resizeMargin) + resize += 'e'; + } + + $box.css('cursor', resize ? resize + '-resize' : + options.movable ? 'move' : ''); + if ($areaOpera) + $areaOpera.toggle(); + } + + function docMouseUp(event) { + $('body').css('cursor', ''); + if (options.autoHide || selection.width * selection.height == 0) + hide($box.add($outer), function () { $(this).hide(); }); + + $(document).unbind('mousemove', selectingMouseMove); + $box.mousemove(areaMouseMove); + + options.onSelectEnd(img, getSelection()); + } + + function areaMouseDown(event) { + if (event.which != 1) return false; + + adjust(); + + if (resize) { + $('body').css('cursor', resize + '-resize'); + + x1 = viewX(selection[/w/.test(resize) ? 'x2' : 'x1']); + y1 = viewY(selection[/n/.test(resize) ? 'y2' : 'y1']); + + $(document).mousemove(selectingMouseMove) + .one('mouseup', docMouseUp); + $box.unbind('mousemove', areaMouseMove); + } + else if (options.movable) { + startX = left + selection.x1 - evX(event); + startY = top + selection.y1 - evY(event); + + $box.unbind('mousemove', areaMouseMove); + + $(document).mousemove(movingMouseMove) + .one('mouseup', function () { + options.onSelectEnd(img, getSelection()); + + $(document).unbind('mousemove', movingMouseMove); + $box.mousemove(areaMouseMove); + }); + } + else + $img.mousedown(event); + + return false; + } + + function fixAspectRatio(xFirst) { + if (aspectRatio) + if (xFirst) { + x2 = max(left, min(left + imgWidth, + x1 + abs(y2 - y1) * aspectRatio * (x2 > x1 || -1))); + + y2 = round(max(top, min(top + imgHeight, + y1 + abs(x2 - x1) / aspectRatio * (y2 > y1 || -1)))); + x2 = round(x2); + } + else { + y2 = max(top, min(top + imgHeight, + y1 + abs(x2 - x1) / aspectRatio * (y2 > y1 || -1))); + x2 = round(max(left, min(left + imgWidth, + x1 + abs(y2 - y1) * aspectRatio * (x2 > x1 || -1)))); + y2 = round(y2); + } + } + + function doResize() { + x1 = min(x1, left + imgWidth); + y1 = min(y1, top + imgHeight); + + if (abs(x2 - x1) < minWidth) { + x2 = x1 - minWidth * (x2 < x1 || -1); + + if (x2 < left) + x1 = left + minWidth; + else if (x2 > left + imgWidth) + x1 = left + imgWidth - minWidth; + } + + if (abs(y2 - y1) < minHeight) { + y2 = y1 - minHeight * (y2 < y1 || -1); + + if (y2 < top) + y1 = top + minHeight; + else if (y2 > top + imgHeight) + y1 = top + imgHeight - minHeight; + } + + x2 = max(left, min(x2, left + imgWidth)); + y2 = max(top, min(y2, top + imgHeight)); + + fixAspectRatio(abs(x2 - x1) < abs(y2 - y1) * aspectRatio); + + if (abs(x2 - x1) > maxWidth) { + x2 = x1 - maxWidth * (x2 < x1 || -1); + fixAspectRatio(); + } + + if (abs(y2 - y1) > maxHeight) { + y2 = y1 - maxHeight * (y2 < y1 || -1); + fixAspectRatio(true); + } + + selection = { x1: selX(min(x1, x2)), x2: selX(max(x1, x2)), + y1: selY(min(y1, y2)), y2: selY(max(y1, y2)), + width: abs(x2 - x1), height: abs(y2 - y1) }; + + update(); + + options.onSelectChange(img, getSelection()); + } + + function selectingMouseMove(event) { + x2 = resize == '' || /w|e/.test(resize) || aspectRatio ? evX(event) : viewX(selection.x2); + y2 = resize == '' || /n|s/.test(resize) || aspectRatio ? evY(event) : viewY(selection.y2); + + doResize(); + + return false; + + } + + function doMove(newX1, newY1) { + x2 = (x1 = newX1) + selection.width; + y2 = (y1 = newY1) + selection.height; + + $.extend(selection, { x1: selX(x1), y1: selY(y1), x2: selX(x2), + y2: selY(y2) }); + + update(); + + options.onSelectChange(img, getSelection()); + } + + function movingMouseMove(event) { + x1 = max(left, min(startX + evX(event), left + imgWidth - selection.width)); + y1 = max(top, min(startY + evY(event), top + imgHeight - selection.height)); + + doMove(x1, y1); + + event.preventDefault(); + + return false; + } + + function startSelection() { + $(document).unbind('mousemove', startSelection); + adjust(); + + x2 = x1; + y2 = y1; + + doResize(); + + resize = ''; + + if ($outer.is(':not(:visible)')) + $box.add($outer).hide().fadeIn(options.fadeSpeed||0); + + shown = true; + + $(document).unbind('mouseup', cancelSelection) + .mousemove(selectingMouseMove).one('mouseup', docMouseUp); + $box.unbind('mousemove', areaMouseMove); + + options.onSelectStart(img, getSelection()); + } + + function cancelSelection() { + $(document).unbind('mousemove', startSelection) + .unbind('mouseup', cancelSelection); + hide($box.add($outer)); + + setSelection(selX(x1), selY(y1), selX(x1), selY(y1)); + + options.onSelectChange(img, getSelection()); + options.onSelectEnd(img, getSelection()); + } + + function imgMouseDown(event) { + if (event.which != 1 || $outer.is(':animated')) return false; + + adjust(); + startX = x1 = evX(event); + startY = y1 = evY(event); + + $(document).mousemove(startSelection).mouseup(cancelSelection); + + return false; + } + + function windowResize() { + doUpdate(false); + } + + function imgLoad() { + imgLoaded = true; + + setOptions(options = $.extend({ + classPrefix: 'imgareaselect', + movable: true, + parent: 'body', + resizable: true, + resizeMargin: 10, + onInit: function () {}, + onSelectStart: function () {}, + onSelectChange: function () {}, + onSelectEnd: function () {} + }, options)); + + $box.add($outer).css({ visibility: '' }); + + if (options.show) { + shown = true; + adjust(); + update(); + $box.add($outer).hide().fadeIn(options.fadeSpeed||0); + } + + setTimeout(function () { options.onInit(img, getSelection()); }, 0); + } + + var docKeyPress = function(event) { + var k = options.keys, d, t, key = event.keyCode; + + d = !isNaN(k.alt) && (event.altKey || event.originalEvent.altKey) ? k.alt : + !isNaN(k.ctrl) && event.ctrlKey ? k.ctrl : + !isNaN(k.shift) && event.shiftKey ? k.shift : + !isNaN(k.arrows) ? k.arrows : 10; + + if (k.arrows == 'resize' || (k.shift == 'resize' && event.shiftKey) || + (k.ctrl == 'resize' && event.ctrlKey) || + (k.alt == 'resize' && (event.altKey || event.originalEvent.altKey))) + { + switch (key) { + case 37: + d = -d; + case 39: + t = max(x1, x2); + x1 = min(x1, x2); + x2 = max(t + d, x1); + fixAspectRatio(); + break; + case 38: + d = -d; + case 40: + t = max(y1, y2); + y1 = min(y1, y2); + y2 = max(t + d, y1); + fixAspectRatio(true); + break; + default: + return; + } + + doResize(); + } + else { + x1 = min(x1, x2); + y1 = min(y1, y2); + + switch (key) { + case 37: + doMove(max(x1 - d, left), y1); + break; + case 38: + doMove(x1, max(y1 - d, top)); + break; + case 39: + doMove(x1 + min(d, imgWidth - selX(x2)), y1); + break; + case 40: + doMove(x1, y1 + min(d, imgHeight - selY(y2))); + break; + default: + return; + } + } + + return false; + }; + + function styleOptions($elem, props) { + for (option in props) + if (options[option] !== undefined) + $elem.css(props[option], options[option]); + } + + function setOptions(newOptions) { + if (newOptions.parent) + ($parent = $(newOptions.parent)).append($box.add($outer)); + + $.extend(options, newOptions); + + adjust(); + + if (newOptions.handles != null) { + $handles.remove(); + $handles = $([]); + + i = newOptions.handles ? newOptions.handles == 'corners' ? 4 : 8 : 0; + + while (i--) + $handles = $handles.add(div()); + + $handles.addClass(options.classPrefix + '-handle').css({ + position: 'absolute', + fontSize: 0, + zIndex: zIndex + 1 || 1 + }); + + if (!parseInt($handles.css('width')) >= 0) + $handles.width(5).height(5); + + if (o = options.borderWidth) + $handles.css({ borderWidth: o, borderStyle: 'solid' }); + + styleOptions($handles, { borderColor1: 'border-color', + borderColor2: 'background-color', + borderOpacity: 'opacity' }); + } + + scaleX = options.imageWidth / imgWidth || 1; + scaleY = options.imageHeight / imgHeight || 1; + + if (newOptions.x1 != null) { + setSelection(newOptions.x1, newOptions.y1, newOptions.x2, + newOptions.y2); + newOptions.show = !newOptions.hide; + } + + if (newOptions.keys) + options.keys = $.extend({ shift: 1, ctrl: 'resize' }, + newOptions.keys); + + $outer.addClass(options.classPrefix + '-outer'); + $area.addClass(options.classPrefix + '-selection'); + for (i = 0; i++ < 4;) + $($border[i-1]).addClass(options.classPrefix + '-border' + i); + + styleOptions($area, { selectionColor: 'background-color', + selectionOpacity: 'opacity' }); + styleOptions($border, { borderOpacity: 'opacity', + borderWidth: 'border-width' }); + styleOptions($outer, { outerColor: 'background-color', + outerOpacity: 'opacity' }); + if (o = options.borderColor1) + $($border[0]).css({ borderStyle: 'solid', borderColor: o }); + if (o = options.borderColor2) + $($border[1]).css({ borderStyle: 'dashed', borderColor: o }); + + $box.append($area.add($border).add($areaOpera).add($handles)); + + if ($.browser.msie) { + if (o = $outer.css('filter').match(/opacity=([0-9]+)/)) + $outer.css('opacity', o[1]/100); + if (o = $border.css('filter').match(/opacity=([0-9]+)/)) + $border.css('opacity', o[1]/100); + } + + if (newOptions.hide) + hide($box.add($outer)); + else if (newOptions.show && imgLoaded) { + shown = true; + $box.add($outer).fadeIn(options.fadeSpeed||0); + doUpdate(); + } + + aspectRatio = (d = (options.aspectRatio || '').split(/:/))[0] / d[1]; + + $img.add($outer).unbind('mousedown', imgMouseDown); + + if (options.disable || options.enable === false) { + $box.unbind('mousemove', areaMouseMove).unbind('mousedown', areaMouseDown); + $(window).unbind('resize', windowResize); + } + else { + if (options.enable || options.disable === false) { + if (options.resizable || options.movable) + $box.mousemove(areaMouseMove).mousedown(areaMouseDown); + + $(window).resize(windowResize); + } + + if (!options.persistent) + $img.add($outer).mousedown(imgMouseDown); + } + + options.enable = options.disable = undefined; + } + + this.remove = function () { + setOptions({ disable: true }); + $box.add($outer).remove(); + }; + + this.getOptions = function () { return options; }; + + this.setOptions = setOptions; + + this.getSelection = getSelection; + + this.setSelection = setSelection; + + this.update = doUpdate; + + $p = $img; + + while ($p.length) { + zIndex = max(zIndex, + !isNaN($p.css('z-index')) ? $p.css('z-index') : zIndex); + if ($p.css('position') == 'fixed') + position = 'fixed'; + + $p = $p.parent(':not(body)'); + } + + zIndex = options.zIndex || zIndex; + + if ($.browser.msie) + $img.attr('unselectable', 'on'); + + $.imgAreaSelect.keyPress = $.browser.msie || + $.browser.safari ? 'keydown' : 'keypress'; + + if ($.browser.opera) + $areaOpera = div().css({ width: '100%', height: '100%', + position: 'absolute', zIndex: zIndex + 2 || 2 }); + + $box.add($outer).css({ visibility: 'hidden', position: position, + overflow: 'hidden', zIndex: zIndex || '0' }); + $box.css({ zIndex: zIndex + 2 || 2 }); + $area.add($border).css({ position: 'absolute', fontSize: 0 }); + + img.complete || img.readyState == 'complete' || !$img.is('img') ? + imgLoad() : $img.one('load', imgLoad); + + if ($.browser.msie && $.browser.version >= 9) + img.src = img.src; +}; + +$.fn.imgAreaSelect = function (options) { + options = options || {}; + + this.each(function () { + if ($(this).data('imgAreaSelect')) { + if (options.remove) { + $(this).data('imgAreaSelect').remove(); + $(this).removeData('imgAreaSelect'); + } + else + $(this).data('imgAreaSelect').setOptions(options); + } + else if (!options.remove) { + if (options.enable === undefined && options.disable === undefined) + options.enable = true; + + $(this).data('imgAreaSelect', new $.imgAreaSelect(this, options)); + } + }); + + if (options.instance) + return $(this).data('imgAreaSelect'); + + return this; +}; + +})(jQuery); diff --git a/src/wp-includes/js/imgareaselect/jquery.imgareaselect.js b/src/wp-includes/js/imgareaselect/jquery.imgareaselect.js new file mode 100644 index 0000000..a29d667 --- /dev/null +++ b/src/wp-includes/js/imgareaselect/jquery.imgareaselect.js @@ -0,0 +1 @@ +(function(e){var b=Math.abs,a=Math.max,d=Math.min,c=Math.round;function f(){return e("
    ")}e.imgAreaSelect=function(Q,ad){var M=e(Q),u,B=f(),E=f(),ap=f().add(f()).add(f()).add(f()),v=f().add(f()).add(f()).add(f()),ax=e([]),aj,T,ao,ay={left:0,top:0},S,aA,p,V={left:0,top:0},g=0,ak="absolute",an,am,ab,aa,az=10,t,q,al,k,x,aE,ah,D,n,C,l,aC={x1:0,y1:0,x2:0,y2:0,width:0,height:0},F=document.documentElement,Z,R,O,N,K,P,I;function Y(h){return h+ay.left-V.left}function X(h){return h+ay.top-V.top}function au(h){return h-ay.left+V.left}function at(h){return h-ay.top+V.top}function A(h){return h.pageX-V.left}function z(h){return h.pageY-V.top}function ar(h){var o=h||ab,i=h||aa;return{x1:c(aC.x1*o),y1:c(aC.y1*i),x2:c(aC.x2*o),y2:c(aC.y2*i),width:c(aC.x2*o)-c(aC.x1*o),height:c(aC.y2*i)-c(aC.y1*i)}}function aq(i,w,h,o,aF){var aH=aF||ab,aG=aF||aa;aC={x1:c(i/aH||0),y1:c(w/aG||0),x2:c(h/aH||0),y2:c(o/aG||0)};aC.width=aC.x2-aC.x1;aC.height=aC.y2-aC.y1}function m(){if(!M.width()){return}ay={left:c(M.offset().left),top:c(M.offset().top)};S=M.innerWidth();aA=M.innerHeight();ay.top+=(M.outerHeight()-aA)>>1;ay.left+=(M.outerWidth()-S)>>1;q=ad.minWidth||0;al=ad.minHeight||0;k=d(ad.maxWidth||1<<24,S);x=d(ad.maxHeight||1<<24,aA);if(e().jquery=="1.3.2"&&ak=="fixed"&&!F.getBoundingClientRect){ay.top+=a(document.body.scrollTop,F.scrollTop);ay.left+=a(document.body.scrollLeft,F.scrollLeft)}V=e.inArray(p.css("position"),["absolute","relative"])+1?{left:c(p.offset().left)-p.scrollLeft(),top:c(p.offset().top)-p.scrollTop()}:ak=="fixed"?{left:e(document).scrollLeft(),top:e(document).scrollTop()}:{left:0,top:0};T=Y(0);ao=X(0);if(aC.x2>S||aC.y2>aA){aB()}}function J(h){if(!ah){return}B.css({left:Y(aC.x1),top:X(aC.y1)}).add(E).width(K=aC.width).height(P=aC.height);E.add(ap).add(ax).css({left:0,top:0});ap.width(a(K-ap.outerWidth()+ap.innerWidth(),0)).height(a(P-ap.outerHeight()+ap.innerHeight(),0));e(v[0]).css({left:T,top:ao,width:aC.x1,height:aA});e(v[1]).css({left:T+aC.x1,top:ao,width:K,height:aC.y1});e(v[2]).css({left:T+aC.x2,top:ao,width:S-aC.x2,height:aA});e(v[3]).css({left:T+aC.x1,top:ao+aC.y2,width:K,height:aA-aC.y2});K-=ax.outerWidth();P-=ax.outerHeight();switch(ax.length){case 8:e(ax[4]).css({left:K>>1});e(ax[5]).css({left:K,top:P>>1});e(ax[6]).css({left:K>>1,top:P});e(ax[7]).css({top:P>>1});case 4:ax.slice(1,3).css({left:K});ax.slice(2,4).css({top:P})}if(h!==false){if(e.imgAreaSelect.keyPress!=av){e(document).unbind(e.imgAreaSelect.keyPress,e.imgAreaSelect.onKeyPress)}if(ad.keys){e(document)[e.imgAreaSelect.keyPress](e.imgAreaSelect.onKeyPress=av)}}if(e.browser.msie&&ap.outerWidth()-ap.innerWidth()==2){ap.css("margin",0);setTimeout(function(){ap.css("margin","auto")},0)}}function y(h){m();J(h);D=Y(aC.x1);n=X(aC.y1);C=Y(aC.x2);l=X(aC.y2)}function ag(h,i){ad.fadeSpeed?h.fadeOut(ad.fadeSpeed,i):h.hide()}function H(i){var h=au(A(i))-aC.x1,o=at(z(i))-aC.y1;if(!I){m();I=true;B.one("mouseout",function(){I=false})}t="";if(ad.resizable){if(o<=ad.resizeMargin){t="n"}else{if(o>=aC.height-ad.resizeMargin){t="s"}}if(h<=ad.resizeMargin){t+="w"}else{if(h>=aC.width-ad.resizeMargin){t+="e"}}}B.css("cursor",t?t+"-resize":ad.movable?"move":"");if(aj){aj.toggle()}}function j(h){e("body").css("cursor","");if(ad.autoHide||aC.width*aC.height==0){ag(B.add(v),function(){e(this).hide()})}e(document).unbind("mousemove",ae);B.mousemove(H);ad.onSelectEnd(Q,ar())}function aw(h){if(h.which!=1){return false}m();if(t){e("body").css("cursor",t+"-resize");D=Y(aC[/w/.test(t)?"x2":"x1"]);n=X(aC[/n/.test(t)?"y2":"y1"]);e(document).mousemove(ae).one("mouseup",j);B.unbind("mousemove",H)}else{if(ad.movable){an=T+aC.x1-A(h);am=ao+aC.y1-z(h);B.unbind("mousemove",H);e(document).mousemove(ac).one("mouseup",function(){ad.onSelectEnd(Q,ar());e(document).unbind("mousemove",ac);B.mousemove(H)})}else{M.mousedown(h)}}return false}function L(h){if(aE){if(h){C=a(T,d(T+S,D+b(l-n)*aE*(C>D||-1)));l=c(a(ao,d(ao+aA,n+b(C-D)/aE*(l>n||-1))));C=c(C)}else{l=a(ao,d(ao+aA,n+b(C-D)/aE*(l>n||-1)));C=c(a(T,d(T+S,D+b(l-n)*aE*(C>D||-1))));l=c(l)}}}function aB(){D=d(D,T+S);n=d(n,ao+aA);if(b(C-D)T+S){D=T+S-q}}}if(b(l-n)ao+aA){n=ao+aA-al}}}C=a(T,d(C,T+S));l=a(ao,d(l,ao+aA));L(b(C-D)k){C=D-k*(Cx){l=n-x*(l=0){ax.width(5).height(5)}if(N=ad.borderWidth){ax.css({borderWidth:N,borderStyle:"solid"})}G(ax,{borderColor1:"border-color",borderColor2:"background-color",borderOpacity:"opacity"})}ab=ad.imageWidth/S||1;aa=ad.imageHeight/aA||1;if(h.x1!=null){aq(h.x1,h.y1,h.x2,h.y2);h.show=!h.hide}if(h.keys){ad.keys=e.extend({shift:1,ctrl:"resize"},h.keys)}v.addClass(ad.classPrefix+"-outer");E.addClass(ad.classPrefix+"-selection");for(O=0;O++<4;){e(ap[O-1]).addClass(ad.classPrefix+"-border"+O)}G(E,{selectionColor:"background-color",selectionOpacity:"opacity"});G(ap,{borderOpacity:"opacity",borderWidth:"border-width"});G(v,{outerColor:"background-color",outerOpacity:"opacity"});if(N=ad.borderColor1){e(ap[0]).css({borderStyle:"solid",borderColor:N})}if(N=ad.borderColor2){e(ap[1]).css({borderStyle:"dashed",borderColor:N})}B.append(E.add(ap).add(aj).add(ax));if(e.browser.msie){if(N=v.css("filter").match(/opacity=([0-9]+)/)){v.css("opacity",N[1]/100)}if(N=ap.css("filter").match(/opacity=([0-9]+)/)){ap.css("opacity",N[1]/100)}}if(h.hide){ag(B.add(v))}else{if(h.show&&u){ah=true;B.add(v).fadeIn(ad.fadeSpeed||0);y()}}aE=(R=(ad.aspectRatio||"").split(/:/))[0]/R[1];M.add(v).unbind("mousedown",aD);if(ad.disable||ad.enable===false){B.unbind("mousemove",H).unbind("mousedown",aw);e(window).unbind("resize",ai)}else{if(ad.enable||ad.disable===false){if(ad.resizable||ad.movable){B.mousemove(H).mousedown(aw)}e(window).resize(ai)}if(!ad.persistent){M.add(v).mousedown(aD)}}ad.enable=ad.disable=undefined}this.remove=function(){af({disable:true});B.add(v).remove()};this.getOptions=function(){return ad};this.setOptions=af;this.getSelection=ar;this.setSelection=aq;this.update=y;Z=M;while(Z.length){g=a(g,!isNaN(Z.css("z-index"))?Z.css("z-index"):g);if(Z.css("position")=="fixed"){ak="fixed"}Z=Z.parent(":not(body)")}g=ad.zIndex||g;if(e.browser.msie){M.attr("unselectable","on")}e.imgAreaSelect.keyPress=e.browser.msie||e.browser.safari?"keydown":"keypress";if(e.browser.opera){aj=f().css({width:"100%",height:"100%",position:"absolute",zIndex:g+2||2})}B.add(v).css({visibility:"hidden",position:ak,overflow:"hidden",zIndex:g||"0"});B.css({zIndex:g+2||2});E.add(ap).css({position:"absolute",fontSize:0});Q.complete||Q.readyState=="complete"||!M.is("img")?s():M.one("load",s);if(e.browser.msie&&e.browser.version>=9){Q.src=Q.src}};e.fn.imgAreaSelect=function(g){g=g||{};this.each(function(){if(e(this).data("imgAreaSelect")){if(g.remove){e(this).data("imgAreaSelect").remove();e(this).removeData("imgAreaSelect")}else{e(this).data("imgAreaSelect").setOptions(g)}}else{if(!g.remove){if(g.enable===undefined&&g.disable===undefined){g.enable=true}e(this).data("imgAreaSelect",new e.imgAreaSelect(this,g))}}});if(g.instance){return e(this).data("imgAreaSelect")}return this}})(jQuery); \ No newline at end of file diff --git a/src/wp-includes/js/jcrop/Jcrop.gif b/src/wp-includes/js/jcrop/Jcrop.gif new file mode 100644 index 0000000000000000000000000000000000000000..72ea7ccb5321d5384d70437cfaac73011237901e GIT binary patch literal 329 zcmZ?wbhEHb9b#5NV>2k zBC~b@b~P=nNfWAe-b%_i6tS^-1y(h@EsB~1TqDA_h@fkxG$bHgvj}VxE1JLgr!*!^ ILUxTc0Q$^Q5C8xG literal 0 HcmV?d00001 diff --git a/src/wp-includes/js/jcrop/jquery.Jcrop.css b/src/wp-includes/js/jcrop/jquery.Jcrop.css new file mode 100644 index 0000000..24925dc --- /dev/null +++ b/src/wp-includes/js/jcrop/jquery.Jcrop.css @@ -0,0 +1,35 @@ +/* Fixes issue here http://code.google.com/p/jcrop/issues/detail?id=1 */ +.jcrop-holder { text-align: left; } + +.jcrop-vline, .jcrop-hline +{ + font-size: 0; + position: absolute; + background: white url('Jcrop.gif') top left repeat; +} +.jcrop-vline { height: 100%; width: 1px !important; } +.jcrop-hline { width: 100%; height: 1px !important; } +.jcrop-handle { + font-size: 1px; + width: 7px !important; + height: 7px !important; + border: 1px #eee solid; + background-color: #333; + *width: 9px; + *height: 9px; +} + +.jcrop-tracker { width: 100%; height: 100%; } + +.custom .jcrop-vline, +.custom .jcrop-hline +{ + background: yellow; +} +.custom .jcrop-handle +{ + border-color: black; + background-color: #C7BB00; + -moz-border-radius: 3px; + -webkit-border-radius: 3px; +} diff --git a/src/wp-includes/js/jcrop/jquery.Jcrop.dev.js b/src/wp-includes/js/jcrop/jquery.Jcrop.dev.js new file mode 100644 index 0000000..ad261f9 --- /dev/null +++ b/src/wp-includes/js/jcrop/jquery.Jcrop.dev.js @@ -0,0 +1,1197 @@ +/** + * jquery.Jcrop.js v0.9.8 + * jQuery Image Cropping Plugin + * @author Kelly Hallman + * Copyright (c) 2008-2009 Kelly Hallman - released under 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. + + * }}} + */ + +(function($) { + +$.Jcrop = function(obj,opt) +{ + // Initialization {{{ + + // Sanitize some options {{{ + var obj = obj, opt = opt; + + if (typeof(obj) !== 'object') obj = $(obj)[0]; + if (typeof(opt) !== 'object') opt = { }; + + // Some on-the-fly fixes for MSIE...sigh + if (!('trackDocument' in opt)) + { + opt.trackDocument = $.browser.msie ? false : true; + if ($.browser.msie && $.browser.version.split('.')[0] == '8') + opt.trackDocument = true; + } + + if (!('keySupport' in opt)) + opt.keySupport = $.browser.msie ? false : true; + + // }}} + // Extend the default options {{{ + var defaults = { + + // Basic Settings + trackDocument: false, + baseClass: 'jcrop', + addClass: null, + + // Styling Options + bgColor: 'black', + bgOpacity: .6, + borderOpacity: .4, + handleOpacity: .5, + + handlePad: 5, + handleSize: 9, + handleOffset: 5, + edgeMargin: 14, + + aspectRatio: 0, + keySupport: true, + cornerHandles: true, + sideHandles: true, + drawBorders: true, + dragEdges: true, + + boxWidth: 0, + boxHeight: 0, + + boundary: 8, + animationDelay: 20, + swingSpeed: 3, + + allowSelect: true, + allowMove: true, + allowResize: true, + + minSelect: [ 0, 0 ], + maxSize: [ 0, 0 ], + minSize: [ 0, 0 ], + + // Callbacks / Event Handlers + onChange: function() { }, + onSelect: function() { } + + }; + var options = defaults; + setOptions(opt); + + // }}} + // Initialize some jQuery objects {{{ + + var $origimg = $(obj); + var $img = $origimg.clone().removeAttr('id').css({ position: 'absolute' }); + + $img.width($origimg.width()); + $img.height($origimg.height()); + $origimg.after($img).hide(); + + presize($img,options.boxWidth,options.boxHeight); + + var boundx = $img.width(), + boundy = $img.height(), + + $div = $('
    ') + .width(boundx).height(boundy) + .addClass(cssClass('holder')) + .css({ + position: 'relative', + backgroundColor: options.bgColor + }).insertAfter($origimg).append($img); + ; + + if (options.addClass) $div.addClass(options.addClass); + //$img.wrap($div); + + var $img2 = $('')/*{{{*/ + .attr('src',$img.attr('src')) + .css('position','absolute') + .width(boundx).height(boundy) + ;/*}}}*/ + var $img_holder = $('
    ')/*{{{*/ + .width(pct(100)).height(pct(100)) + .css({ + zIndex: 310, + position: 'absolute', + overflow: 'hidden' + }) + .append($img2) + ;/*}}}*/ + var $hdl_holder = $('
    ')/*{{{*/ + .width(pct(100)).height(pct(100)) + .css('zIndex',320); + /*}}}*/ + var $sel = $('
    ')/*{{{*/ + .css({ + position: 'absolute', + zIndex: 300 + }) + .insertBefore($img) + .append($img_holder,$hdl_holder) + ;/*}}}*/ + + var bound = options.boundary; + var $trk = newTracker().width(boundx+(bound*2)).height(boundy+(bound*2)) + .css({ position: 'absolute', top: px(-bound), left: px(-bound), zIndex: 290 }) + .mousedown(newSelection); + + /* }}} */ + // Set more variables {{{ + + var xlimit, ylimit, xmin, ymin; + var xscale, yscale, enabled = true; + var docOffset = getPos($img), + // Internal states + btndown, lastcurs, dimmed, animating, + shift_down; + + // }}} + + + // }}} + // Internal Modules {{{ + + var Coords = function()/*{{{*/ + { + var x1 = 0, y1 = 0, x2 = 0, y2 = 0, ox, oy; + + function setPressed(pos)/*{{{*/ + { + var pos = rebound(pos); + x2 = x1 = pos[0]; + y2 = y1 = pos[1]; + }; + /*}}}*/ + function setCurrent(pos)/*{{{*/ + { + var pos = rebound(pos); + ox = pos[0] - x2; + oy = pos[1] - y2; + x2 = pos[0]; + y2 = pos[1]; + }; + /*}}}*/ + function getOffset()/*{{{*/ + { + return [ ox, oy ]; + }; + /*}}}*/ + function moveOffset(offset)/*{{{*/ + { + var ox = offset[0], oy = offset[1]; + + if (0 > x1 + ox) ox -= ox + x1; + if (0 > y1 + oy) oy -= oy + y1; + + if (boundy < y2 + oy) oy += boundy - (y2 + oy); + if (boundx < x2 + ox) ox += boundx - (x2 + ox); + + x1 += ox; + x2 += ox; + y1 += oy; + y2 += oy; + }; + /*}}}*/ + function getCorner(ord)/*{{{*/ + { + var c = getFixed(); + switch(ord) + { + case 'ne': return [ c.x2, c.y ]; + case 'nw': return [ c.x, c.y ]; + case 'se': return [ c.x2, c.y2 ]; + case 'sw': return [ c.x, c.y2 ]; + } + }; + /*}}}*/ + function getFixed()/*{{{*/ + { + if (!options.aspectRatio) return getRect(); + // This function could use some optimization I think... + var aspect = options.aspectRatio, + min_x = options.minSize[0]/xscale, + min_y = options.minSize[1]/yscale, + max_x = options.maxSize[0]/xscale, + max_y = options.maxSize[1]/yscale, + rw = x2 - x1, + rh = y2 - y1, + rwa = Math.abs(rw), + rha = Math.abs(rh), + real_ratio = rwa / rha, + xx, yy + ; + if (max_x == 0) { max_x = boundx * 10 } + if (max_y == 0) { max_y = boundy * 10 } + if (real_ratio < aspect) + { + yy = y2; + w = rha * aspect; + xx = rw < 0 ? x1 - w : w + x1; + + if (xx < 0) + { + xx = 0; + h = Math.abs((xx - x1) / aspect); + yy = rh < 0 ? y1 - h: h + y1; + } + else if (xx > boundx) + { + xx = boundx; + h = Math.abs((xx - x1) / aspect); + yy = rh < 0 ? y1 - h : h + y1; + } + } + else + { + xx = x2; + h = rwa / aspect; + yy = rh < 0 ? y1 - h : y1 + h; + if (yy < 0) + { + yy = 0; + w = Math.abs((yy - y1) * aspect); + xx = rw < 0 ? x1 - w : w + x1; + } + else if (yy > boundy) + { + yy = boundy; + w = Math.abs(yy - y1) * aspect; + xx = rw < 0 ? x1 - w : w + x1; + } + } + + // Magic %-) + if(xx > x1) { // right side + if(xx - x1 < min_x) { + xx = x1 + min_x; + } else if (xx - x1 > max_x) { + xx = x1 + max_x; + } + if(yy > y1) { + yy = y1 + (xx - x1)/aspect; + } else { + yy = y1 - (xx - x1)/aspect; + } + } else if (xx < x1) { // left side + if(x1 - xx < min_x) { + xx = x1 - min_x + } else if (x1 - xx > max_x) { + xx = x1 - max_x; + } + if(yy > y1) { + yy = y1 + (x1 - xx)/aspect; + } else { + yy = y1 - (x1 - xx)/aspect; + } + } + + if(xx < 0) { + x1 -= xx; + xx = 0; + } else if (xx > boundx) { + x1 -= xx - boundx; + xx = boundx; + } + + if(yy < 0) { + y1 -= yy; + yy = 0; + } else if (yy > boundy) { + y1 -= yy - boundy; + yy = boundy; + } + + return last = makeObj(flipCoords(x1,y1,xx,yy)); + }; + /*}}}*/ + function rebound(p)/*{{{*/ + { + if (p[0] < 0) p[0] = 0; + if (p[1] < 0) p[1] = 0; + + if (p[0] > boundx) p[0] = boundx; + if (p[1] > boundy) p[1] = boundy; + + return [ p[0], p[1] ]; + }; + /*}}}*/ + function flipCoords(x1,y1,x2,y2)/*{{{*/ + { + var xa = x1, xb = x2, ya = y1, yb = y2; + if (x2 < x1) + { + xa = x2; + xb = x1; + } + if (y2 < y1) + { + ya = y2; + yb = y1; + } + return [ Math.round(xa), Math.round(ya), Math.round(xb), Math.round(yb) ]; + }; + /*}}}*/ + function getRect()/*{{{*/ + { + var xsize = x2 - x1; + var ysize = y2 - y1; + + if (xlimit && (Math.abs(xsize) > xlimit)) + x2 = (xsize > 0) ? (x1 + xlimit) : (x1 - xlimit); + if (ylimit && (Math.abs(ysize) > ylimit)) + y2 = (ysize > 0) ? (y1 + ylimit) : (y1 - ylimit); + + if (ymin && (Math.abs(ysize) < ymin)) + y2 = (ysize > 0) ? (y1 + ymin) : (y1 - ymin); + if (xmin && (Math.abs(xsize) < xmin)) + x2 = (xsize > 0) ? (x1 + xmin) : (x1 - xmin); + + if (x1 < 0) { x2 -= x1; x1 -= x1; } + if (y1 < 0) { y2 -= y1; y1 -= y1; } + if (x2 < 0) { x1 -= x2; x2 -= x2; } + if (y2 < 0) { y1 -= y2; y2 -= y2; } + if (x2 > boundx) { var delta = x2 - boundx; x1 -= delta; x2 -= delta; } + if (y2 > boundy) { var delta = y2 - boundy; y1 -= delta; y2 -= delta; } + if (x1 > boundx) { var delta = x1 - boundy; y2 -= delta; y1 -= delta; } + if (y1 > boundy) { var delta = y1 - boundy; y2 -= delta; y1 -= delta; } + + return makeObj(flipCoords(x1,y1,x2,y2)); + }; + /*}}}*/ + function makeObj(a)/*{{{*/ + { + return { x: a[0], y: a[1], x2: a[2], y2: a[3], + w: a[2] - a[0], h: a[3] - a[1] }; + }; + /*}}}*/ + + return { + flipCoords: flipCoords, + setPressed: setPressed, + setCurrent: setCurrent, + getOffset: getOffset, + moveOffset: moveOffset, + getCorner: getCorner, + getFixed: getFixed + }; + }(); + + /*}}}*/ + var Selection = function()/*{{{*/ + { + var start, end, dragmode, awake, hdep = 370; + var borders = { }; + var handle = { }; + var seehandles = false; + var hhs = options.handleOffset; + + /* Insert draggable elements {{{*/ + + // Insert border divs for outline + if (options.drawBorders) { + borders = { + top: insertBorder('hline') + .css('top',$.browser.msie?px(-1):px(0)), + bottom: insertBorder('hline'), + left: insertBorder('vline'), + right: insertBorder('vline') + }; + } + + // Insert handles on edges + if (options.dragEdges) { + handle.t = insertDragbar('n'); + handle.b = insertDragbar('s'); + handle.r = insertDragbar('e'); + handle.l = insertDragbar('w'); + } + + // Insert side handles + options.sideHandles && + createHandles(['n','s','e','w']); + + // Insert corner handles + options.cornerHandles && + createHandles(['sw','nw','ne','se']); + + /*}}}*/ + // Private Methods + function insertBorder(type)/*{{{*/ + { + var jq = $('
    ') + .css({position: 'absolute', opacity: options.borderOpacity }) + .addClass(cssClass(type)); + $img_holder.append(jq); + return jq; + }; + /*}}}*/ + function dragDiv(ord,zi)/*{{{*/ + { + var jq = $('
    ') + .mousedown(createDragger(ord)) + .css({ + cursor: ord+'-resize', + position: 'absolute', + zIndex: zi + }) + ; + $hdl_holder.append(jq); + return jq; + }; + /*}}}*/ + function insertHandle(ord)/*{{{*/ + { + return dragDiv(ord,hdep++) + .css({ top: px(-hhs+1), left: px(-hhs+1), opacity: options.handleOpacity }) + .addClass(cssClass('handle')); + }; + /*}}}*/ + function insertDragbar(ord)/*{{{*/ + { + var s = options.handleSize, + o = hhs, + h = s, w = s, + t = o, l = o; + + switch(ord) + { + case 'n': case 's': w = pct(100); break; + case 'e': case 'w': h = pct(100); break; + } + + return dragDiv(ord,hdep++).width(w).height(h) + .css({ top: px(-t+1), left: px(-l+1)}); + }; + /*}}}*/ + function createHandles(li)/*{{{*/ + { + for(i in li) handle[li[i]] = insertHandle(li[i]); + }; + /*}}}*/ + function moveHandles(c)/*{{{*/ + { + var midvert = Math.round((c.h / 2) - hhs), + midhoriz = Math.round((c.w / 2) - hhs), + north = west = -hhs+1, + east = c.w - hhs, + south = c.h - hhs, + x, y; + + 'e' in handle && + handle.e.css({ top: px(midvert), left: px(east) }) && + handle.w.css({ top: px(midvert) }) && + handle.s.css({ top: px(south), left: px(midhoriz) }) && + handle.n.css({ left: px(midhoriz) }); + + 'ne' in handle && + handle.ne.css({ left: px(east) }) && + handle.se.css({ top: px(south), left: px(east) }) && + handle.sw.css({ top: px(south) }); + + 'b' in handle && + handle.b.css({ top: px(south) }) && + handle.r.css({ left: px(east) }); + }; + /*}}}*/ + function moveto(x,y)/*{{{*/ + { + $img2.css({ top: px(-y), left: px(-x) }); + $sel.css({ top: px(y), left: px(x) }); + }; + /*}}}*/ + function resize(w,h)/*{{{*/ + { + $sel.width(w).height(h); + }; + /*}}}*/ + function refresh()/*{{{*/ + { + var c = Coords.getFixed(); + + Coords.setPressed([c.x,c.y]); + Coords.setCurrent([c.x2,c.y2]); + + updateVisible(); + }; + /*}}}*/ + + // Internal Methods + function updateVisible()/*{{{*/ + { if (awake) return update(); }; + /*}}}*/ + function update()/*{{{*/ + { + var c = Coords.getFixed(); + + resize(c.w,c.h); + moveto(c.x,c.y); + + options.drawBorders && + borders['right'].css({ left: px(c.w-1) }) && + borders['bottom'].css({ top: px(c.h-1) }); + + seehandles && moveHandles(c); + awake || show(); + + options.onChange(unscale(c)); + }; + /*}}}*/ + function show()/*{{{*/ + { + $sel.show(); + $img.css('opacity',options.bgOpacity); + awake = true; + }; + /*}}}*/ + function release()/*{{{*/ + { + disableHandles(); + $sel.hide(); + $img.css('opacity',1); + awake = false; + }; + /*}}}*/ + function showHandles()//{{{ + { + if (seehandles) + { + moveHandles(Coords.getFixed()); + $hdl_holder.show(); + } + }; + //}}} + function enableHandles()/*{{{*/ + { + seehandles = true; + if (options.allowResize) + { + moveHandles(Coords.getFixed()); + $hdl_holder.show(); + return true; + } + }; + /*}}}*/ + function disableHandles()/*{{{*/ + { + seehandles = false; + $hdl_holder.hide(); + }; + /*}}}*/ + function animMode(v)/*{{{*/ + { + (animating = v) ? disableHandles(): enableHandles(); + }; + /*}}}*/ + function done()/*{{{*/ + { + animMode(false); + refresh(); + }; + /*}}}*/ + + var $track = newTracker().mousedown(createDragger('move')) + .css({ cursor: 'move', position: 'absolute', zIndex: 360 }) + + $img_holder.append($track); + disableHandles(); + + return { + updateVisible: updateVisible, + update: update, + release: release, + refresh: refresh, + setCursor: function (cursor) { $track.css('cursor',cursor); }, + enableHandles: enableHandles, + enableOnly: function() { seehandles = true; }, + showHandles: showHandles, + disableHandles: disableHandles, + animMode: animMode, + done: done + }; + }(); + /*}}}*/ + var Tracker = function()/*{{{*/ + { + var onMove = function() { }, + onDone = function() { }, + trackDoc = options.trackDocument; + + if (!trackDoc) + { + $trk + .mousemove(trackMove) + .mouseup(trackUp) + .mouseout(trackUp) + ; + } + + function toFront()/*{{{*/ + { + $trk.css({zIndex:450}); + if (trackDoc) + { + $(document) + .mousemove(trackMove) + .mouseup(trackUp) + ; + } + } + /*}}}*/ + function toBack()/*{{{*/ + { + $trk.css({zIndex:290}); + if (trackDoc) + { + $(document) + .unbind('mousemove',trackMove) + .unbind('mouseup',trackUp) + ; + } + } + /*}}}*/ + function trackMove(e)/*{{{*/ + { + onMove(mouseAbs(e)); + }; + /*}}}*/ + function trackUp(e)/*{{{*/ + { + e.preventDefault(); + e.stopPropagation(); + + if (btndown) + { + btndown = false; + + onDone(mouseAbs(e)); + options.onSelect(unscale(Coords.getFixed())); + toBack(); + onMove = function() { }; + onDone = function() { }; + } + + return false; + }; + /*}}}*/ + + function activateHandlers(move,done)/* {{{ */ + { + btndown = true; + onMove = move; + onDone = done; + toFront(); + return false; + }; + /* }}} */ + + function setCursor(t) { $trk.css('cursor',t); }; + + $img.before($trk); + return { + activateHandlers: activateHandlers, + setCursor: setCursor + }; + }(); + /*}}}*/ + var KeyManager = function()/*{{{*/ + { + var $keymgr = $('') + .css({ position: 'absolute', left: '-30px' }) + .keypress(parseKey) + .blur(onBlur), + + $keywrap = $('
    ') + .css({ + position: 'absolute', + overflow: 'hidden' + }) + .append($keymgr) + ; + + function watchKeys()/*{{{*/ + { + if (options.keySupport) + { + $keymgr.show(); + $keymgr.focus(); + } + }; + /*}}}*/ + function onBlur(e)/*{{{*/ + { + $keymgr.hide(); + }; + /*}}}*/ + function doNudge(e,x,y)/*{{{*/ + { + if (options.allowMove) { + Coords.moveOffset([x,y]); + Selection.updateVisible(); + }; + e.preventDefault(); + e.stopPropagation(); + }; + /*}}}*/ + function parseKey(e)/*{{{*/ + { + if (e.ctrlKey) return true; + shift_down = e.shiftKey ? true : false; + var nudge = shift_down ? 10 : 1; + switch(e.keyCode) + { + case 37: doNudge(e,-nudge,0); break; + case 39: doNudge(e,nudge,0); break; + case 38: doNudge(e,0,-nudge); break; + case 40: doNudge(e,0,nudge); break; + + case 27: Selection.release(); break; + + case 9: return true; + } + + return nothing(e); + }; + /*}}}*/ + + if (options.keySupport) $keywrap.insertBefore($img); + return { + watchKeys: watchKeys + }; + }(); + /*}}}*/ + + // }}} + // Internal Methods {{{ + + function px(n) { return '' + parseInt(n) + 'px'; }; + function pct(n) { return '' + parseInt(n) + '%'; }; + function cssClass(cl) { return options.baseClass + '-' + cl; }; + function getPos(obj)/*{{{*/ + { + // Updated in v0.9.4 to use built-in dimensions plugin + var pos = $(obj).offset(); + return [ pos.left, pos.top ]; + }; + /*}}}*/ + function mouseAbs(e)/*{{{*/ + { + return [ (e.pageX - docOffset[0]), (e.pageY - docOffset[1]) ]; + }; + /*}}}*/ + function myCursor(type)/*{{{*/ + { + if (type != lastcurs) + { + Tracker.setCursor(type); + //Handles.xsetCursor(type); + lastcurs = type; + } + }; + /*}}}*/ + function startDragMode(mode,pos)/*{{{*/ + { + docOffset = getPos($img); + Tracker.setCursor(mode=='move'?mode:mode+'-resize'); + + if (mode == 'move') + return Tracker.activateHandlers(createMover(pos), doneSelect); + + var fc = Coords.getFixed(); + var opp = oppLockCorner(mode); + var opc = Coords.getCorner(oppLockCorner(opp)); + + Coords.setPressed(Coords.getCorner(opp)); + Coords.setCurrent(opc); + + Tracker.activateHandlers(dragmodeHandler(mode,fc),doneSelect); + }; + /*}}}*/ + function dragmodeHandler(mode,f)/*{{{*/ + { + return function(pos) { + if (!options.aspectRatio) switch(mode) + { + case 'e': pos[1] = f.y2; break; + case 'w': pos[1] = f.y2; break; + case 'n': pos[0] = f.x2; break; + case 's': pos[0] = f.x2; break; + } + else switch(mode) + { + case 'e': pos[1] = f.y+1; break; + case 'w': pos[1] = f.y+1; break; + case 'n': pos[0] = f.x+1; break; + case 's': pos[0] = f.x+1; break; + } + Coords.setCurrent(pos); + Selection.update(); + }; + }; + /*}}}*/ + function createMover(pos)/*{{{*/ + { + var lloc = pos; + KeyManager.watchKeys(); + + return function(pos) + { + Coords.moveOffset([pos[0] - lloc[0], pos[1] - lloc[1]]); + lloc = pos; + + Selection.update(); + }; + }; + /*}}}*/ + function oppLockCorner(ord)/*{{{*/ + { + switch(ord) + { + case 'n': return 'sw'; + case 's': return 'nw'; + case 'e': return 'nw'; + case 'w': return 'ne'; + case 'ne': return 'sw'; + case 'nw': return 'se'; + case 'se': return 'nw'; + case 'sw': return 'ne'; + }; + }; + /*}}}*/ + function createDragger(ord)/*{{{*/ + { + return function(e) { + if (options.disabled) return false; + if ((ord == 'move') && !options.allowMove) return false; + btndown = true; + startDragMode(ord,mouseAbs(e)); + e.stopPropagation(); + e.preventDefault(); + return false; + }; + }; + /*}}}*/ + function presize($obj,w,h)/*{{{*/ + { + var nw = $obj.width(), nh = $obj.height(); + if ((nw > w) && w > 0) + { + nw = w; + nh = (w/$obj.width()) * $obj.height(); + } + if ((nh > h) && h > 0) + { + nh = h; + nw = (h/$obj.height()) * $obj.width(); + } + xscale = $obj.width() / nw; + yscale = $obj.height() / nh; + $obj.width(nw).height(nh); + }; + /*}}}*/ + function unscale(c)/*{{{*/ + { + return { + x: parseInt(c.x * xscale), y: parseInt(c.y * yscale), + x2: parseInt(c.x2 * xscale), y2: parseInt(c.y2 * yscale), + w: parseInt(c.w * xscale), h: parseInt(c.h * yscale) + }; + }; + /*}}}*/ + function doneSelect(pos)/*{{{*/ + { + var c = Coords.getFixed(); + if (c.w > options.minSelect[0] && c.h > options.minSelect[1]) + { + Selection.enableHandles(); + Selection.done(); + } + else + { + Selection.release(); + } + Tracker.setCursor( options.allowSelect?'crosshair':'default' ); + }; + /*}}}*/ + function newSelection(e)/*{{{*/ + { + if (options.disabled) return false; + if (!options.allowSelect) return false; + btndown = true; + docOffset = getPos($img); + Selection.disableHandles(); + myCursor('crosshair'); + var pos = mouseAbs(e); + Coords.setPressed(pos); + Tracker.activateHandlers(selectDrag,doneSelect); + KeyManager.watchKeys(); + Selection.update(); + + e.stopPropagation(); + e.preventDefault(); + return false; + }; + /*}}}*/ + function selectDrag(pos)/*{{{*/ + { + Coords.setCurrent(pos); + Selection.update(); + }; + /*}}}*/ + function newTracker() + { + var trk = $('
    ').addClass(cssClass('tracker')); + $.browser.msie && trk.css({ opacity: 0, backgroundColor: 'white' }); + return trk; + }; + + // }}} + // API methods {{{ + + function animateTo(a)/*{{{*/ + { + var x1 = a[0] / xscale, + y1 = a[1] / yscale, + x2 = a[2] / xscale, + y2 = a[3] / yscale; + + if (animating) return; + + var animto = Coords.flipCoords(x1,y1,x2,y2); + var c = Coords.getFixed(); + var animat = initcr = [ c.x, c.y, c.x2, c.y2 ]; + var interv = options.animationDelay; + + var x = animat[0]; + var y = animat[1]; + var x2 = animat[2]; + var y2 = animat[3]; + var ix1 = animto[0] - initcr[0]; + var iy1 = animto[1] - initcr[1]; + var ix2 = animto[2] - initcr[2]; + var iy2 = animto[3] - initcr[3]; + var pcent = 0; + var velocity = options.swingSpeed; + + Selection.animMode(true); + + var animator = function() + { + return function() + { + pcent += (100 - pcent) / velocity; + + animat[0] = x + ((pcent / 100) * ix1); + animat[1] = y + ((pcent / 100) * iy1); + animat[2] = x2 + ((pcent / 100) * ix2); + animat[3] = y2 + ((pcent / 100) * iy2); + + if (pcent < 100) animateStart(); + else Selection.done(); + + if (pcent >= 99.8) pcent = 100; + + setSelectRaw(animat); + }; + }(); + + function animateStart() + { window.setTimeout(animator,interv); }; + + animateStart(); + }; + /*}}}*/ + function setSelect(rect)//{{{ + { + setSelectRaw([rect[0]/xscale,rect[1]/yscale,rect[2]/xscale,rect[3]/yscale]); + }; + //}}} + function setSelectRaw(l) /*{{{*/ + { + Coords.setPressed([l[0],l[1]]); + Coords.setCurrent([l[2],l[3]]); + Selection.update(); + }; + /*}}}*/ + function setOptions(opt)/*{{{*/ + { + if (typeof(opt) != 'object') opt = { }; + options = $.extend(options,opt); + + if (typeof(options.onChange)!=='function') + options.onChange = function() { }; + + if (typeof(options.onSelect)!=='function') + options.onSelect = function() { }; + + }; + /*}}}*/ + function tellSelect()/*{{{*/ + { + return unscale(Coords.getFixed()); + }; + /*}}}*/ + function tellScaled()/*{{{*/ + { + return Coords.getFixed(); + }; + /*}}}*/ + function setOptionsNew(opt)/*{{{*/ + { + setOptions(opt); + interfaceUpdate(); + }; + /*}}}*/ + function disableCrop()//{{{ + { + options.disabled = true; + Selection.disableHandles(); + Selection.setCursor('default'); + Tracker.setCursor('default'); + }; + //}}} + function enableCrop()//{{{ + { + options.disabled = false; + interfaceUpdate(); + }; + //}}} + function cancelCrop()//{{{ + { + Selection.done(); + Tracker.activateHandlers(null,null); + }; + //}}} + function destroy()//{{{ + { + $div.remove(); + $origimg.show(); + }; + //}}} + + function interfaceUpdate(alt)//{{{ + // This method tweaks the interface based on options object. + // Called when options are changed and at end of initialization. + { + options.allowResize ? + alt?Selection.enableOnly():Selection.enableHandles(): + Selection.disableHandles(); + + Tracker.setCursor( options.allowSelect? 'crosshair': 'default' ); + Selection.setCursor( options.allowMove? 'move': 'default' ); + + $div.css('backgroundColor',options.bgColor); + + if ('setSelect' in options) { + setSelect(opt.setSelect); + Selection.done(); + delete(options.setSelect); + } + + if ('trueSize' in options) { + xscale = options.trueSize[0] / boundx; + yscale = options.trueSize[1] / boundy; + } + + xlimit = options.maxSize[0] || 0; + ylimit = options.maxSize[1] || 0; + xmin = options.minSize[0] || 0; + ymin = options.minSize[1] || 0; + + if ('outerImage' in options) + { + $img.attr('src',options.outerImage); + delete(options.outerImage); + } + + Selection.refresh(); + }; + //}}} + + // }}} + + $hdl_holder.hide(); + interfaceUpdate(true); + + var api = { + animateTo: animateTo, + setSelect: setSelect, + setOptions: setOptionsNew, + tellSelect: tellSelect, + tellScaled: tellScaled, + + disable: disableCrop, + enable: enableCrop, + cancel: cancelCrop, + + focus: KeyManager.watchKeys, + + getBounds: function() { return [ boundx * xscale, boundy * yscale ]; }, + getWidgetSize: function() { return [ boundx, boundy ]; }, + + release: Selection.release, + destroy: destroy + + }; + + $origimg.data('Jcrop',api); + return api; +}; + +$.fn.Jcrop = function(options)/*{{{*/ +{ + function attachWhenDone(from)/*{{{*/ + { + var loadsrc = options.useImg || from.src; + var img = new Image(); + img.onload = function() { $.Jcrop(from,options); }; + img.src = loadsrc; + }; + /*}}}*/ + if (typeof(options) !== 'object') options = { }; + + // Iterate over each object, attach Jcrop + this.each(function() + { + // If we've already attached to this object + if ($(this).data('Jcrop')) + { + // The API can be requested this way (undocumented) + if (options == 'api') return $(this).data('Jcrop'); + // Otherwise, we just reset the options... + else $(this).data('Jcrop').setOptions(options); + } + // If we haven't been attached, preload and attach + else attachWhenDone(this); + }); + + // Return "this" so we're chainable a la jQuery plugin-style! + return this; +}; +/*}}}*/ + +})(jQuery); diff --git a/src/wp-includes/js/jcrop/jquery.Jcrop.js b/src/wp-includes/js/jcrop/jquery.Jcrop.js new file mode 100644 index 0000000..70b5505 --- /dev/null +++ b/src/wp-includes/js/jcrop/jquery.Jcrop.js @@ -0,0 +1 @@ +(function(a){a.Jcrop=function(d,A){var d=d,A=A;if(typeof(d)!=="object"){d=a(d)[0]}if(typeof(A)!=="object"){A={}}if(!("trackDocument" in A)){A.trackDocument=a.browser.msie?false:true;if(a.browser.msie&&a.browser.version.split(".")[0]=="8"){A.trackDocument=true}}if(!("keySupport" in A)){A.keySupport=a.browser.msie?false:true}var U={trackDocument:false,baseClass:"jcrop",addClass:null,bgColor:"black",bgOpacity:0.6,borderOpacity:0.4,handleOpacity:0.5,handlePad:5,handleSize:9,handleOffset:5,edgeMargin:14,aspectRatio:0,keySupport:true,cornerHandles:true,sideHandles:true,drawBorders:true,dragEdges:true,boxWidth:0,boxHeight:0,boundary:8,animationDelay:20,swingSpeed:3,allowSelect:true,allowMove:true,allowResize:true,minSelect:[0,0],maxSize:[0,0],minSize:[0,0],onChange:function(){},onSelect:function(){}};var H=U;z(A);var W=a(d);var al=W.clone().removeAttr("id").css({position:"absolute"});al.width(W.width());al.height(W.height());W.after(al).hide();T(al,H.boxWidth,H.boxHeight);var Q=al.width(),O=al.height(),Z=a("
    ").width(Q).height(O).addClass(C("holder")).css({position:"relative",backgroundColor:H.bgColor}).insertAfter(W).append(al);if(H.addClass){Z.addClass(H.addClass)}var I=a("").attr("src",al.attr("src")).css("position","absolute").width(Q).height(O);var k=a("
    ").width(K(100)).height(K(100)).css({zIndex:310,position:"absolute",overflow:"hidden"}).append(I);var L=a("
    ").width(K(100)).height(K(100)).css("zIndex",320);var y=a("
    ").css({position:"absolute",zIndex:300}).insertBefore(al).append(k,L);var t=H.boundary;var b=ae().width(Q+(t*2)).height(O+(t*2)).css({position:"absolute",top:l(-t),left:l(-t),zIndex:290}).mousedown(ac);var x,ah,p,S;var M,e,n=true;var ad=D(al),r,an,am,B,ab;var aa=function(){var aq=0,aC=0,ap=0,aB=0,au,ar;function aw(aF){var aF=at(aF);ap=aq=aF[0];aB=aC=aF[1]}function av(aF){var aF=at(aF);au=aF[0]-ap;ar=aF[1]-aB;ap=aF[0];aB=aF[1]}function aE(){return[au,ar]}function ao(aH){var aG=aH[0],aF=aH[1];if(0>aq+aG){aG-=aG+aq}if(0>aC+aF){aF-=aF+aC}if(OQ){aF=Q;h=Math.abs((aF-aq)/aH);aM=aP<0?aC-h:h+aC}}}else{aF=ap;h=aJ/aH;aM=aP<0?aC-h:aC+h;if(aM<0){aM=0;w=Math.abs((aM-aC)*aH);aF=aI<0?aq-w:w+aq}else{if(aM>O){aM=O;w=Math.abs(aM-aC)*aH;aF=aI<0?aq-w:w+aq}}}if(aF>aq){if(aF-aqaG){aF=aq+aG}}if(aM>aC){aM=aC+(aF-aq)/aH}else{aM=aC-(aF-aq)/aH}}else{if(aFaG){aF=aq-aG}}if(aM>aC){aM=aC+(aq-aF)/aH}else{aM=aC-(aq-aF)/aH}}}if(aF<0){aq-=aF;aF=0}else{if(aF>Q){aq-=aF-Q;aF=Q}}if(aM<0){aC-=aM;aM=0}else{if(aM>O){aC-=aM-O;aM=O}}return last=az(ay(aq,aC,aF,aM))}function at(aF){if(aF[0]<0){aF[0]=0}if(aF[1]<0){aF[1]=0}if(aF[0]>Q){aF[0]=Q}if(aF[1]>O){aF[1]=O}return[aF[0],aF[1]]}function ay(aI,aK,aH,aJ){var aM=aI,aL=aH,aG=aK,aF=aJ;if(aHx)){ap=(aG>0)?(aq+x):(aq-x)}if(ah&&(Math.abs(aF)>ah)){aB=(aF>0)?(aC+ah):(aC-ah)}if(S&&(Math.abs(aF)0)?(aC+S):(aC-S)}if(p&&(Math.abs(aG)0)?(aq+p):(aq-p)}if(aq<0){ap-=aq;aq-=aq}if(aC<0){aB-=aC;aC-=aC}if(ap<0){aq-=ap;ap-=ap}if(aB<0){aC-=aB;aB-=aB}if(ap>Q){var aH=ap-Q;aq-=aH;ap-=aH}if(aB>O){var aH=aB-O;aC-=aH;aB-=aH}if(aq>Q){var aH=aq-O;aB-=aH;aC-=aH}if(aC>O){var aH=aC-O;aB-=aH;aC-=aH}return az(ay(aq,aC,ap,aB))}function az(aF){return{x:aF[0],y:aF[1],x2:aF[2],y2:aF[3],w:aF[2]-aF[0],h:aF[3]-aF[1]}}return{flipCoords:ay,setPressed:aw,setCurrent:av,getOffset:aE,moveOffset:ao,getCorner:ax,getFixed:aD}}();var X=function(){var aw,ar,aC,aB,aK=370;var av={};var aO={};var aq=false;var aA=H.handleOffset;if(H.drawBorders){av={top:ax("hline").css("top",a.browser.msie?l(-1):l(0)),bottom:ax("hline"),left:ax("vline"),right:ax("vline")}}if(H.dragEdges){aO.t=aJ("n");aO.b=aJ("s");aO.r=aJ("e");aO.l=aJ("w")}H.sideHandles&&aF(["n","s","e","w"]);H.cornerHandles&&aF(["sw","nw","ne","se"]);function ax(aR){var aS=a("
    ").css({position:"absolute",opacity:H.borderOpacity}).addClass(C(aR));k.append(aS);return aS}function ap(aR,aS){var aT=a("
    ").mousedown(c(aR)).css({cursor:aR+"-resize",position:"absolute",zIndex:aS});L.append(aT);return aT}function aD(aR){return ap(aR,aK++).css({top:l(-aA+1),left:l(-aA+1),opacity:H.handleOpacity}).addClass(C("handle"))}function aJ(aT){var aW=H.handleSize,aX=aA,aV=aW,aS=aW,aU=aX,aR=aX;switch(aT){case"n":case"s":aS=K(100);break;case"e":case"w":aV=K(100);break}return ap(aT,aK++).width(aS).height(aV).css({top:l(-aU+1),left:l(-aR+1)})}function aF(aR){for(i in aR){aO[aR[i]]=aD(aR[i])}}function aH(aY){var aT=Math.round((aY.h/2)-aA),aS=Math.round((aY.w/2)-aA),aW=west=-aA+1,aV=aY.w-aA,aU=aY.h-aA,aR,aX;"e" in aO&&aO.e.css({top:l(aT),left:l(aV)})&&aO.w.css({top:l(aT)})&&aO.s.css({top:l(aU),left:l(aS)})&&aO.n.css({left:l(aS)});"ne" in aO&&aO.ne.css({left:l(aV)})&&aO.se.css({top:l(aU),left:l(aV)})&&aO.sw.css({top:l(aU)});"b" in aO&&aO.b.css({top:l(aU)})&&aO.r.css({left:l(aV)})}function az(aR,aS){I.css({top:l(-aS),left:l(-aR)});y.css({top:l(aS),left:l(aR)})}function aQ(aR,aS){y.width(aR).height(aS)}function at(){var aR=aa.getFixed();aa.setPressed([aR.x,aR.y]);aa.setCurrent([aR.x2,aR.y2]);aN()}function aN(){if(aB){return ay()}}function ay(){var aR=aa.getFixed();aQ(aR.w,aR.h);az(aR.x,aR.y);H.drawBorders&&av.right.css({left:l(aR.w-1)})&&av.bottom.css({top:l(aR.h-1)});aq&&aH(aR);aB||aP();H.onChange(Y(aR))}function aP(){y.show();al.css("opacity",H.bgOpacity);aB=true}function aL(){aM();y.hide();al.css("opacity",1);aB=false}function ao(){if(aq){aH(aa.getFixed());L.show()}}function aG(){aq=true;if(H.allowResize){aH(aa.getFixed());L.show();return true}}function aM(){aq=false;L.hide()}function aI(aR){(B=aR)?aM():aG()}function aE(){aI(false);at()}var au=ae().mousedown(c("move")).css({cursor:"move",position:"absolute",zIndex:360});k.append(au);aM();return{updateVisible:aN,update:ay,release:aL,refresh:at,setCursor:function(aR){au.css("cursor",aR)},enableHandles:aG,enableOnly:function(){aq=true},showHandles:ao,disableHandles:aM,animMode:aI,done:aE}}();var P=function(){var ap=function(){},ar=function(){},aq=H.trackDocument;if(!aq){b.mousemove(ao).mouseup(at).mouseout(at)}function ax(){b.css({zIndex:450});if(aq){a(document).mousemove(ao).mouseup(at)}}function aw(){b.css({zIndex:290});if(aq){a(document).unbind("mousemove",ao).unbind("mouseup",at)}}function ao(ay){ap(F(ay))}function at(ay){ay.preventDefault();ay.stopPropagation();if(r){r=false;ar(F(ay));H.onSelect(Y(aa.getFixed()));aw();ap=function(){};ar=function(){}}return false}function au(az,ay){r=true;ap=az;ar=ay;ax();return false}function av(ay){b.css("cursor",ay)}al.before(b);return{activateHandlers:au,setCursor:av}}();var ak=function(){var ar=a('').css({position:"absolute",left:"-30px"}).keypress(ao).blur(at),au=a("
    ").css({position:"absolute",overflow:"hidden"}).append(ar);function ap(){if(H.keySupport){ar.show();ar.focus()}}function at(av){ar.hide()}function aq(aw,av,ax){if(H.allowMove){aa.moveOffset([av,ax]);X.updateVisible()}aw.preventDefault();aw.stopPropagation()}function ao(aw){if(aw.ctrlKey){return true}ab=aw.shiftKey?true:false;var av=ab?10:1;switch(aw.keyCode){case 37:aq(aw,-av,0);break;case 39:aq(aw,av,0);break;case 38:aq(aw,0,-av);break;case 40:aq(aw,0,av);break;case 27:X.release();break;case 9:return true}return nothing(aw)}if(H.keySupport){au.insertBefore(al)}return{watchKeys:ap}}();function l(ao){return""+parseInt(ao)+"px"}function K(ao){return""+parseInt(ao)+"%"}function C(ao){return H.baseClass+"-"+ao}function D(ao){var ap=a(ao).offset();return[ap.left,ap.top]}function F(ao){return[(ao.pageX-ad[0]),(ao.pageY-ad[1])]}function E(ao){if(ao!=an){P.setCursor(ao);an=ao}}function f(aq,at){ad=D(al);P.setCursor(aq=="move"?aq:aq+"-resize");if(aq=="move"){return P.activateHandlers(R(at),o)}var ao=aa.getFixed();var ap=q(aq);var ar=aa.getCorner(q(ap));aa.setPressed(aa.getCorner(ap));aa.setCurrent(ar);P.activateHandlers(G(aq,ao),o)}function G(ap,ao){return function(aq){if(!H.aspectRatio){switch(ap){case"e":aq[1]=ao.y2;break;case"w":aq[1]=ao.y2;break;case"n":aq[0]=ao.x2;break;case"s":aq[0]=ao.x2;break}}else{switch(ap){case"e":aq[1]=ao.y+1;break;case"w":aq[1]=ao.y+1;break;case"n":aq[0]=ao.x+1;break;case"s":aq[0]=ao.x+1;break}}aa.setCurrent(aq);X.update()}}function R(ap){var ao=ap;ak.watchKeys();return function(aq){aa.moveOffset([aq[0]-ao[0],aq[1]-ao[1]]);ao=aq;X.update()}}function q(ao){switch(ao){case"n":return"sw";case"s":return"nw";case"e":return"nw";case"w":return"ne";case"ne":return"sw";case"nw":return"se";case"se":return"nw";case"sw":return"ne"}}function c(ao){return function(ap){if(H.disabled){return false}if((ao=="move")&&!H.allowMove){return false}r=true;f(ao,F(ap));ap.stopPropagation();ap.preventDefault();return false}}function T(at,ap,ar){var ao=at.width(),aq=at.height();if((ao>ap)&&ap>0){ao=ap;aq=(ap/at.width())*at.height()}if((aq>ar)&&ar>0){aq=ar;ao=(ar/at.height())*at.width()}M=at.width()/ao;e=at.height()/aq;at.width(ao).height(aq)}function Y(ao){return{x:parseInt(ao.x*M),y:parseInt(ao.y*e),x2:parseInt(ao.x2*M),y2:parseInt(ao.y2*e),w:parseInt(ao.w*M),h:parseInt(ao.h*e)}}function o(ap){var ao=aa.getFixed();if(ao.w>H.minSelect[0]&&ao.h>H.minSelect[1]){X.enableHandles();X.done()}else{X.release()}P.setCursor(H.allowSelect?"crosshair":"default")}function ac(ao){if(H.disabled){return false}if(!H.allowSelect){return false}r=true;ad=D(al);X.disableHandles();E("crosshair");var ap=F(ao);aa.setPressed(ap);P.activateHandlers(aj,o);ak.watchKeys();X.update();ao.stopPropagation();ao.preventDefault();return false}function aj(ao){aa.setCurrent(ao);X.update()}function ae(){var ao=a("
    ").addClass(C("tracker"));a.browser.msie&&ao.css({opacity:0,backgroundColor:"white"});return ao}function s(aG){var aB=aG[0]/M,ap=aG[1]/e,aA=aG[2]/M,ao=aG[3]/e;if(B){return}var az=aa.flipCoords(aB,ap,aA,ao);var aE=aa.getFixed();var ar=initcr=[aE.x,aE.y,aE.x2,aE.y2];var aq=H.animationDelay;var ax=ar[0];var aw=ar[1];var aA=ar[2];var ao=ar[3];var aD=az[0]-initcr[0];var au=az[1]-initcr[1];var aC=az[2]-initcr[2];var at=az[3]-initcr[3];var ay=0;var av=H.swingSpeed;X.animMode(true);var aF=function(){return function(){ay+=(100-ay)/av;ar[0]=ax+((ay/100)*aD);ar[1]=aw+((ay/100)*au);ar[2]=aA+((ay/100)*aC);ar[3]=ao+((ay/100)*at);if(ay<100){aH()}else{X.done()}if(ay>=99.8){ay=100}ai(ar)}}();function aH(){window.setTimeout(aF,aq)}aH()}function J(ao){ai([ao[0]/M,ao[1]/e,ao[2]/M,ao[3]/e])}function ai(ao){aa.setPressed([ao[0],ao[1]]);aa.setCurrent([ao[2],ao[3]]);X.update()}function z(ao){if(typeof(ao)!="object"){ao={}}H=a.extend(H,ao);if(typeof(H.onChange)!=="function"){H.onChange=function(){}}if(typeof(H.onSelect)!=="function"){H.onSelect=function(){}}}function j(){return Y(aa.getFixed())}function ag(){return aa.getFixed()}function u(ao){z(ao);N()}function v(){H.disabled=true;X.disableHandles();X.setCursor("default");P.setCursor("default")}function V(){H.disabled=false;N()}function m(){X.done();P.activateHandlers(null,null)}function af(){Z.remove();W.show()}function N(ao){H.allowResize?ao?X.enableOnly():X.enableHandles():X.disableHandles();P.setCursor(H.allowSelect?"crosshair":"default");X.setCursor(H.allowMove?"move":"default");Z.css("backgroundColor",H.bgColor);if("setSelect" in H){J(A.setSelect);X.done();delete (H.setSelect)}if("trueSize" in H){M=H.trueSize[0]/Q;e=H.trueSize[1]/O}x=H.maxSize[0]||0;ah=H.maxSize[1]||0;p=H.minSize[0]||0;S=H.minSize[1]||0;if("outerImage" in H){al.attr("src",H.outerImage);delete (H.outerImage)}X.refresh()}L.hide();N(true);var g={animateTo:s,setSelect:J,setOptions:u,tellSelect:j,tellScaled:ag,disable:v,enable:V,cancel:m,focus:ak.watchKeys,getBounds:function(){return[Q*M,O*e]},getWidgetSize:function(){return[Q,O]},release:X.release,destroy:af};W.data("Jcrop",g);return g};a.fn.Jcrop=function(c){function b(f){var e=c.useImg||f.src;var d=new Image();d.onload=function(){a.Jcrop(f,c)};d.src=e}if(typeof(c)!=="object"){c={}}this.each(function(){if(a(this).data("Jcrop")){if(c=="api"){return a(this).data("Jcrop")}else{a(this).data("Jcrop").setOptions(c)}}else{b(this)}});return this}})(jQuery); \ No newline at end of file diff --git a/src/wp-includes/js/jquery/jquery.color.dev.js b/src/wp-includes/js/jquery/jquery.color.dev.js new file mode 100644 index 0000000..1dffbd5 --- /dev/null +++ b/src/wp-includes/js/jquery/jquery.color.dev.js @@ -0,0 +1,128 @@ +/* + * jQuery Color Animations + * Copyright 2007 John Resig + * Released under the MIT and GPL licenses. + */ + +(function(jQuery){ + + // We override the animation for all of these color styles + jQuery.each(['backgroundColor', 'borderBottomColor', 'borderLeftColor', 'borderRightColor', 'borderTopColor', 'color', 'outlineColor'], function(i,attr){ + jQuery.fx.step[attr] = function(fx){ + if ( fx.state == 0 ) { + fx.start = getColor( fx.elem, attr ); + fx.end = getRGB( fx.end ); + } + + fx.elem.style[attr] = "rgb(" + [ + Math.max(Math.min( parseInt((fx.pos * (fx.end[0] - fx.start[0])) + fx.start[0]), 255), 0), + Math.max(Math.min( parseInt((fx.pos * (fx.end[1] - fx.start[1])) + fx.start[1]), 255), 0), + Math.max(Math.min( parseInt((fx.pos * (fx.end[2] - fx.start[2])) + fx.start[2]), 255), 0) + ].join(",") + ")"; + } + }); + + // Color Conversion functions from highlightFade + // By Blair Mitchelmore + // http://jquery.offput.ca/highlightFade/ + + // Parse strings looking for color tuples [255,255,255] + function getRGB(color) { + var result; + + // Check if we're already dealing with an array of colors + if ( color && color.constructor == Array && color.length == 3 ) + return color; + + // Look for rgb(num,num,num) + if (result = /rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(color)) + return [parseInt(result[1]), parseInt(result[2]), parseInt(result[3])]; + + // Look for rgb(num%,num%,num%) + if (result = /rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(color)) + return [parseFloat(result[1])*2.55, parseFloat(result[2])*2.55, parseFloat(result[3])*2.55]; + + // Look for #a0b1c2 + if (result = /#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(color)) + return [parseInt(result[1],16), parseInt(result[2],16), parseInt(result[3],16)]; + + // Look for #fff + if (result = /#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(color)) + return [parseInt(result[1]+result[1],16), parseInt(result[2]+result[2],16), parseInt(result[3]+result[3],16)]; + + // Look for rgba(0, 0, 0, 0) == transparent in Safari 3 + if (result = /rgba\(0, 0, 0, 0\)/.exec(color)) + return colors['transparent'] + + // Otherwise, we're most likely dealing with a named color + return colors[jQuery.trim(color).toLowerCase()]; + } + + function getColor(elem, attr) { + var color; + + do { + color = jQuery.curCSS(elem, attr); + + // Keep going until we find an element that has color, or we hit the body + if ( color != '' && color != 'transparent' || jQuery.nodeName(elem, "body") ) + break; + + attr = "backgroundColor"; + } while ( elem = elem.parentNode ); + + return getRGB(color); + }; + + // Some named colors to work with + // From Interface by Stefan Petre + // http://interface.eyecon.ro/ + + var colors = { + aqua:[0,255,255], + azure:[240,255,255], + beige:[245,245,220], + black:[0,0,0], + blue:[0,0,255], + brown:[165,42,42], + cyan:[0,255,255], + darkblue:[0,0,139], + darkcyan:[0,139,139], + darkgrey:[169,169,169], + darkgreen:[0,100,0], + darkkhaki:[189,183,107], + darkmagenta:[139,0,139], + darkolivegreen:[85,107,47], + darkorange:[255,140,0], + darkorchid:[153,50,204], + darkred:[139,0,0], + darksalmon:[233,150,122], + darkviolet:[148,0,211], + fuchsia:[255,0,255], + gold:[255,215,0], + green:[0,128,0], + indigo:[75,0,130], + khaki:[240,230,140], + lightblue:[173,216,230], + lightcyan:[224,255,255], + lightgreen:[144,238,144], + lightgrey:[211,211,211], + lightpink:[255,182,193], + lightyellow:[255,255,224], + lime:[0,255,0], + magenta:[255,0,255], + maroon:[128,0,0], + navy:[0,0,128], + olive:[128,128,0], + orange:[255,165,0], + pink:[255,192,203], + purple:[128,0,128], + violet:[128,0,128], + red:[255,0,0], + silver:[192,192,192], + white:[255,255,255], + yellow:[255,255,0], + transparent: [255,255,255] + }; + +})(jQuery); diff --git a/src/wp-includes/js/jquery/jquery.color.js b/src/wp-includes/js/jquery/jquery.color.js new file mode 100644 index 0000000..03c13f6 --- /dev/null +++ b/src/wp-includes/js/jquery/jquery.color.js @@ -0,0 +1 @@ +(function(d){d.each(["backgroundColor","borderBottomColor","borderLeftColor","borderRightColor","borderTopColor","color","outlineColor"],function(f,e){d.fx.step[e]=function(g){if(g.state==0){g.start=c(g.elem,e);g.end=b(g.end)}g.elem.style[e]="rgb("+[Math.max(Math.min(parseInt((g.pos*(g.end[0]-g.start[0]))+g.start[0]),255),0),Math.max(Math.min(parseInt((g.pos*(g.end[1]-g.start[1]))+g.start[1]),255),0),Math.max(Math.min(parseInt((g.pos*(g.end[2]-g.start[2]))+g.start[2]),255),0)].join(",")+")"}});function b(f){var e;if(f&&f.constructor==Array&&f.length==3){return f}if(e=/rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(f)){return[parseInt(e[1]),parseInt(e[2]),parseInt(e[3])]}if(e=/rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(f)){return[parseFloat(e[1])*2.55,parseFloat(e[2])*2.55,parseFloat(e[3])*2.55]}if(e=/#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(f)){return[parseInt(e[1],16),parseInt(e[2],16),parseInt(e[3],16)]}if(e=/#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(f)){return[parseInt(e[1]+e[1],16),parseInt(e[2]+e[2],16),parseInt(e[3]+e[3],16)]}if(e=/rgba\(0, 0, 0, 0\)/.exec(f)){return a.transparent}return a[d.trim(f).toLowerCase()]}function c(g,e){var f;do{f=d.curCSS(g,e);if(f!=""&&f!="transparent"||d.nodeName(g,"body")){break}e="backgroundColor"}while(g=g.parentNode);return b(f)}var a={aqua:[0,255,255],azure:[240,255,255],beige:[245,245,220],black:[0,0,0],blue:[0,0,255],brown:[165,42,42],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgrey:[169,169,169],darkgreen:[0,100,0],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkviolet:[148,0,211],fuchsia:[255,0,255],gold:[255,215,0],green:[0,128,0],indigo:[75,0,130],khaki:[240,230,140],lightblue:[173,216,230],lightcyan:[224,255,255],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightyellow:[255,255,224],lime:[0,255,0],magenta:[255,0,255],maroon:[128,0,0],navy:[0,0,128],olive:[128,128,0],orange:[255,165,0],pink:[255,192,203],purple:[128,0,128],violet:[128,0,128],red:[255,0,0],silver:[192,192,192],white:[255,255,255],yellow:[255,255,0],transparent:[255,255,255]}})(jQuery); \ No newline at end of file diff --git a/src/wp-includes/js/jquery/jquery.form.dev.js b/src/wp-includes/js/jquery/jquery.form.dev.js new file mode 100644 index 0000000..0065807 --- /dev/null +++ b/src/wp-includes/js/jquery/jquery.form.dev.js @@ -0,0 +1,826 @@ +/*! + * jQuery Form Plugin + * version: 2.73 (03-MAY-2011) + * @requires jQuery v1.3.2 or later + * + * Examples and documentation at: http://malsup.com/jquery/form/ + * Dual licensed under the MIT and GPL licenses: + * http://www.opensource.org/licenses/mit-license.php + * http://www.gnu.org/licenses/gpl.html + */ +;(function($) { + +/* + Usage Note: + ----------- + Do not use both ajaxSubmit and ajaxForm on the same form. These + functions are intended to be exclusive. Use ajaxSubmit if you want + to bind your own submit handler to the form. For example, + + $(document).ready(function() { + $('#myForm').bind('submit', function(e) { + e.preventDefault(); // <-- important + $(this).ajaxSubmit({ + target: '#output' + }); + }); + }); + + Use ajaxForm when you want the plugin to manage all the event binding + for you. For example, + + $(document).ready(function() { + $('#myForm').ajaxForm({ + target: '#output' + }); + }); + + When using ajaxForm, the ajaxSubmit function will be invoked for you + at the appropriate time. +*/ + +/** + * ajaxSubmit() provides a mechanism for immediately submitting + * an HTML form using AJAX. + */ +$.fn.ajaxSubmit = function(options) { + // fast fail if nothing selected (http://dev.jquery.com/ticket/2752) + if (!this.length) { + log('ajaxSubmit: skipping submit process - no element selected'); + return this; + } + + if (typeof options == 'function') { + options = { success: options }; + } + + var action = this.attr('action'); + var url = (typeof action === 'string') ? $.trim(action) : ''; + if (url) { + // clean url (don't include hash vaue) + url = (url.match(/^([^#]+)/)||[])[1]; + } + url = url || window.location.href || ''; + + options = $.extend(true, { + url: url, + success: $.ajaxSettings.success, + type: this[0].getAttribute('method') || 'GET', // IE7 massage (see issue 57) + iframeSrc: /^https/i.test(window.location.href || '') ? 'javascript:false' : 'about:blank' + }, options); + + // hook for manipulating the form data before it is extracted; + // convenient for use with rich editors like tinyMCE or FCKEditor + var veto = {}; + this.trigger('form-pre-serialize', [this, options, veto]); + if (veto.veto) { + log('ajaxSubmit: submit vetoed via form-pre-serialize trigger'); + return this; + } + + // provide opportunity to alter form data before it is serialized + if (options.beforeSerialize && options.beforeSerialize(this, options) === false) { + log('ajaxSubmit: submit aborted via beforeSerialize callback'); + return this; + } + + var n,v,a = this.formToArray(options.semantic); + if (options.data) { + options.extraData = options.data; + for (n in options.data) { + if(options.data[n] instanceof Array) { + for (var k in options.data[n]) { + a.push( { name: n, value: options.data[n][k] } ); + } + } + else { + v = options.data[n]; + v = $.isFunction(v) ? v() : v; // if value is fn, invoke it + a.push( { name: n, value: v } ); + } + } + } + + // give pre-submit callback an opportunity to abort the submit + if (options.beforeSubmit && options.beforeSubmit(a, this, options) === false) { + log('ajaxSubmit: submit aborted via beforeSubmit callback'); + return this; + } + + // fire vetoable 'validate' event + this.trigger('form-submit-validate', [a, this, options, veto]); + if (veto.veto) { + log('ajaxSubmit: submit vetoed via form-submit-validate trigger'); + return this; + } + + var q = $.param(a); + + if (options.type.toUpperCase() == 'GET') { + options.url += (options.url.indexOf('?') >= 0 ? '&' : '?') + q; + options.data = null; // data is null for 'get' + } + else { + options.data = q; // data is the query string for 'post' + } + + var $form = this, callbacks = []; + if (options.resetForm) { + callbacks.push(function() { $form.resetForm(); }); + } + if (options.clearForm) { + callbacks.push(function() { $form.clearForm(); }); + } + + // perform a load on the target only if dataType is not provided + if (!options.dataType && options.target) { + var oldSuccess = options.success || function(){}; + callbacks.push(function(data) { + var fn = options.replaceTarget ? 'replaceWith' : 'html'; + $(options.target)[fn](data).each(oldSuccess, arguments); + }); + } + else if (options.success) { + callbacks.push(options.success); + } + + options.success = function(data, status, xhr) { // jQuery 1.4+ passes xhr as 3rd arg + var context = options.context || options; // jQuery 1.4+ supports scope context + for (var i=0, max=callbacks.length; i < max; i++) { + callbacks[i].apply(context, [data, status, xhr || $form, $form]); + } + }; + + // are there files to upload? + var fileInputs = $('input:file', this).length > 0; + var mp = 'multipart/form-data'; + var multipart = ($form.attr('enctype') == mp || $form.attr('encoding') == mp); + + // options.iframe allows user to force iframe mode + // 06-NOV-09: now defaulting to iframe mode if file input is detected + if (options.iframe !== false && (fileInputs || options.iframe || multipart)) { + // hack to fix Safari hang (thanks to Tim Molendijk for this) + // see: http://groups.google.com/group/jquery-dev/browse_thread/thread/36395b7ab510dd5d + if (options.closeKeepAlive) { + $.get(options.closeKeepAlive, fileUpload); + } + else { + fileUpload(); + } + } + else { + $.ajax(options); + } + + // fire 'notify' event + this.trigger('form-submit-notify', [this, options]); + return this; + + + // private function for handling file uploads (hat tip to YAHOO!) + function fileUpload() { + var form = $form[0]; + + if ($(':input[name=submit],:input[id=submit]', form).length) { + // if there is an input with a name or id of 'submit' then we won't be + // able to invoke the submit fn on the form (at least not x-browser) + alert('Error: Form elements must not have name or id of "submit".'); + return; + } + + var s = $.extend(true, {}, $.ajaxSettings, options); + s.context = s.context || s; + var id = 'jqFormIO' + (new Date().getTime()), fn = '_'+id; + var $io = $(''); + this.iefix = $(this.update.id+'_iefix'); + } + if(this.iefix) setTimeout(this.fixIEOverlapping.bind(this), 50); + }, + + fixIEOverlapping: function() { + Position.clone(this.update, this.iefix, {setTop:(!this.update.style.height)}); + this.iefix.style.zIndex = 1; + this.update.style.zIndex = 2; + Element.show(this.iefix); + }, + + hide: function() { + this.stopIndicator(); + if(Element.getStyle(this.update, 'display')!='none') this.options.onHide(this.element, this.update); + if(this.iefix) Element.hide(this.iefix); + }, + + startIndicator: function() { + if(this.options.indicator) Element.show(this.options.indicator); + }, + + stopIndicator: function() { + if(this.options.indicator) Element.hide(this.options.indicator); + }, + + onKeyPress: function(event) { + if(this.active) + switch(event.keyCode) { + case Event.KEY_TAB: + case Event.KEY_RETURN: + this.selectEntry(); + Event.stop(event); + case Event.KEY_ESC: + this.hide(); + this.active = false; + Event.stop(event); + return; + case Event.KEY_LEFT: + case Event.KEY_RIGHT: + return; + case Event.KEY_UP: + this.markPrevious(); + this.render(); + Event.stop(event); + return; + case Event.KEY_DOWN: + this.markNext(); + this.render(); + Event.stop(event); + return; + } + else + if(event.keyCode==Event.KEY_TAB || event.keyCode==Event.KEY_RETURN || + (Prototype.Browser.WebKit > 0 && event.keyCode == 0)) return; + + this.changed = true; + this.hasFocus = true; + + if(this.observer) clearTimeout(this.observer); + this.observer = + setTimeout(this.onObserverEvent.bind(this), this.options.frequency*1000); + }, + + activate: function() { + this.changed = false; + this.hasFocus = true; + this.getUpdatedChoices(); + }, + + onHover: function(event) { + var element = Event.findElement(event, 'LI'); + if(this.index != element.autocompleteIndex) + { + this.index = element.autocompleteIndex; + this.render(); + } + Event.stop(event); + }, + + onClick: function(event) { + var element = Event.findElement(event, 'LI'); + this.index = element.autocompleteIndex; + this.selectEntry(); + this.hide(); + }, + + onBlur: function(event) { + // needed to make click events working + setTimeout(this.hide.bind(this), 250); + this.hasFocus = false; + this.active = false; + }, + + render: function() { + if(this.entryCount > 0) { + for (var i = 0; i < this.entryCount; i++) + this.index==i ? + Element.addClassName(this.getEntry(i),"selected") : + Element.removeClassName(this.getEntry(i),"selected"); + if(this.hasFocus) { + this.show(); + this.active = true; + } + } else { + this.active = false; + this.hide(); + } + }, + + markPrevious: function() { + if(this.index > 0) this.index--; + else this.index = this.entryCount-1; + this.getEntry(this.index).scrollIntoView(true); + }, + + markNext: function() { + if(this.index < this.entryCount-1) this.index++; + else this.index = 0; + this.getEntry(this.index).scrollIntoView(false); + }, + + getEntry: function(index) { + return this.update.firstChild.childNodes[index]; + }, + + getCurrentEntry: function() { + return this.getEntry(this.index); + }, + + selectEntry: function() { + this.active = false; + this.updateElement(this.getCurrentEntry()); + }, + + updateElement: function(selectedElement) { + if (this.options.updateElement) { + this.options.updateElement(selectedElement); + return; + } + var value = ''; + if (this.options.select) { + var nodes = $(selectedElement).select('.' + this.options.select) || []; + if(nodes.length>0) value = Element.collectTextNodes(nodes[0], this.options.select); + } else + value = Element.collectTextNodesIgnoreClass(selectedElement, 'informal'); + + var bounds = this.getTokenBounds(); + if (bounds[0] != -1) { + var newValue = this.element.value.substr(0, bounds[0]); + var whitespace = this.element.value.substr(bounds[0]).match(/^\s+/); + if (whitespace) + newValue += whitespace[0]; + this.element.value = newValue + value + this.element.value.substr(bounds[1]); + } else { + this.element.value = value; + } + this.oldElementValue = this.element.value; + this.element.focus(); + + if (this.options.afterUpdateElement) + this.options.afterUpdateElement(this.element, selectedElement); + }, + + updateChoices: function(choices) { + if(!this.changed && this.hasFocus) { + this.update.innerHTML = choices; + Element.cleanWhitespace(this.update); + Element.cleanWhitespace(this.update.down()); + + if(this.update.firstChild && this.update.down().childNodes) { + this.entryCount = + this.update.down().childNodes.length; + for (var i = 0; i < this.entryCount; i++) { + var entry = this.getEntry(i); + entry.autocompleteIndex = i; + this.addObservers(entry); + } + } else { + this.entryCount = 0; + } + + this.stopIndicator(); + this.index = 0; + + if(this.entryCount==1 && this.options.autoSelect) { + this.selectEntry(); + this.hide(); + } else { + this.render(); + } + } + }, + + addObservers: function(element) { + Event.observe(element, "mouseover", this.onHover.bindAsEventListener(this)); + Event.observe(element, "click", this.onClick.bindAsEventListener(this)); + }, + + onObserverEvent: function() { + this.changed = false; + this.tokenBounds = null; + if(this.getToken().length>=this.options.minChars) { + this.getUpdatedChoices(); + } else { + this.active = false; + this.hide(); + } + this.oldElementValue = this.element.value; + }, + + getToken: function() { + var bounds = this.getTokenBounds(); + return this.element.value.substring(bounds[0], bounds[1]).strip(); + }, + + getTokenBounds: function() { + if (null != this.tokenBounds) return this.tokenBounds; + var value = this.element.value; + if (value.strip().empty()) return [-1, 0]; + var diff = arguments.callee.getFirstDifferencePos(value, this.oldElementValue); + var offset = (diff == this.oldElementValue.length ? 1 : 0); + var prevTokenPos = -1, nextTokenPos = value.length; + var tp; + for (var index = 0, l = this.options.tokens.length; index < l; ++index) { + tp = value.lastIndexOf(this.options.tokens[index], diff + offset - 1); + if (tp > prevTokenPos) prevTokenPos = tp; + tp = value.indexOf(this.options.tokens[index], diff + offset); + if (-1 != tp && tp < nextTokenPos) nextTokenPos = tp; + } + return (this.tokenBounds = [prevTokenPos + 1, nextTokenPos]); + } +}); + +Autocompleter.Base.prototype.getTokenBounds.getFirstDifferencePos = function(newS, oldS) { + var boundary = Math.min(newS.length, oldS.length); + for (var index = 0; index < boundary; ++index) + if (newS[index] != oldS[index]) + return index; + return boundary; +}; + +Ajax.Autocompleter = Class.create(Autocompleter.Base, { + initialize: function(element, update, url, options) { + this.baseInitialize(element, update, options); + this.options.asynchronous = true; + this.options.onComplete = this.onComplete.bind(this); + this.options.defaultParams = this.options.parameters || null; + this.url = url; + }, + + getUpdatedChoices: function() { + this.startIndicator(); + + var entry = encodeURIComponent(this.options.paramName) + '=' + + encodeURIComponent(this.getToken()); + + this.options.parameters = this.options.callback ? + this.options.callback(this.element, entry) : entry; + + if(this.options.defaultParams) + this.options.parameters += '&' + this.options.defaultParams; + + new Ajax.Request(this.url, this.options); + }, + + onComplete: function(request) { + this.updateChoices(request.responseText); + } +}); + +// The local array autocompleter. Used when you'd prefer to +// inject an array of autocompletion options into the page, rather +// than sending out Ajax queries, which can be quite slow sometimes. +// +// The constructor takes four parameters. The first two are, as usual, +// the id of the monitored textbox, and id of the autocompletion menu. +// The third is the array you want to autocomplete from, and the fourth +// is the options block. +// +// Extra local autocompletion options: +// - choices - How many autocompletion choices to offer +// +// - partialSearch - If false, the autocompleter will match entered +// text only at the beginning of strings in the +// autocomplete array. Defaults to true, which will +// match text at the beginning of any *word* in the +// strings in the autocomplete array. If you want to +// search anywhere in the string, additionally set +// the option fullSearch to true (default: off). +// +// - fullSsearch - Search anywhere in autocomplete array strings. +// +// - partialChars - How many characters to enter before triggering +// a partial match (unlike minChars, which defines +// how many characters are required to do any match +// at all). Defaults to 2. +// +// - ignoreCase - Whether to ignore case when autocompleting. +// Defaults to true. +// +// It's possible to pass in a custom function as the 'selector' +// option, if you prefer to write your own autocompletion logic. +// In that case, the other options above will not apply unless +// you support them. + +Autocompleter.Local = Class.create(Autocompleter.Base, { + initialize: function(element, update, array, options) { + this.baseInitialize(element, update, options); + this.options.array = array; + }, + + getUpdatedChoices: function() { + this.updateChoices(this.options.selector(this)); + }, + + setOptions: function(options) { + this.options = Object.extend({ + choices: 10, + partialSearch: true, + partialChars: 2, + ignoreCase: true, + fullSearch: false, + selector: function(instance) { + var ret = []; // Beginning matches + var partial = []; // Inside matches + var entry = instance.getToken(); + var count = 0; + + for (var i = 0; i < instance.options.array.length && + ret.length < instance.options.choices ; i++) { + + var elem = instance.options.array[i]; + var foundPos = instance.options.ignoreCase ? + elem.toLowerCase().indexOf(entry.toLowerCase()) : + elem.indexOf(entry); + + while (foundPos != -1) { + if (foundPos == 0 && elem.length != entry.length) { + ret.push("
  • " + elem.substr(0, entry.length) + "" + + elem.substr(entry.length) + "
  • "); + break; + } else if (entry.length >= instance.options.partialChars && + instance.options.partialSearch && foundPos != -1) { + if (instance.options.fullSearch || /\s/.test(elem.substr(foundPos-1,1))) { + partial.push("
  • " + elem.substr(0, foundPos) + "" + + elem.substr(foundPos, entry.length) + "" + elem.substr( + foundPos + entry.length) + "
  • "); + break; + } + } + + foundPos = instance.options.ignoreCase ? + elem.toLowerCase().indexOf(entry.toLowerCase(), foundPos + 1) : + elem.indexOf(entry, foundPos + 1); + + } + } + if (partial.length) + ret = ret.concat(partial.slice(0, instance.options.choices - ret.length)); + return "
      " + ret.join('') + "
    "; + } + }, options || { }); + } +}); + +// AJAX in-place editor and collection editor +// Full rewrite by Christophe Porteneuve (April 2007). + +// Use this if you notice weird scrolling problems on some browsers, +// the DOM might be a bit confused when this gets called so do this +// waits 1 ms (with setTimeout) until it does the activation +Field.scrollFreeActivate = function(field) { + setTimeout(function() { + Field.activate(field); + }, 1); +}; + +Ajax.InPlaceEditor = Class.create({ + initialize: function(element, url, options) { + this.url = url; + this.element = element = $(element); + this.prepareOptions(); + this._controls = { }; + arguments.callee.dealWithDeprecatedOptions(options); // DEPRECATION LAYER!!! + Object.extend(this.options, options || { }); + if (!this.options.formId && this.element.id) { + this.options.formId = this.element.id + '-inplaceeditor'; + if ($(this.options.formId)) + this.options.formId = ''; + } + if (this.options.externalControl) + this.options.externalControl = $(this.options.externalControl); + if (!this.options.externalControl) + this.options.externalControlOnly = false; + this._originalBackground = this.element.getStyle('background-color') || 'transparent'; + this.element.title = this.options.clickToEditText; + this._boundCancelHandler = this.handleFormCancellation.bind(this); + this._boundComplete = (this.options.onComplete || Prototype.emptyFunction).bind(this); + this._boundFailureHandler = this.handleAJAXFailure.bind(this); + this._boundSubmitHandler = this.handleFormSubmission.bind(this); + this._boundWrapperHandler = this.wrapUp.bind(this); + this.registerListeners(); + }, + checkForEscapeOrReturn: function(e) { + if (!this._editing || e.ctrlKey || e.altKey || e.shiftKey) return; + if (Event.KEY_ESC == e.keyCode) + this.handleFormCancellation(e); + else if (Event.KEY_RETURN == e.keyCode) + this.handleFormSubmission(e); + }, + createControl: function(mode, handler, extraClasses) { + var control = this.options[mode + 'Control']; + var text = this.options[mode + 'Text']; + if ('button' == control) { + var btn = document.createElement('input'); + btn.type = 'submit'; + btn.value = text; + btn.className = 'editor_' + mode + '_button'; + if ('cancel' == mode) + btn.onclick = this._boundCancelHandler; + this._form.appendChild(btn); + this._controls[mode] = btn; + } else if ('link' == control) { + var link = document.createElement('a'); + link.href = '#'; + link.appendChild(document.createTextNode(text)); + link.onclick = 'cancel' == mode ? this._boundCancelHandler : this._boundSubmitHandler; + link.className = 'editor_' + mode + '_link'; + if (extraClasses) + link.className += ' ' + extraClasses; + this._form.appendChild(link); + this._controls[mode] = link; + } + }, + createEditField: function() { + var text = (this.options.loadTextURL ? this.options.loadingText : this.getText()); + var fld; + if (1 >= this.options.rows && !/\r|\n/.test(this.getText())) { + fld = document.createElement('input'); + fld.type = 'text'; + var size = this.options.size || this.options.cols || 0; + if (0 < size) fld.size = size; + } else { + fld = document.createElement('textarea'); + fld.rows = (1 >= this.options.rows ? this.options.autoRows : this.options.rows); + fld.cols = this.options.cols || 40; + } + fld.name = this.options.paramName; + fld.value = text; // No HTML breaks conversion anymore + fld.className = 'editor_field'; + if (this.options.submitOnBlur) + fld.onblur = this._boundSubmitHandler; + this._controls.editor = fld; + if (this.options.loadTextURL) + this.loadExternalText(); + this._form.appendChild(this._controls.editor); + }, + createForm: function() { + var ipe = this; + function addText(mode, condition) { + var text = ipe.options['text' + mode + 'Controls']; + if (!text || condition === false) return; + ipe._form.appendChild(document.createTextNode(text)); + }; + this._form = $(document.createElement('form')); + this._form.id = this.options.formId; + this._form.addClassName(this.options.formClassName); + this._form.onsubmit = this._boundSubmitHandler; + this.createEditField(); + if ('textarea' == this._controls.editor.tagName.toLowerCase()) + this._form.appendChild(document.createElement('br')); + if (this.options.onFormCustomization) + this.options.onFormCustomization(this, this._form); + addText('Before', this.options.okControl || this.options.cancelControl); + this.createControl('ok', this._boundSubmitHandler); + addText('Between', this.options.okControl && this.options.cancelControl); + this.createControl('cancel', this._boundCancelHandler, 'editor_cancel'); + addText('After', this.options.okControl || this.options.cancelControl); + }, + destroy: function() { + if (this._oldInnerHTML) + this.element.innerHTML = this._oldInnerHTML; + this.leaveEditMode(); + this.unregisterListeners(); + }, + enterEditMode: function(e) { + if (this._saving || this._editing) return; + this._editing = true; + this.triggerCallback('onEnterEditMode'); + if (this.options.externalControl) + this.options.externalControl.hide(); + this.element.hide(); + this.createForm(); + this.element.parentNode.insertBefore(this._form, this.element); + if (!this.options.loadTextURL) + this.postProcessEditField(); + if (e) Event.stop(e); + }, + enterHover: function(e) { + if (this.options.hoverClassName) + this.element.addClassName(this.options.hoverClassName); + if (this._saving) return; + this.triggerCallback('onEnterHover'); + }, + getText: function() { + return this.element.innerHTML.unescapeHTML(); + }, + handleAJAXFailure: function(transport) { + this.triggerCallback('onFailure', transport); + if (this._oldInnerHTML) { + this.element.innerHTML = this._oldInnerHTML; + this._oldInnerHTML = null; + } + }, + handleFormCancellation: function(e) { + this.wrapUp(); + if (e) Event.stop(e); + }, + handleFormSubmission: function(e) { + var form = this._form; + var value = $F(this._controls.editor); + this.prepareSubmission(); + var params = this.options.callback(form, value) || ''; + if (Object.isString(params)) + params = params.toQueryParams(); + params.editorId = this.element.id; + if (this.options.htmlResponse) { + var options = Object.extend({ evalScripts: true }, this.options.ajaxOptions); + Object.extend(options, { + parameters: params, + onComplete: this._boundWrapperHandler, + onFailure: this._boundFailureHandler + }); + new Ajax.Updater({ success: this.element }, this.url, options); + } else { + var options = Object.extend({ method: 'get' }, this.options.ajaxOptions); + Object.extend(options, { + parameters: params, + onComplete: this._boundWrapperHandler, + onFailure: this._boundFailureHandler + }); + new Ajax.Request(this.url, options); + } + if (e) Event.stop(e); + }, + leaveEditMode: function() { + this.element.removeClassName(this.options.savingClassName); + this.removeForm(); + this.leaveHover(); + this.element.style.backgroundColor = this._originalBackground; + this.element.show(); + if (this.options.externalControl) + this.options.externalControl.show(); + this._saving = false; + this._editing = false; + this._oldInnerHTML = null; + this.triggerCallback('onLeaveEditMode'); + }, + leaveHover: function(e) { + if (this.options.hoverClassName) + this.element.removeClassName(this.options.hoverClassName); + if (this._saving) return; + this.triggerCallback('onLeaveHover'); + }, + loadExternalText: function() { + this._form.addClassName(this.options.loadingClassName); + this._controls.editor.disabled = true; + var options = Object.extend({ method: 'get' }, this.options.ajaxOptions); + Object.extend(options, { + parameters: 'editorId=' + encodeURIComponent(this.element.id), + onComplete: Prototype.emptyFunction, + onSuccess: function(transport) { + this._form.removeClassName(this.options.loadingClassName); + var text = transport.responseText; + if (this.options.stripLoadedTextTags) + text = text.stripTags(); + this._controls.editor.value = text; + this._controls.editor.disabled = false; + this.postProcessEditField(); + }.bind(this), + onFailure: this._boundFailureHandler + }); + new Ajax.Request(this.options.loadTextURL, options); + }, + postProcessEditField: function() { + var fpc = this.options.fieldPostCreation; + if (fpc) + $(this._controls.editor)['focus' == fpc ? 'focus' : 'activate'](); + }, + prepareOptions: function() { + this.options = Object.clone(Ajax.InPlaceEditor.DefaultOptions); + Object.extend(this.options, Ajax.InPlaceEditor.DefaultCallbacks); + [this._extraDefaultOptions].flatten().compact().each(function(defs) { + Object.extend(this.options, defs); + }.bind(this)); + }, + prepareSubmission: function() { + this._saving = true; + this.removeForm(); + this.leaveHover(); + this.showSaving(); + }, + registerListeners: function() { + this._listeners = { }; + var listener; + $H(Ajax.InPlaceEditor.Listeners).each(function(pair) { + listener = this[pair.value].bind(this); + this._listeners[pair.key] = listener; + if (!this.options.externalControlOnly) + this.element.observe(pair.key, listener); + if (this.options.externalControl) + this.options.externalControl.observe(pair.key, listener); + }.bind(this)); + }, + removeForm: function() { + if (!this._form) return; + this._form.remove(); + this._form = null; + this._controls = { }; + }, + showSaving: function() { + this._oldInnerHTML = this.element.innerHTML; + this.element.innerHTML = this.options.savingText; + this.element.addClassName(this.options.savingClassName); + this.element.style.backgroundColor = this._originalBackground; + this.element.show(); + }, + triggerCallback: function(cbName, arg) { + if ('function' == typeof this.options[cbName]) { + this.options[cbName](this, arg); + } + }, + unregisterListeners: function() { + $H(this._listeners).each(function(pair) { + if (!this.options.externalControlOnly) + this.element.stopObserving(pair.key, pair.value); + if (this.options.externalControl) + this.options.externalControl.stopObserving(pair.key, pair.value); + }.bind(this)); + }, + wrapUp: function(transport) { + this.leaveEditMode(); + // Can't use triggerCallback due to backward compatibility: requires + // binding + direct element + this._boundComplete(transport, this.element); + } +}); + +Object.extend(Ajax.InPlaceEditor.prototype, { + dispose: Ajax.InPlaceEditor.prototype.destroy +}); + +Ajax.InPlaceCollectionEditor = Class.create(Ajax.InPlaceEditor, { + initialize: function($super, element, url, options) { + this._extraDefaultOptions = Ajax.InPlaceCollectionEditor.DefaultOptions; + $super(element, url, options); + }, + + createEditField: function() { + var list = document.createElement('select'); + list.name = this.options.paramName; + list.size = 1; + this._controls.editor = list; + this._collection = this.options.collection || []; + if (this.options.loadCollectionURL) + this.loadCollection(); + else + this.checkForExternalText(); + this._form.appendChild(this._controls.editor); + }, + + loadCollection: function() { + this._form.addClassName(this.options.loadingClassName); + this.showLoadingText(this.options.loadingCollectionText); + var options = Object.extend({ method: 'get' }, this.options.ajaxOptions); + Object.extend(options, { + parameters: 'editorId=' + encodeURIComponent(this.element.id), + onComplete: Prototype.emptyFunction, + onSuccess: function(transport) { + var js = transport.responseText.strip(); + if (!/^\[.*\]$/.test(js)) // TODO: improve sanity check + throw('Server returned an invalid collection representation.'); + this._collection = eval(js); + this.checkForExternalText(); + }.bind(this), + onFailure: this.onFailure + }); + new Ajax.Request(this.options.loadCollectionURL, options); + }, + + showLoadingText: function(text) { + this._controls.editor.disabled = true; + var tempOption = this._controls.editor.firstChild; + if (!tempOption) { + tempOption = document.createElement('option'); + tempOption.value = ''; + this._controls.editor.appendChild(tempOption); + tempOption.selected = true; + } + tempOption.update((text || '').stripScripts().stripTags()); + }, + + checkForExternalText: function() { + this._text = this.getText(); + if (this.options.loadTextURL) + this.loadExternalText(); + else + this.buildOptionList(); + }, + + loadExternalText: function() { + this.showLoadingText(this.options.loadingText); + var options = Object.extend({ method: 'get' }, this.options.ajaxOptions); + Object.extend(options, { + parameters: 'editorId=' + encodeURIComponent(this.element.id), + onComplete: Prototype.emptyFunction, + onSuccess: function(transport) { + this._text = transport.responseText.strip(); + this.buildOptionList(); + }.bind(this), + onFailure: this.onFailure + }); + new Ajax.Request(this.options.loadTextURL, options); + }, + + buildOptionList: function() { + this._form.removeClassName(this.options.loadingClassName); + this._collection = this._collection.map(function(entry) { + return 2 === entry.length ? entry : [entry, entry].flatten(); + }); + var marker = ('value' in this.options) ? this.options.value : this._text; + var textFound = this._collection.any(function(entry) { + return entry[0] == marker; + }.bind(this)); + this._controls.editor.update(''); + var option; + this._collection.each(function(entry, index) { + option = document.createElement('option'); + option.value = entry[0]; + option.selected = textFound ? entry[0] == marker : 0 == index; + option.appendChild(document.createTextNode(entry[1])); + this._controls.editor.appendChild(option); + }.bind(this)); + this._controls.editor.disabled = false; + Field.scrollFreeActivate(this._controls.editor); + } +}); + +//**** DEPRECATION LAYER FOR InPlace[Collection]Editor! **** +//**** This only exists for a while, in order to let **** +//**** users adapt to the new API. Read up on the new **** +//**** API and convert your code to it ASAP! **** + +Ajax.InPlaceEditor.prototype.initialize.dealWithDeprecatedOptions = function(options) { + if (!options) return; + function fallback(name, expr) { + if (name in options || expr === undefined) return; + options[name] = expr; + }; + fallback('cancelControl', (options.cancelLink ? 'link' : (options.cancelButton ? 'button' : + options.cancelLink == options.cancelButton == false ? false : undefined))); + fallback('okControl', (options.okLink ? 'link' : (options.okButton ? 'button' : + options.okLink == options.okButton == false ? false : undefined))); + fallback('highlightColor', options.highlightcolor); + fallback('highlightEndColor', options.highlightendcolor); +}; + +Object.extend(Ajax.InPlaceEditor, { + DefaultOptions: { + ajaxOptions: { }, + autoRows: 3, // Use when multi-line w/ rows == 1 + cancelControl: 'link', // 'link'|'button'|false + cancelText: 'cancel', + clickToEditText: 'Click to edit', + externalControl: null, // id|elt + externalControlOnly: false, + fieldPostCreation: 'activate', // 'activate'|'focus'|false + formClassName: 'inplaceeditor-form', + formId: null, // id|elt + highlightColor: '#ffff99', + highlightEndColor: '#ffffff', + hoverClassName: '', + htmlResponse: true, + loadingClassName: 'inplaceeditor-loading', + loadingText: 'Loading...', + okControl: 'button', // 'link'|'button'|false + okText: 'ok', + paramName: 'value', + rows: 1, // If 1 and multi-line, uses autoRows + savingClassName: 'inplaceeditor-saving', + savingText: 'Saving...', + size: 0, + stripLoadedTextTags: false, + submitOnBlur: false, + textAfterControls: '', + textBeforeControls: '', + textBetweenControls: '' + }, + DefaultCallbacks: { + callback: function(form) { + return Form.serialize(form); + }, + onComplete: function(transport, element) { + // For backward compatibility, this one is bound to the IPE, and passes + // the element directly. It was too often customized, so we don't break it. + new Effect.Highlight(element, { + startcolor: this.options.highlightColor, keepBackgroundImage: true }); + }, + onEnterEditMode: null, + onEnterHover: function(ipe) { + ipe.element.style.backgroundColor = ipe.options.highlightColor; + if (ipe._effect) + ipe._effect.cancel(); + }, + onFailure: function(transport, ipe) { + alert('Error communication with the server: ' + transport.responseText.stripTags()); + }, + onFormCustomization: null, // Takes the IPE and its generated form, after editor, before controls. + onLeaveEditMode: null, + onLeaveHover: function(ipe) { + ipe._effect = new Effect.Highlight(ipe.element, { + startcolor: ipe.options.highlightColor, endcolor: ipe.options.highlightEndColor, + restorecolor: ipe._originalBackground, keepBackgroundImage: true + }); + } + }, + Listeners: { + click: 'enterEditMode', + keydown: 'checkForEscapeOrReturn', + mouseover: 'enterHover', + mouseout: 'leaveHover' + } +}); + +Ajax.InPlaceCollectionEditor.DefaultOptions = { + loadingCollectionText: 'Loading options...' +}; + +// Delayed observer, like Form.Element.Observer, +// but waits for delay after last key input +// Ideal for live-search fields + +Form.Element.DelayedObserver = Class.create({ + initialize: function(element, delay, callback) { + this.delay = delay || 0.5; + this.element = $(element); + this.callback = callback; + this.timer = null; + this.lastValue = $F(this.element); + Event.observe(this.element,'keyup',this.delayedListener.bindAsEventListener(this)); + }, + delayedListener: function(event) { + if(this.lastValue == $F(this.element)) return; + if(this.timer) clearTimeout(this.timer); + this.timer = setTimeout(this.onTimerEvent.bind(this), this.delay * 1000); + this.lastValue = $F(this.element); + }, + onTimerEvent: function() { + this.timer = null; + this.callback(this.element, $F(this.element)); + } +}); \ No newline at end of file diff --git a/src/wp-includes/js/scriptaculous/dragdrop.js b/src/wp-includes/js/scriptaculous/dragdrop.js new file mode 100644 index 0000000..15c6dbc --- /dev/null +++ b/src/wp-includes/js/scriptaculous/dragdrop.js @@ -0,0 +1,974 @@ +// script.aculo.us dragdrop.js v1.8.3, Thu Oct 08 11:23:33 +0200 2009 + +// Copyright (c) 2005-2009 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us) +// +// script.aculo.us is freely distributable under the terms of an MIT-style license. +// For details, see the script.aculo.us web site: http://script.aculo.us/ + +if(Object.isUndefined(Effect)) + throw("dragdrop.js requires including script.aculo.us' effects.js library"); + +var Droppables = { + drops: [], + + remove: function(element) { + this.drops = this.drops.reject(function(d) { return d.element==$(element) }); + }, + + add: function(element) { + element = $(element); + var options = Object.extend({ + greedy: true, + hoverclass: null, + tree: false + }, arguments[1] || { }); + + // cache containers + if(options.containment) { + options._containers = []; + var containment = options.containment; + if(Object.isArray(containment)) { + containment.each( function(c) { options._containers.push($(c)) }); + } else { + options._containers.push($(containment)); + } + } + + if(options.accept) options.accept = [options.accept].flatten(); + + Element.makePositioned(element); // fix IE + options.element = element; + + this.drops.push(options); + }, + + findDeepestChild: function(drops) { + deepest = drops[0]; + + for (i = 1; i < drops.length; ++i) + if (Element.isParent(drops[i].element, deepest.element)) + deepest = drops[i]; + + return deepest; + }, + + isContained: function(element, drop) { + var containmentNode; + if(drop.tree) { + containmentNode = element.treeNode; + } else { + containmentNode = element.parentNode; + } + return drop._containers.detect(function(c) { return containmentNode == c }); + }, + + isAffected: function(point, element, drop) { + return ( + (drop.element!=element) && + ((!drop._containers) || + this.isContained(element, drop)) && + ((!drop.accept) || + (Element.classNames(element).detect( + function(v) { return drop.accept.include(v) } ) )) && + Position.within(drop.element, point[0], point[1]) ); + }, + + deactivate: function(drop) { + if(drop.hoverclass) + Element.removeClassName(drop.element, drop.hoverclass); + this.last_active = null; + }, + + activate: function(drop) { + if(drop.hoverclass) + Element.addClassName(drop.element, drop.hoverclass); + this.last_active = drop; + }, + + show: function(point, element) { + if(!this.drops.length) return; + var drop, affected = []; + + this.drops.each( function(drop) { + if(Droppables.isAffected(point, element, drop)) + affected.push(drop); + }); + + if(affected.length>0) + drop = Droppables.findDeepestChild(affected); + + if(this.last_active && this.last_active != drop) this.deactivate(this.last_active); + if (drop) { + Position.within(drop.element, point[0], point[1]); + if(drop.onHover) + drop.onHover(element, drop.element, Position.overlap(drop.overlap, drop.element)); + + if (drop != this.last_active) Droppables.activate(drop); + } + }, + + fire: function(event, element) { + if(!this.last_active) return; + Position.prepare(); + + if (this.isAffected([Event.pointerX(event), Event.pointerY(event)], element, this.last_active)) + if (this.last_active.onDrop) { + this.last_active.onDrop(element, this.last_active.element, event); + return true; + } + }, + + reset: function() { + if(this.last_active) + this.deactivate(this.last_active); + } +}; + +var Draggables = { + drags: [], + observers: [], + + register: function(draggable) { + if(this.drags.length == 0) { + this.eventMouseUp = this.endDrag.bindAsEventListener(this); + this.eventMouseMove = this.updateDrag.bindAsEventListener(this); + this.eventKeypress = this.keyPress.bindAsEventListener(this); + + Event.observe(document, "mouseup", this.eventMouseUp); + Event.observe(document, "mousemove", this.eventMouseMove); + Event.observe(document, "keypress", this.eventKeypress); + } + this.drags.push(draggable); + }, + + unregister: function(draggable) { + this.drags = this.drags.reject(function(d) { return d==draggable }); + if(this.drags.length == 0) { + Event.stopObserving(document, "mouseup", this.eventMouseUp); + Event.stopObserving(document, "mousemove", this.eventMouseMove); + Event.stopObserving(document, "keypress", this.eventKeypress); + } + }, + + activate: function(draggable) { + if(draggable.options.delay) { + this._timeout = setTimeout(function() { + Draggables._timeout = null; + window.focus(); + Draggables.activeDraggable = draggable; + }.bind(this), draggable.options.delay); + } else { + window.focus(); // allows keypress events if window isn't currently focused, fails for Safari + this.activeDraggable = draggable; + } + }, + + deactivate: function() { + this.activeDraggable = null; + }, + + updateDrag: function(event) { + if(!this.activeDraggable) return; + var pointer = [Event.pointerX(event), Event.pointerY(event)]; + // Mozilla-based browsers fire successive mousemove events with + // the same coordinates, prevent needless redrawing (moz bug?) + if(this._lastPointer && (this._lastPointer.inspect() == pointer.inspect())) return; + this._lastPointer = pointer; + + this.activeDraggable.updateDrag(event, pointer); + }, + + endDrag: function(event) { + if(this._timeout) { + clearTimeout(this._timeout); + this._timeout = null; + } + if(!this.activeDraggable) return; + this._lastPointer = null; + this.activeDraggable.endDrag(event); + this.activeDraggable = null; + }, + + keyPress: function(event) { + if(this.activeDraggable) + this.activeDraggable.keyPress(event); + }, + + addObserver: function(observer) { + this.observers.push(observer); + this._cacheObserverCallbacks(); + }, + + removeObserver: function(element) { // element instead of observer fixes mem leaks + this.observers = this.observers.reject( function(o) { return o.element==element }); + this._cacheObserverCallbacks(); + }, + + notify: function(eventName, draggable, event) { // 'onStart', 'onEnd', 'onDrag' + if(this[eventName+'Count'] > 0) + this.observers.each( function(o) { + if(o[eventName]) o[eventName](eventName, draggable, event); + }); + if(draggable.options[eventName]) draggable.options[eventName](draggable, event); + }, + + _cacheObserverCallbacks: function() { + ['onStart','onEnd','onDrag'].each( function(eventName) { + Draggables[eventName+'Count'] = Draggables.observers.select( + function(o) { return o[eventName]; } + ).length; + }); + } +}; + +/*--------------------------------------------------------------------------*/ + +var Draggable = Class.create({ + initialize: function(element) { + var defaults = { + handle: false, + reverteffect: function(element, top_offset, left_offset) { + var dur = Math.sqrt(Math.abs(top_offset^2)+Math.abs(left_offset^2))*0.02; + new Effect.Move(element, { x: -left_offset, y: -top_offset, duration: dur, + queue: {scope:'_draggable', position:'end'} + }); + }, + endeffect: function(element) { + var toOpacity = Object.isNumber(element._opacity) ? element._opacity : 1.0; + new Effect.Opacity(element, {duration:0.2, from:0.7, to:toOpacity, + queue: {scope:'_draggable', position:'end'}, + afterFinish: function(){ + Draggable._dragging[element] = false + } + }); + }, + zindex: 1000, + revert: false, + quiet: false, + scroll: false, + scrollSensitivity: 20, + scrollSpeed: 15, + snap: false, // false, or xy or [x,y] or function(x,y){ return [x,y] } + delay: 0 + }; + + if(!arguments[1] || Object.isUndefined(arguments[1].endeffect)) + Object.extend(defaults, { + starteffect: function(element) { + element._opacity = Element.getOpacity(element); + Draggable._dragging[element] = true; + new Effect.Opacity(element, {duration:0.2, from:element._opacity, to:0.7}); + } + }); + + var options = Object.extend(defaults, arguments[1] || { }); + + this.element = $(element); + + if(options.handle && Object.isString(options.handle)) + this.handle = this.element.down('.'+options.handle, 0); + + if(!this.handle) this.handle = $(options.handle); + if(!this.handle) this.handle = this.element; + + if(options.scroll && !options.scroll.scrollTo && !options.scroll.outerHTML) { + options.scroll = $(options.scroll); + this._isScrollChild = Element.childOf(this.element, options.scroll); + } + + Element.makePositioned(this.element); // fix IE + + this.options = options; + this.dragging = false; + + this.eventMouseDown = this.initDrag.bindAsEventListener(this); + Event.observe(this.handle, "mousedown", this.eventMouseDown); + + Draggables.register(this); + }, + + destroy: function() { + Event.stopObserving(this.handle, "mousedown", this.eventMouseDown); + Draggables.unregister(this); + }, + + currentDelta: function() { + return([ + parseInt(Element.getStyle(this.element,'left') || '0'), + parseInt(Element.getStyle(this.element,'top') || '0')]); + }, + + initDrag: function(event) { + if(!Object.isUndefined(Draggable._dragging[this.element]) && + Draggable._dragging[this.element]) return; + if(Event.isLeftClick(event)) { + // abort on form elements, fixes a Firefox issue + var src = Event.element(event); + if((tag_name = src.tagName.toUpperCase()) && ( + tag_name=='INPUT' || + tag_name=='SELECT' || + tag_name=='OPTION' || + tag_name=='BUTTON' || + tag_name=='TEXTAREA')) return; + + var pointer = [Event.pointerX(event), Event.pointerY(event)]; + var pos = this.element.cumulativeOffset(); + this.offset = [0,1].map( function(i) { return (pointer[i] - pos[i]) }); + + Draggables.activate(this); + Event.stop(event); + } + }, + + startDrag: function(event) { + this.dragging = true; + if(!this.delta) + this.delta = this.currentDelta(); + + if(this.options.zindex) { + this.originalZ = parseInt(Element.getStyle(this.element,'z-index') || 0); + this.element.style.zIndex = this.options.zindex; + } + + if(this.options.ghosting) { + this._clone = this.element.cloneNode(true); + this._originallyAbsolute = (this.element.getStyle('position') == 'absolute'); + if (!this._originallyAbsolute) + Position.absolutize(this.element); + this.element.parentNode.insertBefore(this._clone, this.element); + } + + if(this.options.scroll) { + if (this.options.scroll == window) { + var where = this._getWindowScroll(this.options.scroll); + this.originalScrollLeft = where.left; + this.originalScrollTop = where.top; + } else { + this.originalScrollLeft = this.options.scroll.scrollLeft; + this.originalScrollTop = this.options.scroll.scrollTop; + } + } + + Draggables.notify('onStart', this, event); + + if(this.options.starteffect) this.options.starteffect(this.element); + }, + + updateDrag: function(event, pointer) { + if(!this.dragging) this.startDrag(event); + + if(!this.options.quiet){ + Position.prepare(); + Droppables.show(pointer, this.element); + } + + Draggables.notify('onDrag', this, event); + + this.draw(pointer); + if(this.options.change) this.options.change(this); + + if(this.options.scroll) { + this.stopScrolling(); + + var p; + if (this.options.scroll == window) { + with(this._getWindowScroll(this.options.scroll)) { p = [ left, top, left+width, top+height ]; } + } else { + p = Position.page(this.options.scroll); + p[0] += this.options.scroll.scrollLeft + Position.deltaX; + p[1] += this.options.scroll.scrollTop + Position.deltaY; + p.push(p[0]+this.options.scroll.offsetWidth); + p.push(p[1]+this.options.scroll.offsetHeight); + } + var speed = [0,0]; + if(pointer[0] < (p[0]+this.options.scrollSensitivity)) speed[0] = pointer[0]-(p[0]+this.options.scrollSensitivity); + if(pointer[1] < (p[1]+this.options.scrollSensitivity)) speed[1] = pointer[1]-(p[1]+this.options.scrollSensitivity); + if(pointer[0] > (p[2]-this.options.scrollSensitivity)) speed[0] = pointer[0]-(p[2]-this.options.scrollSensitivity); + if(pointer[1] > (p[3]-this.options.scrollSensitivity)) speed[1] = pointer[1]-(p[3]-this.options.scrollSensitivity); + this.startScrolling(speed); + } + + // fix AppleWebKit rendering + if(Prototype.Browser.WebKit) window.scrollBy(0,0); + + Event.stop(event); + }, + + finishDrag: function(event, success) { + this.dragging = false; + + if(this.options.quiet){ + Position.prepare(); + var pointer = [Event.pointerX(event), Event.pointerY(event)]; + Droppables.show(pointer, this.element); + } + + if(this.options.ghosting) { + if (!this._originallyAbsolute) + Position.relativize(this.element); + delete this._originallyAbsolute; + Element.remove(this._clone); + this._clone = null; + } + + var dropped = false; + if(success) { + dropped = Droppables.fire(event, this.element); + if (!dropped) dropped = false; + } + if(dropped && this.options.onDropped) this.options.onDropped(this.element); + Draggables.notify('onEnd', this, event); + + var revert = this.options.revert; + if(revert && Object.isFunction(revert)) revert = revert(this.element); + + var d = this.currentDelta(); + if(revert && this.options.reverteffect) { + if (dropped == 0 || revert != 'failure') + this.options.reverteffect(this.element, + d[1]-this.delta[1], d[0]-this.delta[0]); + } else { + this.delta = d; + } + + if(this.options.zindex) + this.element.style.zIndex = this.originalZ; + + if(this.options.endeffect) + this.options.endeffect(this.element); + + Draggables.deactivate(this); + Droppables.reset(); + }, + + keyPress: function(event) { + if(event.keyCode!=Event.KEY_ESC) return; + this.finishDrag(event, false); + Event.stop(event); + }, + + endDrag: function(event) { + if(!this.dragging) return; + this.stopScrolling(); + this.finishDrag(event, true); + Event.stop(event); + }, + + draw: function(point) { + var pos = this.element.cumulativeOffset(); + if(this.options.ghosting) { + var r = Position.realOffset(this.element); + pos[0] += r[0] - Position.deltaX; pos[1] += r[1] - Position.deltaY; + } + + var d = this.currentDelta(); + pos[0] -= d[0]; pos[1] -= d[1]; + + if(this.options.scroll && (this.options.scroll != window && this._isScrollChild)) { + pos[0] -= this.options.scroll.scrollLeft-this.originalScrollLeft; + pos[1] -= this.options.scroll.scrollTop-this.originalScrollTop; + } + + var p = [0,1].map(function(i){ + return (point[i]-pos[i]-this.offset[i]) + }.bind(this)); + + if(this.options.snap) { + if(Object.isFunction(this.options.snap)) { + p = this.options.snap(p[0],p[1],this); + } else { + if(Object.isArray(this.options.snap)) { + p = p.map( function(v, i) { + return (v/this.options.snap[i]).round()*this.options.snap[i] }.bind(this)); + } else { + p = p.map( function(v) { + return (v/this.options.snap).round()*this.options.snap }.bind(this)); + } + }} + + var style = this.element.style; + if((!this.options.constraint) || (this.options.constraint=='horizontal')) + style.left = p[0] + "px"; + if((!this.options.constraint) || (this.options.constraint=='vertical')) + style.top = p[1] + "px"; + + if(style.visibility=="hidden") style.visibility = ""; // fix gecko rendering + }, + + stopScrolling: function() { + if(this.scrollInterval) { + clearInterval(this.scrollInterval); + this.scrollInterval = null; + Draggables._lastScrollPointer = null; + } + }, + + startScrolling: function(speed) { + if(!(speed[0] || speed[1])) return; + this.scrollSpeed = [speed[0]*this.options.scrollSpeed,speed[1]*this.options.scrollSpeed]; + this.lastScrolled = new Date(); + this.scrollInterval = setInterval(this.scroll.bind(this), 10); + }, + + scroll: function() { + var current = new Date(); + var delta = current - this.lastScrolled; + this.lastScrolled = current; + if(this.options.scroll == window) { + with (this._getWindowScroll(this.options.scroll)) { + if (this.scrollSpeed[0] || this.scrollSpeed[1]) { + var d = delta / 1000; + this.options.scroll.scrollTo( left + d*this.scrollSpeed[0], top + d*this.scrollSpeed[1] ); + } + } + } else { + this.options.scroll.scrollLeft += this.scrollSpeed[0] * delta / 1000; + this.options.scroll.scrollTop += this.scrollSpeed[1] * delta / 1000; + } + + Position.prepare(); + Droppables.show(Draggables._lastPointer, this.element); + Draggables.notify('onDrag', this); + if (this._isScrollChild) { + Draggables._lastScrollPointer = Draggables._lastScrollPointer || $A(Draggables._lastPointer); + Draggables._lastScrollPointer[0] += this.scrollSpeed[0] * delta / 1000; + Draggables._lastScrollPointer[1] += this.scrollSpeed[1] * delta / 1000; + if (Draggables._lastScrollPointer[0] < 0) + Draggables._lastScrollPointer[0] = 0; + if (Draggables._lastScrollPointer[1] < 0) + Draggables._lastScrollPointer[1] = 0; + this.draw(Draggables._lastScrollPointer); + } + + if(this.options.change) this.options.change(this); + }, + + _getWindowScroll: function(w) { + var T, L, W, H; + with (w.document) { + if (w.document.documentElement && documentElement.scrollTop) { + T = documentElement.scrollTop; + L = documentElement.scrollLeft; + } else if (w.document.body) { + T = body.scrollTop; + L = body.scrollLeft; + } + if (w.innerWidth) { + W = w.innerWidth; + H = w.innerHeight; + } else if (w.document.documentElement && documentElement.clientWidth) { + W = documentElement.clientWidth; + H = documentElement.clientHeight; + } else { + W = body.offsetWidth; + H = body.offsetHeight; + } + } + return { top: T, left: L, width: W, height: H }; + } +}); + +Draggable._dragging = { }; + +/*--------------------------------------------------------------------------*/ + +var SortableObserver = Class.create({ + initialize: function(element, observer) { + this.element = $(element); + this.observer = observer; + this.lastValue = Sortable.serialize(this.element); + }, + + onStart: function() { + this.lastValue = Sortable.serialize(this.element); + }, + + onEnd: function() { + Sortable.unmark(); + if(this.lastValue != Sortable.serialize(this.element)) + this.observer(this.element) + } +}); + +var Sortable = { + SERIALIZE_RULE: /^[^_\-](?:[A-Za-z0-9\-\_]*)[_](.*)$/, + + sortables: { }, + + _findRootElement: function(element) { + while (element.tagName.toUpperCase() != "BODY") { + if(element.id && Sortable.sortables[element.id]) return element; + element = element.parentNode; + } + }, + + options: function(element) { + element = Sortable._findRootElement($(element)); + if(!element) return; + return Sortable.sortables[element.id]; + }, + + destroy: function(element){ + element = $(element); + var s = Sortable.sortables[element.id]; + + if(s) { + Draggables.removeObserver(s.element); + s.droppables.each(function(d){ Droppables.remove(d) }); + s.draggables.invoke('destroy'); + + delete Sortable.sortables[s.element.id]; + } + }, + + create: function(element) { + element = $(element); + var options = Object.extend({ + element: element, + tag: 'li', // assumes li children, override with tag: 'tagname' + dropOnEmpty: false, + tree: false, + treeTag: 'ul', + overlap: 'vertical', // one of 'vertical', 'horizontal' + constraint: 'vertical', // one of 'vertical', 'horizontal', false + containment: element, // also takes array of elements (or id's); or false + handle: false, // or a CSS class + only: false, + delay: 0, + hoverclass: null, + ghosting: false, + quiet: false, + scroll: false, + scrollSensitivity: 20, + scrollSpeed: 15, + format: this.SERIALIZE_RULE, + + // these take arrays of elements or ids and can be + // used for better initialization performance + elements: false, + handles: false, + + onChange: Prototype.emptyFunction, + onUpdate: Prototype.emptyFunction + }, arguments[1] || { }); + + // clear any old sortable with same element + this.destroy(element); + + // build options for the draggables + var options_for_draggable = { + revert: true, + quiet: options.quiet, + scroll: options.scroll, + scrollSpeed: options.scrollSpeed, + scrollSensitivity: options.scrollSensitivity, + delay: options.delay, + ghosting: options.ghosting, + constraint: options.constraint, + handle: options.handle }; + + if(options.starteffect) + options_for_draggable.starteffect = options.starteffect; + + if(options.reverteffect) + options_for_draggable.reverteffect = options.reverteffect; + else + if(options.ghosting) options_for_draggable.reverteffect = function(element) { + element.style.top = 0; + element.style.left = 0; + }; + + if(options.endeffect) + options_for_draggable.endeffect = options.endeffect; + + if(options.zindex) + options_for_draggable.zindex = options.zindex; + + // build options for the droppables + var options_for_droppable = { + overlap: options.overlap, + containment: options.containment, + tree: options.tree, + hoverclass: options.hoverclass, + onHover: Sortable.onHover + }; + + var options_for_tree = { + onHover: Sortable.onEmptyHover, + overlap: options.overlap, + containment: options.containment, + hoverclass: options.hoverclass + }; + + // fix for gecko engine + Element.cleanWhitespace(element); + + options.draggables = []; + options.droppables = []; + + // drop on empty handling + if(options.dropOnEmpty || options.tree) { + Droppables.add(element, options_for_tree); + options.droppables.push(element); + } + + (options.elements || this.findElements(element, options) || []).each( function(e,i) { + var handle = options.handles ? $(options.handles[i]) : + (options.handle ? $(e).select('.' + options.handle)[0] : e); + options.draggables.push( + new Draggable(e, Object.extend(options_for_draggable, { handle: handle }))); + Droppables.add(e, options_for_droppable); + if(options.tree) e.treeNode = element; + options.droppables.push(e); + }); + + if(options.tree) { + (Sortable.findTreeElements(element, options) || []).each( function(e) { + Droppables.add(e, options_for_tree); + e.treeNode = element; + options.droppables.push(e); + }); + } + + // keep reference + this.sortables[element.identify()] = options; + + // for onupdate + Draggables.addObserver(new SortableObserver(element, options.onUpdate)); + + }, + + // return all suitable-for-sortable elements in a guaranteed order + findElements: function(element, options) { + return Element.findChildren( + element, options.only, options.tree ? true : false, options.tag); + }, + + findTreeElements: function(element, options) { + return Element.findChildren( + element, options.only, options.tree ? true : false, options.treeTag); + }, + + onHover: function(element, dropon, overlap) { + if(Element.isParent(dropon, element)) return; + + if(overlap > .33 && overlap < .66 && Sortable.options(dropon).tree) { + return; + } else if(overlap>0.5) { + Sortable.mark(dropon, 'before'); + if(dropon.previousSibling != element) { + var oldParentNode = element.parentNode; + element.style.visibility = "hidden"; // fix gecko rendering + dropon.parentNode.insertBefore(element, dropon); + if(dropon.parentNode!=oldParentNode) + Sortable.options(oldParentNode).onChange(element); + Sortable.options(dropon.parentNode).onChange(element); + } + } else { + Sortable.mark(dropon, 'after'); + var nextElement = dropon.nextSibling || null; + if(nextElement != element) { + var oldParentNode = element.parentNode; + element.style.visibility = "hidden"; // fix gecko rendering + dropon.parentNode.insertBefore(element, nextElement); + if(dropon.parentNode!=oldParentNode) + Sortable.options(oldParentNode).onChange(element); + Sortable.options(dropon.parentNode).onChange(element); + } + } + }, + + onEmptyHover: function(element, dropon, overlap) { + var oldParentNode = element.parentNode; + var droponOptions = Sortable.options(dropon); + + if(!Element.isParent(dropon, element)) { + var index; + + var children = Sortable.findElements(dropon, {tag: droponOptions.tag, only: droponOptions.only}); + var child = null; + + if(children) { + var offset = Element.offsetSize(dropon, droponOptions.overlap) * (1.0 - overlap); + + for (index = 0; index < children.length; index += 1) { + if (offset - Element.offsetSize (children[index], droponOptions.overlap) >= 0) { + offset -= Element.offsetSize (children[index], droponOptions.overlap); + } else if (offset - (Element.offsetSize (children[index], droponOptions.overlap) / 2) >= 0) { + child = index + 1 < children.length ? children[index + 1] : null; + break; + } else { + child = children[index]; + break; + } + } + } + + dropon.insertBefore(element, child); + + Sortable.options(oldParentNode).onChange(element); + droponOptions.onChange(element); + } + }, + + unmark: function() { + if(Sortable._marker) Sortable._marker.hide(); + }, + + mark: function(dropon, position) { + // mark on ghosting only + var sortable = Sortable.options(dropon.parentNode); + if(sortable && !sortable.ghosting) return; + + if(!Sortable._marker) { + Sortable._marker = + ($('dropmarker') || Element.extend(document.createElement('DIV'))). + hide().addClassName('dropmarker').setStyle({position:'absolute'}); + document.getElementsByTagName("body").item(0).appendChild(Sortable._marker); + } + var offsets = dropon.cumulativeOffset(); + Sortable._marker.setStyle({left: offsets[0]+'px', top: offsets[1] + 'px'}); + + if(position=='after') + if(sortable.overlap == 'horizontal') + Sortable._marker.setStyle({left: (offsets[0]+dropon.clientWidth) + 'px'}); + else + Sortable._marker.setStyle({top: (offsets[1]+dropon.clientHeight) + 'px'}); + + Sortable._marker.show(); + }, + + _tree: function(element, options, parent) { + var children = Sortable.findElements(element, options) || []; + + for (var i = 0; i < children.length; ++i) { + var match = children[i].id.match(options.format); + + if (!match) continue; + + var child = { + id: encodeURIComponent(match ? match[1] : null), + element: element, + parent: parent, + children: [], + position: parent.children.length, + container: $(children[i]).down(options.treeTag) + }; + + /* Get the element containing the children and recurse over it */ + if (child.container) + this._tree(child.container, options, child); + + parent.children.push (child); + } + + return parent; + }, + + tree: function(element) { + element = $(element); + var sortableOptions = this.options(element); + var options = Object.extend({ + tag: sortableOptions.tag, + treeTag: sortableOptions.treeTag, + only: sortableOptions.only, + name: element.id, + format: sortableOptions.format + }, arguments[1] || { }); + + var root = { + id: null, + parent: null, + children: [], + container: element, + position: 0 + }; + + return Sortable._tree(element, options, root); + }, + + /* Construct a [i] index for a particular node */ + _constructIndex: function(node) { + var index = ''; + do { + if (node.id) index = '[' + node.position + ']' + index; + } while ((node = node.parent) != null); + return index; + }, + + sequence: function(element) { + element = $(element); + var options = Object.extend(this.options(element), arguments[1] || { }); + + return $(this.findElements(element, options) || []).map( function(item) { + return item.id.match(options.format) ? item.id.match(options.format)[1] : ''; + }); + }, + + setSequence: function(element, new_sequence) { + element = $(element); + var options = Object.extend(this.options(element), arguments[2] || { }); + + var nodeMap = { }; + this.findElements(element, options).each( function(n) { + if (n.id.match(options.format)) + nodeMap[n.id.match(options.format)[1]] = [n, n.parentNode]; + n.parentNode.removeChild(n); + }); + + new_sequence.each(function(ident) { + var n = nodeMap[ident]; + if (n) { + n[1].appendChild(n[0]); + delete nodeMap[ident]; + } + }); + }, + + serialize: function(element) { + element = $(element); + var options = Object.extend(Sortable.options(element), arguments[1] || { }); + var name = encodeURIComponent( + (arguments[1] && arguments[1].name) ? arguments[1].name : element.id); + + if (options.tree) { + return Sortable.tree(element, arguments[1]).children.map( function (item) { + return [name + Sortable._constructIndex(item) + "[id]=" + + encodeURIComponent(item.id)].concat(item.children.map(arguments.callee)); + }).flatten().join('&'); + } else { + return Sortable.sequence(element, arguments[1]).map( function(item) { + return name + "[]=" + encodeURIComponent(item); + }).join('&'); + } + } +}; + +// Returns true if child is contained within element +Element.isParent = function(child, element) { + if (!child.parentNode || child == element) return false; + if (child.parentNode == element) return true; + return Element.isParent(child.parentNode, element); +}; + +Element.findChildren = function(element, only, recursive, tagName) { + if(!element.hasChildNodes()) return null; + tagName = tagName.toUpperCase(); + if(only) only = [only].flatten(); + var elements = []; + $A(element.childNodes).each( function(e) { + if(e.tagName && e.tagName.toUpperCase()==tagName && + (!only || (Element.classNames(e).detect(function(v) { return only.include(v) })))) + elements.push(e); + if(recursive) { + var grandchildren = Element.findChildren(e, only, recursive, tagName); + if(grandchildren) elements.push(grandchildren); + } + }); + + return (elements.length>0 ? elements.flatten() : []); +}; + +Element.offsetSize = function (element, type) { + return element['offset' + ((type=='vertical' || type=='height') ? 'Height' : 'Width')]; +}; \ No newline at end of file diff --git a/src/wp-includes/js/scriptaculous/effects.js b/src/wp-includes/js/scriptaculous/effects.js new file mode 100644 index 0000000..066ee59 --- /dev/null +++ b/src/wp-includes/js/scriptaculous/effects.js @@ -0,0 +1,1123 @@ +// script.aculo.us effects.js v1.8.3, Thu Oct 08 11:23:33 +0200 2009 + +// Copyright (c) 2005-2009 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us) +// Contributors: +// Justin Palmer (http://encytemedia.com/) +// Mark Pilgrim (http://diveintomark.org/) +// Martin Bialasinki +// +// script.aculo.us is freely distributable under the terms of an MIT-style license. +// For details, see the script.aculo.us web site: http://script.aculo.us/ + +// converts rgb() and #xxx to #xxxxxx format, +// returns self (or first argument) if not convertable +String.prototype.parseColor = function() { + var color = '#'; + if (this.slice(0,4) == 'rgb(') { + var cols = this.slice(4,this.length-1).split(','); + var i=0; do { color += parseInt(cols[i]).toColorPart() } while (++i<3); + } else { + if (this.slice(0,1) == '#') { + if (this.length==4) for(var i=1;i<4;i++) color += (this.charAt(i) + this.charAt(i)).toLowerCase(); + if (this.length==7) color = this.toLowerCase(); + } + } + return (color.length==7 ? color : (arguments[0] || this)); +}; + +/*--------------------------------------------------------------------------*/ + +Element.collectTextNodes = function(element) { + return $A($(element).childNodes).collect( function(node) { + return (node.nodeType==3 ? node.nodeValue : + (node.hasChildNodes() ? Element.collectTextNodes(node) : '')); + }).flatten().join(''); +}; + +Element.collectTextNodesIgnoreClass = function(element, className) { + return $A($(element).childNodes).collect( function(node) { + return (node.nodeType==3 ? node.nodeValue : + ((node.hasChildNodes() && !Element.hasClassName(node,className)) ? + Element.collectTextNodesIgnoreClass(node, className) : '')); + }).flatten().join(''); +}; + +Element.setContentZoom = function(element, percent) { + element = $(element); + element.setStyle({fontSize: (percent/100) + 'em'}); + if (Prototype.Browser.WebKit) window.scrollBy(0,0); + return element; +}; + +Element.getInlineOpacity = function(element){ + return $(element).style.opacity || ''; +}; + +Element.forceRerendering = function(element) { + try { + element = $(element); + var n = document.createTextNode(' '); + element.appendChild(n); + element.removeChild(n); + } catch(e) { } +}; + +/*--------------------------------------------------------------------------*/ + +var Effect = { + _elementDoesNotExistError: { + name: 'ElementDoesNotExistError', + message: 'The specified DOM element does not exist, but is required for this effect to operate' + }, + Transitions: { + linear: Prototype.K, + sinoidal: function(pos) { + return (-Math.cos(pos*Math.PI)/2) + .5; + }, + reverse: function(pos) { + return 1-pos; + }, + flicker: function(pos) { + var pos = ((-Math.cos(pos*Math.PI)/4) + .75) + Math.random()/4; + return pos > 1 ? 1 : pos; + }, + wobble: function(pos) { + return (-Math.cos(pos*Math.PI*(9*pos))/2) + .5; + }, + pulse: function(pos, pulses) { + return (-Math.cos((pos*((pulses||5)-.5)*2)*Math.PI)/2) + .5; + }, + spring: function(pos) { + return 1 - (Math.cos(pos * 4.5 * Math.PI) * Math.exp(-pos * 6)); + }, + none: function(pos) { + return 0; + }, + full: function(pos) { + return 1; + } + }, + DefaultOptions: { + duration: 1.0, // seconds + fps: 100, // 100= assume 66fps max. + sync: false, // true for combining + from: 0.0, + to: 1.0, + delay: 0.0, + queue: 'parallel' + }, + tagifyText: function(element) { + var tagifyStyle = 'position:relative'; + if (Prototype.Browser.IE) tagifyStyle += ';zoom:1'; + + element = $(element); + $A(element.childNodes).each( function(child) { + if (child.nodeType==3) { + child.nodeValue.toArray().each( function(character) { + element.insertBefore( + new Element('span', {style: tagifyStyle}).update( + character == ' ' ? String.fromCharCode(160) : character), + child); + }); + Element.remove(child); + } + }); + }, + multiple: function(element, effect) { + var elements; + if (((typeof element == 'object') || + Object.isFunction(element)) && + (element.length)) + elements = element; + else + elements = $(element).childNodes; + + var options = Object.extend({ + speed: 0.1, + delay: 0.0 + }, arguments[2] || { }); + var masterDelay = options.delay; + + $A(elements).each( function(element, index) { + new effect(element, Object.extend(options, { delay: index * options.speed + masterDelay })); + }); + }, + PAIRS: { + 'slide': ['SlideDown','SlideUp'], + 'blind': ['BlindDown','BlindUp'], + 'appear': ['Appear','Fade'] + }, + toggle: function(element, effect, options) { + element = $(element); + effect = (effect || 'appear').toLowerCase(); + + return Effect[ Effect.PAIRS[ effect ][ element.visible() ? 1 : 0 ] ](element, Object.extend({ + queue: { position:'end', scope:(element.id || 'global'), limit: 1 } + }, options || {})); + } +}; + +Effect.DefaultOptions.transition = Effect.Transitions.sinoidal; + +/* ------------- core effects ------------- */ + +Effect.ScopedQueue = Class.create(Enumerable, { + initialize: function() { + this.effects = []; + this.interval = null; + }, + _each: function(iterator) { + this.effects._each(iterator); + }, + add: function(effect) { + var timestamp = new Date().getTime(); + + var position = Object.isString(effect.options.queue) ? + effect.options.queue : effect.options.queue.position; + + switch(position) { + case 'front': + // move unstarted effects after this effect + this.effects.findAll(function(e){ return e.state=='idle' }).each( function(e) { + e.startOn += effect.finishOn; + e.finishOn += effect.finishOn; + }); + break; + case 'with-last': + timestamp = this.effects.pluck('startOn').max() || timestamp; + break; + case 'end': + // start effect after last queued effect has finished + timestamp = this.effects.pluck('finishOn').max() || timestamp; + break; + } + + effect.startOn += timestamp; + effect.finishOn += timestamp; + + if (!effect.options.queue.limit || (this.effects.length < effect.options.queue.limit)) + this.effects.push(effect); + + if (!this.interval) + this.interval = setInterval(this.loop.bind(this), 15); + }, + remove: function(effect) { + this.effects = this.effects.reject(function(e) { return e==effect }); + if (this.effects.length == 0) { + clearInterval(this.interval); + this.interval = null; + } + }, + loop: function() { + var timePos = new Date().getTime(); + for(var i=0, len=this.effects.length;i= this.startOn) { + if (timePos >= this.finishOn) { + this.render(1.0); + this.cancel(); + this.event('beforeFinish'); + if (this.finish) this.finish(); + this.event('afterFinish'); + return; + } + var pos = (timePos - this.startOn) / this.totalTime, + frame = (pos * this.totalFrames).round(); + if (frame > this.currentFrame) { + this.render(pos); + this.currentFrame = frame; + } + } + }, + cancel: function() { + if (!this.options.sync) + Effect.Queues.get(Object.isString(this.options.queue) ? + 'global' : this.options.queue.scope).remove(this); + this.state = 'finished'; + }, + event: function(eventName) { + if (this.options[eventName + 'Internal']) this.options[eventName + 'Internal'](this); + if (this.options[eventName]) this.options[eventName](this); + }, + inspect: function() { + var data = $H(); + for(property in this) + if (!Object.isFunction(this[property])) data.set(property, this[property]); + return '#'; + } +}); + +Effect.Parallel = Class.create(Effect.Base, { + initialize: function(effects) { + this.effects = effects || []; + this.start(arguments[1]); + }, + update: function(position) { + this.effects.invoke('render', position); + }, + finish: function(position) { + this.effects.each( function(effect) { + effect.render(1.0); + effect.cancel(); + effect.event('beforeFinish'); + if (effect.finish) effect.finish(position); + effect.event('afterFinish'); + }); + } +}); + +Effect.Tween = Class.create(Effect.Base, { + initialize: function(object, from, to) { + object = Object.isString(object) ? $(object) : object; + var args = $A(arguments), method = args.last(), + options = args.length == 5 ? args[3] : null; + this.method = Object.isFunction(method) ? method.bind(object) : + Object.isFunction(object[method]) ? object[method].bind(object) : + function(value) { object[method] = value }; + this.start(Object.extend({ from: from, to: to }, options || { })); + }, + update: function(position) { + this.method(position); + } +}); + +Effect.Event = Class.create(Effect.Base, { + initialize: function() { + this.start(Object.extend({ duration: 0 }, arguments[0] || { })); + }, + update: Prototype.emptyFunction +}); + +Effect.Opacity = Class.create(Effect.Base, { + initialize: function(element) { + this.element = $(element); + if (!this.element) throw(Effect._elementDoesNotExistError); + // make this work on IE on elements without 'layout' + if (Prototype.Browser.IE && (!this.element.currentStyle.hasLayout)) + this.element.setStyle({zoom: 1}); + var options = Object.extend({ + from: this.element.getOpacity() || 0.0, + to: 1.0 + }, arguments[1] || { }); + this.start(options); + }, + update: function(position) { + this.element.setOpacity(position); + } +}); + +Effect.Move = Class.create(Effect.Base, { + initialize: function(element) { + this.element = $(element); + if (!this.element) throw(Effect._elementDoesNotExistError); + var options = Object.extend({ + x: 0, + y: 0, + mode: 'relative' + }, arguments[1] || { }); + this.start(options); + }, + setup: function() { + this.element.makePositioned(); + this.originalLeft = parseFloat(this.element.getStyle('left') || '0'); + this.originalTop = parseFloat(this.element.getStyle('top') || '0'); + if (this.options.mode == 'absolute') { + this.options.x = this.options.x - this.originalLeft; + this.options.y = this.options.y - this.originalTop; + } + }, + update: function(position) { + this.element.setStyle({ + left: (this.options.x * position + this.originalLeft).round() + 'px', + top: (this.options.y * position + this.originalTop).round() + 'px' + }); + } +}); + +// for backwards compatibility +Effect.MoveBy = function(element, toTop, toLeft) { + return new Effect.Move(element, + Object.extend({ x: toLeft, y: toTop }, arguments[3] || { })); +}; + +Effect.Scale = Class.create(Effect.Base, { + initialize: function(element, percent) { + this.element = $(element); + if (!this.element) throw(Effect._elementDoesNotExistError); + var options = Object.extend({ + scaleX: true, + scaleY: true, + scaleContent: true, + scaleFromCenter: false, + scaleMode: 'box', // 'box' or 'contents' or { } with provided values + scaleFrom: 100.0, + scaleTo: percent + }, arguments[2] || { }); + this.start(options); + }, + setup: function() { + this.restoreAfterFinish = this.options.restoreAfterFinish || false; + this.elementPositioning = this.element.getStyle('position'); + + this.originalStyle = { }; + ['top','left','width','height','fontSize'].each( function(k) { + this.originalStyle[k] = this.element.style[k]; + }.bind(this)); + + this.originalTop = this.element.offsetTop; + this.originalLeft = this.element.offsetLeft; + + var fontSize = this.element.getStyle('font-size') || '100%'; + ['em','px','%','pt'].each( function(fontSizeType) { + if (fontSize.indexOf(fontSizeType)>0) { + this.fontSize = parseFloat(fontSize); + this.fontSizeType = fontSizeType; + } + }.bind(this)); + + this.factor = (this.options.scaleTo - this.options.scaleFrom)/100; + + this.dims = null; + if (this.options.scaleMode=='box') + this.dims = [this.element.offsetHeight, this.element.offsetWidth]; + if (/^content/.test(this.options.scaleMode)) + this.dims = [this.element.scrollHeight, this.element.scrollWidth]; + if (!this.dims) + this.dims = [this.options.scaleMode.originalHeight, + this.options.scaleMode.originalWidth]; + }, + update: function(position) { + var currentScale = (this.options.scaleFrom/100.0) + (this.factor * position); + if (this.options.scaleContent && this.fontSize) + this.element.setStyle({fontSize: this.fontSize * currentScale + this.fontSizeType }); + this.setDimensions(this.dims[0] * currentScale, this.dims[1] * currentScale); + }, + finish: function(position) { + if (this.restoreAfterFinish) this.element.setStyle(this.originalStyle); + }, + setDimensions: function(height, width) { + var d = { }; + if (this.options.scaleX) d.width = width.round() + 'px'; + if (this.options.scaleY) d.height = height.round() + 'px'; + if (this.options.scaleFromCenter) { + var topd = (height - this.dims[0])/2; + var leftd = (width - this.dims[1])/2; + if (this.elementPositioning == 'absolute') { + if (this.options.scaleY) d.top = this.originalTop-topd + 'px'; + if (this.options.scaleX) d.left = this.originalLeft-leftd + 'px'; + } else { + if (this.options.scaleY) d.top = -topd + 'px'; + if (this.options.scaleX) d.left = -leftd + 'px'; + } + } + this.element.setStyle(d); + } +}); + +Effect.Highlight = Class.create(Effect.Base, { + initialize: function(element) { + this.element = $(element); + if (!this.element) throw(Effect._elementDoesNotExistError); + var options = Object.extend({ startcolor: '#ffff99' }, arguments[1] || { }); + this.start(options); + }, + setup: function() { + // Prevent executing on elements not in the layout flow + if (this.element.getStyle('display')=='none') { this.cancel(); return; } + // Disable background image during the effect + this.oldStyle = { }; + if (!this.options.keepBackgroundImage) { + this.oldStyle.backgroundImage = this.element.getStyle('background-image'); + this.element.setStyle({backgroundImage: 'none'}); + } + if (!this.options.endcolor) + this.options.endcolor = this.element.getStyle('background-color').parseColor('#ffffff'); + if (!this.options.restorecolor) + this.options.restorecolor = this.element.getStyle('background-color'); + // init color calculations + this._base = $R(0,2).map(function(i){ return parseInt(this.options.startcolor.slice(i*2+1,i*2+3),16) }.bind(this)); + this._delta = $R(0,2).map(function(i){ return parseInt(this.options.endcolor.slice(i*2+1,i*2+3),16)-this._base[i] }.bind(this)); + }, + update: function(position) { + this.element.setStyle({backgroundColor: $R(0,2).inject('#',function(m,v,i){ + return m+((this._base[i]+(this._delta[i]*position)).round().toColorPart()); }.bind(this)) }); + }, + finish: function() { + this.element.setStyle(Object.extend(this.oldStyle, { + backgroundColor: this.options.restorecolor + })); + } +}); + +Effect.ScrollTo = function(element) { + var options = arguments[1] || { }, + scrollOffsets = document.viewport.getScrollOffsets(), + elementOffsets = $(element).cumulativeOffset(); + + if (options.offset) elementOffsets[1] += options.offset; + + return new Effect.Tween(null, + scrollOffsets.top, + elementOffsets[1], + options, + function(p){ scrollTo(scrollOffsets.left, p.round()); } + ); +}; + +/* ------------- combination effects ------------- */ + +Effect.Fade = function(element) { + element = $(element); + var oldOpacity = element.getInlineOpacity(); + var options = Object.extend({ + from: element.getOpacity() || 1.0, + to: 0.0, + afterFinishInternal: function(effect) { + if (effect.options.to!=0) return; + effect.element.hide().setStyle({opacity: oldOpacity}); + } + }, arguments[1] || { }); + return new Effect.Opacity(element,options); +}; + +Effect.Appear = function(element) { + element = $(element); + var options = Object.extend({ + from: (element.getStyle('display') == 'none' ? 0.0 : element.getOpacity() || 0.0), + to: 1.0, + // force Safari to render floated elements properly + afterFinishInternal: function(effect) { + effect.element.forceRerendering(); + }, + beforeSetup: function(effect) { + effect.element.setOpacity(effect.options.from).show(); + }}, arguments[1] || { }); + return new Effect.Opacity(element,options); +}; + +Effect.Puff = function(element) { + element = $(element); + var oldStyle = { + opacity: element.getInlineOpacity(), + position: element.getStyle('position'), + top: element.style.top, + left: element.style.left, + width: element.style.width, + height: element.style.height + }; + return new Effect.Parallel( + [ new Effect.Scale(element, 200, + { sync: true, scaleFromCenter: true, scaleContent: true, restoreAfterFinish: true }), + new Effect.Opacity(element, { sync: true, to: 0.0 } ) ], + Object.extend({ duration: 1.0, + beforeSetupInternal: function(effect) { + Position.absolutize(effect.effects[0].element); + }, + afterFinishInternal: function(effect) { + effect.effects[0].element.hide().setStyle(oldStyle); } + }, arguments[1] || { }) + ); +}; + +Effect.BlindUp = function(element) { + element = $(element); + element.makeClipping(); + return new Effect.Scale(element, 0, + Object.extend({ scaleContent: false, + scaleX: false, + restoreAfterFinish: true, + afterFinishInternal: function(effect) { + effect.element.hide().undoClipping(); + } + }, arguments[1] || { }) + ); +}; + +Effect.BlindDown = function(element) { + element = $(element); + var elementDimensions = element.getDimensions(); + return new Effect.Scale(element, 100, Object.extend({ + scaleContent: false, + scaleX: false, + scaleFrom: 0, + scaleMode: {originalHeight: elementDimensions.height, originalWidth: elementDimensions.width}, + restoreAfterFinish: true, + afterSetup: function(effect) { + effect.element.makeClipping().setStyle({height: '0px'}).show(); + }, + afterFinishInternal: function(effect) { + effect.element.undoClipping(); + } + }, arguments[1] || { })); +}; + +Effect.SwitchOff = function(element) { + element = $(element); + var oldOpacity = element.getInlineOpacity(); + return new Effect.Appear(element, Object.extend({ + duration: 0.4, + from: 0, + transition: Effect.Transitions.flicker, + afterFinishInternal: function(effect) { + new Effect.Scale(effect.element, 1, { + duration: 0.3, scaleFromCenter: true, + scaleX: false, scaleContent: false, restoreAfterFinish: true, + beforeSetup: function(effect) { + effect.element.makePositioned().makeClipping(); + }, + afterFinishInternal: function(effect) { + effect.element.hide().undoClipping().undoPositioned().setStyle({opacity: oldOpacity}); + } + }); + } + }, arguments[1] || { })); +}; + +Effect.DropOut = function(element) { + element = $(element); + var oldStyle = { + top: element.getStyle('top'), + left: element.getStyle('left'), + opacity: element.getInlineOpacity() }; + return new Effect.Parallel( + [ new Effect.Move(element, {x: 0, y: 100, sync: true }), + new Effect.Opacity(element, { sync: true, to: 0.0 }) ], + Object.extend( + { duration: 0.5, + beforeSetup: function(effect) { + effect.effects[0].element.makePositioned(); + }, + afterFinishInternal: function(effect) { + effect.effects[0].element.hide().undoPositioned().setStyle(oldStyle); + } + }, arguments[1] || { })); +}; + +Effect.Shake = function(element) { + element = $(element); + var options = Object.extend({ + distance: 20, + duration: 0.5 + }, arguments[1] || {}); + var distance = parseFloat(options.distance); + var split = parseFloat(options.duration) / 10.0; + var oldStyle = { + top: element.getStyle('top'), + left: element.getStyle('left') }; + return new Effect.Move(element, + { x: distance, y: 0, duration: split, afterFinishInternal: function(effect) { + new Effect.Move(effect.element, + { x: -distance*2, y: 0, duration: split*2, afterFinishInternal: function(effect) { + new Effect.Move(effect.element, + { x: distance*2, y: 0, duration: split*2, afterFinishInternal: function(effect) { + new Effect.Move(effect.element, + { x: -distance*2, y: 0, duration: split*2, afterFinishInternal: function(effect) { + new Effect.Move(effect.element, + { x: distance*2, y: 0, duration: split*2, afterFinishInternal: function(effect) { + new Effect.Move(effect.element, + { x: -distance, y: 0, duration: split, afterFinishInternal: function(effect) { + effect.element.undoPositioned().setStyle(oldStyle); + }}); }}); }}); }}); }}); }}); +}; + +Effect.SlideDown = function(element) { + element = $(element).cleanWhitespace(); + // SlideDown need to have the content of the element wrapped in a container element with fixed height! + var oldInnerBottom = element.down().getStyle('bottom'); + var elementDimensions = element.getDimensions(); + return new Effect.Scale(element, 100, Object.extend({ + scaleContent: false, + scaleX: false, + scaleFrom: window.opera ? 0 : 1, + scaleMode: {originalHeight: elementDimensions.height, originalWidth: elementDimensions.width}, + restoreAfterFinish: true, + afterSetup: function(effect) { + effect.element.makePositioned(); + effect.element.down().makePositioned(); + if (window.opera) effect.element.setStyle({top: ''}); + effect.element.makeClipping().setStyle({height: '0px'}).show(); + }, + afterUpdateInternal: function(effect) { + effect.element.down().setStyle({bottom: + (effect.dims[0] - effect.element.clientHeight) + 'px' }); + }, + afterFinishInternal: function(effect) { + effect.element.undoClipping().undoPositioned(); + effect.element.down().undoPositioned().setStyle({bottom: oldInnerBottom}); } + }, arguments[1] || { }) + ); +}; + +Effect.SlideUp = function(element) { + element = $(element).cleanWhitespace(); + var oldInnerBottom = element.down().getStyle('bottom'); + var elementDimensions = element.getDimensions(); + return new Effect.Scale(element, window.opera ? 0 : 1, + Object.extend({ scaleContent: false, + scaleX: false, + scaleMode: 'box', + scaleFrom: 100, + scaleMode: {originalHeight: elementDimensions.height, originalWidth: elementDimensions.width}, + restoreAfterFinish: true, + afterSetup: function(effect) { + effect.element.makePositioned(); + effect.element.down().makePositioned(); + if (window.opera) effect.element.setStyle({top: ''}); + effect.element.makeClipping().show(); + }, + afterUpdateInternal: function(effect) { + effect.element.down().setStyle({bottom: + (effect.dims[0] - effect.element.clientHeight) + 'px' }); + }, + afterFinishInternal: function(effect) { + effect.element.hide().undoClipping().undoPositioned(); + effect.element.down().undoPositioned().setStyle({bottom: oldInnerBottom}); + } + }, arguments[1] || { }) + ); +}; + +// Bug in opera makes the TD containing this element expand for a instance after finish +Effect.Squish = function(element) { + return new Effect.Scale(element, window.opera ? 1 : 0, { + restoreAfterFinish: true, + beforeSetup: function(effect) { + effect.element.makeClipping(); + }, + afterFinishInternal: function(effect) { + effect.element.hide().undoClipping(); + } + }); +}; + +Effect.Grow = function(element) { + element = $(element); + var options = Object.extend({ + direction: 'center', + moveTransition: Effect.Transitions.sinoidal, + scaleTransition: Effect.Transitions.sinoidal, + opacityTransition: Effect.Transitions.full + }, arguments[1] || { }); + var oldStyle = { + top: element.style.top, + left: element.style.left, + height: element.style.height, + width: element.style.width, + opacity: element.getInlineOpacity() }; + + var dims = element.getDimensions(); + var initialMoveX, initialMoveY; + var moveX, moveY; + + switch (options.direction) { + case 'top-left': + initialMoveX = initialMoveY = moveX = moveY = 0; + break; + case 'top-right': + initialMoveX = dims.width; + initialMoveY = moveY = 0; + moveX = -dims.width; + break; + case 'bottom-left': + initialMoveX = moveX = 0; + initialMoveY = dims.height; + moveY = -dims.height; + break; + case 'bottom-right': + initialMoveX = dims.width; + initialMoveY = dims.height; + moveX = -dims.width; + moveY = -dims.height; + break; + case 'center': + initialMoveX = dims.width / 2; + initialMoveY = dims.height / 2; + moveX = -dims.width / 2; + moveY = -dims.height / 2; + break; + } + + return new Effect.Move(element, { + x: initialMoveX, + y: initialMoveY, + duration: 0.01, + beforeSetup: function(effect) { + effect.element.hide().makeClipping().makePositioned(); + }, + afterFinishInternal: function(effect) { + new Effect.Parallel( + [ new Effect.Opacity(effect.element, { sync: true, to: 1.0, from: 0.0, transition: options.opacityTransition }), + new Effect.Move(effect.element, { x: moveX, y: moveY, sync: true, transition: options.moveTransition }), + new Effect.Scale(effect.element, 100, { + scaleMode: { originalHeight: dims.height, originalWidth: dims.width }, + sync: true, scaleFrom: window.opera ? 1 : 0, transition: options.scaleTransition, restoreAfterFinish: true}) + ], Object.extend({ + beforeSetup: function(effect) { + effect.effects[0].element.setStyle({height: '0px'}).show(); + }, + afterFinishInternal: function(effect) { + effect.effects[0].element.undoClipping().undoPositioned().setStyle(oldStyle); + } + }, options) + ); + } + }); +}; + +Effect.Shrink = function(element) { + element = $(element); + var options = Object.extend({ + direction: 'center', + moveTransition: Effect.Transitions.sinoidal, + scaleTransition: Effect.Transitions.sinoidal, + opacityTransition: Effect.Transitions.none + }, arguments[1] || { }); + var oldStyle = { + top: element.style.top, + left: element.style.left, + height: element.style.height, + width: element.style.width, + opacity: element.getInlineOpacity() }; + + var dims = element.getDimensions(); + var moveX, moveY; + + switch (options.direction) { + case 'top-left': + moveX = moveY = 0; + break; + case 'top-right': + moveX = dims.width; + moveY = 0; + break; + case 'bottom-left': + moveX = 0; + moveY = dims.height; + break; + case 'bottom-right': + moveX = dims.width; + moveY = dims.height; + break; + case 'center': + moveX = dims.width / 2; + moveY = dims.height / 2; + break; + } + + return new Effect.Parallel( + [ new Effect.Opacity(element, { sync: true, to: 0.0, from: 1.0, transition: options.opacityTransition }), + new Effect.Scale(element, window.opera ? 1 : 0, { sync: true, transition: options.scaleTransition, restoreAfterFinish: true}), + new Effect.Move(element, { x: moveX, y: moveY, sync: true, transition: options.moveTransition }) + ], Object.extend({ + beforeStartInternal: function(effect) { + effect.effects[0].element.makePositioned().makeClipping(); + }, + afterFinishInternal: function(effect) { + effect.effects[0].element.hide().undoClipping().undoPositioned().setStyle(oldStyle); } + }, options) + ); +}; + +Effect.Pulsate = function(element) { + element = $(element); + var options = arguments[1] || { }, + oldOpacity = element.getInlineOpacity(), + transition = options.transition || Effect.Transitions.linear, + reverser = function(pos){ + return 1 - transition((-Math.cos((pos*(options.pulses||5)*2)*Math.PI)/2) + .5); + }; + + return new Effect.Opacity(element, + Object.extend(Object.extend({ duration: 2.0, from: 0, + afterFinishInternal: function(effect) { effect.element.setStyle({opacity: oldOpacity}); } + }, options), {transition: reverser})); +}; + +Effect.Fold = function(element) { + element = $(element); + var oldStyle = { + top: element.style.top, + left: element.style.left, + width: element.style.width, + height: element.style.height }; + element.makeClipping(); + return new Effect.Scale(element, 5, Object.extend({ + scaleContent: false, + scaleX: false, + afterFinishInternal: function(effect) { + new Effect.Scale(element, 1, { + scaleContent: false, + scaleY: false, + afterFinishInternal: function(effect) { + effect.element.hide().undoClipping().setStyle(oldStyle); + } }); + }}, arguments[1] || { })); +}; + +Effect.Morph = Class.create(Effect.Base, { + initialize: function(element) { + this.element = $(element); + if (!this.element) throw(Effect._elementDoesNotExistError); + var options = Object.extend({ + style: { } + }, arguments[1] || { }); + + if (!Object.isString(options.style)) this.style = $H(options.style); + else { + if (options.style.include(':')) + this.style = options.style.parseStyle(); + else { + this.element.addClassName(options.style); + this.style = $H(this.element.getStyles()); + this.element.removeClassName(options.style); + var css = this.element.getStyles(); + this.style = this.style.reject(function(style) { + return style.value == css[style.key]; + }); + options.afterFinishInternal = function(effect) { + effect.element.addClassName(effect.options.style); + effect.transforms.each(function(transform) { + effect.element.style[transform.style] = ''; + }); + }; + } + } + this.start(options); + }, + + setup: function(){ + function parseColor(color){ + if (!color || ['rgba(0, 0, 0, 0)','transparent'].include(color)) color = '#ffffff'; + color = color.parseColor(); + return $R(0,2).map(function(i){ + return parseInt( color.slice(i*2+1,i*2+3), 16 ); + }); + } + this.transforms = this.style.map(function(pair){ + var property = pair[0], value = pair[1], unit = null; + + if (value.parseColor('#zzzzzz') != '#zzzzzz') { + value = value.parseColor(); + unit = 'color'; + } else if (property == 'opacity') { + value = parseFloat(value); + if (Prototype.Browser.IE && (!this.element.currentStyle.hasLayout)) + this.element.setStyle({zoom: 1}); + } else if (Element.CSS_LENGTH.test(value)) { + var components = value.match(/^([\+\-]?[0-9\.]+)(.*)$/); + value = parseFloat(components[1]); + unit = (components.length == 3) ? components[2] : null; + } + + var originalValue = this.element.getStyle(property); + return { + style: property.camelize(), + originalValue: unit=='color' ? parseColor(originalValue) : parseFloat(originalValue || 0), + targetValue: unit=='color' ? parseColor(value) : value, + unit: unit + }; + }.bind(this)).reject(function(transform){ + return ( + (transform.originalValue == transform.targetValue) || + ( + transform.unit != 'color' && + (isNaN(transform.originalValue) || isNaN(transform.targetValue)) + ) + ); + }); + }, + update: function(position) { + var style = { }, transform, i = this.transforms.length; + while(i--) + style[(transform = this.transforms[i]).style] = + transform.unit=='color' ? '#'+ + (Math.round(transform.originalValue[0]+ + (transform.targetValue[0]-transform.originalValue[0])*position)).toColorPart() + + (Math.round(transform.originalValue[1]+ + (transform.targetValue[1]-transform.originalValue[1])*position)).toColorPart() + + (Math.round(transform.originalValue[2]+ + (transform.targetValue[2]-transform.originalValue[2])*position)).toColorPart() : + (transform.originalValue + + (transform.targetValue - transform.originalValue) * position).toFixed(3) + + (transform.unit === null ? '' : transform.unit); + this.element.setStyle(style, true); + } +}); + +Effect.Transform = Class.create({ + initialize: function(tracks){ + this.tracks = []; + this.options = arguments[1] || { }; + this.addTracks(tracks); + }, + addTracks: function(tracks){ + tracks.each(function(track){ + track = $H(track); + var data = track.values().first(); + this.tracks.push($H({ + ids: track.keys().first(), + effect: Effect.Morph, + options: { style: data } + })); + }.bind(this)); + return this; + }, + play: function(){ + return new Effect.Parallel( + this.tracks.map(function(track){ + var ids = track.get('ids'), effect = track.get('effect'), options = track.get('options'); + var elements = [$(ids) || $$(ids)].flatten(); + return elements.map(function(e){ return new effect(e, Object.extend({ sync:true }, options)) }); + }).flatten(), + this.options + ); + } +}); + +Element.CSS_PROPERTIES = $w( + 'backgroundColor backgroundPosition borderBottomColor borderBottomStyle ' + + 'borderBottomWidth borderLeftColor borderLeftStyle borderLeftWidth ' + + 'borderRightColor borderRightStyle borderRightWidth borderSpacing ' + + 'borderTopColor borderTopStyle borderTopWidth bottom clip color ' + + 'fontSize fontWeight height left letterSpacing lineHeight ' + + 'marginBottom marginLeft marginRight marginTop markerOffset maxHeight '+ + 'maxWidth minHeight minWidth opacity outlineColor outlineOffset ' + + 'outlineWidth paddingBottom paddingLeft paddingRight paddingTop ' + + 'right textIndent top width wordSpacing zIndex'); + +Element.CSS_LENGTH = /^(([\+\-]?[0-9\.]+)(em|ex|px|in|cm|mm|pt|pc|\%))|0$/; + +String.__parseStyleElement = document.createElement('div'); +String.prototype.parseStyle = function(){ + var style, styleRules = $H(); + if (Prototype.Browser.WebKit) + style = new Element('div',{style:this}).style; + else { + String.__parseStyleElement.innerHTML = '
    '; + style = String.__parseStyleElement.childNodes[0].style; + } + + Element.CSS_PROPERTIES.each(function(property){ + if (style[property]) styleRules.set(property, style[property]); + }); + + if (Prototype.Browser.IE && this.include('opacity')) + styleRules.set('opacity', this.match(/opacity:\s*((?:0|1)?(?:\.\d*)?)/)[1]); + + return styleRules; +}; + +if (document.defaultView && document.defaultView.getComputedStyle) { + Element.getStyles = function(element) { + var css = document.defaultView.getComputedStyle($(element), null); + return Element.CSS_PROPERTIES.inject({ }, function(styles, property) { + styles[property] = css[property]; + return styles; + }); + }; +} else { + Element.getStyles = function(element) { + element = $(element); + var css = element.currentStyle, styles; + styles = Element.CSS_PROPERTIES.inject({ }, function(results, property) { + results[property] = css[property]; + return results; + }); + if (!styles.opacity) styles.opacity = element.getOpacity(); + return styles; + }; +} + +Effect.Methods = { + morph: function(element, style) { + element = $(element); + new Effect.Morph(element, Object.extend({ style: style }, arguments[2] || { })); + return element; + }, + visualEffect: function(element, effect, options) { + element = $(element); + var s = effect.dasherize().camelize(), klass = s.charAt(0).toUpperCase() + s.substring(1); + new Effect[klass](element, options); + return element; + }, + highlight: function(element, options) { + element = $(element); + new Effect.Highlight(element, options); + return element; + } +}; + +$w('fade appear grow shrink fold blindUp blindDown slideUp slideDown '+ + 'pulsate shake puff squish switchOff dropOut').each( + function(effect) { + Effect.Methods[effect] = function(element, options){ + element = $(element); + Effect[effect.charAt(0).toUpperCase() + effect.substring(1)](element, options); + return element; + }; + } +); + +$w('getInlineOpacity forceRerendering setContentZoom collectTextNodes collectTextNodesIgnoreClass getStyles').each( + function(f) { Effect.Methods[f] = Element[f]; } +); + +Element.addMethods(Effect.Methods); \ No newline at end of file diff --git a/src/wp-includes/js/scriptaculous/scriptaculous.js b/src/wp-includes/js/scriptaculous/scriptaculous.js new file mode 100644 index 0000000..6bf437a --- /dev/null +++ b/src/wp-includes/js/scriptaculous/scriptaculous.js @@ -0,0 +1,68 @@ +// script.aculo.us scriptaculous.js v1.8.3, Thu Oct 08 11:23:33 +0200 2009 + +// Copyright (c) 2005-2009 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us) +// +// 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. +// +// For details, see the script.aculo.us web site: http://script.aculo.us/ + +var Scriptaculous = { + Version: '1.8.3', + require: function(libraryName) { + try{ + // inserting via DOM fails in Safari 2.0, so brute force approach + document.write(' + + 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/src/wp-includes/js/swfupload/swfupload-all.js b/src/wp-includes/js/swfupload/swfupload-all.js new file mode 100644 index 0000000..f18a138 --- /dev/null +++ b/src/wp-includes/js/swfupload/swfupload-all.js @@ -0,0 +1,8 @@ +// swfupload +var SWFUpload;if(SWFUpload==undefined){SWFUpload=function(a){this.initSWFUpload(a)}}SWFUpload.prototype.initSWFUpload=function(b){try{this.customSettings={};this.settings=b;this.eventQueue=[];this.movieName="SWFUpload_"+SWFUpload.movieCount++;this.movieElement=null;SWFUpload.instances[this.movieName]=this;this.initSettings();this.loadFlash()}catch(a){delete SWFUpload.instances[this.movieName];throw a}};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"};SWFUpload.completeURL=function(a){if(typeof(a)!=="string"||a.match(/^https?:\/\//i)||a.match(/^\//)){return a}var c,b;c=window.location.protocol+"//"+window.location.hostname+(window.location.port?":"+window.location.port:"");b=window.location.pathname.lastIndexOf("/");if(b<=0){path="/"}else{path=window.location.pathname.substr(0,b)+"/"}return path+a};SWFUpload.prototype.initSettings=function(){this.ensureDefault=function(b,a){this.settings[b]=(this.settings[b]==undefined)?a:this.settings[b]};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);this.ensureDefault("file_types","*.*");this.ensureDefault("file_types_description","All Files");this.ensureDefault("file_size_limit",0);this.ensureDefault("file_upload_limit",0);this.ensureDefault("file_queue_limit",0);this.ensureDefault("flash_url","swfupload.swf");this.ensureDefault("prevent_swf_caching",true);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);this.ensureDefault("debug",false);this.settings.debug_enabled=this.settings.debug;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",{});this.customSettings=this.settings.custom_settings;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.upload_url=SWFUpload.completeURL(this.settings.upload_url);this.settings.button_image_url=SWFUpload.completeURL(this.settings.button_image_url)}delete this.ensureDefault};SWFUpload.prototype.loadFlash=function(){var a,b;if(document.getElementById(this.movieName)!==null){throw"ID "+this.movieName+" is already in use. The Flash Object could not be added"}a=document.getElementById(this.settings.button_placeholder_id)||this.settings.button_placeholder;if(a==undefined){throw"Could not find the placeholder element: "+this.settings.button_placeholder_id}b=document.createElement("div");b.innerHTML=this.getFlashHTML();a.parentNode.replaceChild(b.firstChild,a);if(window[this.movieName]==undefined){window[this.movieName]=this.getMovieElement()}};SWFUpload.prototype.getFlashHTML=function(){return['','','','','','','',""].join("")};SWFUpload.prototype.getFlashVars=function(){var b=this.buildParamString(),a=this.settings.http_success.join(",");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(a),"&assumeSuccessTimeout=",encodeURIComponent(this.settings.assume_success_timeout),"&params=",encodeURIComponent(b),"&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("")};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};SWFUpload.prototype.buildParamString=function(){var c=this.settings.post_params,b=[],a;if(typeof(c)==="object"){for(a in c){if(c.hasOwnProperty(a)){b.push(encodeURIComponent(a.toString())+"="+encodeURIComponent(c[a].toString()))}}}return b.join("&")};SWFUpload.prototype.destroy=function(){try{this.cancelUpload(null,false);var a=null,c;a=this.getMovieElement();if(a&&typeof(a.CallFunction)==="unknown"){for(c in a){try{if(typeof(a[c])==="function"){a[c]=null}}catch(e){}}try{a.parentNode.removeChild(a)}catch(b){}}window[this.movieName]=null;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(d){return false}};SWFUpload.prototype.addSetting=function(b,c,a){if(c==undefined){return(this.settings[b]=a)}else{return(this.settings[b]=c)}};SWFUpload.prototype.getSetting=function(a){if(this.settings[a]!=undefined){return this.settings[a]}return""};SWFUpload.prototype.callFlash=function(functionName,argumentArray){argumentArray=argumentArray||[];var movieElement=this.getMovieElement(),returnValue,returnString;try{returnString=movieElement.CallFunction(''+__flash__argumentsToXML(argumentArray,0)+"");returnValue=eval(returnString)}catch(ex){throw"Call to "+functionName+" failed"}if(returnValue!=undefined&&typeof returnValue.post==="object"){returnValue=this.unescapeFilePostParams(returnValue)}return returnValue};SWFUpload.prototype.selectFile=function(){this.callFlash("SelectFile")};SWFUpload.prototype.selectFiles=function(){this.callFlash("SelectFiles")};SWFUpload.prototype.startUpload=function(a){this.callFlash("StartUpload",[a])};SWFUpload.prototype.cancelUpload=function(a,b){if(b!==false){b=true}this.callFlash("CancelUpload",[a,b])};SWFUpload.prototype.stopUpload=function(){this.callFlash("StopUpload")};SWFUpload.prototype.getStats=function(){return this.callFlash("GetStats")};SWFUpload.prototype.setStats=function(a){this.callFlash("SetStats",[a])};SWFUpload.prototype.getFile=function(a){if(typeof(a)==="number"){return this.callFlash("GetFileByIndex",[a])}else{return this.callFlash("GetFile",[a])}};SWFUpload.prototype.addFileParam=function(a,b,c){return this.callFlash("AddFileParam",[a,b,c])};SWFUpload.prototype.removeFileParam=function(a,b){this.callFlash("RemoveFileParam",[a,b])};SWFUpload.prototype.setUploadURL=function(a){this.settings.upload_url=a.toString();this.callFlash("SetUploadURL",[a])};SWFUpload.prototype.setPostParams=function(a){this.settings.post_params=a;this.callFlash("SetPostParams",[a])};SWFUpload.prototype.addPostParam=function(a,b){this.settings.post_params[a]=b;this.callFlash("SetPostParams",[this.settings.post_params])};SWFUpload.prototype.removePostParam=function(a){delete this.settings.post_params[a];this.callFlash("SetPostParams",[this.settings.post_params])};SWFUpload.prototype.setFileTypes=function(a,b){this.settings.file_types=a;this.settings.file_types_description=b;this.callFlash("SetFileTypes",[a,b])};SWFUpload.prototype.setFileSizeLimit=function(a){this.settings.file_size_limit=a;this.callFlash("SetFileSizeLimit",[a])};SWFUpload.prototype.setFileUploadLimit=function(a){this.settings.file_upload_limit=a;this.callFlash("SetFileUploadLimit",[a])};SWFUpload.prototype.setFileQueueLimit=function(a){this.settings.file_queue_limit=a;this.callFlash("SetFileQueueLimit",[a])};SWFUpload.prototype.setFilePostName=function(a){this.settings.file_post_name=a;this.callFlash("SetFilePostName",[a])};SWFUpload.prototype.setUseQueryString=function(a){this.settings.use_query_string=a;this.callFlash("SetUseQueryString",[a])};SWFUpload.prototype.setRequeueOnError=function(a){this.settings.requeue_on_error=a;this.callFlash("SetRequeueOnError",[a])};SWFUpload.prototype.setHTTPSuccess=function(a){if(typeof a==="string"){a=a.replace(" ","").split(",")}this.settings.http_success=a;this.callFlash("SetHTTPSuccess",[a])};SWFUpload.prototype.setAssumeSuccessTimeout=function(a){this.settings.assume_success_timeout=a;this.callFlash("SetAssumeSuccessTimeout",[a])};SWFUpload.prototype.setDebugEnabled=function(a){this.settings.debug_enabled=a;this.callFlash("SetDebugEnabled",[a])};SWFUpload.prototype.setButtonImageURL=function(a){if(a==undefined){a=""}this.settings.button_image_url=a;this.callFlash("SetButtonImageURL",[a])};SWFUpload.prototype.setButtonDimensions=function(c,a){this.settings.button_width=c;this.settings.button_height=a;var b=this.getMovieElement();if(b!=undefined){b.style.width=c+"px";b.style.height=a+"px"}this.callFlash("SetButtonDimensions",[c,a])};SWFUpload.prototype.setButtonText=function(a){this.settings.button_text=a;this.callFlash("SetButtonText",[a])};SWFUpload.prototype.setButtonTextPadding=function(b,a){this.settings.button_text_top_padding=a;this.settings.button_text_left_padding=b;this.callFlash("SetButtonTextPadding",[b,a])};SWFUpload.prototype.setButtonTextStyle=function(a){this.settings.button_text_style=a;this.callFlash("SetButtonTextStyle",[a])};SWFUpload.prototype.setButtonDisabled=function(a){this.settings.button_disabled=a;this.callFlash("SetButtonDisabled",[a])};SWFUpload.prototype.setButtonAction=function(a){this.settings.button_action=a;this.callFlash("SetButtonAction",[a])};SWFUpload.prototype.setButtonCursor=function(a){this.settings.button_cursor=a;this.callFlash("SetButtonCursor",[a])};SWFUpload.prototype.queueEvent=function(b,c){if(c==undefined){c=[]}else{if(!(c instanceof Array)){c=[c]}}var a=this;if(typeof this.settings[b]==="function"){this.eventQueue.push(function(){this.settings[b].apply(this,c)});setTimeout(function(){a.executeNextEvent()},0)}else{if(this.settings[b]!==null){throw"Event handler "+b+" is unknown or is not a function"}}};SWFUpload.prototype.executeNextEvent=function(){var a=this.eventQueue?this.eventQueue.shift():null;if(typeof(a)==="function"){a.apply(this)}};SWFUpload.prototype.unescapeFilePostParams=function(c){var e=/[$]([0-9a-f]{4})/i,f={},d,a,b;if(c!=undefined){for(a in c.post){if(c.post.hasOwnProperty(a)){d=a;while((b=e.exec(d))!==null){d=d.replace(b[0],String.fromCharCode(parseInt("0x"+b[1],16)))}f[d]=c.post[a]}}c.post=f}return c};SWFUpload.prototype.testExternalInterface=function(){try{return this.callFlash("TestExternalInterface")}catch(a){return false}};SWFUpload.prototype.flashReady=function(){var a=this.getMovieElement();if(!a){this.debug("Flash called back ready but the flash movie can't be found.");return}this.cleanUp(a);this.queueEvent("swfupload_loaded_handler")};SWFUpload.prototype.cleanUp=function(a){var c;try{if(this.movieElement&&typeof(a.CallFunction)==="unknown"){this.debug("Removing Flash functions hooks (this should only run in IE and should prevent memory leaks)");for(c in a){try{if(typeof(a[c])==="function"){a[c]=null}}catch(b){}}}}catch(d){}window.__flash__removeCallback=function(e,f){try{if(e){e[f]=null}}catch(g){}}};SWFUpload.prototype.fileDialogStart=function(){this.queueEvent("file_dialog_start_handler")};SWFUpload.prototype.fileQueued=function(a){a=this.unescapeFilePostParams(a);this.queueEvent("file_queued_handler",a)};SWFUpload.prototype.fileQueueError=function(a,c,b){a=this.unescapeFilePostParams(a);this.queueEvent("file_queue_error_handler",[a,c,b])};SWFUpload.prototype.fileDialogComplete=function(b,c,a){this.queueEvent("file_dialog_complete_handler",[b,c,a])};SWFUpload.prototype.uploadStart=function(a){a=this.unescapeFilePostParams(a);this.queueEvent("return_upload_start_handler",a)};SWFUpload.prototype.returnUploadStart=function(a){var b;if(typeof this.settings.upload_start_handler==="function"){a=this.unescapeFilePostParams(a);b=this.settings.upload_start_handler.call(this,a)}else{if(this.settings.upload_start_handler!=undefined){throw"upload_start_handler must be a function"}}if(b===undefined){b=true}b=!!b;this.callFlash("ReturnUploadStart",[b])};SWFUpload.prototype.uploadProgress=function(a,c,b){a=this.unescapeFilePostParams(a);this.queueEvent("upload_progress_handler",[a,c,b])};SWFUpload.prototype.uploadError=function(a,c,b){a=this.unescapeFilePostParams(a);this.queueEvent("upload_error_handler",[a,c,b])};SWFUpload.prototype.uploadSuccess=function(b,a,c){b=this.unescapeFilePostParams(b);this.queueEvent("upload_success_handler",[b,a,c])};SWFUpload.prototype.uploadComplete=function(a){a=this.unescapeFilePostParams(a);this.queueEvent("upload_complete_handler",a)};SWFUpload.prototype.debug=function(a){this.queueEvent("debug_handler",a)}; +// swfupload.queue +var SWFUpload;if(typeof(SWFUpload)==="function"){SWFUpload.queue={};SWFUpload.prototype.initSettings=(function(a){return function(){if(typeof(a)==="function"){a.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(a){this.queueSettings.queue_cancelled_flag=false;this.callFlash("StartUpload",[a])};SWFUpload.prototype.cancelQueue=function(){this.queueSettings.queue_cancelled_flag=true;this.stopUpload();var a=this.getStats();while(a.files_queued>0){this.cancelUpload();a=this.getStats()}};SWFUpload.queue.uploadStartHandler=function(a){var b;if(typeof(this.queueSettings.user_upload_start_handler)==="function"){b=this.queueSettings.user_upload_start_handler.call(this,a)}b=(b===false)?false:true;this.queueSettings.queue_cancelled_flag=!b;return b};SWFUpload.queue.uploadCompleteHandler=function(b){var c=this.queueSettings.user_upload_complete_handler,d,a;if(b.filestatus===SWFUpload.FILE_STATUS.COMPLETE){this.queueSettings.queue_upload_count++}if(typeof(c)==="function"){d=(c.call(this,b)===false)?false:true}else{if(b.filestatus===SWFUpload.FILE_STATUS.QUEUED){d=false}else{d=true}}if(d){a=this.getStats();if(a.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}}}}}; +// swfobject +var swfobject=function(){var b="undefined",Q="object",n="Shockwave Flash",p="ShockwaveFlash.ShockwaveFlash",P="application/x-shockwave-flash",m="SWFObjectExprInst",j=window,K=document,T=navigator,o=[],N=[],i=[],d=[],J,Z=null,M=null,l=null,e=false,A=false;var h=function(){var v=typeof K.getElementById!=b&&typeof K.getElementsByTagName!=b&&typeof K.createElement!=b,AC=[0,0,0],x=null;if(typeof T.plugins!=b&&typeof T.plugins[n]==Q){x=T.plugins[n].description;if(x&&!(typeof T.mimeTypes!=b&&T.mimeTypes[P]&&!T.mimeTypes[P].enabledPlugin)){x=x.replace(/^.*\s+(\S+\s+\S+$)/,"$1");AC[0]=parseInt(x.replace(/^(.*)\..*$/,"$1"),10);AC[1]=parseInt(x.replace(/^.*\.(.*)\s.*$/,"$1"),10);AC[2]=/r/.test(x)?parseInt(x.replace(/^.*r(.*)$/,"$1"),10):0}}else{if(typeof j.ActiveXObject!=b){var y=null,AB=false;try{y=new ActiveXObject(p+".7")}catch(t){try{y=new ActiveXObject(p+".6");AC=[6,0,21];y.AllowScriptAccess="always"}catch(t){if(AC[0]==6){AB=true}}if(!AB){try{y=new ActiveXObject(p)}catch(t){}}}if(!AB&&y){try{x=y.GetVariable("$version");if(x){x=x.split(" ")[1].split(",");AC=[parseInt(x[0],10),parseInt(x[1],10),parseInt(x[2],10)]}}catch(t){}}}}var AD=T.userAgent.toLowerCase(),r=T.platform.toLowerCase(),AA=/webkit/.test(AD)?parseFloat(AD.replace(/^.*webkit\/(\d+(\.\d+)?).*$/,"$1")):false,q=false,z=r?/win/.test(r):/win/.test(AD),w=r?/mac/.test(r):/mac/.test(AD);/*@cc_on q=true;@if(@_win32)z=true;@elif(@_mac)w=true;@end@*/return{w3cdom:v,pv:AC,webkit:AA,ie:q,win:z,mac:w}}();var L=function(){if(!h.w3cdom){return }f(H);if(h.ie&&h.win){try{K.write(" + + + +
    + +
    + + + + + diff --git a/src/wp-includes/js/tinymce/plugins/inlinepopups/editor_plugin.js b/src/wp-includes/js/tinymce/plugins/inlinepopups/editor_plugin.js new file mode 100644 index 0000000..ef64817 --- /dev/null +++ b/src/wp-includes/js/tinymce/plugins/inlinepopups/editor_plugin.js @@ -0,0 +1 @@ +(function(){var d=tinymce.DOM,b=tinymce.dom.Element,a=tinymce.dom.Event,e=tinymce.each,c=tinymce.is;tinymce.create("tinymce.plugins.InlinePopups",{init:function(f,g){f.onBeforeRenderUI.add(function(){f.windowManager=new tinymce.InlineWindowManager(f);d.loadCSS(g+"/skins/"+(f.settings.inlinepopups_skin||"clearlooks2")+"/window.css")})},getInfo:function(){return{longname:"InlinePopups",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/inlinepopups",version:tinymce.majorVersion+"."+tinymce.minorVersion}}});tinymce.create("tinymce.InlineWindowManager:tinymce.WindowManager",{InlineWindowManager:function(f){var g=this;g.parent(f);g.zIndex=300000;g.count=0;g.windows={}},open:function(s,j){var z=this,i,k="",r=z.editor,g=0,v=0,h,m,o,q,l,x,y,n;s=s||{};j=j||{};if(!s.inline){return z.parent(s,j)}n=z._frontWindow();if(n&&d.get(n.id+"_ifr")){n.focussedElement=d.get(n.id+"_ifr").contentWindow.document.activeElement}if(!s.type){z.bookmark=r.selection.getBookmark(1)}i=d.uniqueId();h=d.getViewPort();s.width=parseInt(s.width||320);s.height=parseInt(s.height||240)+(tinymce.isIE?8:0);s.min_width=parseInt(s.min_width||150);s.min_height=parseInt(s.min_height||100);s.max_width=parseInt(s.max_width||2000);s.max_height=parseInt(s.max_height||2000);s.left=s.left||Math.round(Math.max(h.x,h.x+(h.w/2)-(s.width/2)));s.top=s.top||Math.round(Math.max(h.y,h.y+(h.h/2)-(s.height/2)));s.movable=s.resizable=true;j.mce_width=s.width;j.mce_height=s.height;j.mce_inline=true;j.mce_window_id=i;j.mce_auto_focus=s.auto_focus;z.features=s;z.params=j;z.onOpen.dispatch(z,s,j);if(s.type){k+=" mceModal";if(s.type){k+=" mce"+s.type.substring(0,1).toUpperCase()+s.type.substring(1)}s.resizable=false}if(s.statusbar){k+=" mceStatusbar"}if(s.resizable){k+=" mceResizable"}if(s.minimizable){k+=" mceMinimizable"}if(s.maximizable){k+=" mceMaximizable"}if(s.movable){k+=" mceMovable"}z._addAll(d.doc.body,["div",{id:i,role:"dialog","aria-labelledby":s.type?i+"_content":i+"_title","class":(r.settings.inlinepopups_skin||"clearlooks2")+(tinymce.isIE&&window.getSelection?" ie9":""),style:"width:100px;height:100px"},["div",{id:i+"_wrapper","class":"mceWrapper"+k},["div",{id:i+"_top","class":"mceTop"},["div",{"class":"mceLeft"}],["div",{"class":"mceCenter"}],["div",{"class":"mceRight"}],["span",{id:i+"_title"},s.title||""]],["div",{id:i+"_middle","class":"mceMiddle"},["div",{id:i+"_left","class":"mceLeft",tabindex:"0"}],["span",{id:i+"_content"}],["div",{id:i+"_right","class":"mceRight",tabindex:"0"}]],["div",{id:i+"_bottom","class":"mceBottom"},["div",{"class":"mceLeft"}],["div",{"class":"mceCenter"}],["div",{"class":"mceRight"}],["span",{id:i+"_status"},"Content"]],["a",{"class":"mceMove",tabindex:"-1",href:"javascript:;"}],["a",{"class":"mceMin",tabindex:"-1",href:"javascript:;",onmousedown:"return false;"}],["a",{"class":"mceMax",tabindex:"-1",href:"javascript:;",onmousedown:"return false;"}],["a",{"class":"mceMed",tabindex:"-1",href:"javascript:;",onmousedown:"return false;"}],["a",{"class":"mceClose",tabindex:"-1",href:"javascript:;",onmousedown:"return false;"}],["a",{id:i+"_resize_n","class":"mceResize mceResizeN",tabindex:"-1",href:"javascript:;"}],["a",{id:i+"_resize_s","class":"mceResize mceResizeS",tabindex:"-1",href:"javascript:;"}],["a",{id:i+"_resize_w","class":"mceResize mceResizeW",tabindex:"-1",href:"javascript:;"}],["a",{id:i+"_resize_e","class":"mceResize mceResizeE",tabindex:"-1",href:"javascript:;"}],["a",{id:i+"_resize_nw","class":"mceResize mceResizeNW",tabindex:"-1",href:"javascript:;"}],["a",{id:i+"_resize_ne","class":"mceResize mceResizeNE",tabindex:"-1",href:"javascript:;"}],["a",{id:i+"_resize_sw","class":"mceResize mceResizeSW",tabindex:"-1",href:"javascript:;"}],["a",{id:i+"_resize_se","class":"mceResize mceResizeSE",tabindex:"-1",href:"javascript:;"}]]]);d.setStyles(i,{top:-10000,left:-10000});if(tinymce.isGecko){d.setStyle(i,"overflow","auto")}if(!s.type){g+=d.get(i+"_left").clientWidth;g+=d.get(i+"_right").clientWidth;v+=d.get(i+"_top").clientHeight;v+=d.get(i+"_bottom").clientHeight}d.setStyles(i,{top:s.top,left:s.left,width:s.width+g,height:s.height+v});y=s.url||s.file;if(y){if(tinymce.relaxedDomain){y+=(y.indexOf("?")==-1?"?":"&")+"mce_rdomain="+tinymce.relaxedDomain}y=tinymce._addVer(y)}if(!s.type){d.add(i+"_content","iframe",{id:i+"_ifr",src:'javascript:""',frameBorder:0,style:"border:0;width:10px;height:10px"});d.setStyles(i+"_ifr",{width:s.width,height:s.height});d.setAttrib(i+"_ifr","src",y)}else{d.add(i+"_wrapper","a",{id:i+"_ok","class":"mceButton mceOk",href:"javascript:;",onmousedown:"return false;"},"Ok");if(s.type=="confirm"){d.add(i+"_wrapper","a",{"class":"mceButton mceCancel",href:"javascript:;",onmousedown:"return false;"},"Cancel")}d.add(i+"_middle","div",{"class":"mceIcon"});d.setHTML(i+"_content",s.content.replace("\n","
    "));a.add(i,"keyup",function(f){var p=27;if(f.keyCode===p){s.button_func(false);return a.cancel(f)}});a.add(i,"keydown",function(f){var t,p=9;if(f.keyCode===p){t=d.select("a.mceCancel",i+"_wrapper")[0];if(t&&t!==f.target){t.focus()}else{d.get(i+"_ok").focus()}return a.cancel(f)}})}o=a.add(i,"mousedown",function(t){var u=t.target,f,p;f=z.windows[i];z.focus(i);if(u.nodeName=="A"||u.nodeName=="a"){if(u.className=="mceMax"){f.oldPos=f.element.getXY();f.oldSize=f.element.getSize();p=d.getViewPort();p.w-=2;p.h-=2;f.element.moveTo(p.x,p.y);f.element.resizeTo(p.w,p.h);d.setStyles(i+"_ifr",{width:p.w-f.deltaWidth,height:p.h-f.deltaHeight});d.addClass(i+"_wrapper","mceMaximized")}else{if(u.className=="mceMed"){f.element.moveTo(f.oldPos.x,f.oldPos.y);f.element.resizeTo(f.oldSize.w,f.oldSize.h);f.iframeElement.resizeTo(f.oldSize.w-f.deltaWidth,f.oldSize.h-f.deltaHeight);d.removeClass(i+"_wrapper","mceMaximized")}else{if(u.className=="mceMove"){return z._startDrag(i,t,u.className)}else{if(d.hasClass(u,"mceResize")){return z._startDrag(i,t,u.className.substring(13))}}}}}});q=a.add(i,"click",function(f){var p=f.target;z.focus(i);if(p.nodeName=="A"||p.nodeName=="a"){switch(p.className){case"mceClose":z.close(null,i);return a.cancel(f);case"mceButton mceOk":case"mceButton mceCancel":s.button_func(p.className=="mceButton mceOk");return a.cancel(f)}}});a.add([i+"_left",i+"_right"],"focus",function(p){var t=d.get(i+"_ifr");if(t){var f=t.contentWindow.document.body;var u=d.select(":input:enabled,*[tabindex=0]",f);if(p.target.id===(i+"_left")){u[u.length-1].focus()}else{u[0].focus()}}else{d.get(i+"_ok").focus()}});x=z.windows[i]={id:i,mousedown_func:o,click_func:q,element:new b(i,{blocker:1,container:r.getContainer()}),iframeElement:new b(i+"_ifr"),features:s,deltaWidth:g,deltaHeight:v};x.iframeElement.on("focus",function(){z.focus(i)});if(z.count==0&&z.editor.getParam("dialog_type","modal")=="modal"){d.add(d.doc.body,"div",{id:"mceModalBlocker","class":(z.editor.settings.inlinepopups_skin||"clearlooks2")+"_modalBlocker",style:{zIndex:z.zIndex-1}});d.show("mceModalBlocker");d.setAttrib(d.doc.body,"aria-hidden","true")}else{d.setStyle("mceModalBlocker","z-index",z.zIndex-1)}if(tinymce.isIE6||/Firefox\/2\./.test(navigator.userAgent)||(tinymce.isIE&&!d.boxModel)){d.setStyles("mceModalBlocker",{position:"absolute",left:h.x,top:h.y,width:h.w-2,height:h.h-2})}d.setAttrib(i,"aria-hidden","false");z.focus(i);z._fixIELayout(i,1);if(d.get(i+"_ok")){d.get(i+"_ok").focus()}z.count++;return x},focus:function(h){var g=this,f;if(f=g.windows[h]){f.zIndex=this.zIndex++;f.element.setStyle("zIndex",f.zIndex);f.element.update();h=h+"_wrapper";d.removeClass(g.lastId,"mceFocus");d.addClass(h,"mceFocus");g.lastId=h;if(f.focussedElement){f.focussedElement.focus()}else{if(d.get(h+"_ok")){d.get(f.id+"_ok").focus()}else{if(d.get(f.id+"_ifr")){d.get(f.id+"_ifr").focus()}}}}},_addAll:function(k,h){var g,l,f=this,j=tinymce.DOM;if(c(h,"string")){k.appendChild(j.doc.createTextNode(h))}else{if(h.length){k=k.appendChild(j.create(h[0],h[1]));for(g=2;gf){g=h;f=h.zIndex}});return g},setTitle:function(f,g){var h;f=this._findId(f);if(h=d.get(f+"_title")){h.innerHTML=d.encode(g)}},alert:function(g,f,j){var i=this,h;h=i.open({title:i,type:"alert",button_func:function(k){if(f){f.call(k||i,k)}i.close(null,h.id)},content:d.encode(i.editor.getLang(g,g)),inline:1,width:400,height:130})},confirm:function(g,f,j){var i=this,h;h=i.open({title:i,type:"confirm",button_func:function(k){if(f){f.call(k||i,k)}i.close(null,h.id)},content:d.encode(i.editor.getLang(g,g)),inline:1,width:400,height:130})},_findId:function(f){var g=this;if(typeof(f)=="string"){return f}e(g.windows,function(h){var i=d.get(h.id+"_ifr");if(i&&f==i.contentWindow){f=h.id;return false}});return f},_fixIELayout:function(i,h){var f,g;if(!tinymce.isIE6){return}e(["n","s","w","e","nw","ne","sw","se"],function(j){var k=d.get(i+"_resize_"+j);d.setStyles(k,{width:h?k.clientWidth:"",height:h?k.clientHeight:"",cursor:d.getStyle(k,"cursor",1)});d.setStyle(i+"_bottom","bottom","-1px");k=0});if(f=this.windows[i]){f.element.hide();f.element.show();e(d.select("div,a",i),function(k,j){if(k.currentStyle.backgroundImage!="none"){g=new Image();g.src=k.currentStyle.backgroundImage.replace(/url\(\"(.+)\"\)/,"$1")}});d.get(i).style.filter=""}}});tinymce.PluginManager.add("inlinepopups",tinymce.plugins.InlinePopups)})(); \ No newline at end of file diff --git a/src/wp-includes/js/tinymce/plugins/inlinepopups/skins/clearlooks2/img/alert.gif b/src/wp-includes/js/tinymce/plugins/inlinepopups/skins/clearlooks2/img/alert.gif new file mode 100644 index 0000000000000000000000000000000000000000..94abd08763fffdaa0dd5c5afb470a97294f2b94d GIT binary patch literal 818 zcmV-21I_$LNk%w1VITk?0OkMyy?1uhZf>Is3*B5?sT&&Hqoc$;Jkrt6&k+&QHa5gV zL)l77I5;@fLqpYMWV+*+oUyj*ia`4%)P|vrSClaB!?EE7K$--(_XZ zOH0lO2-#9n!;Fik78a-!6wR}-yS%#378ch%J=j4(x@2V5*3{b0&C|=t(mFcQDJi8A z60bTsucxKY8XD3{O5bW~+gDfHP*AZbD54S)*gHGL#>A(co5`c08yg$Yzr7_TCCA9d zs-U0MFfhzxW4%d9s-K?K($LSkxy-Sz(7?Xdn3%wSe#oDmxL#e?qN1My0^C(q&nzt3 zjEvWFbJcly)5*uu)6w93eACp@*{!X#QBc56PRYv1%goBm&CA4*kj9vnyFxN00960|JK*lA^8LV00000EC2ui z03ZM$000O7fPaF6goTEOh>41ejE#5-A-Y zDMkRMg$FSdD>XGe76Lo4g8*}CUeivLI}B6rYIE)9Vh306CXDUKb=Dfx`}wT=u<6# zD$n)U&_b6YEgl901IUC4zyf`27&(S$$E;fb{Wx)wm4^u-0H zv*CdXLINn%=tH`+>C>qDxJcmTfS@*Z45S!AI|Ya#EOHOnP2`2|1;88Ju#tey5e=^) w9O1*fx%21Hn;(HtX3!cMK%gku&b_<$??7lEkM$&p`Sa-0r)T3DnWI1eJD_KQDgXcg literal 0 HcmV?d00001 diff --git a/src/wp-includes/js/tinymce/plugins/inlinepopups/skins/clearlooks2/img/button.gif b/src/wp-includes/js/tinymce/plugins/inlinepopups/skins/clearlooks2/img/button.gif new file mode 100644 index 0000000000000000000000000000000000000000..e671094cb0eb210b756117f992cf5ca2caa698fd GIT binary patch literal 280 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 literal 0 HcmV?d00001 diff --git a/src/wp-includes/js/tinymce/plugins/inlinepopups/skins/clearlooks2/img/drag.gif b/src/wp-includes/js/tinymce/plugins/inlinepopups/skins/clearlooks2/img/drag.gif new file mode 100644 index 0000000000000000000000000000000000000000..bf0a03ee41fc078b2cb6453dee7876806d4a8871 GIT binary patch literal 57 zcmZ?wbhEHbWMg1sn8?78mX`J(3>X*~6o0a?iZC!S=m6P3SvCd+Cax*G>Jx7Ko{_zV Hfx#L8;BF8E literal 0 HcmV?d00001 diff --git a/src/wp-includes/js/tinymce/plugins/inlinepopups/skins/clearlooks2/img/horizontal.gif b/src/wp-includes/js/tinymce/plugins/inlinepopups/skins/clearlooks2/img/horizontal.gif new file mode 100644 index 0000000000000000000000000000000000000000..c2a2ad454db194e428a7b9da40f62d5376a17428 GIT binary patch literal 769 zcmb7?=`WiB0LI^D)(HC`v6*aD4AW#LGRb0Oi$tH~CP=nb%N%8n zy02ceuewTUUDeW|RaMp*TlLV6R$o=rQOY{@AME+?`}QQiCwU%4Jq)?`{5B8=ECT1T z+wH!7{zji$)-UA>D9({)xO1SJGLHK54Mat(}s4_unMiKjB85EHng*~!Ddt+?(c5uHG4ZI zsc>jP#5Y6w6Wj5!Y=0^oK*&D+R;Yh@ze z7vfi;qFW{owiOfGqcB@XkwUZ0j?Km4{qjE- z6c!Z|O1!?5l~+^}tE#*^aCo0?lZ$rLKBwT;dI+nLO(UEMvb-ad9elEWPw8Xg(t zx$y<#6T+{PQ@$ecjAT|iC%dxnP5yoH$I`OLFU5*drPiz>bidcu^@a^2v}rP3-`?4^ z?Cl>M-Z(n8ot*x$0~Z|;ku35!-qAHSQN*GM3tW8AN#VWJNrHQD+6qXfO_zB^6eFVU zOjzupAb0*`W8} zQVeE5Djt<a0+Owme6r2OGio7DoTWqkhGKj0`0*1-*<$#uL5YH*kC8Z>wpCvYO~asp;G r-~A;>$wp)vkltB=c_?k6Zw*FUgrbAm;sB08O9+}m=}H3OFd*zN8L+JA literal 0 HcmV?d00001 diff --git a/src/wp-includes/js/tinymce/plugins/inlinepopups/skins/clearlooks2/img/vertical.gif b/src/wp-includes/js/tinymce/plugins/inlinepopups/skins/clearlooks2/img/vertical.gif new file mode 100644 index 0000000000000000000000000000000000000000..43a735f22c81d6d7d99c1ba9f034f38bfdd1a92b GIT binary patch literal 92 zcmZ?wbhEHb&D4o4FLHO9PR)B literal 0 HcmV?d00001 diff --git a/src/wp-includes/js/tinymce/plugins/inlinepopups/skins/clearlooks2/window.css b/src/wp-includes/js/tinymce/plugins/inlinepopups/skins/clearlooks2/window.css new file mode 100644 index 0000000..1001789 --- /dev/null +++ b/src/wp-includes/js/tinymce/plugins/inlinepopups/skins/clearlooks2/window.css @@ -0,0 +1,136 @@ +/* Clearlooks 2 */ + +/* Reset */ +.clearlooks2, .clearlooks2 div, .clearlooks2 span, .clearlooks2 a {vertical-align:baseline; text-align:left; position:absolute; border:0; padding:0; margin:0; background:transparent; font-family:Arial,Verdana; font-size:11px; color:#000; text-decoration:none; font-weight:normal; width:auto; height:auto; overflow:hidden; display:block} + +/* General */ +.clearlooks2 {position:absolute; direction:ltr} +.clearlooks2 .mceWrapper {position:static} +.mceEventBlocker {position:fixed; left:0; top:0; background:url(img/horizontal.gif) no-repeat 0 -75px; width:100%; height:100%} +.clearlooks2 .mcePlaceHolder {border:1px solid #000; background:#888; top:0; left:0; opacity:0.5; -ms-filter:'alpha(opacity=50)'; filter:alpha(opacity=50)} +.clearlooks2_modalBlocker {position:fixed; left:0; top:0; width:100%; height:100%; background:#FFF; opacity:0.6; -ms-filter:'alpha(opacity=60)'; filter:alpha(opacity=60); display:none} + +/* Top */ +.clearlooks2 .mceTop, +.clearlooks2 .mceTop div { + top:0; + width:100%; + height:23px +} +.clearlooks2 .mceTop .mceLeft { + width:55%; + background-image: none; + border-style: solid none none solid; + border-width: 1px; +} +.clearlooks2 .mceTop .mceCenter { +} +.clearlooks2 .mceTop .mceRight { + right:0; + width:55%; + height:23px; + background-image: none; + border-style: solid solid none none; + border-width: 1px; +} +.clearlooks2 .mceTop span { + width:100%; + font: 12px/20px bold "Lucida Grande","Lucida Sans Unicode",Tahoma,Verdana,sans-serif; + text-align:center; + vertical-align:middle; + line-height:23px; + font-weight:bold; +} +.clearlooks2 .mceFocus .mceTop .mceLeft { + background-image: none; + border-style: solid none none solid; + border-width: 1px; +} +.clearlooks2 .mceFocus .mceTop .mceCenter { +} +.clearlooks2 .mceFocus .mceTop .mceRight { + background-image: none; + border-style: solid solid none none; + border-width: 1px; +} +.clearlooks2 .mceFocus .mceTop span { +color:#FFF +} + +/* Middle */ +.clearlooks2 .mceMiddle, .clearlooks2 .mceMiddle div {top:0} +.clearlooks2 .mceMiddle {width:100%; height:100%; clip:rect(23px auto auto auto)} +.clearlooks2 .mceMiddle .mceLeft {left:0; width:5px; height:100%; background:#E4F2FD;border-left:1px solid #c6d9e9} +.clearlooks2 .mceMiddle span {top:23px; left:5px; width:100%; height:100%; background:#FFF} +.clearlooks2 .mceMiddle .mceRight {right:0; width:5px; height:100%; background:#E4F2FD;border-right:1px solid #c6d9e9} + +/* Bottom */ +.clearlooks2 .mceBottom, .clearlooks2 .mceBottom div {height:6px} +.clearlooks2 .mceBottom {left:0; bottom:0; width:100%;background:#E4F2FD;border-bottom:1px solid #c6d9e9} +.clearlooks2 .mceBottom div {top:0} +.clearlooks2 .mceBottom .mceLeft {left:0; width:5px; background:#E4F2FD ;border-left:1px solid #c6d9e9} +.clearlooks2 .mceBottom .mceCenter {left:5px; width:100%} +.clearlooks2 .mceBottom .mceRight {right:0; width:6px; background:#E4F2FD url(img/drag.gif) no-repeat;border-right:1px solid #c6d9e9} +.clearlooks2 .mceBottom span {display:none} +.clearlooks2 .mceStatusbar .mceBottom, .clearlooks2 .mceStatusbar .mceBottom div {height:23px} +.clearlooks2 .mceStatusbar .mceBottom .mceLeft {background:url(img/corners.gif) -29px 0} +.clearlooks2 .mceStatusbar .mceBottom .mceCenter {background:url(img/horizontal.gif) 0 -52px} +.clearlooks2 .mceStatusbar .mceBottom .mceRight {background:url(img/corners.gif) -24px 0} +.clearlooks2 .mceStatusbar .mceBottom span {display:block; left:7px; font-family:Arial, Verdana; font-size:11px; line-height:23px} + +/* Actions */ +.clearlooks2 a {width:29px; height:16px; top:3px} +.clearlooks2 .mceClose {right:6px; background:url(img/buttons.gif) -87px 0} +.clearlooks2 .mceMin {display:none; right:68px; background:url(img/buttons.gif) 0 0} +.clearlooks2 .mceMed {display:none; right:37px; background:url(img/buttons.gif) -29px 0} +.clearlooks2 .mceMax {display:none; right:37px; background:url(img/buttons.gif) -58px 0} +.clearlooks2 .mceMove {display:none;width:100%;cursor:move;background:url(img/corners.gif) no-repeat -100px -100px} +.clearlooks2 .mceMovable .mceMove {display:block} +.clearlooks2 .mceFocus .mceClose {right:6px; background:url(img/buttons.gif) -87px -16px} +.clearlooks2 .mceFocus .mceMin {right:68px; background:url(img/buttons.gif) 0 -16px} +.clearlooks2 .mceFocus .mceMed {right:37px; background:url(img/buttons.gif) -29px -16px} +.clearlooks2 .mceFocus .mceMax {right:37px; background:url(img/buttons.gif) -58px -16px} +.clearlooks2 .mceFocus .mceClose:hover {right:6px; background:url(img/buttons.gif) -87px -32px} +.clearlooks2 .mceFocus .mceClose:hover {right:6px; background:url(img/buttons.gif) -87px -32px} +.clearlooks2 .mceFocus .mceMin:hover {right:68px; background:url(img/buttons.gif) 0 -32px} +.clearlooks2 .mceFocus .mceMed:hover {right:37px; background:url(img/buttons.gif) -29px -32px} +.clearlooks2 .mceFocus .mceMax:hover {right:37px; background:url(img/buttons.gif) -58px -32px} + +/* Resize */ +.clearlooks2 .mceResize {top:auto; left:auto; display:none; width:5px; height:5px; background:url(img/horizontal.gif) no-repeat 0 -75px} +.clearlooks2 .mceResizable .mceResize {display:block} +.clearlooks2 .mceResizable .mceMin, .clearlooks2 .mceMax {display:none} +.clearlooks2 .mceMinimizable .mceMin {display:block} +.clearlooks2 .mceMaximizable .mceMax {display:block} +.clearlooks2 .mceMaximized .mceMed {display:block} +.clearlooks2 .mceMaximized .mceMax {display:none} +.clearlooks2 a.mceResizeN {top:0; left:0; width:100%; cursor:n-resize} +.clearlooks2 a.mceResizeNW {top:0; left:0; cursor:nw-resize} +.clearlooks2 a.mceResizeNE {top:0; right:0; cursor:ne-resize} +.clearlooks2 a.mceResizeW {top:0; left:0; height:100%; cursor:w-resize} +.clearlooks2 a.mceResizeE {top:0; right:0; height:100%; cursor:e-resize} +.clearlooks2 a.mceResizeS {bottom:0; left:0; width:100%; cursor:s-resize} +.clearlooks2 a.mceResizeSW {bottom:0; left:0; cursor:sw-resize} +.clearlooks2 a.mceResizeSE {bottom:0; right:0; cursor:se-resize} + +/* Alert/Confirm */ +.clearlooks2 .mceButton {font-weight:bold; bottom:10px; width:80px; height:30px; background:url(img/button.gif); line-height:30px; vertical-align:middle; text-align:center; outline:0} +.clearlooks2 .mceMiddle .mceIcon {left:15px; top:35px; width:32px; height:32px} +.clearlooks2 .mceAlert .mceMiddle span, .clearlooks2 .mceConfirm .mceMiddle span {background:transparent;left:60px; top:35px; width:320px; height:50px; font-weight:bold; overflow:auto; white-space:normal} +.clearlooks2 a:hover {font-weight:bold;} +.clearlooks2 .mceAlert .mceMiddle, .clearlooks2 .mceConfirm .mceMiddle {background:#F9F9F9} +.clearlooks2 .mceAlert .mceOk {left:50%; top:auto; margin-left: -40px} +.clearlooks2 .mceAlert .mceIcon {background:url(img/alert.gif)} +.clearlooks2 .mceConfirm .mceOk {left:50%; top:auto; margin-left: -90px} +.clearlooks2 .mceConfirm .mceCancel {left:50%; top:auto} +.clearlooks2 .mceConfirm .mceIcon {background:url(img/confirm.gif)} + +/* IE9 fixes */ +.clearlooks2.ie9 .mceTop .mceCenter {clip:auto;} +.clearlooks2.ie9 .mceMiddle {clip:auto;} +.clearlooks2.ie9 .mceMiddle .mceLeft, .clearlooks2.ie9 .mceMiddle .mceRight {top: 23px;} +.clearlooks2.ie9 .mceAlert .mceMiddle span, .clearlooks2.ie9 .mceConfirm .mceMiddle span {top:13px;} +.clearlooks2.ie9 .mceModal .mceMiddle {top:23px} +.clearlooks2.ie9 .mceModal .mceMiddle .mceLeft, .clearlooks2.ie9 .mceModal .mceMiddle .mceRight {top: 0} +.clearlooks2.ie9 .mceMiddle .mceIcon {top:13px} +.clearlooks2.ie9 .mceTop .mceCenter {top:0; right:auto; left:6px; width:calc(100%-12px)} diff --git a/src/wp-includes/js/tinymce/plugins/inlinepopups/template.htm b/src/wp-includes/js/tinymce/plugins/inlinepopups/template.htm new file mode 100644 index 0000000..b376842 --- /dev/null +++ b/src/wp-includes/js/tinymce/plugins/inlinepopups/template.htm @@ -0,0 +1,387 @@ + + + +Template for dialogs + + + + +
    +
    +
    +
    +
    +
    +
    + Blured +
    + +
    +
    + Content +
    +
    + +
    +
    +
    +
    + Statusbar text. +
    + + + + + + + + + + + + + + +
    +
    + +
    +
    +
    +
    +
    +
    + Focused +
    + +
    +
    + Content +
    +
    + +
    +
    +
    +
    + Statusbar text. +
    + + + + + + + + + + + + + + +
    +
    + +
    +
    +
    +
    +
    +
    + Statusbar +
    + +
    +
    + Content +
    +
    + +
    +
    +
    +
    + Statusbar text. +
    + + + + + + + + + + + + + + +
    +
    + +
    +
    +
    +
    +
    +
    + Statusbar, Resizable +
    + +
    +
    + Content +
    +
    + +
    +
    +
    +
    + Statusbar text. +
    + + + + + + + + + + + + + + +
    +
    + +
    +
    +
    +
    +
    +
    + Resizable, Maximizable +
    + +
    +
    + Content +
    +
    + +
    +
    +
    +
    + Statusbar text. +
    + + + + + + + + + + + + + + +
    +
    + +
    +
    +
    +
    +
    +
    + Blurred, Maximizable, Statusbar, Resizable +
    + +
    +
    + Content +
    +
    + +
    +
    +
    +
    + Statusbar text. +
    + + + + + + + + + + + + + + +
    +
    + +
    +
    +
    +
    +
    +
    + Maximized, Maximizable, Minimizable +
    + +
    +
    + Content +
    +
    + +
    +
    +
    +
    + Statusbar text. +
    + + + + + + + + + + + + + + +
    +
    + +
    +
    +
    +
    +
    +
    + Blured +
    + +
    +
    + Content +
    +
    + +
    +
    +
    +
    + Statusbar text. +
    + + + + + + + + + + + + + + +
    +
    + +
    +
    +
    +
    +
    +
    + Alert +
    + +
    +
    + + This is a very long error message. This is a very long error message. + This is a very long error message. This is a very long error message. + This is a very long error message. This is a very long error message. + This is a very long error message. This is a very long error message. + This is a very long error message. This is a very long error message. + This is a very long error message. This is a very long error message. + +
    +
    +
    + +
    +
    +
    +
    +
    + + + Ok + +
    +
    + +
    +
    +
    +
    +
    +
    + Confirm +
    + +
    +
    + + This is a very long error message. This is a very long error message. + This is a very long error message. This is a very long error message. + This is a very long error message. This is a very long error message. + This is a very long error message. This is a very long error message. + This is a very long error message. This is a very long error message. + This is a very long error message. This is a very long error message. + +
    +
    +
    + +
    +
    +
    +
    +
    + + + Ok + Cancel + +
    +
    +
    + + + diff --git a/src/wp-includes/js/tinymce/plugins/media/css/media.css b/src/wp-includes/js/tinymce/plugins/media/css/media.css new file mode 100644 index 0000000..fd04898 --- /dev/null +++ b/src/wp-includes/js/tinymce/plugins/media/css/media.css @@ -0,0 +1,17 @@ +#id, #name, #hspace, #vspace, #class_name, #align { width: 100px } +#hspace, #vspace { width: 50px } +#flash_quality, #flash_align, #flash_scale, #flash_salign, #flash_wmode { width: 100px } +#flash_base, #flash_flashvars, #html5_altsource1, #html5_altsource2, #html5_poster { width: 240px } +#width, #height { width: 40px } +#src, #media_type { width: 250px } +#class { width: 120px } +#prev { margin: 0; border: 1px solid black; width: 380px; height: 260px; overflow: auto } +.panel_wrapper div.current { height: 420px; overflow: auto } +#flash_options, #shockwave_options, #qt_options, #wmp_options, #rmp_options { display: none } +.mceAddSelectValue { background-color: #DDDDDD } +#qt_starttime, #qt_endtime, #qt_fov, #qt_href, #qt_moveid, #qt_moviename, #qt_node, #qt_pan, #qt_qtsrc, #qt_qtsrcchokespeed, #qt_target, #qt_tilt, #qt_urlsubstituten, #qt_volume { width: 70px } +#wmp_balance, #wmp_baseurl, #wmp_captioningid, #wmp_currentmarker, #wmp_currentposition, #wmp_defaultframe, #wmp_playcount, #wmp_rate, #wmp_uimode, #wmp_volume { width: 70px } +#rmp_console, #rmp_numloop, #rmp_controls, #rmp_scriptcallbacks { width: 70px } +#shockwave_swvolume, #shockwave_swframe, #shockwave_swurl, #shockwave_swstretchvalign, #shockwave_swstretchhalign, #shockwave_swstretchstyle { width: 90px } +#qt_qtsrc { width: 200px } +iframe {border: 1px solid gray} diff --git a/src/wp-includes/js/tinymce/plugins/media/editor_plugin.js b/src/wp-includes/js/tinymce/plugins/media/editor_plugin.js new file mode 100644 index 0000000..6621907 --- /dev/null +++ b/src/wp-includes/js/tinymce/plugins/media/editor_plugin.js @@ -0,0 +1 @@ +(function(){var d=tinymce.explode("id,name,width,height,style,align,class,hspace,vspace,bgcolor,type"),h=tinymce.makeMap(d.join(",")),b=tinymce.html.Node,f,a,g=tinymce.util.JSON,e;f=[["Flash","d27cdb6e-ae6d-11cf-96b8-444553540000","application/x-shockwave-flash","http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"],["ShockWave","166b1bca-3f9c-11cf-8075-444553540000","application/x-director","http://download.macromedia.com/pub/shockwave/cabs/director/sw.cab#version=8,5,1,0"],["WindowsMedia","6bf52a52-394a-11d3-b153-00c04f79faa6,22d6f312-b0f6-11d0-94ab-0080c74c7e95,05589fa1-c356-11ce-bf01-00aa0055595a","application/x-mplayer2","http://activex.microsoft.com/activex/controls/mplayer/en/nsmp2inf.cab#Version=5,1,52,701"],["QuickTime","02bf25d5-8c17-4b23-bc80-d3488abddc6b","video/quicktime","http://www.apple.com/qtactivex/qtplugin.cab#version=6,0,2,0"],["RealMedia","cfcdaa03-8be4-11cf-b84b-0020afbbccfa","audio/x-pn-realaudio-plugin","http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"],["Java","8ad9c840-044e-11d1-b3e9-00805f499d93","application/x-java-applet","http://java.sun.com/products/plugin/autodl/jinstall-1_5_0-windows-i586.cab#Version=1,5,0,0"],["Silverlight","dfeaf541-f3e1-4c24-acac-99c30715084a","application/x-silverlight-2"],["Iframe"],["Video"]];function c(m){var l,j,k;if(m&&!m.splice){j=[];for(k=0;true;k++){if(m[k]){j[k]=m[k]}else{break}}return j}return m}tinymce.create("tinymce.plugins.MediaPlugin",{init:function(n,j){var r=this,l={},m,p,q,k;function o(i){return i&&i.nodeName==="IMG"&&n.dom.hasClass(i,"mceItemMedia")}r.editor=n;r.url=j;a="";for(m=0;m0){L+=(L?"&":"")+M+"="+escape(N)}});if(L.length){D.params.flashvars=L}I=o.getParam("flash_video_player_params",{allowfullscreen:true,allowscriptaccess:true});tinymce.each(I,function(N,M){D.params[M]=""+N})}}D=g.parse(x.attr("data-mce-json"));p=this.getType(x.attr("class"));z=x.attr("data-mce-style");if(!z){z=x.attr("style");if(z){z=o.dom.serializeStyle(o.dom.parseStyle(z,"img"))}}if(p.name==="Iframe"){v=new b("iframe",1);tinymce.each(d,function(i){var G=x.attr(i);if(i=="class"&&G){G=G.replace(/mceItem.+ ?/g,"")}if(G&&G.length>0){v.attr(i,G)}});for(F in D.params){v.attr(F,D.params[F])}v.attr({style:z,src:D.params.src});x.replace(v);return}if(this.editor.settings.media_use_script){v=new b("script",1).attr("type","text/javascript");w=new b("#text",3);w.value="write"+p.name+"("+g.serialize(tinymce.extend(D.params,{width:x.attr("width"),height:x.attr("height")}))+");";v.append(w);x.replace(v);return}if(p.name==="Video"&&D.video.sources[0]){A=new b("video",1).attr(tinymce.extend({id:x.attr("id"),width:x.attr("width"),height:x.attr("height"),style:z},D.video.attrs));if(D.video.attrs){l=D.video.attrs.poster}k=D.video.sources=c(D.video.sources);for(y=0;y'; + + h += ''); + + function get(id) { + return document.getElementById(id); + } + + function getVal(id) { + var elm = get(id); + + if (elm.nodeName == "SELECT") + return elm.options[elm.selectedIndex].value; + + if (elm.type == "checkbox") + return elm.checked; + + return elm.value; + } + + function setVal(id, value) { + if (typeof(value) != 'undefined') { + var elm = get(id); + + if (elm.nodeName == "SELECT") + selectByValue(document.forms[0], id, value); + else if (elm.type == "checkbox") { + if (typeof(value) == 'string') + elm.checked = value.toLowerCase() === 'true' ? true : false; + else + elm.checked = !!value; + } else + elm.value = value; + } + } + + window.Media = { + init : function() { + var html, editor; + + this.editor = editor = tinyMCEPopup.editor; + + // Setup file browsers and color pickers + get('filebrowsercontainer').innerHTML = getBrowserHTML('filebrowser','src','media','media'); + get('qtsrcfilebrowsercontainer').innerHTML = getBrowserHTML('qtsrcfilebrowser','quicktime_qtsrc','media','media'); + get('bgcolor_pickcontainer').innerHTML = getColorPickerHTML('bgcolor_pick','bgcolor'); + get('video_altsource1_filebrowser').innerHTML = getBrowserHTML('filebrowser_altsource1','video_altsource1','media','media'); + get('video_altsource2_filebrowser').innerHTML = getBrowserHTML('filebrowser_altsource2','video_altsource2','media','media'); + get('video_poster_filebrowser').innerHTML = getBrowserHTML('filebrowser_poster','video_poster','media','image'); + + html = this.getMediaListHTML('medialist', 'src', 'media', 'media'); + if (html == "") + get("linklistrow").style.display = 'none'; + else + get("linklistcontainer").innerHTML = html; + + if (isVisible('filebrowser')) + get('src').style.width = '230px'; + + if (isVisible('filebrowser_altsource1')) + get('video_altsource1').style.width = '220px'; + + if (isVisible('filebrowser_altsource2')) + get('video_altsource2').style.width = '220px'; + + if (isVisible('filebrowser_poster')) + get('video_poster').style.width = '220px'; + + this.data = tinyMCEPopup.getWindowArg('data'); + this.dataToForm(); + this.preview(); + }, + + insert : function() { + var editor = tinyMCEPopup.editor; + + this.formToData(); + editor.execCommand('mceRepaint'); + tinyMCEPopup.restoreSelection(); + editor.selection.setNode(editor.plugins.media.dataToImg(this.data)); + tinyMCEPopup.close(); + }, + + preview : function() { + get('prev').innerHTML = this.editor.plugins.media.dataToHtml(this.data, true); + }, + + moveStates : function(to_form, field) { + var data = this.data, editor = this.editor, data = this.data, + mediaPlugin = editor.plugins.media, ext, src, typeInfo, defaultStates, src; + + defaultStates = { + // QuickTime + quicktime_autoplay : true, + quicktime_controller : true, + + // Flash + flash_play : true, + flash_loop : true, + flash_menu : true, + + // WindowsMedia + windowsmedia_autostart : true, + windowsmedia_enablecontextmenu : true, + windowsmedia_invokeurls : true, + + // RealMedia + realmedia_autogotourl : true, + realmedia_imagestatus : true + }; + + function parseQueryParams(str) { + var out = {}; + + if (str) { + tinymce.each(str.split('&'), function(item) { + var parts = item.split('='); + + out[unescape(parts[0])] = unescape(parts[1]); + }); + } + + return out; + }; + + function setOptions(type, names) { + var i, name, formItemName, value, list; + + if (type == data.type || type == 'global') { + names = tinymce.explode(names); + for (i = 0; i < names.length; i++) { + name = names[i]; + formItemName = type == 'global' ? name : type + '_' + name; + + if (type == 'global') + list = data; + else if (type == 'video') { + list = data.video.attrs; + + if (!list && !to_form) + data.video.attrs = list = {}; + } else + list = data.params; + + if (list) { + if (to_form) { + setVal(formItemName, list[name]); + } else { + delete list[name]; + + value = getVal(formItemName); + if (type == 'video' && value === true) + value = name; + + if (defaultStates[formItemName]) { + if (value !== defaultStates[formItemName]) { + value = "" + value; + list[name] = value; + } + } else if (value) { + value = "" + value; + list[name] = value; + } + } + } + } + } + } + + if (!to_form) { + data.type = get('media_type').options[get('media_type').selectedIndex].value; + data.width = getVal('width'); + data.height = getVal('height'); + + // Switch type based on extension + src = getVal('src'); + if (field == 'src') { + ext = src.replace(/^.*\.([^.]+)$/, '$1'); + if (typeInfo = mediaPlugin.getType(ext)) + data.type = typeInfo.name.toLowerCase(); + + setVal('media_type', data.type); + } + + if (data.type == "video") { + if (!data.video.sources) + data.video.sources = []; + + data.video.sources[0] = {src: getVal('src')}; + } + } + + // Hide all fieldsets and show the one active + get('video_options').style.display = 'none'; + get('flash_options').style.display = 'none'; + get('quicktime_options').style.display = 'none'; + get('shockwave_options').style.display = 'none'; + get('windowsmedia_options').style.display = 'none'; + get('realmedia_options').style.display = 'none'; + + if (get(data.type + '_options')) + get(data.type + '_options').style.display = 'block'; + + setVal('media_type', data.type); + + setOptions('flash', 'play,loop,menu,swliveconnect,quality,scale,salign,wmode,base,flashvars'); + setOptions('quicktime', 'loop,autoplay,cache,controller,correction,enablejavascript,kioskmode,autohref,playeveryframe,targetcache,scale,starttime,endtime,target,qtsrcchokespeed,volume,qtsrc'); + setOptions('shockwave', 'sound,progress,autostart,swliveconnect,swvolume,swstretchstyle,swstretchhalign,swstretchvalign'); + setOptions('windowsmedia', 'autostart,enabled,enablecontextmenu,fullscreen,invokeurls,mute,stretchtofit,windowlessvideo,balance,baseurl,captioningid,currentmarker,currentposition,defaultframe,playcount,rate,uimode,volume'); + setOptions('realmedia', 'autostart,loop,autogotourl,center,imagestatus,maintainaspect,nojava,prefetch,shuffle,console,controls,numloop,scriptcallbacks'); + setOptions('video', 'poster,autoplay,loop,preload,controls'); + setOptions('global', 'id,name,vspace,hspace,bgcolor,align,width,height'); + + if (to_form) { + if (data.type == 'video') { + if (data.video.sources[0]) + setVal('src', data.video.sources[0].src); + + src = data.video.sources[1]; + if (src) + setVal('video_altsource1', src.src); + + src = data.video.sources[2]; + if (src) + setVal('video_altsource2', src.src); + } else { + // Check flash vars + if (data.type == 'flash') { + tinymce.each(editor.getParam('flash_video_player_flashvars', {url : '$url', poster : '$poster'}), function(value, name) { + if (value == '$url') + data.params.src = parseQueryParams(data.params.flashvars)[name] || data.params.src; + }); + } + + setVal('src', data.params.src); + } + } else { + src = getVal("src"); + + // YouTube + if (src.match(/youtube.com(.+)v=([^&]+)/)) { + data.width = 425; + data.height = 350; + data.params.frameborder = '0'; + data.type = 'iframe'; + src = 'http://www.youtube.com/embed/' + src.match(/v=([^&]+)/)[1]; + setVal('src', src); + setVal('media_type', data.type); + } + + // Google video + if (src.match(/video.google.com(.+)docid=([^&]+)/)) { + data.width = 425; + data.height = 326; + data.type = 'flash'; + src = 'http://video.google.com/googleplayer.swf?docId=' + src.match(/docid=([^&]+)/)[1] + '&hl=en'; + setVal('src', src); + setVal('media_type', data.type); + } + + if (data.type == 'video') { + if (!data.video.sources) + data.video.sources = []; + + data.video.sources[0] = {src : src}; + + src = getVal("video_altsource1"); + if (src) + data.video.sources[1] = {src : src}; + + src = getVal("video_altsource2"); + if (src) + data.video.sources[2] = {src : src}; + } else + data.params.src = src; + + // Set default size + setVal('width', data.width || 320); + setVal('height', data.height || 240); + } + }, + + dataToForm : function() { + this.moveStates(true); + }, + + formToData : function(field) { + if (field == "width" || field == "height") + this.changeSize(field); + + if (field == 'source') { + this.moveStates(false, field); + setVal('source', this.editor.plugins.media.dataToHtml(this.data)); + this.panel = 'source'; + } else { + if (this.panel == 'source') { + this.data = this.editor.plugins.media.htmlToData(getVal('source')); + this.dataToForm(); + this.panel = ''; + } + + this.moveStates(false, field); + this.preview(); + } + }, + + beforeResize : function() { + this.width = parseInt(getVal('width') || "320", 10); + this.height = parseInt(getVal('height') || "240", 10); + }, + + changeSize : function(type) { + var width, height, scale, size; + + if (get('constrain').checked) { + width = parseInt(getVal('width') || "320", 10); + height = parseInt(getVal('height') || "240", 10); + + if (type == 'width') { + this.height = Math.round((width / this.width) * height); + setVal('height', this.height); + } else { + this.width = Math.round((height / this.height) * width); + setVal('width', this.width); + } + } + }, + + getMediaListHTML : function() { + if (typeof(tinyMCEMediaList) != "undefined" && tinyMCEMediaList.length > 0) { + var html = ""; + + html += ''; + + return html; + } + + return ""; + } + }; + + tinyMCEPopup.requireLangPack(); + tinyMCEPopup.onInit.add(function() { + Media.init(); + }); +})(); \ No newline at end of file diff --git a/src/wp-includes/js/tinymce/plugins/media/media.htm b/src/wp-includes/js/tinymce/plugins/media/media.htm new file mode 100644 index 0000000..edc2b0f --- /dev/null +++ b/src/wp-includes/js/tinymce/plugins/media/media.htm @@ -0,0 +1,812 @@ + + + + {#media_dlg.title} + + + + + + + + + +
    + + +
    +
    +
    + {#media_dlg.general} + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + +
     
    +
    + + + + + + +
    x   
    +
    +
    + +
    + {#media_dlg.preview} + +
    +
    + +
    +
    + {#media_dlg.advanced} + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + +
     
    +
    +
    + +
    + {#media_dlg.html5_video_options} + + + + + + + + + + + + + + + + +
    + + + + + +
     
    +
    + + + + + +
     
    +
    + + + + + +
     
    +
    + + + + + + + + + + + +
    + + + + + +
    +
    + + + + + +
    +
    + + + + + +
    +
    + + + + + +
    +
    +
    + +
    + {#media_dlg.flash_options} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + +
    + + + +
    + + + + + +
    +
    + + + + + +
    +
    + + + + + +
    +
    + + + + + +
    +
    + + + + + + + + + + + +
    +
    + +
    + {#media_dlg.qt_options} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + +
    +
    + + + + + +
    +
    + + + + + +
    +
    + + + + + +
    +
    + + + + + +
    +
    + + + + + +
    +
    + + + + + +
    +
    + + + + + +
    +
    + + + + + +
    +
    + + + + + +
    +
    +  
    + + + + + +
     
    +
    +
    + +
    + {#media_dlg.wmp_options} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + +
    +
    + + + + + +
    +
    + + + + + +
    +
    + + + + + +
    +
    + + + + + +
    +
    + + + + + +
    +
    + + + + + +
    +
    + + + + + +
    +
    +
    + +
    + {#media_dlg.rmp_options} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + +
    +
    + + + + + +
    +
    + + + + + +
    +
    + + + + + +
    +
    + + + + + +
    +
    + + + + + +
    +
    + + + + + +
    +
    + + + + + +
    +
    + + + + + +
    +
    +   +
    +
    + +
    + {#media_dlg.shockwave_options} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + +
    + + + + + +
    +
    + + + + + +
    +
    + + + + + +
    +
    + + + + + +
    +
    +
    +
    + +
    +
    + {#media_dlg.source} + +
    +
    +
    + +
    + + +
    +
    + + diff --git a/src/wp-includes/js/tinymce/plugins/media/moxieplayer.swf b/src/wp-includes/js/tinymce/plugins/media/moxieplayer.swf new file mode 100644 index 0000000000000000000000000000000000000000..2a040358df0d1f8eb784d2ec0919626198d6eb47 GIT binary patch literal 33931 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 literal 0 HcmV?d00001 diff --git a/src/wp-includes/js/tinymce/plugins/paste/blank.htm b/src/wp-includes/js/tinymce/plugins/paste/blank.htm new file mode 100644 index 0000000..4382a11 --- /dev/null +++ b/src/wp-includes/js/tinymce/plugins/paste/blank.htm @@ -0,0 +1,21 @@ + + +blank_page + + + + + + + + diff --git a/src/wp-includes/js/tinymce/plugins/paste/editor_plugin.js b/src/wp-includes/js/tinymce/plugins/paste/editor_plugin.js new file mode 100644 index 0000000..6c65069 --- /dev/null +++ b/src/wp-includes/js/tinymce/plugins/paste/editor_plugin.js @@ -0,0 +1 @@ +(function(){var c=tinymce.each,a={paste_auto_cleanup_on_paste:true,paste_enable_default_filters:true,paste_block_drop:false,paste_retain_style_properties:"none",paste_strip_class_attributes:"mso",paste_remove_spans:false,paste_remove_styles:false,paste_remove_styles_if_webkit:true,paste_convert_middot_lists:true,paste_convert_headers_to_strong:false,paste_dialog_width:"450",paste_dialog_height:"400",paste_text_use_dialog:false,paste_text_sticky:false,paste_text_sticky_default:false,paste_text_notifyalways:false,paste_text_linebreaktype:"p",paste_text_replacements:[[/\u2026/g,"..."],[/[\x93\x94\u201c\u201d]/g,'"'],[/[\x60\x91\x92\u2018\u2019]/g,"'"]]};function b(d,e){return d.getParam(e,a[e])}tinymce.create("tinymce.plugins.PastePlugin",{init:function(d,e){var f=this;f.editor=d;f.url=e;f.onPreProcess=new tinymce.util.Dispatcher(f);f.onPostProcess=new tinymce.util.Dispatcher(f);f.onPreProcess.add(f._preProcess);f.onPostProcess.add(f._postProcess);f.onPreProcess.add(function(i,j){d.execCallback("paste_preprocess",i,j)});f.onPostProcess.add(function(i,j){d.execCallback("paste_postprocess",i,j)});d.onKeyDown.addToTop(function(i,j){if(((tinymce.isMac?j.metaKey:j.ctrlKey)&&j.keyCode==86)||(j.shiftKey&&j.keyCode==45)){return false}});d.pasteAsPlainText=b(d,"paste_text_sticky_default");function h(m,k){var l=d.dom,i,j;f.onPreProcess.dispatch(f,m);m.node=l.create("div",0,m.content);if(tinymce.isGecko){i=d.selection.getRng(true);if(i.startContainer==i.endContainer&&i.startContainer.nodeType==3){j=l.select("p,h1,h2,h3,h4,h5,h6,pre",m.node);if(j.length==1&&m.content.indexOf("__MCE_ITEM__")===-1){l.remove(j.reverse(),true)}}}f.onPostProcess.dispatch(f,m);m.content=d.serializer.serialize(m.node,{getInner:1});if((!k)&&(d.pasteAsPlainText)){f._insertPlainText(d,l,m.content);if(!b(d,"paste_text_sticky")){d.pasteAsPlainText=false;d.controlManager.setActive("pastetext",false)}}else{f._insert(m.content)}}d.addCommand("mceInsertClipboardContent",function(i,j){h(j,true)});if(!b(d,"paste_text_use_dialog")){d.addCommand("mcePasteText",function(j,i){var k=tinymce.util.Cookie;d.pasteAsPlainText=!d.pasteAsPlainText;d.controlManager.setActive("pastetext",d.pasteAsPlainText);if((d.pasteAsPlainText)&&(!k.get("tinymcePasteText"))){if(b(d,"paste_text_sticky")){d.windowManager.alert(d.translate("paste.plaintext_mode_sticky"))}else{d.windowManager.alert(d.translate("paste.plaintext_mode_sticky"))}if(!b(d,"paste_text_notifyalways")){k.set("tinymcePasteText","1",new Date(new Date().getFullYear()+1,12,31))}}})}d.addButton("pastetext",{title:"paste.paste_text_desc",cmd:"mcePasteText"});d.addButton("selectall",{title:"paste.selectall_desc",cmd:"selectall"});function g(s){var l,p,j,t,k=d.selection,o=d.dom,q=d.getBody(),i,r;if(s.clipboardData||o.doc.dataTransfer){r=(s.clipboardData||o.doc.dataTransfer).getData("Text");if(d.pasteAsPlainText){s.preventDefault();h({content:r.replace(/\r?\n/g,"
    ")});return}}if(o.get("_mcePaste")){return}l=o.add(q,"div",{id:"_mcePaste","class":"mcePaste","data-mce-bogus":"1"},"\uFEFF\uFEFF");if(q!=d.getDoc().body){i=o.getPos(d.selection.getStart(),q).y}else{i=q.scrollTop+o.getViewPort().y}o.setStyles(l,{position:"absolute",left:-10000,top:i,width:1,height:1,overflow:"hidden"});if(tinymce.isIE){t=k.getRng();j=o.doc.body.createTextRange();j.moveToElementText(l);j.execCommand("Paste");o.remove(l);if(l.innerHTML==="\uFEFF\uFEFF"){d.execCommand("mcePasteWord");s.preventDefault();return}k.setRng(t);k.setContent("");setTimeout(function(){h({content:l.innerHTML})},0);return tinymce.dom.Event.cancel(s)}else{function m(n){n.preventDefault()}o.bind(d.getDoc(),"mousedown",m);o.bind(d.getDoc(),"keydown",m);p=d.selection.getRng();l=l.firstChild;j=d.getDoc().createRange();j.setStart(l,0);j.setEnd(l,2);k.setRng(j);window.setTimeout(function(){var u="",n;if(!o.select("div.mcePaste > div.mcePaste").length){n=o.select("div.mcePaste");c(n,function(w){var v=w.firstChild;if(v&&v.nodeName=="DIV"&&v.style.marginTop&&v.style.backgroundColor){o.remove(v,1)}c(o.select("span.Apple-style-span",w),function(x){o.remove(x,1)});c(o.select("br[data-mce-bogus]",w),function(x){o.remove(x)});if(w.parentNode.className!="mcePaste"){u+=w.innerHTML}})}else{u="
    "+o.encode(r).replace(/\r?\n/g,"
    ")+"
    "}c(o.select("div.mcePaste"),function(v){o.remove(v)});if(p){k.setRng(p)}h({content:u});o.unbind(d.getDoc(),"mousedown",m);o.unbind(d.getDoc(),"keydown",m)},0)}}if(b(d,"paste_auto_cleanup_on_paste")){if(tinymce.isOpera||/Firefox\/2/.test(navigator.userAgent)){d.onKeyDown.addToTop(function(i,j){if(((tinymce.isMac?j.metaKey:j.ctrlKey)&&j.keyCode==86)||(j.shiftKey&&j.keyCode==45)){g(j)}})}else{d.onPaste.addToTop(function(i,j){return g(j)})}}d.onInit.add(function(){d.controlManager.setActive("pastetext",d.pasteAsPlainText);if(b(d,"paste_block_drop")){d.dom.bind(d.getBody(),["dragend","dragover","draggesture","dragdrop","drop","drag"],function(i){i.preventDefault();i.stopPropagation();return false})}});f._legacySupport()},getInfo:function(){return{longname:"Paste text/word",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/paste",version:tinymce.majorVersion+"."+tinymce.minorVersion}},_preProcess:function(g,e){var k=this.editor,j=e.content,p=tinymce.grep,n=tinymce.explode,f=tinymce.trim,l,i;function d(h){c(h,function(o){if(o.constructor==RegExp){j=j.replace(o,"")}else{j=j.replace(o[0],o[1])}})}if(k.settings.paste_enable_default_filters==false){return}if(tinymce.isIE&&document.documentMode>=9){d([[/(?:
     [\s\r\n]+|
    )*(<\/?(h[1-6r]|p|div|address|pre|form|table|tbody|thead|tfoot|th|tr|td|li|ol|ul|caption|blockquote|center|dl|dt|dd|dir|fieldset)[^>]*>)(?:
     [\s\r\n]+|
    )*/g,"$1"]])}if(/class="?Mso|style="[^"]*\bmso-|w:WordDocument/i.test(j)||e.wordContent){e.wordContent=true;d([/^\s*( )+/gi,/( |]*>)+\s*$/gi]);if(b(k,"paste_convert_headers_to_strong")){j=j.replace(/

    ]*class="?MsoHeading"?[^>]*>(.*?)<\/p>/gi,"

    $1

    ")}if(b(k,"paste_convert_middot_lists")){d([[//gi,"$&__MCE_ITEM__"],[/(]+(?:mso-list:|:\s*symbol)[^>]+>)/gi,"$1__MCE_ITEM__"],[/(]+(?:MsoListParagraph)[^>]+>)/gi,"$1__MCE_ITEM__"]])}d([//gi,/<(!|script[^>]*>.*?<\/script(?=[>\s])|\/?(\?xml(:\w+)?|img|meta|link|style|\w:\w+)(?=[\s\/>]))[^>]*>/gi,[/<(\/?)s>/gi,"<$1strike>"],[/ /gi,"\u00a0"]]);do{l=j.length;j=j.replace(/(<[a-z][^>]*\s)(?:id|name|language|type|on\w+|\w+:\w+)=(?:"[^"]*"|\w+)\s?/gi,"$1")}while(l!=j.length);if(b(k,"paste_retain_style_properties").replace(/^none$/i,"").length==0){j=j.replace(/<\/?span[^>]*>/gi,"")}else{d([[/([\s\u00a0]*)<\/span>/gi,function(o,h){return(h.length>0)?h.replace(/./," ").slice(Math.floor(h.length/2)).split("").join("\u00a0"):""}],[/(<[a-z][^>]*)\sstyle="([^"]*)"/gi,function(t,h,r){var u=[],o=0,q=n(f(r).replace(/"/gi,"'"),";");c(q,function(s){var w,y,z=n(s,":");function x(A){return A+((A!=="0")&&(/\d$/.test(A)))?"px":""}if(z.length==2){w=z[0].toLowerCase();y=z[1].toLowerCase();switch(w){case"mso-padding-alt":case"mso-padding-top-alt":case"mso-padding-right-alt":case"mso-padding-bottom-alt":case"mso-padding-left-alt":case"mso-margin-alt":case"mso-margin-top-alt":case"mso-margin-right-alt":case"mso-margin-bottom-alt":case"mso-margin-left-alt":case"mso-table-layout-alt":case"mso-height":case"mso-width":case"mso-vertical-align-alt":u[o++]=w.replace(/^mso-|-alt$/g,"")+":"+x(y);return;case"horiz-align":u[o++]="text-align:"+y;return;case"vert-align":u[o++]="vertical-align:"+y;return;case"font-color":case"mso-foreground":u[o++]="color:"+y;return;case"mso-background":case"mso-highlight":u[o++]="background:"+y;return;case"mso-default-height":u[o++]="min-height:"+x(y);return;case"mso-default-width":u[o++]="min-width:"+x(y);return;case"mso-padding-between-alt":u[o++]="border-collapse:separate;border-spacing:"+x(y);return;case"text-line-through":if((y=="single")||(y=="double")){u[o++]="text-decoration:line-through"}return;case"mso-zero-height":if(y=="yes"){u[o++]="display:none"}return}if(/^(mso|column|font-emph|lang|layout|line-break|list-image|nav|panose|punct|row|ruby|sep|size|src|tab-|table-border|text-(?!align|decor|indent|trans)|top-bar|version|vnd|word-break)/.test(w)){return}u[o++]=w+":"+z[1]}});if(o>0){return h+' style="'+u.join(";")+'"'}else{return h}}]])}}if(b(k,"paste_convert_headers_to_strong")){d([[/]*>/gi,"

    "],[/<\/h[1-6][^>]*>/gi,"

    "]])}d([[/Version:[\d.]+\nStartHTML:\d+\nEndHTML:\d+\nStartFragment:\d+\nEndFragment:\d+/gi,""]]);i=b(k,"paste_strip_class_attributes");if(i!=="none"){function m(q,o){if(i==="all"){return""}var h=p(n(o.replace(/^(["'])(.*)\1$/,"$2")," "),function(r){return(/^(?!mso)/i.test(r))});return h.length?' class="'+h.join(" ")+'"':""}j=j.replace(/ class="([^"]+)"/gi,m);j=j.replace(/ class=([\-\w]+)/gi,m)}if(b(k,"paste_remove_spans")){j=j.replace(/<\/?span[^>]*>/gi,"")}e.content=j},_postProcess:function(g,i){var f=this,e=f.editor,h=e.dom,d;if(e.settings.paste_enable_default_filters==false){return}if(i.wordContent){c(h.select("a",i.node),function(j){if(!j.href||j.href.indexOf("#_Toc")!=-1){h.remove(j,1)}});if(b(e,"paste_convert_middot_lists")){f._convertLists(g,i)}d=b(e,"paste_retain_style_properties");if((tinymce.is(d,"string"))&&(d!=="all")&&(d!=="*")){d=tinymce.explode(d.replace(/^none$/i,""));c(h.select("*",i.node),function(m){var n={},k=0,l,o,j;if(d){for(l=0;l0){h.setStyles(m,n)}else{if(m.nodeName=="SPAN"&&!m.className){h.remove(m,true)}}})}}if(b(e,"paste_remove_styles")||(b(e,"paste_remove_styles_if_webkit")&&tinymce.isWebKit)){c(h.select("*[style]",i.node),function(j){j.removeAttribute("style");j.removeAttribute("data-mce-style")})}else{if(tinymce.isWebKit){c(h.select("*",i.node),function(j){j.removeAttribute("data-mce-style")})}}},_convertLists:function(g,e){var i=g.editor.dom,h,l,d=-1,f,m=[],k,j;c(i.select("p",e.node),function(t){var q,u="",s,r,n,o;for(q=t.firstChild;q&&q.nodeType==3;q=q.nextSibling){u+=q.nodeValue}u=t.innerHTML.replace(/<\/?\w+[^>]*>/gi,"").replace(/ /g,"\u00a0");if(/^(__MCE_ITEM__)+[\u2022\u00b7\u00a7\u00d8o\u25CF]\s*\u00a0*/.test(u)){s="ul"}if(/^__MCE_ITEM__\s*\w+\.\s*\u00a0+/.test(u)){s="ol"}if(s){f=parseFloat(t.style.marginLeft||0);if(f>d){m.push(f)}if(!h||s!=k){h=i.create(s);i.insertAfter(h,t)}else{if(f>d){h=l.appendChild(i.create(s))}else{if(f]*>/gi,"");if(s=="ul"&&/^__MCE_ITEM__[\u2022\u00b7\u00a7\u00d8o\u25CF]/.test(p)){i.remove(v)}else{if(/^__MCE_ITEM__[\s\S]*\w+\.( |\u00a0)*\s*/.test(p)){i.remove(v)}}});r=t.innerHTML;if(s=="ul"){r=t.innerHTML.replace(/__MCE_ITEM__/g,"").replace(/^[\u2022\u00b7\u00a7\u00d8o\u25CF]\s*( |\u00a0)+\s*/,"")}else{r=t.innerHTML.replace(/__MCE_ITEM__/g,"").replace(/^\s*\w+\.( |\u00a0)+\s*/,"")}l=h.appendChild(i.create("li",0,r));i.remove(t);d=f;k=s}else{h=d=0}});j=e.node.innerHTML;if(j.indexOf("__MCE_ITEM__")!=-1){e.node.innerHTML=j.replace(/__MCE_ITEM__/g,"")}},_insert:function(f,d){var e=this.editor,g=e.selection.getRng();if(!e.selection.isCollapsed()&&g.startContainer!=g.endContainer){e.getDoc().execCommand("Delete",false,null)}e.execCommand("mceInsertContent",false,f,{skip_undo:d})},_insertPlainText:function(j,x,v){var t,u,l,k,r,e,p,f,n=j.getWin(),z=j.getDoc(),s=j.selection,m=tinymce.is,y=tinymce.inArray,g=b(j,"paste_text_linebreaktype"),o=b(j,"paste_text_replacements");function q(d){c(d,function(h){if(h.constructor==RegExp){v=v.replace(h,"")}else{v=v.replace(h[0],h[1])}})}if((typeof(v)==="string")&&(v.length>0)){if(/<(?:p|br|h[1-6]|ul|ol|dl|table|t[rdh]|div|blockquote|fieldset|pre|address|center)[^>]*>/i.test(v)){q([/[\n\r]+/g])}else{q([/\r+/g])}q([[/<\/(?:p|h[1-6]|ul|ol|dl|table|div|blockquote|fieldset|pre|address|center)>/gi,"\n\n"],[/]*>|<\/tr>/gi,"\n"],[/<\/t[dh]>\s*]*>/gi,"\t"],/<[a-z!\/?][^>]*>/gi,[/ /gi," "],[/(?:(?!\n)\s)*(\n+)(?:(?!\n)\s)*/gi,"$1"],[/\n{3,}/g,"\n\n"],/^\s+|\s+$/g]);v=x.decode(tinymce.html.Entities.encodeRaw(v));if(!s.isCollapsed()){z.execCommand("Delete",false,null)}if(m(o,"array")||(m(o,"array"))){q(o)}else{if(m(o,"string")){q(new RegExp(o,"gi"))}}if(g=="none"){q([[/\n+/g," "]])}else{if(g=="br"){q([[/\n/g,"
    "]])}else{q([/^\s+|\s+$/g,[/\n\n/g,"

    "],[/\n/g,"
    "]])}}if((l=v.indexOf("

    "))!=-1){k=v.lastIndexOf("

    ");r=s.getNode();e=[];do{if(r.nodeType==1){if(r.nodeName=="TD"||r.nodeName=="BODY"){break}e[e.length]=r}}while(r=r.parentNode);if(e.length>0){p=v.substring(0,l);f="";for(t=0,u=e.length;t";f+="<"+e[e.length-t-1].nodeName.toLowerCase()+">"}if(l==k){v=p+f+v.substring(l+7)}else{v=p+v.substring(l+4,k+4)+f+v.substring(k+7)}}}j.execCommand("mceInsertRawHTML",false,v+' ');window.setTimeout(function(){var d=x.get("_plain_text_marker"),A,h,w,i;s.select(d,false);z.execCommand("Delete",false,null);d=null;A=s.getStart();h=x.getViewPort(n);w=x.getPos(A).y;i=A.clientHeight;if((wh.y+h.h)){z.body.scrollTop=w 1) { + h = ''; + tinymce.each(lines, function(row) { + h += '

    ' + row + '

    '; + }); + } + } + + tinyMCEPopup.editor.execCommand('mceInsertClipboardContent', false, {content : h}); + tinyMCEPopup.close(); + }, + + resize : function() { + var vp = tinyMCEPopup.dom.getViewPort(window), el; + + el = document.getElementById('content'); + + el.style.width = (vp.w - 20) + 'px'; + el.style.height = (vp.h - 90) + 'px'; + } +}; + +tinyMCEPopup.onInit.add(PasteTextDialog.init, PasteTextDialog); diff --git a/src/wp-includes/js/tinymce/plugins/paste/js/pasteword.js b/src/wp-includes/js/tinymce/plugins/paste/js/pasteword.js new file mode 100644 index 0000000..959bf39 --- /dev/null +++ b/src/wp-includes/js/tinymce/plugins/paste/js/pasteword.js @@ -0,0 +1,51 @@ +tinyMCEPopup.requireLangPack(); + +var PasteWordDialog = { + init : function() { + var ed = tinyMCEPopup.editor, el = document.getElementById('iframecontainer'), ifr, doc, css, cssHTML = ''; + + // Create iframe + el.innerHTML = ''; + ifr = document.getElementById('iframe'); + doc = ifr.contentWindow.document; + + // Force absolute CSS urls + css = [ed.baseURI.toAbsolute("themes/" + ed.settings.theme + "/skins/" + ed.settings.skin + "/content.css")]; + css = css.concat(tinymce.explode(ed.settings.content_css) || []); + tinymce.each(css, function(u) { + cssHTML += ''; + }); + + // Write content into iframe + doc.open(); + doc.write('' + cssHTML + ''); + doc.close(); + + doc.designMode = 'on'; + this.resize(); + + window.setTimeout(function() { + ifr.contentWindow.focus(); + }, 10); + }, + + insert : function() { + var h = document.getElementById('iframe').contentWindow.document.body.innerHTML; + + tinyMCEPopup.editor.execCommand('mceInsertClipboardContent', false, {content : h, wordContent : true}); + tinyMCEPopup.close(); + }, + + resize : function() { + var vp = tinyMCEPopup.dom.getViewPort(window), el; + + el = document.getElementById('iframe'); + + if (el) { + el.style.width = (vp.w - 20) + 'px'; + el.style.height = (vp.h - 90) + 'px'; + } + } +}; + +tinyMCEPopup.onInit.add(PasteWordDialog.init, PasteWordDialog); diff --git a/src/wp-includes/js/tinymce/plugins/paste/pastetext.htm b/src/wp-includes/js/tinymce/plugins/paste/pastetext.htm new file mode 100644 index 0000000..85c6d54 --- /dev/null +++ b/src/wp-includes/js/tinymce/plugins/paste/pastetext.htm @@ -0,0 +1,32 @@ + + + {#paste.paste_text_desc} + + + + +
    +
    {#paste.paste_text_desc}
    + +
    + +
    + +
    + +
    {#paste_dlg.text_title}
    + + + +
    +
    + +
    + +
    + +
    +
    +
    + + \ No newline at end of file diff --git a/src/wp-includes/js/tinymce/plugins/paste/pasteword.htm b/src/wp-includes/js/tinymce/plugins/paste/pasteword.htm new file mode 100644 index 0000000..88413c4 --- /dev/null +++ b/src/wp-includes/js/tinymce/plugins/paste/pasteword.htm @@ -0,0 +1,26 @@ + + + {#paste.paste_word_desc} + + + + +
    +
    {#paste.paste_word_desc}
    + +
    {#paste_dlg.word_title}
    + +
    + +
    +
    + +
    + +
    + +
    +
    +
    + + diff --git a/src/wp-includes/js/tinymce/plugins/spellchecker/changelog.txt b/src/wp-includes/js/tinymce/plugins/spellchecker/changelog.txt new file mode 100644 index 0000000..22f6b72 --- /dev/null +++ b/src/wp-includes/js/tinymce/plugins/spellchecker/changelog.txt @@ -0,0 +1,28 @@ +Version 2.0.5 (2011-03-24) + Merged with the latest TinyMCE spellchecker version. +Version 2.0.4 (2010-12-20) + Fixed issue with the JSON class not having the correct number of parameters to ord calls. +Version 2.0.3 (2010-04-19) + Added standalone support. Will use native spellchecker for supported browsers. + Added @package phpdoc comments. Patch contributed by Jacob Santos. + Fixed some PHP missing function issue. +Version 2.0.2 (2008-04-30) + Added new EnchantSpell engine class contributed by Michel Weimerskirch. + Added new general.remote_rpc_url option, enables you to proxy requests to another server. + Fixed security hole in PSpellShell.php file if PSpellShell engine was used. +Version 2.0.1 (2008-03-07) + Fixed bug where spellchecker was auto focusing the editor in IE. +Version 2.0 (2008-01-30) + Fixed bug where the suggestions menu was placed at an incorrect location. +Version 2.0rc1 (2008-01-14) + Moved package from beta to release candidate. +Version 2.0b3 (2007-12-xx) + Fixed bug where the suggestions menu could appear at the wrong location. +Version 2.0b2 (2007-11-29) + Fixed bug where the spellchecker was removing the word when it was ignored. +Version 2.0b1 (2007-11-21) + Moved spellchecker from alpha to beta status. +Version 2.0a2 (2007-11-13) + Updated plugin so it works correctly with the TinyMCE 3.0a3 version. +Version 2.0a1 (2007-11-01) + Rewritten version for TinyMCE 3.0 this new version uses JSON RPC. diff --git a/src/wp-includes/js/tinymce/plugins/spellchecker/classes/EnchantSpell.php b/src/wp-includes/js/tinymce/plugins/spellchecker/classes/EnchantSpell.php new file mode 100644 index 0000000..7e2bd97 --- /dev/null +++ b/src/wp-includes/js/tinymce/plugins/spellchecker/classes/EnchantSpell.php @@ -0,0 +1,67 @@ += 1.4.1 + * @param Array $words Array of words to check. + * @return Array of misspelled words. + */ + function &checkWords($lang, $words) { + $r = enchant_broker_init(); + + if (enchant_broker_dict_exists($r,$lang)) { + $d = enchant_broker_request_dict($r, $lang); + + $returnData = array(); + foreach($words as $key => $value) { + $correct = enchant_dict_check($d, $value); + if(!$correct) { + $returnData[] = trim($value); + } + } + + return $returnData; + enchant_broker_free_dict($d); + } else { + + } + enchant_broker_free($r); + } + + /** + * Returns suggestions for a specific word. + * + * @param String $lang Selected language code (like en_US or de_DE). Shortcodes like "en" and "de" work with enchant >= 1.4.1 + * @param String $word Specific word to get suggestions for. + * @return Array of suggestions for the specified word. + */ + function &getSuggestions($lang, $word) { + $r = enchant_broker_init(); + $suggs = array(); + + if (enchant_broker_dict_exists($r,$lang)) { + $d = enchant_broker_request_dict($r, $lang); + $suggs = enchant_dict_suggest($d, $word); + + enchant_broker_free_dict($d); + } else { + + } + enchant_broker_free($r); + + return $suggs; + } +} + +?> diff --git a/src/wp-includes/js/tinymce/plugins/spellchecker/classes/GoogleSpell.php b/src/wp-includes/js/tinymce/plugins/spellchecker/classes/GoogleSpell.php new file mode 100644 index 0000000..38daa06 --- /dev/null +++ b/src/wp-includes/js/tinymce/plugins/spellchecker/classes/GoogleSpell.php @@ -0,0 +1,159 @@ +_getMatches($lang, $wordstr); + $words = array(); + + for ($i=0; $i_unhtmlentities(mb_substr($wordstr, $matches[$i][1], $matches[$i][2], "UTF-8")); + + return $words; + } + + /** + * Returns suggestions of for a specific word. + * + * @param {String} $lang Language code like sv or en. + * @param {String} $word Specific word to get suggestions for. + * @return {Array} Array of suggestions for the specified word. + */ + function &getSuggestions($lang, $word) { + $sug = array(); + $osug = array(); + $matches = $this->_getMatches($lang, $word); + + if (count($matches) > 0) + $sug = explode("\t", utf8_encode($this->_unhtmlentities($matches[0][4]))); + + // Remove empty + foreach ($sug as $item) { + if ($item) + $osug[] = $item; + } + + return $osug; + } + + function &_getMatches($lang, $str) { + $server = "www.google.com"; + $port = 443; + $path = "/tbproxy/spell?lang=" . $lang . "&hl=en"; + $host = "www.google.com"; + $url = "https://" . $server; + + // Setup XML request + $xml = '' . $str . ''; + + $header = "POST ".$path." HTTP/1.0 \r\n"; + $header .= "MIME-Version: 1.0 \r\n"; + $header .= "Content-type: application/PTI26 \r\n"; + $header .= "Content-length: ".strlen($xml)." \r\n"; + $header .= "Content-transfer-encoding: text \r\n"; + $header .= "Request-number: 1 \r\n"; + $header .= "Document-type: Request \r\n"; + $header .= "Interface-Version: Test 1.4 \r\n"; + $header .= "Connection: close \r\n\r\n"; + $header .= $xml; + + // Use curl if it exists + if (function_exists('curl_init')) { + // Use curl + $ch = curl_init(); + curl_setopt($ch, CURLOPT_URL,$url); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); + curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $header); + curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); + $xml = curl_exec($ch); + curl_close($ch); + } else { + // Use raw sockets + $fp = fsockopen("ssl://" . $server, $port, $errno, $errstr, 30); + if ($fp) { + // Send request + fwrite($fp, $header); + + // Read response + $xml = ""; + while (!feof($fp)) + $xml .= fgets($fp, 128); + + fclose($fp); + } else + echo "Could not open SSL connection to google."; + } + + // Grab and parse content + $matches = array(); + preg_match_all('/([^<]*)<\/c>/', $xml, $matches, PREG_SET_ORDER); + + return $matches; + } + + function _unhtmlentities($string) { + $string = preg_replace('~&#x([0-9a-f]+);~ei', 'chr(hexdec("\\1"))', $string); + $string = preg_replace('~&#([0-9]+);~e', 'chr(\\1)', $string); + + $trans_tbl = get_html_translation_table(HTML_ENTITIES); + $trans_tbl = array_flip($trans_tbl); + + return strtr($string, $trans_tbl); + } +} + +// Patch in multibyte support +if (!function_exists('mb_substr')) { + function mb_substr($str, $start, $len = '', $encoding="UTF-8"){ + $limit = strlen($str); + + for ($s = 0; $start > 0;--$start) {// found the real start + if ($s >= $limit) + break; + + if ($str[$s] <= "\x7F") + ++$s; + else { + ++$s; // skip length + + while ($str[$s] >= "\x80" && $str[$s] <= "\xBF") + ++$s; + } + } + + if ($len == '') + return substr($str, $s); + else + for ($e = $s; $len > 0; --$len) {//found the real end + if ($e >= $limit) + break; + + if ($str[$e] <= "\x7F") + ++$e; + else { + ++$e;//skip length + + while ($str[$e] >= "\x80" && $str[$e] <= "\xBF" && $e < $limit) + ++$e; + } + } + + return substr($str, $s, $e - $s); + } +} + +?> diff --git a/src/wp-includes/js/tinymce/plugins/spellchecker/classes/PSpell.php b/src/wp-includes/js/tinymce/plugins/spellchecker/classes/PSpell.php new file mode 100644 index 0000000..3c6424d --- /dev/null +++ b/src/wp-includes/js/tinymce/plugins/spellchecker/classes/PSpell.php @@ -0,0 +1,82 @@ +_getPLink($lang); + + $outWords = array(); + foreach ($words as $word) { + if (!pspell_check($plink, trim($word))) + $outWords[] = utf8_encode($word); + } + + return $outWords; + } + + /** + * Returns suggestions of for a specific word. + * + * @param {String} $lang Language code like sv or en. + * @param {String} $word Specific word to get suggestions for. + * @return {Array} Array of suggestions for the specified word. + */ + function &getSuggestions($lang, $word) { + $words = pspell_suggest($this->_getPLink($lang), $word); + + for ($i=0; $ithrowError("PSpell support not found in PHP installation."); + + // Setup PSpell link + $plink = pspell_new( + $lang, + $this->_config['PSpell.spelling'], + $this->_config['PSpell.jargon'], + $this->_config['PSpell.encoding'], + $this->_config['PSpell.mode'] + ); + + // Setup PSpell link +/* if (!$plink) { + $pspellConfig = pspell_config_create( + $lang, + $this->_config['PSpell.spelling'], + $this->_config['PSpell.jargon'], + $this->_config['PSpell.encoding'] + ); + + $plink = pspell_new_config($pspell_config); + }*/ + + if (!$plink) + $this->throwError("No PSpell link found opened."); + + return $plink; + } +} + +?> diff --git a/src/wp-includes/js/tinymce/plugins/spellchecker/classes/PSpellShell.php b/src/wp-includes/js/tinymce/plugins/spellchecker/classes/PSpellShell.php new file mode 100644 index 0000000..c4b5220 --- /dev/null +++ b/src/wp-includes/js/tinymce/plugins/spellchecker/classes/PSpellShell.php @@ -0,0 +1,113 @@ +_getCMD($lang); + + if ($fh = fopen($this->_tmpfile, "w")) { + fwrite($fh, "!\n"); + + foreach($words as $key => $value) + fwrite($fh, "^" . $value . "\n"); + + fclose($fh); + } else + $this->throwError("PSpell support was not found."); + + $data = shell_exec($cmd); + @unlink($this->_tmpfile); + + $returnData = array(); + $dataArr = preg_split("/[\r\n]/", $data, -1, PREG_SPLIT_NO_EMPTY); + + foreach ($dataArr as $dstr) { + $matches = array(); + + // Skip this line. + if (strpos($dstr, "@") === 0) + continue; + + preg_match("/\& ([^ ]+) .*/i", $dstr, $matches); + + if (!empty($matches[1])) + $returnData[] = utf8_encode(trim($matches[1])); + } + + return $returnData; + } + + /** + * Returns suggestions of for a specific word. + * + * @param {String} $lang Language code like sv or en. + * @param {String} $word Specific word to get suggestions for. + * @return {Array} Array of suggestions for the specified word. + */ + function &getSuggestions($lang, $word) { + $cmd = $this->_getCMD($lang); + + if (function_exists("mb_convert_encoding")) + $word = mb_convert_encoding($word, "ISO-8859-1", mb_detect_encoding($word, "UTF-8")); + else + $word = utf8_encode($word); + + if ($fh = fopen($this->_tmpfile, "w")) { + fwrite($fh, "!\n"); + fwrite($fh, "^$word\n"); + fclose($fh); + } else + $this->throwError("Error opening tmp file."); + + $data = shell_exec($cmd); + @unlink($this->_tmpfile); + + $returnData = array(); + $dataArr = preg_split("/\n/", $data, -1, PREG_SPLIT_NO_EMPTY); + + foreach($dataArr as $dstr) { + $matches = array(); + + // Skip this line. + if (strpos($dstr, "@") === 0) + continue; + + preg_match("/\&[^:]+:(.*)/i", $dstr, $matches); + + if (!empty($matches[1])) { + $words = array_slice(explode(',', $matches[1]), 0, 10); + + for ($i=0; $i_tmpfile = tempnam($this->_config['PSpellShell.tmp'], "tinyspell"); + + if(preg_match("#win#i", php_uname())) + return $this->_config['PSpellShell.aspell'] . " -a --lang=". escapeshellarg($lang) . " --encoding=utf-8 -H < " . $this->_tmpfile . " 2>&1"; + + return "cat ". $this->_tmpfile ." | " . $this->_config['PSpellShell.aspell'] . " -a --encoding=utf-8 -H --lang=". escapeshellarg($lang); + } +} + +?> diff --git a/src/wp-includes/js/tinymce/plugins/spellchecker/classes/SpellChecker.php b/src/wp-includes/js/tinymce/plugins/spellchecker/classes/SpellChecker.php new file mode 100644 index 0000000..5d9205f --- /dev/null +++ b/src/wp-includes/js/tinymce/plugins/spellchecker/classes/SpellChecker.php @@ -0,0 +1,62 @@ +_config = $config; + } + + /** + * Simple loopback function everything that gets in will be send back. + * + * @param $args.. Arguments. + * @return {Array} Array of all input arguments. + */ + function &loopback(/* args.. */) { + return func_get_args(); + } + + /** + * Spellchecks an array of words. + * + * @param {String} $lang Language code like sv or en. + * @param {Array} $words Array of words to spellcheck. + * @return {Array} Array of misspelled words. + */ + function &checkWords($lang, $words) { + return $words; + } + + /** + * Returns suggestions of for a specific word. + * + * @param {String} $lang Language code like sv or en. + * @param {String} $word Specific word to get suggestions for. + * @return {Array} Array of suggestions for the specified word. + */ + function &getSuggestions($lang, $word) { + return array(); + } + + /** + * Throws an error message back to the user. This will stop all execution. + * + * @param {String} $str Message to send back to user. + */ + function throwError($str) { + die('{"result":null,"id":null,"error":{"errstr":"' . addslashes($str) . '","errfile":"","errline":null,"errcontext":"","level":"FATAL"}}'); + } +} + +?> diff --git a/src/wp-includes/js/tinymce/plugins/spellchecker/classes/utils/JSON.php b/src/wp-includes/js/tinymce/plugins/spellchecker/classes/utils/JSON.php new file mode 100644 index 0000000..1f2b92c --- /dev/null +++ b/src/wp-includes/js/tinymce/plugins/spellchecker/classes/utils/JSON.php @@ -0,0 +1,595 @@ +_data = $data; + $this->_len = strlen($data); + $this->_pos = -1; + $this->_location = JSON_IN_BETWEEN; + $this->_lastLocations = array(); + $this->_needProp = false; + } + + function getToken() { + return $this->_token; + } + + function getLocation() { + return $this->_location; + } + + function getTokenName() { + switch ($this->_token) { + case JSON_BOOL: + return 'JSON_BOOL'; + + case JSON_INT: + return 'JSON_INT'; + + case JSON_STR: + return 'JSON_STR'; + + case JSON_FLOAT: + return 'JSON_FLOAT'; + + case JSON_NULL: + return 'JSON_NULL'; + + case JSON_START_OBJ: + return 'JSON_START_OBJ'; + + case JSON_END_OBJ: + return 'JSON_END_OBJ'; + + case JSON_START_ARRAY: + return 'JSON_START_ARRAY'; + + case JSON_END_ARRAY: + return 'JSON_END_ARRAY'; + + case JSON_KEY: + return 'JSON_KEY'; + } + + return 'UNKNOWN'; + } + + function getValue() { + return $this->_value; + } + + function readToken() { + $chr = $this->read(); + + if ($chr != null) { + switch ($chr) { + case '[': + $this->_lastLocation[] = $this->_location; + $this->_location = JSON_IN_ARRAY; + $this->_token = JSON_START_ARRAY; + $this->_value = null; + $this->readAway(); + return true; + + case ']': + $this->_location = array_pop($this->_lastLocation); + $this->_token = JSON_END_ARRAY; + $this->_value = null; + $this->readAway(); + + if ($this->_location == JSON_IN_OBJECT) + $this->_needProp = true; + + return true; + + case '{': + $this->_lastLocation[] = $this->_location; + $this->_location = JSON_IN_OBJECT; + $this->_needProp = true; + $this->_token = JSON_START_OBJ; + $this->_value = null; + $this->readAway(); + return true; + + case '}': + $this->_location = array_pop($this->_lastLocation); + $this->_token = JSON_END_OBJ; + $this->_value = null; + $this->readAway(); + + if ($this->_location == JSON_IN_OBJECT) + $this->_needProp = true; + + return true; + + // String + case '"': + case '\'': + return $this->_readString($chr); + + // Null + case 'n': + return $this->_readNull(); + + // Bool + case 't': + case 'f': + return $this->_readBool($chr); + + default: + // Is number + if (is_numeric($chr) || $chr == '-' || $chr == '.') + return $this->_readNumber($chr); + + return true; + } + } + + return false; + } + + function _readBool($chr) { + $this->_token = JSON_BOOL; + $this->_value = $chr == 't'; + + if ($chr == 't') + $this->skip(3); // rue + else + $this->skip(4); // alse + + $this->readAway(); + + if ($this->_location == JSON_IN_OBJECT && !$this->_needProp) + $this->_needProp = true; + + return true; + } + + function _readNull() { + $this->_token = JSON_NULL; + $this->_value = null; + + $this->skip(3); // ull + $this->readAway(); + + if ($this->_location == JSON_IN_OBJECT && !$this->_needProp) + $this->_needProp = true; + + return true; + } + + function _readString($quote) { + $output = ""; + $this->_token = JSON_STR; + $endString = false; + + while (($chr = $this->peek()) != -1) { + switch ($chr) { + case '\\': + // Read away slash + $this->read(); + + // Read escape code + $chr = $this->read(); + switch ($chr) { + case 't': + $output .= "\t"; + break; + + case 'b': + $output .= "\b"; + break; + + case 'f': + $output .= "\f"; + break; + + case 'r': + $output .= "\r"; + break; + + case 'n': + $output .= "\n"; + break; + + case 'u': + $output .= $this->_int2utf8(hexdec($this->read(4))); + break; + + default: + $output .= $chr; + break; + } + + break; + + case '\'': + case '"': + if ($chr == $quote) + $endString = true; + + $chr = $this->read(); + if ($chr != -1 && $chr != $quote) + $output .= $chr; + + break; + + default: + $output .= $this->read(); + } + + // String terminated + if ($endString) + break; + } + + $this->readAway(); + $this->_value = $output; + + // Needed a property + if ($this->_needProp) { + $this->_token = JSON_KEY; + $this->_needProp = false; + return true; + } + + if ($this->_location == JSON_IN_OBJECT && !$this->_needProp) + $this->_needProp = true; + + return true; + } + + function _int2utf8($int) { + $int = intval($int); + + switch ($int) { + case 0: + return chr(0); + + case ($int & 0x7F): + return chr($int); + + case ($int & 0x7FF): + return chr(0xC0 | (($int >> 6) & 0x1F)) . chr(0x80 | ($int & 0x3F)); + + case ($int & 0xFFFF): + return chr(0xE0 | (($int >> 12) & 0x0F)) . chr(0x80 | (($int >> 6) & 0x3F)) . chr (0x80 | ($int & 0x3F)); + + case ($int & 0x1FFFFF): + return chr(0xF0 | ($int >> 18)) . chr(0x80 | (($int >> 12) & 0x3F)) . chr(0x80 | (($int >> 6) & 0x3F)) . chr(0x80 | ($int & 0x3F)); + } + } + + function _readNumber($start) { + $value = ""; + $isFloat = false; + + $this->_token = JSON_INT; + $value .= $start; + + while (($chr = $this->peek()) != -1) { + if (is_numeric($chr) || $chr == '-' || $chr == '.') { + if ($chr == '.') + $isFloat = true; + + $value .= $this->read(); + } else + break; + } + + $this->readAway(); + + if ($isFloat) { + $this->_token = JSON_FLOAT; + $this->_value = floatval($value); + } else + $this->_value = intval($value); + + if ($this->_location == JSON_IN_OBJECT && !$this->_needProp) + $this->_needProp = true; + + return true; + } + + function readAway() { + while (($chr = $this->peek()) != null) { + if ($chr != ':' && $chr != ',' && $chr != ' ') + return; + + $this->read(); + } + } + + function read($len = 1) { + if ($this->_pos < $this->_len) { + if ($len > 1) { + $str = substr($this->_data, $this->_pos + 1, $len); + $this->_pos += $len; + + return $str; + } else + return $this->_data[++$this->_pos]; + } + + return null; + } + + function skip($len) { + $this->_pos += $len; + } + + function peek() { + if ($this->_pos < $this->_len) + return $this->_data[$this->_pos + 1]; + + return null; + } +} + +/** + * This class handles JSON stuff. + * + * @package MCManager.utils + */ +class Moxiecode_JSON { + function Moxiecode_JSON() { + } + + function decode($input) { + $reader = new Moxiecode_JSONReader($input); + + return $this->readValue($reader); + } + + function readValue(&$reader) { + $this->data = array(); + $this->parents = array(); + $this->cur =& $this->data; + $key = null; + $loc = JSON_IN_ARRAY; + + while ($reader->readToken()) { + switch ($reader->getToken()) { + case JSON_STR: + case JSON_INT: + case JSON_BOOL: + case JSON_FLOAT: + case JSON_NULL: + switch ($reader->getLocation()) { + case JSON_IN_OBJECT: + $this->cur[$key] = $reader->getValue(); + break; + + case JSON_IN_ARRAY: + $this->cur[] = $reader->getValue(); + break; + + default: + return $reader->getValue(); + } + break; + + case JSON_KEY: + $key = $reader->getValue(); + break; + + case JSON_START_OBJ: + case JSON_START_ARRAY: + if ($loc == JSON_IN_OBJECT) + $this->addArray($key); + else + $this->addArray(null); + + $cur =& $obj; + + $loc = $reader->getLocation(); + break; + + case JSON_END_OBJ: + case JSON_END_ARRAY: + $loc = $reader->getLocation(); + + if (count($this->parents) > 0) { + $this->cur =& $this->parents[count($this->parents) - 1]; + array_pop($this->parents); + } + break; + } + } + + return $this->data[0]; + } + + // This method was needed since PHP is crapy and doesn't have pointers/references + function addArray($key) { + $this->parents[] =& $this->cur; + $ar = array(); + + if ($key) + $this->cur[$key] =& $ar; + else + $this->cur[] =& $ar; + + $this->cur =& $ar; + } + + function getDelim($index, &$reader) { + switch ($reader->getLocation()) { + case JSON_IN_ARRAY: + case JSON_IN_OBJECT: + if ($index > 0) + return ","; + break; + } + + return ""; + } + + function encode($input) { + switch (gettype($input)) { + case 'boolean': + return $input ? 'true' : 'false'; + + case 'integer': + return (int) $input; + + case 'float': + case 'double': + return (float) $input; + + case 'NULL': + return 'null'; + + case 'string': + return $this->encodeString($input); + + case 'array': + return $this->_encodeArray($input); + + case 'object': + return $this->_encodeArray(get_object_vars($input)); + } + + return ''; + } + + function encodeString($input) { + // Needs to be escaped + if (preg_match('/[^a-zA-Z0-9]/', $input)) { + $output = ''; + + for ($i=0; $i_utf82utf16($char))); + } if (($byte & 0xF0) == 0xE0) { + $char = pack('C*', $byte, ord($input[$i + 1]), ord($input[$i + 2])); + $i += 2; + $output .= sprintf('\u%04s', bin2hex($this->_utf82utf16($char))); + } if (($byte & 0xF8) == 0xF0) { + $char = pack('C*', $byte, ord($input[$i + 1]), ord($input[$i + 2]), ord($input[$i + 3])); + $i += 3; + $output .= sprintf('\u%04s', bin2hex($this->_utf82utf16($char))); + } if (($byte & 0xFC) == 0xF8) { + $char = pack('C*', $byte, ord($input[$i + 1]), ord($input[$i + 2]), ord($input[$i + 3]), ord($input[$i + 4])); + $i += 4; + $output .= sprintf('\u%04s', bin2hex($this->_utf82utf16($char))); + } if (($byte & 0xFE) == 0xFC) { + $char = pack('C*', $byte, ord($input[$i + 1]), ord($input[$i + 2]), ord($input[$i + 3]), ord($input[$i + 4]), ord($input[$i + 5])); + $i += 5; + $output .= sprintf('\u%04s', bin2hex($this->_utf82utf16($char))); + } else if ($byte < 128) + $output .= $input[$i]; + } + } + + return '"' . $output . '"'; + } + + return '"' . $input . '"'; + } + + function _utf82utf16($utf8) { + if (function_exists('mb_convert_encoding')) + return mb_convert_encoding($utf8, 'UTF-16', 'UTF-8'); + + switch (strlen($utf8)) { + case 1: + return $utf8; + + case 2: + return chr(0x07 & (ord($utf8[0]) >> 2)) . chr((0xC0 & (ord($utf8[0]) << 6)) | (0x3F & ord($utf8[1]))); + + case 3: + return chr((0xF0 & (ord($utf8[0]) << 4)) | (0x0F & (ord($utf8[1]) >> 2))) . chr((0xC0 & (ord($utf8[1]) << 6)) | (0x7F & ord($utf8[2]))); + } + + return ''; + } + + function _encodeArray($input) { + $output = ''; + $isIndexed = true; + + $keys = array_keys($input); + for ($i=0; $iencodeString($keys[$i]) . ':' . $this->encode($input[$keys[$i]]); + $isIndexed = false; + } else + $output .= $this->encode($input[$keys[$i]]); + + if ($i != count($keys) - 1) + $output .= ','; + } + + return $isIndexed ? '[' . $output . ']' : '{' . $output . '}'; + } +} + +?> diff --git a/src/wp-includes/js/tinymce/plugins/spellchecker/classes/utils/Logger.php b/src/wp-includes/js/tinymce/plugins/spellchecker/classes/utils/Logger.php new file mode 100644 index 0000000..a1fb4cd --- /dev/null +++ b/src/wp-includes/js/tinymce/plugins/spellchecker/classes/utils/Logger.php @@ -0,0 +1,268 @@ +_path = ""; + $this->_filename = "{level}.log"; + $this->setMaxSize("100k"); + $this->_maxFiles = 10; + $this->_level = MC_LOGGER_DEBUG; + $this->_format = "[{time}] [{level}] {message}"; + } + + /** + * Sets the current log level, use the MC_LOGGER constants. + * + * @param int $level Log level instance for example MC_LOGGER_DEBUG. + */ + function setLevel($level) { + if (is_string($level)) { + switch (strtolower($level)) { + case "debug": + $level = MC_LOGGER_DEBUG; + break; + + case "info": + $level = MC_LOGGER_INFO; + break; + + case "warn": + case "warning": + $level = MC_LOGGER_WARN; + break; + + case "error": + $level = MC_LOGGER_ERROR; + break; + + case "fatal": + $level = MC_LOGGER_FATAL; + break; + + default: + $level = MC_LOGGER_FATAL; + } + } + + $this->_level = $level; + } + + /** + * Returns the current log level for example MC_LOGGER_DEBUG. + * + * @return int Current log level for example MC_LOGGER_DEBUG. + */ + function getLevel() { + return $this->_level; + } + + function setPath($path) { + $this->_path = $path; + } + + function getPath() { + return $this->_path; + } + + function setFileName($file_name) { + $this->_filename = $file_name; + } + + function getFileName() { + return $this->_filename; + } + + function setFormat($format) { + $this->_format = $format; + } + + function getFormat() { + return $this->_format; + } + + function setMaxSize($size) { + // Fix log max size + $logMaxSizeBytes = intval(preg_replace("/[^0-9]/", "", $size)); + + // Is KB + if (strpos((strtolower($size)), "k") > 0) + $logMaxSizeBytes *= 1024; + + // Is MB + if (strpos((strtolower($size)), "m") > 0) + $logMaxSizeBytes *= (1024 * 1024); + + $this->_maxSizeBytes = $logMaxSizeBytes; + $this->_maxSize = $size; + } + + function getMaxSize() { + return $this->_maxSize; + } + + function setMaxFiles($max_files) { + $this->_maxFiles = $max_files; + } + + function getMaxFiles() { + return $this->_maxFiles; + } + + function debug($msg) { + $args = func_get_args(); + $this->_logMsg(MC_LOGGER_DEBUG, implode(', ', $args)); + } + + function info($msg) { + $args = func_get_args(); + $this->_logMsg(MC_LOGGER_INFO, implode(', ', $args)); + } + + function warn($msg) { + $args = func_get_args(); + $this->_logMsg(MC_LOGGER_WARN, implode(', ', $args)); + } + + function error($msg) { + $args = func_get_args(); + $this->_logMsg(MC_LOGGER_ERROR, implode(', ', $args)); + } + + function fatal($msg) { + $args = func_get_args(); + $this->_logMsg(MC_LOGGER_FATAL, implode(', ', $args)); + } + + function isDebugEnabled() { + return $this->_level >= MC_LOGGER_DEBUG; + } + + function isInfoEnabled() { + return $this->_level >= MC_LOGGER_INFO; + } + + function isWarnEnabled() { + return $this->_level >= MC_LOGGER_WARN; + } + + function isErrorEnabled() { + return $this->_level >= MC_LOGGER_ERROR; + } + + function isFatalEnabled() { + return $this->_level >= MC_LOGGER_FATAL; + } + + function _logMsg($level, $message) { + $roll = false; + + if ($level < $this->_level) + return; + + $logFile = $this->toOSPath($this->_path . "/" . $this->_filename); + + switch ($level) { + case MC_LOGGER_DEBUG: + $levelName = "DEBUG"; + break; + + case MC_LOGGER_INFO: + $levelName = "INFO"; + break; + + case MC_LOGGER_WARN: + $levelName = "WARN"; + break; + + case MC_LOGGER_ERROR: + $levelName = "ERROR"; + break; + + case MC_LOGGER_FATAL: + $levelName = "FATAL"; + break; + } + + $logFile = str_replace('{level}', strtolower($levelName), $logFile); + + $text = $this->_format; + $text = str_replace('{time}', date("Y-m-d H:i:s"), $text); + $text = str_replace('{level}', strtolower($levelName), $text); + $text = str_replace('{message}', $message, $text); + $message = $text . "\r\n"; + + // Check filesize + if (file_exists($logFile)) { + $size = @filesize($logFile); + + if ($size + strlen($message) > $this->_maxSizeBytes) + $roll = true; + } + + // Roll if the size is right + if ($roll) { + for ($i=$this->_maxFiles-1; $i>=1; $i--) { + $rfile = $this->toOSPath($logFile . "." . $i); + $nfile = $this->toOSPath($logFile . "." . ($i+1)); + + if (@file_exists($rfile)) + @rename($rfile, $nfile); + } + + @rename($logFile, $this->toOSPath($logFile . ".1")); + + // Delete last logfile + $delfile = $this->toOSPath($logFile . "." . ($this->_maxFiles + 1)); + if (@file_exists($delfile)) + @unlink($delfile); + } + + // Append log line + if (($fp = @fopen($logFile, "a")) != null) { + @fputs($fp, $message); + @fflush($fp); + @fclose($fp); + } + } + + /** + * Converts a Unix path to OS specific path. + * + * @param String $path Unix path to convert. + */ + function toOSPath($path) { + return str_replace("/", DIRECTORY_SEPARATOR, $path); + } +} + +?> \ No newline at end of file diff --git a/src/wp-includes/js/tinymce/plugins/spellchecker/config.php b/src/wp-includes/js/tinymce/plugins/spellchecker/config.php new file mode 100644 index 0000000..795495a --- /dev/null +++ b/src/wp-includes/js/tinymce/plugins/spellchecker/config.php @@ -0,0 +1,27 @@ + diff --git a/src/wp-includes/js/tinymce/plugins/spellchecker/css/content.css b/src/wp-includes/js/tinymce/plugins/spellchecker/css/content.css new file mode 100644 index 0000000..656ce1e --- /dev/null +++ b/src/wp-includes/js/tinymce/plugins/spellchecker/css/content.css @@ -0,0 +1 @@ +.mceItemHiddenSpellWord {background:url(../img/wline.gif) repeat-x bottom left; cursor:default;} diff --git a/src/wp-includes/js/tinymce/plugins/spellchecker/editor_plugin.js b/src/wp-includes/js/tinymce/plugins/spellchecker/editor_plugin.js new file mode 100644 index 0000000..e59c2c1 --- /dev/null +++ b/src/wp-includes/js/tinymce/plugins/spellchecker/editor_plugin.js @@ -0,0 +1 @@ +(function(){var a=tinymce.util.JSONRequest,c=tinymce.each,b=tinymce.DOM;tinymce.create("tinymce.plugins.SpellcheckerPlugin",{getInfo:function(){return{longname:"Spellchecker",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/spellchecker",version:tinymce.majorVersion+"."+tinymce.minorVersion}},init:function(e,f){var g=this,d;g.url=f;g.editor=e;g.rpcUrl=e.getParam("spellchecker_rpc_url",this.url+'/rpc.php');if(g.rpcUrl=="{backend}"){if(tinymce.isIE){return}g.hasSupport=true;e.onContextMenu.addToTop(function(h,i){if(g.active){return false}})}e.addCommand("mceSpellCheck",function(){if(g.rpcUrl=="{backend}"){g.editor.getBody().spellcheck=g.active=!g.active;return}if(!g.active){e.setProgressState(1);g._sendRPC("checkWords",[g.selectedLang,g._getWords()],function(h){if(h.length>0){g.active=1;g._markWords(h);e.setProgressState(0);e.nodeChanged()}else{e.setProgressState(0);if(e.getParam("spellchecker_report_no_misspellings",true)){e.windowManager.alert("spellchecker.no_mpell")}}})}else{g._done()}});if(e.settings.content_css!==false){e.contentCSS.push(f+"/css/content.css")}e.onClick.add(g._showMenu,g);e.onContextMenu.add(g._showMenu,g);e.onBeforeGetContent.add(function(){if(g.active){g._removeWords()}});e.onNodeChange.add(function(i,h){h.setActive("spellchecker",g.active)});e.onSetContent.add(function(){g._done()});e.onBeforeGetContent.add(function(){g._done()});e.onBeforeExecCommand.add(function(h,i){if(i=="mceFullScreen"){g._done()}});g.languages={};c(e.getParam("spellchecker_languages","+English=en,Danish=da,Dutch=nl,Finnish=fi,French=fr,German=de,Italian=it,Polish=pl,Portuguese=pt,Spanish=es,Swedish=sv","hash"),function(i,h){if(h.indexOf("+")===0){h=h.substring(1);g.selectedLang=i}g.languages[h]=i})},createControl:function(h,d){var f=this,g,e=f.editor;if(h=="spellchecker"){if(f.rpcUrl=="{backend}"){if(f.hasSupport){g=d.createButton(h,{title:"spellchecker.desc",cmd:"mceSpellCheck",scope:f})}return g}g=d.createSplitButton(h,{title:"spellchecker.desc",cmd:"mceSpellCheck",scope:f});g.onRenderMenu.add(function(j,i){i.add({title:"spellchecker.langs","class":"mceMenuItemTitle"}).setDisabled(1);c(f.languages,function(n,m){var p={icon:1},l;p.onclick=function(){if(n==f.selectedLang){return}l.setSelected(1);f.selectedItem.setSelected(0);f.selectedItem=l;f.selectedLang=n};p.title=m;l=i.add(p);l.setSelected(n==f.selectedLang);if(n==f.selectedLang){f.selectedItem=l}})});return g}},_walk:function(i,g){var h=this.editor.getDoc(),e;if(h.createTreeWalker){e=h.createTreeWalker(i,NodeFilter.SHOW_TEXT,null,false);while((i=e.nextNode())!=null){g.call(this,i)}}else{tinymce.walk(i,g,"childNodes")}},_getSeparators:function(){var e="",d,f=this.editor.getParam("spellchecker_word_separator_chars",'\\s!"#$%&()*+,-./:;<=>?@[]^_{|}§©«®±¶·¸»¼½¾¿×÷¤\u201d\u201c');for(d=0;d$2");while((r=o.indexOf(""))!=-1){m=o.substring(0,r);if(m.length){q=document.createTextNode(f.decode(m));p.appendChild(q)}o=o.substring(r+10);r=o.indexOf("");m=o.substring(0,r);o=o.substring(r+11);p.appendChild(f.create("span",{"class":"mceItemHiddenSpellWord"},m))}if(o.length){q=document.createTextNode(f.decode(o));p.appendChild(q)}}else{p.innerHTML=o.replace(e,'$1$2')}f.replace(p,s)}});h.moveToBookmark(i)},_showMenu:function(h,j){var i=this,h=i.editor,d=i._menu,l,k=h.dom,g=k.getViewPort(h.getWin()),f=j.target;j=0;if(!d){d=h.controlManager.createDropMenu("spellcheckermenu",{"class":"mceNoIcons"});i._menu=d}if(k.hasClass(f,"mceItemHiddenSpellWord")){d.removeAll();d.add({title:"spellchecker.wait","class":"mceMenuItemTitle"}).setDisabled(1);i._sendRPC("getSuggestions",[i.selectedLang,k.decode(f.innerHTML)],function(m){var e;d.removeAll();if(m.length>0){d.add({title:"spellchecker.sug","class":"mceMenuItemTitle"}).setDisabled(1);c(m,function(n){d.add({title:n,onclick:function(){k.replace(h.getDoc().createTextNode(n),f);i._checkDone()}})});d.addSeparator()}else{d.add({title:"spellchecker.no_sug","class":"mceMenuItemTitle"}).setDisabled(1)}e=i.editor.getParam("spellchecker_enable_ignore_rpc","");d.add({title:"spellchecker.ignore_word",onclick:function(){var n=f.innerHTML;k.remove(f,1);i._checkDone();if(e){h.setProgressState(1);i._sendRPC("ignoreWord",[i.selectedLang,n],function(o){h.setProgressState(0)})}}});d.add({title:"spellchecker.ignore_words",onclick:function(){var n=f.innerHTML;i._removeWords(k.decode(n));i._checkDone();if(e){h.setProgressState(1);i._sendRPC("ignoreWords",[i.selectedLang,n],function(o){h.setProgressState(0)})}}});if(i.editor.getParam("spellchecker_enable_learn_rpc")){d.add({title:"spellchecker.learn_word",onclick:function(){var n=f.innerHTML;k.remove(f,1);i._checkDone();h.setProgressState(1);i._sendRPC("learnWord",[i.selectedLang,n],function(o){h.setProgressState(0)})}})}d.update()});l=k.getPos(h.getContentAreaContainer());d.settings.offset_x=l.x;d.settings.offset_y=l.y;h.selection.select(f);l=k.getPos(f);d.showMenu(l.x,l.y+f.offsetHeight-g.y);return tinymce.dom.Event.cancel(j)}else{d.hideMenu()}},_checkDone:function(){var e=this,d=e.editor,g=d.dom,f;c(g.select("span"),function(h){if(h&&g.hasClass(h,"mceItemHiddenSpellWord")){f=true;return false}});if(!f){e._done()}},_done:function(){var d=this,e=d.active;if(d.active){d.active=0;d._removeWords();if(d._menu){d._menu.hideMenu()}if(e){d.editor.nodeChanged()}}},_sendRPC:function(e,g,d){var f=this;a.sendRPC({url:f.rpcUrl,method:e,params:g,success:d,error:function(i,h){f.editor.setProgressState(0);f.editor.windowManager.alert(i.errstr||("Error response: "+h.responseText))}})}});tinymce.PluginManager.add("spellchecker",tinymce.plugins.SpellcheckerPlugin)})(); \ No newline at end of file diff --git a/src/wp-includes/js/tinymce/plugins/spellchecker/img/wline.gif b/src/wp-includes/js/tinymce/plugins/spellchecker/img/wline.gif new file mode 100644 index 0000000000000000000000000000000000000000..7d0a4dbca03cc13177a359a5f175dda819fdf464 GIT binary patch literal 46 ycmZ?wbhEHbWMN=tXkcXcqowu#|9{1wEQ|~cj0`#qKmd|qU}ANVOOs?}um%7FLkRf* literal 0 HcmV?d00001 diff --git a/src/wp-includes/js/tinymce/plugins/spellchecker/includes/general.php b/src/wp-includes/js/tinymce/plugins/spellchecker/includes/general.php new file mode 100644 index 0000000..ffea3a0 --- /dev/null +++ b/src/wp-includes/js/tinymce/plugins/spellchecker/includes/general.php @@ -0,0 +1,98 @@ + $value) + $newarray[$name] = $value; + + return $newarray; + } + + return $_REQUEST[$name]; +} + +function &getLogger() { + global $mcLogger, $man; + + if (isset($man)) + $mcLogger = $man->getLogger(); + + if (!$mcLogger) { + $mcLogger = new Moxiecode_Logger(); + + // Set logger options + $mcLogger->setPath(dirname(__FILE__) . "/../logs"); + $mcLogger->setMaxSize("100kb"); + $mcLogger->setMaxFiles("10"); + $mcLogger->setFormat("{time} - {message}"); + } + + return $mcLogger; +} + +function debug($msg) { + $args = func_get_args(); + + $log = getLogger(); + $log->debug(implode(', ', $args)); +} + +function info($msg) { + $args = func_get_args(); + + $log = getLogger(); + $log->info(implode(', ', $args)); +} + +function error($msg) { + $args = func_get_args(); + + $log = getLogger(); + $log->error(implode(', ', $args)); +} + +function warn($msg) { + $args = func_get_args(); + + $log = getLogger(); + $log->warn(implode(', ', $args)); +} + +function fatal($msg) { + $args = func_get_args(); + + $log = getLogger(); + $log->fatal(implode(', ', $args)); +} + +?> \ No newline at end of file diff --git a/src/wp-includes/js/tinymce/plugins/spellchecker/rpc.php b/src/wp-includes/js/tinymce/plugins/spellchecker/rpc.php new file mode 100644 index 0000000..6a56734 --- /dev/null +++ b/src/wp-includes/js/tinymce/plugins/spellchecker/rpc.php @@ -0,0 +1,112 @@ +decode($raw); + +// Execute RPC +if (isset($config['general.engine'])) { + $spellchecker = new $config['general.engine']($config); + $result = call_user_func_array(array($spellchecker, $input['method']), $input['params']); +} else + die('{"result":null,"id":null,"error":{"errstr":"You must choose an spellchecker engine in the config.php file.","errfile":"","errline":null,"errcontext":"","level":"FATAL"}}'); + +// Request and response id should always be the same +$output = array( + "id" => $input->id, + "result" => $result, + "error" => null +); + +// Return JSON encoded string +echo $json->encode($output); + +?> diff --git a/src/wp-includes/js/tinymce/plugins/tabfocus/editor_plugin.js b/src/wp-includes/js/tinymce/plugins/tabfocus/editor_plugin.js new file mode 100644 index 0000000..d18689d --- /dev/null +++ b/src/wp-includes/js/tinymce/plugins/tabfocus/editor_plugin.js @@ -0,0 +1 @@ +(function(){var c=tinymce.DOM,a=tinymce.dom.Event,d=tinymce.each,b=tinymce.explode;tinymce.create("tinymce.plugins.TabFocusPlugin",{init:function(f,g){function e(i,j){if(j.keyCode===9){return a.cancel(j)}}function h(l,p){var j,m,o,n,k;function q(r){n=c.select(":input:enabled,*[tabindex]");function i(s){return s.type!="hidden"&&s.tabIndex!="-1"&&!(n[m].style.display=="none")&&!(n[m].style.visibility=="hidden")}d(n,function(t,s){if(t.id==l.id){j=s;return false}});if(r>0){for(m=j+1;m=0;m--){if(i(n[m])){return n[m]}}}return null}if(p.keyCode===9){k=b(l.getParam("tab_focus",l.getParam("tabfocus_elements",":prev,:next")));if(k.length==1){k[1]=k[0];k[0]=":prev"}if(p.shiftKey){if(k[0]==":prev"){n=q(-1)}else{n=c.get(k[0])}}else{if(k[1]==":next"){n=q(1)}else{n=c.get(k[1])}}if(n){if(n.id&&(l=tinymce.get(n.id||n.name))){l.focus()}else{window.setTimeout(function(){if(!tinymce.isWebKit){window.focus()}n.focus()},10)}return a.cancel(p)}}}f.onKeyUp.add(e);if(tinymce.isGecko){f.onKeyPress.add(h);f.onKeyDown.add(e)}else{f.onKeyDown.add(h)}},getInfo:function(){return{longname:"Tabfocus",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/tabfocus",version:tinymce.majorVersion+"."+tinymce.minorVersion}}});tinymce.PluginManager.add("tabfocus",tinymce.plugins.TabFocusPlugin)})(); \ No newline at end of file diff --git a/src/wp-includes/js/tinymce/plugins/wordpress/css/content.css b/src/wp-includes/js/tinymce/plugins/wordpress/css/content.css new file mode 100644 index 0000000..8cf986c --- /dev/null +++ b/src/wp-includes/js/tinymce/plugins/wordpress/css/content.css @@ -0,0 +1,29 @@ + +.mceWPnextpage, .mceWPmore { + border: 0; + border-top: 1px dotted #cccccc; + display: block; + width: 95%; + height: 12px; + margin: 15px auto 0; +} +.mceWPmore { + background: transparent url(../img/more_bug.gif) no-repeat right top; +} +.mceWPnextpage { + background: transparent url(../img/page_bug.gif) no-repeat right top; +} + +img.wpGallery { + border: 1px dashed #888; + background: #f2f8ff url("../../wpgallery/img/gallery.png") no-repeat scroll center center; + width: 99%; + height: 250px; +} + +img.wp-oembed { + border: 1px dashed #888; + background: #f7f5f2 url("../img/embedded.png") no-repeat scroll center center; + width: 300px; + height: 250px; +} diff --git a/src/wp-includes/js/tinymce/plugins/wordpress/editor_plugin.dev.js b/src/wp-includes/js/tinymce/plugins/wordpress/editor_plugin.dev.js new file mode 100644 index 0000000..6c0083c --- /dev/null +++ b/src/wp-includes/js/tinymce/plugins/wordpress/editor_plugin.dev.js @@ -0,0 +1,423 @@ +/** + * WordPress plugin. + */ + +(function() { + var DOM = tinymce.DOM; + + tinymce.create('tinymce.plugins.WordPress', { + mceTout : 0, + + init : function(ed, url) { + var t = this, tbId = ed.getParam('wordpress_adv_toolbar', 'toolbar2'), last = 0, moreHTML, nextpageHTML; + moreHTML = ''; + nextpageHTML = ''; + + if ( getUserSetting('hidetb', '0') == '1' ) + ed.settings.wordpress_adv_hidden = 0; + + // Hides the specified toolbar and resizes the iframe + ed.onPostRender.add(function() { + var adv_toolbar = ed.controlManager.get(tbId); + if ( ed.getParam('wordpress_adv_hidden', 1) && adv_toolbar ) { + DOM.hide(adv_toolbar.id); + t._resizeIframe(ed, tbId, 28); + } + }); + + // Register commands + ed.addCommand('WP_More', function() { + ed.execCommand('mceInsertContent', 0, moreHTML); + }); + + ed.addCommand('WP_Page', function() { + ed.execCommand('mceInsertContent', 0, nextpageHTML); + }); + + ed.addCommand('WP_Help', function() { + ed.windowManager.open({ + url : tinymce.baseURL + '/wp-mce-help.php', + width : 450, + height : 420, + inline : 1 + }); + }); + + ed.addCommand('WP_Adv', function() { + var cm = ed.controlManager, id = cm.get(tbId).id; + + if ( 'undefined' == id ) + return; + + if ( DOM.isHidden(id) ) { + cm.setActive('wp_adv', 1); + DOM.show(id); + t._resizeIframe(ed, tbId, -28); + ed.settings.wordpress_adv_hidden = 0; + setUserSetting('hidetb', '1'); + } else { + cm.setActive('wp_adv', 0); + DOM.hide(id); + t._resizeIframe(ed, tbId, 28); + ed.settings.wordpress_adv_hidden = 1; + setUserSetting('hidetb', '0'); + } + }); + + // Register buttons + ed.addButton('wp_more', { + title : 'wordpress.wp_more_desc', + cmd : 'WP_More' + }); + + ed.addButton('wp_page', { + title : 'wordpress.wp_page_desc', + image : url + '/img/page.gif', + cmd : 'WP_Page' + }); + + ed.addButton('wp_help', { + title : 'wordpress.wp_help_desc', + cmd : 'WP_Help' + }); + + ed.addButton('wp_adv', { + title : 'wordpress.wp_adv_desc', + cmd : 'WP_Adv' + }); + + // Add Media buttons + ed.addButton('add_media', { + title : 'wordpress.add_media', + image : url + '/img/media.gif', + onclick : function() { + tb_show('', tinymce.DOM.get('add_media').href); + tinymce.DOM.setStyle( ['TB_overlay','TB_window','TB_load'], 'z-index', '999999' ); + } + }); + + ed.addButton('add_image', { + title : 'wordpress.add_image', + image : url + '/img/image.gif', + onclick : function() { + tb_show('', tinymce.DOM.get('add_image').href); + tinymce.DOM.setStyle( ['TB_overlay','TB_window','TB_load'], 'z-index', '999999' ); + } + }); + + ed.addButton('add_video', { + title : 'wordpress.add_video', + image : url + '/img/video.gif', + onclick : function() { + tb_show('', tinymce.DOM.get('add_video').href); + tinymce.DOM.setStyle( ['TB_overlay','TB_window','TB_load'], 'z-index', '999999' ); + } + }); + + ed.addButton('add_audio', { + title : 'wordpress.add_audio', + image : url + '/img/audio.gif', + onclick : function() { + tb_show('', tinymce.DOM.get('add_audio').href); + tinymce.DOM.setStyle( ['TB_overlay','TB_window','TB_load'], 'z-index', '999999' ); + } + }); + + // Add Media buttons to fullscreen and handle align buttons for image captions + ed.onBeforeExecCommand.add(function(ed, cmd, ui, val, o) { + var DOM = tinymce.DOM, n, DL, DIV, cls, a, align; + if ( 'mceFullScreen' == cmd ) { + if ( 'mce_fullscreen' != ed.id && DOM.get('add_audio') && DOM.get('add_video') && DOM.get('add_image') && DOM.get('add_media') ) + ed.settings.theme_advanced_buttons1 += ',|,add_image,add_video,add_audio,add_media'; + } + + if ( 'JustifyLeft' == cmd || 'JustifyRight' == cmd || 'JustifyCenter' == cmd ) { + n = ed.selection.getNode(); + + if ( n.nodeName == 'IMG' ) { + align = cmd.substr(7).toLowerCase(); + a = 'align' + align; + DL = ed.dom.getParent(n, 'dl.wp-caption'); + DIV = ed.dom.getParent(n, 'div.mceTemp'); + + if ( DL && DIV ) { + cls = ed.dom.hasClass(DL, a) ? 'alignnone' : a; + DL.className = DL.className.replace(/align[^ '"]+\s?/g, ''); + ed.dom.addClass(DL, cls); + + if (cls == 'aligncenter') + ed.dom.addClass(DIV, 'mceIEcenter'); + else + ed.dom.removeClass(DIV, 'mceIEcenter'); + + o.terminate = true; + ed.execCommand('mceRepaint'); + } else { + if ( ed.dom.hasClass(n, a) ) + ed.dom.addClass(n, 'alignnone'); + else + ed.dom.removeClass(n, 'alignnone'); + } + } + } + }); + + ed.onInit.add(function(ed) { + // make sure these run last + ed.onNodeChange.add( function(ed, cm, e) { + var DL; + + if ( e.nodeName == 'IMG' ) { + DL = ed.dom.getParent(e, 'dl.wp-caption'); + } else if ( e.nodeName == 'DIV' && ed.dom.hasClass(e, 'mceTemp') ) { + DL = e.firstChild; + + if ( ! ed.dom.hasClass(DL, 'wp-caption') ) + DL = false; + } + + if ( DL ) { + if ( ed.dom.hasClass(DL, 'alignleft') ) + cm.setActive('justifyleft', 1); + else if ( ed.dom.hasClass(DL, 'alignright') ) + cm.setActive('justifyright', 1); + else if ( ed.dom.hasClass(DL, 'aligncenter') ) + cm.setActive('justifycenter', 1); + } + }); + + if ( ed.id != 'wp_mce_fullscreen' ) + ed.dom.addClass(ed.getBody(), 'wp-editor'); + + // remove invalid parent paragraphs when pasting HTML and/or switching to the HTML editor and back + ed.onBeforeSetContent.add(function(ed, o) { + if ( o.content ) { + o.content = o.content.replace(/

    \s*<(p|div|ul|ol|dl|table|blockquote|h[1-6]|fieldset|pre|address)( [^>]*)?>/gi, '<$1$2>'); + o.content = o.content.replace(/<\/(p|div|ul|ol|dl|table|blockquote|h[1-6]|fieldset|pre|address)>\s*<\/p>/gi, ''); + } + }); + }); + + // Word count + if ( 'undefined' != typeof(jQuery) ) { + ed.onKeyUp.add(function(ed, e) { + var k = e.keyCode || e.charCode; + + if ( k == last ) + return; + + if ( 13 == k || 8 == last || 46 == last ) + jQuery(document).triggerHandler('wpcountwords', [ ed.getContent({format : 'raw'}) ]); + + last = k; + }); + }; + + // keep empty paragraphs :( + ed.onSaveContent.addToTop(function(ed, o) { + o.content = o.content.replace(/

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

     

    '); + }); + + ed.onSaveContent.add(function(ed, o) { + if ( typeof(switchEditors) == 'object' ) { + if ( ed.isHidden() ) + o.content = o.element.value; + else + o.content = switchEditors.pre_wpautop(o.content); + } + }); + + /* disable for now + ed.onBeforeSetContent.add(function(ed, o) { + o.content = t._setEmbed(o.content); + }); + + ed.onPostProcess.add(function(ed, o) { + if ( o.get ) + o.content = t._getEmbed(o.content); + }); + */ + + // Add listeners to handle more break + t._handleMoreBreak(ed, url); + + // Add custom shortcuts + ed.addShortcut('alt+shift+c', ed.getLang('justifycenter_desc'), 'JustifyCenter'); + ed.addShortcut('alt+shift+r', ed.getLang('justifyright_desc'), 'JustifyRight'); + ed.addShortcut('alt+shift+l', ed.getLang('justifyleft_desc'), 'JustifyLeft'); + ed.addShortcut('alt+shift+j', ed.getLang('justifyfull_desc'), 'JustifyFull'); + ed.addShortcut('alt+shift+q', ed.getLang('blockquote_desc'), 'mceBlockQuote'); + ed.addShortcut('alt+shift+u', ed.getLang('bullist_desc'), 'InsertUnorderedList'); + ed.addShortcut('alt+shift+o', ed.getLang('numlist_desc'), 'InsertOrderedList'); + ed.addShortcut('alt+shift+d', ed.getLang('striketrough_desc'), 'Strikethrough'); + ed.addShortcut('alt+shift+n', ed.getLang('spellchecker.desc'), 'mceSpellCheck'); + ed.addShortcut('alt+shift+a', ed.getLang('link_desc'), 'mceLink'); + ed.addShortcut('alt+shift+s', ed.getLang('unlink_desc'), 'unlink'); + ed.addShortcut('alt+shift+m', ed.getLang('image_desc'), 'mceImage'); + ed.addShortcut('alt+shift+g', ed.getLang('fullscreen.desc'), 'mceFullScreen'); + ed.addShortcut('alt+shift+z', ed.getLang('wp_adv_desc'), 'WP_Adv'); + ed.addShortcut('alt+shift+h', ed.getLang('help_desc'), 'WP_Help'); + ed.addShortcut('alt+shift+t', ed.getLang('wp_more_desc'), 'WP_More'); + ed.addShortcut('alt+shift+p', ed.getLang('wp_page_desc'), 'WP_Page'); + ed.addShortcut('ctrl+s', ed.getLang('save_desc'), function(){if('function'==typeof autosave)autosave();}); + + if ( tinymce.isWebKit ) { + ed.addShortcut('alt+shift+b', ed.getLang('bold_desc'), 'Bold'); + ed.addShortcut('alt+shift+i', ed.getLang('italic_desc'), 'Italic'); + } + + ed.onInit.add(function(ed) { + tinymce.dom.Event.add(ed.getWin(), 'scroll', function(e) { + ed.plugins.wordpress._hideButtons(); + }); + tinymce.dom.Event.add(ed.getBody(), 'dragstart', function(e) { + ed.plugins.wordpress._hideButtons(); + }); + }); + + ed.onBeforeExecCommand.add(function(ed, cmd, ui, val) { + ed.plugins.wordpress._hideButtons(); + }); + + ed.onSaveContent.add(function(ed, o) { + ed.plugins.wordpress._hideButtons(); + }); + + ed.onMouseDown.add(function(ed, e) { + if ( e.target.nodeName != 'IMG' ) + ed.plugins.wordpress._hideButtons(); + }); + }, + + getInfo : function() { + return { + longname : 'WordPress Plugin', + author : 'WordPress', // add Moxiecode? + authorurl : 'http://wordpress.org', + infourl : 'http://wordpress.org', + version : '3.0' + }; + }, + + // Internal functions + _setEmbed : function(c) { + return c.replace(/\[embed\]([\s\S]+?)\[\/embed\][\s\u00a0]*/g, function(a,b){ + return ''+b+''; + }); + }, + + _getEmbed : function(c) { + return c.replace(/]+>/g, function(a) { + if ( a.indexOf('class="wp-oembed') != -1 ) { + var u = a.match(/alt="([^\"]+)"/); + if ( u[1] ) + a = '[embed]' + u[1] + '[/embed]'; + } + return a; + }); + }, + + _showButtons : function(n, id) { + var ed = tinyMCE.activeEditor, p1, p2, vp, DOM = tinymce.DOM, X, Y; + + vp = ed.dom.getViewPort(ed.getWin()); + p1 = DOM.getPos(ed.getContentAreaContainer()); + p2 = ed.dom.getPos(n); + + X = Math.max(p2.x - vp.x, 0) + p1.x; + Y = Math.max(p2.y - vp.y, 0) + p1.y; + + DOM.setStyles(id, { + 'top' : Y+5+'px', + 'left' : X+5+'px', + 'display' : 'block' + }); + + if ( this.mceTout ) + clearTimeout(this.mceTout); + + this.mceTout = setTimeout( function(){ed.plugins.wordpress._hideButtons();}, 5000 ); + }, + + _hideButtons : function() { + if ( !this.mceTout ) + return; + + if ( document.getElementById('wp_editbtns') ) + tinymce.DOM.hide('wp_editbtns'); + + if ( document.getElementById('wp_gallerybtns') ) + tinymce.DOM.hide('wp_gallerybtns'); + + clearTimeout(this.mceTout); + this.mceTout = 0; + }, + + // Resizes the iframe by a relative height value + _resizeIframe : function(ed, tb_id, dy) { + var ifr = ed.getContentAreaContainer().firstChild; + + DOM.setStyle(ifr, 'height', ifr.clientHeight + dy); // Resize iframe + ed.theme.deltaHeight += dy; // For resize cookie + }, + + _handleMoreBreak : function(ed, url) { + var moreHTML, nextpageHTML; + + moreHTML = '$1'; + nextpageHTML = ''; + + // Load plugin specific CSS into editor + ed.onInit.add(function() { + ed.dom.loadCSS(url + '/css/content.css'); + }); + + // Display morebreak instead if img in element path + ed.onPostRender.add(function() { + if (ed.theme.onResolveName) { + ed.theme.onResolveName.add(function(th, o) { + if (o.node.nodeName == 'IMG') { + if ( ed.dom.hasClass(o.node, 'mceWPmore') ) + o.name = 'wpmore'; + if ( ed.dom.hasClass(o.node, 'mceWPnextpage') ) + o.name = 'wppage'; + } + + }); + } + }); + + // Replace morebreak with images + ed.onBeforeSetContent.add(function(ed, o) { + if ( o.content ) { + o.content = o.content.replace(//g, moreHTML); + o.content = o.content.replace(//g, nextpageHTML); + } + }); + + // Replace images with morebreak + ed.onPostProcess.add(function(ed, o) { + if (o.get) + o.content = o.content.replace(/]+>/g, function(im) { + if (im.indexOf('class="mceWPmore') !== -1) { + var m, moretext = (m = im.match(/alt="(.*?)"/)) ? m[1] : ''; + im = ''; + } + if (im.indexOf('class="mceWPnextpage') !== -1) + im = ''; + + return im; + }); + }); + + // Set active buttons if user selected pagebreak or more break + ed.onNodeChange.add(function(ed, cm, n) { + cm.setActive('wp_page', n.nodeName === 'IMG' && ed.dom.hasClass(n, 'mceWPnextpage')); + cm.setActive('wp_more', n.nodeName === 'IMG' && ed.dom.hasClass(n, 'mceWPmore')); + }); + } + }); + + // Register plugin + tinymce.PluginManager.add('wordpress', tinymce.plugins.WordPress); +})(); diff --git a/src/wp-includes/js/tinymce/plugins/wordpress/editor_plugin.js b/src/wp-includes/js/tinymce/plugins/wordpress/editor_plugin.js new file mode 100644 index 0000000..115661a --- /dev/null +++ b/src/wp-includes/js/tinymce/plugins/wordpress/editor_plugin.js @@ -0,0 +1 @@ +(function(){var a=tinymce.DOM;tinymce.create("tinymce.plugins.WordPress",{mceTout:0,init:function(c,d){var e=this,h=c.getParam("wordpress_adv_toolbar","toolbar2"),g=0,f,b;f='';b='';if(getUserSetting("hidetb","0")=="1"){c.settings.wordpress_adv_hidden=0}c.onPostRender.add(function(){var i=c.controlManager.get(h);if(c.getParam("wordpress_adv_hidden",1)&&i){a.hide(i.id);e._resizeIframe(c,h,28)}});c.addCommand("WP_More",function(){c.execCommand("mceInsertContent",0,f)});c.addCommand("WP_Page",function(){c.execCommand("mceInsertContent",0,b)});c.addCommand("WP_Help",function(){c.windowManager.open({url:tinymce.baseURL+"/wp-mce-help.php",width:450,height:420,inline:1})});c.addCommand("WP_Adv",function(){var i=c.controlManager,j=i.get(h).id;if("undefined"==j){return}if(a.isHidden(j)){i.setActive("wp_adv",1);a.show(j);e._resizeIframe(c,h,-28);c.settings.wordpress_adv_hidden=0;setUserSetting("hidetb","1")}else{i.setActive("wp_adv",0);a.hide(j);e._resizeIframe(c,h,28);c.settings.wordpress_adv_hidden=1;setUserSetting("hidetb","0")}});c.addButton("wp_more",{title:"wordpress.wp_more_desc",cmd:"WP_More"});c.addButton("wp_page",{title:"wordpress.wp_page_desc",image:d+"/img/page.gif",cmd:"WP_Page"});c.addButton("wp_help",{title:"wordpress.wp_help_desc",cmd:"WP_Help"});c.addButton("wp_adv",{title:"wordpress.wp_adv_desc",cmd:"WP_Adv"});c.addButton("add_media",{title:"wordpress.add_media",image:d+"/img/media.gif",onclick:function(){tb_show("",tinymce.DOM.get("add_media").href);tinymce.DOM.setStyle(["TB_overlay","TB_window","TB_load"],"z-index","999999")}});c.addButton("add_image",{title:"wordpress.add_image",image:d+"/img/image.gif",onclick:function(){tb_show("",tinymce.DOM.get("add_image").href);tinymce.DOM.setStyle(["TB_overlay","TB_window","TB_load"],"z-index","999999")}});c.addButton("add_video",{title:"wordpress.add_video",image:d+"/img/video.gif",onclick:function(){tb_show("",tinymce.DOM.get("add_video").href);tinymce.DOM.setStyle(["TB_overlay","TB_window","TB_load"],"z-index","999999")}});c.addButton("add_audio",{title:"wordpress.add_audio",image:d+"/img/audio.gif",onclick:function(){tb_show("",tinymce.DOM.get("add_audio").href);tinymce.DOM.setStyle(["TB_overlay","TB_window","TB_load"],"z-index","999999")}});c.onBeforeExecCommand.add(function(p,m,s,l,j){var v=tinymce.DOM,k,i,r,u,t,q;if("mceFullScreen"==m){if("mce_fullscreen"!=p.id&&v.get("add_audio")&&v.get("add_video")&&v.get("add_image")&&v.get("add_media")){p.settings.theme_advanced_buttons1+=",|,add_image,add_video,add_audio,add_media"}}if("JustifyLeft"==m||"JustifyRight"==m||"JustifyCenter"==m){k=p.selection.getNode();if(k.nodeName=="IMG"){q=m.substr(7).toLowerCase();t="align"+q;i=p.dom.getParent(k,"dl.wp-caption");r=p.dom.getParent(k,"div.mceTemp");if(i&&r){u=p.dom.hasClass(i,t)?"alignnone":t;i.className=i.className.replace(/align[^ '"]+\s?/g,"");p.dom.addClass(i,u);if(u=="aligncenter"){p.dom.addClass(r,"mceIEcenter")}else{p.dom.removeClass(r,"mceIEcenter")}j.terminate=true;p.execCommand("mceRepaint")}else{if(p.dom.hasClass(k,t)){p.dom.addClass(k,"alignnone")}else{p.dom.removeClass(k,"alignnone")}}}}});c.onInit.add(function(i){i.onNodeChange.add(function(k,j,m){var l;if(m.nodeName=="IMG"){l=k.dom.getParent(m,"dl.wp-caption")}else{if(m.nodeName=="DIV"&&k.dom.hasClass(m,"mceTemp")){l=m.firstChild;if(!k.dom.hasClass(l,"wp-caption")){l=false}}}if(l){if(k.dom.hasClass(l,"alignleft")){j.setActive("justifyleft",1)}else{if(k.dom.hasClass(l,"alignright")){j.setActive("justifyright",1)}else{if(k.dom.hasClass(l,"aligncenter")){j.setActive("justifycenter",1)}}}}});if(i.id!="wp_mce_fullscreen"){i.dom.addClass(i.getBody(),"wp-editor")}i.onBeforeSetContent.add(function(j,k){if(k.content){k.content=k.content.replace(/

    \s*<(p|div|ul|ol|dl|table|blockquote|h[1-6]|fieldset|pre|address)( [^>]*)?>/gi,"<$1$2>");k.content=k.content.replace(/<\/(p|div|ul|ol|dl|table|blockquote|h[1-6]|fieldset|pre|address)>\s*<\/p>/gi,"")}})});if("undefined"!=typeof(jQuery)){c.onKeyUp.add(function(j,l){var i=l.keyCode||l.charCode;if(i==g){return}if(13==i||8==g||46==g){jQuery(document).triggerHandler("wpcountwords",[j.getContent({format:"raw"})])}g=i})}c.onSaveContent.addToTop(function(i,j){j.content=j.content.replace(/

    (
    |\u00a0|\uFEFF)?<\/p>/g,"

     

    ")});c.onSaveContent.add(function(i,j){if(typeof(switchEditors)=="object"){if(i.isHidden()){j.content=j.element.value}else{j.content=switchEditors.pre_wpautop(j.content)}}});e._handleMoreBreak(c,d);c.addShortcut("alt+shift+c",c.getLang("justifycenter_desc"),"JustifyCenter");c.addShortcut("alt+shift+r",c.getLang("justifyright_desc"),"JustifyRight");c.addShortcut("alt+shift+l",c.getLang("justifyleft_desc"),"JustifyLeft");c.addShortcut("alt+shift+j",c.getLang("justifyfull_desc"),"JustifyFull");c.addShortcut("alt+shift+q",c.getLang("blockquote_desc"),"mceBlockQuote");c.addShortcut("alt+shift+u",c.getLang("bullist_desc"),"InsertUnorderedList");c.addShortcut("alt+shift+o",c.getLang("numlist_desc"),"InsertOrderedList");c.addShortcut("alt+shift+d",c.getLang("striketrough_desc"),"Strikethrough");c.addShortcut("alt+shift+n",c.getLang("spellchecker.desc"),"mceSpellCheck");c.addShortcut("alt+shift+a",c.getLang("link_desc"),"mceLink");c.addShortcut("alt+shift+s",c.getLang("unlink_desc"),"unlink");c.addShortcut("alt+shift+m",c.getLang("image_desc"),"mceImage");c.addShortcut("alt+shift+g",c.getLang("fullscreen.desc"),"mceFullScreen");c.addShortcut("alt+shift+z",c.getLang("wp_adv_desc"),"WP_Adv");c.addShortcut("alt+shift+h",c.getLang("help_desc"),"WP_Help");c.addShortcut("alt+shift+t",c.getLang("wp_more_desc"),"WP_More");c.addShortcut("alt+shift+p",c.getLang("wp_page_desc"),"WP_Page");c.addShortcut("ctrl+s",c.getLang("save_desc"),function(){if("function"==typeof autosave){autosave()}});if(tinymce.isWebKit){c.addShortcut("alt+shift+b",c.getLang("bold_desc"),"Bold");c.addShortcut("alt+shift+i",c.getLang("italic_desc"),"Italic")}c.onInit.add(function(i){tinymce.dom.Event.add(i.getWin(),"scroll",function(j){i.plugins.wordpress._hideButtons()});tinymce.dom.Event.add(i.getBody(),"dragstart",function(j){i.plugins.wordpress._hideButtons()})});c.onBeforeExecCommand.add(function(i,k,j,l){i.plugins.wordpress._hideButtons()});c.onSaveContent.add(function(i,j){i.plugins.wordpress._hideButtons()});c.onMouseDown.add(function(i,j){if(j.target.nodeName!="IMG"){i.plugins.wordpress._hideButtons()}})},getInfo:function(){return{longname:"WordPress Plugin",author:"WordPress",authorurl:"http://wordpress.org",infourl:"http://wordpress.org",version:"3.0"}},_setEmbed:function(b){return b.replace(/\[embed\]([\s\S]+?)\[\/embed\][\s\u00a0]*/g,function(d,c){return''+c+''})},_getEmbed:function(b){return b.replace(/]+>/g,function(c){if(c.indexOf('class="wp-oembed')!=-1){var d=c.match(/alt="([^\"]+)"/);if(d[1]){c="[embed]"+d[1]+"[/embed]"}}return c})},_showButtons:function(f,d){var g=tinyMCE.activeEditor,i,h,b,j=tinymce.DOM,e,c;b=g.dom.getViewPort(g.getWin());i=j.getPos(g.getContentAreaContainer());h=g.dom.getPos(f);e=Math.max(h.x-b.x,0)+i.x;c=Math.max(h.y-b.y,0)+i.y;j.setStyles(d,{top:c+5+"px",left:e+5+"px",display:"block"});if(this.mceTout){clearTimeout(this.mceTout)}this.mceTout=setTimeout(function(){g.plugins.wordpress._hideButtons()},5000)},_hideButtons:function(){if(!this.mceTout){return}if(document.getElementById("wp_editbtns")){tinymce.DOM.hide("wp_editbtns")}if(document.getElementById("wp_gallerybtns")){tinymce.DOM.hide("wp_gallerybtns")}clearTimeout(this.mceTout);this.mceTout=0},_resizeIframe:function(c,e,b){var d=c.getContentAreaContainer().firstChild;a.setStyle(d,"height",d.clientHeight+b);c.theme.deltaHeight+=b},_handleMoreBreak:function(c,d){var e,b;e='$1';b='';c.onInit.add(function(){c.dom.loadCSS(d+"/css/content.css")});c.onPostRender.add(function(){if(c.theme.onResolveName){c.theme.onResolveName.add(function(f,g){if(g.node.nodeName=="IMG"){if(c.dom.hasClass(g.node,"mceWPmore")){g.name="wpmore"}if(c.dom.hasClass(g.node,"mceWPnextpage")){g.name="wppage"}}})}});c.onBeforeSetContent.add(function(f,g){if(g.content){g.content=g.content.replace(//g,e);g.content=g.content.replace(//g,b)}});c.onPostProcess.add(function(f,g){if(g.get){g.content=g.content.replace(/]+>/g,function(i){if(i.indexOf('class="mceWPmore')!==-1){var h,j=(h=i.match(/alt="(.*?)"/))?h[1]:"";i=""}if(i.indexOf('class="mceWPnextpage')!==-1){i=""}return i})}});c.onNodeChange.add(function(g,f,h){f.setActive("wp_page",h.nodeName==="IMG"&&g.dom.hasClass(h,"mceWPnextpage"));f.setActive("wp_more",h.nodeName==="IMG"&&g.dom.hasClass(h,"mceWPmore"))})}});tinymce.PluginManager.add("wordpress",tinymce.plugins.WordPress)})(); \ No newline at end of file diff --git a/src/wp-includes/js/tinymce/plugins/wordpress/img/audio.gif b/src/wp-includes/js/tinymce/plugins/wordpress/img/audio.gif new file mode 100644 index 0000000000000000000000000000000000000000..f8ad22383aa716922cef904a151cadcc001e033d GIT binary patch literal 146 zcmZ?wbhEHb6k!ly*v!B%bLPyItJfSndh+tE`_JBg-Lie>nTuDq@7}jz)0SHgpC3AY z3aEeq2`K(#VHIKEX3znNfy`iFu`f93xq7d~>$9ewZAB~$2c~LNEqirro0Nb|(?o$~ p*-t;#c{MXRba3(&cZjInOkxu77AZ;8;puY9PCxy&YPTSRH2~cMIspIx literal 0 HcmV?d00001 diff --git a/src/wp-includes/js/tinymce/plugins/wordpress/img/embedded.png b/src/wp-includes/js/tinymce/plugins/wordpress/img/embedded.png new file mode 100644 index 0000000000000000000000000000000000000000..173401ba5f118eab4be853d9fffc15c5bf88e677 GIT binary patch literal 28741 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

    7@i^K4g+01b^9J7CLiXoDX*1AHubX|E_ z$kBnf}(Vu_efAZE3&Ch@OGZO?L zL4X#HH^1|J);d@H`|tim4v)G_hsQD<^dvhQi&KmD4&#KV5?~82NgR<>DpZnCLlYY> zB_yh4pW5L?MOBD~Ni#f)C zbB;<{rCzVlJ?gRdai1iKNs}ddXA>%ENLo$){c@5x5Um)`X@4f6QMOu6-aG1PHk%Vg zp>(c&l~-@wQWK9=#cL2mh%sb-%4TPqAH4M=zk9FG?!hsq{Q>jYoGi=bVDG-ZaIL{f zw`+d=n_sckT4g#I$jQ+G!_i1)v#BrgLe#j0U8f-GC5a75UONp9_ zSM@52imHgWc41X6m=GVC*pwo*CE)=h>aCMdjFx?OR~pe;uNuH~oJp2vj7B+mVG%Lq zz=H(3wzeu)pTB}nH+`74>1?dC(pn-&YI@Qybe7BGquL8b;y9&RYig235=W)?g)xs~ z*Z;M{m4)yos8@o;oYg0PH5d=D-f`#dJ(|m_RMSwc^W43E7tspKOEtQOC%p5=At%$2 zufOpUR~sS29IS^lESnXDRW59$ELVlwA0CUfWxqyT!Tu3)xSDAokF~_gZk7?xbgZ28 z&uA=H2&75(Xv~G}wr+RYT;EwIFy42rUE;NuZ|QQaLK;U*W>XQb>>uni?RTYrbR>tz zUHSXpce%GW#O4EBK4m(akc~&2ji+SJ3EmNiLp1>JuYUwG~<$>zv=d%*xs-=hn~BY}I-3g`3nHHJYs!f4GO$l5^CzWJRdnTzXzy%_NR?VOrJ7dQ+&D*jZJY6AO82;n1grexc9+Yywz++{=zAL^w@z1^2`f#( z`*0DrDlE7RMFHb!@kH>q46_Y~Cucm|Khpz-R$J!&M|;{{tMj$jzXEnfKJFtytbf~`@Voa;S&j-en=zTSbh~GCk0w~n zm`_Gp%x5y_9m`qofQOHEN%DuZma8}~crCbmV~1N`{wAZdA&(ADpzzd|tAHRuLSU4a zZa$9*4R;=X$oJm-4$WpAL&Uqc-{t)I4i`2%G^!P*bBFVe+Ol$WXIrdTos_5aEPpW%S<-@QjwmBDa~^Gab0?(E*-!sa&3r3Od6V@`T~ zjHVKXslI>bJ=wW-O~3Z)O#&0*)bRNipQC$JkvM7aV1J}{k1faJkf4-zrYKax0BQ;B z7gn>WMGUBQpem?ioXty3jVGf0kVFA#8l%>7{c49+y+*5*s`ojSIASNg!tD?D=^l1z zwHg?c@WGv3j=MP*+e-ixML};^U_#4rf5JS^35tSQ#gyTc1P~hBJS42N#6)%0D=XT$ zc!Qw&S0)bzq^UtM*i5s6AqBa*hS9tEyHr9HWIO0S|AN81@Wh9|UVPUnAuv|+}Jl0tPb$IoQihHT8 zR|+G`Q%vG#0{$3ik#cNEC7OObXGfDY+oXY6Ra)d`js^rOAQez zDJ6rkWvhLT>sQ*G4s#~+uDpM{hcs6;iA-4oHRW*<2n@$wEDm{+3YX8>v?v)dL0B?6 zz0zz{xq7JuURhnK5`{r&FGa*O%NUGiY_;1c!YnHo42GPIrZ`oqNojWDC18{X)Z+jX z#2AT5s|FLt*xb|JXfiL9y#otsan|CUBNwHxr31O>LJC;H$migQ+cxPn=;7N7-iG=2}YdxQCV+D9sj0oA>^T9`ZC^?_Ga+%J?CQ%d;1q;1% z?@8jAB#tR;d0a;!5*oB#i8vk3^)a$wf*K>J@x*b+WHRN>-2-Y>Lt3eEIvDZ6ZkLVCbF9@u zyee7YL6kHuiHVgoWW814v_C^-glf5yJ&HJkTa-h}9VMth5>{z7o7{gi;KAMrPIFe4 z8{D{lfy)=yX|Fd)l7M>;yM$p(R(SenV*(>Y=@NSfU4HrYA)o!yO$ZMql3e5duGdgZkzjgM#cYTcgXac0@ms#}|9?%uv*qHL7IU4gVtjp=997Betd F0|4u+Cw~9{ literal 0 HcmV?d00001 diff --git a/src/wp-includes/js/tinymce/plugins/wordpress/img/media.gif b/src/wp-includes/js/tinymce/plugins/wordpress/img/media.gif new file mode 100644 index 0000000000000000000000000000000000000000..786e4f55de224e5d346df90e2d490e51b16474f4 GIT binary patch literal 149 zcmZ?wbhEHb6k!ly*v!B%bLPxVTen}k`{>ZIQx9IeyLkQ1;w4L;zWZ|f(TnZ7_W@-Y zP=Vr47FH1kE(RTtFvtuB7N>xdo~!p-ygqBr>9U;Tq#?uMi5#~X_ZSr9bO$|5$M0 zt?teHoPP1QDTOjRB;>8S*7=URUZrZ;>)5Ry&wbv^x#dQa!qmTeBx%IiC| x%Jg81-FAytUstD0Yf)F{jnZS^^Wa-vTX*rDFY_MsoqzrPPwij+A3+QZ)&OEJL(2dF literal 0 HcmV?d00001 diff --git a/src/wp-includes/js/tinymce/plugins/wordpress/img/page.gif b/src/wp-includes/js/tinymce/plugins/wordpress/img/page.gif new file mode 100644 index 0000000000000000000000000000000000000000..1cea78ac2ba02c5e429b4128c2cdf0ecc4058b20 GIT binary patch literal 108 zcmZ?wbhEHb6k!lyn8?78mX`Ma|No|?CxE2lPZm}Y24)5w1|R^*GceiS5m>o9p>2lG zyQ3$yjs(fivz1>_A)d+f>eRMJ+{c>?&J^c9{x18yfV(8pL-itOic(O|DTkn+DsF*3 KD;6>^SOWl#7%CV5 literal 0 HcmV?d00001 diff --git a/src/wp-includes/js/tinymce/plugins/wordpress/img/page_bug.gif b/src/wp-includes/js/tinymce/plugins/wordpress/img/page_bug.gif new file mode 100644 index 0000000000000000000000000000000000000000..9ea3565692f721dea7425f0050d27e299e869be9 GIT binary patch literal 180 zcmV;l089TzNk%w1VTAw+0FeLy0002r=<&?V%>V!YA^8La6aWJNEC2ui0EGYw0007o zoR6u??Ja_wwAzcazT){0hDf9VlDS#Hil$p9#&S$%YtY&in!6Z03knxC%&o;r;%*b= zlE-9efWxY=crit#Ox%v5Zi( literal 0 HcmV?d00001 diff --git a/src/wp-includes/js/tinymce/plugins/wordpress/img/trans.gif b/src/wp-includes/js/tinymce/plugins/wordpress/img/trans.gif new file mode 100644 index 0000000000000000000000000000000000000000..388486517fa8da13ebd150e8f65d5096c3e10c3a GIT binary patch literal 43 ncmZ?wbhEHbWMp7un7{x9ia%KxMSyG_5FaGNz{KRj$Y2csb)f_x literal 0 HcmV?d00001 diff --git a/src/wp-includes/js/tinymce/plugins/wordpress/img/video.gif b/src/wp-includes/js/tinymce/plugins/wordpress/img/video.gif new file mode 100644 index 0000000000000000000000000000000000000000..b8e0975bc779081489f7dd6dff834419525ca87e GIT binary patch literal 99 zcmZ?wbhEHb6k!lyn8?5|bLPzd|NjF?1_lPjpDe5*3``6?a({K4j zXKcB|+H@~5tD$iA_12{6Q!jPaE%Ru4Etz~xSN%usvVGRSOB;5@sy6v(P48i1um%8* Cg(Zdn literal 0 HcmV?d00001 diff --git a/src/wp-includes/js/tinymce/plugins/wpdialogs/editor_plugin.dev.js b/src/wp-includes/js/tinymce/plugins/wpdialogs/editor_plugin.dev.js new file mode 100644 index 0000000..4be9c3f --- /dev/null +++ b/src/wp-includes/js/tinymce/plugins/wpdialogs/editor_plugin.dev.js @@ -0,0 +1,80 @@ +/** + * editor_plugin_src.js + * + * Copyright 2009, Moxiecode Systems AB + * Released under LGPL License. + * + * License: http://tinymce.moxiecode.com/license + * Contributing: http://tinymce.moxiecode.com/contributing + */ + +(function() { + tinymce.create('tinymce.plugins.WPDialogs', { + init : function(ed, url) { + tinymce.create('tinymce.WPWindowManager:tinymce.InlineWindowManager', { + WPWindowManager : function(ed) { + this.parent(ed); + }, + + open : function(f, p) { + var t = this, element; + + if ( ! f.wpDialog ) + return this.parent( f, p ); + else if ( ! f.id ) + return; + + element = jQuery('#' + f.id); + if ( ! element.length ) + return; + + t.features = f; + t.params = p; + t.onOpen.dispatch(t, f, p); + t.element = t.windows[ f.id ] = element; + + // Store selection + t.bookmark = t.editor.selection.getBookmark(1); + + // Create the dialog if necessary + if ( ! element.data('wpdialog') ) { + element.wpdialog({ + title: f.title, + width: f.width, + height: f.height, + modal: true, + dialogClass: 'wp-dialog', + zIndex: 300000 + }); + } + + element.wpdialog('open'); + }, + close : function() { + if ( ! this.features.wpDialog ) + return this.parent.apply( this, arguments ); + + this.element.wpdialog('close'); + } + }); + + // Replace window manager + ed.onBeforeRenderUI.add(function() { + ed.windowManager = new tinymce.WPWindowManager(ed); + }); + }, + + getInfo : function() { + return { + longname : 'WPDialogs', + author : 'WordPress', + authorurl : 'http://wordpress.org', + infourl : 'http://wordpress.org', + version : '0.1' + }; + } + }); + + // Register plugin + tinymce.PluginManager.add('wpdialogs', tinymce.plugins.WPDialogs); +})(); diff --git a/src/wp-includes/js/tinymce/plugins/wpdialogs/editor_plugin.js b/src/wp-includes/js/tinymce/plugins/wpdialogs/editor_plugin.js new file mode 100644 index 0000000..1ba21e3 --- /dev/null +++ b/src/wp-includes/js/tinymce/plugins/wpdialogs/editor_plugin.js @@ -0,0 +1 @@ +(function(){tinymce.create("tinymce.plugins.WPDialogs",{init:function(a,b){tinymce.create("tinymce.WPWindowManager:tinymce.InlineWindowManager",{WPWindowManager:function(c){this.parent(c)},open:function(e,g){var d=this,c;if(!e.wpDialog){return this.parent(e,g)}else{if(!e.id){return}}c=jQuery("#"+e.id);if(!c.length){return}d.features=e;d.params=g;d.onOpen.dispatch(d,e,g);d.element=d.windows[e.id]=c;d.bookmark=d.editor.selection.getBookmark(1);if(!c.data("wpdialog")){c.wpdialog({title:e.title,width:e.width,height:e.height,modal:true,dialogClass:"wp-dialog",zIndex:300000})}c.wpdialog("open")},close:function(){if(!this.features.wpDialog){return this.parent.apply(this,arguments)}this.element.wpdialog("close")}});a.onBeforeRenderUI.add(function(){a.windowManager=new tinymce.WPWindowManager(a)})},getInfo:function(){return{longname:"WPDialogs",author:"WordPress",authorurl:"http://wordpress.org",infourl:"http://wordpress.org",version:"0.1"}}});tinymce.PluginManager.add("wpdialogs",tinymce.plugins.WPDialogs)})(); \ No newline at end of file diff --git a/src/wp-includes/js/tinymce/plugins/wpdialogs/js/popup.dev.js b/src/wp-includes/js/tinymce/plugins/wpdialogs/js/popup.dev.js new file mode 100644 index 0000000..3f79a25 --- /dev/null +++ b/src/wp-includes/js/tinymce/plugins/wpdialogs/js/popup.dev.js @@ -0,0 +1,432 @@ +/** + * popup.js + * + * An altered version of tinyMCEPopup to work in the same window as tinymce. + * + * ------------------------------------------------------------------ + * + * Copyright 2009, Moxiecode Systems AB + * Released under LGPL License. + * + * License: http://tinymce.moxiecode.com/license + * Contributing: http://tinymce.moxiecode.com/contributing + */ + +// Some global instances + +/** + * TinyMCE popup/dialog helper class. This gives you easy access to the + * parent editor instance and a bunch of other things. It's higly recommended + * that you load this script into your dialogs. + * + * @static + * @class tinyMCEPopup + */ +var tinyMCEPopup = { + /** + * Initializes the popup this will be called automatically. + * + * @method init + */ + init : function() { + var t = this, w, ti; + + // Find window & API + w = t.getWin(); + tinymce = w.tinymce; + tinyMCE = w.tinyMCE; + t.editor = tinymce.EditorManager.activeEditor; + t.params = t.editor.windowManager.params; + t.features = t.editor.windowManager.features; + t.dom = tinymce.dom; + + // Setup on init listeners + t.listeners = []; + t.onInit = { + add : function(f, s) { + t.listeners.push({func : f, scope : s}); + } + }; + + t.isWindow = false; + t.id = t.features.id; + t.editor.windowManager.onOpen.dispatch(t.editor.windowManager, window); + }, + + /** + * Returns the reference to the parent window that opened the dialog. + * + * @method getWin + * @return {Window} Reference to the parent window that opened the dialog. + */ + getWin : function() { + return window; + }, + + /** + * Returns a window argument/parameter by name. + * + * @method getWindowArg + * @param {String} n Name of the window argument to retrive. + * @param {String} dv Optional default value to return. + * @return {String} Argument value or default value if it wasn't found. + */ + getWindowArg : function(n, dv) { + var v = this.params[n]; + + return tinymce.is(v) ? v : dv; + }, + + /** + * Returns a editor parameter/config option value. + * + * @method getParam + * @param {String} n Name of the editor config option to retrive. + * @param {String} dv Optional default value to return. + * @return {String} Parameter value or default value if it wasn't found. + */ + getParam : function(n, dv) { + return this.editor.getParam(n, dv); + }, + + /** + * Returns a language item by key. + * + * @method getLang + * @param {String} n Language item like mydialog.something. + * @param {String} dv Optional default value to return. + * @return {String} Language value for the item like "my string" or the default value if it wasn't found. + */ + getLang : function(n, dv) { + return this.editor.getLang(n, dv); + }, + + /** + * Executed a command on editor that opened the dialog/popup. + * + * @method execCommand + * @param {String} cmd Command to execute. + * @param {Boolean} ui Optional boolean value if the UI for the command should be presented or not. + * @param {Object} val Optional value to pass with the comman like an URL. + * @param {Object} a Optional arguments object. + */ + execCommand : function(cmd, ui, val, a) { + a = a || {}; + a.skip_focus = 1; + + this.restoreSelection(); + return this.editor.execCommand(cmd, ui, val, a); + }, + + /** + * Resizes the dialog to the inner size of the window. This is needed since various browsers + * have different border sizes on windows. + * + * @method resizeToInnerSize + */ + resizeToInnerSize : function() { + var t = this; + + // Detach it to workaround a Chrome specific bug + // https://sourceforge.net/tracker/?func=detail&atid=635682&aid=2926339&group_id=103281 + setTimeout(function() { + var vp = t.dom.getViewPort(window); + + t.editor.windowManager.resizeBy( + t.getWindowArg('mce_width') - vp.w, + t.getWindowArg('mce_height') - vp.h, + t.id || window + ); + }, 0); + }, + + /** + * Will executed the specified string when the page has been loaded. This function + * was added for compatibility with the 2.x branch. + * + * @method executeOnLoad + * @param {String} s String to evalutate on init. + */ + executeOnLoad : function(s) { + this.onInit.add(function() { + eval(s); + }); + }, + + /** + * Stores the current editor selection for later restoration. This can be useful since some browsers + * looses it's selection if a control element is selected/focused inside the dialogs. + * + * @method storeSelection + */ + storeSelection : function() { + this.editor.windowManager.bookmark = tinyMCEPopup.editor.selection.getBookmark(1); + }, + + /** + * Restores any stored selection. This can be useful since some browsers + * looses it's selection if a control element is selected/focused inside the dialogs. + * + * @method restoreSelection + */ + restoreSelection : function() { + var t = tinyMCEPopup; + + if (!t.isWindow && tinymce.isIE) + t.editor.selection.moveToBookmark(t.editor.windowManager.bookmark); + }, + + /** + * Loads a specific dialog language pack. If you pass in plugin_url as a arugment + * when you open the window it will load the /langs/_dlg.js lang pack file. + * + * @method requireLangPack + */ + requireLangPack : function() { + var t = this, u = t.getWindowArg('plugin_url') || t.getWindowArg('theme_url'); + + if (u && t.editor.settings.language && t.features.translate_i18n !== false) { + u += '/langs/' + t.editor.settings.language + '_dlg.js'; + + if (!tinymce.ScriptLoader.isDone(u)) { + document.write(''); + tinymce.ScriptLoader.markDone(u); + } + } + }, + + /** + * 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) { + this.execCommand('mceColorPicker', true, { + color : document.getElementById(element_id).value, + func : function(c) { + document.getElementById(element_id).value = c; + + try { + document.getElementById(element_id).onchange(); + } catch (ex) { + // Try fire event, ignore errors + } + } + }); + }, + + /** + * 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, option) { + 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} t 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); + t.editor = null; + }; + + 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, bm, h, nv; + + if (t.domLoaded) + return; + + t.domLoaded = 1; + + tinyMCEPopup.init(); + + // Translate page + if (t.features.translate_i18n !== false) { + 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; + } + + 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.isIE) { + 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'}); + } + + t.restoreSelection(); + + // Set inline title + if (!t.isWindow) + t.editor.windowManager.setTitle(window, ti); + else + window.focus(); + + if (!tinymce.isIE && !t.isWindow) { + tinymce.dom.Event._add(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; + }, + + _accessHandler : function(e) { + e = e || window.event; + + if (e.keyCode == 13 || e.keyCode == 32) { + e = e.target || e.srcElement; + + if (e.onchange) + e.onchange(); + + return tinymce.dom.Event.cancel(e); + } + }, + + _closeWinKeyHandler : function(e) { + e = e || window.event; + + if (e.keyCode == 27) + tinyMCEPopup.close(); + }, + + _wait : function() { + // Use IE method + if (document.attachEvent) { + document.attachEvent("onreadystatechange", function() { + if (document.readyState === "complete") { + document.detachEvent("onreadystatechange", arguments.callee); + tinyMCEPopup._onDOMLoaded(); + } + }); + + if (document.documentElement.doScroll && window == window.top) { + (function() { + if (tinyMCEPopup.domLoaded) + return; + + try { + // If IE is used, use the trick by Diego Perini + // http://javascript.nwbox.com/IEContentLoaded/ + document.documentElement.doScroll("left"); + } catch (ex) { + setTimeout(arguments.callee, 0); + return; + } + + tinyMCEPopup._onDOMLoaded(); + })(); + } + + document.attachEvent('onload', tinyMCEPopup._onDOMLoaded); + } else if (document.addEventListener) { + window.addEventListener('DOMContentLoaded', tinyMCEPopup._onDOMLoaded, false); + window.addEventListener('load', tinyMCEPopup._onDOMLoaded, false); + } + } +}; diff --git a/src/wp-includes/js/tinymce/plugins/wpdialogs/js/popup.js b/src/wp-includes/js/tinymce/plugins/wpdialogs/js/popup.js new file mode 100644 index 0000000..abacbd3 --- /dev/null +++ b/src/wp-includes/js/tinymce/plugins/wpdialogs/js/popup.js @@ -0,0 +1 @@ +var tinyMCEPopup={init:function(){var b=this,a,c;a=b.getWin();tinymce=a.tinymce;tinyMCE=a.tinyMCE;b.editor=tinymce.EditorManager.activeEditor;b.params=b.editor.windowManager.params;b.features=b.editor.windowManager.features;b.dom=tinymce.dom;b.listeners=[];b.onInit={add:function(e,d){b.listeners.push({func:e,scope:d})}};b.isWindow=false;b.id=b.features.id;b.editor.windowManager.onOpen.dispatch(b.editor.windowManager,window)},getWin:function(){return window},getWindowArg:function(c,b){var a=this.params[c];return tinymce.is(a)?a:b},getParam:function(b,a){return this.editor.getParam(b,a)},getLang:function(b,a){return this.editor.getLang(b,a)},execCommand:function(d,c,e,b){b=b||{};b.skip_focus=1;this.restoreSelection();return this.editor.execCommand(d,c,e,b)},resizeToInnerSize:function(){var a=this;setTimeout(function(){var b=a.dom.getViewPort(window);a.editor.windowManager.resizeBy(a.getWindowArg("mce_width")-b.w,a.getWindowArg("mce_height")-b.h,a.id||window)},0)},executeOnLoad:function(s){this.onInit.add(function(){eval(s)})},storeSelection:function(){this.editor.windowManager.bookmark=tinyMCEPopup.editor.selection.getBookmark(1)},restoreSelection:function(){var a=tinyMCEPopup;if(!a.isWindow&&tinymce.isIE){a.editor.selection.moveToBookmark(a.editor.windowManager.bookmark)}},requireLangPack:function(){var b=this,a=b.getWindowArg("plugin_url")||b.getWindowArg("theme_url");if(a&&b.editor.settings.language&&b.features.translate_i18n!==false){a+="/langs/"+b.editor.settings.language+"_dlg.js";if(!tinymce.ScriptLoader.isDone(a)){document.write(' + + + + + + + + + +

    + +
    +
    +
    +
    {#wpeditimage.size}
    +
    +
    {#wpeditimage.s130}
    +
    {#wpeditimage.s120}
    +
    {#wpeditimage.s110}
    +
    {#wpeditimage.s100}
    +
    {#wpeditimage.s90}
    +
    {#wpeditimage.s80}
    +
    {#wpeditimage.s70}
    +
    {#wpeditimage.s60}
    +
    +
    +
    + + + Lorem ipsum dolor sit amet consectetuer velit pretium euismod ipsum enim. Mi cursus at a mollis senectus id arcu gravida quis urna. Sed et felis id tempus Morbi mauris tincidunt enim In mauris. Pede eu risus velit libero natoque enim lorem adipiscing ipsum consequat. In malesuada et sociis tincidunt tempus pellentesque cursus convallis ipsum Suspendisse. Risus In ac quis ut Nunc convallis laoreet ante Suspendisse Nam. Amet amet urna condimentum Vestibulum sem at Curabitur lorem et cursus. Sodales tortor fermentum leo dui habitant Nunc Sed Vestibulum. + Ut lorem In penatibus libero id ipsum sagittis nec elit Sed. Condimentum eget Vivamus vel consectetuer lorem molestie turpis amet tellus id. Condimentum vel ridiculus Fusce sed pede Nam nunc sodales eros tempor. Sit lacus magna dictumst Curabitur fringilla auctor id vitae wisi facilisi. Fermentum eget turpis felis velit leo Nunc Proin orci molestie Praesent. Curabitur tellus scelerisque suscipit ut sem amet cursus mi Morbi eu. Donec libero Vestibulum augue et mollis accumsan ornare condimentum In enim. Leo eget ac consectetuer quis condimentum malesuada. + Condimentum commodo et Lorem fringilla malesuada libero volutpat sem tellus enim. Tincidunt sed at Aenean nec nonummy porttitor Nam Sed Nulla ut. Auctor leo In aliquet Curabitur eros et velit Quisque justo morbi. Et vel mauris sit nulla semper vitae et quis at dui. Id at elit laoreet justo eu mauris Quisque et interdum pharetra. Nullam accumsan interdum Maecenas condimentum quis quis Fusce a sollicitudin Sed. Non Quisque Vivamus congue porttitor non semper ipsum porttitor quis vel. Donec eros lacus volutpat et tincidunt sem convallis id venenatis sit. Consectetuer odio. + Semper faucibus Morbi nulla convallis orci Aliquam Sed porttitor et Pellentesque. Venenatis laoreet lorem id a a Morbi augue turpis id semper. Arcu volutpat ac mauris Vestibulum fringilla Aenean condimentum nibh sed id. Sagittis eu lacus orci urna tellus tellus pretium Curabitur dui nunc. Et nibh eu eu nibh adipiscing at lorem Vestibulum adipiscing augue. Magna convallis Phasellus dolor malesuada Curabitur ornare adipiscing tellus Aliquam tempus. Id Aliquam Integer augue Nulla consectetuer ac Donec Curabitur tincidunt et. Id vel Nunc amet lacus dui magna ridiculus penatibus laoreet Duis. Enim sagittis nibh quis Nulla nec laoreet vel Maecenas mattis vel. + +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + +
    + + + +
    + + + +
    + + + +
    + + +
    + + + +

    {#wpeditimage.link_help}

    +
    + + + +
    + + + + +
    +
    +
    + + + diff --git a/src/wp-includes/js/tinymce/plugins/wpeditimage/editor_plugin.dev.js b/src/wp-includes/js/tinymce/plugins/wpeditimage/editor_plugin.dev.js new file mode 100644 index 0000000..ff3cb47 --- /dev/null +++ b/src/wp-includes/js/tinymce/plugins/wpeditimage/editor_plugin.dev.js @@ -0,0 +1,219 @@ + +(function() { + tinymce.create('tinymce.plugins.wpEditImage', { + + init : function(ed, url) { + var t = this; + + t.url = url; + t._createButtons(); + + // Register the command so that it can be invoked by using tinyMCE.activeEditor.execCommand('...'); + ed.addCommand('WP_EditImage', function() { + var el = ed.selection.getNode(), vp = tinymce.DOM.getViewPort(), H = vp.h, W = ( 720 < vp.w ) ? 720 : vp.w, cls = ed.dom.getAttrib(el, 'class'); + + if ( cls.indexOf('mceItem') != -1 || cls.indexOf('wpGallery') != -1 || el.nodeName != 'IMG' ) + return; + + tb_show('', url + '/editimage.html?ver=321&TB_iframe=true'); + tinymce.DOM.setStyles('TB_window', { + 'width':( W - 50 )+'px', + 'height':( H - 45 )+'px', + 'margin-left':'-'+parseInt((( W - 50 ) / 2),10) + 'px' + }); + + if ( ! tinymce.isIE6 ) { + tinymce.DOM.setStyles('TB_window', { + 'top':'20px', + 'marginTop':'0' + }); + } + + tinymce.DOM.setStyles('TB_iframeContent', { + 'width':( W - 50 )+'px', + 'height':( H - 75 )+'px' + }); + tinymce.DOM.setStyle( ['TB_overlay','TB_window','TB_load'], 'z-index', '999999' ); + }); + + ed.onInit.add(function(ed) { + tinymce.dom.Event.add(ed.getBody(), 'dragstart', function(e) { + if ( !tinymce.isGecko && e.target.nodeName == 'IMG' && ed.dom.getParent(e.target, 'dl.wp-caption') ) + return tinymce.dom.Event.cancel(e); + }); + }); + + // resize the caption
    when the image is soft-resized by the user (only possible in Firefox and IE) + ed.onMouseUp.add(function(ed, e) { + if ( tinymce.isWebKit || tinymce.isOpera ) + return; + + if ( ed.dom.getParent(e.target, 'div.mceTemp') || ed.dom.is(e.target, 'div.mceTemp') ) { + window.setTimeout(function(){ + var ed = tinyMCE.activeEditor, n = ed.selection.getNode(), DL, width; + + if ( 'IMG' == n.nodeName ) { + DL = ed.dom.getParent(n, 'dl.wp-caption'); + width = ed.dom.getAttrib(n, 'width') || n.width; + width = parseInt(width, 10); + + if ( DL && width != ( parseInt(ed.dom.getStyle(DL, 'width'), 10) - 10 ) ) { + ed.dom.setStyle(DL, 'width', 10 + width); + ed.execCommand('mceRepaint'); + } + } + }, 100); + } + }); + + // show editimage buttons + ed.onMouseDown.add(function(ed, e) { + var p; + + if ( e.target.nodeName == 'IMG' && ed.dom.getAttrib(e.target, 'class').indexOf('mceItem') == -1 ) { + ed.plugins.wordpress._showButtons(e.target, 'wp_editbtns'); + if ( tinymce.isGecko && (p = ed.dom.getParent(e.target, 'dl.wp-caption')) && ed.dom.hasClass(p.parentNode, 'mceTemp') ) + ed.selection.select(p.parentNode); + } + }); + + // when pressing Return inside a caption move the cursor to a new parapraph under it + ed.onKeyPress.add(function(ed, e) { + var n, DL, DIV, P; + + if ( e.keyCode == 13 ) { + n = ed.selection.getNode(); + DL = ed.dom.getParent(n, 'dl.wp-caption'); + DIV = ed.dom.getParent(DL, 'div.mceTemp'); + + if ( DL && DIV ) { + P = ed.dom.create('p', {}, ' '); + ed.dom.insertAfter( P, DIV ); + + if ( P.firstChild ) + ed.selection.select(P.firstChild); + else + ed.selection.select(P); + + tinymce.dom.Event.cancel(e); + return false; + } + } + }); + + ed.onBeforeSetContent.add(function(ed, o) { + o.content = t._do_shcode(o.content); + }); + + ed.onPostProcess.add(function(ed, o) { + if (o.get) + o.content = t._get_shcode(o.content); + }); + }, + + _do_shcode : function(co) { + return co.replace(/(?:

    )?\[(?:wp_)?caption([^\]]+)\]([\s\S]+?)\[\/(?:wp_)?caption\](?:<\/p>)?[\s\u00a0]*/g, function(a,b,c){ + var id, cls, w, cap, div_cls; + + b = b.replace(/\\'|\\'|\\'/g, ''').replace(/\\"|\\"/g, '"'); + c = c.replace(/\\'|\\'/g, ''').replace(/\\"/g, '"'); + id = b.match(/id=['"]([^'"]+)/i); + cls = b.match(/align=['"]([^'"]+)/i); + w = b.match(/width=['"]([0-9]+)/); + cap = b.match(/caption=['"]([^'"]+)/i); + + id = ( id && id[1] ) ? id[1] : ''; + cls = ( cls && cls[1] ) ? cls[1] : 'alignnone'; + w = ( w && w[1] ) ? w[1] : ''; + cap = ( cap && cap[1] ) ? cap[1] : ''; + if ( ! w || ! cap ) return c; + + div_cls = (cls == 'aligncenter') ? 'mceTemp mceIEcenter' : 'mceTemp'; + + return '

    '+c+'
    '+cap+'
    '; + }); + }, + + _get_shcode : function(co) { + return co.replace(/
    \s*]+)>\s*]+>([\s\S]+?)<\/dt>\s*]+>(.+?)<\/dd>\s*<\/dl>\s*<\/div>\s*/gi, function(a,b,c,cap){ + var id, cls, w; + + id = b.match(/id=['"]([^'"]+)/i); + cls = b.match(/class=['"]([^'"]+)/i); + w = c.match(/width=['"]([0-9]+)/); + + id = ( id && id[1] ) ? id[1] : ''; + cls = ( cls && cls[1] ) ? cls[1] : 'alignnone'; + w = ( w && w[1] ) ? w[1] : ''; + + if ( ! w || ! cap ) return c; + cls = cls.match(/align[^ '"]+/) || 'alignnone'; + cap = cap.replace(/<\S[^<>]*>/gi, '').replace(/'/g, ''').replace(/"/g, '"'); + + return '[caption id="'+id+'" align="'+cls+'" width="'+w+'" caption="'+cap+'"]'+c+'[/caption]'; + }); + }, + + _createButtons : function() { + var t = this, ed = tinyMCE.activeEditor, DOM = tinymce.DOM, editButton, dellButton; + + DOM.remove('wp_editbtns'); + + DOM.add(document.body, 'div', { + id : 'wp_editbtns', + style : 'display:none;' + }); + + editButton = DOM.add('wp_editbtns', 'img', { + src : t.url+'/img/image.png', + id : 'wp_editimgbtn', + width : '24', + height : '24', + title : ed.getLang('wpeditimage.edit_img') + }); + + tinymce.dom.Event.add(editButton, 'mousedown', function(e) { + var ed = tinyMCE.activeEditor; + ed.windowManager.bookmark = ed.selection.getBookmark('simple'); + ed.execCommand("WP_EditImage"); + }); + + dellButton = DOM.add('wp_editbtns', 'img', { + src : t.url+'/img/delete.png', + id : 'wp_delimgbtn', + width : '24', + height : '24', + title : ed.getLang('wpeditimage.del_img') + }); + + tinymce.dom.Event.add(dellButton, 'mousedown', function(e) { + var ed = tinyMCE.activeEditor, el = ed.selection.getNode(), p; + + if ( el.nodeName == 'IMG' && ed.dom.getAttrib(el, 'class').indexOf('mceItem') == -1 ) { + if ( (p = ed.dom.getParent(el, 'div')) && ed.dom.hasClass(p, 'mceTemp') ) + ed.dom.remove(p); + else if ( (p = ed.dom.getParent(el, 'A')) && p.childNodes.length == 1 ) + ed.dom.remove(p); + else + ed.dom.remove(el); + + ed.execCommand('mceRepaint'); + return false; + } + }); + }, + + getInfo : function() { + return { + longname : 'Edit Image', + author : 'WordPress', + authorurl : 'http://wordpress.org', + infourl : '', + version : "1.0" + }; + } + }); + + tinymce.PluginManager.add('wpeditimage', tinymce.plugins.wpEditImage); +})(); diff --git a/src/wp-includes/js/tinymce/plugins/wpeditimage/editor_plugin.js b/src/wp-includes/js/tinymce/plugins/wpeditimage/editor_plugin.js new file mode 100644 index 0000000..ece134b --- /dev/null +++ b/src/wp-includes/js/tinymce/plugins/wpeditimage/editor_plugin.js @@ -0,0 +1 @@ +(function(){tinymce.create("tinymce.plugins.wpEditImage",{init:function(a,b){var c=this;c.url=b;c._createButtons();a.addCommand("WP_EditImage",function(){var h=a.selection.getNode(),f=tinymce.DOM.getViewPort(),g=f.h,d=(720)?\[(?:wp_)?caption([^\]]+)\]([\s\S]+?)\[\/(?:wp_)?caption\](?:<\/p>)?[\s\u00a0]*/g,function(g,d,k){var j,f,e,h,i;d=d.replace(/\\'|\\'|\\'/g,"'").replace(/\\"|\\"/g,""");k=k.replace(/\\'|\\'/g,"'").replace(/\\"/g,""");j=d.match(/id=['"]([^'"]+)/i);f=d.match(/align=['"]([^'"]+)/i);e=d.match(/width=['"]([0-9]+)/);h=d.match(/caption=['"]([^'"]+)/i);j=(j&&j[1])?j[1]:"";f=(f&&f[1])?f[1]:"alignnone";e=(e&&e[1])?e[1]:"";h=(h&&h[1])?h[1]:"";if(!e||!h){return k}i=(f=="aligncenter")?"mceTemp mceIEcenter":"mceTemp";return'
    '+k+'
    '+h+"
    "})},_get_shcode:function(a){return a.replace(/
    \s*]+)>\s*]+>([\s\S]+?)<\/dt>\s*]+>(.+?)<\/dd>\s*<\/dl>\s*<\/div>\s*/gi,function(g,d,j,h){var i,f,e;i=d.match(/id=['"]([^'"]+)/i);f=d.match(/class=['"]([^'"]+)/i);e=j.match(/width=['"]([0-9]+)/);i=(i&&i[1])?i[1]:"";f=(f&&f[1])?f[1]:"alignnone";e=(e&&e[1])?e[1]:"";if(!e||!h){return j}f=f.match(/align[^ '"]+/)||"alignnone";h=h.replace(/<\S[^<>]*>/gi,"").replace(/'/g,"'").replace(/"/g,""");return'[caption id="'+i+'" align="'+f+'" width="'+e+'" caption="'+h+'"]'+j+"[/caption]"})},_createButtons:function(){var b=this,a=tinyMCE.activeEditor,d=tinymce.DOM,e,c;d.remove("wp_editbtns");d.add(document.body,"div",{id:"wp_editbtns",style:"display:none;"});e=d.add("wp_editbtns","img",{src:b.url+"/img/image.png",id:"wp_editimgbtn",width:"24",height:"24",title:a.getLang("wpeditimage.edit_img")});tinymce.dom.Event.add(e,"mousedown",function(g){var f=tinyMCE.activeEditor;f.windowManager.bookmark=f.selection.getBookmark("simple");f.execCommand("WP_EditImage")});c=d.add("wp_editbtns","img",{src:b.url+"/img/delete.png",id:"wp_delimgbtn",width:"24",height:"24",title:a.getLang("wpeditimage.del_img")});tinymce.dom.Event.add(c,"mousedown",function(i){var f=tinyMCE.activeEditor,g=f.selection.getNode(),h;if(g.nodeName=="IMG"&&f.dom.getAttrib(g,"class").indexOf("mceItem")==-1){if((h=f.dom.getParent(g,"div"))&&f.dom.hasClass(h,"mceTemp")){f.dom.remove(h)}else{if((h=f.dom.getParent(g,"A"))&&h.childNodes.length==1){f.dom.remove(h)}else{f.dom.remove(g)}}f.execCommand("mceRepaint");return false}})},getInfo:function(){return{longname:"Edit Image",author:"WordPress",authorurl:"http://wordpress.org",infourl:"",version:"1.0"}}});tinymce.PluginManager.add("wpeditimage",tinymce.plugins.wpEditImage)})(); \ No newline at end of file diff --git a/src/wp-includes/js/tinymce/plugins/wpeditimage/img/delete.png b/src/wp-includes/js/tinymce/plugins/wpeditimage/img/delete.png new file mode 100644 index 0000000000000000000000000000000000000000..d64d8a66ebc7f512f5a44dd30f9ba88b9eb4d81c GIT binary patch literal 1638 zcmV-s2ATPZP)S54zJI5e!u&= za$o=4;(*pHSK`m7um^`QUV9mNTw&os;M_GiAJW0sx8B(K;`R63gVE6emV;Iys1OhcX@F@! z5D;EG&)FAWqJQAj9$(5IUfsd91P^_-Z`Tv+@4ORjnCQBTa_f}xdFIPylvX674(W6T z)3%YRG=_lj!++q=8-IGH90d0*3%JIJKDT4%wkKM9dT_@l&?s_~)BNT1X-T8 z&Y(ryc2<9?yk-K|0$3gHnzULdGi)>=P!b3 zGCn%Y!FNv9CMwkj&co|-aQQyKsaKN?Ln8x)c(T2e%i$FY$V8k?Z5#RM$mmlSE({+A z1_4ZKFo)sT0DHHrZ((9&oPrPpg?XMkF>vEdln=tXs3MP_N+Urcl`o=Q0uG^c3m*Jgun|Z4L3e&(ysY`uOo#Q=j@N!1{zK z86FyD&NK+3G0rZOzQYpyi?#ua`}o*wbL!#w!Zc#iMK@-6BbVd&xr_g}L8_a!Dvi$P z$q0=v_@wOT71Lkb~$B)?@i zCFethAxVagvl+rWEZC<4p9Kvu(xU(vLbC zECa+{TBDZIG!SgvmWaOlt+a!v)EQEmpfQaXaj3g>ECq&PVcHh)r~`pZI6XzP?_ot9 zUMP9|s#4$W!}9=+*8h{HCl8iuUz3P~yH_;OB_w&}W7sCiRV_s97*Yy?P*E)x@$z+I zi5Lqy$_sO4o~^o%umlH4UX`ZH^}Dx9)t#eWaO5lLWNLf!N*Y%;V`eiDi-QzcwHo$Z zgre*7?n0GU3q=mQ{=G3Fp1T@$^@tb&)@T?5CoScJ+b#3^T@9(&=4>PBL>z>mSgtTM zH^)Bj47> znx!l(C`BE(mcRs%OJ5gx6e1dAA4C9Sa1g7#Jv8BjarEd3+20R0l6gk7nG;@wq_MECjbBd07*qoM6N<$f>OgCM*si- literal 0 HcmV?d00001 diff --git a/src/wp-includes/js/tinymce/plugins/wpeditimage/img/image.png b/src/wp-includes/js/tinymce/plugins/wpeditimage/img/image.png new file mode 100644 index 0000000000000000000000000000000000000000..f3d4b4490223c9429434d9f3cf9842862229bc26 GIT binary patch literal 3701 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' ); + } + }, + + I : function(e) { + return document.getElementById(e); + }, + + current : '', + link : '', + link_rel : '', + target_value : '', + current_size_sel : 's100', + width : '', + height : '', + align : '', + img_alt : '', + + setTabs : function(tab) { + var t = this; + + if ( 'current' == tab.className ) return false; + t.I('div_advanced').style.display = ( 'tab_advanced' == tab.id ) ? 'block' : 'none'; + t.I('div_basic').style.display = ( 'tab_basic' == tab.id ) ? 'block' : 'none'; + t.I('tab_basic').className = t.I('tab_advanced').className = ''; + tab.className = 'current'; + return false; + }, + + img_seturl : function(u) { + var t = this, rel = t.I('link_rel').value; + + if ( 'current' == u ) { + t.I('link_href').value = t.current; + t.I('link_rel').value = t.link_rel; + } else { + t.I('link_href').value = t.link; + if ( rel ) { + rel = rel.replace( /attachment|wp-att-[0-9]+/gi, '' ); + t.I('link_rel').value = tinymce.trim(rel); + } + } + }, + + imgAlignCls : function(v) { + var t = this, cls = t.I('img_classes').value; + + t.I('img_demo').className = t.align = v; + + cls = cls.replace( /align[^ "']+/gi, '' ); + cls += (' ' + v); + cls = cls.replace( /\s+/g, ' ' ).replace( /^\s/, '' ); + + if ( 'aligncenter' == v ) { + t.I('hspace').value = ''; + t.updateStyle('hspace'); + } + + t.I('img_classes').value = cls; + }, + + showSize : function(el) { + var t = this, demo = t.I('img_demo'), w = t.width, h = t.height, id = el.id || 's100', size; + + size = parseInt(id.substring(1)) / 200; + demo.width = Math.round(w * size); + demo.height = Math.round(h * size); + + t.showSizeClear(); + el.style.borderColor = '#A3A3A3'; + el.style.backgroundColor = '#E5E5E5'; + }, + + showSizeSet : function() { + var t = this, s130, s120, s110; + + if ( (t.width * 1.3) > parseInt(t.preloadImg.width) ) { + s130 = t.I('s130'), s120 = t.I('s120'), s110 = t.I('s110'); + + s130.onclick = s120.onclick = s110.onclick = null; + s130.onmouseover = s120.onmouseover = s110.onmouseover = null; + s130.style.color = s120.style.color = s110.style.color = '#aaa'; + } + }, + + showSizeRem : function() { + var t = this, demo = t.I('img_demo'), f = document.forms[0]; + + demo.width = Math.round(f.width.value * 0.5); + demo.height = Math.round(f.height.value * 0.5); + t.showSizeClear(); + t.I(t.current_size_sel).style.borderColor = '#A3A3A3'; + t.I(t.current_size_sel).style.backgroundColor = '#E5E5E5'; + + return false; + }, + + showSizeClear : function() { + var divs = this.I('img_size').getElementsByTagName('div'), i; + + for ( i = 0; i < divs.length; i++ ) { + divs[i].style.borderColor = '#f1f1f1'; + divs[i].style.backgroundColor = '#f1f1f1'; + } + }, + + imgEditSize : function(el) { + var t = this, f = document.forms[0], W, H, w, h, id; + + if ( ! t.preloadImg || ! t.preloadImg.width || ! t.preloadImg.height ) + return; + + W = parseInt(t.preloadImg.width), H = parseInt(t.preloadImg.height), w = t.width || W, h = t.height || H, id = el.id || 's100'; + + size = parseInt(id.substring(1)) / 100; + + w = Math.round(w * size); + h = Math.round(h * size); + + f.width.value = Math.min(W, w); + f.height.value = Math.min(H, h); + + t.current_size_sel = id; + t.demoSetSize(); + }, + + demoSetSize : function(img) { + var demo = this.I('img_demo'), f = document.forms[0]; + + demo.width = f.width.value ? Math.round(f.width.value * 0.5) : ''; + demo.height = f.height.value ? Math.round(f.height.value * 0.5) : ''; + }, + + demoSetStyle : function() { + var f = document.forms[0], demo = this.I('img_demo'), dom = tinyMCEPopup.editor.dom; + + if (demo) { + dom.setAttrib(demo, 'style', f.img_style.value); + dom.setStyle(demo, 'width', ''); + dom.setStyle(demo, 'height', ''); + } + }, + + origSize : function() { + var t = this, f = document.forms[0], el = t.I('s100'); + + f.width.value = t.width = t.preloadImg.width; + f.height.value = t.height = t.preloadImg.height; + t.showSizeSet(); + t.demoSetSize(); + t.showSize(el); + }, + + init : function() { + var ed = tinyMCEPopup.editor, h; + + h = document.body.innerHTML; + document.body.innerHTML = ed.translate(h); + window.setTimeout( function(){wpImage.setup();}, 500 ); + }, + + setup : function() { + var t = this, c, el, link, fname, f = document.forms[0], ed = tinyMCEPopup.editor, + d = t.I('img_demo'), dom = tinyMCEPopup.dom, DL, caption = '', dlc, pa; + + document.dir = tinyMCEPopup.editor.getParam('directionality',''); + + if ( tinyMCEPopup.editor.getParam('wpeditimage_disable_captions', false) ) + t.I('cap_field').style.display = 'none'; + + tinyMCEPopup.restoreSelection(); + el = ed.selection.getNode(); + if (el.nodeName != 'IMG') + return; + + f.img_src.value = d.src = link = ed.dom.getAttrib(el, 'src'); + ed.dom.setStyle(el, 'float', ''); + t.getImageData(); + c = ed.dom.getAttrib(el, 'class'); + + if ( DL = dom.getParent(el, 'dl') ) { + dlc = ed.dom.getAttrib(DL, 'class'); + dlc = dlc.match(/align[^ "']+/i); + if ( dlc && ! dom.hasClass(el, dlc) ) { + c += ' '+dlc; + tinymce.trim(c); + } + + tinymce.each(DL.childNodes, function(e) { + if ( e.nodeName == 'DD' && dom.hasClass(e, 'wp-caption-dd') ) { + caption = e.innerHTML; + return; + } + }); + } + + f.img_cap.value = caption; + f.img_title.value = ed.dom.getAttrib(el, 'title'); + f.img_alt.value = ed.dom.getAttrib(el, 'alt'); + f.border.value = ed.dom.getAttrib(el, 'border'); + f.vspace.value = ed.dom.getAttrib(el, 'vspace'); + f.hspace.value = ed.dom.getAttrib(el, 'hspace'); + f.align.value = ed.dom.getAttrib(el, 'align'); + f.width.value = t.width = ed.dom.getAttrib(el, 'width'); + f.height.value = t.height = ed.dom.getAttrib(el, 'height'); + f.img_classes.value = c; + f.img_style.value = ed.dom.getAttrib(el, 'style'); + + // Move attribs to styles + if ( dom.getAttrib(el, 'hspace') ) + t.updateStyle('hspace'); + + if ( dom.getAttrib(el, 'border') ) + t.updateStyle('border'); + + if ( dom.getAttrib(el, 'vspace') ) + t.updateStyle('vspace'); + + if ( pa = ed.dom.getParent(el, 'A') ) { + f.link_href.value = t.current = ed.dom.getAttrib(pa, 'href'); + f.link_title.value = ed.dom.getAttrib(pa, 'title'); + f.link_rel.value = t.link_rel = ed.dom.getAttrib(pa, 'rel'); + f.link_style.value = ed.dom.getAttrib(pa, 'style'); + t.target_value = ed.dom.getAttrib(pa, 'target'); + f.link_classes.value = ed.dom.getAttrib(pa, 'class'); + } + + f.link_target.checked = ( t.target_value && t.target_value == '_blank' ) ? 'checked' : ''; + + fname = link.substring( link.lastIndexOf('/') ); + fname = fname.replace(/-[0-9]{2,4}x[0-9]{2,4}/, '' ); + t.link = link.substring( 0, link.lastIndexOf('/') ) + fname; + + if ( c.indexOf('alignleft') != -1 ) { + t.I('alignleft').checked = "checked"; + d.className = t.align = "alignleft"; + } else if ( c.indexOf('aligncenter') != -1 ) { + t.I('aligncenter').checked = "checked"; + d.className = t.align = "aligncenter"; + } else if ( c.indexOf('alignright') != -1 ) { + t.I('alignright').checked = "checked"; + d.className = t.align = "alignright"; + } else if ( c.indexOf('alignnone') != -1 ) { + t.I('alignnone').checked = "checked"; + d.className = t.align = "alignnone"; + } + + if ( t.width && t.preloadImg.width ) t.showSizeSet(); + document.body.style.display = ''; + }, + + remove : function() { + var ed = tinyMCEPopup.editor, p, el; + + tinyMCEPopup.restoreSelection(); + el = ed.selection.getNode(); + if (el.nodeName != 'IMG') return; + + if ( (p = ed.dom.getParent(el, 'div')) && ed.dom.hasClass(p, 'mceTemp') ) + ed.dom.remove(p); + else if ( (p = ed.dom.getParent(el, 'A')) && p.childNodes.length == 1 ) + ed.dom.remove(p); + else ed.dom.remove(el); + + ed.execCommand('mceRepaint'); + tinyMCEPopup.close(); + return; + }, + + update : function() { + var t = this, f = document.forms[0], ed = tinyMCEPopup.editor, el, b, fixSafari = null, + DL, P, A, DIV, do_caption = null, img_class = f.img_classes.value, html, + id, cap_id = '', cap, DT, DD, cap_width, div_cls, lnk = '', pa, aa; + + tinyMCEPopup.restoreSelection(); + el = ed.selection.getNode(); + + if (el.nodeName != 'IMG') return; + if (f.img_src.value === '') { + t.remove(); + return; + } + + if ( f.img_cap.value != '' && f.width.value != '' ) { + do_caption = 1; + img_class = img_class.replace( /align[^ "']+\s?/gi, '' ); + } + + A = ed.dom.getParent(el, 'a'); + P = ed.dom.getParent(el, 'p'); + DL = ed.dom.getParent(el, 'dl'); + DIV = ed.dom.getParent(el, 'div'); + + tinyMCEPopup.execCommand("mceBeginUndoLevel"); + + ed.dom.setAttribs(el, { + src : f.img_src.value, + title : f.img_title.value, + alt : f.img_alt.value, + width : f.width.value, + height : f.height.value, + style : f.img_style.value, + 'class' : img_class + }); + + if ( f.link_href.value ) { + // Create new anchor elements + if ( A == null ) { + if ( ! f.link_href.value.match(/https?:\/\//i) ) + f.link_href.value = tinyMCEPopup.editor.documentBaseURI.toAbsolute(f.link_href.value); + + if ( tinymce.isWebKit && ed.dom.hasClass(el, 'aligncenter') ) { + ed.dom.removeClass(el, 'aligncenter'); + fixSafari = 1; + } + + tinyMCEPopup.execCommand("CreateLink", false, "#mce_temp_url#", {skip_undo : 1}); + if ( fixSafari ) ed.dom.addClass(el, 'aligncenter'); + + tinymce.each(ed.dom.select("a"), function(n) { + if (ed.dom.getAttrib(n, 'href') == '#mce_temp_url#') { + + ed.dom.setAttribs(n, { + href : f.link_href.value, + title : f.link_title.value, + rel : f.link_rel.value, + target : (f.link_target.checked == true) ? '_blank' : '', + 'class' : f.link_classes.value, + style : f.link_style.value + }); + } + }); + } else { + ed.dom.setAttribs(A, { + href : f.link_href.value, + title : f.link_title.value, + rel : f.link_rel.value, + target : (f.link_target.checked == true) ? '_blank' : '', + 'class' : f.link_classes.value, + style : f.link_style.value + }); + } + } + + if ( do_caption ) { + cap_width = 10 + parseInt(f.width.value); + div_cls = (t.align == 'aligncenter') ? 'mceTemp mceIEcenter' : 'mceTemp'; + + if ( DL ) { + ed.dom.setAttribs(DL, { + 'class' : 'wp-caption '+t.align, + style : 'width: '+cap_width+'px;' + }); + + if ( DIV ) + ed.dom.setAttrib(DIV, 'class', div_cls); + + if ( (DT = ed.dom.getParent(el, 'dt')) && (DD = DT.nextSibling) && ed.dom.hasClass(DD, 'wp-caption-dd') ) + ed.dom.setHTML(DD, f.img_cap.value); + + } else { + if ( (id = f.img_classes.value.match( /wp-image-([0-9]{1,6})/ )) && id[1] ) + cap_id = 'attachment_'+id[1]; + + if ( f.link_href.value && (lnk = ed.dom.getParent(el, 'a')) ) { + if ( lnk.childNodes.length == 1 ) + html = ed.dom.getOuterHTML(lnk); + else { + html = ed.dom.getOuterHTML(lnk); + html = html.match(/]+>/i); + html = html+ed.dom.getOuterHTML(el)+''; + } + } else html = ed.dom.getOuterHTML(el); + + html = '
    '+html+'
    '+f.img_cap.value+'
    '; + + cap = ed.dom.create('div', {'class': div_cls}, html); + + if ( P ) { + P.parentNode.insertBefore(cap, P); + if ( P.childNodes.length == 1 ) + ed.dom.remove(P); + else if ( lnk && lnk.childNodes.length == 1 ) + ed.dom.remove(lnk); + else ed.dom.remove(el); + } else if ( pa = ed.dom.getParent(el, 'TD,TH,LI') ) { + pa.appendChild(cap); + if ( lnk && lnk.childNodes.length == 1 ) + ed.dom.remove(lnk); + else ed.dom.remove(el); + } + } + + } else { + if ( DL && DIV ) { + if ( f.link_href.value && (aa = ed.dom.getParent(el, 'a')) ) html = ed.dom.getOuterHTML(aa); + else html = ed.dom.getOuterHTML(el); + + P = ed.dom.create('p', {}, html); + DIV.parentNode.insertBefore(P, DIV); + ed.dom.remove(DIV); + } + } + + if ( f.img_classes.value.indexOf('aligncenter') != -1 ) { + if ( P && ( ! P.style || P.style.textAlign != 'center' ) ) + ed.dom.setStyle(P, 'textAlign', 'center'); + } else { + if ( P && P.style && P.style.textAlign == 'center' ) + ed.dom.setStyle(P, 'textAlign', ''); + } + + if ( ! f.link_href.value && A ) { + b = ed.selection.getBookmark(); + ed.dom.remove(A, 1); + ed.selection.moveToBookmark(b); + } + + tinyMCEPopup.execCommand("mceEndUndoLevel"); + ed.execCommand('mceRepaint'); + tinyMCEPopup.close(); + }, + + updateStyle : function(ty) { + var dom = tinyMCEPopup.dom, v, f = document.forms[0], img = dom.create('img', {style : f.img_style.value}); + + if (tinyMCEPopup.editor.settings.inline_styles) { + // Handle align + if (ty == 'align') { + dom.setStyle(img, 'float', ''); + dom.setStyle(img, 'vertical-align', ''); + + v = f.align.value; + if (v) { + if (v == 'left' || v == 'right') + dom.setStyle(img, 'float', v); + else + img.style.verticalAlign = v; + } + } + + // Handle border + if (ty == 'border') { + dom.setStyle(img, 'border', ''); + + v = f.border.value; + if (v || v == '0') { + if (v == '0') + img.style.border = '0'; + else + img.style.border = v + 'px solid black'; + } + } + + // Handle hspace + if (ty == 'hspace') { + dom.setStyle(img, 'marginLeft', ''); + dom.setStyle(img, 'marginRight', ''); + + v = f.hspace.value; + if (v) { + img.style.marginLeft = v + 'px'; + img.style.marginRight = v + 'px'; + } + } + + // Handle vspace + if (ty == 'vspace') { + dom.setStyle(img, 'marginTop', ''); + dom.setStyle(img, 'marginBottom', ''); + + v = f.vspace.value; + if (v) { + img.style.marginTop = v + 'px'; + img.style.marginBottom = v + 'px'; + } + } + + // Merge + f.img_style.value = dom.serializeStyle(dom.parseStyle(img.style.cssText)); + this.demoSetStyle(); + } + }, + + checkVal : function(f) { + + if ( f.value == '' ) { + // if ( f.id == 'width' ) f.value = this.width || this.preloadImg.width; + // if ( f.id == 'height' ) f.value = this.height || this.preloadImg.height; + if ( f.id == 'img_src' ) f.value = this.I('img_demo').src || this.preloadImg.src; + } + }, + + resetImageData : function() { + var f = document.forms[0]; + + f.width.value = f.height.value = ''; + }, + + updateImageData : function() { + var f = document.forms[0], t = wpImage, w = f.width.value, h = f.height.value; + + if ( !w && h ) + w = f.width.value = t.width = Math.round( t.preloadImg.width / (t.preloadImg.height / h) ); + else if ( w && !h ) + h = f.height.value = t.height = Math.round( t.preloadImg.height / (t.preloadImg.width / w) ); + + if ( !w ) + f.width.value = t.width = t.preloadImg.width; + + if ( !h ) + f.height.value = t.height = t.preloadImg.height; + + t.showSizeSet(); + t.demoSetSize(); + if ( f.img_style.value ) + t.demoSetStyle(); + }, + + getImageData : function() { + var t = wpImage, f = document.forms[0]; + + t.preloadImg = new Image(); + t.preloadImg.onload = t.updateImageData; + t.preloadImg.onerror = t.resetImageData; + t.preloadImg.src = tinyMCEPopup.editor.documentBaseURI.toAbsolute(f.img_src.value); + } +}; + +window.onload = function(){wpImage.init();} +wpImage.preInit(); diff --git a/src/wp-includes/js/tinymce/plugins/wpeditimage/js/editimage.js b/src/wp-includes/js/tinymce/plugins/wpeditimage/js/editimage.js new file mode 100644 index 0000000..0a801bd --- /dev/null +++ b/src/wp-includes/js/tinymce/plugins/wpeditimage/js/editimage.js @@ -0,0 +1 @@ +var tinymce=null,tinyMCEPopup,tinyMCE,wpImage;tinyMCEPopup={init:function(){var d=this,b,a,f,c,e;a=(""+document.location.search).replace(/^\?/,"").split("&");f={};for(c=0;c')}}},I:function(a){return document.getElementById(a)},current:"",link:"",link_rel:"",target_value:"",current_size_sel:"s100",width:"",height:"",align:"",img_alt:"",setTabs:function(b){var a=this;if("current"==b.className){return false}a.I("div_advanced").style.display=("tab_advanced"==b.id)?"block":"none";a.I("div_basic").style.display=("tab_basic"==b.id)?"block":"none";a.I("tab_basic").className=a.I("tab_advanced").className="";b.className="current";return false},img_seturl:function(b){var c=this,a=c.I("link_rel").value;if("current"==b){c.I("link_href").value=c.current;c.I("link_rel").value=c.link_rel}else{c.I("link_href").value=c.link;if(a){a=a.replace(/attachment|wp-att-[0-9]+/gi,"");c.I("link_rel").value=tinymce.trim(a)}}},imgAlignCls:function(b){var c=this,a=c.I("img_classes").value;c.I("img_demo").className=c.align=b;a=a.replace(/align[^ "']+/gi,"");a+=(" "+b);a=a.replace(/\s+/g," ").replace(/^\s/,"");if("aligncenter"==b){c.I("hspace").value="";c.updateStyle("hspace")}c.I("img_classes").value=a},showSize:function(e){var c=this,f=c.I("img_demo"),a=c.width,d=c.height,g=e.id||"s100",b;b=parseInt(g.substring(1))/200;f.width=Math.round(a*b);f.height=Math.round(d*b);c.showSizeClear();e.style.borderColor="#A3A3A3";e.style.backgroundColor="#E5E5E5"},showSizeSet:function(){var b=this,d,c,a;if((b.width*1.3)>parseInt(b.preloadImg.width)){d=b.I("s130"),c=b.I("s120"),a=b.I("s110");d.onclick=c.onclick=a.onclick=null;d.onmouseover=c.onmouseover=a.onmouseover=null;d.style.color=c.style.color=a.style.color="#aaa"}},showSizeRem:function(){var a=this,c=a.I("img_demo"),b=document.forms[0];c.width=Math.round(b.width.value*0.5);c.height=Math.round(b.height.value*0.5);a.showSizeClear();a.I(a.current_size_sel).style.borderColor="#A3A3A3";a.I(a.current_size_sel).style.backgroundColor="#E5E5E5";return false},showSizeClear:function(){var b=this.I("img_size").getElementsByTagName("div"),a;for(a=0;a]+>/i);l=l+g.dom.getOuterHTML(e)+""}}else{l=g.dom.getOuterHTML(e)}l='
    '+l+'
    '+v.img_cap.value+"
    ";j=g.dom.create("div",{"class":z},l);if(h){h.parentNode.insertBefore(j,h);if(h.childNodes.length==1){g.dom.remove(h)}else{if(w&&w.childNodes.length==1){g.dom.remove(w)}else{g.dom.remove(e)}}}else{if(c=g.dom.getParent(e,"TD,TH,LI")){c.appendChild(j);if(w&&w.childNodes.length==1){g.dom.remove(w)}else{g.dom.remove(e)}}}}}else{if(n&&r){if(v.link_href.value&&(y=g.dom.getParent(e,"a"))){l=g.dom.getOuterHTML(y)}else{l=g.dom.getOuterHTML(e)}h=g.dom.create("p",{},l);r.parentNode.insertBefore(h,r);g.dom.remove(r)}}if(v.img_classes.value.indexOf("aligncenter")!=-1){if(h&&(!h.style||h.style.textAlign!="center")){g.dom.setStyle(h,"textAlign","center")}}else{if(h&&h.style&&h.style.textAlign=="center"){g.dom.setStyle(h,"textAlign","")}}if(!v.link_href.value&&p){x=g.selection.getBookmark();g.dom.remove(p,1);g.selection.moveToBookmark(x)}tinyMCEPopup.execCommand("mceEndUndoLevel");g.execCommand("mceRepaint");tinyMCEPopup.close()},updateStyle:function(a){var e=tinyMCEPopup.dom,c,d=document.forms[0],b=e.create("img",{style:d.img_style.value});if(tinyMCEPopup.editor.settings.inline_styles){if(a=="align"){e.setStyle(b,"float","");e.setStyle(b,"vertical-align","");c=d.align.value;if(c){if(c=="left"||c=="right"){e.setStyle(b,"float",c)}else{b.style.verticalAlign=c}}}if(a=="border"){e.setStyle(b,"border","");c=d.border.value;if(c||c=="0"){if(c=="0"){b.style.border="0"}else{b.style.border=c+"px solid black"}}}if(a=="hspace"){e.setStyle(b,"marginLeft","");e.setStyle(b,"marginRight","");c=d.hspace.value;if(c){b.style.marginLeft=c+"px";b.style.marginRight=c+"px"}}if(a=="vspace"){e.setStyle(b,"marginTop","");e.setStyle(b,"marginBottom","");c=d.vspace.value;if(c){b.style.marginTop=c+"px";b.style.marginBottom=c+"px"}}d.img_style.value=e.serializeStyle(e.parseStyle(b.style.cssText));this.demoSetStyle()}},checkVal:function(a){if(a.value==""){if(a.id=="img_src"){a.value=this.I("img_demo").src||this.preloadImg.src}}},resetImageData:function(){var a=document.forms[0];a.width.value=a.height.value=""},updateImageData:function(){var d=document.forms[0],b=wpImage,a=d.width.value,c=d.height.value;if(!a&&c){a=d.width.value=b.width=Math.round(b.preloadImg.width/(b.preloadImg.height/c))}else{if(a&&!c){c=d.height.value=b.height=Math.round(b.preloadImg.height/(b.preloadImg.width/a))}}if(!a){d.width.value=b.width=b.preloadImg.width}if(!c){d.height.value=b.height=b.preloadImg.height}b.showSizeSet();b.demoSetSize();if(d.img_style.value){b.demoSetStyle()}},getImageData:function(){var a=wpImage,b=document.forms[0];a.preloadImg=new Image();a.preloadImg.onload=a.updateImageData;a.preloadImg.onerror=a.resetImageData;a.preloadImg.src=tinyMCEPopup.editor.documentBaseURI.toAbsolute(b.img_src.value)}};window.onload=function(){wpImage.init()};wpImage.preInit(); \ No newline at end of file diff --git a/src/wp-includes/js/tinymce/plugins/wpfullscreen/css/wp-fullscreen.css b/src/wp-includes/js/tinymce/plugins/wpfullscreen/css/wp-fullscreen.css new file mode 100644 index 0000000..a60af77 --- /dev/null +++ b/src/wp-includes/js/tinymce/plugins/wpfullscreen/css/wp-fullscreen.css @@ -0,0 +1,11 @@ +/* +Distraction Free Writing mode TinyMCE Styles +*/ + +html, body { + background: transparent; + width: auto !important; + max-width: none !important; + margin: 0; + padding: 0; +} diff --git a/src/wp-includes/js/tinymce/plugins/wpfullscreen/editor_plugin.dev.js b/src/wp-includes/js/tinymce/plugins/wpfullscreen/editor_plugin.dev.js new file mode 100644 index 0000000..29b56ca --- /dev/null +++ b/src/wp-includes/js/tinymce/plugins/wpfullscreen/editor_plugin.dev.js @@ -0,0 +1,178 @@ +/** + * WP Fullscreen TinyMCE plugin + * + * Contains code from Moxiecode Systems AB released under LGPL License http://tinymce.moxiecode.com/license + */ + +(function() { + tinymce.create('tinymce.plugins.wpFullscreenPlugin', { + + init : function(ed, url) { + var t = this, oldHeight = 0, s = {}, DOM = tinymce.DOM, resized = false; + + // Register commands + ed.addCommand('wpFullScreenClose', function() { + // this removes the editor, content has to be saved first with tinyMCE.execCommand('wpFullScreenSave'); + if ( ed.getParam('wp_fullscreen_is_enabled') ) { + DOM.win.setTimeout(function() { + tinyMCE.remove(ed); + DOM.remove('wp_mce_fullscreen_parent'); + tinyMCE.settings = tinyMCE.oldSettings; // Restore old settings + }, 10); + } + }); + + ed.addCommand('wpFullScreenSave', function() { + var ed = tinyMCE.get('wp_mce_fullscreen'), edd; + + ed.focus(); + edd = tinyMCE.get( ed.getParam('wp_fullscreen_editor_id') ); + + edd.setContent( ed.getContent({format : 'raw'}), {format : 'raw'} ); + }); + + ed.addCommand('wpFullScreenInit', function() { + var d = ed.getDoc(), b = d.body, fsed; + + // Only init the editor if necessary. + if ( ed.id == 'wp_mce_fullscreen' ) + return; + + tinyMCE.oldSettings = tinyMCE.settings; // Store old settings + + tinymce.each(ed.settings, function(v, n) { + s[n] = v; + }); + + s.id = 'wp_mce_fullscreen'; + s.wp_fullscreen_is_enabled = true; + s.wp_fullscreen_editor_id = ed.id; + s.theme_advanced_resizing = false; + s.theme_advanced_statusbar_location = 'none'; + s.content_css = s.content_css ? s.content_css + ',' + s.wp_fullscreen_content_css : s.wp_fullscreen_content_css; + s.height = tinymce.isIE ? b.scrollHeight : b.offsetHeight; + + tinymce.each(ed.getParam('wp_fullscreen_settings'), function(v, k) { + s[k] = v; + }); + + fsed = new tinymce.Editor('wp_mce_fullscreen', s); + fsed.onInit.add(function(edd) { + var DOM = tinymce.DOM, buttons = DOM.select('a.mceButton', DOM.get('wp-fullscreen-buttons')); + + if ( !ed.isHidden() ) + edd.setContent( ed.getContent() ); + else + edd.setContent( switchEditors.wpautop( edd.getElement().value ) ); + + setTimeout(function(){ // add last + edd.onNodeChange.add(function(ed, cm, e){ + tinymce.each(buttons, function(c) { + var btn, cls; + + if ( btn = DOM.get( 'wp_mce_fullscreen_' + c.id.substr(6) ) ) { + cls = btn.className; + + if ( cls ) + c.className = cls; + } + }); + }); + }, 1000); + + edd.dom.addClass(edd.getBody(), 'wp-fullscreen-editor'); + edd.focus(); + }); + + fsed.render(); + + if ( 'undefined' != fullscreen ) { + fsed.dom.bind( fsed.dom.doc, 'mousemove', function(e){ + fullscreen.bounder( 'showToolbar', 'hideToolbar', 2000, e ); + }); + } + }); + + // Register buttons + if ( 'undefined' != fullscreen ) { + ed.addButton('fullscreen', { + title : 'fullscreen.desc', + onclick : function(){ fullscreen.on(); } + }); + } + + // END fullscreen +//---------------------------------------------------------------- + // START autoresize + + if ( ed.getParam('fullscreen_is_enabled') || !ed.getParam('wp_fullscreen_is_enabled') ) + return; + + /** + * This method gets executed each time the editor needs to resize. + */ + function resize() { + if ( resized ) + return; + + var d = ed.getDoc(), DOM = tinymce.DOM, resizeHeight, myHeight; + + // Get height differently depending on the browser used + if ( tinymce.isIE ) + myHeight = d.body.scrollHeight; + else + myHeight = d.documentElement.offsetHeight; + + // Don't make it smaller than 300px + resizeHeight = (myHeight > 300) ? myHeight : 300; + + // Resize content element + if ( oldHeight != resizeHeight ) { + oldHeight = resizeHeight; + resized = true; + setTimeout(function(){ resized = false; }, 100); + + DOM.setStyle(DOM.get(ed.id + '_ifr'), 'height', resizeHeight + 'px'); + } + }; + + // Add appropriate listeners for resizing content area + ed.onInit.add(function(ed, l) { + ed.onChange.add(resize); + ed.onSetContent.add(resize); + ed.onPaste.add(resize); + ed.onKeyUp.add(resize); + ed.onPostRender.add(resize); + + ed.getBody().style.overflowY = "hidden"; + }); + + if (ed.getParam('autoresize_on_init', true)) { + ed.onLoadContent.add(function(ed, l) { + // Because the content area resizes when its content CSS loads, + // and we can't easily add a listener to its onload event, + // we'll just trigger a resize after a short loading period + setTimeout(function() { + resize(); + }, 1200); + }); + } + + // Register the command so that it can be invoked by using tinyMCE.activeEditor.execCommand('mceExample'); + ed.addCommand('wpAutoResize', resize); + }, + + getInfo : function() { + return { + longname : 'WP Fullscreen', + author : 'WordPress', + authorurl : 'http://wordpress.org', + infourl : '', + version : '1.0' + }; + } + }); + + // Register plugin + tinymce.PluginManager.add('wpfullscreen', tinymce.plugins.wpFullscreenPlugin); +})(); diff --git a/src/wp-includes/js/tinymce/plugins/wpfullscreen/editor_plugin.js b/src/wp-includes/js/tinymce/plugins/wpfullscreen/editor_plugin.js new file mode 100644 index 0000000..ed27150 --- /dev/null +++ b/src/wp-includes/js/tinymce/plugins/wpfullscreen/editor_plugin.js @@ -0,0 +1 @@ +(function(){tinymce.create("tinymce.plugins.wpFullscreenPlugin",{init:function(b,d){var e=this,h=0,f={},g=tinymce.DOM,a=false;b.addCommand("wpFullScreenClose",function(){if(b.getParam("wp_fullscreen_is_enabled")){g.win.setTimeout(function(){tinyMCE.remove(b);g.remove("wp_mce_fullscreen_parent");tinyMCE.settings=tinyMCE.oldSettings},10)}});b.addCommand("wpFullScreenSave",function(){var i=tinyMCE.get("wp_mce_fullscreen"),j;i.focus();j=tinyMCE.get(i.getParam("wp_fullscreen_editor_id"));j.setContent(i.getContent({format:"raw"}),{format:"raw"})});b.addCommand("wpFullScreenInit",function(){var k=b.getDoc(),i=k.body,j;if(b.id=="wp_mce_fullscreen"){return}tinyMCE.oldSettings=tinyMCE.settings;tinymce.each(b.settings,function(l,m){f[m]=l});f.id="wp_mce_fullscreen";f.wp_fullscreen_is_enabled=true;f.wp_fullscreen_editor_id=b.id;f.theme_advanced_resizing=false;f.theme_advanced_statusbar_location="none";f.content_css=f.content_css?f.content_css+","+f.wp_fullscreen_content_css:f.wp_fullscreen_content_css;f.height=tinymce.isIE?i.scrollHeight:i.offsetHeight;tinymce.each(b.getParam("wp_fullscreen_settings"),function(m,l){f[l]=m});j=new tinymce.Editor("wp_mce_fullscreen",f);j.onInit.add(function(l){var n=tinymce.DOM,m=n.select("a.mceButton",n.get("wp-fullscreen-buttons"));if(!b.isHidden()){l.setContent(b.getContent())}else{l.setContent(switchEditors.wpautop(l.getElement().value))}setTimeout(function(){l.onNodeChange.add(function(p,o,q){tinymce.each(m,function(t){var s,r;if(s=n.get("wp_mce_fullscreen_"+t.id.substr(6))){r=s.className;if(r){t.className=r}}})})},1000);l.dom.addClass(l.getBody(),"wp-fullscreen-editor");l.focus()});j.render();if("undefined"!=fullscreen){j.dom.bind(j.dom.doc,"mousemove",function(l){fullscreen.bounder("showToolbar","hideToolbar",2000,l)})}});if("undefined"!=fullscreen){b.addButton("fullscreen",{title:"fullscreen.desc",onclick:function(){fullscreen.on()}})}if(b.getParam("fullscreen_is_enabled")||!b.getParam("wp_fullscreen_is_enabled")){return}function c(){if(a){return}var k=b.getDoc(),j=tinymce.DOM,l,i;if(tinymce.isIE){i=k.body.scrollHeight}else{i=k.documentElement.offsetHeight}l=(i>300)?i:300;if(h!=l){h=l;a=true;setTimeout(function(){a=false},100);j.setStyle(j.get(b.id+"_ifr"),"height",l+"px")}}b.onInit.add(function(j,i){j.onChange.add(c);j.onSetContent.add(c);j.onPaste.add(c);j.onKeyUp.add(c);j.onPostRender.add(c);j.getBody().style.overflowY="hidden"});if(b.getParam("autoresize_on_init",true)){b.onLoadContent.add(function(j,i){setTimeout(function(){c()},1200)})}b.addCommand("wpAutoResize",c)},getInfo:function(){return{longname:"WP Fullscreen",author:"WordPress",authorurl:"http://wordpress.org",infourl:"",version:"1.0"}}});tinymce.PluginManager.add("wpfullscreen",tinymce.plugins.wpFullscreenPlugin)})(); \ No newline at end of file diff --git a/src/wp-includes/js/tinymce/plugins/wpgallery/editor_plugin.dev.js b/src/wp-includes/js/tinymce/plugins/wpgallery/editor_plugin.dev.js new file mode 100644 index 0000000..6f57184 --- /dev/null +++ b/src/wp-includes/js/tinymce/plugins/wpgallery/editor_plugin.dev.js @@ -0,0 +1,119 @@ + +(function() { + tinymce.create('tinymce.plugins.wpGallery', { + + init : function(ed, url) { + var t = this; + + t.url = url; + t._createButtons(); + + // Register the command so that it can be invoked by using tinyMCE.activeEditor.execCommand('...'); + ed.addCommand('WP_Gallery', function() { + var el = ed.selection.getNode(), post_id, vp = tinymce.DOM.getViewPort(), + H = vp.h - 80, W = ( 640 < vp.w ) ? 640 : vp.w; + + if ( el.nodeName != 'IMG' ) return; + if ( ed.dom.getAttrib(el, 'class').indexOf('wpGallery') == -1 ) return; + + post_id = tinymce.DOM.get('post_ID').value; + tb_show('', tinymce.documentBaseURL + '/media-upload.php?post_id='+post_id+'&tab=gallery&TB_iframe=true&width='+W+'&height='+H); + + tinymce.DOM.setStyle( ['TB_overlay','TB_window','TB_load'], 'z-index', '999999' ); + }); + + ed.onMouseDown.add(function(ed, e) { + if ( e.target.nodeName == 'IMG' && ed.dom.hasClass(e.target, 'wpGallery') ) + ed.plugins.wordpress._showButtons(e.target, 'wp_gallerybtns'); + }); + + ed.onBeforeSetContent.add(function(ed, o) { + o.content = t._do_gallery(o.content); + }); + + ed.onPostProcess.add(function(ed, o) { + if (o.get) + o.content = t._get_gallery(o.content); + }); + }, + + _do_gallery : function(co) { + return co.replace(/\[gallery([^\]]*)\]/g, function(a,b){ + return ''; + }); + }, + + _get_gallery : function(co) { + + function getAttr(s, n) { + n = new RegExp(n + '=\"([^\"]+)\"', 'g').exec(s); + return n ? tinymce.DOM.decode(n[1]) : ''; + }; + + return co.replace(/(?:]*>)*(]+>)(?:<\/p>)*/g, function(a,im) { + var cls = getAttr(im, 'class'); + + if ( cls.indexOf('wpGallery') != -1 ) + return '

    ['+tinymce.trim(getAttr(im, 'title'))+']

    '; + + return a; + }); + }, + + _createButtons : function() { + var t = this, ed = tinyMCE.activeEditor, DOM = tinymce.DOM, editButton, dellButton; + + DOM.remove('wp_gallerybtns'); + + DOM.add(document.body, 'div', { + id : 'wp_gallerybtns', + style : 'display:none;' + }); + + editButton = DOM.add('wp_gallerybtns', 'img', { + src : t.url+'/img/edit.png', + id : 'wp_editgallery', + width : '24', + height : '24', + title : ed.getLang('wordpress.editgallery') + }); + + tinymce.dom.Event.add(editButton, 'mousedown', function(e) { + var ed = tinyMCE.activeEditor; + ed.windowManager.bookmark = ed.selection.getBookmark('simple'); + ed.execCommand("WP_Gallery"); + }); + + dellButton = DOM.add('wp_gallerybtns', 'img', { + src : t.url+'/img/delete.png', + id : 'wp_delgallery', + width : '24', + height : '24', + title : ed.getLang('wordpress.delgallery') + }); + + tinymce.dom.Event.add(dellButton, 'mousedown', function(e) { + var ed = tinyMCE.activeEditor, el = ed.selection.getNode(); + + if ( el.nodeName == 'IMG' && ed.dom.hasClass(el, 'wpGallery') ) { + ed.dom.remove(el); + + ed.execCommand('mceRepaint'); + return false; + } + }); + }, + + getInfo : function() { + return { + longname : 'Gallery Settings', + author : 'WordPress', + authorurl : 'http://wordpress.org', + infourl : '', + version : "1.0" + }; + } + }); + + tinymce.PluginManager.add('wpgallery', tinymce.plugins.wpGallery); +})(); diff --git a/src/wp-includes/js/tinymce/plugins/wpgallery/editor_plugin.js b/src/wp-includes/js/tinymce/plugins/wpgallery/editor_plugin.js new file mode 100644 index 0000000..0c2824a --- /dev/null +++ b/src/wp-includes/js/tinymce/plugins/wpgallery/editor_plugin.js @@ -0,0 +1 @@ +(function(){tinymce.create("tinymce.plugins.wpGallery",{init:function(a,b){var c=this;c.url=b;c._createButtons();a.addCommand("WP_Gallery",function(){var h=a.selection.getNode(),f,e=tinymce.DOM.getViewPort(),g=e.h-80,d=(640'})},_get_gallery:function(b){function a(c,d){d=new RegExp(d+'="([^"]+)"',"g").exec(c);return d?tinymce.DOM.decode(d[1]):""}return b.replace(/(?:]*>)*(]+>)(?:<\/p>)*/g,function(e,d){var c=a(d,"class");if(c.indexOf("wpGallery")!=-1){return"

    ["+tinymce.trim(a(d,"title"))+"]

    "}return e})},_createButtons:function(){var b=this,a=tinyMCE.activeEditor,d=tinymce.DOM,e,c;d.remove("wp_gallerybtns");d.add(document.body,"div",{id:"wp_gallerybtns",style:"display:none;"});e=d.add("wp_gallerybtns","img",{src:b.url+"/img/edit.png",id:"wp_editgallery",width:"24",height:"24",title:a.getLang("wordpress.editgallery")});tinymce.dom.Event.add(e,"mousedown",function(g){var f=tinyMCE.activeEditor;f.windowManager.bookmark=f.selection.getBookmark("simple");f.execCommand("WP_Gallery")});c=d.add("wp_gallerybtns","img",{src:b.url+"/img/delete.png",id:"wp_delgallery",width:"24",height:"24",title:a.getLang("wordpress.delgallery")});tinymce.dom.Event.add(c,"mousedown",function(h){var f=tinyMCE.activeEditor,g=f.selection.getNode();if(g.nodeName=="IMG"&&f.dom.hasClass(g,"wpGallery")){f.dom.remove(g);f.execCommand("mceRepaint");return false}})},getInfo:function(){return{longname:"Gallery Settings",author:"WordPress",authorurl:"http://wordpress.org",infourl:"",version:"1.0"}}});tinymce.PluginManager.add("wpgallery",tinymce.plugins.wpGallery)})(); \ No newline at end of file diff --git a/src/wp-includes/js/tinymce/plugins/wpgallery/img/delete.png b/src/wp-includes/js/tinymce/plugins/wpgallery/img/delete.png new file mode 100644 index 0000000000000000000000000000000000000000..d64d8a66ebc7f512f5a44dd30f9ba88b9eb4d81c GIT binary patch literal 1638 zcmV-s2ATPZP)S54zJI5e!u&= za$o=4;(*pHSK`m7um^`QUV9mNTw&os;M_GiAJW0sx8B(K;`R63gVE6emV;Iys1OhcX@F@! z5D;EG&)FAWqJQAj9$(5IUfsd91P^_-Z`Tv+@4ORjnCQBTa_f}xdFIPylvX674(W6T z)3%YRG=_lj!++q=8-IGH90d0*3%JIJKDT4%wkKM9dT_@l&?s_~)BNT1X-T8 z&Y(ryc2<9?yk-K|0$3gHnzULdGi)>=P!b3 zGCn%Y!FNv9CMwkj&co|-aQQyKsaKN?Ln8x)c(T2e%i$FY$V8k?Z5#RM$mmlSE({+A z1_4ZKFo)sT0DHHrZ((9&oPrPpg?XMkF>vEdln=tXs3MP_N+Urcl`o=Q0uG^c3m*Jgun|Z4L3e&(ysY`uOo#Q=j@N!1{zK z86FyD&NK+3G0rZOzQYpyi?#ua`}o*wbL!#w!Zc#iMK@-6BbVd&xr_g}L8_a!Dvi$P z$q0=v_@wOT71Lkb~$B)?@i zCFethAxVagvl+rWEZC<4p9Kvu(xU(vLbC zECa+{TBDZIG!SgvmWaOlt+a!v)EQEmpfQaXaj3g>ECq&PVcHh)r~`pZI6XzP?_ot9 zUMP9|s#4$W!}9=+*8h{HCl8iuUz3P~yH_;OB_w&}W7sCiRV_s97*Yy?P*E)x@$z+I zi5Lqy$_sO4o~^o%umlH4UX`ZH^}Dx9)t#eWaO5lLWNLf!N*Y%;V`eiDi-QzcwHo$Z zgre*7?n0GU3q=mQ{=G3Fp1T@$^@tb&)@T?5CoScJ+b#3^T@9(&=4>PBL>z>mSgtTM zH^)Bj47> znx!l(C`BE(mcRs%OJ5gx6e1dAA4C9Sa1g7#Jv8BjarEd3+20R0l6gk7nG;@wq_MECjbBd07*qoM6N<$f>OgCM*si- literal 0 HcmV?d00001 diff --git a/src/wp-includes/js/tinymce/plugins/wpgallery/img/edit.png b/src/wp-includes/js/tinymce/plugins/wpgallery/img/edit.png new file mode 100644 index 0000000000000000000000000000000000000000..41def5115ea5a42785a380a56190c90ba4cbc1c6 GIT binary patch literal 1799 zcmV+i2l)7jP) zTa2Am6~}*TfBUk>=;_hKz|=&*KKET zV2Hudt*qZT#Kw^^c8*jTzvYt*kB)Nvj-CAI$3G>T&Ek0;+BwJnW6puY;o1)1aL!_l z!K9F;F(ys0CdC+wwH6UU{|~5kKJH@>hqD&rz$7s?O|UjaoI#wyrcDNh`U^o2j-*L^ zYkg^PR}=*gH&<5=ds?>(I2_hm0FpSyq%qE<;0)qYOwy!((}rxZSm;97hD&dCCfF8W()aUf+Gv|*CRvgt*mX07n zi9?BMcPWA>K>fF4hf)erf~Vx;*h7C@KxvP}gRl?=m2zpwb{6OK#mh5?f+R`0x(dFH z>v$MMd59;7r`i()A)fMZriE652xui}1hj|p6x#C%A_WBXBTHL zu6B0~`LpvezIKR!5lX}+mauVq50!>6 z2XSgS`qJN-df^Y8nLJ45&V6hd+p(>qqkww+vEOm_z4zRW ze*U??lFdZNKXnf`hmj%^DzrEx6j+?6dG0lulA~HFaqih?c6lFs7^xs}!sos1un;44e40`c>ihj%*-_UX4Al1%@ znoW85*#nfyLSK)N>oBOrE3ABYo}*{aP+Lwo@a|h2y);elx~*J3+aihzQD?ccQx+B$ z*5b4vU9WTi%ZagK$R7~czMH5-JP0&g5X!t&x0pBURpsk=%xlR=B-%H=D(dgv8S z96iQzYnj>E8r9wcGxbRx{K@a#UHkU$@h0|8e6?@WrhNbwXslY^o;uBZqrt_w1?J}# zXk4A)^r+h=RWL8(3E^Q!SM#cdns(V;}wfeTdQ|*7C&TPjme6Br1w%#tAA7 zdHI#UphLxm!BKA6c`KjY{S|80T%u1*O&Mn`X_~OKw1g-D=V;WM)LY9mms&LAI*sKO zKDT!-5B=Wxr4Wp<_@Xh^Voi*V4Mq%2W9aHC5CtLEKA0vIi)@4C#Tunz5h-@?)D!=_^XuQ* z_oDLJOQ@70j$?GIwTg4DEpOVx(;jJJNC78;I7`OQuvA;?a$>hI-&yS~f03m53= z+raU6kF(NPPKx==;XnT7Nyhh#Bg)}<($?gal~q9mB|;d6Xst2Ewoie0XdR*?g>1x$ zlP9@j;tuMIOB{UlH8P=QcIGO_CXXDO`RJqBzz;CikfsJ>E#T0%-L^Zj#-O!kb#)bJ z-*{)*LM{qgaf-uGtyaiqd^+-LxoOu8c%Fb|?t9Wp2fzN+Z`;i5 z-@pGxYwVx0*-W`stA)-vZBnCBYe|!sIF8$2g0tWpNs=I<$cB;gGtu(s=*Xkxa`_2s p?R2G5X^K(=zE3WfV`5^0{{V_y1OqtCpZWj*002ovPDHLkV1ja@f;#{J literal 0 HcmV?d00001 diff --git a/src/wp-includes/js/tinymce/plugins/wpgallery/img/gallery.png b/src/wp-includes/js/tinymce/plugins/wpgallery/img/gallery.png new file mode 100644 index 0000000000000000000000000000000000000000..803ad630c015d80b318f7b2144aba0b583efc1b6 GIT binary patch literal 27676 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 literal 0 HcmV?d00001 diff --git a/src/wp-includes/js/tinymce/plugins/wpgallery/img/t.gif b/src/wp-includes/js/tinymce/plugins/wpgallery/img/t.gif new file mode 100644 index 0000000000000000000000000000000000000000..388486517fa8da13ebd150e8f65d5096c3e10c3a GIT binary patch literal 43 ncmZ?wbhEHbWMp7un7{x9ia%KxMSyG_5FaGNz{KRj$Y2csb)f_x literal 0 HcmV?d00001 diff --git a/src/wp-includes/js/tinymce/plugins/wplink/css/wplink-rtl.css b/src/wp-includes/js/tinymce/plugins/wplink/css/wplink-rtl.css new file mode 100644 index 0000000..6d0d4c3 --- /dev/null +++ b/src/wp-includes/js/tinymce/plugins/wplink/css/wplink-rtl.css @@ -0,0 +1 @@ +#wp-link #internal-toggle{padding-right:18px;padding-left:0;}#wp-link label span{text-align:left;padding-left:5px;padding-right:0;}#wp-link .link-search-wrapper span{float:right;}#wp-link .link-search-wrapper input[type="text"]{float:right;}#wp-link .link-search-wrapper img.waiting{margin:8px 4px 0 1px;float:right;}#wp-link .link-target{margin:0 87px 0 0;}#wp-link .item-info{left:5px;right:auto;top:4px;bottom:0;}#wp-link #search-panel{float:right;}#wp-link-cancel{float:right;}#wp-link-update{float:left;}#wp-link .toggle-arrow{background-position:bottom right;}#wp-link .toggle-arrow-active{background-position:center right;} \ No newline at end of file diff --git a/src/wp-includes/js/tinymce/plugins/wplink/css/wplink-rtl.dev.css b/src/wp-includes/js/tinymce/plugins/wplink/css/wplink-rtl.dev.css new file mode 100644 index 0000000..d64f198 --- /dev/null +++ b/src/wp-includes/js/tinymce/plugins/wplink/css/wplink-rtl.dev.css @@ -0,0 +1,54 @@ +#wp-link #internal-toggle { + padding-right: 18px; + padding-left: 0; +} + +#wp-link label span { + text-align: left; + padding-left: 5px; + padding-right: 0; +} + +#wp-link .link-search-wrapper span { + float: right; +} + +#wp-link .link-search-wrapper input[type="text"] { + float: right; +} + +#wp-link .link-search-wrapper img.waiting { + margin: 8px 4px 0 1px; + float: right; +} + +#wp-link .link-target { + margin: 0 87px 0 0; +} + +#wp-link .item-info { + left: 5px; + right: auto; + top: 4px; + bottom: 0; +} + +#wp-link #search-panel { + float: right; +} + +#wp-link-cancel { + float: right; +} + +#wp-link-update { + float: left; +} + +#wp-link .toggle-arrow { + background-position: bottom right; +} + +#wp-link .toggle-arrow-active { + background-position: center right; +} \ No newline at end of file diff --git a/src/wp-includes/js/tinymce/plugins/wplink/css/wplink.css b/src/wp-includes/js/tinymce/plugins/wplink/css/wplink.css new file mode 100644 index 0000000..a1560b3 --- /dev/null +++ b/src/wp-includes/js/tinymce/plugins/wplink/css/wplink.css @@ -0,0 +1 @@ +#wp-link{line-height:1.4em;font-size:12px;}#wp-link ol,#wp-link ul{list-style:none;margin:0;padding:0;}#wp-link input[type="text"]{-webkit-box-sizing:border-box;}#wp-link input[type="text"],#wp-link textarea{border-width:1px;border-style:solid;-moz-border-radius:4px;-khtml-border-radius:4px;-webkit-border-radius:4px;border-radius:4px;font-size:12px;margin:1px;padding:3px;}#wp-link #link-options{padding:10px 0 14px;border-bottom:1px solid #dfdfdf;margin:0 6px 14px;}#wp-link p.howto{margin:3px;}#wp-link #internal-toggle{display:inline-block;cursor:pointer;padding-left:18px;}#wp-link .toggle-arrow{background:transparent url('../img/toggle-arrow.png') top left no-repeat;height:23px;line-height:23px;}#wp-link .toggle-arrow-active{background-position:center left;}#wp-link label input[type="text"]{width:360px;margin-top:5px;}#wp-link label span{display:inline-block;width:80px;text-align:right;padding-right:5px;}#wp-link .link-search-wrapper{margin:5px 6px 9px;display:block;overflow:hidden;}#wp-link .link-search-wrapper span{float:left;margin-top:6px;}#wp-link .link-search-wrapper input[type="text"]{float:left;width:220px;}#wp-link .link-search-wrapper img.waiting{margin:8px 1px 0 4px;float:left;display:none;}#wp-link .link-target{width:auto;padding:3px 0 0;margin:0 0 0 87px;font-size:11px;}#wp-link .query-results{border:1px #dfdfdf solid;margin:0 5px 5px;background:#fff;height:185px;overflow:auto;position:relative;}#wp-link li,#wp-link .query-notice{clear:both;margin-bottom:0;border-bottom:1px solid #f1f1f1;color:#333;padding:4px 6px;cursor:pointer;position:relative;}#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:#333;}#wp-link li.selected{background:#ddd;color:#333;}#wp-link li.selected .item-title{font-weight:bold;}#wp-link .item-title{display:inline-block;width:80%;}#wp-link .item-info{text-transform:uppercase;color:#666;font-size:11px;position:absolute;right:5px;top:4px;bottom:0;}#wp-link #search-results{display:none;}#wp-link #search-panel{float:left;width:100%;}#wp-link .river-waiting{display:none;padding:10px 0;}#wp-link .river-waiting img.waiting{margin:0 auto;display:block;}#wp-link .submitbox{padding:5px 10px;font-size:11px;overflow:auto;height:29px;}#wp-link-cancel{line-height:25px;float:left;}#wp-link-update{line-height:23px;float:right;} \ No newline at end of file diff --git a/src/wp-includes/js/tinymce/plugins/wplink/css/wplink.dev.css b/src/wp-includes/js/tinymce/plugins/wplink/css/wplink.dev.css new file mode 100644 index 0000000..16db9e5 --- /dev/null +++ b/src/wp-includes/js/tinymce/plugins/wplink/css/wplink.dev.css @@ -0,0 +1,163 @@ +#wp-link { + line-height: 1.4em; + font-size: 12px; +} + +#wp-link ol, +#wp-link ul { + list-style: none; + margin: 0; + padding: 0; +} + +#wp-link input[type="text"] { + -webkit-box-sizing: border-box; +} + +#wp-link input[type="text"], +#wp-link textarea { + border-width: 1px; + border-style: solid; + -moz-border-radius: 4px; + -khtml-border-radius: 4px; + -webkit-border-radius: 4px; + border-radius: 4px; + font-size: 12px; + margin: 1px; + padding: 3px; +} + +#wp-link #link-options { + padding: 10px 0 14px; + border-bottom: 1px solid #dfdfdf; + margin: 0 6px 14px; +} +#wp-link p.howto { + margin: 3px; +} +#wp-link #internal-toggle { + display: inline-block; + cursor: pointer; + padding-left: 18px; +} +#wp-link .toggle-arrow { + background: transparent url( '../img/toggle-arrow.png' ) top left no-repeat; + height: 23px; + line-height: 23px; +} +#wp-link .toggle-arrow-active { + background-position: center left; +} +#wp-link label input[type="text"] { + width: 360px; + margin-top: 5px; +} +#wp-link label span { + display: inline-block; + width: 80px; + text-align: right; + padding-right: 5px; +} +#wp-link .link-search-wrapper { + margin: 5px 6px 9px; + display: block; + overflow: hidden; +} +#wp-link .link-search-wrapper span { + float: left; + margin-top: 6px; +} +#wp-link .link-search-wrapper input[type="text"] { + float: left; + width: 220px; +} +#wp-link .link-search-wrapper img.waiting { + margin: 8px 1px 0 4px; + float: left; + display: none; +} +#wp-link .link-target { + width: auto; + padding: 3px 0 0; + margin: 0 0 0 87px; + font-size: 11px; +} +#wp-link .query-results { + border: 1px #dfdfdf solid; + margin: 0 5px 5px; + background: #fff; + height: 185px; + overflow: auto; + position: relative; +} +#wp-link li, +#wp-link .query-notice { + clear: both; + margin-bottom: 0; + border-bottom: 1px solid #f1f1f1; + color: #333; + padding: 4px 6px; + cursor: pointer; + position: relative; +} +#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: #333; +} +#wp-link li.selected { + background: #ddd; + color: #333; +} +#wp-link li.selected .item-title { + font-weight: bold; +} +#wp-link .item-title { + display: inline-block; + width: 80%; +} +#wp-link .item-info { + text-transform: uppercase; + color: #666; + font-size: 11px; + position: absolute; + right: 5px; + top: 4px; + bottom: 0; +} +#wp-link #search-results { + display: none; +} +#wp-link #search-panel { + float: left; + width: 100%; +} +#wp-link .river-waiting { + display: none; + padding: 10px 0; +} +#wp-link .river-waiting img.waiting { + margin: 0 auto; + display: block; +} +#wp-link .submitbox { + padding: 5px 10px; + font-size: 11px; + overflow: auto; + height: 29px; +} +#wp-link-cancel { + line-height: 25px; + float: left; +} +#wp-link-update { + line-height: 23px; + float: right; +} \ No newline at end of file diff --git a/src/wp-includes/js/tinymce/plugins/wplink/editor_plugin.dev.js b/src/wp-includes/js/tinymce/plugins/wplink/editor_plugin.dev.js new file mode 100644 index 0000000..ff1c4eb --- /dev/null +++ b/src/wp-includes/js/tinymce/plugins/wplink/editor_plugin.dev.js @@ -0,0 +1,60 @@ +(function() { + tinymce.create('tinymce.plugins.wpLink', { + /** + * Initializes the plugin, this will be executed after the plugin has been created. + * This call is done before the editor instance has finished it's initialization so use the onInit event + * of the editor instance to intercept that event. + * + * @param {tinymce.Editor} ed Editor instance that the plugin is initialized in. + * @param {string} url Absolute URL to where the plugin is located. + */ + init : function(ed, url) { + var disabled = true; + + // Register the command so that it can be invoked by using tinyMCE.activeEditor.execCommand('mceExample'); + ed.addCommand('WP_Link', function() { + if ( disabled ) + return; + ed.windowManager.open({ + id : 'wp-link', + width : 480, + height : "auto", + wpDialog : true, + title : ed.getLang('advlink.link_desc') + }, { + plugin_url : url // Plugin absolute URL + }); + }); + + // Register example button + ed.addButton('link', { + title : ed.getLang('advanced.link_desc'), + cmd : 'WP_Link' + }); + + ed.addShortcut('alt+shift+a', ed.getLang('advanced.link_desc'), 'WP_Link'); + + ed.onNodeChange.add(function(ed, cm, n, co) { + disabled = co && n.nodeName != 'A'; + }); + }, + /** + * Returns information about the plugin as a name/value array. + * The current keys are longname, author, authorurl, infourl and version. + * + * @return {Object} Name/value array containing information about the plugin. + */ + getInfo : function() { + return { + longname : 'WordPress Link Dialog', + author : 'WordPress', + authorurl : 'http://wordpress.org', + infourl : '', + version : "1.0" + }; + } + }); + + // Register plugin + tinymce.PluginManager.add('wplink', tinymce.plugins.wpLink); +})(); \ No newline at end of file diff --git a/src/wp-includes/js/tinymce/plugins/wplink/editor_plugin.js b/src/wp-includes/js/tinymce/plugins/wplink/editor_plugin.js new file mode 100644 index 0000000..49b94ae --- /dev/null +++ b/src/wp-includes/js/tinymce/plugins/wplink/editor_plugin.js @@ -0,0 +1 @@ +(function(){tinymce.create("tinymce.plugins.wpLink",{init:function(a,b){var c=true;a.addCommand("WP_Link",function(){if(c){return}a.windowManager.open({id:"wp-link",width:480,height:"auto",wpDialog:true,title:a.getLang("advlink.link_desc")},{plugin_url:b})});a.addButton("link",{title:a.getLang("advanced.link_desc"),cmd:"WP_Link"});a.addShortcut("alt+shift+a",a.getLang("advanced.link_desc"),"WP_Link");a.onNodeChange.add(function(e,d,g,f){c=f&&g.nodeName!="A"})},getInfo:function(){return{longname:"WordPress Link Dialog",author:"WordPress",authorurl:"http://wordpress.org",infourl:"",version:"1.0"}}});tinymce.PluginManager.add("wplink",tinymce.plugins.wpLink)})(); \ No newline at end of file diff --git a/src/wp-includes/js/tinymce/plugins/wplink/img/toggle-arrow.png b/src/wp-includes/js/tinymce/plugins/wplink/img/toggle-arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..5d4a6d34ed9f1d615469d94822f56201333aa009 GIT binary patch literal 3226 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 M07*qoM6N<$f}wy7k^lez literal 0 HcmV?d00001 diff --git a/src/wp-includes/js/tinymce/plugins/wplink/js/wplink.dev.js b/src/wp-includes/js/tinymce/plugins/wplink/js/wplink.dev.js new file mode 100644 index 0000000..87c0bab --- /dev/null +++ b/src/wp-includes/js/tinymce/plugins/wplink/js/wplink.dev.js @@ -0,0 +1,585 @@ +var wpLink; + +(function($){ + var inputs = {}, rivers = {}, ed, River, Query; + + wpLink = { + timeToTriggerRiver: 150, + minRiverAJAXDuration: 200, + riverBottomThreshold: 5, + keySensitivity: 100, + lastSearch: '', + textarea: function() { return edCanvas; }, + + init : function() { + inputs.dialog = $('#wp-link'); + inputs.submit = $('#wp-link-submit'); + // URL + inputs.url = $('#url-field'); + // Secondary options + inputs.title = $('#link-title-field'); + // Advanced Options + inputs.openInNewTab = $('#link-target-checkbox'); + inputs.search = $('#search-field'); + // Build Rivers + rivers.search = new River( $('#search-results') ); + rivers.recent = new River( $('#most-recent-results') ); + rivers.elements = $('.query-results', inputs.dialog); + + // Bind event handlers + inputs.dialog.keydown( wpLink.keydown ); + inputs.dialog.keyup( wpLink.keyup ); + inputs.submit.click( function(e){ + wpLink.update(); + e.preventDefault(); + }); + $('#wp-link-cancel').click( wpLink.close ); + $('#internal-toggle').click( wpLink.toggleInternalLinking ); + + rivers.elements.bind('river-select', wpLink.updateFields ); + + inputs.search.keyup( wpLink.searchInternalLinks ); + + inputs.dialog.bind('wpdialogrefresh', wpLink.refresh); + inputs.dialog.bind('wpdialogbeforeopen', wpLink.beforeOpen); + inputs.dialog.bind('wpdialogclose', wpLink.onClose); + }, + + beforeOpen : function() { + wpLink.range = null; + + if ( ! wpLink.isMCE() && document.selection ) { + wpLink.textarea().focus(); + wpLink.range = document.selection.createRange(); + } + }, + + open : function() { + // Initialize the dialog if necessary (html mode). + if ( ! inputs.dialog.data('wpdialog') ) { + inputs.dialog.wpdialog({ + title: wpLinkL10n.title, + width: 480, + height: 'auto', + modal: true, + dialogClass: 'wp-dialog', + zIndex: 300000 + }); + } + + inputs.dialog.wpdialog('open'); + }, + + isMCE : function() { + return tinyMCEPopup && ( ed = tinyMCEPopup.editor ) && ! ed.isHidden(); + }, + + refresh : function() { + // Refresh rivers (clear links, check visibility) + rivers.search.refresh(); + rivers.recent.refresh(); + + if ( wpLink.isMCE() ) + wpLink.mceRefresh(); + else + wpLink.setDefaultValues(); + + // Focus the URL field and highlight its contents. + // If this is moved above the selection changes, + // IE will show a flashing cursor over the dialog. + inputs.url.focus()[0].select(); + // Load the most recent results if this is the first time opening the panel. + if ( ! rivers.recent.ul.children().length ) + rivers.recent.ajax(); + }, + + mceRefresh : function() { + var e; + ed = tinyMCEPopup.editor; + + tinyMCEPopup.restoreSelection(); + + // If link exists, select proper values. + if ( e = ed.dom.getParent(ed.selection.getNode(), 'A') ) { + // Set URL and description. + inputs.url.val( e.href ); + inputs.title.val( ed.dom.getAttrib(e, 'title') ); + // Set open in new tab. + if ( "_blank" == ed.dom.getAttrib(e, 'target') ) + inputs.openInNewTab.prop('checked', true); + // Update save prompt. + inputs.submit.val( wpLinkL10n.update ); + + // If there's no link, set the default values. + } else { + wpLink.setDefaultValues(); + } + + tinyMCEPopup.storeSelection(); + }, + + close : function() { + if ( wpLink.isMCE() ) + tinyMCEPopup.close(); + else + inputs.dialog.wpdialog('close'); + }, + + onClose: function() { + if ( ! wpLink.isMCE() ) { + wpLink.textarea().focus(); + if ( wpLink.range ) { + wpLink.range.moveToBookmark( wpLink.range.getBookmark() ); + wpLink.range.select(); + } + } + }, + + getAttrs : function() { + return { + href : inputs.url.val(), + title : inputs.title.val(), + target : inputs.openInNewTab.prop('checked') ? '_blank' : '' + }; + }, + + update : function() { + if ( wpLink.isMCE() ) + wpLink.mceUpdate(); + else + wpLink.htmlUpdate(); + }, + + htmlUpdate : function() { + var attrs, html, start, end, cursor, + textarea = wpLink.textarea(); + + if ( ! textarea ) + return; + + attrs = wpLink.getAttrs(); + + // If there's no href, return. + if ( ! attrs.href || attrs.href == 'http://' ) + return; + + // Build HTML + html = ''; + cursor = start + html.length; + + // If no next is selected, place the cursor inside the closing tag. + if ( start == end ) + cursor -= ''.length; + + textarea.value = textarea.value.substring( 0, start ) + + html + + textarea.value.substring( end, textarea.value.length ); + + // Update cursor position + textarea.selectionStart = textarea.selectionEnd = cursor; + + // IE + // Note: If no text is selected, IE will not place the cursor + // inside the closing tag. + } else if ( document.selection && wpLink.range ) { + textarea.focus(); + wpLink.range.text = html + wpLink.range.text + ''; + wpLink.range.moveToBookmark( wpLink.range.getBookmark() ); + wpLink.range.select(); + + wpLink.range = null; + } + + wpLink.close(); + textarea.focus(); + }, + + mceUpdate : function() { + var ed = tinyMCEPopup.editor, + attrs = wpLink.getAttrs(), + e, b; + + tinyMCEPopup.restoreSelection(); + e = ed.dom.getParent(ed.selection.getNode(), 'A'); + + // If the values are empty, unlink and return + if ( ! attrs.href || attrs.href == 'http://' ) { + if ( e ) { + tinyMCEPopup.execCommand("mceBeginUndoLevel"); + b = ed.selection.getBookmark(); + ed.dom.remove(e, 1); + ed.selection.moveToBookmark(b); + tinyMCEPopup.execCommand("mceEndUndoLevel"); + wpLink.close(); + } + return; + } + + tinyMCEPopup.execCommand("mceBeginUndoLevel"); + + if (e == null) { + ed.getDoc().execCommand("unlink", false, null); + tinyMCEPopup.execCommand("CreateLink", false, "#mce_temp_url#", {skip_undo : 1}); + + tinymce.each(ed.dom.select("a"), function(n) { + if (ed.dom.getAttrib(n, 'href') == '#mce_temp_url#') { + e = n; + ed.dom.setAttribs(e, attrs); + } + }); + + // Sometimes WebKit lets a user create a link where + // they shouldn't be able to. In this case, CreateLink + // injects "#mce_temp_url#" into their content. Fix it. + if ( $(e).text() == '#mce_temp_url#' ) { + ed.dom.remove(e); + e = null; + } + } else { + ed.dom.setAttribs(e, attrs); + } + + // Don't move caret if selection was image + if ( e && (e.childNodes.length != 1 || e.firstChild.nodeName != 'IMG') ) { + ed.focus(); + ed.selection.select(e); + ed.selection.collapse(0); + tinyMCEPopup.storeSelection(); + } + + tinyMCEPopup.execCommand("mceEndUndoLevel"); + wpLink.close(); + }, + + updateFields : function( e, li, originalEvent ) { + inputs.url.val( li.children('.item-permalink').val() ); + inputs.title.val( li.hasClass('no-title') ? '' : li.children('.item-title').text() ); + if ( originalEvent && originalEvent.type == "click" ) + inputs.url.focus(); + }, + setDefaultValues : function() { + // Set URL and description to defaults. + // Leave the new tab setting as-is. + inputs.url.val('http://'); + inputs.title.val(''); + + // Update save prompt. + inputs.submit.val( wpLinkL10n.save ); + }, + + searchInternalLinks : function() { + var t = $(this), waiting, + search = t.val(); + + if ( search.length > 2 ) { + rivers.recent.hide(); + rivers.search.show(); + + // Don't search if the keypress didn't change the title. + if ( wpLink.lastSearch == search ) + return; + + wpLink.lastSearch = search; + waiting = t.siblings('img.waiting').show(); + + rivers.search.change( search ); + rivers.search.ajax( function(){ waiting.hide(); }); + } else { + rivers.search.hide(); + rivers.recent.show(); + } + }, + + next : function() { + rivers.search.next(); + rivers.recent.next(); + }, + prev : function() { + rivers.search.prev(); + rivers.recent.prev(); + }, + + keydown : function( event ) { + var fn, key = $.ui.keyCode; + + switch( event.which ) { + case key.UP: + fn = 'prev'; + case key.DOWN: + fn = fn || 'next'; + clearInterval( wpLink.keyInterval ); + wpLink[ fn ](); + wpLink.keyInterval = setInterval( wpLink[ fn ], wpLink.keySensitivity ); + break; + default: + return; + } + event.preventDefault(); + }, + keyup: function( event ) { + var key = $.ui.keyCode; + + switch( event.which ) { + case key.ESCAPE: + event.stopImmediatePropagation(); + if ( ! $(document).triggerHandler( 'wp_CloseOnEscape', [{ event: event, what: 'wplink', cb: wpLink.close }] ) ) + wpLink.close(); + + return false; + break; + case key.UP: + case key.DOWN: + clearInterval( wpLink.keyInterval ); + break; + default: + return; + } + event.preventDefault(); + }, + + delayedCallback : function( func, delay ) { + var timeoutTriggered, funcTriggered, funcArgs, funcContext; + + if ( ! delay ) + return func; + + setTimeout( function() { + if ( funcTriggered ) + return func.apply( funcContext, funcArgs ); + // Otherwise, wait. + timeoutTriggered = true; + }, delay); + + return function() { + if ( timeoutTriggered ) + return func.apply( this, arguments ); + // Otherwise, wait. + funcArgs = arguments; + funcContext = this; + funcTriggered = true; + }; + }, + + toggleInternalLinking : function( event ) { + var panel = $('#search-panel'), + widget = inputs.dialog.wpdialog('widget'), + // We're about to toggle visibility; it's currently the opposite + visible = !panel.is(':visible'), + win = $(window); + + $(this).toggleClass('toggle-arrow-active', visible); + + inputs.dialog.height('auto'); + panel.slideToggle( 300, function() { + setUserSetting('wplink', visible ? '1' : '0'); + inputs[ visible ? 'search' : 'url' ].focus(); + + // Move the box if the box is now expanded, was opened in a collapsed state, + // and if it needs to be moved. (Judged by bottom not being positive or + // bottom being smaller than top.) + var scroll = win.scrollTop(), + top = widget.offset().top, + bottom = top + widget.outerHeight(), + diff = bottom - win.height(); + + if ( diff > scroll ) { + widget.animate({'top': diff < top ? top - diff : scroll }, 200); + } + }); + event.preventDefault(); + } + } + + River = function( element, search ) { + var self = this; + this.element = element; + this.ul = element.children('ul'); + this.waiting = element.find('.river-waiting'); + + this.change( search ); + this.refresh(); + + element.scroll( function(){ self.maybeLoad(); }); + element.delegate('li', 'click', function(e){ self.select( $(this), e ); }); + }; + + $.extend( River.prototype, { + refresh: function() { + this.deselect(); + this.visible = this.element.is(':visible'); + }, + show: function() { + if ( ! this.visible ) { + this.deselect(); + this.element.show(); + this.visible = true; + } + }, + hide: function() { + this.element.hide(); + this.visible = false; + }, + // Selects a list item and triggers the river-select event. + select: function( li, event ) { + var liHeight, elHeight, liTop, elTop; + + if ( li.hasClass('unselectable') || li == this.selected ) + return; + + this.deselect(); + this.selected = li.addClass('selected'); + // Make sure the element is visible + liHeight = li.outerHeight(); + elHeight = this.element.height(); + liTop = li.position().top; + elTop = this.element.scrollTop(); + + if ( liTop < 0 ) // Make first visible element + this.element.scrollTop( elTop + liTop ); + else if ( liTop + liHeight > elHeight ) // Make last visible element + this.element.scrollTop( elTop + liTop - elHeight + liHeight ); + + // Trigger the river-select event + this.element.trigger('river-select', [ li, event, this ]); + }, + deselect: function() { + if ( this.selected ) + this.selected.removeClass('selected'); + this.selected = false; + }, + prev: function() { + if ( ! this.visible ) + return; + + var to; + if ( this.selected ) { + to = this.selected.prev('li'); + if ( to.length ) + this.select( to ); + } + }, + next: function() { + if ( ! this.visible ) + return; + + var to = this.selected ? this.selected.next('li') : $('li:not(.unselectable):first', this.element); + if ( to.length ) + this.select( to ); + }, + ajax: function( callback ) { + var self = this, + delay = this.query.page == 1 ? 0 : wpLink.minRiverAJAXDuration, + response = wpLink.delayedCallback( function( results, params ) { + self.process( results, params ); + if ( callback ) + callback( results, params ); + }, delay ); + + this.query.ajax( response ); + }, + change: function( search ) { + if ( this.query && this._search == search ) + return; + + this._search = search; + this.query = new Query( search ); + this.element.scrollTop(0); + }, + process: function( results, params ) { + var list = '', alt = true, classes = '', + firstPage = params.page == 1; + + if ( !results ) { + if ( firstPage ) { + list += '
  • ' + + wpLinkL10n.noMatchesFound + + '
  • '; + } + } else { + $.each( results, function() { + classes = alt ? 'alternate' : ''; + classes += this['title'] ? '' : ' no-title'; + list += classes ? '
  • ' : '
  • '; + list += ''; + list += ''; + list += this['title'] ? this['title'] : wpLinkL10n.noTitle; + list += '' + this['info'] + '
  • '; + alt = ! alt; + }); + } + + this.ul[ firstPage ? 'html' : 'append' ]( list ); + }, + maybeLoad: function() { + var self = this, + el = this.element, + bottom = el.scrollTop() + el.height(); + + if ( ! this.query.ready() || bottom < this.ul.height() - wpLink.riverBottomThreshold ) + return; + + setTimeout(function() { + var newTop = el.scrollTop(), + newBottom = newTop + el.height(); + + if ( ! self.query.ready() || newBottom < self.ul.height() - wpLink.riverBottomThreshold ) + return; + + self.waiting.show(); + el.scrollTop( newTop + self.waiting.outerHeight() ); + + self.ajax( function() { self.waiting.hide(); }); + }, wpLink.timeToTriggerRiver ); + } + }); + + Query = function( search ) { + this.page = 1; + this.allLoaded = false; + this.querying = false; + this.search = search; + }; + + $.extend( Query.prototype, { + ready: function() { + return !( this.querying || this.allLoaded ); + }, + ajax: function( callback ) { + var self = this, + query = { + action : 'wp-link-ajax', + page : this.page, + '_ajax_linking_nonce' : $('#_ajax_linking_nonce').val() + }; + + if ( this.search ) + query.search = this.search; + + this.querying = true; + + $.post( ajaxurl, query, function(r) { + self.page++; + self.querying = false; + self.allLoaded = !r; + callback( r, query ); + }, "json" ); + } + }); + + $(document).ready( wpLink.init ); +})(jQuery); diff --git a/src/wp-includes/js/tinymce/plugins/wplink/js/wplink.js b/src/wp-includes/js/tinymce/plugins/wplink/js/wplink.js new file mode 100644 index 0000000..29b0c6c --- /dev/null +++ b/src/wp-includes/js/tinymce/plugins/wplink/js/wplink.js @@ -0,0 +1 @@ +var wpLink;(function(f){var b={},e={},d,a,c;wpLink={timeToTriggerRiver:150,minRiverAJAXDuration:200,riverBottomThreshold:5,keySensitivity:100,lastSearch:"",textarea:function(){return edCanvas},init:function(){b.dialog=f("#wp-link");b.submit=f("#wp-link-submit");b.url=f("#url-field");b.title=f("#link-title-field");b.openInNewTab=f("#link-target-checkbox");b.search=f("#search-field");e.search=new a(f("#search-results"));e.recent=new a(f("#most-recent-results"));e.elements=f(".query-results",b.dialog);b.dialog.keydown(wpLink.keydown);b.dialog.keyup(wpLink.keyup);b.submit.click(function(g){wpLink.update();g.preventDefault()});f("#wp-link-cancel").click(wpLink.close);f("#internal-toggle").click(wpLink.toggleInternalLinking);e.elements.bind("river-select",wpLink.updateFields);b.search.keyup(wpLink.searchInternalLinks);b.dialog.bind("wpdialogrefresh",wpLink.refresh);b.dialog.bind("wpdialogbeforeopen",wpLink.beforeOpen);b.dialog.bind("wpdialogclose",wpLink.onClose)},beforeOpen:function(){wpLink.range=null;if(!wpLink.isMCE()&&document.selection){wpLink.textarea().focus();wpLink.range=document.selection.createRange()}},open:function(){if(!b.dialog.data("wpdialog")){b.dialog.wpdialog({title:wpLinkL10n.title,width:480,height:"auto",modal:true,dialogClass:"wp-dialog",zIndex:300000})}b.dialog.wpdialog("open")},isMCE:function(){return tinyMCEPopup&&(d=tinyMCEPopup.editor)&&!d.isHidden()},refresh:function(){e.search.refresh();e.recent.refresh();if(wpLink.isMCE()){wpLink.mceRefresh()}else{wpLink.setDefaultValues()}b.url.focus()[0].select();if(!e.recent.ul.children().length){e.recent.ajax()}},mceRefresh:function(){var g;d=tinyMCEPopup.editor;tinyMCEPopup.restoreSelection();if(g=d.dom.getParent(d.selection.getNode(),"A")){b.url.val(g.href);b.title.val(d.dom.getAttrib(g,"title"));if("_blank"==d.dom.getAttrib(g,"target")){b.openInNewTab.prop("checked",true)}b.submit.val(wpLinkL10n.update)}else{wpLink.setDefaultValues()}tinyMCEPopup.storeSelection()},close:function(){if(wpLink.isMCE()){tinyMCEPopup.close()}else{b.dialog.wpdialog("close")}},onClose:function(){if(!wpLink.isMCE()){wpLink.textarea().focus();if(wpLink.range){wpLink.range.moveToBookmark(wpLink.range.getBookmark());wpLink.range.select()}}},getAttrs:function(){return{href:b.url.val(),title:b.title.val(),target:b.openInNewTab.prop("checked")?"_blank":""}},update:function(){if(wpLink.isMCE()){wpLink.mceUpdate()}else{wpLink.htmlUpdate()}},htmlUpdate:function(){var i,j,l,h,k,g=wpLink.textarea();if(!g){return}i=wpLink.getAttrs();if(!i.href||i.href=="http://"){return}j='";k=l+j.length;if(l==h){k-="".length}g.value=g.value.substring(0,l)+j+g.value.substring(h,g.value.length);g.selectionStart=g.selectionEnd=k}else{if(document.selection&&wpLink.range){g.focus();wpLink.range.text=j+wpLink.range.text+"";wpLink.range.moveToBookmark(wpLink.range.getBookmark());wpLink.range.select();wpLink.range=null}}wpLink.close();g.focus()},mceUpdate:function(){var h=tinyMCEPopup.editor,i=wpLink.getAttrs(),j,g;tinyMCEPopup.restoreSelection();j=h.dom.getParent(h.selection.getNode(),"A");if(!i.href||i.href=="http://"){if(j){tinyMCEPopup.execCommand("mceBeginUndoLevel");g=h.selection.getBookmark();h.dom.remove(j,1);h.selection.moveToBookmark(g);tinyMCEPopup.execCommand("mceEndUndoLevel");wpLink.close()}return}tinyMCEPopup.execCommand("mceBeginUndoLevel");if(j==null){h.getDoc().execCommand("unlink",false,null);tinyMCEPopup.execCommand("CreateLink",false,"#mce_temp_url#",{skip_undo:1});tinymce.each(h.dom.select("a"),function(k){if(h.dom.getAttrib(k,"href")=="#mce_temp_url#"){j=k;h.dom.setAttribs(j,i)}});if(f(j).text()=="#mce_temp_url#"){h.dom.remove(j);j=null}}else{h.dom.setAttribs(j,i)}if(j&&(j.childNodes.length!=1||j.firstChild.nodeName!="IMG")){h.focus();h.selection.select(j);h.selection.collapse(0);tinyMCEPopup.storeSelection()}tinyMCEPopup.execCommand("mceEndUndoLevel");wpLink.close()},updateFields:function(i,h,g){b.url.val(h.children(".item-permalink").val());b.title.val(h.hasClass("no-title")?"":h.children(".item-title").text());if(g&&g.type=="click"){b.url.focus()}},setDefaultValues:function(){b.url.val("http://");b.title.val("");b.submit.val(wpLinkL10n.save)},searchInternalLinks:function(){var h=f(this),i,g=h.val();if(g.length>2){e.recent.hide();e.search.show();if(wpLink.lastSearch==g){return}wpLink.lastSearch=g;i=h.siblings("img.waiting").show();e.search.change(g);e.search.ajax(function(){i.hide()})}else{e.search.hide();e.recent.show()}},next:function(){e.search.next();e.recent.next()},prev:function(){e.search.prev();e.recent.prev()},keydown:function(i){var h,g=f.ui.keyCode;switch(i.which){case g.UP:h="prev";case g.DOWN:h=h||"next";clearInterval(wpLink.keyInterval);wpLink[h]();wpLink.keyInterval=setInterval(wpLink[h],wpLink.keySensitivity);break;default:return}i.preventDefault()},keyup:function(h){var g=f.ui.keyCode;switch(h.which){case g.ESCAPE:h.stopImmediatePropagation();if(!f(document).triggerHandler("wp_CloseOnEscape",[{event:h,what:"wplink",cb:wpLink.close}])){wpLink.close()}return false;break;case g.UP:case g.DOWN:clearInterval(wpLink.keyInterval);break;default:return}h.preventDefault()},delayedCallback:function(i,g){var l,k,j,h;if(!g){return i}setTimeout(function(){if(k){return i.apply(h,j)}l=true},g);return function(){if(l){return i.apply(this,arguments)}j=arguments;h=this;k=true}},toggleInternalLinking:function(h){var g=f("#search-panel"),i=b.dialog.wpdialog("widget"),k=!g.is(":visible"),j=f(window);f(this).toggleClass("toggle-arrow-active",k);b.dialog.height("auto");g.slideToggle(300,function(){setUserSetting("wplink",k?"1":"0");b[k?"search":"url"].focus();var l=j.scrollTop(),o=i.offset().top,m=o+i.outerHeight(),n=m-j.height();if(n>l){i.animate({top:ni){this.element.scrollTop(g+l-i+j)}}this.element.trigger("river-select",[h,k,this])},deselect:function(){if(this.selected){this.selected.removeClass("selected")}this.selected=false},prev:function(){if(!this.visible){return}var g;if(this.selected){g=this.selected.prev("li");if(g.length){this.select(g)}}},next:function(){if(!this.visible){return}var g=this.selected?this.selected.next("li"):f("li:not(.unselectable):first",this.element);if(g.length){this.select(g)}},ajax:function(j){var h=this,i=this.query.page==1?0:wpLink.minRiverAJAXDuration,g=wpLink.delayedCallback(function(k,l){h.process(k,l);if(j){j(k,l)}},i);this.query.ajax(g)},change:function(g){if(this.query&&this._search==g){return}this._search=g;this.query=new c(g);this.element.scrollTop(0)},process:function(h,l){var i="",j=true,g="",k=l.page==1;if(!h){if(k){i+='
  • '+wpLinkL10n.noMatchesFound+"
  • "}}else{f.each(h,function(){g=j?"alternate":"";g+=this["title"]?"":" no-title";i+=g?'
  • ':"
  • ";i+='';i+='';i+=this["title"]?this["title"]:wpLinkL10n.noTitle;i+=''+this["info"]+"
  • ";j=!j})}this.ul[k?"html":"append"](i)},maybeLoad:function(){var h=this,i=this.element,g=i.scrollTop()+i.height();if(!this.query.ready()||g + + + {#advanced_dlg.about_title} + + + + + + + +
    +
    +

    {#advanced_dlg.about_title}

    +

    Version: ()

    +

    TinyMCE is a platform independent web based Javascript HTML WYSIWYG editor control released as Open Source under LGPL + by Moxiecode Systems AB. It has the ability to convert HTML TEXTAREA fields or other HTML elements to editor instances.

    +

    Copyright © 2003-2008, Moxiecode Systems AB, All rights reserved.

    +

    For more information about this software visit the TinyMCE website.

    + +
    + Got Moxie? +
    +
    + +
    +
    +

    {#advanced_dlg.about_loaded}

    + +
    +
    + +

     

    +
    +
    + +
    +
    +
    +
    + +
    + +
    + + diff --git a/src/wp-includes/js/tinymce/themes/advanced/anchor.htm b/src/wp-includes/js/tinymce/themes/advanced/anchor.htm new file mode 100644 index 0000000..7f2b942 --- /dev/null +++ b/src/wp-includes/js/tinymce/themes/advanced/anchor.htm @@ -0,0 +1,31 @@ + + + + {#advanced_dlg.anchor_title} + + + + +
    + + + + + + + + +
    {#advanced_dlg.anchor_title}
    + +
    +
    + +
    + +
    + +
    +
    +
    + + diff --git a/src/wp-includes/js/tinymce/themes/advanced/charmap.htm b/src/wp-includes/js/tinymce/themes/advanced/charmap.htm new file mode 100644 index 0000000..9b7a3ac --- /dev/null +++ b/src/wp-includes/js/tinymce/themes/advanced/charmap.htm @@ -0,0 +1,51 @@ + + + + {#advanced_dlg.charmap_title} + + + + + + + + + + + + + + + +
    + + + + + + + + + +
     
     
    +
    + + + + + + + + + + + + + + + + +
     
     
     
    +
    + + diff --git a/src/wp-includes/js/tinymce/themes/advanced/color_picker.htm b/src/wp-includes/js/tinymce/themes/advanced/color_picker.htm new file mode 100644 index 0000000..b26e5cc --- /dev/null +++ b/src/wp-includes/js/tinymce/themes/advanced/color_picker.htm @@ -0,0 +1,76 @@ + + + + {#advanced_dlg.colorpicker_title} + + + + + + +
    + + +
    +
    +
    + {#advanced_dlg.colorpicker_picker_title} +
    + + +
    + +
    + +
    +
    +
    +
    + +
    +
    + {#advanced_dlg.colorpicker_palette_title} +
    + +
    + +
    +
    +
    + +
    +
    + {#advanced_dlg.colorpicker_named_title} +
    + +
    + +
    + +
    + {#advanced_dlg.colorpicker_name} +
    +
    +
    +
    + +
    +
    + +
    + +
    + +
    + +
    +
    +
    + + diff --git a/src/wp-includes/js/tinymce/themes/advanced/editor_template.js b/src/wp-includes/js/tinymce/themes/advanced/editor_template.js new file mode 100644 index 0000000..ba8dd4c --- /dev/null +++ b/src/wp-includes/js/tinymce/themes/advanced/editor_template.js @@ -0,0 +1 @@ +(function(e){var d=e.DOM,b=e.dom.Event,h=e.extend,f=e.each,a=e.util.Cookie,g,c=e.explode;e.ThemeManager.requireLangPack("advanced");e.create("tinymce.themes.AdvancedTheme",{sizes:[8,10,12,14,18,24,36],controls:{bold:["bold_desc","Bold"],italic:["italic_desc","Italic"],underline:["underline_desc","Underline"],strikethrough:["striketrough_desc","Strikethrough"],justifyleft:["justifyleft_desc","JustifyLeft"],justifycenter:["justifycenter_desc","JustifyCenter"],justifyright:["justifyright_desc","JustifyRight"],justifyfull:["justifyfull_desc","JustifyFull"],bullist:["bullist_desc","InsertUnorderedList"],numlist:["numlist_desc","InsertOrderedList"],outdent:["outdent_desc","Outdent"],indent:["indent_desc","Indent"],cut:["cut_desc","Cut"],copy:["copy_desc","Copy"],paste:["paste_desc","Paste"],undo:["undo_desc","Undo"],redo:["redo_desc","Redo"],link:["link_desc","mceLink"],unlink:["unlink_desc","unlink"],image:["image_desc","mceImage"],cleanup:["cleanup_desc","mceCleanup"],help:["help_desc","mceHelp"],code:["code_desc","mceCodeEditor"],hr:["hr_desc","InsertHorizontalRule"],removeformat:["removeformat_desc","RemoveFormat"],sub:["sub_desc","subscript"],sup:["sup_desc","superscript"],forecolor:["forecolor_desc","ForeColor"],forecolorpicker:["forecolor_desc","mceForeColor"],backcolor:["backcolor_desc","HiliteColor"],backcolorpicker:["backcolor_desc","mceBackColor"],charmap:["charmap_desc","mceCharMap"],visualaid:["visualaid_desc","mceToggleVisualAid"],anchor:["anchor_desc","mceInsertAnchor"],newdocument:["newdocument_desc","mceNewDocument"],blockquote:["blockquote_desc","mceBlockQuote"]},stateControls:["bold","italic","underline","strikethrough","bullist","numlist","justifyleft","justifycenter","justifyright","justifyfull","sub","sup","blockquote"],init:function(j,k){var l=this,m,i,n;l.editor=j;l.url=k;l.onResolveName=new e.util.Dispatcher(this);j.forcedHighContrastMode=j.settings.detect_highcontrast&&l._isHighContrast();j.settings.skin=j.forcedHighContrastMode?"highcontrast":j.settings.skin;l.settings=m=h({theme_advanced_path:true,theme_advanced_toolbar_location:"bottom",theme_advanced_buttons1:"bold,italic,underline,strikethrough,|,justifyleft,justifycenter,justifyright,justifyfull,|,styleselect,formatselect",theme_advanced_buttons2:"bullist,numlist,|,outdent,indent,|,undo,redo,|,link,unlink,anchor,image,cleanup,help,code",theme_advanced_buttons3:"hr,removeformat,visualaid,|,sub,sup,|,charmap",theme_advanced_blockformats:"p,address,pre,h1,h2,h3,h4,h5,h6",theme_advanced_toolbar_align:"center",theme_advanced_fonts:"Andale Mono=andale mono,times;Arial=arial,helvetica,sans-serif;Arial Black=arial black,avant garde;Book Antiqua=book antiqua,palatino;Comic Sans MS=comic sans ms,sans-serif;Courier New=courier new,courier;Georgia=georgia,palatino;Helvetica=helvetica;Impact=impact,chicago;Symbol=symbol;Tahoma=tahoma,arial,helvetica,sans-serif;Terminal=terminal,monaco;Times New Roman=times new roman,times;Trebuchet MS=trebuchet ms,geneva;Verdana=verdana,geneva;Webdings=webdings;Wingdings=wingdings,zapf dingbats",theme_advanced_more_colors:1,theme_advanced_row_height:23,theme_advanced_resize_horizontal:1,theme_advanced_resizing_use_cookie:1,theme_advanced_font_sizes:"1,2,3,4,5,6,7",theme_advanced_font_selector:"span",theme_advanced_show_current_color:0,readonly:j.settings.readonly},j.settings);if(!m.font_size_style_values){m.font_size_style_values="8pt,10pt,12pt,14pt,18pt,24pt,36pt"}if(e.is(m.theme_advanced_font_sizes,"string")){m.font_size_style_values=e.explode(m.font_size_style_values);m.font_size_classes=e.explode(m.font_size_classes||"");n={};j.settings.theme_advanced_font_sizes=m.theme_advanced_font_sizes;f(j.getParam("theme_advanced_font_sizes","","hash"),function(q,p){var o;if(p==q&&q>=1&&q<=7){p=q+" ("+l.sizes[q-1]+"pt)";o=m.font_size_classes[q-1];q=m.font_size_style_values[q-1]||(l.sizes[q-1]+"pt")}if(/^\s*\./.test(q)){o=q.replace(/\./g,"")}n[p]=o?{"class":o}:{fontSize:q}});m.theme_advanced_font_sizes=n}if((i=m.theme_advanced_path_location)&&i!="none"){m.theme_advanced_statusbar_location=m.theme_advanced_path_location}if(m.theme_advanced_statusbar_location=="none"){m.theme_advanced_statusbar_location=0}if(j.settings.content_css!==false){j.contentCSS.push(j.baseURI.toAbsolute(k+"/skins/"+j.settings.skin+"/content.css"))}j.onInit.add(function(){if(!j.settings.readonly){j.onNodeChange.add(l._nodeChanged,l);j.onKeyUp.add(l._updateUndoStatus,l);j.onMouseUp.add(l._updateUndoStatus,l);j.dom.bind(j.dom.getRoot(),"dragend",function(){l._updateUndoStatus(j)})}});j.onSetProgressState.add(function(q,o,r){var s,t=q.id,p;if(o){l.progressTimer=setTimeout(function(){s=q.getContainer();s=s.insertBefore(d.create("DIV",{style:"position:relative"}),s.firstChild);p=d.get(q.id+"_tbl");d.add(s,"div",{id:t+"_blocker","class":"mceBlocker",style:{width:p.clientWidth+2,height:p.clientHeight+2}});d.add(s,"div",{id:t+"_progress","class":"mceProgress",style:{left:p.clientWidth/2,top:p.clientHeight/2}})},r||0)}else{d.remove(t+"_blocker");d.remove(t+"_progress");clearTimeout(l.progressTimer)}});d.loadCSS(m.editor_css?j.documentBaseURI.toAbsolute(m.editor_css):k+"/skins/"+j.settings.skin+"/ui.css");if(m.skin_variant){d.loadCSS(k+"/skins/"+j.settings.skin+"/ui_"+m.skin_variant+".css")}},_isHighContrast:function(){var i,j=d.add(d.getRoot(),"div",{style:"background-color: rgb(171,239,86);"});i=(d.getStyle(j,"background-color",true)+"").toLowerCase().replace(/ /g,"");d.remove(j);return i!="rgb(171,239,86)"&&i!="#abef56"},createControl:function(l,i){var j,k;if(k=i.createControl(l)){return k}switch(l){case"styleselect":return this._createStyleSelect();case"formatselect":return this._createBlockFormats();case"fontselect":return this._createFontSelect();case"fontsizeselect":return this._createFontSizeSelect();case"forecolor":return this._createForeColorMenu();case"backcolor":return this._createBackColorMenu()}if((j=this.controls[l])){return i.createButton(l,{title:"advanced."+j[0],cmd:j[1],ui:j[2],value:j[3]})}},execCommand:function(k,j,l){var i=this["_"+k];if(i){i.call(this,j,l);return true}return false},_importClasses:function(k){var i=this.editor,j=i.controlManager.get("styleselect");if(j.getLength()==0){f(i.dom.getClasses(),function(n,l){var m="style_"+l;i.formatter.register(m,{inline:"span",attributes:{"class":n["class"]},selector:"*"});j.add(n["class"],m)})}},_createStyleSelect:function(m){var k=this,i=k.editor,j=i.controlManager,l;l=j.createListBox("styleselect",{title:"advanced.style_select",onselect:function(o){var p,n=[];f(l.items,function(q){n.push(q.value)});i.focus();i.undoManager.add();p=i.formatter.matchAll(n);if(!o||p[0]==o){if(p[0]){i.formatter.remove(p[0])}}else{i.formatter.apply(o)}i.undoManager.add();i.nodeChanged();return false}});i.onInit.add(function(){var o=0,n=i.getParam("style_formats");if(n){f(n,function(p){var q,r=0;f(p,function(){r++});if(r>1){q=p.name=p.name||"style_"+(o++);i.formatter.register(q,p);l.add(p.title,q)}else{l.add(p.title)}})}else{f(i.getParam("theme_advanced_styles","","hash"),function(r,q){var p;if(r){p="style_"+(o++);i.formatter.register(p,{inline:"span",classes:r,selector:"*"});l.add(k.editor.translate(q),p)}})}});if(l.getLength()==0){l.onPostRender.add(function(o,p){if(!l.NativeListBox){b.add(p.id+"_text","focus",k._importClasses,k);b.add(p.id+"_text","mousedown",k._importClasses,k);b.add(p.id+"_open","focus",k._importClasses,k);b.add(p.id+"_open","mousedown",k._importClasses,k)}else{b.add(p.id,"focus",k._importClasses,k)}})}return l},_createFontSelect:function(){var k,j=this,i=j.editor;k=i.controlManager.createListBox("fontselect",{title:"advanced.fontdefault",onselect:function(l){var m=k.items[k.selectedIndex];if(!l&&m){i.execCommand("FontName",false,m.value);return}i.execCommand("FontName",false,l);k.select(function(n){return l==n});if(m&&m.value==l){k.select(null)}return false}});if(k){f(i.getParam("theme_advanced_fonts",j.settings.theme_advanced_fonts,"hash"),function(m,l){k.add(i.translate(l),m,{style:m.indexOf("dings")==-1?"font-family:"+m:""})})}return k},_createFontSizeSelect:function(){var m=this,k=m.editor,n,l=0,j=[];n=k.controlManager.createListBox("fontsizeselect",{title:"advanced.font_size",onselect:function(i){var o=n.items[n.selectedIndex];if(!i&&o){o=o.value;if(o["class"]){k.formatter.toggle("fontsize_class",{value:o["class"]});k.undoManager.add();k.nodeChanged()}else{k.execCommand("FontSize",false,o.fontSize)}return}if(i["class"]){k.focus();k.undoManager.add();k.formatter.toggle("fontsize_class",{value:i["class"]});k.undoManager.add();k.nodeChanged()}else{k.execCommand("FontSize",false,i.fontSize)}n.select(function(p){return i==p});if(o&&(o.value.fontSize==i.fontSize||o.value["class"]==i["class"])){n.select(null)}return false}});if(n){f(m.settings.theme_advanced_font_sizes,function(o,i){var p=o.fontSize;if(p>=1&&p<=7){p=m.sizes[parseInt(p)-1]+"pt"}n.add(i,o,{style:"font-size:"+p,"class":"mceFontSize"+(l++)+(" "+(o["class"]||""))})})}return n},_createBlockFormats:function(){var k,i={p:"advanced.paragraph",address:"advanced.address",pre:"advanced.pre",h1:"advanced.h1",h2:"advanced.h2",h3:"advanced.h3",h4:"advanced.h4",h5:"advanced.h5",h6:"advanced.h6",div:"advanced.div",blockquote:"advanced.blockquote",code:"advanced.code",dt:"advanced.dt",dd:"advanced.dd",samp:"advanced.samp"},j=this;k=j.editor.controlManager.createListBox("formatselect",{title:"advanced.block",onselect:function(l){j.editor.execCommand("FormatBlock",false,l);return false}});if(k){f(j.editor.getParam("theme_advanced_blockformats",j.settings.theme_advanced_blockformats,"hash"),function(m,l){k.add(j.editor.translate(l!=m?l:i[m]),m,{"class":"mce_formatPreview mce_"+m})})}return k},_createForeColorMenu:function(){var m,j=this,k=j.settings,l={},i;if(k.theme_advanced_more_colors){l.more_colors_func=function(){j._mceColorPicker(0,{color:m.value,func:function(n){m.setColor(n)}})}}if(i=k.theme_advanced_text_colors){l.colors=i}if(k.theme_advanced_default_foreground_color){l.default_color=k.theme_advanced_default_foreground_color}l.title="advanced.forecolor_desc";l.cmd="ForeColor";l.scope=this;m=j.editor.controlManager.createColorSplitButton("forecolor",l);return m},_createBackColorMenu:function(){var m,j=this,k=j.settings,l={},i;if(k.theme_advanced_more_colors){l.more_colors_func=function(){j._mceColorPicker(0,{color:m.value,func:function(n){m.setColor(n)}})}}if(i=k.theme_advanced_background_colors){l.colors=i}if(k.theme_advanced_default_background_color){l.default_color=k.theme_advanced_default_background_color}l.title="advanced.backcolor_desc";l.cmd="HiliteColor";l.scope=this;m=j.editor.controlManager.createColorSplitButton("backcolor",l);return m},renderUI:function(k){var m,l,q,v=this,r=v.editor,w=v.settings,u,j,i;if(r.settings){r.settings.aria_label=w.aria_label+r.getLang("advanced.help_shortcut")}m=j=d.create("span",{role:"application","aria-labelledby":r.id+"_voice",id:r.id+"_parent","class":"mceEditor "+r.settings.skin+"Skin"+(w.skin_variant?" "+r.settings.skin+"Skin"+v._ufirst(w.skin_variant):"")});d.add(m,"span",{"class":"mceVoiceLabel",style:"display:none;",id:r.id+"_voice"},w.aria_label);if(!d.boxModel){m=d.add(m,"div",{"class":"mceOldBoxModel"})}m=u=d.add(m,"table",{role:"presentation",id:r.id+"_tbl","class":"mceLayout",cellSpacing:0,cellPadding:0});m=q=d.add(m,"tbody");switch((w.theme_advanced_layout_manager||"").toLowerCase()){case"rowlayout":l=v._rowLayout(w,q,k);break;case"customlayout":l=r.execCallback("theme_advanced_custom_layout",w,q,k,j);break;default:l=v._simpleLayout(w,q,k,j)}m=k.targetNode;i=u.rows;d.addClass(i[0],"mceFirst");d.addClass(i[i.length-1],"mceLast");f(d.select("tr",q),function(o){d.addClass(o.firstChild,"mceFirst");d.addClass(o.childNodes[o.childNodes.length-1],"mceLast")});if(d.get(w.theme_advanced_toolbar_container)){d.get(w.theme_advanced_toolbar_container).appendChild(j)}else{d.insertAfter(j,m)}b.add(r.id+"_path_row","click",function(n){n=n.target;if(n.nodeName=="A"){v._sel(n.className.replace(/^.*mcePath_([0-9]+).*$/,"$1"));return b.cancel(n)}});if(!r.getParam("accessibility_focus")){b.add(d.add(j,"a",{href:"#"},""),"focus",function(){tinyMCE.get(r.id).focus()})}if(w.theme_advanced_toolbar_location=="external"){k.deltaHeight=0}v.deltaHeight=k.deltaHeight;k.targetNode=null;r.onKeyDown.add(function(p,n){var s=121,o=122;if(n.altKey){if(n.keyCode===s){v.toolbarGroup.focus();return b.cancel(n)}else{if(n.keyCode===o){d.get(p.id+"_path_row").focus();return b.cancel(n)}}}});r.addShortcut("alt+0","","mceShortcuts",v);return{iframeContainer:l,editorContainer:r.id+"_parent",sizeContainer:u,deltaHeight:k.deltaHeight}},getInfo:function(){return{longname:"Advanced theme",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",version:e.majorVersion+"."+e.minorVersion}},resizeBy:function(i,j){var k=d.get(this.editor.id+"_ifr");this.resizeTo(k.clientWidth+i,k.clientHeight+j)},resizeTo:function(i,m,k){var j=this.editor,l=this.settings,n=d.get(j.id+"_tbl"),o=d.get(j.id+"_ifr");i=Math.max(l.theme_advanced_resizing_min_width||100,i);m=Math.max(l.theme_advanced_resizing_min_height||100,m);i=Math.min(l.theme_advanced_resizing_max_width||65535,i);m=Math.min(l.theme_advanced_resizing_max_height||65535,m);d.setStyle(n,"height","");d.setStyle(o,"height",m);if(l.theme_advanced_resize_horizontal){d.setStyle(n,"width","");d.setStyle(o,"width",i);if(i"));d.setHTML(l,q.join(""))},_addStatusBar:function(m,j){var k,v=this,p=v.editor,w=v.settings,i,q,u,l;k=d.add(m,"tr");k=l=d.add(k,"td",{"class":"mceStatusbar"});k=d.add(k,"div",{id:p.id+"_path_row",role:"group","aria-labelledby":p.id+"_path_voice"});if(w.theme_advanced_path){d.add(k,"span",{id:p.id+"_path_voice"},p.translate("advanced.path"));d.add(k,"span",{},": ")}else{d.add(k,"span",{}," ")}if(w.theme_advanced_resizing){d.add(l,"a",{id:p.id+"_resize",href:"javascript:;",onclick:"return false;","class":"mceResize"});if(w.theme_advanced_resizing_use_cookie){p.onPostRender.add(function(){var n=a.getHash("TinyMCE_"+p.id+"_size"),r=d.get(p.id+"_tbl");if(!n){return}v.resizeTo(n.cw,n.ch)})}p.onPostRender.add(function(){b.add(p.id+"_resize","click",function(n){n.preventDefault()});b.add(p.id+"_resize","mousedown",function(D){var t,r,s,o,C,z,A,F,n,E,x;function y(G){G.preventDefault();n=A+(G.screenX-C);E=F+(G.screenY-z);v.resizeTo(n,E)}function B(G){b.remove(d.doc,"mousemove",t);b.remove(p.getDoc(),"mousemove",r);b.remove(d.doc,"mouseup",s);b.remove(p.getDoc(),"mouseup",o);n=A+(G.screenX-C);E=F+(G.screenY-z);v.resizeTo(n,E,true)}D.preventDefault();C=D.screenX;z=D.screenY;x=d.get(v.editor.id+"_ifr");A=n=x.clientWidth;F=E=x.clientHeight;t=b.add(d.doc,"mousemove",y);r=b.add(p.getDoc(),"mousemove",y);s=b.add(d.doc,"mouseup",B);o=b.add(p.getDoc(),"mouseup",B)})})}j.deltaHeight-=21;k=m=null},_updateUndoStatus:function(j){var i=j.controlManager;i.setDisabled("undo",!j.undoManager.hasUndo()&&!j.typing);i.setDisabled("redo",!j.undoManager.hasRedo())},_nodeChanged:function(m,r,D,q,E){var y=this,C,F=0,x,G,z=y.settings,w,k,u,B,l,j,i;e.each(y.stateControls,function(n){r.setActive(n,m.queryCommandState(y.controls[n][1]))});function o(p){var s,n=E.parents,t=p;if(typeof(p)=="string"){t=function(v){return v.nodeName==p}}for(s=0;s0){y.statusKeyboardNavigation=new e.ui.KeyboardNavigation({root:m.id+"_path_row",items:d.select("a",C),excludeFromTabOrder:true,onCancel:function(){m.focus()}},d)}}},_sel:function(i){this.editor.execCommand("mceSelectNodeDepth",false,i)},_mceInsertAnchor:function(k,j){var i=this.editor;i.windowManager.open({url:this.url+"/anchor.htm",width:320+parseInt(i.getLang("advanced.anchor_delta_width",0)),height:90+parseInt(i.getLang("advanced.anchor_delta_height",0)),inline:true},{theme_url:this.url})},_mceCharMap:function(){var i=this.editor;i.windowManager.open({url:this.url+"/charmap.htm",width:550+parseInt(i.getLang("advanced.charmap_delta_width",0)),height:250+parseInt(i.getLang("advanced.charmap_delta_height",0)),inline:true},{theme_url:this.url})},_mceHelp:function(){var i=this.editor;i.windowManager.open({url:this.url+"/about.htm",width:480,height:380,inline:true},{theme_url:this.url})},_mceShortcuts:function(){var i=this.editor;i.windowManager.open({url:this.url+"/shortcuts.htm",width:480,height:380,inline:true},{theme_url:this.url})},_mceColorPicker:function(k,j){var i=this.editor;j=j||{};i.windowManager.open({url:this.url+"/color_picker.htm",width:375+parseInt(i.getLang("advanced.colorpicker_delta_width",0)),height:250+parseInt(i.getLang("advanced.colorpicker_delta_height",0)),close_previous:false,inline:true},{input_color:j.color,func:j.func,theme_url:this.url})},_mceCodeEditor:function(j,k){var i=this.editor;i.windowManager.open({url:this.url+"/source_editor.htm",width:parseInt(i.getParam("theme_advanced_source_editor_width",720)),height:parseInt(i.getParam("theme_advanced_source_editor_height",580)),inline:true,resizable:true,maximizable:true},{theme_url:this.url})},_mceImage:function(j,k){var i=this.editor;if(i.dom.getAttrib(i.selection.getNode(),"class").indexOf("mceItem")!=-1){return}i.windowManager.open({url:this.url+"/image.htm",width:355+parseInt(i.getLang("advanced.image_delta_width",0)),height:275+parseInt(i.getLang("advanced.image_delta_height",0)),inline:true},{theme_url:this.url})},_mceLink:function(j,k){var i=this.editor;i.windowManager.open({url:this.url+"/link.htm",width:310+parseInt(i.getLang("advanced.link_delta_width",0)),height:200+parseInt(i.getLang("advanced.link_delta_height",0)),inline:true},{theme_url:this.url})},_mceNewDocument:function(){var i=this.editor;i.windowManager.confirm("advanced.newdocument",function(j){if(j){i.execCommand("mceSetContent",false,"")}})},_mceForeColor:function(){var i=this;this._mceColorPicker(0,{color:i.fgColor,func:function(j){i.fgColor=j;i.editor.execCommand("ForeColor",false,j)}})},_mceBackColor:function(){var i=this;this._mceColorPicker(0,{color:i.bgColor,func:function(j){i.bgColor=j;i.editor.execCommand("HiliteColor",false,j)}})},_ufirst:function(i){return i.substring(0,1).toUpperCase()+i.substring(1)}});e.ThemeManager.add("advanced",e.themes.AdvancedTheme)}(tinymce)); \ No newline at end of file diff --git a/src/wp-includes/js/tinymce/themes/advanced/image.htm b/src/wp-includes/js/tinymce/themes/advanced/image.htm new file mode 100644 index 0000000..8427381 --- /dev/null +++ b/src/wp-includes/js/tinymce/themes/advanced/image.htm @@ -0,0 +1,89 @@ + + + + {#advanced_dlg.image_title} + + + + + + +
    + + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
     
    + x +
    +
    +
    + +
    +
    + +
    + +
    + +
    +
    +
    + + diff --git a/src/wp-includes/js/tinymce/themes/advanced/img/colorpicker.jpg b/src/wp-includes/js/tinymce/themes/advanced/img/colorpicker.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b4c542d107b25f68a9d4f9d7a109d0565d1f1437 GIT binary patch literal 3189 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 literal 0 HcmV?d00001 diff --git a/src/wp-includes/js/tinymce/themes/advanced/img/flash.gif b/src/wp-includes/js/tinymce/themes/advanced/img/flash.gif new file mode 100644 index 0000000000000000000000000000000000000000..cb192e6ceda8d19ad8e7d08dd1cfde0aa72ead2a GIT binary patch literal 241 zcmVOzlLa+Za}7>m0&NpCfJ0FQc3~F7DE)S%o1)Qi1n@vxX46qnD4hRS-NE*Pw!4UvE=#^N( literal 0 HcmV?d00001 diff --git a/src/wp-includes/js/tinymce/themes/advanced/img/gotmoxie.png b/src/wp-includes/js/tinymce/themes/advanced/img/gotmoxie.png new file mode 100644 index 0000000000000000000000000000000000000000..8a396e03fa7ec20c3bec606bb7d2d1c77deec5d7 GIT binary patch literal 983 zcmV;|11S87P)MYzM& z{r&!)ug}BH-01A`*x~BqD^sEI^YwC!y|&7u>+J09@bs&(y4T{)^!51P z=IzJUy5#BaxZCCU`TE}I&+G8!=jZ3c;_Hl|#({x>@b&0SRIO7000RR_L_t(|+O(7b zbE_Z_gi#dkq?m{XV|efX|IN1tXxlWMzNXV{CKIdq*erXfKffgPr+HqnYRVd*F{|sk z9XxpNho4}F1KVX4@UR)tHhdfU$ZXdw%K|X&?%**_@%z}}BQ}Ep^^>4|^hQ4aoEnw@ za5n4Z!Q%T1^q1HG^?CqE7z^@2P?SPp&KNVjeZK#eTVNLEvqWMd4p3 zc@&1#Be2h#W!R0vPi%-5qID&=ca~`!Ny94^PplnV)TC|mtAIZ`-q4BK+63#~618lH zmgkkyR5}}AbRPu^yOIL4PC_l|x{u)4R4$@Gye(pNZpAm&Gqts|_J~$t3oV|(eRfC| zdEFroaMK)BNK#ifM7Ur&BMQ}((n=YY(D&AAxrG!Qp(gpSfE+(?{5sKjs^bbDX+5u3 zwi&yGmcYdR%ef_oP5CkwkV$PN21g&jV|+b?Oy7_3xhAq=Kon{75PqQ$6F1%IEqgS*>pH1kQlocinh zau)8~*;5AVr?3b3a>JpD95ygBxDTfcevZ0>m)qrXk#knK8EjQHtnHK74DK&Mz?aZ1 zvw$sLU<$am&rvJ5&yFvbE{E`9XK|~GVfCy4{w4hrU;s)#X@0c=24w&M002ovPDHLk FV1j!_<~aZW literal 0 HcmV?d00001 diff --git a/src/wp-includes/js/tinymce/themes/advanced/img/icons.gif b/src/wp-includes/js/tinymce/themes/advanced/img/icons.gif new file mode 100644 index 0000000000000000000000000000000000000000..e46de5333082869b9bdab2576a554a2f9d01a966 GIT binary patch literal 11794 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 F{{gR&nqvR} literal 0 HcmV?d00001 diff --git a/src/wp-includes/js/tinymce/themes/advanced/img/iframe.gif b/src/wp-includes/js/tinymce/themes/advanced/img/iframe.gif new file mode 100644 index 0000000000000000000000000000000000000000..410c7ad084db698e9f35e3230233aa4040682566 GIT binary patch literal 600 zcmZ?wbhEHb6krfwcoxm@|NsB$<##6SeDUYszh8g<{{H*-%a7k_-3KZc-T3+YPwBiX zzyAIE^Y`z!U%$Wp{QdX;|FQ*Fw;jIy{pasbUw?o3{yVB>Q_sRgx-G9iegFLZcfrha#d9w;%sU=Zx~6K$tw~$%z4`#O^Y@3Z zKV#~)MpSKh@#b63l#}6=>yq2|{`&JLqwny)|NnC)o%r$l&-Y)yKYjo8?#quSuRaGB zt_&<%`RV)bl#YEr{`~p)?RU|v^Y1_Z`u*?Ux8J`*N>>+5JlMAOZr+qr@y$D{mfVhO z+zt#7208-8pDc_F4ABfaAUi>E!oa?@A-bu#r8Qd6oKeb*Lx9UTz)0QBL@+vxY38ii zvqGa87c5+~h&?)zVa3W-D;=U$88}^qMBJ^ERU|z17!;#97+4%Rd1XcXJq#>t8KR;E z7zr5i6BgH5y=gAD)sAQlGB zh8au?j!n~E(Pks?@!j1fR&j*RWY8GF(-=x H6d0@lT&58X literal 0 HcmV?d00001 diff --git a/src/wp-includes/js/tinymce/themes/advanced/img/pagebreak.gif b/src/wp-includes/js/tinymce/themes/advanced/img/pagebreak.gif new file mode 100644 index 0000000000000000000000000000000000000000..acdf4085f3068c4c0a1d6855f4b80dae8bac3068 GIT binary patch literal 325 zcmV-L0lNN2Nk%w1VPpUd0J9GO`>v<{=;ru;boX6P{`2zsmyZ3>&HK5t_;hIbi-G;z z+4`cI{KdfcXj}GCLjV8&A^8LW000jFEC2ui0Av6R000E?@X1N5y*TU5yZ>M)j$|1M z4Ouvb$pHu>IW8BZq|n;U0s@T!VM5~w1_+1X!EiVl!&PITYdjT!ffYfpt{jAfv%qvh zA63WUHSlr7LkeyaV4(pM0f50(II?RD4RtMg4-E+tFhdAy5{3c=0}3Bg9Y8`B2To20 zR%SO62L%9}0H+dzoKB$+2TOwzUrwi{XiBM^4V#>63q3!LsU3u93zH8CdwqY%62;1g z0g8ze$k93lWExp`CUe|K4qOWk17ZeJ0|5pDP6+}};{>bI@lOWj=kf}r2sHp7w9-Ie XK%9UG6W(*AX-vY05F<*&5CH%?Gwy&_ literal 0 HcmV?d00001 diff --git a/src/wp-includes/js/tinymce/themes/advanced/img/quicktime.gif b/src/wp-includes/js/tinymce/themes/advanced/img/quicktime.gif new file mode 100644 index 0000000000000000000000000000000000000000..3b0499145b16138249f653a1a3f2c80230fb292c GIT binary patch literal 303 zcmV+~0nq+ONk%w1VGsZi0K^{vH>m7Qv+~s9^fsC5ZpZP=*zu3F=Jxpf8k_5u%JNv6 z=md-84VLU4w)kSE=yI&-yw>b=v+SqE?+kq47pC+YrR?bJ^yu>Zyvpn;hTp*6^mM!O zu+8$^=JX7bb<~J01ZTA{q@86#&8&6~H`Ss{{?p%K!-p%L6P2TpFYz90?pD06UU# BbnE~C literal 0 HcmV?d00001 diff --git a/src/wp-includes/js/tinymce/themes/advanced/img/realmedia.gif b/src/wp-includes/js/tinymce/themes/advanced/img/realmedia.gif new file mode 100644 index 0000000000000000000000000000000000000000..fdfe0b9ac05869ae845fdd828eaad97cc0c69dbc GIT binary patch literal 439 zcmV;o0Z9HwNk%w1VI=?(0K^{vQcz8xz}f&njBB06v9GQ`Jv%NdDHCI&z`wqZw$(Lw zuFTBL!Pe#<92tv>h)9OE1Xh}vnVEHSaeb-GByg#tqM_B*)YRkdSdqTuipLaF8n=^^LJP4|1^gGRdo_Rl+a*grZQ1hw@Zo1ikN$oB{QbRq&z?QIckdq1aE3;Fq_(WV>Kc7gjQtQh+9OrtFhn-)LUqD<|MOIl_!(Ed#pPRE;S)g;ew3>pd zn`Wa(lc2DGa)peFw3f88dp-|`@*)AXj;@(8hwDr|7Sxsp;&YxjN*Y{PBB!TIU|!b7Zgv0OaG5)&Kwi literal 0 HcmV?d00001 diff --git a/src/wp-includes/js/tinymce/themes/advanced/img/trans.gif b/src/wp-includes/js/tinymce/themes/advanced/img/trans.gif new file mode 100644 index 0000000000000000000000000000000000000000..388486517fa8da13ebd150e8f65d5096c3e10c3a GIT binary patch literal 43 ncmZ?wbhEHbWMp7un7{x9ia%KxMSyG_5FaGNz{KRj$Y2csb)f_x literal 0 HcmV?d00001 diff --git a/src/wp-includes/js/tinymce/themes/advanced/img/video.gif b/src/wp-includes/js/tinymce/themes/advanced/img/video.gif new file mode 100644 index 0000000000000000000000000000000000000000..3570104077a3b3585f11403c8d4c3fc9351f35d2 GIT binary patch literal 597 zcmZ?wbhEHb6krfwc$UTx9v<%P?Ok48Ze?YanwpxCkzrwBk(ZYzB_&l;Qw!gmM(Ep^QBwbzIoSdAh>*2n> zz9l6k0Xw#(?);y5^ls9w|LObxXI*si^YfcEYu3*P8J(S-PEJlaNB-yTd}C^Ax@_69 zzP`Ryt5)S5`=P3;TDk9SbaeFk_3NiTjGA~aFd-pf@}tlxQ>GLb7jM|Gp`oFHlaq7F zk|nvhxjsHV=g+oST3Rl6T(N1>rn0iK*Ed>3MMVn>3vF#}**q!otE>Sy|^jDoRUBoBANRc=wyaJged$+}u3x zK}ld>puWET{||NozXdO-0f3nK$V8iNkVNKl+Guy1NeYie$3 zZB}=&Zex!RYq8YfVwgNdMpdFkN|rU!Fha}0m66q>CDxczOhH^pM9qvxw1p`;Rftzu zQJ&9}g>iErlc2ORw;aC_=l*6UJ=st%r*ISVV2jgDT<)w>rXHGL<21Kdo z#uyug^O^t z0hZGrt*x!>$1C!zn`W5@`ts6_uMW)2%<0NUEKIo?SIPPE=}U0}7Z(?JcX!y=*;bF< zCWz-=h7+2ao9)(dOHM;+X=xs9)%!~xc&ICMZdRYdUQ2$^@9y(6X3NCIz{cM7f^Z=Q z1_tQ95kgl8b%R%OiYTIo7LSdE^@}A^8LW002J#EC2ui01p5U000KOz@O0K01zUifeIyT9%!RzMDgehG|mwLz+Eh; z7Z~iE zrX?OfJ^>XeDJK)xJuWOB3_l1N0Ra>g4Gk^=ED0V6LI?>4;Q|6OB{LplLMRLg8U5-E J?0y6R06W6!pgRBn literal 0 HcmV?d00001 diff --git a/src/wp-includes/js/tinymce/themes/advanced/img/wpicons.png b/src/wp-includes/js/tinymce/themes/advanced/img/wpicons.png new file mode 100644 index 0000000000000000000000000000000000000000..17c2eee3165e8fb13ecb9078a95a5454a5a9aa18 GIT binary patch literal 21059 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

    7!c+M6G2Y@2Snq12}CY{Ff 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 literal 0 HcmV?d00001 diff --git a/src/wp-includes/js/tinymce/themes/advanced/js/about.js b/src/wp-includes/js/tinymce/themes/advanced/js/about.js new file mode 100644 index 0000000..daf4909 --- /dev/null +++ b/src/wp-includes/js/tinymce/themes/advanced/js/about.js @@ -0,0 +1,73 @@ +tinyMCEPopup.requireLangPack(); + +function init() { + var ed, tcont; + + tinyMCEPopup.resizeToInnerSize(); + ed = tinyMCEPopup.editor; + + // Give FF some time + window.setTimeout(insertHelpIFrame, 10); + + tcont = document.getElementById('plugintablecontainer'); + document.getElementById('plugins_tab').style.display = 'none'; + + var html = ""; + html += ''; + html += ''; + html += ''; + html += ''; + html += ''; + html += ''; + html += ''; + html += ''; + html += ''; + + tinymce.each(ed.plugins, function(p, n) { + var info; + + if (!p.getInfo) + return; + + html += ''; + + info = p.getInfo(); + + if (info.infourl != null && info.infourl != '') + html += ''; + else + html += ''; + + if (info.authorurl != null && info.authorurl != '') + html += ''; + else + html += ''; + + html += ''; + html += ''; + + document.getElementById('plugins_tab').style.display = ''; + + }); + + html += ''; + html += '
    ' + ed.getLang('advanced_dlg.about_plugin') + '' + ed.getLang('advanced_dlg.about_author') + '' + ed.getLang('advanced_dlg.about_version') + '
    ' + info.longname + '' + info.longname + '' + info.author + '' + info.author + '' + info.version + '
    '; + + tcont.innerHTML = html; + + tinyMCEPopup.dom.get('version').innerHTML = tinymce.majorVersion + "." + tinymce.minorVersion; + tinyMCEPopup.dom.get('date').innerHTML = tinymce.releaseDate; +} + +function insertHelpIFrame() { + var html; + + if (tinyMCEPopup.getParam('docs_url')) { + html = ''; + document.getElementById('iframecontainer').innerHTML = html; + document.getElementById('help_tab').style.display = 'block'; + document.getElementById('help_tab').setAttribute("aria-hidden", "false"); + } +} + +tinyMCEPopup.onInit.add(init); diff --git a/src/wp-includes/js/tinymce/themes/advanced/js/anchor.js b/src/wp-includes/js/tinymce/themes/advanced/js/anchor.js new file mode 100644 index 0000000..7b55635 --- /dev/null +++ b/src/wp-includes/js/tinymce/themes/advanced/js/anchor.js @@ -0,0 +1,42 @@ +tinyMCEPopup.requireLangPack(); + +var AnchorDialog = { + init : function(ed) { + var action, elm, f = document.forms[0]; + + this.editor = ed; + elm = ed.dom.getParent(ed.selection.getNode(), 'A'); + v = ed.dom.getAttrib(elm, 'name'); + + if (v) { + this.action = 'update'; + f.anchorName.value = v; + } + + f.insert.value = ed.getLang(elm ? 'update' : 'insert'); + }, + + update : function() { + var ed = this.editor, elm, name = document.forms[0].anchorName.value; + + if (!name || !/^[a-z][a-z0-9\-\_:\.]*$/i.test(name)) { + tinyMCEPopup.alert('advanced_dlg.anchor_invalid'); + return; + } + + tinyMCEPopup.restoreSelection(); + + if (this.action != 'update') + ed.selection.collapse(1); + + elm = ed.dom.getParent(ed.selection.getNode(), 'A'); + if (elm) + elm.name = name; + else + ed.execCommand('mceInsertContent', 0, ed.dom.createHTML('a', {name : name, 'class' : 'mceItemAnchor'}, '')); + + tinyMCEPopup.close(); + } +}; + +tinyMCEPopup.onInit.add(AnchorDialog.init, AnchorDialog); diff --git a/src/wp-includes/js/tinymce/themes/advanced/js/charmap.js b/src/wp-includes/js/tinymce/themes/advanced/js/charmap.js new file mode 100644 index 0000000..78bc080 --- /dev/null +++ b/src/wp-includes/js/tinymce/themes/advanced/js/charmap.js @@ -0,0 +1,355 @@ +/** + * charmap.js + * + * Copyright 2009, Moxiecode Systems AB + * Released under LGPL License. + * + * License: http://tinymce.moxiecode.com/license + * Contributing: http://tinymce.moxiecode.com/contributing + */ + +tinyMCEPopup.requireLangPack(); + +var charmap = [ + [' ', ' ', true, 'no-break space'], + ['&', '&', true, 'ampersand'], + ['"', '"', true, 'quotation mark'], +// finance + ['¢', '¢', true, 'cent sign'], + ['€', '€', true, 'euro sign'], + ['£', '£', true, 'pound sign'], + ['¥', '¥', true, 'yen sign'], +// signs + ['©', '©', true, 'copyright sign'], + ['®', '®', true, 'registered sign'], + ['™', '™', true, 'trade mark sign'], + ['‰', '‰', true, 'per mille sign'], + ['µ', 'µ', true, 'micro sign'], + ['·', '·', true, 'middle dot'], + ['•', '•', true, 'bullet'], + ['…', '…', true, 'three dot leader'], + ['′', '′', true, 'minutes / feet'], + ['″', '″', true, 'seconds / inches'], + ['§', '§', true, 'section sign'], + ['¶', '¶', true, 'paragraph sign'], + ['ß', 'ß', true, 'sharp s / ess-zed'], +// quotations + ['‹', '‹', true, 'single left-pointing angle quotation mark'], + ['›', '›', true, 'single right-pointing angle quotation mark'], + ['«', '«', true, 'left pointing guillemet'], + ['»', '»', true, 'right pointing guillemet'], + ['‘', '‘', true, 'left single quotation mark'], + ['’', '’', true, 'right single quotation mark'], + ['“', '“', true, 'left double quotation mark'], + ['”', '”', true, 'right double quotation mark'], + ['‚', '‚', true, 'single low-9 quotation mark'], + ['„', '„', true, 'double low-9 quotation mark'], + ['<', '<', true, 'less-than sign'], + ['>', '>', true, 'greater-than sign'], + ['≤', '≤', true, 'less-than or equal to'], + ['≥', '≥', true, 'greater-than or equal to'], + ['–', '–', true, 'en dash'], + ['—', '—', true, 'em dash'], + ['¯', '¯', true, 'macron'], + ['‾', '‾', true, 'overline'], + ['¤', '¤', true, 'currency sign'], + ['¦', '¦', true, 'broken bar'], + ['¨', '¨', true, 'diaeresis'], + ['¡', '¡', true, 'inverted exclamation mark'], + ['¿', '¿', true, 'turned question mark'], + ['ˆ', 'ˆ', true, 'circumflex accent'], + ['˜', '˜', true, 'small tilde'], + ['°', '°', true, 'degree sign'], + ['−', '−', true, 'minus sign'], + ['±', '±', true, 'plus-minus sign'], + ['÷', '÷', true, 'division sign'], + ['⁄', '⁄', true, 'fraction slash'], + ['×', '×', true, 'multiplication sign'], + ['¹', '¹', true, 'superscript one'], + ['²', '²', true, 'superscript two'], + ['³', '³', true, 'superscript three'], + ['¼', '¼', true, 'fraction one quarter'], + ['½', '½', true, 'fraction one half'], + ['¾', '¾', true, 'fraction three quarters'], +// math / logical + ['ƒ', 'ƒ', true, 'function / florin'], + ['∫', '∫', true, 'integral'], + ['∑', '∑', true, 'n-ary sumation'], + ['∞', '∞', true, 'infinity'], + ['√', '√', true, 'square root'], + ['∼', '∼', false,'similar to'], + ['≅', '≅', false,'approximately equal to'], + ['≈', '≈', true, 'almost equal to'], + ['≠', '≠', true, 'not equal to'], + ['≡', '≡', true, 'identical to'], + ['∈', '∈', false,'element of'], + ['∉', '∉', false,'not an element of'], + ['∋', '∋', false,'contains as member'], + ['∏', '∏', true, 'n-ary product'], + ['∧', '∧', false,'logical and'], + ['∨', '∨', false,'logical or'], + ['¬', '¬', true, 'not sign'], + ['∩', '∩', true, 'intersection'], + ['∪', '∪', false,'union'], + ['∂', '∂', true, 'partial differential'], + ['∀', '∀', false,'for all'], + ['∃', '∃', false,'there exists'], + ['∅', '∅', false,'diameter'], + ['∇', '∇', false,'backward difference'], + ['∗', '∗', false,'asterisk operator'], + ['∝', '∝', false,'proportional to'], + ['∠', '∠', false,'angle'], +// undefined + ['´', '´', true, 'acute accent'], + ['¸', '¸', true, 'cedilla'], + ['ª', 'ª', true, 'feminine ordinal indicator'], + ['º', 'º', true, 'masculine ordinal indicator'], + ['†', '†', true, 'dagger'], + ['‡', '‡', true, 'double dagger'], +// alphabetical special chars + ['À', 'À', true, 'A - grave'], + ['Á', 'Á', true, 'A - acute'], + ['Â', 'Â', true, 'A - circumflex'], + ['Ã', 'Ã', true, 'A - tilde'], + ['Ä', 'Ä', true, 'A - diaeresis'], + ['Å', 'Å', true, 'A - ring above'], + ['Æ', 'Æ', true, 'ligature AE'], + ['Ç', 'Ç', true, 'C - cedilla'], + ['È', 'È', true, 'E - grave'], + ['É', 'É', true, 'E - acute'], + ['Ê', 'Ê', true, 'E - circumflex'], + ['Ë', 'Ë', true, 'E - diaeresis'], + ['Ì', 'Ì', true, 'I - grave'], + ['Í', 'Í', true, 'I - acute'], + ['Î', 'Î', true, 'I - circumflex'], + ['Ï', 'Ï', true, 'I - diaeresis'], + ['Ð', 'Ð', true, 'ETH'], + ['Ñ', 'Ñ', true, 'N - tilde'], + ['Ò', 'Ò', true, 'O - grave'], + ['Ó', 'Ó', true, 'O - acute'], + ['Ô', 'Ô', true, 'O - circumflex'], + ['Õ', 'Õ', true, 'O - tilde'], + ['Ö', 'Ö', true, 'O - diaeresis'], + ['Ø', 'Ø', true, 'O - slash'], + ['Œ', 'Œ', true, 'ligature OE'], + ['Š', 'Š', true, 'S - caron'], + ['Ù', 'Ù', true, 'U - grave'], + ['Ú', 'Ú', true, 'U - acute'], + ['Û', 'Û', true, 'U - circumflex'], + ['Ü', 'Ü', true, 'U - diaeresis'], + ['Ý', 'Ý', true, 'Y - acute'], + ['Ÿ', 'Ÿ', true, 'Y - diaeresis'], + ['Þ', 'Þ', true, 'THORN'], + ['à', 'à', true, 'a - grave'], + ['á', 'á', true, 'a - acute'], + ['â', 'â', true, 'a - circumflex'], + ['ã', 'ã', true, 'a - tilde'], + ['ä', 'ä', true, 'a - diaeresis'], + ['å', 'å', true, 'a - ring above'], + ['æ', 'æ', true, 'ligature ae'], + ['ç', 'ç', true, 'c - cedilla'], + ['è', 'è', true, 'e - grave'], + ['é', 'é', true, 'e - acute'], + ['ê', 'ê', true, 'e - circumflex'], + ['ë', 'ë', true, 'e - diaeresis'], + ['ì', 'ì', true, 'i - grave'], + ['í', 'í', true, 'i - acute'], + ['î', 'î', true, 'i - circumflex'], + ['ï', 'ï', true, 'i - diaeresis'], + ['ð', 'ð', true, 'eth'], + ['ñ', 'ñ', true, 'n - tilde'], + ['ò', 'ò', true, 'o - grave'], + ['ó', 'ó', true, 'o - acute'], + ['ô', 'ô', true, 'o - circumflex'], + ['õ', 'õ', true, 'o - tilde'], + ['ö', 'ö', true, 'o - diaeresis'], + ['ø', 'ø', true, 'o slash'], + ['œ', 'œ', true, 'ligature oe'], + ['š', 'š', true, 's - caron'], + ['ù', 'ù', true, 'u - grave'], + ['ú', 'ú', true, 'u - acute'], + ['û', 'û', true, 'u - circumflex'], + ['ü', 'ü', true, 'u - diaeresis'], + ['ý', 'ý', true, 'y - acute'], + ['þ', 'þ', true, 'thorn'], + ['ÿ', 'ÿ', true, 'y - diaeresis'], + ['Α', 'Α', true, 'Alpha'], + ['Β', 'Β', true, 'Beta'], + ['Γ', 'Γ', true, 'Gamma'], + ['Δ', 'Δ', true, 'Delta'], + ['Ε', 'Ε', true, 'Epsilon'], + ['Ζ', 'Ζ', true, 'Zeta'], + ['Η', 'Η', true, 'Eta'], + ['Θ', 'Θ', true, 'Theta'], + ['Ι', 'Ι', true, 'Iota'], + ['Κ', 'Κ', true, 'Kappa'], + ['Λ', 'Λ', true, 'Lambda'], + ['Μ', 'Μ', true, 'Mu'], + ['Ν', 'Ν', true, 'Nu'], + ['Ξ', 'Ξ', true, 'Xi'], + ['Ο', 'Ο', true, 'Omicron'], + ['Π', 'Π', true, 'Pi'], + ['Ρ', 'Ρ', true, 'Rho'], + ['Σ', 'Σ', true, 'Sigma'], + ['Τ', 'Τ', true, 'Tau'], + ['Υ', 'Υ', true, 'Upsilon'], + ['Φ', 'Φ', true, 'Phi'], + ['Χ', 'Χ', true, 'Chi'], + ['Ψ', 'Ψ', true, 'Psi'], + ['Ω', 'Ω', true, 'Omega'], + ['α', 'α', true, 'alpha'], + ['β', 'β', true, 'beta'], + ['γ', 'γ', true, 'gamma'], + ['δ', 'δ', true, 'delta'], + ['ε', 'ε', true, 'epsilon'], + ['ζ', 'ζ', true, 'zeta'], + ['η', 'η', true, 'eta'], + ['θ', 'θ', true, 'theta'], + ['ι', 'ι', true, 'iota'], + ['κ', 'κ', true, 'kappa'], + ['λ', 'λ', true, 'lambda'], + ['μ', 'μ', true, 'mu'], + ['ν', 'ν', true, 'nu'], + ['ξ', 'ξ', true, 'xi'], + ['ο', 'ο', true, 'omicron'], + ['π', 'π', true, 'pi'], + ['ρ', 'ρ', true, 'rho'], + ['ς', 'ς', true, 'final sigma'], + ['σ', 'σ', true, 'sigma'], + ['τ', 'τ', true, 'tau'], + ['υ', 'υ', true, 'upsilon'], + ['φ', 'φ', true, 'phi'], + ['χ', 'χ', true, 'chi'], + ['ψ', 'ψ', true, 'psi'], + ['ω', 'ω', true, 'omega'], +// symbols + ['ℵ', 'ℵ', false,'alef symbol'], + ['ϖ', 'ϖ', false,'pi symbol'], + ['ℜ', 'ℜ', false,'real part symbol'], + ['ϑ','ϑ', false,'theta symbol'], + ['ϒ', 'ϒ', false,'upsilon - hook symbol'], + ['℘', '℘', false,'Weierstrass p'], + ['ℑ', 'ℑ', false,'imaginary part'], +// arrows + ['←', '←', true, 'leftwards arrow'], + ['↑', '↑', true, 'upwards arrow'], + ['→', '→', true, 'rightwards arrow'], + ['↓', '↓', true, 'downwards arrow'], + ['↔', '↔', true, 'left right arrow'], + ['↵', '↵', false,'carriage return'], + ['⇐', '⇐', false,'leftwards double arrow'], + ['⇑', '⇑', false,'upwards double arrow'], + ['⇒', '⇒', false,'rightwards double arrow'], + ['⇓', '⇓', false,'downwards double arrow'], + ['⇔', '⇔', false,'left right double arrow'], + ['∴', '∴', false,'therefore'], + ['⊂', '⊂', false,'subset of'], + ['⊃', '⊃', false,'superset of'], + ['⊄', '⊄', false,'not a subset of'], + ['⊆', '⊆', false,'subset of or equal to'], + ['⊇', '⊇', false,'superset of or equal to'], + ['⊕', '⊕', false,'circled plus'], + ['⊗', '⊗', false,'circled times'], + ['⊥', '⊥', false,'perpendicular'], + ['⋅', '⋅', false,'dot operator'], + ['⌈', '⌈', false,'left ceiling'], + ['⌉', '⌉', false,'right ceiling'], + ['⌊', '⌊', false,'left floor'], + ['⌋', '⌋', false,'right floor'], + ['⟨', '〈', false,'left-pointing angle bracket'], + ['⟩', '〉', false,'right-pointing angle bracket'], + ['◊', '◊', true, 'lozenge'], + ['♠', '♠', true, 'black spade suit'], + ['♣', '♣', true, 'black club suit'], + ['♥', '♥', true, 'black heart suit'], + ['♦', '♦', true, 'black diamond suit'], + [' ', ' ', false,'en space'], + [' ', ' ', false,'em space'], + [' ', ' ', false,'thin space'], + ['‌', '‌', false,'zero width non-joiner'], + ['‍', '‍', false,'zero width joiner'], + ['‎', '‎', false,'left-to-right mark'], + ['‏', '‏', false,'right-to-left mark'], + ['­', '­', false,'soft hyphen'] +]; + +tinyMCEPopup.onInit.add(function() { + tinyMCEPopup.dom.setHTML('charmapView', renderCharMapHTML()); + addKeyboardNavigation(); +}); + +function addKeyboardNavigation(){ + var tableElm, cells, settings; + + cells = tinyMCEPopup.dom.select(".charmaplink", "charmapgroup"); + + settings ={ + root: "charmapgroup", + items: cells + }; + + tinyMCEPopup.editor.windowManager.createInstance('tinymce.ui.KeyboardNavigation', settings, tinyMCEPopup.dom); +} + +function renderCharMapHTML() { + var charsPerRow = 20, tdWidth=20, tdHeight=20, i; + var html = '

    '+ + ''; + var cols=-1; + + for (i=0; i' + + '' + + charmap[i][1] + + ''; + if ((cols+1) % charsPerRow == 0) + html += ''; + } + } + + if (cols % charsPerRow > 0) { + var padd = charsPerRow - (cols % charsPerRow); + for (var i=0; i '; + } + + html += '
    '; + html = html.replace(/<\/tr>/g, ''); + + return html; +} + +function insertChar(chr) { + tinyMCEPopup.execCommand('mceInsertContent', false, '&#' + chr + ';'); + + // Refocus in window + if (tinyMCEPopup.isWindow) + window.focus(); + + tinyMCEPopup.editor.focus(); + tinyMCEPopup.close(); +} + +function previewChar(codeA, codeB, codeN) { + var elmA = document.getElementById('codeA'); + var elmB = document.getElementById('codeB'); + var elmV = document.getElementById('codeV'); + var elmN = document.getElementById('codeN'); + + if (codeA=='#160;') { + elmV.innerHTML = '__'; + } else { + elmV.innerHTML = '&' + codeA; + } + + elmB.innerHTML = '&' + codeA; + elmA.innerHTML = '&' + codeB; + elmN.innerHTML = codeN; +} diff --git a/src/wp-includes/js/tinymce/themes/advanced/js/color_picker.js b/src/wp-includes/js/tinymce/themes/advanced/js/color_picker.js new file mode 100644 index 0000000..cdf8c4c --- /dev/null +++ b/src/wp-includes/js/tinymce/themes/advanced/js/color_picker.js @@ -0,0 +1,329 @@ +tinyMCEPopup.requireLangPack(); + +var detail = 50, strhex = "0123456789ABCDEF", i, isMouseDown = false, isMouseOver = false; + +var colors = [ + "#000000","#000033","#000066","#000099","#0000cc","#0000ff","#330000","#330033", + "#330066","#330099","#3300cc","#3300ff","#660000","#660033","#660066","#660099", + "#6600cc","#6600ff","#990000","#990033","#990066","#990099","#9900cc","#9900ff", + "#cc0000","#cc0033","#cc0066","#cc0099","#cc00cc","#cc00ff","#ff0000","#ff0033", + "#ff0066","#ff0099","#ff00cc","#ff00ff","#003300","#003333","#003366","#003399", + "#0033cc","#0033ff","#333300","#333333","#333366","#333399","#3333cc","#3333ff", + "#663300","#663333","#663366","#663399","#6633cc","#6633ff","#993300","#993333", + "#993366","#993399","#9933cc","#9933ff","#cc3300","#cc3333","#cc3366","#cc3399", + "#cc33cc","#cc33ff","#ff3300","#ff3333","#ff3366","#ff3399","#ff33cc","#ff33ff", + "#006600","#006633","#006666","#006699","#0066cc","#0066ff","#336600","#336633", + "#336666","#336699","#3366cc","#3366ff","#666600","#666633","#666666","#666699", + "#6666cc","#6666ff","#996600","#996633","#996666","#996699","#9966cc","#9966ff", + "#cc6600","#cc6633","#cc6666","#cc6699","#cc66cc","#cc66ff","#ff6600","#ff6633", + "#ff6666","#ff6699","#ff66cc","#ff66ff","#009900","#009933","#009966","#009999", + "#0099cc","#0099ff","#339900","#339933","#339966","#339999","#3399cc","#3399ff", + "#669900","#669933","#669966","#669999","#6699cc","#6699ff","#999900","#999933", + "#999966","#999999","#9999cc","#9999ff","#cc9900","#cc9933","#cc9966","#cc9999", + "#cc99cc","#cc99ff","#ff9900","#ff9933","#ff9966","#ff9999","#ff99cc","#ff99ff", + "#00cc00","#00cc33","#00cc66","#00cc99","#00cccc","#00ccff","#33cc00","#33cc33", + "#33cc66","#33cc99","#33cccc","#33ccff","#66cc00","#66cc33","#66cc66","#66cc99", + "#66cccc","#66ccff","#99cc00","#99cc33","#99cc66","#99cc99","#99cccc","#99ccff", + "#cccc00","#cccc33","#cccc66","#cccc99","#cccccc","#ccccff","#ffcc00","#ffcc33", + "#ffcc66","#ffcc99","#ffcccc","#ffccff","#00ff00","#00ff33","#00ff66","#00ff99", + "#00ffcc","#00ffff","#33ff00","#33ff33","#33ff66","#33ff99","#33ffcc","#33ffff", + "#66ff00","#66ff33","#66ff66","#66ff99","#66ffcc","#66ffff","#99ff00","#99ff33", + "#99ff66","#99ff99","#99ffcc","#99ffff","#ccff00","#ccff33","#ccff66","#ccff99", + "#ccffcc","#ccffff","#ffff00","#ffff33","#ffff66","#ffff99","#ffffcc","#ffffff" +]; + +var named = { + '#F0F8FF':'Alice Blue','#FAEBD7':'Antique White','#00FFFF':'Aqua','#7FFFD4':'Aquamarine','#F0FFFF':'Azure','#F5F5DC':'Beige', + '#FFE4C4':'Bisque','#000000':'Black','#FFEBCD':'Blanched Almond','#0000FF':'Blue','#8A2BE2':'Blue Violet','#A52A2A':'Brown', + '#DEB887':'Burly Wood','#5F9EA0':'Cadet Blue','#7FFF00':'Chartreuse','#D2691E':'Chocolate','#FF7F50':'Coral','#6495ED':'Cornflower Blue', + '#FFF8DC':'Cornsilk','#DC143C':'Crimson','#00FFFF':'Cyan','#00008B':'Dark Blue','#008B8B':'Dark Cyan','#B8860B':'Dark Golden Rod', + '#A9A9A9':'Dark Gray','#A9A9A9':'Dark Grey','#006400':'Dark Green','#BDB76B':'Dark Khaki','#8B008B':'Dark Magenta','#556B2F':'Dark Olive Green', + '#FF8C00':'Darkorange','#9932CC':'Dark Orchid','#8B0000':'Dark Red','#E9967A':'Dark Salmon','#8FBC8F':'Dark Sea Green','#483D8B':'Dark Slate Blue', + '#2F4F4F':'Dark Slate Gray','#2F4F4F':'Dark Slate Grey','#00CED1':'Dark Turquoise','#9400D3':'Dark Violet','#FF1493':'Deep Pink','#00BFFF':'Deep Sky Blue', + '#696969':'Dim Gray','#696969':'Dim Grey','#1E90FF':'Dodger Blue','#B22222':'Fire Brick','#FFFAF0':'Floral White','#228B22':'Forest Green', + '#FF00FF':'Fuchsia','#DCDCDC':'Gainsboro','#F8F8FF':'Ghost White','#FFD700':'Gold','#DAA520':'Golden Rod','#808080':'Gray','#808080':'Grey', + '#008000':'Green','#ADFF2F':'Green Yellow','#F0FFF0':'Honey Dew','#FF69B4':'Hot Pink','#CD5C5C':'Indian Red','#4B0082':'Indigo','#FFFFF0':'Ivory', + '#F0E68C':'Khaki','#E6E6FA':'Lavender','#FFF0F5':'Lavender Blush','#7CFC00':'Lawn Green','#FFFACD':'Lemon Chiffon','#ADD8E6':'Light Blue', + '#F08080':'Light Coral','#E0FFFF':'Light Cyan','#FAFAD2':'Light Golden Rod Yellow','#D3D3D3':'Light Gray','#D3D3D3':'Light Grey','#90EE90':'Light Green', + '#FFB6C1':'Light Pink','#FFA07A':'Light Salmon','#20B2AA':'Light Sea Green','#87CEFA':'Light Sky Blue','#778899':'Light Slate Gray','#778899':'Light Slate Grey', + '#B0C4DE':'Light Steel Blue','#FFFFE0':'Light Yellow','#00FF00':'Lime','#32CD32':'Lime Green','#FAF0E6':'Linen','#FF00FF':'Magenta','#800000':'Maroon', + '#66CDAA':'Medium Aqua Marine','#0000CD':'Medium Blue','#BA55D3':'Medium Orchid','#9370D8':'Medium Purple','#3CB371':'Medium Sea Green','#7B68EE':'Medium Slate Blue', + '#00FA9A':'Medium Spring Green','#48D1CC':'Medium Turquoise','#C71585':'Medium Violet Red','#191970':'Midnight Blue','#F5FFFA':'Mint Cream','#FFE4E1':'Misty Rose','#FFE4B5':'Moccasin', + '#FFDEAD':'Navajo White','#000080':'Navy','#FDF5E6':'Old Lace','#808000':'Olive','#6B8E23':'Olive Drab','#FFA500':'Orange','#FF4500':'Orange Red','#DA70D6':'Orchid', + '#EEE8AA':'Pale Golden Rod','#98FB98':'Pale Green','#AFEEEE':'Pale Turquoise','#D87093':'Pale Violet Red','#FFEFD5':'Papaya Whip','#FFDAB9':'Peach Puff', + '#CD853F':'Peru','#FFC0CB':'Pink','#DDA0DD':'Plum','#B0E0E6':'Powder Blue','#800080':'Purple','#FF0000':'Red','#BC8F8F':'Rosy Brown','#4169E1':'Royal Blue', + '#8B4513':'Saddle Brown','#FA8072':'Salmon','#F4A460':'Sandy Brown','#2E8B57':'Sea Green','#FFF5EE':'Sea Shell','#A0522D':'Sienna','#C0C0C0':'Silver', + '#87CEEB':'Sky Blue','#6A5ACD':'Slate Blue','#708090':'Slate Gray','#708090':'Slate Grey','#FFFAFA':'Snow','#00FF7F':'Spring Green', + '#4682B4':'Steel Blue','#D2B48C':'Tan','#008080':'Teal','#D8BFD8':'Thistle','#FF6347':'Tomato','#40E0D0':'Turquoise','#EE82EE':'Violet', + '#F5DEB3':'Wheat','#FFFFFF':'White','#F5F5F5':'White Smoke','#FFFF00':'Yellow','#9ACD32':'Yellow Green' +}; + +var namedLookup = {}; + +function init() { + var inputColor = convertRGBToHex(tinyMCEPopup.getWindowArg('input_color')), key, value; + + tinyMCEPopup.resizeToInnerSize(); + + generatePicker(); + generateWebColors(); + generateNamedColors(); + + if (inputColor) { + changeFinalColor(inputColor); + + col = convertHexToRGB(inputColor); + + if (col) + updateLight(col.r, col.g, col.b); + } + + for (key in named) { + value = named[key]; + namedLookup[value.replace(/\s+/, '').toLowerCase()] = key.replace(/#/, '').toLowerCase(); + } +} + +function toHexColor(color) { + var matches, red, green, blue, toInt = parseInt; + + function hex(value) { + value = parseInt(value).toString(16); + + return value.length > 1 ? value : '0' + value; // Padd with leading zero + }; + + color = color.replace(/[\s#]+/g, '').toLowerCase(); + color = namedLookup[color] || color; + matches = /^rgb\((\d{1,3}),(\d{1,3}),(\d{1,3})\)|([a-f0-9]{2})([a-f0-9]{2})([a-f0-9]{2})|([a-f0-9])([a-f0-9])([a-f0-9])$/.exec(color); + + if (matches) { + if (matches[1]) { + red = toInt(matches[1]); + green = toInt(matches[2]); + blue = toInt(matches[3]); + } else if (matches[4]) { + red = toInt(matches[4], 16); + green = toInt(matches[5], 16); + blue = toInt(matches[6], 16); + } else if (matches[7]) { + red = toInt(matches[7] + matches[7], 16); + green = toInt(matches[8] + matches[8], 16); + blue = toInt(matches[9] + matches[9], 16); + } + + return '#' + hex(red) + hex(green) + hex(blue); + } + + return ''; +} + +function insertAction() { + var color = document.getElementById("color").value, f = tinyMCEPopup.getWindowArg('func'); + + tinyMCEPopup.restoreSelection(); + + if (f) + f(toHexColor(color)); + + tinyMCEPopup.close(); +} + +function showColor(color, name) { + if (name) + document.getElementById("colorname").innerHTML = name; + + document.getElementById("preview").style.backgroundColor = color; + document.getElementById("color").value = color.toUpperCase(); +} + +function convertRGBToHex(col) { + var re = new RegExp("rgb\\s*\\(\\s*([0-9]+).*,\\s*([0-9]+).*,\\s*([0-9]+).*\\)", "gi"); + + if (!col) + return col; + + var rgb = col.replace(re, "$1,$2,$3").split(','); + if (rgb.length == 3) { + r = parseInt(rgb[0]).toString(16); + g = parseInt(rgb[1]).toString(16); + b = parseInt(rgb[2]).toString(16); + + r = r.length == 1 ? '0' + r : r; + g = g.length == 1 ? '0' + g : g; + b = b.length == 1 ? '0' + b : b; + + return "#" + r + g + b; + } + + return col; +} + +function convertHexToRGB(col) { + if (col.indexOf('#') != -1) { + col = col.replace(new RegExp('[^0-9A-F]', 'gi'), ''); + + r = parseInt(col.substring(0, 2), 16); + g = parseInt(col.substring(2, 4), 16); + b = parseInt(col.substring(4, 6), 16); + + return {r : r, g : g, b : b}; + } + + return null; +} + +function generatePicker() { + var el = document.getElementById('light'), h = '', i; + + for (i = 0; i < detail; i++){ + h += '
    '; + } + + el.innerHTML = h; +} + +function generateWebColors() { + var el = document.getElementById('webcolors'), h = '', i; + + if (el.className == 'generated') + return; + + // TODO: VoiceOver doesn't seem to support legend as a label referenced by labelledby. + h += '
    ' + + ''; + + for (i=0; i' + + ''; + if (tinyMCEPopup.editor.forcedHighContrastMode) { + h += ''; + } + h += ''; + h += ''; + if ((i+1) % 18 == 0) + h += ''; + } + + h += '
    '; + + el.innerHTML = h; + el.className = 'generated'; + + paintCanvas(el); + enableKeyboardNavigation(el.firstChild); +} + +function paintCanvas(el) { + tinyMCEPopup.getWin().tinymce.each(tinyMCEPopup.dom.select('canvas.mceColorSwatch', el), function(canvas) { + var context; + if (canvas.getContext && (context = canvas.getContext("2d"))) { + context.fillStyle = canvas.getAttribute('data-color'); + context.fillRect(0, 0, 10, 10); + } + }); +} +function generateNamedColors() { + var el = document.getElementById('namedcolors'), h = '', n, v, i = 0; + + if (el.className == 'generated') + return; + + for (n in named) { + v = named[n]; + h += ''; + if (tinyMCEPopup.editor.forcedHighContrastMode) { + h += ''; + } + h += ''; + h += ''; + i++; + } + + el.innerHTML = h; + el.className = 'generated'; + + paintCanvas(el); + enableKeyboardNavigation(el); +} + +function enableKeyboardNavigation(el) { + tinyMCEPopup.editor.windowManager.createInstance('tinymce.ui.KeyboardNavigation', { + root: el, + items: tinyMCEPopup.dom.select('a', el) + }, tinyMCEPopup.dom); +} + +function dechex(n) { + return strhex.charAt(Math.floor(n / 16)) + strhex.charAt(n % 16); +} + +function computeColor(e) { + var x, y, partWidth, partDetail, imHeight, r, g, b, coef, i, finalCoef, finalR, finalG, finalB; + + x = e.offsetX ? e.offsetX : (e.target ? e.clientX - e.target.x : 0); + y = e.offsetY ? e.offsetY : (e.target ? e.clientY - e.target.y : 0); + + partWidth = document.getElementById('colors').width / 6; + partDetail = detail / 2; + imHeight = document.getElementById('colors').height; + + r = (x >= 0)*(x < partWidth)*255 + (x >= partWidth)*(x < 2*partWidth)*(2*255 - x * 255 / partWidth) + (x >= 4*partWidth)*(x < 5*partWidth)*(-4*255 + x * 255 / partWidth) + (x >= 5*partWidth)*(x < 6*partWidth)*255; + g = (x >= 0)*(x < partWidth)*(x * 255 / partWidth) + (x >= partWidth)*(x < 3*partWidth)*255 + (x >= 3*partWidth)*(x < 4*partWidth)*(4*255 - x * 255 / partWidth); + b = (x >= 2*partWidth)*(x < 3*partWidth)*(-2*255 + x * 255 / partWidth) + (x >= 3*partWidth)*(x < 5*partWidth)*255 + (x >= 5*partWidth)*(x < 6*partWidth)*(6*255 - x * 255 / partWidth); + + coef = (imHeight - y) / imHeight; + r = 128 + (r - 128) * coef; + g = 128 + (g - 128) * coef; + b = 128 + (b - 128) * coef; + + changeFinalColor('#' + dechex(r) + dechex(g) + dechex(b)); + updateLight(r, g, b); +} + +function updateLight(r, g, b) { + var i, partDetail = detail / 2, finalCoef, finalR, finalG, finalB, color; + + for (i=0; i=0) && (i'); + }, + + init : function() { + var f = document.forms[0], ed = tinyMCEPopup.editor; + + // Setup browse button + document.getElementById('srcbrowsercontainer').innerHTML = getBrowserHTML('srcbrowser','src','image','theme_advanced_image'); + if (isVisible('srcbrowser')) + document.getElementById('src').style.width = '180px'; + + e = ed.selection.getNode(); + + this.fillFileList('image_list', 'tinyMCEImageList'); + + if (e.nodeName == 'IMG') { + f.src.value = ed.dom.getAttrib(e, 'src'); + f.alt.value = ed.dom.getAttrib(e, 'alt'); + f.border.value = this.getAttrib(e, 'border'); + f.vspace.value = this.getAttrib(e, 'vspace'); + f.hspace.value = this.getAttrib(e, 'hspace'); + f.width.value = ed.dom.getAttrib(e, 'width'); + f.height.value = ed.dom.getAttrib(e, 'height'); + f.insert.value = ed.getLang('update'); + this.styleVal = ed.dom.getAttrib(e, 'style'); + selectByValue(f, 'image_list', f.src.value); + selectByValue(f, 'align', this.getAttrib(e, 'align')); + this.updateStyle(); + } + }, + + fillFileList : function(id, l) { + var dom = tinyMCEPopup.dom, lst = dom.get(id), v, cl; + + l = window[l]; + + if (l && l.length > 0) { + lst.options[lst.options.length] = new Option('', ''); + + tinymce.each(l, function(o) { + lst.options[lst.options.length] = new Option(o[0], o[1]); + }); + } else + dom.remove(dom.getParent(id, 'tr')); + }, + + update : function() { + var f = document.forms[0], nl = f.elements, ed = tinyMCEPopup.editor, args = {}, el; + + tinyMCEPopup.restoreSelection(); + + if (f.src.value === '') { + if (ed.selection.getNode().nodeName == 'IMG') { + ed.dom.remove(ed.selection.getNode()); + ed.execCommand('mceRepaint'); + } + + tinyMCEPopup.close(); + return; + } + + if (!ed.settings.inline_styles) { + args = tinymce.extend(args, { + vspace : nl.vspace.value, + hspace : nl.hspace.value, + border : nl.border.value, + align : getSelectValue(f, 'align') + }); + } else + args.style = this.styleVal; + + tinymce.extend(args, { + src : f.src.value.replace(/ /g, '%20'), + alt : f.alt.value, + width : f.width.value, + height : f.height.value, + 'class' : f.class_name.value + }); + + el = ed.selection.getNode(); + + if (el && el.nodeName == 'IMG') { + ed.dom.setAttribs(el, args); + tinyMCEPopup.editor.execCommand('mceRepaint'); + tinyMCEPopup.editor.focus(); + } else { + ed.execCommand('mceInsertContent', false, '', {skip_undo : 1}); + ed.dom.setAttribs('__mce_tmp', args); + ed.dom.setAttrib('__mce_tmp', 'id', ''); + ed.undoManager.add(); + } + + tinyMCEPopup.close(); + }, + + updateStyle : function() { + var dom = tinyMCEPopup.dom, st, v, cls, oldcls, rep, f = document.forms[0]; + + if (tinyMCEPopup.editor.settings.inline_styles) { + st = tinyMCEPopup.dom.parseStyle(this.styleVal); + + // Handle align + v = getSelectValue(f, 'align'); + cls = f.class_name.value || ''; + cls = cls ? cls.replace(/alignright\s*|alignleft\s*|aligncenter\s*/g, '') : ''; + cls = cls ? cls.replace(/^\s*(.+?)\s*$/, '$1') : ''; + if (v) { + if (v == 'left' || v == 'right') { + st['float'] = v; + delete st['vertical-align']; + oldcls = cls ? ' '+cls : ''; + f.class_name.value = 'align' + v + oldcls; + } else { + st['vertical-align'] = v; + delete st['float']; + f.class_name.value = cls; + } + } else { + delete st['float']; + delete st['vertical-align']; + f.class_name.value = cls; + } + + // Handle border + v = f.border.value; + if (v || v == '0') { + if (v == '0') + st['border'] = '0'; + else + st['border'] = v + 'px solid black'; + } else + delete st['border']; + + // Handle hspace + v = f.hspace.value; + if (v) { + delete st['margin']; + st['margin-left'] = v + 'px'; + st['margin-right'] = v + 'px'; + } else { + delete st['margin-left']; + delete st['margin-right']; + } + + // Handle vspace + v = f.vspace.value; + if (v) { + delete st['margin']; + st['margin-top'] = v + 'px'; + st['margin-bottom'] = v + 'px'; + } else { + delete st['margin-top']; + delete st['margin-bottom']; + } + + // Merge + st = tinyMCEPopup.dom.parseStyle(dom.serializeStyle(st), 'img'); + this.styleVal = dom.serializeStyle(st, 'img'); + } + }, + + getAttrib : function(e, at) { + var ed = tinyMCEPopup.editor, dom = ed.dom, v, v2; + + if (ed.settings.inline_styles) { + switch (at) { + case 'align': + if (v = dom.getStyle(e, 'float')) + return v; + + if (v = dom.getStyle(e, 'vertical-align')) + return v; + + break; + + case 'hspace': + v = dom.getStyle(e, 'margin-left') + v2 = dom.getStyle(e, 'margin-right'); + if (v && v == v2) + return parseInt(v.replace(/[^0-9]/g, '')); + + break; + + case 'vspace': + v = dom.getStyle(e, 'margin-top') + v2 = dom.getStyle(e, 'margin-bottom'); + if (v && v == v2) + return parseInt(v.replace(/[^0-9]/g, '')); + + break; + + case 'border': + v = 0; + + tinymce.each(['top', 'right', 'bottom', 'left'], function(sv) { + sv = dom.getStyle(e, 'border-' + sv + '-width'); + + // False or not the same as prev + if (!sv || (sv != v && v !== 0)) { + v = 0; + return false; + } + + if (sv) + v = sv; + }); + + if (v) + return parseInt(v.replace(/[^0-9]/g, '')); + + break; + } + } + + if (v = dom.getAttrib(e, at)) + return v; + + return ''; + }, + + resetImageData : function() { + var f = document.forms[0]; + + f.width.value = f.height.value = ""; + }, + + updateImageData : function() { + var f = document.forms[0], t = ImageDialog; + + if (f.width.value == "") + f.width.value = t.preloadImg.width; + + if (f.height.value == "") + f.height.value = t.preloadImg.height; + }, + + getImageData : function() { + var f = document.forms[0]; + + this.preloadImg = new Image(); + this.preloadImg.onload = this.updateImageData; + this.preloadImg.onerror = this.resetImageData; + this.preloadImg.src = tinyMCEPopup.editor.documentBaseURI.toAbsolute(f.src.value); + } +}; + +ImageDialog.preInit(); +tinyMCEPopup.onInit.add(ImageDialog.init, ImageDialog); diff --git a/src/wp-includes/js/tinymce/themes/advanced/js/link.js b/src/wp-includes/js/tinymce/themes/advanced/js/link.js new file mode 100644 index 0000000..e67d868 --- /dev/null +++ b/src/wp-includes/js/tinymce/themes/advanced/js/link.js @@ -0,0 +1,153 @@ +tinyMCEPopup.requireLangPack(); + +var LinkDialog = { + preInit : function() { + var url; + + if (url = tinyMCEPopup.getParam("external_link_list_url")) + document.write(''); + }, + + init : function() { + var f = document.forms[0], ed = tinyMCEPopup.editor; + + // Setup browse button + document.getElementById('hrefbrowsercontainer').innerHTML = getBrowserHTML('hrefbrowser', 'href', 'file', 'theme_advanced_link'); + if (isVisible('hrefbrowser')) + document.getElementById('href').style.width = '180px'; + + this.fillClassList('class_list'); + this.fillFileList('link_list', 'tinyMCELinkList'); + this.fillTargetList('target_list'); + + if (e = ed.dom.getParent(ed.selection.getNode(), 'A')) { + f.href.value = ed.dom.getAttrib(e, 'href'); + f.linktitle.value = ed.dom.getAttrib(e, 'title'); + f.insert.value = ed.getLang('update'); + selectByValue(f, 'link_list', f.href.value); + selectByValue(f, 'target_list', ed.dom.getAttrib(e, 'target')); + selectByValue(f, 'class_list', ed.dom.getAttrib(e, 'class')); + } + }, + + update : function() { + var f = document.forms[0], ed = tinyMCEPopup.editor, e, b, href = f.href.value.replace(/ /g, '%20'); + + tinyMCEPopup.restoreSelection(); + e = ed.dom.getParent(ed.selection.getNode(), 'A'); + + // Remove element if there is no href + if (!f.href.value) { + if (e) { + b = ed.selection.getBookmark(); + ed.dom.remove(e, 1); + ed.selection.moveToBookmark(b); + tinyMCEPopup.execCommand("mceEndUndoLevel"); + tinyMCEPopup.close(); + return; + } + } + + // Create new anchor elements + if (e == null) { + ed.getDoc().execCommand("unlink", false, null); + tinyMCEPopup.execCommand("mceInsertLink", false, "#mce_temp_url#", {skip_undo : 1}); + + tinymce.each(ed.dom.select("a"), function(n) { + if (ed.dom.getAttrib(n, 'href') == '#mce_temp_url#') { + e = n; + + ed.dom.setAttribs(e, { + href : href, + title : f.linktitle.value, + target : f.target_list ? getSelectValue(f, "target_list") : null, + 'class' : f.class_list ? getSelectValue(f, "class_list") : null + }); + } + }); + } else { + ed.dom.setAttribs(e, { + href : href, + title : f.linktitle.value, + target : f.target_list ? getSelectValue(f, "target_list") : null, + 'class' : f.class_list ? getSelectValue(f, "class_list") : null + }); + } + + // Don't move caret if selection was image + if (e.childNodes.length != 1 || e.firstChild.nodeName != 'IMG') { + ed.focus(); + ed.selection.select(e); + ed.selection.collapse(0); + tinyMCEPopup.storeSelection(); + } + + tinyMCEPopup.execCommand("mceEndUndoLevel"); + tinyMCEPopup.close(); + }, + + checkPrefix : function(n) { + if (n.value && Validator.isEmail(n) && !/^\s*mailto:/i.test(n.value) && confirm(tinyMCEPopup.getLang('advanced_dlg.link_is_email'))) + n.value = 'mailto:' + n.value; + + if (/^\s*www\./i.test(n.value) && confirm(tinyMCEPopup.getLang('advanced_dlg.link_is_external'))) + n.value = 'http://' + n.value; + }, + + fillFileList : function(id, l) { + var dom = tinyMCEPopup.dom, lst = dom.get(id), v, cl; + + l = window[l]; + + if (l && l.length > 0) { + lst.options[lst.options.length] = new Option('', ''); + + tinymce.each(l, function(o) { + lst.options[lst.options.length] = new Option(o[0], o[1]); + }); + } else + dom.remove(dom.getParent(id, 'tr')); + }, + + fillClassList : function(id) { + var dom = tinyMCEPopup.dom, lst = dom.get(id), v, cl; + + if (v = tinyMCEPopup.getParam('theme_advanced_styles')) { + cl = []; + + tinymce.each(v.split(';'), function(v) { + var p = v.split('='); + + cl.push({'title' : p[0], 'class' : p[1]}); + }); + } else + cl = tinyMCEPopup.editor.dom.getClasses(); + + if (cl.length > 0) { + lst.options[lst.options.length] = new Option(tinyMCEPopup.getLang('not_set'), ''); + + tinymce.each(cl, function(o) { + lst.options[lst.options.length] = new Option(o.title || o['class'], o['class']); + }); + } else + dom.remove(dom.getParent(id, 'tr')); + }, + + fillTargetList : function(id) { + var dom = tinyMCEPopup.dom, lst = dom.get(id), v; + + lst.options[lst.options.length] = new Option(tinyMCEPopup.getLang('not_set'), ''); + lst.options[lst.options.length] = new Option(tinyMCEPopup.getLang('advanced_dlg.link_target_same'), '_self'); + lst.options[lst.options.length] = new Option(tinyMCEPopup.getLang('advanced_dlg.link_target_blank'), '_blank'); + + if (v = tinyMCEPopup.getParam('theme_advanced_link_targets')) { + tinymce.each(v.split(','), function(v) { + v = v.split('='); + lst.options[lst.options.length] = new Option(v[0], v[1]); + }); + } + } +}; + +LinkDialog.preInit(); +tinyMCEPopup.onInit.add(LinkDialog.init, LinkDialog); diff --git a/src/wp-includes/js/tinymce/themes/advanced/js/source_editor.js b/src/wp-includes/js/tinymce/themes/advanced/js/source_editor.js new file mode 100644 index 0000000..9cf6b1a --- /dev/null +++ b/src/wp-includes/js/tinymce/themes/advanced/js/source_editor.js @@ -0,0 +1,56 @@ +tinyMCEPopup.requireLangPack(); +tinyMCEPopup.onInit.add(onLoadInit); + +function saveContent() { + tinyMCEPopup.editor.setContent(document.getElementById('htmlSource').value, {source_view : true}); + tinyMCEPopup.close(); +} + +function onLoadInit() { + tinyMCEPopup.resizeToInnerSize(); + + // Remove Gecko spellchecking + if (tinymce.isGecko) + document.body.spellcheck = tinyMCEPopup.editor.getParam("gecko_spellcheck"); + + document.getElementById('htmlSource').value = tinyMCEPopup.editor.getContent({source_view : true}); + + if (tinyMCEPopup.editor.getParam("theme_advanced_source_editor_wrap", true)) { + setWrap('soft'); + document.getElementById('wraped').checked = true; + } + + resizeInputs(); +} + +function setWrap(val) { + var v, n, s = document.getElementById('htmlSource'); + + s.wrap = val; + + if (!tinymce.isIE) { + v = s.value; + n = s.cloneNode(false); + n.setAttribute("wrap", val); + s.parentNode.replaceChild(n, s); + n.value = v; + } +} + +function toggleWordWrap(elm) { + if (elm.checked) + setWrap('soft'); + else + setWrap('off'); +} + +function resizeInputs() { + var vp = tinyMCEPopup.dom.getViewPort(window), el; + + el = document.getElementById('htmlSource'); + + if (el) { + el.style.width = (vp.w - 20) + 'px'; + el.style.height = (vp.h - 65) + 'px'; + } +} diff --git a/src/wp-includes/js/tinymce/themes/advanced/link.htm b/src/wp-includes/js/tinymce/themes/advanced/link.htm new file mode 100644 index 0000000..7c34b6d --- /dev/null +++ b/src/wp-includes/js/tinymce/themes/advanced/link.htm @@ -0,0 +1,62 @@ + + + + {#advanced_dlg.link_title} + + + + + + + +
    + + +
    +
    + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
     
    +
    +
    + +
    +
    + +
    + +
    + +
    +
    +
    + + diff --git a/src/wp-includes/js/tinymce/themes/advanced/shortcuts.htm b/src/wp-includes/js/tinymce/themes/advanced/shortcuts.htm new file mode 100644 index 0000000..16a1502 --- /dev/null +++ b/src/wp-includes/js/tinymce/themes/advanced/shortcuts.htm @@ -0,0 +1,47 @@ + + + + {#advanced_dlg.accessibility_help} + + + + +

    {#advanced_dlg.accessibility_usage_title}

    +

    Toolbars

    +

    Press ALT-F10 to move focus to the toolbars. Navigate through the buttons using the arrow keys. + Press enter to activate a button and return focus to the editor. + Press escape to return focus to the editor without performing any actions.

    + +

    Status Bar

    +

    To access the editor status bar, press ALT-F11. Use the left and right arrow keys to navigate between elements in the path. + Press enter or space to select an element. Press escape to return focus to the editor without changing the selection.

    + +

    Context Menu

    +

    Press shift-F10 to activate the context menu. Use the up and down arrow keys to move between menu items. To open sub-menus press the right arrow key. + To close submenus press the left arrow key. Press escape to close the context menu.

    + +

    Keyboard Shortcuts

    + + + + + + + + + + + + + + + + + + + + + +
    KeystrokeFunction
    Control-BBold
    Control-IItalic
    Control-ZUndo
    Control-YRedo
    + + diff --git a/src/wp-includes/js/tinymce/themes/advanced/skins/default/content.css b/src/wp-includes/js/tinymce/themes/advanced/skins/default/content.css new file mode 100644 index 0000000..842d52d --- /dev/null +++ b/src/wp-includes/js/tinymce/themes/advanced/skins/default/content.css @@ -0,0 +1,47 @@ +body, td, pre {color:#000; font-family:Verdana, Arial, Helvetica, sans-serif; font-size:10px; margin:8px;} +body {background:#FFF;} +body.mceForceColors {background:#FFF; color:#000;} +body.mceBrowserDefaults {background:transparent; color:inherit; font-size:inherit; font-family:inherit;} +h1 {font-size: 2em} +h2 {font-size: 1.5em} +h3 {font-size: 1.17em} +h4 {font-size: 1em} +h5 {font-size: .83em} +h6 {font-size: .75em} +.mceItemTable, .mceItemTable td, .mceItemTable th, .mceItemTable caption, .mceItemVisualAid {border: 1px dashed #BBB;} +a.mceItemAnchor {display:inline-block; width:11px !important; height:11px !important; background:url(img/items.gif) no-repeat 0 0;} +span.mceItemNbsp {background: #DDD} +td.mceSelected, th.mceSelected {background-color:#3399ff !important} +img {border:0;} +table {cursor:default} +table td, table th {cursor:text} +ins {border-bottom:1px solid green; text-decoration: none; color:green} +del {color:red; text-decoration:line-through} +cite {border-bottom:1px dashed blue} +acronym {border-bottom:1px dotted #CCC; cursor:help} +abbr {border-bottom:1px dashed #CCC; cursor:help} + +/* IE */ +* html body { +scrollbar-3dlight-color:#F0F0EE; +scrollbar-arrow-color:#676662; +scrollbar-base-color:#F0F0EE; +scrollbar-darkshadow-color:#DDD; +scrollbar-face-color:#E0E0DD; +scrollbar-highlight-color:#F0F0EE; +scrollbar-shadow-color:#F0F0EE; +scrollbar-track-color:#F5F5F5; +} + +img:-moz-broken {-moz-force-broken-image-icon:1; width:24px; height:24px} +font[face=mceinline] {font-family:inherit !important} + +.mceItemMedia {border:1px dotted #cc0000; background-position:center; background-repeat:no-repeat; background-color:#ffffcc} +.mceItemShockWave {background-image:url(../../img/shockwave.gif)} +.mceItemFlash {background-image:url(../../img/flash.gif)} +.mceItemQuickTime {background-image:url(../../img/quicktime.gif)} +.mceItemWindowsMedia {background-image:url(../../img/windowsmedia.gif)} +.mceItemRealMedia {background-image:url(../../img/realmedia.gif)} +.mceItemVideo {background-image:url(../../img/video.gif)} +.mceItemIframe {background-image:url(../../img/iframe.gif)} +.mcePageBreak {display:block;border:0;width:100%;height:12px;border-top:1px dotted #ccc;margin-top:15px;background:#fff url(../../img/pagebreak.gif) no-repeat center top;} diff --git a/src/wp-includes/js/tinymce/themes/advanced/skins/default/dialog.css b/src/wp-includes/js/tinymce/themes/advanced/skins/default/dialog.css new file mode 100644 index 0000000..1f5598c --- /dev/null +++ b/src/wp-includes/js/tinymce/themes/advanced/skins/default/dialog.css @@ -0,0 +1,117 @@ +/* Generic */ +body { +font-family:Verdana, Arial, Helvetica, sans-serif; font-size:11px; +scrollbar-3dlight-color:#F0F0EE; +scrollbar-arrow-color:#676662; +scrollbar-base-color:#F0F0EE; +scrollbar-darkshadow-color:#DDDDDD; +scrollbar-face-color:#E0E0DD; +scrollbar-highlight-color:#F0F0EE; +scrollbar-shadow-color:#F0F0EE; +scrollbar-track-color:#F5F5F5; +background:#F0F0EE; +padding:0; +margin:8px 8px 0 8px; +} + +html {background:#F0F0EE;} +td {font-family:Verdana, Arial, Helvetica, sans-serif; font-size:10px;} +textarea {resize:none;outline:none;} +a:link, a:visited {color:black;} +a:hover {color:#2B6FB6;} +.nowrap {white-space: nowrap} + +/* Forms */ +fieldset {margin:0; padding:4px; border:1px solid #919B9C; 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 #CCC;} +input, select, textarea {font-family:Verdana, Arial, Helvetica, sans-serif; font-size:10px;} +input, select, textarea {border:1px solid #808080;} +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, input.button, .updateButton { +border:0; margin:0; padding:0; +font-weight:bold; +width:94px; height:26px; +background:url(img/buttons.png) 0 -26px; +cursor:pointer; +padding-bottom:2px; +float:left; +} + +#insert {background:url(img/buttons.png) 0 -52px} +#cancel {background:url(img/buttons.png) 0 0; float:right} + +/* Browse */ +a.pickcolor, a.browse {text-decoration:none} +a.browse span {display:block; width:20px; height:18px; background:url(../../img/icons.gif) -860px 0; 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; background:url(../../img/icons.gif) -840px 0; margin-left:2px;} +.mceOldBoxModel a.pickcolor span {width:21px; height:17px;} +a.pickcolor:hover span {background-color:#B2BBD0;} +a.pickcolor:hover span.disabled {} + +/* 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} + +/* Source */ +.wordWrapCode {vertical-align:middle; border:1px none #000000; background:transparent;} +.mceActionPanel {margin-top:5px;} + +/* Tabs classes */ +.tabs {width:100%; height:18px; line-height:normal; background:url(img/tabs.gif) repeat-x 0 -72px;} +.tabs ul {margin:0; padding:0; list-style:none;} +.tabs li {float:left; background:url(img/tabs.gif) no-repeat 0 0; margin:0 2px 0 0; padding:0 0 0 10px; line-height:17px; height:18px; display:block;} +.tabs li.current {background:url(img/tabs.gif) no-repeat 0 -18px; margin-right:2px;} +.tabs span {float:left; display:block; background:url(img/tabs.gif) no-repeat right -36px; padding:0px 10px 0 0;} +.tabs .current span {background:url(img/tabs.gif) no-repeat right -54px;} +.tabs a {text-decoration:none; font-family:Verdana, Arial; font-size:10px;} +.tabs a:link, .tabs a:visited, .tabs a:hover {color:black;} + +/* 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 {float:right; width:50px; height:14px;line-height:1px; border:1px solid black; margin-left:5px;} +#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 #previewblock {float:right; padding-left:10px; height:20px;} +#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;} diff --git a/src/wp-includes/js/tinymce/themes/advanced/skins/default/img/buttons.png b/src/wp-includes/js/tinymce/themes/advanced/skins/default/img/buttons.png new file mode 100644 index 0000000000000000000000000000000000000000..7dd58418ba7cfe58ae7efdf174e0b223fe3aa6a0 GIT binary patch literal 3274 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 SLTQbO*E^TJI;F+RU=09Vu@yA{ literal 0 HcmV?d00001 diff --git a/src/wp-includes/js/tinymce/themes/advanced/skins/default/img/menu_check.gif b/src/wp-includes/js/tinymce/themes/advanced/skins/default/img/menu_check.gif new file mode 100644 index 0000000000000000000000000000000000000000..adfdddccd7cac62a17d68873fa53c248bff8351a GIT binary patch literal 70 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 R!Sp}^Mt9BhYjvGt{|88cricIl literal 0 HcmV?d00001 diff --git a/src/wp-includes/js/tinymce/themes/advanced/skins/o2k7/img/button_bg_black.png b/src/wp-includes/js/tinymce/themes/advanced/skins/o2k7/img/button_bg_black.png new file mode 100644 index 0000000000000000000000000000000000000000..8996c7493e8a58c9c40845cbe8abdc3e6730716d GIT binary patch literal 3736 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 M07*qoM6N<$f@g#ZbN~PV literal 0 HcmV?d00001 diff --git a/src/wp-includes/js/tinymce/themes/advanced/skins/o2k7/ui.css b/src/wp-includes/js/tinymce/themes/advanced/skins/o2k7/ui.css new file mode 100644 index 0000000..91edeca --- /dev/null +++ b/src/wp-includes/js/tinymce/themes/advanced/skins/o2k7/ui.css @@ -0,0 +1,216 @@ +/* Reset */ +.o2k7Skin table, .o2k7Skin tbody, .o2k7Skin a, .o2k7Skin img, .o2k7Skin tr, .o2k7Skin div, .o2k7Skin td, .o2k7Skin iframe, .o2k7Skin span, .o2k7Skin *, .o2k7Skin .mceText {border:0; margin:0; padding:0; background:transparent; white-space:nowrap; text-decoration:none; font-weight:normal; cursor:default; color:#000; vertical-align:baseline; width:auto; border-collapse:separate; text-align:left} +.o2k7Skin a:hover, .o2k7Skin a:link, .o2k7Skin a:visited, .o2k7Skin a:active {text-decoration:none; font-weight:normal; cursor:default; color:#000} +.o2k7Skin table td {vertical-align:middle} + +/* Containers */ +.o2k7Skin table {background:transparent} +.o2k7Skin iframe {display:block;} +.o2k7Skin .mceToolbar {height:26px} + +/* External */ +.o2k7Skin .mceExternalToolbar {position:absolute; border:1px solid #ABC6DD; border-bottom:0; display:none} +.o2k7Skin .mceExternalToolbar td.mceToolbar {padding-right:13px;} +.o2k7Skin .mceExternalClose {position:absolute; top:3px; right:3px; width:7px; height:7px; background:url(../../img/icons.gif) -820px 0} + +/* Layout */ +.o2k7Skin table.mceLayout {border:0; border-left:1px solid #ABC6DD; border-right:1px solid #ABC6DD} +.o2k7Skin table.mceLayout tr.mceFirst td {border-top:1px solid #ABC6DD} +.o2k7Skin table.mceLayout tr.mceLast td {border-bottom:1px solid #ABC6DD} +.o2k7Skin table.mceToolbar, .o2k7Skin tr.mceFirst .mceToolbar tr td, .o2k7Skin tr.mceLast .mceToolbar tr td {border:0; margin:0; padding:0} +.o2k7Skin .mceIframeContainer {border-top:1px solid #ABC6DD; border-bottom:1px solid #ABC6DD} +.o2k7Skin td.mceToolbar{background:#E5EFFD} +.o2k7Skin .mceStatusbar {background:#E5EFFD; display:block; font-family:'MS Sans Serif',sans-serif,Verdana,Arial; font-size:9pt; line-height:16px; overflow:visible; color:#000; height:20px} +.o2k7Skin .mceStatusbar div {float:left; padding:2px} +.o2k7Skin .mceStatusbar a.mceResize {display:block; float:right; background:url(../../img/icons.gif) -800px 0; width:20px; height:20px; cursor:se-resize; outline:0} +.o2k7Skin .mceStatusbar a:hover {text-decoration:underline} +.o2k7Skin table.mceToolbar {margin-left:3px} +.o2k7Skin .mceToolbar .mceToolbarStart span {display:block; background:url(img/button_bg.png) -22px 0; width:1px; height:22px; margin-left:3px;} +.o2k7Skin .mceToolbar td.mceFirst span {margin:0} +.o2k7Skin .mceToolbar .mceToolbarEnd span {display:block; background:url(img/button_bg.png) -22px 0; width:1px; height:22px} +.o2k7Skin .mceToolbar .mceToolbarEndListBox span, .o2k7Skin .mceToolbar .mceToolbarStartListBox span {display:none} +.o2k7Skin span.mceIcon, .o2k7Skin img.mceIcon {display:block; width:20px; height:20px} +.o2k7Skin .mceIcon {background:url(../../img/icons.gif) no-repeat 20px 20px} +.o2k7Skin td.mceCenter {text-align:center;} +.o2k7Skin td.mceCenter table {margin:0 auto; text-align:left;} +.o2k7Skin td.mceRight table {margin:0 0 0 auto;} + +/* Button */ +.o2k7Skin .mceButton {display:block; background:url(img/button_bg.png); width:22px; height:22px} +.o2k7Skin a.mceButton span, .o2k7Skin a.mceButton img {margin-left:1px} +.o2k7Skin .mceOldBoxModel a.mceButton span, .o2k7Skin .mceOldBoxModel a.mceButton img {margin:0 0 0 1px} +.o2k7Skin a.mceButtonEnabled:hover {background-color:#B2BBD0; background-position:0 -22px} +.o2k7Skin a.mceButtonActive, .o2k7Skin a.mceButtonSelected {background-position:0 -44px} +.o2k7Skin .mceButtonDisabled .mceIcon {opacity:0.3; -ms-filter:'alpha(opacity=30)'; filter:alpha(opacity=30)} +.o2k7Skin .mceButtonLabeled {width:auto} +.o2k7Skin .mceButtonLabeled span.mceIcon {float:left} +.o2k7Skin span.mceButtonLabel {display:block; font-size:10px; padding:4px 6px 0 22px; font-family:Tahoma,Verdana,Arial,Helvetica} +.o2k7Skin .mceButtonDisabled .mceButtonLabel {color:#888} + +/* Separator */ +.o2k7Skin .mceSeparator {display:block; background:url(img/button_bg.png) -22px 0; width:5px; height:22px} + +/* ListBox */ +.o2k7Skin .mceListBox {margin-left:3px} +.o2k7Skin .mceListBox, .o2k7Skin .mceListBox a {display:block} +.o2k7Skin .mceListBox .mceText {padding-left:4px; text-align:left; width:70px; border:1px solid #b3c7e1; border-right:0; background:#eaf2fb; font-family:Tahoma,Verdana,Arial,Helvetica; font-size:11px; height:20px; line-height:20px; overflow:hidden} +.o2k7Skin .mceListBox .mceOpen {width:14px; height:22px; background:url(img/button_bg.png) -66px 0} +.o2k7Skin table.mceListBoxEnabled:hover .mceText, .o2k7Skin .mceListBoxHover .mceText, .o2k7Skin .mceListBoxSelected .mceText {background:#FFF} +.o2k7Skin table.mceListBoxEnabled:hover .mceOpen, .o2k7Skin .mceListBoxHover .mceOpen, .o2k7Skin .mceListBoxSelected .mceOpen {background-position:-66px -22px} +.o2k7Skin .mceListBoxDisabled .mceText {color:gray} +.o2k7Skin .mceListBoxMenu {overflow:auto; overflow-x:hidden} +.o2k7Skin .mceOldBoxModel .mceListBox .mceText {height:22px} +.o2k7Skin select.mceListBox {font-family:Tahoma,Verdana,Arial,Helvetica; font-size:12px; border:1px solid #b3c7e1; background:#FFF;} + +/* SplitButton */ +.o2k7Skin .mceSplitButton, .o2k7Skin .mceSplitButton a, .o2k7Skin .mceSplitButton span {display:block; height:22px; direction:ltr} +.o2k7Skin .mceSplitButton {background:url(img/button_bg.png)} +.o2k7Skin .mceSplitButton a.mceAction {width:22px} +.o2k7Skin .mceSplitButton span.mceAction {width:22px; background-image:url(../../img/icons.gif)} +.o2k7Skin .mceSplitButton a.mceOpen {width:10px; background:url(img/button_bg.png) -44px 0} +.o2k7Skin .mceSplitButton span.mceOpen {display:none} +.o2k7Skin table.mceSplitButtonEnabled:hover a.mceAction, .o2k7Skin .mceSplitButtonHover a.mceAction, .o2k7Skin .mceSplitButtonSelected {background:url(img/button_bg.png) 0 -22px} +.o2k7Skin table.mceSplitButtonEnabled:hover a.mceOpen, .o2k7Skin .mceSplitButtonHover a.mceOpen, .o2k7Skin .mceSplitButtonSelected a.mceOpen {background-position:-44px -44px} +.o2k7Skin .mceSplitButtonDisabled .mceAction {opacity:0.3; -ms-filter:'alpha(opacity=30)'; filter:alpha(opacity=30)} +.o2k7Skin .mceSplitButtonActive {background-position:0 -44px} + +/* ColorSplitButton */ +.o2k7Skin div.mceColorSplitMenu table {background:#FFF; border:1px solid gray} +.o2k7Skin .mceColorSplitMenu td {padding:2px} +.o2k7Skin .mceColorSplitMenu a {display:block; width:9px; height:9px; overflow:hidden; border:1px solid #808080} +.o2k7Skin .mceColorSplitMenu td.mceMoreColors {padding:1px 3px 1px 1px} +.o2k7Skin .mceColorSplitMenu a.mceMoreColors {width:100%; height:auto; text-align:center; font-family:Tahoma,Verdana,Arial,Helvetica; font-size:11px; line-height:20px; border:1px solid #FFF} +.o2k7Skin .mceColorSplitMenu a.mceMoreColors:hover {border:1px solid #0A246A; background-color:#B6BDD2} +.o2k7Skin a.mceMoreColors:hover {border:1px solid #0A246A} +.o2k7Skin .mceColorPreview {margin-left:2px; width:16px; height:4px; overflow:hidden; background:#9a9b9a;overflow:hidden} +.o2k7Skin .mce_forecolor span.mceAction, .o2k7Skin .mce_backcolor span.mceAction {height:15px;overflow:hidden} + +/* Menu */ +.o2k7Skin .mceMenu {position:absolute; left:0; top:0; z-index:1000; border:1px solid #ABC6DD} +.o2k7Skin .mceNoIcons span.mceIcon {width:0;} +.o2k7Skin .mceNoIcons a .mceText {padding-left:10px} +.o2k7Skin .mceMenu table {background:#FFF} +.o2k7Skin .mceMenu a, .o2k7Skin .mceMenu span, .o2k7Skin .mceMenu {display:block} +.o2k7Skin .mceMenu td {height:20px} +.o2k7Skin .mceMenu a {position:relative;padding:3px 0 4px 0} +.o2k7Skin .mceMenu .mceText {position:relative; display:block; font-family:Tahoma,Verdana,Arial,Helvetica; color:#000; cursor:default; margin:0; padding:0 25px 0 25px; display:block} +.o2k7Skin .mceMenu span.mceText, .o2k7Skin .mceMenu .mcePreview {font-size:11px} +.o2k7Skin .mceMenu pre.mceText {font-family:Monospace} +.o2k7Skin .mceMenu .mceIcon {position:absolute; top:0; left:0; width:22px;} +.o2k7Skin .mceMenu .mceMenuItemEnabled a:hover, .o2k7Skin .mceMenu .mceMenuItemActive {background-color:#dbecf3} +.o2k7Skin td.mceMenuItemSeparator {background:#DDD; height:1px} +.o2k7Skin .mceMenuItemTitle a {border:0; background:#E5EFFD; border-bottom:1px solid #ABC6DD} +.o2k7Skin .mceMenuItemTitle span.mceText {color:#000; font-weight:bold; padding-left:4px} +.o2k7Skin .mceMenuItemDisabled .mceText {color:#888} +.o2k7Skin .mceMenuItemSelected .mceIcon {background:url(../default/img/menu_check.gif)} +.o2k7Skin .mceNoIcons .mceMenuItemSelected a {background:url(../default/img/menu_arrow.gif) no-repeat -6px center} +.o2k7Skin .mceMenu span.mceMenuLine {display:none} +.o2k7Skin .mceMenuItemSub a {background:url(../default/img/menu_arrow.gif) no-repeat top right;} + +/* Progress,Resize */ +.o2k7Skin .mceBlocker {position:absolute; left:0; top:0; z-index:1000; opacity:0.5; -ms-filter:'alpha(opacity=30)'; filter:alpha(opacity=50); background:#FFF} +.o2k7Skin .mceProgress {position:absolute; left:0; top:0; z-index:1001; background:url(../default/img/progress.gif) no-repeat; width:32px; height:32px; margin:-16px 0 0 -16px} + +/* Formats */ +.o2k7Skin .mce_formatPreview a {font-size:10px} +.o2k7Skin .mce_p span.mceText {} +.o2k7Skin .mce_address span.mceText {font-style:italic} +.o2k7Skin .mce_pre span.mceText {font-family:monospace} +.o2k7Skin .mce_h1 span.mceText {font-weight:bolder; font-size: 2em} +.o2k7Skin .mce_h2 span.mceText {font-weight:bolder; font-size: 1.5em} +.o2k7Skin .mce_h3 span.mceText {font-weight:bolder; font-size: 1.17em} +.o2k7Skin .mce_h4 span.mceText {font-weight:bolder; font-size: 1em} +.o2k7Skin .mce_h5 span.mceText {font-weight:bolder; font-size: .83em} +.o2k7Skin .mce_h6 span.mceText {font-weight:bolder; font-size: .75em} + +/* Theme */ +.o2k7Skin span.mce_bold {background-position:0 0} +.o2k7Skin span.mce_italic {background-position:-60px 0} +.o2k7Skin span.mce_underline {background-position:-140px 0} +.o2k7Skin span.mce_strikethrough {background-position:-120px 0} +.o2k7Skin span.mce_undo {background-position:-160px 0} +.o2k7Skin span.mce_redo {background-position:-100px 0} +.o2k7Skin span.mce_cleanup {background-position:-40px 0} +.o2k7Skin span.mce_bullist {background-position:-20px 0} +.o2k7Skin span.mce_numlist {background-position:-80px 0} +.o2k7Skin span.mce_justifyleft {background-position:-460px 0} +.o2k7Skin span.mce_justifyright {background-position:-480px 0} +.o2k7Skin span.mce_justifycenter {background-position:-420px 0} +.o2k7Skin span.mce_justifyfull {background-position:-440px 0} +.o2k7Skin span.mce_anchor {background-position:-200px 0} +.o2k7Skin span.mce_indent {background-position:-400px 0} +.o2k7Skin span.mce_outdent {background-position:-540px 0} +.o2k7Skin span.mce_link {background-position:-500px 0} +.o2k7Skin span.mce_unlink {background-position:-640px 0} +.o2k7Skin span.mce_sub {background-position:-600px 0} +.o2k7Skin span.mce_sup {background-position:-620px 0} +.o2k7Skin span.mce_removeformat {background-position:-580px 0} +.o2k7Skin span.mce_newdocument {background-position:-520px 0} +.o2k7Skin span.mce_image {background-position:-380px 0} +.o2k7Skin span.mce_help {background-position:-340px 0} +.o2k7Skin span.mce_code {background-position:-260px 0} +.o2k7Skin span.mce_hr {background-position:-360px 0} +.o2k7Skin span.mce_visualaid {background-position:-660px 0} +.o2k7Skin span.mce_charmap {background-position:-240px 0} +.o2k7Skin span.mce_paste {background-position:-560px 0} +.o2k7Skin span.mce_copy {background-position:-700px 0} +.o2k7Skin span.mce_cut {background-position:-680px 0} +.o2k7Skin span.mce_blockquote {background-position:-220px 0} +.o2k7Skin .mce_forecolor span.mceAction {background-position:-720px 0} +.o2k7Skin .mce_backcolor span.mceAction {background-position:-760px 0} +.o2k7Skin span.mce_forecolorpicker {background-position:-720px 0} +.o2k7Skin span.mce_backcolorpicker {background-position:-760px 0} + +/* Plugins */ +.o2k7Skin span.mce_advhr {background-position:-0px -20px} +.o2k7Skin span.mce_ltr {background-position:-20px -20px} +.o2k7Skin span.mce_rtl {background-position:-40px -20px} +.o2k7Skin span.mce_emotions {background-position:-60px -20px} +.o2k7Skin span.mce_fullpage {background-position:-80px -20px} +.o2k7Skin span.mce_fullscreen {background-position:-100px -20px} +.o2k7Skin span.mce_iespell {background-position:-120px -20px} +.o2k7Skin span.mce_insertdate {background-position:-140px -20px} +.o2k7Skin span.mce_inserttime {background-position:-160px -20px} +.o2k7Skin span.mce_absolute {background-position:-180px -20px} +.o2k7Skin span.mce_backward {background-position:-200px -20px} +.o2k7Skin span.mce_forward {background-position:-220px -20px} +.o2k7Skin span.mce_insert_layer {background-position:-240px -20px} +.o2k7Skin span.mce_insertlayer {background-position:-260px -20px} +.o2k7Skin span.mce_movebackward {background-position:-280px -20px} +.o2k7Skin span.mce_moveforward {background-position:-300px -20px} +.o2k7Skin span.mce_media {background-position:-320px -20px} +.o2k7Skin span.mce_nonbreaking {background-position:-340px -20px} +.o2k7Skin span.mce_pastetext {background-position:-360px -20px} +.o2k7Skin span.mce_pasteword {background-position:-380px -20px} +.o2k7Skin span.mce_selectall {background-position:-400px -20px} +.o2k7Skin span.mce_preview {background-position:-420px -20px} +.o2k7Skin span.mce_print {background-position:-440px -20px} +.o2k7Skin span.mce_cancel {background-position:-460px -20px} +.o2k7Skin span.mce_save {background-position:-480px -20px} +.o2k7Skin span.mce_replace {background-position:-500px -20px} +.o2k7Skin span.mce_search {background-position:-520px -20px} +.o2k7Skin span.mce_styleprops {background-position:-560px -20px} +.o2k7Skin span.mce_table {background-position:-580px -20px} +.o2k7Skin span.mce_cell_props {background-position:-600px -20px} +.o2k7Skin span.mce_delete_table {background-position:-620px -20px} +.o2k7Skin span.mce_delete_col {background-position:-640px -20px} +.o2k7Skin span.mce_delete_row {background-position:-660px -20px} +.o2k7Skin span.mce_col_after {background-position:-680px -20px} +.o2k7Skin span.mce_col_before {background-position:-700px -20px} +.o2k7Skin span.mce_row_after {background-position:-720px -20px} +.o2k7Skin span.mce_row_before {background-position:-740px -20px} +.o2k7Skin span.mce_merge_cells {background-position:-760px -20px} +.o2k7Skin span.mce_table_props {background-position:-980px -20px} +.o2k7Skin span.mce_row_props {background-position:-780px -20px} +.o2k7Skin span.mce_split_cells {background-position:-800px -20px} +.o2k7Skin span.mce_template {background-position:-820px -20px} +.o2k7Skin span.mce_visualchars {background-position:-840px -20px} +.o2k7Skin span.mce_abbr {background-position:-860px -20px} +.o2k7Skin span.mce_acronym {background-position:-880px -20px} +.o2k7Skin span.mce_attribs {background-position:-900px -20px} +.o2k7Skin span.mce_cite {background-position:-920px -20px} +.o2k7Skin span.mce_del {background-position:-940px -20px} +.o2k7Skin span.mce_ins {background-position:-960px -20px} +.o2k7Skin span.mce_pagebreak {background-position:0 -40px} +.o2k7Skin span.mce_restoredraft {background-position:-20px -40px} +.o2k7Skin span.mce_spellchecker {background-position:-540px -20px} diff --git a/src/wp-includes/js/tinymce/themes/advanced/skins/o2k7/ui_black.css b/src/wp-includes/js/tinymce/themes/advanced/skins/o2k7/ui_black.css new file mode 100644 index 0000000..85812cd --- /dev/null +++ b/src/wp-includes/js/tinymce/themes/advanced/skins/o2k7/ui_black.css @@ -0,0 +1,8 @@ +/* Black */ +.o2k7SkinBlack .mceToolbar .mceToolbarStart span, .o2k7SkinBlack .mceToolbar .mceToolbarEnd span, .o2k7SkinBlack .mceButton, .o2k7SkinBlack .mceSplitButton, .o2k7SkinBlack .mceSeparator, .o2k7SkinBlack .mceSplitButton a.mceOpen, .o2k7SkinBlack .mceListBox a.mceOpen {background-image:url(img/button_bg_black.png)} +.o2k7SkinBlack td.mceToolbar, .o2k7SkinBlack td.mceStatusbar, .o2k7SkinBlack .mceMenuItemTitle a, .o2k7SkinBlack .mceMenuItemTitle span.mceText, .o2k7SkinBlack .mceStatusbar div, .o2k7SkinBlack .mceStatusbar span, .o2k7SkinBlack .mceStatusbar a {background:#535353; color:#FFF} +.o2k7SkinBlack table.mceListBoxEnabled .mceText, o2k7SkinBlack .mceListBox .mceText {background:#FFF; border:1px solid #CBCFD4; border-bottom-color:#989FA9; border-right:0} +.o2k7SkinBlack table.mceListBoxEnabled:hover .mceText, .o2k7SkinBlack .mceListBoxHover .mceText, .o2k7SkinBlack .mceListBoxSelected .mceText {background:#FFF; border:1px solid #FFBD69; border-right:0} +.o2k7SkinBlack .mceExternalToolbar, .o2k7SkinBlack .mceListBox .mceText, .o2k7SkinBlack div.mceMenu, .o2k7SkinBlack table.mceLayout, .o2k7SkinBlack .mceMenuItemTitle a, .o2k7SkinBlack table.mceLayout tr.mceFirst td, .o2k7SkinBlack table.mceLayout, .o2k7SkinBlack .mceMenuItemTitle a, .o2k7SkinBlack table.mceLayout tr.mceLast td, .o2k7SkinBlack .mceIframeContainer {border-color: #535353;} +.o2k7SkinBlack table.mceSplitButtonEnabled:hover a.mceAction, .o2k7SkinBlack .mceSplitButtonHover a.mceAction, .o2k7SkinBlack .mceSplitButtonSelected {background-image:url(img/button_bg_black.png)} +.o2k7SkinBlack .mceMenu .mceMenuItemEnabled a:hover, .o2k7SkinBlack .mceMenu .mceMenuItemActive {background-color:#FFE7A1} \ No newline at end of file diff --git a/src/wp-includes/js/tinymce/themes/advanced/skins/o2k7/ui_silver.css b/src/wp-includes/js/tinymce/themes/advanced/skins/o2k7/ui_silver.css new file mode 100644 index 0000000..d64c361 --- /dev/null +++ b/src/wp-includes/js/tinymce/themes/advanced/skins/o2k7/ui_silver.css @@ -0,0 +1,5 @@ +/* Silver */ +.o2k7SkinSilver .mceToolbar .mceToolbarStart span, .o2k7SkinSilver .mceButton, .o2k7SkinSilver .mceSplitButton, .o2k7SkinSilver .mceSeparator, .o2k7SkinSilver .mceSplitButton a.mceOpen, .o2k7SkinSilver .mceListBox a.mceOpen {background-image:url(img/button_bg_silver.png)} +.o2k7SkinSilver td.mceToolbar, .o2k7SkinSilver td.mceStatusbar, .o2k7SkinSilver .mceMenuItemTitle a {background:#eee} +.o2k7SkinSilver .mceListBox .mceText {background:#FFF} +.o2k7SkinSilver .mceExternalToolbar, .o2k7SkinSilver .mceListBox .mceText, .o2k7SkinSilver div.mceMenu, .o2k7SkinSilver table.mceLayout, .o2k7SkinSilver .mceMenuItemTitle a, .o2k7SkinSilver table.mceLayout tr.mceFirst td, .o2k7SkinSilver table.mceLayout, .o2k7SkinSilver .mceMenuItemTitle a, .o2k7SkinSilver table.mceLayout tr.mceLast td, .o2k7SkinSilver .mceIframeContainer {border-color: #bbb} diff --git a/src/wp-includes/js/tinymce/themes/advanced/skins/wp_theme/content.css b/src/wp-includes/js/tinymce/themes/advanced/skins/wp_theme/content.css new file mode 100644 index 0000000..0b7ec9f --- /dev/null +++ b/src/wp-includes/js/tinymce/themes/advanced/skins/wp_theme/content.css @@ -0,0 +1,96 @@ +body { + font: 13px/19px Georgia, "Times New Roman", "Bitstream Charter", Times, serif; + margin: 0.6em; + color: #000; +} +body.mceForceColors {background:#FFF; color:#000;} +body.mceBrowserDefaults {background:transparent; color:inherit; font-size:inherit; font-family:inherit;} +td {color:#000; font-family:Verdana, Arial, Helvetica, sans-serif; font-size:10px; margin:8px;} +h1 {font-size: 2em} +h2 {font-size: 1.5em} +h3 {font-size: 1.17em} +h4 {font-size: 1em} +h5 {font-size: .83em} +h6 {font-size: .75em} +.mceItemTable, .mceItemTable td, .mceItemTable th, .mceItemTable caption, .mceItemVisualAid {border: 1px dashed #BBB;} +a.mceItemAnchor {display:inline-block; width:11px !important; height:11px !important; background:url(img/items.gif) no-repeat 0 0;} +span.mceItemNbsp {background: #DDD} +td.mceSelected, th.mceSelected {background-color:#3399ff !important} +img {border:0;} +table {cursor:default} +table td, table th {cursor:text} +ins {border-bottom:1px solid green; text-decoration: none; color:green} +del {color:red; text-decoration:line-through} +cite {border-bottom:1px dashed blue} +acronym {border-bottom:1px dotted #CCC; cursor:help} +abbr {border-bottom:1px dashed #CCC; cursor:help} + +img:-moz-broken {-moz-force-broken-image-icon:1; width:24px; height:24px} +font[face=mceinline] {font-family:inherit !important} + +.mceItemMedia {border:1px dotted #cc0000; background-position:center; background-repeat:no-repeat; background-color:#ffffcc} +.mceItemShockWave {background-image:url(../../img/shockwave.gif)} +.mceItemFlash {background-image:url(../../img/flash.gif)} +.mceItemQuickTime {background-image:url(../../img/quicktime.gif)} +.mceItemWindowsMedia {background-image:url(../../img/windowsmedia.gif)} +.mceItemRealMedia {background-image:url(../../img/realmedia.gif)} +.mceItemVideo {background-image:url(../../img/video.gif)} +.mceItemIframe {background-image:url(../../img/iframe.gif)} +.mcePageBreak {display:block;border:0;width:100%;height:12px;border-top:1px dotted #ccc;margin-top:15px;background:#fff url(../../img/pagebreak.gif) no-repeat center top;} + +/* WordPress styles */ + +.aligncenter, +dl.aligncenter { + display: block; + margin-left: auto; + margin-right: auto; +} + +.alignleft { + float: left; +} + +.alignright { + float: right; +} + +.wp-caption { + border: 1px solid #ddd; + text-align: center; + background-color: #f3f3f3; + padding-top: 4px; + margin: 10px; + -moz-border-radius: 3px; + -khtml-border-radius: 3px; + -webkit-border-radius: 3px; + border-radius: 3px; +} + +.mceIEcenter { + text-align: center; +} + +.wp-caption img { + margin: 0; + padding: 0; + border: 0 none; +} + +.wp-caption-dd { + font-size: 11px; + line-height: 17px; + padding: 0 4px 5px; + margin: 0; +} + +pre { + font: 12px/18px Consolas, Monaco, monospace; +} + +td { + color: #000; + font-size: 11px; + margin: 8px; +} + diff --git a/src/wp-includes/js/tinymce/themes/advanced/skins/wp_theme/dialog.css b/src/wp-includes/js/tinymce/themes/advanced/skins/wp_theme/dialog.css new file mode 100644 index 0000000..7fe6b8d --- /dev/null +++ b/src/wp-includes/js/tinymce/themes/advanced/skins/wp_theme/dialog.css @@ -0,0 +1,117 @@ +/* Generic */ +body { +font-family:Verdana, Arial, Helvetica, sans-serif; font-size:11px; +background:#f1f1f1; +padding:0; +margin:8px 8px 0 8px; +} + +html {background:#f1f1f1;} +td {font-family:Verdana, Arial, Helvetica, sans-serif; font-size:10px;} +textarea {resize:none;outline:none;} +a:link, a:visited {color:black;} +a:hover {color:#2B6FB6;} +.nowrap {white-space: nowrap} + +/* Forms */ +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 { + border: 1px solid #bbb; + margin:0; + padding:0 0 1px; + font-weight:bold; + font-size: 11px; + width:94px; + height:24px; + background:url(img/fade-butt.png) 0 0; + color:#000; + cursor:pointer; + -moz-border-radius: 3px; + -khtml-border-radius: 3px; + -webkit-border-radius: 3px; + border-radius: 3px; +} +#insert:hover, #cancel:hover, input.mceButton:hover, .updateButton:hover, +#insert:focus, #cancel:focus, input.mceButton:focus, .updateButton:focus { + border: 1px solid #555; +} + +/* Browse */ +a.browse span {display:block; width:20px; height:18px; background:url(../../img/icons.gif) -860px 0; 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; -moz-opacity:0.3; opacity:0.3; filter:progid:DXImageTransform.Microsoft.Alpha(opacity=30);} +a.browse:hover span.disabled {border:1px solid white; background-color:transparent;} +a.pickcolor span {display:block; width:20px; height:16px; background:url(../../img/icons.gif) -840px 0; margin-left:2px;} +.mceOldBoxModel a.pickcolor span {width:21px; height:17px;} +a.pickcolor:hover span {background-color:#B2BBD0;} +a.pickcolor, a.browse {text-decoration:none} + +/* 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:18px; line-height:normal; background:url(img/tabs.gif) repeat-x 0 -72px;} +.tabs ul {margin:0; padding:0; list-style:none;} +.tabs li {float:left; background:url(img/tabs.gif) no-repeat 0 0; margin:0 2px 0 0; padding:0 0 0 10px; line-height:17px; height:18px; display:block;} +.tabs li.current {background:url(img/tabs.gif) no-repeat 0 -18px; margin-right:2px;} +.tabs span {float:left; display:block; background:url(img/tabs.gif) no-repeat right -36px; padding:0px 10px 0 0;} +.tabs .current span {background:url(img/tabs.gif) no-repeat right -54px;} +.tabs a {text-decoration:none; font-family:Verdana, Arial; font-size:10px;} +.tabs a:link, .tabs a:visited, .tabs a:hover {color:black;} + +/* 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 {float:right; width:50px; height:14px;line-height:1px; border:1px solid black; margin-left:5px;} +#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 #previewblock {float:right; padding-left:10px; height:20px;} +#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;} \ No newline at end of file diff --git a/src/wp-includes/js/tinymce/themes/advanced/skins/wp_theme/img/butt2.png b/src/wp-includes/js/tinymce/themes/advanced/skins/wp_theme/img/butt2.png new file mode 100644 index 0000000000000000000000000000000000000000..adb83cdbbff4a131ad3dcf553e739afc7f477881 GIT binary patch literal 212 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 R!Sp}^Mt9BhYjvGt{|88cricIl literal 0 HcmV?d00001 diff --git a/src/wp-includes/js/tinymce/themes/advanced/skins/wp_theme/img/down_arrow.gif b/src/wp-includes/js/tinymce/themes/advanced/skins/wp_theme/img/down_arrow.gif new file mode 100644 index 0000000000000000000000000000000000000000..687b241eec371858a6b084712623ee9e1f89e2c7 GIT binary patch literal 60 zcmZ?wbhEHb0r5dH3{1j3{VPwu<>#LvvLH)1)$$jA Jn-3#{H2|P`4%+|# literal 0 HcmV?d00001 diff --git a/src/wp-includes/js/tinymce/themes/advanced/skins/wp_theme/img/fade-butt.png b/src/wp-includes/js/tinymce/themes/advanced/skins/wp_theme/img/fade-butt.png new file mode 100644 index 0000000000000000000000000000000000000000..42f08b79942d32f9d7e693b6952c2d935e352774 GIT binary patch literal 785 zcmb`F-%C?r7{}lJa2&>jxy)rl9Mwn%LP*puyzuCjPMwJ95JKF>j+PKsXg_GsnhtD8 zh=^TCB+KZ+w1O@i>_T)@BanhF!iyL+Vms&T{MtEZJ7;Iq>;Dih&-?H^?}zX6eBpgE zG}u$CKdlD<)Vh0}!!XywXhAgaPSf^0Oxh{bg97mO^W~b@aosrU8k@a3GdX+De+L6- za3+9R-8cPH*f8b~KDeF6Iv|7(4UD)7Bq<02RVXNmg6H!LO&2+?R4U1`OcDggapiKE zFY+wIunf!d#VW*b2^}-T9V2H+?-(*rOF(SfEtt}NrEU;s|w4ql}aU_%l$QMw*#Qsc019L z`$qxet-2wzufeA~GdF29GQ(3k#HwpP=Tp5>sTUs~bbFp^79H8|jwMGn{Nu=E4WHV@ z<`Pj1OGKNZ!frxXz@l>r$fB|FiN4r)-$3m7_{6|c6Ou{+s8EME>s@=BuaUFM*eAr; zY2XyDLos!9uJm+8Ui3todx6%dF|QjeX0yfetkJS=SZ+O-Jgk9eC?1L*hC<0?DEZSH ziYJrFcpRuw8!vzFO2-wvIO)u`0SmbDZ3PihhCn+Q-Xj2f-scY3wf=tci0 Zqyhce4|i>ku8hL(3f!(i=T4U|@(=9Ekd*)c literal 0 HcmV?d00001 diff --git a/src/wp-includes/js/tinymce/themes/advanced/skins/wp_theme/img/separator.gif b/src/wp-includes/js/tinymce/themes/advanced/skins/wp_theme/img/separator.gif new file mode 100644 index 0000000000000000000000000000000000000000..4f39b809e98103422a7a8815d9e0ff23123034b5 GIT binary patch literal 57 zcmZ?wbhEHbWMU9un8?J?(9rN73>X*~6o0ZXGB7YP=m6P3N(4x7O<|q5`t188u7e^B F)&TE55J&(3 literal 0 HcmV?d00001 diff --git a/src/wp-includes/js/tinymce/themes/advanced/skins/wp_theme/img/tabs.gif b/src/wp-includes/js/tinymce/themes/advanced/skins/wp_theme/img/tabs.gif new file mode 100644 index 0000000000000000000000000000000000000000..ce4be63558b02e9837b995d2b9dd540ce6d61a6f GIT binary patch literal 1326 zcmV+}1=0FPNk%w1VJrb!0M!5h00030|Ns2_{xV8plA^M<#LbbXwB+gR>o1FUl`^eGF(ALoK@apvR@ALES^78HR@$B&M>-P5Y_4V=e^zifZ@AC5Q z@$v2U_Ve}i^85Sw`1tnr_VoSz{QUg;`uh3!`1kSe-|p?^>+0k0?&$36oE*q;kn@I-k&}bV{vSuh^^>3n?4| z;IMd1E}PHjw0g~MyWjA*d`_>=7l@jE&+q&HfPsR8goTEOh>41ejE#(BTJr4xw7TUm@OOFuz`c;&!9t#9!C>oFt6t5zwd>cgW6Pc$+rZ!o zxO3~?&AYen-@tNG7S|k~SJ3z>`o$Ddm(@N@>THSZ1l^mRxq}B^ypwDdw0~ zere{JXr`&=nrnnf=9^WrDd(JY)@f%NZo;W2ly~;&=bwOLndhE*25RV`h$b4qpoG4u z=%bKEiYB9tjw$J-m}V*mrIp61>8GHE8V0AGPATfCs76X^sZplt>Z^dR%IcG_)@rMq zvd((zuDp7gE33T*D{LLV&T8zj$R?}ovdlK?EUU#nEA6z@R%`9G*b0Edw%m5>?YH2D zEAF`DmTT_0=%%ax?z-%@>+ZYox~sqgCd6y+z4+#<@4o!@>u8O)@dg`oiyn5@f zOZ + + {#advanced_dlg.code_title} + + + + +
    +
    + +
    + +
    + +
    + + + +
    +
    + +
    + +
    + +
    +
    +
    + + diff --git a/src/wp-includes/js/tinymce/tiny_mce.js b/src/wp-includes/js/tinymce/tiny_mce.js new file mode 100644 index 0000000..d3871e2 --- /dev/null +++ b/src/wp-includes/js/tinymce/tiny_mce.js @@ -0,0 +1 @@ +(function(d){var a=/^\s*|\s*$/g,e,c="B".replace(/A(.)|B/,"$1")==="$1";var b={majorVersion:"3",minorVersion:"4.2",releaseDate:"2011-04-07",_init:function(){var s=this,q=document,o=navigator,g=o.userAgent,m,f,l,k,j,r;s.isOpera=d.opera&&opera.buildNumber;s.isWebKit=/WebKit/.test(g);s.isIE=!s.isWebKit&&!s.isOpera&&(/MSIE/gi).test(g)&&(/Explorer/gi).test(o.appName);s.isIE6=s.isIE&&/MSIE [56]/.test(g);s.isGecko=!s.isWebKit&&/Gecko/.test(g);s.isMac=g.indexOf("Mac")!=-1;s.isAir=/adobeair/i.test(g);s.isIDevice=/(iPad|iPhone)/.test(g);if(d.tinyMCEPreInit){s.suffix=tinyMCEPreInit.suffix;s.baseURL=tinyMCEPreInit.base;s.query=tinyMCEPreInit.query;return}s.suffix="";f=q.getElementsByTagName("base");for(m=0;m=c.length){for(e=0,b=g.length;e=c.length||g[e]!=c[e]){f=e+1;break}}}if(g.length=g.length||g[e]!=c[e]){f=e+1;break}}}if(f==1){return h}for(e=0,b=g.length-(f-1);e=0;c--){if(f[c].length==0||f[c]=="."){continue}if(f[c]==".."){b++;continue}if(b>0){b--;continue}h.push(f[c])}c=e.length-b;if(c<=0){g=h.reverse().join("/")}else{g=e.slice(0,c).join("/")+"/"+h.reverse().join("/")}if(g.indexOf("/")!==0){g="/"+g}if(d&&g.lastIndexOf("/")!==g.length-1){g+=d}return g},getURI:function(d){var c,b=this;if(!b.source||d){c="";if(!d){if(b.protocol){c+=b.protocol+"://"}if(b.userInfo){c+=b.userInfo+"@"}if(b.host){c+=b.host}if(b.port){c+=":"+b.port}}if(b.path){c+=b.path}if(b.query){c+="?"+b.query}if(b.anchor){c+="#"+b.anchor}b.source=c}return b.source}})})();(function(){var a=tinymce.each;tinymce.create("static tinymce.util.Cookie",{getHash:function(d){var b=this.get(d),c;if(b){a(b.split("&"),function(e){e=e.split("=");c=c||{};c[unescape(e[0])]=unescape(e[1])})}return c},setHash:function(j,b,g,f,i,c){var h="";a(b,function(e,d){h+=(!h?"":"&")+escape(d)+"="+escape(e)});this.set(j,h,g,f,i,c)},get:function(i){var h=document.cookie,g,f=i+"=",d;if(!h){return}d=h.indexOf("; "+f);if(d==-1){d=h.indexOf(f);if(d!=0){return null}}else{d+=2}g=h.indexOf(";",d);if(g==-1){g=h.length}return unescape(h.substring(d+f.length,g))},set:function(i,b,g,f,h,c){document.cookie=i+"="+escape(b)+((g)?"; expires="+g.toGMTString():"")+((f)?"; path="+escape(f):"")+((h)?"; domain="+h:"")+((c)?"; secure":"")},remove:function(e,b){var c=new Date();c.setTime(c.getTime()-1000);this.set(e,"",c,b,c)}})})();(function(){function serialize(o,quote){var i,v,t;quote=quote||'"';if(o==null){return"null"}t=typeof o;if(t=="string"){v="\bb\tt\nn\ff\rr\"\"''\\\\";return quote+o.replace(/([\u0080-\uFFFF\x00-\x1f\"\'\\])/g,function(a,b){if(quote==='"'&&a==="'"){return a}i=v.indexOf(b);if(i+1){return"\\"+v.charAt(i+1)}a=b.charCodeAt().toString(16);return"\\u"+"0000".substring(a.length)+a})+quote}if(t=="object"){if(o.hasOwnProperty&&o instanceof Array){for(i=0,v="[";i0?",":"")+serialize(o[i],quote)}return v+"]"}v="{";for(i in o){v+=typeof o[i]!="function"?(v.length>1?","+quote:quote)+i+quote+":"+serialize(o[i],quote):""}return v+"}"}return""+o}tinymce.util.JSON={serialize:serialize,parse:function(s){try{return eval("("+s+")")}catch(ex){}}}})();tinymce.create("static tinymce.util.XHR",{send:function(g){var a,e,b=window,h=0;g.scope=g.scope||this;g.success_scope=g.success_scope||g.scope;g.error_scope=g.error_scope||g.scope;g.async=g.async===false?false:true;g.data=g.data||"";function d(i){a=0;try{a=new ActiveXObject(i)}catch(c){}return a}a=b.XMLHttpRequest?new XMLHttpRequest():d("Microsoft.XMLHTTP")||d("Msxml2.XMLHTTP");if(a){if(a.overrideMimeType){a.overrideMimeType(g.content_type)}a.open(g.type||(g.data?"POST":"GET"),g.url,g.async);if(g.content_type){a.setRequestHeader("Content-Type",g.content_type)}a.setRequestHeader("X-Requested-With","XMLHttpRequest");a.send(g.data);function f(){if(!g.async||a.readyState==4||h++>10000){if(g.success&&h<10000&&a.status==200){g.success.call(g.success_scope,""+a.responseText,a,g)}else{if(g.error){g.error.call(g.error_scope,h>10000?"TIMED_OUT":"GENERAL",a,g)}}a=null}else{b.setTimeout(f,10)}}if(!g.async){return f()}e=b.setTimeout(f,10)}}});(function(){var c=tinymce.extend,b=tinymce.util.JSON,a=tinymce.util.XHR;tinymce.create("tinymce.util.JSONRequest",{JSONRequest:function(d){this.settings=c({},d);this.count=0},send:function(f){var e=f.error,d=f.success;f=c(this.settings,f);f.success=function(h,g){h=b.parse(h);if(typeof(h)=="undefined"){h={error:"JSON Parse error."}}if(h.error){e.call(f.error_scope||f.scope,h.error,g)}else{d.call(f.success_scope||f.scope,h.result)}};f.error=function(h,g){if(e){e.call(f.error_scope||f.scope,h,g)}};f.data=b.serialize({id:f.id||"c"+(this.count++),method:f.method,params:f.params});f.content_type="application/json";a.send(f)},"static":{sendRPC:function(d){return new tinymce.util.JSONRequest().send(d)}}})}());(function(j){var a,g,d,k=/[&\"\u007E-\uD7FF]|[\uD800-\uDBFF][\uDC00-\uDFFF]/g,b=/[<>&\u007E-\uD7FF]|[\uD800-\uDBFF][\uDC00-\uDFFF]/g,f=/[<>&\"\']/g,c=/&(#)?([\w]+);/g,i={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"};g={'"':""","'":"'","<":"<",">":">","&":"&"};d={"<":"<",">":">","&":"&",""":'"',"'":"'"};function h(l){var m;m=document.createElement("div");m.innerHTML=l;return m.textContent||m.innerText||l}function e(m,p){var n,o,l,q={};if(m){m=m.split(",");p=p||10;for(n=0;n1){return"&#"+(((n.charCodeAt(0)-55296)*1024)+(n.charCodeAt(1)-56320)+65536)+";"}return g[n]||"&#"+n.charCodeAt(0)+";"})},encodeNamed:function(n,l,m){m=m||a;return n.replace(l?k:b,function(o){return g[o]||m[o]||o})},getEncodeFunc:function(l,o){var p=j.html.Entities;o=e(o)||a;function m(r,q){return r.replace(q?k:b,function(s){return g[s]||o[s]||"&#"+s.charCodeAt(0)+";"||s})}function n(r,q){return p.encodeNamed(r,q,o)}l=j.makeMap(l.replace(/\+/g,","));if(l.named&&l.numeric){return m}if(l.named){if(o){return n}return p.encodeNamed}if(l.numeric){return p.encodeNumeric}return p.encodeRaw},decode:function(l){return l.replace(c,function(n,m,o){if(m){o=parseInt(o,10);if(o>65535){o-=65536;return String.fromCharCode(55296+(o>>10),56320+(o&1023))}else{return i[o]||String.fromCharCode(o)}}return d[n]||a[n]||h(n)})}}})(tinymce);tinymce.html.Styles=function(d,f){var k=/rgb\s*\(\s*([0-9]+)\s*,\s*([0-9]+)\s*,\s*([0-9]+)\s*\)/gi,h=/(?:url(?:(?:\(\s*\"([^\"]+)\"\s*\))|(?:\(\s*\'([^\']+)\'\s*\))|(?:\(\s*([^)\s]+)\s*\))))|(?:\'([^\']+)\')|(?:\"([^\"]+)\")/gi,b=/\s*([^:]+):\s*([^;]+);?/g,l=/\s+$/,m=/rgb/,e,g,a={},j;d=d||{};j="\\\" \\' \\; \\: ; : _".split(" ");for(g=0;g1?r:"0"+r}return"#"+o(q)+o(p)+o(i)}return{toHex:function(i){return i.replace(k,c)},parse:function(r){var y={},p,n,v,q,u=d.url_converter,x=d.url_converter_scope||this;function o(C,F){var E,B,A,D;E=y[C+"-top"+F];if(!E){return}B=y[C+"-right"+F];if(E!=B){return}A=y[C+"-bottom"+F];if(B!=A){return}D=y[C+"-left"+F];if(A!=D){return}y[C+F]=D;delete y[C+"-top"+F];delete y[C+"-right"+F];delete y[C+"-bottom"+F];delete y[C+"-left"+F]}function t(B){var C=y[B],A;if(!C||C.indexOf(" ")<0){return}C=C.split(" ");A=C.length;while(A--){if(C[A]!==C[0]){return false}}y[B]=C[0];return true}function z(C,B,A,D){if(!t(B)){return}if(!t(A)){return}if(!t(D)){return}y[C]=y[B]+" "+y[A]+" "+y[D];delete y[B];delete y[A];delete y[D]}function s(A){q=true;return a[A]}function i(B,A){if(q){B=B.replace(/_[0-9]/g,function(C){return a[C]})}if(!A){B=B.replace(/\\([\'\";:])/g,"$1")}return B}if(r){r=r.replace(/\\[\"\';:_]/g,s).replace(/\"[^\"]+\"|\'[^\']+\'/g,function(A){return A.replace(/[;:]/g,s)});while(p=b.exec(r)){n=p[1].replace(l,"").toLowerCase();v=p[2].replace(l,"");if(n&&v.length>0){if(n==="font-weight"&&v==="700"){v="bold"}else{if(n==="color"||n==="background-color"){v=v.toLowerCase()}}v=v.replace(k,c);v=v.replace(h,function(B,A,E,D,F,C){F=F||C;if(F){F=i(F);return"'"+F.replace(/\'/g,"\\'")+"'"}A=i(A||E||D);if(u){A=u.call(x,A,"style")}return"url('"+A.replace(/\'/g,"\\'")+"')"});y[n]=q?i(v,true):v}b.lastIndex=p.index+p[0].length}o("border","");o("border","-width");o("border","-color");o("border","-style");o("padding","");o("margin","");z("border","border-width","border-style","border-color");if(y.border==="medium none"){delete y.border}}return y},serialize:function(p,r){var o="",n,q;function i(t){var x,u,s,t,v;x=f.styles[t];if(x){for(u=0,s=x.length;u0){o+=(o.length>0?" ":"")+t+": "+v+";"}}}}if(r&&f&&f.styles){i("*");i(n)}else{for(n in p){q=p[n];if(q!==e&&q.length>0){o+=(o.length>0?" ":"")+n+": "+q+";"}}}return o}}};(function(l){var g={},i,k,f,d,b,e,c=l.makeMap,j=l.each;function h(n,m){return n.split(m||",")}function a(q,p){var n,o={};function m(r){return r.replace(/[A-Z]+/g,function(s){return m(q[s])})}for(n in q){if(q.hasOwnProperty(n)){q[n]=m(q[n])}}m(p).replace(/#/g,"#text").replace(/(\w+)\[([^\]]+)\]\[([^\]]*)\]/g,function(u,s,r,t){r=h(r,"|");o[s]={attributes:c(r),attributesOrder:r,children:c(t,"|",{"#comment":{}})}});return o}k="h1,h2,h3,h4,h5,h6,hr,p,div,address,pre,form,table,tbody,thead,tfoot,th,tr,td,li,ol,ul,caption,blockquote,center,dl,dt,dd,dir,fieldset,noscript,menu,isindex,samp,header,footer,article,section,hgroup";k=c(k,",",c(k.toUpperCase()));g=a({Z:"H|K|N|O|P",Y:"X|form|R|Q",ZG:"E|span|width|align|char|charoff|valign",X:"p|T|div|U|W|isindex|fieldset|table",ZF:"E|align|char|charoff|valign",W:"pre|hr|blockquote|address|center|noframes",ZE:"abbr|axis|headers|scope|rowspan|colspan|align|char|charoff|valign|nowrap|bgcolor|width|height",ZD:"[E][S]",U:"ul|ol|dl|menu|dir",ZC:"p|Y|div|U|W|table|br|span|bdo|object|applet|img|map|K|N|Q",T:"h1|h2|h3|h4|h5|h6",ZB:"X|S|Q",S:"R|P",ZA:"a|G|J|M|O|P",R:"a|H|K|N|O",Q:"noscript|P",P:"ins|del|script",O:"input|select|textarea|label|button",N:"M|L",M:"em|strong|dfn|code|q|samp|kbd|var|cite|abbr|acronym",L:"sub|sup",K:"J|I",J:"tt|i|b|u|s|strike",I:"big|small|font|basefont",H:"G|F",G:"br|span|bdo",F:"object|applet|img|map|iframe",E:"A|B|C",D:"accesskey|tabindex|onfocus|onblur",C:"onclick|ondblclick|onmousedown|onmouseup|onmouseover|onmousemove|onmouseout|onkeypress|onkeydown|onkeyup",B:"lang|xml:lang|dir",A:"id|class|style|title"},"script[id|charset|type|language|src|defer|xml:space][]style[B|id|type|media|title|xml:space][]object[E|declare|classid|codebase|data|type|codetype|archive|standby|width|height|usemap|name|tabindex|align|border|hspace|vspace][#|param|Y]param[id|name|value|valuetype|type][]p[E|align][#|S]a[E|D|charset|type|name|href|hreflang|rel|rev|shape|coords|target][#|Z]br[A|clear][]span[E][#|S]bdo[A|C|B][#|S]applet[A|codebase|archive|code|object|alt|name|width|height|align|hspace|vspace][#|param|Y]h1[E|align][#|S]img[E|src|alt|name|longdesc|width|height|usemap|ismap|align|border|hspace|vspace][]map[B|C|A|name][X|form|Q|area]h2[E|align][#|S]iframe[A|longdesc|name|src|frameborder|marginwidth|marginheight|scrolling|align|width|height][#|Y]h3[E|align][#|S]tt[E][#|S]i[E][#|S]b[E][#|S]u[E][#|S]s[E][#|S]strike[E][#|S]big[E][#|S]small[E][#|S]font[A|B|size|color|face][#|S]basefont[id|size|color|face][]em[E][#|S]strong[E][#|S]dfn[E][#|S]code[E][#|S]q[E|cite][#|S]samp[E][#|S]kbd[E][#|S]var[E][#|S]cite[E][#|S]abbr[E][#|S]acronym[E][#|S]sub[E][#|S]sup[E][#|S]input[E|D|type|name|value|checked|disabled|readonly|size|maxlength|src|alt|usemap|onselect|onchange|accept|align][]select[E|name|size|multiple|disabled|tabindex|onfocus|onblur|onchange][optgroup|option]optgroup[E|disabled|label][option]option[E|selected|disabled|label|value][]textarea[E|D|name|rows|cols|disabled|readonly|onselect|onchange][]label[E|for|accesskey|onfocus|onblur][#|S]button[E|D|name|value|type|disabled][#|p|T|div|U|W|table|G|object|applet|img|map|K|N|Q]h4[E|align][#|S]ins[E|cite|datetime][#|Y]h5[E|align][#|S]del[E|cite|datetime][#|Y]h6[E|align][#|S]div[E|align][#|Y]ul[E|type|compact][li]li[E|type|value][#|Y]ol[E|type|compact|start][li]dl[E|compact][dt|dd]dt[E][#|S]dd[E][#|Y]menu[E|compact][li]dir[E|compact][li]pre[E|width|xml:space][#|ZA]hr[E|align|noshade|size|width][]blockquote[E|cite][#|Y]address[E][#|S|p]center[E][#|Y]noframes[E][#|Y]isindex[A|B|prompt][]fieldset[E][#|legend|Y]legend[E|accesskey|align][#|S]table[E|summary|width|border|frame|rules|cellspacing|cellpadding|align|bgcolor][caption|col|colgroup|thead|tfoot|tbody|tr]caption[E|align][#|S]col[ZG][]colgroup[ZG][col]thead[ZF][tr]tr[ZF|bgcolor][th|td]th[E|ZE][#|Y]form[E|action|method|name|enctype|onsubmit|onreset|accept|accept-charset|target][#|X|R|Q]noscript[E][#|Y]td[E|ZE][#|Y]tfoot[ZF][tr]tbody[ZF][tr]area[E|D|shape|coords|href|nohref|alt|target][]base[id|href|target][]body[E|onload|onunload|background|bgcolor|text|link|vlink|alink][#|Y]");i=c("checked,compact,declare,defer,disabled,ismap,multiple,nohref,noresize,noshade,nowrap,readonly,selected,preload,autoplay,loop,controls");f=c("area,base,basefont,br,col,frame,hr,img,input,isindex,link,meta,param,embed,source");d=l.extend(c("td,th,iframe,video,object"),f);b=c("pre,script,style");e=c("colgroup,dd,dt,li,options,p,td,tfoot,th,thead,tr");l.html.Schema=function(p){var x=this,m={},n={},u=[],o;p=p||{};if(p.verify_html===false){p.valid_elements="*[*]"}if(p.valid_styles){o={};j(p.valid_styles,function(z,y){o[y]=l.explode(z)})}function v(y){return new RegExp("^"+y.replace(/([?+*])/g,".$1")+"$")}function r(F){var E,A,T,P,U,z,C,O,R,K,S,W,I,D,Q,y,M,B,V,X,J,N,H=/^([#+-])?([^\[\/]+)(?:\/([^\[]+))?(?:\[([^\]]+)\])?$/,L=/^([!\-])?(\w+::\w+|[^=:<]+)?(?:([=:<])(.*))?$/,G=/[*?+]/;if(F){F=h(F);if(m["@"]){M=m["@"].attributes;B=m["@"].attributesOrder}for(E=0,A=F.length;E=0){for(P=l.length-1;P>=Q;P--){O=l[P];if(O.valid){A.end(O.name)}}l.length=Q}}D=new RegExp("<(?:(?:!--([\\w\\W]*?)-->)|(?:!\\[CDATA\\[([\\w\\W]*?)\\]\\]>)|(?:!DOCTYPE([\\w\\W]*?)>)|(?:\\?([^\\s\\/<>]+) ?([\\w\\W]*?)[?/]>)|(?:\\/([^>]+)>)|(?:([^\\s\\/<>]+)\\s*((?:[^\"'>]+(?:(?:\"[^\"]*\")|(?:'[^']*')|[^>]*))*)>))","g");h=/([\w:\-]+)(?:\s*=\s*(?:(?:\"((?:\\.|[^\"])*)\")|(?:\'((?:\\.|[^\'])*)\')|([^>\s]+)))?/g;g={script:/<\/script[^>]*>/gi,style:/<\/style[^>]*>/gi,noscript:/<\/noscript[^>]*>/gi};F=e.getShortEndedElements();z=e.getSelfClosingElements();k=e.getBoolAttrs();x=c.validate;y=c.fix_self_closing;while(f=D.exec(q)){if(m0&&l[l.length-1].name===G){C(G)}if(!x||(I=e.getElementRule(G))){r=true;if(x){J=I.attributes;n=I.attributePatterns}if(o=f[8]){B=[];B.map={};o.replace(h,function(P,O,T,S,R){var U,Q;O=O.toLowerCase();T=O in k?O:v(T||S||R||"");if(x&&O.indexOf("data-")!==0){U=J[O];if(!U&&n){Q=n.length;while(Q--){U=n[Q];if(U.pattern.test(O)){break}}if(Q===-1){U=null}}if(!U){return}if(U.validValues&&!(T in U.validValues)){return}}B.map[O]=T;B.push({name:O,value:T})})}else{B=[];B.map={}}if(x){H=I.attributesRequired;M=I.attributesDefault;L=I.attributesForced;if(L){K=L.length;while(K--){E=L[K];N=E.name;u=E.value;if(u==="{$uid}"){u="mce_"+s++}B.map[N]=u;B.push({name:N,value:u})}}if(M){K=M.length;while(K--){E=M[K];N=E.name;if(!(N in B.map)){u=E.value;if(u==="{$uid}"){u="mce_"+s++}B.map[N]=u;B.push({name:N,value:u})}}}if(H){K=H.length;while(K--){if(H[K] in B.map){break}}if(K===-1){r=false}}if(B.map["data-mce-bogus"]){r=false}}if(r){A.start(G,B,p)}}else{r=false}if(j=g[G]){j.lastIndex=m=f.index+f[0].length;if(f=j.exec(q)){if(r){t=q.substr(m,f.index-m)}m=f.index+f[0].length}else{t=q.substr(m);m=q.length}if(r&&t.length>0){A.text(t,true)}if(r){A.end(G)}D.lastIndex=m;continue}if(!p){if(!o||o.indexOf("/")!=o.length-1){l.push({name:G,valid:r})}else{if(r){A.end(G)}}}}else{if(G=f[1]){A.comment(G)}else{if(G=f[2]){A.cdata(G)}else{if(G=f[3]){A.doctype(G)}else{if(G=f[4]){A.pi(G,f[5])}}}}}}m=f.index+f[0].length}if(m=0;K--){G=l[K];if(G.valid){A.end(G.name)}}}}})(tinymce);(function(d){var c=/^[ \t\r\n]*$/,e={"#text":3,"#comment":8,"#cdata":4,"#pi":7,"#doctype":10,"#document-fragment":11};function a(k,l,j){var i,h,f=j?"lastChild":"firstChild",g=j?"prev":"next";if(k[f]){return k[f]}if(k!==l){i=k[g];if(i){return i}for(h=k.parent;h&&h!==l;h=h.parent){i=h[g];if(i){return i}}}}function b(f,g){this.name=f;this.type=g;if(g===1){this.attributes=[];this.attributes.map={}}}d.extend(b.prototype,{replace:function(g){var f=this;if(g.parent){g.remove()}f.insert(g,f);f.remove();return f},attr:function(h,l){var f=this,g,j,k;if(typeof h!=="string"){for(j in h){f.attr(j,h[j])}return f}if(g=f.attributes){if(l!==k){if(l===null){if(h in g.map){delete g.map[h];j=g.length;while(j--){if(g[j].name===h){g=g.splice(j,1);return f}}}return f}if(h in g.map){j=g.length;while(j--){if(g[j].name===h){g[j].value=l;break}}}else{g.push({name:h,value:l})}g.map[h]=l;return f}else{return g.map[h]}}},clone:function(){var g=this,n=new b(g.name,g.type),h,f,m,j,k;if(m=g.attributes){k=[];k.map={};for(h=0,f=m.length;h1){v.reverse();z=n=f.filterNode(v[0].clone());for(t=0;t0){L.value=l;L=L.prev}else{J=L.prev;L.remove();L=J}}}n=new b.html.SaxParser({validate:x,fix_self_closing:!x,cdata:function(l){z.append(G("#cdata",4)).value=l},text:function(K,l){var J;if(!r[z.name]){K=K.replace(k," ");if(z.lastChild&&o[z.lastChild.name]){K=K.replace(C,"")}}if(K.length!==0){J=G("#text",3);J.raw=!!l;z.append(J).value=K}},comment:function(l){z.append(G("#comment",8)).value=l},pi:function(l,J){z.append(G(l,7)).value=J;E(z)},doctype:function(J){var l;l=z.append(G("#doctype",10));l.value=J;E(z)},start:function(l,R,K){var P,M,L,J,N,S,Q,O;L=x?h.getElementRule(l):{};if(L){P=G(L.outputName||l,1);P.attributes=R;P.shortEnded=K;z.append(P);O=p[z.name];if(O&&p[P.name]&&!O[P.name]){H.push(P)}M=d.length;while(M--){N=d[M].name;if(N in R.map){D=c[N];if(D){D.push(P)}else{c[N]=[P]}}}if(o[l]){E(P)}if(!K){z=P}}},end:function(l){var N,K,M,J,L;K=x?h.getElementRule(l):{};if(K){if(o[l]){if(!r[z.name]){for(N=z.firstChild;N&&N.type===3;){M=N.value.replace(C,"");if(M.length>0){N.value=M;N=N.next}else{J=N.next;N.remove();N=J}}for(N=z.lastChild;N&&N.type===3;){M=N.value.replace(s,"");if(M.length>0){N.value=M;N=N.prev}else{J=N.prev;N.remove();N=J}}}N=z.prev;if(N&&N.type===3){M=N.value.replace(C,"");if(M.length>0){N.value=M}else{N.remove()}}}if(K.removeEmpty||K.paddEmpty){if(z.isEmpty(t)){if(K.paddEmpty){z.empty().append(new a("#text","3")).value="\u00a0"}else{if(!z.attributes.map.name){L=z.parent;z.empty().remove();z=L;return}}}}z=z.parent}}},h);F=z=new a(g.root_name,11);n.parse(u);if(x){j(H)}for(I in i){D=e[I];y=i[I];v=y.length;while(v--){if(!y[v].parent){y.splice(v,1)}}for(B=0,A=D.length;B0){o=c[c.length-1];if(o.length>0&&o!=="\n"){c.push("\n")}}c.push("<",m);if(k){for(n=0,j=k.length;n0){o=c[c.length-1];if(o.length>0&&o!=="\n"){c.push("\n")}}},end:function(h){var i;c.push("");if(a&&d[h]&&c.length>0){i=c[c.length-1];if(i.length>0&&i!=="\n"){c.push("\n")}}},text:function(i,h){if(i.length>0){c[c.length]=h?i:f(i)}},cdata:function(h){c.push("")},comment:function(h){c.push("")},pi:function(h,i){if(i){c.push("")}else{c.push("")}if(a){c.push("\n")}},doctype:function(h){c.push("",a?"\n":"")},reset:function(){c.length=0},getContent:function(){return c.join("").replace(/\n$/,"")}}};(function(a){a.html.Serializer=function(c,d){var b=this,e=new a.html.Writer(c);c=c||{};c.validate="validate" in c?c.validate:true;b.schema=d=d||new a.html.Schema();b.writer=e;b.serialize=function(h){var g,i;i=c.validate;g={3:function(k,j){e.text(k.value,k.raw)},8:function(j){e.comment(j.value)},7:function(j){e.pi(j.name,j.value)},10:function(j){e.doctype(j.value)},4:function(j){e.cdata(j.value)},11:function(j){if((j=j.firstChild)){do{f(j)}while(j=j.next)}}};e.reset();function f(k){var t=g[k.type],j,o,s,r,p,u,n,m,q;if(!t){j=k.name;o=k.shortEnded;s=k.attributes;if(i&&s&&s.length>1){u=[];u.map={};q=d.getElementRule(k.name);for(n=0,m=q.attributesOrder.length;n=8;k.boxModel=!h.isIE||n.compatMode=="CSS1Compat"||k.stdMode;k.hasOuterHTML="outerHTML" in n.createElement("a");k.settings=l=h.extend({keep_values:false,hex_colors:1},l);k.schema=l.schema;k.styles=new h.html.Styles({url_converter:l.url_converter,url_converter_scope:l.url_converter_scope},l.schema);if(h.isIE6){try{n.execCommand("BackgroundImageCache",false,true)}catch(m){k.cssFlicker=true}}if(b){("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(o){n.createElement(o)})}h.addUnload(k.destroy,k)},getRoot:function(){var j=this,k=j.settings;return(k&&j.get(k.root_element))||j.doc.body},getViewPort:function(k){var l,j;k=!k?this.win:k;l=k.document;j=this.boxModel?l.documentElement:l.body;return{x:k.pageXOffset||j.scrollLeft,y:k.pageYOffset||j.scrollTop,w:k.innerWidth||j.clientWidth,h:k.innerHeight||j.clientHeight}},getRect:function(m){var l,j=this,k;m=j.get(m);l=j.getPos(m);k=j.getSize(m);return{x:l.x,y:l.y,w:k.w,h:k.h}},getSize:function(m){var k=this,j,l;m=k.get(m);j=k.getStyle(m,"width");l=k.getStyle(m,"height");if(j.indexOf("px")===-1){j=0}if(l.indexOf("px")===-1){l=0}return{w:parseInt(j)||m.offsetWidth||m.clientWidth,h:parseInt(l)||m.offsetHeight||m.clientHeight}},getParent:function(l,k,j){return this.getParents(l,k,j,false)},getParents:function(u,p,l,s){var k=this,j,m=k.settings,q=[];u=k.get(u);s=s===undefined;if(m.strict_root){l=l||k.getRoot()}if(e(p,"string")){j=p;if(p==="*"){p=function(o){return o.nodeType==1}}else{p=function(o){return k.is(o,j)}}}while(u){if(u==l||!u.nodeType||u.nodeType===9){break}if(!p||p(u)){if(s){q.push(u)}else{return u}}u=u.parentNode}return s?q:null},get:function(j){var k;if(j&&this.doc&&typeof(j)=="string"){k=j;j=this.doc.getElementById(j);if(j&&j.id!==k){return this.doc.getElementsByName(k)[1]}}return j},getNext:function(k,j){return this._findSib(k,j,"nextSibling")},getPrev:function(k,j){return this._findSib(k,j,"previousSibling")},select:function(l,k){var j=this;return h.dom.Sizzle(l,j.get(k)||j.get(j.settings.root_element)||j.doc,[])},is:function(l,j){var k;if(l.length===undefined){if(j==="*"){return l.nodeType==1}if(a.test(j)){j=j.toLowerCase().split(/,/);l=l.nodeName.toLowerCase();for(k=j.length-1;k>=0;k--){if(j[k]==l){return true}}return false}}return h.dom.Sizzle.matches(j,l.nodeType?[l]:l).length>0},add:function(m,q,j,l,o){var k=this;return this.run(m,function(s){var r,n;r=e(q,"string")?k.doc.createElement(q):q;k.setAttribs(r,j);if(l){if(l.nodeType){r.appendChild(l)}else{k.setHTML(r,l)}}return !o?s.appendChild(r):r})},create:function(l,j,k){return this.add(this.doc.createElement(l),l,j,k,1)},createHTML:function(r,j,p){var q="",m=this,l;q+="<"+r;for(l in j){if(j.hasOwnProperty(l)){q+=" "+l+'="'+m.encode(j[l])+'"'}}if(typeof(p)!="undefined"){return q+">"+p+""}return q+" />"},remove:function(j,k){return this.run(j,function(m){var n,l=m.parentNode;if(!l){return null}if(k){while(n=m.firstChild){if(!h.isIE||n.nodeType!==3||n.nodeValue){l.insertBefore(n,m)}else{m.removeChild(n)}}}return l.removeChild(m)})},setStyle:function(m,j,k){var l=this;return l.run(m,function(p){var o,n;o=p.style;j=j.replace(/-(\D)/g,function(r,q){return q.toUpperCase()});if(l.pixelStyles.test(j)&&(h.is(k,"number")||/^[\-0-9\.]+$/.test(k))){k+="px"}switch(j){case"opacity":if(b){o.filter=k===""?"":"alpha(opacity="+(k*100)+")";if(!m.currentStyle||!m.currentStyle.hasLayout){o.display="inline-block"}}o[j]=o["-moz-opacity"]=o["-khtml-opacity"]=k||"";break;case"float":b?o.styleFloat=k:o.cssFloat=k;break;default:o[j]=k||""}if(l.settings.update_styles){l.setAttrib(p,"data-mce-style")}})},getStyle:function(m,j,l){m=this.get(m);if(!m){return}if(this.doc.defaultView&&l){j=j.replace(/[A-Z]/g,function(n){return"-"+n});try{return this.doc.defaultView.getComputedStyle(m,null).getPropertyValue(j)}catch(k){return null}}j=j.replace(/-(\D)/g,function(o,n){return n.toUpperCase()});if(j=="float"){j=b?"styleFloat":"cssFloat"}if(m.currentStyle&&l){return m.currentStyle[j]}return m.style?m.style[j]:undefined},setStyles:function(m,n){var k=this,l=k.settings,j;j=l.update_styles;l.update_styles=0;f(n,function(o,p){k.setStyle(m,p,o)});l.update_styles=j;if(l.update_styles){k.setAttrib(m,l.cssText)}},removeAllAttribs:function(j){return this.run(j,function(m){var l,k=m.attributes;for(l=k.length-1;l>=0;l--){m.removeAttributeNode(k.item(l))}})},setAttrib:function(l,m,j){var k=this;if(!l||!m){return}if(k.settings.strict){m=m.toLowerCase()}return this.run(l,function(o){var n=k.settings;switch(m){case"style":if(!e(j,"string")){f(j,function(p,q){k.setStyle(o,q,p)});return}if(n.keep_values){if(j&&!k._isRes(j)){o.setAttribute("data-mce-style",j,2)}else{o.removeAttribute("data-mce-style",2)}}o.style.cssText=j;break;case"class":o.className=j||"";break;case"src":case"href":if(n.keep_values){if(n.url_converter){j=n.url_converter.call(n.url_converter_scope||k,j,m,o)}k.setAttrib(o,"data-mce-"+m,j,2)}break;case"shape":o.setAttribute("data-mce-style",j);break}if(e(j)&&j!==null&&j.length!==0){o.setAttribute(m,""+j,2)}else{o.removeAttribute(m,2)}})},setAttribs:function(k,l){var j=this;return this.run(k,function(m){f(l,function(o,p){j.setAttrib(m,p,o)})})},getAttrib:function(m,o,l){var j,k=this;m=k.get(m);if(!m||m.nodeType!==1){return false}if(!e(l)){l=""}if(/^(src|href|style|coords|shape)$/.test(o)){j=m.getAttribute("data-mce-"+o);if(j){return j}}if(b&&k.props[o]){j=m[k.props[o]];j=j&&j.nodeValue?j.nodeValue:j}if(!j){j=m.getAttribute(o,2)}if(/^(checked|compact|declare|defer|disabled|ismap|multiple|nohref|noshade|nowrap|readonly|selected)$/.test(o)){if(m[k.props[o]]===true&&j===""){return o}return j?o:""}if(m.nodeName==="FORM"&&m.getAttributeNode(o)){return m.getAttributeNode(o).nodeValue}if(o==="style"){j=j||m.style.cssText;if(j){j=k.serializeStyle(k.parseStyle(j),m.nodeName);if(k.settings.keep_values&&!k._isRes(j)){m.setAttribute("data-mce-style",j)}}}if(d&&o==="class"&&j){j=j.replace(/(apple|webkit)\-[a-z\-]+/gi,"")}if(b){switch(o){case"rowspan":case"colspan":if(j===1){j=""}break;case"size":if(j==="+0"||j===20||j===0){j=""}break;case"width":case"height":case"vspace":case"checked":case"disabled":case"readonly":if(j===0){j=""}break;case"hspace":if(j===-1){j=""}break;case"maxlength":case"tabindex":if(j===32768||j===2147483647||j==="32768"){j=""}break;case"multiple":case"compact":case"noshade":case"nowrap":if(j===65535){return o}return l;case"shape":j=j.toLowerCase();break;default:if(o.indexOf("on")===0&&j){j=h._replace(/^function\s+\w+\(\)\s+\{\s+(.*)\s+\}$/,"$1",""+j)}}}return(j!==undefined&&j!==null&&j!=="")?""+j:l},getPos:function(s,m){var k=this,j=0,q=0,o,p=k.doc,l;s=k.get(s);m=m||p.body;if(s){if(b&&!k.stdMode){s=s.getBoundingClientRect();o=k.boxModel?p.documentElement:p.body;j=k.getStyle(k.select("html")[0],"borderWidth");j=(j=="medium"||k.boxModel&&!k.isIE6)&&2||j;return{x:s.left+o.scrollLeft-j,y:s.top+o.scrollTop-j}}l=s;while(l&&l!=m&&l.nodeType){j+=l.offsetLeft||0;q+=l.offsetTop||0;l=l.offsetParent}l=s.parentNode;while(l&&l!=m&&l.nodeType){j-=l.scrollLeft||0;q-=l.scrollTop||0;l=l.parentNode}}return{x:j,y:q}},parseStyle:function(j){return this.styles.parse(j)},serializeStyle:function(k,j){return this.styles.serialize(k,j)},loadCSS:function(j){var l=this,m=l.doc,k;if(!j){j=""}k=l.select("head")[0];f(j.split(","),function(n){var o;if(l.files[n]){return}l.files[n]=true;o=l.create("link",{rel:"stylesheet",href:h._addVer(n)});if(b&&m.documentMode&&m.recalc){o.onload=function(){if(m.recalc){m.recalc()}o.onload=null}}k.appendChild(o)})},addClass:function(j,k){return this.run(j,function(l){var m;if(!k){return 0}if(this.hasClass(l,k)){return l.className}m=this.removeClass(l,k);return l.className=(m!=""?(m+" "):"")+k})},removeClass:function(l,m){var j=this,k;return j.run(l,function(o){var n;if(j.hasClass(o,m)){if(!k){k=new RegExp("(^|\\s+)"+m+"(\\s+|$)","g")}n=o.className.replace(k," ");n=h.trim(n!=" "?n:"");o.className=n;if(!n){o.removeAttribute("class");o.removeAttribute("className")}return n}return o.className})},hasClass:function(k,j){k=this.get(k);if(!k||!j){return false}return(" "+k.className+" ").indexOf(" "+j+" ")!==-1},show:function(j){return this.setStyle(j,"display","block")},hide:function(j){return this.setStyle(j,"display","none")},isHidden:function(j){j=this.get(j);return !j||j.style.display=="none"||this.getStyle(j,"display")=="none"},uniqueId:function(j){return(!j?"mce_":j)+(this.counter++)},setHTML:function(l,k){var j=this;return j.run(l,function(n){if(b){while(n.firstChild){n.removeChild(n.firstChild)}try{n.innerHTML="
    "+k;n.removeChild(n.firstChild)}catch(m){n=j.create("div");n.innerHTML="
    "+k;f(n.childNodes,function(p,o){if(o){n.appendChild(p)}})}}else{n.innerHTML=k}return k})},getOuterHTML:function(l){var k,j=this;l=j.get(l);if(!l){return null}if(l.nodeType===1&&j.hasOuterHTML){return l.outerHTML}k=(l.ownerDocument||j.doc).createElement("body");k.appendChild(l.cloneNode(true));return k.innerHTML},setOuterHTML:function(m,k,n){var j=this;function l(p,o,r){var s,q;q=r.createElement("body");q.innerHTML=o;s=q.lastChild;while(s){j.insertAfter(s.cloneNode(true),p);s=s.previousSibling}j.remove(p)}return this.run(m,function(p){p=j.get(p);if(p.nodeType==1){n=n||p.ownerDocument||j.doc;if(b){try{if(b&&p.nodeType==1){p.outerHTML=k}else{l(p,k,n)}}catch(o){l(p,k,n)}}else{l(p,k,n)}}})},decode:c.decode,encode:c.encodeAllRaw,insertAfter:function(j,k){k=this.get(k);return this.run(j,function(m){var l,n;l=k.parentNode;n=k.nextSibling;if(n){l.insertBefore(m,n)}else{l.appendChild(m)}return m})},isBlock:function(k){var j=k.nodeType;if(j){return !!(j===1&&g[k.nodeName])}return !!g[k]},replace:function(p,m,j){var l=this;if(e(m,"array")){p=p.cloneNode(true)}return l.run(m,function(k){if(j){f(h.grep(k.childNodes),function(n){p.appendChild(n)})}return k.parentNode.replaceChild(p,k)})},rename:function(m,j){var l=this,k;if(m.nodeName!=j.toUpperCase()){k=l.create(j);f(l.getAttribs(m),function(n){l.setAttrib(k,n.nodeName,l.getAttrib(m,n.nodeName))});l.replace(k,m,1)}return k||m},findCommonAncestor:function(l,j){var m=l,k;while(m){k=j;while(k&&m!=k){k=k.parentNode}if(m==k){break}m=m.parentNode}if(!m&&l.ownerDocument){return l.ownerDocument.documentElement}return m},toHex:function(j){var l=/^\s*rgb\s*?\(\s*?([0-9]+)\s*?,\s*?([0-9]+)\s*?,\s*?([0-9]+)\s*?\)\s*$/i.exec(j);function k(m){m=parseInt(m).toString(16);return m.length>1?m:"0"+m}if(l){j="#"+k(l[1])+k(l[2])+k(l[3]);return j}return j},getClasses:function(){var n=this,j=[],m,o={},p=n.settings.class_filter,l;if(n.classes){return n.classes}function q(r){f(r.imports,function(s){q(s)});f(r.cssRules||r.rules,function(s){switch(s.type||1){case 1:if(s.selectorText){f(s.selectorText.split(","),function(t){t=t.replace(/^\s*|\s*$|^\s\./g,"");if(/\.mce/.test(t)||!/\.[\w\-]+$/.test(t)){return}l=t;t=h._replace(/.*\.([a-z0-9_\-]+).*/i,"$1",t);if(p&&!(t=p(t,l))){return}if(!o[t]){j.push({"class":t});o[t]=1}})}break;case 3:q(s.styleSheet);break}})}try{f(n.doc.styleSheets,q)}catch(k){}if(j.length>0){n.classes=j}return j},run:function(m,l,k){var j=this,n;if(j.doc&&typeof(m)==="string"){m=j.get(m)}if(!m){return false}k=k||this;if(!m.nodeType&&(m.length||m.length===0)){n=[];f(m,function(p,o){if(p){if(typeof(p)=="string"){p=j.doc.getElementById(p)}n.push(l.call(k,p,o))}});return n}return l.call(k,m)},getAttribs:function(k){var j;k=this.get(k);if(!k){return[]}if(b){j=[];if(k.nodeName=="OBJECT"){return k.attributes}if(k.nodeName==="OPTION"&&this.getAttrib(k,"selected")){j.push({specified:1,nodeName:"selected"})}k.cloneNode(false).outerHTML.replace(/<\/?[\w:\-]+ ?|=[\"][^\"]+\"|=\'[^\']+\'|=[\w\-]+|>/gi,"").replace(/[\w:\-]+/gi,function(l){j.push({specified:1,nodeName:l})});return j}return k.attributes},isEmpty:function(o,p){var k=this,m,j,n,q,l;o=o.firstChild;if(o){q=new h.dom.TreeWalker(o);p=p||k.schema?k.schema.getNonEmptyElements():null;do{n=o.nodeType;if(n===1){if(o.getAttribute("data-mce-bogus")){continue}if(p&&p[o.nodeName.toLowerCase()]){return false}j=k.getAttribs(o);m=o.attributes.length;while(m--){l=o.attributes[m].nodeName;if(l==="name"||l.indexOf("data-")===0){return false}}}if((n===3&&!i.test(o.nodeValue))){return false}}while(o=q.next())}return true},destroy:function(k){var j=this;if(j.events){j.events.destroy()}j.win=j.doc=j.root=j.events=null;if(!k){h.removeUnload(j.destroy)}},createRng:function(){var j=this.doc;return j.createRange?j.createRange():new h.dom.Range(this)},nodeIndex:function(o,p){var j=0,m,n,l,k;if(o){for(m=o.nodeType,o=o.previousSibling,n=o;o;o=o.previousSibling){l=o.nodeType;if(p&&l==3){k=false;try{k=o.nodeValue.length}catch(q){}if(l==m||!k){continue}}j++;m=l}}return j},split:function(n,m,q){var s=this,j=s.createRng(),o,l,p;function k(v){var t,r=v.childNodes,u=v.nodeType;if(u==1&&v.getAttribute("data-mce-type")=="bookmark"){return}for(t=r.length-1;t>=0;t--){k(r[t])}if(u!=9){if(u==3&&v.nodeValue.length>0){if(!s.isBlock(v.parentNode)||h.trim(v.nodeValue).length>0){return}}else{if(u==1){r=v.childNodes;if(r.length==1&&r[0]&&r[0].nodeType==1&&r[0].getAttribute("data-mce-type")=="bookmark"){v.parentNode.insertBefore(r[0],v)}if(r.length||/^(br|hr|input|img)$/i.test(v.nodeName)){return}}}s.remove(v)}return v}if(n&&m){j.setStart(n.parentNode,s.nodeIndex(n));j.setEnd(m.parentNode,s.nodeIndex(m));o=j.extractContents();j=s.createRng();j.setStart(m.parentNode,s.nodeIndex(m)+1);j.setEnd(n.parentNode,s.nodeIndex(n)+1);l=j.extractContents();p=n.parentNode;p.insertBefore(k(o),n);if(q){p.replaceChild(q,m)}else{p.insertBefore(m,n)}p.insertBefore(k(l),n);s.remove(n);return q||m}},bind:function(n,j,m,l){var k=this;if(!k.events){k.events=new h.dom.EventUtils()}return k.events.add(n,j,m,l||this)},unbind:function(m,j,l){var k=this;if(!k.events){k.events=new h.dom.EventUtils()}return k.events.remove(m,j,l)},_findSib:function(m,j,k){var l=this,n=j;if(m){if(e(n,"string")){n=function(o){return l.is(o,j)}}for(m=m[k];m;m=m[k]){if(n(m)){return m}}}return null},_isRes:function(j){return/^(top|left|bottom|right|width|height)/i.test(j)||/;\s*(top|left|bottom|right|width|height)/i.test(j)}});h.DOM=new h.dom.DOMUtils(document,{process_html:0})})(tinymce);(function(a){function b(c){var N=this,e=c.doc,S=0,E=1,j=2,D=true,R=false,U="startOffset",h="startContainer",P="endContainer",z="endOffset",k=tinymce.extend,n=c.nodeIndex;k(N,{startContainer:e,startOffset:0,endContainer:e,endOffset:0,collapsed:D,commonAncestorContainer:e,START_TO_START:0,START_TO_END:1,END_TO_END:2,END_TO_START:3,setStart:q,setEnd:s,setStartBefore:g,setStartAfter:I,setEndBefore:J,setEndAfter:u,collapse:A,selectNode:x,selectNodeContents:F,compareBoundaryPoints:v,deleteContents:p,extractContents:H,cloneContents:d,insertNode:C,surroundContents:M,cloneRange:K});function q(V,t){B(D,V,t)}function s(V,t){B(R,V,t)}function g(t){q(t.parentNode,n(t))}function I(t){q(t.parentNode,n(t)+1)}function J(t){s(t.parentNode,n(t))}function u(t){s(t.parentNode,n(t)+1)}function A(t){if(t){N[P]=N[h];N[z]=N[U]}else{N[h]=N[P];N[U]=N[z]}N.collapsed=D}function x(t){g(t);u(t)}function F(t){q(t,0);s(t,t.nodeType===1?t.childNodes.length:t.nodeValue.length)}function v(Y,t){var ab=N[h],W=N[U],aa=N[P],V=N[z],Z=t.startContainer,ad=t.startOffset,X=t.endContainer,ac=t.endOffset;if(Y===0){return G(ab,W,Z,ad)}if(Y===1){return G(aa,V,Z,ad)}if(Y===2){return G(aa,V,X,ac)}if(Y===3){return G(ab,W,X,ac)}}function p(){m(j)}function H(){return m(S)}function d(){return m(E)}function C(Y){var V=this[h],t=this[U],X,W;if((V.nodeType===3||V.nodeType===4)&&V.nodeValue){if(!t){V.parentNode.insertBefore(Y,V)}else{if(t>=V.nodeValue.length){c.insertAfter(Y,V)}else{X=V.splitText(t);V.parentNode.insertBefore(Y,X)}}}else{if(V.childNodes.length>0){W=V.childNodes[t]}if(W){V.insertBefore(Y,W)}else{V.appendChild(Y)}}}function M(V){var t=N.extractContents();N.insertNode(V);V.appendChild(t);N.selectNode(V)}function K(){return k(new b(c),{startContainer:N[h],startOffset:N[U],endContainer:N[P],endOffset:N[z],collapsed:N.collapsed,commonAncestorContainer:N.commonAncestorContainer})}function O(t,V){var W;if(t.nodeType==3){return t}if(V<0){return t}W=t.firstChild;while(W&&V>0){--V;W=W.nextSibling}if(W){return W}return t}function l(){return(N[h]==N[P]&&N[U]==N[z])}function G(X,Z,V,Y){var aa,W,t,ab,ad,ac;if(X==V){if(Z==Y){return 0}if(Z0){N.collapse(V)}}else{N.collapse(V)}N.collapsed=l();N.commonAncestorContainer=c.findCommonAncestor(N[h],N[P])}function m(ab){var aa,X=0,ad=0,V,Z,W,Y,t,ac;if(N[h]==N[P]){return f(ab)}for(aa=N[P],V=aa.parentNode;V;aa=V,V=V.parentNode){if(V==N[h]){return r(aa,ab)}++X}for(aa=N[h],V=aa.parentNode;V;aa=V,V=V.parentNode){if(V==N[P]){return T(aa,ab)}++ad}Z=ad-X;W=N[h];while(Z>0){W=W.parentNode;Z--}Y=N[P];while(Z<0){Y=Y.parentNode;Z++}for(t=W.parentNode,ac=Y.parentNode;t!=ac;t=t.parentNode,ac=ac.parentNode){W=t;Y=ac}return o(W,Y,ab)}function f(Z){var ab,Y,X,aa,t,W,V;if(Z!=j){ab=e.createDocumentFragment()}if(N[U]==N[z]){return ab}if(N[h].nodeType==3){Y=N[h].nodeValue;X=Y.substring(N[U],N[z]);if(Z!=E){N[h].deleteData(N[U],N[z]-N[U]);N.collapse(D)}if(Z==j){return}ab.appendChild(e.createTextNode(X));return ab}aa=O(N[h],N[U]);t=N[z]-N[U];while(t>0){W=aa.nextSibling;V=y(aa,Z);if(ab){ab.appendChild(V)}--t;aa=W}if(Z!=E){N.collapse(D)}return ab}function r(ab,Y){var aa,Z,V,t,X,W;if(Y!=j){aa=e.createDocumentFragment()}Z=i(ab,Y);if(aa){aa.appendChild(Z)}V=n(ab);t=V-N[U];if(t<=0){if(Y!=E){N.setEndBefore(ab);N.collapse(R)}return aa}Z=ab.previousSibling;while(t>0){X=Z.previousSibling;W=y(Z,Y);if(aa){aa.insertBefore(W,aa.firstChild)}--t;Z=X}if(Y!=E){N.setEndBefore(ab);N.collapse(R)}return aa}function T(Z,Y){var ab,V,aa,t,X,W;if(Y!=j){ab=e.createDocumentFragment()}aa=Q(Z,Y);if(ab){ab.appendChild(aa)}V=n(Z);++V;t=N[z]-V;aa=Z.nextSibling;while(t>0){X=aa.nextSibling;W=y(aa,Y);if(ab){ab.appendChild(W)}--t;aa=X}if(Y!=E){N.setStartAfter(Z);N.collapse(D)}return ab}function o(Z,t,ac){var W,ae,Y,aa,ab,V,ad,X;if(ac!=j){ae=e.createDocumentFragment()}W=Q(Z,ac);if(ae){ae.appendChild(W)}Y=Z.parentNode;aa=n(Z);ab=n(t);++aa;V=ab-aa;ad=Z.nextSibling;while(V>0){X=ad.nextSibling;W=y(ad,ac);if(ae){ae.appendChild(W)}ad=X;--V}W=i(t,ac);if(ae){ae.appendChild(W)}if(ac!=E){N.setStartAfter(Z);N.collapse(D)}return ae}function i(aa,ab){var W=O(N[P],N[z]-1),ac,Z,Y,t,V,X=W!=N[P];if(W==aa){return L(W,X,R,ab)}ac=W.parentNode;Z=L(ac,R,R,ab);while(ac){while(W){Y=W.previousSibling;t=L(W,X,R,ab);if(ab!=j){Z.insertBefore(t,Z.firstChild)}X=D;W=Y}if(ac==aa){return Z}W=ac.previousSibling;ac=ac.parentNode;V=L(ac,R,R,ab);if(ab!=j){V.appendChild(Z)}Z=V}}function Q(aa,ab){var X=O(N[h],N[U]),Y=X!=N[h],ac,Z,W,t,V;if(X==aa){return L(X,Y,D,ab)}ac=X.parentNode;Z=L(ac,R,D,ab);while(ac){while(X){W=X.nextSibling;t=L(X,Y,D,ab);if(ab!=j){Z.appendChild(t)}Y=D;X=W}if(ac==aa){return Z}X=ac.nextSibling;ac=ac.parentNode;V=L(ac,R,D,ab);if(ab!=j){V.appendChild(Z)}Z=V}}function L(t,Y,ab,ac){var X,W,Z,V,aa;if(Y){return y(t,ac)}if(t.nodeType==3){X=t.nodeValue;if(ab){V=N[U];W=X.substring(V);Z=X.substring(0,V)}else{V=N[z];W=X.substring(0,V);Z=X.substring(V)}if(ac!=E){t.nodeValue=Z}if(ac==j){return}aa=t.cloneNode(R);aa.nodeValue=W;return aa}if(ac==j){return}return t.cloneNode(R)}function y(V,t){if(t!=j){return t==E?V.cloneNode(D):V}V.parentNode.removeChild(V)}}a.Range=b})(tinymce.dom);(function(){function a(g){var i=this,j="\uFEFF",e,h,d=g.dom,c=true,f=false;function b(){var n=g.getRng(),k=d.createRng(),m,o;m=n.item?n.item(0):n.parentElement();if(m.ownerDocument!=d.doc){return k}o=g.isCollapsed();if(n.item||!m.hasChildNodes()){if(o){k.setStart(m,0);k.setEnd(m,0)}else{k.setStart(m.parentNode,d.nodeIndex(m));k.setEnd(k.startContainer,k.startOffset+1)}return k}function l(s){var u,q,t,p,A=0,x,y,z,r,v;r=n.duplicate();r.collapse(s);u=d.create("a");z=r.parentElement();if(!z.hasChildNodes()){k[s?"setStart":"setEnd"](z,0);return}z.appendChild(u);r.moveToElementText(u);v=n.compareEndPoints(s?"StartToStart":"EndToEnd",r);if(v>0){k[s?"setStartAfter":"setEndAfter"](z);d.remove(u);return}p=tinymce.grep(z.childNodes);x=p.length-1;while(A<=x){y=Math.floor((A+x)/2);z.insertBefore(u,p[y]);r.moveToElementText(u);v=n.compareEndPoints(s?"StartToStart":"EndToEnd",r);if(v>0){A=y+1}else{if(v<0){x=y-1}else{found=true;break}}}q=v>0||y==0?u.nextSibling:u.previousSibling;if(q.nodeType==1){d.remove(u);t=d.nodeIndex(q);q=q.parentNode;if(!s||y>0){t++}}else{if(v>0||y==0){r.setEndPoint(s?"StartToStart":"EndToEnd",n);t=r.text.length}else{r.setEndPoint(s?"StartToStart":"EndToEnd",n);t=q.nodeValue.length-r.text.length}d.remove(u)}k[s?"setStart":"setEnd"](q,t)}l(true);if(!o){l()}return k}this.addRange=function(k){var p,n,m,r,u,s,t=g.dom.doc,o=t.body;function l(B){var x,A,v,z,y;v=d.create("a");x=B?m:u;A=B?r:s;z=p.duplicate();if(x==t||x==t.documentElement){x=o;A=0}if(x.nodeType==3){x.parentNode.insertBefore(v,x);z.moveToElementText(v);z.moveStart("character",A);d.remove(v);p.setEndPoint(B?"StartToStart":"EndToEnd",z)}else{y=x.childNodes;if(y.length){if(A>=y.length){d.insertAfter(v,y[y.length-1])}else{x.insertBefore(v,y[A])}z.moveToElementText(v)}else{v=t.createTextNode(j);x.appendChild(v);z.moveToElementText(v.parentNode);z.collapse(c)}p.setEndPoint(B?"StartToStart":"EndToEnd",z);d.remove(v)}}this.destroy();m=k.startContainer;r=k.startOffset;u=k.endContainer;s=k.endOffset;p=o.createTextRange();if(m==u&&m.nodeType==1&&r==s-1){if(r==s-1){try{n=o.createControlRange();n.addElement(m.childNodes[r]);n.select();return}catch(q){}}}l(true);l();p.select()};this.getRangeAt=function(){if(!e||!tinymce.dom.RangeUtils.compareRanges(h,g.getRng())){e=b();h=g.getRng()}try{e.startContainer.nextSibling}catch(k){e=b();h=null}return e};this.destroy=function(){h=e=null}}tinymce.dom.TridentSelection=a})();(function(){var p=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,j=0,d=Object.prototype.toString,o=false,i=true;[0,0].sort(function(){i=false;return 0});var b=function(v,e,z,A){z=z||[];e=e||document;var C=e;if(e.nodeType!==1&&e.nodeType!==9){return[]}if(!v||typeof v!=="string"){return z}var x=[],s,E,H,r,u=true,t=b.isXML(e),B=v,D,G,F,y;do{p.exec("");s=p.exec(B);if(s){B=s[3];x.push(s[1]);if(s[2]){r=s[3];break}}}while(s);if(x.length>1&&k.exec(v)){if(x.length===2&&f.relative[x[0]]){E=h(x[0]+x[1],e)}else{E=f.relative[x[0]]?[e]:b(x.shift(),e);while(x.length){v=x.shift();if(f.relative[v]){v+=x.shift()}E=h(v,E)}}}else{if(!A&&x.length>1&&e.nodeType===9&&!t&&f.match.ID.test(x[0])&&!f.match.ID.test(x[x.length-1])){D=b.find(x.shift(),e,t);e=D.expr?b.filter(D.expr,D.set)[0]:D.set[0]}if(e){D=A?{expr:x.pop(),set:a(A)}:b.find(x.pop(),x.length===1&&(x[0]==="~"||x[0]==="+")&&e.parentNode?e.parentNode:e,t);E=D.expr?b.filter(D.expr,D.set):D.set;if(x.length>0){H=a(E)}else{u=false}while(x.length){G=x.pop();F=G;if(!f.relative[G]){G=""}else{F=x.pop()}if(F==null){F=e}f.relative[G](H,F,t)}}else{H=x=[]}}if(!H){H=E}if(!H){b.error(G||v)}if(d.call(H)==="[object Array]"){if(!u){z.push.apply(z,H)}else{if(e&&e.nodeType===1){for(y=0;H[y]!=null;y++){if(H[y]&&(H[y]===true||H[y].nodeType===1&&b.contains(e,H[y]))){z.push(E[y])}}}else{for(y=0;H[y]!=null;y++){if(H[y]&&H[y].nodeType===1){z.push(E[y])}}}}}else{a(H,z)}if(r){b(r,C,z,A);b.uniqueSort(z)}return z};b.uniqueSort=function(r){if(c){o=i;r.sort(c);if(o){for(var e=1;e":function(x,r){var u=typeof r==="string",v,s=0,e=x.length;if(u&&!/\W/.test(r)){r=r.toLowerCase();for(;s=0)){if(!s){e.push(v)}}else{if(s){r[u]=false}}}}return false},ID:function(e){return e[1].replace(/\\/g,"")},TAG:function(r,e){return r[1].toLowerCase()},CHILD:function(e){if(e[1]==="nth"){var r=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(e[2]==="even"&&"2n"||e[2]==="odd"&&"2n+1"||!/\D/.test(e[2])&&"0n+"+e[2]||e[2]);e[2]=(r[1]+(r[2]||1))-0;e[3]=r[3]-0}e[0]=j++;return e},ATTR:function(u,r,s,e,v,x){var t=u[1].replace(/\\/g,"");if(!x&&f.attrMap[t]){u[1]=f.attrMap[t]}if(u[2]==="~="){u[4]=" "+u[4]+" "}return u},PSEUDO:function(u,r,s,e,v){if(u[1]==="not"){if((p.exec(u[3])||"").length>1||/^\w/.test(u[3])){u[3]=b(u[3],null,null,r)}else{var t=b.filter(u[3],r,s,true^v);if(!s){e.push.apply(e,t)}return false}}else{if(f.match.POS.test(u[0])||f.match.CHILD.test(u[0])){return true}}return u},POS:function(e){e.unshift(true);return e}},filters:{enabled:function(e){return e.disabled===false&&e.type!=="hidden"},disabled:function(e){return e.disabled===true},checked:function(e){return e.checked===true},selected:function(e){e.parentNode.selectedIndex;return e.selected===true},parent:function(e){return !!e.firstChild},empty:function(e){return !e.firstChild},has:function(s,r,e){return !!b(e[3],s).length},header:function(e){return(/h\d/i).test(e.nodeName)},text:function(e){return"text"===e.type},radio:function(e){return"radio"===e.type},checkbox:function(e){return"checkbox"===e.type},file:function(e){return"file"===e.type},password:function(e){return"password"===e.type},submit:function(e){return"submit"===e.type},image:function(e){return"image"===e.type},reset:function(e){return"reset"===e.type},button:function(e){return"button"===e.type||e.nodeName.toLowerCase()==="button"},input:function(e){return(/input|select|textarea|button/i).test(e.nodeName)}},setFilters:{first:function(r,e){return e===0},last:function(s,r,e,t){return r===t.length-1},even:function(r,e){return e%2===0},odd:function(r,e){return e%2===1},lt:function(s,r,e){return re[3]-0},nth:function(s,r,e){return e[3]-0===r},eq:function(s,r,e){return e[3]-0===r}},filter:{PSEUDO:function(s,y,x,z){var e=y[1],r=f.filters[e];if(r){return r(s,x,y,z)}else{if(e==="contains"){return(s.textContent||s.innerText||b.getText([s])||"").indexOf(y[3])>=0}else{if(e==="not"){var t=y[3];for(var v=0,u=t.length;v=0)}}},ID:function(r,e){return r.nodeType===1&&r.getAttribute("id")===e},TAG:function(r,e){return(e==="*"&&r.nodeType===1)||r.nodeName.toLowerCase()===e},CLASS:function(r,e){return(" "+(r.className||r.getAttribute("class"))+" ").indexOf(e)>-1},ATTR:function(v,t){var s=t[1],e=f.attrHandle[s]?f.attrHandle[s](v):v[s]!=null?v[s]:v.getAttribute(s),x=e+"",u=t[2],r=t[4];return e==null?u==="!=":u==="="?x===r:u==="*="?x.indexOf(r)>=0:u==="~="?(" "+x+" ").indexOf(r)>=0:!r?x&&e!==false:u==="!="?x!==r:u==="^="?x.indexOf(r)===0:u==="$="?x.substr(x.length-r.length)===r:u==="|="?x===r||x.substr(0,r.length+1)===r+"-":false},POS:function(u,r,s,v){var e=r[2],t=f.setFilters[e];if(t){return t(u,s,r,v)}}}};var k=f.match.POS,g=function(r,e){return"\\"+(e-0+1)};for(var m in f.match){f.match[m]=new RegExp(f.match[m].source+(/(?![^\[]*\])(?![^\(]*\))/.source));f.leftMatch[m]=new RegExp(/(^(?:.|\r|\n)*?)/.source+f.match[m].source.replace(/\\(\d+)/g,g))}var a=function(r,e){r=Array.prototype.slice.call(r,0);if(e){e.push.apply(e,r);return e}return r};try{Array.prototype.slice.call(document.documentElement.childNodes,0)[0].nodeType}catch(l){a=function(u,t){var r=t||[],s=0;if(d.call(u)==="[object Array]"){Array.prototype.push.apply(r,u)}else{if(typeof u.length==="number"){for(var e=u.length;s";var e=document.documentElement;e.insertBefore(r,e.firstChild);if(document.getElementById(s)){f.find.ID=function(u,v,x){if(typeof v.getElementById!=="undefined"&&!x){var t=v.getElementById(u[1]);return t?t.id===u[1]||typeof t.getAttributeNode!=="undefined"&&t.getAttributeNode("id").nodeValue===u[1]?[t]:undefined:[]}};f.filter.ID=function(v,t){var u=typeof v.getAttributeNode!=="undefined"&&v.getAttributeNode("id");return v.nodeType===1&&u&&u.nodeValue===t}}e.removeChild(r);e=r=null})();(function(){var e=document.createElement("div");e.appendChild(document.createComment(""));if(e.getElementsByTagName("*").length>0){f.find.TAG=function(r,v){var u=v.getElementsByTagName(r[1]);if(r[1]==="*"){var t=[];for(var s=0;u[s];s++){if(u[s].nodeType===1){t.push(u[s])}}u=t}return u}}e.innerHTML="";if(e.firstChild&&typeof e.firstChild.getAttribute!=="undefined"&&e.firstChild.getAttribute("href")!=="#"){f.attrHandle.href=function(r){return r.getAttribute("href",2)}}e=null})();if(document.querySelectorAll){(function(){var e=b,s=document.createElement("div");s.innerHTML="

    ";if(s.querySelectorAll&&s.querySelectorAll(".TEST").length===0){return}b=function(x,v,t,u){v=v||document;if(!u&&v.nodeType===9&&!b.isXML(v)){try{return a(v.querySelectorAll(x),t)}catch(y){}}return e(x,v,t,u)};for(var r in e){b[r]=e[r]}s=null})()}(function(){var e=document.createElement("div");e.innerHTML="
    ";if(!e.getElementsByClassName||e.getElementsByClassName("e").length===0){return}e.lastChild.className="e";if(e.getElementsByClassName("e").length===1){return}f.order.splice(1,0,"CLASS");f.find.CLASS=function(r,s,t){if(typeof s.getElementsByClassName!=="undefined"&&!t){return s.getElementsByClassName(r[1])}};e=null})();function n(r,x,v,A,y,z){for(var t=0,s=A.length;t0){u=e;break}}}e=e[r]}A[t]=u}}}b.contains=document.compareDocumentPosition?function(r,e){return !!(r.compareDocumentPosition(e)&16)}:function(r,e){return r!==e&&(r.contains?r.contains(e):true)};b.isXML=function(e){var r=(e?e.ownerDocument||e:0).documentElement;return r?r.nodeName!=="HTML":false};var h=function(e,y){var t=[],u="",v,s=y.nodeType?[y]:y;while((v=f.match.PSEUDO.exec(e))){u+=v[0];e=e.replace(f.match.PSEUDO,"")}e=f.relative[e]?e+"*":e;for(var x=0,r=s.length;x=0;h--){k=g[h];if(k.obj===l){j._remove(k.obj,k.name,k.cfunc);k.obj=k.cfunc=null;g.splice(h,1)}}}},cancel:function(g){if(!g){return false}this.stop(g);return this.prevent(g)},stop:function(g){if(g.stopPropagation){g.stopPropagation()}else{g.cancelBubble=true}return false},prevent:function(g){if(g.preventDefault){g.preventDefault()}else{g.returnValue=false}return false},destroy:function(){var g=this;f(g.events,function(j,h){g._remove(j.obj,j.name,j.cfunc);j.obj=j.cfunc=null});g.events=[];g=null},_add:function(h,i,g){if(h.attachEvent){h.attachEvent("on"+i,g)}else{if(h.addEventListener){h.addEventListener(i,g,false)}else{h["on"+i]=g}}},_remove:function(i,j,h){if(i){try{if(i.detachEvent){i.detachEvent("on"+j,h)}else{if(i.removeEventListener){i.removeEventListener(j,h,false)}else{i["on"+j]=null}}}catch(g){}}},_pageInit:function(h){var g=this;if(g.domLoaded){return}g.domLoaded=true;f(g.inits,function(i){i()});g.inits=[]},_wait:function(i){var g=this,h=i.document;if(i.tinyMCE_GZ&&tinyMCE_GZ.loaded){g.domLoaded=1;return}if(h.attachEvent){h.attachEvent("onreadystatechange",function(){if(h.readyState==="complete"){h.detachEvent("onreadystatechange",arguments.callee);g._pageInit(i)}});if(h.documentElement.doScroll&&i==i.top){(function(){if(g.domLoaded){return}try{h.documentElement.doScroll("left")}catch(j){setTimeout(arguments.callee,0);return}g._pageInit(i)})()}}else{if(h.addEventListener){g._add(i,"DOMContentLoaded",function(){g._pageInit(i)})}}g._add(i,"load",function(){g._pageInit(i)})},_stoppers:{preventDefault:function(){this.returnValue=false},stopPropagation:function(){this.cancelBubble=true}}});a=d.dom.Event=new d.dom.EventUtils();a._wait(window);d.addUnload(function(){a.destroy()})})(tinymce);(function(a){a.dom.Element=function(f,d){var b=this,e,c;b.settings=d=d||{};b.id=f;b.dom=e=d.dom||a.DOM;if(!a.isIE){c=e.get(b.id)}a.each(("getPos,getRect,getParent,add,setStyle,getStyle,setStyles,setAttrib,setAttribs,getAttrib,addClass,removeClass,hasClass,getOuterHTML,setOuterHTML,remove,show,hide,isHidden,setHTML,get").split(/,/),function(g){b[g]=function(){var h=[f],j;for(j=0;j_';if(f.startContainer==l&&f.endContainer==l){l.body.innerHTML=k}else{f.deleteContents();if(l.body.childNodes.length==0){l.body.innerHTML=k}else{if(f.createContextualFragment){f.insertNode(f.createContextualFragment(k))}else{m=l.createDocumentFragment();g=l.createElement("div");m.appendChild(g);g.outerHTML=k;f.insertNode(m)}}}i=h.dom.get("__caret");f=l.createRange();f.setStartBefore(i);f.setEndBefore(i);h.setRng(f);h.dom.remove("__caret");h.setRng(f)}else{if(f.item){l.execCommand("Delete",false,null);f=h.getRng()}f.pasteHTML(k)}if(!j.no_events){h.onSetContent.dispatch(h,j)}},getStart:function(){var g=this.getRng(),h,f,j,i;if(g.duplicate||g.item){if(g.item){return g.item(0)}j=g.duplicate();j.collapse(1);h=j.parentElement();f=i=g.parentElement();while(i=i.parentNode){if(i==h){h=f;break}}return h}else{h=g.startContainer;if(h.nodeType==1&&h.hasChildNodes()){h=h.childNodes[Math.min(h.childNodes.length-1,g.startOffset)]}if(h&&h.nodeType==3){return h.parentNode}return h}},getEnd:function(){var g=this,h=g.getRng(),i,f;if(h.duplicate||h.item){if(h.item){return h.item(0)}h=h.duplicate();h.collapse(0);i=h.parentElement();if(i&&i.nodeName=="BODY"){return i.lastChild||i}return i}else{i=h.endContainer;f=h.endOffset;if(i.nodeType==1&&i.hasChildNodes()){i=i.childNodes[f>0?f-1:f]}if(i&&i.nodeType==3){return i.parentNode}return i}},getBookmark:function(r,s){var v=this,m=v.dom,g,j,i,n,h,o,p,l="\uFEFF",u;function f(x,y){var t=0;d(m.select(x),function(A,z){if(A==y){t=z}});return t}if(r==2){function k(){var x=v.getRng(true),t=m.getRoot(),y={};function z(C,H){var B=C[H?"startContainer":"endContainer"],G=C[H?"startOffset":"endOffset"],A=[],D,F,E=0;if(B.nodeType==3){if(s){for(D=B.previousSibling;D&&D.nodeType==3;D=D.previousSibling){G+=D.nodeValue.length}}A.push(G)}else{F=B.childNodes;if(G>=F.length&&F.length){E=1;G=Math.max(0,F.length-1)}A.push(v.dom.nodeIndex(F[G],s)+E)}for(;B&&B!=t;B=B.parentNode){A.push(v.dom.nodeIndex(B,s))}return A}y.start=z(x,true);if(!v.isCollapsed()){y.end=z(x)}return y}return k()}if(r){return{rng:v.getRng()}}g=v.getRng();i=m.uniqueId();n=tinyMCE.activeEditor.selection.isCollapsed();u="overflow:hidden;line-height:0px";if(g.duplicate||g.item){if(!g.item){j=g.duplicate();try{g.collapse();g.pasteHTML(''+l+"");if(!n){j.collapse(false);g.moveToElementText(j.parentElement());if(g.compareEndPoints("StartToEnd",j)==0){j.move("character",-1)}j.pasteHTML(''+l+"")}}catch(q){return null}}else{o=g.item(0);h=o.nodeName;return{name:h,index:f(h,o)}}}else{o=v.getNode();h=o.nodeName;if(h=="IMG"){return{name:h,index:f(h,o)}}j=g.cloneRange();if(!n){j.collapse(false);j.insertNode(m.create("span",{"data-mce-type":"bookmark",id:i+"_end",style:u},l))}g.collapse(true);g.insertNode(m.create("span",{"data-mce-type":"bookmark",id:i+"_start",style:u},l))}v.moveToBookmark({id:i,keep:1});return{id:i}},moveToBookmark:function(n){var r=this,l=r.dom,i,h,f,q,j,s,o,p;if(r.tridentSel){r.tridentSel.destroy()}if(n){if(n.start){f=l.createRng();q=l.getRoot();function g(z){var t=n[z?"start":"end"],v,x,y,u;if(t){y=t[0];for(x=q,v=t.length-1;v>=1;v--){u=x.childNodes;if(t[v]>u.length-1){return}x=u[t[v]]}if(x.nodeType===3){y=Math.min(t[0],x.nodeValue.length)}if(x.nodeType===1){y=Math.min(t[0],x.childNodes.length)}if(z){f.setStart(x,y)}else{f.setEnd(x,y)}}return true}if(g(true)&&g()){r.setRng(f)}}else{if(n.id){function k(A){var u=l.get(n.id+"_"+A),z,t,x,y,v=n.keep;if(u){z=u.parentNode;if(A=="start"){if(!v){t=l.nodeIndex(u)}else{z=u.firstChild;t=1}j=s=z;o=p=t}else{if(!v){t=l.nodeIndex(u)}else{z=u.firstChild;t=1}s=z;p=t}if(!v){y=u.previousSibling;x=u.nextSibling;d(c.grep(u.childNodes),function(B){if(B.nodeType==3){B.nodeValue=B.nodeValue.replace(/\uFEFF/g,"")}});while(u=l.get(n.id+"_"+A)){l.remove(u,1)}if(y&&x&&y.nodeType==x.nodeType&&y.nodeType==3&&!c.isOpera){t=y.nodeValue.length;y.appendData(x.nodeValue);l.remove(x);if(A=="start"){j=s=y;o=p=t}else{s=y;p=t}}}}}function m(t){if(l.isBlock(t)&&!t.innerHTML){t.innerHTML=!a?'
    ':" "}return t}k("start");k("end");if(j){f=l.createRng();f.setStart(m(j),o);f.setEnd(m(s),p);r.setRng(f)}}else{if(n.name){r.select(l.select(n.name)[n.index])}else{if(n.rng){r.setRng(n.rng)}}}}}},select:function(k,j){var i=this,l=i.dom,g=l.createRng(),f;if(k){f=l.nodeIndex(k);g.setStart(k.parentNode,f);g.setEnd(k.parentNode,f+1);if(j){function h(m,o){var n=new c.dom.TreeWalker(m,m);do{if(m.nodeType==3&&c.trim(m.nodeValue).length!=0){if(o){g.setStart(m,0)}else{g.setEnd(m,m.nodeValue.length)}return}if(m.nodeName=="BR"){if(o){g.setStartBefore(m)}else{g.setEndBefore(m)}return}}while(m=(o?n.next():n.prev()))}h(k,1);h(k)}i.setRng(g)}return k},isCollapsed:function(){var f=this,h=f.getRng(),g=f.getSel();if(!h||h.item){return false}if(h.compareEndPoints){return h.compareEndPoints("StartToEnd",h)===0}return !g||h.collapsed},collapse:function(f){var h=this,g=h.getRng(),i;if(g.item){i=g.item(0);g=h.win.document.body.createTextRange();g.moveToElementText(i)}g.collapse(!!f);h.setRng(g)},getSel:function(){var g=this,f=this.win;return f.getSelection?f.getSelection():f.document.selection},getRng:function(l){var g=this,h,i,k,j=g.win.document;if(l&&g.tridentSel){return g.tridentSel.getRangeAt(0)}try{if(h=g.getSel()){i=h.rangeCount>0?h.getRangeAt(0):(h.createRange?h.createRange():j.createRange())}}catch(f){}if(c.isIE&&i&&i.setStart&&j.selection.createRange().item){k=j.selection.createRange().item(0);i=j.createRange();i.setStartBefore(k);i.setEndAfter(k)}if(!i){i=j.createRange?j.createRange():j.body.createTextRange()}if(g.selectedRange&&g.explicitRange){if(i.compareBoundaryPoints(i.START_TO_START,g.selectedRange)===0&&i.compareBoundaryPoints(i.END_TO_END,g.selectedRange)===0){i=g.explicitRange}else{g.selectedRange=null;g.explicitRange=null}}return i},setRng:function(i){var h,g=this;if(!g.tridentSel){h=g.getSel();if(h){g.explicitRange=i;try{h.removeAllRanges()}catch(f){}h.addRange(i);g.selectedRange=h.getRangeAt(0)}}else{if(i.cloneRange){g.tridentSel.addRange(i);return}try{i.select()}catch(f){}}},setNode:function(g){var f=this;f.setContent(f.dom.getOuterHTML(g));return g},getNode:function(){var h=this,g=h.getRng(),i=h.getSel(),l,k=g.startContainer,f=g.endContainer;if(!g){return h.dom.getRoot()}if(g.setStart){l=g.commonAncestorContainer;if(!g.collapsed){if(g.startContainer==g.endContainer){if(g.endOffset-g.startOffset<2){if(g.startContainer.hasChildNodes()){l=g.startContainer.childNodes[g.startOffset]}}}if(k.nodeType===3&&f.nodeType===3){function j(p,m){var o=p;while(p&&p.nodeType===3&&p.length===0){p=m?p.nextSibling:p.previousSibling}return p||o}if(k.length===g.startOffset){k=j(k.nextSibling,true)}else{k=k.parentNode}if(g.endOffset===0){f=j(f.previousSibling,false)}else{f=f.parentNode}if(k&&k===f){return k}}}if(l&&l.nodeType==3){return l.parentNode}return l}return g.item?g.item(0):g.parentElement()},getSelectedBlocks:function(g,f){var i=this,j=i.dom,m,h,l,k=[];m=j.getParent(g||i.getStart(),j.isBlock);h=j.getParent(f||i.getEnd(),j.isBlock);if(m){k.push(m)}if(m&&h&&m!=h){l=m;while((l=l.nextSibling)&&l!=h){if(j.isBlock(l)){k.push(l)}}}if(h&&m!=h){k.push(h)}return k},destroy:function(g){var f=this;f.win=null;if(f.tridentSel){f.tridentSel.destroy()}if(!g){c.removeUnload(f.destroy)}},_fixIESelection:function(){var g=this.dom,m=g.doc,h=m.body,j,n,f;m.documentElement.unselectable=true;function i(o,r){var p=h.createTextRange();try{p.moveToPoint(o,r)}catch(q){p=null}return p}function l(p){var o;if(p.button){o=i(p.x,p.y);if(o){if(o.compareEndPoints("StartToStart",n)>0){o.setEndPoint("StartToStart",n)}else{o.setEndPoint("EndToEnd",n)}o.select()}}else{k()}}function k(){var o=m.selection.createRange();if(n&&!o.item&&o.compareEndPoints("StartToEnd",o)===0){n.select()}g.unbind(m,"mouseup",k);g.unbind(m,"mousemove",l);n=j=0}g.bind(m,["mousedown","contextmenu"],function(o){if(o.target.nodeName==="HTML"){if(j){k()}f=m.documentElement;if(f.scrollHeight>f.clientHeight){return}j=1;n=i(o.x,o.y);if(n){g.bind(m,"mouseup",k);g.bind(m,"mousemove",l);g.win.focus();n.select()}}})}})})(tinymce);(function(a){a.dom.Serializer=function(e,i,f){var h,b,d=a.isIE,g=a.each,c;if(!e.apply_source_formatting){e.indent=false}e.remove_trailing_brs=true;i=i||a.DOM;f=f||new a.html.Schema(e);e.entity_encoding=e.entity_encoding||"named";h=new a.util.Dispatcher(self);b=new a.util.Dispatcher(self);c=new a.html.DomParser(e,f);c.addAttributeFilter("src,href,style",function(k,j){var o=k.length,l,q,n="data-mce-"+j,p=e.url_converter,r=e.url_converter_scope,m;while(o--){l=k[o];q=l.attributes.map[n];if(q!==m){l.attr(j,q.length>0?q:null);l.attr(n,null)}else{q=l.attributes.map[j];if(j==="style"){q=i.serializeStyle(i.parseStyle(q),l.name)}else{if(p){q=p.call(r,q,j,l.name)}}l.attr(j,q.length>0?q:null)}}});c.addAttributeFilter("class",function(j,k){var l=j.length,m,n;while(l--){m=j[l];n=m.attr("class").replace(/\s*mce(Item\w+|Selected)\s*/g,"");m.attr("class",n.length>0?n:null)}});c.addAttributeFilter("data-mce-type",function(j,l,k){var m=j.length,n;while(m--){n=j[m];if(n.attributes.map["data-mce-type"]==="bookmark"&&!k.cleanup){n.remove()}}});c.addNodeFilter("script,style",function(k,l){var m=k.length,n,o;function j(p){return p.replace(/()/g,"\n").replace(/^[\r\n]*|[\r\n]*$/g,"").replace(/^\s*(\/\/\s*|\]\]>|-->|\]\]-->)\s*$/g,"")}while(m--){n=k[m];o=n.firstChild?n.firstChild.value:"";if(l==="script"){n.attr("type",(n.attr("type")||"text/javascript").replace(/^mce\-/,""));if(o.length>0){n.firstChild.value="// "}}else{if(o.length>0){n.firstChild.value=""}}}});c.addNodeFilter("#comment",function(j,k){var l=j.length,m;while(l--){m=j[l];if(m.value.indexOf("[CDATA[")===0){m.name="#cdata";m.type=4;m.value=m.value.replace(/^\[CDATA\[|\]\]$/g,"")}else{if(m.value.indexOf("mce:protected ")===0){m.name="#text";m.type=3;m.raw=true;m.value=unescape(m.value).substr(14)}}}});c.addNodeFilter("xml:namespace,input",function(j,k){var l=j.length,m;while(l--){m=j[l];if(m.type===7){m.remove()}else{if(m.type===1){if(k==="input"&&!("type" in m.attributes.map)){m.attr("type","text")}}}}});if(e.fix_list_elements){c.addNodeFilter("ul,ol",function(k,l){var m=k.length,n,j;while(m--){n=k[m];j=n.parent;if(j.name==="ul"||j.name==="ol"){if(n.prev&&n.prev.name==="li"){n.prev.append(n)}}}})}c.addAttributeFilter("data-mce-src,data-mce-href,data-mce-style",function(j,k){var l=j.length;while(l--){j[l].attr(k,null)}});return{schema:f,addNodeFilter:c.addNodeFilter,addAttributeFilter:c.addAttributeFilter,onPreProcess:h,onPostProcess:b,serialize:function(o,m){var l,p,k,j,n;if(d&&i.select("script,style,select").length>0){n=o.innerHTML;o=o.cloneNode(false);i.setHTML(o,n)}else{o=o.cloneNode(true)}l=o.ownerDocument.implementation;if(l.createHTMLDocument){p=l.createHTMLDocument("");g(o.nodeName=="BODY"?o.childNodes:[o],function(q){p.body.appendChild(p.importNode(q,true))});if(o.nodeName!="BODY"){o=p.body.firstChild}else{o=p.body}k=i.doc;i.doc=p}m=m||{};m.format=m.format||"html";if(!m.no_events){m.node=o;h.dispatch(self,m)}j=new a.html.Serializer(e,f);m.content=j.serialize(c.parse(m.getInner?o.innerHTML:a.trim(i.getOuterHTML(o),m),m));if(!m.cleanup){m.content=m.content.replace(/\uFEFF/g,"")}if(!m.no_events){b.dispatch(self,m)}if(k){i.doc=k}m.node=null;return m.content},addRules:function(j){f.addValidElements(j)},setRules:function(j){f.setValidElements(j)}}}})(tinymce);(function(a){a.dom.ScriptLoader=function(h){var c=0,k=1,i=2,l={},j=[],f={},d=[],g=0,e;function b(m,v){var x=this,q=a.DOM,s,o,r,n;function p(){q.remove(n);if(s){s.onreadystatechange=s.onload=s=null}v()}function u(){if(typeof(console)!=="undefined"&&console.log){console.log("Failed to load: "+m)}}n=q.uniqueId();if(a.isIE6){o=new a.util.URI(m);r=location;if(o.host==r.hostname&&o.port==r.port&&(o.protocol+":")==r.protocol&&o.protocol.toLowerCase()!="file"){a.util.XHR.send({url:a._addVer(o.getURI()),success:function(y){var t=q.create("script",{type:"text/javascript"});t.text=y;document.getElementsByTagName("head")[0].appendChild(t);q.remove(t);p()},error:u});return}}s=q.create("script",{id:n,type:"text/javascript",src:a._addVer(m)});if(!a.isIE){s.onload=p}s.onerror=u;if(!a.isOpera){s.onreadystatechange=function(){var t=s.readyState;if(t=="complete"||t=="loaded"){p()}}}(document.getElementsByTagName("head")[0]||document.body).appendChild(s)}this.isDone=function(m){return l[m]==i};this.markDone=function(m){l[m]=i};this.add=this.load=function(m,q,n){var o,p=l[m];if(p==e){j.push(m);l[m]=c}if(q){if(!f[m]){f[m]=[]}f[m].push({func:q,scope:n||this})}};this.loadQueue=function(n,m){this.loadScripts(j,n,m)};this.loadScripts=function(m,q,p){var o;function n(r){a.each(f[r],function(s){s.func.call(s.scope)});f[r]=e}d.push({func:q,scope:p||this});o=function(){var r=a.grep(m);m.length=0;a.each(r,function(s){if(l[s]==i){n(s);return}if(l[s]!=k){l[s]=k;g++;b(s,function(){l[s]=i;g--;n(s);o()})}});if(!g){a.each(d,function(s){s.func.call(s.scope)});d.length=0}};o()}};a.ScriptLoader=new a.dom.ScriptLoader()})(tinymce);tinymce.dom.TreeWalker=function(a,c){var b=a;function d(i,f,e,j){var h,g;if(i){if(!j&&i[f]){return i[f]}if(i!=c){h=i[e];if(h){return h}for(g=i.parentNode;g&&g!=c;g=g.parentNode){h=g[e];if(h){return h}}}}}this.current=function(){return b};this.next=function(e){return(b=d(b,"firstChild","nextSibling",e))};this.prev=function(e){return(b=d(b,"lastChild","previousSibling",e))}};(function(a){a.dom.RangeUtils=function(c){var b="\uFEFF";this.walk=function(d,r){var h=d.startContainer,k=d.startOffset,s=d.endContainer,l=d.endOffset,i,f,n,g,q,p,e;e=c.select("td.mceSelected,th.mceSelected");if(e.length>0){a.each(e,function(t){r([t])});return}function o(v,u,t){var x=[];for(;v&&v!=t;v=v[u]){x.push(v)}return x}function m(u,t){do{if(u.parentNode==t){return u}u=u.parentNode}while(u)}function j(v,u,x){var t=x?"nextSibling":"previousSibling";for(g=v,q=g.parentNode;g&&g!=u;g=q){q=g.parentNode;p=o(g==v?g:g[t],t);if(p.length){if(!x){p.reverse()}r(p)}}}if(h.nodeType==1&&h.hasChildNodes()){h=h.childNodes[k]}if(s.nodeType==1&&s.hasChildNodes()){s=s.childNodes[Math.min(l-1,s.childNodes.length-1)]}i=c.findCommonAncestor(h,s);if(h==s){return r([h])}for(g=h;g;g=g.parentNode){if(g==s){return j(h,i,true)}if(g==i){break}}for(g=s;g;g=g.parentNode){if(g==h){return j(s,i)}if(g==i){break}}f=m(h,i)||h;n=m(s,i)||s;j(h,f,true);p=o(f==h?f:f.nextSibling,"nextSibling",n==s?n.nextSibling:n);if(p.length){r(p)}j(s,n)}};a.dom.RangeUtils.compareRanges=function(c,b){if(c&&b){if(c.item||c.duplicate){if(c.item&&b.item&&c.item(0)===b.item(0)){return true}if(c.isEqual&&b.isEqual&&b.isEqual(c)){return true}}else{return c.startContainer==b.startContainer&&c.startOffset==b.startOffset}}return false}})(tinymce);(function(b){var a=b.dom.Event,c=b.each;b.create("tinymce.ui.KeyboardNavigation",{KeyboardNavigation:function(e,f){var p=this,m=e.root,l=e.items,n=e.enableUpDown,i=e.enableLeftRight||!e.enableUpDown,k=e.excludeFromTabOrder,j,h,o,d,g;f=f||b.DOM;j=function(q){g=q.target.id};h=function(q){f.setAttrib(q.target.id,"tabindex","-1")};d=function(q){var r=f.get(g);f.setAttrib(r,"tabindex","0");r.focus()};p.focus=function(){f.get(g).focus()};p.destroy=function(){c(l,function(q){f.unbind(f.get(q.id),"focus",j);f.unbind(f.get(q.id),"blur",h)});f.unbind(f.get(m),"focus",d);f.unbind(f.get(m),"keydown",o);l=f=m=p.focus=j=h=o=d=null;p.destroy=function(){}};p.moveFocus=function(u,r){var q=-1,t=p.controls,s;if(!g){return}c(l,function(x,v){if(x.id===g){q=v;return false}});q+=u;if(q<0){q=l.length-1}else{if(q>=l.length){q=0}}s=l[q];f.setAttrib(g,"tabindex","-1");f.setAttrib(s.id,"tabindex","0");f.get(s.id).focus();if(e.actOnFocus){e.onAction(s.id)}if(r){a.cancel(r)}};o=function(y){var u=37,t=39,x=38,z=40,q=27,s=14,r=13,v=32;switch(y.keyCode){case u:if(i){p.moveFocus(-1)}break;case t:if(i){p.moveFocus(1)}break;case x:if(n){p.moveFocus(-1)}break;case z:if(n){p.moveFocus(1)}break;case q:if(e.onCancel){e.onCancel();a.cancel(y)}break;case s:case r:case v:if(e.onAction){e.onAction(g);a.cancel(y)}break}};c(l,function(s,q){var r;if(!s.id){s.id=f.uniqueId("_mce_item_")}if(k){f.bind(s.id,"blur",h);r="-1"}else{r=(q===0?"0":"-1")}f.setAttrib(s.id,"tabindex",r);f.bind(f.get(s.id),"focus",j)});if(l[0]){g=l[0].id}f.setAttrib(m,"tabindex","-1");f.bind(f.get(m),"focus",d);f.bind(f.get(m),"keydown",o)}})})(tinymce);(function(c){var b=c.DOM,a=c.is;c.create("tinymce.ui.Control",{Control:function(f,e,d){this.id=f;this.settings=e=e||{};this.rendered=false;this.onRender=new c.util.Dispatcher(this);this.classPrefix="";this.scope=e.scope||this;this.disabled=0;this.active=0;this.editor=d},setAriaProperty:function(f,e){var d=b.get(this.id+"_aria")||b.get(this.id);if(d){b.setAttrib(d,"aria-"+f,!!e)}},focus:function(){b.get(this.id).focus()},setDisabled:function(d){if(d!=this.disabled){this.setAriaProperty("disabled",d);this.setState("Disabled",d);this.setState("Enabled",!d);this.disabled=d}},isDisabled:function(){return this.disabled},setActive:function(d){if(d!=this.active){this.setState("Active",d);this.active=d;this.setAriaProperty("pressed",d)}},isActive:function(){return this.active},setState:function(f,d){var e=b.get(this.id);f=this.classPrefix+f;if(d){b.addClass(e,f)}else{b.removeClass(e,f)}},isRendered:function(){return this.rendered},renderHTML:function(){},renderTo:function(d){b.setHTML(d,this.renderHTML())},postRender:function(){var e=this,d;if(a(e.disabled)){d=e.disabled;e.disabled=-1;e.setDisabled(d)}if(a(e.active)){d=e.active;e.active=-1;e.setActive(d)}},remove:function(){b.remove(this.id);this.destroy()},destroy:function(){c.dom.Event.clear(this.id)}})})(tinymce);tinymce.create("tinymce.ui.Container:tinymce.ui.Control",{Container:function(c,b,a){this.parent(c,b,a);this.controls=[];this.lookup={}},add:function(a){this.lookup[a.id]=a;this.controls.push(a);return a},get:function(a){return this.lookup[a]}});tinymce.create("tinymce.ui.Separator:tinymce.ui.Control",{Separator:function(b,a){this.parent(b,a);this.classPrefix="mceSeparator";this.setDisabled(true)},renderHTML:function(){return tinymce.DOM.createHTML("span",{"class":this.classPrefix,role:"separator","aria-orientation":"vertical",tabindex:"-1"})}});(function(d){var c=d.is,b=d.DOM,e=d.each,a=d.walk;d.create("tinymce.ui.MenuItem:tinymce.ui.Control",{MenuItem:function(g,f){this.parent(g,f);this.classPrefix="mceMenuItem"},setSelected:function(f){this.setState("Selected",f);this.setAriaProperty("checked",!!f);this.selected=f},isSelected:function(){return this.selected},postRender:function(){var f=this;f.parent();if(c(f.selected)){f.setSelected(f.selected)}}})})(tinymce);(function(d){var c=d.is,b=d.DOM,e=d.each,a=d.walk;d.create("tinymce.ui.Menu:tinymce.ui.MenuItem",{Menu:function(h,g){var f=this;f.parent(h,g);f.items={};f.collapsed=false;f.menuCount=0;f.onAddItem=new d.util.Dispatcher(this)},expand:function(g){var f=this;if(g){a(f,function(h){if(h.expand){h.expand()}},"items",f)}f.collapsed=false},collapse:function(g){var f=this;if(g){a(f,function(h){if(h.collapse){h.collapse()}},"items",f)}f.collapsed=true},isCollapsed:function(){return this.collapsed},add:function(f){if(!f.settings){f=new d.ui.MenuItem(f.id||b.uniqueId(),f)}this.onAddItem.dispatch(this,f);return this.items[f.id]=f},addSeparator:function(){return this.add({separator:true})},addMenu:function(f){if(!f.collapse){f=this.createMenu(f)}this.menuCount++;return this.add(f)},hasMenus:function(){return this.menuCount!==0},remove:function(f){delete this.items[f.id]},removeAll:function(){var f=this;a(f,function(g){if(g.removeAll){g.removeAll()}else{g.remove()}g.destroy()},"items",f);f.items={}},createMenu:function(g){var f=new d.ui.Menu(g.id||b.uniqueId(),g);f.onAddItem.add(this.onAddItem.dispatch,this.onAddItem);return f}})})(tinymce);(function(e){var d=e.is,c=e.DOM,f=e.each,a=e.dom.Event,b=e.dom.Element;e.create("tinymce.ui.DropMenu:tinymce.ui.Menu",{DropMenu:function(h,g){g=g||{};g.container=g.container||c.doc.body;g.offset_x=g.offset_x||0;g.offset_y=g.offset_y||0;g.vp_offset_x=g.vp_offset_x||0;g.vp_offset_y=g.vp_offset_y||0;if(d(g.icons)&&!g.icons){g["class"]+=" mceNoIcons"}this.parent(h,g);this.onShowMenu=new e.util.Dispatcher(this);this.onHideMenu=new e.util.Dispatcher(this);this.classPrefix="mceMenu"},createMenu:function(j){var h=this,i=h.settings,g;j.container=j.container||i.container;j.parent=h;j.constrain=j.constrain||i.constrain;j["class"]=j["class"]||i["class"];j.vp_offset_x=j.vp_offset_x||i.vp_offset_x;j.vp_offset_y=j.vp_offset_y||i.vp_offset_y;j.keyboard_focus=i.keyboard_focus;g=new e.ui.DropMenu(j.id||c.uniqueId(),j);g.onAddItem.add(h.onAddItem.dispatch,h.onAddItem);return g},focus:function(){var g=this;if(g.keyboardNav){g.keyboardNav.focus()}},update:function(){var i=this,j=i.settings,g=c.get("menu_"+i.id+"_tbl"),l=c.get("menu_"+i.id+"_co"),h,k;h=j.max_width?Math.min(g.clientWidth,j.max_width):g.clientWidth;k=j.max_height?Math.min(g.clientHeight,j.max_height):g.clientHeight;if(!c.boxModel){i.element.setStyles({width:h+2,height:k+2})}else{i.element.setStyles({width:h,height:k})}if(j.max_width){c.setStyle(l,"width",h)}if(j.max_height){c.setStyle(l,"height",k);if(g.clientHeightv){p=r?r-u:Math.max(0,(v-A.vp_offset_x)-u)}if((n+A.vp_offset_y+l)>q){n=Math.max(0,(q-A.vp_offset_y)-l)}}c.setStyles(o,{left:p,top:n});z.element.update();z.isMenuVisible=1;z.mouseClickFunc=a.add(o,"click",function(s){var h;s=s.target;if(s&&(s=c.getParent(s,"tr"))&&!c.hasClass(s,m+"ItemSub")){h=z.items[s.id];if(h.isDisabled()){return}k=z;while(k){if(k.hideMenu){k.hideMenu()}k=k.settings.parent}if(h.settings.onclick){h.settings.onclick(s)}return a.cancel(s)}});if(z.hasMenus()){z.mouseOverFunc=a.add(o,"mouseover",function(x){var h,t,s;x=x.target;if(x&&(x=c.getParent(x,"tr"))){h=z.items[x.id];if(z.lastMenu){z.lastMenu.collapse(1)}if(h.isDisabled()){return}if(x&&c.hasClass(x,m+"ItemSub")){t=c.getRect(x);h.showMenu((t.x+t.w-i),t.y-i,t.x);z.lastMenu=h;c.addClass(c.get(h.id).firstChild,m+"ItemActive")}}})}a.add(o,"keydown",z._keyHandler,z);z.onShowMenu.dispatch(z);if(A.keyboard_focus){z._setupKeyboardNav()}},hideMenu:function(j){var g=this,i=c.get("menu_"+g.id),h;if(!g.isMenuVisible){return}if(g.keyboardNav){g.keyboardNav.destroy()}a.remove(i,"mouseover",g.mouseOverFunc);a.remove(i,"click",g.mouseClickFunc);a.remove(i,"keydown",g._keyHandler);c.hide(i);g.isMenuVisible=0;if(!j){g.collapse(1)}if(g.element){g.element.hide()}if(h=c.get(g.id)){c.removeClass(h.firstChild,g.classPrefix+"ItemActive")}g.onHideMenu.dispatch(g)},add:function(i){var g=this,h;i=g.parent(i);if(g.isRendered&&(h=c.get("menu_"+g.id))){g._add(c.select("tbody",h)[0],i)}return i},collapse:function(g){this.parent(g);this.hideMenu(1)},remove:function(g){c.remove(g.id);this.destroy();return this.parent(g)},destroy:function(){var g=this,h=c.get("menu_"+g.id);if(g.keyboardNav){g.keyboardNav.destroy()}a.remove(h,"mouseover",g.mouseOverFunc);a.remove(c.select("a",h),"focus",g.mouseOverFunc);a.remove(h,"click",g.mouseClickFunc);a.remove(h,"keydown",g._keyHandler);if(g.element){g.element.remove()}c.remove(h)},renderNode:function(){var i=this,j=i.settings,l,h,k,g;g=c.create("div",{role:"listbox",id:"menu_"+i.id,"class":j["class"],style:"position:absolute;left:0;top:0;z-index:200000;outline:0"});if(i.settings.parent){c.setAttrib(g,"aria-parent","menu_"+i.settings.parent.id)}k=c.add(g,"div",{role:"presentation",id:"menu_"+i.id+"_co","class":i.classPrefix+(j["class"]?" "+j["class"]:"")});i.element=new b("menu_"+i.id,{blocker:1,container:j.container});if(j.menu_line){c.add(k,"span",{"class":i.classPrefix+"Line"})}l=c.add(k,"table",{role:"presentation",id:"menu_"+i.id+"_tbl",border:0,cellPadding:0,cellSpacing:0});h=c.add(l,"tbody");f(i.items,function(m){i._add(h,m)});i.rendered=true;return g},_setupKeyboardNav:function(){var i,h,g=this;i=c.select("#menu_"+g.id)[0];h=c.select("a[role=option]","menu_"+g.id);h.splice(0,0,i);g.keyboardNav=new e.ui.KeyboardNavigation({root:"menu_"+g.id,items:h,onCancel:function(){g.hideMenu()},enableUpDown:true});i.focus()},_keyHandler:function(g){var h=this,i;switch(g.keyCode){case 37:if(h.settings.parent){h.hideMenu();h.settings.parent.focus();a.cancel(g)}break;case 39:if(h.mouseOverFunc){h.mouseOverFunc(g)}break}},_add:function(j,h){var i,q=h.settings,p,l,k,m=this.classPrefix,g;if(q.separator){l=c.add(j,"tr",{id:h.id,"class":m+"ItemSeparator"});c.add(l,"td",{"class":m+"ItemSeparator"});if(i=l.previousSibling){c.addClass(i,"mceLast")}return}i=l=c.add(j,"tr",{id:h.id,"class":m+"Item "+m+"ItemEnabled"});i=k=c.add(i,q.titleItem?"th":"td");i=p=c.add(i,"a",{id:h.id+"_aria",role:q.titleItem?"presentation":"option",href:"javascript:;",onclick:"return false;",onmousedown:"return false;"});if(q.parent){c.setAttrib(p,"aria-haspopup","true");c.setAttrib(p,"aria-owns","menu_"+h.id)}c.addClass(k,q["class"]);g=c.add(i,"span",{"class":"mceIcon"+(q.icon?" mce_"+q.icon:"")});if(q.icon_src){c.add(g,"img",{src:q.icon_src})}i=c.add(i,q.element||"span",{"class":"mceText",title:h.settings.title},h.settings.title);if(h.settings.style){c.setAttrib(i,"style",h.settings.style)}if(j.childNodes.length==1){c.addClass(l,"mceFirst")}if((i=l.previousSibling)&&c.hasClass(i,m+"ItemSeparator")){c.addClass(l,"mceFirst")}if(h.collapse){c.addClass(l,m+"ItemSub")}if(i=l.previousSibling){c.removeClass(i,"mceLast")}c.addClass(l,"mceLast")}})})(tinymce);(function(b){var a=b.DOM;b.create("tinymce.ui.Button:tinymce.ui.Control",{Button:function(e,d,c){this.parent(e,d,c);this.classPrefix="mceButton"},renderHTML:function(){var f=this.classPrefix,e=this.settings,d,c;c=a.encode(e.label||"");d='';if(e.image){d+=''+a.encode(e.title)+''+c}else{d+=''+(c?''+c+"":"")}d+='";d+="";return d},postRender:function(){var c=this,d=c.settings;b.dom.Event.add(c.id,"click",function(f){if(!c.isDisabled()){return d.onclick.call(d.scope,f)}})}})})(tinymce);(function(d){var c=d.DOM,b=d.dom.Event,e=d.each,a=d.util.Dispatcher;d.create("tinymce.ui.ListBox:tinymce.ui.Control",{ListBox:function(i,h,f){var g=this;g.parent(i,h,f);g.items=[];g.onChange=new a(g);g.onPostRender=new a(g);g.onAdd=new a(g);g.onRenderMenu=new d.util.Dispatcher(this);g.classPrefix="mceListBox"},select:function(h){var g=this,j,i;if(h==undefined){return g.selectByIndex(-1)}if(h&&h.call){i=h}else{i=function(f){return f==h}}if(h!=g.selectedValue){e(g.items,function(k,f){if(i(k.value)){j=1;g.selectByIndex(f);return false}});if(!j){g.selectByIndex(-1)}}},selectByIndex:function(f){var g=this,h,i;if(f!=g.selectedIndex){h=c.get(g.id+"_text");i=g.items[f];if(i){g.selectedValue=i.value;g.selectedIndex=f;c.setHTML(h,c.encode(i.title));c.removeClass(h,"mceTitle");c.setAttrib(g.id,"aria-valuenow",i.title)}else{c.setHTML(h,c.encode(g.settings.title));c.addClass(h,"mceTitle");g.selectedValue=g.selectedIndex=null;c.setAttrib(g.id,"aria-valuenow",g.settings.title)}h=0}},add:function(i,f,h){var g=this;h=h||{};h=d.extend(h,{title:i,value:f});g.items.push(h);g.onAdd.dispatch(g,h)},getLength:function(){return this.items.length},renderHTML:function(){var i="",f=this,g=f.settings,j=f.classPrefix;i='';i+="";i+="";i+="";return i},showMenu:function(){var g=this,j,i,h=c.get(this.id),f;if(g.isDisabled()||g.items.length==0){return}if(g.menu&&g.menu.isMenuVisible){return g.hideMenu()}if(!g.isMenuRendered){g.renderMenu();g.isMenuRendered=true}j=c.getPos(this.settings.menu_container);i=c.getPos(h);f=g.menu;f.settings.offset_x=i.x;f.settings.offset_y=i.y;f.settings.keyboard_focus=!d.isOpera;if(g.oldID){f.items[g.oldID].setSelected(0)}e(g.items,function(k){if(k.value===g.selectedValue){f.items[k.id].setSelected(1);g.oldID=k.id}});f.showMenu(0,h.clientHeight);b.add(c.doc,"mousedown",g.hideMenu,g);c.addClass(g.id,g.classPrefix+"Selected")},hideMenu:function(g){var f=this;if(f.menu&&f.menu.isMenuVisible){c.removeClass(f.id,f.classPrefix+"Selected");if(g&&g.type=="mousedown"&&(g.target.id==f.id+"_text"||g.target.id==f.id+"_open")){return}if(!g||!c.getParent(g.target,".mceMenu")){c.removeClass(f.id,f.classPrefix+"Selected");b.remove(c.doc,"mousedown",f.hideMenu,f);f.menu.hideMenu()}}},renderMenu:function(){var g=this,f;f=g.settings.control_manager.createDropMenu(g.id+"_menu",{menu_line:1,"class":g.classPrefix+"Menu mceNoIcons",max_width:150,max_height:150});f.onHideMenu.add(function(){g.hideMenu();g.focus()});f.add({title:g.settings.title,"class":"mceMenuItemTitle",onclick:function(){if(g.settings.onselect("")!==false){g.select("")}}});e(g.items,function(h){if(h.value===undefined){f.add({title:h.title,"class":"mceMenuItemTitle",onclick:function(){if(g.settings.onselect("")!==false){g.select("")}}})}else{h.id=c.uniqueId();h.onclick=function(){if(g.settings.onselect(h.value)!==false){g.select(h.value)}};f.add(h)}});g.onRenderMenu.dispatch(g,f);g.menu=f},postRender:function(){var f=this,g=f.classPrefix;b.add(f.id,"click",f.showMenu,f);b.add(f.id,"keydown",function(h){if(h.keyCode==32){f.showMenu(h);b.cancel(h)}});b.add(f.id,"focus",function(){if(!f._focused){f.keyDownHandler=b.add(f.id,"keydown",function(h){if(h.keyCode==40){f.showMenu();b.cancel(h)}});f.keyPressHandler=b.add(f.id,"keypress",function(i){var h;if(i.keyCode==13){h=f.selectedValue;f.selectedValue=null;b.cancel(i);f.settings.onselect(h)}})}f._focused=1});b.add(f.id,"blur",function(){b.remove(f.id,"keydown",f.keyDownHandler);b.remove(f.id,"keypress",f.keyPressHandler);f._focused=0});if(d.isIE6||!c.boxModel){b.add(f.id,"mouseover",function(){if(!c.hasClass(f.id,g+"Disabled")){c.addClass(f.id,g+"Hover")}});b.add(f.id,"mouseout",function(){if(!c.hasClass(f.id,g+"Disabled")){c.removeClass(f.id,g+"Hover")}})}f.onPostRender.dispatch(f,c.get(f.id))},destroy:function(){this.parent();b.clear(this.id+"_text");b.clear(this.id+"_open")}})})(tinymce);(function(d){var c=d.DOM,b=d.dom.Event,e=d.each,a=d.util.Dispatcher;d.create("tinymce.ui.NativeListBox:tinymce.ui.ListBox",{NativeListBox:function(g,f){this.parent(g,f);this.classPrefix="mceNativeListBox"},setDisabled:function(f){c.get(this.id).disabled=f;this.setAriaProperty("disabled",f)},isDisabled:function(){return c.get(this.id).disabled},select:function(h){var g=this,j,i;if(h==undefined){return g.selectByIndex(-1)}if(h&&h.call){i=h}else{i=function(f){return f==h}}if(h!=g.selectedValue){e(g.items,function(k,f){if(i(k.value)){j=1;g.selectByIndex(f);return false}});if(!j){g.selectByIndex(-1)}}},selectByIndex:function(f){c.get(this.id).selectedIndex=f+1;this.selectedValue=this.items[f]?this.items[f].value:null},add:function(j,g,f){var i,h=this;f=f||{};f.value=g;if(h.isRendered()){c.add(c.get(this.id),"option",f,j)}i={title:j,value:g,attribs:f};h.items.push(i);h.onAdd.dispatch(h,i)},getLength:function(){return this.items.length},renderHTML:function(){var g,f=this;g=c.createHTML("option",{value:""},"-- "+f.settings.title+" --");e(f.items,function(h){g+=c.createHTML("option",{value:h.value},h.title)});g=c.createHTML("select",{id:f.id,"class":"mceNativeListBox","aria-labelledby":f.id+"_aria"},g);g+=c.createHTML("span",{id:f.id+"_aria",style:"display: none"},f.settings.title);return g},postRender:function(){var g=this,h,i=true;g.rendered=true;function f(k){var j=g.items[k.target.selectedIndex-1];if(j&&(j=j.value)){g.onChange.dispatch(g,j);if(g.settings.onselect){g.settings.onselect(j)}}}b.add(g.id,"change",f);b.add(g.id,"keydown",function(k){var j;b.remove(g.id,"change",h);i=false;j=b.add(g.id,"blur",function(){if(i){return}i=true;b.add(g.id,"change",f);b.remove(g.id,"blur",j)});if(k.keyCode==13||k.keyCode==32){f(k);return b.cancel(k)}});g.onPostRender.dispatch(g,c.get(g.id))}})})(tinymce);(function(c){var b=c.DOM,a=c.dom.Event,d=c.each;c.create("tinymce.ui.MenuButton:tinymce.ui.Button",{MenuButton:function(g,f,e){this.parent(g,f,e);this.onRenderMenu=new c.util.Dispatcher(this);f.menu_container=f.menu_container||b.doc.body},showMenu:function(){var g=this,j,i,h=b.get(g.id),f;if(g.isDisabled()){return}if(!g.isMenuRendered){g.renderMenu();g.isMenuRendered=true}if(g.isMenuVisible){return g.hideMenu()}j=b.getPos(g.settings.menu_container);i=b.getPos(h);f=g.menu;f.settings.offset_x=i.x;f.settings.offset_y=i.y;f.settings.vp_offset_x=i.x;f.settings.vp_offset_y=i.y;f.settings.keyboard_focus=g._focused;f.showMenu(0,h.clientHeight);a.add(b.doc,"mousedown",g.hideMenu,g);g.setState("Selected",1);g.isMenuVisible=1},renderMenu:function(){var f=this,e;e=f.settings.control_manager.createDropMenu(f.id+"_menu",{menu_line:1,"class":this.classPrefix+"Menu",icons:f.settings.icons});e.onHideMenu.add(function(){f.hideMenu();f.focus()});f.onRenderMenu.dispatch(f,e);f.menu=e},hideMenu:function(g){var f=this;if(g&&g.type=="mousedown"&&b.getParent(g.target,function(h){return h.id===f.id||h.id===f.id+"_open"})){return}if(!g||!b.getParent(g.target,".mceMenu")){f.setState("Selected",0);a.remove(b.doc,"mousedown",f.hideMenu,f);if(f.menu){f.menu.hideMenu()}}f.isMenuVisible=0},postRender:function(){var e=this,f=e.settings;a.add(e.id,"click",function(){if(!e.isDisabled()){if(f.onclick){f.onclick(e.value)}e.showMenu()}})}})})(tinymce);(function(c){var b=c.DOM,a=c.dom.Event,d=c.each;c.create("tinymce.ui.SplitButton:tinymce.ui.MenuButton",{SplitButton:function(g,f,e){this.parent(g,f,e);this.classPrefix="mceSplitButton"},renderHTML:function(){var i,f=this,g=f.settings,e;i="";if(g.image){e=b.createHTML("img ",{src:g.image,role:"presentation","class":"mceAction "+g["class"]})}else{e=b.createHTML("span",{"class":"mceAction "+g["class"]},"")}e+=b.createHTML("span",{"class":"mceVoiceLabel mceIconOnly",id:f.id+"_voice",style:"display:none;"},g.title);i+=""+b.createHTML("a",{role:"button",id:f.id+"_action",tabindex:"-1",href:"javascript:;","class":"mceAction "+g["class"],onclick:"return false;",onmousedown:"return false;",title:g.title},e)+"";e=b.createHTML("span",{"class":"mceOpen "+g["class"]},'');i+=""+b.createHTML("a",{role:"button",id:f.id+"_open",tabindex:"-1",href:"javascript:;","class":"mceOpen "+g["class"],onclick:"return false;",onmousedown:"return false;",title:g.title},e)+"";i+="";i=b.createHTML("table",{id:f.id,role:"presentation",tabindex:"0","class":"mceSplitButton mceSplitButtonEnabled "+g["class"],cellpadding:"0",cellspacing:"0",title:g.title},i);return b.createHTML("span",{role:"button","aria-labelledby":f.id+"_voice","aria-haspopup":"true"},i)},postRender:function(){var e=this,g=e.settings,f;if(g.onclick){f=function(h){if(!e.isDisabled()){g.onclick(e.value);a.cancel(h)}};a.add(e.id+"_action","click",f);a.add(e.id,["click","keydown"],function(h){var k=32,m=14,i=13,j=38,l=40;if((h.keyCode===32||h.keyCode===13||h.keyCode===14)&&!h.altKey&&!h.ctrlKey&&!h.metaKey){f();a.cancel(h)}else{if(h.type==="click"||h.keyCode===l){e.showMenu();a.cancel(h)}}})}a.add(e.id+"_open","click",function(h){e.showMenu();a.cancel(h)});a.add([e.id,e.id+"_open"],"focus",function(){e._focused=1});a.add([e.id,e.id+"_open"],"blur",function(){e._focused=0});if(c.isIE6||!b.boxModel){a.add(e.id,"mouseover",function(){if(!b.hasClass(e.id,"mceSplitButtonDisabled")){b.addClass(e.id,"mceSplitButtonHover")}});a.add(e.id,"mouseout",function(){if(!b.hasClass(e.id,"mceSplitButtonDisabled")){b.removeClass(e.id,"mceSplitButtonHover")}})}},destroy:function(){this.parent();a.clear(this.id+"_action");a.clear(this.id+"_open");a.clear(this.id)}})})(tinymce);(function(d){var c=d.DOM,a=d.dom.Event,b=d.is,e=d.each;d.create("tinymce.ui.ColorSplitButton:tinymce.ui.SplitButton",{ColorSplitButton:function(i,h,f){var g=this;g.parent(i,h,f);g.settings=h=d.extend({colors:"000000,993300,333300,003300,003366,000080,333399,333333,800000,FF6600,808000,008000,008080,0000FF,666699,808080,FF0000,FF9900,99CC00,339966,33CCCC,3366FF,800080,999999,FF00FF,FFCC00,FFFF00,00FF00,00FFFF,00CCFF,993366,C0C0C0,FF99CC,FFCC99,FFFF99,CCFFCC,CCFFFF,99CCFF,CC99FF,FFFFFF",grid_width:8,default_color:"#888888"},g.settings);g.onShowMenu=new d.util.Dispatcher(g);g.onHideMenu=new d.util.Dispatcher(g);g.value=h.default_color},showMenu:function(){var f=this,g,j,i,h;if(f.isDisabled()){return}if(!f.isMenuRendered){f.renderMenu();f.isMenuRendered=true}if(f.isMenuVisible){return f.hideMenu()}i=c.get(f.id);c.show(f.id+"_menu");c.addClass(i,"mceSplitButtonSelected");h=c.getPos(i);c.setStyles(f.id+"_menu",{left:h.x,top:h.y+i.clientHeight,zIndex:200000});i=0;a.add(c.doc,"mousedown",f.hideMenu,f);f.onShowMenu.dispatch(f);if(f._focused){f._keyHandler=a.add(f.id+"_menu","keydown",function(k){if(k.keyCode==27){f.hideMenu()}});c.select("a",f.id+"_menu")[0].focus()}f.isMenuVisible=1},hideMenu:function(g){var f=this;if(f.isMenuVisible){if(g&&g.type=="mousedown"&&c.getParent(g.target,function(h){return h.id===f.id+"_open"})){return}if(!g||!c.getParent(g.target,".mceSplitButtonMenu")){c.removeClass(f.id,"mceSplitButtonSelected");a.remove(c.doc,"mousedown",f.hideMenu,f);a.remove(f.id+"_menu","keydown",f._keyHandler);c.hide(f.id+"_menu")}f.isMenuVisible=0}},renderMenu:function(){var p=this,h,k=0,q=p.settings,g,j,l,o,f;o=c.add(q.menu_container,"div",{role:"listbox",id:p.id+"_menu","class":q.menu_class+" "+q["class"],style:"position:absolute;left:0;top:-1000px;"});h=c.add(o,"div",{"class":q["class"]+" mceSplitButtonMenu"});c.add(h,"span",{"class":"mceMenuLine"});g=c.add(h,"table",{role:"presentation","class":"mceColorSplitMenu"});j=c.add(g,"tbody");k=0;e(b(q.colors,"array")?q.colors:q.colors.split(","),function(i){i=i.replace(/^#/,"");if(!k--){l=c.add(j,"tr");k=q.grid_width-1}g=c.add(l,"td");g=c.add(g,"a",{role:"option",href:"javascript:;",style:{backgroundColor:"#"+i},title:p.editor.getLang("colors."+i,i),"data-mce-color":"#"+i});if(p.editor.forcedHighContrastMode){g=c.add(g,"canvas",{width:16,height:16,"aria-hidden":"true"});if(g.getContext&&(f=g.getContext("2d"))){f.fillStyle="#"+i;f.fillRect(0,0,16,16)}else{c.remove(g)}}});if(q.more_colors_func){g=c.add(j,"tr");g=c.add(g,"td",{colspan:q.grid_width,"class":"mceMoreColors"});g=c.add(g,"a",{role:"option",id:p.id+"_more",href:"javascript:;",onclick:"return false;","class":"mceMoreColors"},q.more_colors_title);a.add(g,"click",function(i){q.more_colors_func.call(q.more_colors_scope||this);return a.cancel(i)})}c.addClass(h,"mceColorSplitMenu");new d.ui.KeyboardNavigation({root:p.id+"_menu",items:c.select("a",p.id+"_menu"),onCancel:function(){p.hideMenu();p.focus()}});a.add(p.id+"_menu","mousedown",function(i){return a.cancel(i)});a.add(p.id+"_menu","click",function(i){var m;i=c.getParent(i.target,"a",j);if(i&&i.nodeName.toLowerCase()=="a"&&(m=i.getAttribute("data-mce-color"))){p.setColor(m)}return a.cancel(i)});return o},setColor:function(f){this.displayColor(f);this.hideMenu();this.settings.onselect(f)},displayColor:function(g){var f=this;c.setStyle(f.id+"_preview","backgroundColor",g);f.value=g},postRender:function(){var f=this,g=f.id;f.parent();c.add(g+"_action","div",{id:g+"_preview","class":"mceColorPreview"});c.setStyle(f.id+"_preview","backgroundColor",f.value)},destroy:function(){this.parent();a.clear(this.id+"_menu");a.clear(this.id+"_more");c.remove(this.id+"_menu")}})})(tinymce);(function(b){var d=b.DOM,c=b.each,a=b.dom.Event;b.create("tinymce.ui.ToolbarGroup:tinymce.ui.Container",{renderHTML:function(){var f=this,i=[],e=f.controls,j=b.each,g=f.settings;i.push('
    ');i.push("");i.push('");j(e,function(h){i.push(h.renderHTML())});i.push("");i.push("
    ");return i.join("")},focus:function(){this.keyNav.focus()},postRender:function(){var f=this,e=[];c(f.controls,function(g){c(g.controls,function(h){if(h.id){e.push(h)}})});f.keyNav=new b.ui.KeyboardNavigation({root:f.id,items:e,onCancel:function(){f.editor.focus()},excludeFromTabOrder:!f.settings.tab_focus_toolbar})},destroy:function(){var e=this;e.parent();e.keyNav.destroy();a.clear(e.id)}})})(tinymce);(function(a){var c=a.DOM,b=a.each;a.create("tinymce.ui.Toolbar:tinymce.ui.Container",{renderHTML:function(){var m=this,f="",j,k,n=m.settings,e,d,g,l;l=m.controls;for(e=0;e"))}if(d&&k.ListBox){if(d.Button||d.SplitButton){f+=c.createHTML("td",{"class":"mceToolbarEnd"},c.createHTML("span",null,""))}}if(c.stdMode){f+=''+k.renderHTML()+""}else{f+=""+k.renderHTML()+""}if(g&&k.ListBox){if(g.Button||g.SplitButton){f+=c.createHTML("td",{"class":"mceToolbarStart"},c.createHTML("span",null,""))}}}j="mceToolbarEnd";if(k.Button){j+=" mceToolbarEndButton"}else{if(k.SplitButton){j+=" mceToolbarEndSplitButton"}else{if(k.ListBox){j+=" mceToolbarEndListBox"}}}f+=c.createHTML("td",{"class":j},c.createHTML("span",null,""));return c.createHTML("table",{id:m.id,"class":"mceToolbar"+(n["class"]?" "+n["class"]:""),cellpadding:"0",cellspacing:"0",align:m.settings.align||"",role:"presentation",tabindex:"-1"},""+f+"")}})})(tinymce);(function(b){var a=b.util.Dispatcher,c=b.each;b.create("tinymce.AddOnManager",{AddOnManager:function(){var d=this;d.items=[];d.urls={};d.lookup={};d.onAdd=new a(d)},get:function(d){return this.lookup[d]},requireLangPack:function(e){var d=b.settings;if(d&&d.language&&d.language_load!==false){b.ScriptLoader.add(this.urls[e]+"/langs/"+d.language+".js")}},add:function(e,d){this.items.push(d);this.lookup[e]=d;this.onAdd.dispatch(this,e,d);return d},load:function(h,e,d,g){var f=this;if(f.urls[h]){return}if(e.indexOf("/")!=0&&e.indexOf("://")==-1){e=b.baseURL+"/"+e}f.urls[h]=e.substring(0,e.lastIndexOf("/"));if(!f.lookup[h]){b.ScriptLoader.add(e,d,g)}}});b.PluginManager=new b.AddOnManager();b.ThemeManager=new b.AddOnManager()}(tinymce));(function(j){var g=j.each,d=j.extend,k=j.DOM,i=j.dom.Event,f=j.ThemeManager,b=j.PluginManager,e=j.explode,h=j.util.Dispatcher,a,c=0;j.documentBaseURL=window.location.href.replace(/[\?#].*$/,"").replace(/[\/\\][^\/]+$/,"");if(!/[\/\\]$/.test(j.documentBaseURL)){j.documentBaseURL+="/"}j.baseURL=new j.util.URI(j.documentBaseURL).toAbsolute(j.baseURL);j.baseURI=new j.util.URI(j.baseURL);j.onBeforeUnload=new h(j);i.add(window,"beforeunload",function(l){j.onBeforeUnload.dispatch(j,l)});j.onAddEditor=new h(j);j.onRemoveEditor=new h(j);j.EditorManager=d(j,{editors:[],i18n:{},activeEditor:null,init:function(q){var n=this,p,l=j.ScriptLoader,u,o=[],m;function r(x,y,t){var v=x[y];if(!v){return}if(j.is(v,"string")){t=v.replace(/\.\w+$/,"");t=t?j.resolve(t):0;v=j.resolve(v)}return v.apply(t||this,Array.prototype.slice.call(arguments,2))}q=d({theme:"simple",language:"en"},q);n.settings=q;i.add(document,"init",function(){var s,v;r(q,"onpageload");switch(q.mode){case"exact":s=q.elements||"";if(s.length>0){g(e(s),function(x){if(k.get(x)){m=new j.Editor(x,q);o.push(m);m.render(1)}else{g(document.forms,function(y){g(y.elements,function(z){if(z.name===x){x="mce_editor_"+c++;k.setAttrib(z,"id",x);m=new j.Editor(x,q);o.push(m);m.render(1)}})})}})}break;case"textareas":case"specific_textareas":function t(y,x){return x.constructor===RegExp?x.test(y.className):k.hasClass(y,x)}g(k.select("textarea"),function(x){if(q.editor_deselector&&t(x,q.editor_deselector)){return}if(!q.editor_selector||t(x,q.editor_selector)){u=k.get(x.name);if(!x.id&&!u){x.id=x.name}if(!x.id||n.get(x.id)){x.id=k.uniqueId()}m=new j.Editor(x.id,q);o.push(m);m.render(1)}});break}if(q.oninit){s=v=0;g(o,function(x){v++;if(!x.initialized){x.onInit.add(function(){s++;if(s==v){r(q,"oninit")}})}else{s++}if(s==v){r(q,"oninit")}})}})},get:function(l){if(l===a){return this.editors}return this.editors[l]},getInstanceById:function(l){return this.get(l)},add:function(m){var l=this,n=l.editors;n[m.id]=m;n.push(m);l._setActive(m);l.onAddEditor.dispatch(l,m);return m},remove:function(n){var m=this,l,o=m.editors;if(!o[n.id]){return null}delete o[n.id];for(l=0;l':"",visual_table_class:"mceItemTable",visual:1,font_size_style_values:"xx-small,x-small,small,medium,large,x-large,xx-large",apply_source_formatting:1,directionality:"ltr",forced_root_block:"p",hidden_input:1,padd_empty_editor:1,render_ui:1,init_theme:1,force_p_newlines:1,indentation:"30px",keep_styles:1,fix_table_elements:1,inline_styles:1,convert_fonts_to_spans:true,indent:"simple",indent_before:"p,h1,h2,h3,h4,h5,h6,blockquote,div,title,style,pre,script,td,ul,li,area,table,thead,tfoot,tbody,tr",indent_after:"p,h1,h2,h3,h4,h5,h6,blockquote,div,title,style,pre,script,td,ul,li,area,table,thead,tfoot,tbody,tr",validate:true,entity_encoding:"named",url_converter:p.convertURL,url_converter_scope:p,ie7_compat:true},q);p.documentBaseURI=new m.util.URI(q.document_base_url||m.documentBaseURL,{base_uri:tinyMCE.baseURI});p.baseURI=m.baseURI;p.contentCSS=[];p.execCallback("setup",p)},render:function(r){var u=this,v=u.settings,x=u.id,p=m.ScriptLoader;if(!j.domLoaded){j.add(document,"init",function(){u.render()});return}tinyMCE.settings=v;if(!u.getElement()){return}if(m.isIDevice){return}if(!/TEXTAREA|INPUT/i.test(u.getElement().nodeName)&&v.hidden_input&&n.getParent(x,"form")){n.insertAfter(n.create("input",{type:"hidden",name:x}),x)}if(m.WindowManager){u.windowManager=new m.WindowManager(u)}if(v.encoding=="xml"){u.onGetContent.add(function(s,t){if(t.save){t.content=n.encode(t.content)}})}if(v.add_form_submit_trigger){u.onSubmit.addToTop(function(){if(u.initialized){u.save();u.isNotDirty=1}})}if(v.add_unload_trigger){u._beforeUnload=tinyMCE.onBeforeUnload.add(function(){if(u.initialized&&!u.destroyed&&!u.isHidden()){u.save({format:"raw",no_events:true})}})}m.addUnload(u.destroy,u);if(v.submit_patch){u.onBeforeRenderUI.add(function(){var s=u.getElement().form;if(!s){return}if(s._mceOldSubmit){return}if(!s.submit.nodeType&&!s.submit.length){u.formElement=s;s._mceOldSubmit=s.submit;s.submit=function(){m.triggerSave();u.isNotDirty=1;return u.formElement._mceOldSubmit(u.formElement)}}s=null})}function q(){if(v.language&&v.language_load!==false){p.add(m.baseURL+"/langs/"+v.language+".js")}if(v.theme&&v.theme.charAt(0)!="-"&&!h.urls[v.theme]){h.load(v.theme,"themes/"+v.theme+"/editor_template"+m.suffix+".js")}i(g(v.plugins),function(s){if(s&&s.charAt(0)!="-"&&!c.urls[s]){if(s=="safari"){return}c.load(s,"plugins/"+s+"/editor_plugin"+m.suffix+".js")}});p.loadQueue(function(){if(!u.removed){u.init()}})}q()},init:function(){var r,F=this,G=F.settings,C,z,B=F.getElement(),q,p,D,x,A,E,y;m.add(F);G.aria_label=G.aria_label||n.getAttrib(B,"aria-label",F.getLang("aria.rich_text_area"));if(G.theme){G.theme=G.theme.replace(/-/,"");q=h.get(G.theme);F.theme=new q();if(F.theme.init&&G.init_theme){F.theme.init(F,h.urls[G.theme]||m.documentBaseURL.replace(/\/$/,""))}}i(g(G.plugins.replace(/\-/g,"")),function(H){var I=c.get(H),t=c.urls[H]||m.documentBaseURL.replace(/\/$/,""),s;if(I){s=new I(F,t);F.plugins[H]=s;if(s.init){s.init(F,t)}}});if(G.popup_css!==false){if(G.popup_css){G.popup_css=F.documentBaseURI.toAbsolute(G.popup_css)}else{G.popup_css=F.baseURI.toAbsolute("themes/"+G.theme+"/skins/"+G.skin+"/dialog.css")}}if(G.popup_css_add){G.popup_css+=","+F.documentBaseURI.toAbsolute(G.popup_css_add)}F.controlManager=new m.ControlManager(F);if(G.custom_undo_redo){F.onBeforeExecCommand.add(function(t,H,u,I,s){if(H!="Undo"&&H!="Redo"&&H!="mceRepaint"&&(!s||!s.skip_undo)){F.undoManager.beforeChange()}});F.onExecCommand.add(function(t,H,u,I,s){if(H!="Undo"&&H!="Redo"&&H!="mceRepaint"&&(!s||!s.skip_undo)){F.undoManager.add()}})}F.onExecCommand.add(function(s,t){if(!/^(FontName|FontSize)$/.test(t)){F.nodeChanged()}});if(a){function v(s,t){if(!t||!t.initial){F.execCommand("mceRepaint")}}F.onUndo.add(v);F.onRedo.add(v);F.onSetContent.add(v)}F.onBeforeRenderUI.dispatch(F,F.controlManager);if(G.render_ui){C=G.width||B.style.width||B.offsetWidth;z=G.height||B.style.height||B.offsetHeight;F.orgDisplay=B.style.display;E=/^[0-9\.]+(|px)$/i;if(E.test(""+C)){C=Math.max(parseInt(C)+(q.deltaWidth||0),100)}if(E.test(""+z)){z=Math.max(parseInt(z)+(q.deltaHeight||0),100)}q=F.theme.renderUI({targetNode:B,width:C,height:z,deltaWidth:G.delta_width,deltaHeight:G.delta_height});F.editorContainer=q.editorContainer}if(document.domain&&location.hostname!=document.domain){m.relaxedDomain=document.domain}n.setStyles(q.sizeContainer||q.editorContainer,{width:C,height:z});if(G.content_css){m.each(g(G.content_css),function(s){F.contentCSS.push(F.documentBaseURI.toAbsolute(s))})}z=(q.iframeHeight||z)+(typeof(z)=="number"?(q.deltaHeight||0):"");if(z<100){z=100}F.iframeHTML=G.doctype+'';if(G.document_base_url!=m.documentBaseURL){F.iframeHTML+=''}if(G.ie7_compat){F.iframeHTML+=''}else{F.iframeHTML+=''}F.iframeHTML+='';if(!a||!/Firefox\/2/.test(navigator.userAgent)){for(y=0;y'}F.contentCSS=[]}x=G.body_id||"tinymce";if(x.indexOf("=")!=-1){x=F.getParam("body_id","","hash");x=x[F.id]||x}A=G.body_class||"";if(A.indexOf("=")!=-1){A=F.getParam("body_class","","hash");A=A[F.id]||""}F.iframeHTML+='';if(m.relaxedDomain&&(b||(m.isOpera&&parseFloat(opera.version())<11))){D='javascript:(function(){document.open();document.domain="'+document.domain+'";var ed = window.parent.tinyMCE.get("'+F.id+'");document.write(ed.iframeHTML);document.close();ed.setupIframe();})()'}r=n.add(q.iframeContainer,"iframe",{id:F.id+"_ifr",src:D||'javascript:""',frameBorder:"0",title:G.aria_label,style:{width:"100%",height:z}});F.contentAreaContainer=q.iframeContainer;n.get(q.editorContainer).style.display=F.orgDisplay;n.get(F.id).style.display="none";n.setAttrib(F.id,"aria-hidden",true);if(!m.relaxedDomain||!D){F.setupIframe()}B=r=q=null},setupIframe:function(){var r=this,x=r.settings,y=n.get(r.id),z=r.getDoc(),v,p;if(!b||!m.relaxedDomain){z.open();z.write(r.iframeHTML);z.close();if(m.relaxedDomain){z.domain=m.relaxedDomain}}if(!b){try{if(!x.readonly){z.designMode="On"}}catch(q){}}if(b){p=r.getBody();n.hide(p);if(!x.readonly){p.contentEditable=true}n.show(p)}r.schema=new m.html.Schema(x);r.dom=new m.dom.DOMUtils(r.getDoc(),{keep_values:true,url_converter:r.convertURL,url_converter_scope:r,hex_colors:x.force_hex_style_colors,class_filter:x.class_filter,update_styles:1,fix_ie_paragraphs:1,schema:r.schema});r.parser=new m.html.DomParser(x,r.schema);r.parser.addAttributeFilter("name",function(s,t){var B=s.length,D,A,C,E;while(B--){E=s[B];if(E.name==="a"&&E.firstChild){C=E.parent;D=E.lastChild;do{A=D.prev;C.insert(D,E);D=A}while(D)}}});r.parser.addAttributeFilter("src,href,style",function(s,t){var A=s.length,B,D=r.dom,C;while(A--){B=s[A];C=B.attr(t);if(t==="style"){B.attr("data-mce-style",D.serializeStyle(D.parseStyle(C),B.name))}else{B.attr("data-mce-"+t,r.convertURL(C,t,B.name))}}});r.parser.addNodeFilter("script",function(s,t){var A=s.length;while(A--){s[A].attr("type","mce-text/javascript")}});r.parser.addNodeFilter("#cdata",function(s,t){var A=s.length,B;while(A--){B=s[A];B.type=8;B.name="#comment";B.value="[CDATA["+B.value+"]]"}});r.parser.addNodeFilter("p,h1,h2,h3,h4,h5,h6,div",function(t,A){var B=t.length,C,s=r.schema.getNonEmptyElements();while(B--){C=t[B];if(C.isEmpty(s)){C.empty().append(new m.html.Node("br",1)).shortEnded=true}}});r.serializer=new m.dom.Serializer(x,r.dom,r.schema);r.selection=new m.dom.Selection(r.dom,r.getWin(),r.serializer);r.formatter=new m.Formatter(this);r.formatter.register({alignleft:[{selector:"p,h1,h2,h3,h4,h5,h6,td,th,div,ul,ol,li",styles:{textAlign:"left"}},{selector:"img,table",collapsed:false,styles:{"float":"left"}}],aligncenter:[{selector:"p,h1,h2,h3,h4,h5,h6,td,th,div,ul,ol,li",styles:{textAlign:"center"}},{selector:"img",collapsed:false,styles:{display:"block",marginLeft:"auto",marginRight:"auto"}},{selector:"table",collapsed:false,styles:{marginLeft:"auto",marginRight:"auto"}}],alignright:[{selector:"p,h1,h2,h3,h4,h5,h6,td,th,div,ul,ol,li",styles:{textAlign:"right"}},{selector:"img,table",collapsed:false,styles:{"float":"right"}}],alignfull:[{selector:"p,h1,h2,h3,h4,h5,h6,td,th,div,ul,ol,li",styles:{textAlign:"justify"}}],bold:[{inline:"strong",remove:"all"},{inline:"span",styles:{fontWeight:"bold"}},{inline:"b",remove:"all"}],italic:[{inline:"em",remove:"all"},{inline:"span",styles:{fontStyle:"italic"}},{inline:"i",remove:"all"}],underline:[{inline:"span",styles:{textDecoration:"underline"},exact:true},{inline:"u",remove:"all"}],strikethrough:[{inline:"span",styles:{textDecoration:"line-through"},exact:true},{inline:"strike",remove:"all"}],forecolor:{inline:"span",styles:{color:"%value"},wrap_links:false},hilitecolor:{inline:"span",styles:{backgroundColor:"%value"},wrap_links:false},fontname:{inline:"span",styles:{fontFamily:"%value"}},fontsize:{inline:"span",styles:{fontSize:"%value"}},fontsize_class:{inline:"span",attributes:{"class":"%value"}},blockquote:{block:"blockquote",wrapper:1,remove:"all"},subscript:{inline:"sub"},superscript:{inline:"sup"},removeformat:[{selector:"b,strong,em,i,font,u,strike",remove:"all",split:true,expand:false,block_expand:true,deep:true},{selector:"span",attributes:["style","class"],remove:"empty",split:true,expand:false,deep:true},{selector:"*",attributes:["style","class"],split:false,expand:false,deep:true}]});i("p h1 h2 h3 h4 h5 h6 div address pre div code dt dd samp".split(/\s/),function(s){r.formatter.register(s,{block:s,remove:"all"})});r.formatter.register(r.settings.formats);r.undoManager=new m.UndoManager(r);r.undoManager.onAdd.add(function(t,s){if(t.hasUndo()){return r.onChange.dispatch(r,s,t)}});r.undoManager.onUndo.add(function(t,s){return r.onUndo.dispatch(r,s,t)});r.undoManager.onRedo.add(function(t,s){return r.onRedo.dispatch(r,s,t)});r.forceBlocks=new m.ForceBlocks(r,{forced_root_block:x.forced_root_block});r.editorCommands=new m.EditorCommands(r);r.serializer.onPreProcess.add(function(s,t){return r.onPreProcess.dispatch(r,t,s)});r.serializer.onPostProcess.add(function(s,t){return r.onPostProcess.dispatch(r,t,s)});r.onPreInit.dispatch(r);if(!x.gecko_spellcheck){r.getBody().spellcheck=0}if(!x.readonly){r._addEvents()}r.controlManager.onPostRender.dispatch(r,r.controlManager);r.onPostRender.dispatch(r);if(x.directionality){r.getBody().dir=x.directionality}if(x.nowrap){r.getBody().style.whiteSpace="nowrap"}if(x.handle_node_change_callback){r.onNodeChange.add(function(t,s,A){r.execCallback("handle_node_change_callback",r.id,A,-1,-1,true,r.selection.isCollapsed())})}if(x.save_callback){r.onSaveContent.add(function(s,A){var t=r.execCallback("save_callback",r.id,A.content,r.getBody());if(t){A.content=t}})}if(x.onchange_callback){r.onChange.add(function(t,s){r.execCallback("onchange_callback",r,s)})}if(x.protect){r.onBeforeSetContent.add(function(s,t){if(x.protect){i(x.protect,function(A){t.content=t.content.replace(A,function(B){return""})})}})}if(x.convert_newlines_to_brs){r.onBeforeSetContent.add(function(s,t){if(t.initial){t.content=t.content.replace(/\r?\n/g,"
    ")}})}if(x.preformatted){r.onPostProcess.add(function(s,t){t.content=t.content.replace(/^\s*/,"");t.content=t.content.replace(/<\/pre>\s*$/,"");if(t.set){t.content='
    '+t.content+"
    "}})}if(x.verify_css_classes){r.serializer.attribValueFilter=function(C,A){var B,t;if(C=="class"){if(!r.classesRE){t=r.dom.getClasses();if(t.length>0){B="";i(t,function(s){B+=(B?"|":"")+s["class"]});r.classesRE=new RegExp("("+B+")","gi")}}return !r.classesRE||/(\bmceItem\w+\b|\bmceTemp\w+\b)/g.test(A)||r.classesRE.test(A)?A:""}return A}}if(x.cleanup_callback){r.onBeforeSetContent.add(function(s,t){t.content=r.execCallback("cleanup_callback","insert_to_editor",t.content,t)});r.onPreProcess.add(function(s,t){if(t.set){r.execCallback("cleanup_callback","insert_to_editor_dom",t.node,t)}if(t.get){r.execCallback("cleanup_callback","get_from_editor_dom",t.node,t)}});r.onPostProcess.add(function(s,t){if(t.set){t.content=r.execCallback("cleanup_callback","insert_to_editor",t.content,t)}if(t.get){t.content=r.execCallback("cleanup_callback","get_from_editor",t.content,t)}})}if(x.save_callback){r.onGetContent.add(function(s,t){if(t.save){t.content=r.execCallback("save_callback",r.id,t.content,r.getBody())}})}if(x.handle_event_callback){r.onEvent.add(function(s,t,A){if(r.execCallback("handle_event_callback",t,s,A)===false){j.cancel(t)}})}r.onSetContent.add(function(){r.addVisual(r.getBody())});if(x.padd_empty_editor){r.onPostProcess.add(function(s,t){t.content=t.content.replace(/^(]*>( | |\s|\u00a0|)<\/p>[\r\n]*|
    [\r\n]*)$/,"")})}if(a){function u(s,t){i(s.dom.select("a"),function(B){var A=B.parentNode;if(s.dom.isBlock(A)&&A.lastChild===B){s.dom.add(A,"br",{"data-mce-bogus":1})}})}r.onExecCommand.add(function(s,t){if(t==="CreateLink"){u(s)}});r.onSetContent.add(r.selection.onSetContent.add(u));if(!x.readonly){try{z.designMode="Off";z.designMode="On"}catch(q){}}}setTimeout(function(){if(r.removed){return}r.load({initial:true,format:"html"});r.startContent=r.getContent({format:"raw"});r.undoManager.add();r.initialized=true;r.onInit.dispatch(r);r.execCallback("setupcontent_callback",r.id,r.getBody(),r.getDoc());r.execCallback("init_instance_callback",r);r.focus(true);r.nodeChanged({initial:1});i(r.contentCSS,function(s){r.dom.loadCSS(s)});if(x.auto_focus){setTimeout(function(){var s=m.get(x.auto_focus);s.selection.select(s.getBody(),1);s.selection.collapse(1);s.getWin().focus()},100)}},1);y=null},focus:function(s){var x,q=this,v=q.settings.content_editable,r,p,u=q.getDoc();if(!s){r=q.selection.getRng();if(r.item){p=r.item(0)}if(!v){q.getWin().focus()}if(p&&p.ownerDocument==u){r=u.body.createControlRange();r.addElement(p);r.select()}}if(m.activeEditor!=q){if((x=m.activeEditor)!=null){x.onDeactivate.dispatch(x,q)}q.onActivate.dispatch(q,x)}m._setActive(q)},execCallback:function(u){var p=this,r=p.settings[u],q;if(!r){return}if(p.callbackLookup&&(q=p.callbackLookup[u])){r=q.func;q=q.scope}if(d(r,"string")){q=r.replace(/\.\w+$/,"");q=q?m.resolve(q):0;r=m.resolve(r);p.callbackLookup=p.callbackLookup||{};p.callbackLookup[u]={func:r,scope:q}}return r.apply(q||p,Array.prototype.slice.call(arguments,1))},translate:function(p){var r=this.settings.language||"en",q=m.i18n;if(!p){return""}return q[r+"."+p]||p.replace(/{\#([^}]+)\}/g,function(t,s){return q[r+"."+s]||"{#"+s+"}"})},getLang:function(q,p){return m.i18n[(this.settings.language||"en")+"."+q]||(d(p)?p:"{#"+q+"}")},getParam:function(u,r,p){var s=m.trim,q=d(this.settings[u])?this.settings[u]:r,t;if(p==="hash"){t={};if(d(q,"string")){i(q.indexOf("=")>0?q.split(/[;,](?![^=;,]*(?:[;,]|$))/):q.split(","),function(x){x=x.split("=");if(x.length>1){t[s(x[0])]=s(x[1])}else{t[s(x[0])]=s(x)}})}else{t=q}return t}return q},nodeChanged:function(r){var p=this,q=p.selection,u=q.getStart()||p.getBody();if(p.initialized){r=r||{};u=b&&u.ownerDocument!=p.getDoc()?p.getBody():u;r.parents=[];p.dom.getParent(u,function(s){if(s.nodeName=="BODY"){return true}r.parents.push(s)});p.onNodeChange.dispatch(p,r?r.controlManager||p.controlManager:p.controlManager,u,q.isCollapsed(),r)}},addButton:function(r,q){var p=this;p.buttons=p.buttons||{};p.buttons[r]=q},addCommand:function(p,r,q){this.execCommands[p]={func:r,scope:q||this}},addQueryStateHandler:function(p,r,q){this.queryStateCommands[p]={func:r,scope:q||this}},addQueryValueHandler:function(p,r,q){this.queryValueCommands[p]={func:r,scope:q||this}},addShortcut:function(r,u,p,s){var q=this,v;if(!q.settings.custom_shortcuts){return false}q.shortcuts=q.shortcuts||{};if(d(p,"string")){v=p;p=function(){q.execCommand(v,false,null)}}if(d(p,"object")){v=p;p=function(){q.execCommand(v[0],v[1],v[2])}}i(g(r),function(t){var x={func:p,scope:s||this,desc:u,alt:false,ctrl:false,shift:false};i(g(t,"+"),function(y){switch(y){case"alt":case"ctrl":case"shift":x[y]=true;break;default:x.charCode=y.charCodeAt(0);x.keyCode=y.toUpperCase().charCodeAt(0)}});q.shortcuts[(x.ctrl?"ctrl":"")+","+(x.alt?"alt":"")+","+(x.shift?"shift":"")+","+x.keyCode]=x});return true},execCommand:function(x,v,z,p){var r=this,u=0,y,q;if(!/^(mceAddUndoLevel|mceEndUndoLevel|mceBeginUndoLevel|mceRepaint|SelectAll)$/.test(x)&&(!p||!p.skip_focus)){r.focus()}y={};r.onBeforeExecCommand.dispatch(r,x,v,z,y);if(y.terminate){return false}if(r.execCallback("execcommand_callback",r.id,r.selection.getNode(),x,v,z)){r.onExecCommand.dispatch(r,x,v,z,p);return true}if(y=r.execCommands[x]){q=y.func.call(y.scope,v,z);if(q!==true){r.onExecCommand.dispatch(r,x,v,z,p);return q}}i(r.plugins,function(s){if(s.execCommand&&s.execCommand(x,v,z)){r.onExecCommand.dispatch(r,x,v,z,p);u=1;return false}});if(u){return true}if(r.theme&&r.theme.execCommand&&r.theme.execCommand(x,v,z)){r.onExecCommand.dispatch(r,x,v,z,p);return true}if(r.editorCommands.execCommand(x,v,z)){r.onExecCommand.dispatch(r,x,v,z,p);return true}r.getDoc().execCommand(x,v,z);r.onExecCommand.dispatch(r,x,v,z,p)},queryCommandState:function(u){var q=this,v,r;if(q._isHidden()){return}if(v=q.queryStateCommands[u]){r=v.func.call(v.scope);if(r!==true){return r}}v=q.editorCommands.queryCommandState(u);if(v!==-1){return v}try{return this.getDoc().queryCommandState(u)}catch(p){}},queryCommandValue:function(v){var q=this,u,r;if(q._isHidden()){return}if(u=q.queryValueCommands[v]){r=u.func.call(u.scope);if(r!==true){return r}}u=q.editorCommands.queryCommandValue(v);if(d(u)){return u}try{return this.getDoc().queryCommandValue(v)}catch(p){}},show:function(){var p=this;n.show(p.getContainer());n.hide(p.id);p.load()},hide:function(){var p=this,q=p.getDoc();if(b&&q){q.execCommand("SelectAll")}p.save();n.hide(p.getContainer());n.setStyle(p.id,"display",p.orgDisplay)},isHidden:function(){return !n.isHidden(this.id)},setProgressState:function(p,q,r){this.onSetProgressState.dispatch(this,p,q,r);return p},load:function(s){var p=this,r=p.getElement(),q;if(r){s=s||{};s.load=true;q=p.setContent(d(r.value)?r.value:r.innerHTML,s);s.element=r;if(!s.no_events){p.onLoadContent.dispatch(p,s)}s.element=r=null;return q}},save:function(u){var p=this,s=p.getElement(),q,r;if(!s||!p.initialized){return}u=u||{};u.save=true;if(!u.no_events){p.undoManager.typing=false;p.undoManager.add()}u.element=s;q=u.content=p.getContent(u);if(!u.no_events){p.onSaveContent.dispatch(p,u)}q=u.content;if(!/TEXTAREA|INPUT/i.test(s.nodeName)){s.innerHTML=q;if(r=n.getParent(p.id,"form")){i(r.elements,function(t){if(t.name==p.id){t.value=q;return false}})}}else{s.value=q}u.element=s=null;return q},setContent:function(t,s){var r=this,q,p=r.getBody();s=s||{};s.format=s.format||"html";s.set=true;s.content=t;if(!s.no_events){r.onBeforeSetContent.dispatch(r,s)}t=s.content;if(!m.isIE&&(t.length===0||/^\s+$/.test(t))){p.innerHTML='
    ';return}if(s.format!=="raw"){t=new m.html.Serializer({},r.schema).serialize(r.parser.parse(t))}s.content=m.trim(t);r.dom.setHTML(p,s.content);if(!s.no_events){r.onSetContent.dispatch(r,s)}return s.content},getContent:function(q){var p=this,r;q=q||{};q.format=q.format||"html";q.get=true;if(!q.no_events){p.onBeforeGetContent.dispatch(p,q)}if(q.format=="raw"){r=p.getBody().innerHTML}else{r=p.serializer.serialize(p.getBody(),q)}q.content=m.trim(r);if(!q.no_events){p.onGetContent.dispatch(p,q)}return q.content},isDirty:function(){var p=this;return m.trim(p.startContent)!=m.trim(p.getContent({format:"raw",no_events:1}))&&!p.isNotDirty},getContainer:function(){var p=this;if(!p.container){p.container=n.get(p.editorContainer||p.id+"_parent")}return p.container},getContentAreaContainer:function(){return this.contentAreaContainer},getElement:function(){return n.get(this.settings.content_element||this.id)},getWin:function(){var p=this,q;if(!p.contentWindow){q=n.get(p.id+"_ifr");if(q){p.contentWindow=q.contentWindow}}return p.contentWindow},getDoc:function(){var q=this,p;if(!q.contentDocument){p=q.getWin();if(p){q.contentDocument=p.document}}return q.contentDocument},getBody:function(){return this.bodyElement||this.getDoc().body},convertURL:function(p,x,v){var q=this,r=q.settings;if(r.urlconverter_callback){return q.execCallback("urlconverter_callback",p,v,true,x)}if(!r.convert_urls||(v&&v.nodeName=="LINK")||p.indexOf("file:")===0){return p}if(r.relative_urls){return q.documentBaseURI.toRelative(p)}p=q.documentBaseURI.toAbsolute(p,r.remove_script_host);return p},addVisual:function(r){var p=this,q=p.settings;r=r||p.getBody();if(!d(p.hasVisual)){p.hasVisual=q.visual}i(p.dom.select("table,a",r),function(t){var s;switch(t.nodeName){case"TABLE":s=p.dom.getAttrib(t,"border");if(!s||s=="0"){if(p.hasVisual){p.dom.addClass(t,q.visual_table_class)}else{p.dom.removeClass(t,q.visual_table_class)}}return;case"A":s=p.dom.getAttrib(t,"name");if(s){if(p.hasVisual){p.dom.addClass(t,"mceItemAnchor")}else{p.dom.removeClass(t,"mceItemAnchor")}}return}});p.onVisualAid.dispatch(p,r,p.hasVisual)},remove:function(){var p=this,q=p.getContainer();p.removed=1;p.hide();p.execCallback("remove_instance_callback",p);p.onRemove.dispatch(p);p.onExecCommand.listeners=[];m.remove(p);n.remove(q)},destroy:function(q){var p=this;if(p.destroyed){return}if(!q){m.removeUnload(p.destroy);tinyMCE.onBeforeUnload.remove(p._beforeUnload);if(p.theme&&p.theme.destroy){p.theme.destroy()}p.controlManager.destroy();p.selection.destroy();p.dom.destroy();if(!p.settings.content_editable){j.clear(p.getWin());j.clear(p.getDoc())}j.clear(p.getBody());j.clear(p.formElement)}if(p.formElement){p.formElement.submit=p.formElement._mceOldSubmit;p.formElement._mceOldSubmit=null}p.contentAreaContainer=p.formElement=p.container=p.settings.content_element=p.bodyElement=p.contentDocument=p.contentWindow=null;if(p.selection){p.selection=p.selection.win=p.selection.dom=p.selection.dom.doc=null}p.destroyed=1},_addEvents:function(){var B=this,r,C=B.settings,q=B.dom,x={mouseup:"onMouseUp",mousedown:"onMouseDown",click:"onClick",keyup:"onKeyUp",keydown:"onKeyDown",keypress:"onKeyPress",submit:"onSubmit",reset:"onReset",contextmenu:"onContextMenu",dblclick:"onDblClick",paste:"onPaste"};function p(t,D){var s=t.type;if(B.removed){return}if(B.onEvent.dispatch(B,t,D)!==false){B[x[t.fakeType||t.type]].dispatch(B,t,D)}}i(x,function(t,s){switch(s){case"contextmenu":q.bind(B.getDoc(),s,p);break;case"paste":q.bind(B.getBody(),s,function(D){p(D)});break;case"submit":case"reset":q.bind(B.getElement().form||n.getParent(B.id,"form"),s,p);break;default:q.bind(C.content_editable?B.getBody():B.getDoc(),s,p)}});q.bind(C.content_editable?B.getBody():(a?B.getDoc():B.getWin()),"focus",function(s){B.focus(true)});if(m.isGecko){q.bind(B.getDoc(),"DOMNodeInserted",function(t){var s;t=t.target;if(t.nodeType===1&&t.nodeName==="IMG"&&(s=t.getAttribute("data-mce-src"))){t.src=B.documentBaseURI.toAbsolute(s)}})}if(a){function u(){var E=this,G=E.getDoc(),F=E.settings;if(a&&!F.readonly){if(E._isHidden()){try{if(!F.content_editable){G.designMode="On"}}catch(D){}}try{G.execCommand("styleWithCSS",0,false)}catch(D){if(!E._isHidden()){try{G.execCommand("useCSS",0,true)}catch(D){}}}if(!F.table_inline_editing){try{G.execCommand("enableInlineTableEditing",false,false)}catch(D){}}if(!F.object_resizing){try{G.execCommand("enableObjectResizing",false,false)}catch(D){}}}}B.onBeforeExecCommand.add(u);B.onMouseDown.add(u)}if(m.isWebKit){B.onClick.add(function(s,t){t=t.target;if(t.nodeName=="IMG"||(t.nodeName=="A"&&q.hasClass(t,"mceItemAnchor"))){B.selection.getSel().setBaseAndExtent(t,0,t,1);B.nodeChanged()}})}B.onMouseUp.add(B.nodeChanged);B.onKeyUp.add(function(s,t){var D=t.keyCode;if((D>=33&&D<=36)||(D>=37&&D<=40)||D==13||D==45||D==46||D==8||(m.isMac&&(D==91||D==93))||t.ctrlKey){B.nodeChanged()}});B.onReset.add(function(){B.setContent(B.startContent,{format:"raw"})});if(C.custom_shortcuts){if(C.custom_undo_redo_keyboard_shortcuts){B.addShortcut("ctrl+z",B.getLang("undo_desc"),"Undo");B.addShortcut("ctrl+y",B.getLang("redo_desc"),"Redo")}B.addShortcut("ctrl+b",B.getLang("bold_desc"),"Bold");B.addShortcut("ctrl+i",B.getLang("italic_desc"),"Italic");B.addShortcut("ctrl+u",B.getLang("underline_desc"),"Underline");for(r=1;r<=6;r++){B.addShortcut("ctrl+"+r,"",["FormatBlock",false,"h"+r])}B.addShortcut("ctrl+7","",["FormatBlock",false,"

    "]);B.addShortcut("ctrl+8","",["FormatBlock",false,"

    + + + + + + + diff --git a/src/wp-includes/theme-compat/header.php b/src/wp-includes/theme-compat/header.php new file mode 100644 index 0000000..7abaa02 --- /dev/null +++ b/src/wp-includes/theme-compat/header.php @@ -0,0 +1,50 @@ + + +> + + + + +<?php wp_title('«', true, 'right'); ?> <?php bloginfo('name'); ?> + + + + + + + + + + +> +
    + + + +
    diff --git a/src/wp-includes/theme-compat/sidebar.php b/src/wp-includes/theme-compat/sidebar.php new file mode 100644 index 0000000..9c8cf5b --- /dev/null +++ b/src/wp-includes/theme-compat/sidebar.php @@ -0,0 +1,84 @@ + +
    "]);B.addShortcut("ctrl+9","",["FormatBlock",false,"
    "]);function v(t){var s=null;if(!t.altKey&&!t.ctrlKey&&!t.metaKey){return s}i(B.shortcuts,function(D){if(m.isMac&&D.ctrl!=t.metaKey){return}else{if(!m.isMac&&D.ctrl!=t.ctrlKey){return}}if(D.alt!=t.altKey){return}if(D.shift!=t.shiftKey){return}if(t.keyCode==D.keyCode||(t.charCode&&t.charCode==D.charCode)){s=D;return false}});return s}B.onKeyUp.add(function(s,t){var D=v(t);if(D){return j.cancel(t)}});B.onKeyPress.add(function(s,t){var D=v(t);if(D){return j.cancel(t)}});B.onKeyDown.add(function(s,t){var D=v(t);if(D){D.func.call(D.scope);return j.cancel(t)}})}if(m.isIE){q.bind(B.getDoc(),"controlselect",function(D){var t=B.resizeInfo,s;D=D.target;if(D.nodeName!=="IMG"){return}if(t){q.unbind(t.node,t.ev,t.cb)}if(!q.hasClass(D,"mceItemNoResize")){ev="resizeend";s=q.bind(D,ev,function(F){var E;F=F.target;if(E=q.getStyle(F,"width")){q.setAttrib(F,"width",E.replace(/[^0-9%]+/g,""));q.setStyle(F,"width","")}if(E=q.getStyle(F,"height")){q.setAttrib(F,"height",E.replace(/[^0-9%]+/g,""));q.setStyle(F,"height","")}})}else{ev="resizestart";s=q.bind(D,"resizestart",j.cancel,j)}t=B.resizeInfo={node:D,ev:ev,cb:s}});B.onKeyDown.add(function(s,D){var t;switch(D.keyCode){case 8:t=B.getDoc().selection;if(t.createRange&&t.createRange().item){s.dom.remove(t.createRange().item(0));return j.cancel(D)}}})}if(m.isOpera){B.onClick.add(function(s,t){j.prevent(t)})}if(C.custom_undo_redo){function y(){B.undoManager.typing=false;B.undoManager.add()}q.bind(B.getDoc(),"focusout",function(s){if(!B.removed&&B.undoManager.typing){y()}});B.dom.bind(B.dom.getRoot(),"dragend",function(s){y()});B.onKeyUp.add(function(t,F){var s,E,D;if(b&&F.keyCode==8){s=B.selection.getRng();if(s.parentElement){E=s.parentElement();D=B.selection.getBookmark();E.innerHTML=E.innerHTML;B.selection.moveToBookmark(D)}}if((F.keyCode>=33&&F.keyCode<=36)||(F.keyCode>=37&&F.keyCode<=40)||F.keyCode==13||F.keyCode==45||F.ctrlKey){y()}});B.onKeyDown.add(function(t,H){var s,F,E,G=H.keyCode;if(b&&G==46){s=B.selection.getRng();if(s.parentElement){F=s.parentElement();if(!B.undoManager.typing){B.undoManager.beforeChange();B.undoManager.typing=true;B.undoManager.add()}if(H.ctrlKey){s.moveEnd("word",1);s.select()}B.selection.getSel().clear();if(s.parentElement()==F){E=B.selection.getBookmark();try{F.innerHTML=F.innerHTML}catch(D){}B.selection.moveToBookmark(E)}H.preventDefault();return}}if((G>=33&&G<=36)||(G>=37&&G<=40)||G==13||G==45){if(m.isIE&&G==13){B.undoManager.beforeChange()}if(B.undoManager.typing){y()}return}if((G<16||G>20)&&G!=224&&G!=91&&!B.undoManager.typing){B.undoManager.beforeChange();B.undoManager.add();B.undoManager.typing=true}});B.onMouseDown.add(function(){if(B.undoManager.typing){y()}})}if(m.isGecko){function A(){var s=B.dom.getAttribs(B.selection.getStart().cloneNode(false));return function(){var t=B.selection.getStart();B.dom.removeAllAttribs(t);i(s,function(D){t.setAttributeNode(D.cloneNode(true))})}}function z(){var t=B.selection;return !t.isCollapsed()&&t.getStart()!=t.getEnd()}B.onKeyPress.add(function(s,D){var t;if((D.keyCode==8||D.keyCode==46)&&z()){t=A();B.getDoc().execCommand("delete",false,null);t();return j.cancel(D)}});B.dom.bind(B.getDoc(),"cut",function(t){var s;if(z()){s=A();B.onKeyUp.addToTop(j.cancel,j);setTimeout(function(){s();B.onKeyUp.remove(j.cancel,j)},0)}})}},_isHidden:function(){var p;if(!a){return 0}p=this.selection.getSel();return(!p||!p.rangeCount||p.rangeCount==0)}})})(tinymce);(function(c){var d=c.each,e,a=true,b=false;c.EditorCommands=function(n){var l=n.dom,p=n.selection,j={state:{},exec:{},value:{}},k=n.settings,o;function q(y,x,v){var u;y=y.toLowerCase();if(u=j.exec[y]){u(y,x,v);return a}return b}function m(v){var u;v=v.toLowerCase();if(u=j.state[v]){return u(v)}return -1}function h(v){var u;v=v.toLowerCase();if(u=j.value[v]){return u(v)}return b}function t(u,v){v=v||"exec";d(u,function(y,x){d(x.toLowerCase().split(","),function(z){j[v][z]=y})})}c.extend(this,{execCommand:q,queryCommandState:m,queryCommandValue:h,addCommands:t});function f(x,v,u){if(v===e){v=b}if(u===e){u=null}return n.getDoc().execCommand(x,v,u)}function s(u){return n.formatter.match(u)}function r(u,v){n.formatter.toggle(u,v?{value:v}:e)}function i(u){o=p.getBookmark(u)}function g(){p.moveToBookmark(o)}t({"mceResetDesignMode,mceBeginUndoLevel":function(){},"mceEndUndoLevel,mceAddUndoLevel":function(){n.undoManager.add()},"Cut,Copy,Paste":function(y){var x=n.getDoc(),u;try{f(y)}catch(v){u=a}if(u||!x.queryCommandSupported(y)){if(c.isGecko){n.windowManager.confirm(n.getLang("clipboard_msg"),function(z){if(z){open("http://www.mozilla.org/editor/midasdemo/securityprefs.html","_blank")}})}else{n.windowManager.alert(n.getLang("clipboard_no_support"))}}},unlink:function(u){if(p.isCollapsed()){p.select(p.getNode())}f(u);p.collapse(b)},"JustifyLeft,JustifyCenter,JustifyRight,JustifyFull":function(u){var v=u.substring(7);d("left,center,right,full".split(","),function(x){if(v!=x){n.formatter.remove("align"+x)}});r("align"+v);q("mceRepaint")},"InsertUnorderedList,InsertOrderedList":function(x){var u,v;f(x);u=l.getParent(p.getNode(),"ol,ul");if(u){v=u.parentNode;if(/^(H[1-6]|P|ADDRESS|PRE)$/.test(v.nodeName)){i();l.split(v,u);g()}}},"Bold,Italic,Underline,Strikethrough,Superscript,Subscript":function(u){r(u)},"ForeColor,HiliteColor,FontName":function(x,v,u){r(x,u)},FontSize:function(y,x,v){var u,z;if(v>=1&&v<=7){z=c.explode(k.font_size_style_values);u=c.explode(k.font_size_classes);if(u){v=u[v-1]||v}else{v=z[v-1]||v}}r(y,v)},RemoveFormat:function(u){n.formatter.remove(u)},mceBlockQuote:function(u){r("blockquote")},FormatBlock:function(x,v,u){return r(u||"p")},mceCleanup:function(){var u=p.getBookmark();n.setContent(n.getContent({cleanup:a}),{cleanup:a});p.moveToBookmark(u)},mceRemoveNode:function(y,x,v){var u=v||p.getNode();if(u!=n.getBody()){i();n.dom.remove(u,a);g()}},mceSelectNodeDepth:function(y,x,v){var u=0;l.getParent(p.getNode(),function(z){if(z.nodeType==1&&u++==v){p.select(z);return b}},n.getBody())},mceSelectNode:function(x,v,u){p.select(u)},mceInsertContent:function(z,D,E){var C,u,x,F,y,u,A,G,B;function v(I,J,H){var K=new c.dom.TreeWalker(H?I.nextSibling:I.previousSibling,J);while((I=K.current())){if((I.nodeType==3&&c.trim(I.nodeValue).length)||I.nodeName=="BR"||I.nodeName=="IMG"){return I}if(H){K.next()}else{K.prev()}}}B={content:E,format:"html"};p.onBeforeSetContent.dispatch(p,B);E=B.content;if(E.indexOf("{$caret}")==-1){E+="{$caret}"}p.setContent('\uFEFF',{no_events:false});l.setOuterHTML("__mce",E.replace(/\{\$caret\}/,'\uFEFF'));C=l.select("#__mce")[0];x=l.getRoot();if(C.previousSibling&&l.isBlock(C.previousSibling)||C.parentNode==x){y=v(C,x);if(y){if(y.nodeName=="BR"){y.parentNode.insertBefore(C,y)}else{l.insertAfter(C,y)}}}while(C){if(C===x){l.setOuterHTML(F,new c.html.Serializer({},n.schema).serialize(n.parser.parse(l.getOuterHTML(F))));break}F=C;C=C.parentNode}C=l.select("#__mce")[0];if(C){y=v(C,x)||v(C,x,true);l.remove(C);if(y){u=l.createRng();if(y.nodeType==3){u.setStart(y,y.length);u.setEnd(y,y.length)}else{if(y.nodeName=="BR"){u.setStartBefore(y);u.setEndBefore(y)}else{u.setStartAfter(y);u.setEndAfter(y)}}p.setRng(u);if(!c.isIE){y=l.create("span",null,"\u00a0");u.insertNode(y);A=l.getRect(y);G=l.getViewPort(n.getWin());if((A.y>G.y+G.h||A.yG.x+G.w||A.x")},mceToggleVisualAid:function(){n.hasVisual=!n.hasVisual;n.addVisual()},mceReplaceContent:function(x,v,u){n.execCommand("mceInsertContent",false,u.replace(/\{\$selection\}/g,p.getContent({format:"text"})))},mceInsertLink:function(A,z,y){var x=l.getParent(p.getNode(),"a"),v,u;if(c.is(y,"string")){y={href:y}}y.href=y.href.replace(" ","%20");if(!x){if(c.isWebKit){v=l.getParent(p.getNode(),"img");if(v){u=v.style.cssFloat;v.style.cssFloat=null}}f("CreateLink",b,"javascript:mctmp(0);");if(u){v.style.cssFloat=u}d(l.select("a[href='javascript:mctmp(0);']"),function(B){l.setAttribs(B,y)})}else{if(y.href){l.setAttribs(x,y)}else{n.dom.remove(x,a)}}},selectAll:function(){var v=l.getRoot(),u=l.createRng();u.setStart(v,0);u.setEnd(v,v.childNodes.length);n.selection.setRng(u)}});t({"JustifyLeft,JustifyCenter,JustifyRight,JustifyFull":function(u){return s("align"+u.substring(7))},"Bold,Italic,Underline,Strikethrough,Superscript,Subscript":function(u){return s(u)},mceBlockQuote:function(){return s("blockquote")},Outdent:function(){var u;if(k.inline_styles){if((u=l.getParent(p.getStart(),l.isBlock))&&parseInt(u.style.paddingLeft)>0){return a}if((u=l.getParent(p.getEnd(),l.isBlock))&&parseInt(u.style.paddingLeft)>0){return a}}return m("InsertUnorderedList")||m("InsertOrderedList")||(!k.inline_styles&&!!l.getParent(p.getNode(),"BLOCKQUOTE"))},"InsertUnorderedList,InsertOrderedList":function(u){return l.getParent(p.getNode(),u=="insertunorderedlist"?"UL":"OL")}},"state");t({"FontSize,FontName":function(x){var v=0,u;if(u=l.getParent(p.getNode(),"span")){if(x=="fontsize"){v=u.style.fontSize}else{v=u.style.fontFamily.replace(/, /g,",").replace(/[\'\"]/g,"").toLowerCase()}}return v}},"value");if(k.custom_undo_redo){t({Undo:function(){n.undoManager.undo()},Redo:function(){n.undoManager.redo()}})}}})(tinymce);(function(b){var a=b.util.Dispatcher;b.UndoManager=function(e){var c,d=0,g=[];function f(){return b.trim(e.getContent({format:"raw",no_events:1}))}return c={typing:false,onAdd:new a(c),onUndo:new a(c),onRedo:new a(c),beforeChange:function(){if(g[d]){g[d].beforeBookmark=e.selection.getBookmark(2,true)}},add:function(l){var h,j=e.settings,k;l=l||{};l.content=f();k=g[d];if(k&&k.content==l.content){return null}if(j.custom_undo_redo_levels){if(g.length>j.custom_undo_redo_levels){for(h=0;h0){j=g[--d];e.setContent(j.content,{format:"raw"});e.selection.moveToBookmark(j.beforeBookmark);c.onUndo.dispatch(c,j)}return j},redo:function(){var h;if(d0||this.typing},hasRedo:function(){return d');q.replace(p,m);o.select(p,1)}return g}return d}l.create("tinymce.ForceBlocks",{ForceBlocks:function(m){var n=this,o=m.settings,p;n.editor=m;n.dom=m.dom;p=(o.forced_root_block||"p").toLowerCase();o.element=p.toUpperCase();m.onPreInit.add(n.setup,n);if(o.forced_root_block){m.onInit.add(n.forceRoots,n);m.onSetContent.add(n.forceRoots,n);m.onBeforeGetContent.add(n.forceRoots,n);m.onExecCommand.add(function(q,r){if(r=="mceInsertContent"){n.forceRoots();q.nodeChanged()}})}},setup:function(){var n=this,m=n.editor,p=m.settings,r=m.dom,o=m.selection;if(p.forced_root_block){m.onBeforeExecCommand.add(n.forceRoots,n);m.onKeyUp.add(n.forceRoots,n);m.onPreProcess.add(n.forceRoots,n)}if(p.force_br_newlines){if(c){m.onKeyPress.add(function(s,t){var u;if(t.keyCode==13&&o.getNode().nodeName!="LI"){o.setContent('
    ',{format:"raw"});u=r.get("__");u.removeAttribute("id");o.select(u);o.collapse();return j.cancel(t)}})}}if(p.force_p_newlines){if(!c){m.onKeyPress.add(function(s,t){if(t.keyCode==13&&!t.shiftKey&&!n.insertPara(t)){j.cancel(t)}})}else{l.addUnload(function(){n._previousFormats=0});m.onKeyPress.add(function(s,t){n._previousFormats=0;if(t.keyCode==13&&!t.shiftKey&&s.selection.isCollapsed()&&p.keep_styles){n._previousFormats=k(s.selection.getStart())}});m.onKeyUp.add(function(t,v){if(v.keyCode==13&&!v.shiftKey){var u=t.selection.getStart(),s=n._previousFormats;if(!u.hasChildNodes()&&s){u=r.getParent(u,r.isBlock);if(u&&u.nodeName!="LI"){u.innerHTML="";if(n._previousFormats){u.appendChild(s.wrapper);s.inner.innerHTML="\uFEFF"}else{u.innerHTML="\uFEFF"}o.select(u,1);o.collapse(true);t.getDoc().execCommand("Delete",false,null);n._previousFormats=0}}}})}if(a){m.onKeyDown.add(function(s,t){if((t.keyCode==8||t.keyCode==46)&&!t.shiftKey){n.backspaceDelete(t,t.keyCode==8)}})}}if(l.isWebKit){function q(t){var s=o.getRng(),u,y=r.create("div",null," "),x,v=r.getViewPort(t.getWin()).h;s.insertNode(u=r.create("br"));s.setStartAfter(u);s.setEndAfter(u);o.setRng(s);if(o.getSel().focusNode==u.previousSibling){o.select(r.insertAfter(r.doc.createTextNode("\u00a0"),u));o.collapse(d)}r.insertAfter(y,u);x=r.getPos(y).y;r.remove(y);if(x>v){t.getWin().scrollTo(0,x)}}m.onKeyPress.add(function(s,t){if(t.keyCode==13&&(t.shiftKey||(p.force_br_newlines&&!r.getParent(o.getNode(),"h1,h2,h3,h4,h5,h6,ol,ul")))){q(s);j.cancel(t)}})}if(c){if(p.element!="P"){m.onKeyPress.add(function(s,t){n.lastElm=o.getNode().nodeName});m.onKeyUp.add(function(t,u){var x,v=o.getNode(),s=t.getBody();if(s.childNodes.length===1&&v.nodeName=="P"){v=r.rename(v,p.element);o.select(v);o.collapse();t.nodeChanged()}else{if(u.keyCode==13&&!u.shiftKey&&n.lastElm!="P"){x=r.getParent(v,"p");if(x){r.rename(x,p.element);t.nodeChanged()}}}})}}},find:function(u,p,q){var o=this.editor,m=o.getDoc().createTreeWalker(u,4,null,g),r=-1;while(u=m.nextNode()){r++;if(p==0&&u==q){return r}if(p==1&&r==q){return u}}return -1},forceRoots:function(v,H){var y=this,v=y.editor,L=v.getBody(),I=v.getDoc(),O=v.selection,z=O.getSel(),A=O.getRng(),M=-2,u,F,m,o,J=-16777215;var K,p,N,E,B,q=L.childNodes,D,C,x;for(D=q.length-1;D>=0;D--){K=q[D];if(K.nodeType===1&&K.getAttribute("data-mce-type")){p=null;continue}if(K.nodeType===3||(!y.dom.isBlock(K)&&K.nodeType!==8&&!/^(script|mce:script|style|mce:style)$/i.test(K.nodeName))){if(!p){if(K.nodeType!=3||/[^\s]/g.test(K.nodeValue)){if(M==-2&&A){if(!c||A.setStart){if(A.startContainer.nodeType==1&&(C=A.startContainer.childNodes[A.startOffset])&&C.nodeType==1){x=C.getAttribute("id");C.setAttribute("id","__mce")}else{if(v.dom.getParent(A.startContainer,function(n){return n===L})){F=A.startOffset;m=A.endOffset;M=y.find(L,0,A.startContainer);u=y.find(L,0,A.endContainer)}}}else{if(A.item){o=I.body.createTextRange();o.moveToElementText(A.item(0));A=o}o=I.body.createTextRange();o.moveToElementText(L);o.collapse(1);N=o.move("character",J)*-1;o=A.duplicate();o.collapse(1);E=o.move("character",J)*-1;o=A.duplicate();o.collapse(0);B=(o.move("character",J)*-1)-E;M=E-N;u=B}}p=v.dom.create(v.settings.forced_root_block);K.parentNode.replaceChild(p,K);p.appendChild(K)}}else{if(p.hasChildNodes()){p.insertBefore(K,p.firstChild)}else{p.appendChild(K)}}}else{p=null}}if(M!=-2){if(!c||A.setStart){p=L.getElementsByTagName(v.settings.element)[0];A=I.createRange();if(M!=-1){A.setStart(y.find(L,1,M),F)}else{A.setStart(p,0)}if(u!=-1){A.setEnd(y.find(L,1,u),m)}else{A.setEnd(p,0)}if(z){z.removeAllRanges();z.addRange(A)}}else{try{A=z.createRange();A.moveToElementText(L);A.collapse(1);A.moveStart("character",M);A.moveEnd("character",u);A.select()}catch(G){}}}else{if((!c||A.setStart)&&(C=v.dom.get("__mce"))){if(x){C.setAttribute("id",x)}else{C.removeAttribute("id")}A=I.createRange();A.setStartBefore(C);A.setEndBefore(C);O.setRng(A)}}},getParentBlock:function(o){var m=this.dom;return m.getParent(o,m.isBlock)},insertPara:function(R){var F=this,v=F.editor,N=v.dom,S=v.getDoc(),W=v.settings,G=v.selection.getSel(),H=G.getRangeAt(0),V=S.body;var K,L,I,P,O,q,o,u,z,m,D,U,p,x,J,M=N.getViewPort(v.getWin()),C,E,B;v.undoManager.beforeChange();K=S.createRange();K.setStart(G.anchorNode,G.anchorOffset);K.collapse(d);L=S.createRange();L.setStart(G.focusNode,G.focusOffset);L.collapse(d);I=K.compareBoundaryPoints(K.START_TO_END,L)<0;P=I?G.anchorNode:G.focusNode;O=I?G.anchorOffset:G.focusOffset;q=I?G.focusNode:G.anchorNode;o=I?G.focusOffset:G.anchorOffset;if(P===q&&/^(TD|TH)$/.test(P.nodeName)){if(P.firstChild.nodeName=="BR"){N.remove(P.firstChild)}if(P.childNodes.length==0){v.dom.add(P,W.element,null,"
    ");U=v.dom.add(P,W.element,null,"
    ")}else{J=P.innerHTML;P.innerHTML="";v.dom.add(P,W.element,null,J);U=v.dom.add(P,W.element,null,"
    ")}H=S.createRange();H.selectNodeContents(U);H.collapse(1);v.selection.setRng(H);return g}if(P==V&&q==V&&V.firstChild&&v.dom.isBlock(V.firstChild)){P=q=P.firstChild;O=o=0;K=S.createRange();K.setStart(P,0);L=S.createRange();L.setStart(q,0)}P=P.nodeName=="HTML"?S.body:P;P=P.nodeName=="BODY"?P.firstChild:P;q=q.nodeName=="HTML"?S.body:q;q=q.nodeName=="BODY"?q.firstChild:q;u=F.getParentBlock(P);z=F.getParentBlock(q);m=u?u.nodeName:W.element;if(J=F.dom.getParent(u,"li,pre")){if(J.nodeName=="LI"){return e(v.selection,F.dom,J)}return d}if(u&&(u.nodeName=="CAPTION"||/absolute|relative|fixed/gi.test(N.getStyle(u,"position",1)))){m=W.element;u=null}if(z&&(z.nodeName=="CAPTION"||/absolute|relative|fixed/gi.test(N.getStyle(u,"position",1)))){m=W.element;z=null}if(/(TD|TABLE|TH|CAPTION)/.test(m)||(u&&m=="DIV"&&/left|right/gi.test(N.getStyle(u,"float",1)))){m=W.element;u=z=null}D=(u&&u.nodeName==m)?u.cloneNode(0):v.dom.create(m);U=(z&&z.nodeName==m)?z.cloneNode(0):v.dom.create(m);U.removeAttribute("id");if(/^(H[1-6])$/.test(m)&&f(H,u)){U=v.dom.create(W.element)}J=p=P;do{if(J==V||J.nodeType==9||F.dom.isBlock(J)||/(TD|TABLE|TH|CAPTION)/.test(J.nodeName)){break}p=J}while((J=J.previousSibling?J.previousSibling:J.parentNode));J=x=q;do{if(J==V||J.nodeType==9||F.dom.isBlock(J)||/(TD|TABLE|TH|CAPTION)/.test(J.nodeName)){break}x=J}while((J=J.nextSibling?J.nextSibling:J.parentNode));if(p.nodeName==m){K.setStart(p,0)}else{K.setStartBefore(p)}K.setEnd(P,O);D.appendChild(K.cloneContents()||S.createTextNode(""));try{L.setEndAfter(x)}catch(Q){}L.setStart(q,o);U.appendChild(L.cloneContents()||S.createTextNode(""));H=S.createRange();if(!p.previousSibling&&p.parentNode.nodeName==m){H.setStartBefore(p.parentNode)}else{if(K.startContainer.nodeName==m&&K.startOffset==0){H.setStartBefore(K.startContainer)}else{H.setStart(K.startContainer,K.startOffset)}}if(!x.nextSibling&&x.parentNode.nodeName==m){H.setEndAfter(x.parentNode)}else{H.setEnd(L.endContainer,L.endOffset)}H.deleteContents();if(b){v.getWin().scrollTo(0,M.y)}if(D.firstChild&&D.firstChild.nodeName==m){D.innerHTML=D.firstChild.innerHTML}if(U.firstChild&&U.firstChild.nodeName==m){U.innerHTML=U.firstChild.innerHTML}if(N.isEmpty(D)){D.innerHTML="
    "}function T(y,s){var r=[],Y,X,t;y.innerHTML="";if(W.keep_styles){X=s;do{if(/^(SPAN|STRONG|B|EM|I|FONT|STRIKE|U)$/.test(X.nodeName)){Y=X.cloneNode(g);N.setAttrib(Y,"id","");r.push(Y)}}while(X=X.parentNode)}if(r.length>0){for(t=r.length-1,Y=y;t>=0;t--){Y=Y.appendChild(r[t])}r[0].innerHTML=b?"\u00a0":"
    ";return r[0]}else{y.innerHTML=b?"\u00a0":"
    "}}if(N.isEmpty(U)){B=T(U,q)}if(b&&parseFloat(opera.version())<9.5){H.insertNode(D);H.insertNode(U)}else{H.insertNode(U);H.insertNode(D)}U.normalize();D.normalize();function A(r){return S.createTreeWalker(r,NodeFilter.SHOW_TEXT,null,g).nextNode()||r}H=S.createRange();H.selectNodeContents(a?A(B||U):B||U);H.collapse(1);G.removeAllRanges();G.addRange(H);C=v.dom.getPos(U).y;if(CM.y+M.h){v.getWin().scrollTo(0,C1||!F(ap))&&an===0){c.remove(ap,1);return}if(ag.inline||ag.wrapper){if(!ag.exact&&an===1){ap=ao(ap)}O(ab,function(ar){O(c.select(ar.inline,ap),function(au){var at;if(ar.wrap_links===false){at=au.parentNode;do{if(at.nodeName==="A"){return}}while(at=at.parentNode)}U(ar,af,au,ar.exact?au:null)})});if(x(ap.parentNode,Y,af)){c.remove(ap,1);ap=0;return B}if(ag.merge_with_parents){c.getParent(ap.parentNode,function(ar){if(x(ar,Y,af)){c.remove(ap,1);ap=0;return B}})}if(ap){ap=u(C(ap),ap);ap=u(ap,C(ap,B))}}})}if(ag){if(aa){X=c.createRng();X.setStartBefore(aa);X.setEndAfter(aa);ah(o(X,ab))}else{if(!ac||!ag.inline||c.select("td.mceSelected,th.mceSelected").length){var ai=V.selection.getNode();ae=q.getBookmark();ah(o(q.getRng(B),ab));if(ag.styles&&(ag.styles.color||ag.styles.textDecoration)){a.walk(ai,I,"childNodes");I(ai)}q.moveToBookmark(ae);q.setRng(Z(q.getRng(B)));V.nodeChanged()}else{Q("apply",Y,af)}}}}function A(Y,ah,ab){var ac=R(Y),aj=ac[0],ag,af,X;function aa(am){var al=am.startContainer,ar=am.startOffset,aq,ap,an,ao;if(al.nodeType==3&&ar>=al.nodeValue.length-1){al=al.parentNode;ar=s(al)+1}if(al.nodeType==1){an=al.childNodes;al=an[Math.min(ar,an.length-1)];aq=new t(al);if(ar>an.length-1){aq.next()}for(ap=aq.current();ap;ap=aq.next()){if(ap.nodeType==3&&!f(ap)){ao=c.create("a",null,E);ap.parentNode.insertBefore(ao,ap);am.setStart(ap,0);q.setRng(am);c.remove(ao);return}}}}function Z(ao){var an,am,al;an=a.grep(ao.childNodes);for(am=0,al=ac.length;am=0;Z--){if(P.apply[Z].name==Y){return true}}for(Z=P.remove.length-1;Z>=0;Z--){if(P.remove[Z].name==Y){return false}}return W(q.getNode())}aa=q.getNode();if(W(aa)){return B}X=q.getStart();if(X!=aa){if(W(X)){return B}}return S}function v(ad,ac){var aa,ab=[],Z={},Y,X,W;if(q.isCollapsed()){for(X=0;X=0;Y--){W=ad[X];if(P.remove[Y].name==W){Z[W]=true;break}}}for(Y=P.apply.length-1;Y>=0;Y--){for(X=0;X=0;X--){W=ac[X].selector;if(!W){return B}for(ab=Y.length-1;ab>=0;ab--){if(c.is(Y[ab],W)){return B}}}}return S}a.extend(this,{get:R,register:k,apply:T,remove:A,toggle:D,match:j,matchAll:v,matchNode:x,canApply:y});function h(W,X){if(g(W,X.inline)){return B}if(g(W,X.block)){return B}if(X.selector){return c.is(W,X.selector)}}function g(X,W){X=X||"";W=W||"";X=""+(X.nodeName||X);W=""+(W.nodeName||W);return X.toLowerCase()==W.toLowerCase()}function L(X,W){var Y=c.getStyle(X,W);if(W=="color"||W=="backgroundColor"){Y=c.toHex(Y)}if(W=="fontWeight"&&Y==700){Y="bold"}return""+Y}function r(W,X){if(typeof(W)!="string"){W=W(X)}else{if(X){W=W.replace(/%(\w+)/g,function(Z,Y){return X[Y]||Z})}}return W}function f(W){return W&&W.nodeType===3&&/^([\s\r\n]+|)$/.test(W.nodeValue)}function N(Y,X,W){var Z=c.create(X,W);Y.parentNode.insertBefore(Z,Y);Z.appendChild(Y);return Z}function o(W,ag,Z){var Y=W.startContainer,ad=W.startOffset,aj=W.endContainer,ae=W.endOffset,ai,af,ac;function ah(am,an,ak,al){var ao,ap;al=al||c.getRoot();for(;;){ao=am.parentNode;if(ao==al||(!ag[0].block_expand&&F(ao))){return am}for(ai=ao[an];ai&&ai!=am;ai=ai[ak]){if(ai.nodeType==1&&!H(ai)){return am}if(ai.nodeType==3&&!f(ai)){return am}}am=am.parentNode}return am}function ab(ak,al){if(al===p){al=ak.nodeType===3?ak.length:ak.childNodes.length}while(ak&&ak.hasChildNodes()){ak=ak.childNodes[al];if(ak){al=ak.nodeType===3?ak.length:ak.childNodes.length}}return{node:ak,offset:al}}if(Y.nodeType==1&&Y.hasChildNodes()){af=Y.childNodes.length-1;Y=Y.childNodes[ad>af?af:ad];if(Y.nodeType==3){ad=0}}if(aj.nodeType==1&&aj.hasChildNodes()){af=aj.childNodes.length-1;aj=aj.childNodes[ae>af?af:ae-1];if(aj.nodeType==3){ae=aj.nodeValue.length}}if(H(Y.parentNode)){Y=Y.parentNode}if(H(Y)){Y=Y.nextSibling||Y}if(H(aj.parentNode)){ae=c.nodeIndex(aj);aj=aj.parentNode}if(H(aj)&&aj.previousSibling){aj=aj.previousSibling;ae=aj.length}if(ag[0].inline){ac=ab(aj,ae);if(ac.node){while(ac.node&&ac.offset===0&&ac.node.previousSibling){ac=ab(ac.node.previousSibling)}if(ac.node&&ac.offset>0&&ac.node.nodeType===3&&ac.node.nodeValue.charAt(ac.offset-1)===" "){if(ac.offset>1){aj=ac.node;aj.splitText(ac.offset-1)}else{if(ac.node.previousSibling){aj=ac.node.previousSibling}}}}}if(ag[0].inline||ag[0].block_expand){Y=ah(Y,"firstChild","nextSibling");aj=ah(aj,"lastChild","previousSibling")}if(ag[0].selector&&ag[0].expand!==S&&!ag[0].inline){function aa(al,ak){var am,an,ap,ao;if(al.nodeType==3&&al.nodeValue.length==0&&al[ak]){al=al[ak]}am=m(al);for(an=0;anY?Y:Z]}return W}function Q(ab,X,aa){var Y,W=P[ab],ac=P[ab=="apply"?"remove":"apply"];function ad(){return P.apply.length||P.remove.length}function Z(){P.apply=[];P.remove=[]}function ae(af){O(P.apply.reverse(),function(ag){T(ag.name,ag.vars,af);if(ag.name==="forecolor"&&ag.vars.value){I(af.parentNode)}});O(P.remove.reverse(),function(ag){A(ag.name,ag.vars,af)});c.remove(af,1);Z()}for(Y=W.length-1;Y>=0;Y--){if(W[Y].name==X){return}}W.push({name:X,vars:aa});for(Y=ac.length-1;Y>=0;Y--){if(ac[Y].name==X){ac.splice(Y,1)}}if(ad()){V.getDoc().execCommand("FontName",false,"mceinline");P.lastRng=q.getRng();O(c.select("font,span"),function(ag){var af;if(b(ag)){af=q.getBookmark();ae(ag);q.moveToBookmark(af);V.nodeChanged()}});if(!P.isListening&&ad()){P.isListening=true;O("onKeyDown,onKeyUp,onKeyPress,onMouseUp".split(","),function(af){V[af].addToTop(function(ag,ah){if(ad()&&!a.dom.RangeUtils.compareRanges(P.lastRng,q.getRng())){O(c.select("font,span"),function(aj){var ak,ai;if(b(aj)){ak=aj.firstChild;if(ak){ae(aj);ai=c.createRng();ai.setStart(ak,ak.nodeValue.length);ai.setEnd(ak,ak.nodeValue.length);q.setRng(ai);ag.nodeChanged()}else{c.remove(aj)}}});if(ah.type=="keyup"||ah.type=="mouseup"){Z()}}})})}}}}})(tinymce);tinymce.onAddEditor.add(function(e,a){var d,h,g,c=a.settings;if(c.inline_styles){h=e.explode(c.font_size_style_values);function b(j,i){e.each(i,function(l,k){if(l){g.setStyle(j,k,l)}});g.rename(j,"span")}d={font:function(j,i){b(i,{backgroundColor:i.style.backgroundColor,color:i.color,fontFamily:i.face,fontSize:h[parseInt(i.size)-1]})},u:function(j,i){b(i,{textDecoration:"underline"})},strike:function(j,i){b(i,{textDecoration:"line-through"})}};function f(i,j){g=i.dom;if(c.convert_fonts_to_spans){e.each(g.select("font,u,strike",j.node),function(k){d[k.nodeName.toLowerCase()](a.dom,k)})}}a.onPreProcess.add(f);a.onSetContent.add(f);a.onInit.add(function(){a.selection.onSetContent.add(f)})}}); diff --git a/src/wp-includes/js/tinymce/tiny_mce_popup.js b/src/wp-includes/js/tinymce/tiny_mce_popup.js new file mode 100644 index 0000000..f859d24 --- /dev/null +++ b/src/wp-includes/js/tinymce/tiny_mce_popup.js @@ -0,0 +1,5 @@ + +// Uncomment and change this document.domain value if you are loading the script cross subdomains +// document.domain = 'moxiecode.com'; + +var tinymce=null,tinyMCEPopup,tinyMCE;tinyMCEPopup={init:function(){var b=this,a,c;a=b.getWin();tinymce=a.tinymce;tinyMCE=a.tinyMCE;b.editor=tinymce.EditorManager.activeEditor;b.params=b.editor.windowManager.params;b.features=b.editor.windowManager.features;b.dom=b.editor.windowManager.createInstance("tinymce.dom.DOMUtils",document);if(b.features.popup_css!==false){b.dom.loadCSS(b.features.popup_css||b.editor.settings.popup_css)}b.listeners=[];b.onInit={add:function(e,d){b.listeners.push({func:e,scope:d})}};b.isWindow=!b.getWindowArg("mce_inline");b.id=b.getWindowArg("mce_window_id");b.editor.windowManager.onOpen.dispatch(b.editor.windowManager,window)},getWin:function(){return(!window.frameElement&&window.dialogArguments)||opener||parent||top},getWindowArg:function(c,b){var a=this.params[c];return tinymce.is(a)?a:b},getParam:function(b,a){return this.editor.getParam(b,a)},getLang:function(b,a){return this.editor.getLang(b,a)},execCommand:function(d,c,e,b){b=b||{};b.skip_focus=1;this.restoreSelection();return this.editor.execCommand(d,c,e,b)},resizeToInnerSize:function(){var a=this;setTimeout(function(){var b=a.dom.getViewPort(window);a.editor.windowManager.resizeBy(a.getWindowArg("mce_width")-b.w,a.getWindowArg("mce_height")-b.h,a.id||window)},10)},executeOnLoad:function(s){this.onInit.add(function(){eval(s)})},storeSelection:function(){this.editor.windowManager.bookmark=tinyMCEPopup.editor.selection.getBookmark(1)},restoreSelection:function(){var a=tinyMCEPopup;if(!a.isWindow&&tinymce.isIE){a.editor.selection.moveToBookmark(a.editor.windowManager.bookmark)}},requireLangPack:function(){var b=this,a=b.getWindowArg("plugin_url")||b.getWindowArg("theme_url");if(a&&b.editor.settings.language&&b.features.translate_i18n!==false&&b.editor.settings.language_load!==false){a+="/langs/"+b.editor.settings.language+"_dlg.js";if(!tinymce.ScriptLoader.isDone(a)){document.write(' + + + + + + + + + +
      +
    • +
    • +
    • +
    • +
    + +
    + +
    +

    +

    Rich editing, also called WYSIWYG for What You See Is What You Get, means your text is formatted as you type. The rich editor creates HTML code behind the scenes while you concentrate on writing. Font styles, links and images all appear approximately as they will on the internet.') ?>

    +

    +

    +

    +
    + + + + + + +
    + +
    +
    + +
    +
    + + + diff --git a/src/wp-includes/js/tinymce/wp-tinymce.js.gz b/src/wp-includes/js/tinymce/wp-tinymce.js.gz new file mode 100644 index 0000000000000000000000000000000000000000..3441ea640554863645c8d1a827277a4ecbd729ae GIT binary patch literal 93408 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%0AU;WLAQ?rrEU}DgQ^RG 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 literal 0 HcmV?d00001 diff --git a/src/wp-includes/js/tinymce/wp-tinymce.php b/src/wp-includes/js/tinymce/wp-tinymce.php new file mode 100644 index 0000000..449f0e2 --- /dev/null +++ b/src/wp-includes/js/tinymce/wp-tinymce.php @@ -0,0 +1,37 @@ +' + anError.message + '

    '; + response.errors.push( anError ); + parsed.errors = true; + } ).size() ) { 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:visible').change( 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() == ''; } ) ).size(); + } +}, wpAjax || { noPerm: 'You do not have permission 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/src/wp-includes/js/wp-ajax-response.js b/src/wp-includes/js/wp-ajax-response.js new file mode 100644 index 0000000..bdfa53a --- /dev/null +++ b/src/wp-includes/js/wp-ajax-response.js @@ -0,0 +1 @@ +var wpAjax=jQuery.extend({unserialize:function(c){var d={},e,a,b,f;if(!c){return d}e=c.split("?");if(e[1]){c=e[1]}a=c.split("&");for(b in a){if(jQuery.isFunction(a.hasOwnProperty)&&!a.hasOwnProperty(b)){continue}f=a[b].split("=");d[f[0]]=f[1]}return d},parseAjaxResponse:function(a,f,g){var b={},c=jQuery("#"+f).html(""),d="";if(a&&typeof a=="object"&&a.getElementsByTagName("wp_ajax")){b.responses=[];b.errors=false;jQuery("response",a).each(function(){var h=jQuery(this),i=jQuery(this.firstChild),e;e={action:h.attr("action"),what:i.get(0).nodeName,id:i.attr("id"),oldId:i.attr("old_id"),position:i.attr("position")};e.data=jQuery("response_data",i).text();e.supplemental={};if(!jQuery("supplemental",i).children().each(function(){e.supplemental[this.nodeName]=jQuery(this).text()}).size()){e.supplemental=false}e.errors=[];if(!jQuery("wp_error",i).each(function(){var j=jQuery(this).attr("code"),m,l,k;m={code:j,message:this.firstChild.nodeValue,data:false};l=jQuery('wp_error_data[code="'+j+'"]',a);if(l){m.data=l.get()}k=jQuery("form-field",l).text();if(k){j=k}if(g){wpAjax.invalidateForm(jQuery("#"+g+' :input[name="'+j+'"]').parents(".form-field:first"))}d+="

    "+m.message+"

    ";e.errors.push(m);b.errors=true}).size()){e.errors=false}b.responses.push(e)});if(d.length){c.html('
    '+d+"
    ")}return b}if(isNaN(a)){return !c.html('

    '+a+"

    ")}a=parseInt(a,10);if(-1==a){return !c.html('

    '+wpAjax.noPerm+"

    ")}else{if(0===a){return !c.html('

    '+wpAjax.broken+"

    ")}}return true},invalidateForm:function(a){return jQuery(a).addClass("form-invalid").find("input:visible").change(function(){jQuery(this).closest(".form-invalid").removeClass("form-invalid")})},validateForm:function(a){a=jQuery(a);return !wpAjax.invalidateForm(a.find(".form-required").filter(function(){return jQuery("input:visible",this).val()==""})).size()}},wpAjax||{noPerm:"You do not have permission 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/src/wp-includes/js/wp-list-revisions.dev.js b/src/wp-includes/js/wp-list-revisions.dev.js new file mode 100644 index 0000000..9c702c6 --- /dev/null +++ b/src/wp-includes/js/wp-list-revisions.dev.js @@ -0,0 +1,24 @@ +(function(w) { + var init = function() { + var pr = document.getElementById('post-revisions'), + inputs = pr ? pr.getElementsByTagName('input') : []; + pr.onclick = function() { + var i, checkCount = 0, side; + for ( i = 0; i < inputs.length; i++ ) { + checkCount += inputs[i].checked ? 1 : 0; + side = inputs[i].getAttribute('name'); + if ( ! inputs[i].checked && + ( 'left' == side && 1 > checkCount || 'right' == side && 1 < checkCount && ( ! inputs[i-1] || ! inputs[i-1].checked ) ) && + ! ( inputs[i+1] && inputs[i+1].checked && 'right' == inputs[i+1].getAttribute('name') ) ) + inputs[i].style.visibility = 'hidden'; + else if ( 'left' == side || 'right' == side ) + inputs[i].style.visibility = 'visible'; + } + } + pr.onclick(); + } + if ( w && w.addEventListener ) + w.addEventListener('load', init, false); + else if ( w && w.attachEvent ) + w.attachEvent('onload', init); +})(window); diff --git a/src/wp-includes/js/wp-list-revisions.js b/src/wp-includes/js/wp-list-revisions.js new file mode 100644 index 0000000..417572d --- /dev/null +++ b/src/wp-includes/js/wp-list-revisions.js @@ -0,0 +1 @@ +(function(a){var b=function(){var d=document.getElementById("post-revisions"),c=d?d.getElementsByTagName("input"):[];d.onclick=function(){var g,f=0,e;for(g=0;gf||"right"==e&&1
    + * + * Or instead, you can do: + * + * timer_stop(1); + * + * which will do what the above does. If you need the result, you can assign it to a variable, but + * most cases, you only need to echo it. + * + * @since 0.71 + * @global int $timestart Seconds and Microseconds added together from when timer_start() is called + * @global int $timeend Seconds and Microseconds added together from when function is called + * + * @param int $display Use '0' or null to not echo anything and 1 to echo the total time + * @param int $precision The amount of digits from the right of the decimal to display. Default is 3. + * @return float The "second.microsecond" finished time calculation + */ +function timer_stop( $display = 0, $precision = 3 ) { // if called like timer_stop(1), will echo $timetotal + global $timestart, $timeend; + $mtime = microtime(); + $mtime = explode( ' ', $mtime ); + $timeend = $mtime[1] + $mtime[0]; + $timetotal = $timeend - $timestart; + $r = ( function_exists( 'number_format_i18n' ) ) ? number_format_i18n( $timetotal, $precision ) : number_format( $timetotal, $precision ); + if ( $display ) + echo $r; + return $r; +} + +/** + * Sets PHP error handling and handles WordPress debug mode. + * + * Uses three constants: WP_DEBUG, WP_DEBUG_DISPLAY, and WP_DEBUG_LOG. All three can be + * defined in wp-config.php. Example: define( 'WP_DEBUG', true ); + * + * WP_DEBUG_DISPLAY and WP_DEBUG_LOG perform no function unless WP_DEBUG is true. + * WP_DEBUG defaults to false. + * + * When WP_DEBUG is true, all PHP notices are reported. WordPress will also display + * notices, including one when a deprecated WordPress function, function argument, + * or file is used. Deprecated code may be removed from a later version. + * + * It is strongly recommended that plugin and theme developers use WP_DEBUG in their + * development environments. + * + * When WP_DEBUG_DISPLAY is true, WordPress will force errors to be displayed. + * WP_DEBUG_DISPLAY defaults to true. Defining it as false prevents WordPress from + * changing the global configuration setting. (Defining WP_DEBUG_DISPLAY as false + * will never force errors to be hidden.) + * + * When WP_DEBUG_LOG is true, errors will be logged to wp-content/debug.log. + * WP_DEBUG_LOG defaults to false. + * + * @access private + * @since 3.0.0 + */ +function wp_debug_mode() { + if ( WP_DEBUG ) { + // E_DEPRECATED is a core PHP constant in PHP 5.3. Don't define this yourself. + // The two statements are equivalent, just one is for 5.3+ and for less than 5.3. + if ( defined( 'E_DEPRECATED' ) ) + error_reporting( E_ALL & ~E_DEPRECATED & ~E_STRICT ); + else + error_reporting( E_ALL ); + + if ( WP_DEBUG_DISPLAY ) + ini_set( 'display_errors', 1 ); + + if ( WP_DEBUG_LOG ) { + ini_set( 'log_errors', 1 ); + ini_set( 'error_log', WP_CONTENT_DIR . '/debug.log' ); + } + } else { + error_reporting( E_CORE_ERROR | E_CORE_WARNING | E_COMPILE_ERROR | E_ERROR | E_WARNING | E_PARSE | E_USER_ERROR | E_USER_WARNING | E_RECOVERABLE_ERROR ); + } +} + +/** + * Sets the location of the language directory. + * + * To set directory manually, define WP_LANG_DIR in wp-config.php. + * + * If the language directory exists within WP_CONTENT_DIR that is used + * Otherwise if the language directory exists within WPINC, that's used + * Finally, If neither of the preceeding directories is found, + * WP_CONTENT_DIR/languages is used. + * + * The WP_LANG_DIR constant was introduced in 2.1.0. + * + * @access private + * @since 3.0.0 + */ +function wp_set_lang_dir() { + if ( !defined( 'WP_LANG_DIR' ) ) { + if ( file_exists( WP_CONTENT_DIR . '/languages' ) && @is_dir( WP_CONTENT_DIR . '/languages' ) || !@is_dir(ABSPATH . WPINC . '/languages') ) { + define( 'WP_LANG_DIR', WP_CONTENT_DIR . '/languages' ); // no leading slash, no trailing slash, full path, not relative to ABSPATH + if ( !defined( 'LANGDIR' ) ) { + // Old static relative path maintained for limited backwards compatibility - won't work in some cases + define( 'LANGDIR', 'wp-content/languages' ); + } + } else { + define( 'WP_LANG_DIR', ABSPATH . WPINC . '/languages' ); // no leading slash, no trailing slash, full path, not relative to ABSPATH + if ( !defined( 'LANGDIR' ) ) { + // Old relative path maintained for backwards compatibility + define( 'LANGDIR', WPINC . '/languages' ); + } + } + } +} + +/** + * Load the correct database class file. + * + * This function is used to load the database class file either at runtime or by + * wp-admin/setup-config.php. We must globalize $wpdb to ensure that it is + * defined globally by the inline code in wp-db.php. + * + * @since 2.5.0 + * @global $wpdb WordPress Database Object + */ +function require_wp_db() { + global $wpdb; + + require_once( ABSPATH . WPINC . '/wp-db.php' ); + if ( file_exists( WP_CONTENT_DIR . '/db.php' ) ) + require_once( WP_CONTENT_DIR . '/db.php' ); + + if ( isset( $wpdb ) ) + return; + + $wpdb = new wpdb( DB_USER, DB_PASSWORD, DB_NAME, DB_HOST ); +} + +/** + * Sets the database table prefix and the format specifiers for database table columns. + * + * Columns not listed here default to %s. + * + * @see wpdb::$field_types Since 2.8.0 + * @see wpdb::prepare() + * @see wpdb::insert() + * @see wpdb::update() + * @see wpdb::set_prefix() + * + * @access private + * @since 3.0.0 + */ +function wp_set_wpdb_vars() { + global $wpdb, $table_prefix; + if ( !empty( $wpdb->error ) ) + dead_db(); + + $wpdb->field_types = array( 'post_author' => '%d', 'post_parent' => '%d', 'menu_order' => '%d', 'term_id' => '%d', 'term_group' => '%d', 'term_taxonomy_id' => '%d', + 'parent' => '%d', 'count' => '%d','object_id' => '%d', 'term_order' => '%d', 'ID' => '%d', 'commment_ID' => '%d', 'comment_post_ID' => '%d', 'comment_parent' => '%d', + 'user_id' => '%d', 'link_id' => '%d', 'link_owner' => '%d', 'link_rating' => '%d', 'option_id' => '%d', 'blog_id' => '%d', 'meta_id' => '%d', 'post_id' => '%d', + 'user_status' => '%d', 'umeta_id' => '%d', 'comment_karma' => '%d', 'comment_count' => '%d', + // multisite: + 'active' => '%d', 'cat_id' => '%d', 'deleted' => '%d', 'lang_id' => '%d', 'mature' => '%d', 'public' => '%d', 'site_id' => '%d', 'spam' => '%d', + ); + + $prefix = $wpdb->set_prefix( $table_prefix ); + + if ( is_wp_error( $prefix ) ) + wp_die( /*WP_I18N_BAD_PREFIX*/'ERROR: $table_prefix en wp-config.php sólo puede contener números, letras y guiones bajos.'/*/WP_I18N_BAD_PREFIX*/ ); +} + +/** + * Starts the WordPress object cache. + * + * If an object-cache.php file exists in the wp-content directory, + * it uses that drop-in as an external object cache. + * + * @access private + * @since 3.0.0 + */ +function wp_start_object_cache() { + global $_wp_using_ext_object_cache; + + $first_init = false; + if ( ! function_exists( 'wp_cache_init' ) ) { + if ( file_exists( WP_CONTENT_DIR . '/object-cache.php' ) ) { + require_once ( WP_CONTENT_DIR . '/object-cache.php' ); + $_wp_using_ext_object_cache = true; + } else { + require_once ( ABSPATH . WPINC . '/cache.php' ); + $_wp_using_ext_object_cache = false; + } + $first_init = true; + } else if ( !$_wp_using_ext_object_cache && file_exists( WP_CONTENT_DIR . '/object-cache.php' ) ) { + // Sometimes advanced-cache.php can load object-cache.php before it is loaded here. + // This breaks the function_exists check above and can result in $_wp_using_ext_object_cache + // being set incorrectly. Double check if an external cache exists. + $_wp_using_ext_object_cache = true; + } + + // If cache supports reset, reset instead of init if already initialized. + // Reset signals to the cache that global IDs have changed and it may need to update keys + // and cleanup caches. + if ( !$first_init && function_exists('wp_cache_reset') ) + wp_cache_reset(); + else + wp_cache_init(); + + if ( function_exists( 'wp_cache_add_global_groups' ) ) { + wp_cache_add_global_groups( array( 'users', 'userlogins', 'usermeta', 'user_meta', 'site-transient', 'site-options', 'site-lookup', 'blog-lookup', 'blog-details', 'rss', 'global-posts' ) ); + wp_cache_add_non_persistent_groups( array( 'comment', 'counts', 'plugins' ) ); + } +} + +/** + * Redirects to the installer if WordPress is not installed. + * + * Dies with an error message when multisite is enabled. + * + * @access private + * @since 3.0.0 + */ +function wp_not_installed() { + if ( is_multisite() ) { + if ( ! is_blog_installed() && ! defined( 'WP_INSTALLING' ) ) + wp_die( __( 'The site you have requested is not installed properly. Please contact the system administrator.' ) ); + } elseif ( ! is_blog_installed() && false === strpos( $_SERVER['PHP_SELF'], 'install.php' ) && !defined( 'WP_INSTALLING' ) ) { + + $link = wp_guess_url() . '/wp-admin/install.php'; + + require( ABSPATH . WPINC . '/kses.php' ); + require( ABSPATH . WPINC . '/pluggable.php' ); + require( ABSPATH . WPINC . '/formatting.php' ); + wp_redirect( $link ); + die(); + } +} + +/** + * Returns array of must-use plugin files to be included in global scope. + * + * The default directory is wp-content/mu-plugins. To change the default directory + * manually, define WPMU_PLUGIN_DIR and WPMU_PLUGIN_URL + * in wp-config.php. + * + * @access private + * @since 3.0.0 + * @return array Files to include + */ +function wp_get_mu_plugins() { + $mu_plugins = array(); + if ( !is_dir( WPMU_PLUGIN_DIR ) ) + return $mu_plugins; + if ( ! $dh = opendir( WPMU_PLUGIN_DIR ) ) + return $mu_plugins; + while ( ( $plugin = readdir( $dh ) ) !== false ) { + if ( substr( $plugin, -4 ) == '.php' ) + $mu_plugins[] = WPMU_PLUGIN_DIR . '/' . $plugin; + } + closedir( $dh ); + sort( $mu_plugins ); + + return $mu_plugins; +} + +/** + * Returns array of plugin files to be included in global scope. + * + * The default directory is wp-content/plugins. To change the default directory + * manually, define WP_PLUGIN_DIR and WP_PLUGIN_URL + * in wp-config.php. + * + * @access private + * @since 3.0.0 + * @return array Files to include + */ +function wp_get_active_and_valid_plugins() { + $plugins = array(); + $active_plugins = (array) get_option( 'active_plugins', array() ); + + // Check for hacks file if the option is enabled + if ( get_option( 'hack_file' ) && file_exists( ABSPATH . 'my-hacks.php' ) ) { + _deprecated_file( 'my-hacks.php', '1.5' ); + array_unshift( $plugins, ABSPATH . 'my-hacks.php' ); + } + + if ( empty( $active_plugins ) || defined( 'WP_INSTALLING' ) ) + return $plugins; + + $network_plugins = is_multisite() ? wp_get_active_network_plugins() : false; + + foreach ( $active_plugins as $plugin ) { + if ( ! validate_file( $plugin ) // $plugin must validate as file + && '.php' == substr( $plugin, -4 ) // $plugin must end with '.php' + && file_exists( WP_PLUGIN_DIR . '/' . $plugin ) // $plugin must exist + // not already included as a network plugin + && ( ! $network_plugins || ! in_array( WP_PLUGIN_DIR . '/' . $plugin, $network_plugins ) ) + ) + $plugins[] = WP_PLUGIN_DIR . '/' . $plugin; + } + return $plugins; +} + +/** + * Sets internal encoding using mb_internal_encoding(). + * + * In most cases the default internal encoding is latin1, which is of no use, + * since we want to use the mb_ functions for utf-8 strings. + * + * @access private + * @since 3.0.0 + */ +function wp_set_internal_encoding() { + if ( function_exists( 'mb_internal_encoding' ) ) { + if ( !@mb_internal_encoding( get_option( 'blog_charset' ) ) ) + mb_internal_encoding( 'UTF-8' ); + } +} + +/** + * Add magic quotes to $_GET, $_POST, $_COOKIE, and $_SERVER. + * + * Also forces $_REQUEST to be $_GET + $_POST. If $_SERVER, $_COOKIE, + * or $_ENV are needed, use those superglobals directly. + * + * @access private + * @since 3.0.0 + */ +function wp_magic_quotes() { + // If already slashed, strip. + if ( get_magic_quotes_gpc() ) { + $_GET = stripslashes_deep( $_GET ); + $_POST = stripslashes_deep( $_POST ); + $_COOKIE = stripslashes_deep( $_COOKIE ); + } + + // Escape with wpdb. + $_GET = add_magic_quotes( $_GET ); + $_POST = add_magic_quotes( $_POST ); + $_COOKIE = add_magic_quotes( $_COOKIE ); + $_SERVER = add_magic_quotes( $_SERVER ); + + // Force REQUEST to be GET + POST. + $_REQUEST = array_merge( $_GET, $_POST ); +} + +/** + * Runs just before PHP shuts down execution. + * + * @access private + * @since 1.2.0 + */ +function shutdown_action_hook() { + do_action( 'shutdown' ); + wp_cache_close(); +} + +/** + * Copy an object. + * + * @since 2.7.0 + * @deprecated 3.2 + * + * @param object $object The object to clone + * @return object The cloned object + */ + +function wp_clone( $object ) { + // Use parens for clone to accommodate PHP 4. See #17880 + return clone( $object ); +} + +/** + * Whether the current request is for a network or blog admin page + * + * Does not inform on whether the user is an admin! Use capability checks to + * tell if the user should be accessing a section or not. + * + * @since 1.5.1 + * + * @return bool True if inside WordPress administration pages. + */ +function is_admin() { + if ( defined( 'WP_ADMIN' ) ) + return WP_ADMIN; + return false; +} + +/** + * Whether the current request is for a blog admin screen /wp-admin/ + * + * Does not inform on whether the user is a blog admin! Use capability checks to + * tell if the user should be accessing a section or not. + * + * @since 3.1.0 + * + * @return bool True if inside WordPress network administration pages. + */ +function is_blog_admin() { + if ( defined( 'WP_BLOG_ADMIN' ) ) + return WP_BLOG_ADMIN; + return false; +} + +/** + * Whether the current request is for a network admin screen /wp-admin/network/ + * + * Does not inform on whether the user is a network admin! Use capability checks to + * tell if the user should be accessing a section or not. + * + * @since 3.1.0 + * + * @return bool True if inside WordPress network administration pages. + */ +function is_network_admin() { + if ( defined( 'WP_NETWORK_ADMIN' ) ) + return WP_NETWORK_ADMIN; + return false; +} + +/** + * Whether the current request is for a user admin screen /wp-admin/user/ + * + * Does not inform on whether the user is an admin! Use capability checks to + * tell if the user should be accessing a section or not. + * + * @since 3.1.0 + * + * @return bool True if inside WordPress user administration pages. + */ +function is_user_admin() { + if ( defined( 'WP_USER_ADMIN' ) ) + return WP_USER_ADMIN; + return false; +} + +/** + * Whether Multisite support is enabled + * + * @since 3.0.0 + * + * @return bool True if multisite is enabled, false otherwise. + */ +function is_multisite() { + if ( defined( 'MULTISITE' ) ) + return MULTISITE; + + if ( defined( 'SUBDOMAIN_INSTALL' ) || defined( 'VHOST' ) || defined( 'SUNRISE' ) ) + return true; + + return false; +} + +?> diff --git a/src/wp-includes/locale.php b/src/wp-includes/locale.php new file mode 100644 index 0000000..dc3ede6 --- /dev/null +++ b/src/wp-includes/locale.php @@ -0,0 +1,351 @@ +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. The _%day%_initial suffix is a hack to make + // sure the day initials are unique. + $this->weekday_initial[__('Sunday')] = /* translators: one-letter abbreviation of the weekday */ __('S_Sunday_initial'); + $this->weekday_initial[__('Monday')] = /* translators: one-letter abbreviation of the weekday */ __('M_Monday_initial'); + $this->weekday_initial[__('Tuesday')] = /* translators: one-letter abbreviation of the weekday */ __('T_Tuesday_initial'); + $this->weekday_initial[__('Wednesday')] = /* translators: one-letter abbreviation of the weekday */ __('W_Wednesday_initial'); + $this->weekday_initial[__('Thursday')] = /* translators: one-letter abbreviation of the weekday */ __('T_Thursday_initial'); + $this->weekday_initial[__('Friday')] = /* translators: one-letter abbreviation of the weekday */ __('F_Friday_initial'); + $this->weekday_initial[__('Saturday')] = /* translators: one-letter abbreviation of the weekday */ __('S_Saturday_initial'); + + foreach ($this->weekday_initial as $weekday_ => $weekday_initial_) { + $this->weekday_initial[$weekday_] = preg_replace('/_.+_initial$/', '', $weekday_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'); + + // Abbreviations for each month. Uses the same hack as above to get around the + // 'May' duplication. + $this->month_abbrev[__('January')] = /* translators: three-letter abbreviation of the month */ __('Jan_January_abbreviation'); + $this->month_abbrev[__('February')] = /* translators: three-letter abbreviation of the month */ __('Feb_February_abbreviation'); + $this->month_abbrev[__('March')] = /* translators: three-letter abbreviation of the month */ __('Mar_March_abbreviation'); + $this->month_abbrev[__('April')] = /* translators: three-letter abbreviation of the month */ __('Apr_April_abbreviation'); + $this->month_abbrev[__('May')] = /* translators: three-letter abbreviation of the month */ __('May_May_abbreviation'); + $this->month_abbrev[__('June')] = /* translators: three-letter abbreviation of the month */ __('Jun_June_abbreviation'); + $this->month_abbrev[__('July')] = /* translators: three-letter abbreviation of the month */ __('Jul_July_abbreviation'); + $this->month_abbrev[__('August')] = /* translators: three-letter abbreviation of the month */ __('Aug_August_abbreviation'); + $this->month_abbrev[__('September')] = /* translators: three-letter abbreviation of the month */ __('Sep_September_abbreviation'); + $this->month_abbrev[__('October')] = /* translators: three-letter abbreviation of the month */ __('Oct_October_abbreviation'); + $this->month_abbrev[__('November')] = /* translators: three-letter abbreviation of the month */ __('Nov_November_abbreviation'); + $this->month_abbrev[__('December')] = /* translators: three-letter abbreviation of the month */ __('Dec_December_abbreviation'); + + foreach ($this->month_abbrev as $month_ => $month_abbrev_) { + $this->month_abbrev[$month_] = preg_replace('/_.+_abbreviation$/', '', $month_abbrev_); + } + + // The Meridiems + $this->meridiem['am'] = __('am'); + $this->meridiem['pm'] = __('pm'); + $this->meridiem['AM'] = __('AM'); + $this->meridiem['PM'] = __('PM'); + + // Numbers formatting + // See http://php.net/number_format + + /* translators: $thousands_sep argument for http://php.net/number_format, default is , */ + $trans = __('number_format_thousands_sep'); + $this->number_format['thousands_sep'] = ('number_format_thousands_sep' == $trans) ? ',' : $trans; + + /* translators: $dec_point argument for http://php.net/number_format, default is . */ + $trans = __('number_format_decimal_point'); + $this->number_format['decimal_point'] = ('number_format_decimal_point' == $trans) ? '.' : $trans; + + // Import global locale vars set during inclusion of $locale.php. + foreach ( (array) $this->locale_vars as $var ) { + if ( isset($GLOBALS[$var]) ) + $this->$var = $GLOBALS[$var]; + } + + } + + /** + * 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 + */ + 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 + */ + 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 + */ + 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 + */ + 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 + */ + 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 + */ + function get_meridiem($meridiem) { + return $this->meridiem[$meridiem]; + } + + /** + * Global variables are deprecated. For backwards compatibility only. + * + * @deprecated For backwards compatibility only. + * @access private + * + * @since 2.1.0 + */ + 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; + } + + /** + * Constructor which calls helper methods to set up object variables + * + * @uses WP_Locale::init() + * @uses WP_Locale::register_globals() + * @since 2.1.0 + * + * @return WP_Locale + */ + function __construct() { + $this->init(); + $this->register_globals(); + } + /** + * Checks if current locale is RTL. + * + * @since 3.0.0 + * @return bool Whether locale is RTL. + */ + function is_rtl() { + return 'rtl' == $this->text_direction; + } +} + +/** + * Checks if current locale is RTL. + * + * @since 3.0.0 + * @return bool Whether locale is RTL. + */ +function is_rtl() { + global $wp_locale; + return $wp_locale->is_rtl(); +} + +?> diff --git a/src/wp-includes/media.php b/src/wp-includes/media.php new file mode 100644 index 0000000..f4e60d0 --- /dev/null +++ b/src/wp-includes/media.php @@ -0,0 +1,1441 @@ + 0 ) + $max_width = min( intval($content_width), $max_width ); + } elseif ( isset( $_wp_additional_image_sizes ) && count( $_wp_additional_image_sizes ) && in_array( $size, array_keys( $_wp_additional_image_sizes ) ) ) { + $max_width = intval( $_wp_additional_image_sizes[$size]['width'] ); + $max_height = intval( $_wp_additional_image_sizes[$size]['height'] ); + if ( intval($content_width) > 0 && is_admin() ) // Only in admin. Assume that theme authors know what they're doing. + $max_width = min( intval($content_width), $max_width ); + } + // $size == 'full' has no constraint + else { + $max_width = $width; + $max_height = $height; + } + + list( $max_width, $max_height ) = apply_filters( 'editor_max_image_size', array( $max_width, $max_height ), $size ); + + return wp_constrain_dimensions( $width, $height, $max_width, $max_height ); +} + +/** + * Retrieve width and height attributes using given width and height values. + * + * Both attributes are required in the sense that both parameters must have a + * value, but are optional in that if you set them to false or null, then they + * will not be added to the returned string. + * + * You can set the value using a string, but it will only take numeric values. + * If you wish to put 'px' after the numbers, then it will be stripped out of + * the return. + * + * @since 2.5.0 + * + * @param int|string $width Optional. Width attribute value. + * @param int|string $height Optional. Height attribute value. + * @return string HTML attributes for width and, or height. + */ +function image_hwstring($width, $height) { + $out = ''; + if ($width) + $out .= 'width="'.intval($width).'" '; + if ($height) + $out .= 'height="'.intval($height).'" '; + return $out; +} + +/** + * Scale an image to fit a particular size (such as 'thumb' or 'medium'). + * + * Array with image url, width, height, and whether is intermediate size, in + * that order is returned on success is returned. $is_intermediate is true if + * $url is a resized image, false if it is the original. + * + * The URL might be the original image, or it might be a resized version. This + * function won't create a new resized copy, it will just return an already + * resized one if it exists. + * + * A plugin may use the 'image_downsize' filter to hook into and offer image + * resizing services for images. The hook must return an array with the same + * elements that are returned in the function. The first element being the URL + * to the new image that was resized. + * + * @since 2.5.0 + * @uses apply_filters() Calls 'image_downsize' on $id and $size to provide + * resize services. + * + * @param int $id Attachment ID for image. + * @param array|string $size Optional, default is 'medium'. Size of image, either array or string. + * @return bool|array False on failure, array on success. + */ +function image_downsize($id, $size = 'medium') { + + if ( !wp_attachment_is_image($id) ) + return false; + + $img_url = wp_get_attachment_url($id); + $meta = wp_get_attachment_metadata($id); + $width = $height = 0; + $is_intermediate = false; + $img_url_basename = wp_basename($img_url); + + // plugins can use this to provide resize services + if ( $out = apply_filters('image_downsize', false, $id, $size) ) + return $out; + + // try for a new style intermediate size + if ( $intermediate = image_get_intermediate_size($id, $size) ) { + $img_url = str_replace($img_url_basename, $intermediate['file'], $img_url); + $width = $intermediate['width']; + $height = $intermediate['height']; + $is_intermediate = true; + } + elseif ( $size == 'thumbnail' ) { + // fall back to the old thumbnail + if ( ($thumb_file = wp_get_attachment_thumb_file($id)) && $info = getimagesize($thumb_file) ) { + $img_url = str_replace($img_url_basename, wp_basename($thumb_file), $img_url); + $width = $info[0]; + $height = $info[1]; + $is_intermediate = true; + } + } + if ( !$width && !$height && isset($meta['width'], $meta['height']) ) { + // any other type: use the real image + $width = $meta['width']; + $height = $meta['height']; + } + + if ( $img_url) { + // we have the actual image size, but might need to further constrain it if content_width is narrower + list( $width, $height ) = image_constrain_size_for_editor( $width, $height, $size ); + + return array( $img_url, $width, $height, $is_intermediate ); + } + return false; + +} + +/** + * Registers a new image size + */ +function add_image_size( $name, $width = 0, $height = 0, $crop = false ) { + global $_wp_additional_image_sizes; + $_wp_additional_image_sizes[$name] = array( 'width' => absint( $width ), 'height' => absint( $height ), 'crop' => (bool) $crop ); +} + +/** + * Registers an image size for the post thumbnail + */ +function set_post_thumbnail_size( $width = 0, $height = 0, $crop = false ) { + add_image_size( 'post-thumbnail', $width, $height, $crop ); +} + +/** + * An tag for an image attachment, scaling it down if requested. + * + * The filter 'get_image_tag_class' allows for changing the class name for the + * image without having to use regular expressions on the HTML content. The + * parameters are: what WordPress will use for the class, the Attachment ID, + * image align value, and the size the image should be. + * + * The second filter 'get_image_tag' has the HTML content, which can then be + * further manipulated by a plugin to change all attribute values and even HTML + * content. + * + * @since 2.5.0 + * + * @uses apply_filters() The 'get_image_tag_class' filter is the IMG element + * class attribute. + * @uses apply_filters() The 'get_image_tag' filter is the full IMG element with + * all attributes. + * + * @param int $id Attachment ID. + * @param string $alt Image Description for the alt attribute. + * @param string $title Image Description for the title attribute. + * @param string $align Part of the class name for aligning the image. + * @param string $size Optional. Default is 'medium'. + * @return string HTML IMG element for given image attachment + */ +function get_image_tag($id, $alt, $title, $align, $size='medium') { + + list( $img_src, $width, $height ) = image_downsize($id, $size); + $hwstring = image_hwstring($width, $height); + + $class = 'align' . esc_attr($align) .' size-' . esc_attr($size) . ' wp-image-' . $id; + $class = apply_filters('get_image_tag_class', $class, $id, $align, $size); + + $html = '' . esc_attr($alt) . ''; + + $html = apply_filters( 'get_image_tag', $html, $id, $alt, $title, $align, $size ); + + return $html; +} + +/** + * Load an image from a string, if PHP supports it. + * + * @since 2.1.0 + * + * @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 ) { + if ( is_numeric( $file ) ) + $file = get_attached_file( $file ); + + if ( ! file_exists( $file ) ) + 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 + @ini_set( 'memory_limit', apply_filters( 'image_memory_limit', WP_MAX_MEMORY_LIMIT ) ); + $image = imagecreatefromstring( file_get_contents( $file ) ); + + if ( !is_resource( $image ) ) + return sprintf(__('File “%s” is not an image.'), $file); + + return $image; +} + +/** + * Calculates the new dimentions for a downsampled image. + * + * If either width or height are empty, no constraint is applied on + * that dimension. + * + * @since 2.5.0 + * + * @param int $current_width Current width of the image. + * @param int $current_height Current height of the image. + * @param int $max_width Optional. Maximum wanted width. + * @param int $max_height Optional. Maximum wanted height. + * @return array First item is the width, the second item is the height. + */ +function wp_constrain_dimensions( $current_width, $current_height, $max_width=0, $max_height=0 ) { + if ( !$max_width and !$max_height ) + return array( $current_width, $current_height ); + + $width_ratio = $height_ratio = 1.0; + $did_width = $did_height = false; + + if ( $max_width > 0 && $current_width > 0 && $current_width > $max_width ) { + $width_ratio = $max_width / $current_width; + $did_width = true; + } + + if ( $max_height > 0 && $current_height > 0 && $current_height > $max_height ) { + $height_ratio = $max_height / $current_height; + $did_height = true; + } + + // Calculate the larger/smaller ratios + $smaller_ratio = min( $width_ratio, $height_ratio ); + $larger_ratio = max( $width_ratio, $height_ratio ); + + if ( intval( $current_width * $larger_ratio ) > $max_width || intval( $current_height * $larger_ratio ) > $max_height ) + // The larger ratio is too big. It would result in an overflow. + $ratio = $smaller_ratio; + else + // The larger ratio fits, and is likely to be a more "snug" fit. + $ratio = $larger_ratio; + + $w = intval( $current_width * $ratio ); + $h = intval( $current_height * $ratio ); + + // Sometimes, due to rounding, we'll end up with a result like this: 465x700 in a 177x177 box is 117x176... a pixel short + // We also have issues with recursive calls resulting in an ever-changing result. Contraining to the result of a constraint should yield the original result. + // Thus we look for dimensions that are one pixel shy of the max value and bump them up + if ( $did_width && $w == $max_width - 1 ) + $w = $max_width; // Round it up + if ( $did_height && $h == $max_height - 1 ) + $h = $max_height; // Round it up + + return array( $w, $h ); +} + +/** + * Retrieve calculated resized dimensions for use in imagecopyresampled(). + * + * Calculate dimensions and coordinates for a resized image that fits within a + * specified width and height. If $crop is true, the largest matching central + * portion of the image will be cropped out and resized to the required size. + * + * @since 2.5.0 + * + * @param int $orig_w Original width. + * @param int $orig_h Original height. + * @param int $dest_w New width. + * @param int $dest_h New height. + * @param bool $crop Optional, default is false. Whether to crop image or resize. + * @return bool|array False, on failure. Returned array matches parameters for imagecopyresampled() PHP function. + */ +function image_resize_dimensions($orig_w, $orig_h, $dest_w, $dest_h, $crop = false) { + + if ($orig_w <= 0 || $orig_h <= 0) + return false; + // at least one of dest_w or dest_h must be specific + if ($dest_w <= 0 && $dest_h <= 0) + return false; + + if ( $crop ) { + // crop the largest possible portion of the original image that we can size to $dest_w x $dest_h + $aspect_ratio = $orig_w / $orig_h; + $new_w = min($dest_w, $orig_w); + $new_h = min($dest_h, $orig_h); + + if ( !$new_w ) { + $new_w = intval($new_h * $aspect_ratio); + } + + if ( !$new_h ) { + $new_h = intval($new_w / $aspect_ratio); + } + + $size_ratio = max($new_w / $orig_w, $new_h / $orig_h); + + $crop_w = round($new_w / $size_ratio); + $crop_h = round($new_h / $size_ratio); + + $s_x = floor( ($orig_w - $crop_w) / 2 ); + $s_y = floor( ($orig_h - $crop_h) / 2 ); + } else { + // don't crop, just resize using $dest_w x $dest_h as a maximum bounding box + $crop_w = $orig_w; + $crop_h = $orig_h; + + $s_x = 0; + $s_y = 0; + + list( $new_w, $new_h ) = wp_constrain_dimensions( $orig_w, $orig_h, $dest_w, $dest_h ); + } + + // if the resulting image would be the same size or larger we don't want to resize it + if ( $new_w >= $orig_w && $new_h >= $orig_h ) + return false; + + // the return array matches the parameters to imagecopyresampled() + // int dst_x, int dst_y, int src_x, int src_y, int dst_w, int dst_h, int src_w, int src_h + return array( 0, 0, (int) $s_x, (int) $s_y, (int) $new_w, (int) $new_h, (int) $crop_w, (int) $crop_h ); + +} + +/** + * 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 + * + * @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 ) { + + $image = wp_load_image( $file ); + if ( !is_resource( $image ) ) + return new WP_Error( 'error_loading_image', $image, $file ); + + $size = @getimagesize( $file ); + if ( !$size ) + return new WP_Error('invalid_image', __('Could not read image size'), $file); + list($orig_w, $orig_h, $orig_type) = $size; + + $dims = image_resize_dimensions($orig_w, $orig_h, $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; + + $newimage = wp_imagecreatetruecolor( $dst_w, $dst_h ); + + imagecopyresampled( $newimage, $image, $dst_x, $dst_y, $src_x, $src_y, $dst_w, $dst_h, $src_w, $src_h); + + // convert from full colors to index colors, like original PNG. + if ( IMAGETYPE_PNG == $orig_type && function_exists('imageistruecolor') && !imageistruecolor( $image ) ) + imagetruecolortopalette( $newimage, false, imagecolorstotal( $image ) ); + + // we don't need the original in memory anymore + imagedestroy( $image ); + + // $suffix will be appended to the destination filename, just before the extension + if ( !$suffix ) + $suffix = "{$dst_w}x{$dst_h}"; + + $info = pathinfo($file); + $dir = $info['dirname']; + $ext = $info['extension']; + $name = wp_basename($file, ".$ext"); + + if ( !is_null($dest_path) and $_dest_path = realpath($dest_path) ) + $dir = $_dest_path; + $destfilename = "{$dir}/{$name}-{$suffix}.{$ext}"; + + if ( IMAGETYPE_GIF == $orig_type ) { + if ( !imagegif( $newimage, $destfilename ) ) + return new WP_Error('resize_path_invalid', __( 'Resize path invalid' )); + } elseif ( IMAGETYPE_PNG == $orig_type ) { + if ( !imagepng( $newimage, $destfilename ) ) + return new WP_Error('resize_path_invalid', __( 'Resize path invalid' )); + } else { + // all other formats are converted to jpg + $destfilename = "{$dir}/{$name}-{$suffix}.jpg"; + if ( !imagejpeg( $newimage, $destfilename, apply_filters( 'jpeg_quality', $jpeg_quality, 'image_resize' ) ) ) + return new WP_Error('resize_path_invalid', __( 'Resize path invalid' )); + } + + imagedestroy( $newimage ); + + // Set correct file permissions + $stat = stat( dirname( $destfilename )); + $perms = $stat['mode'] & 0000666; //same permissions as parent folder, strip off the executable bits + @ chmod( $destfilename, $perms ); + + return $destfilename; +} + +/** + * Resize an image to make a thumbnail or intermediate size. + * + * The returned array has the file size, the image width, and image height. The + * filter 'image_make_intermediate_size' can be used to hook in and change the + * values of the returned array. The only parameter is the resized file path. + * + * @since 2.5.0 + * + * @param string $file File path. + * @param int $width Image width. + * @param int $height Image height. + * @param bool $crop Optional, default is false. Whether to crop image to specified height and width or resize. + * @return bool|array False, if no image was created. Metadata array on success. + */ +function image_make_intermediate_size($file, $width, $height, $crop=false) { + if ( $width || $height ) { + $resized_file = image_resize($file, $width, $height, $crop); + if ( !is_wp_error($resized_file) && $resized_file && $info = getimagesize($resized_file) ) { + $resized_file = apply_filters('image_make_intermediate_size', $resized_file); + return array( + 'file' => wp_basename( $resized_file ), + 'width' => $info[0], + 'height' => $info[1], + ); + } + } + return false; +} + +/** + * Retrieve the image's intermediate size (resized) path, width, and height. + * + * The $size parameter can be an array with the width and height respectively. + * If the size matches the 'sizes' metadata array for width and height, then it + * will be used. If there is no direct match, then the nearest image size larger + * than the specified size will be used. If nothing is found, then the function + * will break out and return false. + * + * The metadata 'sizes' is used for compatible sizes that can be used for the + * parameter $size value. + * + * The url path will be given, when the $size parameter is a string. + * + * If you are passing an array for the $size, you should consider using + * add_image_size() so that a cropped version is generated. It's much more + * efficient than having to find the closest-sized image and then having the + * browser scale down the image. + * + * @since 2.5.0 + * @see add_image_size() + * + * @param int $post_id Attachment ID for image. + * @param array|string $size Optional, default is 'thumbnail'. Size of image, either array or string. + * @return bool|array False on failure or array of file path, width, and height on success. + */ +function image_get_intermediate_size($post_id, $size='thumbnail') { + if ( !is_array( $imagedata = wp_get_attachment_metadata( $post_id ) ) ) + return false; + + // get the best one for a specified set of dimensions + if ( is_array($size) && !empty($imagedata['sizes']) ) { + foreach ( $imagedata['sizes'] as $_size => $data ) { + // already cropped to width or height; so use this size + if ( ( $data['width'] == $size[0] && $data['height'] <= $size[1] ) || ( $data['height'] == $size[1] && $data['width'] <= $size[0] ) ) { + $file = $data['file']; + list($width, $height) = image_constrain_size_for_editor( $data['width'], $data['height'], $size ); + return compact( 'file', 'width', 'height' ); + } + // add to lookup table: area => size + $areas[$data['width'] * $data['height']] = $_size; + } + if ( !$size || !empty($areas) ) { + // find for the smallest image not smaller than the desired size + ksort($areas); + foreach ( $areas as $_size ) { + $data = $imagedata['sizes'][$_size]; + if ( $data['width'] >= $size[0] || $data['height'] >= $size[1] ) { + // Skip images with unexpectedly divergent aspect ratios (crops) + // First, we calculate what size the original image would be if constrained to a box the size of the current image in the loop + $maybe_cropped = image_resize_dimensions($imagedata['width'], $imagedata['height'], $data['width'], $data['height'], false ); + // If the size doesn't match within one pixel, then it is of a different aspect ratio, so we skip it, unless it's the thumbnail size + if ( 'thumbnail' != $_size && ( !$maybe_cropped || ( $maybe_cropped[4] != $data['width'] && $maybe_cropped[4] + 1 != $data['width'] ) || ( $maybe_cropped[5] != $data['height'] && $maybe_cropped[5] + 1 != $data['height'] ) ) ) + continue; + // If we're still here, then we're going to use this size + $file = $data['file']; + list($width, $height) = image_constrain_size_for_editor( $data['width'], $data['height'], $size ); + return compact( 'file', 'width', 'height' ); + } + } + } + } + + if ( is_array($size) || empty($size) || empty($imagedata['sizes'][$size]) ) + return false; + + $data = $imagedata['sizes'][$size]; + // include the full filesystem path of the intermediate file + if ( empty($data['path']) && !empty($data['file']) ) { + $file_url = wp_get_attachment_url($post_id); + $data['path'] = path_join( dirname($imagedata['file']), $data['file'] ); + $data['url'] = path_join( dirname($file_url), $data['file'] ); + } + return $data; +} + +/** + * Get the available image sizes + * @since 3.0.0 + * @return array Returns a filtered array of image size strings + */ +function get_intermediate_image_sizes() { + global $_wp_additional_image_sizes; + $image_sizes = array('thumbnail', 'medium', 'large'); // Standard sizes + if ( isset( $_wp_additional_image_sizes ) && count( $_wp_additional_image_sizes ) ) + $image_sizes = array_merge( $image_sizes, array_keys( $_wp_additional_image_sizes ) ); + + return apply_filters( 'intermediate_image_sizes', $image_sizes ); +} + +/** + * Retrieve an image to represent an attachment. + * + * A mime icon for files, thumbnail or intermediate size for images. + * + * @since 2.5.0 + * + * @param int $attachment_id Image attachment ID. + * @param string $size Optional, default is 'thumbnail'. + * @param bool $icon Optional, default is false. Whether it is an icon. + * @return bool|array Returns an array (url, width, height), or false, if no image is available. + */ +function wp_get_attachment_image_src($attachment_id, $size='thumbnail', $icon = false) { + + // get a thumbnail or intermediate image if there is one + if ( $image = image_downsize($attachment_id, $size) ) + return $image; + + $src = false; + + if ( $icon && $src = wp_mime_type_icon($attachment_id) ) { + $icon_dir = apply_filters( 'icon_dir', ABSPATH . WPINC . '/images/crystal' ); + $src_file = $icon_dir . '/' . wp_basename($src); + @list($width, $height) = getimagesize($src_file); + } + if ( $src && $width && $height ) + return array( $src, $width, $height ); + return false; +} + +/** + * Get an HTML img element representing an image attachment + * + * While $size will accept an array, it is better to register a size with + * add_image_size() so that a cropped version is generated. It's much more + * efficient than having to find the closest-sized image and then having the + * browser scale down the image. + * + * @see add_image_size() + * @uses apply_filters() Calls 'wp_get_attachment_image_attributes' hook on attributes array + * @uses wp_get_attachment_image_src() Gets attachment file URL and dimensions + * @since 2.5.0 + * + * @param int $attachment_id Image attachment ID. + * @param string $size Optional, default is 'thumbnail'. + * @param bool $icon Optional, default is false. Whether it is an icon. + * @return string HTML img element or empty string on failure. + */ +function wp_get_attachment_image($attachment_id, $size = 'thumbnail', $icon = false, $attr = '') { + + $html = ''; + $image = wp_get_attachment_image_src($attachment_id, $size, $icon); + if ( $image ) { + list($src, $width, $height) = $image; + $hwstring = image_hwstring($width, $height); + if ( is_array($size) ) + $size = join('x', $size); + $attachment =& get_post($attachment_id); + $default_attr = array( + 'src' => $src, + 'class' => "attachment-$size", + 'alt' => trim(strip_tags( get_post_meta($attachment_id, '_wp_attachment_image_alt', true) )), // Use Alt field first + 'title' => trim(strip_tags( $attachment->post_title )), + ); + if ( empty($default_attr['alt']) ) + $default_attr['alt'] = trim(strip_tags( $attachment->post_excerpt )); // If not, Use the Caption + if ( empty($default_attr['alt']) ) + $default_attr['alt'] = trim(strip_tags( $attachment->post_title )); // Finally, use the title + + $attr = wp_parse_args($attr, $default_attr); + $attr = apply_filters( 'wp_get_attachment_image_attributes', $attr, $attachment ); + $attr = array_map( 'esc_attr', $attr ); + $html = rtrim(" $value ) { + $html .= " $name=" . '"' . $value . '"'; + } + $html .= ' />'; + } + + return $html; +} + +/** + * Adds a 'wp-post-image' class to post thumbnail thumbnails + * Uses the begin_fetch_post_thumbnail_html and end_fetch_post_thumbnail_html action hooks to + * dynamically add/remove itself so as to only filter post thumbnail thumbnails + * + * @since 2.9.0 + * @param array $attr Attributes including src, class, alt, title + * @return array + */ +function _wp_post_thumbnail_class_filter( $attr ) { + $attr['class'] .= ' wp-post-image'; + return $attr; +} + +/** + * Adds _wp_post_thumbnail_class_filter to the wp_get_attachment_image_attributes filter + * + * @since 2.9.0 + */ +function _wp_post_thumbnail_class_filter_add( $attr ) { + add_filter( 'wp_get_attachment_image_attributes', '_wp_post_thumbnail_class_filter' ); +} + +/** + * Removes _wp_post_thumbnail_class_filter from the wp_get_attachment_image_attributes filter + * + * @since 2.9.0 + */ +function _wp_post_thumbnail_class_filter_remove( $attr ) { + remove_filter( 'wp_get_attachment_image_attributes', '_wp_post_thumbnail_class_filter' ); +} + +add_shortcode('wp_caption', 'img_caption_shortcode'); +add_shortcode('caption', 'img_caption_shortcode'); + +/** + * The Caption shortcode. + * + * Allows a plugin to replace the content that would otherwise be returned. The + * filter is 'img_caption_shortcode' and passes an empty string, the attr + * parameter and the content parameter values. + * + * The supported attributes for the shortcode are 'id', 'align', 'width', and + * 'caption'. + * + * @since 2.6.0 + * + * @param array $attr Attributes attributed to the shortcode. + * @param string $content Optional. Shortcode content. + * @return string + */ +function img_caption_shortcode($attr, $content = null) { + + // Allow plugins/themes to override the default caption template. + $output = apply_filters('img_caption_shortcode', '', $attr, $content); + if ( $output != '' ) + return $output; + + extract(shortcode_atts(array( + 'id' => '', + 'align' => 'alignnone', + 'width' => '', + 'caption' => '' + ), $attr)); + + if ( 1 > (int) $width || empty($caption) ) + return $content; + + if ( $id ) $id = 'id="' . esc_attr($id) . '" '; + + return '
    ' + . do_shortcode( $content ) . '

    ' . $caption . '

    '; +} + +add_shortcode('gallery', 'gallery_shortcode'); + +/** + * The Gallery shortcode. + * + * This implements the functionality of the Gallery Shortcode for displaying + * WordPress images on a post. + * + * @since 2.5.0 + * + * @param array $attr Attributes attributed to the shortcode. + * @return string HTML content to display gallery. + */ +function gallery_shortcode($attr) { + global $post, $wp_locale; + + static $instance = 0; + $instance++; + + // Allow plugins/themes to override the default gallery template. + $output = apply_filters('post_gallery', '', $attr); + if ( $output != '' ) + return $output; + + // We're trusting author input, so let's at least make sure it looks like a valid orderby statement + if ( isset( $attr['orderby'] ) ) { + $attr['orderby'] = sanitize_sql_orderby( $attr['orderby'] ); + if ( !$attr['orderby'] ) + unset( $attr['orderby'] ); + } + + extract(shortcode_atts(array( + 'order' => 'ASC', + 'orderby' => 'menu_order ID', + 'id' => $post->ID, + 'itemtag' => 'dl', + 'icontag' => 'dt', + 'captiontag' => 'dd', + '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); + $itemwidth = $columns > 0 ? floor(100/$columns) : 100; + $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 = "\n"; + + return $output; +} + +/** + * Display previous image link that has the same post parent. + * + * @since 2.5.0 + * @param string $size Optional, default is 'thumbnail'. Size of image, either array or string. 0 or 'none' will default to post_title or $text; + * @param string $text Optional, default is false. If included, link will reflect $text variable. + * @return string HTML content. + */ +function previous_image_link($size = 'thumbnail', $text = false) { + adjacent_image_link(true, $size, $text); +} + +/** + * Display next image link that has the same post parent. + * + * @since 2.5.0 + * @param string $size Optional, default is 'thumbnail'. Size of image, either array or string. 0 or 'none' will default to post_title or $text; + * @param string $text Optional, default is false. If included, link will reflect $text variable. + * @return string HTML content. + */ +function next_image_link($size = 'thumbnail', $text = false) { + adjacent_image_link(false, $size, $text); +} + +/** + * Display next or previous image link that has the same post parent. + * + * Retrieves the current attachment object from the $post global. + * + * @since 2.5.0 + * + * @param bool $prev Optional. Default is true to display previous link, true for next. + */ +function adjacent_image_link($prev = true, $size = 'thumbnail', $text = false) { + global $post; + $post = get_post($post); + $attachments = array_values(get_children( array('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; + + $k = $prev ? $k - 1 : $k + 1; + + if ( isset($attachments[$k]) ) + echo wp_get_attachment_link($attachments[$k]->ID, $size, true, false, $text); +} + +/** + * Retrieve taxonomies attached to the attachment. + * + * @since 2.5.0 + * + * @param int|array|object $attachment Attachment ID, Attachment data array, or Attachment data object. + * @return array Empty array on failure. List of taxonomies on success. + */ +function get_attachment_taxonomies($attachment) { + if ( is_int( $attachment ) ) + $attachment = get_post($attachment); + else if ( is_array($attachment) ) + $attachment = (object) $attachment; + + if ( ! is_object($attachment) ) + return array(); + + $filename = basename($attachment->guid); + + $objects = array('attachment'); + + if ( false !== strpos($filename, '.') ) + $objects[] = 'attachment:' . substr($filename, strrpos($filename, '.') + 1); + if ( !empty($attachment->post_mime_type) ) { + $objects[] = 'attachment:' . $attachment->post_mime_type; + if ( false !== strpos($attachment->post_mime_type, '/') ) + foreach ( explode('/', $attachment->post_mime_type) as $token ) + if ( !empty($token) ) + $objects[] = "attachment:$token"; + } + + $taxonomies = array(); + foreach ( $objects as $object ) + if ( $taxes = get_object_taxonomies($object) ) + $taxonomies = array_merge($taxonomies, $taxes); + + return array_unique($taxonomies); +} + +/** + * Check if the installed version of GD supports particular image type + * + * @since 2.9.0 + * + * @param string $mime_type + * @return bool + */ +function gd_edit_image_support($mime_type) { + 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; +} + +/** + * Create new GD image resource with transparency support + * + * @since 2.9.0 + * + * @param int $width Image width + * @param int $height Image height + * @return image resource + */ +function wp_imagecreatetruecolor($width, $height) { + $img = imagecreatetruecolor($width, $height); + if ( is_resource($img) && function_exists('imagealphablending') && function_exists('imagesavealpha') ) { + imagealphablending($img, false); + imagesavealpha($img, true); + } + return $img; +} + +/** + * API for easily embedding rich media such as videos and images into content. + * + * @package WordPress + * @subpackage Embed + * @since 2.9.0 + */ +class WP_Embed { + var $handlers = array(); + var $post_ID; + var $usecache = true; + var $linkifunknown = true; + + /** + * Constructor + */ + 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 + if ( get_option('embed_autourls') ) + add_filter( 'the_content', array(&$this, 'autoembed'), 8 ); + + // After a post is saved, invalidate the oEmbed cache + add_action( 'save_post', array(&$this, 'delete_oembed_caches') ); + + // After a post is saved, cache oEmbed items via AJAX + add_action( 'edit_form_advanced', 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 {@link do_shortcode()}, and then re-registers the old shortcodes. + * + * @uses $shortcode_tags + * @uses remove_all_shortcodes() + * @uses add_shortcode() + * @uses do_shortcode() + * + * @param string $content Content to parse + * @return string Content with shortcode parsed + */ + 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 ); + + // 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(). + */ + function maybe_run_ajax_cache() { + global $post_ID; + + if ( empty($post_ID) || empty($_GET['message']) || 1 != $_GET['message'] ) + return; + +?> + +handlers[$priority][$id] = array( + 'regex' => $regex, + 'callback' => $callback, + ); + } + + /** + * Unregister a previously registered embed handler. Do not use this function directly, use {@link 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). + */ + function unregister_handler( $id, $priority = 10 ) { + if ( isset($this->handlers[$priority][$id]) ) + unset($this->handlers[$priority][$id]); + } + + /** + * The {@link 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 {@link WP_oEmbed} class. + * + * @uses wp_oembed_get() + * @uses wp_parse_args() + * @uses wp_embed_defaults() + * @uses WP_Embed::maybe_make_link() + * @uses get_option() + * @uses current_user_can() + * @uses wp_cache_get() + * @uses wp_cache_set() + * @uses get_post_meta() + * @uses update_post_meta() + * + * @param array $attr Shortcode attributes. + * @param string $url The URL attempting to be embeded. + * @return string The embed HTML on success, otherwise the original URL. + */ + function shortcode( $attr, $url = '' ) { + global $post; + + if ( empty($url) ) + return ''; + + $rawattr = $attr; + $attr = wp_parse_args( $attr, wp_embed_defaults() ); + + // kses converts & into & and we need to undo this + // See http://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 ) ) + 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) + $cachekey = '_oembed_' . md5( $url . serialize( $attr ) ); + if ( $this->usecache ) { + $cache = get_post_meta( $post_ID, $cachekey, true ); + + // Failures are cached + if ( '{{unknown}}' === $cache ) + return $this->maybe_make_link( $url ); + + if ( !empty($cache) ) + return apply_filters( 'embed_oembed_html', $cache, $url, $attr, $post_ID ); + } + + // Use oEmbed to get the HTML + $attr['discover'] = ( apply_filters('embed_oembed_discover', false) && author_can( $post_ID, 'unfiltered_html' ) ); + $html = wp_oembed_get( $url, $attr ); + + // Cache the result + $cache = ( $html ) ? $html : '{{unknown}}'; + update_post_meta( $post_ID, $cachekey, $cache ); + + // If there was a result, return it + if ( $html ) + return apply_filters( 'embed_oembed_html', $html, $url, $attr, $post_ID ); + } + + // Still unknown + return $this->maybe_make_link( $url ); + } + + /** + * Delete all oEmbed caches. + * + * @param int $post_ID Post ID to delete the caches for. + */ + 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. + */ + function cache_oembed( $post_ID ) { + $post = get_post( $post_ID ); + + if ( empty($post->ID) || !in_array( $post->post_type, apply_filters( 'embed_cache_oembed_types', array( 'post', 'page' ) ) ) ) + return; + + // Trigger a caching + if ( !empty($post->post_content) ) { + $this->post_ID = $post->ID; + $this->usecache = false; + + $content = $this->run_shortcode( $post->post_content ); + if ( get_option('embed_autourls') ) + $this->autoembed( $content ); + + $this->usecache = true; + } + } + + /** + * Passes any unlinked URLs that are on their own line to {@link WP_Embed::shortcode()} for potential embedding. + * + * @uses WP_Embed::autoembed_callback() + * + * @param string $content The content to be searched. + * @return string Potentially modified $content. + */ + function autoembed( $content ) { + return preg_replace_callback( '|^\s*(https?://[^\s"]+)\s*$|im', array(&$this, 'autoembed_callback'), $content ); + } + + /** + * Callback function for {@link WP_Embed::autoembed()}. + * + * @uses WP_Embed::shortcode() + * + * @param array $match A regex match array. + * @return string The embed HTML on success, otherwise the original URL. + */ + function autoembed_callback( $match ) { + $oldval = $this->linkifunknown; + $this->linkifunknown = false; + $return = $this->shortcode( array(), $match[1] ); + $this->linkifunknown = $oldval; + + return "\n$return\n"; + } + + /** + * Conditionally makes a hyperlink based on an internal class variable. + * + * @param string $url URL to potentially be linked. + * @return string Linked URL or the original URL. + */ + function maybe_make_link( $url ) { + $output = ( $this->linkifunknown ) ? '' . esc_html($url) . '' : $url; + return apply_filters( 'embed_maybe_make_link', $output, $url ); + } +} +$wp_embed = new WP_Embed(); + +/** + * Register an embed handler. This function should probably only be used for sites that do not support oEmbed. + * + * @since 2.9.0 + * @see WP_Embed::register_handler() + */ +function wp_embed_register_handler( $id, $regex, $callback, $priority = 10 ) { + global $wp_embed; + $wp_embed->register_handler( $id, $regex, $callback, $priority ); +} + +/** + * Unregister a previously registered embed handler. + * + * @since 2.9.0 + * @see WP_Embed::unregister_handler() + */ +function wp_embed_unregister_handler( $id, $priority = 10 ) { + global $wp_embed; + $wp_embed->unregister_handler( $id, $priority ); +} + +/** + * Create default array of embed parameters. + * + * @since 2.9.0 + * + * @return array Default embed parameters. + */ +function wp_embed_defaults() { + if ( !empty($GLOBALS['content_width']) ) + $theme_width = (int) $GLOBALS['content_width']; + + $width = get_option('embed_size_w'); + + if ( empty($width) && !empty($theme_width) ) + $width = $theme_width; + + if ( empty($width) ) + $width = 500; + + $height = get_option('embed_size_h'); + + if ( empty($height) ) + $height = 700; + + return apply_filters( 'embed_defaults', array( + 'width' => $width, + 'height' => $height, + ) ); +} + +/** + * Based on a supplied width/height example, return the biggest possible dimensions based on the max width/height. + * + * @since 2.9.0 + * @uses wp_constrain_dimensions() This function passes the widths and the heights. + * + * @param int $example_width The width of an example embed. + * @param int $example_height The height of an example embed. + * @param int $max_width The maximum allowed width. + * @param int $max_height The maximum allowed height. + * @return array The maximum possible width and height based on the example ratio. + */ +function wp_expand_dimensions( $example_width, $example_height, $max_width, $max_height ) { + $example_width = (int) $example_width; + $example_height = (int) $example_height; + $max_width = (int) $max_width; + $max_height = (int) $max_height; + + return wp_constrain_dimensions( $example_width * 1000000, $example_height * 1000000, $max_width, $max_height ); +} + +/** + * Attempts to fetch the embed HTML for a provided URL using oEmbed. + * + * @since 2.9.0 + * @see WP_oEmbed + * + * @uses _wp_oembed_get_object() + * @uses WP_oEmbed::get_html() + * + * @param string $url The URL that should be embeded. + * @param array $args Addtional arguments and parameters. + * @return string The original URL on failure or the embed HTML on success. + */ +function wp_oembed_get( $url, $args = '' ) { + require_once( ABSPATH . WPINC . '/class-oembed.php' ); + $oembed = _wp_oembed_get_object(); + return $oembed->get_html( $url, $args ); +} + +/** + * Adds a URL format and oEmbed provider URL pair. + * + * @since 2.9.0 + * @see WP_oEmbed + * + * @uses _wp_oembed_get_object() + * + * @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 Whether the $format parameter is in a regex format. + */ +function wp_oembed_add_provider( $format, $provider, $regex = false ) { + require_once( ABSPATH . WPINC . '/class-oembed.php' ); + $oembed = _wp_oembed_get_object(); + $oembed->providers[$format] = array( $provider, $regex ); +} + +/** + * 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 + */ +function wp_maybe_load_embeds() { + if ( ! apply_filters( 'load_default_embeds', true ) ) + return; + wp_embed_register_handler( 'googlevideo', '#http://video\.google\.([A-Za-z.]{2,5})/videoplay\?docid=([\d-]+)(.*?)#i', 'wp_embed_handler_googlevideo' ); +} + +/** + * The Google Video embed handler callback. Google Video does not support oEmbed. + * + * @see WP_Embed::register_handler() + * @see WP_Embed::shortcode() + * + * @param array $matches The regex matches from the provided regex when calling {@link 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_googlevideo( $matches, $attr, $url, $rawattr ) { + // If the user supplied a fixed width AND height, use it + if ( !empty($rawattr['width']) && !empty($rawattr['height']) ) { + $width = (int) $rawattr['width']; + $height = (int) $rawattr['height']; + } else { + list( $width, $height ) = wp_expand_dimensions( 425, 344, $attr['width'], $attr['height'] ); + } + + return apply_filters( 'embed_googlevideo', '', $matches, $attr, $url, $rawattr ); +} + +?> \ No newline at end of file diff --git a/src/wp-includes/meta.php b/src/wp-includes/meta.php new file mode 100644 index 0000000..b24ae08 --- /dev/null +++ b/src/wp-includes/meta.php @@ -0,0 +1,610 @@ +get_var( $wpdb->prepare( + "SELECT COUNT(*) FROM $table WHERE meta_key = %s AND $column = %d", + $meta_key, $object_id ) ) ) + return false; + + $_meta_value = $meta_value; + $meta_value = maybe_serialize( $meta_value ); + + do_action( "add_{$meta_type}_meta", $object_id, $meta_key, $_meta_value ); + + $wpdb->insert( $table, array( + $column => $object_id, + 'meta_key' => $meta_key, + 'meta_value' => $meta_value + ) ); + + wp_cache_delete($object_id, $meta_type . '_meta'); + // users cache stores usermeta that must be cleared. + if ( 'user' == $meta_type ) + clean_user_cache($object_id); + + do_action( "added_{$meta_type}_meta", $wpdb->insert_id, $object_id, $meta_key, $_meta_value ); + + return true; +} + +/** + * Update metadata for the specified object. If no value already exists for the specified object + * ID and metadata key, the metadata will be added. + * + * @since 2.9.0 + * @uses $wpdb WordPress database object for queries. + * @uses do_action() Calls 'update_{$meta_type}_meta' before updating metadata with meta_id of + * metadata entry to update, object ID, meta key, and meta value + * @uses do_action() Calls 'updated_{$meta_type}_meta' after updating metadata with meta_id of + * updated metadata entry, object ID, meta key, and meta value + * + * @param string $meta_type Type of object metadata is for (e.g., comment, post, or user) + * @param int $object_id ID of the object metadata is for + * @param string $meta_key Metadata key + * @param string $meta_value Metadata value + * @param string $prev_value Optional. If specified, only update existing metadata entries with + * the specified value. Otherwise, update all entries. + * @return bool True on successful update, false on failure. + */ +function update_metadata($meta_type, $object_id, $meta_key, $meta_value, $prev_value = '') { + if ( !$meta_type || !$meta_key ) + return false; + + if ( !$object_id = absint($object_id) ) + return false; + + if ( ! $table = _get_meta_table($meta_type) ) + return false; + + global $wpdb; + + $column = esc_sql($meta_type . '_id'); + $id_column = 'user' == $meta_type ? 'umeta_id' : 'meta_id'; + + // expected_slashed ($meta_key) + $meta_key = stripslashes($meta_key); + $meta_value = stripslashes_deep($meta_value); + $meta_value = sanitize_meta( $meta_key, $meta_value, $meta_type ); + + $check = apply_filters( "update_{$meta_type}_metadata", null, $object_id, $meta_key, $meta_value, $prev_value ); + if ( null !== $check ) + return (bool) $check; + + if ( ! $meta_id = $wpdb->get_var( $wpdb->prepare( "SELECT $id_column FROM $table WHERE meta_key = %s AND $column = %d", $meta_key, $object_id ) ) ) + return add_metadata($meta_type, $object_id, $meta_key, $meta_value); + + // Compare existing value to new value if no prev value given and the key exists only once. + if ( empty($prev_value) ) { + $old_value = get_metadata($meta_type, $object_id, $meta_key); + if ( count($old_value) == 1 ) { + if ( $old_value[0] === $meta_value ) + return false; + } + } + + $_meta_value = $meta_value; + $meta_value = maybe_serialize( $meta_value ); + + $data = compact( 'meta_value' ); + $where = array( $column => $object_id, 'meta_key' => $meta_key ); + + if ( !empty( $prev_value ) ) { + $prev_value = maybe_serialize($prev_value); + $where['meta_value'] = $prev_value; + } + + do_action( "update_{$meta_type}_meta", $meta_id, $object_id, $meta_key, $_meta_value ); + + $wpdb->update( $table, $data, $where ); + wp_cache_delete($object_id, $meta_type . '_meta'); + // users cache stores usermeta that must be cleared. + if ( 'user' == $meta_type ) + clean_user_cache($object_id); + + do_action( "updated_{$meta_type}_meta", $meta_id, $object_id, $meta_key, $_meta_value ); + + return true; +} + +/** + * Delete metadata for the specified object. + * + * @since 2.9.0 + * @uses $wpdb WordPress database object for queries. + * @uses do_action() Calls 'deleted_{$meta_type}_meta' after deleting with meta_id of + * deleted metadata entries, object ID, meta key, and meta value + * + * @param string $meta_type Type of object metadata is for (e.g., comment, post, or user) + * @param int $object_id ID of the object metadata is for + * @param string $meta_key Metadata key + * @param string $meta_value Optional. Metadata value. If specified, only delete metadata entries + * with this value. Otherwise, delete all entries with the specified meta_key. + * @param bool $delete_all Optional, default is false. If true, delete matching metadata entries + * for all objects, ignoring the specified object_id. Otherwise, only delete matching + * metadata entries for the specified object_id. + * @return bool True on successful delete, false on failure. + */ +function delete_metadata($meta_type, $object_id, $meta_key, $meta_value = '', $delete_all = false) { + if ( !$meta_type || !$meta_key ) + return false; + + if ( (!$object_id = absint($object_id)) && !$delete_all ) + return false; + + if ( ! $table = _get_meta_table($meta_type) ) + return false; + + global $wpdb; + + $type_column = esc_sql($meta_type . '_id'); + $id_column = 'user' == $meta_type ? 'umeta_id' : 'meta_id'; + // expected_slashed ($meta_key) + $meta_key = stripslashes($meta_key); + $meta_value = stripslashes_deep($meta_value); + + $check = apply_filters( "delete_{$meta_type}_metadata", null, $object_id, $meta_key, $meta_value, $delete_all ); + if ( null !== $check ) + return (bool) $check; + + $_meta_value = $meta_value; + $meta_value = maybe_serialize( $meta_value ); + + $query = $wpdb->prepare( "SELECT $id_column FROM $table WHERE meta_key = %s", $meta_key ); + + if ( !$delete_all ) + $query .= $wpdb->prepare(" AND $type_column = %d", $object_id ); + + if ( $meta_value ) + $query .= $wpdb->prepare(" AND meta_value = %s", $meta_value ); + + $meta_ids = $wpdb->get_col( $query ); + if ( !count( $meta_ids ) ) + return false; + + do_action( "delete_{$meta_type}_meta", $meta_ids, $object_id, $meta_key, $_meta_value ); + + $query = "DELETE FROM $table WHERE $id_column IN( " . implode( ',', $meta_ids ) . " )"; + + $count = $wpdb->query($query); + + if ( !$count ) + return false; + + wp_cache_delete($object_id, $meta_type . '_meta'); + // users cache stores usermeta that must be cleared. + if ( 'user' == $meta_type ) + clean_user_cache($object_id); + + do_action( "deleted_{$meta_type}_meta", $meta_ids, $object_id, $meta_key, $_meta_value ); + + return true; +} + +/** + * Retrieve metadata for the specified object. + * + * @since 2.9.0 + * + * @param string $meta_type Type of object metadata is for (e.g., comment, post, or user) + * @param int $object_id ID of the object metadata is for + * @param string $meta_key Optional. Metadata key. If not specified, retrieve all metadata for + * the specified object. + * @param bool $single Optional, default is false. If true, return only the first value of the + * specified meta_key. This parameter has no effect if meta_key is not specified. + * @return string|array Single metadata value, or array of values + */ +function get_metadata($meta_type, $object_id, $meta_key = '', $single = false) { + if ( !$meta_type ) + return false; + + if ( !$object_id = absint($object_id) ) + return false; + + $check = apply_filters( "get_{$meta_type}_metadata", null, $object_id, $meta_key, $single ); + if ( null !== $check ) { + if ( $single && is_array( $check ) ) + return $check[0]; + else + return $check; + } + + $meta_cache = wp_cache_get($object_id, $meta_type . '_meta'); + + if ( !$meta_cache ) { + $meta_cache = update_meta_cache( $meta_type, array( $object_id ) ); + $meta_cache = $meta_cache[$object_id]; + } + + if ( !$meta_key ) + return $meta_cache; + + if ( isset($meta_cache[$meta_key]) ) { + if ( $single ) + return maybe_unserialize( $meta_cache[$meta_key][0] ); + else + return array_map('maybe_unserialize', $meta_cache[$meta_key]); + } + + if ($single) + return ''; + else + return array(); +} + +/** + * Update the metadata cache for the specified objects. + * + * @since 2.9.0 + * @uses $wpdb WordPress database object for queries. + * + * @param string $meta_type Type of object metadata is for (e.g., comment, post, or user) + * @param int|array $object_ids array or comma delimited list of object IDs to update cache for + * @return mixed Metadata cache for the specified objects, or false on failure. + */ +function update_meta_cache($meta_type, $object_ids) { + if ( empty( $meta_type ) || empty( $object_ids ) ) + return false; + + if ( ! $table = _get_meta_table($meta_type) ) + return false; + + $column = esc_sql($meta_type . '_id'); + + global $wpdb; + + if ( !is_array($object_ids) ) { + $object_ids = preg_replace('|[^0-9,]|', '', $object_ids); + $object_ids = explode(',', $object_ids); + } + + $object_ids = array_map('intval', $object_ids); + + $cache_key = $meta_type . '_meta'; + $ids = array(); + $cache = array(); + foreach ( $object_ids as $id ) { + $cached_object = wp_cache_get( $id, $cache_key ); + if ( false === $cached_object ) + $ids[] = $id; + else + $cache[$id] = $cached_object; + } + + if ( empty( $ids ) ) + return $cache; + + // Get meta info + $id_list = join(',', $ids); + $meta_list = $wpdb->get_results( $wpdb->prepare("SELECT $column, meta_key, meta_value FROM $table WHERE $column IN ($id_list)", + $meta_type), ARRAY_A ); + + if ( !empty($meta_list) ) { + foreach ( $meta_list as $metarow) { + $mpid = intval($metarow[$column]); + $mkey = $metarow['meta_key']; + $mval = $metarow['meta_value']; + + // Force subkeys to be array type: + if ( !isset($cache[$mpid]) || !is_array($cache[$mpid]) ) + $cache[$mpid] = array(); + if ( !isset($cache[$mpid][$mkey]) || !is_array($cache[$mpid][$mkey]) ) + $cache[$mpid][$mkey] = array(); + + // Add a value to the current pid/key: + $cache[$mpid][$mkey][] = $mval; + } + } + + foreach ( $ids as $id ) { + if ( ! isset($cache[$id]) ) + $cache[$id] = array(); + wp_cache_add( $id, $cache[$id], $cache_key ); + } + + return $cache; +} + +/** + * Given a meta query, generates SQL clauses to be appended to a main query + * + * @since 3.2.0 + * + * @see WP_Meta_Query + * + * @param array (optional) $meta_query A meta query + * @param string $type Type of meta + * @param string $primary_table + * @param string $primary_id_column + * @param object $context (optional) The main query object + * @return array( 'join' => $join_sql, 'where' => $where_sql ) + */ +function get_meta_sql( $meta_query = false, $type, $primary_table, $primary_id_column, $context = null ) { + $meta_query_obj = new WP_Meta_Query( $meta_query ); + return $meta_query_obj->get_sql( $type, $primary_table, $primary_id_column, $context ); +} + +/** + * Container class for a multiple metadata query + * + * @since 3.2.0 + */ +class WP_Meta_Query { + /** + * List of metadata queries. A single query is an associative array: + * - 'key' string The meta key + * - 'value' string|array The meta value + * - 'compare' (optional) string How to compare the key to the value. + * Possible values: '=', '!=', '>', '>=', '<', '<=', 'LIKE', 'NOT LIKE', 'IN', 'NOT IN', 'BETWEEN', 'NOT BETWEEN'. + * Default: '=' + * - 'type' string (optional) The type of the value. + * Possible values: 'NUMERIC', 'BINARY', 'CHAR', 'DATE', 'DATETIME', 'DECIMAL', 'SIGNED', 'TIME', 'UNSIGNED'. + * Default: 'CHAR' + * + * @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; + + /** + * Constructor + * + * @param array (optional) $meta_query A meta query + */ + 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 = array(); + + foreach ( $meta_query as $key => $query ) { + if ( ! is_array( $query ) ) + continue; + + $this->queries[] = $query; + } + } + + /** + * Constructs a meta query based on 'meta_*' query vars + * + * @since 3.2.0 + * @access public + * + * @param array $qv The query variables + */ + function parse_query_vars( $qv ) { + $meta_query = array(); + + // Simple query needs to be first for orderby=meta_value to work correctly + foreach ( array( 'key', 'compare', 'type' ) as $key ) { + if ( !empty( $qv[ "meta_$key" ] ) ) + $meta_query[0][ $key ] = $qv[ "meta_$key" ]; + } + + // WP_Query sets 'meta_value' = '' by default + if ( isset( $qv[ 'meta_value' ] ) && '' !== $qv[ 'meta_value' ] ) + $meta_query[0]['value'] = $qv[ 'meta_value' ]; + + if ( !empty( $qv['meta_query'] ) && is_array( $qv['meta_query'] ) ) { + $meta_query = array_merge( $meta_query, $qv['meta_query'] ); + } + + $this->__construct( $meta_query ); + } + + /** + * Generates SQL clauses to be appended to a main query. + * + * @since 3.2.0 + * @access public + * + * @param string $type Type of meta + * @param string $primary_table + * @param string $primary_id_column + * @param object $context (optional) The main query object + * @return array( 'join' => $join_sql, 'where' => $where_sql ) + */ + function get_sql( $type, $primary_table, $primary_id_column, $context = null ) { + global $wpdb; + + if ( ! $meta_table = _get_meta_table( $type ) ) + return false; + + $meta_id_column = esc_sql( $type . '_id' ); + + $join = array(); + $where = array(); + + foreach ( $this->queries as $k => $q ) { + $meta_key = isset( $q['key'] ) ? trim( $q['key'] ) : ''; + $meta_compare = isset( $q['compare'] ) ? strtoupper( $q['compare'] ) : '='; + $meta_type = isset( $q['type'] ) ? strtoupper( $q['type'] ) : 'CHAR'; + + if ( ! in_array( $meta_compare, array( '=', '!=', '>', '>=', '<', '<=', 'LIKE', 'NOT LIKE', 'IN', 'NOT IN', 'BETWEEN', 'NOT BETWEEN' ) ) ) + $meta_compare = '='; + + if ( 'NUMERIC' == $meta_type ) + $meta_type = 'SIGNED'; + elseif ( ! in_array( $meta_type, array( 'BINARY', 'CHAR', 'DATE', 'DATETIME', 'DECIMAL', 'SIGNED', 'TIME', 'UNSIGNED' ) ) ) + $meta_type = 'CHAR'; + + $i = count( $join ); + $alias = $i ? 'mt' . $i : $meta_table; + + // Set JOIN + $join[$i] = "INNER JOIN $meta_table"; + $join[$i] .= $i ? " AS $alias" : ''; + $join[$i] .= " ON ($primary_table.$primary_id_column = $alias.$meta_id_column)"; + + $where[$k] = ''; + if ( !empty( $meta_key ) ) + $where[$k] = $wpdb->prepare( "$alias.meta_key = %s", $meta_key ); + + if ( !isset( $q['value'] ) ) { + if ( empty( $where[$k] ) ) + unset( $join[$i] ); + continue; + } + + $meta_value = $q['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 ); + + if ( empty( $meta_value ) ) { + unset( $join[$i] ); + continue; + } + } else { + $meta_value = trim( $meta_value ); + } + + if ( 'IN' == substr( $meta_compare, -2) ) { + $meta_compare_string = '(' . substr( str_repeat( ',%s', count( $meta_value ) ), 1 ) . ')'; + } elseif ( 'BETWEEN' == substr( $meta_compare, -7) ) { + $meta_value = array_slice( $meta_value, 0, 2 ); + $meta_compare_string = '%s AND %s'; + } elseif ( 'LIKE' == substr( $meta_compare, -4 ) ) { + $meta_value = '%' . like_escape( $meta_value ) . '%'; + $meta_compare_string = '%s'; + } else { + $meta_compare_string = '%s'; + } + + if ( ! empty( $where[$k] ) ) + $where[$k] .= ' AND '; + + $where[$k] = ' (' . $where[$k] . $wpdb->prepare( "CAST($alias.meta_value AS {$meta_type}) {$meta_compare} {$meta_compare_string})", $meta_value ); + } + + $where = array_filter( $where ); + + if ( empty( $where ) ) + $where = ''; + else + $where = ' AND (' . implode( "\n{$this->relation} ", $where ) . ' )'; + + $join = implode( "\n", $join ); + if ( ! empty( $join ) ) + $join = ' ' . $join; + + return apply_filters_ref_array( 'get_meta_sql', array( compact( 'join', 'where' ), $this->queries, $type, $primary_table, $primary_id_column, $context ) ); + } +} + +/** + * Retrieve the name of the metadata table for the specified object type. + * + * @since 2.9.0 + * @uses $wpdb WordPress database object for queries. + * + * @param string $type Type of object to get metadata table for (e.g., comment, post, or user) + * @return mixed Metadata table name, or false if no metadata table exists + */ +function _get_meta_table($type) { + global $wpdb; + + $table_name = $type . 'meta'; + + if ( empty($wpdb->$table_name) ) + return false; + + return $wpdb->$table_name; +} + +/** + * Determine whether a meta key is protected + * + * @since 3.1.3 + * + * @param string $meta_key Meta key + * @return bool True if the key is protected, false otherwise. + */ +function is_protected_meta( $meta_key, $meta_type = null ) { + $protected = ( '_' == $meta_key[0] ); + + return apply_filters( 'is_protected_meta', $protected, $meta_key, $meta_type ); +} + +/** + * Sanitize meta value + * + * @since 3.1.3 + * + * @param string $meta_key Meta key + * @param mixed $meta_value Meta value to sanitize + * @param string $meta_type Type of meta + * @return mixed Sanitized $meta_value + */ +function sanitize_meta( $meta_key, $meta_value, $meta_type = null ) { + return apply_filters( 'sanitize_meta', $meta_value, $meta_key, $meta_type ); +} + +?> diff --git a/src/wp-includes/ms-blogs.php b/src/wp-includes/ms-blogs.php new file mode 100644 index 0000000..1c483e1 --- /dev/null +++ b/src/wp-includes/ms-blogs.php @@ -0,0 +1,681 @@ +update( $wpdb->blogs, array('last_updated' => current_time('mysql', true)), array('blog_id' => $wpdb->blogid) ); + refresh_blog_details( $wpdb->blogid ); + + do_action( 'wpmu_blog_updated', $wpdb->blogid ); +} + +/** + * Get a full blog URL, given a blog id. + * + * @since MU + * + * @param int $blog_id Blog ID + * @return string + */ +function get_blogaddress_by_id( $blog_id ) { + $bloginfo = get_blog_details( (int) $blog_id, false ); // only get bare details! + return esc_url( 'http://' . $bloginfo->domain . $bloginfo->path ); +} + +/** + * Get a full blog URL, given a blog name. + * + * @since MU + * + * @param string $blogname The (subdomain or directory) name + * @return string + */ +function get_blogaddress_by_name( $blogname ) { + global $current_site; + + if ( is_subdomain_install() ) { + if ( $blogname == 'main' ) + $blogname = 'www'; + $url = rtrim( network_home_url(), '/' ); + if ( !empty( $blogname ) ) + $url = preg_replace( '|^([^\.]+://)|', '$1' . $blogname . '.', $url ); + } else { + $url = network_home_url( $blogname ); + } + return esc_url( $url . '/' ); +} + +/** + * Get a full blog URL, given a domain and a path. + * + * @since MU + * + * @param string $domain + * @param string $path + * @return string + */ +function get_blogaddress_by_domain( $domain, $path ) { + if ( is_subdomain_install() ) { + $url = "http://" . $domain.$path; + } else { + if ( $domain != $_SERVER['HTTP_HOST'] ) { + $blogname = substr( $domain, 0, strpos( $domain, '.' ) ); + $url = 'http://' . substr( $domain, strpos( $domain, '.' ) + 1 ) . $path; + // we're not installing the main blog + if ( $blogname != 'www.' ) + $url .= $blogname . '/'; + } else { // main blog + $url = 'http://' . $domain . $path; + } + } + return esc_url( $url ); +} + +/** + * Given a blog's (subdomain or directory) name, retrieve it's id. + * + * @since MU + * + * @param string $name + * @return int A blog id + */ +function get_id_from_blogname( $name ) { + global $wpdb, $current_site; + $blog_id = wp_cache_get( 'get_id_from_blogname_' . $name, 'blog-details' ); + if ( $blog_id ) + return $blog_id; + + if ( is_subdomain_install() ) { + $domain = $name . '.' . $current_site->domain; + $path = $current_site->path; + } else { + $domain = $current_site->domain; + $path = $current_site->path . $name . '/'; + } + $blog_id = $wpdb->get_var( $wpdb->prepare("SELECT blog_id FROM {$wpdb->blogs} WHERE domain = %s AND path = %s", $domain, $path) ); + wp_cache_set( 'get_id_from_blogname_' . $name, $blog_id, 'blog-details' ); + return $blog_id; +} + +/** + * Retrieve the details for a blog from the blogs table and blog options. + * + * @since MU + * + * @param int|string|array $fields A blog ID, a blog name, or an array of fields to query against. + * @param bool $get_all Whether to retrieve all details or only the details in the blogs table. Default is true. + * @return object Blog details. + */ +function get_blog_details( $fields, $get_all = true ) { + global $wpdb; + + if ( is_array($fields ) ) { + if ( isset($fields['blog_id']) ) { + $blog_id = $fields['blog_id']; + } elseif ( isset($fields['domain']) && isset($fields['path']) ) { + $key = md5( $fields['domain'] . $fields['path'] ); + $blog = wp_cache_get($key, 'blog-lookup'); + if ( false !== $blog ) + return $blog; + if ( substr( $fields['domain'], 0, 4 ) == 'www.' ) { + $nowww = substr( $fields['domain'], 4 ); + $blog = $wpdb->get_row( $wpdb->prepare( "SELECT * FROM $wpdb->blogs WHERE domain IN (%s,%s) AND path = %s ORDER BY CHAR_LENGTH(domain) DESC", $nowww, $fields['domain'], $fields['path'] ) ); + } else { + $blog = $wpdb->get_row( $wpdb->prepare( "SELECT * FROM $wpdb->blogs WHERE domain = %s AND path = %s", $fields['domain'], $fields['path'] ) ); + } + if ( $blog ) { + wp_cache_set($blog->blog_id . 'short', $blog, 'blog-details'); + $blog_id = $blog->blog_id; + } else { + return false; + } + } elseif ( isset($fields['domain']) && is_subdomain_install() ) { + $key = md5( $fields['domain'] ); + $blog = wp_cache_get($key, 'blog-lookup'); + if ( false !== $blog ) + return $blog; + if ( substr( $fields['domain'], 0, 4 ) == 'www.' ) { + $nowww = substr( $fields['domain'], 4 ); + $blog = $wpdb->get_row( $wpdb->prepare( "SELECT * FROM $wpdb->blogs WHERE domain IN (%s,%s) ORDER BY CHAR_LENGTH(domain) DESC", $nowww, $fields['domain'] ) ); + } else { + $blog = $wpdb->get_row( $wpdb->prepare( "SELECT * FROM $wpdb->blogs WHERE domain = %s", $fields['domain'] ) ); + } + if ( $blog ) { + wp_cache_set($blog->blog_id . 'short', $blog, 'blog-details'); + $blog_id = $blog->blog_id; + } else { + return false; + } + } else { + return false; + } + } else { + if ( !is_numeric( $fields ) ) + $blog_id = get_id_from_blogname( $fields ); + else + $blog_id = $fields; + } + + $blog_id = (int) $blog_id; + + $all = $get_all == true ? '' : 'short'; + $details = wp_cache_get( $blog_id . $all, 'blog-details' ); + + if ( $details ) { + if ( ! is_object( $details ) ) { + if ( $details == -1 ) { + return false; + } else { + // Clear old pre-serialized objects. Cache clients do better with that. + wp_cache_delete( $blog_id . $all, 'blog-details' ); + unset($details); + } + } else { + return $details; + } + } + + // Try the other cache. + if ( $get_all ) { + $details = wp_cache_get( $blog_id . 'short', 'blog-details' ); + } else { + $details = wp_cache_get( $blog_id, 'blog-details' ); + // If short was requested and full cache is set, we can return. + if ( $details ) { + if ( ! is_object( $details ) ) { + if ( $details == -1 ) { + return false; + } else { + // Clear old pre-serialized objects. Cache clients do better with that. + wp_cache_delete( $blog_id, 'blog-details' ); + unset($details); + } + } else { + return $details; + } + } + } + + if ( empty($details) ) { + $details = $wpdb->get_row( $wpdb->prepare( "SELECT * FROM $wpdb->blogs WHERE blog_id = %d /* get_blog_details */", $blog_id ) ); + if ( ! $details ) { + // Set the full cache. + wp_cache_set( $blog_id, -1, 'blog-details' ); + return false; + } + } + + if ( ! $get_all ) { + wp_cache_set( $blog_id . $all, $details, 'blog-details' ); + return $details; + } + + $details->blogname = get_blog_option( $blog_id, 'blogname' ); + $details->siteurl = get_blog_option( $blog_id, 'siteurl' ); + $details->post_count = get_blog_option( $blog_id, 'post_count' ); + + $details = apply_filters( 'blog_details', $details ); + + wp_cache_set( $blog_id . $all, $details, 'blog-details' ); + + $key = md5( $details->domain . $details->path ); + wp_cache_set( $key, $details, 'blog-lookup' ); + + return $details; +} + +/** + * Clear the blog details cache. + * + * @since MU + * + * @param int $blog_id Blog ID + */ +function refresh_blog_details( $blog_id ) { + $blog_id = (int) $blog_id; + $details = get_blog_details( $blog_id, false ); + + wp_cache_delete( $blog_id , 'blog-details' ); + wp_cache_delete( $blog_id . 'short' , 'blog-details' ); + wp_cache_delete( md5( $details->domain . $details->path ) , 'blog-lookup' ); + wp_cache_delete( 'current_blog_' . $details->domain, 'site-options' ); + wp_cache_delete( 'current_blog_' . $details->domain . $details->path, 'site-options' ); +} + +/** + * Update the details for a blog. Updates the blogs table for a given blog id. + * + * @since MU + * + * @param int $blog_id Blog ID + * @param array $details Array of details keyed by blogs table field names. + * @return bool True if update succeeds, false otherwise. + */ +function update_blog_details( $blog_id, $details = array() ) { + global $wpdb; + + if ( empty($details) ) + return false; + + if ( is_object($details) ) + $details = get_object_vars($details); + + $current_details = get_blog_details($blog_id, false); + if ( empty($current_details) ) + return false; + + $current_details = get_object_vars($current_details); + + $details = array_merge($current_details, $details); + $details['last_updated'] = current_time('mysql', true); + + $update_details = array(); + $fields = array( 'site_id', 'domain', 'path', 'registered', 'last_updated', 'public', 'archived', 'mature', 'spam', 'deleted', 'lang_id'); + foreach ( array_intersect( array_keys( $details ), $fields ) as $field ) + $update_details[$field] = $details[$field]; + + $wpdb->update( $wpdb->blogs, $update_details, array('blog_id' => $blog_id) ); + + // If spam status changed, issue actions. + if ( $details[ 'spam' ] != $current_details[ 'spam' ] ) { + if ( $details[ 'spam' ] == 1 ) + do_action( "make_spam_blog", $blog_id ); + else + do_action( "make_ham_blog", $blog_id ); + } + + if ( isset($details[ 'public' ]) ) + update_blog_option( $blog_id, 'blog_public', $details[ 'public' ] ); + + refresh_blog_details($blog_id); + + return true; +} + +/** + * Retrieve option value based on setting name and blog_id. + * + * If the option does not exist or does not have a value, then the return value + * will be false. This is useful to check whether you need to install an option + * and is commonly used during installation of plugin options and to test + * whether upgrading is required. + * + * There is a filter called 'blog_option_$option' with the $option being + * replaced with the option name. The filter takes two parameters. $value and + * $blog_id. It returns $value. + * The 'option_$option' filter in get_option() is not called. + * + * @since MU + * @uses apply_filters() Calls 'blog_option_$optionname' with the option name value. + * + * @param int $blog_id is the id of the blog. + * @param string $setting Name of option to retrieve. Should already be SQL-escaped. + * @param string $default (optional) Default value returned if option not found. + * @return mixed Value set for the option. + */ +function get_blog_option( $blog_id, $setting, $default = false ) { + global $wpdb; + + $key = $blog_id . '-' . $setting . '-blog_option'; + $value = wp_cache_get( $key, 'site-options' ); + if ( $value == null ) { + if ( $blog_id == $wpdb->blogid ) { + $value = get_option( $setting, $default ); + $notoptions = wp_cache_get( 'notoptions', 'options' ); + if ( isset( $notoptions[$setting] ) ) { + wp_cache_set( $key, 'noop', 'site-options' ); + $value = $default; + } elseif ( $value == false ) { + wp_cache_set( $key, 'falsevalue', 'site-options' ); + } else { + wp_cache_set( $key, $value, 'site-options' ); + } + return apply_filters( 'blog_option_' . $setting, $value, $blog_id ); + } else { + $blog_prefix = $wpdb->get_blog_prefix( $blog_id ); + $row = $wpdb->get_row( $wpdb->prepare( "SELECT * FROM {$blog_prefix}options WHERE option_name = %s", $setting ) ); + if ( is_object( $row ) ) { // Has to be get_row instead of get_var because of funkiness with 0, false, null values + $value = $row->option_value; + if ( $value == false ) + wp_cache_set( $key, 'falsevalue', 'site-options' ); + else + wp_cache_set( $key, $value, 'site-options' ); + } else { // option does not exist, so we must cache its non-existence + wp_cache_set( $key, 'noop', 'site-options' ); + $value = $default; + } + } + } elseif ( $value == 'noop' ) { + $value = $default; + } elseif ( $value == 'falsevalue' ) { + $value = false; + } + // If home is not set use siteurl. + if ( 'home' == $setting && '' == $value ) + return get_blog_option( $blog_id, 'siteurl' ); + + if ( 'siteurl' == $setting || 'home' == $setting || 'category_base' == $setting ) + $value = untrailingslashit( $value ); + + return apply_filters( 'blog_option_' . $setting, maybe_unserialize( $value ), $blog_id ); +} + +/** + * Add an option for a particular blog. + * + * @since MU + * + * @param int $id The blog id + * @param string $key The option key + * @param mixed $value The option value + */ +function add_blog_option( $id, $key, $value ) { + $id = (int) $id; + + switch_to_blog($id); + add_option( $key, $value ); + restore_current_blog(); + wp_cache_set( $id . '-' . $key . '-blog_option', $value, 'site-options' ); +} + +/** + * Delete an option for a particular blog. + * + * @since MU + * + * @param int $id The blog id + * @param string $key The option key + */ +function delete_blog_option( $id, $key ) { + $id = (int) $id; + + switch_to_blog($id); + delete_option( $key ); + restore_current_blog(); + wp_cache_set( $id . '-' . $key . '-blog_option', '', 'site-options' ); +} + +/** + * Update an option for a particular blog. + * + * @since MU + * + * @param int $id The blog id + * @param string $key The option key + * @param mixed $value The option value + */ +function update_blog_option( $id, $key, $value, $deprecated = null ) { + $id = (int) $id; + + if ( null !== $deprecated ) + _deprecated_argument( __FUNCTION__, '3.1' ); + + switch_to_blog($id); + update_option( $key, $value ); + restore_current_blog(); + + refresh_blog_details( $id ); + + wp_cache_set( $id . '-' . $key . '-blog_option', $value, 'site-options'); +} + +/** + * Switch the current blog. + * + * This function is useful if you need to pull posts, or other information, + * from other blogs. You can switch back afterwards using restore_current_blog(). + * + * Things that aren't switched: + * - autoloaded options. See #14992 + * - plugins. See #14941 + * + * @see restore_current_blog() + * @since MU + * + * @param int $new_blog The id of the blog you want to switch to. Default: current blog + * @param bool $validate Whether to check if $new_blog exists before proceeding + * @return bool True on success, False if the validation failed + */ +function switch_to_blog( $new_blog, $validate = false ) { + global $wpdb, $table_prefix, $blog_id, $switched, $switched_stack, $wp_roles, $wp_object_cache; + + if ( empty($new_blog) ) + $new_blog = $blog_id; + + if ( $validate && ! get_blog_details( $new_blog ) ) + return false; + + if ( empty($switched_stack) ) + $switched_stack = array(); + + $switched_stack[] = $blog_id; + + /* If we're switching to the same blog id that we're on, + * set the right vars, do the associated actions, but skip + * the extra unnecessary work */ + if ( $blog_id == $new_blog ) { + do_action( 'switch_blog', $blog_id, $blog_id ); + $switched = true; + return true; + } + + $wpdb->set_blog_id($new_blog); + $table_prefix = $wpdb->prefix; + $prev_blog_id = $blog_id; + $blog_id = $new_blog; + + if ( is_object( $wp_roles ) ) { + $wpdb->suppress_errors(); + if ( method_exists( $wp_roles ,'_init' ) ) + $wp_roles->_init(); + elseif ( method_exists( $wp_roles, '__construct' ) ) + $wp_roles->__construct(); + $wpdb->suppress_errors( false ); + } + + if ( did_action('init') ) { + $current_user = wp_get_current_user(); + if ( is_object( $current_user ) ) + $current_user->for_blog( $blog_id ); + } + + if ( is_object( $wp_object_cache ) && isset( $wp_object_cache->global_groups ) ) + $global_groups = $wp_object_cache->global_groups; + else + $global_groups = false; + + wp_cache_init(); + if ( function_exists('wp_cache_add_global_groups') ) { + if ( is_array( $global_groups ) ) + wp_cache_add_global_groups( $global_groups ); + else + wp_cache_add_global_groups( array( 'users', 'userlogins', 'usermeta', 'user_meta', 'site-transient', 'site-options', 'site-lookup', 'blog-lookup', 'blog-details', 'rss', 'global-posts' ) ); + wp_cache_add_non_persistent_groups(array( 'comment', 'counts', 'plugins' )); + } + + do_action('switch_blog', $blog_id, $prev_blog_id); + $switched = true; + return true; +} + +/** + * Restore the current blog, after calling switch_to_blog() + * + * @see switch_to_blog() + * @since MU + * + * @return bool True on success, False if we're already on the current blog + */ +function restore_current_blog() { + global $table_prefix, $wpdb, $blog_id, $switched, $switched_stack, $wp_roles, $wp_object_cache; + + if ( !$switched ) + return false; + + if ( !is_array( $switched_stack ) ) + return false; + + $blog = array_pop( $switched_stack ); + if ( $blog_id == $blog ) { + do_action( 'switch_blog', $blog, $blog ); + /* If we still have items in the switched stack, consider ourselves still 'switched' */ + $switched = ( is_array( $switched_stack ) && count( $switched_stack ) > 0 ); + return true; + } + + $wpdb->set_blog_id($blog); + $prev_blog_id = $blog_id; + $blog_id = $blog; + $table_prefix = $wpdb->prefix; + + if ( is_object( $wp_roles ) ) { + $wpdb->suppress_errors(); + if ( method_exists( $wp_roles ,'_init' ) ) + $wp_roles->_init(); + elseif ( method_exists( $wp_roles, '__construct' ) ) + $wp_roles->__construct(); + $wpdb->suppress_errors( false ); + } + + if ( did_action('init') ) { + $current_user = wp_get_current_user(); + if ( is_object( $current_user ) ) + $current_user->for_blog( $blog_id ); + } + + if ( is_object( $wp_object_cache ) && isset( $wp_object_cache->global_groups ) ) + $global_groups = $wp_object_cache->global_groups; + else + $global_groups = false; + + wp_cache_init(); + if ( function_exists('wp_cache_add_global_groups') ) { + if ( is_array( $global_groups ) ) + wp_cache_add_global_groups( $global_groups ); + else + wp_cache_add_global_groups( array( 'users', 'userlogins', 'usermeta', 'user_meta', 'site-transient', 'site-options', 'site-lookup', 'blog-lookup', 'blog-details', 'rss', 'global-posts' ) ); + wp_cache_add_non_persistent_groups(array( 'comment', 'counts', 'plugins' )); + } + + do_action('switch_blog', $blog_id, $prev_blog_id); + + /* If we still have items in the switched stack, consider ourselves still 'switched' */ + $switched = ( is_array( $switched_stack ) && count( $switched_stack ) > 0 ); + return true; +} + +/** + * Check if a particular blog is archived. + * + * @since MU + * + * @param int $id The blog id + * @return string Whether the blog is archived or not + */ +function is_archived( $id ) { + return get_blog_status($id, 'archived'); +} + +/** + * Update the 'archived' status of a particular blog. + * + * @since MU + * + * @param int $id The blog id + * @param string $archived The new status + * @return string $archived + */ +function update_archived( $id, $archived ) { + update_blog_status($id, 'archived', $archived); + return $archived; +} + +/** + * Update a blog details field. + * + * @since MU + * + * @param int $blog_id BLog ID + * @param string $pref A field name + * @param string $value Value for $pref + * @return string $value + */ +function update_blog_status( $blog_id, $pref, $value, $deprecated = null ) { + global $wpdb; + + if ( null !== $deprecated ) + _deprecated_argument( __FUNCTION__, '3.1' ); + + if ( !in_array( $pref, array( 'site_id', 'domain', 'path', 'registered', 'last_updated', 'public', 'archived', 'mature', 'spam', 'deleted', 'lang_id') ) ) + return $value; + + $wpdb->update( $wpdb->blogs, array($pref => $value, 'last_updated' => current_time('mysql', true)), array('blog_id' => $blog_id) ); + + refresh_blog_details($blog_id); + + if ( 'spam' == $pref ) + ( $value == 1 ) ? do_action( 'make_spam_blog', $blog_id ) : do_action( 'make_ham_blog', $blog_id ); + elseif ( 'mature' == $pref ) + ( $value == 1 ) ? do_action( 'mature_blog', $blog_id ) : do_action( 'unmature_blog', $blog_id ); + elseif ( 'archived' == $pref ) + ( $value == 1 ) ? do_action( 'archive_blog', $blog_id ) : do_action( 'unarchive_blog', $blog_id ); + elseif ( 'archived' == $pref ) + ( $value == 1 ) ? do_action( 'archive_blog', $blog_id ) : do_action( 'unarchive_blog', $blog_id ); + + return $value; +} + +/** + * Get a blog details field. + * + * @since MU + * + * @param int $id The blog id + * @param string $pref A field name + * @return bool $value + */ +function get_blog_status( $id, $pref ) { + global $wpdb; + + $details = get_blog_details( $id, false ); + if ( $details ) + return $details->$pref; + + return $wpdb->get_var( $wpdb->prepare("SELECT %s FROM {$wpdb->blogs} WHERE blog_id = %d", $pref, $id) ); +} + +/** + * Get a list of most recently updated blogs. + * + * @since MU + * + * @param mixed $deprecated Not used + * @param int $start The offset + * @param int $quantity The maximum number of blogs to retrieve. Default is 40. + * @return array The list of blogs + */ +function get_last_updated( $deprecated = '', $start = 0, $quantity = 40 ) { + global $wpdb; + + if ( ! empty( $deprecated ) ) + _deprecated_argument( __FUNCTION__, 'MU' ); // never used + + return $wpdb->get_results( $wpdb->prepare("SELECT blog_id, domain, path FROM $wpdb->blogs WHERE site_id = %d AND public = '1' AND archived = '0' AND mature = '0' AND spam = '0' AND deleted = '0' AND last_updated != '0000-00-00 00:00:00' ORDER BY last_updated DESC limit %d, %d", $wpdb->siteid, $start, $quantity ) , ARRAY_A ); +} + +?> diff --git a/src/wp-includes/ms-default-constants.php b/src/wp-includes/ms-default-constants.php new file mode 100644 index 0000000..12dc661 --- /dev/null +++ b/src/wp-includes/ms-default-constants.php @@ -0,0 +1,140 @@ +blogid}/files/" ); + if ( 'wp-content/blogs.dir' == UPLOADBLOGSDIR ) + define( 'BLOGUPLOADDIR', WP_CONTENT_DIR . "/blogs.dir/{$wpdb->blogid}/files/" ); + } +} + +/** + * Defines Multisite cookie constants. + * + * @since 3.0.0 + */ +function ms_cookie_constants( ) { + global $current_site; + + /** + * @since 1.2.0 + */ + if ( !defined( 'COOKIEPATH' ) ) + define( 'COOKIEPATH', $current_site->path ); + + /** + * @since 1.5.0 + */ + if ( !defined( 'SITECOOKIEPATH' ) ) + define( 'SITECOOKIEPATH', $current_site->path ); + + /** + * @since 2.6.0 + */ + if ( !defined( 'ADMIN_COOKIE_PATH' ) ) { + if( !is_subdomain_install() ) { + define( 'ADMIN_COOKIE_PATH', SITECOOKIEPATH ); + } else { + define( 'ADMIN_COOKIE_PATH', SITECOOKIEPATH . 'wp-admin' ); + } + } + + /** + * @since 2.0.0 + */ + if ( !defined('COOKIE_DOMAIN') && is_subdomain_install() ) { + if ( !empty( $current_site->cookie_domain ) ) + define('COOKIE_DOMAIN', '.' . $current_site->cookie_domain); + else + define('COOKIE_DOMAIN', '.' . $current_site->domain); + } +} + +/** + * Defines Multisite file constants. + * + * @since 3.0.0 + */ +function ms_file_constants( ) { + /** + * Optional support for X-Sendfile header + * @since 3.0.0 + */ + if ( !defined( 'WPMU_SENDFILE' ) ) + define( 'WPMU_SENDFILE', false ); + + /** + * Optional support for X-Accel-Redirect header + * @since 3.0.0 + */ + if ( !defined( 'WPMU_ACCEL_REDIRECT' ) ) + define( 'WPMU_ACCEL_REDIRECT', false ); +} + +/** + * Defines Multisite subdomain constants and handles warnings and notices. + * + * VHOST is deprecated in favor of SUBDOMAIN_INSTALL, which is a bool. + * + * On first call, the constants are checked and defined. On second call, + * we will have translations loaded and can trigger warnings easily. + * + * @since 3.0.0 + */ +function ms_subdomain_constants() { + static $error = null; + static $error_warn = false; + + if ( false === $error ) + return; + + if ( $error ) { + $vhost_deprecated = __( 'The constant VHOST is deprecated. Use the boolean constant SUBDOMAIN_INSTALL in wp-config.php to enable a subdomain configuration. Use is_subdomain_install() to check whether a subdomain configuration is enabled.' ); + if ( $error_warn ) { + trigger_error( __( 'Conflicting values for the constants VHOST and SUBDOMAIN_INSTALL. The value of SUBDOMAIN_INSTALL will be assumed to be your subdomain configuration setting.' ) . ' ' . $vhost_deprecated, E_USER_WARNING ); + } else { + _deprecated_argument( 'define()', '3.0', $vhost_deprecated ); + } + return; + } + + if ( defined( 'SUBDOMAIN_INSTALL' ) && defined( 'VHOST' ) ) { + if ( SUBDOMAIN_INSTALL == ( 'yes' == VHOST ) ) { + $error = true; + } else { + $error = $error_warn = true; + } + } elseif ( defined( 'SUBDOMAIN_INSTALL' ) ) { + define( 'VHOST', SUBDOMAIN_INSTALL ? 'yes' : 'no' ); + } elseif ( defined( 'VHOST' ) ) { + $error = true; + define( 'SUBDOMAIN_INSTALL', 'yes' == VHOST ); + } else { + define( 'SUBDOMAIN_INSTALL', false ); + define( 'VHOST', 'no' ); + } +} +add_action( 'init', 'ms_subdomain_constants' ); + +?> diff --git a/src/wp-includes/ms-default-filters.php b/src/wp-includes/ms-default-filters.php new file mode 100644 index 0000000..e533252 --- /dev/null +++ b/src/wp-includes/ms-default-filters.php @@ -0,0 +1,66 @@ + diff --git a/src/wp-includes/ms-deprecated.php b/src/wp-includes/ms-deprecated.php new file mode 100644 index 0000000..a7f7eb2 --- /dev/null +++ b/src/wp-includes/ms-deprecated.php @@ -0,0 +1,203 @@ +ID ) ) + return false; + $user_id = $user->ID; + } + + return is_super_admin( $user_id ); +} + +if ( !function_exists( 'graceful_fail' ) ) : +/** + * @since MU + * @deprecated 3.0.0 + * @deprecated Use wp_die() + * @see wp_die() + */ +function graceful_fail( $message ) { + _deprecated_function( __FUNCTION__, '3.0', 'wp_die()' ); + $message = apply_filters( 'graceful_fail', $message ); + $message_template = apply_filters( 'graceful_fail_template', +' + + +Error! + + + +

    %s

    + +' ); + die( sprintf( $message_template, $message ) ); +} +endif; + +/** + * @since MU + * @deprecated 3.0.0 + * @deprecated Use get_user_by() + * @see get_user_by() + */ +function get_user_details( $username ) { + _deprecated_function( __FUNCTION__, '3.0', 'get_user_by()' ); + return get_user_by('login', $username); +} + +/** + * @since MU + * @deprecated 3.0.0 + * @deprecated Use clean_post_cache() + * @see clean_post_cache() + */ +function clear_global_post_cache( $post_id ) { + _deprecated_function( __FUNCTION__, '3.0', 'clean_post_cache()' ); +} + +/** + * @since MU + * @deprecated 3.0.0 + * @deprecated Use is_main_site() + * @see is_main_site() + */ +function is_main_blog() { + _deprecated_function( __FUNCTION__, '3.0', 'is_main_site()' ); + return is_main_site(); +} + +/** + * @since MU + * @deprecated 3.0.0 + * @deprecated Use is_email() + * @see is_email() + */ +function validate_email( $email, $check_domain = true) { + _deprecated_function( __FUNCTION__, '3.0', 'is_email()' ); + return is_email( $email, $check_domain ); +} + +/** + * @since MU + * @deprecated 3.0.0 + * @deprecated No alternative available. For performance reasons this function is not recommended. + */ +function get_blog_list( $start = 0, $num = 10, $deprecated = '' ) { + _deprecated_function( __FUNCTION__, '3.0' ); + + global $wpdb; + $blogs = $wpdb->get_results( $wpdb->prepare("SELECT blog_id, domain, path FROM $wpdb->blogs WHERE site_id = %d AND public = '1' AND archived = '0' AND mature = '0' AND spam = '0' AND deleted = '0' ORDER BY registered DESC", $wpdb->siteid), ARRAY_A ); + + foreach ( (array) $blogs as $details ) { + $blog_list[ $details['blog_id'] ] = $details; + $blog_list[ $details['blog_id'] ]['postcount'] = $wpdb->get_var( "SELECT COUNT(ID) FROM " . $wpdb->get_blog_prefix( $details['blog_id'] ). "posts WHERE post_status='publish' AND post_type='post'" ); + } + unset( $blogs ); + $blogs = $blog_list; + + if ( false == is_array( $blogs ) ) + return array(); + + if ( $num == 'all' ) + return array_slice( $blogs, $start, count( $blogs ) ); + else + return array_slice( $blogs, $start, $num ); +} + +/** + * @since MU + * @deprecated 3.0.0 + * @deprecated No alternative available. For performance reasons this function is not recommended. + */ +function get_most_active_blogs( $num = 10, $display = true ) { + _deprecated_function( __FUNCTION__, '3.0' ); + + $blogs = get_blog_list( 0, 'all', false ); // $blog_id -> $details + if ( is_array( $blogs ) ) { + reset( $blogs ); + foreach ( (array) $blogs as $key => $details ) { + $most_active[ $details['blog_id'] ] = $details['postcount']; + $blog_list[ $details['blog_id'] ] = $details; // array_slice() removes keys!! + } + arsort( $most_active ); + reset( $most_active ); + foreach ( (array) $most_active as $key => $details ) + $t[ $key ] = $blog_list[ $key ]; + + unset( $most_active ); + $most_active = $t; + } + + if ( $display == true ) { + if ( is_array( $most_active ) ) { + reset( $most_active ); + foreach ( (array) $most_active as $key => $details ) { + $url = esc_url('http://' . $details['domain'] . $details['path']); + echo '
  • ' . $details['postcount'] . " $url
  • "; + } + } + } + return array_slice( $most_active, 0, $num ); +} +?> diff --git a/src/wp-includes/ms-files.php b/src/wp-includes/ms-files.php new file mode 100644 index 0000000..2d68f11 --- /dev/null +++ b/src/wp-includes/ms-files.php @@ -0,0 +1,83 @@ +archived == '1' || $current_blog->spam == '1' || $current_blog->deleted == '1' ) { + status_header( 404 ); + die( '404 — File not found.' ); +} + +$file = BLOGUPLOADDIR . str_replace( '..', '', $_GET[ 'file' ] ); +if ( !is_file( $file ) ) { + status_header( 404 ); + die( '404 — File not found.' ); +} + +$mime = wp_check_filetype( $file ); +if( false === $mime[ 'type' ] && function_exists( 'mime_content_type' ) ) + $mime[ 'type' ] = mime_content_type( $file ); + +if( $mime[ 'type' ] ) + $mimetype = $mime[ 'type' ]; +else + $mimetype = 'image/' . substr( $file, strrpos( $file, '.' ) + 1 ); + +header( 'Content-Type: ' . $mimetype ); // always send this +if ( false === strpos( $_SERVER['SERVER_SOFTWARE'], 'Microsoft-IIS' ) ) + header( 'Content-Length: ' . filesize( $file ) ); + +// Optional support for X-Sendfile and X-Accel-Redirect +if ( WPMU_ACCEL_REDIRECT ) { + header( 'X-Accel-Redirect: ' . str_replace( WP_CONTENT_DIR, '', $file ) ); + exit; +} elseif ( WPMU_SENDFILE ) { + header( 'X-Sendfile: ' . $file ); + exit; +} + +$last_modified = gmdate( 'D, d M Y H:i:s', filemtime( $file ) ); +$etag = '"' . md5( $last_modified ) . '"'; +header( "Last-Modified: $last_modified GMT" ); +header( 'ETag: ' . $etag ); +header( 'Expires: ' . gmdate( 'D, d M Y H:i:s', time() + 100000000 ) . ' GMT' ); + +// Support for Conditional GET +$client_etag = isset( $_SERVER['HTTP_IF_NONE_MATCH'] ) ? stripslashes( $_SERVER['HTTP_IF_NONE_MATCH'] ) : false; + +if( ! isset( $_SERVER['HTTP_IF_MODIFIED_SINCE'] ) ) + $_SERVER['HTTP_IF_MODIFIED_SINCE'] = false; + +$client_last_modified = 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... +$modified_timestamp = strtotime($last_modified); + +if ( ( $client_last_modified && $client_etag ) + ? ( ( $client_modified_timestamp >= $modified_timestamp) && ( $client_etag == $etag ) ) + : ( ( $client_modified_timestamp >= $modified_timestamp) || ( $client_etag == $etag ) ) + ) { + status_header( 304 ); + exit; +} + +// If we made it this far, just serve the file +readfile( $file ); +?> diff --git a/src/wp-includes/ms-functions.php b/src/wp-includes/ms-functions.php new file mode 100644 index 0000000..6c1f80a --- /dev/null +++ b/src/wp-includes/ms-functions.php @@ -0,0 +1,2074 @@ +siteid; + else + $site_id = $wpdb->get_var( $wpdb->prepare( "SELECT id FROM $wpdb->site WHERE domain = %s AND path = %s", $sitedomain, $path ) ); + + if ( $site_id ) + return $wpdb->get_results( $wpdb->prepare( "SELECT u.ID, u.user_login, u.user_pass FROM $wpdb->users AS u, $wpdb->sitemeta AS sm WHERE sm.meta_key = 'admin_user_id' AND u.ID = sm.meta_value AND sm.site_id = %d", $site_id ), ARRAY_A ); + + return false; +} + +/** + * Get one of a user's active blogs + * + * Returns the user's primary blog, if she has one and + * it is active. If it's inactive, function returns another + * active blog of the user. If none are found, the user + * is added as a Subscriber to the Dashboard Blog and that blog + * is returned. + * + * @since MU 1.0 + * @uses get_blogs_of_user() + * @uses add_user_to_blog() + * @uses get_blog_details() + * + * @param int $user_id The unique ID of the user + * @return object The blog object + */ +function get_active_blog_for_user( $user_id ) { + global $wpdb; + $blogs = get_blogs_of_user( $user_id ); + if ( empty( $blogs ) ) + return null; + + if ( !is_multisite() ) + return $blogs[$wpdb->blogid]; + + $primary_blog = get_user_meta( $user_id, 'primary_blog', true ); + $first_blog = current($blogs); + if ( false !== $primary_blog ) { + if ( ! isset( $blogs[ $primary_blog ] ) ) { + update_user_meta( $user_id, 'primary_blog', $first_blog->userblog_id ); + $primary = $first_blog; + } else { + $primary = get_blog_details( $primary_blog ); + } + } else { + //TODO Review this call to add_user_to_blog too - to get here the user must have a role on this blog? + add_user_to_blog( $first_blog->userblog_id, $user_id, 'subscriber' ); + update_user_meta( $user_id, 'primary_blog', $first_blog->userblog_id ); + $primary = $first_blog; + } + + if ( ( ! is_object( $primary ) ) || ( is_object( $primary ) && $primary->archived == 1 || $primary->spam == 1 || $primary->deleted == 1 ) ) { + $blogs = get_blogs_of_user( $user_id, true ); // if a user's primary blog is shut down, check their other blogs. + $ret = false; + if ( is_array( $blogs ) && count( $blogs ) > 0 ) { + foreach ( (array) $blogs as $blog_id => $blog ) { + if ( $blog->site_id != $wpdb->siteid ) + continue; + $details = get_blog_details( $blog_id ); + if ( is_object( $details ) && $details->archived == 0 && $details->spam == 0 && $details->deleted == 0 ) { + $ret = $blog; + if ( get_user_meta( $user_id , 'primary_blog', true ) != $blog_id ) + update_user_meta( $user_id, 'primary_blog', $blog_id ); + if ( !get_user_meta($user_id , 'source_domain', true) ) + update_user_meta( $user_id, 'source_domain', $blog->domain ); + break; + } + } + } else { + return null; + } + return $ret; + } else { + return $primary; + } +} + +/** + * Find out whether a user is a member of a given blog. + * + * @since MU 1.1 + * @uses get_blogs_of_user() + * + * @param int $user_id The unique ID of the user + * @param int $blog Optional. If no blog_id is provided, current site is used + * @return bool + */ +function is_user_member_of_blog( $user_id, $blog_id = 0 ) { + $user_id = (int) $user_id; + $blog_id = (int) $blog_id; + + if ( $blog_id == 0 ) { + global $wpdb; + $blog_id = $wpdb->blogid; + } + + $blogs = get_blogs_of_user( $user_id ); + if ( is_array( $blogs ) ) + return array_key_exists( $blog_id, $blogs ); + else + return false; +} + +/** + * The number of active users in your installation. + * + * The count is cached and updated twice daily. This is not a live count. + * + * @since MU 2.7 + * + * @return int + */ +function get_user_count() { + return get_site_option( 'user_count' ); +} + +/** + * The number of active sites on your installation. + * + * The count is cached and updated twice daily. This is not a live count. + * + * @since MU 1.0 + * + * @param int $id Optional. A site_id. + * @return int + */ +function get_blog_count( $id = 0 ) { + return get_site_option( 'blog_count' ); +} + +/** + * Get a blog post from any site on the network. + * + * @since MU 1.0 + * + * @param int $blog_id ID of the blog. + * @param int $post_id ID of the post you're looking for. + * @return object The post. + */ +function get_blog_post( $blog_id, $post_id ) { + global $wpdb; + + $key = $blog_id . '-' . $post_id; + $post = wp_cache_get( $key, 'global-posts' ); + if ( $post == false ) { + $post = $wpdb->get_row( $wpdb->prepare( 'SELECT * FROM ' . $wpdb->get_blog_prefix( $blog_id ) . 'posts WHERE ID = %d', $post_id ) ); + wp_cache_add( $key, $post, 'global-posts' ); + } + + return $post; +} + +/** + * Add a user to a blog. + * + * Use the 'add_user_to_blog' action to fire an event when + * users are added to a blog. + * + * @since MU 1.0 + * + * @param int $blog_id ID of the blog you're adding the user to. + * @param int $user_id ID of the user you're adding. + * @param string $role The role you want the user to have + * @return bool + */ +function add_user_to_blog( $blog_id, $user_id, $role ) { + switch_to_blog($blog_id); + + $user = new WP_User($user_id); + + if ( empty( $user->ID ) ) { + restore_current_blog(); + return new WP_Error('user_does_not_exist', __('That user does not exist.')); + } + + if ( !get_user_meta($user_id, 'primary_blog', true) ) { + update_user_meta($user_id, 'primary_blog', $blog_id); + $details = get_blog_details($blog_id); + update_user_meta($user_id, 'source_domain', $details->domain); + } + + $user->set_role($role); + + do_action('add_user_to_blog', $user_id, $role, $blog_id); + wp_cache_delete( $user_id, 'users' ); + restore_current_blog(); + return true; +} + +/** + * Remove a user from a blog. + * + * Use the 'remove_user_from_blog' action to fire an event when + * users are removed from a blog. + * + * Accepts an optional $reassign parameter, if you want to + * reassign the user's blog posts to another user upon removal. + * + * @since MU 1.0 + * + * @param int $user_id ID of the user you're removing. + * @param int $blog_id ID of the blog you're removing the user from. + * @param string $reassign Optional. A user to whom to reassign posts. + * @return bool + */ +function remove_user_from_blog($user_id, $blog_id = '', $reassign = '') { + global $wpdb; + switch_to_blog($blog_id); + $user_id = (int) $user_id; + do_action('remove_user_from_blog', $user_id, $blog_id); + + // If being removed from the primary blog, set a new primary if the user is assigned + // to multiple blogs. + $primary_blog = get_user_meta($user_id, 'primary_blog', true); + if ( $primary_blog == $blog_id ) { + $new_id = ''; + $new_domain = ''; + $blogs = get_blogs_of_user($user_id); + foreach ( (array) $blogs as $blog ) { + if ( $blog->userblog_id == $blog_id ) + continue; + $new_id = $blog->userblog_id; + $new_domain = $blog->domain; + break; + } + + update_user_meta($user_id, 'primary_blog', $new_id); + update_user_meta($user_id, 'source_domain', $new_domain); + } + + // wp_revoke_user($user_id); + $user = new WP_User($user_id); + if ( empty( $user->ID ) ) { + restore_current_blog(); + return new WP_Error('user_does_not_exist', __('That user does not exist.')); + } + + $user->remove_all_caps(); + + $blogs = get_blogs_of_user($user_id); + if ( count($blogs) == 0 ) { + update_user_meta($user_id, 'primary_blog', ''); + update_user_meta($user_id, 'source_domain', ''); + } + + if ( $reassign != '' ) { + $reassign = (int) $reassign; + $wpdb->query( $wpdb->prepare("UPDATE $wpdb->posts SET post_author = %d WHERE post_author = %d", $reassign, $user_id) ); + $wpdb->query( $wpdb->prepare("UPDATE $wpdb->links SET link_owner = %d WHERE link_owner = %d", $reassign, $user_id) ); + } + + restore_current_blog(); +} + +/** + * Create an empty blog. + * + * @since MU 1.0 + * @uses install_blog() + * + * @param string $domain The new blog's domain. + * @param string $path The new blog's path. + * @param string $string The new blog's title. + * @param int $site Optional. Defaults to 1. + * @return int The ID of the newly created blog + */ +function create_empty_blog( $domain, $path, $weblog_title, $site_id = 1 ) { + $domain = addslashes( $domain ); + $weblog_title = addslashes( $weblog_title ); + + if ( empty($path) ) + $path = '/'; + + // Check if the domain has been used already. We should return an error message. + if ( domain_exists($domain, $path, $site_id) ) + return __( 'Error: Site URL already taken.' ); + + // Need to back up wpdb table names, and create a new wp_blogs entry for new blog. + // Need to get blog_id from wp_blogs, and create new table names. + // Must restore table names at the end of function. + + if ( ! $blog_id = insert_blog($domain, $path, $site_id) ) + return __( 'Error: problem creating site entry.' ); + + switch_to_blog($blog_id); + install_blog($blog_id); + restore_current_blog(); + + return $blog_id; +} + +/** + * Get the permalink for a post on another blog. + * + * @since MU 1.0 + * + * @param int $_blog_id ID of the source blog. + * @param int $post_id ID of the desired post. + * @return string The post's permalink + */ +function get_blog_permalink( $_blog_id, $post_id ) { + $key = "{$_blog_id}-{$post_id}-blog_permalink"; + $link = wp_cache_get( $key, 'site-options' ); + if ( $link == false ) { + switch_to_blog( $_blog_id ); + $link = get_permalink( $post_id ); + restore_current_blog(); + wp_cache_add( $key, $link, 'site-options', 360 ); + } + return $link; +} + +/** + * Get a blog's numeric ID from its URL. + * + * On a subdirectory installation like example.com/blog1/, + * $domain will be the root 'example.com' and $path the + * subdirectory '/blog1/'. With subdomains like blog1.example.com, + * $domain is 'blog1.example.com' and $path is '/'. + * + * @since MU 2.6.5 + * + * @param string $domain + * @param string $path Optional. Not required for subdomain installations. + * @return int + */ +function get_blog_id_from_url( $domain, $path = '/' ) { + global $wpdb; + + $domain = strtolower( $wpdb->escape( $domain ) ); + $path = strtolower( $wpdb->escape( $path ) ); + $id = wp_cache_get( md5( $domain . $path ), 'blog-id-cache' ); + + if ( $id == -1 ) { // blog does not exist + return 0; + } elseif ( $id ) { + return (int)$id; + } + + $id = $wpdb->get_var( "SELECT blog_id FROM $wpdb->blogs WHERE domain = '$domain' and path = '$path' /* get_blog_id_from_url */" ); + + if ( !$id ) { + wp_cache_set( md5( $domain . $path ), -1, 'blog-id-cache' ); + return false; + } + wp_cache_set( md5( $domain . $path ), $id, 'blog-id-cache' ); + + return $id; +} + +// Admin functions + +/** + * Redirect a user based on $_GET or $_POST arguments. + * + * The function looks for redirect arguments in the following order: + * 1) $_GET['ref'] + * 2) $_POST['ref'] + * 3) $_SERVER['HTTP_REFERER'] + * 4) $_GET['redirect'] + * 5) $_POST['redirect'] + * 6) $url + * + * @since MU + * @uses wpmu_admin_redirect_add_updated_param() + * + * @param string $url + */ +function wpmu_admin_do_redirect( $url = '' ) { + $ref = ''; + if ( isset( $_GET['ref'] ) ) + $ref = $_GET['ref']; + if ( isset( $_POST['ref'] ) ) + $ref = $_POST['ref']; + + if ( $ref ) { + $ref = wpmu_admin_redirect_add_updated_param( $ref ); + wp_redirect( $ref ); + exit(); + } + if ( empty( $_SERVER['HTTP_REFERER'] ) == false ) { + wp_redirect( $_SERVER['HTTP_REFERER'] ); + exit(); + } + + $url = wpmu_admin_redirect_add_updated_param( $url ); + if ( isset( $_GET['redirect'] ) ) { + if ( substr( $_GET['redirect'], 0, 2 ) == 's_' ) + $url .= '&action=blogs&s='. esc_html( substr( $_GET['redirect'], 2 ) ); + } elseif ( isset( $_POST['redirect'] ) ) { + $url = wpmu_admin_redirect_add_updated_param( $_POST['redirect'] ); + } + wp_redirect( $url ); + exit(); +} + +/** + * Adds an 'updated=true' argument to a URL. + * + * @since MU + * + * @param string $url + * @return string + */ +function wpmu_admin_redirect_add_updated_param( $url = '' ) { + if ( strpos( $url, 'updated=true' ) === false ) { + if ( strpos( $url, '?' ) === false ) + return $url . '?updated=true'; + else + return $url . '&updated=true'; + } + return $url; +} + +/** + * Checks an email address against a list of banned domains. + * + * This function checks against the Banned Email Domains list + * at wp-admin/network/settings.php. The check is only run on + * self-registrations; user creation at wp-admin/network/users.php + * bypasses this check. + * + * @since MU + * + * @param string $user_email The email provided by the user at registration. + * @return bool Returns true when the email address is banned. + */ +function is_email_address_unsafe( $user_email ) { + $banned_names = get_site_option( 'banned_email_domains' ); + if ($banned_names && !is_array( $banned_names )) + $banned_names = explode( "\n", $banned_names); + + if ( is_array( $banned_names ) && empty( $banned_names ) == false ) { + $email_domain = strtolower( substr( $user_email, 1 + strpos( $user_email, '@' ) ) ); + foreach ( (array) $banned_names as $banned_domain ) { + if ( $banned_domain == '' ) + continue; + if ( + strstr( $email_domain, $banned_domain ) || + ( + strstr( $banned_domain, '/' ) && + preg_match( $banned_domain, $email_domain ) + ) + ) + return true; + } + } + return false; +} + +/** + * Processes new user registrations. + * + * Checks the data provided by the user during signup. Verifies + * the validity and uniqueness of user names and user email addresses, + * and checks email addresses against admin-provided domain + * whitelists and blacklists. + * + * The hook 'wpmu_validate_user_signup' provides an easy way + * to modify the signup process. The value $result, which is passed + * to the hook, contains both the user-provided info and the error + * messages created by the function. 'wpmu_validate_user_signup' allows + * you to process the data in any way you'd like, and unset the + * relevant errors if necessary. + * + * @since MU + * @uses is_email_address_unsafe() + * @uses username_exists() + * @uses email_exists() + * + * @param string $user_name The login name provided by the user. + * @param string $user_email The email provided by the user. + * @return array Contains username, email, and error messages. + */ +function wpmu_validate_user_signup($user_name, $user_email) { + global $wpdb; + + $errors = new WP_Error(); + + $orig_username = $user_name; + $user_name = preg_replace( '/\s+/', '', sanitize_user( $user_name, true ) ); + $maybe = array(); + preg_match( '/[a-z0-9]+/', $user_name, $maybe ); + + if ( $user_name != $orig_username || $user_name != $maybe[0] ) { + $errors->add( 'user_name', __( 'Only lowercase letters (a-z) and numbers are allowed.' ) ); + $user_name = $orig_username; + } + + $user_email = sanitize_email( $user_email ); + + if ( empty( $user_name ) ) + $errors->add('user_name', __('Please enter a username')); + + $illegal_names = get_site_option( 'illegal_names' ); + if ( is_array( $illegal_names ) == false ) { + $illegal_names = array( 'www', 'web', 'root', 'admin', 'main', 'invite', 'administrator' ); + add_site_option( 'illegal_names', $illegal_names ); + } + if ( in_array( $user_name, $illegal_names ) == true ) + $errors->add('user_name', __('That username is not allowed')); + + if ( is_email_address_unsafe( $user_email ) ) + $errors->add('user_email', __('You cannot use that email address to signup. We are having problems with them blocking some of our email. Please use another email provider.')); + + if ( strlen( $user_name ) < 4 ) + $errors->add('user_name', __('Username must be at least 4 characters')); + + if ( strpos( ' ' . $user_name, '_' ) != false ) + $errors->add( 'user_name', __( 'Sorry, usernames may not contain the character “_”!' ) ); + + // all numeric? + $match = array(); + preg_match( '/[0-9]*/', $user_name, $match ); + if ( $match[0] == $user_name ) + $errors->add('user_name', __('Sorry, usernames must have letters too!')); + + if ( !is_email( $user_email ) ) + $errors->add('user_email', __('Please enter a correct email address')); + + $limited_email_domains = get_site_option( 'limited_email_domains' ); + if ( is_array( $limited_email_domains ) && empty( $limited_email_domains ) == false ) { + $emaildomain = substr( $user_email, 1 + strpos( $user_email, '@' ) ); + if ( in_array( $emaildomain, $limited_email_domains ) == false ) + $errors->add('user_email', __('Sorry, that email address is not allowed!')); + } + + // Check if the username has been used already. + if ( username_exists($user_name) ) + $errors->add('user_name', __('Sorry, that username already exists!')); + + // Check if the email address has been used already. + if ( email_exists($user_email) ) + $errors->add('user_email', __('Sorry, that email address is already used!')); + + // Has someone already signed up for this username? + $signup = $wpdb->get_row( $wpdb->prepare("SELECT * FROM $wpdb->signups WHERE user_login = %s", $user_name) ); + if ( $signup != null ) { + $registered_at = mysql2date('U', $signup->registered); + $now = current_time( 'timestamp', true ); + $diff = $now - $registered_at; + // If registered more than two days ago, cancel registration and let this signup go through. + if ( $diff > 172800 ) + $wpdb->query( $wpdb->prepare("DELETE FROM $wpdb->signups WHERE user_login = %s", $user_name) ); + else + $errors->add('user_name', __('That username is currently reserved but may be available in a couple of days.')); + + if ( $signup->active == 0 && $signup->user_email == $user_email ) + $errors->add('user_email_used', __('username and email used')); + } + + $signup = $wpdb->get_row( $wpdb->prepare("SELECT * FROM $wpdb->signups WHERE user_email = %s", $user_email) ); + if ( $signup != null ) { + $diff = current_time( 'timestamp', true ) - mysql2date('U', $signup->registered); + // If registered more than two days ago, cancel registration and let this signup go through. + if ( $diff > 172800 ) + $wpdb->query( $wpdb->prepare("DELETE FROM $wpdb->signups WHERE user_email = %s", $user_email) ); + else + $errors->add('user_email', __('That email address has already been used. Please check your inbox for an activation email. It will become available in a couple of days if you do nothing.')); + } + + $result = array('user_name' => $user_name, 'orig_username' => $orig_username, 'user_email' => $user_email, 'errors' => $errors); + + return apply_filters('wpmu_validate_user_signup', $result); +} + +/** + * Processes new site registrations. + * + * Checks the data provided by the user during blog signup. Verifies + * the validity and uniqueness of blog paths and domains. + * + * This function prevents the current user from registering a new site + * with a blogname equivalent to another user's login name. Passing the + * $user parameter to the function, where $user is the other user, is + * effectively an override of this limitation. + * + * Filter 'wpmu_validate_blog_signup' if you want to modify + * the way that WordPress validates new site signups. + * + * @since MU + * @uses domain_exists() + * @uses username_exists() + * + * @param string $blogname The blog name provided by the user. Must be unique. + * @param string $blog_title The blog title provided by the user. + * @return array Contains the new site data and error messages. + */ +function wpmu_validate_blog_signup($blogname, $blog_title, $user = '') { + global $wpdb, $domain, $base, $current_site; + + $blog_title = strip_tags( $blog_title ); + $blog_title = substr( $blog_title, 0, 50 ); + + $errors = new WP_Error(); + $illegal_names = get_site_option( 'illegal_names' ); + if ( $illegal_names == false ) { + $illegal_names = array( 'www', 'web', 'root', 'admin', 'main', 'invite', 'administrator' ); + add_site_option( 'illegal_names', $illegal_names ); + } + + // On sub dir installs, Some names are so illegal, only a filter can spring them from jail + if (! is_subdomain_install() ) + $illegal_names = array_merge($illegal_names, apply_filters( 'subdirectory_reserved_names', array( 'page', 'comments', 'blog', 'files', 'feed' ) ) ); + + + if ( empty( $blogname ) ) + $errors->add('blogname', __('Please enter a site name')); + + $maybe = array(); + preg_match( '/[a-z0-9]+/', $blogname, $maybe ); + if ( $blogname != $maybe[0] ) + $errors->add('blogname', __('Only lowercase letters and numbers allowed')); + + if ( in_array( $blogname, $illegal_names ) == true ) + $errors->add('blogname', __('That name is not allowed')); + + if ( strlen( $blogname ) < 4 && !is_super_admin() ) + $errors->add('blogname', __('Site name must be at least 4 characters')); + + if ( strpos( ' ' . $blogname, '_' ) != false ) + $errors->add( 'blogname', __( 'Sorry, site names may not contain the character “_”!' ) ); + + // do not allow users to create a blog that conflicts with a page on the main blog. + if ( !is_subdomain_install() && $wpdb->get_var( $wpdb->prepare( "SELECT post_name FROM " . $wpdb->get_blog_prefix( $current_site->blog_id ) . "posts WHERE post_type = 'page' AND post_name = %s", $blogname ) ) ) + $errors->add( 'blogname', __( 'Sorry, you may not use that site name.' ) ); + + // all numeric? + $match = array(); + preg_match( '/[0-9]*/', $blogname, $match ); + if ( $match[0] == $blogname ) + $errors->add('blogname', __('Sorry, site names must have letters too!')); + + $blogname = apply_filters( 'newblogname', $blogname ); + + $blog_title = stripslashes( $blog_title ); + + if ( empty( $blog_title ) ) + $errors->add('blog_title', __('Please enter a site title')); + + // Check if the domain/path has been used already. + if ( is_subdomain_install() ) { + $mydomain = $blogname . '.' . preg_replace( '|^www\.|', '', $domain ); + $path = $base; + } else { + $mydomain = "$domain"; + $path = $base.$blogname.'/'; + } + if ( domain_exists($mydomain, $path) ) + $errors->add('blogname', __('Sorry, that site already exists!')); + + if ( username_exists( $blogname ) ) { + if ( is_object( $user ) == false || ( is_object($user) && ( $user->user_login != $blogname ) ) ) + $errors->add( 'blogname', __( 'Sorry, that site is reserved!' ) ); + } + + // Has someone already signed up for this domain? + $signup = $wpdb->get_row( $wpdb->prepare("SELECT * FROM $wpdb->signups WHERE domain = %s AND path = %s", $mydomain, $path) ); // TODO: Check email too? + if ( ! empty($signup) ) { + $diff = current_time( 'timestamp', true ) - mysql2date('U', $signup->registered); + // If registered more than two days ago, cancel registration and let this signup go through. + if ( $diff > 172800 ) + $wpdb->query( $wpdb->prepare("DELETE FROM $wpdb->signups WHERE domain = %s AND path = %s", $mydomain, $path) ); + else + $errors->add('blogname', __('That site is currently reserved but may be available in a couple days.')); + } + + $result = array('domain' => $mydomain, 'path' => $path, 'blogname' => $blogname, 'blog_title' => $blog_title, 'errors' => $errors); + return apply_filters('wpmu_validate_blog_signup', $result); +} + +/** + * Record site signup information for future activation. + * + * @since MU + * @uses wpmu_signup_blog_notification() + * + * @param string $domain The requested domain. + * @param string $path The requested path. + * @param string $title The requested site title. + * @param string $user The user's requested login name. + * @param string $user_email The user's email address. + * @param array $meta By default, contains the requested privacy setting and lang_id. + */ +function wpmu_signup_blog($domain, $path, $title, $user, $user_email, $meta = '') { + global $wpdb; + + $key = substr( md5( time() . rand() . $domain ), 0, 16 ); + $meta = serialize($meta); + $domain = $wpdb->escape($domain); + $path = $wpdb->escape($path); + $title = $wpdb->escape($title); + + $wpdb->insert( $wpdb->signups, array( + 'domain' => $domain, + 'path' => $path, + 'title' => $title, + 'user_login' => $user, + 'user_email' => $user_email, + 'registered' => current_time('mysql', true), + 'activation_key' => $key, + 'meta' => $meta + ) ); + + wpmu_signup_blog_notification($domain, $path, $title, $user, $user_email, $key, $meta); +} + +/** + * Record user signup information for future activation. + * + * This function is used when user registration is open but + * new site registration is not. + * + * @since MU + * @uses wpmu_signup_user_notification() + * + * @param string $user The user's requested login name. + * @param string $user_email The user's email address. + * @param array $meta By default, this is an empty array. + */ +function wpmu_signup_user($user, $user_email, $meta = '') { + global $wpdb; + + // Format data + $user = preg_replace( '/\s+/', '', sanitize_user( $user, true ) ); + $user_email = sanitize_email( $user_email ); + $key = substr( md5( time() . rand() . $user_email ), 0, 16 ); + $meta = serialize($meta); + + $wpdb->insert( $wpdb->signups, array( + 'domain' => '', + 'path' => '', + 'title' => '', + 'user_login' => $user, + 'user_email' => $user_email, + 'registered' => current_time('mysql', true), + 'activation_key' => $key, + 'meta' => $meta + ) ); + + wpmu_signup_user_notification($user, $user_email, $key, $meta); +} + +/** + * Notify user of signup success. + * + * This is the notification function used when site registration + * is enabled. + * + * Filter 'wpmu_signup_blog_notification' to bypass this function or + * replace it with your own notification behavior. + * + * Filter 'wpmu_signup_blog_notification_email' and + * 'wpmu_signup_blog_notification_email' to change the content + * and subject line of the email sent to newly registered users. + * + * @since MU + * + * @param string $domain The new blog domain. + * @param string $path The new blog path. + * @param string $title The site title. + * @param string $user The user's login name. + * @param string $user_email The user's email address. + * @param array $meta By default, contains the requested privacy setting and lang_id. + * @param string $key The activation key created in wpmu_signup_blog() + * @return bool + */ +function wpmu_signup_blog_notification($domain, $path, $title, $user, $user_email, $key, $meta = '') { + global $current_site; + + if ( !apply_filters('wpmu_signup_blog_notification', $domain, $path, $title, $user, $user_email, $key, $meta) ) + return false; + + // Send email with activation link. + if ( !is_subdomain_install() || $current_site->id != 1 ) + $activate_url = network_site_url("wp-activate.php?key=$key"); + else + $activate_url = "http://{$domain}{$path}wp-activate.php?key=$key"; // @todo use *_url() API + + $activate_url = esc_url($activate_url); + $admin_email = get_site_option( 'admin_email' ); + if ( $admin_email == '' ) + $admin_email = 'support@' . $_SERVER['SERVER_NAME']; + $from_name = get_site_option( 'site_name' ) == '' ? 'WordPress' : esc_html( get_site_option( 'site_name' ) ); + $message_headers = "From: \"{$from_name}\" <{$admin_email}>\n" . "Content-Type: text/plain; charset=\"" . get_option('blog_charset') . "\"\n"; + $message = sprintf( + apply_filters( 'wpmu_signup_blog_notification_email', + __( "To activate your blog, please click the following link:\n\n%s\n\nAfter you activate, you will receive *another email* with your login.\n\nAfter you activate, you can visit your site here:\n\n%s" ), + $domain, $path, $title, $user, $user_email, $key, $meta + ), + $activate_url, + esc_url( "http://{$domain}{$path}" ), + $key + ); + // TODO: Don't hard code activation link. + $subject = sprintf( + apply_filters( 'wpmu_signup_blog_notification_subject', + __( '[%1$s] Activate %2$s' ), + $domain, $path, $title, $user, $user_email, $key, $meta + ), + $from_name, + esc_url( 'http://' . $domain . $path ) + ); + wp_mail($user_email, $subject, $message, $message_headers); + return true; +} + +/** + * Notify user of signup success. + * + * This is the notification function used when no new site has + * been requested. + * + * Filter 'wpmu_signup_user_notification' to bypass this function or + * replace it with your own notification behavior. + * + * Filter 'wpmu_signup_user_notification_email' and + * 'wpmu_signup_user_notification_subject' to change the content + * and subject line of the email sent to newly registered users. + * + * @since MU + * + * @param string $user The user's login name. + * @param string $user_email The user's email address. + * @param array $meta By default, an empty array. + * @param string $key The activation key created in wpmu_signup_user() + * @return bool + */ +function wpmu_signup_user_notification($user, $user_email, $key, $meta = '') { + if ( !apply_filters('wpmu_signup_user_notification', $user, $user_email, $key, $meta) ) + return false; + + // Send email with activation link. + $admin_email = get_site_option( 'admin_email' ); + if ( $admin_email == '' ) + $admin_email = 'support@' . $_SERVER['SERVER_NAME']; + $from_name = get_site_option( 'site_name' ) == '' ? 'WordPress' : esc_html( get_site_option( 'site_name' ) ); + $message_headers = "From: \"{$from_name}\" <{$admin_email}>\n" . "Content-Type: text/plain; charset=\"" . get_option('blog_charset') . "\"\n"; + $message = sprintf( + apply_filters( 'wpmu_signup_user_notification_email', + __( "To activate your user, please click the following link:\n\n%s\n\nAfter you activate, you will receive *another email* with your login.\n\n" ), + $user, $user_email, $key, $meta + ), + site_url( "wp-activate.php?key=$key" ) + ); + // TODO: Don't hard code activation link. + $subject = sprintf( + apply_filters( 'wpmu_signup_user_notification_subject', + __( '[%1$s] Activate %2$s' ), + $user, $user_email, $key, $meta + ), + $from_name, + $user + ); + wp_mail($user_email, $subject, $message, $message_headers); + return true; +} + +/** + * Activate a signup. + * + * Hook to 'wpmu_activate_user' or 'wpmu_activate_blog' for events + * that should happen only when users or sites are self-created (since + * those actions are not called when users and sites are created + * by a Super Admin). + * + * @since MU + * @uses wp_generate_password() + * @uses wpmu_welcome_user_notification() + * @uses add_user_to_blog() + * @uses add_new_user_to_blog() + * @uses wpmu_create_user() + * @uses wpmu_create_blog() + * @uses wpmu_welcome_notification() + * + * @param string $key The activation key provided to the user. + * @return array An array containing information about the activated user and/or blog + */ +function wpmu_activate_signup($key) { + global $wpdb, $current_site; + + $signup = $wpdb->get_row( $wpdb->prepare("SELECT * FROM $wpdb->signups WHERE activation_key = %s", $key) ); + + if ( empty( $signup ) ) + return new WP_Error( 'invalid_key', __( 'Invalid activation key.' ) ); + + if ( $signup->active ) { + if ( empty( $signup->domain ) ) + return new WP_Error( 'already_active', __( 'The user is already active.' ), $signup ); + else + return new WP_Error( 'already_active', __( 'The site is already active.' ), $signup ); + } + + $meta = unserialize($signup->meta); + $user_login = $wpdb->escape($signup->user_login); + $user_email = $wpdb->escape($signup->user_email); + $password = wp_generate_password( 12, false ); + + $user_id = username_exists($user_login); + + if ( ! $user_id ) + $user_id = wpmu_create_user($user_login, $password, $user_email); + else + $user_already_exists = true; + + if ( ! $user_id ) + return new WP_Error('create_user', __('Could not create user'), $signup); + + $now = current_time('mysql', true); + + if ( empty($signup->domain) ) { + $wpdb->update( $wpdb->signups, array('active' => 1, 'activated' => $now), array('activation_key' => $key) ); + + if ( isset( $user_already_exists ) ) + return new WP_Error( 'user_already_exists', __( 'That username is already activated.' ), $signup); + + wpmu_welcome_user_notification($user_id, $password, $meta); + + add_new_user_to_blog( $user_id, $user_email, $meta ); + do_action('wpmu_activate_user', $user_id, $password, $meta); + return array('user_id' => $user_id, 'password' => $password, 'meta' => $meta); + } + + $blog_id = wpmu_create_blog( $signup->domain, $signup->path, $signup->title, $user_id, $meta, $wpdb->siteid ); + + // TODO: What to do if we create a user but cannot create a blog? + if ( is_wp_error($blog_id) ) { + // If blog is taken, that means a previous attempt to activate this blog failed in between creating the blog and + // setting the activation flag. Let's just set the active flag and instruct the user to reset their password. + if ( 'blog_taken' == $blog_id->get_error_code() ) { + $blog_id->add_data( $signup ); + $wpdb->update( $wpdb->signups, array( 'active' => 1, 'activated' => $now ), array( 'activation_key' => $key ) ); + } + return $blog_id; + } + + $wpdb->update( $wpdb->signups, array('active' => 1, 'activated' => $now), array('activation_key' => $key) ); + wpmu_welcome_notification($blog_id, $user_id, $password, $signup->title, $meta); + do_action('wpmu_activate_blog', $blog_id, $user_id, $password, $signup->title, $meta); + + return array('blog_id' => $blog_id, 'user_id' => $user_id, 'password' => $password, 'title' => $signup->title, 'meta' => $meta); +} + +/** + * Create a user. + * + * This function runs when a user self-registers as well as when + * a Super Admin creates a new user. Hook to 'wpmu_new_user' for events + * that should affect all new users, but only on Multisite (otherwise + * use 'user_register'). + * + * @since MU + * @uses wp_create_user() + * + * @param string $user_name The new user's login name. + * @param string $password The new user's password. + * @param string $email The new user's email address. + * @return mixed Returns false on failure, or int $user_id on success + */ +function wpmu_create_user( $user_name, $password, $email) { + $user_name = preg_replace( '/\s+/', '', sanitize_user( $user_name, true ) ); + + $user_id = wp_create_user( $user_name, $password, $email ); + if ( is_wp_error($user_id) ) + return false; + + // Newly created users have no roles or caps until they are added to a blog. + delete_user_option( $user_id, 'capabilities' ); + delete_user_option( $user_id, 'user_level' ); + + do_action( 'wpmu_new_user', $user_id ); + + return $user_id; +} + +/** + * Create a site. + * + * This function runs when a user self-registers a new site as well + * as when a Super Admin creates a new site. Hook to 'wpmu_new_blog' + * for events that should affect all new sites. + * + * On subdirectory installs, $domain is the same as the main site's + * domain, and the path is the subdirectory name (eg 'example.com' + * and '/blog1/'). On subdomain installs, $domain is the new subdomain + + * root domain (eg 'blog1.example.com'), and $path is '/'. + * + * @since MU + * @uses domain_exists() + * @uses insert_blog() + * @uses wp_install_defaults() + * @uses add_user_to_blog() + * + * @param string $domain The new site's domain. + * @param string $path The new site's path. + * @param string $title The new site's title. + * @param int $user_id The user ID of the new site's admin. + * @param array $meta Optional. Used to set initial site options. + * @param int $site_id Optional. Only relevant on multi-network installs. + * @return mixed Returns WP_Error object on failure, int $blog_id on success + */ +function wpmu_create_blog($domain, $path, $title, $user_id, $meta = '', $site_id = 1) { + $domain = preg_replace( '/\s+/', '', sanitize_user( $domain, true ) ); + + if ( is_subdomain_install() ) + $domain = str_replace( '@', '', $domain ); + + $title = strip_tags( $title ); + $user_id = (int) $user_id; + + if ( empty($path) ) + $path = '/'; + + // Check if the domain has been used already. We should return an error message. + if ( domain_exists($domain, $path, $site_id) ) + return new WP_Error('blog_taken', __('Site already exists.')); + + if ( !defined('WP_INSTALLING') ) + define( 'WP_INSTALLING', true ); + + if ( ! $blog_id = insert_blog($domain, $path, $site_id) ) + return new WP_Error('insert_blog', __('Could not create site.')); + + switch_to_blog($blog_id); + install_blog($blog_id, $title); + wp_install_defaults($user_id); + + add_user_to_blog($blog_id, $user_id, 'administrator'); + + if ( is_array($meta) ) foreach ($meta as $key => $value) { + if ( $key == 'public' || $key == 'archived' || $key == 'mature' || $key == 'spam' || $key == 'deleted' || $key == 'lang_id' ) + update_blog_status( $blog_id, $key, $value ); + else + update_option( $key, $value ); + } + + add_option( 'WPLANG', get_site_option( 'WPLANG' ) ); + update_option( 'blog_public', (int)$meta['public'] ); + + if ( !is_super_admin() && ! get_user_meta( $user_id, 'primary_blog', true ) ) + update_user_meta( $user_id, 'primary_blog', $blog_id ); + + restore_current_blog(); + do_action( 'wpmu_new_blog', $blog_id, $user_id, $domain, $path, $site_id, $meta ); + + return $blog_id; +} + +/** + * Notifies the network admin that a new site has been activated. + * + * Filter 'newblog_notify_siteadmin' to change the content of + * the notification email. + * + * @since MU + * + * @param int $blog_id The new site's ID. + * @return bool + */ +function newblog_notify_siteadmin( $blog_id, $deprecated = '' ) { + if ( get_site_option( 'registrationnotification' ) != 'yes' ) + return false; + + $email = get_site_option( 'admin_email' ); + if ( is_email($email) == false ) + return false; + + $options_site_url = esc_url(network_admin_url('settings.php')); + + switch_to_blog( $blog_id ); + $blogname = get_option( 'blogname' ); + $siteurl = site_url(); + restore_current_blog(); + + $msg = sprintf( __( 'New Site: %1s +URL: %2s +Remote IP: %3s + +Disable these notifications: %4s' ), $blogname, $siteurl, $_SERVER['REMOTE_ADDR'], $options_site_url); + $msg = apply_filters( 'newblog_notify_siteadmin', $msg ); + + wp_mail( $email, sprintf( __( 'New Site Registration: %s' ), $siteurl ), $msg ); + return true; +} + +/** + * Notifies the network admin that a new user has been activated. + * + * Filter 'newuser_notify_siteadmin' to change the content of + * the notification email. + * + * @since MU + * + * @param int $user_id The new user's ID. + * @return bool + */ +function newuser_notify_siteadmin( $user_id ) { + if ( get_site_option( 'registrationnotification' ) != 'yes' ) + return false; + + $email = get_site_option( 'admin_email' ); + + if ( is_email($email) == false ) + return false; + + $user = new WP_User($user_id); + + $options_site_url = esc_url(network_admin_url('settings.php')); + $msg = sprintf(__('New User: %1s +Remote IP: %2s + +Disable these notifications: %3s'), $user->user_login, $_SERVER['REMOTE_ADDR'], $options_site_url); + + $msg = apply_filters( 'newuser_notify_siteadmin', $msg ); + wp_mail( $email, sprintf(__('New User Registration: %s'), $user->user_login), $msg ); + return true; +} + +/** + * Check whether a blogname is already taken. + * + * Used during the new site registration process to ensure + * that each blogname is unique. + * + * @since MU + * + * @param string $domain The domain to be checked. + * @param string $path The path to be checked. + * @param int $site_id Optional. Relevant only on multi-network installs. + * @return int + */ +function domain_exists($domain, $path, $site_id = 1) { + global $wpdb; + return $wpdb->get_var( $wpdb->prepare("SELECT blog_id FROM $wpdb->blogs WHERE domain = %s AND path = %s AND site_id = %d", $domain, $path, $site_id) ); +} + +/** + * Store basic site info in the blogs table. + * + * This function creates a row in the wp_blogs table and returns + * the new blog's ID. It is the first step in creating a new blog. + * + * @since MU + * + * @param string $domain The domain of the new site. + * @param string $path The path of the new site. + * @param int $site_id Unless you're running a multi-network install, be sure to set this value to 1. + * @return int The ID of the new row + */ +function insert_blog($domain, $path, $site_id) { + global $wpdb; + + $path = trailingslashit($path); + $site_id = (int) $site_id; + + $result = $wpdb->insert( $wpdb->blogs, array('site_id' => $site_id, 'domain' => $domain, 'path' => $path, 'registered' => current_time('mysql')) ); + if ( ! $result ) + return false; + + refresh_blog_details($wpdb->insert_id); + return $wpdb->insert_id; +} + +/** + * Install an empty blog. + * + * Creates the new blog tables and options. If calling this function + * directly, be sure to use switch_to_blog() first, so that $wpdb + * points to the new blog. + * + * @since MU + * @uses make_db_current_silent() + * @uses populate_roles() + * + * @param int $blog_id The value returned by insert_blog(). + * @param string $blog_title The title of the new site. + */ +function install_blog($blog_id, $blog_title = '') { + global $wpdb, $table_prefix, $wp_roles; + $wpdb->suppress_errors(); + + // Cast for security + $blog_id = (int) $blog_id; + + require_once( ABSPATH . 'wp-admin/includes/upgrade.php' ); + + if ( $wpdb->get_results("SELECT ID FROM $wpdb->posts") ) + die(__('

    Already Installed

    You appear to have already installed WordPress. To reinstall please clear your old database tables first.

    ') . ''); + + $wpdb->suppress_errors(false); + + $url = get_blogaddress_by_id($blog_id); + + // Set everything up + make_db_current_silent(); + populate_options(); + populate_roles(); + $wp_roles->_init(); + + // fix url. + update_option('siteurl', $url); + update_option('home', $url); + update_option('fileupload_url', $url . "files" ); + update_option('upload_path', UPLOADBLOGSDIR . "/$blog_id/files"); + update_option('blogname', stripslashes( $blog_title ) ); + update_option('admin_email', ''); + $wpdb->update( $wpdb->options, array('option_value' => ''), array('option_name' => 'admin_email') ); + + // remove all perms + $wpdb->query( $wpdb->prepare("DELETE FROM $wpdb->usermeta WHERE meta_key = %s", $table_prefix.'user_level') ); + $wpdb->query( $wpdb->prepare("DELETE FROM $wpdb->usermeta WHERE meta_key = %s", $table_prefix.'capabilities') ); + + $wpdb->suppress_errors( false ); +} + +/** + * Set blog defaults. + * + * This function creates a row in the wp_blogs table. + * + * @since MU + * @deprecated MU + * @deprecated Use wp_install_defaults() + * @uses wp_install_defaults() + * + * @param int $blog_id Ignored in this function. + * @param int $user_id + */ +function install_blog_defaults($blog_id, $user_id) { + global $wpdb; + + require_once( ABSPATH . 'wp-admin/includes/upgrade.php' ); + + $wpdb->suppress_errors(); + + wp_install_defaults($user_id); + + $wpdb->suppress_errors( false ); +} + +/** + * Notify a user that her blog activation has been successful. + * + * Filter 'wpmu_welcome_notification' to disable or bypass. + * + * Filter 'update_welcome_email' and 'update_welcome_subject' to + * modify the content and subject line of the notification email. + * + * @since MU + * + * @param int $blog_id + * @param int $user_id + * @param string $password + * @param string $title The new blog's title + * @param array $meta Optional. Not used in the default function, but is passed along to hooks for customization. + * @return bool + */ +function wpmu_welcome_notification($blog_id, $user_id, $password, $title, $meta = '') { + global $current_site; + + if ( !apply_filters('wpmu_welcome_notification', $blog_id, $user_id, $password, $title, $meta) ) + return false; + + $welcome_email = stripslashes( get_site_option( 'welcome_email' ) ); + if ( $welcome_email == false ) + $welcome_email = stripslashes( __( 'Dear User, + +Your new SITE_NAME site has been successfully set up at: +BLOG_URL + +You can log in to the administrator account with the following information: +Username: USERNAME +Password: PASSWORD +Log in here: BLOG_URLwp-login.php + +We hope you enjoy your new site. Thanks! + +--The Team @ SITE_NAME' ) ); + + $url = get_blogaddress_by_id($blog_id); + $user = new WP_User($user_id); + + $welcome_email = str_replace( 'SITE_NAME', $current_site->site_name, $welcome_email ); + $welcome_email = str_replace( 'BLOG_TITLE', $title, $welcome_email ); + $welcome_email = str_replace( 'BLOG_URL', $url, $welcome_email ); + $welcome_email = str_replace( 'USERNAME', $user->user_login, $welcome_email ); + $welcome_email = str_replace( 'PASSWORD', $password, $welcome_email ); + + $welcome_email = apply_filters( 'update_welcome_email', $welcome_email, $blog_id, $user_id, $password, $title, $meta); + $admin_email = get_site_option( 'admin_email' ); + + if ( $admin_email == '' ) + $admin_email = 'support@' . $_SERVER['SERVER_NAME']; + + $from_name = get_site_option( 'site_name' ) == '' ? 'WordPress' : esc_html( get_site_option( 'site_name' ) ); + $message_headers = "From: \"{$from_name}\" <{$admin_email}>\n" . "Content-Type: text/plain; charset=\"" . get_option('blog_charset') . "\"\n"; + $message = $welcome_email; + + if ( empty( $current_site->site_name ) ) + $current_site->site_name = 'WordPress'; + + $subject = apply_filters( 'update_welcome_subject', sprintf(__('New %1$s Site: %2$s'), $current_site->site_name, stripslashes( $title ) ) ); + wp_mail($user->user_email, $subject, $message, $message_headers); + return true; +} + +/** + * Notify a user that her account activation has been successful. + * + * Filter 'wpmu_welcome_user_notification' to disable or bypass. + * + * Filter 'update_welcome_user_email' and 'update_welcome_user_subject' to + * modify the content and subject line of the notification email. + * + * @since MU + * + * @param int $user_id + * @param string $password + * @param array $meta Optional. Not used in the default function, but is passed along to hooks for customization. + * @return bool + */ +function wpmu_welcome_user_notification($user_id, $password, $meta = '') { + global $current_site; + + if ( !apply_filters('wpmu_welcome_user_notification', $user_id, $password, $meta) ) + return false; + + $welcome_email = get_site_option( 'welcome_user_email' ); + + $user = new WP_User($user_id); + + $welcome_email = apply_filters( 'update_welcome_user_email', $welcome_email, $user_id, $password, $meta); + $welcome_email = str_replace( 'SITE_NAME', $current_site->site_name, $welcome_email ); + $welcome_email = str_replace( 'USERNAME', $user->user_login, $welcome_email ); + $welcome_email = str_replace( 'PASSWORD', $password, $welcome_email ); + $welcome_email = str_replace( 'LOGINLINK', wp_login_url(), $welcome_email ); + + $admin_email = get_site_option( 'admin_email' ); + + if ( $admin_email == '' ) + $admin_email = 'support@' . $_SERVER['SERVER_NAME']; + + $from_name = get_site_option( 'site_name' ) == '' ? 'WordPress' : esc_html( get_site_option( 'site_name' ) ); + $message_headers = "From: \"{$from_name}\" <{$admin_email}>\n" . "Content-Type: text/plain; charset=\"" . get_option('blog_charset') . "\"\n"; + $message = $welcome_email; + + if ( empty( $current_site->site_name ) ) + $current_site->site_name = 'WordPress'; + + $subject = apply_filters( 'update_welcome_user_subject', sprintf(__('New %1$s User: %2$s'), $current_site->site_name, $user->user_login) ); + wp_mail($user->user_email, $subject, $message, $message_headers); + return true; +} + +/** + * Get the current site info. + * + * Returns an object containing the ID, domain, path, and site_name + * of the site being viewed. + * + * @since MU + * + * @return object + */ +function get_current_site() { + global $current_site; + return $current_site; +} + +/** + * Get a numeric user ID from either an email address or a login. + * + * @since MU + * @uses is_email() + * + * @param string $string + * @return int + */ +function get_user_id_from_string( $string ) { + $user_id = 0; + if ( is_email( $string ) ) { + $user = get_user_by('email', $string); + if ( $user ) + $user_id = $user->ID; + } elseif ( is_numeric( $string ) ) { + $user_id = $string; + } else { + $user = get_user_by('login', $string); + if ( $user ) + $user_id = $user->ID; + } + + return $user_id; +} + +/** + * Get a user's most recent post. + * + * Walks through each of a user's blogs to find the post with + * the most recent post_date_gmt. + * + * @since MU + * @uses get_blogs_of_user() + * + * @param int $user_id + * @return array Contains the blog_id, post_id, post_date_gmt, and post_gmt_ts + */ +function get_most_recent_post_of_user( $user_id ) { + global $wpdb; + + $user_blogs = get_blogs_of_user( (int) $user_id ); + $most_recent_post = array(); + + // Walk through each blog and get the most recent post + // published by $user_id + foreach ( (array) $user_blogs as $blog ) { + $recent_post = $wpdb->get_row( $wpdb->prepare("SELECT ID, post_date_gmt FROM {$wpdb->base_prefix}{$blog->userblog_id}_posts WHERE post_author = %d AND post_type = 'post' AND post_status = 'publish' ORDER BY post_date_gmt DESC LIMIT 1", $user_id ), ARRAY_A); + + // Make sure we found a post + if ( isset($recent_post['ID']) ) { + $post_gmt_ts = strtotime($recent_post['post_date_gmt']); + + // If this is the first post checked or if this post is + // newer than the current recent post, make it the new + // most recent post. + if ( !isset($most_recent_post['post_gmt_ts']) || ( $post_gmt_ts > $most_recent_post['post_gmt_ts'] ) ) { + $most_recent_post = array( + 'blog_id' => $blog->userblog_id, + 'post_id' => $recent_post['ID'], + 'post_date_gmt' => $recent_post['post_date_gmt'], + 'post_gmt_ts' => $post_gmt_ts + ); + } + } + } + + return $most_recent_post; +} + +// Misc functions + +/** + * Get the size of a directory. + * + * A helper function that is used primarily to check whether + * a blog has exceeded its allowed upload space. + * + * @since MU + * @uses recurse_dirsize() + * + * @param string $directory + * @return int + */ +function get_dirsize( $directory ) { + $dirsize = get_transient( 'dirsize_cache' ); + if ( is_array( $dirsize ) && isset( $dirsize[ $directory ][ 'size' ] ) ) + return $dirsize[ $directory ][ 'size' ]; + + if ( false == is_array( $dirsize ) ) + $dirsize = array(); + + $dirsize[ $directory ][ 'size' ] = recurse_dirsize( $directory ); + + set_transient( 'dirsize_cache', $dirsize, 3600 ); + return $dirsize[ $directory ][ 'size' ]; +} + +/** + * Get the size of a directory recursively. + * + * Used by get_dirsize() to get a directory's size when it contains + * other directories. + * + * @since MU + * + * @param string $directory + * @return int + */ +function recurse_dirsize( $directory ) { + $size = 0; + + if ( substr( $directory, -1 ) == '/' ) + $directory = substr($directory,0,-1); + + if ( !file_exists($directory) || !is_dir( $directory ) || !is_readable( $directory ) ) + return false; + + if ($handle = opendir($directory)) { + while(($file = readdir($handle)) !== false) { + $path = $directory.'/'.$file; + if ($file != '.' && $file != '..') { + if (is_file($path)) { + $size += filesize($path); + } elseif (is_dir($path)) { + $handlesize = recurse_dirsize($path); + if ($handlesize > 0) + $size += $handlesize; + } + } + } + closedir($handle); + } + return $size; +} + +/** + * Check whether a blog has used its allotted upload space. + * + * Used by get_dirsize() to get a directory's size when it contains + * other directories. + * + * @since MU + * @uses get_dirsize() + * + * @param bool $echo Optional. If $echo is set and the quota is exceeded, a warning message is echoed. Default is true. + * @return int + */ +function upload_is_user_over_quota( $echo = true ) { + if ( get_site_option( 'upload_space_check_disabled' ) ) + return false; + + $spaceAllowed = get_space_allowed(); + if ( empty( $spaceAllowed ) || !is_numeric( $spaceAllowed ) ) + $spaceAllowed = 10; // Default space allowed is 10 MB + + $dirName = BLOGUPLOADDIR; + $size = get_dirsize($dirName) / 1024 / 1024; + + if ( ($spaceAllowed-$size) < 0 ) { + if ( $echo ) + _e( 'Sorry, you have used your space allocation. Please delete some files to upload more files.' ); // No space left + return true; + } else { + return false; + } +} + +/** + * Check an array of MIME types against a whitelist. + * + * WordPress ships with a set of allowed upload filetypes, + * which is defined in wp-includes/functions.php in + * get_allowed_mime_types(). This function is used to filter + * that list against the filetype whitelist provided by Multisite + * Super Admins at wp-admin/network/settings.php. + * + * @since MU + * + * @param array $mimes + * @return array + */ +function check_upload_mimes( $mimes ) { + $site_exts = explode( ' ', get_site_option( 'upload_filetypes' ) ); + foreach ( $site_exts as $ext ) { + foreach ( $mimes as $ext_pattern => $mime ) { + if ( $ext != '' && strpos( $ext_pattern, $ext ) !== false ) + $site_mimes[$ext_pattern] = $mime; + } + } + return $site_mimes; +} + +/** + * Update a blog's post count. + * + * WordPress MS stores a blog's post count as an option so as + * to avoid extraneous COUNTs when a blog's details are fetched + * with get_blog_details(). This function is called when posts + * are published to make sure the count stays current. + * + * @since MU + */ +function update_posts_count( $deprecated = '' ) { + global $wpdb; + update_option( 'post_count', (int) $wpdb->get_var( "SELECT COUNT(ID) FROM {$wpdb->posts} WHERE post_status = 'publish' and post_type = 'post'" ) ); +} + +/** + * Logs user registrations. + * + * @since MU + * + * @param int $blog_id + * @param int $user_id + */ +function wpmu_log_new_registrations( $blog_id, $user_id ) { + global $wpdb; + $user = new WP_User( (int) $user_id ); + $wpdb->insert( $wpdb->registration_log, array('email' => $user->user_email, 'IP' => preg_replace( '/[^0-9., ]/', '',$_SERVER['REMOTE_ADDR'] ), 'blog_id' => $blog_id, 'date_registered' => current_time('mysql')) ); +} + +/** + * Get the remaining upload space for this blog. + * + * @since MU + * @uses upload_is_user_over_quota() + * @uses get_space_allowed() + * @uses get_dirsize() + * + * @param int $size + * @return int + */ +function fix_import_form_size( $size ) { + if ( upload_is_user_over_quota( false ) == true ) + return 0; + + $spaceAllowed = 1024 * 1024 * get_space_allowed(); + $dirName = BLOGUPLOADDIR; + $dirsize = get_dirsize($dirName) ; + if ( $size > $spaceAllowed - $dirsize ) + return $spaceAllowed - $dirsize; // remaining space + else + return $size; // default +} + +/** + * Maintains a canonical list of terms by syncing terms created for each blog with the global terms table. + * + * @since 3.0.0 + * + * @see term_id_filter + * + * @param int $term_id An ID for a term on the current blog. + * @return int An ID from the global terms table mapped from $term_id. + */ +function global_terms( $term_id, $deprecated = '' ) { + global $wpdb; + static $global_terms_recurse = null; + + if ( !global_terms_enabled() ) + return $term_id; + + // prevent a race condition + $recurse_start = false; + if ( $global_terms_recurse === null ) { + $recurse_start = true; + $global_terms_recurse = 1; + } elseif ( 10 < $global_terms_recurse++ ) { + return $term_id; + } + + $term_id = intval( $term_id ); + $c = $wpdb->get_row( $wpdb->prepare( "SELECT * FROM $wpdb->terms WHERE term_id = %d", $term_id ) ); + + $global_id = $wpdb->get_var( $wpdb->prepare( "SELECT cat_ID FROM $wpdb->sitecategories WHERE category_nicename = %s", $c->slug ) ); + if ( $global_id == null ) { + $used_global_id = $wpdb->get_var( $wpdb->prepare( "SELECT cat_ID FROM $wpdb->sitecategories WHERE cat_ID = %d", $c->term_id ) ); + if ( null == $used_global_id ) { + $wpdb->insert( $wpdb->sitecategories, array( 'cat_ID' => $term_id, 'cat_name' => $c->name, 'category_nicename' => $c->slug ) ); + $global_id = $wpdb->insert_id; + if ( empty( $global_id ) ) + return $term_id; + } else { + $max_global_id = $wpdb->get_var( "SELECT MAX(cat_ID) FROM $wpdb->sitecategories" ); + $max_local_id = $wpdb->get_var( "SELECT MAX(term_id) FROM $wpdb->terms" ); + $new_global_id = max( $max_global_id, $max_local_id ) + mt_rand( 100, 400 ); + $wpdb->insert( $wpdb->sitecategories, array( 'cat_ID' => $new_global_id, 'cat_name' => $c->name, 'category_nicename' => $c->slug ) ); + $global_id = $wpdb->insert_id; + } + } elseif ( $global_id != $term_id ) { + $local_id = $wpdb->get_row( $wpdb->prepare( "SELECT term_id FROM $wpdb->terms WHERE term_id = %d", $global_id ) ); + if ( null != $local_id ) + $local_id = global_terms( $local_id ); + if ( 10 < $global_terms_recurse ) + $global_id = $term_id; + } + + if ( $global_id != $term_id ) { + if ( get_option( 'default_category' ) == $term_id ) + update_option( 'default_category', $global_id ); + + $wpdb->update( $wpdb->terms, array('term_id' => $global_id), array('term_id' => $term_id) ); + $wpdb->update( $wpdb->term_taxonomy, array('term_id' => $global_id), array('term_id' => $term_id) ); + $wpdb->update( $wpdb->term_taxonomy, array('parent' => $global_id), array('parent' => $term_id) ); + + clean_term_cache($term_id); + } + if( $recurse_start ) + $global_terms_recurse = null; + + return $global_id; +} + +/** + * Ensure that the current site's domain is listed in the allowed redirect host list. + * + * @see wp_validate_redirect() + * @since MU + * + * @return array The current site's domain + */ +function redirect_this_site( $deprecated = '' ) { + global $current_site; + return array( $current_site->domain ); +} + +/** + * Check whether an upload is too big. + * + * @since MU + * + * @param array $upload + * @return mixed If the upload is under the size limit, $upload is returned. Otherwise returns an error message. + */ +function upload_is_file_too_big( $upload ) { + if ( is_array( $upload ) == false || defined( 'WP_IMPORTING' ) ) + return $upload; + + if ( strlen( $upload['bits'] ) > ( 1024 * get_site_option( 'fileupload_maxk', 1500 ) ) ) + return sprintf( __( 'This file is too big. Files must be less than %d KB in size.' ) . '
    ', get_site_option( 'fileupload_maxk', 1500 )); + + return $upload; +} + +/** + * Add a nonce field to the signup page. + * + * @since MU + * @uses wp_nonce_field() + */ +function signup_nonce_fields() { + $id = mt_rand(); + echo ""; + wp_nonce_field('signup_form_' . $id, '_signup_form', false); +} + +/** + * Process the signup nonce created in signup_nonce_fields(). + * + * @since MU + * @uses wp_create_nonce() + * + * @param array $result + * @return array + */ +function signup_nonce_check( $result ) { + if ( !strpos( $_SERVER[ 'PHP_SELF' ], 'wp-signup.php' ) ) + return $result; + + if ( wp_create_nonce('signup_form_' . $_POST[ 'signup_form_id' ]) != $_POST['_signup_form'] ) + wp_die( __('Please try again!') ); + + return $result; +} + +/** + * Correct 404 redirects when NOBLOGREDIRECT is defined. + * + * @since MU + */ +function maybe_redirect_404() { + global $current_site; + if ( is_main_site() && is_404() && defined( 'NOBLOGREDIRECT' ) && ( $destination = apply_filters( 'blog_redirect_404', NOBLOGREDIRECT ) ) ) { + if ( $destination == '%siteurl%' ) + $destination = network_home_url(); + wp_redirect( $destination ); + exit(); + } +} + +/** + * Add a new user to a blog by visiting /newbloguser/username/. + * + * This will only work when the user's details are saved as an option + * keyed as 'new_user_x', where 'x' is the username of the user to be + * added, as when a user is invited through the regular WP Add User interface. + * + * @since MU + * @uses add_existing_user_to_blog() + */ +function maybe_add_existing_user_to_blog() { + if ( false === strpos( $_SERVER[ 'REQUEST_URI' ], '/newbloguser/' ) ) + return false; + + $parts = explode( '/', $_SERVER[ 'REQUEST_URI' ] ); + $key = array_pop( $parts ); + + if ( $key == '' ) + $key = array_pop( $parts ); + + $details = get_option( 'new_user_' . $key ); + if ( !empty( $details ) ) + delete_option( 'new_user_' . $key ); + + if ( empty( $details ) || is_wp_error( add_existing_user_to_blog( $details ) ) ) + wp_die( sprintf(__('An error occurred adding you to this site. Back to the homepage.'), site_url() ) ); + + wp_die( sprintf(__('You have been added to this site. Please visit the homepage or login using your username and password.'), site_url(), admin_url() ), __('Success') ); +} + +/** + * Add a user to a blog based on details from maybe_add_existing_user_to_blog(). + * + * @since MU + * @uses add_user_to_blog() + * + * @param array $details + */ +function add_existing_user_to_blog( $details = false ) { + global $blog_id; + + if ( is_array( $details ) ) { + $result = add_user_to_blog( $blog_id, $details[ 'user_id' ], $details[ 'role' ] ); + do_action( 'added_existing_user', $details[ 'user_id' ], $result ); + } + return $result; +} + +/** + * Add a newly created user to the appropriate blog + * + * @since MU + * + * @param int $user_id + * @param string $email + * @param array $meta + */ +function add_new_user_to_blog( $user_id, $email, $meta ) { + global $current_site; + if ( !empty( $meta[ 'add_to_blog' ] ) ) { + $blog_id = $meta[ 'add_to_blog' ]; + $role = $meta[ 'new_role' ]; + remove_user_from_blog($user_id, $current_site->blog_id); // remove user from main blog. + add_user_to_blog( $blog_id, $user_id, $role ); + update_user_meta( $user_id, 'primary_blog', $blog_id ); + } +} + +/** + * Correct From host on outgoing mail to match the site domain + * + * @since MU + */ +function fix_phpmailer_messageid( $phpmailer ) { + global $current_site; + $phpmailer->Hostname = $current_site->domain; +} + +/** + * Check to see whether a user is marked as a spammer, based on username + * + * @since MU + * @uses get_current_user_id() + * @uses get_user_id_from_string() + * + * @param string $username + * @return bool + */ +function is_user_spammy( $username = 0 ) { + if ( $username == 0 ) { + $user_id = get_current_user_id(); + } else { + $user_id = get_user_id_from_string( $username ); + } + $u = new WP_User( $user_id ); + + return ( isset( $u->spam ) && $u->spam == 1 ); +} + +/** + * Update this blog's 'public' setting in the global blogs table. + * + * Public blogs have a setting of 1, private blogs are 0. + * + * @since MU + * @uses update_blog_status() + * + * @param int $old_value + * @param int $value The new public value + * @return bool + */ +function update_blog_public( $old_value, $value ) { + global $wpdb; + do_action('update_blog_public'); + update_blog_status( $wpdb->blogid, 'public', (int) $value ); +} +add_action('update_option_blog_public', 'update_blog_public', 10, 2); + +/** + * Get the "dashboard blog", the blog where users without a blog edit their profile data. + * + * @since MU + * @uses get_blog_details() + * + * @return int + */ +function get_dashboard_blog() { + if ( $blog = get_site_option( 'dashboard_blog' ) ) + return get_blog_details( $blog ); + + return get_blog_details( $GLOBALS['current_site']->blog_id ); +} + +/** + * Check whether a usermeta key has to do with the current blog. + * + * @since MU + * @uses wp_get_current_user() + * + * @param string $key + * @param int $user_id Optional. Defaults to current user. + * @param int $blog_id Optional. Defaults to current blog. + * @return bool + */ +function is_user_option_local( $key, $user_id = 0, $blog_id = 0 ) { + global $wpdb; + + $current_user = wp_get_current_user(); + if ( $user_id == 0 ) + $user_id = $current_user->ID; + if ( $blog_id == 0 ) + $blog_id = $wpdb->blogid; + + $local_key = $wpdb->base_prefix . $blog_id . '_' . $key; + + if ( isset( $current_user->$local_key ) ) + return true; + + return false; +} + +/** + * Check whether users can self-register, based on Network settings. + * + * @since MU + * + * @return bool + */ +function users_can_register_signup_filter() { + $registration = get_site_option('registration'); + if ( $registration == 'all' || $registration == 'user' ) + return true; + + return false; +} +add_filter('option_users_can_register', 'users_can_register_signup_filter'); + +/** + * Ensure that the welcome message is not empty. Currently unused. + * + * @since MU + * + * @param string $text + * @return string + */ +function welcome_user_msg_filter( $text ) { + if ( !$text ) { + return __( 'Dear User, + +Your new account is set up. + +You can log in with the following information: +Username: USERNAME +Password: PASSWORD +LOGINLINK + +Thanks! + +--The Team @ SITE_NAME' ); + } + return $text; +} +add_filter( 'site_option_welcome_user_email', 'welcome_user_msg_filter' ); + +/** + * Whether to force SSL on content. + * + * @since 2.8.5 + * + * @param string|bool $force + * @return bool True if forced, false if not forced. + */ +function force_ssl_content( $force = '' ) { + static $forced_content; + + if ( '' != $force ) { + $old_forced = $forced_content; + $forced_content = $force; + return $old_forced; + } + + return $forced_content; +} + +/** + * Formats an String URL to use HTTPS if HTTP is found. + * Useful as a filter. + * + * @since 2.8.5 + **/ +function filter_SSL( $url ) { + if ( !is_string( $url ) ) + return get_bloginfo( 'url' ); //return home blog url with proper scheme + + $arrURL = parse_url( $url ); + + if ( force_ssl_content() && is_ssl() ) { + if ( 'http' === $arrURL['scheme'] && 'https' !== $arrURL['scheme'] ) + $url = str_replace( $arrURL['scheme'], 'https', $url ); + } + + return $url; +} + +/** + * Schedule update of the network-wide counts for the current network. + * + * @since 3.1.0 + */ +function wp_schedule_update_network_counts() { + if ( !is_main_site() ) + return; + + if ( !wp_next_scheduled('update_network_counts') && !defined('WP_INSTALLING') ) + wp_schedule_event(time(), 'twicedaily', 'update_network_counts'); +} + +/** + * Update the network-wide counts for the current network. + * + * @since 3.1.0 + */ +function wp_update_network_counts() { + global $wpdb; + + $count = $wpdb->get_var( $wpdb->prepare("SELECT COUNT(blog_id) as c FROM $wpdb->blogs WHERE site_id = %d AND spam = '0' AND deleted = '0' and archived = '0'", $wpdb->siteid) ); + update_site_option( 'blog_count', $count ); + + $count = $wpdb->get_var( $wpdb->prepare("SELECT COUNT(ID) as c FROM $wpdb->users WHERE spam = '0' AND deleted = '0'") ); + update_site_option( 'user_count', $count ); +} + +?> \ No newline at end of file diff --git a/src/wp-includes/ms-load.php b/src/wp-includes/ms-load.php new file mode 100644 index 0000000..78d01e6 --- /dev/null +++ b/src/wp-includes/ms-load.php @@ -0,0 +1,250 @@ +WP_PLUGIN_DIR and WP_PLUGIN_URL + * in wp-config.php. + * + * @access private + * @since 3.1.0 + * @return array Files to include + */ +function wp_get_active_network_plugins() { + $active_plugins = (array) get_site_option( 'active_sitewide_plugins', array() ); + if ( empty( $active_plugins ) ) + return array(); + + $plugins = array(); + $active_plugins = array_keys( $active_plugins ); + sort( $active_plugins ); + + foreach ( $active_plugins as $plugin ) { + if ( ! validate_file( $plugin ) // $plugin must validate as file + && '.php' == substr( $plugin, -4 ) // $plugin must end with '.php' + && file_exists( WP_PLUGIN_DIR . '/' . $plugin ) // $plugin must exist + ) + $plugins[] = WP_PLUGIN_DIR . '/' . $plugin; + } + return $plugins; +} + +/** + * Checks status of current blog. + * + * Checks if the blog is deleted, inactive, archived, or spammed. + * + * Dies with a default message if the blog does not pass the check. + * + * To change the default message when a blog does not pass the check, + * use the wp-content/blog-deleted.php, blog-inactive.php and + * blog-suspended.php drop-ins. + * + * @return bool|string Returns true on success, or drop-in file to include. + */ +function ms_site_check() { + global $wpdb, $current_blog; + + // Allow short-circuiting + $check = apply_filters('ms_site_check', null); + if ( null !== $check ) + return true; + + // Allow super admins to see blocked sites + if ( is_super_admin() ) + return true; + + if ( '1' == $current_blog->deleted ) { + if ( file_exists( WP_CONTENT_DIR . '/blog-deleted.php' ) ) + return WP_CONTENT_DIR . '/blog-deleted.php'; + else + wp_die( __( 'This user has elected to delete their account and the content is no longer available.' ), '', array( 'response' => 410 ) ); + } + + if ( '2' == $current_blog->deleted ) { + if ( file_exists( WP_CONTENT_DIR . '/blog-inactive.php' ) ) + return WP_CONTENT_DIR . '/blog-inactive.php'; + else + wp_die( sprintf( __( 'This site has not been activated yet. If you are having problems activating your site, please contact %1$s.' ), str_replace( '@', ' AT ', get_site_option( 'admin_email', "support@{$current_site->domain}" ) ) ) ); + } + + if ( $current_blog->archived == '1' || $current_blog->spam == '1' ) { + if ( file_exists( WP_CONTENT_DIR . '/blog-suspended.php' ) ) + return WP_CONTENT_DIR . '/blog-suspended.php'; + else + wp_die( __( 'This site has been archived or suspended.' ), '', array( 'response' => 410 ) ); + } + + return true; +} + +/** + * Sets current site name. + * + * @access private + * @since 3.0.0 + * @return object $current_site object with site_name + */ +function get_current_site_name( $current_site ) { + global $wpdb; + + $current_site->site_name = wp_cache_get( $current_site->id . ':site_name', 'site-options' ); + if ( ! $current_site->site_name ) { + $current_site->site_name = $wpdb->get_var( $wpdb->prepare( "SELECT meta_value FROM $wpdb->sitemeta WHERE site_id = %d AND meta_key = 'site_name'", $current_site->id ) ); + if ( ! $current_site->site_name ) + $current_site->site_name = ucfirst( $current_site->domain ); + } + wp_cache_set( $current_site->id . ':site_name', $current_site->site_name, 'site-options' ); + + return $current_site; +} + +/** + * Sets current_site object. + * + * @access private + * @since 3.0.0 + * @return object $current_site object + */ +function wpmu_current_site() { + global $wpdb, $current_site, $domain, $path, $sites, $cookie_domain; + if ( defined( 'DOMAIN_CURRENT_SITE' ) && defined( 'PATH_CURRENT_SITE' ) ) { + $current_site->id = defined( 'SITE_ID_CURRENT_SITE' ) ? SITE_ID_CURRENT_SITE : 1; + $current_site->domain = DOMAIN_CURRENT_SITE; + $current_site->path = $path = PATH_CURRENT_SITE; + if ( defined( 'BLOG_ID_CURRENT_SITE' ) ) + $current_site->blog_id = BLOG_ID_CURRENT_SITE; + elseif ( defined( 'BLOGID_CURRENT_SITE' ) ) // deprecated. + $current_site->blog_id = BLOGID_CURRENT_SITE; + if ( DOMAIN_CURRENT_SITE == $domain ) + $current_site->cookie_domain = $cookie_domain; + elseif ( substr( $current_site->domain, 0, 4 ) == 'www.' ) + $current_site->cookie_domain = substr( $current_site->domain, 4 ); + else + $current_site->cookie_domain = $current_site->domain; + + wp_load_core_site_options( $current_site->id ); + + return $current_site; + } + + $current_site = wp_cache_get( 'current_site', 'site-options' ); + if ( $current_site ) + return $current_site; + + $sites = $wpdb->get_results( "SELECT * FROM $wpdb->site" ); // usually only one site + if ( 1 == count( $sites ) ) { + $current_site = $sites[0]; + wp_load_core_site_options( $current_site->id ); + $path = $current_site->path; + $current_site->blog_id = $wpdb->get_var( $wpdb->prepare( "SELECT blog_id FROM $wpdb->blogs WHERE domain = %s AND path = %s", $current_site->domain, $current_site->path ) ); + $current_site = get_current_site_name( $current_site ); + if ( substr( $current_site->domain, 0, 4 ) == 'www.' ) + $current_site->cookie_domain = substr( $current_site->domain, 4 ); + wp_cache_set( 'current_site', $current_site, 'site-options' ); + return $current_site; + } + $path = substr( $_SERVER[ 'REQUEST_URI' ], 0, 1 + strpos( $_SERVER[ 'REQUEST_URI' ], '/', 1 ) ); + + if ( $domain == $cookie_domain ) + $current_site = $wpdb->get_row( $wpdb->prepare( "SELECT * FROM $wpdb->site WHERE domain = %s AND path = %s", $domain, $path ) ); + else + $current_site = $wpdb->get_row( $wpdb->prepare( "SELECT * FROM $wpdb->site WHERE domain IN ( %s, %s ) AND path = %s ORDER BY CHAR_LENGTH( domain ) DESC LIMIT 1", $domain, $cookie_domain, $path ) ); + + if ( ! $current_site ) { + if ( $domain == $cookie_domain ) + $current_site = $wpdb->get_row( $wpdb->prepare("SELECT * FROM $wpdb->site WHERE domain = %s AND path='/'", $domain ) ); + else + $current_site = $wpdb->get_row( $wpdb->prepare("SELECT * FROM $wpdb->site WHERE domain IN ( %s, %s ) AND path = '/' ORDER BY CHAR_LENGTH( domain ) DESC LIMIT 1", $domain, $cookie_domain, $path ) ); + } + + if ( $current_site ) { + $path = $current_site->path; + $current_site->cookie_domain = $cookie_domain; + return $current_site; + } + + if ( is_subdomain_install() ) { + $sitedomain = substr( $domain, 1 + strpos( $domain, '.' ) ); + $current_site = $wpdb->get_row( $wpdb->prepare("SELECT * FROM $wpdb->site WHERE domain = %s AND path = %s", $sitedomain, $path) ); + if ( $current_site ) { + $current_site->cookie_domain = $current_site->domain; + return $current_site; + } + + $current_site = $wpdb->get_row( $wpdb->prepare("SELECT * FROM $wpdb->site WHERE domain = %s AND path='/'", $sitedomain) ); + } + + if ( $current_site || defined( 'WP_INSTALLING' ) ) { + $path = '/'; + return $current_site; + } + + // Still no dice. + if ( 1 == count( $sites ) ) + wp_die( sprintf( /*WP_I18N_BLOG_DOESNT_EXIST*/'Este sitio no existe. Por favor, prueba %s.'/*/WP_I18N_BLOG_DOESNT_EXIST*/, $sites[0]->domain . $sites[0]->path ) ); + else + wp_die( /*WP_I18N_NO_SITE_DEFINED*/'No se ha definido un sitio para este servidor. Si eres el propietario de este sitio, por favor, consulta Arreglando una red de WordPress para tener ayuda.'/*/WP_I18N_NO_SITE_DEFINED*/ ); +} + +/** + * Displays a failure message. + * + * Used when a blog's tables do not exist. Checks for a missing $wpdb->site table as well. + * + * @access private + * @since 3.0.0 + */ +function ms_not_installed() { + global $wpdb, $domain, $path; + + $title = /*WP_I18N_FATAL_ERROR*/'Error estableciendo conexión con la base de datos'/*/WP_I18N_FATAL_ERROR*/; + $msg = '

    ' . $title . '

    '; + if ( ! is_admin() ) + die( $msg ); + $msg .= '

    ' . /*WP_I18N_CONTACT_OWNER*/'Si tu sitio no se muestra contacta con el propietario de esta red.'/*/WP_I18N_CONTACT_OWNER*/ . ''; + $msg .= ' ' . /*WP_I18N_CHECK_MYSQL*/'Si eres el propietario de esta red comprueba que MySQL se está ejecutando adecuadamente y que niguna de las tablas tiene errores.'/*/WP_I18N_CHECK_MYSQL*/ . '

    '; + if ( false && !$wpdb->get_var( "SHOW TABLES LIKE '$wpdb->site'" ) ) + $msg .= '

    ' . sprintf( /*WP_I18N_TABLES_MISSING_LONG*/'Se han perdido las tablas de la base de datos. Esto quiere decir que MySQL no está funcionando, WordPress no ha sido instalado correctamente, o alguien ha eliminado %s. Realmente, debes revisar tu base de datos ahora mismo.'/*/WP_I18N_TABLES_MISSING_LONG*/, $wpdb->site ) . '

    '; + else + $msg .= '

    ' . sprintf( /*WP_I18N_NO_SITE_FOUND*/'No podemos encontrar el sitio %1$s. Buscamos la tabla %2$sen la base de datos %3$s. ¿Es correcto?'/*/WP_I18N_NO_SITE_FOUND*/, rtrim( $domain . $path, '/' ), $wpdb->blogs, DB_NAME ) . '

    '; + $msg .= '

    ' . /*WP_I18N_WHAT_DO_I_DO*/'What do I do now?'/*WP_I18N_WHAT_DO_I_DO*/ . ' '; + $msg .= /*WP_I18N_RTFM*/'Lee la página de errores. Algunas de las guías que hay ahí pueden ayudarte a hacerte una idea sobre qué ha ido mal.'/*/WP_I18N_RTFM*/; + $msg .= ' ' . /*WP_I18N_STUCK*/'Si todavía estás atascado con este mensaje, comprueba que tu base de datos contiene las siguientes tablas:'/*/WP_I18N_STUCK*/ . '

      '; + foreach ( $wpdb->tables('global') as $t => $table ) { + if ( 'sitecategories' == $t ) + continue; + $msg .= '
    • ' . $table . '
    • '; + } + $msg .= '
    '; + + wp_die( $msg, $title ); +} + +?> \ No newline at end of file diff --git a/src/wp-includes/ms-settings.php b/src/wp-includes/ms-settings.php new file mode 100644 index 0000000..6cd2d12 --- /dev/null +++ b/src/wp-includes/ms-settings.php @@ -0,0 +1,136 @@ +wp-config.php. $base está definido como BASE cuando debería ser parecido a / o /sitios/.'/*/WP_I18N_BASE_ERROR*/ ); + +/** Include Multisite initialization functions */ +require( ABSPATH . WPINC . '/ms-load.php' ); +require( ABSPATH . WPINC . '/ms-default-constants.php' ); + +if ( defined( 'SUNRISE' ) ) + include_once( WP_CONTENT_DIR . '/sunrise.php' ); + +/** Check for and define SUBDOMAIN_INSTALL and the deprecated VHOST constant. */ +ms_subdomain_constants(); + +if ( !isset( $current_site ) || !isset( $current_blog ) ) { + + $domain = addslashes( $_SERVER['HTTP_HOST'] ); + if ( false !== strpos( $domain, ':' ) ) { + if ( substr( $domain, -3 ) == ':80' ) { + $domain = substr( $domain, 0, -3 ); + $_SERVER['HTTP_HOST'] = substr( $_SERVER['HTTP_HOST'], 0, -3 ); + } elseif ( substr( $domain, -4 ) == ':443' ) { + $domain = substr( $domain, 0, -4 ); + $_SERVER['HTTP_HOST'] = substr( $_SERVER['HTTP_HOST'], 0, -4 ); + } else { + wp_die( /*WP_I18N_NO_PORT_NUMBER*/'El multisitio sólo funciona sin el número del puerto en la URL.'/*/WP_I18N_NO_PORT_NUMBER*/ ); + } + } + + $domain = rtrim( $domain, '.' ); + $cookie_domain = $domain; + if ( substr( $cookie_domain, 0, 4 ) == 'www.' ) + $cookie_domain = substr( $cookie_domain, 4 ); + + $path = preg_replace( '|([a-z0-9-]+.php.*)|', '', $_SERVER['REQUEST_URI'] ); + $path = str_replace ( '/wp-admin/', '/', $path ); + $path = preg_replace( '|(/[a-z0-9-]+?/).*|', '$1', $path ); + + $current_site = wpmu_current_site(); + if ( ! isset( $current_site->blog_id ) ) + $current_site->blog_id = $wpdb->get_var( $wpdb->prepare( "SELECT blog_id FROM $wpdb->blogs WHERE domain = %s AND path = %s", $current_site->domain, $current_site->path ) ); + + if ( is_subdomain_install() ) { + $current_blog = wp_cache_get( 'current_blog_' . $domain, 'site-options' ); + if ( !$current_blog ) { + $current_blog = get_blog_details( array( 'domain' => $domain ), false ); + if ( $current_blog ) + wp_cache_set( 'current_blog_' . $domain, $current_blog, 'site-options' ); + } + if ( $current_blog && $current_blog->site_id != $current_site->id ) { + $current_site = $wpdb->get_row( $wpdb->prepare( "SELECT * FROM $wpdb->site WHERE id = %d", $current_blog->site_id ) ); + if ( ! isset( $current_site->blog_id ) ) + $current_site->blog_id = $wpdb->get_var( $wpdb->prepare( "SELECT blog_id FROM $wpdb->blogs WHERE domain = %s AND path = %s", $current_site->domain, $current_site->path ) ); + } else + $blogname = substr( $domain, 0, strpos( $domain, '.' ) ); + } else { + $blogname = htmlspecialchars( substr( $_SERVER[ 'REQUEST_URI' ], strlen( $path ) ) ); + if ( false !== strpos( $blogname, '/' ) ) + $blogname = substr( $blogname, 0, strpos( $blogname, '/' ) ); + if ( false !== strpos( $blogname, '?' ) ) + $blogname = substr( $blogname, 0, strpos( $blogname, '?' ) ); + $reserved_blognames = array( 'page', 'comments', 'blog', 'wp-admin', 'wp-includes', 'wp-content', 'files', 'feed' ); + if ( $blogname != '' && ! in_array( $blogname, $reserved_blognames ) && ! is_file( $blogname ) ) + $path .= $blogname . '/'; + $current_blog = wp_cache_get( 'current_blog_' . $domain . $path, 'site-options' ); + if ( ! $current_blog ) { + $current_blog = get_blog_details( array( 'domain' => $domain, 'path' => $path ), false ); + if ( $current_blog ) + wp_cache_set( 'current_blog_' . $domain . $path, $current_blog, 'site-options' ); + } + unset($reserved_blognames); + } + + if ( ! defined( 'WP_INSTALLING' ) && is_subdomain_install() && ! is_object( $current_blog ) ) { + if ( defined( 'NOBLOGREDIRECT' ) ) { + $destination = NOBLOGREDIRECT; + if ( '%siteurl%' == $destination ) + $destination = "http://" . $current_site->domain . $current_site->path; + } else { + $destination = 'http://' . $current_site->domain . $current_site->path . 'wp-signup.php?new=' . str_replace( '.' . $current_site->domain, '', $domain ); + } + header( 'Location: ' . $destination ); + die(); + } + + if ( ! defined( 'WP_INSTALLING' ) ) { + if ( $current_site && ! $current_blog ) { + if ( $current_site->domain != $_SERVER[ 'HTTP_HOST' ] ) { + header( 'Location: http://' . $current_site->domain . $current_site->path ); + exit; + } + $current_blog = get_blog_details( array( 'domain' => $current_site->domain, 'path' => $current_site->path ), false ); + } + if ( ! $current_blog || ! $current_site ) + ms_not_installed(); + } + + $blog_id = $current_blog->blog_id; + $public = $current_blog->public; + + if ( empty( $current_blog->site_id ) ) + $current_blog->site_id = 1; + $site_id = $current_blog->site_id; + + $current_site = get_current_site_name( $current_site ); + + if ( ! $blog_id ) { + if ( defined( 'WP_INSTALLING' ) ) { + $current_blog->blog_id = $blog_id = 1; + } else { + $msg = ! $wpdb->get_var( "SHOW TABLES LIKE '$wpdb->site'" ) ? ' ' . /*WP_I18N_TABLES_MISSING*/'No se encuentran tablas de la base de datos.'/*/WP_I18N_TABLES_MISSING*/ : ''; + wp_die( /*WP_I18N_NO_BLOG*/'No existe ningún sitio en el sistema con este nombre.'/*/WP_I18N_NO_BLOG*/ . $msg ); + } + } +} +$wpdb->set_prefix( $table_prefix, false ); // $table_prefix can be set in sunrise.php +$wpdb->set_blog_id( $current_blog->blog_id, $current_blog->site_id ); +$table_prefix = $wpdb->get_blog_prefix(); + +// need to init cache again after blog_id is set +wp_start_object_cache(); + +// Define upload directory constants +ms_upload_constants(); diff --git a/src/wp-includes/nav-menu-template.php b/src/wp-includes/nav-menu-template.php new file mode 100644 index 0000000..21898ab --- /dev/null +++ b/src/wp-includes/nav-menu-template.php @@ -0,0 +1,489 @@ + 'menu_item_parent', 'id' => 'db_id' ); + + /** + * @see Walker::start_lvl() + * @since 3.0.0 + * + * @param string $output Passed by reference. Used to append additional content. + * @param int $depth Depth of page. Used for padding. + */ + function start_lvl(&$output, $depth) { + $indent = str_repeat("\t", $depth); + $output .= "\n$indent
      \n"; + } + + /** + * @see Walker::end_lvl() + * @since 3.0.0 + * + * @param string $output Passed by reference. Used to append additional content. + * @param int $depth Depth of page. Used for padding. + */ + function end_lvl(&$output, $depth) { + $indent = str_repeat("\t", $depth); + $output .= "$indent
    \n"; + } + + /** + * @see Walker::start_el() + * @since 3.0.0 + * + * @param string $output Passed by reference. Used to append additional content. + * @param object $item Menu item data object. + * @param int $depth Depth of menu item. Used for padding. + * @param int $current_page Menu item ID. + * @param object $args + */ + function start_el(&$output, $item, $depth, $args) { + global $wp_query; + $indent = ( $depth ) ? str_repeat( "\t", $depth ) : ''; + + $class_names = $value = ''; + + $classes = empty( $item->classes ) ? array() : (array) $item->classes; + $classes[] = 'menu-item-' . $item->ID; + + $class_names = join( ' ', apply_filters( 'nav_menu_css_class', array_filter( $classes ), $item, $args ) ); + $class_names = ' class="' . esc_attr( $class_names ) . '"'; + + $id = apply_filters( 'nav_menu_item_id', 'menu-item-'. $item->ID, $item, $args ); + $id = strlen( $id ) ? ' id="' . esc_attr( $id ) . '"' : ''; + + $output .= $indent . ''; + + $attributes = ! empty( $item->attr_title ) ? ' title="' . esc_attr( $item->attr_title ) .'"' : ''; + $attributes .= ! empty( $item->target ) ? ' target="' . esc_attr( $item->target ) .'"' : ''; + $attributes .= ! empty( $item->xfn ) ? ' rel="' . esc_attr( $item->xfn ) .'"' : ''; + $attributes .= ! empty( $item->url ) ? ' href="' . esc_attr( $item->url ) .'"' : ''; + + $item_output = $args->before; + $item_output .= ''; + $item_output .= $args->link_before . apply_filters( 'the_title', $item->title, $item->ID ) . $args->link_after; + $item_output .= ''; + $item_output .= $args->after; + + $output .= apply_filters( 'walker_nav_menu_start_el', $item_output, $item, $depth, $args ); + } + + /** + * @see Walker::end_el() + * @since 3.0.0 + * + * @param string $output Passed by reference. Used to append additional content. + * @param object $item Page data object. Not used. + * @param int $depth Depth of page. Not Used. + */ + function end_el(&$output, $item, $depth) { + $output .= "\n"; + } +} + +/** + * Displays a navigation menu. + * + * Optional $args contents: + * + * menu - The menu that is desired. Accepts (matching in order) id, slug, name. Defaults to blank. + * menu_class - CSS class to use for the ul element which forms the menu. Defaults to 'menu'. + * menu_id - The ID that is applied to the ul element which forms the menu. Defaults to the menu slug, incremented. + * container - Whether to wrap the ul, and what to wrap it with. Defaults to 'div'. + * container_class - the class that is applied to the container. Defaults to 'menu-{menu slug}-container'. + * container_id - The ID that is applied to the container. Defaults to blank. + * fallback_cb - If the menu doesn't exists, a callback function will fire. Defaults to 'wp_page_menu'. Set to false for no fallback. + * before - Text before the link text. + * after - Text after the link text. + * link_before - Text before the link. + * link_after - Text after the link. + * echo - Whether to echo the menu or return it. Defaults to echo. + * depth - how many levels of the hierarchy are to be included. 0 means all. Defaults to 0. + * walker - allows a custom walker to be specified. + * theme_location - the location in the theme to be used. Must be registered with register_nav_menu() in order to be selectable by the user. + * items_wrap - How the list items should be wrapped. Defaults to a ul with an id and class. Uses printf() format with numbered placeholders. + * + * @since 3.0.0 + * + * @param array $args Arguments + */ +function wp_nav_menu( $args = array() ) { + static $menu_id_slugs = array(); + + $defaults = array( 'menu' => '', 'container' => 'div', 'container_class' => '', 'container_id' => '', 'menu_class' => 'menu', 'menu_id' => '', + 'echo' => true, 'fallback_cb' => 'wp_page_menu', 'before' => '', 'after' => '', 'link_before' => '', 'link_after' => '', 'items_wrap' => '
      %3$s
    ', + 'depth' => 0, 'walker' => '', 'theme_location' => '' ); + + $args = wp_parse_args( $args, $defaults ); + $args = apply_filters( 'wp_nav_menu_args', $args ); + $args = (object) $args; + + // Get the nav menu based on the requested menu + $menu = wp_get_nav_menu_object( $args->menu ); + + // Get the nav menu based on the theme_location + if ( ! $menu && $args->theme_location && ( $locations = get_nav_menu_locations() ) && isset( $locations[ $args->theme_location ] ) ) + $menu = wp_get_nav_menu_object( $locations[ $args->theme_location ] ); + + // get the first menu that has items if we still can't find a menu + if ( ! $menu && !$args->theme_location ) { + $menus = wp_get_nav_menus(); + foreach ( $menus as $menu_maybe ) { + if ( $menu_items = wp_get_nav_menu_items($menu_maybe->term_id) ) { + $menu = $menu_maybe; + break; + } + } + } + + // If the menu exists, get its items. + if ( $menu && ! is_wp_error($menu) && !isset($menu_items) ) + $menu_items = wp_get_nav_menu_items( $menu->term_id ); + + // If no menu was found or if the menu has no items and no location was requested, call the fallback_cb if it exists + if ( ( !$menu || is_wp_error($menu) || ( isset($menu_items) && empty($menu_items) && !$args->theme_location ) ) + && $args->fallback_cb && is_callable( $args->fallback_cb ) ) + return call_user_func( $args->fallback_cb, (array) $args ); + + // If no fallback function was specified and the menu doesn't exists, bail. + if ( !$menu || is_wp_error($menu) ) + return false; + + $nav_menu = $items = ''; + + $show_container = false; + if ( $args->container ) { + $allowed_tags = apply_filters( 'wp_nav_menu_container_allowedtags', array( 'div', 'nav' ) ); + if ( in_array( $args->container, $allowed_tags ) ) { + $show_container = true; + $class = $args->container_class ? ' class="' . esc_attr( $args->container_class ) . '"' : ' class="menu-'. $menu->slug .'-container"'; + $id = $args->container_id ? ' id="' . esc_attr( $args->container_id ) . '"' : ''; + $nav_menu .= '<'. $args->container . $id . $class . '>'; + } + } + + // Set up the $menu_item variables + _wp_menu_item_classes_by_context( $menu_items ); + + $sorted_menu_items = array(); + foreach ( (array) $menu_items as $key => $menu_item ) + $sorted_menu_items[$menu_item->menu_order] = $menu_item; + + unset($menu_items); + + $sorted_menu_items = apply_filters( 'wp_nav_menu_objects', $sorted_menu_items, $args ); + + $items .= walk_nav_menu_tree( $sorted_menu_items, $args->depth, $args ); + unset($sorted_menu_items); + + // Attributes + if ( ! empty( $args->menu_id ) ) { + $wrap_id = $args->menu_id; + } else { + $wrap_id = 'menu-' . $menu->slug; + while ( in_array( $wrap_id, $menu_id_slugs ) ) { + if ( preg_match( '#-(\d+)$#', $wrap_id, $matches ) ) + $wrap_id = preg_replace('#-(\d+)$#', '-' . ++$matches[1], $wrap_id ); + else + $wrap_id = $wrap_id . '-1'; + } + } + $menu_id_slugs[] = $wrap_id; + + $wrap_class = $args->menu_class ? $args->menu_class : ''; + + // Allow plugins to hook into the menu to add their own
  • 's + $items = apply_filters( 'wp_nav_menu_items', $items, $args ); + $items = apply_filters( "wp_nav_menu_{$menu->slug}_items", $items, $args ); + + $nav_menu .= sprintf( $args->items_wrap, esc_attr( $wrap_id ), esc_attr( $wrap_class ), $items ); + unset( $items ); + + if ( $show_container ) + $nav_menu .= 'container . '>'; + + $nav_menu = apply_filters( 'wp_nav_menu', $nav_menu, $args ); + + if ( $args->echo ) + echo $nav_menu; + else + return $nav_menu; +} + +/** + * Add the class property classes for the current context, if applicable. + * + * @access private + * @since 3.0 + * + * @param array $menu_items The current menu item objects to which to add the class property information. + */ +function _wp_menu_item_classes_by_context( &$menu_items ) { + global $wp_query; + + $queried_object = $wp_query->get_queried_object(); + $queried_object_id = (int) $wp_query->queried_object_id; + + $active_object = ''; + $active_ancestor_item_ids = array(); + $active_parent_item_ids = array(); + $active_parent_object_ids = array(); + $possible_taxonomy_ancestors = array(); + $possible_object_parents = array(); + $home_page_id = (int) get_option( 'page_for_posts' ); + + if ( $wp_query->is_singular && ! empty( $queried_object->post_type ) && ! is_post_type_hierarchical( $queried_object->post_type ) ) { + foreach ( (array) get_object_taxonomies( $queried_object->post_type ) as $taxonomy ) { + if ( is_taxonomy_hierarchical( $taxonomy ) ) { + $term_hierarchy = _get_term_hierarchy( $taxonomy ); + $terms = wp_get_object_terms( $queried_object_id, $taxonomy, array( 'fields' => 'ids' ) ); + if ( is_array( $terms ) ) { + $possible_object_parents = array_merge( $possible_object_parents, $terms ); + $term_to_ancestor = array(); + foreach ( (array) $term_hierarchy as $anc => $descs ) { + foreach ( (array) $descs as $desc ) + $term_to_ancestor[ $desc ] = $anc; + } + + foreach ( $terms as $desc ) { + do { + $possible_taxonomy_ancestors[ $taxonomy ][] = $desc; + if ( isset( $term_to_ancestor[ $desc ] ) ) { + $_desc = $term_to_ancestor[ $desc ]; + unset( $term_to_ancestor[ $desc ] ); + $desc = $_desc; + } else { + $desc = 0; + } + } while ( ! empty( $desc ) ); + } + } + } + } + } elseif ( ! empty( $queried_object->post_type ) && is_post_type_hierarchical( $queried_object->post_type ) ) { + _get_post_ancestors( $queried_object ); + } elseif ( ! empty( $queried_object->taxonomy ) && is_taxonomy_hierarchical( $queried_object->taxonomy ) ) { + $term_hierarchy = _get_term_hierarchy( $queried_object->taxonomy ); + $term_to_ancestor = array(); + foreach ( (array) $term_hierarchy as $anc => $descs ) { + foreach ( (array) $descs as $desc ) + $term_to_ancestor[ $desc ] = $anc; + } + $desc = $queried_object->term_id; + do { + $possible_taxonomy_ancestors[ $queried_object->taxonomy ][] = $desc; + if ( isset( $term_to_ancestor[ $desc ] ) ) { + $_desc = $term_to_ancestor[ $desc ]; + unset( $term_to_ancestor[ $desc ] ); + $desc = $_desc; + } else { + $desc = 0; + } + } while ( ! empty( $desc ) ); + } + + $possible_object_parents = array_filter( $possible_object_parents ); + + $front_page_url = home_url(); + + foreach ( (array) $menu_items as $key => $menu_item ) { + + $menu_items[$key]->current = false; + + $classes = (array) $menu_item->classes; + $classes[] = 'menu-item'; + $classes[] = 'menu-item-type-' . $menu_item->type; + $classes[] = 'menu-item-object-' . $menu_item->object; + + // if the menu item corresponds to a taxonomy term for the currently-queried non-hierarchical post object + if ( $wp_query->is_singular && 'taxonomy' == $menu_item->type && in_array( $menu_item->object_id, $possible_object_parents ) ) { + $active_parent_object_ids[] = (int) $menu_item->object_id; + $active_parent_item_ids[] = (int) $menu_item->db_id; + $active_object = $queried_object->post_type; + + // if the menu item corresponds to the currently-queried post or taxonomy object + } elseif ( + $menu_item->object_id == $queried_object_id && + ( + ( ! empty( $home_page_id ) && 'post_type' == $menu_item->type && $wp_query->is_home && $home_page_id == $menu_item->object_id ) || + ( 'post_type' == $menu_item->type && $wp_query->is_singular ) || + ( 'taxonomy' == $menu_item->type && ( $wp_query->is_category || $wp_query->is_tag || $wp_query->is_tax ) ) + ) + ) { + $classes[] = 'current-menu-item'; + $menu_items[$key]->current = true; + $_anc_id = (int) $menu_item->db_id; + + while( + ( $_anc_id = get_post_meta( $_anc_id, '_menu_item_menu_item_parent', true ) ) && + ! in_array( $_anc_id, $active_ancestor_item_ids ) + ) { + $active_ancestor_item_ids[] = $_anc_id; + } + + if ( 'post_type' == $menu_item->type && 'page' == $menu_item->object ) { + // Back compat classes for pages to match wp_page_menu() + $classes[] = 'page_item'; + $classes[] = 'page-item-' . $menu_item->object_id; + $classes[] = 'current_page_item'; + } + $active_parent_item_ids[] = (int) $menu_item->menu_item_parent; + $active_parent_object_ids[] = (int) $menu_item->post_parent; + $active_object = $menu_item->object; + + // if the menu item corresponds to the currently-requested URL + } elseif ( 'custom' == $menu_item->object ) { + $current_url = untrailingslashit( ( is_ssl() ? 'https://' : 'http://' ) . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'] ); + $item_url = untrailingslashit( strpos( $menu_item->url, '#' ) ? substr( $menu_item->url, 0, strpos( $menu_item->url, '#' ) ) : $menu_item->url ); + $_indexless_current = untrailingslashit( preg_replace( '/index.php$/', '', $current_url ) ); + + if ( in_array( $item_url, array( $current_url, $_indexless_current ) ) ) { + $classes[] = 'current-menu-item'; + $menu_items[$key]->current = true; + $_anc_id = (int) $menu_item->db_id; + + while( + ( $_anc_id = get_post_meta( $_anc_id, '_menu_item_menu_item_parent', true ) ) && + ! in_array( $_anc_id, $active_ancestor_item_ids ) + ) { + $active_ancestor_item_ids[] = $_anc_id; + } + + if ( in_array( home_url(), array( untrailingslashit( $current_url ), untrailingslashit( $_indexless_current ) ) ) ) { + // Back compat for home link to match wp_page_menu() + $classes[] = 'current_page_item'; + } + $active_parent_item_ids[] = (int) $menu_item->menu_item_parent; + $active_parent_object_ids[] = (int) $menu_item->post_parent; + $active_object = $menu_item->object; + + // give front page item current-menu-item class when extra query arguments involved + } elseif ( $item_url == $front_page_url && is_front_page() ) { + $classes[] = 'current-menu-item'; + } + + if ( untrailingslashit($item_url) == home_url() ) + $classes[] = 'menu-item-home'; + } + + // back-compat with wp_page_menu: add "current_page_parent" to static home page link for any non-page query + if ( ! empty( $home_page_id ) && 'post_type' == $menu_item->type && empty( $wp_query->is_page ) && $home_page_id == $menu_item->object_id ) + $classes[] = 'current_page_parent'; + + $menu_items[$key]->classes = array_unique( $classes ); + } + $active_ancestor_item_ids = array_filter( array_unique( $active_ancestor_item_ids ) ); + $active_parent_item_ids = array_filter( array_unique( $active_parent_item_ids ) ); + $active_parent_object_ids = array_filter( array_unique( $active_parent_object_ids ) ); + + // set parent's class + foreach ( (array) $menu_items as $key => $parent_item ) { + $classes = (array) $parent_item->classes; + $menu_items[$key]->current_item_ancestor = false; + $menu_items[$key]->current_item_parent = false; + + if ( + isset( $parent_item->type ) && + ( + // ancestral post object + ( + 'post_type' == $parent_item->type && + ! empty( $queried_object->post_type ) && + is_post_type_hierarchical( $queried_object->post_type ) && + in_array( $parent_item->object_id, $queried_object->ancestors ) && + $parent_item->object != $queried_object->ID + ) || + + // ancestral term + ( + 'taxonomy' == $parent_item->type && + isset( $possible_taxonomy_ancestors[ $parent_item->object ] ) && + in_array( $parent_item->object_id, $possible_taxonomy_ancestors[ $parent_item->object ] ) && + ( + ! isset( $queried_object->term_id ) || + $parent_item->object_id != $queried_object->term_id + ) + ) + ) + ) { + $classes[] = empty( $queried_object->taxonomy ) ? 'current-' . $queried_object->post_type . '-ancestor' : 'current-' . $queried_object->taxonomy . '-ancestor'; + } + + if ( in_array( intval( $parent_item->db_id ), $active_ancestor_item_ids ) ) { + $classes[] = 'current-menu-ancestor'; + $menu_items[$key]->current_item_ancestor = true; + } + if ( in_array( $parent_item->db_id, $active_parent_item_ids ) ) { + $classes[] = 'current-menu-parent'; + $menu_items[$key]->current_item_parent = true; + } + if ( in_array( $parent_item->object_id, $active_parent_object_ids ) ) + $classes[] = 'current-' . $active_object . '-parent'; + + if ( 'post_type' == $parent_item->type && 'page' == $parent_item->object ) { + // Back compat classes for pages to match wp_page_menu() + if ( in_array('current-menu-parent', $classes) ) + $classes[] = 'current_page_parent'; + if ( in_array('current-menu-ancestor', $classes) ) + $classes[] = 'current_page_ancestor'; + } + + $menu_items[$key]->classes = array_unique( $classes ); + } +} + +/** + * Retrieve the HTML list content for nav menu items. + * + * @uses Walker_Nav_Menu to create HTML list content. + * @since 3.0.0 + * @see Walker::walk() for parameters and return description. + */ +function walk_nav_menu_tree( $items, $depth, $r ) { + $walker = ( empty($r->walker) ) ? new Walker_Nav_Menu : $r->walker; + $args = array( $items, $depth, $r ); + + return call_user_func_array( array(&$walker, 'walk'), $args ); +} + +/** + * Prevents a menu item ID from being used more than once. + * + * @since 3.0.1 + * @access private + */ +function _nav_menu_item_id_use_once( $id, $item ) { + static $_used_ids = array(); + if ( in_array( $item->ID, $_used_ids ) ) + return ''; + $_used_ids[] = $item->ID; + return $id; +} +add_filter( 'nav_menu_item_id', '_nav_menu_item_id_use_once', 10, 2 ); diff --git a/src/wp-includes/nav-menu.php b/src/wp-includes/nav-menu.php new file mode 100644 index 0000000..467d73e --- /dev/null +++ b/src/wp-includes/nav-menu.php @@ -0,0 +1,784 @@ +taxonomy ) && + 'nav_menu' == $menu_obj->taxonomy + ) + return true; + + return false; +} + +/** + * Register navigation menus for a theme. + * + * @since 3.0.0 + * + * @param array $locations Associative array of menu location identifiers (like a slug) and descriptive text. + */ +function register_nav_menus( $locations = array() ) { + global $_wp_registered_nav_menus; + + add_theme_support( 'menus' ); + + $_wp_registered_nav_menus = array_merge( (array) $_wp_registered_nav_menus, $locations ); +} + +/** + * Unregisters a navigation menu for a theme. + * + * @param array $location the menu location identifier + * + * @return bool True on success, false on failure. + */ +function unregister_nav_menu( $location ) { + global $_wp_registered_nav_menus; + + if ( is_array( $_wp_registered_nav_menus ) && isset( $_wp_registered_nav_menus[$location] ) ) { + unset( $_wp_registered_nav_menus[$location] ); + return true; + } + return false; +} + +/** + * Register a navigation menu for a theme. + * + * @since 3.0.0 + * + * @param string $location Menu location identifier, like a slug. + * @param string $description Menu location descriptive text. + */ +function register_nav_menu( $location, $description ) { + register_nav_menus( array( $location => $description ) ); +} +/** + * Returns an array of all registered navigation menus in a theme + * + * @since 3.0.0 + * @return array + */ +function get_registered_nav_menus() { + global $_wp_registered_nav_menus; + if ( isset( $_wp_registered_nav_menus ) ) + return $_wp_registered_nav_menus; + return array(); +} + +/** + * Returns an array with the registered navigation menu locations and the menu assigned to it + * + * @since 3.0.0 + * @return array + */ + +function get_nav_menu_locations() { + return get_theme_mod( 'nav_menu_locations' ); +} + +/** + * Whether a registered nav menu location has a menu assigned to it. + * + * @since 3.0.0 + * @param string $location Menu location identifier. + * @return bool Whether location has a menu. + */ +function has_nav_menu( $location ) { + $locations = get_nav_menu_locations(); + return ( ! empty( $locations[ $location ] ) ); +} + +/** + * Determine whether the given ID is a nav menu item. + * + * @since 3.0.0 + * + * @param int $menu_item_id The ID of the potential nav menu item. + * @return bool Whether the given ID is that of a nav menu item. + */ +function is_nav_menu_item( $menu_item_id = 0 ) { + return ( ! is_wp_error( $menu_item_id ) && ( 'nav_menu_item' == get_post_type( $menu_item_id ) ) ); +} + +/** + * Create a Navigation Menu. + * + * @since 3.0.0 + * + * @param string $menu_name Menu Name + * @return mixed Menu object on success|WP_Error on failure + */ +function wp_create_nav_menu( $menu_name ) { + return wp_update_nav_menu_object( 0, array( 'menu-name' => $menu_name ) ); +} + +/** + * Delete a Navigation Menu. + * + * @since 3.0.0 + * + * @param string $menu name|id|slug + * @return mixed Menu object on success|WP_Error on failure + */ +function wp_delete_nav_menu( $menu ) { + $menu = wp_get_nav_menu_object( $menu ); + if ( ! $menu ) + return false; + + $menu_objects = get_objects_in_term( $menu->term_id, 'nav_menu' ); + if ( ! empty( $menu_objects ) ) { + foreach ( $menu_objects as $item ) { + wp_delete_post( $item ); + } + } + + $result = wp_delete_term( $menu->term_id, 'nav_menu' ); + + if ( $result && !is_wp_error($result) ) + do_action( 'wp_delete_nav_menu', $menu->term_id ); + + return $result; +} + +/** + * Save the properties of a menu or create a new menu with those properties. + * + * @since 3.0.0 + * + * @param int $menu_id The ID of the menu or "0" to create a new menu. + * @param array $menu_data The array of menu data. + * @return int|error object The menu's ID or WP_Error object. + */ +function wp_update_nav_menu_object( $menu_id = 0, $menu_data = array() ) { + $menu_id = (int) $menu_id; + + $_menu = wp_get_nav_menu_object( $menu_id ); + + $args = array( + 'description' => ( isset( $menu_data['description'] ) ? $menu_data['description'] : '' ), + 'name' => ( isset( $menu_data['menu-name'] ) ? $menu_data['menu-name'] : '' ), + 'parent' => ( isset( $menu_data['parent'] ) ? (int) $menu_data['parent'] : 0 ), + 'slug' => null, + ); + + // double-check that we're not going to have one menu take the name of another + $_possible_existing = get_term_by( 'name', $menu_data['menu-name'], 'nav_menu' ); + if ( + $_possible_existing && + ! is_wp_error( $_possible_existing ) && + isset( $_possible_existing->term_id ) && + $_possible_existing->term_id != $menu_id + ) + return new WP_Error( 'menu_exists', sprintf( __('The menu name %s conflicts with another menu name. Please try another.'), esc_html( $menu_data['menu-name'] ) ) ); + + // menu doesn't already exist, so create a new menu + if ( ! $_menu || is_wp_error( $_menu ) ) { + $menu_exists = get_term_by( 'name', $menu_data['menu-name'], 'nav_menu' ); + + if ( $menu_exists ) + return new WP_Error( 'menu_exists', sprintf( __('The menu name %s conflicts with another menu name. Please try another.'), esc_html( $menu_data['menu-name'] ) ) ); + + $_menu = wp_insert_term( $menu_data['menu-name'], 'nav_menu', $args ); + + if ( is_wp_error( $_menu ) ) + return $_menu; + + do_action( 'wp_create_nav_menu', $_menu['term_id'], $menu_data ); + + return (int) $_menu['term_id']; + } + + if ( ! $_menu || ! isset( $_menu->term_id ) ) + return 0; + + $menu_id = (int) $_menu->term_id; + + $update_response = wp_update_term( $menu_id, 'nav_menu', $args ); + + if ( is_wp_error( $update_response ) ) + return $update_response; + + do_action( 'wp_update_nav_menu', $menu_id, $menu_data ); + return $menu_id; +} + +/** + * Save the properties of a menu item or create a new one. + * + * @since 3.0.0 + * + * @param int $menu_id The ID of the menu. Required. If "0", makes the menu item a draft orphan. + * @param int $menu_item_db_id The ID of the menu item. If "0", creates a new menu item. + * @param array $menu_item_data The menu item's data. + * @return int The menu item's database ID or WP_Error object on failure. + */ +function wp_update_nav_menu_item( $menu_id = 0, $menu_item_db_id = 0, $menu_item_data = array() ) { + $menu_id = (int) $menu_id; + $menu_item_db_id = (int) $menu_item_db_id; + + // make sure that we don't convert non-nav_menu_item objects into nav_menu_item objects + if ( ! empty( $menu_item_db_id ) && ! is_nav_menu_item( $menu_item_db_id ) ) + return new WP_Error('update_nav_menu_item_failed', __('The given object ID is not that of a menu item.')); + + $menu = wp_get_nav_menu_object( $menu_id ); + + if ( ( ! $menu && 0 !== $menu_id ) || is_wp_error( $menu ) ) + return $menu; + + $menu_items = 0 == $menu_id ? array() : (array) wp_get_nav_menu_items( $menu_id, array( 'post_status' => 'publish,draft' ) ); + + $count = count( $menu_items ); + + $defaults = array( + 'menu-item-db-id' => $menu_item_db_id, + 'menu-item-object-id' => 0, + 'menu-item-object' => '', + 'menu-item-parent-id' => 0, + 'menu-item-position' => 0, + 'menu-item-type' => 'custom', + 'menu-item-title' => '', + 'menu-item-url' => '', + 'menu-item-description' => '', + 'menu-item-attr-title' => '', + 'menu-item-target' => '', + 'menu-item-classes' => '', + 'menu-item-xfn' => '', + 'menu-item-status' => '', + ); + + $args = wp_parse_args( $menu_item_data, $defaults ); + + if ( 0 == $menu_id ) { + $args['menu-item-position'] = 1; + } elseif ( 0 == (int) $args['menu-item-position'] ) { + $last_item = array_pop( $menu_items ); + $args['menu-item-position'] = ( $last_item && isset( $last_item->menu_order ) ) ? 1 + $last_item->menu_order : $count; + } + + $original_parent = 0 < $menu_item_db_id ? get_post_field( 'post_parent', $menu_item_db_id ) : 0; + + if ( 'custom' != $args['menu-item-type'] ) { + /* if non-custom menu item, then: + * use original object's URL + * blank default title to sync with original object's + */ + + $args['menu-item-url'] = ''; + + $original_title = ''; + if ( 'taxonomy' == $args['menu-item-type'] ) { + $original_parent = get_term_field( 'parent', $args['menu-item-object-id'], $args['menu-item-object'], 'raw' ); + $original_title = get_term_field( 'name', $args['menu-item-object-id'], $args['menu-item-object'], 'raw' ); + } elseif ( 'post_type' == $args['menu-item-type'] ) { + + $original_object = get_post( $args['menu-item-object-id'] ); + $original_parent = (int) $original_object->post_parent; + $original_title = $original_object->post_title; + } + + if ( empty( $args['menu-item-title'] ) || $args['menu-item-title'] == $original_title ) { + $args['menu-item-title'] = ''; + + // hack to get wp to create a post object when too many properties are empty + if ( empty( $args['menu-item-description'] ) ) + $args['menu-item-description'] = ' '; + } + } + + // Populate the menu item object + $post = array( + 'menu_order' => $args['menu-item-position'], + 'ping_status' => 0, + 'post_content' => $args['menu-item-description'], + 'post_excerpt' => $args['menu-item-attr-title'], + 'post_parent' => $original_parent, + 'post_title' => $args['menu-item-title'], + 'post_type' => 'nav_menu_item', + ); + + if ( 0 != $menu_id ) + $post['tax_input'] = array( 'nav_menu' => array( intval( $menu->term_id ) ) ); + + // New menu item. Default is draft status + if ( 0 == $menu_item_db_id ) { + $post['ID'] = 0; + $post['post_status'] = 'publish' == $args['menu-item-status'] ? 'publish' : 'draft'; + $menu_item_db_id = wp_insert_post( $post ); + + // Update existing menu item. Default is publish status + } else { + $post['ID'] = $menu_item_db_id; + $post['post_status'] = 'draft' == $args['menu-item-status'] ? 'draft' : 'publish'; + wp_update_post( $post ); + } + + if ( 'custom' == $args['menu-item-type'] ) { + $args['menu-item-object-id'] = $menu_item_db_id; + $args['menu-item-object'] = 'custom'; + } + + if ( ! $menu_item_db_id || is_wp_error( $menu_item_db_id ) ) + return $menu_item_db_id; + + $menu_item_db_id = (int) $menu_item_db_id; + + update_post_meta( $menu_item_db_id, '_menu_item_type', sanitize_key($args['menu-item-type']) ); + update_post_meta( $menu_item_db_id, '_menu_item_menu_item_parent', (int) $args['menu-item-parent-id'] ); + update_post_meta( $menu_item_db_id, '_menu_item_object_id', (int) $args['menu-item-object-id'] ); + update_post_meta( $menu_item_db_id, '_menu_item_object', sanitize_key($args['menu-item-object']) ); + update_post_meta( $menu_item_db_id, '_menu_item_target', sanitize_key($args['menu-item-target']) ); + + $args['menu-item-classes'] = array_map( 'sanitize_html_class', explode( ' ', $args['menu-item-classes'] ) ); + $args['menu-item-xfn'] = implode( ' ', array_map( 'sanitize_html_class', explode( ' ', $args['menu-item-xfn'] ) ) ); + update_post_meta( $menu_item_db_id, '_menu_item_classes', $args['menu-item-classes'] ); + update_post_meta( $menu_item_db_id, '_menu_item_xfn', $args['menu-item-xfn'] ); + update_post_meta( $menu_item_db_id, '_menu_item_url', esc_url_raw($args['menu-item-url']) ); + + if ( 0 == $menu_id ) + update_post_meta( $menu_item_db_id, '_menu_item_orphaned', time() ); + else + delete_post_meta( $menu_item_db_id, '_menu_item_orphaned' ); + + do_action('wp_update_nav_menu_item', $menu_id, $menu_item_db_id, $args ); + + return $menu_item_db_id; +} + +/** + * Returns all navigation menu objects. + * + * @since 3.0.0 + * + * @param array $args Array of arguments passed on to get_terms(). + * @return array menu objects + */ +function wp_get_nav_menus( $args = array() ) { + $defaults = array( 'hide_empty' => false, 'orderby' => 'none' ); + $args = wp_parse_args( $args, $defaults ); + return apply_filters( 'wp_get_nav_menus', get_terms( 'nav_menu', $args), $args ); +} + +/** + * Sort menu items by the desired key. + * + * @since 3.0.0 + * @access private + * + * @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; + + 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 ); +} + +/** + * Returns if a menu item is valid. Bug #13958 + * + * @since 3.2.0 + * @access private + * + * @param object $menu_item The menu item to check + * @return bool false if invalid, else true. + */ +function _is_valid_nav_menu_item( $item ) { + if ( ! empty( $item->_invalid ) ) + return false; + + return true; +} + +/** + * Returns all menu items of a navigation menu. + * + * @since 3.0.0 + * + * @param string $menu menu name, id, or slug + * @param string $args + * @return mixed $items array of menu items, else false. + */ +function wp_get_nav_menu_items( $menu, $args = array() ) { + global $_wp_using_ext_object_cache; + + $menu = wp_get_nav_menu_object( $menu ); + + if ( ! $menu ) + return false; + + static $fetched = array(); + + $items = get_objects_in_term( $menu->term_id, 'nav_menu' ); + + if ( empty( $items ) ) + return $items; + + $defaults = array( 'order' => 'ASC', 'orderby' => 'menu_order', 'post_type' => 'nav_menu_item', + 'post_status' => 'publish', 'output' => ARRAY_A, 'output_key' => 'menu_order', 'nopaging' => true, + 'update_post_term_cache' => false ); + $args = wp_parse_args( $args, $defaults ); + if ( count( $items ) > 1 ) + $args['include'] = implode( ',', $items ); + else + $args['include'] = $items[0]; + + $items = get_posts( $args ); + + if ( is_wp_error( $items ) || ! is_array( $items ) ) + return false; + + // Get all posts and terms at once to prime the caches + if ( empty( $fetched[$menu->term_id] ) || $_wp_using_ext_object_cache ) { + $fetched[$menu->term_id] = true; + $posts = array(); + $terms = array(); + foreach ( $items as $item ) { + $object_id = get_post_meta( $item->ID, '_menu_item_object_id', true ); + $object = get_post_meta( $item->ID, '_menu_item_object', true ); + $type = get_post_meta( $item->ID, '_menu_item_type', true ); + + if ( 'post_type' == $type ) + $posts[$object][] = $object_id; + elseif ( 'taxonomy' == $type) + $terms[$object][] = $object_id; + } + + if ( ! empty( $posts ) ) { + foreach ( array_keys($posts) as $post_type ) { + get_posts( array('post__in' => $posts[$post_type], 'post_type' => $post_type, 'nopaging' => true, 'update_post_term_cache' => false) ); + } + } + unset($posts); + + if ( ! empty( $terms ) ) { + foreach ( array_keys($terms) as $taxonomy ) { + get_terms($taxonomy, array('include' => $terms[$taxonomy]) ); + } + } + unset($terms); + } + + $items = array_map( 'wp_setup_nav_menu_item', $items ); + + if ( ! is_admin() ) // Remove invalid items only in frontend + $items = array_filter( $items, '_is_valid_nav_menu_item' ); + + if ( ARRAY_A == $args['output'] ) { + $GLOBALS['_menu_item_sort_prop'] = $args['output_key']; + usort($items, '_sort_nav_menu_items'); + $i = 1; + foreach( $items as $k => $item ) { + $items[$k]->$args['output_key'] = $i++; + } + } + + return apply_filters( 'wp_get_nav_menu_items', $items, $menu, $args ); +} + +/** + * Decorates a menu item object with the shared navigation menu item properties. + * + * Properties: + * - db_id: The DB ID of this item as a nav_menu_item object, if it exists (0 if it doesn't exist). + * - object_id: The DB ID of the original object this menu item represents, e.g. ID for posts and term_id for categories. + * - type: The family of objects originally represented, such as "post_type" or "taxonomy." + * - object: The type of object originally represented, such as "category," "post", or "attachment." + * - type_label: The singular label used to describe this type of menu item. + * - post_parent: The DB ID of the original object's parent object, if any (0 otherwise). + * - menu_item_parent: The DB ID of the nav_menu_item that is this item's menu parent, if any. 0 otherwise. + * - url: The URL to which this menu item points. + * - title: The title of this menu item. + * - target: The target attribute of the link element for this menu item. + * - attr_title: The title attribute of the link element for this menu item. + * - classes: The array of class attribute values for the link element of this menu item. + * - xfn: The XFN relationship expressed in the link of this menu item. + * - description: The description of this menu item. + * + * @since 3.0.0 + * + * @param object $menu_item The menu item to modify. + * @return object $menu_item The menu item with standard menu item properties. + */ +function wp_setup_nav_menu_item( $menu_item ) { + if ( isset( $menu_item->post_type ) ) { + if ( 'nav_menu_item' == $menu_item->post_type ) { + $menu_item->db_id = (int) $menu_item->ID; + $menu_item->menu_item_parent = empty( $menu_item->menu_item_parent ) ? get_post_meta( $menu_item->ID, '_menu_item_menu_item_parent', true ) : $menu_item->menu_item_parent; + $menu_item->object_id = empty( $menu_item->object_id ) ? get_post_meta( $menu_item->ID, '_menu_item_object_id', true ) : $menu_item->object_id; + $menu_item->object = empty( $menu_item->object ) ? get_post_meta( $menu_item->ID, '_menu_item_object', true ) : $menu_item->object; + $menu_item->type = empty( $menu_item->type ) ? get_post_meta( $menu_item->ID, '_menu_item_type', true ) : $menu_item->type; + + if ( 'post_type' == $menu_item->type ) { + $object = get_post_type_object( $menu_item->object ); + if ( $object ) { + $menu_item->type_label = $object->labels->singular_name; + } else { + $menu_item->type_label = $menu_item->object; + $menu_item->_invalid = true; + } + + $menu_item->url = get_permalink( $menu_item->object_id ); + + $original_object = get_post( $menu_item->object_id ); + $original_title = $original_object->post_title; + $menu_item->title = '' == $menu_item->post_title ? $original_title : $menu_item->post_title; + + } elseif ( 'taxonomy' == $menu_item->type ) { + $object = get_taxonomy( $menu_item->object ); + if ( $object ) { + $menu_item->type_label = $object->labels->singular_name; + } else { + $menu_item->type_label = $menu_item->object; + $menu_item->_invalid = true; + } + + $term_url = get_term_link( (int) $menu_item->object_id, $menu_item->object ); + $menu_item->url = !is_wp_error( $term_url ) ? $term_url : ''; + + $original_title = get_term_field( 'name', $menu_item->object_id, $menu_item->object, 'raw' ); + if ( is_wp_error( $original_title ) ) + $original_title = false; + $menu_item->title = '' == $menu_item->post_title ? $original_title : $menu_item->post_title; + + } else { + $menu_item->type_label = __('Custom'); + $menu_item->title = $menu_item->post_title; + $menu_item->url = empty( $menu_item->url ) ? get_post_meta( $menu_item->ID, '_menu_item_url', true ) : $menu_item->url; + } + + $menu_item->target = empty( $menu_item->target ) ? get_post_meta( $menu_item->ID, '_menu_item_target', true ) : $menu_item->target; + + $menu_item->attr_title = empty( $menu_item->attr_title ) ? apply_filters( 'nav_menu_attr_title', $menu_item->post_excerpt ) : $menu_item->attr_title; + $menu_item->description = empty( $menu_item->description ) ? apply_filters( 'nav_menu_description', $menu_item->post_content ) : $menu_item->description; + + $menu_item->classes = empty( $menu_item->classes ) ? (array) get_post_meta( $menu_item->ID, '_menu_item_classes', true ) : $menu_item->classes; + $menu_item->xfn = empty( $menu_item->xfn ) ? get_post_meta( $menu_item->ID, '_menu_item_xfn', true ) : $menu_item->xfn; + } else { + $menu_item->db_id = 0; + $menu_item->menu_item_parent = 0; + $menu_item->object_id = (int) $menu_item->ID; + $menu_item->type = 'post_type'; + + $object = get_post_type_object( $menu_item->post_type ); + $menu_item->object = $object->name; + $menu_item->type_label = $object->labels->singular_name; + + $menu_item->title = $menu_item->post_title; + $menu_item->url = get_permalink( $menu_item->ID ); + $menu_item->target = ''; + + $menu_item->attr_title = apply_filters( 'nav_menu_attr_title', $menu_item->post_excerpt ); + $menu_item->description = apply_filters( 'nav_menu_description', $menu_item->post_content ); + $menu_item->classes = array(); + $menu_item->xfn = ''; + } + } elseif ( isset( $menu_item->taxonomy ) ) { + $menu_item->ID = $menu_item->term_id; + $menu_item->db_id = 0; + $menu_item->menu_item_parent = 0; + $menu_item->object_id = (int) $menu_item->term_id; + $menu_item->post_parent = (int) $menu_item->parent; + $menu_item->type = 'taxonomy'; + + $object = get_taxonomy( $menu_item->taxonomy ); + $menu_item->object = $object->name; + $menu_item->type_label = $object->labels->singular_name; + + $menu_item->title = $menu_item->name; + $menu_item->url = get_term_link( $menu_item, $menu_item->taxonomy ); + $menu_item->target = ''; + $menu_item->attr_title = ''; + $menu_item->description = get_term_field( 'description', $menu_item->term_id, $menu_item->taxonomy ); + $menu_item->classes = array(); + $menu_item->xfn = ''; + + } + + return apply_filters( 'wp_setup_nav_menu_item', $menu_item ); +} + +/** + * Get the menu items associated with a particular object. + * + * @since 3.0.0 + * + * @param int $object_id The ID of the original object. + * @param string $object_type The type of object, such as "taxonomy" or "post_type." + * @return array The array of menu item IDs; empty array if none; + */ +function wp_get_associated_nav_menu_items( $object_id = 0, $object_type = 'post_type' ) { + $object_id = (int) $object_id; + $menu_item_ids = array(); + + $query = new WP_Query; + $menu_items = $query->query( + array( + 'meta_key' => '_menu_item_object_id', + 'meta_value' => $object_id, + 'post_status' => 'any', + 'post_type' => 'nav_menu_item', + 'posts_per_page' => -1, + ) + ); + foreach( (array) $menu_items as $menu_item ) { + if ( isset( $menu_item->ID ) && is_nav_menu_item( $menu_item->ID ) ) { + if ( get_post_meta( $menu_item->ID, '_menu_item_type', true ) != $object_type ) + continue; + + $menu_item_ids[] = (int) $menu_item->ID; + } + } + + return array_unique( $menu_item_ids ); +} + +/** + * Callback for handling a menu item when its original object is deleted. + * + * @since 3.0.0 + * @access private + * + * @param int $object_id The ID of the original object being trashed. + * + */ +function _wp_delete_post_menu_item( $object_id = 0 ) { + $object_id = (int) $object_id; + + $menu_item_ids = wp_get_associated_nav_menu_items( $object_id, 'post_type' ); + + foreach( (array) $menu_item_ids as $menu_item_id ) { + wp_delete_post( $menu_item_id, true ); + } +} + +/** + * Callback for handling a menu item when its original object is deleted. + * + * @since 3.0.0 + * @access private + * + * @param int $object_id The ID of the original object being trashed. + * + */ +function _wp_delete_tax_menu_item( $object_id = 0 ) { + $object_id = (int) $object_id; + + $menu_item_ids = wp_get_associated_nav_menu_items( $object_id, 'taxonomy' ); + + foreach( (array) $menu_item_ids as $menu_item_id ) { + wp_delete_post( $menu_item_id, true ); + } +} + +/** + * Automatically add newly published page objects to menus with that as an option. + * + * @since 3.0.0 + * @access private + * + * @param string $new_status The new status of the post object. + * @param string $old_status The old status of the post object. + * @param object $post The post object being transitioned from one status to another. + * @return void + */ +function _wp_auto_add_pages_to_menu( $new_status, $old_status, $post ) { + if ( 'publish' != $new_status || 'publish' == $old_status || 'page' != $post->post_type ) + return; + if ( ! empty( $post->post_parent ) ) + return; + $auto_add = get_option( 'nav_menu_options' ); + if ( empty( $auto_add ) || ! is_array( $auto_add ) || ! isset( $auto_add['auto_add'] ) ) + return; + $auto_add = $auto_add['auto_add']; + if ( empty( $auto_add ) || ! is_array( $auto_add ) ) + return; + + $args = array( + 'menu-item-object-id' => $post->ID, + 'menu-item-object' => $post->post_type, + 'menu-item-type' => 'post_type', + 'menu-item-status' => 'publish', + ); + + foreach ( $auto_add as $menu_id ) { + $items = wp_get_nav_menu_items( $menu_id, array( 'post_status' => 'publish,draft' ) ); + if ( ! is_array( $items ) ) + continue; + foreach ( $items as $item ) { + if ( $post->ID == $item->object_id ) + continue 2; + } + wp_update_nav_menu_item( $menu_id, 0, $args ); + } +} + +?> diff --git a/src/wp-includes/pluggable-deprecated.php b/src/wp-includes/pluggable-deprecated.php new file mode 100644 index 0000000..bb0e4f0 --- /dev/null +++ b/src/wp-includes/pluggable-deprecated.php @@ -0,0 +1,136 @@ +ID, $remember); +} +else : + _deprecated_function( 'wp_setcookie', '2.5', 'wp_set_auth_cookie()' ); +endif; + +if ( !function_exists('wp_clearcookie') ) : +/** + * Clears the authentication cookie, logging the user out. This function is deprecated. + * + * @since 1.5 + * @deprecated 2.5 + * @deprecated Use wp_clear_auth_cookie() + * @see wp_clear_auth_cookie() + */ +function wp_clearcookie() { + _deprecated_function( __FUNCTION__, '2.5', 'wp_clear_auth_cookie()' ); + wp_clear_auth_cookie(); +} +else : + _deprecated_function( 'wp_clearcookie', '2.5', 'wp_clear_auth_cookie()' ); +endif; + +if ( !function_exists('wp_get_cookie_login') ): +/** + * Gets the user cookie login. This function is deprecated. + * + * This function is deprecated and should no longer be extended as it won't be + * used anywhere in WordPress. Also, plugins shouldn't use it either. + * + * @since 2.0.3 + * @deprecated 2.5 + * @deprecated No alternative + * + * @return bool Always returns false + */ +function wp_get_cookie_login() { + _deprecated_function( __FUNCTION__, '2.5' ); + return false; +} +else : + _deprecated_function( 'wp_get_cookie_login', '2.5' ); +endif; + +if ( !function_exists('wp_login') ) : +/** + * Checks a users login information and logs them in if it checks out. This function is deprecated. + * + * Use the global $error to get the reason why the login failed. If the username + * is blank, no error will be set, so assume blank username on that case. + * + * Plugins extending this function should also provide the global $error and set + * what the error is, so that those checking the global for why there was a + * failure can utilize it later. + * + * @since 1.2.2 + * @deprecated Use wp_signon() + * @global string $error Error when false is returned + * + * @param string $username User's username + * @param string $password User's password + * @param bool $deprecated Not used + * @return bool False on login failure, true on successful check + */ +function wp_login($username, $password, $deprecated = '') { + _deprecated_function( __FUNCTION__, '2.5', 'wp_signon()' ); + global $error; + + $user = wp_authenticate($username, $password); + + if ( ! is_wp_error($user) ) + return true; + + $error = $user->get_error_message(); + return false; +} +else : + _deprecated_function( 'wp_login', '2.5', 'wp_signon()' ); +endif; \ No newline at end of file diff --git a/src/wp-includes/pluggable.php b/src/wp-includes/pluggable.php new file mode 100644 index 0000000..3001433 --- /dev/null +++ b/src/wp-includes/pluggable.php @@ -0,0 +1,1811 @@ +ID) ) + return $current_user; + + $current_user = new WP_User($id, $name); + + setup_userdata($current_user->ID); + + do_action('set_current_user'); + + return $current_user; +} +endif; + +if ( !function_exists('wp_get_current_user') ) : +/** + * Retrieve the current user object. + * + * @since 2.0.3 + * + * @return WP_User Current user WP_User object + */ +function wp_get_current_user() { + global $current_user; + + get_currentuserinfo(); + + return $current_user; +} +endif; + +if ( !function_exists('get_currentuserinfo') ) : +/** + * Populate global variables with information about the currently logged in user. + * + * Will set the current user, if the current user is not set. The current user + * will be set to the logged in person. If no user is logged in, then it will + * set the current user to 0, which is invalid and won't have any permissions. + * + * @since 0.71 + * @uses $current_user Checks if the current user is set + * @uses wp_validate_auth_cookie() Retrieves current logged in user. + * + * @return bool|null False on XMLRPC Request and invalid auth cookie. Null when current user set + */ +function get_currentuserinfo() { + global $current_user; + + if ( defined('XMLRPC_REQUEST') && XMLRPC_REQUEST ) + return false; + + if ( ! empty($current_user) ) + return; + + if ( ! $user = wp_validate_auth_cookie() ) { + if ( is_blog_admin() || is_network_admin() || empty($_COOKIE[LOGGED_IN_COOKIE]) || !$user = wp_validate_auth_cookie($_COOKIE[LOGGED_IN_COOKIE], 'logged_in') ) { + wp_set_current_user(0); + return false; + } + } + + wp_set_current_user($user); +} +endif; + +if ( !function_exists('get_userdata') ) : +/** + * Retrieve user info by user ID. + * + * @since 0.71 + * + * @param int $user_id User ID + * @return bool|object False on failure, User DB row object + */ +function get_userdata( $user_id ) { + global $wpdb; + + if ( ! is_numeric( $user_id ) ) + return false; + + $user_id = absint( $user_id ); + if ( ! $user_id ) + return false; + + $user = wp_cache_get( $user_id, 'users' ); + + if ( $user ) + return $user; + + if ( ! $user = $wpdb->get_row( $wpdb->prepare( "SELECT * FROM $wpdb->users WHERE ID = %d LIMIT 1", $user_id ) ) ) + return false; + + _fill_user( $user ); + + return $user; +} +endif; + +if ( !function_exists('cache_users') ) : +/** + * Retrieve info for user lists to prevent multiple queries by get_userdata() + * + * @since 3.0.0 + * + * @param array $users User ID numbers list + */ +function cache_users( $users ) { + global $wpdb; + + $clean = array(); + foreach($users as $id) { + $id = (int) $id; + if (wp_cache_get($id, 'users')) { + // seems to be cached already + } else { + $clean[] = $id; + } + } + + if ( 0 == count($clean) ) + return; + + $list = implode(',', $clean); + + $results = $wpdb->get_results("SELECT * FROM $wpdb->users WHERE ID IN ($list)"); + + _fill_many_users($results); +} +endif; + +if ( !function_exists('get_user_by') ) : +/** + * Retrieve user info by a given field + * + * @since 2.8.0 + * + * @param string $field The field to retrieve the user with. id | slug | email | login + * @param int|string $value A value for $field. A user ID, slug, email address, or login name. + * @return bool|object False on failure, User DB row object + */ +function get_user_by($field, $value) { + global $wpdb; + + switch ($field) { + case 'id': + return get_userdata($value); + break; + case 'slug': + $user_id = wp_cache_get($value, 'userslugs'); + $field = 'user_nicename'; + break; + case 'email': + $user_id = wp_cache_get($value, 'useremail'); + $field = 'user_email'; + break; + case 'login': + $value = sanitize_user( $value ); + $user_id = wp_cache_get($value, 'userlogins'); + $field = 'user_login'; + break; + default: + return false; + } + + if ( false !== $user_id ) + return get_userdata($user_id); + + if ( !$user = $wpdb->get_row( $wpdb->prepare("SELECT * FROM $wpdb->users WHERE $field = %s", $value) ) ) + return false; + + _fill_user($user); + + return $user; +} +endif; + +if ( !function_exists('get_userdatabylogin') ) : +/** + * Retrieve user info by login name. + * + * @since 0.71 + * + * @param string $user_login User's username + * @return bool|object False on failure, User DB row object + */ +function get_userdatabylogin($user_login) { + return get_user_by('login', $user_login); +} +endif; + +if ( !function_exists('get_user_by_email') ) : +/** + * Retrieve user info by email. + * + * @since 2.5 + * + * @param string $email User's email address + * @return bool|object False on failure, User DB row object + */ +function get_user_by_email($email) { + return get_user_by('email', $email); +} +endif; + +if ( !function_exists( 'wp_mail' ) ) : +/** + * Send mail, similar to PHP's mail + * + * A true return value does not automatically mean that the user received the + * email successfully. It just only means that the method used was able to + * process the request without any errors. + * + * Using the two 'wp_mail_from' and 'wp_mail_from_name' hooks allow from + * creating a from address like 'Name ' when both are set. If + * just 'wp_mail_from' is set, then just the email address will be used with no + * name. + * + * The default content type is 'text/plain' which does not allow using HTML. + * However, you can set the content type of the email by using the + * 'wp_mail_content_type' filter. + * + * The default charset is based on the charset used on the blog. The charset can + * be set using the 'wp_mail_charset' filter. + * + * @since 1.2.1 + * @uses apply_filters() Calls 'wp_mail' hook on an array of all of the parameters. + * @uses apply_filters() Calls 'wp_mail_from' hook to get the from email address. + * @uses apply_filters() Calls 'wp_mail_from_name' hook to get the from address name. + * @uses apply_filters() Calls 'wp_mail_content_type' hook to get the email content type. + * @uses apply_filters() Calls 'wp_mail_charset' hook to get the email charset + * @uses do_action_ref_array() Calls 'phpmailer_init' hook on the reference to + * phpmailer object. + * @uses PHPMailer + * @ + * + * @param string|array $to Array or comma-separated list of email addresses to send message. + * @param string $subject Email subject + * @param string $message Message contents + * @param string|array $headers Optional. Additional headers. + * @param string|array $attachments Optional. Files to attach. + * @return bool Whether the email contents were sent successfully. + */ +function wp_mail( $to, $subject, $message, $headers = '', $attachments = array() ) { + // Compact the input, apply the filters, and extract them back out + extract( apply_filters( 'wp_mail', compact( 'to', 'subject', 'message', 'headers', 'attachments' ) ) ); + + if ( !is_array($attachments) ) + $attachments = explode( "\n", str_replace( "\r\n", "\n", $attachments ) ); + + global $phpmailer; + + // (Re)create it, if it's gone missing + if ( !is_object( $phpmailer ) || !is_a( $phpmailer, 'PHPMailer' ) ) { + require_once ABSPATH . WPINC . '/class-phpmailer.php'; + require_once ABSPATH . WPINC . '/class-smtp.php'; + $phpmailer = new PHPMailer( true ); + } + + // Headers + if ( empty( $headers ) ) { + $headers = array(); + } else { + if ( !is_array( $headers ) ) { + // Explode the headers out, so this function can take both + // string headers and an array of headers. + $tempheaders = explode( "\n", str_replace( "\r\n", "\n", $headers ) ); + } else { + $tempheaders = $headers; + } + $headers = array(); + $cc = array(); + $bcc = array(); + + // If it's actually got contents + if ( !empty( $tempheaders ) ) { + // Iterate through the raw headers + foreach ( (array) $tempheaders as $header ) { + if ( strpos($header, ':') === false ) { + if ( false !== stripos( $header, 'boundary=' ) ) { + $parts = preg_split('/boundary=/i', trim( $header ) ); + $boundary = trim( str_replace( array( "'", '"' ), '', $parts[1] ) ); + } + continue; + } + // Explode them out + list( $name, $content ) = explode( ':', trim( $header ), 2 ); + + // Cleanup crew + $name = trim( $name ); + $content = trim( $content ); + + switch ( strtolower( $name ) ) { + // Mainly for legacy -- process a From: header if it's there + case 'from': + if ( strpos($content, '<' ) !== false ) { + // So... making my life hard again? + $from_name = substr( $content, 0, strpos( $content, '<' ) - 1 ); + $from_name = str_replace( '"', '', $from_name ); + $from_name = trim( $from_name ); + + $from_email = substr( $content, strpos( $content, '<' ) + 1 ); + $from_email = str_replace( '>', '', $from_email ); + $from_email = trim( $from_email ); + } else { + $from_email = trim( $content ); + } + break; + case 'content-type': + if ( strpos( $content, ';' ) !== false ) { + list( $type, $charset ) = explode( ';', $content ); + $content_type = trim( $type ); + if ( false !== stripos( $charset, 'charset=' ) ) { + $charset = trim( str_replace( array( 'charset=', '"' ), '', $charset ) ); + } elseif ( false !== stripos( $charset, 'boundary=' ) ) { + $boundary = trim( str_replace( array( 'BOUNDARY=', 'boundary=', '"' ), '', $charset ) ); + $charset = ''; + } + } else { + $content_type = trim( $content ); + } + break; + case 'cc': + $cc = array_merge( (array) $cc, explode( ',', $content ) ); + break; + case 'bcc': + $bcc = array_merge( (array) $bcc, explode( ',', $content ) ); + break; + default: + // Add it to our grand headers array + $headers[trim( $name )] = trim( $content ); + break; + } + } + } + } + + // Empty out the values that may be set + $phpmailer->ClearAddresses(); + $phpmailer->ClearAllRecipients(); + $phpmailer->ClearAttachments(); + $phpmailer->ClearBCCs(); + $phpmailer->ClearCCs(); + $phpmailer->ClearCustomHeaders(); + $phpmailer->ClearReplyTos(); + + // From email and name + // If we don't have a name from the input headers + if ( !isset( $from_name ) ) + $from_name = 'WordPress'; + + /* If we don't have an email from the input headers default to wordpress@$sitename + * Some hosts will block outgoing mail from this address if it doesn't exist but + * there's no easy alternative. Defaulting to admin_email might appear to be another + * option but some hosts may refuse to relay mail from an unknown domain. See + * http://trac.wordpress.org/ticket/5007. + */ + + if ( !isset( $from_email ) ) { + // Get the site domain and get rid of www. + $sitename = strtolower( $_SERVER['SERVER_NAME'] ); + if ( substr( $sitename, 0, 4 ) == 'www.' ) { + $sitename = substr( $sitename, 4 ); + } + + $from_email = 'wordpress@' . $sitename; + } + + // Plugin authors can override the potentially troublesome default + $phpmailer->From = apply_filters( 'wp_mail_from' , $from_email ); + $phpmailer->FromName = apply_filters( 'wp_mail_from_name', $from_name ); + + // Set destination addresses + if ( !is_array( $to ) ) + $to = explode( ',', $to ); + + foreach ( (array) $to as $recipient ) { + try { + // Break $recipient into name and address parts if in the format "Foo " + $recipient_name = ''; + if( preg_match( '/(.+)\s?<(.+)>/', $recipient, $matches ) ) { + if ( count( $matches ) == 3 ) { + $recipient_name = $matches[1]; + $recipient = $matches[2]; + } + } + $phpmailer->AddAddress( trim( $recipient ), $recipient_name); + } catch ( phpmailerException $e ) { + continue; + } + } + + // Set mail's subject and body + $phpmailer->Subject = $subject; + $phpmailer->Body = $message; + + // Add any CC and BCC recipients + if ( !empty( $cc ) ) { + foreach ( (array) $cc as $recipient ) { + try { + // Break $recipient into name and address parts if in the format "Foo " + $recipient_name = ''; + if( preg_match( '/(.+)\s?<(.+)>/', $recipient, $matches ) ) { + if ( count( $matches ) == 3 ) { + $recipient_name = $matches[1]; + $recipient = $matches[2]; + } + } + $phpmailer->AddCc( trim($recipient), $recipient_name ); + } catch ( phpmailerException $e ) { + continue; + } + } + } + + if ( !empty( $bcc ) ) { + foreach ( (array) $bcc as $recipient) { + try { + // Break $recipient into name and address parts if in the format "Foo " + $recipient_name = ''; + if( preg_match( '/(.+)\s?<(.+)>/', $recipient, $matches ) ) { + if ( count( $matches ) == 3 ) { + $recipient_name = $matches[1]; + $recipient = $matches[2]; + } + } + $phpmailer->AddBcc( trim($recipient), $recipient_name ); + } catch ( phpmailerException $e ) { + continue; + } + } + } + + // Set to use PHP's mail() + $phpmailer->IsMail(); + + // Set Content-Type and charset + // If we don't have a content-type from the input headers + if ( !isset( $content_type ) ) + $content_type = 'text/plain'; + + $content_type = apply_filters( 'wp_mail_content_type', $content_type ); + + $phpmailer->ContentType = $content_type; + + // Set whether it's plaintext, depending on $content_type + if ( 'text/html' == $content_type ) + $phpmailer->IsHTML( true ); + + // If we don't have a charset from the input headers + if ( !isset( $charset ) ) + $charset = get_bloginfo( 'charset' ); + + // Set the content-type and charset + $phpmailer->CharSet = apply_filters( 'wp_mail_charset', $charset ); + + // Set custom headers + if ( !empty( $headers ) ) { + foreach( (array) $headers as $name => $content ) { + $phpmailer->AddCustomHeader( sprintf( '%1$s: %2$s', $name, $content ) ); + } + + if ( false !== stripos( $content_type, 'multipart' ) && ! empty($boundary) ) + $phpmailer->AddCustomHeader( sprintf( "Content-Type: %s;\n\t boundary=\"%s\"", $content_type, $boundary ) ); + } + + if ( !empty( $attachments ) ) { + foreach ( $attachments as $attachment ) { + try { + $phpmailer->AddAttachment($attachment); + } catch ( phpmailerException $e ) { + continue; + } + } + } + + do_action_ref_array( 'phpmailer_init', array( &$phpmailer ) ); + + // Send! + try { + $phpmailer->Send(); + } catch ( phpmailerException $e ) { + return false; + } + + return true; +} +endif; + +if ( !function_exists('wp_authenticate') ) : +/** + * Checks a user's login information and logs them in if it checks out. + * + * @since 2.5.0 + * + * @param string $username User's username + * @param string $password User's password + * @return WP_Error|WP_User WP_User object if login successful, otherwise WP_Error object. + */ +function wp_authenticate($username, $password) { + $username = sanitize_user($username); + $password = trim($password); + + $user = apply_filters('authenticate', null, $username, $password); + + if ( $user == null ) { + // TODO what should the error message be? (Or would these even happen?) + // Only needed if all authentication handlers fail to return anything. + $user = new WP_Error('authentication_failed', __('ERROR: Invalid username or incorrect password.')); + } + + $ignore_codes = array('empty_username', 'empty_password'); + + if (is_wp_error($user) && !in_array($user->get_error_code(), $ignore_codes) ) { + do_action('wp_login_failed', $username); + } + + return $user; +} +endif; + +if ( !function_exists('wp_logout') ) : +/** + * Log the current user out. + * + * @since 2.5.0 + */ +function wp_logout() { + wp_clear_auth_cookie(); + do_action('wp_logout'); +} +endif; + +if ( !function_exists('wp_validate_auth_cookie') ) : +/** + * Validates authentication cookie. + * + * The checks include making sure that the authentication cookie is set and + * pulling in the contents (if $cookie is not used). + * + * Makes sure the cookie is not expired. Verifies the hash in cookie is what is + * should be and compares the two. + * + * @since 2.5 + * + * @param string $cookie Optional. If used, will validate contents instead of cookie's + * @param string $scheme Optional. The cookie scheme to use: auth, secure_auth, or logged_in + * @return bool|int False if invalid cookie, User ID if valid. + */ +function wp_validate_auth_cookie($cookie = '', $scheme = '') { + if ( ! $cookie_elements = wp_parse_auth_cookie($cookie, $scheme) ) { + do_action('auth_cookie_malformed', $cookie, $scheme); + return false; + } + + extract($cookie_elements, EXTR_OVERWRITE); + + $expired = $expiration; + + // Allow a grace period for POST and AJAX requests + if ( defined('DOING_AJAX') || 'POST' == $_SERVER['REQUEST_METHOD'] ) + $expired += 3600; + + // Quick check to see if an honest cookie has expired + if ( $expired < time() ) { + do_action('auth_cookie_expired', $cookie_elements); + return false; + } + + $user = get_userdatabylogin($username); + if ( ! $user ) { + do_action('auth_cookie_bad_username', $cookie_elements); + return false; + } + + $pass_frag = substr($user->user_pass, 8, 4); + + $key = wp_hash($username . $pass_frag . '|' . $expiration, $scheme); + $hash = hash_hmac('md5', $username . '|' . $expiration, $key); + + if ( $hmac != $hash ) { + do_action('auth_cookie_bad_hash', $cookie_elements); + return false; + } + + if ( $expiration < time() ) // AJAX/POST grace period set above + $GLOBALS['login_grace_period'] = 1; + + do_action('auth_cookie_valid', $cookie_elements, $user); + + return $user->ID; +} +endif; + +if ( !function_exists('wp_generate_auth_cookie') ) : +/** + * Generate authentication cookie contents. + * + * @since 2.5 + * @uses apply_filters() Calls 'auth_cookie' hook on $cookie contents, User ID + * and expiration of cookie. + * + * @param int $user_id User ID + * @param int $expiration Cookie expiration in seconds + * @param string $scheme Optional. The cookie scheme to use: auth, secure_auth, or logged_in + * @return string Authentication cookie contents + */ +function wp_generate_auth_cookie($user_id, $expiration, $scheme = 'auth') { + $user = get_userdata($user_id); + + $pass_frag = substr($user->user_pass, 8, 4); + + $key = wp_hash($user->user_login . $pass_frag . '|' . $expiration, $scheme); + $hash = hash_hmac('md5', $user->user_login . '|' . $expiration, $key); + + $cookie = $user->user_login . '|' . $expiration . '|' . $hash; + + return apply_filters('auth_cookie', $cookie, $user_id, $expiration, $scheme); +} +endif; + +if ( !function_exists('wp_parse_auth_cookie') ) : +/** + * Parse a cookie into its components + * + * @since 2.7 + * + * @param string $cookie + * @param string $scheme Optional. The cookie scheme to use: auth, secure_auth, or logged_in + * @return array Authentication cookie components + */ +function wp_parse_auth_cookie($cookie = '', $scheme = '') { + if ( empty($cookie) ) { + switch ($scheme){ + case 'auth': + $cookie_name = AUTH_COOKIE; + break; + case 'secure_auth': + $cookie_name = SECURE_AUTH_COOKIE; + break; + case "logged_in": + $cookie_name = LOGGED_IN_COOKIE; + break; + default: + if ( is_ssl() ) { + $cookie_name = SECURE_AUTH_COOKIE; + $scheme = 'secure_auth'; + } else { + $cookie_name = AUTH_COOKIE; + $scheme = 'auth'; + } + } + + if ( empty($_COOKIE[$cookie_name]) ) + return false; + $cookie = $_COOKIE[$cookie_name]; + } + + $cookie_elements = explode('|', $cookie); + if ( count($cookie_elements) != 3 ) + return false; + + list($username, $expiration, $hmac) = $cookie_elements; + + return compact('username', 'expiration', 'hmac', 'scheme'); +} +endif; + +if ( !function_exists('wp_set_auth_cookie') ) : +/** + * Sets the authentication cookies based User ID. + * + * The $remember parameter increases the time that the cookie will be kept. The + * default the cookie is kept without remembering is two days. When $remember is + * set, the cookies will be kept for 14 days or two weeks. + * + * @since 2.5 + * + * @param int $user_id User ID + * @param bool $remember Whether to remember the user + */ +function wp_set_auth_cookie($user_id, $remember = false, $secure = '') { + if ( $remember ) { + $expiration = $expire = time() + apply_filters('auth_cookie_expiration', 1209600, $user_id, $remember); + } else { + $expiration = time() + apply_filters('auth_cookie_expiration', 172800, $user_id, $remember); + $expire = 0; + } + + if ( '' === $secure ) + $secure = is_ssl(); + + $secure = apply_filters('secure_auth_cookie', $secure, $user_id); + $secure_logged_in_cookie = apply_filters('secure_logged_in_cookie', false, $user_id, $secure); + + if ( $secure ) { + $auth_cookie_name = SECURE_AUTH_COOKIE; + $scheme = 'secure_auth'; + } else { + $auth_cookie_name = AUTH_COOKIE; + $scheme = 'auth'; + } + + $auth_cookie = wp_generate_auth_cookie($user_id, $expiration, $scheme); + $logged_in_cookie = wp_generate_auth_cookie($user_id, $expiration, 'logged_in'); + + do_action('set_auth_cookie', $auth_cookie, $expire, $expiration, $user_id, $scheme); + do_action('set_logged_in_cookie', $logged_in_cookie, $expire, $expiration, $user_id, 'logged_in'); + + setcookie($auth_cookie_name, $auth_cookie, $expire, PLUGINS_COOKIE_PATH, COOKIE_DOMAIN, $secure, true); + setcookie($auth_cookie_name, $auth_cookie, $expire, ADMIN_COOKIE_PATH, COOKIE_DOMAIN, $secure, true); + setcookie(LOGGED_IN_COOKIE, $logged_in_cookie, $expire, COOKIEPATH, COOKIE_DOMAIN, $secure_logged_in_cookie, true); + if ( COOKIEPATH != SITECOOKIEPATH ) + setcookie(LOGGED_IN_COOKIE, $logged_in_cookie, $expire, SITECOOKIEPATH, COOKIE_DOMAIN, $secure_logged_in_cookie, true); +} +endif; + +if ( !function_exists('wp_clear_auth_cookie') ) : +/** + * Removes all of the cookies associated with authentication. + * + * @since 2.5 + */ +function wp_clear_auth_cookie() { + do_action('clear_auth_cookie'); + + setcookie(AUTH_COOKIE, ' ', time() - 31536000, ADMIN_COOKIE_PATH, COOKIE_DOMAIN); + setcookie(SECURE_AUTH_COOKIE, ' ', time() - 31536000, ADMIN_COOKIE_PATH, COOKIE_DOMAIN); + setcookie(AUTH_COOKIE, ' ', time() - 31536000, PLUGINS_COOKIE_PATH, COOKIE_DOMAIN); + setcookie(SECURE_AUTH_COOKIE, ' ', time() - 31536000, PLUGINS_COOKIE_PATH, COOKIE_DOMAIN); + setcookie(LOGGED_IN_COOKIE, ' ', time() - 31536000, COOKIEPATH, COOKIE_DOMAIN); + setcookie(LOGGED_IN_COOKIE, ' ', time() - 31536000, SITECOOKIEPATH, COOKIE_DOMAIN); + + // Old cookies + setcookie(AUTH_COOKIE, ' ', time() - 31536000, COOKIEPATH, COOKIE_DOMAIN); + setcookie(AUTH_COOKIE, ' ', time() - 31536000, SITECOOKIEPATH, COOKIE_DOMAIN); + setcookie(SECURE_AUTH_COOKIE, ' ', time() - 31536000, COOKIEPATH, COOKIE_DOMAIN); + setcookie(SECURE_AUTH_COOKIE, ' ', time() - 31536000, SITECOOKIEPATH, COOKIE_DOMAIN); + + // Even older cookies + setcookie(USER_COOKIE, ' ', time() - 31536000, COOKIEPATH, COOKIE_DOMAIN); + setcookie(PASS_COOKIE, ' ', time() - 31536000, COOKIEPATH, COOKIE_DOMAIN); + setcookie(USER_COOKIE, ' ', time() - 31536000, SITECOOKIEPATH, COOKIE_DOMAIN); + setcookie(PASS_COOKIE, ' ', time() - 31536000, SITECOOKIEPATH, COOKIE_DOMAIN); +} +endif; + +if ( !function_exists('is_user_logged_in') ) : +/** + * Checks if the current visitor is a logged in user. + * + * @since 2.0.0 + * + * @return bool True if user is logged in, false if not logged in. + */ +function is_user_logged_in() { + $user = wp_get_current_user(); + + if ( $user->id == 0 ) + return false; + + return true; +} +endif; + +if ( !function_exists('auth_redirect') ) : +/** + * Checks if a user is logged in, if not it redirects them to the login page. + * + * @since 1.5 + */ +function auth_redirect() { + // Checks if a user is logged in, if not redirects them to the login page + + $secure = ( is_ssl() || force_ssl_admin() ); + + $secure = apply_filters('secure_auth_redirect', $secure); + + // If https is required and request is http, redirect + if ( $secure && !is_ssl() && false !== strpos($_SERVER['REQUEST_URI'], 'wp-admin') ) { + if ( 0 === strpos($_SERVER['REQUEST_URI'], 'http') ) { + wp_redirect(preg_replace('|^http://|', 'https://', $_SERVER['REQUEST_URI'])); + exit(); + } else { + wp_redirect('https://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']); + exit(); + } + } + + if ( is_user_admin() ) + $scheme = 'logged_in'; + else + $scheme = apply_filters( 'auth_redirect_scheme', '' ); + + if ( $user_id = wp_validate_auth_cookie( '', $scheme) ) { + do_action('auth_redirect', $user_id); + + // If the user wants ssl but the session is not ssl, redirect. + if ( !$secure && get_user_option('use_ssl', $user_id) && false !== strpos($_SERVER['REQUEST_URI'], 'wp-admin') ) { + if ( 0 === strpos($_SERVER['REQUEST_URI'], 'http') ) { + wp_redirect(preg_replace('|^http://|', 'https://', $_SERVER['REQUEST_URI'])); + exit(); + } else { + wp_redirect('https://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']); + exit(); + } + } + + return; // The cookie is good so we're done + } + + // The cookie is no good so force login + nocache_headers(); + + if ( is_ssl() ) + $proto = 'https://'; + else + $proto = 'http://'; + + $redirect = ( strpos($_SERVER['REQUEST_URI'], '/options.php') && wp_get_referer() ) ? wp_get_referer() : $proto . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']; + + $login_url = wp_login_url($redirect, true); + + wp_redirect($login_url); + exit(); +} +endif; + +if ( !function_exists('check_admin_referer') ) : +/** + * Makes sure that a user was referred from another admin page. + * + * To avoid security exploits. + * + * @since 1.2.0 + * @uses do_action() Calls 'check_admin_referer' on $action. + * + * @param string $action Action nonce + * @param string $query_arg where to look for nonce in $_REQUEST (since 2.5) + */ +function check_admin_referer($action = -1, $query_arg = '_wpnonce') { + if ( -1 == $action ) + _doing_it_wrong( __FUNCTION__, __( 'You should specify a nonce action to be verified by using the first parameter.' ), '3.2' ); + + $adminurl = strtolower(admin_url()); + $referer = strtolower(wp_get_referer()); + $result = isset($_REQUEST[$query_arg]) ? wp_verify_nonce($_REQUEST[$query_arg], $action) : false; + if ( !$result && !(-1 == $action && strpos($referer, $adminurl) === 0) ) { + wp_nonce_ays($action); + die(); + } + do_action('check_admin_referer', $action, $result); + return $result; +}endif; + +if ( !function_exists('check_ajax_referer') ) : +/** + * Verifies the AJAX request to prevent processing requests external of the blog. + * + * @since 2.0.3 + * + * @param string $action Action nonce + * @param string $query_arg where to look for nonce in $_REQUEST (since 2.5) + */ +function check_ajax_referer( $action = -1, $query_arg = false, $die = true ) { + if ( $query_arg ) + $nonce = $_REQUEST[$query_arg]; + else + $nonce = isset($_REQUEST['_ajax_nonce']) ? $_REQUEST['_ajax_nonce'] : $_REQUEST['_wpnonce']; + + $result = wp_verify_nonce( $nonce, $action ); + + if ( $die && false == $result ) + die('-1'); + + do_action('check_ajax_referer', $action, $result); + + return $result; +} +endif; + +if ( !function_exists('wp_redirect') ) : +/** + * Redirects to another page. + * + * @since 1.5.1 + * @uses apply_filters() Calls 'wp_redirect' hook on $location and $status. + * + * @param string $location The path to redirect to + * @param int $status Status code to use + * @return bool False if $location is not set + */ +function wp_redirect($location, $status = 302) { + global $is_IIS; + + $location = apply_filters('wp_redirect', $location, $status); + $status = apply_filters('wp_redirect_status', $status, $location); + + if ( !$location ) // allows the wp_redirect filter to cancel a redirect + return false; + + $location = wp_sanitize_redirect($location); + + if ( !$is_IIS && php_sapi_name() != 'cgi-fcgi' ) + status_header($status); // This causes problems on IIS and some FastCGI setups + + header("Location: $location", true, $status); +} +endif; + +if ( !function_exists('wp_sanitize_redirect') ) : +/** + * Sanitizes a URL for use in a redirect. + * + * @since 2.3 + * + * @return string redirect-sanitized URL + **/ +function wp_sanitize_redirect($location) { + $location = preg_replace('|[^a-z0-9-~+_.?#=&;,/:%!]|i', '', $location); + $location = wp_kses_no_null($location); + + // remove %0d and %0a from location + $strip = array('%0d', '%0a', '%0D', '%0A'); + $location = _deep_replace($strip, $location); + return $location; +} +endif; + +if ( !function_exists('wp_safe_redirect') ) : +/** + * Performs a safe (local) redirect, using wp_redirect(). + * + * Checks whether the $location is using an allowed host, if it has an absolute + * path. A plugin can therefore set or remove allowed host(s) to or from the + * list. + * + * If the host is not allowed, then the redirect is to wp-admin on the siteurl + * instead. This prevents malicious redirects which redirect to another host, + * but only used in a few places. + * + * @since 2.3 + * @uses wp_validate_redirect() To validate the redirect is to an allowed host. + * + * @return void Does not return anything + **/ +function wp_safe_redirect($location, $status = 302) { + + // Need to look at the URL the way it will end up in wp_redirect() + $location = wp_sanitize_redirect($location); + + $location = wp_validate_redirect($location, admin_url()); + + wp_redirect($location, $status); +} +endif; + +if ( !function_exists('wp_validate_redirect') ) : +/** + * Validates a URL for use in a redirect. + * + * Checks whether the $location is using an allowed host, if it has an absolute + * path. A plugin can therefore set or remove allowed host(s) to or from the + * list. + * + * If the host is not allowed, then the redirect is to $default supplied + * + * @since 2.8.1 + * @uses apply_filters() Calls 'allowed_redirect_hosts' on an array containing + * WordPress host string and $location host string. + * + * @param string $location The redirect to validate + * @param string $default The value to return is $location is not allowed + * @return string redirect-sanitized URL + **/ +function wp_validate_redirect($location, $default = '') { + // browsers will assume 'http' is your protocol, and will obey a redirect to a URL starting with '//' + if ( substr($location, 0, 2) == '//' ) + $location = 'http:' . $location; + + // In php 5 parse_url may fail if the URL query part contains http://, bug #38143 + $test = ( $cut = strpos($location, '?') ) ? substr( $location, 0, $cut ) : $location; + + $lp = parse_url($test); + + // Give up if malformed URL + if ( false === $lp ) + return $default; + + // Allow only http and https schemes. No data:, etc. + if ( isset($lp['scheme']) && !('http' == $lp['scheme'] || 'https' == $lp['scheme']) ) + return $default; + + // Reject if scheme is set but host is not. This catches urls like https:host.com for which parse_url does not set the host field. + if ( isset($lp['scheme']) && !isset($lp['host']) ) + return $default; + + $wpp = parse_url(home_url()); + + $allowed_hosts = (array) apply_filters('allowed_redirect_hosts', array($wpp['host']), isset($lp['host']) ? $lp['host'] : ''); + + if ( isset($lp['host']) && ( !in_array($lp['host'], $allowed_hosts) && $lp['host'] != strtolower($wpp['host'])) ) + $location = $default; + + return $location; +} +endif; + +if ( ! function_exists('wp_notify_postauthor') ) : +/** + * Notify an author of a comment/trackback/pingback to one of their posts. + * + * @since 1.0.0 + * + * @param int $comment_id Comment ID + * @param string $comment_type Optional. The comment type either 'comment' (default), 'trackback', or 'pingback' + * @return bool False if user email does not exist. True on completion. + */ +function wp_notify_postauthor( $comment_id, $comment_type = '' ) { + $comment = get_comment( $comment_id ); + $post = get_post( $comment->comment_post_ID ); + $author = get_userdata( $post->post_author ); + + // The comment was left by the author + if ( $comment->user_id == $post->post_author ) + return false; + + // The author moderated a comment on his own post + if ( $post->post_author == get_current_user_id() ) + return false; + + // If there's no email to send the comment to + if ( '' == $author->user_email ) + return false; + + $comment_author_domain = @gethostbyaddr($comment->comment_author_IP); + + // The blogname option is escaped with esc_html on the way into the database in sanitize_option + // we want to reverse this for the plain text arena of emails. + $blogname = wp_specialchars_decode(get_option('blogname'), ENT_QUOTES); + + if ( empty( $comment_type ) ) $comment_type = 'comment'; + + if ('comment' == $comment_type) { + $notify_message = sprintf( __( 'New comment on your post "%s"' ), $post->post_title ) . "\r\n"; + /* translators: 1: comment author, 2: author IP, 3: author domain */ + $notify_message .= sprintf( __('Author : %1$s (IP: %2$s , %3$s)'), $comment->comment_author, $comment->comment_author_IP, $comment_author_domain ) . "\r\n"; + $notify_message .= sprintf( __('E-mail : %s'), $comment->comment_author_email ) . "\r\n"; + $notify_message .= sprintf( __('URL : %s'), $comment->comment_author_url ) . "\r\n"; + $notify_message .= sprintf( __('Whois : http://whois.arin.net/rest/ip/%s'), $comment->comment_author_IP ) . "\r\n"; + $notify_message .= __('Comment: ') . "\r\n" . $comment->comment_content . "\r\n\r\n"; + $notify_message .= __('You can see all comments on this post here: ') . "\r\n"; + /* translators: 1: blog name, 2: post title */ + $subject = sprintf( __('[%1$s] Comment: "%2$s"'), $blogname, $post->post_title ); + } elseif ('trackback' == $comment_type) { + $notify_message = sprintf( __( 'New trackback on your post "%s"' ), $post->post_title ) . "\r\n"; + /* translators: 1: website name, 2: author IP, 3: author domain */ + $notify_message .= sprintf( __('Website: %1$s (IP: %2$s , %3$s)'), $comment->comment_author, $comment->comment_author_IP, $comment_author_domain ) . "\r\n"; + $notify_message .= sprintf( __('URL : %s'), $comment->comment_author_url ) . "\r\n"; + $notify_message .= __('Excerpt: ') . "\r\n" . $comment->comment_content . "\r\n\r\n"; + $notify_message .= __('You can see all trackbacks on this post here: ') . "\r\n"; + /* translators: 1: blog name, 2: post title */ + $subject = sprintf( __('[%1$s] Trackback: "%2$s"'), $blogname, $post->post_title ); + } elseif ('pingback' == $comment_type) { + $notify_message = sprintf( __( 'New pingback on your post "%s"' ), $post->post_title ) . "\r\n"; + /* translators: 1: comment author, 2: author IP, 3: author domain */ + $notify_message .= sprintf( __('Website: %1$s (IP: %2$s , %3$s)'), $comment->comment_author, $comment->comment_author_IP, $comment_author_domain ) . "\r\n"; + $notify_message .= sprintf( __('URL : %s'), $comment->comment_author_url ) . "\r\n"; + $notify_message .= __('Excerpt: ') . "\r\n" . sprintf('[...] %s [...]', $comment->comment_content ) . "\r\n\r\n"; + $notify_message .= __('You can see all pingbacks on this post here: ') . "\r\n"; + /* translators: 1: blog name, 2: post title */ + $subject = sprintf( __('[%1$s] Pingback: "%2$s"'), $blogname, $post->post_title ); + } + $notify_message .= get_permalink($comment->comment_post_ID) . "#comments\r\n\r\n"; + $notify_message .= sprintf( __('Permalink: %s'), get_permalink( $comment->comment_post_ID ) . '#comment-' . $comment_id ) . "\r\n"; + if ( EMPTY_TRASH_DAYS ) + $notify_message .= sprintf( __('Trash it: %s'), admin_url("comment.php?action=trash&c=$comment_id") ) . "\r\n"; + else + $notify_message .= sprintf( __('Delete it: %s'), admin_url("comment.php?action=delete&c=$comment_id") ) . "\r\n"; + $notify_message .= sprintf( __('Spam it: %s'), admin_url("comment.php?action=spam&c=$comment_id") ) . "\r\n"; + + $wp_email = 'wordpress@' . preg_replace('#^www\.#', '', strtolower($_SERVER['SERVER_NAME'])); + + if ( '' == $comment->comment_author ) { + $from = "From: \"$blogname\" <$wp_email>"; + if ( '' != $comment->comment_author_email ) + $reply_to = "Reply-To: $comment->comment_author_email"; + } else { + $from = "From: \"$comment->comment_author\" <$wp_email>"; + if ( '' != $comment->comment_author_email ) + $reply_to = "Reply-To: \"$comment->comment_author_email\" <$comment->comment_author_email>"; + } + + $message_headers = "$from\n" + . "Content-Type: text/plain; charset=\"" . get_option('blog_charset') . "\"\n"; + + if ( isset($reply_to) ) + $message_headers .= $reply_to . "\n"; + + $notify_message = apply_filters('comment_notification_text', $notify_message, $comment_id); + $subject = apply_filters('comment_notification_subject', $subject, $comment_id); + $message_headers = apply_filters('comment_notification_headers', $message_headers, $comment_id); + + @wp_mail( $author->user_email, $subject, $notify_message, $message_headers ); + + return true; +} +endif; + +if ( !function_exists('wp_notify_moderator') ) : +/** + * Notifies the moderator of the blog about a new comment that is awaiting approval. + * + * @since 1.0 + * @uses $wpdb + * + * @param int $comment_id Comment ID + * @return bool Always returns true + */ +function wp_notify_moderator($comment_id) { + global $wpdb; + + if ( 0 == get_option( 'moderation_notify' ) ) + return true; + + $comment = get_comment($comment_id); + $post = get_post($comment->comment_post_ID); + $user = get_userdata( $post->post_author ); + // Send to the administation and to the post author if the author can modify the comment. + $email_to = array( get_option('admin_email') ); + if ( user_can($user->ID, 'edit_comment', $comment_id) && !empty($user->user_email) && ( get_option('admin_email') != $user->user_email) ) + $email_to[] = $user->user_email; + + $comment_author_domain = @gethostbyaddr($comment->comment_author_IP); + $comments_waiting = $wpdb->get_var("SELECT count(comment_ID) FROM $wpdb->comments WHERE comment_approved = '0'"); + + // The blogname option is escaped with esc_html on the way into the database in sanitize_option + // we want to reverse this for the plain text arena of emails. + $blogname = wp_specialchars_decode(get_option('blogname'), ENT_QUOTES); + + switch ($comment->comment_type) + { + case 'trackback': + $notify_message = sprintf( __('A new trackback on the post "%s" is waiting for your approval'), $post->post_title ) . "\r\n"; + $notify_message .= get_permalink($comment->comment_post_ID) . "\r\n\r\n"; + $notify_message .= sprintf( __('Website : %1$s (IP: %2$s , %3$s)'), $comment->comment_author, $comment->comment_author_IP, $comment_author_domain ) . "\r\n"; + $notify_message .= sprintf( __('URL : %s'), $comment->comment_author_url ) . "\r\n"; + $notify_message .= __('Trackback excerpt: ') . "\r\n" . $comment->comment_content . "\r\n\r\n"; + break; + case 'pingback': + $notify_message = sprintf( __('A new pingback on the post "%s" is waiting for your approval'), $post->post_title ) . "\r\n"; + $notify_message .= get_permalink($comment->comment_post_ID) . "\r\n\r\n"; + $notify_message .= sprintf( __('Website : %1$s (IP: %2$s , %3$s)'), $comment->comment_author, $comment->comment_author_IP, $comment_author_domain ) . "\r\n"; + $notify_message .= sprintf( __('URL : %s'), $comment->comment_author_url ) . "\r\n"; + $notify_message .= __('Pingback excerpt: ') . "\r\n" . $comment->comment_content . "\r\n\r\n"; + break; + default: //Comments + $notify_message = sprintf( __('A new comment on the post "%s" is waiting for your approval'), $post->post_title ) . "\r\n"; + $notify_message .= get_permalink($comment->comment_post_ID) . "\r\n\r\n"; + $notify_message .= sprintf( __('Author : %1$s (IP: %2$s , %3$s)'), $comment->comment_author, $comment->comment_author_IP, $comment_author_domain ) . "\r\n"; + $notify_message .= sprintf( __('E-mail : %s'), $comment->comment_author_email ) . "\r\n"; + $notify_message .= sprintf( __('URL : %s'), $comment->comment_author_url ) . "\r\n"; + $notify_message .= sprintf( __('Whois : http://whois.arin.net/rest/ip/%s'), $comment->comment_author_IP ) . "\r\n"; + $notify_message .= __('Comment: ') . "\r\n" . $comment->comment_content . "\r\n\r\n"; + break; + } + + $notify_message .= sprintf( __('Approve it: %s'), admin_url("comment.php?action=approve&c=$comment_id") ) . "\r\n"; + if ( EMPTY_TRASH_DAYS ) + $notify_message .= sprintf( __('Trash it: %s'), admin_url("comment.php?action=trash&c=$comment_id") ) . "\r\n"; + else + $notify_message .= sprintf( __('Delete it: %s'), admin_url("comment.php?action=delete&c=$comment_id") ) . "\r\n"; + $notify_message .= sprintf( __('Spam it: %s'), admin_url("comment.php?action=spam&c=$comment_id") ) . "\r\n"; + + $notify_message .= sprintf( _n('Currently %s comment is waiting for approval. Please visit the moderation panel:', + 'Currently %s comments are waiting for approval. Please visit the moderation panel:', $comments_waiting), number_format_i18n($comments_waiting) ) . "\r\n"; + $notify_message .= admin_url("edit-comments.php?comment_status=moderated") . "\r\n"; + + $subject = sprintf( __('[%1$s] Please moderate: "%2$s"'), $blogname, $post->post_title ); + $message_headers = ''; + + $notify_message = apply_filters('comment_moderation_text', $notify_message, $comment_id); + $subject = apply_filters('comment_moderation_subject', $subject, $comment_id); + $message_headers = apply_filters('comment_moderation_headers', $message_headers); + + foreach ( $email_to as $email ) + @wp_mail($email, $subject, $notify_message, $message_headers); + + return true; +} +endif; + +if ( !function_exists('wp_password_change_notification') ) : +/** + * Notify the blog admin of a user changing password, normally via email. + * + * @since 2.7 + * + * @param object $user User Object + */ +function wp_password_change_notification(&$user) { + // send a copy of password change notification to the admin + // but check to see if it's the admin whose password we're changing, and skip this + if ( $user->user_email != get_option('admin_email') ) { + $message = sprintf(__('Password Lost and Changed for user: %s'), $user->user_login) . "\r\n"; + // The blogname option is escaped with esc_html on the way into the database in sanitize_option + // we want to reverse this for the plain text arena of emails. + $blogname = wp_specialchars_decode(get_option('blogname'), ENT_QUOTES); + wp_mail(get_option('admin_email'), sprintf(__('[%s] Password Lost/Changed'), $blogname), $message); + } +} +endif; + +if ( !function_exists('wp_new_user_notification') ) : +/** + * Notify the blog admin of a new user, normally via email. + * + * @since 2.0 + * + * @param int $user_id User ID + * @param string $plaintext_pass Optional. The user's plaintext password + */ +function wp_new_user_notification($user_id, $plaintext_pass = '') { + $user = new WP_User($user_id); + + $user_login = stripslashes($user->user_login); + $user_email = stripslashes($user->user_email); + + // The blogname option is escaped with esc_html on the way into the database in sanitize_option + // we want to reverse this for the plain text arena of emails. + $blogname = wp_specialchars_decode(get_option('blogname'), ENT_QUOTES); + + $message = sprintf(__('New user registration on your site %s:'), $blogname) . "\r\n\r\n"; + $message .= sprintf(__('Username: %s'), $user_login) . "\r\n\r\n"; + $message .= sprintf(__('E-mail: %s'), $user_email) . "\r\n"; + + @wp_mail(get_option('admin_email'), sprintf(__('[%s] New User Registration'), $blogname), $message); + + if ( empty($plaintext_pass) ) + return; + + $message = sprintf(__('Username: %s'), $user_login) . "\r\n"; + $message .= sprintf(__('Password: %s'), $plaintext_pass) . "\r\n"; + $message .= wp_login_url() . "\r\n"; + + wp_mail($user_email, sprintf(__('[%s] Your username and password'), $blogname), $message); + +} +endif; + +if ( !function_exists('wp_nonce_tick') ) : +/** + * Get the time-dependent variable for nonce creation. + * + * A nonce has a lifespan of two ticks. Nonces in their second tick may be + * updated, e.g. by autosave. + * + * @since 2.5 + * + * @return int + */ +function wp_nonce_tick() { + $nonce_life = apply_filters('nonce_life', 86400); + + return ceil(time() / ( $nonce_life / 2 )); +} +endif; + +if ( !function_exists('wp_verify_nonce') ) : +/** + * Verify that correct nonce was used with time limit. + * + * The user is given an amount of time to use the token, so therefore, since the + * UID and $action remain the same, the independent variable is the time. + * + * @since 2.0.3 + * + * @param string $nonce Nonce that was used in the form to verify + * @param string|int $action Should give context to what is taking place and be the same when nonce was created. + * @return bool Whether the nonce check passed or failed. + */ +function wp_verify_nonce($nonce, $action = -1) { + $user = wp_get_current_user(); + $uid = (int) $user->id; + + $i = wp_nonce_tick(); + + // Nonce generated 0-12 hours ago + if ( substr(wp_hash($i . $action . $uid, 'nonce'), -12, 10) == $nonce ) + return 1; + // Nonce generated 12-24 hours ago + if ( substr(wp_hash(($i - 1) . $action . $uid, 'nonce'), -12, 10) == $nonce ) + return 2; + // Invalid nonce + return false; +} +endif; + +if ( !function_exists('wp_create_nonce') ) : +/** + * Creates a random, one time use token. + * + * @since 2.0.3 + * + * @param string|int $action Scalar value to add context to the nonce. + * @return string The one use form token + */ +function wp_create_nonce($action = -1) { + $user = wp_get_current_user(); + $uid = (int) $user->id; + + $i = wp_nonce_tick(); + + return substr(wp_hash($i . $action . $uid, 'nonce'), -12, 10); +} +endif; + +if ( !function_exists('wp_salt') ) : +/** + * Get salt to add to hashes to help prevent attacks. + * + * The secret key is located in two places: the database in case the secret key + * isn't defined in the second place, which is in the wp-config.php file. If you + * are going to set the secret key, then you must do so in the wp-config.php + * file. + * + * The secret key in the database is randomly generated and will be appended to + * the secret key that is in wp-config.php file in some instances. It is + * important to have the secret key defined or changed in wp-config.php. + * + * If you have installed WordPress 2.5 or later, then you will have the + * SECRET_KEY defined in the wp-config.php already. You will want to change the + * value in it because hackers will know what it is. If you have upgraded to + * WordPress 2.5 or later version from a version before WordPress 2.5, then you + * should add the constant to your wp-config.php file. + * + * Below is an example of how the SECRET_KEY constant is defined with a value. + * You must not copy the below example and paste into your wp-config.php. If you + * need an example, then you can have a + * {@link https://api.wordpress.org/secret-key/1.1/ secret key created} for you. + * + * + * define('SECRET_KEY', 'mAry1HadA15|\/|b17w55w1t3asSn09w'); + * + * + * Salting passwords helps against tools which has stored hashed values of + * common dictionary strings. The added values makes it harder to crack if given + * salt string is not weak. + * + * @since 2.5 + * @link https://api.wordpress.org/secret-key/1.1/ Create a Secret Key for wp-config.php + * + * @param string $scheme Authentication scheme + * @return string Salt value + */ +function wp_salt($scheme = 'auth') { + global $wp_default_secret_key; + $secret_key = ''; + if ( defined('SECRET_KEY') && ('' != SECRET_KEY) && ( $wp_default_secret_key != SECRET_KEY) ) + $secret_key = SECRET_KEY; + + if ( 'auth' == $scheme ) { + if ( defined('AUTH_KEY') && ('' != AUTH_KEY) && ( $wp_default_secret_key != AUTH_KEY) ) + $secret_key = AUTH_KEY; + + if ( defined('AUTH_SALT') && ('' != AUTH_SALT) && ( $wp_default_secret_key != AUTH_SALT) ) { + $salt = AUTH_SALT; + } elseif ( defined('SECRET_SALT') && ('' != SECRET_SALT) && ( $wp_default_secret_key != SECRET_SALT) ) { + $salt = SECRET_SALT; + } else { + $salt = get_site_option('auth_salt'); + if ( empty($salt) ) { + $salt = wp_generate_password( 64, true, true ); + update_site_option('auth_salt', $salt); + } + } + } elseif ( 'secure_auth' == $scheme ) { + if ( defined('SECURE_AUTH_KEY') && ('' != SECURE_AUTH_KEY) && ( $wp_default_secret_key != SECURE_AUTH_KEY) ) + $secret_key = SECURE_AUTH_KEY; + + if ( defined('SECURE_AUTH_SALT') && ('' != SECURE_AUTH_SALT) && ( $wp_default_secret_key != SECURE_AUTH_SALT) ) { + $salt = SECURE_AUTH_SALT; + } else { + $salt = get_site_option('secure_auth_salt'); + if ( empty($salt) ) { + $salt = wp_generate_password( 64, true, true ); + update_site_option('secure_auth_salt', $salt); + } + } + } elseif ( 'logged_in' == $scheme ) { + if ( defined('LOGGED_IN_KEY') && ('' != LOGGED_IN_KEY) && ( $wp_default_secret_key != LOGGED_IN_KEY) ) + $secret_key = LOGGED_IN_KEY; + + if ( defined('LOGGED_IN_SALT') && ('' != LOGGED_IN_SALT) && ( $wp_default_secret_key != LOGGED_IN_SALT) ) { + $salt = LOGGED_IN_SALT; + } else { + $salt = get_site_option('logged_in_salt'); + if ( empty($salt) ) { + $salt = wp_generate_password( 64, true, true ); + update_site_option('logged_in_salt', $salt); + } + } + } elseif ( 'nonce' == $scheme ) { + if ( defined('NONCE_KEY') && ('' != NONCE_KEY) && ( $wp_default_secret_key != NONCE_KEY) ) + $secret_key = NONCE_KEY; + + if ( defined('NONCE_SALT') && ('' != NONCE_SALT) && ( $wp_default_secret_key != NONCE_SALT) ) { + $salt = NONCE_SALT; + } else { + $salt = get_site_option('nonce_salt'); + if ( empty($salt) ) { + $salt = wp_generate_password( 64, true, true ); + update_site_option('nonce_salt', $salt); + } + } + } else { + // ensure each auth scheme has its own unique salt + $salt = hash_hmac('md5', $scheme, $secret_key); + } + + return apply_filters('salt', $secret_key . $salt, $scheme); +} +endif; + +if ( !function_exists('wp_hash') ) : +/** + * Get hash of given string. + * + * @since 2.0.3 + * @uses wp_salt() Get WordPress salt + * + * @param string $data Plain text to hash + * @return string Hash of $data + */ +function wp_hash($data, $scheme = 'auth') { + $salt = wp_salt($scheme); + + return hash_hmac('md5', $data, $salt); +} +endif; + +if ( !function_exists('wp_hash_password') ) : +/** + * Create a hash (encrypt) of a plain text password. + * + * For integration with other applications, this function can be overwritten to + * instead use the other package password checking algorithm. + * + * @since 2.5 + * @global object $wp_hasher PHPass object + * @uses PasswordHash::HashPassword + * + * @param string $password Plain text user password to hash + * @return string The hash string of the password + */ +function wp_hash_password($password) { + global $wp_hasher; + + if ( empty($wp_hasher) ) { + require_once( ABSPATH . 'wp-includes/class-phpass.php'); + // By default, use the portable hash from phpass + $wp_hasher = new PasswordHash(8, TRUE); + } + + return $wp_hasher->HashPassword($password); +} +endif; + +if ( !function_exists('wp_check_password') ) : +/** + * Checks the plaintext password against the encrypted Password. + * + * Maintains compatibility between old version and the new cookie authentication + * protocol using PHPass library. The $hash parameter is the encrypted password + * and the function compares the plain text password when encypted similarly + * against the already encrypted password to see if they match. + * + * For integration with other applications, this function can be overwritten to + * instead use the other package password checking algorithm. + * + * @since 2.5 + * @global object $wp_hasher PHPass object used for checking the password + * against the $hash + $password + * @uses PasswordHash::CheckPassword + * + * @param string $password Plaintext user's password + * @param string $hash Hash of the user's password to check against. + * @return bool False, if the $password does not match the hashed password + */ +function wp_check_password($password, $hash, $user_id = '') { + global $wp_hasher; + + // If the hash is still md5... + if ( strlen($hash) <= 32 ) { + $check = ( $hash == md5($password) ); + if ( $check && $user_id ) { + // Rehash using new hash. + wp_set_password($password, $user_id); + $hash = wp_hash_password($password); + } + + return apply_filters('check_password', $check, $password, $hash, $user_id); + } + + // If the stored hash is longer than an MD5, presume the + // new style phpass portable hash. + if ( empty($wp_hasher) ) { + require_once( ABSPATH . 'wp-includes/class-phpass.php'); + // By default, use the portable hash from phpass + $wp_hasher = new PasswordHash(8, TRUE); + } + + $check = $wp_hasher->CheckPassword($password, $hash); + + return apply_filters('check_password', $check, $password, $hash, $user_id); +} +endif; + +if ( !function_exists('wp_generate_password') ) : +/** + * Generates a random password drawn from the defined set of characters. + * + * @since 2.5 + * + * @param int $length The length of password to generate + * @param bool $special_chars Whether to include standard special characters. Default true. + * @param bool $extra_special_chars Whether to include other special characters. Used when + * generating secret keys and salts. Default false. + * @return string The random password + **/ +function wp_generate_password( $length = 12, $special_chars = true, $extra_special_chars = false ) { + $chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'; + if ( $special_chars ) + $chars .= '!@#$%^&*()'; + if ( $extra_special_chars ) + $chars .= '-_ []{}<>~`+=,.;:/?|'; + + $password = ''; + for ( $i = 0; $i < $length; $i++ ) { + $password .= substr($chars, wp_rand(0, strlen($chars) - 1), 1); + } + + // random_password filter was previously in random_password function which was deprecated + return apply_filters('random_password', $password); +} +endif; + +if ( !function_exists('wp_rand') ) : + /** + * Generates a random number + * + * @since 2.6.2 + * + * @param int $min Lower limit for the generated number (optional, default is 0) + * @param int $max Upper limit for the generated number (optional, default is 4294967295) + * @return int A random number between min and max + */ +function wp_rand( $min = 0, $max = 0 ) { + global $rnd_value; + + // Reset $rnd_value after 14 uses + // 32(md5) + 40(sha1) + 40(sha1) / 8 = 14 random numbers from $rnd_value + if ( strlen($rnd_value) < 8 ) { + if ( defined( 'WP_SETUP_CONFIG' ) ) + static $seed = ''; + else + $seed = get_transient('random_seed'); + $rnd_value = md5( uniqid(microtime() . mt_rand(), true ) . $seed ); + $rnd_value .= sha1($rnd_value); + $rnd_value .= sha1($rnd_value . $seed); + $seed = md5($seed . $rnd_value); + if ( ! defined( 'WP_SETUP_CONFIG' ) ) + set_transient('random_seed', $seed); + } + + // Take the first 8 digits for our value + $value = substr($rnd_value, 0, 8); + + // Strip the first eight, leaving the remainder for the next call to wp_rand(). + $rnd_value = substr($rnd_value, 8); + + $value = abs(hexdec($value)); + + // Reduce the value to be within the min - max range + // 4294967295 = 0xffffffff = max random number + if ( $max != 0 ) + $value = $min + (($max - $min + 1) * ($value / (4294967295 + 1))); + + return abs(intval($value)); +} +endif; + +if ( !function_exists('wp_set_password') ) : +/** + * Updates the user's password with a new encrypted one. + * + * For integration with other applications, this function can be overwritten to + * instead use the other package password checking algorithm. + * + * @since 2.5 + * @uses $wpdb WordPress database object for queries + * @uses wp_hash_password() Used to encrypt the user's password before passing to the database + * + * @param string $password The plaintext new user password + * @param int $user_id User ID + */ +function wp_set_password( $password, $user_id ) { + global $wpdb; + + $hash = wp_hash_password($password); + $wpdb->update($wpdb->users, array('user_pass' => $hash, 'user_activation_key' => ''), array('ID' => $user_id) ); + + wp_cache_delete($user_id, 'users'); +} +endif; + +if ( !function_exists( 'get_avatar' ) ) : +/** + * Retrieve the avatar for a user who provided a user ID or email address. + * + * @since 2.5 + * @param int|string|object $id_or_email A user ID, email address, or comment object + * @param int $size Size of the avatar image + * @param string $default URL to a default image to use if no avatar is available + * @param string $alt Alternate text to use in image tag. Defaults to blank + * @return string tag for the user's avatar +*/ +function get_avatar( $id_or_email, $size = '96', $default = '', $alt = false ) { + if ( ! get_option('show_avatars') ) + return false; + + if ( false === $alt) + $safe_alt = ''; + else + $safe_alt = esc_attr( $alt ); + + if ( !is_numeric($size) ) + $size = '96'; + + $email = ''; + if ( is_numeric($id_or_email) ) { + $id = (int) $id_or_email; + $user = get_userdata($id); + if ( $user ) + $email = $user->user_email; + } elseif ( is_object($id_or_email) ) { + // No avatar for pingbacks or trackbacks + $allowed_comment_types = apply_filters( 'get_avatar_comment_types', array( 'comment' ) ); + if ( ! empty( $id_or_email->comment_type ) && ! in_array( $id_or_email->comment_type, (array) $allowed_comment_types ) ) + return false; + + if ( !empty($id_or_email->user_id) ) { + $id = (int) $id_or_email->user_id; + $user = get_userdata($id); + if ( $user) + $email = $user->user_email; + } elseif ( !empty($id_or_email->comment_author_email) ) { + $email = $id_or_email->comment_author_email; + } + } else { + $email = $id_or_email; + } + + if ( empty($default) ) { + $avatar_default = get_option('avatar_default'); + if ( empty($avatar_default) ) + $default = 'mystery'; + else + $default = $avatar_default; + } + + if ( !empty($email) ) + $email_hash = md5( strtolower( $email ) ); + + if ( is_ssl() ) { + $host = 'https://secure.gravatar.com'; + } else { + if ( !empty($email) ) + $host = sprintf( "http://%d.gravatar.com", ( hexdec( $email_hash[0] ) % 2 ) ); + else + $host = 'http://0.gravatar.com'; + } + + if ( 'mystery' == $default ) + $default = "$host/avatar/ad516503a11cd5ca435acc9bb6523536?s={$size}"; // ad516503a11cd5ca435acc9bb6523536 == md5('unknown@gravatar.com') + elseif ( 'blank' == $default ) + $default = includes_url('images/blank.gif'); + elseif ( !empty($email) && 'gravatar_default' == $default ) + $default = ''; + elseif ( 'gravatar_default' == $default ) + $default = "$host/avatar/s={$size}"; + elseif ( empty($email) ) + $default = "$host/avatar/?d=$default&s={$size}"; + elseif ( strpos($default, 'http://') === 0 ) + $default = add_query_arg( 's', $size, $default ); + + if ( !empty($email) ) { + $out = "$host/avatar/"; + $out .= $email_hash; + $out .= '?s='.$size; + $out .= '&d=' . urlencode( $default ); + + $rating = get_option('avatar_rating'); + if ( !empty( $rating ) ) + $out .= "&r={$rating}"; + + $avatar = "{$safe_alt}"; + } else { + $avatar = "{$safe_alt}"; + } + + return apply_filters('get_avatar', $avatar, $id_or_email, $size, $default, $alt); +} +endif; + +if ( !function_exists( 'wp_text_diff' ) ) : +/** + * Displays a human readable HTML representation of the difference between two strings. + * + * The Diff is available for getting the changes between versions. The output is + * HTML, so the primary use is for displaying the changes. If the two strings + * are equivalent, then an empty string will be returned. + * + * The arguments supported and can be changed are listed below. + * + * 'title' : Default is an empty string. Titles the diff in a manner compatible + * with the output. + * 'title_left' : Default is an empty string. Change the HTML to the left of the + * title. + * 'title_right' : Default is an empty string. Change the HTML to the right of + * the title. + * + * @since 2.6 + * @see wp_parse_args() Used to change defaults to user defined settings. + * @uses Text_Diff + * @uses WP_Text_Diff_Renderer_Table + * + * @param string $left_string "old" (left) version of string + * @param string $right_string "new" (right) version of string + * @param string|array $args Optional. Change 'title', 'title_left', and 'title_right' defaults. + * @return string Empty string if strings are equivalent or HTML with differences. + */ +function wp_text_diff( $left_string, $right_string, $args = null ) { + $defaults = array( 'title' => '', 'title_left' => '', 'title_right' => '' ); + $args = wp_parse_args( $args, $defaults ); + + if ( !class_exists( 'WP_Text_Diff_Renderer_Table' ) ) + require( ABSPATH . WPINC . '/wp-diff.php' ); + + $left_string = normalize_whitespace($left_string); + $right_string = normalize_whitespace($right_string); + + $left_lines = split("\n", $left_string); + $right_lines = split("\n", $right_string); + + $text_diff = new Text_Diff($left_lines, $right_lines); + $renderer = new WP_Text_Diff_Renderer_Table(); + $diff = $renderer->render($text_diff); + + if ( !$diff ) + return ''; + + $r = "\n"; + $r .= ""; + + if ( $args['title'] || $args['title_left'] || $args['title_right'] ) + $r .= ""; + if ( $args['title'] ) + $r .= "\n"; + if ( $args['title_left'] || $args['title_right'] ) { + $r .= "\n"; + $r .= "\t\n"; + $r .= "\t\n"; + $r .= "\n"; + } + if ( $args['title'] || $args['title_left'] || $args['title_right'] ) + $r .= "\n"; + + $r .= "\n$diff\n\n"; + $r .= "
    $args[title]
    $args[title_left]$args[title_right]
    "; + + return $r; +} +endif; diff --git a/src/wp-includes/plugin.php b/src/wp-includes/plugin.php new file mode 100644 index 0000000..945461c --- /dev/null +++ b/src/wp-includes/plugin.php @@ -0,0 +1,788 @@ + + * function example_hook($example) { echo $example; } + * add_filter('example_filter', 'example_hook'); + * + * + * In WordPress 1.5.1+, hooked functions can take extra arguments that are set + * when the matching do_action() or apply_filters() call is run. The + * $accepted_args allow for calling functions only when the number of args + * match. Hooked functions can take extra arguments that are set when the + * matching do_action() or apply_filters() call is run. For example, the action + * comment_id_not_found will pass any functions that hook onto it the ID of the + * requested comment. + * + * Note: the function will return true no matter if the + * function was hooked fails or not. There are no checks for whether the + * function exists beforehand and no checks to whether the $function_to_add + * is even a string. It is up to you to take care and this is done for + * optimization purposes, so everything is as quick as possible. + * + * @package WordPress + * @subpackage Plugin + * @since 0.71 + * @global array $wp_filter Stores all of the filters added in the form of + * wp_filter['tag']['array of priorities']['array of functions serialized']['array of ['array (functions, accepted_args)']'] + * @global array $merged_filters Tracks the tags that need to be merged for later. If the hook is added, it doesn't need to run through that process. + * + * @param string $tag The name of the filter to hook the $function_to_add to. + * @param callback $function_to_add The name of the function to be called when the filter is applied. + * @param int $priority optional. Used to specify the order in which the functions associated with a particular action are executed (default: 10). 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 optional. The number of arguments the function accept (default 1). + * @return boolean true + */ +function add_filter($tag, $function_to_add, $priority = 10, $accepted_args = 1) { + global $wp_filter, $merged_filters; + + $idx = _wp_filter_build_unique_id($tag, $function_to_add, $priority); + $wp_filter[$tag][$priority][$idx] = array('function' => $function_to_add, 'accepted_args' => $accepted_args); + unset( $merged_filters[ $tag ] ); + return true; +} + +/** + * Check if any filter has been registered for a hook. + * + * @package WordPress + * @subpackage Plugin + * @since 2.5 + * @global array $wp_filter Stores all of the filters + * + * @param string $tag The name of the filter hook. + * @param callback $function_to_check optional. If specified, return the priority of that function on this hook or false if not attached. + * @return int|boolean Optionally returns the priority on that hook for the specified function. + */ +function has_filter($tag, $function_to_check = false) { + global $wp_filter; + + $has = !empty($wp_filter[$tag]); + if ( false === $function_to_check || false == $has ) + return $has; + + if ( !$idx = _wp_filter_build_unique_id($tag, $function_to_check, false) ) + return false; + + foreach ( (array) array_keys($wp_filter[$tag]) as $priority ) { + if ( isset($wp_filter[$tag][$priority][$idx]) ) + return $priority; + } + + return false; +} + +/** + * Call the functions added to a filter hook. + * + * The callback functions attached to filter hook $tag are invoked by calling + * this function. This function can be used to create a new filter hook by + * simply calling this function with the name of the new hook specified using + * the $tag parameter. + * + * The function allows for additional arguments to be added and passed to hooks. + * + * function example_hook($string, $arg1, $arg2) + * { + * //Do stuff + * return $string; + * } + * $value = apply_filters('example_filter', 'filter me', 'arg1', 'arg2'); + * + * + * @package WordPress + * @subpackage Plugin + * @since 0.71 + * @global array $wp_filter Stores all of the filters + * @global array $merged_filters Merges the filter hooks using this function. + * @global array $wp_current_filter stores the list of current filters with the current one last + * + * @param string $tag The name of the filter hook. + * @param mixed $value The value on which the filters hooked to $tag are applied on. + * @param mixed $var,... Additional variables passed to the functions hooked to $tag. + * @return mixed The filtered value after all hooked functions are applied to it. + */ +function apply_filters($tag, $value) { + global $wp_filter, $merged_filters, $wp_current_filter; + + $args = array(); + + // Do 'all' actions first + if ( isset($wp_filter['all']) ) { + $wp_current_filter[] = $tag; + $args = func_get_args(); + _wp_call_all_hook($args); + } + + if ( !isset($wp_filter[$tag]) ) { + if ( isset($wp_filter['all']) ) + array_pop($wp_current_filter); + return $value; + } + + if ( !isset($wp_filter['all']) ) + $wp_current_filter[] = $tag; + + // Sort + if ( !isset( $merged_filters[ $tag ] ) ) { + ksort($wp_filter[$tag]); + $merged_filters[ $tag ] = true; + } + + reset( $wp_filter[ $tag ] ); + + if ( empty($args) ) + $args = func_get_args(); + + do { + foreach( (array) current($wp_filter[$tag]) as $the_ ) + if ( !is_null($the_['function']) ){ + $args[1] = $value; + $value = call_user_func_array($the_['function'], array_slice($args, 1, (int) $the_['accepted_args'])); + } + + } while ( next($wp_filter[$tag]) !== false ); + + array_pop( $wp_current_filter ); + + return $value; +} + +/** + * Execute functions hooked on a specific filter hook, specifying arguments in an array. + * + * @see apply_filters() This function is identical, but the arguments passed to the + * functions hooked to $tag are supplied using an array. + * + * @package WordPress + * @subpackage Plugin + * @since 3.0.0 + * @global array $wp_filter Stores all of the filters + * @global array $merged_filters Merges the filter hooks using this function. + * @global array $wp_current_filter stores the list of current filters with the current one last + * + * @param string $tag The name of the filter hook. + * @param array $args The arguments supplied to the functions hooked to $tag + * @return mixed The filtered value after all hooked functions are applied to it. + */ +function apply_filters_ref_array($tag, $args) { + global $wp_filter, $merged_filters, $wp_current_filter; + + // Do 'all' actions first + if ( isset($wp_filter['all']) ) { + $wp_current_filter[] = $tag; + $all_args = func_get_args(); + _wp_call_all_hook($all_args); + } + + if ( !isset($wp_filter[$tag]) ) { + if ( isset($wp_filter['all']) ) + array_pop($wp_current_filter); + return $args[0]; + } + + if ( !isset($wp_filter['all']) ) + $wp_current_filter[] = $tag; + + // Sort + if ( !isset( $merged_filters[ $tag ] ) ) { + ksort($wp_filter[$tag]); + $merged_filters[ $tag ] = true; + } + + reset( $wp_filter[ $tag ] ); + + do { + foreach( (array) current($wp_filter[$tag]) as $the_ ) + if ( !is_null($the_['function']) ) + $args[0] = call_user_func_array($the_['function'], array_slice($args, 0, (int) $the_['accepted_args'])); + + } while ( next($wp_filter[$tag]) !== false ); + + array_pop( $wp_current_filter ); + + return $args[0]; +} + +/** + * Removes a function from a specified filter hook. + * + * This function removes a function attached to a specified filter hook. This + * method can be used to remove default functions attached to a specific filter + * hook and possibly replace them with a substitute. + * + * To remove a hook, the $function_to_remove and $priority arguments must match + * when the hook was added. This goes for both filters and actions. No warning + * will be given on removal failure. + * + * @package WordPress + * @subpackage Plugin + * @since 1.2 + * + * @param string $tag The filter hook to which the function to be removed is hooked. + * @param callback $function_to_remove The name of the function which should be removed. + * @param int $priority optional. The priority of the function (default: 10). + * @param int $accepted_args optional. The number of arguments the function accpets (default: 1). + * @return boolean Whether the function existed before it was removed. + */ +function remove_filter($tag, $function_to_remove, $priority = 10, $accepted_args = 1) { + $function_to_remove = _wp_filter_build_unique_id($tag, $function_to_remove, $priority); + + $r = isset($GLOBALS['wp_filter'][$tag][$priority][$function_to_remove]); + + if ( true === $r) { + unset($GLOBALS['wp_filter'][$tag][$priority][$function_to_remove]); + if ( empty($GLOBALS['wp_filter'][$tag][$priority]) ) + unset($GLOBALS['wp_filter'][$tag][$priority]); + unset($GLOBALS['merged_filters'][$tag]); + } + + return $r; +} + +/** + * Remove all of the hooks from a filter. + * + * @since 2.7 + * + * @param string $tag The filter to remove hooks from. + * @param int $priority The priority number to remove. + * @return bool True when finished. + */ +function remove_all_filters($tag, $priority = false) { + global $wp_filter, $merged_filters; + + if( isset($wp_filter[$tag]) ) { + if( false !== $priority && isset($wp_filter[$tag][$priority]) ) + unset($wp_filter[$tag][$priority]); + else + unset($wp_filter[$tag]); + } + + if( isset($merged_filters[$tag]) ) + unset($merged_filters[$tag]); + + return true; +} + +/** + * Retrieve the name of the current filter or action. + * + * @package WordPress + * @subpackage Plugin + * @since 2.5 + * + * @return string Hook name of the current filter or action. + */ +function current_filter() { + global $wp_current_filter; + return end( $wp_current_filter ); +} + + +/** + * Hooks a function on to a specific action. + * + * Actions are the hooks that the WordPress core launches at specific points + * during execution, or when specific events occur. Plugins can specify that + * one or more of its PHP functions are executed at these points, using the + * Action API. + * + * @uses add_filter() Adds an action. Parameter list and functionality are the same. + * + * @package WordPress + * @subpackage Plugin + * @since 1.2 + * + * @param string $tag The name of the action to which the $function_to_add is hooked. + * @param callback $function_to_add The name of the function you wish to be called. + * @param int $priority optional. Used to specify the order in which the functions associated with a particular action are executed (default: 10). 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 optional. The number of arguments the function accept (default 1). + */ +function add_action($tag, $function_to_add, $priority = 10, $accepted_args = 1) { + return add_filter($tag, $function_to_add, $priority, $accepted_args); +} + + +/** + * Execute functions hooked on a specific action hook. + * + * This function invokes all functions attached to action hook $tag. It is + * possible to create new action hooks by simply calling this function, + * specifying the name of the new hook using the $tag parameter. + * + * You can pass extra arguments to the hooks, much like you can with + * apply_filters(). + * + * @see apply_filters() This function works similar with the exception that + * nothing is returned and only the functions or methods are called. + * + * @package WordPress + * @subpackage Plugin + * @since 1.2 + * @global array $wp_filter Stores all of the filters + * @global array $wp_actions Increments the amount of times action was triggered. + * + * @param string $tag The name of the action to be executed. + * @param mixed $arg,... Optional additional arguments which are passed on to the functions hooked to the action. + * @return null Will return null if $tag does not exist in $wp_filter array + */ +function do_action($tag, $arg = '') { + global $wp_filter, $wp_actions, $merged_filters, $wp_current_filter; + + if ( ! isset($wp_actions) ) + $wp_actions = array(); + + if ( ! isset($wp_actions[$tag]) ) + $wp_actions[$tag] = 1; + else + ++$wp_actions[$tag]; + + // Do 'all' actions first + if ( isset($wp_filter['all']) ) { + $wp_current_filter[] = $tag; + $all_args = func_get_args(); + _wp_call_all_hook($all_args); + } + + if ( !isset($wp_filter[$tag]) ) { + if ( isset($wp_filter['all']) ) + array_pop($wp_current_filter); + return; + } + + if ( !isset($wp_filter['all']) ) + $wp_current_filter[] = $tag; + + $args = array(); + if ( is_array($arg) && 1 == count($arg) && isset($arg[0]) && is_object($arg[0]) ) // array(&$this) + $args[] =& $arg[0]; + else + $args[] = $arg; + for ( $a = 2; $a < func_num_args(); $a++ ) + $args[] = func_get_arg($a); + + // Sort + if ( !isset( $merged_filters[ $tag ] ) ) { + ksort($wp_filter[$tag]); + $merged_filters[ $tag ] = true; + } + + reset( $wp_filter[ $tag ] ); + + do { + foreach ( (array) current($wp_filter[$tag]) as $the_ ) + if ( !is_null($the_['function']) ) + call_user_func_array($the_['function'], array_slice($args, 0, (int) $the_['accepted_args'])); + + } while ( next($wp_filter[$tag]) !== false ); + + array_pop($wp_current_filter); +} + +/** + * Retrieve the number times an action is fired. + * + * @package WordPress + * @subpackage Plugin + * @since 2.1 + * @global array $wp_actions Increments the amount of times action was triggered. + * + * @param string $tag The name of the action hook. + * @return int The number of times action hook $tag is fired + */ +function did_action($tag) { + global $wp_actions; + + if ( ! isset( $wp_actions ) || ! isset( $wp_actions[$tag] ) ) + return 0; + + return $wp_actions[$tag]; +} + +/** + * Execute functions hooked on a specific action hook, specifying arguments in an array. + * + * @see do_action() This function is identical, but the arguments passed to the + * functions hooked to $tag are supplied using an array. + * + * @package WordPress + * @subpackage Plugin + * @since 2.1 + * @global array $wp_filter Stores all of the filters + * @global array $wp_actions Increments the amount of times action was triggered. + * + * @param string $tag The name of the action to be executed. + * @param array $args The arguments supplied to the functions hooked to $tag + * @return null Will return null if $tag does not exist in $wp_filter array + */ +function do_action_ref_array($tag, $args) { + global $wp_filter, $wp_actions, $merged_filters, $wp_current_filter; + + if ( ! isset($wp_actions) ) + $wp_actions = array(); + + if ( ! isset($wp_actions[$tag]) ) + $wp_actions[$tag] = 1; + else + ++$wp_actions[$tag]; + + // Do 'all' actions first + if ( isset($wp_filter['all']) ) { + $wp_current_filter[] = $tag; + $all_args = func_get_args(); + _wp_call_all_hook($all_args); + } + + if ( !isset($wp_filter[$tag]) ) { + if ( isset($wp_filter['all']) ) + array_pop($wp_current_filter); + return; + } + + if ( !isset($wp_filter['all']) ) + $wp_current_filter[] = $tag; + + // Sort + if ( !isset( $merged_filters[ $tag ] ) ) { + ksort($wp_filter[$tag]); + $merged_filters[ $tag ] = true; + } + + reset( $wp_filter[ $tag ] ); + + do { + foreach( (array) current($wp_filter[$tag]) as $the_ ) + if ( !is_null($the_['function']) ) + call_user_func_array($the_['function'], array_slice($args, 0, (int) $the_['accepted_args'])); + + } while ( next($wp_filter[$tag]) !== false ); + + array_pop($wp_current_filter); +} + +/** + * Check if any action has been registered for a hook. + * + * @package WordPress + * @subpackage Plugin + * @since 2.5 + * @see has_filter() has_action() is an alias of has_filter(). + * + * @param string $tag The name of the action hook. + * @param callback $function_to_check optional. If specified, return the priority of that function on this hook or false if not attached. + * @return int|boolean Optionally returns the priority on that hook for the specified function. + */ +function has_action($tag, $function_to_check = false) { + return has_filter($tag, $function_to_check); +} + +/** + * Removes a function from a specified action hook. + * + * This function removes a function attached to a specified action hook. This + * method can be used to remove default functions attached to a specific filter + * hook and possibly replace them with a substitute. + * + * @package WordPress + * @subpackage Plugin + * @since 1.2 + * + * @param string $tag The action hook to which the function to be removed is hooked. + * @param callback $function_to_remove The name of the function which should be removed. + * @param int $priority optional The priority of the function (default: 10). + * @param int $accepted_args optional. The number of arguments the function accpets (default: 1). + * @return boolean Whether the function is removed. + */ +function remove_action($tag, $function_to_remove, $priority = 10, $accepted_args = 1) { + return remove_filter($tag, $function_to_remove, $priority, $accepted_args); +} + +/** + * Remove all of the hooks from an action. + * + * @since 2.7 + * + * @param string $tag The action to remove hooks from. + * @param int $priority The priority number to remove them from. + * @return bool True when finished. + */ +function remove_all_actions($tag, $priority = false) { + return remove_all_filters($tag, $priority); +} + +// +// Functions for handling plugins. +// + +/** + * Gets the basename of a plugin. + * + * This method extracts the name of a plugin from its filename. + * + * @package WordPress + * @subpackage Plugin + * @since 1.5 + * + * @access private + * + * @param string $file The filename of plugin. + * @return string The name of a plugin. + * @uses WP_PLUGIN_DIR + */ +function plugin_basename($file) { + $file = str_replace('\\','/',$file); // sanitize for Win32 installs + $file = preg_replace('|/+|','/', $file); // remove any duplicate slash + $plugin_dir = str_replace('\\','/',WP_PLUGIN_DIR); // sanitize for Win32 installs + $plugin_dir = preg_replace('|/+|','/', $plugin_dir); // remove any duplicate slash + $mu_plugin_dir = str_replace('\\','/',WPMU_PLUGIN_DIR); // sanitize for Win32 installs + $mu_plugin_dir = preg_replace('|/+|','/', $mu_plugin_dir); // remove any duplicate slash + $file = preg_replace('#^' . preg_quote($plugin_dir, '#') . '/|^' . preg_quote($mu_plugin_dir, '#') . '/#','',$file); // get relative path from plugins dir + $file = trim($file, '/'); + return $file; +} + +/** + * Gets the filesystem directory path (with trailing slash) for the plugin __FILE__ passed in + * @package WordPress + * @subpackage Plugin + * @since 2.8 + * + * @param string $file The filename of the plugin (__FILE__) + * @return string the filesystem path of the directory that contains the plugin + */ +function plugin_dir_path( $file ) { + return trailingslashit( dirname( $file ) ); +} + +/** + * Gets the URL directory path (with trailing slash) for the plugin __FILE__ passed in + * @package WordPress + * @subpackage Plugin + * @since 2.8 + * + * @param string $file The filename of the plugin (__FILE__) + * @return string the URL path of the directory that contains the plugin + */ +function plugin_dir_url( $file ) { + return trailingslashit( plugins_url( '', $file ) ); +} + +/** + * Set the activation hook for a plugin. + * + * When a plugin is activated, the action 'activate_PLUGINNAME' hook is + * activated. In the name of this hook, PLUGINNAME is replaced with the name of + * the plugin, including the optional subdirectory. For example, when the plugin + * is located in wp-content/plugin/sampleplugin/sample.php, then the name of + * this hook will become 'activate_sampleplugin/sample.php'. When the plugin + * consists of only one file and is (as by default) located at + * wp-content/plugin/sample.php the name of this hook will be + * 'activate_sample.php'. + * + * @package WordPress + * @subpackage Plugin + * @since 2.0 + * + * @param string $file The filename of the plugin including the path. + * @param callback $function the function hooked to the 'activate_PLUGIN' action. + */ +function register_activation_hook($file, $function) { + $file = plugin_basename($file); + add_action('activate_' . $file, $function); +} + +/** + * Set the deactivation hook for a plugin. + * + * When a plugin is deactivated, the action 'deactivate_PLUGINNAME' hook is + * deactivated. In the name of this hook, PLUGINNAME is replaced with the name + * of the plugin, including the optional subdirectory. For example, when the + * plugin is located in wp-content/plugin/sampleplugin/sample.php, then + * the name of this hook will become 'activate_sampleplugin/sample.php'. + * + * When the plugin consists of only one file and is (as by default) located at + * wp-content/plugin/sample.php the name of this hook will be + * 'activate_sample.php'. + * + * @package WordPress + * @subpackage Plugin + * @since 2.0 + * + * @param string $file The filename of the plugin including the path. + * @param callback $function the function hooked to the 'activate_PLUGIN' action. + */ +function register_deactivation_hook($file, $function) { + $file = plugin_basename($file); + add_action('deactivate_' . $file, $function); +} + +/** + * Set the uninstallation hook for a plugin. + * + * Registers the uninstall hook that will be called when the user clicks on the + * uninstall link that calls for the plugin to uninstall itself. The link won't + * be active unless the plugin hooks into the action. + * + * The plugin should not run arbitrary code outside of functions, when + * registering the uninstall hook. In order to run using the hook, the plugin + * will have to be included, which means that any code laying outside of a + * function will be run during the uninstall process. The plugin should not + * hinder the uninstall process. + * + * If the plugin can not be written without running code within the plugin, then + * the plugin should create a file named 'uninstall.php' in the base plugin + * folder. This file will be called, if it exists, during the uninstall process + * bypassing the uninstall hook. The plugin, when using the 'uninstall.php' + * should always check for the 'WP_UNINSTALL_PLUGIN' constant, before + * executing. + * + * @since 2.7 + * + * @param string $file + * @param callback $callback The callback to run when the hook is called. Must be a static method or function. + */ +function register_uninstall_hook( $file, $callback ) { + if ( is_array( $callback ) && is_object( $callback[0] ) ) { + _doing_it_wrong( __FUNCTION__, __( 'Only a static class method or function can be used in an uninstall hook.' ), '3.1' ); + return; + } + + // The option should not be autoloaded, because it is not needed in most + // cases. Emphasis should be put on using the 'uninstall.php' way of + // uninstalling the plugin. + $uninstallable_plugins = (array) get_option('uninstall_plugins'); + $uninstallable_plugins[plugin_basename($file)] = $callback; + update_option('uninstall_plugins', $uninstallable_plugins); +} + +/** + * Calls the 'all' hook, which will process the functions hooked into it. + * + * The 'all' hook passes all of the arguments or parameters that were used for + * the hook, which this function was called for. + * + * This function is used internally for apply_filters(), do_action(), and + * do_action_ref_array() and is not meant to be used from outside those + * functions. This function does not check for the existence of the all hook, so + * it will fail unless the all hook exists prior to this function call. + * + * @package WordPress + * @subpackage Plugin + * @since 2.5 + * @access private + * + * @uses $wp_filter Used to process all of the functions in the 'all' hook + * + * @param array $args The collected parameters from the hook that was called. + * @param string $hook Optional. The hook name that was used to call the 'all' hook. + */ +function _wp_call_all_hook($args) { + global $wp_filter; + + reset( $wp_filter['all'] ); + do { + foreach( (array) current($wp_filter['all']) as $the_ ) + if ( !is_null($the_['function']) ) + call_user_func_array($the_['function'], $args); + + } while ( next($wp_filter['all']) !== false ); +} + +/** + * Build Unique ID for storage and retrieval. + * + * The old way to serialize the callback caused issues and this function is the + * solution. It works by checking for objects and creating an a new property in + * the class to keep track of the object and new objects of the same class that + * need to be added. + * + * It also allows for the removal of actions and filters for objects after they + * change class properties. It is possible to include the property $wp_filter_id + * in your class and set it to "null" or a number to bypass the workaround. + * However this will prevent you from adding new classes and any new classes + * will overwrite the previous hook by the same class. + * + * Functions and static method callbacks are just returned as strings and + * shouldn't have any speed penalty. + * + * @package WordPress + * @subpackage Plugin + * @access private + * @since 2.2.3 + * @link http://trac.wordpress.org/ticket/3875 + * + * @global array $wp_filter Storage for all of the filters and actions + * @param string $tag Used in counting how many hooks were applied + * @param callback $function Used for creating unique id + * @param int|bool $priority Used in counting how many hooks were applied. If === false and $function is an object reference, we return the unique id only if it already has one, false otherwise. + * @return string|bool Unique ID for usage as array key or false if $priority === false and $function is an object reference, and it does not already have a uniqe id. + */ +function _wp_filter_build_unique_id($tag, $function, $priority) { + global $wp_filter; + static $filter_id_count = 0; + + if ( is_string($function) ) + return $function; + + if ( is_object($function) ) { + // Closures are currently implemented as objects + $function = array( $function, '' ); + } else { + $function = (array) $function; + } + + if (is_object($function[0]) ) { + // Object Class Calling + if ( function_exists('spl_object_hash') ) { + return spl_object_hash($function[0]) . $function[1]; + } else { + $obj_idx = get_class($function[0]).$function[1]; + if ( !isset($function[0]->wp_filter_id) ) { + if ( false === $priority ) + return false; + $obj_idx .= isset($wp_filter[$tag][$priority]) ? count((array)$wp_filter[$tag][$priority]) : $filter_id_count; + $function[0]->wp_filter_id = $filter_id_count; + ++$filter_id_count; + } else { + $obj_idx .= $function[0]->wp_filter_id; + } + + return $obj_idx; + } + } else if ( is_string($function[0]) ) { + // Static Calling + return $function[0].$function[1]; + } +} + +?> diff --git a/src/wp-includes/pomo/entry.php b/src/wp-includes/pomo/entry.php new file mode 100644 index 0000000..07ddfd4 --- /dev/null +++ b/src/wp-includes/pomo/entry.php @@ -0,0 +1,69 @@ + $value) { + $this->$varname = $value; + } + if (isset($args['plural'])) $this->is_plural = true; + if (!is_array($this->translations)) $this->translations = array(); + if (!is_array($this->references)) $this->references = array(); + if (!is_array($this->flags)) $this->flags = array(); + } + + /** + * Generates a unique key for this entry + * + * @return string|bool the key or false if the entry is empty + */ + function key() { + if (is_null($this->singular)) return false; + // prepend context and EOT, like in MO files + return is_null($this->context)? $this->singular : $this->context.chr(4).$this->singular; + } +} +endif; \ No newline at end of file diff --git a/src/wp-includes/pomo/mo.php b/src/wp-includes/pomo/mo.php new file mode 100644 index 0000000..72e0e7b --- /dev/null +++ b/src/wp-includes/pomo/mo.php @@ -0,0 +1,231 @@ +is_resource()) + return false; + return $this->import_from_reader($reader); + } + + function export_to_file($filename) { + $fh = fopen($filename, 'wb'); + if ( !$fh ) return false; + $entries = array_filter($this->entries, create_function('$e', 'return !empty($e->translations);')); + ksort($entries); + $magic = 0x950412de; + $revision = 0; + $total = count($entries) + 1; // all the headers are one entry + $originals_lenghts_addr = 28; + $translations_lenghts_addr = $originals_lenghts_addr + 8 * $total; + $size_of_hash = 0; + $hash_addr = $translations_lenghts_addr + 8 * $total; + $current_addr = $hash_addr; + fwrite($fh, pack('V*', $magic, $revision, $total, $originals_lenghts_addr, + $translations_lenghts_addr, $size_of_hash, $hash_addr)); + fseek($fh, $originals_lenghts_addr); + + // headers' msgid is an empty string + fwrite($fh, pack('VV', 0, $current_addr)); + $current_addr++; + $originals_table = chr(0); + + foreach($entries as $entry) { + $originals_table .= $this->export_original($entry) . chr(0); + $length = strlen($this->export_original($entry)); + fwrite($fh, pack('VV', $length, $current_addr)); + $current_addr += $length + 1; // account for the NULL byte after + } + + $exported_headers = $this->export_headers(); + fwrite($fh, pack('VV', strlen($exported_headers), $current_addr)); + $current_addr += strlen($exported_headers) + 1; + $translations_table = $exported_headers . chr(0); + + foreach($entries as $entry) { + $translations_table .= $this->export_translations($entry) . chr(0); + $length = strlen($this->export_translations($entry)); + fwrite($fh, pack('VV', $length, $current_addr)); + $current_addr += $length + 1; + } + + fwrite($fh, $originals_table); + fwrite($fh, $translations_table); + fclose($fh); + } + + function export_original($entry) { + //TODO: warnings for control characters + $exported = $entry->singular; + if ($entry->is_plural) $exported .= chr(0).$entry->plural; + if (!is_null($entry->context)) $exported = $entry->context . chr(4) . $exported; + return $exported; + } + + function export_translations($entry) { + //TODO: warnings for control characters + return implode(chr(0), $entry->translations); + } + + function export_headers() { + $exported = ''; + foreach($this->headers as $header => $value) { + $exported.= "$header: $value\n"; + } + return $exported; + } + + function get_byteorder($magic) { + // The magic is 0x950412de + + // bug in PHP 5.0.2, see https://savannah.nongnu.org/bugs/?func=detailitem&item_id=10565 + $magic_little = (int) - 1794895138; + $magic_little_64 = (int) 2500072158; + // 0xde120495 + $magic_big = ((int) - 569244523) & 0xFFFFFFFF; + if ($magic_little == $magic || $magic_little_64 == $magic) { + return 'little'; + } else if ($magic_big == $magic) { + return 'big'; + } else { + return false; + } + } + + function import_from_reader($reader) { + $endian_string = MO::get_byteorder($reader->readint32()); + if (false === $endian_string) { + return false; + } + $reader->setEndian($endian_string); + + $endian = ('big' == $endian_string)? 'N' : 'V'; + + $header = $reader->read(24); + if ($reader->strlen($header) != 24) + return false; + + // parse header + $header = unpack("{$endian}revision/{$endian}total/{$endian}originals_lenghts_addr/{$endian}translations_lenghts_addr/{$endian}hash_length/{$endian}hash_addr", $header); + if (!is_array($header)) + return false; + + extract( $header ); + + // support revision 0 of MO format specs, only + if ($revision != 0) + return false; + + // seek to data blocks + $reader->seekto($originals_lenghts_addr); + + // read originals' indices + $originals_lengths_length = $translations_lenghts_addr - $originals_lenghts_addr; + if ( $originals_lengths_length != $total * 8 ) + return false; + + $originals = $reader->read($originals_lengths_length); + if ( $reader->strlen( $originals ) != $originals_lengths_length ) + return false; + + // read translations' indices + $translations_lenghts_length = $hash_addr - $translations_lenghts_addr; + if ( $translations_lenghts_length != $total * 8 ) + return false; + + $translations = $reader->read($translations_lenghts_length); + if ( $reader->strlen( $translations ) != $translations_lenghts_length ) + return false; + + // transform raw data into set of indices + $originals = $reader->str_split( $originals, 8 ); + $translations = $reader->str_split( $translations, 8 ); + + // skip hash table + $strings_addr = $hash_addr + $hash_length * 4; + + $reader->seekto($strings_addr); + + $strings = $reader->read_all(); + $reader->close(); + + for ( $i = 0; $i < $total; $i++ ) { + $o = unpack( "{$endian}length/{$endian}pos", $originals[$i] ); + $t = unpack( "{$endian}length/{$endian}pos", $translations[$i] ); + if ( !$o || !$t ) return false; + + // adjust offset due to reading strings to separate space before + $o['pos'] -= $strings_addr; + $t['pos'] -= $strings_addr; + + $original = $reader->substr( $strings, $o['pos'], $o['length'] ); + $translation = $reader->substr( $strings, $t['pos'], $t['length'] ); + + if ('' === $original) { + $this->set_headers($this->make_headers($translation)); + } else { + $entry = &$this->make_entry($original, $translation); + $this->entries[$entry->key()] = &$entry; + } + } + return true; + } + + /** + * Build a Translation_Entry from original string and translation strings, + * found in a MO file + * + * @static + * @param string $original original string to translate from MO file. Might contain + * 0x04 as context separator or 0x00 as singular/plural separator + * @param string $translation translation string from MO file. Might contain + * 0x00 as a plural translations separator + */ + function &make_entry($original, $translation) { + $entry = new Translation_Entry(); + // look for context + $parts = explode(chr(4), $original); + if (isset($parts[1])) { + $original = $parts[1]; + $entry->context = $parts[0]; + } + // look for plural original + $parts = explode(chr(0), $original); + $entry->singular = $parts[0]; + if (isset($parts[1])) { + $entry->is_plural = true; + $entry->plural = $parts[1]; + } + // plural translations are also separated by \0 + $entry->translations = explode(chr(0), $translation); + return $entry; + } + + function select_plural_form($count) { + return $this->gettext_select_plural_form($count); + } + + function get_plural_forms_count() { + return $this->_nplurals; + } +} +endif; \ No newline at end of file diff --git a/src/wp-includes/pomo/po.php b/src/wp-includes/pomo/po.php new file mode 100644 index 0000000..8e3eb61 --- /dev/null +++ b/src/wp-includes/pomo/po.php @@ -0,0 +1,363 @@ +headers as $header => $value) { + $header_string.= "$header: $value\n"; + } + $poified = PO::poify($header_string); + return rtrim("msgid \"\"\nmsgstr $poified"); + } + + /** + * Exports all entries to PO format + * + * @return string sequence of mgsgid/msgstr PO strings, doesn't containt newline at the end + */ + function export_entries() { + //TODO sorting + return implode("\n\n", array_map(array('PO', 'export_entry'), $this->entries)); + } + + /** + * Exports the whole PO file as a string + * + * @param bool $include_headers whether to include the headers in the export + * @return string ready for inclusion in PO file string for headers and all the enrtries + */ + function export($include_headers = true) { + $res = ''; + if ($include_headers) { + $res .= $this->export_headers(); + $res .= "\n\n"; + } + $res .= $this->export_entries(); + return $res; + } + + /** + * Same as {@link export}, but writes the result to a file + * + * @param string $filename where to write the PO string + * @param bool $include_headers whether to include tje headers in the export + * @return bool true on success, false on error + */ + function export_to_file($filename, $include_headers = true) { + $fh = fopen($filename, 'w'); + if (false === $fh) return false; + $export = $this->export($include_headers); + $res = fwrite($fh, $export); + if (false === $res) return false; + return fclose($fh); + } + + /** + * Formats a string in PO-style + * + * @static + * @param string $string the string to format + * @return string the poified string + */ + function poify($string) { + $quote = '"'; + $slash = '\\'; + $newline = "\n"; + + $replaces = array( + "$slash" => "$slash$slash", + "$quote" => "$slash$quote", + "\t" => '\t', + ); + + $string = str_replace(array_keys($replaces), array_values($replaces), $string); + + $po = $quote.implode("${slash}n$quote$newline$quote", explode($newline, $string)).$quote; + // add empty string on first line for readbility + if (false !== strpos($string, $newline) && + (substr_count($string, $newline) > 1 || !($newline === substr($string, -strlen($newline))))) { + $po = "$quote$quote$newline$po"; + } + // remove empty strings + $po = str_replace("$newline$quote$quote", '', $po); + return $po; + } + + /** + * Gives back the original string from a PO-formatted string + * + * @static + * @param string $string PO-formatted string + * @return string enascaped string + */ + function unpoify($string) { + $escapes = array('t' => "\t", 'n' => "\n", '\\' => '\\'); + $lines = array_map('trim', explode("\n", $string)); + $lines = array_map(array('PO', 'trim_quotes'), $lines); + $unpoified = ''; + $previous_is_backslash = false; + foreach($lines as $line) { + preg_match_all('/./u', $line, $chars); + $chars = $chars[0]; + foreach($chars as $char) { + if (!$previous_is_backslash) { + if ('\\' == $char) + $previous_is_backslash = true; + else + $unpoified .= $char; + } else { + $previous_is_backslash = false; + $unpoified .= isset($escapes[$char])? $escapes[$char] : $char; + } + } + } + return $unpoified; + } + + /** + * Inserts $with in the beginning of every new line of $string and + * returns the modified string + * + * @static + * @param string $string prepend lines in this string + * @param string $with prepend lines with this string + */ + function prepend_each_line($string, $with) { + $php_with = var_export($with, true); + $lines = explode("\n", $string); + // do not prepend the string on the last empty line, artefact by explode + if ("\n" == substr($string, -1)) unset($lines[count($lines) - 1]); + $res = implode("\n", array_map(create_function('$x', "return $php_with.\$x;"), $lines)); + // give back the empty line, we ignored above + if ("\n" == substr($string, -1)) $res .= "\n"; + return $res; + } + + /** + * Prepare a text as a comment -- wraps the lines and prepends # + * and a special character to each line + * + * @access private + * @param string $text the comment text + * @param string $char character to denote a special PO comment, + * like :, default is a space + */ + function comment_block($text, $char=' ') { + $text = wordwrap($text, PO_MAX_LINE_LEN - 3); + return PO::prepend_each_line($text, "#$char "); + } + + /** + * Builds a string from the entry for inclusion in PO file + * + * @static + * @param object &$entry the entry to convert to po string + * @return string|bool PO-style formatted string for the entry or + * false if the entry is empty + */ + function export_entry(&$entry) { + if (is_null($entry->singular)) return false; + $po = array(); + if (!empty($entry->translator_comments)) $po[] = PO::comment_block($entry->translator_comments); + if (!empty($entry->extracted_comments)) $po[] = PO::comment_block($entry->extracted_comments, '.'); + if (!empty($entry->references)) $po[] = PO::comment_block(implode(' ', $entry->references), ':'); + if (!empty($entry->flags)) $po[] = PO::comment_block(implode(", ", $entry->flags), ','); + if (!is_null($entry->context)) $po[] = 'msgctxt '.PO::poify($entry->context); + $po[] = 'msgid '.PO::poify($entry->singular); + if (!$entry->is_plural) { + $translation = empty($entry->translations)? '' : $entry->translations[0]; + $po[] = 'msgstr '.PO::poify($translation); + } else { + $po[] = 'msgid_plural '.PO::poify($entry->plural); + $translations = empty($entry->translations)? array('', '') : $entry->translations; + foreach($translations as $i => $translation) { + $po[] = "msgstr[$i] ".PO::poify($translation); + } + } + return implode("\n", $po); + } + + function import_from_file($filename) { + $f = fopen($filename, 'r'); + if (!$f) return false; + $lineno = 0; + while (true) { + $res = $this->read_entry($f, $lineno); + if (!$res) break; + if ($res['entry']->singular == '') { + $this->set_headers($this->make_headers($res['entry']->translations[0])); + } else { + $this->add_entry($res['entry']); + } + } + PO::read_line($f, 'clear'); + return $res !== false; + } + + function read_entry($f, $lineno = 0) { + $entry = new Translation_Entry(); + // where were we in the last step + // can be: comment, msgctxt, msgid, msgid_plural, msgstr, msgstr_plural + $context = ''; + $msgstr_index = 0; + $is_final = create_function('$context', 'return $context == "msgstr" || $context == "msgstr_plural";'); + while (true) { + $lineno++; + $line = PO::read_line($f); + if (!$line) { + if (feof($f)) { + if ($is_final($context)) + break; + elseif (!$context) // we haven't read a line and eof came + return null; + else + return false; + } else { + return false; + } + } + if ($line == "\n") continue; + $line = trim($line); + if (preg_match('/^#/', $line, $m)) { + // the comment is the start of a new entry + if ($is_final($context)) { + PO::read_line($f, 'put-back'); + $lineno--; + break; + } + // comments have to be at the beginning + if ($context && $context != 'comment') { + return false; + } + // add comment + $this->add_comment_to_entry($entry, $line); + } elseif (preg_match('/^msgctxt\s+(".*")/', $line, $m)) { + if ($is_final($context)) { + PO::read_line($f, 'put-back'); + $lineno--; + break; + } + if ($context && $context != 'comment') { + return false; + } + $context = 'msgctxt'; + $entry->context .= PO::unpoify($m[1]); + } elseif (preg_match('/^msgid\s+(".*")/', $line, $m)) { + if ($is_final($context)) { + PO::read_line($f, 'put-back'); + $lineno--; + break; + } + if ($context && $context != 'msgctxt' && $context != 'comment') { + return false; + } + $context = 'msgid'; + $entry->singular .= PO::unpoify($m[1]); + } elseif (preg_match('/^msgid_plural\s+(".*")/', $line, $m)) { + if ($context != 'msgid') { + return false; + } + $context = 'msgid_plural'; + $entry->is_plural = true; + $entry->plural .= PO::unpoify($m[1]); + } elseif (preg_match('/^msgstr\s+(".*")/', $line, $m)) { + if ($context != 'msgid') { + return false; + } + $context = 'msgstr'; + $entry->translations = array(PO::unpoify($m[1])); + } elseif (preg_match('/^msgstr\[(\d+)\]\s+(".*")/', $line, $m)) { + if ($context != 'msgid_plural' && $context != 'msgstr_plural') { + return false; + } + $context = 'msgstr_plural'; + $msgstr_index = $m[1]; + $entry->translations[$m[1]] = PO::unpoify($m[2]); + } elseif (preg_match('/^".*"$/', $line)) { + $unpoified = PO::unpoify($line); + switch ($context) { + case 'msgid': + $entry->singular .= $unpoified; break; + case 'msgctxt': + $entry->context .= $unpoified; break; + case 'msgid_plural': + $entry->plural .= $unpoified; break; + case 'msgstr': + $entry->translations[0] .= $unpoified; break; + case 'msgstr_plural': + $entry->translations[$msgstr_index] .= $unpoified; break; + default: + return false; + } + } else { + return false; + } + } + if (array() == array_filter($entry->translations, create_function('$t', 'return $t || "0" === $t;'))) { + $entry->translations = array(); + } + return array('entry' => $entry, 'lineno' => $lineno); + } + + function read_line($f, $action = 'read') { + static $last_line = ''; + static $use_last_line = false; + if ('clear' == $action) { + $last_line = ''; + return true; + } + if ('put-back' == $action) { + $use_last_line = true; + return true; + } + $line = $use_last_line? $last_line : fgets($f); + $last_line = $line; + $use_last_line = false; + return $line; + } + + function add_comment_to_entry(&$entry, $po_comment_line) { + $first_two = substr($po_comment_line, 0, 2); + $comment = trim(substr($po_comment_line, 2)); + if ('#:' == $first_two) { + $entry->references = array_merge($entry->references, preg_split('/\s+/', $comment)); + } elseif ('#.' == $first_two) { + $entry->extracted_comments = trim($entry->extracted_comments . "\n" . $comment); + } elseif ('#,' == $first_two) { + $entry->flags = array_merge($entry->flags, preg_split('/,\s*/', $comment)); + } else { + $entry->translator_comments = trim($entry->translator_comments . "\n" . $comment); + } + } + + function trim_quotes($s) { + if ( substr($s, 0, 1) == '"') $s = substr($s, 1); + if ( substr($s, -1, 1) == '"') $s = substr($s, 0, -1); + return $s; + } +} +endif; diff --git a/src/wp-includes/pomo/streams.php b/src/wp-includes/pomo/streams.php new file mode 100644 index 0000000..289cc78 --- /dev/null +++ b/src/wp-includes/pomo/streams.php @@ -0,0 +1,209 @@ + + * + * @version $Id: streams.php 406 2010-02-07 11:10:24Z nbachiyski $ + * @package pomo + * @subpackage streams + */ + +if ( !class_exists( 'POMO_Reader' ) ): +class POMO_Reader { + + var $endian = 'little'; + var $_post = ''; + + function POMO_Reader() { + $this->is_overloaded = ((ini_get("mbstring.func_overload") & 2) != 0) && function_exists('mb_substr'); + $this->_pos = 0; + } + + /** + * Sets the endianness of the file. + * + * @param string $endian 'big' or 'little' + */ + function setEndian($endian) { + $this->endian = $endian; + } + + /** + * Reads a 32bit Integer from the Stream + * + * @return mixed The integer, corresponding to the next 32 bits from + * the stream of false if there are not enough bytes or on error + */ + function readint32() { + $bytes = $this->read(4); + if (4 != $this->strlen($bytes)) + return false; + $endian_letter = ('big' == $this->endian)? 'N' : 'V'; + $int = unpack($endian_letter, $bytes); + return array_shift($int); + } + + /** + * Reads an array of 32-bit Integers from the Stream + * + * @param integer count How many elements should be read + * @return mixed Array of integers or false if there isn't + * enough data or on error + */ + function readint32array($count) { + $bytes = $this->read(4 * $count); + if (4*$count != $this->strlen($bytes)) + return false; + $endian_letter = ('big' == $this->endian)? 'N' : 'V'; + return unpack($endian_letter.$count, $bytes); + } + + + function substr($string, $start, $length) { + if ($this->is_overloaded) { + return mb_substr($string, $start, $length, 'ascii'); + } else { + return substr($string, $start, $length); + } + } + + function strlen($string) { + if ($this->is_overloaded) { + return mb_strlen($string, 'ascii'); + } else { + return strlen($string); + } + } + + function str_split($string, $chunk_size) { + if (!function_exists('str_split')) { + $length = $this->strlen($string); + $out = array(); + for ($i = 0; $i < $length; $i += $chunk_size) + $out[] = $this->substr($string, $i, $chunk_size); + return $out; + } else { + return str_split( $string, $chunk_size ); + } + } + + + function pos() { + return $this->_pos; + } + + function is_resource() { + return true; + } + + function close() { + return true; + } +} +endif; + +if ( !class_exists( 'POMO_FileReader' ) ): +class POMO_FileReader extends POMO_Reader { + function POMO_FileReader($filename) { + parent::POMO_Reader(); + $this->_f = fopen($filename, 'r'); + } + + function read($bytes) { + return fread($this->_f, $bytes); + } + + function seekto($pos) { + if ( -1 == fseek($this->_f, $pos, SEEK_SET)) { + return false; + } + $this->_pos = $pos; + return true; + } + + function is_resource() { + return is_resource($this->_f); + } + + function feof() { + return feof($this->_f); + } + + function close() { + return fclose($this->_f); + } + + function read_all() { + $all = ''; + while ( !$this->feof() ) + $all .= $this->read(4096); + return $all; + } +} +endif; + +if ( !class_exists( 'POMO_StringReader' ) ): +/** + * Provides file-like methods for manipulating a string instead + * of a physical file. + */ +class POMO_StringReader extends POMO_Reader { + + var $_str = ''; + + function POMO_StringReader($str = '') { + parent::POMO_Reader(); + $this->_str = $str; + $this->_pos = 0; + } + + + function read($bytes) { + $data = $this->substr($this->_str, $this->_pos, $bytes); + $this->_pos += $bytes; + if ($this->strlen($this->_str) < $this->_pos) $this->_pos = $this->strlen($this->_str); + return $data; + } + + function seekto($pos) { + $this->_pos = $pos; + if ($this->strlen($this->_str) < $this->_pos) $this->_pos = $this->strlen($this->_str); + return $this->_pos; + } + + function length() { + return $this->strlen($this->_str); + } + + function read_all() { + return $this->substr($this->_str, $this->_pos, $this->strlen($this->_str)); + } + +} +endif; + +if ( !class_exists( 'POMO_CachedFileReader' ) ): +/** + * Reads the contents of the file in the beginning. + */ +class POMO_CachedFileReader extends POMO_StringReader { + function POMO_CachedFileReader($filename) { + parent::POMO_StringReader(); + $this->_str = file_get_contents($filename); + if (false === $this->_str) + return false; + $this->_pos = 0; + } +} +endif; + +if ( !class_exists( 'POMO_CachedIntFileReader' ) ): +/** + * Reads the contents of the file in the beginning. + */ +class POMO_CachedIntFileReader extends POMO_CachedFileReader { + function POMO_CachedIntFileReader($filename) { + parent::POMO_CachedFileReader($filename); + } +} +endif; \ No newline at end of file diff --git a/src/wp-includes/pomo/translations.php b/src/wp-includes/pomo/translations.php new file mode 100644 index 0000000..01be8df --- /dev/null +++ b/src/wp-includes/pomo/translations.php @@ -0,0 +1,253 @@ +key(); + if (false === $key) return false; + $this->entries[$key] = &$entry; + return true; + } + + /** + * Sets $header PO header to $value + * + * If the header already exists, it will be overwritten + * + * TODO: this should be out of this class, it is gettext specific + * + * @param string $header header name, without trailing : + * @param string $value header value, without trailing \n + */ + function set_header($header, $value) { + $this->headers[$header] = $value; + } + + function set_headers(&$headers) { + foreach($headers as $header => $value) { + $this->set_header($header, $value); + } + } + + function get_header($header) { + return isset($this->headers[$header])? $this->headers[$header] : false; + } + + function translate_entry(&$entry) { + $key = $entry->key(); + return isset($this->entries[$key])? $this->entries[$key] : false; + } + + function translate($singular, $context=null) { + $entry = new Translation_Entry(array('singular' => $singular, 'context' => $context)); + $translated = $this->translate_entry($entry); + return ($translated && !empty($translated->translations))? $translated->translations[0] : $singular; + } + + /** + * Given the number of items, returns the 0-based index of the plural form to use + * + * Here, in the base Translations class, the commong logic for English is implmented: + * 0 if there is one element, 1 otherwise + * + * This function should be overrided by the sub-classes. For example MO/PO can derive the logic + * from their headers. + * + * @param integer $count number of items + */ + function select_plural_form($count) { + return 1 == $count? 0 : 1; + } + + function get_plural_forms_count() { + return 2; + } + + function translate_plural($singular, $plural, $count, $context = null) { + $entry = new Translation_Entry(array('singular' => $singular, 'plural' => $plural, 'context' => $context)); + $translated = $this->translate_entry($entry); + $index = $this->select_plural_form($count); + $total_plural_forms = $this->get_plural_forms_count(); + if ($translated && 0 <= $index && $index < $total_plural_forms && + is_array($translated->translations) && + isset($translated->translations[$index])) + return $translated->translations[$index]; + else + return 1 == $count? $singular : $plural; + } + + /** + * Merge $other in the current object. + * + * @param Object &$other Another Translation object, whose translations will be merged in this one + * @return void + **/ + function merge_with(&$other) { + foreach( $other->entries as $entry ) { + $this->entries[$entry->key()] = $entry; + } + } +} + +class Gettext_Translations extends Translations { + /** + * The gettext implmentation of select_plural_form. + * + * It lives in this class, because there are more than one descendand, which will use it and + * they can't share it effectively. + * + */ + function gettext_select_plural_form($count) { + if (!isset($this->_gettext_select_plural_form) || is_null($this->_gettext_select_plural_form)) { + list( $nplurals, $expression ) = $this->nplurals_and_expression_from_header($this->get_header('Plural-Forms')); + $this->_nplurals = $nplurals; + $this->_gettext_select_plural_form = $this->make_plural_form_function($nplurals, $expression); + } + return call_user_func($this->_gettext_select_plural_form, $count); + } + + function nplurals_and_expression_from_header($header) { + if (preg_match('/^\s*nplurals\s*=\s*(\d+)\s*;\s+plural\s*=\s*(.+)$/', $header, $matches)) { + $nplurals = (int)$matches[1]; + $expression = trim($this->parenthesize_plural_exression($matches[2])); + return array($nplurals, $expression); + } else { + return array(2, 'n != 1'); + } + } + + /** + * Makes a function, which will return the right translation index, according to the + * plural forms header + */ + function make_plural_form_function($nplurals, $expression) { + $expression = str_replace('n', '$n', $expression); + $func_body = " + \$index = (int)($expression); + return (\$index < $nplurals)? \$index : $nplurals - 1;"; + return create_function('$n', $func_body); + } + + /** + * Adds parantheses to the inner parts of ternary operators in + * plural expressions, because PHP evaluates ternary oerators from left to right + * + * @param string $expression the expression without parentheses + * @return string the expression with parentheses added + */ + function parenthesize_plural_exression($expression) { + $expression .= ';'; + $res = ''; + $depth = 0; + for ($i = 0; $i < strlen($expression); ++$i) { + $char = $expression[$i]; + switch ($char) { + case '?': + $res .= ' ? ('; + $depth++; + break; + case ':': + $res .= ') : ('; + break; + case ';': + $res .= str_repeat(')', $depth) . ';'; + $depth= 0; + break; + default: + $res .= $char; + } + } + return rtrim($res, ';'); + } + + function make_headers($translation) { + $headers = array(); + // sometimes \ns are used instead of real new lines + $translation = str_replace('\n', "\n", $translation); + $lines = explode("\n", $translation); + foreach($lines as $line) { + $parts = explode(':', $line, 2); + if (!isset($parts[1])) continue; + $headers[trim($parts[0])] = trim($parts[1]); + } + return $headers; + } + + function set_header($header, $value) { + parent::set_header($header, $value); + if ('Plural-Forms' == $header) { + list( $nplurals, $expression ) = $this->nplurals_and_expression_from_header($this->get_header('Plural-Forms')); + $this->_nplurals = $nplurals; + $this->_gettext_select_plural_form = $this->make_plural_form_function($nplurals, $expression); + } + } +} +endif; + +if ( !class_exists( 'NOOP_Translations' ) ): +/** + * Provides the same interface as Translations, but doesn't do anything + */ +class NOOP_Translations { + var $entries = array(); + var $headers = array(); + + function add_entry($entry) { + return true; + } + + function set_header($header, $value) { + } + + function set_headers(&$headers) { + } + + function get_header($header) { + return false; + } + + function translate_entry(&$entry) { + return false; + } + + function translate($singular, $context=null) { + return $singular; + } + + function select_plural_form($count) { + return 1 == $count? 0 : 1; + } + + function get_plural_forms_count() { + return 2; + } + + function translate_plural($singular, $plural, $count, $context = null) { + return 1 == $count? $singular : $plural; + } + + function merge_with(&$other) { + } +} +endif; diff --git a/src/wp-includes/post-template.php b/src/wp-includes/post-template.php new file mode 100644 index 0000000..d6a0978 --- /dev/null +++ b/src/wp-includes/post-template.php @@ -0,0 +1,1440 @@ +ID; +} + +/** + * Display or retrieve the current post title with optional content. + * + * @since 0.71 + * + * @param string $before Optional. Content to prepend to the title. + * @param string $after Optional. Content to append to the title. + * @param bool $echo Optional, default to true.Whether to display or return. + * @return null|string Null on no title. String if $echo parameter is false. + */ +function the_title($before = '', $after = '', $echo = true) { + $title = get_the_title(); + + if ( strlen($title) == 0 ) + return; + + $title = $before . $title . $after; + + if ( $echo ) + echo $title; + else + return $title; +} + +/** + * Sanitize the current title when retrieving or displaying. + * + * Works like {@link the_title()}, except the parameters can be in a string or + * an array. See the function for what can be override in the $args parameter. + * + * The title before it is displayed will have the tags stripped and {@link + * esc_attr()} before it is passed to the user or displayed. The default + * as with {@link the_title()}, is to display the title. + * + * @since 2.3.0 + * + * @param string|array $args Optional. Override the defaults. + * @return string|null Null on failure or display. String when echo is false. + */ +function the_title_attribute( $args = '' ) { + $title = get_the_title(); + + if ( strlen($title) == 0 ) + return; + + $defaults = array('before' => '', 'after' => '', 'echo' => true); + $r = wp_parse_args($args, $defaults); + extract( $r, EXTR_SKIP ); + + + $title = $before . $title . $after; + $title = esc_attr(strip_tags($title)); + + if ( $echo ) + echo $title; + else + return $title; +} + +/** + * Retrieve post title. + * + * If the post is protected and the visitor is not an admin, then "Protected" + * will be displayed before the post title. If the post is private, then + * "Private" will be located before the post title. + * + * @since 0.71 + * + * @param int $id Optional. Post ID. + * @return string + */ +function get_the_title( $id = 0 ) { + $post = &get_post($id); + + $title = isset($post->post_title) ? $post->post_title : ''; + $id = isset($post->ID) ? $post->ID : (int) $id; + + if ( !is_admin() ) { + if ( !empty($post->post_password) ) { + $protected_title_format = apply_filters('protected_title_format', __('Protected: %s')); + $title = sprintf($protected_title_format, $title); + } else if ( isset($post->post_status) && 'private' == $post->post_status ) { + $private_title_format = apply_filters('private_title_format', __('Private: %s')); + $title = sprintf($private_title_format, $title); + } + } + return apply_filters( 'the_title', $title, $id ); +} + +/** + * Display the Post Global Unique Identifier (guid). + * + * The guid will appear to be a link, but should not be used as an link to the + * post. The reason you should not use it as a link, is because of moving the + * blog across domains. + * + * Url is escaped to make it xml safe + * + * @since 1.5.0 + * + * @param int $id Optional. Post ID. + */ +function the_guid( $id = 0 ) { + echo esc_url( get_the_guid( $id ) ); +} + +/** + * Retrieve the Post Global Unique Identifier (guid). + * + * The guid will appear to be a link, but should not be used as an link to the + * post. The reason you should not use it as a link, is because of moving the + * blog across domains. + * + * @since 1.5.0 + * + * @param int $id Optional. Post ID. + * @return string + */ +function get_the_guid( $id = 0 ) { + $post = &get_post($id); + + return apply_filters('get_the_guid', $post->guid); +} + +/** + * Display the post content. + * + * @since 0.71 + * + * @param string $more_link_text Optional. Content for when there is more text. + * @param string $stripteaser Optional. Teaser content before the more text. + */ +function the_content($more_link_text = null, $stripteaser = 0) { + $content = get_the_content($more_link_text, $stripteaser); + $content = apply_filters('the_content', $content); + $content = str_replace(']]>', ']]>', $content); + echo $content; +} + +/** + * Retrieve the post content. + * + * @since 0.71 + * + * @param string $more_link_text Optional. Content for when there is more text. + * @param string $stripteaser Optional. Teaser content before the more text. + * @return string + */ +function get_the_content($more_link_text = null, $stripteaser = 0) { + global $post, $more, $page, $pages, $multipage, $preview; + + if ( null === $more_link_text ) + $more_link_text = __( '(more...)' ); + + $output = ''; + $hasTeaser = false; + + // If post password required and it doesn't match the cookie. + if ( post_password_required($post) ) { + $output = get_the_password_form(); + return $output; + } + + if ( $page > count($pages) ) // if the requested page doesn't exist + $page = count($pages); // give them the highest numbered page that DOES exist + + $content = $pages[$page-1]; + if ( preg_match('//', $content, $matches) ) { + $content = explode($matches[0], $content, 2); + if ( !empty($matches[1]) && !empty($more_link_text) ) + $more_link_text = strip_tags(wp_kses_no_null(trim($matches[1]))); + + $hasTeaser = true; + } else { + $content = array($content); + } + if ( (false !== strpos($post->post_content, '') && ((!$multipage) || ($page==1))) ) + $stripteaser = 1; + $teaser = $content[0]; + if ( ($more) && ($stripteaser) && ($hasTeaser) ) + $teaser = ''; + $output .= $teaser; + if ( count($content) > 1 ) { + if ( $more ) { + $output .= '' . $content[1]; + } else { + if ( ! empty($more_link_text) ) + $output .= apply_filters( 'the_content_more_link', ' ID}\" class=\"more-link\">$more_link_text", $more_link_text ); + $output = force_balance_tags($output); + } + + } + if ( $preview ) // preview fix for javascript bug with foreign languages + $output = preg_replace_callback('/\%u([0-9A-F]{4})/', '_convert_urlencoded_to_entities', $output); + + return $output; +} + +/** + * Preview fix for javascript bug with foreign languages + * + * @since 3.1.0 + * @access private + * @param array $match Match array from preg_replace_callback + * @returns string + */ +function _convert_urlencoded_to_entities( $match ) { + return '&#' . base_convert( $match[1], 16, 10 ) . ';'; +} + +/** + * Display the post excerpt. + * + * @since 0.71 + * @uses apply_filters() Calls 'the_excerpt' hook on post excerpt. + */ +function the_excerpt() { + echo apply_filters('the_excerpt', get_the_excerpt()); +} + +/** + * Retrieve the post excerpt. + * + * @since 0.71 + * + * @param mixed $deprecated Not used. + * @return string + */ +function get_the_excerpt( $deprecated = '' ) { + if ( !empty( $deprecated ) ) + _deprecated_argument( __FUNCTION__, '2.3' ); + + global $post; + $output = $post->post_excerpt; + if ( post_password_required($post) ) { + $output = __('There is no excerpt because this is a protected post.'); + return $output; + } + + return apply_filters('get_the_excerpt', $output); +} + +/** + * Whether post has excerpt. + * + * @since 2.3.0 + * + * @param int $id Optional. Post ID. + * @return bool + */ +function has_excerpt( $id = 0 ) { + $post = &get_post( $id ); + return ( !empty( $post->post_excerpt ) ); +} + +/** + * Display the classes for the post div. + * + * @since 2.7.0 + * + * @param string|array $class One or more classes to add to the class list. + * @param int $post_id An optional post ID. + */ +function post_class( $class = '', $post_id = null ) { + // Separates classes with a single space, collates classes for post DIV + echo 'class="' . join( ' ', get_post_class( $class, $post_id ) ) . '"'; +} + +/** + * Retrieve the classes for the post div as an array. + * + * The class names are add are many. If the post is a sticky, then the 'sticky' + * class name. The class 'hentry' is always added to each post. For each + * category, the class will be added with 'category-' with category slug is + * added. The tags are the same way as the categories with 'tag-' before the tag + * slug. All classes are passed through the filter, 'post_class' with the list + * of classes, followed by $class parameter value, with the post ID as the last + * parameter. + * + * @since 2.7.0 + * + * @param string|array $class One or more classes to add to the class list. + * @param int $post_id An optional post ID. + * @return array Array of classes. + */ +function get_post_class( $class = '', $post_id = null ) { + $post = get_post($post_id); + + $classes = array(); + + if ( empty($post) ) + return $classes; + + $classes[] = 'post-' . $post->ID; + $classes[] = $post->post_type; + $classes[] = 'type-' . $post->post_type; + $classes[] = 'status-' . $post->post_status; + + // Post Format + $post_format = get_post_format( $post->ID ); + + if ( post_type_supports( $post->post_type, 'post-formats' ) ) { + if ( $post_format && !is_wp_error($post_format) ) + $classes[] = 'format-' . sanitize_html_class( $post_format ); + else + $classes[] = 'format-standard'; + } + + // post requires password + if ( post_password_required($post->ID) ) + $classes[] = 'post-password-required'; + + // sticky for Sticky Posts + if ( is_sticky($post->ID) && is_home() && !is_paged() ) + $classes[] = 'sticky'; + + // hentry for hAtom compliance + $classes[] = 'hentry'; + + // Categories + if ( is_object_in_taxonomy( $post->post_type, 'category' ) ) { + foreach ( (array) get_the_category($post->ID) as $cat ) { + if ( empty($cat->slug ) ) + continue; + $classes[] = 'category-' . sanitize_html_class($cat->slug, $cat->term_id); + } + } + + // Tags + if ( is_object_in_taxonomy( $post->post_type, 'post_tag' ) ) { + foreach ( (array) get_the_tags($post->ID) as $tag ) { + if ( empty($tag->slug ) ) + continue; + $classes[] = 'tag-' . sanitize_html_class($tag->slug, $tag->term_id); + } + } + + if ( !empty($class) ) { + if ( !is_array( $class ) ) + $class = preg_split('#\s+#', $class); + $classes = array_merge($classes, $class); + } + + $classes = array_map('esc_attr', $classes); + + return apply_filters('post_class', $classes, $class, $post->ID); +} + +/** + * Display the classes for the body element. + * + * @since 2.8.0 + * + * @param string|array $class One or more classes to add to the class list. + */ +function body_class( $class = '' ) { + // Separates classes with a single space, collates classes for body element + echo 'class="' . join( ' ', get_body_class( $class ) ) . '"'; +} + +/** + * Retrieve the classes for the body element as an array. + * + * @since 2.8.0 + * + * @param string|array $class One or more classes to add to the class list. + * @return array Array of classes. + */ +function get_body_class( $class = '' ) { + global $wp_query, $wpdb; + + $classes = array(); + + if ( is_rtl() ) + $classes[] = 'rtl'; + + if ( is_front_page() ) + $classes[] = 'home'; + if ( is_home() ) + $classes[] = 'blog'; + if ( is_archive() ) + $classes[] = 'archive'; + if ( is_date() ) + $classes[] = 'date'; + if ( is_search() ) + $classes[] = 'search'; + if ( is_paged() ) + $classes[] = 'paged'; + if ( is_attachment() ) + $classes[] = 'attachment'; + if ( is_404() ) + $classes[] = 'error404'; + + if ( is_single() ) { + $post_id = $wp_query->get_queried_object_id(); + $post = $wp_query->get_queried_object(); + + $classes[] = 'single'; + $classes[] = 'single-' . sanitize_html_class($post->post_type, $post_id); + $classes[] = 'postid-' . $post_id; + + // Post Format + $post_format = get_post_format( $post->ID ); + + if ( $post_format && !is_wp_error($post_format) ) + $classes[] = 'single-format-' . sanitize_html_class( $post_format ); + else + $classes[] = 'single-format-standard'; + + if ( is_attachment() ) { + $mime_type = get_post_mime_type($post_id); + $mime_prefix = array( 'application/', 'image/', 'text/', 'audio/', 'video/', 'music/' ); + $classes[] = 'attachmentid-' . $post_id; + $classes[] = 'attachment-' . str_replace( $mime_prefix, '', $mime_type ); + } + } elseif ( is_archive() ) { + if ( is_post_type_archive() ) { + $classes[] = 'post-type-archive'; + $classes[] = 'post-type-archive-' . sanitize_html_class( get_query_var( 'post_type' ) ); + } else if ( is_author() ) { + $author = $wp_query->get_queried_object(); + $classes[] = 'author'; + $classes[] = 'author-' . sanitize_html_class( $author->user_nicename , $author->ID ); + $classes[] = 'author-' . $author->ID; + } elseif ( is_category() ) { + $cat = $wp_query->get_queried_object(); + $classes[] = 'category'; + $classes[] = 'category-' . sanitize_html_class( $cat->slug, $cat->term_id ); + $classes[] = 'category-' . $cat->term_id; + } elseif ( is_tag() ) { + $tags = $wp_query->get_queried_object(); + $classes[] = 'tag'; + $classes[] = 'tag-' . sanitize_html_class( $tags->slug, $tags->term_id ); + $classes[] = 'tag-' . $tags->term_id; + } elseif ( is_tax() ) { + $term = $wp_query->get_queried_object(); + $classes[] = 'tax-' . sanitize_html_class( $term->taxonomy ); + $classes[] = 'term-' . sanitize_html_class( $term->slug, $term->term_id ); + $classes[] = 'term-' . $term->term_id; + } + } elseif ( is_page() ) { + $classes[] = 'page'; + + $page_id = $wp_query->get_queried_object_id(); + + $post = get_page($page_id); + + $classes[] = 'page-id-' . $page_id; + + if ( $wpdb->get_var( $wpdb->prepare("SELECT ID FROM $wpdb->posts WHERE post_parent = %d AND post_type = 'page' AND post_status = 'publish' LIMIT 1", $page_id) ) ) + $classes[] = 'page-parent'; + + if ( $post->post_parent ) { + $classes[] = 'page-child'; + $classes[] = 'parent-pageid-' . $post->post_parent; + } + if ( is_page_template() ) { + $classes[] = 'page-template'; + $classes[] = 'page-template-' . sanitize_html_class( str_replace( '.', '-', get_post_meta( $page_id, '_wp_page_template', true ) ), '' ); + } else { + $classes[] = 'page-template-default'; + } + } elseif ( is_search() ) { + if ( !empty( $wp_query->posts ) ) + $classes[] = 'search-results'; + else + $classes[] = 'search-no-results'; + } + + if ( is_user_logged_in() ) + $classes[] = 'logged-in'; + + if ( is_admin_bar_showing() ) + $classes[] = 'admin-bar'; + + $page = $wp_query->get( 'page' ); + + if ( !$page || $page < 2) + $page = $wp_query->get( 'paged' ); + + if ( $page && $page > 1 ) { + $classes[] = 'paged-' . $page; + + if ( is_single() ) + $classes[] = 'single-paged-' . $page; + elseif ( is_page() ) + $classes[] = 'page-paged-' . $page; + elseif ( is_category() ) + $classes[] = 'category-paged-' . $page; + elseif ( is_tag() ) + $classes[] = 'tag-paged-' . $page; + elseif ( is_date() ) + $classes[] = 'date-paged-' . $page; + elseif ( is_author() ) + $classes[] = 'author-paged-' . $page; + elseif ( is_search() ) + $classes[] = 'search-paged-' . $page; + elseif ( is_post_type_archive() ) + $classes[] = 'post-type-paged-' . $page; + } + + if ( ! empty( $class ) ) { + if ( !is_array( $class ) ) + $class = preg_split( '#\s+#', $class ); + $classes = array_merge( $classes, $class ); + } else { + // Ensure that we always coerce class to being an array. + $class = array(); + } + + $classes = array_map( 'esc_attr', $classes ); + + return apply_filters( 'body_class', $classes, $class ); +} + +/** + * Whether post requires password and correct password has been provided. + * + * @since 2.7.0 + * + * @param int|object $post An optional post. Global $post used if not provided. + * @return bool false if a password is not required or the correct password cookie is present, true otherwise. + */ +function post_password_required( $post = null ) { + $post = get_post($post); + + if ( empty($post->post_password) ) + return false; + + if ( !isset($_COOKIE['wp-postpass_' . COOKIEHASH]) ) + return true; + + if ( $_COOKIE['wp-postpass_' . COOKIEHASH] != $post->post_password ) + return true; + + return false; +} + +/** + * Display "sticky" CSS class, if a post is sticky. + * + * @since 2.7.0 + * + * @param int $post_id An optional post ID. + */ +function sticky_class( $post_id = null ) { + if ( !is_sticky($post_id) ) + return; + + echo " sticky"; +} + +/** + * Page Template Functions for usage in Themes + * + * @package WordPress + * @subpackage Template + */ + +/** + * The formatted output of a list of pages. + * + * Displays page links for paginated posts (i.e. includes the . + * Quicktag one or more times). This tag must be within The Loop. + * + * The defaults for overwriting are: + * 'next_or_number' - Default is 'number' (string). Indicates whether page + * numbers should be used. Valid values are number and next. + * 'nextpagelink' - Default is 'Next Page' (string). Text for link to next page. + * of the bookmark. + * 'previouspagelink' - Default is 'Previous Page' (string). Text for link to + * previous page, if available. + * 'pagelink' - Default is '%' (String).Format string for page numbers. The % in + * the parameter string will be replaced with the page number, so Page % + * generates "Page 1", "Page 2", etc. Defaults to %, just the page number. + * 'before' - Default is '

    Pages:' (string). The html or text to prepend to + * each bookmarks. + * 'after' - Default is '

    ' (string). The html or text to append to each + * bookmarks. + * 'link_before' - Default is '' (string). The html or text to prepend to each + * Pages link inside the tag. Also prepended to the current item, which + * is not linked. + * 'link_after' - Default is '' (string). The html or text to append to each + * Pages link inside the tag. Also appended to the current item, which + * is not linked. + * + * @since 1.2.0 + * @access private + * + * @param string|array $args Optional. Overwrite the defaults. + * @return string Formatted output in HTML. + */ +function wp_link_pages($args = '') { + $defaults = array( + 'before' => '

    ' . __('Pages:'), 'after' => '

    ', + 'link_before' => '', 'link_after' => '', + 'next_or_number' => 'number', 'nextpagelink' => __('Next page'), + 'previouspagelink' => __('Previous page'), 'pagelink' => '%', + 'echo' => 1 + ); + + $r = wp_parse_args( $args, $defaults ); + $r = apply_filters( 'wp_link_pages_args', $r ); + extract( $r, EXTR_SKIP ); + + global $page, $numpages, $multipage, $more, $pagenow; + + $output = ''; + if ( $multipage ) { + if ( 'number' == $next_or_number ) { + $output .= $before; + for ( $i = 1; $i < ($numpages+1); $i = $i + 1 ) { + $j = str_replace('%',$i,$pagelink); + $output .= ' '; + if ( ($i != $page) || ((!$more) && ($page==1)) ) { + $output .= _wp_link_page($i); + } + $output .= $link_before . $j . $link_after; + if ( ($i != $page) || ((!$more) && ($page==1)) ) + $output .= '
    '; + } + $output .= $after; + } else { + if ( $more ) { + $output .= $before; + $i = $page - 1; + if ( $i && $more ) { + $output .= _wp_link_page($i); + $output .= $link_before. $previouspagelink . $link_after . ''; + } + $i = $page + 1; + if ( $i <= $numpages && $more ) { + $output .= _wp_link_page($i); + $output .= $link_before. $nextpagelink . $link_after . ''; + } + $output .= $after; + } + } + } + + if ( $echo ) + echo $output; + + return $output; +} + +/** + * Helper function for wp_link_pages(). + * + * @since 3.1.0 + * @access private + * + * @param int $i Page number. + * @return string Link. + */ +function _wp_link_page( $i ) { + global $post, $wp_rewrite; + + if ( 1 == $i ) { + $url = get_permalink(); + } else { + if ( '' == get_option('permalink_structure') || in_array($post->post_status, array('draft', 'pending')) ) + $url = add_query_arg( 'page', $i, get_permalink() ); + elseif ( 'page' == get_option('show_on_front') && get_option('page_on_front') == $post->ID ) + $url = trailingslashit(get_permalink()) . user_trailingslashit("$wp_rewrite->pagination_base/" . $i, 'single_paged'); + else + $url = trailingslashit(get_permalink()) . user_trailingslashit($i, 'single_paged'); + } + + return ''; +} + +// +// Post-meta: Custom per-post fields. +// + +/** + * Retrieve post custom meta data field. + * + * @since 1.5.0 + * + * @param string $key Meta data key name. + * @return bool|string|array Array of values or single value, if only one element exists. False will be returned if key does not exist. + */ +function post_custom( $key = '' ) { + $custom = get_post_custom(); + + if ( !isset( $custom[$key] ) ) + return false; + elseif ( 1 == count($custom[$key]) ) + return $custom[$key][0]; + else + return $custom[$key]; +} + +/** + * Display list of post custom fields. + * + * @internal This will probably change at some point... + * @since 1.2.0 + * @uses apply_filters() Calls 'the_meta_key' on list item HTML content, with key and value as separate parameters. + */ +function the_meta() { + if ( $keys = get_post_custom_keys() ) { + echo "\n"; + } +} + +// +// Pages +// + +/** + * Retrieve or display list of pages as a dropdown (select list). + * + * @since 2.1.0 + * + * @param array|string $args Optional. Override default arguments. + * @return string HTML content, if not displaying. + */ +function wp_dropdown_pages($args = '') { + $defaults = array( + 'depth' => 0, 'child_of' => 0, + 'selected' => 0, 'echo' => 1, + 'name' => 'page_id', 'id' => '', + 'show_option_none' => '', 'show_option_no_change' => '', + 'option_none_value' => '' + ); + + $r = wp_parse_args( $args, $defaults ); + extract( $r, EXTR_SKIP ); + + $pages = get_pages($r); + $output = ''; + $name = esc_attr($name); + // Back-compat with old system where both id and name were based on $name argument + if ( empty($id) ) + $id = $name; + + if ( ! empty($pages) ) { + $output = "\n"; + } + + $output = apply_filters('wp_dropdown_pages', $output); + + if ( $echo ) + echo $output; + + return $output; +} + +/** + * Retrieve or display list of pages in list (li) format. + * + * @since 1.5.0 + * + * @param array|string $args Optional. Override default arguments. + * @return string HTML content, if not displaying. + */ +function wp_list_pages($args = '') { + $defaults = array( + 'depth' => 0, 'show_date' => '', + 'date_format' => get_option('date_format'), + 'child_of' => 0, 'exclude' => '', + 'title_li' => __('Pages'), 'echo' => 1, + 'authors' => '', 'sort_column' => 'menu_order, post_title', + 'link_before' => '', 'link_after' => '', 'walker' => '', + ); + + $r = wp_parse_args( $args, $defaults ); + extract( $r, EXTR_SKIP ); + + $output = ''; + $current_page = 0; + + // sanitize, mostly to keep spaces out + $r['exclude'] = preg_replace('/[^0-9,]/', '', $r['exclude']); + + // Allow plugins to filter an array of excluded pages (but don't put a nullstring into the array) + $exclude_array = ( $r['exclude'] ) ? explode(',', $r['exclude']) : array(); + $r['exclude'] = implode( ',', apply_filters('wp_list_pages_excludes', $exclude_array) ); + + // Query pages. + $r['hierarchical'] = 0; + $pages = get_pages($r); + + if ( !empty($pages) ) { + if ( $r['title_li'] ) + $output .= '
  • '; + } + + $output = apply_filters('wp_list_pages', $output, $r); + + if ( $r['echo'] ) + echo $output; + else + return $output; +} + +/** + * Display or retrieve list of pages with optional home link. + * + * The arguments are listed below and part of the arguments are for {@link + * wp_list_pages()} function. Check that function for more info on those + * arguments. + * + *
      + *
    • sort_column - How to sort the list of pages. Defaults + * to page title. Use column for posts table.
    • + *
    • menu_class - Class to use for the div ID which contains + * the page list. Defaults to 'menu'.
    • + *
    • echo - Whether to echo list or return it. Defaults to + * echo.
    • + *
    • link_before - Text before show_home argument text.
    • + *
    • link_after - Text after show_home argument text.
    • + *
    • show_home - If you set this argument, then it will + * display the link to the home page. The show_home argument really just needs + * to be set to the value of the text of the link.
    • + *
    + * + * @since 2.7.0 + * + * @param array|string $args + */ +function wp_page_menu( $args = array() ) { + $defaults = array('sort_column' => 'menu_order, post_title', 'menu_class' => 'menu', 'echo' => true, 'link_before' => '', 'link_after' => ''); + $args = wp_parse_args( $args, $defaults ); + $args = apply_filters( 'wp_page_menu_args', $args ); + + $menu = ''; + + $list_args = $args; + + // Show Home in the menu + if ( ! empty($args['show_home']) ) { + if ( true === $args['show_home'] || '1' === $args['show_home'] || 1 === $args['show_home'] ) + $text = __('Home'); + else + $text = $args['show_home']; + $class = ''; + if ( is_front_page() && !is_paged() ) + $class = 'class="current_page_item"'; + $menu .= '
  • ' . $args['link_before'] . $text . $args['link_after'] . '
  • '; + // If the front page is a page, add it to the exclude list + if (get_option('show_on_front') == 'page') { + if ( !empty( $list_args['exclude'] ) ) { + $list_args['exclude'] .= ','; + } else { + $list_args['exclude'] = ''; + } + $list_args['exclude'] .= get_option('page_on_front'); + } + } + + $list_args['echo'] = false; + $list_args['title_li'] = ''; + $menu .= str_replace( array( "\r", "\n", "\t" ), '', wp_list_pages($list_args) ); + + if ( $menu ) + $menu = '
      ' . $menu . '
    '; + + $menu = '
    ' . $menu . "
    \n"; + $menu = apply_filters( 'wp_page_menu', $menu, $args ); + if ( $args['echo'] ) + echo $menu; + else + return $menu; +} + +// +// Page helpers +// + +/** + * Retrieve HTML list content for page list. + * + * @uses Walker_Page to create HTML list content. + * @since 2.1.0 + * @see Walker_Page::walk() for parameters and return description. + */ +function walk_page_tree($pages, $depth, $current_page, $r) { + if ( empty($r['walker']) ) + $walker = new Walker_Page; + else + $walker = $r['walker']; + + $args = array($pages, $depth, $r, $current_page); + return call_user_func_array(array(&$walker, 'walk'), $args); +} + +/** + * Retrieve HTML dropdown (select) content for page list. + * + * @uses Walker_PageDropdown to create HTML dropdown content. + * @since 2.1.0 + * @see Walker_PageDropdown::walk() for parameters and return description. + */ +function walk_page_dropdown_tree() { + $args = func_get_args(); + if ( empty($args[2]['walker']) ) // the user's options are the third parameter + $walker = new Walker_PageDropdown; + else + $walker = $args[2]['walker']; + + return call_user_func_array(array(&$walker, 'walk'), $args); +} + +/** + * Create HTML list of pages. + * + * @package WordPress + * @since 2.1.0 + * @uses Walker + */ +class Walker_Page extends Walker { + /** + * @see Walker::$tree_type + * @since 2.1.0 + * @var string + */ + var $tree_type = 'page'; + + /** + * @see Walker::$db_fields + * @since 2.1.0 + * @todo Decouple this. + * @var array + */ + var $db_fields = array ('parent' => 'post_parent', 'id' => 'ID'); + + /** + * @see Walker::start_lvl() + * @since 2.1.0 + * + * @param string $output Passed by reference. Used to append additional content. + * @param int $depth Depth of page. Used for padding. + */ + function start_lvl(&$output, $depth) { + $indent = str_repeat("\t", $depth); + $output .= "\n$indent
      \n"; + } + + /** + * @see Walker::end_lvl() + * @since 2.1.0 + * + * @param string $output Passed by reference. Used to append additional content. + * @param int $depth Depth of page. Used for padding. + */ + function end_lvl(&$output, $depth) { + $indent = str_repeat("\t", $depth); + $output .= "$indent
    \n"; + } + + /** + * @see Walker::start_el() + * @since 2.1.0 + * + * @param string $output Passed by reference. Used to append additional content. + * @param object $page Page data object. + * @param int $depth Depth of page. Used for padding. + * @param int $current_page Page ID. + * @param array $args + */ + function start_el(&$output, $page, $depth, $args, $current_page) { + if ( $depth ) + $indent = str_repeat("\t", $depth); + else + $indent = ''; + + extract($args, EXTR_SKIP); + $css_class = array('page_item', 'page-item-'.$page->ID); + if ( !empty($current_page) ) { + $_current_page = get_page( $current_page ); + _get_post_ancestors($_current_page); + if ( isset($_current_page->ancestors) && in_array($page->ID, (array) $_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'; + } + + $css_class = implode(' ', apply_filters('page_css_class', $css_class, $page)); + + $output .= $indent . '
  • ' . $link_before . apply_filters( 'the_title', $page->post_title, $page->ID ) . $link_after . ''; + + if ( !empty($show_date) ) { + if ( 'modified' == $show_date ) + $time = $page->post_modified; + else + $time = $page->post_date; + + $output .= " " . mysql2date($date_format, $time); + } + } + + /** + * @see Walker::end_el() + * @since 2.1.0 + * + * @param string $output Passed by reference. Used to append additional content. + * @param object $page Page data object. Not used. + * @param int $depth Depth of page. Not Used. + */ + function end_el(&$output, $page, $depth) { + $output .= "
  • \n"; + } + +} + +/** + * Create HTML dropdown list of pages. + * + * @package WordPress + * @since 2.1.0 + * @uses Walker + */ +class Walker_PageDropdown extends Walker { + /** + * @see Walker::$tree_type + * @since 2.1.0 + * @var string + */ + var $tree_type = 'page'; + + /** + * @see Walker::$db_fields + * @since 2.1.0 + * @todo Decouple this + * @var array + */ + var $db_fields = array ('parent' => 'post_parent', 'id' => 'ID'); + + /** + * @see Walker::start_el() + * @since 2.1.0 + * + * @param string $output Passed by reference. Used to append additional content. + * @param object $page Page data object. + * @param int $depth Depth of page in reference to parent pages. Used for padding. + * @param array $args Uses 'selected' argument for selected page to set selected HTML attribute for option element. + */ + function start_el(&$output, $page, $depth, $args) { + $pad = str_repeat(' ', $depth * 3); + + $output .= "\t\n"; + } +} + +// +// Attachments +// + +/** + * Display an attachment page link using an image or icon. + * + * @since 2.0.0 + * + * @param int $id Optional. Post ID. + * @param bool $fullsize Optional, default is false. Whether to use full size. + * @param bool $deprecated Deprecated. Not used. + * @param bool $permalink Optional, default is false. Whether to include permalink. + */ +function the_attachment_link( $id = 0, $fullsize = false, $deprecated = false, $permalink = false ) { + if ( !empty( $deprecated ) ) + _deprecated_argument( __FUNCTION__, '2.5' ); + + if ( $fullsize ) + echo wp_get_attachment_link($id, 'full', $permalink); + else + echo wp_get_attachment_link($id, 'thumbnail', $permalink); +} + +/** + * Retrieve an attachment page link using an image or icon, if possible. + * + * @since 2.5.0 + * @uses apply_filters() Calls 'wp_get_attachment_link' filter on HTML content with same parameters as function. + * + * @param int $id Optional. Post ID. + * @param string $size Optional, default is 'thumbnail'. Size of image, either array or string. + * @param bool $permalink Optional, default is false. Whether to add permalink to image. + * @param bool $icon Optional, default is false. Whether to include icon. + * @param string $text Optional, default is false. If string, then will be link text. + * @return string HTML content. + */ +function wp_get_attachment_link($id = 0, $size = 'thumbnail', $permalink = false, $icon = false, $text = false) { + $id = intval($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); + + if ( $text ) { + $link_text = esc_attr($text); + } elseif ( ( is_int($size) && $size != 0 ) or ( is_string($size) && $size != 'none' ) or $size != false ) { + $link_text = wp_get_attachment_image($id, $size, $icon); + } else { + $link_text = ''; + } + + if( trim($link_text) == '' ) + $link_text = $_post->post_title; + + return apply_filters( 'wp_get_attachment_link', "$link_text", $id, $size, $permalink, $icon, $text ); +} + +/** + * Wrap attachment in <

    > element before content. + * + * @since 2.0.0 + * @uses apply_filters() Calls 'prepend_attachment' hook on HTML content. + * + * @param string $content + * @return string + */ +function prepend_attachment($content) { + global $post; + + if ( empty($post->post_type) || $post->post_type != 'attachment' ) + return $content; + + $p = '

    '; + // show the medium sized image representation of the attachment if available, and link to the raw file + $p .= wp_get_attachment_link(0, 'medium', false); + $p .= '

    '; + $p = apply_filters('prepend_attachment', $p); + + return "$p\n$content"; +} + +// +// Misc +// + +/** + * Retrieve protected post password form content. + * + * @since 1.0.0 + * @uses apply_filters() Calls 'the_password_form' filter on output. + * + * @return string HTML content for password form for password protected post. + */ +function get_the_password_form() { + global $post; + $label = 'pwbox-'.(empty($post->ID) ? rand() : $post->ID); + $output = '
    +

    ' . __("This post is password protected. To view it please enter your password below:") . '

    +

    +
    + '; + return apply_filters('the_password_form', $output); +} + +/** + * Whether currently in a page template. + * + * This template tag allows you to determine if you are in a page template. + * You can optionally provide a template name and then the check will be + * specific to that template. + * + * @since 2.5.0 + * @uses $wp_query + * + * @param string $template The specific template name if specific matching is required. + * @return bool False on failure, true if success. + */ +function is_page_template($template = '') { + if (!is_page()) { + return false; + } + + global $wp_query; + + $page = $wp_query->get_queried_object(); + $custom_fields = get_post_custom_values('_wp_page_template',$page->ID); + $page_template = $custom_fields[0]; + + // We have no argument passed so just see if a page_template has been specified + if ( empty( $template ) ) { + if ( !empty( $page_template ) and ( 'default' != $page_template ) ) { + return true; + } + } elseif ( $template == $page_template) { + return true; + } + + return false; +} + +/** + * Retrieve formatted date timestamp of a revision (linked to that revisions's page). + * + * @package WordPress + * @subpackage Post_Revisions + * @since 2.6.0 + * + * @uses date_i18n() + * + * @param int|object $revision Revision ID or revision object. + * @param bool $link Optional, default is true. Link to revisions's page? + * @return string i18n formatted datetimestamp or localized 'Current Revision'. + */ +function wp_post_revision_title( $revision, $link = true ) { + if ( !$revision = get_post( $revision ) ) + return $revision; + + if ( !in_array( $revision->post_type, array( 'post', 'page', 'revision' ) ) ) + return false; + + /* translators: revision date format, see http://php.net/date */ + $datef = _x( 'j F, Y @ G:i', 'revision date format'); + /* translators: 1: date */ + $autosavef = __( '%1$s [Autosave]' ); + /* translators: 1: date */ + $currentf = __( '%1$s [Current Revision]' ); + + $date = date_i18n( $datef, strtotime( $revision->post_modified ) ); + if ( $link && current_user_can( 'edit_post', $revision->ID ) && $link = get_edit_post_link( $revision->ID ) ) + $date = "$date"; + + if ( !wp_is_post_revision( $revision ) ) + $date = sprintf( $currentf, $date ); + elseif ( wp_is_post_autosave( $revision ) ) + $date = sprintf( $autosavef, $date ); + + return $date; +} + +/** + * Display list of a post's revisions. + * + * Can output either a UL with edit links or a TABLE with diff interface, and + * restore action links. + * + * Second argument controls parameters: + * (bool) parent : include the parent (the "Current Revision") in the list. + * (string) format : 'list' or 'form-table'. 'list' outputs UL, 'form-table' + * outputs TABLE with UI. + * (int) right : what revision is currently being viewed - used in + * form-table format. + * (int) left : what revision is currently being diffed against right - + * used in form-table format. + * + * @package WordPress + * @subpackage Post_Revisions + * @since 2.6.0 + * + * @uses wp_get_post_revisions() + * @uses wp_post_revision_title() + * @uses get_edit_post_link() + * @uses get_the_author_meta() + * + * @todo split into two functions (list, form-table) ? + * + * @param int|object $post_id Post ID or post object. + * @param string|array $args See description {@link wp_parse_args()}. + * @return null + */ +function wp_list_post_revisions( $post_id = 0, $args = null ) { + if ( !$post = get_post( $post_id ) ) + return; + + $defaults = array( 'parent' => false, 'right' => false, 'left' => false, 'format' => 'list', 'type' => 'all' ); + extract( wp_parse_args( $args, $defaults ), EXTR_SKIP ); + + switch ( $type ) { + case 'autosave' : + if ( !$autosave = wp_get_post_autosave( $post->ID ) ) + return; + $revisions = array( $autosave ); + break; + case 'revision' : // just revisions - remove autosave later + case 'all' : + default : + if ( !$revisions = wp_get_post_revisions( $post->ID ) ) + return; + break; + } + + /* translators: post revision: 1: when, 2: author name */ + $titlef = _x( '%1$s by %2$s', 'post revision' ); + + if ( $parent ) + array_unshift( $revisions, $post ); + + $rows = $right_checked = ''; + $class = false; + $can_edit_post = current_user_can( 'edit_post', $post->ID ); + foreach ( $revisions as $revision ) { + if ( !current_user_can( 'read_post', $revision->ID ) ) + continue; + if ( 'revision' === $type && wp_is_post_autosave( $revision ) ) + continue; + + $date = wp_post_revision_title( $revision ); + $name = get_the_author_meta( 'display_name', $revision->post_author ); + + if ( 'form-table' == $format ) { + if ( $left ) + $left_checked = $left == $revision->ID ? ' checked="checked"' : ''; + else + $left_checked = $right_checked ? ' checked="checked"' : ''; // [sic] (the next one) + $right_checked = $right == $revision->ID ? ' checked="checked"' : ''; + + $class = $class ? '' : " class='alternate'"; + + if ( $post->ID != $revision->ID && $can_edit_post ) + $actions = 'ID|$revision->ID" ) . '">' . __( 'Restore' ) . ''; + else + $actions = ''; + + $rows .= "\n"; + $rows .= "\t\n"; + $rows .= "\t\n"; + $rows .= "\t$date\n"; + $rows .= "\t$name\n"; + $rows .= "\t$actions\n"; + $rows .= "\n"; + } else { + $title = sprintf( $titlef, $date, $name ); + $rows .= "\t
  • $title
  • \n"; + } + } + + if ( 'form-table' == $format ) : ?> + +
    + +
    +
    + + + +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + +
    + +
    + +\n"; + echo $rows; + echo ""; + endif; + +} diff --git a/src/wp-includes/post-thumbnail-template.php b/src/wp-includes/post-thumbnail-template.php new file mode 100644 index 0000000..38ae903 --- /dev/null +++ b/src/wp-includes/post-thumbnail-template.php @@ -0,0 +1,105 @@ +thumbnails_cached ) + return; + + $thumb_ids = array(); + foreach ( $wp_query->posts as $post ) { + if ( $id = get_post_thumbnail_id( $post->ID ) ) + $thumb_ids[] = $id; + } + + if ( ! empty ( $thumb_ids ) ) { + get_posts( array( + 'update_post_term_cache' => false, + 'include' => $thumb_ids, + 'post_type' => 'attachment', + 'post_status' => 'inherit', + 'nopaging' => true + ) ); + } + + $wp_query->thumbnails_cached = true; +} + +/** + * Retrieve Post Thumbnail. + * + * @since 2.9.0 + * + * @param int $post_id Optional. Post ID. + * @param string $size Optional. Image size. Defaults to 'thumbnail'. + * @param string|array $attr Optional. Query string or array of attributes. + */ +function get_the_post_thumbnail( $post_id = null, $size = 'post-thumbnail', $attr = '' ) { + $post_id = ( null === $post_id ) ? get_the_ID() : $post_id; + $post_thumbnail_id = get_post_thumbnail_id( $post_id ); + $size = apply_filters( 'post_thumbnail_size', $size ); + if ( $post_thumbnail_id ) { + do_action( 'begin_fetch_post_thumbnail_html', $post_id, $post_thumbnail_id, $size ); // for "Just In Time" filtering of all of wp_get_attachment_image()'s filters + if ( in_the_loop() ) + update_post_thumbnail_cache(); + $html = wp_get_attachment_image( $post_thumbnail_id, $size, false, $attr ); + do_action( 'end_fetch_post_thumbnail_html', $post_id, $post_thumbnail_id, $size ); + } else { + $html = ''; + } + return apply_filters( 'post_thumbnail_html', $html, $post_id, $post_thumbnail_id, $size, $attr ); +} + +?> diff --git a/src/wp-includes/post.php b/src/wp-includes/post.php new file mode 100644 index 0000000..0cf04d5 --- /dev/null +++ b/src/wp-includes/post.php @@ -0,0 +1,5298 @@ + array( + 'name_admin_bar' => _x( 'Post', 'add new on admin bar' ), + ), + 'public' => true, + '_builtin' => true, /* internal use only. don't use this when registering your own post type. */ + '_edit_link' => 'post.php?post=%d', /* internal use only. don't use this when registering your own post type. */ + 'capability_type' => 'post', + 'map_meta_cap' => true, + 'hierarchical' => false, + 'rewrite' => false, + 'query_var' => false, + 'supports' => array( 'title', 'editor', 'author', 'thumbnail', 'excerpt', 'trackbacks', 'custom-fields', 'comments', 'revisions', 'post-formats' ), + ) ); + + register_post_type( 'page', array( + 'labels' => array( + 'name_admin_bar' => _x( 'Page', 'add new on admin bar' ), + ), + 'public' => true, + 'publicly_queryable' => false, + '_builtin' => true, /* internal use only. don't use this when registering your own post type. */ + '_edit_link' => 'post.php?post=%d', /* internal use only. don't use this when registering your own post type. */ + 'capability_type' => 'page', + 'map_meta_cap' => true, + 'hierarchical' => true, + 'rewrite' => false, + 'query_var' => false, + 'supports' => array( 'title', 'editor', 'author', 'thumbnail', 'page-attributes', 'custom-fields', 'comments', 'revisions' ), + ) ); + + register_post_type( 'attachment', array( + 'labels' => array( + 'name' => __( 'Media' ), + ), + 'public' => true, + 'show_ui' => false, + '_builtin' => true, /* internal use only. don't use this when registering your own post type. */ + '_edit_link' => 'media.php?attachment_id=%d', /* internal use only. don't use this when registering your own post type. */ + 'capability_type' => 'post', + 'map_meta_cap' => true, + 'hierarchical' => false, + 'rewrite' => false, + 'query_var' => false, + 'show_in_nav_menus' => false, + 'supports' => array( 'comments' ), + ) ); + + register_post_type( 'revision', array( + 'labels' => array( + 'name' => __( 'Revisions' ), + 'singular_name' => __( 'Revision' ), + ), + 'public' => false, + '_builtin' => true, /* internal use only. don't use this when registering your own post type. */ + '_edit_link' => 'revision.php?revision=%d', /* internal use only. don't use this when registering your own post type. */ + 'capability_type' => 'post', + 'map_meta_cap' => true, + 'hierarchical' => false, + 'rewrite' => false, + 'query_var' => false, + 'can_export' => false, + ) ); + + register_post_type( 'nav_menu_item', array( + 'labels' => array( + 'name' => __( 'Navigation Menu Items' ), + 'singular_name' => __( 'Navigation Menu Item' ), + ), + 'public' => false, + '_builtin' => true, /* internal use only. don't use this when registering your own post type. */ + 'hierarchical' => false, + 'rewrite' => false, + 'query_var' => false, + ) ); + + register_post_status( 'publish', array( + 'label' => _x( 'Published', 'post' ), + 'public' => true, + '_builtin' => true, /* internal use only. */ + 'label_count' => _n_noop( 'Published (%s)', 'Published (%s)' ), + ) ); + + register_post_status( 'future', array( + 'label' => _x( 'Scheduled', 'post' ), + 'protected' => true, + '_builtin' => true, /* internal use only. */ + 'label_count' => _n_noop('Scheduled (%s)', 'Scheduled (%s)' ), + ) ); + + register_post_status( 'draft', array( + 'label' => _x( 'Draft', 'post' ), + 'protected' => true, + '_builtin' => true, /* internal use only. */ + 'label_count' => _n_noop( 'Draft (%s)', 'Drafts (%s)' ), + ) ); + + register_post_status( 'pending', array( + 'label' => _x( 'Pending', 'post' ), + 'protected' => true, + '_builtin' => true, /* internal use only. */ + 'label_count' => _n_noop( 'Pending (%s)', 'Pending (%s)' ), + ) ); + + register_post_status( 'private', array( + 'label' => _x( 'Private', 'post' ), + 'private' => true, + '_builtin' => true, /* internal use only. */ + 'label_count' => _n_noop( 'Private (%s)', 'Private (%s)' ), + ) ); + + register_post_status( 'trash', array( + 'label' => _x( 'Trash', 'post' ), + 'internal' => true, + '_builtin' => true, /* internal use only. */ + 'label_count' => _n_noop( 'Trash (%s)', 'Trash (%s)' ), + 'show_in_admin_status_list' => true, + ) ); + + register_post_status( 'auto-draft', array( + 'label' => 'auto-draft', + 'internal' => true, + '_builtin' => true, /* internal use only. */ + ) ); + + register_post_status( 'inherit', array( + 'label' => 'inherit', + 'internal' => true, + '_builtin' => true, /* internal use only. */ + 'exclude_from_search' => false, + ) ); +} +add_action( 'init', 'create_initial_post_types', 0 ); // highest priority + +/** + * Retrieve attached file path based on attachment ID. + * + * You can optionally send it through the 'get_attached_file' filter, but by + * default it will just return the file path unfiltered. + * + * The function works by getting the single post meta name, named + * '_wp_attached_file' and returning it. This is a convenience function to + * prevent looking up the meta name and provide a mechanism for sending the + * attached filename through a filter. + * + * @since 2.0.0 + * @uses apply_filters() Calls 'get_attached_file' on file path and attachment ID. + * + * @param int $attachment_id Attachment ID. + * @param bool $unfiltered Whether to apply filters. + * @return string The file path to the attached file. + */ +function get_attached_file( $attachment_id, $unfiltered = false ) { + $file = get_post_meta( $attachment_id, '_wp_attached_file', true ); + // If the file is relative, prepend upload dir + if ( 0 !== strpos($file, '/') && !preg_match('|^.:\\\|', $file) && ( ($uploads = wp_upload_dir()) && false === $uploads['error'] ) ) + $file = $uploads['basedir'] . "/$file"; + if ( $unfiltered ) + return $file; + return apply_filters( 'get_attached_file', $file, $attachment_id ); +} + +/** + * Update attachment file path based on attachment ID. + * + * Used to update the file path of the attachment, which uses post meta name + * '_wp_attached_file' to store the path of the attachment. + * + * @since 2.1.0 + * @uses apply_filters() Calls 'update_attached_file' on file path and attachment ID. + * + * @param int $attachment_id Attachment ID + * @param string $file File path for the attachment + * @return bool False on failure, true on success. + */ +function update_attached_file( $attachment_id, $file ) { + if ( !get_post( $attachment_id ) ) + return false; + + $file = apply_filters( 'update_attached_file', $file, $attachment_id ); + $file = _wp_relative_upload_path($file); + + return update_post_meta( $attachment_id, '_wp_attached_file', $file ); +} + +/** + * Return relative path to an uploaded file. + * + * The path is relative to the current upload dir. + * + * @since 2.9.0 + * @uses apply_filters() Calls '_wp_relative_upload_path' on file path. + * + * @param string $path Full path to the file + * @return string relative path on success, unchanged path on failure. + */ +function _wp_relative_upload_path( $path ) { + $new_path = $path; + + if ( ($uploads = wp_upload_dir()) && false === $uploads['error'] ) { + if ( 0 === strpos($new_path, $uploads['basedir']) ) { + $new_path = str_replace($uploads['basedir'], '', $new_path); + $new_path = ltrim($new_path, '/'); + } + } + + return apply_filters( '_wp_relative_upload_path', $new_path, $path ); +} + +/** + * Retrieve all children of the post parent ID. + * + * Normally, without any enhancements, the children would apply to pages. In the + * context of the inner workings of WordPress, pages, posts, and attachments + * share the same table, so therefore the functionality could apply to any one + * of them. It is then noted that while this function does not work on posts, it + * does not mean that it won't work on posts. It is recommended that you know + * what context you wish to retrieve the children of. + * + * Attachments may also be made the child of a post, so if that is an accurate + * statement (which needs to be verified), it would then be possible to get + * all of the attachments for a post. Attachments have since changed since + * version 2.5, so this is most likely unaccurate, but serves generally as an + * example of what is possible. + * + * The arguments listed as defaults are for this function and also of the + * {@link get_posts()} function. The arguments are combined with the + * get_children defaults and are then passed to the {@link get_posts()} + * function, which accepts additional arguments. You can replace the defaults in + * this function, listed below and the additional arguments listed in the + * {@link get_posts()} function. + * + * The 'post_parent' is the most important argument and important attention + * needs to be paid to the $args parameter. If you pass either an object or an + * integer (number), then just the 'post_parent' is grabbed and everything else + * is lost. If you don't specify any arguments, then it is assumed that you are + * in The Loop and the post parent will be grabbed for from the current post. + * + * The 'post_parent' argument is the ID to get the children. The 'numberposts' + * is the amount of posts to retrieve that has a default of '-1', which is + * used to get all of the posts. Giving a number higher than 0 will only + * retrieve that amount of posts. + * + * The 'post_type' and 'post_status' arguments can be used to choose what + * criteria of posts to retrieve. The 'post_type' can be anything, but WordPress + * post types are 'post', 'pages', and 'attachments'. The 'post_status' + * argument will accept any post status within the write administration panels. + * + * @see get_posts() Has additional arguments that can be replaced. + * @internal Claims made in the long description might be inaccurate. + * + * @since 2.0.0 + * + * @param mixed $args Optional. User defined arguments for replacing the defaults. + * @param string $output Optional. Constant for return type, either OBJECT (default), ARRAY_A, ARRAY_N. + * @return array|bool False on failure and the type will be determined by $output parameter. + */ +function get_children($args = '', $output = OBJECT) { + $kids = array(); + if ( empty( $args ) ) { + if ( isset( $GLOBALS['post'] ) ) { + $args = array('post_parent' => (int) $GLOBALS['post']->post_parent ); + } else { + return $kids; + } + } elseif ( is_object( $args ) ) { + $args = array('post_parent' => (int) $args->post_parent ); + } elseif ( is_numeric( $args ) ) { + $args = array('post_parent' => (int) $args); + } + + $defaults = array( + 'numberposts' => -1, 'post_type' => 'any', + 'post_status' => 'any', 'post_parent' => 0, + ); + + $r = wp_parse_args( $args, $defaults ); + + $children = get_posts( $r ); + + if ( !$children ) + return $kids; + + update_post_cache($children); + + foreach ( $children as $key => $child ) + $kids[$child->ID] = $children[$key]; + + if ( $output == OBJECT ) { + return $kids; + } elseif ( $output == ARRAY_A ) { + foreach ( (array) $kids as $kid ) + $weeuns[$kid->ID] = get_object_vars($kids[$kid->ID]); + return $weeuns; + } elseif ( $output == ARRAY_N ) { + foreach ( (array) $kids as $kid ) + $babes[$kid->ID] = array_values(get_object_vars($kids[$kid->ID])); + return $babes; + } else { + return $kids; + } +} + +/** + * Get extended entry info (). + * + * There should not be any space after the second dash and before the word + * 'more'. There can be text or space(s) after the word 'more', but won't be + * referenced. + * + * The returned array has 'main' and 'extended' keys. Main has the text before + * the . The 'extended' key has the content after the + * comment. + * + * @since 1.0.0 + * + * @param string $post Post content. + * @return array Post before ('main') and after ('extended'). + */ +function get_extended($post) { + //Match the new style more links + if ( preg_match('//', $post, $matches) ) { + list($main, $extended) = explode($matches[0], $post, 2); + } else { + $main = $post; + $extended = ''; + } + + // Strip leading and trailing whitespace + $main = preg_replace('/^[\s]*(.*)[\s]*$/', '\\1', $main); + $extended = preg_replace('/^[\s]*(.*)[\s]*$/', '\\1', $extended); + + return array('main' => $main, 'extended' => $extended); +} + +/** + * Retrieves post data given a post ID or post object. + * + * See {@link sanitize_post()} for optional $filter values. Also, the parameter + * $post, must be given as a variable, since it is passed by reference. + * + * @since 1.5.1 + * @uses $wpdb + * @link http://codex.wordpress.org/Function_Reference/get_post + * + * @param int|object $post Post ID or post object. + * @param string $output Optional, default is Object. Either OBJECT, ARRAY_A, or ARRAY_N. + * @param string $filter Optional, default is raw. + * @return mixed Post data + */ +function &get_post(&$post, $output = OBJECT, $filter = 'raw') { + global $wpdb; + $null = null; + + if ( empty($post) ) { + if ( isset($GLOBALS['post']) ) + $_post = & $GLOBALS['post']; + else + return $null; + } elseif ( is_object($post) && empty($post->filter) ) { + _get_post_ancestors($post); + $_post = sanitize_post($post, 'raw'); + wp_cache_add($post->ID, $_post, 'posts'); + } else { + if ( is_object($post) ) + $post_id = $post->ID; + else + $post_id = $post; + + $post_id = (int) $post_id; + if ( ! $_post = wp_cache_get($post_id, 'posts') ) { + $_post = $wpdb->get_row($wpdb->prepare("SELECT * FROM $wpdb->posts WHERE ID = %d LIMIT 1", $post_id)); + if ( ! $_post ) + return $null; + _get_post_ancestors($_post); + $_post = sanitize_post($_post, 'raw'); + wp_cache_add($_post->ID, $_post, 'posts'); + } + } + + if ($filter != 'raw') + $_post = sanitize_post($_post, $filter); + + if ( $output == OBJECT ) { + return $_post; + } elseif ( $output == ARRAY_A ) { + $__post = get_object_vars($_post); + return $__post; + } elseif ( $output == ARRAY_N ) { + $__post = array_values(get_object_vars($_post)); + return $__post; + } else { + return $_post; + } +} + +/** + * Retrieve ancestors of a post. + * + * @since 2.5.0 + * + * @param int|object $post Post ID or post object + * @return array Ancestor IDs or empty array if none are found. + */ +function get_post_ancestors($post) { + $post = get_post($post); + + if ( !empty($post->ancestors) ) + return $post->ancestors; + + return array(); +} + +/** + * Retrieve data from a post field based on Post ID. + * + * Examples of the post field will be, 'post_type', 'post_status', 'content', + * etc and based off of the post object property or key names. + * + * The context values are based off of the taxonomy filter functions and + * supported values are found within those functions. + * + * @since 2.3.0 + * @uses sanitize_post_field() See for possible $context values. + * + * @param string $field Post field name + * @param id $post Post ID + * @param string $context Optional. How to filter the field. Default is display. + * @return WP_Error|string Value in post field or WP_Error on failure + */ +function get_post_field( $field, $post, $context = 'display' ) { + $post = (int) $post; + $post = get_post( $post ); + + if ( is_wp_error($post) ) + return $post; + + if ( !is_object($post) ) + return ''; + + if ( !isset($post->$field) ) + return ''; + + return sanitize_post_field($field, $post->$field, $post->ID, $context); +} + +/** + * Retrieve the mime type of an attachment based on the ID. + * + * This function can be used with any post type, but it makes more sense with + * attachments. + * + * @since 2.0.0 + * + * @param int $ID Optional. Post ID. + * @return bool|string False on failure or returns the mime type + */ +function get_post_mime_type($ID = '') { + $post = & get_post($ID); + + if ( is_object($post) ) + return $post->post_mime_type; + + return false; +} + +/** + * Retrieve the format slug for a post + * + * @since 3.1.0 + * + * @param int|object $post A post + * + * @return mixed The format if successful. False if no format is set. WP_Error if errors. + */ +function get_post_format( $post = null ) { + $post = get_post($post); + + if ( ! post_type_supports( $post->post_type, 'post-formats' ) ) + return false; + + $_format = get_the_terms( $post->ID, 'post_format' ); + + if ( empty( $_format ) ) + return false; + + $format = array_shift( $_format ); + + return ( str_replace('post-format-', '', $format->slug ) ); +} + +/** + * Check if a post has a particular format + * + * @since 3.1.0 + * @uses has_term() + * + * @param string $format The format to check for + * @param object|id $post The post to check. If not supplied, defaults to the current post if used in the loop. + * @return bool True if the post has the format, false otherwise. + */ +function has_post_format( $format, $post = null ) { + return has_term('post-format-' . sanitize_key($format), 'post_format', $post); +} + +/** + * Assign a format to a post + * + * @since 3.1.0 + * + * @param int|object $post The post for which to assign a format + * @param string $format A format to assign. Use an empty string or array to remove all formats from the post. + * @return mixed WP_Error on error. Array of affected term IDs on success. + */ +function set_post_format( $post, $format ) { + $post = get_post($post); + + if ( empty($post) ) + return new WP_Error('invalid_post', __('Invalid post')); + + if ( !empty($format) ) { + $format = sanitize_key($format); + if ( 'standard' == $format || !in_array( $format, array_keys( get_post_format_slugs() ) ) ) + $format = ''; + else + $format = 'post-format-' . $format; + } + + return wp_set_post_terms($post->ID, $format, 'post_format'); +} + +/** + * Retrieve the post status based on the Post ID. + * + * If the post ID is of an attachment, then the parent post status will be given + * instead. + * + * @since 2.0.0 + * + * @param int $ID Post ID + * @return string|bool Post status or false on failure. + */ +function get_post_status($ID = '') { + $post = get_post($ID); + + if ( !is_object($post) ) + return false; + + if ( 'attachment' == $post->post_type ) { + if ( 'private' == $post->post_status ) + return 'private'; + + // Unattached attachments are assumed to be published + if ( ( 'inherit' == $post->post_status ) && ( 0 == $post->post_parent) ) + return 'publish'; + + // Inherit status from the parent + if ( $post->post_parent && ( $post->ID != $post->post_parent ) ) + return get_post_status($post->post_parent); + } + + return $post->post_status; +} + +/** + * Retrieve all of the WordPress supported post statuses. + * + * Posts have a limited set of valid status values, this provides the + * post_status values and descriptions. + * + * @since 2.5.0 + * + * @return array List of post statuses. + */ +function get_post_statuses( ) { + $status = array( + 'draft' => __('Draft'), + 'pending' => __('Pending Review'), + 'private' => __('Private'), + 'publish' => __('Published') + ); + + return $status; +} + +/** + * Retrieve all of the WordPress support page statuses. + * + * Pages have a limited set of valid status values, this provides the + * post_status values and descriptions. + * + * @since 2.5.0 + * + * @return array List of page statuses. + */ +function get_page_statuses( ) { + $status = array( + 'draft' => __('Draft'), + 'private' => __('Private'), + 'publish' => __('Published') + ); + + return $status; +} + +/** + * Register a post type. Do not use before init. + * + * A simple function for creating or modifying a post status based on the + * parameters given. The function will accept an array (second optional + * parameter), along with a string for the post status name. + * + * + * Optional $args contents: + * + * label - A descriptive name for the post status marked for translation. Defaults to $post_status. + * public - Whether posts of this status should be shown in the front end of the site. Defaults to true. + * exclude_from_search - Whether to exclude posts with this post status from search results. Defaults to false. + * show_in_admin_all_list - Whether to include posts in the edit listing for their post type + * show_in_admin_status_list - Show in the list of statuses with post counts at the top of the edit + * listings, e.g. All (12) | Published (9) | My Custom Status (2) ... + * + * Arguments prefixed with an _underscore shouldn't be used by plugins and themes. + * + * @package WordPress + * @subpackage Post + * @since 3.0.0 + * @uses $wp_post_statuses Inserts new post status object into the list + * + * @param string $post_status Name of the post status. + * @param array|string $args See above description. + */ +function register_post_status($post_status, $args = array()) { + global $wp_post_statuses; + + if (!is_array($wp_post_statuses)) + $wp_post_statuses = array(); + + // Args prefixed with an underscore are reserved for internal use. + $defaults = array('label' => false, 'label_count' => false, 'exclude_from_search' => null, '_builtin' => false, '_edit_link' => 'post.php?post=%d', 'capability_type' => 'post', 'hierarchical' => false, 'public' => null, 'internal' => null, 'protected' => null, 'private' => null, 'show_in_admin_all' => null, 'publicly_queryable' => null, 'show_in_admin_status_list' => null, 'show_in_admin_all_list' => null, 'single_view_cap' => null); + $args = wp_parse_args($args, $defaults); + $args = (object) $args; + + $post_status = sanitize_key($post_status); + $args->name = $post_status; + + if ( null === $args->public && null === $args->internal && null === $args->protected && null === $args->private ) + $args->internal = true; + + if ( null === $args->public ) + $args->public = false; + + if ( null === $args->private ) + $args->private = false; + + if ( null === $args->protected ) + $args->protected = false; + + if ( null === $args->internal ) + $args->internal = false; + + if ( null === $args->publicly_queryable ) + $args->publicly_queryable = $args->public; + + if ( null === $args->exclude_from_search ) + $args->exclude_from_search = $args->internal; + + if ( null === $args->show_in_admin_all_list ) + $args->show_in_admin_all_list = !$args->internal; + + if ( null === $args->show_in_admin_status_list ) + $args->show_in_admin_status_list = !$args->internal; + + if ( null === $args->single_view_cap ) + $args->single_view_cap = $args->public ? '' : 'edit'; + + if ( false === $args->label ) + $args->label = $post_status; + + if ( false === $args->label_count ) + $args->label_count = array( $args->label, $args->label ); + + $wp_post_statuses[$post_status] = $args; + + return $args; +} + +/** + * Retrieve a post status object by name + * + * @package WordPress + * @subpackage Post + * @since 3.0.0 + * @uses $wp_post_statuses + * @see register_post_status + * @see get_post_statuses + * + * @param string $post_status The name of a registered post status + * @return object A post status object + */ +function get_post_status_object( $post_status ) { + global $wp_post_statuses; + + if ( empty($wp_post_statuses[$post_status]) ) + return null; + + return $wp_post_statuses[$post_status]; +} + +/** + * Get a list of all registered post status objects. + * + * @package WordPress + * @subpackage Post + * @since 3.0.0 + * @uses $wp_post_statuses + * @see register_post_status + * @see get_post_status_object + * + * @param array|string $args An array of key => value arguments to match against the post status objects. + * @param string $output The type of output to return, either post status 'names' or 'objects'. 'names' is the default. + * @param string $operator The logical operation to perform. 'or' means only one element + * from the array needs to match; 'and' means all elements must match. The default is 'and'. + * @return array A list of post type names or objects + */ +function get_post_stati( $args = array(), $output = 'names', $operator = 'and' ) { + global $wp_post_statuses; + + $field = ('names' == $output) ? 'name' : false; + + return wp_filter_object_list($wp_post_statuses, $args, $operator, $field); +} + +/** + * Whether the post type is hierarchical. + * + * A false return value might also mean that the post type does not exist. + * + * @since 3.0.0 + * @see get_post_type_object + * + * @param string $post_type Post type name + * @return bool Whether post type is hierarchical. + */ +function is_post_type_hierarchical( $post_type ) { + if ( ! post_type_exists( $post_type ) ) + return false; + + $post_type = get_post_type_object( $post_type ); + return $post_type->hierarchical; +} + +/** + * Checks if a post type is registered. + * + * @since 3.0.0 + * @uses get_post_type_object() + * + * @param string $post_type Post type name + * @return bool Whether post type is registered. + */ +function post_type_exists( $post_type ) { + return (bool) get_post_type_object( $post_type ); +} + +/** + * Retrieve the post type of the current post or of a given post. + * + * @since 2.1.0 + * + * @uses $post The Loop current post global + * + * @param mixed $the_post Optional. Post object or post ID. + * @return bool|string post type or false on failure. + */ +function get_post_type( $the_post = false ) { + global $post; + + if ( false === $the_post ) + $the_post = $post; + elseif ( is_numeric($the_post) ) + $the_post = get_post($the_post); + + if ( is_object($the_post) ) + return $the_post->post_type; + + return false; +} + +/** + * Retrieve a post type object by name + * + * @package WordPress + * @subpackage Post + * @since 3.0.0 + * @uses $wp_post_types + * @see register_post_type + * @see get_post_types + * + * @param string $post_type The name of a registered post type + * @return object A post type object + */ +function get_post_type_object( $post_type ) { + global $wp_post_types; + + if ( empty($wp_post_types[$post_type]) ) + return null; + + return $wp_post_types[$post_type]; +} + +/** + * Get a list of all registered post type objects. + * + * @package WordPress + * @subpackage Post + * @since 2.9.0 + * @uses $wp_post_types + * @see register_post_type + * + * @param array|string $args An array of key => value arguments to match against the post type objects. + * @param string $output The type of output to return, either post type 'names' or 'objects'. 'names' is the default. + * @param string $operator The logical operation to perform. 'or' means only one element + * from the array needs to match; 'and' means all elements must match. The default is 'and'. + * @return array A list of post type names or objects + */ +function get_post_types( $args = array(), $output = 'names', $operator = 'and' ) { + global $wp_post_types; + + $field = ('names' == $output) ? 'name' : false; + + return wp_filter_object_list($wp_post_types, $args, $operator, $field); +} + +/** + * Register a post type. Do not use before init. + * + * A function for creating or modifying a post type based on the + * parameters given. The function will accept an array (second optional + * parameter), along with a string for the post type name. + * + * Optional $args contents: + * + * - label - Name of the post type shown in the menu. Usually plural. If not set, labels['name'] will be used. + * - description - A short descriptive summary of what the post type is. Defaults to blank. + * - public - Whether posts of this type should be shown in the admin UI. Defaults to false. + * - exclude_from_search - Whether to exclude posts with this post type from search results. + * Defaults to true if the type is not public, false if the type is public. + * - publicly_queryable - Whether post_type queries can be performed from the front page. + * Defaults to whatever public is set as. + * - show_ui - Whether to generate a default UI for managing this post type. Defaults to true + * if the type is public, false if the type is not public. + * - show_in_menu - Where to show the post type in the admin menu. True for a top level menu, + * false for no menu, or can be a top level page like 'tools.php' or 'edit.php?post_type=page'. + * show_ui must be true. + * - menu_position - The position in the menu order the post type should appear. Defaults to the bottom. + * - menu_icon - The url to the icon to be used for this menu. Defaults to use the posts icon. + * - capability_type - The string to use to build the read, edit, and delete capabilities. Defaults to 'post'. + * 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'). + * - capabilities - Array of capabilities for this post type. By default the capability_type is used + * as a base to construct capabilities. You can see accepted values in {@link get_post_type_capabilities()}. + * - map_meta_cap - Whether to use the internal default meta capability handling. Defaults to false. + * - hierarchical - Whether the post type is hierarchical. Defaults to false. + * - supports - An alias for calling add_post_type_support() directly. See {@link add_post_type_support()} + * for documentation. Defaults to none. + * - register_meta_box_cb - Provide a callback function that will be called when setting up the + * meta boxes for the edit form. Do remove_meta_box() and add_meta_box() calls in the callback. + * - taxonomies - An array of taxonomy identifiers that will be registered for the post type. + * Default is no taxonomies. Taxonomies can be registered later with register_taxonomy() or + * register_taxonomy_for_object_type(). + * - labels - An array of labels for this post type. By default post labels are used for non-hierarchical + * types and page labels for hierarchical ones. You can see accepted values in {@link get_post_type_labels()}. + * - permalink_epmask - The default rewrite endpoint bitmasks. + * - has_archive - True to enable post type archives. Will generate the proper rewrite rules if rewrite is enabled. + * - rewrite - false to prevent rewrite. Defaults to true. Use array('slug'=>$slug) to customize permastruct; + * default will use $post_type as slug. Other options include 'with_front', 'feeds', and 'pages'. + * - query_var - false to prevent queries, or string to value of the query var to use for this post type + * - can_export - true allows this post type to be exported. + * - show_in_nav_menus - true makes this post type available for selection in navigation menus. + * - _builtin - true if this post type is a native or "built-in" post_type. THIS IS FOR INTERNAL USE ONLY! + * - _edit_link - URL segement to use for edit link of this post type. THIS IS FOR INTERNAL USE ONLY! + * + * @since 2.9.0 + * @uses $wp_post_types Inserts new post type object into the list + * + * @param string $post_type Name of the post type. + * @param array|string $args See above description. + * @return object|WP_Error the registered post type object, or an error object + */ +function register_post_type($post_type, $args = array()) { + global $wp_post_types, $wp_rewrite, $wp; + + if ( !is_array($wp_post_types) ) + $wp_post_types = array(); + + // Args prefixed with an underscore are reserved for internal use. + $defaults = array( + 'labels' => array(), 'description' => '', 'publicly_queryable' => null, 'exclude_from_search' => null, + 'capability_type' => 'post', 'capabilities' => array(), 'map_meta_cap' => null, + '_builtin' => false, '_edit_link' => 'post.php?post=%d', 'hierarchical' => false, + 'public' => false, 'rewrite' => true, 'has_archive' => false, 'query_var' => true, + 'supports' => array(), 'register_meta_box_cb' => null, + 'taxonomies' => array(), 'show_ui' => null, 'menu_position' => null, 'menu_icon' => null, + 'permalink_epmask' => EP_PERMALINK, 'can_export' => true, + 'show_in_nav_menus' => null, 'show_in_menu' => null, 'show_in_admin_bar' => null, + ); + $args = wp_parse_args($args, $defaults); + $args = (object) $args; + + $post_type = sanitize_key($post_type); + $args->name = $post_type; + + if ( strlen( $post_type ) > 20 ) + return new WP_Error( 'post_type_too_long', __( 'Post types cannot exceed 20 characters in length' ) ); + + // 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 = true === $args->show_in_menu; + + // Whether to show this type in nav-menus.php. Defaults 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 ( null === $args->map_meta_cap ) + $args->map_meta_cap = false; + + $args->cap = get_post_type_capabilities( $args ); + unset($args->capabilities); + + if ( is_array( $args->capability_type ) ) + $args->capability_type = $args->capability_type[0]; + + if ( ! empty($args->supports) ) { + add_post_type_support($post_type, $args->supports); + unset($args->supports); + } else { + // Add default features + add_post_type_support($post_type, array('title', 'editor')); + } + + if ( false !== $args->query_var && !empty($wp) ) { + if ( true === $args->query_var ) + $args->query_var = $post_type; + $args->query_var = sanitize_title_with_dashes($args->query_var); + $wp->add_query_var($args->query_var); + } + + if ( false !== $args->rewrite && '' != get_option('permalink_structure') ) { + if ( ! is_array( $args->rewrite ) ) + $args->rewrite = array(); + if ( empty( $args->rewrite['slug'] ) ) + $args->rewrite['slug'] = $post_type; + 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 ( $args->hierarchical ) + $wp_rewrite->add_rewrite_tag("%$post_type%", '(.+?)', $args->query_var ? "{$args->query_var}=" : "post_type=$post_type&name="); + else + $wp_rewrite->add_rewrite_tag("%$post_type%", '([^/]+)', $args->query_var ? "{$args->query_var}=" : "post_type=$post_type&name="); + + if ( $args->has_archive ) { + $archive_slug = $args->has_archive === true ? $args->rewrite['slug'] : $args->has_archive; + if ( $args->rewrite['with_front'] ) + $archive_slug = substr( $wp_rewrite->front, 1 ) . $archive_slug; + else + $archive_slug = $wp_rewrite->root . $archive_slug; + + $wp_rewrite->add_rule( "{$archive_slug}/?$", "index.php?post_type=$post_type", 'top' ); + if ( $args->rewrite['feeds'] && $wp_rewrite->feeds ) { + $feeds = '(' . trim( implode( '|', $wp_rewrite->feeds ) ) . ')'; + $wp_rewrite->add_rule( "{$archive_slug}/feed/$feeds/?$", "index.php?post_type=$post_type" . '&feed=$matches[1]', 'top' ); + $wp_rewrite->add_rule( "{$archive_slug}/$feeds/?$", "index.php?post_type=$post_type" . '&feed=$matches[1]', 'top' ); + } + if ( $args->rewrite['pages'] ) + $wp_rewrite->add_rule( "{$archive_slug}/{$wp_rewrite->pagination_base}/([0-9]{1,})/?$", "index.php?post_type=$post_type" . '&paged=$matches[1]', 'top' ); + } + + $wp_rewrite->add_permastruct($post_type, "{$args->rewrite['slug']}/%$post_type%", $args->rewrite['with_front'], $args->permalink_epmask); + } + + if ( $args->register_meta_box_cb ) + add_action('add_meta_boxes_' . $post_type, $args->register_meta_box_cb, 10, 1); + + $args->labels = get_post_type_labels( $args ); + $args->label = $args->labels->name; + + $wp_post_types[$post_type] = $args; + + add_action( 'future_' . $post_type, '_future_post_hook', 5, 2 ); + + foreach ( $args->taxonomies as $taxonomy ) { + register_taxonomy_for_object_type( $taxonomy, $post_type ); + } + + return $args; +} + +/** + * Builds an object with all post type capabilities out of a post type object + * + * Post type capabilities use the 'capability_type' argument as a base, if the + * capability is not set in the 'capabilities' argument array or if the + * 'capabilities' argument is not supplied. + * + * The capability_type argument can optionally be registered as an array, with + * the first value being singular and the second plural, e.g. array('story, 'stories') + * Otherwise, an 's' will be added to the value for the plural form. After + * registration, capability_type will always be a string of the singular value. + * + * By default, seven keys are accepted as part of the capabilities array: + * + * - edit_post, read_post, and delete_post are meta capabilities, which are then + * generally mapped to corresponding primitive capabilities depending on the + * context, which would be the post being edited/read/deleted and the user or + * role being checked. Thus these capabilities would generally not be granted + * directly to users or roles. + * + * - edit_posts - Controls whether objects of this post type can be edited. + * - edit_others_posts - Controls whether objects of this type owned by other users + * can be edited. If the post type does not support an author, then this will + * behave like edit_posts. + * - publish_posts - Controls publishing objects of this post type. + * - read_private_posts - Controls whether private objects can be read. + + * These four primitive capabilities are checked in core in various locations. + * There are also seven other primitive capabilities which are not referenced + * directly in core, except in map_meta_cap(), which takes the three aforementioned + * meta capabilities and translates them into one or more primitive capabilities + * that must then be checked against the user or role, depending on the context. + * + * - read - Controls whether objects of this post type can be read. + * - delete_posts - Controls whether objects of this post type can be deleted. + * - delete_private_posts - Controls whether private objects can be deleted. + * - delete_published_posts - Controls whether published objects can be deleted. + * - delete_others_posts - Controls whether objects owned by other users can be + * can be deleted. If the post type does not support an author, then this will + * behave like delete_posts. + * - edit_private_posts - Controls whether private objects can be edited. + * - edit_published_posts - Controls whether published objects can be edited. + * + * These additional capabilities are only used in map_meta_cap(). Thus, they are + * only assigned by default if the post type is registered with the 'map_meta_cap' + * argument set to true (default is false). + * + * @see map_meta_cap() + * @since 3.0.0 + * + * @param object $args Post type registration arguments + * @return object object with all the capabilities as member variables + */ +function get_post_type_capabilities( $args ) { + if ( ! is_array( $args->capability_type ) ) + $args->capability_type = array( $args->capability_type, $args->capability_type . 's' ); + + // Singular base for meta capabilities, plural base for primitive capabilities. + list( $singular_base, $plural_base ) = $args->capability_type; + + $default_capabilities = array( + // Meta capabilities + 'edit_post' => 'edit_' . $singular_base, + 'read_post' => 'read_' . $singular_base, + 'delete_post' => 'delete_' . $singular_base, + // Primitive capabilities used outside of map_meta_cap(): + 'edit_posts' => 'edit_' . $plural_base, + 'edit_others_posts' => 'edit_others_' . $plural_base, + 'publish_posts' => 'publish_' . $plural_base, + 'read_private_posts' => 'read_private_' . $plural_base, + ); + + // Primitive capabilities used within map_meta_cap(): + if ( $args->map_meta_cap ) { + $default_capabilities_for_mapping = array( + 'read' => 'read', + 'delete_posts' => 'delete_' . $plural_base, + 'delete_private_posts' => 'delete_private_' . $plural_base, + 'delete_published_posts' => 'delete_published_' . $plural_base, + 'delete_others_posts' => 'delete_others_' . $plural_base, + 'edit_private_posts' => 'edit_private_' . $plural_base, + 'edit_published_posts' => 'edit_published_' . $plural_base, + ); + $default_capabilities = array_merge( $default_capabilities, $default_capabilities_for_mapping ); + } + + $capabilities = array_merge( $default_capabilities, $args->capabilities ); + + // Remember meta capabilities for future reference. + if ( $args->map_meta_cap ) + _post_type_meta_capabilities( $capabilities ); + + return (object) $capabilities; +} + +/** + * Stores or returns a list of post type meta caps for map_meta_cap(). + * + * @since 3.1.0 + * @access private + */ +function _post_type_meta_capabilities( $capabilities = null ) { + static $meta_caps = array(); + if ( null === $capabilities ) + return $meta_caps; + foreach ( $capabilities as $core => $custom ) { + if ( in_array( $core, array( 'read_post', 'delete_post', 'edit_post' ) ) ) + $meta_caps[ $custom ] = $core; + } +} + +/** + * Builds an object with all post type labels out of a post type object + * + * Accepted keys of the label array in the post type object: + * - name - general name for the post type, usually plural. The same and overriden by $post_type_object->label. Default is Posts/Pages + * - singular_name - name for one object of this post type. Default is Post/Page + * - add_new - Default is Add New for both hierarchical and non-hierarchical types. When internationalizing this string, please use a {@link http://codex.wordpress.org/I18n_for_WordPress_Developers#Disambiguation_by_context gettext context} matching your post type. Example: _x('Add New', 'product'); + * - add_new_item - Default is Add New Post/Add New Page + * - edit_item - Default is Edit Post/Edit Page + * - new_item - Default is New Post/New Page + * - view_item - Default is View Post/View Page + * - search_items - Default is Search Posts/Search Pages + * - not_found - Default is No posts found/No pages found + * - not_found_in_trash - Default is No posts found in Trash/No pages found in Trash + * - parent_item_colon - This string isn't used on non-hierarchical types. In hierarchical ones the default is Parent Page: + * + * Above, the first default value is for non-hierarchical post types (like posts) and the second one is for hierarchical post types (like pages). + * + * @since 3.0.0 + * @param object $post_type_object + * @return object object with all the labels as member variables + */ +function get_post_type_labels( $post_type_object ) { + $nohier_vs_hier_defaults = array( + 'name' => array( _x('Posts', 'post type general name'), _x('Pages', 'post type general name') ), + 'singular_name' => array( _x('Post', 'post type singular name'), _x('Page', 'post type singular name') ), + 'add_new' => array( _x('Add New', 'post'), _x('Add New', 'page') ), + 'add_new_item' => array( __('Add New Post'), __('Add New Page') ), + 'edit_item' => array( __('Edit Post'), __('Edit Page') ), + 'new_item' => array( __('New Post'), __('New Page') ), + 'view_item' => array( __('View Post'), __('View Page') ), + 'search_items' => array( __('Search Posts'), __('Search Pages') ), + 'not_found' => array( __('No posts found.'), __('No pages found.') ), + 'not_found_in_trash' => array( __('No posts found in Trash.'), __('No pages found in Trash.') ), + 'parent_item_colon' => array( null, __('Parent Page:') ), + 'all_items' => array( __( 'All Posts' ), __( 'All Pages' ) ) + ); + $nohier_vs_hier_defaults['menu_name'] = $nohier_vs_hier_defaults['name']; + return _get_custom_object_labels( $post_type_object, $nohier_vs_hier_defaults ); +} + +/** + * Builds an object with custom-something object (post type, taxonomy) labels out of a custom-something object + * + * @access private + * @since 3.0.0 + */ +function _get_custom_object_labels( $object, $nohier_vs_hier_defaults ) { + + if ( isset( $object->label ) && empty( $object->labels['name'] ) ) + $object->labels['name'] = $object->label; + + if ( !isset( $object->labels['singular_name'] ) && isset( $object->labels['name'] ) ) + $object->labels['singular_name'] = $object->labels['name']; + + if ( ! isset( $object->labels['name_admin_bar'] ) ) + $object->labels['name_admin_bar'] = isset( $object->labels['singular_name'] ) ? $object->labels['singular_name'] : $object->name; + + if ( !isset( $object->labels['menu_name'] ) && isset( $object->labels['name'] ) ) + $object->labels['menu_name'] = $object->labels['name']; + + if ( !isset( $object->labels['all_items'] ) && isset( $object->labels['menu_name'] ) ) + $object->labels['all_items'] = $object->labels['menu_name']; + + foreach ( $nohier_vs_hier_defaults as $key => $value ) + $defaults[$key] = $object->hierarchical ? $value[1] : $value[0]; + + $labels = array_merge( $defaults, $object->labels ); + return (object)$labels; +} + +/** + * Adds submenus for post types. + * + * @access private + * @since 3.1.0 + */ +function _add_post_type_submenus() { + foreach ( get_post_types( array( 'show_ui' => true ) ) as $ptype ) { + $ptype_obj = get_post_type_object( $ptype ); + // Submenus only. + if ( ! $ptype_obj->show_in_menu || $ptype_obj->show_in_menu === true ) + continue; + add_submenu_page( $ptype_obj->show_in_menu, $ptype_obj->labels->name, $ptype_obj->labels->all_items, $ptype_obj->cap->edit_posts, "edit.php?post_type=$ptype" ); + } +} +add_action( 'admin_menu', '_add_post_type_submenus' ); + +/** + * Register support of certain features for a post type. + * + * All features are directly associated with a functional area of the edit screen, such as the + * editor or a meta box: 'title', 'editor', 'comments', 'revisions', 'trackbacks', 'author', + * 'excerpt', 'page-attributes', 'thumbnail', and 'custom-fields'. + * + * Additionally, the 'revisions' feature dictates whether the post type will store revisions, + * and the 'comments' feature dicates whether the comments count will show on the edit screen. + * + * @since 3.0.0 + * @param string $post_type The post type for which to add the feature + * @param string|array $feature the feature being added, can be an array of feature strings or a single string + */ +function add_post_type_support( $post_type, $feature ) { + global $_wp_post_type_features; + + $features = (array) $feature; + foreach ($features as $feature) { + if ( func_num_args() == 2 ) + $_wp_post_type_features[$post_type][$feature] = true; + else + $_wp_post_type_features[$post_type][$feature] = array_slice( func_get_args(), 2 ); + } +} + +/** + * Remove support for a feature from a post type. + * + * @since 3.0.0 + * @param string $post_type The post type for which to remove the feature + * @param string $feature The feature being removed + */ +function remove_post_type_support( $post_type, $feature ) { + global $_wp_post_type_features; + + if ( !isset($_wp_post_type_features[$post_type]) ) + return; + + if ( isset($_wp_post_type_features[$post_type][$feature]) ) + unset($_wp_post_type_features[$post_type][$feature]); +} + +/** + * Checks a post type's support for a given feature + * + * @since 3.0.0 + * @param string $post_type The post type being checked + * @param string $feature the feature being checked + * @return boolean + */ + +function post_type_supports( $post_type, $feature ) { + global $_wp_post_type_features; + + if ( !isset( $_wp_post_type_features[$post_type][$feature] ) ) + return false; + + // If no args passed then no extra checks need be performed + if ( func_num_args() <= 2 ) + return true; + + // @todo Allow pluggable arg checking + //$args = array_slice( func_get_args(), 2 ); + + return true; +} + +/** + * Updates the post type for the post ID. + * + * The page or post cache will be cleaned for the post ID. + * + * @since 2.5.0 + * + * @uses $wpdb + * + * @param int $post_id Post ID to change post type. Not actually optional. + * @param string $post_type Optional, default is post. Supported values are 'post' or 'page' to + * name a few. + * @return int Amount of rows changed. Should be 1 for success and 0 for failure. + */ +function set_post_type( $post_id = 0, $post_type = 'post' ) { + global $wpdb; + + $post_type = sanitize_post_field('post_type', $post_type, $post_id, 'db'); + $return = $wpdb->update($wpdb->posts, array('post_type' => $post_type), array('ID' => $post_id) ); + + if ( 'page' == $post_type ) + clean_page_cache($post_id); + else + clean_post_cache($post_id); + + return $return; +} + +/** + * Retrieve list of latest posts or posts matching criteria. + * + * The defaults are as follows: + * 'numberposts' - Default is 5. Total number of posts to retrieve. + * 'offset' - Default is 0. See {@link WP_Query::query()} for more. + * 'category' - What category to pull the posts from. + * 'orderby' - Default is 'post_date'. How to order the posts. + * 'order' - Default is 'DESC'. The order to retrieve the posts. + * 'include' - See {@link WP_Query::query()} for more. + * 'exclude' - See {@link WP_Query::query()} for more. + * 'meta_key' - See {@link WP_Query::query()} for more. + * 'meta_value' - See {@link WP_Query::query()} for more. + * 'post_type' - Default is 'post'. Can be 'page', or 'attachment' to name a few. + * 'post_parent' - The parent of the post or post type. + * 'post_status' - Default is 'publish'. Post status to retrieve. + * + * @since 1.2.0 + * @uses $wpdb + * @uses WP_Query::query() See for more default arguments and information. + * @link http://codex.wordpress.org/Template_Tags/get_posts + * + * @param array $args Optional. Overrides defaults. + * @return array List of posts. + */ +function get_posts($args = null) { + $defaults = array( + 'numberposts' => 5, 'offset' => 0, + 'category' => 0, 'orderby' => 'post_date', + 'order' => 'DESC', 'include' => array(), + 'exclude' => array(), 'meta_key' => '', + 'meta_value' =>'', 'post_type' => 'post', + 'suppress_filters' => true + ); + + $r = wp_parse_args( $args, $defaults ); + if ( empty( $r['post_status'] ) ) + $r['post_status'] = ( 'attachment' == $r['post_type'] ) ? 'inherit' : 'publish'; + if ( ! empty($r['numberposts']) && empty($r['posts_per_page']) ) + $r['posts_per_page'] = $r['numberposts']; + if ( ! empty($r['category']) ) + $r['cat'] = $r['category']; + if ( ! empty($r['include']) ) { + $incposts = wp_parse_id_list( $r['include'] ); + $r['posts_per_page'] = count($incposts); // only the number of posts included + $r['post__in'] = $incposts; + } elseif ( ! empty($r['exclude']) ) + $r['post__not_in'] = wp_parse_id_list( $r['exclude'] ); + + $r['ignore_sticky_posts'] = true; + $r['no_found_rows'] = true; + + $get_posts = new WP_Query; + return $get_posts->query($r); + +} + +// +// Post meta functions +// + +/** + * Add meta data field to a post. + * + * Post meta data is called "Custom Fields" on the Administration Screen. + * + * @since 1.5.0 + * @uses $wpdb + * @link http://codex.wordpress.org/Function_Reference/add_post_meta + * + * @param int $post_id Post 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 bool False for failure. True for success. + */ +function add_post_meta($post_id, $meta_key, $meta_value, $unique = false) { + // make sure meta is added to the post, not a revision + if ( $the_post = wp_is_post_revision($post_id) ) + $post_id = $the_post; + + return add_metadata('post', $post_id, $meta_key, $meta_value, $unique); +} + +/** + * Remove metadata matching criteria from a post. + * + * 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 1.5.0 + * @uses $wpdb + * @link http://codex.wordpress.org/Function_Reference/delete_post_meta + * + * @param int $post_id post ID + * @param string $meta_key Metadata name. + * @param mixed $meta_value Optional. Metadata value. + * @return bool False for failure. True for success. + */ +function delete_post_meta($post_id, $meta_key, $meta_value = '') { + // make sure meta is added to the post, not a revision + if ( $the_post = wp_is_post_revision($post_id) ) + $post_id = $the_post; + + return delete_metadata('post', $post_id, $meta_key, $meta_value); +} + +/** + * Retrieve post meta field for a post. + * + * @since 1.5.0 + * @uses $wpdb + * @link http://codex.wordpress.org/Function_Reference/get_post_meta + * + * @param int $post_id Post ID. + * @param string $key The meta key to retrieve. + * @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_post_meta($post_id, $key, $single = false) { + return get_metadata('post', $post_id, $key, $single); +} + +/** + * Update post meta field based on post ID. + * + * Use the $prev_value parameter to differentiate between meta fields with the + * same key and post ID. + * + * If the meta field for the post does not exist, it will be added. + * + * @since 1.5.0 + * @uses $wpdb + * @link http://codex.wordpress.org/Function_Reference/update_post_meta + * + * @param int $post_id Post 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 bool False on failure, true if success. + */ +function update_post_meta($post_id, $meta_key, $meta_value, $prev_value = '') { + // make sure meta is added to the post, not a revision + if ( $the_post = wp_is_post_revision($post_id) ) + $post_id = $the_post; + + return update_metadata('post', $post_id, $meta_key, $meta_value, $prev_value); +} + +/** + * Delete everything from post meta matching meta key. + * + * @since 2.3.0 + * @uses $wpdb + * + * @param string $post_meta_key Key to search for when deleting. + * @return bool Whether the post meta key was deleted from the database + */ +function delete_post_meta_by_key($post_meta_key) { + if ( !$post_meta_key ) + return false; + + global $wpdb; + $post_ids = $wpdb->get_col($wpdb->prepare("SELECT DISTINCT post_id FROM $wpdb->postmeta WHERE meta_key = %s", $post_meta_key)); + if ( $post_ids ) { + $postmetaids = $wpdb->get_col( $wpdb->prepare( "SELECT meta_id FROM $wpdb->postmeta WHERE meta_key = %s", $post_meta_key ) ); + $in = implode( ',', array_fill(1, count($postmetaids), '%d')); + do_action( 'delete_postmeta', $postmetaids ); + $wpdb->query( $wpdb->prepare("DELETE FROM $wpdb->postmeta WHERE meta_id IN($in)", $postmetaids )); + do_action( 'deleted_postmeta', $postmetaids ); + foreach ( $post_ids as $post_id ) + wp_cache_delete($post_id, 'post_meta'); + return true; + } + return false; +} + +/** + * Retrieve post meta fields, based on post ID. + * + * The post meta fields are retrieved from the cache, so the function is + * optimized to be called more than once. It also applies to the functions, that + * use this function. + * + * @since 1.2.0 + * @link http://codex.wordpress.org/Function_Reference/get_post_custom + * + * @uses $id Current Loop Post ID + * + * @param int $post_id post ID + * @return array + */ +function get_post_custom( $post_id = 0 ) { + $post_id = absint( $post_id ); + + if ( ! $post_id ) + $post_id = get_the_ID(); + + if ( ! wp_cache_get( $post_id, 'post_meta' ) ) + update_postmeta_cache( $post_id ); + + return wp_cache_get( $post_id, 'post_meta' ); +} + +/** + * Retrieve meta field names for a post. + * + * If there are no meta fields, then nothing (null) will be returned. + * + * @since 1.2.0 + * @link http://codex.wordpress.org/Function_Reference/get_post_custom_keys + * + * @param int $post_id post ID + * @return array|null Either array of the keys, or null if keys could not be retrieved. + */ +function get_post_custom_keys( $post_id = 0 ) { + $custom = get_post_custom( $post_id ); + + if ( !is_array($custom) ) + return; + + if ( $keys = array_keys($custom) ) + return $keys; +} + +/** + * Retrieve values for a custom post field. + * + * The parameters must not be considered optional. All of the post meta fields + * will be retrieved and only the meta field key values returned. + * + * @since 1.2.0 + * @link http://codex.wordpress.org/Function_Reference/get_post_custom_values + * + * @param string $key Meta field key. + * @param int $post_id Post ID + * @return array Meta field values. + */ +function get_post_custom_values( $key = '', $post_id = 0 ) { + if ( !$key ) + return null; + + $custom = get_post_custom($post_id); + + return isset($custom[$key]) ? $custom[$key] : null; +} + +/** + * Check if post is sticky. + * + * Sticky posts should remain at the top of The Loop. If the post ID is not + * given, then The Loop ID for the current post will be used. + * + * @since 2.7.0 + * + * @param int $post_id Optional. Post ID. + * @return bool Whether post is sticky. + */ +function is_sticky( $post_id = 0 ) { + $post_id = absint( $post_id ); + + if ( ! $post_id ) + $post_id = get_the_ID(); + + $stickies = get_option( 'sticky_posts' ); + + if ( ! is_array( $stickies ) ) + return false; + + if ( in_array( $post_id, $stickies ) ) + return true; + + return false; +} + +/** + * Sanitize every post field. + * + * If the context is 'raw', then the post object or array will get minimal santization of the int fields. + * + * @since 2.3.0 + * @uses sanitize_post_field() Used to sanitize the fields. + * + * @param object|array $post The Post Object or Array + * @param string $context Optional, default is 'display'. How to sanitize post fields. + * @return object|array The now sanitized Post Object or Array (will be the same type as $post) + */ +function sanitize_post($post, $context = 'display') { + if ( is_object($post) ) { + // Check if post already filtered for this context + if ( isset($post->filter) && $context == $post->filter ) + return $post; + if ( !isset($post->ID) ) + $post->ID = 0; + foreach ( array_keys(get_object_vars($post)) as $field ) + $post->$field = sanitize_post_field($field, $post->$field, $post->ID, $context); + $post->filter = $context; + } else { + // Check if post already filtered for this context + if ( isset($post['filter']) && $context == $post['filter'] ) + return $post; + if ( !isset($post['ID']) ) + $post['ID'] = 0; + foreach ( array_keys($post) as $field ) + $post[$field] = sanitize_post_field($field, $post[$field], $post['ID'], $context); + $post['filter'] = $context; + } + return $post; +} + +/** + * Sanitize post field based on context. + * + * Possible context values are: 'raw', 'edit', 'db', 'display', 'attribute' and 'js'. The + * 'display' context is used by default. 'attribute' and 'js' contexts are treated like 'display' + * when calling filters. + * + * @since 2.3.0 + * @uses apply_filters() Calls 'edit_$field' and '{$field_no_prefix}_edit_pre' passing $value and + * $post_id if $context == 'edit' and field name prefix == 'post_'. + * + * @uses apply_filters() Calls 'edit_post_$field' passing $value and $post_id if $context == 'db'. + * @uses apply_filters() Calls 'pre_$field' passing $value if $context == 'db' and field name prefix == 'post_'. + * @uses apply_filters() Calls '{$field}_pre' passing $value if $context == 'db' and field name prefix != 'post_'. + * + * @uses apply_filters() Calls '$field' passing $value, $post_id and $context if $context == anything + * other than 'raw', 'edit' and 'db' and field name prefix == 'post_'. + * @uses apply_filters() Calls 'post_$field' passing $value if $context == anything other than 'raw', + * 'edit' and 'db' and field name prefix != 'post_'. + * + * @param string $field The Post Object field name. + * @param mixed $value The Post Object value. + * @param int $post_id Post ID. + * @param string $context How to sanitize post fields. Looks for 'raw', 'edit', 'db', 'display', + * 'attribute' and 'js'. + * @return mixed Sanitized value. + */ +function sanitize_post_field($field, $value, $post_id, $context) { + $int_fields = array('ID', 'post_parent', 'menu_order'); + if ( in_array($field, $int_fields) ) + $value = (int) $value; + + // Fields which contain arrays of ints. + $array_int_fields = array( 'ancestors' ); + if ( in_array($field, $array_int_fields) ) { + $value = array_map( 'absint', $value); + return $value; + } + + if ( 'raw' == $context ) + return $value; + + $prefixed = false; + if ( false !== strpos($field, 'post_') ) { + $prefixed = true; + $field_no_prefix = str_replace('post_', '', $field); + } + + if ( 'edit' == $context ) { + $format_to_edit = array('post_content', 'post_excerpt', 'post_title', 'post_password'); + + if ( $prefixed ) { + $value = apply_filters("edit_{$field}", $value, $post_id); + // Old school + $value = apply_filters("{$field_no_prefix}_edit_pre", $value, $post_id); + } else { + $value = apply_filters("edit_post_{$field}", $value, $post_id); + } + + if ( in_array($field, $format_to_edit) ) { + if ( 'post_content' == $field ) + $value = format_to_edit($value, user_can_richedit()); + else + $value = format_to_edit($value); + } else { + $value = esc_attr($value); + } + } else if ( 'db' == $context ) { + if ( $prefixed ) { + $value = apply_filters("pre_{$field}", $value); + $value = apply_filters("{$field_no_prefix}_save_pre", $value); + } else { + $value = apply_filters("pre_post_{$field}", $value); + $value = apply_filters("{$field}_pre", $value); + } + } else { + // Use display filters by default. + if ( $prefixed ) + $value = apply_filters($field, $value, $post_id, $context); + else + $value = apply_filters("post_{$field}", $value, $post_id, $context); + } + + if ( 'attribute' == $context ) + $value = esc_attr($value); + else if ( 'js' == $context ) + $value = esc_js($value); + + return $value; +} + +/** + * Make a post sticky. + * + * Sticky posts should be displayed at the top of the front page. + * + * @since 2.7.0 + * + * @param int $post_id Post ID. + */ +function stick_post($post_id) { + $stickies = get_option('sticky_posts'); + + if ( !is_array($stickies) ) + $stickies = array($post_id); + + if ( ! in_array($post_id, $stickies) ) + $stickies[] = $post_id; + + update_option('sticky_posts', $stickies); +} + +/** + * Unstick a post. + * + * Sticky posts should be displayed at the top of the front page. + * + * @since 2.7.0 + * + * @param int $post_id Post ID. + */ +function unstick_post($post_id) { + $stickies = get_option('sticky_posts'); + + if ( !is_array($stickies) ) + return; + + if ( ! in_array($post_id, $stickies) ) + return; + + $offset = array_search($post_id, $stickies); + if ( false === $offset ) + return; + + array_splice($stickies, $offset, 1); + + update_option('sticky_posts', $stickies); +} + +/** + * Count number of posts of a post type and is user has permissions to view. + * + * This function provides an efficient method of finding the amount of post's + * type a blog has. Another method is to count the amount of items in + * get_posts(), but that method has a lot of overhead with doing so. Therefore, + * when developing for 2.5+, use this function instead. + * + * The $perm parameter checks for 'readable' value and if the user can read + * private posts, it will display that for the user that is signed in. + * + * @since 2.5.0 + * @link http://codex.wordpress.org/Template_Tags/wp_count_posts + * + * @param string $type Optional. Post type to retrieve count + * @param string $perm Optional. 'readable' or empty. + * @return object Number of posts for each status + */ +function wp_count_posts( $type = 'post', $perm = '' ) { + global $wpdb; + + $user = wp_get_current_user(); + + $cache_key = $type; + + $query = "SELECT post_status, COUNT( * ) AS num_posts FROM {$wpdb->posts} WHERE post_type = %s"; + if ( 'readable' == $perm && is_user_logged_in() ) { + $post_type_object = get_post_type_object($type); + if ( !current_user_can( $post_type_object->cap->read_private_posts ) ) { + $cache_key .= '_' . $perm . '_' . $user->ID; + $query .= " AND (post_status != 'private' OR ( post_author = '$user->ID' AND post_status = 'private' ))"; + } + } + $query .= ' GROUP BY post_status'; + + $count = wp_cache_get($cache_key, 'counts'); + if ( false !== $count ) + return $count; + + $count = $wpdb->get_results( $wpdb->prepare( $query, $type ), ARRAY_A ); + + $stats = array(); + foreach ( get_post_stati() as $state ) + $stats[$state] = 0; + + foreach ( (array) $count as $row ) + $stats[$row['post_status']] = $row['num_posts']; + + $stats = (object) $stats; + wp_cache_set($cache_key, $stats, 'counts'); + + return $stats; +} + + +/** + * Count number of attachments for the mime type(s). + * + * If you set the optional mime_type parameter, then an array will still be + * returned, but will only have the item you are looking for. It does not give + * you the number of attachments that are children of a post. You can get that + * by counting the number of children that post has. + * + * @since 2.5.0 + * + * @param string|array $mime_type Optional. Array or comma-separated list of MIME patterns. + * @return array Number of posts for each mime type. + */ +function wp_count_attachments( $mime_type = '' ) { + global $wpdb; + + $and = wp_post_mime_type_where( $mime_type ); + $count = $wpdb->get_results( "SELECT post_mime_type, COUNT( * ) AS num_posts FROM $wpdb->posts WHERE post_type = 'attachment' AND post_status != 'trash' $and GROUP BY post_mime_type", ARRAY_A ); + + $stats = array( ); + foreach( (array) $count as $row ) { + $stats[$row['post_mime_type']] = $row['num_posts']; + } + $stats['trash'] = $wpdb->get_var( "SELECT COUNT( * ) FROM $wpdb->posts WHERE post_type = 'attachment' AND post_status = 'trash' $and"); + + return (object) $stats; +} + +/** + * Check a MIME-Type against a list. + * + * If the wildcard_mime_types parameter is a string, it must be comma separated + * list. If the real_mime_types is a string, it is also comma separated to + * create the list. + * + * @since 2.5.0 + * + * @param string|array $wildcard_mime_types e.g. audio/mpeg or image (same as image/*) or + * flash (same as *flash*). + * @param string|array $real_mime_types post_mime_type values + * @return array array(wildcard=>array(real types)) + */ +function wp_match_mime_types($wildcard_mime_types, $real_mime_types) { + $matches = array(); + if ( is_string($wildcard_mime_types) ) + $wildcard_mime_types = array_map('trim', explode(',', $wildcard_mime_types)); + if ( is_string($real_mime_types) ) + $real_mime_types = array_map('trim', explode(',', $real_mime_types)); + $wild = '[-._a-z0-9]*'; + foreach ( (array) $wildcard_mime_types as $type ) { + $type = str_replace('*', $wild, $type); + $patternses[1][$type] = "^$type$"; + if ( false === strpos($type, '/') ) { + $patternses[2][$type] = "^$type/"; + $patternses[3][$type] = $type; + } + } + asort($patternses); + foreach ( $patternses as $patterns ) + foreach ( $patterns as $type => $pattern ) + foreach ( (array) $real_mime_types as $real ) + if ( preg_match("#$pattern#", $real) && ( empty($matches[$type]) || false === array_search($real, $matches[$type]) ) ) + $matches[$type][] = $real; + return $matches; +} + +/** + * Convert MIME types into SQL. + * + * @since 2.5.0 + * + * @param string|array $post_mime_types List of mime types or comma separated string of mime types. + * @param string $table_alias Optional. Specify a table alias, if needed. + * @return string The SQL AND clause for mime searching. + */ +function wp_post_mime_type_where($post_mime_types, $table_alias = '') { + $where = ''; + $wildcards = array('', '%', '%/%'); + if ( is_string($post_mime_types) ) + $post_mime_types = array_map('trim', explode(',', $post_mime_types)); + foreach ( (array) $post_mime_types as $mime_type ) { + $mime_type = preg_replace('/\s/', '', $mime_type); + $slashpos = strpos($mime_type, '/'); + if ( false !== $slashpos ) { + $mime_group = preg_replace('/[^-*.a-zA-Z0-9]/', '', substr($mime_type, 0, $slashpos)); + $mime_subgroup = preg_replace('/[^-*.+a-zA-Z0-9]/', '', substr($mime_type, $slashpos + 1)); + if ( empty($mime_subgroup) ) + $mime_subgroup = '*'; + else + $mime_subgroup = str_replace('/', '', $mime_subgroup); + $mime_pattern = "$mime_group/$mime_subgroup"; + } else { + $mime_pattern = preg_replace('/[^-*.a-zA-Z0-9]/', '', $mime_type); + if ( false === strpos($mime_pattern, '*') ) + $mime_pattern .= '/*'; + } + + $mime_pattern = preg_replace('/\*+/', '%', $mime_pattern); + + if ( in_array( $mime_type, $wildcards ) ) + return ''; + + if ( false !== strpos($mime_pattern, '%') ) + $wheres[] = empty($table_alias) ? "post_mime_type LIKE '$mime_pattern'" : "$table_alias.post_mime_type LIKE '$mime_pattern'"; + else + $wheres[] = empty($table_alias) ? "post_mime_type = '$mime_pattern'" : "$table_alias.post_mime_type = '$mime_pattern'"; + } + if ( !empty($wheres) ) + $where = ' AND (' . join(' OR ', $wheres) . ') '; + return $where; +} + +/** + * Trashes or deletes a post or page. + * + * When the post and page is permanently deleted, everything that is tied to it is deleted also. + * This includes comments, post meta fields, and terms associated with the post. + * + * The post or page is moved to trash instead of permanently deleted unless trash is + * disabled, item is already in the trash, or $force_delete is true. + * + * @since 1.0.0 + * @uses do_action() on 'delete_post' before deletion unless post type is 'attachment'. + * @uses do_action() on 'deleted_post' after deletion unless post type is 'attachment'. + * @uses wp_delete_attachment() if post type is 'attachment'. + * @uses wp_trash_post() if item should be trashed. + * + * @param int $postid Post ID. + * @param bool $force_delete Whether to bypass trash and force deletion. Defaults to false. + * @return mixed False on failure + */ +function wp_delete_post( $postid = 0, $force_delete = false ) { + global $wpdb, $wp_rewrite; + + if ( !$post = $wpdb->get_row($wpdb->prepare("SELECT * FROM $wpdb->posts WHERE ID = %d", $postid)) ) + return $post; + + if ( !$force_delete && ( $post->post_type == 'post' || $post->post_type == 'page') && get_post_status( $postid ) != 'trash' && EMPTY_TRASH_DAYS ) + return wp_trash_post($postid); + + if ( $post->post_type == 'attachment' ) + return wp_delete_attachment( $postid, $force_delete ); + + do_action('before_delete_post', $postid); + + delete_post_meta($postid,'_wp_trash_meta_status'); + delete_post_meta($postid,'_wp_trash_meta_time'); + + wp_delete_object_term_relationships($postid, get_object_taxonomies($post->post_type)); + + $parent_data = array( 'post_parent' => $post->post_parent ); + $parent_where = array( 'post_parent' => $postid ); + + if ( 'page' == $post->post_type) { + // if the page is defined in option page_on_front or post_for_posts, + // adjust the corresponding options + if ( get_option('page_on_front') == $postid ) { + update_option('show_on_front', 'posts'); + delete_option('page_on_front'); + } + if ( get_option('page_for_posts') == $postid ) { + delete_option('page_for_posts'); + } + + // Point children of this page to its parent, also clean the cache of affected children + $children_query = $wpdb->prepare("SELECT * FROM $wpdb->posts WHERE post_parent = %d AND post_type='page'", $postid); + $children = $wpdb->get_results($children_query); + + $wpdb->update( $wpdb->posts, $parent_data, $parent_where + array( 'post_type' => 'page' ) ); + } else { + unstick_post($postid); + } + + // Do raw query. wp_get_post_revisions() is filtered + $revision_ids = $wpdb->get_col( $wpdb->prepare( "SELECT ID FROM $wpdb->posts WHERE post_parent = %d AND post_type = 'revision'", $postid ) ); + // Use wp_delete_post (via wp_delete_post_revision) again. Ensures any meta/misplaced data gets cleaned up. + foreach ( $revision_ids as $revision_id ) + wp_delete_post_revision( $revision_id ); + + // Point all attachments to this post up one level + $wpdb->update( $wpdb->posts, $parent_data, $parent_where + array( 'post_type' => 'attachment' ) ); + + $comment_ids = $wpdb->get_col( $wpdb->prepare( "SELECT comment_ID FROM $wpdb->comments WHERE comment_post_ID = %d", $postid )); + if ( ! empty($comment_ids) ) { + do_action( 'delete_comment', $comment_ids ); + foreach ( $comment_ids as $comment_id ) + wp_delete_comment( $comment_id, true ); + do_action( 'deleted_comment', $comment_ids ); + } + + $post_meta_ids = $wpdb->get_col( $wpdb->prepare( "SELECT meta_id FROM $wpdb->postmeta WHERE post_id = %d ", $postid )); + if ( !empty($post_meta_ids) ) { + do_action( 'delete_postmeta', $post_meta_ids ); + $in_post_meta_ids = "'" . implode("', '", $post_meta_ids) . "'"; + $wpdb->query( "DELETE FROM $wpdb->postmeta WHERE meta_id IN($in_post_meta_ids)" ); + do_action( 'deleted_postmeta', $post_meta_ids ); + } + + do_action( 'delete_post', $postid ); + $wpdb->query( $wpdb->prepare( "DELETE FROM $wpdb->posts WHERE ID = %d", $postid )); + do_action( 'deleted_post', $postid ); + + if ( 'page' == $post->post_type ) { + clean_page_cache($postid); + + foreach ( (array) $children as $child ) + clean_page_cache($child->ID); + + $wp_rewrite->flush_rules(false); + } else { + clean_post_cache($postid); + } + + wp_clear_scheduled_hook('publish_future_post', array( $postid ) ); + + do_action('after_delete_post', $postid); + + return $post; +} + +/** + * Moves a post or page to the Trash + * + * If trash is disabled, the post or page is permanently deleted. + * + * @since 2.9.0 + * @uses do_action() on 'trash_post' before trashing + * @uses do_action() on 'trashed_post' after trashing + * @uses wp_delete_post() if trash is disabled + * + * @param int $post_id Post ID. + * @return mixed False on failure + */ +function wp_trash_post($post_id = 0) { + if ( !EMPTY_TRASH_DAYS ) + return wp_delete_post($post_id, true); + + if ( !$post = wp_get_single_post($post_id, ARRAY_A) ) + return $post; + + if ( $post['post_status'] == 'trash' ) + return false; + + do_action('trash_post', $post_id); + + add_post_meta($post_id,'_wp_trash_meta_status', $post['post_status']); + add_post_meta($post_id,'_wp_trash_meta_time', time()); + + $post['post_status'] = 'trash'; + wp_insert_post($post); + + wp_trash_post_comments($post_id); + + do_action('trashed_post', $post_id); + + return $post; +} + +/** + * Restores a post or page from the Trash + * + * @since 2.9.0 + * @uses do_action() on 'untrash_post' before undeletion + * @uses do_action() on 'untrashed_post' after undeletion + * + * @param int $post_id Post ID. + * @return mixed False on failure + */ +function wp_untrash_post($post_id = 0) { + if ( !$post = wp_get_single_post($post_id, ARRAY_A) ) + return $post; + + if ( $post['post_status'] != 'trash' ) + return false; + + do_action('untrash_post', $post_id); + + $post_status = get_post_meta($post_id, '_wp_trash_meta_status', true); + + $post['post_status'] = $post_status; + + delete_post_meta($post_id, '_wp_trash_meta_status'); + delete_post_meta($post_id, '_wp_trash_meta_time'); + + wp_insert_post($post); + + wp_untrash_post_comments($post_id); + + do_action('untrashed_post', $post_id); + + return $post; +} + +/** + * Moves comments for a post to the trash + * + * @since 2.9.0 + * @uses do_action() on 'trash_post_comments' before trashing + * @uses do_action() on 'trashed_post_comments' after trashing + * + * @param int $post Post ID or object. + * @return mixed False on failure + */ +function wp_trash_post_comments($post = null) { + global $wpdb; + + $post = get_post($post); + if ( empty($post) ) + return; + + $post_id = $post->ID; + + do_action('trash_post_comments', $post_id); + + $comments = $wpdb->get_results( $wpdb->prepare("SELECT comment_ID, comment_approved FROM $wpdb->comments WHERE comment_post_ID = %d", $post_id) ); + if ( empty($comments) ) + return; + + // Cache current status for each comment + $statuses = array(); + foreach ( $comments as $comment ) + $statuses[$comment->comment_ID] = $comment->comment_approved; + add_post_meta($post_id, '_wp_trash_meta_comments_status', $statuses); + + // Set status for all comments to post-trashed + $result = $wpdb->update($wpdb->comments, array('comment_approved' => 'post-trashed'), array('comment_post_ID' => $post_id)); + + clean_comment_cache( array_keys($statuses) ); + + do_action('trashed_post_comments', $post_id, $statuses); + + return $result; +} + +/** + * Restore comments for a post from the trash + * + * @since 2.9.0 + * @uses do_action() on 'untrash_post_comments' before trashing + * @uses do_action() on 'untrashed_post_comments' after trashing + * + * @param int $post Post ID or object. + * @return mixed False on failure + */ +function wp_untrash_post_comments($post = null) { + global $wpdb; + + $post = get_post($post); + if ( empty($post) ) + return; + + $post_id = $post->ID; + + $statuses = get_post_meta($post_id, '_wp_trash_meta_comments_status', true); + + if ( empty($statuses) ) + return true; + + do_action('untrash_post_comments', $post_id); + + // Restore each comment to its original status + $group_by_status = array(); + foreach ( $statuses as $comment_id => $comment_status ) + $group_by_status[$comment_status][] = $comment_id; + + foreach ( $group_by_status as $status => $comments ) { + // Sanity check. This shouldn't happen. + if ( 'post-trashed' == $status ) + $status = '0'; + $comments_in = implode( "', '", $comments ); + $wpdb->query( "UPDATE $wpdb->comments SET comment_approved = '$status' WHERE comment_ID IN ('" . $comments_in . "')" ); + } + + clean_comment_cache( array_keys($statuses) ); + + delete_post_meta($post_id, '_wp_trash_meta_comments_status'); + + do_action('untrashed_post_comments', $post_id); +} + +/** + * Retrieve the list of categories for a post. + * + * Compatibility layer for themes and plugins. Also an easy layer of abstraction + * away from the complexity of the taxonomy layer. + * + * @since 2.1.0 + * + * @uses wp_get_object_terms() Retrieves the categories. Args details can be found here. + * + * @param int $post_id Optional. The Post ID. + * @param array $args Optional. Overwrite the defaults. + * @return array + */ +function wp_get_post_categories( $post_id = 0, $args = array() ) { + $post_id = (int) $post_id; + + $defaults = array('fields' => 'ids'); + $args = wp_parse_args( $args, $defaults ); + + $cats = wp_get_object_terms($post_id, 'category', $args); + return $cats; +} + +/** + * Retrieve the tags for a post. + * + * There is only one default for this function, called 'fields' and by default + * is set to 'all'. There are other defaults that can be overridden in + * {@link wp_get_object_terms()}. + * + * @package WordPress + * @subpackage Post + * @since 2.3.0 + * + * @uses wp_get_object_terms() Gets the tags for returning. Args can be found here + * + * @param int $post_id Optional. The Post ID + * @param array $args Optional. Overwrite the defaults + * @return array List of post tags. + */ +function wp_get_post_tags( $post_id = 0, $args = array() ) { + return wp_get_post_terms( $post_id, 'post_tag', $args); +} + +/** + * Retrieve the terms for a post. + * + * There is only one default for this function, called 'fields' and by default + * is set to 'all'. There are other defaults that can be overridden in + * {@link wp_get_object_terms()}. + * + * @package WordPress + * @subpackage Post + * @since 2.8.0 + * + * @uses wp_get_object_terms() Gets the tags for returning. Args can be found here + * + * @param int $post_id Optional. The Post ID + * @param string $taxonomy The taxonomy for which to retrieve terms. Defaults to post_tag. + * @param array $args Optional. Overwrite the defaults + * @return array List of post tags. + */ +function wp_get_post_terms( $post_id = 0, $taxonomy = 'post_tag', $args = array() ) { + $post_id = (int) $post_id; + + $defaults = array('fields' => 'all'); + $args = wp_parse_args( $args, $defaults ); + + $tags = wp_get_object_terms($post_id, $taxonomy, $args); + + return $tags; +} + +/** + * Retrieve number of recent posts. + * + * @since 1.0.0 + * @uses wp_parse_args() + * @uses get_posts() + * + * @param string $deprecated Deprecated. + * @param array $args Optional. Overrides defaults. + * @param string $output Optional. + * @return unknown. + */ +function wp_get_recent_posts( $args = array(), $output = ARRAY_A ) { + + if ( is_numeric( $args ) ) { + _deprecated_argument( __FUNCTION__, '3.1', __( 'Passing an integer number of posts is deprecated. Pass an array of arguments instead.' ) ); + $args = array( 'numberposts' => absint( $args ) ); + } + + // Set default arguments + $defaults = array( + 'numberposts' => 10, 'offset' => 0, + 'category' => 0, 'orderby' => 'post_date', + 'order' => 'DESC', 'include' => '', + 'exclude' => '', 'meta_key' => '', + 'meta_value' =>'', 'post_type' => 'post', 'post_status' => 'draft, publish, future, pending, private', + 'suppress_filters' => true + ); + + $r = wp_parse_args( $args, $defaults ); + + $results = get_posts( $r ); + + // Backward compatibility. Prior to 3.1 expected posts to be returned in array + if ( ARRAY_A == $output ){ + foreach( $results as $key => $result ) { + $results[$key] = get_object_vars( $result ); + } + return $results ? $results : array(); + } + + return $results ? $results : false; + +} + +/** + * 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 + * + * @param int $postid Post ID. + * @param string $mode How to return result, either OBJECT, ARRAY_N, or ARRAY_A. + * @return object|array Post object or array holding post contents and information + */ +function wp_get_single_post($postid = 0, $mode = OBJECT) { + $postid = (int) $postid; + + $post = get_post($postid, $mode); + + if ( + ( OBJECT == $mode && empty( $post->ID ) ) || + ( OBJECT != $mode && empty( $post['ID'] ) ) + ) + return ( OBJECT == $mode ? null : array() ); + + // Set categories and tags + if ( $mode == OBJECT ) { + $post->post_category = array(); + if ( is_object_in_taxonomy($post->post_type, 'category') ) + $post->post_category = wp_get_post_categories($postid); + $post->tags_input = array(); + if ( is_object_in_taxonomy($post->post_type, 'post_tag') ) + $post->tags_input = wp_get_post_tags($postid, array('fields' => 'names')); + } else { + $post['post_category'] = array(); + if ( is_object_in_taxonomy($post['post_type'], 'category') ) + $post['post_category'] = wp_get_post_categories($postid); + $post['tags_input'] = array(); + if ( is_object_in_taxonomy($post['post_type'], 'post_tag') ) + $post['tags_input'] = wp_get_post_tags($postid, array('fields' => 'names')); + } + + return $post; +} + +/** + * Insert a post. + * + * If the $postarr parameter has 'ID' set to a value, then post will be updated. + * + * You can set the post date manually, but setting the values for 'post_date' + * and 'post_date_gmt' keys. You can close the comments or open the comments by + * setting the value for 'comment_status' key. + * + * The defaults for the parameter $postarr are: + * 'post_status' - Default is 'draft'. + * 'post_type' - Default is 'post'. + * 'post_author' - Default is current user ID ($user_ID). The ID of the user who added the post. + * 'ping_status' - Default is the value in 'default_ping_status' option. + * Whether the attachment can accept pings. + * 'post_parent' - Default is 0. Set this for the post it belongs to, if any. + * 'menu_order' - Default is 0. The order it is displayed. + * 'to_ping' - Whether to ping. + * 'pinged' - Default is empty string. + * 'post_password' - Default is empty string. The password to access the attachment. + * 'guid' - Global Unique ID for referencing the attachment. + * 'post_content_filtered' - Post content filtered. + * 'post_excerpt' - Post excerpt. + * + * @since 1.0.0 + * @uses $wpdb + * @uses $wp_rewrite + * @uses $user_ID + * @uses do_action() Calls 'pre_post_update' on post ID if this is an update. + * @uses do_action() Calls 'edit_post' action on post ID and post data if this is an update. + * @uses do_action() Calls 'save_post' and 'wp_insert_post' on post id and post data just before returning. + * @uses apply_filters() Calls 'wp_insert_post_data' passing $data, $postarr prior to database update or insert. + * @uses wp_transition_post_status() + * + * @param array $postarr Elements that make up post to insert. + * @param bool $wp_error Optional. Allow return of WP_Error on failure. + * @return int|WP_Error The value 0 or WP_Error on failure. The post ID on success. + */ +function wp_insert_post($postarr, $wp_error = false) { + global $wpdb, $wp_rewrite, $user_ID; + + $defaults = array('post_status' => 'draft', 'post_type' => 'post', 'post_author' => $user_ID, + 'ping_status' => get_option('default_ping_status'), 'post_parent' => 0, + 'menu_order' => 0, 'to_ping' => '', 'pinged' => '', 'post_password' => '', + 'guid' => '', 'post_content_filtered' => '', 'post_excerpt' => '', 'import_id' => 0, + 'post_content' => '', 'post_title' => ''); + + $postarr = wp_parse_args($postarr, $defaults); + + unset( $postarr[ 'filter' ] ); + + $postarr = sanitize_post($postarr, 'db'); + + // export array as variables + extract($postarr, EXTR_SKIP); + + // Are we updating or creating? + $update = false; + if ( !empty($ID) ) { + $update = true; + $previous_status = get_post_field('post_status', $ID); + } else { + $previous_status = 'new'; + } + + if ( ('' == $post_content) && ('' == $post_title) && ('' == $post_excerpt) && ('attachment' != $post_type) ) { + if ( $wp_error ) + return new WP_Error('empty_content', __('Content, title, and excerpt are empty.')); + else + return 0; + } + + if ( empty($post_type) ) + $post_type = 'post'; + + if ( empty($post_status) ) + $post_status = 'draft'; + + if ( !empty($post_category) ) + $post_category = array_filter($post_category); // Filter out empty terms + + // Make sure we set a valid category. + if ( empty($post_category) || 0 == count($post_category) || !is_array($post_category) ) { + // 'post' requires at least one category. + if ( 'post' == $post_type && 'auto-draft' != $post_status ) + $post_category = array( get_option('default_category') ); + else + $post_category = array(); + } + + if ( empty($post_author) ) + $post_author = $user_ID; + + $post_ID = 0; + + // Get the post ID and GUID + if ( $update ) { + $post_ID = (int) $ID; + $guid = get_post_field( 'guid', $post_ID ); + $post_before = get_post($post_ID); + } + + // Don't allow contributors to set the post slug for pending review posts + if ( 'pending' == $post_status && !current_user_can( 'publish_posts' ) ) + $post_name = ''; + + // Create a valid post name. Drafts and pending posts are allowed to have an empty + // post name. + if ( empty($post_name) ) { + if ( !in_array( $post_status, array( 'draft', 'pending', 'auto-draft' ) ) ) + $post_name = sanitize_title($post_title); + else + $post_name = ''; + } else { + $post_name = sanitize_title($post_name); + } + + // If the post date is empty (due to having been new or a draft) and status is not 'draft' or 'pending', set date to now + if ( empty($post_date) || '0000-00-00 00:00:00' == $post_date ) + $post_date = current_time('mysql'); + + if ( empty($post_date_gmt) || '0000-00-00 00:00:00' == $post_date_gmt ) { + if ( !in_array( $post_status, array( 'draft', 'pending', 'auto-draft' ) ) ) + $post_date_gmt = get_gmt_from_date($post_date); + else + $post_date_gmt = '0000-00-00 00:00:00'; + } + + if ( $update || '0000-00-00 00:00:00' == $post_date ) { + $post_modified = current_time( 'mysql' ); + $post_modified_gmt = current_time( 'mysql', 1 ); + } else { + $post_modified = $post_date; + $post_modified_gmt = $post_date_gmt; + } + + if ( 'publish' == $post_status ) { + $now = gmdate('Y-m-d H:i:59'); + if ( mysql2date('U', $post_date_gmt, false) > mysql2date('U', $now, false) ) + $post_status = 'future'; + } elseif( 'future' == $post_status ) { + $now = gmdate('Y-m-d H:i:59'); + if ( mysql2date('U', $post_date_gmt, false) <= mysql2date('U', $now, false) ) + $post_status = 'publish'; + } + + if ( empty($comment_status) ) { + if ( $update ) + $comment_status = 'closed'; + else + $comment_status = get_option('default_comment_status'); + } + if ( empty($ping_status) ) + $ping_status = get_option('default_ping_status'); + + if ( isset($to_ping) ) + $to_ping = preg_replace('|\s+|', "\n", $to_ping); + else + $to_ping = ''; + + if ( ! isset($pinged) ) + $pinged = ''; + + if ( isset($post_parent) ) + $post_parent = (int) $post_parent; + else + $post_parent = 0; + + // Check the post_parent to see if it will cause a hierarchy loop + $post_parent = apply_filters( 'wp_insert_post_parent', $post_parent, $post_ID, compact( array_keys( $postarr ) ), $postarr ); + + if ( isset($menu_order) ) + $menu_order = (int) $menu_order; + else + $menu_order = 0; + + if ( !isset($post_password) || 'private' == $post_status ) + $post_password = ''; + + $post_name = wp_unique_post_slug($post_name, $post_ID, $post_status, $post_type, $post_parent); + + // expected_slashed (everything!) + $data = compact( array( 'post_author', 'post_date', 'post_date_gmt', 'post_content', 'post_content_filtered', 'post_title', 'post_excerpt', 'post_status', 'post_type', 'comment_status', 'ping_status', 'post_password', 'post_name', 'to_ping', 'pinged', 'post_modified', 'post_modified_gmt', 'post_parent', 'menu_order', 'guid' ) ); + $data = apply_filters('wp_insert_post_data', $data, $postarr); + $data = stripslashes_deep( $data ); + $where = array( 'ID' => $post_ID ); + + if ( $update ) { + do_action( 'pre_post_update', $post_ID ); + if ( false === $wpdb->update( $wpdb->posts, $data, $where ) ) { + if ( $wp_error ) + return new WP_Error('db_update_error', __('Could not update post in the database'), $wpdb->last_error); + else + return 0; + } + } else { + if ( isset($post_mime_type) ) + $data['post_mime_type'] = stripslashes( $post_mime_type ); // This isn't in the update + // If there is a suggested ID, use it if not already present + if ( !empty($import_id) ) { + $import_id = (int) $import_id; + if ( ! $wpdb->get_var( $wpdb->prepare("SELECT ID FROM $wpdb->posts WHERE ID = %d", $import_id) ) ) { + $data['ID'] = $import_id; + } + } + if ( false === $wpdb->insert( $wpdb->posts, $data ) ) { + if ( $wp_error ) + return new WP_Error('db_insert_error', __('Could not insert post into the database'), $wpdb->last_error); + else + return 0; + } + $post_ID = (int) $wpdb->insert_id; + + // use the newly generated $post_ID + $where = array( 'ID' => $post_ID ); + } + + if ( empty($data['post_name']) && !in_array( $data['post_status'], array( 'draft', 'pending', 'auto-draft' ) ) ) { + $data['post_name'] = sanitize_title($data['post_title'], $post_ID); + $wpdb->update( $wpdb->posts, array( 'post_name' => $data['post_name'] ), $where ); + } + + if ( is_object_in_taxonomy($post_type, 'category') ) + wp_set_post_categories( $post_ID, $post_category ); + + if ( isset( $tags_input ) && is_object_in_taxonomy($post_type, 'post_tag') ) + wp_set_post_tags( $post_ID, $tags_input ); + + // new-style support for all custom taxonomies + if ( !empty($tax_input) ) { + foreach ( $tax_input as $taxonomy => $tags ) { + $taxonomy_obj = get_taxonomy($taxonomy); + if ( is_array($tags) ) // array = hierarchical, string = non-hierarchical. + $tags = array_filter($tags); + if ( current_user_can($taxonomy_obj->cap->assign_terms) ) + wp_set_post_terms( $post_ID, $tags, $taxonomy ); + } + } + + $current_guid = get_post_field( 'guid', $post_ID ); + + if ( 'page' == $data['post_type'] ) + clean_page_cache($post_ID); + else + clean_post_cache($post_ID); + + // Set GUID + if ( !$update && '' == $current_guid ) + $wpdb->update( $wpdb->posts, array( 'guid' => get_permalink( $post_ID ) ), $where ); + + $post = get_post($post_ID); + + if ( !empty($page_template) && 'page' == $data['post_type'] ) { + $post->page_template = $page_template; + $page_templates = get_page_templates(); + if ( 'default' != $page_template && !in_array($page_template, $page_templates) ) { + if ( $wp_error ) + return new WP_Error('invalid_page_template', __('The page template is invalid.')); + else + return 0; + } + update_post_meta($post_ID, '_wp_page_template', $page_template); + } + + wp_transition_post_status($data['post_status'], $previous_status, $post); + + if ( $update ) { + do_action('edit_post', $post_ID, $post); + $post_after = get_post($post_ID); + do_action( 'post_updated', $post_ID, $post_after, $post_before); + } + + do_action('save_post', $post_ID, $post); + do_action('wp_insert_post', $post_ID, $post); + + return $post_ID; +} + +/** + * Update a post with new post data. + * + * The date does not have to be set for drafts. You can set the date and it will + * not be overridden. + * + * @since 1.0.0 + * + * @param array|object $postarr Post data. Arrays are expected to be escaped, objects are not. + * @return int 0 on failure, Post ID on success. + */ +function wp_update_post($postarr = array()) { + if ( is_object($postarr) ) { + // non-escaped post was passed + $postarr = get_object_vars($postarr); + $postarr = add_magic_quotes($postarr); + } + + // First, get all of the original fields + $post = wp_get_single_post($postarr['ID'], ARRAY_A); + + // Escape data pulled from DB. + $post = add_magic_quotes($post); + + // Passed post category list overwrites existing category list if not empty. + if ( isset($postarr['post_category']) && is_array($postarr['post_category']) + && 0 != count($postarr['post_category']) ) + $post_cats = $postarr['post_category']; + else + $post_cats = $post['post_category']; + + // Drafts shouldn't be assigned a date unless explicitly done so by the user + if ( isset( $post['post_status'] ) && in_array($post['post_status'], array('draft', 'pending', 'auto-draft')) && empty($postarr['edit_date']) && + ('0000-00-00 00:00:00' == $post['post_date_gmt']) ) + $clear_date = true; + else + $clear_date = false; + + // Merge old and new fields with new fields overwriting old ones. + $postarr = array_merge($post, $postarr); + $postarr['post_category'] = $post_cats; + if ( $clear_date ) { + $postarr['post_date'] = current_time('mysql'); + $postarr['post_date_gmt'] = ''; + } + + if ($postarr['post_type'] == 'attachment') + return wp_insert_attachment($postarr); + + return wp_insert_post($postarr); +} + +/** + * Publish a post by transitioning the post status. + * + * @since 2.1.0 + * @uses $wpdb + * @uses do_action() Calls 'edit_post', 'save_post', and 'wp_insert_post' on post_id and post data. + * + * @param int $post_id Post ID. + * @return null + */ +function wp_publish_post($post_id) { + global $wpdb; + + $post = get_post($post_id); + + if ( empty($post) ) + return; + + if ( 'publish' == $post->post_status ) + return; + + $wpdb->update( $wpdb->posts, array( 'post_status' => 'publish' ), array( 'ID' => $post_id ) ); + + $old_status = $post->post_status; + $post->post_status = 'publish'; + wp_transition_post_status('publish', $old_status, $post); + + // Update counts for the post's terms. + foreach ( (array) get_object_taxonomies('post') as $taxonomy ) { + $tt_ids = wp_get_object_terms($post_id, $taxonomy, array('fields' => 'tt_ids')); + wp_update_term_count($tt_ids, $taxonomy); + } + + do_action('edit_post', $post_id, $post); + do_action('save_post', $post_id, $post); + do_action('wp_insert_post', $post_id, $post); +} + +/** + * Publish future post and make sure post ID has future post status. + * + * Invoked by cron 'publish_future_post' event. This safeguard prevents cron + * from publishing drafts, etc. + * + * @since 2.5.0 + * + * @param int $post_id Post ID. + * @return null Nothing is returned. Which can mean that no action is required or post was published. + */ +function check_and_publish_future_post($post_id) { + + $post = get_post($post_id); + + if ( empty($post) ) + return; + + if ( 'future' != $post->post_status ) + return; + + $time = strtotime( $post->post_date_gmt . ' GMT' ); + + if ( $time > time() ) { // Uh oh, someone jumped the gun! + wp_clear_scheduled_hook( 'publish_future_post', array( $post_id ) ); // clear anything else in the system + wp_schedule_single_event( $time, 'publish_future_post', array( $post_id ) ); + return; + } + + return wp_publish_post($post_id); +} + + +/** + * Computes a unique slug for the post, when given the desired slug and some post details. + * + * @since 2.8.0 + * + * @global wpdb $wpdb + * @global WP_Rewrite $wp_rewrite + * @param string $slug the desired slug (post_name) + * @param integer $post_ID + * @param string $post_status no uniqueness checks are made if the post is still draft or pending + * @param string $post_type + * @param integer $post_parent + * @return string unique slug for the post, based on $post_name (with a -1, -2, etc. suffix) + */ +function wp_unique_post_slug( $slug, $post_ID, $post_status, $post_type, $post_parent ) { + if ( in_array( $post_status, array( 'draft', 'pending', 'auto-draft' ) ) ) + return $slug; + + global $wpdb, $wp_rewrite; + + $feeds = $wp_rewrite->feeds; + if ( ! is_array( $feeds ) ) + $feeds = array(); + + $hierarchical_post_types = get_post_types( array('hierarchical' => true) ); + if ( 'attachment' == $post_type ) { + // Attachment slugs must be unique across all types. + $check_sql = "SELECT post_name FROM $wpdb->posts WHERE post_name = %s AND ID != %d LIMIT 1"; + $post_name_check = $wpdb->get_var( $wpdb->prepare( $check_sql, $slug, $post_ID ) ); + + if ( $post_name_check || in_array( $slug, $feeds ) || apply_filters( 'wp_unique_post_slug_is_bad_attachment_slug', false, $slug ) ) { + $suffix = 2; + do { + $alt_post_name = substr ($slug, 0, 200 - ( strlen( $suffix ) + 1 ) ) . "-$suffix"; + $post_name_check = $wpdb->get_var( $wpdb->prepare($check_sql, $alt_post_name, $post_ID ) ); + $suffix++; + } while ( $post_name_check ); + $slug = $alt_post_name; + } + } elseif ( in_array( $post_type, $hierarchical_post_types ) ) { + // Page slugs must be unique within their own trees. Pages are in a separate + // namespace than posts so page slugs are allowed to overlap post slugs. + $check_sql = "SELECT post_name FROM $wpdb->posts WHERE post_name = %s AND post_type IN ( '" . implode( "', '", esc_sql( $hierarchical_post_types ) ) . "' ) AND ID != %d AND post_parent = %d LIMIT 1"; + $post_name_check = $wpdb->get_var( $wpdb->prepare( $check_sql, $slug, $post_ID, $post_parent ) ); + + if ( $post_name_check || in_array( $slug, $feeds ) || preg_match( "@^($wp_rewrite->pagination_base)?\d+$@", $slug ) || apply_filters( 'wp_unique_post_slug_is_bad_hierarchical_slug', false, $slug, $post_type, $post_parent ) ) { + $suffix = 2; + do { + $alt_post_name = substr( $slug, 0, 200 - ( strlen( $suffix ) + 1 ) ) . "-$suffix"; + $post_name_check = $wpdb->get_var( $wpdb->prepare( $check_sql, $alt_post_name, $post_ID, $post_parent ) ); + $suffix++; + } while ( $post_name_check ); + $slug = $alt_post_name; + } + } else { + // Post slugs must be unique across all posts. + $check_sql = "SELECT post_name FROM $wpdb->posts WHERE post_name = %s AND post_type = %s AND ID != %d LIMIT 1"; + $post_name_check = $wpdb->get_var( $wpdb->prepare( $check_sql, $slug, $post_type, $post_ID ) ); + + if ( $post_name_check || in_array( $slug, $feeds ) || apply_filters( 'wp_unique_post_slug_is_bad_flat_slug', false, $slug, $post_type ) ) { + $suffix = 2; + do { + $alt_post_name = substr( $slug, 0, 200 - ( strlen( $suffix ) + 1 ) ) . "-$suffix"; + $post_name_check = $wpdb->get_var( $wpdb->prepare( $check_sql, $alt_post_name, $post_type, $post_ID ) ); + $suffix++; + } while ( $post_name_check ); + $slug = $alt_post_name; + } + } + + return $slug; +} + +/** + * Adds tags to a post. + * + * @uses wp_set_post_tags() Same first two parameters, but the last parameter is always set to true. + * + * @package WordPress + * @subpackage Post + * @since 2.3.0 + * + * @param int $post_id Post ID + * @param string $tags The tags to set for the post, separated by commas. + * @return bool|null Will return false if $post_id is not an integer or is 0. Will return null otherwise + */ +function wp_add_post_tags($post_id = 0, $tags = '') { + return wp_set_post_tags($post_id, $tags, true); +} + + +/** + * Set the tags for a post. + * + * @since 2.3.0 + * @uses wp_set_object_terms() Sets the tags for the post. + * + * @param int $post_id Post ID. + * @param string $tags The tags to set for the post, separated by commas. + * @param bool $append If true, don't delete existing tags, just add on. If false, replace the tags with the new tags. + * @return mixed Array of affected term IDs. WP_Error or false on failure. + */ +function wp_set_post_tags( $post_id = 0, $tags = '', $append = false ) { + return wp_set_post_terms( $post_id, $tags, 'post_tag', $append); +} + +/** + * Set the terms for a post. + * + * @since 2.8.0 + * @uses wp_set_object_terms() Sets the tags for the post. + * + * @param int $post_id Post ID. + * @param string $tags The tags to set for the post, separated by commas. + * @param bool $append If true, don't delete existing tags, just add on. If false, replace the tags with the new tags. + * @return mixed Array of affected term IDs. WP_Error or false on failure. + */ +function wp_set_post_terms( $post_id = 0, $tags = '', $taxonomy = 'post_tag', $append = false ) { + $post_id = (int) $post_id; + + if ( !$post_id ) + return false; + + if ( empty($tags) ) + $tags = array(); + + $tags = is_array($tags) ? $tags : explode( ',', trim($tags, " \n\t\r\0\x0B,") ); + + // Hierarchical taxonomies must always pass IDs rather than names so that children with the same + // names but different parents aren't confused. + if ( is_taxonomy_hierarchical( $taxonomy ) ) { + $tags = array_map( 'intval', $tags ); + $tags = array_unique( $tags ); + } + + return wp_set_object_terms($post_id, $tags, $taxonomy, $append); +} + +/** + * Set categories for a post. + * + * If the post categories parameter is not set, then the default category is + * going used. + * + * @since 2.1.0 + * + * @param int $post_ID Post ID. + * @param array $post_categories Optional. List of categories. + * @return bool|mixed + */ +function wp_set_post_categories($post_ID = 0, $post_categories = array()) { + $post_ID = (int) $post_ID; + $post_type = get_post_type( $post_ID ); + $post_status = get_post_status( $post_ID ); + // If $post_categories isn't already an array, make it one: + if ( !is_array($post_categories) || empty($post_categories) ) { + if ( 'post' == $post_type && 'auto-draft' != $post_status ) + $post_categories = array( get_option('default_category') ); + else + $post_categories = array(); + } else if ( 1 == count($post_categories) && '' == reset($post_categories) ) { + return true; + } + + if ( !empty($post_categories) ) { + $post_categories = array_map('intval', $post_categories); + $post_categories = array_unique($post_categories); + } + + return wp_set_object_terms($post_ID, $post_categories, 'category'); +} + +/** + * Transition the post status of a post. + * + * Calls hooks to transition post status. + * + * The first is 'transition_post_status' with new status, old status, and post data. + * + * The next action called is 'OLDSTATUS_to_NEWSTATUS' the 'NEWSTATUS' is the + * $new_status parameter and the 'OLDSTATUS' is $old_status parameter; it has the + * post data. + * + * The final action is named 'NEWSTATUS_POSTTYPE', 'NEWSTATUS' is from the $new_status + * parameter and POSTTYPE is post_type post data. + * + * @since 2.3.0 + * @link http://codex.wordpress.org/Post_Status_Transitions + * + * @uses do_action() Calls 'transition_post_status' on $new_status, $old_status and + * $post if there is a status change. + * @uses do_action() Calls '{$old_status}_to_{$new_status}' on $post if there is a status change. + * @uses do_action() Calls '{$new_status}_{$post->post_type}' on post ID and $post. + * + * @param string $new_status Transition to this post status. + * @param string $old_status Previous post status. + * @param object $post Post data. + */ +function wp_transition_post_status($new_status, $old_status, $post) { + do_action('transition_post_status', $new_status, $old_status, $post); + do_action("{$old_status}_to_{$new_status}", $post); + do_action("{$new_status}_{$post->post_type}", $post->ID, $post); +} + +// +// Trackback and ping functions +// + +/** + * Add a URL to those already pung. + * + * @since 1.5.0 + * @uses $wpdb + * + * @param int $post_id Post ID. + * @param string $uri Ping URI. + * @return int How many rows were updated. + */ +function add_ping($post_id, $uri) { + global $wpdb; + $pung = $wpdb->get_var( $wpdb->prepare( "SELECT pinged FROM $wpdb->posts WHERE ID = %d", $post_id )); + $pung = trim($pung); + $pung = preg_split('/\s/', $pung); + $pung[] = $uri; + $new = implode("\n", $pung); + $new = apply_filters('add_ping', $new); + // expected_slashed ($new) + $new = stripslashes($new); + return $wpdb->update( $wpdb->posts, array( 'pinged' => $new ), array( 'ID' => $post_id ) ); +} + +/** + * Retrieve enclosures already enclosed for a post. + * + * @since 1.5.0 + * @uses $wpdb + * + * @param int $post_id Post ID. + * @return array List of enclosures + */ +function get_enclosed($post_id) { + $custom_fields = get_post_custom( $post_id ); + $pung = array(); + if ( !is_array( $custom_fields ) ) + return $pung; + + foreach ( $custom_fields as $key => $val ) { + if ( 'enclosure' != $key || !is_array( $val ) ) + continue; + foreach( $val as $enc ) { + $enclosure = split( "\n", $enc ); + $pung[] = trim( $enclosure[ 0 ] ); + } + } + $pung = apply_filters('get_enclosed', $pung, $post_id); + return $pung; +} + +/** + * Retrieve URLs already pinged for a post. + * + * @since 1.5.0 + * @uses $wpdb + * + * @param int $post_id Post ID. + * @return array + */ +function get_pung($post_id) { + global $wpdb; + $pung = $wpdb->get_var( $wpdb->prepare( "SELECT pinged FROM $wpdb->posts WHERE ID = %d", $post_id )); + $pung = trim($pung); + $pung = preg_split('/\s/', $pung); + $pung = apply_filters('get_pung', $pung); + return $pung; +} + +/** + * Retrieve URLs that need to be pinged. + * + * @since 1.5.0 + * @uses $wpdb + * + * @param int $post_id Post ID + * @return array + */ +function get_to_ping($post_id) { + global $wpdb; + $to_ping = $wpdb->get_var( $wpdb->prepare( "SELECT to_ping FROM $wpdb->posts WHERE ID = %d", $post_id )); + $to_ping = trim($to_ping); + $to_ping = preg_split('/\s/', $to_ping, -1, PREG_SPLIT_NO_EMPTY); + $to_ping = apply_filters('get_to_ping', $to_ping); + return $to_ping; +} + +/** + * Do trackbacks for a list of URLs. + * + * @since 1.0.0 + * + * @param string $tb_list Comma separated list of URLs + * @param int $post_id Post ID + */ +function trackback_url_list($tb_list, $post_id) { + if ( ! empty( $tb_list ) ) { + // get post data + $postdata = wp_get_single_post($post_id, ARRAY_A); + + // import postdata as variables + extract($postdata, EXTR_SKIP); + + // form an excerpt + $excerpt = strip_tags($post_excerpt ? $post_excerpt : $post_content); + + if (strlen($excerpt) > 255) { + $excerpt = substr($excerpt,0,252) . '...'; + } + + $trackback_urls = explode(',', $tb_list); + foreach( (array) $trackback_urls as $tb_url) { + $tb_url = trim($tb_url); + trackback($tb_url, stripslashes($post_title), $excerpt, $post_id); + } + } +} + +// +// Page functions +// + +/** + * Get a list of page IDs. + * + * @since 2.0.0 + * @uses $wpdb + * + * @return array List of page IDs. + */ +function get_all_page_ids() { + global $wpdb; + + if ( ! $page_ids = wp_cache_get('all_page_ids', 'posts') ) { + $page_ids = $wpdb->get_col("SELECT ID FROM $wpdb->posts WHERE post_type = 'page'"); + wp_cache_add('all_page_ids', $page_ids, 'posts'); + } + + return $page_ids; +} + +/** + * Retrieves page data given a page ID or page object. + * + * @since 1.5.1 + * + * @param mixed $page Page object or page ID. Passed by reference. + * @param string $output What to output. OBJECT, ARRAY_A, or ARRAY_N. + * @param string $filter How the return value should be filtered. + * @return mixed Page data. + */ +function &get_page(&$page, $output = OBJECT, $filter = 'raw') { + $p = get_post($page, $output, $filter); + return $p; +} + +/** + * Retrieves a page given its path. + * + * @since 2.1.0 + * @uses $wpdb + * + * @param string $page_path Page path + * @param string $output Optional. Output type. OBJECT, ARRAY_N, or ARRAY_A. Default OBJECT. + * @param string $post_type Optional. Post type. Default page. + * @return mixed Null when complete. + */ +function get_page_by_path($page_path, $output = OBJECT, $post_type = 'page') { + global $wpdb; + $null = null; + $page_path = rawurlencode(urldecode($page_path)); + $page_path = str_replace('%2F', '/', $page_path); + $page_path = str_replace('%20', ' ', $page_path); + $page_paths = '/' . trim($page_path, '/'); + $leaf_path = sanitize_title(basename($page_paths)); + $page_paths = explode('/', $page_paths); + $full_path = ''; + foreach ( (array) $page_paths as $pathdir ) + $full_path .= ( $pathdir != '' ? '/' : '' ) . sanitize_title($pathdir); + + $pages = $wpdb->get_results( $wpdb->prepare( "SELECT ID, post_name, post_parent FROM $wpdb->posts WHERE post_name = %s AND (post_type = %s OR post_type = 'attachment')", $leaf_path, $post_type )); + + if ( empty($pages) ) + return $null; + + foreach ( $pages as $page ) { + $path = '/' . $leaf_path; + $curpage = $page; + while ( $curpage->post_parent != 0 ) { + $post_parent = $curpage->post_parent; + $curpage = wp_cache_get( $post_parent, 'posts' ); + if ( false === $curpage ) + $curpage = $wpdb->get_row( $wpdb->prepare( "SELECT ID, post_name, post_parent FROM $wpdb->posts WHERE ID = %d and post_type = %s", $post_parent, $post_type ) ); + $path = '/' . $curpage->post_name . $path; + } + + if ( $path == $full_path ) + return get_page($page->ID, $output, $post_type); + } + + return $null; +} + +/** + * Retrieve a page given its title. + * + * @since 2.1.0 + * @uses $wpdb + * + * @param string $page_title Page title + * @param string $output Optional. Output type. OBJECT, ARRAY_N, or ARRAY_A. Default OBJECT. + * @param string $post_type Optional. Post type. Default page. + * @return mixed + */ +function get_page_by_title($page_title, $output = OBJECT, $post_type = 'page' ) { + global $wpdb; + $page = $wpdb->get_var( $wpdb->prepare( "SELECT ID FROM $wpdb->posts WHERE post_title = %s AND post_type= %s", $page_title, $post_type ) ); + if ( $page ) + return get_page($page, $output); + + return null; +} + +/** + * Retrieve child pages from list of pages matching page ID. + * + * Matches against the pages parameter against the page ID. Also matches all + * children for the same to retrieve all children of a page. Does not make any + * SQL queries to get the children. + * + * @since 1.5.1 + * + * @param int $page_id Page ID. + * @param array $pages List of pages' objects. + * @return array + */ +function &get_page_children($page_id, $pages) { + $page_list = array(); + foreach ( (array) $pages as $page ) { + if ( $page->post_parent == $page_id ) { + $page_list[] = $page; + if ( $children = get_page_children($page->ID, $pages) ) + $page_list = array_merge($page_list, $children); + } + } + return $page_list; +} + +/** + * Order the pages with children under parents in a flat list. + * + * It uses auxiliary structure to hold parent-children relationships and + * runs in O(N) complexity + * + * @since 2.0.0 + * + * @param array $pages Posts array. + * @param int $page_id Parent page ID. + * @return array A list arranged by hierarchy. Children immediately follow their parents. + */ +function &get_page_hierarchy( &$pages, $page_id = 0 ) { + if ( empty( $pages ) ) { + $result = array(); + return $result; + } + + $children = array(); + foreach ( (array) $pages as $p ) { + $parent_id = intval( $p->post_parent ); + $children[ $parent_id ][] = $p; + } + + $result = array(); + _page_traverse_name( $page_id, $children, $result ); + + return $result; +} + +/** + * function to traverse and return all the nested children post names of a root page. + * $children contains parent-chilren relations + * + * @since 2.9.0 + */ +function _page_traverse_name( $page_id, &$children, &$result ){ + if ( isset( $children[ $page_id ] ) ){ + foreach( (array)$children[ $page_id ] as $child ) { + $result[ $child->ID ] = $child->post_name; + _page_traverse_name( $child->ID, $children, $result ); + } + } +} + +/** + * Builds URI for a page. + * + * Sub pages will be in the "directory" under the parent page post name. + * + * @since 1.5.0 + * + * @param mixed $page Page object or page ID. + * @return string Page URI. + */ +function get_page_uri($page) { + if ( ! is_object($page) ) + $page = get_page($page); + $uri = $page->post_name; + + // A page cannot be it's own parent. + if ( $page->post_parent == $page->ID ) + return $uri; + + while ($page->post_parent != 0) { + $page = get_page($page->post_parent); + $uri = $page->post_name . "/" . $uri; + } + + return $uri; +} + +/** + * Retrieve a list of pages. + * + * The defaults that can be overridden are the following: 'child_of', + * 'sort_order', 'sort_column', 'post_title', 'hierarchical', 'exclude', + * 'include', 'meta_key', 'meta_value','authors', 'number', and 'offset'. + * + * @since 1.5.0 + * @uses $wpdb + * + * @param mixed $args Optional. Array or string of options that overrides defaults. + * @return array List of pages matching defaults or $args + */ +function &get_pages($args = '') { + global $wpdb; + + $defaults = array( + 'child_of' => 0, 'sort_order' => 'ASC', + 'sort_column' => 'post_title', 'hierarchical' => 1, + 'exclude' => array(), 'include' => array(), + 'meta_key' => '', 'meta_value' => '', + 'authors' => '', 'parent' => -1, 'exclude_tree' => '', + 'number' => '', 'offset' => 0, + 'post_type' => 'page', 'post_status' => 'publish', + ); + + $r = wp_parse_args( $args, $defaults ); + extract( $r, EXTR_SKIP ); + $number = (int) $number; + $offset = (int) $offset; + + // Make sure the post type is hierarchical + $hierarchical_post_types = get_post_types( array( 'hierarchical' => true ) ); + if ( !in_array( $post_type, $hierarchical_post_types ) ) + return false; + + // Make sure we have a valid post status + if ( !is_array( $post_status ) ) + $post_status = explode( ',', $post_status ); + if ( array_diff( $post_status, get_post_stati() ) ) + return false; + + $cache = array(); + $key = md5( serialize( compact(array_keys($defaults)) ) ); + if ( $cache = wp_cache_get( 'get_pages', 'posts' ) ) { + if ( is_array($cache) && isset( $cache[ $key ] ) ) { + $pages = apply_filters('get_pages', $cache[ $key ], $r ); + return $pages; + } + } + + if ( !is_array($cache) ) + $cache = array(); + + $inclusions = ''; + if ( !empty($include) ) { + $child_of = 0; //ignore child_of, parent, exclude, meta_key, and meta_value params if using include + $parent = -1; + $exclude = ''; + $meta_key = ''; + $meta_value = ''; + $hierarchical = false; + $incpages = wp_parse_id_list( $include ); + if ( ! empty( $incpages ) ) { + foreach ( $incpages as $incpage ) { + if (empty($inclusions)) + $inclusions = $wpdb->prepare(' AND ( ID = %d ', $incpage); + else + $inclusions .= $wpdb->prepare(' OR ID = %d ', $incpage); + } + } + } + if (!empty($inclusions)) + $inclusions .= ')'; + + $exclusions = ''; + if ( !empty($exclude) ) { + $expages = wp_parse_id_list( $exclude ); + if ( ! empty( $expages ) ) { + foreach ( $expages as $expage ) { + if (empty($exclusions)) + $exclusions = $wpdb->prepare(' AND ( ID <> %d ', $expage); + else + $exclusions .= $wpdb->prepare(' AND ID <> %d ', $expage); + } + } + } + if (!empty($exclusions)) + $exclusions .= ')'; + + $author_query = ''; + if (!empty($authors)) { + $post_authors = preg_split('/[\s,]+/',$authors); + + if ( ! empty( $post_authors ) ) { + foreach ( $post_authors as $post_author ) { + //Do we have an author id or an author login? + if ( 0 == intval($post_author) ) { + $post_author = get_userdatabylogin($post_author); + if ( empty($post_author) ) + continue; + if ( empty($post_author->ID) ) + continue; + $post_author = $post_author->ID; + } + + if ( '' == $author_query ) + $author_query = $wpdb->prepare(' post_author = %d ', $post_author); + else + $author_query .= $wpdb->prepare(' OR post_author = %d ', $post_author); + } + if ( '' != $author_query ) + $author_query = " AND ($author_query)"; + } + } + + $join = ''; + $where = "$exclusions $inclusions "; + if ( ! empty( $meta_key ) || ! empty( $meta_value ) ) { + $join = " LEFT JOIN $wpdb->postmeta ON ( $wpdb->posts.ID = $wpdb->postmeta.post_id )"; + + // meta_key and meta_value might be slashed + $meta_key = stripslashes($meta_key); + $meta_value = stripslashes($meta_value); + if ( ! empty( $meta_key ) ) + $where .= $wpdb->prepare(" AND $wpdb->postmeta.meta_key = %s", $meta_key); + if ( ! empty( $meta_value ) ) + $where .= $wpdb->prepare(" AND $wpdb->postmeta.meta_value = %s", $meta_value); + + } + + if ( $parent >= 0 ) + $where .= $wpdb->prepare(' AND post_parent = %d ', $parent); + + if ( 1 == count( $post_status ) ) { + $where_post_type = $wpdb->prepare( "post_type = %s AND post_status = %s", $post_type, array_shift( $post_status ) ); + } else { + $post_status = implode( "', '", $post_status ); + $where_post_type = $wpdb->prepare( "post_type = %s AND post_status IN ('$post_status')", $post_type ); + } + + $orderby_array = array(); + $allowed_keys = array('author', 'post_author', 'date', 'post_date', 'title', 'post_title', 'modified', + 'post_modified', 'modified_gmt', 'post_modified_gmt', 'menu_order', 'parent', 'post_parent', + 'ID', 'rand', 'comment_count'); + foreach ( explode( ',', $sort_column ) as $orderby ) { + $orderby = trim( $orderby ); + if ( !in_array( $orderby, $allowed_keys ) ) + continue; + + switch ( $orderby ) { + case 'menu_order': + break; + case 'ID': + $orderby = "$wpdb->posts.ID"; + break; + case 'rand': + $orderby = 'RAND()'; + break; + case 'comment_count': + $orderby = "$wpdb->posts.comment_count"; + break; + default: + if ( 0 === strpos( $orderby, 'post_' ) ) + $orderby = "$wpdb->posts." . $orderby; + else + $orderby = "$wpdb->posts.post_" . $orderby; + } + + $orderby_array[] = $orderby; + + } + $sort_column = ! empty( $orderby_array ) ? implode( ',', $orderby_array ) : "$wpdb->posts.post_title"; + + $sort_order = strtoupper( $sort_order ); + if ( '' !== $sort_order && !in_array( $sort_order, array( 'ASC', 'DESC' ) ) ) + $sort_order = 'ASC'; + + $query = "SELECT * FROM $wpdb->posts $join WHERE ($where_post_type) $where "; + $query .= $author_query; + $query .= " ORDER BY " . $sort_column . " " . $sort_order ; + + if ( !empty($number) ) + $query .= ' LIMIT ' . $offset . ',' . $number; + + $pages = $wpdb->get_results($query); + + if ( empty($pages) ) { + $pages = apply_filters('get_pages', array(), $r); + return $pages; + } + + // Sanitize before caching so it'll only get done once + $num_pages = count($pages); + for ($i = 0; $i < $num_pages; $i++) { + $pages[$i] = sanitize_post($pages[$i], 'raw'); + } + + // Update cache. + update_page_cache($pages); + + if ( $child_of || $hierarchical ) + $pages = & get_page_children($child_of, $pages); + + if ( !empty($exclude_tree) ) { + $exclude = (int) $exclude_tree; + $children = get_page_children($exclude, $pages); + $excludes = array(); + foreach ( $children as $child ) + $excludes[] = $child->ID; + $excludes[] = $exclude; + $num_pages = count($pages); + for ( $i = 0; $i < $num_pages; $i++ ) { + if ( in_array($pages[$i]->ID, $excludes) ) + unset($pages[$i]); + } + } + + $cache[ $key ] = $pages; + wp_cache_set( 'get_pages', $cache, 'posts' ); + + $pages = apply_filters('get_pages', $pages, $r); + + return $pages; +} + +// +// Attachment functions +// + +/** + * Check if the attachment URI is local one and is really an attachment. + * + * @since 2.0.0 + * + * @param string $url URL to check + * @return bool True on success, false on failure. + */ +function is_local_attachment($url) { + if (strpos($url, home_url()) === false) + return false; + if (strpos($url, home_url('/?attachment_id=')) !== false) + return true; + if ( $id = url_to_postid($url) ) { + $post = & get_post($id); + if ( 'attachment' == $post->post_type ) + return true; + } + return false; +} + +/** + * Insert an attachment. + * + * If you set the 'ID' in the $object parameter, it will mean that you are + * updating and attempt to update the attachment. You can also set the + * attachment name or title by setting the key 'post_name' or 'post_title'. + * + * You can set the dates for the attachment manually by setting the 'post_date' + * and 'post_date_gmt' keys' values. + * + * By default, the comments will use the default settings for whether the + * comments are allowed. You can close them manually or keep them open by + * setting the value for the 'comment_status' key. + * + * The $object parameter can have the following: + * 'post_status' - Default is 'draft'. Can not be overridden, set the same as parent post. + * 'post_type' - Default is 'post', will be set to attachment. Can not override. + * 'post_author' - Default is current user ID. The ID of the user, who added the attachment. + * 'ping_status' - Default is the value in default ping status option. Whether the attachment + * can accept pings. + * 'post_parent' - Default is 0. Can use $parent parameter or set this for the post it belongs + * to, if any. + * 'menu_order' - Default is 0. The order it is displayed. + * 'to_ping' - Whether to ping. + * 'pinged' - Default is empty string. + * 'post_password' - Default is empty string. The password to access the attachment. + * 'guid' - Global Unique ID for referencing the attachment. + * 'post_content_filtered' - Attachment post content filtered. + * 'post_excerpt' - Attachment excerpt. + * + * @since 2.0.0 + * @uses $wpdb + * @uses $user_ID + * @uses do_action() Calls 'edit_attachment' on $post_ID if this is an update. + * @uses do_action() Calls 'add_attachment' on $post_ID if this is not an update. + * + * @param string|array $object Arguments to override defaults. + * @param string $file Optional filename. + * @param int $parent Parent post ID. + * @return int Attachment ID. + */ +function wp_insert_attachment($object, $file = false, $parent = 0) { + global $wpdb, $user_ID; + + $defaults = array('post_status' => 'inherit', 'post_type' => 'post', 'post_author' => $user_ID, + 'ping_status' => get_option('default_ping_status'), 'post_parent' => 0, + 'menu_order' => 0, 'to_ping' => '', 'pinged' => '', 'post_password' => '', + 'guid' => '', 'post_content_filtered' => '', 'post_excerpt' => '', 'import_id' => 0, 'context' => ''); + + $object = wp_parse_args($object, $defaults); + if ( !empty($parent) ) + $object['post_parent'] = $parent; + + unset( $object[ 'filter' ] ); + + $object = sanitize_post($object, 'db'); + + // export array as variables + extract($object, EXTR_SKIP); + + if ( empty($post_author) ) + $post_author = $user_ID; + + $post_type = 'attachment'; + + if ( ! in_array( $post_status, array( 'inherit', 'private' ) ) ) + $post_status = 'inherit'; + + // Make sure we set a valid category. + if ( !isset($post_category) || 0 == count($post_category) || !is_array($post_category) ) { + // 'post' requires at least one category. + if ( 'post' == $post_type ) + $post_category = array( get_option('default_category') ); + else + $post_category = array(); + } + + // Are we updating or creating? + if ( !empty($ID) ) { + $update = true; + $post_ID = (int) $ID; + } else { + $update = false; + $post_ID = 0; + } + + // Create a valid post name. + if ( empty($post_name) ) + $post_name = sanitize_title($post_title); + else + $post_name = sanitize_title($post_name); + + // expected_slashed ($post_name) + $post_name = wp_unique_post_slug($post_name, $post_ID, $post_status, $post_type, $post_parent); + + if ( empty($post_date) ) + $post_date = current_time('mysql'); + if ( empty($post_date_gmt) ) + $post_date_gmt = current_time('mysql', 1); + + if ( empty($post_modified) ) + $post_modified = $post_date; + if ( empty($post_modified_gmt) ) + $post_modified_gmt = $post_date_gmt; + + if ( empty($comment_status) ) { + if ( $update ) + $comment_status = 'closed'; + else + $comment_status = get_option('default_comment_status'); + } + if ( empty($ping_status) ) + $ping_status = get_option('default_ping_status'); + + if ( isset($to_ping) ) + $to_ping = preg_replace('|\s+|', "\n", $to_ping); + else + $to_ping = ''; + + if ( isset($post_parent) ) + $post_parent = (int) $post_parent; + else + $post_parent = 0; + + if ( isset($menu_order) ) + $menu_order = (int) $menu_order; + else + $menu_order = 0; + + if ( !isset($post_password) ) + $post_password = ''; + + if ( ! isset($pinged) ) + $pinged = ''; + + // expected_slashed (everything!) + $data = compact( array( 'post_author', 'post_date', 'post_date_gmt', 'post_content', 'post_content_filtered', 'post_title', 'post_excerpt', 'post_status', 'post_type', 'comment_status', 'ping_status', 'post_password', 'post_name', 'to_ping', 'pinged', 'post_modified', 'post_modified_gmt', 'post_parent', 'menu_order', 'post_mime_type', 'guid' ) ); + $data = stripslashes_deep( $data ); + + if ( $update ) { + $wpdb->update( $wpdb->posts, $data, array( 'ID' => $post_ID ) ); + } else { + // If there is a suggested ID, use it if not already present + if ( !empty($import_id) ) { + $import_id = (int) $import_id; + if ( ! $wpdb->get_var( $wpdb->prepare("SELECT ID FROM $wpdb->posts WHERE ID = %d", $import_id) ) ) { + $data['ID'] = $import_id; + } + } + + $wpdb->insert( $wpdb->posts, $data ); + $post_ID = (int) $wpdb->insert_id; + } + + if ( empty($post_name) ) { + $post_name = sanitize_title($post_title, $post_ID); + $wpdb->update( $wpdb->posts, compact("post_name"), array( 'ID' => $post_ID ) ); + } + + wp_set_post_categories($post_ID, $post_category); + + if ( $file ) + update_attached_file( $post_ID, $file ); + + clean_post_cache($post_ID); + + if ( isset($post_parent) && $post_parent < 0 ) + add_post_meta($post_ID, '_wp_attachment_temp_parent', $post_parent, true); + + if ( ! empty( $context ) ) + add_post_meta( $post_ID, '_wp_attachment_context', $context, true ); + + if ( $update) { + do_action('edit_attachment', $post_ID); + } else { + do_action('add_attachment', $post_ID); + } + + return $post_ID; +} + +/** + * Trashes or deletes an attachment. + * + * When an attachment is permanently deleted, the file will also be removed. + * Deletion removes all post meta fields, taxonomy, comments, etc. associated + * with the attachment (except the main post). + * + * The attachment is moved to the trash instead of permanently deleted unless trash + * for media is disabled, item is already in the trash, or $force_delete is true. + * + * @since 2.0.0 + * @uses $wpdb + * @uses do_action() Calls 'delete_attachment' hook on Attachment ID. + * + * @param int $post_id Attachment ID. + * @param bool $force_delete Whether to bypass trash and force deletion. Defaults to false. + * @return mixed False on failure. Post data on success. + */ +function wp_delete_attachment( $post_id, $force_delete = false ) { + global $wpdb; + + if ( !$post = $wpdb->get_row( $wpdb->prepare("SELECT * FROM $wpdb->posts WHERE ID = %d", $post_id) ) ) + return $post; + + if ( 'attachment' != $post->post_type ) + return false; + + if ( !$force_delete && EMPTY_TRASH_DAYS && MEDIA_TRASH && 'trash' != $post->post_status ) + return wp_trash_post( $post_id ); + + delete_post_meta($post_id, '_wp_trash_meta_status'); + delete_post_meta($post_id, '_wp_trash_meta_time'); + + $meta = wp_get_attachment_metadata( $post_id ); + $backup_sizes = get_post_meta( $post->ID, '_wp_attachment_backup_sizes', true ); + $file = get_attached_file( $post_id ); + + if ( is_multisite() ) + delete_transient( 'dirsize_cache' ); + + do_action('delete_attachment', $post_id); + + wp_delete_object_term_relationships($post_id, array('category', 'post_tag')); + wp_delete_object_term_relationships($post_id, get_object_taxonomies($post->post_type)); + + $wpdb->query( $wpdb->prepare( "DELETE FROM $wpdb->postmeta WHERE meta_key = '_thumbnail_id' AND meta_value = %d", $post_id )); + + $comment_ids = $wpdb->get_col( $wpdb->prepare( "SELECT comment_ID FROM $wpdb->comments WHERE comment_post_ID = %d", $post_id )); + if ( ! empty( $comment_ids ) ) { + do_action( 'delete_comment', $comment_ids ); + foreach ( $comment_ids as $comment_id ) + wp_delete_comment( $comment_id, true ); + do_action( 'deleted_comment', $comment_ids ); + } + + $post_meta_ids = $wpdb->get_col( $wpdb->prepare( "SELECT meta_id FROM $wpdb->postmeta WHERE post_id = %d ", $post_id )); + if ( !empty($post_meta_ids) ) { + do_action( 'delete_postmeta', $post_meta_ids ); + $in_post_meta_ids = "'" . implode("', '", $post_meta_ids) . "'"; + $wpdb->query( "DELETE FROM $wpdb->postmeta WHERE meta_id IN($in_post_meta_ids)" ); + do_action( 'deleted_postmeta', $post_meta_ids ); + } + + do_action( 'delete_post', $post_id ); + $wpdb->query( $wpdb->prepare( "DELETE FROM $wpdb->posts WHERE ID = %d", $post_id )); + do_action( 'deleted_post', $post_id ); + + $uploadpath = wp_upload_dir(); + + if ( ! empty($meta['thumb']) ) { + // Don't delete the thumb if another attachment uses it + if (! $wpdb->get_row( $wpdb->prepare( "SELECT meta_id FROM $wpdb->postmeta WHERE meta_key = '_wp_attachment_metadata' AND meta_value LIKE %s AND post_id <> %d", '%' . $meta['thumb'] . '%', $post_id)) ) { + $thumbfile = str_replace(basename($file), $meta['thumb'], $file); + $thumbfile = apply_filters('wp_delete_file', $thumbfile); + @ unlink( path_join($uploadpath['basedir'], $thumbfile) ); + } + } + + // remove intermediate and backup images if there are any + foreach ( get_intermediate_image_sizes() as $size ) { + if ( $intermediate = image_get_intermediate_size($post_id, $size) ) { + $intermediate_file = apply_filters('wp_delete_file', $intermediate['path']); + @ unlink( path_join($uploadpath['basedir'], $intermediate_file) ); + } + } + + if ( is_array($backup_sizes) ) { + foreach ( $backup_sizes as $size ) { + $del_file = path_join( dirname($meta['file']), $size['file'] ); + $del_file = apply_filters('wp_delete_file', $del_file); + @ unlink( path_join($uploadpath['basedir'], $del_file) ); + } + } + + $file = apply_filters('wp_delete_file', $file); + + if ( ! empty($file) ) + @ unlink($file); + + clean_post_cache($post_id); + + return $post; +} + +/** + * Retrieve attachment meta field for attachment ID. + * + * @since 2.1.0 + * + * @param int $post_id Attachment ID + * @param bool $unfiltered Optional, default is false. If true, filters are not run. + * @return string|bool Attachment meta field. False on failure. + */ +function wp_get_attachment_metadata( $post_id = 0, $unfiltered = false ) { + $post_id = (int) $post_id; + if ( !$post =& get_post( $post_id ) ) + return false; + + $data = get_post_meta( $post->ID, '_wp_attachment_metadata', true ); + + if ( $unfiltered ) + return $data; + + return apply_filters( 'wp_get_attachment_metadata', $data, $post->ID ); +} + +/** + * Update metadata for an attachment. + * + * @since 2.1.0 + * + * @param int $post_id Attachment ID. + * @param array $data Attachment data. + * @return int + */ +function wp_update_attachment_metadata( $post_id, $data ) { + $post_id = (int) $post_id; + if ( !$post =& get_post( $post_id ) ) + return false; + + $data = apply_filters( 'wp_update_attachment_metadata', $data, $post->ID ); + + return update_post_meta( $post->ID, '_wp_attachment_metadata', $data); +} + +/** + * Retrieve the URL for an attachment. + * + * @since 2.1.0 + * + * @param int $post_id Attachment ID. + * @return string + */ +function wp_get_attachment_url( $post_id = 0 ) { + $post_id = (int) $post_id; + if ( !$post =& get_post( $post_id ) ) + return false; + + $url = ''; + if ( $file = get_post_meta( $post->ID, '_wp_attached_file', true) ) { //Get attached file + if ( ($uploads = wp_upload_dir()) && false === $uploads['error'] ) { //Get upload directory + if ( 0 === strpos($file, $uploads['basedir']) ) //Check that the upload base exists in the file location + $url = str_replace($uploads['basedir'], $uploads['baseurl'], $file); //replace file location with url location + elseif ( false !== strpos($file, 'wp-content/uploads') ) + $url = $uploads['baseurl'] . substr( $file, strpos($file, 'wp-content/uploads') + 18 ); + else + $url = $uploads['baseurl'] . "/$file"; //Its a newly uploaded file, therefor $file is relative to the basedir. + } + } + + if ( empty($url) ) //If any of the above options failed, Fallback on the GUID as used pre-2.7, not recomended to rely upon this. + $url = get_the_guid( $post->ID ); + + $url = apply_filters( 'wp_get_attachment_url', $url, $post->ID ); + + if ( 'attachment' != $post->post_type || empty( $url ) ) + return false; + + return $url; +} + +/** + * Retrieve thumbnail for an attachment. + * + * @since 2.1.0 + * + * @param int $post_id Attachment ID. + * @return mixed False on failure. Thumbnail file path on success. + */ +function wp_get_attachment_thumb_file( $post_id = 0 ) { + $post_id = (int) $post_id; + if ( !$post =& get_post( $post_id ) ) + return false; + if ( !is_array( $imagedata = wp_get_attachment_metadata( $post->ID ) ) ) + return false; + + $file = get_attached_file( $post->ID ); + + if ( !empty($imagedata['thumb']) && ($thumbfile = str_replace(basename($file), $imagedata['thumb'], $file)) && file_exists($thumbfile) ) + return apply_filters( 'wp_get_attachment_thumb_file', $thumbfile, $post->ID ); + return false; +} + +/** + * Retrieve URL for an attachment thumbnail. + * + * @since 2.1.0 + * + * @param int $post_id Attachment ID + * @return string|bool False on failure. Thumbnail URL on success. + */ +function wp_get_attachment_thumb_url( $post_id = 0 ) { + $post_id = (int) $post_id; + if ( !$post =& get_post( $post_id ) ) + return false; + if ( !$url = wp_get_attachment_url( $post->ID ) ) + return false; + + $sized = image_downsize( $post_id, 'thumbnail' ); + if ( $sized ) + return $sized[0]; + + if ( !$thumb = wp_get_attachment_thumb_file( $post->ID ) ) + return false; + + $url = str_replace(basename($url), basename($thumb), $url); + + return apply_filters( 'wp_get_attachment_thumb_url', $url, $post->ID ); +} + +/** + * Check if the attachment is an image. + * + * @since 2.1.0 + * + * @param int $post_id Attachment ID + * @return bool + */ +function wp_attachment_is_image( $post_id = 0 ) { + $post_id = (int) $post_id; + if ( !$post =& get_post( $post_id ) ) + return false; + + if ( !$file = get_attached_file( $post->ID ) ) + return false; + + $ext = preg_match('/\.([^.]+)$/', $file, $matches) ? strtolower($matches[1]) : false; + + $image_exts = array('jpg', 'jpeg', 'gif', 'png'); + + if ( 'image/' == substr($post->post_mime_type, 0, 6) || $ext && 'import' == $post->post_mime_type && in_array($ext, $image_exts) ) + return true; + return false; +} + +/** + * Retrieve the icon for a MIME type. + * + * @since 2.1.0 + * + * @param string $mime MIME type + * @return string|bool + */ +function wp_mime_type_icon( $mime = 0 ) { + if ( !is_numeric($mime) ) + $icon = wp_cache_get("mime_type_icon_$mime"); + if ( empty($icon) ) { + $post_id = 0; + $post_mimes = array(); + if ( is_numeric($mime) ) { + $mime = (int) $mime; + if ( $post =& get_post( $mime ) ) { + $post_id = (int) $post->ID; + $ext = preg_replace('/^.+?\.([^.]+)$/', '$1', $post->guid); + if ( !empty($ext) ) { + $post_mimes[] = $ext; + if ( $ext_type = wp_ext2type( $ext ) ) + $post_mimes[] = $ext_type; + } + $mime = $post->post_mime_type; + } else { + $mime = 0; + } + } else { + $post_mimes[] = $mime; + } + + $icon_files = wp_cache_get('icon_files'); + + if ( !is_array($icon_files) ) { + $icon_dir = apply_filters( 'icon_dir', ABSPATH . WPINC . '/images/crystal' ); + $icon_dir_uri = apply_filters( 'icon_dir_uri', includes_url('images/crystal') ); + $dirs = apply_filters( 'icon_dirs', array($icon_dir => $icon_dir_uri) ); + $icon_files = array(); + while ( $dirs ) { + $dir = array_shift($keys = array_keys($dirs)); + $uri = array_shift($dirs); + if ( $dh = opendir($dir) ) { + while ( false !== $file = readdir($dh) ) { + $file = basename($file); + if ( substr($file, 0, 1) == '.' ) + continue; + if ( !in_array(strtolower(substr($file, -4)), array('.png', '.gif', '.jpg') ) ) { + if ( is_dir("$dir/$file") ) + $dirs["$dir/$file"] = "$uri/$file"; + continue; + } + $icon_files["$dir/$file"] = "$uri/$file"; + } + closedir($dh); + } + } + wp_cache_set('icon_files', $icon_files, 600); + } + + // Icon basename - extension = MIME wildcard + foreach ( $icon_files as $file => $uri ) + $types[ preg_replace('/^([^.]*).*$/', '$1', basename($file)) ] =& $icon_files[$file]; + + if ( ! empty($mime) ) { + $post_mimes[] = substr($mime, 0, strpos($mime, '/')); + $post_mimes[] = substr($mime, strpos($mime, '/') + 1); + $post_mimes[] = str_replace('/', '_', $mime); + } + + $matches = wp_match_mime_types(array_keys($types), $post_mimes); + $matches['default'] = array('default'); + + foreach ( $matches as $match => $wilds ) { + if ( isset($types[$wilds[0]])) { + $icon = $types[$wilds[0]]; + if ( !is_numeric($mime) ) + wp_cache_set("mime_type_icon_$mime", $icon); + break; + } + } + } + + return apply_filters( 'wp_mime_type_icon', $icon, $mime, $post_id ); // Last arg is 0 if function pass mime type. +} + +/** + * Checked for changed slugs for published post objects and save the old slug. + * + * The function is used when a post object of any type is updated, + * by comparing the current and previous post objects. + * + * If the slug was changed and not already part of the old slugs then it will be + * added to the post meta field ('_wp_old_slug') for storing old slugs for that + * post. + * + * The most logically usage of this function is redirecting changed post objects, so + * that those that linked to an changed post will be redirected to the new post. + * + * @since 2.1.0 + * + * @param int $post_id Post ID. + * @param object $post The Post Object + * @param object $post_before The Previous Post Object + * @return int Same as $post_id + */ +function wp_check_for_changed_slugs($post_id, $post, $post_before) { + // dont bother if it hasnt changed + if ( $post->post_name == $post_before->post_name ) + return; + + // we're only concerned with published, non-hierarchical objects + if ( $post->post_status != 'publish' || is_post_type_hierarchical( $post->post_type ) ) + return; + + $old_slugs = (array) get_post_meta($post_id, '_wp_old_slug'); + + // if we haven't added this old slug before, add it now + if ( !empty( $post_before->post_name ) && !in_array($post_before->post_name, $old_slugs) ) + add_post_meta($post_id, '_wp_old_slug', $post_before->post_name); + + // if the new slug was used previously, delete it from the list + if ( in_array($post->post_name, $old_slugs) ) + delete_post_meta($post_id, '_wp_old_slug', $post->post_name); +} + +/** + * Retrieve the private post SQL based on capability. + * + * This function provides a standardized way to appropriately select on the + * post_status of a post type. The function will return a piece of SQL code + * that can be added to a WHERE clause; this SQL is constructed to allow all + * published posts, and all private posts to which the user has access. + * + * @since 2.2.0 + * + * @uses $user_ID + * + * @param string $post_type currently only supports 'post' or 'page'. + * @return string SQL code that can be added to a where clause. + */ +function get_private_posts_cap_sql( $post_type ) { + return get_posts_by_author_sql( $post_type, false ); +} + +/** + * Retrieve the post SQL based on capability, author, and type. + * + * @see get_private_posts_cap_sql() for full description. + * + * @since 3.0.0 + * @param string $post_type Post type. + * @param bool $full Optional. Returns a full WHERE statement instead of just an 'andalso' term. + * @param int $post_author Optional. Query posts having a single author ID. + * @return string SQL WHERE code that can be added to a query. + */ +function get_posts_by_author_sql( $post_type, $full = true, $post_author = null ) { + global $user_ID, $wpdb; + + // Private posts + $post_type_obj = get_post_type_object( $post_type ); + if ( ! $post_type_obj ) + return ' 1 = 0 '; + + // This hook is deprecated. Why you'd want to use it, I dunno. + if ( ! $cap = apply_filters( 'pub_priv_sql_capability', '' ) ) + $cap = $post_type_obj->cap->read_private_posts; + + if ( $full ) { + if ( null === $post_author ) { + $sql = $wpdb->prepare( 'WHERE post_type = %s AND ', $post_type ); + } else { + $sql = $wpdb->prepare( 'WHERE post_author = %d AND post_type = %s AND ', $post_author, $post_type ); + } + } else { + $sql = ''; + } + + $sql .= "(post_status = 'publish'"; + + if ( current_user_can( $cap ) ) { + // Does the user have the capability to view private posts? Guess so. + $sql .= " OR post_status = 'private'"; + } elseif ( is_user_logged_in() ) { + // Users can view their own private posts. + $id = (int) $user_ID; + if ( null === $post_author || ! $full ) { + $sql .= " OR post_status = 'private' AND post_author = $id"; + } elseif ( $id == (int) $post_author ) { + $sql .= " OR post_status = 'private'"; + } // else none + } // else none + + $sql .= ')'; + + return $sql; +} + +/** + * Retrieve the date that the last post was published. + * + * The server timezone is the default and is the difference between GMT and + * server time. The 'blog' value is the date when the last post was posted. The + * 'gmt' is when the last post was posted in GMT formatted date. + * + * @since 0.71 + * + * @uses apply_filters() Calls 'get_lastpostdate' filter + * + * @param string $timezone The location to get the time. Can be 'gmt', 'blog', or 'server'. + * @return string The date of the last post. + */ +function get_lastpostdate($timezone = 'server') { + return apply_filters( 'get_lastpostdate', _get_last_post_time( $timezone, 'date' ), $timezone ); +} + +/** + * Retrieve last post modified date depending on timezone. + * + * The server timezone is the default and is the difference between GMT and + * server time. The 'blog' value is just when the last post was modified. The + * 'gmt' is when the last post was modified in GMT time. + * + * @since 1.2.0 + * @uses apply_filters() Calls 'get_lastpostmodified' filter + * + * @param string $timezone The location to get the time. Can be 'gmt', 'blog', or 'server'. + * @return string The date the post was last modified. + */ +function get_lastpostmodified($timezone = 'server') { + $lastpostmodified = _get_last_post_time( $timezone, 'modified' ); + + $lastpostdate = get_lastpostdate($timezone); + if ( $lastpostdate > $lastpostmodified ) + $lastpostmodified = $lastpostdate; + + return apply_filters( 'get_lastpostmodified', $lastpostmodified, $timezone ); +} + +/** + * Retrieve latest post date data based on timezone. + * + * @access private + * @since 3.1.0 + * + * @param string $timezone The location to get the time. Can be 'gmt', 'blog', or 'server'. + * @param string $field Field to check. Can be 'date' or 'modified'. + * @return string The date. + */ +function _get_last_post_time( $timezone, $field ) { + global $wpdb; + + if ( !in_array( $field, array( 'date', 'modified' ) ) ) + return false; + + $timezone = strtolower( $timezone ); + + $key = "lastpost{$field}:$timezone"; + + $date = wp_cache_get( $key, 'timeinfo' ); + + if ( !$date ) { + $add_seconds_server = date('Z'); + + $post_types = get_post_types( array( 'public' => true ) ); + array_walk( $post_types, array( &$wpdb, 'escape_by_ref' ) ); + $post_types = "'" . implode( "', '", $post_types ) . "'"; + + switch ( $timezone ) { + case 'gmt': + $date = $wpdb->get_var("SELECT post_{$field}_gmt FROM $wpdb->posts WHERE post_status = 'publish' AND post_type IN ({$post_types}) ORDER BY post_{$field}_gmt DESC LIMIT 1"); + break; + case 'blog': + $date = $wpdb->get_var("SELECT post_{$field} FROM $wpdb->posts WHERE post_status = 'publish' AND post_type IN ({$post_types}) ORDER BY post_{$field}_gmt DESC LIMIT 1"); + break; + case 'server': + $date = $wpdb->get_var("SELECT DATE_ADD(post_{$field}_gmt, INTERVAL '$add_seconds_server' SECOND) FROM $wpdb->posts WHERE post_status = 'publish' AND post_type IN ({$post_types}) ORDER BY post_{$field}_gmt DESC LIMIT 1"); + break; + } + + if ( $date ) + wp_cache_set( $key, $date, 'timeinfo' ); + } + + return $date; +} + +/** + * Updates posts in cache. + * + * @usedby update_page_cache() Aliased by this function. + * + * @package WordPress + * @subpackage Cache + * @since 1.5.1 + * + * @param array $posts Array of post objects + */ +function update_post_cache(&$posts) { + if ( !$posts ) + return; + + foreach ( $posts as $post ) + wp_cache_add($post->ID, $post, 'posts'); +} + +/** + * Will clean the post in the cache. + * + * Cleaning means delete from the cache of the post. Will call to clean the term + * object cache associated with the post ID. + * + * clean_post_cache() will call itself recursively for each child post. + * + * This function not run if $_wp_suspend_cache_invalidation is not empty. See + * wp_suspend_cache_invalidation(). + * + * @package WordPress + * @subpackage Cache + * @since 2.0.0 + * + * @uses do_action() Calls 'clean_post_cache' on $id before adding children (if any). + * + * @param int $id The Post ID in the cache to clean + */ +function clean_post_cache($id) { + global $_wp_suspend_cache_invalidation, $wpdb; + + if ( !empty($_wp_suspend_cache_invalidation) ) + return; + + $id = (int) $id; + + if ( 0 === $id ) + return; + + wp_cache_delete($id, 'posts'); + wp_cache_delete($id, 'post_meta'); + + clean_object_term_cache($id, 'post'); + + wp_cache_delete( 'wp_get_archives', 'general' ); + + do_action('clean_post_cache', $id); + + if ( $children = $wpdb->get_col( $wpdb->prepare("SELECT ID FROM $wpdb->posts WHERE post_parent = %d", $id) ) ) { + foreach ( $children as $cid ) { + // Loop detection + if ( $cid == $id ) + continue; + clean_post_cache( $cid ); + } + } + + if ( is_multisite() ) + wp_cache_delete( $wpdb->blogid . '-' . $id, 'global-posts' ); +} + +/** + * Alias of update_post_cache(). + * + * @see update_post_cache() Posts and pages are the same, alias is intentional + * + * @package WordPress + * @subpackage Cache + * @since 1.5.1 + * + * @param array $pages list of page objects + */ +function update_page_cache(&$pages) { + 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'. + * + * @package WordPress + * @subpackage Cache + * @since 2.0.0 + * + * @uses do_action() Will call the 'clean_page_cache' hook action. + * + * @param int $id Page ID to clean + */ +function clean_page_cache($id) { + clean_post_cache($id); + + wp_cache_delete( 'all_page_ids', 'posts' ); + wp_cache_delete( 'get_pages', 'posts' ); + + do_action('clean_page_cache', $id); +} + +/** + * Call major cache updating functions for list of Post objects. + * + * @package WordPress + * @subpackage Cache + * @since 1.5.0 + * + * @uses $wpdb + * @uses update_post_cache() + * @uses update_object_term_cache() + * @uses update_postmeta_cache() + * + * @param array $posts Array of Post objects + * @param string $post_type The post type of the posts in $posts. Default is 'post'. + * @param bool $update_term_cache Whether to update the term cache. Default is true. + * @param bool $update_meta_cache Whether to update the meta cache. Default is true. + */ +function update_post_caches(&$posts, $post_type = 'post', $update_term_cache = true, $update_meta_cache = true) { + // No point in doing all this work if we didn't match any posts. + if ( !$posts ) + return; + + update_post_cache($posts); + + $post_ids = array(); + foreach ( $posts as $post ) + $post_ids[] = $post->ID; + + if ( empty($post_type) ) + $post_type = 'post'; + + if ( $update_term_cache ) { + if ( is_array($post_type) ) { + $ptypes = $post_type; + } elseif ( 'any' == $post_type ) { + // Just use the post_types in the supplied posts. + foreach ( $posts as $post ) + $ptypes[] = $post->post_type; + $ptypes = array_unique($ptypes); + } else { + $ptypes = array($post_type); + } + + if ( ! empty($ptypes) ) + update_object_term_cache($post_ids, $ptypes); + } + + if ( $update_meta_cache ) + update_postmeta_cache($post_ids); +} + +/** + * Updates metadata cache for list of post IDs. + * + * Performs SQL query to retrieve the metadata for the post IDs and updates the + * metadata cache for the posts. Therefore, the functions, which call this + * function, do not need to perform SQL queries on their own. + * + * @package WordPress + * @subpackage Cache + * @since 2.1.0 + * + * @uses $wpdb + * + * @param array $post_ids List of post IDs. + * @return bool|array Returns false if there is nothing to update or an array of metadata. + */ +function update_postmeta_cache($post_ids) { + return update_meta_cache('post', $post_ids); +} + +/** + * Will clean the attachment in the cache. + * + * Cleaning means delete from the cache. Optionaly will clean the term + * object cache associated with the attachment ID. + * + * This function will not run if $_wp_suspend_cache_invalidation is not empty. See + * wp_suspend_cache_invalidation(). + * + * @package WordPress + * @subpackage Cache + * @since 3.0.0 + * + * @uses do_action() Calls 'clean_attachment_cache' on $id. + * + * @param int $id The attachment ID in the cache to clean + * @param bool $clean_terms optional. Whether to clean terms cache + */ +function clean_attachment_cache($id, $clean_terms = false) { + global $_wp_suspend_cache_invalidation; + + if ( !empty($_wp_suspend_cache_invalidation) ) + return; + + $id = (int) $id; + + wp_cache_delete($id, 'posts'); + wp_cache_delete($id, 'post_meta'); + + if ( $clean_terms ) + clean_object_term_cache($id, 'attachment'); + + do_action('clean_attachment_cache', $id); +} + +// +// Hooks +// + +/** + * Hook for managing future post transitions to published. + * + * @since 2.3.0 + * @access private + * @uses $wpdb + * @uses do_action() Calls 'private_to_published' on post ID if this is a 'private_to_published' call. + * @uses wp_clear_scheduled_hook() with 'publish_future_post' and post ID. + * + * @param string $new_status New post status + * @param string $old_status Previous post status + * @param object $post Object type containing the post information + */ +function _transition_post_status($new_status, $old_status, $post) { + global $wpdb; + + if ( $old_status != 'publish' && $new_status == 'publish' ) { + // Reset GUID if transitioning to publish and it is empty + if ( '' == get_the_guid($post->ID) ) + $wpdb->update( $wpdb->posts, array( 'guid' => get_permalink( $post->ID ) ), array( 'ID' => $post->ID ) ); + do_action('private_to_published', $post->ID); // Deprecated, use private_to_publish + } + + // If published posts changed clear the lastpostmodified cache + if ( 'publish' == $new_status || 'publish' == $old_status) { + foreach ( array( 'server', 'gmt', 'blog' ) as $timezone ) { + wp_cache_delete( "lastpostmodified:$timezone", 'timeinfo' ); + wp_cache_delete( "lastpostdate:$timezone", 'timeinfo' ); + } + } + + // Always clears the hook in case the post status bounced from future to draft. + wp_clear_scheduled_hook('publish_future_post', array( $post->ID ) ); +} + +/** + * Hook used to schedule publication for a post marked for the future. + * + * The $post properties used and must exist are 'ID' and 'post_date_gmt'. + * + * @since 2.3.0 + * @access private + * + * @param int $deprecated Not used. Can be set to null. Never implemented. + * Not marked as deprecated with _deprecated_argument() as it conflicts with + * wp_transition_post_status() and the default filter for _future_post_hook(). + * @param object $post Object type containing the post information + */ +function _future_post_hook( $deprecated = '', $post ) { + wp_clear_scheduled_hook( 'publish_future_post', array( $post->ID ) ); + wp_schedule_single_event( strtotime( get_gmt_from_date( $post->post_date ) . ' GMT') , 'publish_future_post', array( $post->ID ) ); +} + +/** + * Hook to schedule pings and enclosures when a post is published. + * + * @since 2.3.0 + * @access private + * @uses $wpdb + * @uses XMLRPC_REQUEST and APP_REQUEST constants. + * @uses do_action() Calls 'xmlprc_publish_post' on post ID if XMLRPC_REQUEST is defined. + * @uses do_action() Calls 'app_publish_post' on post ID if APP_REQUEST is defined. + * + * @param int $post_id The ID in the database table of the post being published + */ +function _publish_post_hook($post_id) { + global $wpdb; + + if ( defined('XMLRPC_REQUEST') ) + do_action('xmlrpc_publish_post', $post_id); + if ( defined('APP_REQUEST') ) + do_action('app_publish_post', $post_id); + + if ( defined('WP_IMPORTING') ) + return; + + $data = array( 'post_id' => $post_id, 'meta_value' => '1' ); + if ( get_option('default_pingback_flag') ) { + $wpdb->insert( $wpdb->postmeta, $data + array( 'meta_key' => '_pingme' ) ); + do_action( 'added_postmeta', $wpdb->insert_id, $post_id, '_pingme', 1 ); + } + $wpdb->insert( $wpdb->postmeta, $data + array( 'meta_key' => '_encloseme' ) ); + do_action( 'added_postmeta', $wpdb->insert_id, $post_id, '_encloseme', 1 ); + + wp_schedule_single_event(time(), 'do_pings'); +} + +/** + * Hook used to prevent page/post cache and rewrite rules from staying dirty. + * + * Does two things. If the post is a page and has a template then it will + * update/add that template to the meta. For both pages and posts, it will clean + * the post cache to make sure that the cache updates to the changes done + * recently. For pages, the rewrite rules of WordPress are flushed to allow for + * any changes. + * + * The $post parameter, only uses 'post_type' property and 'page_template' + * property. + * + * @since 2.3.0 + * @access private + * @uses $wp_rewrite Flushes Rewrite Rules. + * + * @param int $post_id The ID in the database table for the $post + * @param object $post Object type containing the post information + */ +function _save_post_hook($post_id, $post) { + if ( $post->post_type == 'page' ) { + clean_page_cache($post_id); + // Avoid flushing rules for every post during import. + if ( !defined('WP_IMPORTING') ) { + global $wp_rewrite; + $wp_rewrite->flush_rules(false); + } + } else { + clean_post_cache($post_id); + } +} + +/** + * Retrieve post ancestors and append to post ancestors property. + * + * Will only retrieve ancestors once, if property is already set, then nothing + * will be done. If there is not a parent post, or post ID and post parent ID + * are the same then nothing will be done. + * + * The parameter is passed by reference, so nothing needs to be returned. The + * property will be updated and can be referenced after the function is + * complete. The post parent will be an ancestor and the parent of the post + * parent will be an ancestor. There will only be two ancestors at the most. + * + * @since 2.5.0 + * @access private + * @uses $wpdb + * + * @param object $_post Post data. + * @return null When nothing needs to be done. + */ +function _get_post_ancestors(&$_post) { + global $wpdb; + + if ( isset($_post->ancestors) ) + return; + + $_post->ancestors = array(); + + if ( empty($_post->post_parent) || $_post->ID == $_post->post_parent ) + return; + + $id = $_post->ancestors[] = $_post->post_parent; + while ( $ancestor = $wpdb->get_var( $wpdb->prepare("SELECT `post_parent` FROM $wpdb->posts WHERE ID = %d LIMIT 1", $id) ) ) { + // Loop detection: If the ancestor has been seen before, break. + if ( ( $ancestor == $_post->ID ) || in_array($ancestor, $_post->ancestors) ) + break; + $id = $_post->ancestors[] = $ancestor; + } +} + +/** + * Determines which fields of posts are to be saved in revisions. + * + * Does two things. If passed a post *array*, it will return a post array ready + * to be insterted into the posts table as a post revision. Otherwise, returns + * an array whose keys are the post fields to be saved for post revisions. + * + * @package WordPress + * @subpackage Post_Revisions + * @since 2.6.0 + * @access private + * @uses apply_filters() Calls '_wp_post_revision_fields' on 'title', 'content' and 'excerpt' fields. + * + * @param array $post Optional a post array to be processed for insertion as a post revision. + * @param bool $autosave optional Is the revision an autosave? + * @return array Post array ready to be inserted as a post revision or array of fields that can be versioned. + */ +function _wp_post_revision_fields( $post = null, $autosave = false ) { + static $fields = false; + + if ( !$fields ) { + // Allow these to be versioned + $fields = array( + 'post_title' => __( 'Title' ), + 'post_content' => __( 'Content' ), + 'post_excerpt' => __( 'Excerpt' ), + ); + + // Runs only once + $fields = apply_filters( '_wp_post_revision_fields', $fields ); + + // WP uses these internally either in versioning or elsewhere - they cannot be versioned + foreach ( array( 'ID', 'post_name', 'post_parent', 'post_date', 'post_date_gmt', 'post_status', 'post_type', 'comment_count', 'post_author' ) as $protect ) + unset( $fields[$protect] ); + } + + if ( !is_array($post) ) + return $fields; + + $return = array(); + foreach ( array_intersect( array_keys( $post ), array_keys( $fields ) ) as $field ) + $return[$field] = $post[$field]; + + $return['post_parent'] = $post['ID']; + $return['post_status'] = 'inherit'; + $return['post_type'] = 'revision'; + $return['post_name'] = $autosave ? "$post[ID]-autosave" : "$post[ID]-revision"; + $return['post_date'] = isset($post['post_modified']) ? $post['post_modified'] : ''; + $return['post_date_gmt'] = isset($post['post_modified_gmt']) ? $post['post_modified_gmt'] : ''; + + return $return; +} + +/** + * Saves an already existing post as a post revision. + * + * Typically used immediately prior to post updates. + * + * @package WordPress + * @subpackage Post_Revisions + * @since 2.6.0 + * + * @uses _wp_put_post_revision() + * + * @param int $post_id The ID of the post to save as a revision. + * @return mixed Null or 0 if error, new revision ID, if success. + */ +function wp_save_post_revision( $post_id ) { + // We do autosaves manually with wp_create_post_autosave() + if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) + return; + + // WP_POST_REVISIONS = 0, false + if ( ! WP_POST_REVISIONS ) + return; + + if ( !$post = get_post( $post_id, ARRAY_A ) ) + return; + + if ( !post_type_supports($post['post_type'], 'revisions') ) + return; + + $return = _wp_put_post_revision( $post ); + + // WP_POST_REVISIONS = true (default), -1 + if ( !is_numeric( WP_POST_REVISIONS ) || WP_POST_REVISIONS < 0 ) + return $return; + + // all revisions and (possibly) one autosave + $revisions = wp_get_post_revisions( $post_id, array( 'order' => 'ASC' ) ); + + // WP_POST_REVISIONS = (int) (# of autosaves to save) + $delete = count($revisions) - WP_POST_REVISIONS; + + if ( $delete < 1 ) + return $return; + + $revisions = array_slice( $revisions, 0, $delete ); + + for ( $i = 0; isset($revisions[$i]); $i++ ) { + if ( false !== strpos( $revisions[$i]->post_name, 'autosave' ) ) + continue; + wp_delete_post_revision( $revisions[$i]->ID ); + } + + return $return; +} + +/** + * Retrieve the autosaved data of the specified post. + * + * Returns a post object containing the information that was autosaved for the + * specified post. + * + * @package WordPress + * @subpackage Post_Revisions + * @since 2.6.0 + * + * @param int $post_id The post ID. + * @return object|bool The autosaved data or false on failure or when no autosave exists. + */ +function wp_get_post_autosave( $post_id ) { + + if ( !$post = get_post( $post_id ) ) + return false; + + $q = array( + 'name' => "{$post->ID}-autosave", + 'post_parent' => $post->ID, + 'post_type' => 'revision', + 'post_status' => 'inherit' + ); + + // Use WP_Query so that the result gets cached + $autosave_query = new WP_Query; + + add_action( 'parse_query', '_wp_get_post_autosave_hack' ); + $autosave = $autosave_query->query( $q ); + remove_action( 'parse_query', '_wp_get_post_autosave_hack' ); + + if ( $autosave && is_array($autosave) && is_object($autosave[0]) ) + return $autosave[0]; + + return false; +} + +/** + * Internally used to hack WP_Query into submission. + * + * @package WordPress + * @subpackage Post_Revisions + * @since 2.6.0 + * + * @param object $query WP_Query object + */ +function _wp_get_post_autosave_hack( $query ) { + $query->is_single = false; +} + +/** + * Determines if the specified post is a revision. + * + * @package WordPress + * @subpackage Post_Revisions + * @since 2.6.0 + * + * @param int|object $post Post ID or post object. + * @return bool|int False if not a revision, ID of revision's parent otherwise. + */ +function wp_is_post_revision( $post ) { + if ( !$post = wp_get_post_revision( $post ) ) + return false; + return (int) $post->post_parent; +} + +/** + * Determines if the specified post is an autosave. + * + * @package WordPress + * @subpackage Post_Revisions + * @since 2.6.0 + * + * @param int|object $post Post ID or post object. + * @return bool|int False if not a revision, ID of autosave's parent otherwise + */ +function wp_is_post_autosave( $post ) { + if ( !$post = wp_get_post_revision( $post ) ) + return false; + if ( "{$post->post_parent}-autosave" !== $post->post_name ) + return false; + return (int) $post->post_parent; +} + +/** + * Inserts post data into the posts table as a post revision. + * + * @package WordPress + * @subpackage Post_Revisions + * @since 2.6.0 + * + * @uses wp_insert_post() + * + * @param int|object|array $post Post ID, post object OR post array. + * @param bool $autosave Optional. Is the revision an autosave? + * @return mixed Null or 0 if error, new revision ID if success. + */ +function _wp_put_post_revision( $post = null, $autosave = false ) { + if ( is_object($post) ) + $post = get_object_vars( $post ); + elseif ( !is_array($post) ) + $post = get_post($post, ARRAY_A); + if ( !$post || empty($post['ID']) ) + return; + + if ( isset($post['post_type']) && 'revision' == $post['post_type'] ) + return new WP_Error( 'post_type', __( 'Cannot create a revision of a revision' ) ); + + $post = _wp_post_revision_fields( $post, $autosave ); + $post = add_magic_quotes($post); //since data is from db + + $revision_id = wp_insert_post( $post ); + if ( is_wp_error($revision_id) ) + return $revision_id; + + if ( $revision_id ) + do_action( '_wp_put_post_revision', $revision_id ); + return $revision_id; +} + +/** + * Gets a post revision. + * + * @package WordPress + * @subpackage Post_Revisions + * @since 2.6.0 + * + * @uses get_post() + * + * @param int|object $post Post ID or post object + * @param string $output Optional. OBJECT, ARRAY_A, or ARRAY_N. + * @param string $filter Optional sanitation filter. @see sanitize_post() + * @return mixed Null if error or post object if success + */ +function &wp_get_post_revision(&$post, $output = OBJECT, $filter = 'raw') { + $null = null; + if ( !$revision = get_post( $post, OBJECT, $filter ) ) + return $revision; + if ( 'revision' !== $revision->post_type ) + return $null; + + if ( $output == OBJECT ) { + return $revision; + } elseif ( $output == ARRAY_A ) { + $_revision = get_object_vars($revision); + return $_revision; + } elseif ( $output == ARRAY_N ) { + $_revision = array_values(get_object_vars($revision)); + return $_revision; + } + + return $revision; +} + +/** + * Restores a post to the specified revision. + * + * Can restore a past revision using all fields of the post revision, or only selected fields. + * + * @package WordPress + * @subpackage Post_Revisions + * @since 2.6.0 + * + * @uses wp_get_post_revision() + * @uses wp_update_post() + * @uses do_action() Calls 'wp_restore_post_revision' on post ID and revision ID if wp_update_post() + * is successful. + * + * @param int|object $revision_id Revision ID or revision object. + * @param array $fields Optional. What fields to restore from. Defaults to all. + * @return mixed Null if error, false if no fields to restore, (int) post ID if success. + */ +function wp_restore_post_revision( $revision_id, $fields = null ) { + if ( !$revision = wp_get_post_revision( $revision_id, ARRAY_A ) ) + return $revision; + + if ( !is_array( $fields ) ) + $fields = array_keys( _wp_post_revision_fields() ); + + $update = array(); + foreach( array_intersect( array_keys( $revision ), $fields ) as $field ) + $update[$field] = $revision[$field]; + + if ( !$update ) + return false; + + $update['ID'] = $revision['post_parent']; + + $update = add_magic_quotes( $update ); //since data is from db + + $post_id = wp_update_post( $update ); + if ( is_wp_error( $post_id ) ) + return $post_id; + + if ( $post_id ) + do_action( 'wp_restore_post_revision', $post_id, $revision['ID'] ); + + return $post_id; +} + +/** + * Deletes a revision. + * + * Deletes the row from the posts table corresponding to the specified revision. + * + * @package WordPress + * @subpackage Post_Revisions + * @since 2.6.0 + * + * @uses wp_get_post_revision() + * @uses wp_delete_post() + * + * @param int|object $revision_id Revision ID or revision object. + * @return mixed Null or WP_Error if error, deleted post if success. + */ +function wp_delete_post_revision( $revision_id ) { + if ( !$revision = wp_get_post_revision( $revision_id ) ) + return $revision; + + $delete = wp_delete_post( $revision->ID ); + if ( is_wp_error( $delete ) ) + return $delete; + + if ( $delete ) + do_action( 'wp_delete_post_revision', $revision->ID, $revision ); + + return $delete; +} + +/** + * Returns all revisions of specified post. + * + * @package WordPress + * @subpackage Post_Revisions + * @since 2.6.0 + * + * @uses get_children() + * + * @param int|object $post_id Post ID or post object + * @return array empty if no revisions + */ +function wp_get_post_revisions( $post_id = 0, $args = null ) { + if ( ! WP_POST_REVISIONS ) + return array(); + if ( ( !$post = get_post( $post_id ) ) || empty( $post->ID ) ) + return array(); + + $defaults = array( 'order' => 'DESC', 'orderby' => 'date' ); + $args = wp_parse_args( $args, $defaults ); + $args = array_merge( $args, array( 'post_parent' => $post->ID, 'post_type' => 'revision', 'post_status' => 'inherit' ) ); + + if ( !$revisions = get_children( $args ) ) + return array(); + return $revisions; +} + +function _set_preview($post) { + + if ( ! is_object($post) ) + return $post; + + $preview = wp_get_post_autosave($post->ID); + + if ( ! is_object($preview) ) + return $post; + + $preview = sanitize_post($preview); + + $post->post_content = $preview->post_content; + $post->post_title = $preview->post_title; + $post->post_excerpt = $preview->post_excerpt; + + return $post; +} + +function _show_post_preview() { + + if ( isset($_GET['preview_id']) && isset($_GET['preview_nonce']) ) { + $id = (int) $_GET['preview_id']; + + if ( false == wp_verify_nonce( $_GET['preview_nonce'], 'post_preview_' . $id ) ) + wp_die( __('You do not have permission to preview drafts.') ); + + add_filter('the_preview', '_set_preview'); + } +} + +/** + * Returns the post's parent's post_ID + * + * @since 3.1.0 + * + * @param int $post_id + * + * @return int|bool false on error + */ +function wp_get_post_parent_id( $post_ID ) { + $post = get_post( $post_ID ); + if ( !$post || is_wp_error( $post ) ) + return false; + return (int) $post->post_parent; +} + +/** + * Checks the given subset of the post hierarchy for hierarchy loops. + * Prevents loops from forming and breaks those that it finds. + * + * Attached to the wp_insert_post_parent filter. + * + * @since 3.1.0 + * @uses wp_find_hierarchy_loop() + * + * @param int $post_parent ID of the parent for the post we're checking. + * @parem int $post_ID ID of the post we're checking. + * + * @return int The new post_parent for the post. + */ +function wp_check_post_hierarchy_for_loops( $post_parent, $post_ID ) { + // Nothing fancy here - bail + if ( !$post_parent ) + return 0; + + // New post can't cause a loop + if ( empty( $post_ID ) ) + return $post_parent; + + // Can't be its own parent + if ( $post_parent == $post_ID ) + return 0; + + // Now look for larger loops + + if ( !$loop = wp_find_hierarchy_loop( 'wp_get_post_parent_id', $post_ID, $post_parent ) ) + return $post_parent; // No loop + + // Setting $post_parent to the given value causes a loop + if ( isset( $loop[$post_ID] ) ) + return 0; + + // There's a loop, but it doesn't contain $post_ID. Break the loop. + foreach ( array_keys( $loop ) as $loop_member ) + wp_update_post( array( 'ID' => $loop_member, 'post_parent' => 0 ) ); + + return $post_parent; +} + +/** + * Returns an array of post format slugs to their translated and pretty display versions + * + * @since 3.1.0 + * + * @return array The array of translations + */ +function get_post_format_strings() { + $strings = array( + 'standard' => _x( 'Standard', 'Post format' ), // Special case. any value that evals to false will be considered standard + 'aside' => _x( 'Aside', 'Post format' ), + 'chat' => _x( 'Chat', 'Post format' ), + 'gallery' => _x( 'Gallery', 'Post format' ), + 'link' => _x( 'Link', 'Post format' ), + 'image' => _x( 'Image', 'Post format' ), + 'quote' => _x( 'Quote', 'Post format' ), + 'status' => _x( 'Status', 'Post format' ), + 'video' => _x( 'Video', 'Post format' ), + 'audio' => _x( 'Audio', 'Post format' ), + ); + return $strings; +} + +/** + * Retrieves an array of post format slugs. + * + * @since 3.1.0 + * + * @return array The array of post format slugs. + */ +function get_post_format_slugs() { + $slugs = array_keys( get_post_format_strings() ); + return array_combine( $slugs, $slugs ); +} + +/** + * Returns a pretty, translated version of a post format slug + * + * @since 3.1.0 + * + * @param string $slug A post format slug + * @return string The translated post format name + */ +function get_post_format_string( $slug ) { + $strings = get_post_format_strings(); + if ( !$slug ) + return $strings['standard']; + else + return ( isset( $strings[$slug] ) ) ? $strings[$slug] : ''; +} + +/** + * Sets a post thumbnail. + * + * @since 3.1.0 + * + * @param int|object $post Post ID or object where thumbnail should be attached. + * @param int $thumbnail_id Thumbnail to attach. + * @return bool True on success, false on failure. + */ +function set_post_thumbnail( $post, $thumbnail_id ) { + $post = get_post( $post ); + $thumbnail_id = absint( $thumbnail_id ); + if ( $post && $thumbnail_id && get_post( $thumbnail_id ) ) { + $thumbnail_html = wp_get_attachment_image( $thumbnail_id, 'thumbnail' ); + if ( ! empty( $thumbnail_html ) ) { + update_post_meta( $post->ID, '_thumbnail_id', $thumbnail_id ); + return true; + } + } + return false; +} + +/** + * Returns a link to a post format index. + * + * @since 3.1.0 + * + * @param $format string Post format + * @return string Link + */ +function get_post_format_link( $format ) { + $term = get_term_by('slug', 'post-format-' . $format, 'post_format' ); + if ( ! $term || is_wp_error( $term ) ) + return false; + return get_term_link( $term ); +} + +/** + * Filters the request to allow for the format prefix. + * + * @access private + * @since 3.1.0 + */ +function _post_format_request( $qvs ) { + if ( ! isset( $qvs['post_format'] ) ) + return $qvs; + $slugs = get_post_format_slugs(); + if ( isset( $slugs[ $qvs['post_format'] ] ) ) + $qvs['post_format'] = 'post-format-' . $slugs[ $qvs['post_format'] ]; + $tax = get_taxonomy( 'post_format' ); + $qvs['post_type'] = $tax->object_type; + return $qvs; +} +add_filter( 'request', '_post_format_request' ); + +/** + * Filters the post format term link to remove the format prefix. + * + * @access private + * @since 3.1.0 + */ +function _post_format_link( $link, $term, $taxonomy ) { + global $wp_rewrite; + if ( 'post_format' != $taxonomy ) + return $link; + if ( $wp_rewrite->get_extra_permastruct( $taxonomy ) ) { + return str_replace( "/{$term->slug}", '/' . str_replace( 'post-format-', '', $term->slug ), $link ); + } else { + $link = remove_query_arg( 'post_format', $link ); + return add_query_arg( 'post_format', str_replace( 'post-format-', '', $term->slug ), $link ); + } +} +add_filter( 'term_link', '_post_format_link', 10, 3 ); + +/** + * Remove the post format prefix from the name property of the term object created by get_term(). + * + * @access private + * @since 3.1.0 + */ +function _post_format_get_term( $term ) { + if ( isset( $term->slug ) ) { + $term->name = get_post_format_string( str_replace( 'post-format-', '', $term->slug ) ); + } + return $term; +} +add_filter( 'get_post_format', '_post_format_get_term' ); + +/** + * Remove the post format prefix from the name property of the term objects created by get_terms(). + * + * @access private + * @since 3.1.0 + */ +function _post_format_get_terms( $terms, $taxonomies, $args ) { + if ( in_array( 'post_format', (array) $taxonomies ) ) { + if ( isset( $args['fields'] ) && 'names' == $args['fields'] ) { + foreach( $terms as $order => $name ) { + $terms[$order] = get_post_format_string( str_replace( 'post-format-', '', $name ) ); + } + } else { + foreach ( (array) $terms as $order => $term ) { + if ( isset( $term->taxonomy ) && 'post_format' == $term->taxonomy ) { + $terms[$order]->name = get_post_format_string( str_replace( 'post-format-', '', $term->slug ) ); + } + } + } + } + return $terms; +} +add_filter( 'get_terms', '_post_format_get_terms', 10, 3 ); + +/** + * Remove the post format prefix from the name property of the term objects created by wp_get_object_terms(). + * + * @access private + * @since 3.1.0 + */ +function _post_format_wp_get_object_terms( $terms ) { + foreach ( (array) $terms as $order => $term ) { + if ( isset( $term->taxonomy ) && 'post_format' == $term->taxonomy ) { + $terms[$order]->name = get_post_format_string( str_replace( 'post-format-', '', $term->slug ) ); + } + } + return $terms; +} +add_filter( 'wp_get_object_terms', '_post_format_wp_get_object_terms' ); + +?> diff --git a/src/wp-includes/query.php b/src/wp-includes/query.php new file mode 100644 index 0000000..d70348c --- /dev/null +++ b/src/wp-includes/query.php @@ -0,0 +1,3575 @@ +get($var); +} + + +/** + * Retrieve the currently-queried object. Wrapper for $wp_query->get_queried_object() + * + * @uses WP_Query::get_queried_object + * + * @since 3.1.0 + * @access public + * + * @return object + */ +function get_queried_object() { + global $wp_query; + return $wp_query->get_queried_object(); +} + +/** + * Retrieve ID of the current queried object. Wrapper for $wp_query->get_queried_object_id() + * + * @uses WP_Query::get_queried_object_id() + * + * @since 3.1.0 + * @access public + * + * @return int + */ +function get_queried_object_id() { + global $wp_query; + return $wp_query->get_queried_object_id(); +} + +/** + * Set query variable. + * + * @see WP_Query::set() + * @since 2.2.0 + * @uses $wp_query + * + * @param string $var Query variable key. + * @param mixed $value + * @return null + */ +function set_query_var($var, $value) { + global $wp_query; + + return $wp_query->set($var, $value); +} + +/** + * Set up The Loop with query parameters. + * + * This will override the current WordPress Loop and shouldn't be used more than + * once. This must not be used within the WordPress Loop. + * + * @since 1.5.0 + * @uses $wp_query + * + * @param string $query + * @return array List of posts + */ +function &query_posts($query) { + unset($GLOBALS['wp_query']); + $GLOBALS['wp_query'] =& new WP_Query(); + return $GLOBALS['wp_query']->query($query); +} + +/** + * Destroy the previous query and set up a new query. + * + * This should be used after {@link query_posts()} and before another {@link + * query_posts()}. This will remove obscure bugs that occur when the previous + * wp_query object is not destroyed properly before another is set up. + * + * @since 2.3.0 + * @uses $wp_query + */ +function wp_reset_query() { + unset($GLOBALS['wp_query']); + $GLOBALS['wp_query'] =& $GLOBALS['wp_the_query']; + wp_reset_postdata(); +} + +/** + * After looping through a separate query, this function restores + * the $post global to the current post in the main query + * + * @since 3.0.0 + * @uses $wp_query + */ +function wp_reset_postdata() { + global $wp_query; + if ( !empty($wp_query->post) ) { + $GLOBALS['post'] = $wp_query->post; + setup_postdata($wp_query->post); + } +} + +/* + * Query type checks. + */ + +/** + * Is the query for an archive page? + * + * Month, Year, Category, Author, Post Type archive... + * + * @see WP_Query::is_archive() + * @since 1.5.0 + * @uses $wp_query + * + * @return bool + */ +function is_archive() { + global $wp_query; + + if ( ! isset( $wp_query ) ) { + _doing_it_wrong( __FUNCTION__, __( 'Conditional query tags do not work before the query is run. Before then, they always return false.' ), '3.1' ); + return false; + } + + return $wp_query->is_archive(); +} + +/** + * Is the query for a post type archive page? + * + * @see WP_Query::is_post_type_archive() + * @since 3.1.0 + * @uses $wp_query + * + * @param mixed $post_types Optional. Post type or array of posts types to check against. + * @return bool + */ +function is_post_type_archive( $post_types = '' ) { + global $wp_query; + + if ( ! isset( $wp_query ) ) { + _doing_it_wrong( __FUNCTION__, __( 'Conditional query tags do not work before the query is run. Before then, they always return false.' ), '3.1' ); + return false; + } + + return $wp_query->is_post_type_archive( $post_types ); +} + +/** + * Is the query for an attachment page? + * + * @see WP_Query::is_attachment() + * @since 2.0.0 + * @uses $wp_query + * + * @return bool + */ +function is_attachment() { + global $wp_query; + + if ( ! isset( $wp_query ) ) { + _doing_it_wrong( __FUNCTION__, __( 'Conditional query tags do not work before the query is run. Before then, they always return false.' ), '3.1' ); + return false; + } + + return $wp_query->is_attachment(); +} + +/** + * Is the query for an author archive page? + * + * If the $author parameter is specified, this function will additionally + * check if the query is for one of the authors specified. + * + * @see WP_Query::is_author() + * @since 1.5.0 + * @uses $wp_query + * + * @param mixed $author Optional. User ID, nickname, nicename, or array of User IDs, nicknames, and nicenames + * @return bool + */ +function is_author( $author = '' ) { + global $wp_query; + + if ( ! isset( $wp_query ) ) { + _doing_it_wrong( __FUNCTION__, __( 'Conditional query tags do not work before the query is run. Before then, they always return false.' ), '3.1' ); + return false; + } + + return $wp_query->is_author( $author ); +} + +/** + * Is the query for a category archive page? + * + * If the $category parameter is specified, this function will additionally + * check if the query is for one of the categories specified. + * + * @see WP_Query::is_category() + * @since 1.5.0 + * @uses $wp_query + * + * @param mixed $category Optional. Category ID, name, slug, or array of Category IDs, names, and slugs. + * @return bool + */ +function is_category( $category = '' ) { + global $wp_query; + + if ( ! isset( $wp_query ) ) { + _doing_it_wrong( __FUNCTION__, __( 'Conditional query tags do not work before the query is run. Before then, they always return false.' ), '3.1' ); + return false; + } + + return $wp_query->is_category( $category ); +} + +/** + * Is the query for a tag archive page? + * + * If the $tag parameter is specified, this function will additionally + * check if the query is for one of the tags specified. + * + * @see WP_Query::is_tag() + * @since 2.3.0 + * @uses $wp_query + * + * @param mixed $slug Optional. Tag slug or array of slugs. + * @return bool + */ +function is_tag( $slug = '' ) { + global $wp_query; + + if ( ! isset( $wp_query ) ) { + _doing_it_wrong( __FUNCTION__, __( 'Conditional query tags do not work before the query is run. Before then, they always return false.' ), '3.1' ); + return false; + } + + return $wp_query->is_tag( $slug ); +} + +/** + * Is the query for a 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. + * + * @see WP_Query::is_tax() + * @since 2.5.0 + * @uses $wp_query + * + * @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 + */ +function is_tax( $taxonomy = '', $term = '' ) { + global $wp_query; + + if ( ! isset( $wp_query ) ) { + _doing_it_wrong( __FUNCTION__, __( 'Conditional query tags do not work before the query is run. Before then, they always return false.' ), '3.1' ); + return false; + } + + return $wp_query->is_tax( $taxonomy, $term ); +} + +/** + * Whether the current URL is within the comments popup window. + * + * @see WP_Query::is_comments_popup() + * @since 1.5.0 + * @uses $wp_query + * + * @return bool + */ +function is_comments_popup() { + global $wp_query; + + if ( ! isset( $wp_query ) ) { + _doing_it_wrong( __FUNCTION__, __( 'Conditional query tags do not work before the query is run. Before then, they always return false.' ), '3.1' ); + return false; + } + + return $wp_query->is_comments_popup(); +} + +/** + * Is the query for a date archive? + * + * @see WP_Query::is_date() + * @since 1.5.0 + * @uses $wp_query + * + * @return bool + */ +function is_date() { + global $wp_query; + + if ( ! isset( $wp_query ) ) { + _doing_it_wrong( __FUNCTION__, __( 'Conditional query tags do not work before the query is run. Before then, they always return false.' ), '3.1' ); + return false; + } + + return $wp_query->is_date(); +} + +/** + * Is the query for a day archive? + * + * @see WP_Query::is_day() + * @since 1.5.0 + * @uses $wp_query + * + * @return bool + */ +function is_day() { + global $wp_query; + + if ( ! isset( $wp_query ) ) { + _doing_it_wrong( __FUNCTION__, __( 'Conditional query tags do not work before the query is run. Before then, they always return false.' ), '3.1' ); + return false; + } + + return $wp_query->is_day(); +} + +/** + * Is the query for a feed? + * + * @see WP_Query::is_feed() + * @since 1.5.0 + * @uses $wp_query + * + * @param string|array $feeds Optional feed types to check. + * @return bool + */ +function is_feed( $feeds = '' ) { + global $wp_query; + + if ( ! isset( $wp_query ) ) { + _doing_it_wrong( __FUNCTION__, __( 'Conditional query tags do not work before the query is run. Before then, they always return false.' ), '3.1' ); + return false; + } + + return $wp_query->is_feed( $feeds ); +} + +/** + * Is the query for a comments feed? + * + * @see WP_Query::is_comments_feed() + * @since 3.0.0 + * @uses $wp_query + * + * @return bool + */ +function is_comment_feed() { + global $wp_query; + + if ( ! isset( $wp_query ) ) { + _doing_it_wrong( __FUNCTION__, __( 'Conditional query tags do not work before the query is run. Before then, they always return false.' ), '3.1' ); + return false; + } + + return $wp_query->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 is_home() + * + * @see WP_Query::is_front_page() + * @since 2.5.0 + * @uses is_home() + * @uses get_option() + * + * @return bool True, if front of site. + */ +function is_front_page() { + global $wp_query; + + if ( ! isset( $wp_query ) ) { + _doing_it_wrong( __FUNCTION__, __( 'Conditional query tags do not work before the query is run. Before then, they always return false.' ), '3.1' ); + return false; + } + + return $wp_query->is_front_page(); +} + +/** + * 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 is_front_page() + * + * @see WP_Query::is_home() + * @since 1.5.0 + * @uses $wp_query + * + * @return bool True if blog view homepage. + */ +function is_home() { + global $wp_query; + + if ( ! isset( $wp_query ) ) { + _doing_it_wrong( __FUNCTION__, __( 'Conditional query tags do not work before the query is run. Before then, they always return false.' ), '3.1' ); + return false; + } + + return $wp_query->is_home(); +} + +/** + * Is the query for a month archive? + * + * @see WP_Query::is_month() + * @since 1.5.0 + * @uses $wp_query + * + * @return bool + */ +function is_month() { + global $wp_query; + + if ( ! isset( $wp_query ) ) { + _doing_it_wrong( __FUNCTION__, __( 'Conditional query tags do not work before the query is run. Before then, they always return false.' ), '3.1' ); + return false; + } + + return $wp_query->is_month(); +} + +/** + * Is the query for a single page? + * + * If the $page parameter is specified, this function will additionally + * check if the query is for one of the pages specified. + * + * @see is_single() + * @see is_singular() + * + * @see WP_Query::is_page() + * @since 1.5.0 + * @uses $wp_query + * + * @param mixed $page Page ID, title, slug, or array of such. + * @return bool + */ +function is_page( $page = '' ) { + global $wp_query; + + if ( ! isset( $wp_query ) ) { + _doing_it_wrong( __FUNCTION__, __( 'Conditional query tags do not work before the query is run. Before then, they always return false.' ), '3.1' ); + return false; + } + + return $wp_query->is_page( $page ); +} + +/** + * Is the query for paged result and not for the first page? + * + * @see WP_Query::is_paged() + * @since 1.5.0 + * @uses $wp_query + * + * @return bool + */ +function is_paged() { + global $wp_query; + + if ( ! isset( $wp_query ) ) { + _doing_it_wrong( __FUNCTION__, __( 'Conditional query tags do not work before the query is run. Before then, they always return false.' ), '3.1' ); + return false; + } + + return $wp_query->is_paged(); +} + +/** + * Is the query for a post or page preview? + * + * @see WP_Query::is_preview() + * @since 2.0.0 + * @uses $wp_query + * + * @return bool + */ +function is_preview() { + global $wp_query; + + if ( ! isset( $wp_query ) ) { + _doing_it_wrong( __FUNCTION__, __( 'Conditional query tags do not work before the query is run. Before then, they always return false.' ), '3.1' ); + return false; + } + + return $wp_query->is_preview(); +} + +/** + * Is the query for the robots file? + * + * @see WP_Query::is_robots() + * @since 2.1.0 + * @uses $wp_query + * + * @return bool + */ +function is_robots() { + global $wp_query; + + if ( ! isset( $wp_query ) ) { + _doing_it_wrong( __FUNCTION__, __( 'Conditional query tags do not work before the query is run. Before then, they always return false.' ), '3.1' ); + return false; + } + + return $wp_query->is_robots(); +} + +/** + * Is the query for a search? + * + * @see WP_Query::is_search() + * @since 1.5.0 + * @uses $wp_query + * + * @return bool + */ +function is_search() { + global $wp_query; + + if ( ! isset( $wp_query ) ) { + _doing_it_wrong( __FUNCTION__, __( 'Conditional query tags do not work before the query is run. Before then, they always return false.' ), '3.1' ); + return false; + } + + return $wp_query->is_search(); +} + +/** + * Is the query for a single post? + * + * Works for any post type, except attachments and pages + * + * If the $post parameter is specified, this function will additionally + * check if the query is for one of the Posts specified. + * + * @see is_page() + * @see is_singular() + * + * @see WP_Query::is_single() + * @since 1.5.0 + * @uses $wp_query + * + * @param mixed $post Post ID, title, slug, or array of such. + * @return bool + */ +function is_single( $post = '' ) { + global $wp_query; + + if ( ! isset( $wp_query ) ) { + _doing_it_wrong( __FUNCTION__, __( 'Conditional query tags do not work before the query is run. Before then, they always return false.' ), '3.1' ); + return false; + } + + return $wp_query->is_single( $post ); +} + +/** + * Is the query for a 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 is_page() + * @see is_single() + * + * @see WP_Query::is_singular() + * @since 1.5.0 + * @uses $wp_query + * + * @param mixed $post_types Optional. Post Type or array of Post Types + * @return bool + */ +function is_singular( $post_types = '' ) { + global $wp_query; + + if ( ! isset( $wp_query ) ) { + _doing_it_wrong( __FUNCTION__, __( 'Conditional query tags do not work before the query is run. Before then, they always return false.' ), '3.1' ); + return false; + } + + return $wp_query->is_singular( $post_types ); +} + +/** + * Is the query for a specific time? + * + * @see WP_Query::is_time() + * @since 1.5.0 + * @uses $wp_query + * + * @return bool + */ +function is_time() { + global $wp_query; + + if ( ! isset( $wp_query ) ) { + _doing_it_wrong( __FUNCTION__, __( 'Conditional query tags do not work before the query is run. Before then, they always return false.' ), '3.1' ); + return false; + } + + return $wp_query->is_time(); +} + +/** + * Is the query for a trackback endpoint call? + * + * @see WP_Query::is_trackback() + * @since 1.5.0 + * @uses $wp_query + * + * @return bool + */ +function is_trackback() { + global $wp_query; + + if ( ! isset( $wp_query ) ) { + _doing_it_wrong( __FUNCTION__, __( 'Conditional query tags do not work before the query is run. Before then, they always return false.' ), '3.1' ); + return false; + } + + return $wp_query->is_trackback(); +} + +/** + * Is the query for a specific year? + * + * @see WP_Query::is_year() + * @since 1.5.0 + * @uses $wp_query + * + * @return bool + */ +function is_year() { + global $wp_query; + + if ( ! isset( $wp_query ) ) { + _doing_it_wrong( __FUNCTION__, __( 'Conditional query tags do not work before the query is run. Before then, they always return false.' ), '3.1' ); + return false; + } + + return $wp_query->is_year(); +} + +/** + * Is the query a 404 (returns no results)? + * + * @see WP_Query::is_404() + * @since 1.5.0 + * @uses $wp_query + * + * @return bool + */ +function is_404() { + global $wp_query; + + if ( ! isset( $wp_query ) ) { + _doing_it_wrong( __FUNCTION__, __( 'Conditional query tags do not work before the query is run. Before then, they always return false.' ), '3.1' ); + return false; + } + + return $wp_query->is_404(); +} + +/* + * The Loop. Post loop control. + */ + +/** + * Whether current WordPress query has results to loop over. + * + * @see WP_Query::have_posts() + * @since 1.5.0 + * @uses $wp_query + * + * @return bool + */ +function have_posts() { + global $wp_query; + + return $wp_query->have_posts(); +} + +/** + * Whether the caller is in the Loop. + * + * @since 2.0.0 + * @uses $wp_query + * + * @return bool True if caller is within loop, false if loop hasn't started or ended. + */ +function in_the_loop() { + global $wp_query; + + return $wp_query->in_the_loop; +} + +/** + * Rewind the loop posts. + * + * @see WP_Query::rewind_posts() + * @since 1.5.0 + * @uses $wp_query + * + * @return null + */ +function rewind_posts() { + global $wp_query; + + return $wp_query->rewind_posts(); +} + +/** + * Iterate the post index in the loop. + * + * @see WP_Query::the_post() + * @since 1.5.0 + * @uses $wp_query + */ +function the_post() { + global $wp_query; + + $wp_query->the_post(); +} + +/* + * Comments loop. + */ + +/** + * Whether there are comments to loop over. + * + * @see WP_Query::have_comments() + * @since 2.2.0 + * @uses $wp_query + * + * @return bool + */ +function have_comments() { + global $wp_query; + return $wp_query->have_comments(); +} + +/** + * Iterate comment index in the comment loop. + * + * @see WP_Query::the_comment() + * @since 2.2.0 + * @uses $wp_query + * + * @return object + */ +function the_comment() { + global $wp_query; + return $wp_query->the_comment(); +} + +/* + * WP_Query + */ + +/** + * The WordPress Query class. + * + * @link http://codex.wordpress.org/Function_Reference/WP_Query Codex page. + * + * @since 1.5.0 + */ +class WP_Query { + + /** + * Query vars set by the user + * + * @since 1.5.0 + * @access public + * @var array + */ + var $query; + + /** + * Query vars, after parsing + * + * @since 1.5.0 + * @access public + * @var array + */ + var $query_vars = array(); + + /** + * Taxonomy query, as passed to get_tax_sql() + * + * @since 3.1.0 + * @access public + * @var object WP_Tax_Query + */ + var $tax_query; + + /** + * Metadata query container + * + * @since 3.2.0 + * @access public + * @var object WP_Meta_Query + */ + var $meta_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 + */ + var $queried_object; + + /** + * The ID of the queried object. + * + * @since 1.5.0 + * @access public + * @var int + */ + var $queried_object_id; + + /** + * Get post database query. + * + * @since 2.0.1 + * @access public + * @var string + */ + var $request; + + /** + * List of posts. + * + * @since 1.5.0 + * @access public + * @var array + */ + var $posts; + + /** + * The amount of posts for the current query. + * + * @since 1.5.0 + * @access public + * @var int + */ + var $post_count = 0; + + /** + * Index of the current item in the loop. + * + * @since 1.5.0 + * @access public + * @var int + */ + var $current_post = -1; + + /** + * Whether the loop has started and the caller is in the loop. + * + * @since 2.0.0 + * @access public + * @var bool + */ + var $in_the_loop = false; + + /** + * The current post ID. + * + * @since 1.5.0 + * @access public + * @var object + */ + var $post; + + /** + * The list of comments for current post. + * + * @since 2.2.0 + * @access public + * @var array + */ + var $comments; + + /** + * The amount of comments for the posts. + * + * @since 2.2.0 + * @access public + * @var int + */ + var $comment_count = 0; + + /** + * The index of the comment in the comment loop. + * + * @since 2.2.0 + * @access public + * @var int + */ + var $current_comment = -1; + + /** + * Current comment ID. + * + * @since 2.2.0 + * @access public + * @var int + */ + var $comment; + + /** + * Amount of posts if limit clause was not used. + * + * @since 2.1.0 + * @access public + * @var int + */ + var $found_posts = 0; + + /** + * The amount of pages. + * + * @since 2.1.0 + * @access public + * @var int + */ + var $max_num_pages = 0; + + /** + * The amount of comment pages. + * + * @since 2.7.0 + * @access public + * @var int + */ + var $max_num_comment_pages = 0; + + /** + * Set if query is single post. + * + * @since 1.5.0 + * @access public + * @var bool + */ + var $is_single = false; + + /** + * Set if query is preview of blog. + * + * @since 2.0.0 + * @access public + * @var bool + */ + var $is_preview = false; + + /** + * Set if query returns a page. + * + * @since 1.5.0 + * @access public + * @var bool + */ + var $is_page = false; + + /** + * Set if query is an archive list. + * + * @since 1.5.0 + * @access public + * @var bool + */ + var $is_archive = false; + + /** + * Set if query is part of a date. + * + * @since 1.5.0 + * @access public + * @var bool + */ + var $is_date = false; + + /** + * Set if query contains a year. + * + * @since 1.5.0 + * @access public + * @var bool + */ + var $is_year = false; + + /** + * Set if query contains a month. + * + * @since 1.5.0 + * @access public + * @var bool + */ + var $is_month = false; + + /** + * Set if query contains a day. + * + * @since 1.5.0 + * @access public + * @var bool + */ + var $is_day = false; + + /** + * Set if query contains time. + * + * @since 1.5.0 + * @access public + * @var bool + */ + var $is_time = false; + + /** + * Set if query contains an author. + * + * @since 1.5.0 + * @access public + * @var bool + */ + var $is_author = false; + + /** + * Set if query contains category. + * + * @since 1.5.0 + * @access public + * @var bool + */ + var $is_category = false; + + /** + * Set if query contains tag. + * + * @since 2.3.0 + * @access public + * @var bool + */ + var $is_tag = false; + + /** + * Set if query contains taxonomy. + * + * @since 2.5.0 + * @access public + * @var bool + */ + var $is_tax = false; + + /** + * Set if query was part of a search result. + * + * @since 1.5.0 + * @access public + * @var bool + */ + var $is_search = false; + + /** + * Set if query is feed display. + * + * @since 1.5.0 + * @access public + * @var bool + */ + var $is_feed = false; + + /** + * Set if query is comment feed display. + * + * @since 2.2.0 + * @access public + * @var bool + */ + var $is_comment_feed = false; + + /** + * Set if query is trackback. + * + * @since 1.5.0 + * @access public + * @var bool + */ + var $is_trackback = false; + + /** + * Set if query is blog homepage. + * + * @since 1.5.0 + * @access public + * @var bool + */ + var $is_home = false; + + /** + * Set if query couldn't found anything. + * + * @since 1.5.0 + * @access public + * @var bool + */ + var $is_404 = false; + + /** + * Set if query is within comments popup window. + * + * @since 1.5.0 + * @access public + * @var bool + */ + var $is_comments_popup = false; + + /** + * Set if query is paged + * + * @since 1.5.0 + * @access public + * @var bool + */ + var $is_paged = false; + + /** + * Set if query is part of administration page. + * + * @since 1.5.0 + * @access public + * @var bool + */ + var $is_admin = false; + + /** + * Set if query is an attachment. + * + * @since 2.0.0 + * @access public + * @var bool + */ + var $is_attachment = false; + + /** + * Set if is single, is a page, or is an attachment. + * + * @since 2.1.0 + * @access public + * @var bool + */ + var $is_singular = false; + + /** + * Set if query is for robots. + * + * @since 2.1.0 + * @access public + * @var bool + */ + var $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 + */ + var $is_posts_page = false; + + /** + * Set if query is for a post type archive. + * + * @since 3.1.0 + * @access public + * @var bool + */ + var $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 $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 + */ + var $query_vars_changed = true; + + /** + * Set if post thumbnails are cached + * + * @since 3.2.0 + * @access public + * @var bool + */ + var $thumbnails_cached = false; + + /** + * Resets query flags to false. + * + * The query flags are what page info WordPress was able to figure out. + * + * @since 2.0.0 + * @access 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_comments_popup = 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 + */ + 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 + */ + function parse_query_vars() { + $this->parse_query(); + } + + /** + * Fills in the query variables, which do not exist within the parameter. + * + * @since 2.1.0 + * @access public + * + * @param array $array Defined query variables. + * @return array Complete query variables with undefined ones filled in empty. + */ + 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_name' + , 'feed' + , 'tb' + , 'paged' + , 'comments_popup' + , 'meta_key' + , 'meta_value' + , 'preview' + , 's' + , 'sentence' + , 'fields' + ); + + 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', + 'tag__in', 'tag__not_in', 'tag__and', 'tag_slug__in', 'tag_slug__and'); + + 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 + * @access public + * + * @param string|array $query Optional query. + */ + 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; + + $qv['p'] = absint($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'] = absint($qv['m']); + $qv['paged'] = absint($qv['paged']); + $qv['cat'] = preg_replace( '|[^0-9,-]|', '', $qv['cat'] ); // comma separated list of positive or negative integers + $qv['pagename'] = trim( $qv['pagename'] ); + $qv['name'] = trim( $qv['name'] ); + if ( '' !== $qv['hour'] ) $qv['hour'] = absint($qv['hour']); + if ( '' !== $qv['minute'] ) $qv['minute'] = absint($qv['minute']); + if ( '' !== $qv['second'] ) $qv['second'] = absint($qv['second']); + + // 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 ( !empty($qv['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 ) { + $this->is_day = true; + $this->is_date = true; + } + } + + if ( $qv['monthnum'] ) { + if ( ! $this->is_date ) { + $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; + } else if ( strlen($qv['m']) > 7 ) { + $this->is_day = true; + } else if ( 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 ( '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['tb'] ) + $this->is_trackback = true; + + if ( '' != $qv['paged'] && ( intval($qv['paged']) > 1 ) ) + $this->is_paged = true; + + if ( '' != $qv['comments_popup'] ) + $this->is_comments_popup = 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 || $this->is_trackback || $this->is_404 || $this->is_admin || $this->is_comments_popup || $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']); + 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 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 ( !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->query_vars_hash = md5( serialize( $this->query_vars ) ); + $this->query_vars_changed = false; + + do_action_ref_array('parse_query', array(&$this)); + } + + /* + * Parses various taxonomy related query vars. + * + * @access protected + * @since 3.1.0 + * + * @param array &$q The query variables + */ + 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 ( $GLOBALS['wp_taxonomies'] 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 ( 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 ) + ) ); + } + } + } + + // Category stuff + if ( !empty($q['cat']) && '0' != $q['cat'] && !$this->is_singular && $this->query_vars_changed ) { + $q['cat'] = ''.urldecode($q['cat']).''; + $q['cat'] = addslashes_gpc($q['cat']); + $cat_array = preg_split('/[,\s]+/', $q['cat']); + $q['cat'] = ''; + $req_cats = array(); + foreach ( (array) $cat_array as $cat ) { + $cat = intval($cat); + $req_cats[] = $cat; + $in = ($cat > 0); + $cat = abs($cat); + if ( $in ) { + $q['category__in'][] = $cat; + $q['category__in'] = array_merge( $q['category__in'], get_term_children($cat, 'category') ); + } else { + $q['category__not_in'][] = $cat; + $q['category__not_in'] = array_merge( $q['category__not_in'], get_term_children($cat, 'category') ); + } + } + $q['cat'] = implode(',', $req_cats); + } + + 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 + ); + } + + // Tag stuff + if ( '' != $q['tag'] && !$this->is_singular && $this->query_vars_changed ) { + if ( strpos($q['tag'], ',') !== false ) { + $tags = preg_split('/[,\s]+/', $q['tag']); + foreach ( (array) $tags as $tag ) { + $tag = sanitize_term_field('slug', $tag, 0, 'post_tag', 'db'); + $q['tag_slug__in'][] = $tag; + } + } else if ( preg_match('/[+\s]+/', $q['tag']) || !empty($q['cat']) ) { + $tags = preg_split('/[+\s]+/', $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', 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', 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 ); + } + + /** + * Sets the 404 property and saves whether query is feed. + * + * @since 2.0.0 + * @access 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 + * @access public + * + * @param string $query_var Query variable key. + * @return mixed + */ + function get($query_var) { + if ( isset($this->query_vars[$query_var]) ) + return $this->query_vars[$query_var]; + + return ''; + } + + /** + * Set query variable. + * + * @since 1.5.0 + * @access public + * + * @param string $query_var Query variable key. + * @param mixed $value Query variable value. + */ + 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 + * @uses do_action_ref_array() Calls 'pre_get_posts' hook before retrieving posts. + * + * @return array List of posts. + */ + function &get_posts() { + global $wpdb, $user_ID, $_wp_using_ext_object_cache; + + $this->parse_query(); + + 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 = ''; + $fields = ''; + $post_status_join = false; + $page = 1; + + if ( isset( $q['caller_get_posts'] ) ) { + _deprecated_argument( 'WP_Query', '3.1', __( '"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['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 ( !isset($q['posts_per_page']) || $q['posts_per_page'] == 0 ) + $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 ) { + $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']); + else if ( $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 a month is specified in the querystring, load that month + if ( $q['m'] ) { + $q['m'] = '' . preg_replace('|[^0-9]|', '', $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); + } + + if ( '' !== $q['hour'] ) + $where .= " AND HOUR($wpdb->posts.post_date)='" . $q['hour'] . "'"; + + if ( '' !== $q['minute'] ) + $where .= " AND MINUTE($wpdb->posts.post_date)='" . $q['minute'] . "'"; + + if ( '' !== $q['second'] ) + $where .= " AND SECOND($wpdb->posts.post_date)='" . $q['second'] . "'"; + + if ( $q['year'] ) + $where .= " AND YEAR($wpdb->posts.post_date)='" . $q['year'] . "'"; + + if ( $q['monthnum'] ) + $where .= " AND MONTH($wpdb->posts.post_date)='" . $q['monthnum'] . "'"; + + if ( $q['day'] ) + $where .= " AND DAYOFMONTH($wpdb->posts.post_date)='" . $q['day'] . "'"; + + // If we've got a post_type AND its 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 || strpos($q[ $ptype_obj->query_var ], '/') === false ) { + // Non-hierarchical post_types & parent-level-hierarchical post_types can directly use 'name' + $q['name'] = $q[ $ptype_obj->query_var ]; + } else { + // Hierarchical post_types will operate through the + $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['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_page($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'] . "'"; + } + + if ( $q['w'] ) + $where .= ' AND ' . _wp_mysql_week( "`$wpdb->posts`.`post_date`" ) . " = '" . $q['w'] . "'"; + + if ( intval($q['comments_popup']) ) + $q['p'] = absint($q['comments_popup']); + + // If an attachment is requested by number, let it supercede 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'] ); + + 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 ( !empty($q['s']) ) { + // added slashes screw with quote grouping when done early, so done later + $q['s'] = stripslashes($q['s']); + if ( !empty($q['sentence']) ) { + $q['search_terms'] = array($q['s']); + } else { + preg_match_all('/".*?("|$)|((?<=[\\s",+])|^)[^\\s",+]+/', $q['s'], $matches); + $q['search_terms'] = array_map('_search_terms_tidy', $matches[0]); + } + $n = !empty($q['exact']) ? '' : '%'; + $searchand = ''; + foreach( (array) $q['search_terms'] as $term ) { + $term = esc_sql( like_escape( $term ) ); + $search .= "{$searchand}(($wpdb->posts.post_title LIKE '{$n}{$term}{$n}') OR ($wpdb->posts.post_content LIKE '{$n}{$term}{$n}'))"; + $searchand = ' AND '; + } + + if ( !empty($search) ) { + $search = " AND ({$search}) "; + if ( !is_user_logged_in() ) + $search .= " AND ($wpdb->posts.post_password = '') "; + } + } + + // Allow plugins to contextually add/remove/modify the search section of the database query + $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) ) { + $post_type = 'any'; + $post_status_join = true; + } elseif ( in_array('attachment', (array) $post_type) ) { + $post_status_join = true; + } + } + + // Back-compat + if ( !empty($this->tax_query->queries) ) { + $tax_query_in_and = wp_list_filter( $this->tax_query->queries, array( 'operator' => 'NOT IN' ), 'NOT' ); + if ( !empty( $tax_query_in_and ) ) { + if ( !isset( $q['taxonomy'] ) ) { + foreach ( $tax_query_in_and as $a_tax_query ) { + if ( !in_array( $a_tax_query['taxonomy'], array( 'category', 'post_tag' ) ) ) { + $q['taxonomy'] = $a_tax_query['taxonomy']; + if ( 'slug' == $a_tax_query['field'] ) + $q['term'] = $a_tax_query['terms'][0]; + else + $q['term_id'] = $a_tax_query['terms'][0]; + + break; + } + } + } + + $cat_query = wp_list_filter( $tax_query_in_and, array( 'taxonomy' => 'category' ) ); + if ( !empty( $cat_query ) ) { + $cat_query = reset( $cat_query ); + $the_cat = get_term_by( $cat_query['field'], $cat_query['terms'][0], 'category' ); + if ( $the_cat ) { + $this->set( 'cat', $the_cat->term_id ); + $this->set( 'category_name', $the_cat->slug ); + } + unset( $the_cat ); + } + unset( $cat_query ); + + $tag_query = wp_list_filter( $tax_query_in_and, array( 'taxonomy' => 'post_tag' ) ); + if ( !empty( $tag_query ) ) { + $tag_query = reset( $tag_query ); + $the_tag = get_term_by( $tag_query['field'], $tag_query['terms'][0], 'post_tag' ); + if ( $the_tag ) { + $this->set( 'tag_id', $the_tag->term_id ); + } + unset( $the_tag ); + } + unset( $tag_query ); + } + } + + 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') ) { + $whichauthor = ''; + } else { + $q['author'] = (string)urldecode($q['author']); + $q['author'] = addslashes_gpc($q['author']); + if ( strpos($q['author'], '-') !== false ) { + $eq = '!='; + $andor = 'AND'; + $q['author'] = explode('-', $q['author']); + $q['author'] = (string)absint($q['author'][1]); + } else { + $eq = '='; + $andor = 'OR'; + } + $author_array = preg_split('/[,\s]+/', $q['author']); + $_author_array = array(); + foreach ( $author_array as $key => $_author ) + $_author_array[] = "$wpdb->posts.post_author " . $eq . ' ' . absint($_author); + $whichauthor .= ' AND (' . implode(" $andor ", $_author_array) . ')'; + unset($author_array, $_author_array); + } + + // 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 trailling 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'] ) { + $table_alias = $post_status_join ? $wpdb->posts : ''; + $whichmimetype = wp_post_mime_type_where($q['post_mime_type'], $table_alias); + } + + $where .= $search . $whichauthor . $whichmimetype; + + if ( empty($q['order']) || ((strtoupper($q['order']) != 'ASC') && (strtoupper($q['order']) != 'DESC')) ) + $q['order'] = 'DESC'; + + // Order by + if ( empty($q['orderby']) ) { + $orderby = "$wpdb->posts.post_date " . $q['order']; + } elseif ( 'none' == $q['orderby'] ) { + $orderby = ''; + } else { + // Used to filter values + $allowed_keys = array('author', 'date', 'title', 'modified', 'menu_order', 'parent', 'ID', 'rand', 'comment_count'); + if ( !empty($q['meta_key']) ) { + $allowed_keys[] = $q['meta_key']; + $allowed_keys[] = 'meta_value'; + $allowed_keys[] = 'meta_value_num'; + } + $q['orderby'] = urldecode($q['orderby']); + $q['orderby'] = addslashes_gpc($q['orderby']); + + $orderby_array = array(); + foreach ( explode( ' ', $q['orderby'] ) as $i => $orderby ) { + // Only allow certain values for safety + if ( ! in_array($orderby, $allowed_keys) ) + continue; + + switch ( $orderby ) { + case 'menu_order': + break; + case 'ID': + $orderby = "$wpdb->posts.ID"; + break; + case 'rand': + $orderby = 'RAND()'; + break; + case $q['meta_key']: + case 'meta_value': + $orderby = "$wpdb->postmeta.meta_value"; + break; + case 'meta_value_num': + $orderby = "$wpdb->postmeta.meta_value+0"; + break; + case 'comment_count': + $orderby = "$wpdb->posts.comment_count"; + break; + default: + $orderby = "$wpdb->posts.post_" . $orderby; + } + + $orderby_array[] = $orderby; + } + $orderby = implode( ',', $orderby_array ); + + if ( empty( $orderby ) ) + $orderby = "$wpdb->posts.post_date ".$q['order']; + else + $orderby .= " {$q['order']}"; + } + + if ( is_array( $post_type ) ) { + $post_type_cap = 'multiple_post_type'; + } else { + $post_type_object = get_post_type_object( $post_type ); + if ( empty( $post_type_object ) ) + $post_type_cap = $post_type; + } + + $exclude_post_types = ''; + $in_search_post_types = get_post_types( array('exclude_from_search' => false) ); + if ( ! empty( $in_search_post_types ) ) + $exclude_post_types .= $wpdb->prepare(" AND $wpdb->posts.post_type IN ('" . join("', '", $in_search_post_types ) . "')"); + + if ( 'any' == $post_type ) { + $where .= $exclude_post_types; + } elseif ( !empty( $post_type ) && is_array( $post_type ) ) { + $where .= " AND $wpdb->posts.post_type IN ('" . join("', '", $post_type) . "')"; + } elseif ( ! empty( $post_type ) ) { + $where .= " AND $wpdb->posts.post_type = '$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' ); + } + + if ( ! empty( $post_type_object ) ) { + $edit_cap = $post_type_object->cap->edit_post; + $read_cap = $post_type_object->cap->read_post; + $edit_others_cap = $post_type_object->cap->edit_others_posts; + $read_private_cap = $post_type_object->cap->read_private_posts; + } else { + $edit_cap = 'edit_' . $post_type_cap; + $read_cap = 'read_' . $post_type_cap; + $edit_others_cap = 'edit_others_' . $post_type_cap . 's'; + $read_private_cap = 'read_private_' . $post_type_cap . 's'; + } + + 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 ) + $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) . "))"; + } + foreach ( $statuswheres as $statuswhere ) + $where .= " AND $statuswhere"; + } 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 ( 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 .= ')'; + } + + if ( !empty( $this->meta_query->queries ) ) { + $clauses = $this->meta_query->get_sql( 'post', $wpdb->posts, 'ID', $this ); + $join .= $clauses['join']; + $where .= $clauses['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'] ) { + $where = apply_filters_ref_array('posts_where', array( $where, &$this ) ); + $join = apply_filters_ref_array('posts_join', array( $join, &$this ) ); + } + + // Paging + if ( empty($q['nopaging']) && !$this->is_singular ) { + $page = absint($q['paged']); + if ( empty($page) ) + $page = 1; + + if ( empty($q['offset']) ) { + $pgstrt = ''; + $pgstrt = ($page - 1) * $q['posts_per_page'] . ', '; + $limits = 'LIMIT ' . $pgstrt . $q['posts_per_page']; + } else { // we're ignoring $page and using 'offset' + $q['offset'] = absint($q['offset']); + $pgstrt = $q['offset'] . ', '; + $limits = 'LIMIT ' . $pgstrt . $q['posts_per_page']; + } + } + + // Comments feeds + if ( $this->is_comment_feed && ( $this->is_archive || $this->is_search || !$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' AND comment_approved = '1'"; + $cgroupby = ''; + } + + if ( !$q['suppress_filters'] ) { + $cjoin = apply_filters_ref_array('comment_feed_join', array( $cjoin, &$this ) ); + $cwhere = apply_filters_ref_array('comment_feed_where', array( $cwhere, &$this ) ); + $cgroupby = apply_filters_ref_array('comment_feed_groupby', array( $cgroupby, &$this ) ); + $corderby = apply_filters_ref_array('comment_feed_orderby', array( 'comment_date_gmt DESC', &$this ) ); + $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 : ''; + + $this->comments = (array) $wpdb->get_results("SELECT $distinct $wpdb->comments.* FROM $wpdb->comments $cjoin $cwhere $cgroupby $corderby $climits"); + $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'] ) { + $where = apply_filters_ref_array( 'posts_where_paged', array( $where, &$this ) ); + $groupby = apply_filters_ref_array( 'posts_groupby', array( $groupby, &$this ) ); + $join = apply_filters_ref_array( 'posts_join_paged', array( $join, &$this ) ); + $orderby = apply_filters_ref_array( 'posts_orderby', array( $orderby, &$this ) ); + $distinct = apply_filters_ref_array( 'posts_distinct', array( $distinct, &$this ) ); + $limits = apply_filters_ref_array( 'post_limits', array( $limits, &$this ) ); + $fields = apply_filters_ref_array( 'posts_fields', array( $fields, &$this ) ); + + // Filter all clauses at once, for convenience + $clauses = (array) apply_filters_ref_array( 'posts_clauses', array( compact( $pieces ), &$this ) ); + foreach ( $pieces as $piece ) + $$piece = isset( $clauses[ $piece ] ) ? $clauses[ $piece ] : ''; + } + + // Announce current selection parameters. For use by caching plugins. + do_action( 'posts_selection', $where . $groupby . $orderby . $limits . $join ); + + // Filter again for the benefit of caching plugins. Regular plugins should use the hooks above. + if ( !$q['suppress_filters'] ) { + $where = apply_filters_ref_array( 'posts_where_request', array( $where, &$this ) ); + $groupby = apply_filters_ref_array( 'posts_groupby_request', array( $groupby, &$this ) ); + $join = apply_filters_ref_array( 'posts_join_request', array( $join, &$this ) ); + $orderby = apply_filters_ref_array( 'posts_orderby_request', array( $orderby, &$this ) ); + $distinct = apply_filters_ref_array( 'posts_distinct_request', array( $distinct, &$this ) ); + $fields = apply_filters_ref_array( 'posts_fields_request', array( $fields, &$this ) ); + $limits = apply_filters_ref_array( 'post_limits_request', array( $limits, &$this ) ); + + // Filter all clauses at once, for convenience + $clauses = (array) apply_filters_ref_array( 'posts_clauses_request', array( compact( $pieces ), &$this ) ); + foreach ( $pieces as $piece ) + $$piece = isset( $clauses[ $piece ] ) ? $clauses[ $piece ] : ''; + } + + 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 = " SELECT $found_rows $distinct $fields FROM $wpdb->posts $join WHERE 1=1 $where $groupby $orderby $limits"; + if ( !$q['suppress_filters'] ) + $this->request = apply_filters_ref_array('posts_request', array( $this->request, &$this ) ); + + if ( 'ids' == $q['fields'] ) { + $this->posts = $wpdb->get_col($this->request); + + return $this->posts; + } + + if ( 'id=>parent' == $q['fields'] ) { + $this->posts = $wpdb->get_results($this->request); + + $r = array(); + foreach ( $this->posts as $post ) + $r[ $post->ID ] = $post->post_parent; + + return $r; + } + + $this->posts = $wpdb->get_results($this->request); + + // Raw results filter. Prior to status checks. + if ( !$q['suppress_filters'] ) + $this->posts = apply_filters_ref_array('posts_results', array( $this->posts, &$this ) ); + + if ( !empty($this->posts) && $this->is_comment_feed && $this->is_singular ) { + $cjoin = apply_filters_ref_array('comment_feed_join', array( '', &$this ) ); + $cwhere = apply_filters_ref_array('comment_feed_where', array( "WHERE comment_post_ID = '{$this->posts[0]->ID}' AND comment_approved = '1'", &$this ) ); + $cgroupby = apply_filters_ref_array('comment_feed_groupby', array( '', &$this ) ); + $cgroupby = ( ! empty( $cgroupby ) ) ? 'GROUP BY ' . $cgroupby : ''; + $corderby = apply_filters_ref_array('comment_feed_orderby', array( 'comment_date_gmt DESC', &$this ) ); + $corderby = ( ! empty( $corderby ) ) ? 'ORDER BY ' . $corderby : ''; + $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"; + $this->comments = $wpdb->get_results($comments_request); + $this->comment_count = count($this->comments); + } + + if ( !$q['no_found_rows'] && !empty($limits) ) { + $found_posts_query = apply_filters_ref_array( 'found_posts_query', array( 'SELECT FOUND_ROWS()', &$this ) ); + $this->found_posts = $wpdb->get_var( $found_posts_query ); + $this->found_posts = apply_filters_ref_array( 'found_posts', array( $this->found_posts, &$this ) ); + $this->max_num_pages = ceil($this->found_posts / $q['posts_per_page']); + } + + // 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]); + $post_status_obj = get_post_status_object($status); + //$type = get_post_type($this->posts[0]); + if ( !$post_status_obj->public ) { + 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 && current_user_can( $edit_cap, $this->posts[0]->ID ) ) + $this->posts[0] = 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__in = implode(',', array_map( 'absint', $sticky_posts )); + // honor post type(s) if not set to any + $stickies_where = ''; + if ( 'any' != $post_type && '' != $post_type ) { + if ( is_array( $post_type ) ) { + $post_types = join( "', '", $post_type ); + } else { + $post_types = $post_type; + } + $stickies_where = "AND $wpdb->posts.post_type IN ('" . $post_types . "')"; + } + + $stickies = $wpdb->get_results( "SELECT * FROM $wpdb->posts WHERE $wpdb->posts.ID IN ($stickies__in) $stickies_where" ); + foreach ( $stickies as $sticky_post ) { + // Ignore sticky posts the current user cannot read or are not published. + if ( 'publish' != $sticky_post->post_status ) + continue; + array_splice($this->posts, $sticky_offset, 0, array($sticky_post)); + $sticky_offset++; + } + } + } + + if ( !$q['suppress_filters'] ) + $this->posts = apply_filters_ref_array('the_posts', array( $this->posts, &$this ) ); + + $this->post_count = count($this->posts); + + // Sanitize before caching so it'll only get done once + for ( $i = 0; $i < $this->post_count; $i++ ) { + $this->posts[$i] = sanitize_post($this->posts[$i], 'raw'); + } + + if ( $q['cache_results'] ) + update_post_caches($this->posts, $post_type, $q['update_post_term_cache'], $q['update_post_meta_cache']); + + if ( $this->post_count > 0 ) { + $this->post = $this->posts[0]; + } + + return $this->posts; + } + + /** + * Set up the next post and iterate current post index. + * + * @since 1.5.0 + * @access public + * + * @return object Next post. + */ + 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 + * @uses $post + * @uses do_action_ref_array() Calls 'loop_start' if loop has just started + */ + function the_post() { + global $post; + $this->in_the_loop = true; + + if ( $this->current_post == -1 ) // loop has just started + do_action_ref_array('loop_start', array(&$this)); + + $post = $this->next_post(); + setup_postdata($post); + } + + /** + * Whether there are more posts available in the loop. + * + * Calls action 'loop_end', when the loop is complete. + * + * @since 1.5.0 + * @access public + * @uses do_action_ref_array() Calls 'loop_end' if loop is ended + * + * @return bool True if posts are available, false if end of loop. + */ + 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 ) { + 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 + */ + function rewind_posts() { + $this->current_post = -1; + if ( $this->post_count > 0 ) { + $this->post = $this->posts[0]; + } + } + + /** + * Iterate current comment index and return comment object. + * + * @since 2.2.0 + * @access public + * + * @return object Comment object. + */ + 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 object $comment Current comment. + * @uses do_action() Calls 'comment_loop_start' hook when first comment is processed. + */ + function the_comment() { + global $comment; + + $comment = $this->next_comment(); + + if ( $this->current_comment == 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. + */ + 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 + */ + 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. + */ + 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 + */ + function get_queried_object() { + if ( isset($this->queried_object) ) + return $this->queried_object; + + $this->queried_object = NULL; + $this->queried_object_id = 0; + + if ( $this->is_category || $this->is_tag || $this->is_tax ) { + $tax_query_in_and = wp_list_filter( $this->tax_query->queries, array( 'operator' => 'NOT IN' ), 'NOT' ); + + $query = reset( $tax_query_in_and ); + + if ( 'term_id' == $query['field'] ) + $term = get_term( reset( $query['terms'] ), $query['taxonomy'] ); + else + $term = get_term_by( $query['field'], reset( $query['terms'] ), $query['taxonomy'] ); + + if ( $term && ! is_wp_error($term) ) { + $this->queried_object = $term; + $this->queried_object_id = (int) $term->term_id; + + if ( $this->is_category ) + _make_cat_compat( $this->queried_object ); + } + } elseif ( $this->is_post_type_archive ) { + $this->queried_object = get_post_type_object( $this->get('post_type') ); + } elseif ( $this->is_posts_page ) { + $page_for_posts = get_option('page_for_posts'); + $this->queried_object = & get_page( $page_for_posts ); + $this->queried_object_id = (int) $this->queried_object->ID; + } elseif ( $this->is_singular && !is_null($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 + */ + 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 $query URL query string. + * @return WP_Query + */ + function __construct($query = '') { + if ( ! empty($query) ) { + $this->query($query); + } + } + + /** + * Is the query for an archive page? + * + * Month, Year, Category, Author, Post Type archive... + * + * @since 3.1.0 + * + * @return bool + */ + function is_archive() { + return (bool) $this->is_archive; + } + + /** + * Is the query for a 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 + */ + 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_object = $this->get_queried_object(); + + return in_array( $post_type_object->name, (array) $post_types ); + } + + /** + * Is the query for an attachment page? + * + * @since 3.1.0 + * + * @return bool + */ + function is_attachment() { + return (bool) $this->is_attachment; + } + + /** + * Is the query for an 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 + */ + function is_author( $author = '' ) { + if ( !$this->is_author ) + return false; + + if ( empty($author) ) + return true; + + $author_obj = $this->get_queried_object(); + + $author = (array) $author; + + if ( in_array( $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 a 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 + */ + function is_category( $category = '' ) { + if ( !$this->is_category ) + return false; + + if ( empty($category) ) + return true; + + $cat_obj = $this->get_queried_object(); + + $category = (array) $category; + + if ( in_array( $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 a 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 $slug Optional. Tag slug or array of slugs. + * @return bool + */ + function is_tag( $slug = '' ) { + if ( !$this->is_tag ) + return false; + + if ( empty( $slug ) ) + return true; + + $tag_obj = $this->get_queried_object(); + + $slug = (array) $slug; + + if ( in_array( $tag_obj->slug, $slug ) ) + return true; + + return false; + } + + /** + * Is the query for a 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 + * + * @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 + */ + 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; + + if ( empty( $term ) ) // Only a Taxonomy provided + return isset( $queried_object->taxonomy ) && count( $tax_array ) && in_array( $queried_object->taxonomy, $tax_array ); + + 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 + * + * @return bool + */ + function is_comments_popup() { + return (bool) $this->is_comments_popup; + } + + /** + * Is the query for a date archive? + * + * @since 3.1.0 + * + * @return bool + */ + function is_date() { + return (bool) $this->is_date; + } + + + /** + * Is the query for a day archive? + * + * @since 3.1.0 + * + * @return bool + */ + 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 + */ + 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 + */ + 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 + * @uses is_home() + * @uses get_option() + * + * @return bool True, if front of site. + */ + 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. + */ + function is_home() { + return (bool) $this->is_home; + } + + /** + * Is the query for a month archive? + * + * @since 3.1.0 + * + * @return bool + */ + function is_month() { + return (bool) $this->is_month; + } + + /** + * Is the query for a 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 mixed $page Page ID, title, slug, or array of such. + * @return bool + */ + function is_page( $page = '' ) { + if ( !$this->is_page ) + return false; + + if ( empty( $page ) ) + return true; + + $page_obj = $this->get_queried_object(); + + $page = (array) $page; + + if ( in_array( $page_obj->ID, $page ) ) + return true; + elseif ( in_array( $page_obj->post_title, $page ) ) + return true; + else if ( in_array( $page_obj->post_name, $page ) ) + return true; + + return false; + } + + /** + * Is the query for paged result and not for the first page? + * + * @since 3.1.0 + * + * @return bool + */ + function is_paged() { + return (bool) $this->is_paged; + } + + /** + * Is the query for a post or page preview? + * + * @since 3.1.0 + * + * @return bool + */ + function is_preview() { + return (bool) $this->is_preview; + } + + /** + * Is the query for the robots file? + * + * @since 3.1.0 + * + * @return bool + */ + function is_robots() { + return (bool) $this->is_robots; + } + + /** + * Is the query for a search? + * + * @since 3.1.0 + * + * @return bool + */ + function is_search() { + return (bool) $this->is_search; + } + + /** + * Is the query for a single post? + * + * Works for any post type, except attachments and 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 mixed $post Post ID, title, slug, or array of such. + * @return bool + */ + function is_single( $post = '' ) { + if ( !$this->is_single ) + return false; + + if ( empty($post) ) + return true; + + $post_obj = $this->get_queried_object(); + + $post = (array) $post; + + if ( in_array( $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; + + return false; + } + + /** + * Is the query for a 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 mixed $post_types Optional. Post Type or array of Post Types + * @return bool + */ + 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 + */ + function is_time() { + return (bool) $this->is_time; + } + + /** + * Is the query for a trackback endpoint call? + * + * @since 3.1.0 + * + * @return bool + */ + function is_trackback() { + return (bool) $this->is_trackback; + } + + /** + * Is the query for a specific year? + * + * @since 3.1.0 + * + * @return bool + */ + function is_year() { + return (bool) $this->is_year; + } + + /** + * Is the query a 404 (returns no results)? + * + * @since 3.1.0 + * + * @return bool + */ + function is_404() { + return (bool) $this->is_404; + } +} + +/** + * Redirect old slugs to the correct permalink. + * + * Attempts to find the current slug from the past slugs. + * + * @since 2.1.0 + * @uses $wp_query + * @uses $wpdb + * + * @return null If no link is found, null is returned. + */ +function wp_old_slug_redirect() { + global $wp_query; + if ( is_404() && '' != $wp_query->query_vars['name'] ) : + global $wpdb; + + // Guess the current post_type based on the query vars. + if ( get_query_var('post_type') ) + $post_type = get_query_var('post_type'); + elseif ( !empty($wp_query->query_vars['pagename']) ) + $post_type = 'page'; + else + $post_type = 'post'; + + if ( is_array( $post_type ) ) { + if ( count( $post_type ) > 1 ) + return; + $post_type = array_shift( $post_type ); + } + + // Do not attempt redirect for hierarchical post types + if ( is_post_type_hierarchical( $post_type ) ) + return; + + $query = $wpdb->prepare("SELECT post_id FROM $wpdb->postmeta, $wpdb->posts WHERE ID = post_id AND post_type = %s AND meta_key = '_wp_old_slug' AND meta_value = %s", $post_type, $wp_query->query_vars['name']); + + // if year, monthnum, or day have been specified, make our query more precise + // just in case there are multiple identical _wp_old_slug values + if ( '' != $wp_query->query_vars['year'] ) + $query .= $wpdb->prepare(" AND YEAR(post_date) = %d", $wp_query->query_vars['year']); + if ( '' != $wp_query->query_vars['monthnum'] ) + $query .= $wpdb->prepare(" AND MONTH(post_date) = %d", $wp_query->query_vars['monthnum']); + if ( '' != $wp_query->query_vars['day'] ) + $query .= $wpdb->prepare(" AND DAYOFMONTH(post_date) = %d", $wp_query->query_vars['day']); + + $id = (int) $wpdb->get_var($query); + + if ( ! $id ) + return; + + $link = get_permalink($id); + + if ( !$link ) + return; + + wp_redirect( $link, 301 ); // Permanent redirect + exit; + endif; +} + +/** + * Set up global post data. + * + * @since 1.5.0 + * + * @param object $post Post data. + * @uses do_action_ref_array() Calls 'the_post' + * @return bool True when finished. + */ +function setup_postdata($post) { + global $id, $authordata, $currentday, $currentmonth, $page, $pages, $multipage, $more, $numpages; + + $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; + $page = get_query_var('page'); + if ( !$page ) + $page = 1; + if ( is_single() || is_page() || is_feed() ) + $more = 1; + $content = $post->post_content; + if ( strpos( $content, '' ) ) { + if ( $page > 1 ) + $more = 1; + $multipage = 1; + $content = str_replace("\n\n", '', $content); + $content = str_replace("\n", '', $content); + $content = str_replace("\n", '', $content); + $pages = explode('', $content); + $numpages = count($pages); + } else { + $pages = array( $post->post_content ); + $multipage = 0; + } + + do_action_ref_array('the_post', array(&$post)); + + return true; +} +?> diff --git a/src/wp-includes/registration-functions.php b/src/wp-includes/registration-functions.php new file mode 100644 index 0000000..889919d --- /dev/null +++ b/src/wp-includes/registration-functions.php @@ -0,0 +1,8 @@ + \ No newline at end of file diff --git a/src/wp-includes/registration.php b/src/wp-includes/registration.php new file mode 100644 index 0000000..07d919c --- /dev/null +++ b/src/wp-includes/registration.php @@ -0,0 +1,8 @@ + \ No newline at end of file diff --git a/src/wp-includes/rewrite.php b/src/wp-includes/rewrite.php new file mode 100644 index 0000000..46c1b32 --- /dev/null +++ b/src/wp-includes/rewrite.php @@ -0,0 +1,1991 @@ +add_rule($regex, $redirect, $after); +} + +/** + * Add a new tag (like %postname%). + * + * Warning: you must call this on init or earlier, otherwise the query var + * addition stuff won't work. + * + * @since 2.1.0 + * + * @param string $tagname + * @param string $regex + */ +function add_rewrite_tag($tagname, $regex) { + //validation + if ( strlen($tagname) < 3 || $tagname[0] != '%' || $tagname[strlen($tagname)-1] != '%' ) + return; + + $qv = trim($tagname, '%'); + + global $wp_rewrite, $wp; + $wp->add_query_var($qv); + $wp_rewrite->add_rewrite_tag($tagname, $regex, $qv . '='); +} + +/** + * Add permalink structure. + * + * @see WP_Rewrite::add_permastruct() + * @since 3.0.0 + * + * @param string $name Name for permalink structure. + * @param string $struct Permalink structure. + * @param bool $with_front Prepend front base to permalink structure. + */ +function add_permastruct( $name, $struct, $with_front = true, $ep_mask = EP_NONE ) { + global $wp_rewrite; + return $wp_rewrite->add_permastruct( $name, $struct, $with_front, $ep_mask ); +} + +/** + * Add a new feed type like /atom1/. + * + * @since 2.1.0 + * + * @param string $feedname + * @param callback $function Callback to run on feed display. + * @return string Feed action name. + */ +function add_feed($feedname, $function) { + global $wp_rewrite; + if ( ! in_array($feedname, $wp_rewrite->feeds) ) //override the file if it is + $wp_rewrite->feeds[] = $feedname; + $hook = 'do_feed_' . $feedname; + // Remove default function hook + remove_action($hook, $hook, 10, 1); + add_action($hook, $function, 10, 1); + return $hook; +} + +/** + * Remove rewrite rules and then recreate rewrite rules. + * + * @see WP_Rewrite::flush_rules() + * @since 3.0.0 + * + * @param bool $hard Whether to update .htaccess (hard flush) or just update + * rewrite_rules transient (soft flush). Default is true (hard). + */ +function flush_rewrite_rules( $hard = true ) { + global $wp_rewrite; + $wp_rewrite->flush_rules( $hard ); +} + +//pseudo-places +/** + * Endpoint Mask for default, which is nothing. + * + * @since 2.1.0 + */ +define('EP_NONE', 0); + +/** + * Endpoint Mask for Permalink. + * + * @since 2.1.0 + */ +define('EP_PERMALINK', 1); + +/** + * Endpoint Mask for Attachment. + * + * @since 2.1.0 + */ +define('EP_ATTACHMENT', 2); + +/** + * Endpoint Mask for date. + * + * @since 2.1.0 + */ +define('EP_DATE', 4); + +/** + * Endpoint Mask for year + * + * @since 2.1.0 + */ +define('EP_YEAR', 8); + +/** + * Endpoint Mask for month. + * + * @since 2.1.0 + */ +define('EP_MONTH', 16); + +/** + * Endpoint Mask for day. + * + * @since 2.1.0 + */ +define('EP_DAY', 32); + +/** + * Endpoint Mask for root. + * + * @since 2.1.0 + */ +define('EP_ROOT', 64); + +/** + * Endpoint Mask for comments. + * + * @since 2.1.0 + */ +define('EP_COMMENTS', 128); + +/** + * Endpoint Mask for searches. + * + * @since 2.1.0 + */ +define('EP_SEARCH', 256); + +/** + * Endpoint Mask for categories. + * + * @since 2.1.0 + */ +define('EP_CATEGORIES', 512); + +/** + * Endpoint Mask for tags. + * + * @since 2.3.0 + */ +define('EP_TAGS', 1024); + +/** + * Endpoint Mask for authors. + * + * @since 2.1.0 + */ +define('EP_AUTHORS', 2048); + +/** + * Endpoint Mask for pages. + * + * @since 2.1.0 + */ +define('EP_PAGES', 4096); + +/** + * Endpoint Mask for everything. + * + * @since 2.1.0 + */ +define('EP_ALL', 8191); + +/** + * Add an endpoint, like /trackback/. + * + * The endpoints are added to the end of the request. So a request matching + * "/2008/10/14/my_post/myep/", the endpoint will be "/myep/". + * + * Be sure to flush the rewrite rules (wp_rewrite->flush_rules()) when your plugin gets + * activated (register_activation_hook()) and deactivated (register_deactivation_hook()) + * + * @since 2.1.0 + * @see WP_Rewrite::add_endpoint() Parameters and more description. + * @uses $wp_rewrite + * + * @param unknown_type $name + * @param unknown_type $places + */ +function add_rewrite_endpoint($name, $places) { + global $wp_rewrite; + $wp_rewrite->add_endpoint($name, $places); +} + +/** + * Filter the URL base for taxonomies. + * + * To remove any manually prepended /index.php/. + * + * @access private + * @since 2.6.0 + * + * @param string $base The taxonomy base that we're going to filter + * @return string + */ +function _wp_filter_taxonomy_base( $base ) { + if ( !empty( $base ) ) { + $base = preg_replace( '|^/index\.php/|', '', $base ); + $base = trim( $base, '/' ); + } + return $base; +} + +/** + * Examine a url and try to determine the post ID it represents. + * + * Checks are supposedly from the hosted site blog. + * + * @since 1.0.0 + * + * @param string $url Permalink to check. + * @return int Post ID, or 0 on failure. + */ +function url_to_postid($url) { + global $wp_rewrite; + + $url = apply_filters('url_to_postid', $url); + + // First, check to see if there is a 'p=N' or 'page_id=N' to match against + if ( preg_match('#[?&](p|page_id|attachment_id)=(\d+)#', $url, $values) ) { + $id = absint($values[2]); + if ( $id ) + return $id; + } + + // Check to see if we are using rewrite rules + $rewrite = $wp_rewrite->wp_rewrite_rules(); + + // Not using rewrite rules, and 'p=N' and 'page_id=N' methods failed, so we're out of options + if ( empty($rewrite) ) + return 0; + + // Get rid of the #anchor + $url_split = explode('#', $url); + $url = $url_split[0]; + + // Get rid of URL ?query=string + $url_split = explode('?', $url); + $url = $url_split[0]; + + // Add 'www.' if it is absent and should be there + if ( false !== strpos(home_url(), '://www.') && false === strpos($url, '://www.') ) + $url = str_replace('://', '://www.', $url); + + // Strip 'www.' if it is present and shouldn't be + if ( false === strpos(home_url(), '://www.') ) + $url = str_replace('://www.', '://', $url); + + // Strip 'index.php/' if we're not using path info permalinks + if ( !$wp_rewrite->using_index_permalinks() ) + $url = str_replace('index.php/', '', $url); + + if ( false !== strpos($url, home_url()) ) { + // Chop off http://domain.com + $url = str_replace(home_url(), '', $url); + } else { + // Chop off /path/to/blog + $home_path = parse_url(home_url()); + $home_path = isset( $home_path['path'] ) ? $home_path['path'] : '' ; + $url = str_replace($home_path, '', $url); + } + + // Trim leading and lagging slashes + $url = trim($url, '/'); + + $request = $url; + + // Look for matches. + $request_match = $request; + foreach ( (array)$rewrite as $match => $query) { + // If the requesting file is the anchor of the match, prepend it + // to the path info. + if ( !empty($url) && ($url != $request) && (strpos($match, $url) === 0) ) + $request_match = $url . '/' . $request; + + if ( preg_match("!^$match!", $request_match, $matches) ) { + // Got a match. + // 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)); + + // Filter out non-public query vars + global $wp; + parse_str($query, $query_vars); + $query = array(); + foreach ( (array) $query_vars as $key => $value ) { + if ( in_array($key, $wp->public_query_vars) ) + $query[$key] = $value; + } + + // Do the query + $query = new WP_Query($query); + if ( !empty($query->posts) && $query->is_singular ) + return $query->post->ID; + else + return 0; + } + } + return 0; +} + +/** + * WordPress Rewrite Component. + * + * 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 { + /** + * Default permalink structure for WordPress. + * + * @since 1.5.0 + * @access private + * @var string + */ + var $permalink_structure; + + /** + * Whether to add trailing slashes. + * + * @since 2.2.0 + * @access private + * @var bool + */ + var $use_trailing_slashes; + + /** + * Permalink author request base ( example.com/author/authorname ). + * + * @since 1.5.0 + * @access private + * @var string + */ + var $author_base = 'author'; + + /** + * Permalink request structure for author pages. + * + * @since 1.5.0 + * @access private + * @var string + */ + var $author_structure; + + /** + * Permalink request structure for dates. + * + * @since 1.5.0 + * @access private + * @var string + */ + var $date_structure; + + /** + * Permalink request structure for pages. + * + * @since 1.5.0 + * @access private + * @var string + */ + var $page_structure; + + /** + * Search permalink base ( example.com/search/query ). + * + * @since 1.5.0 + * @access private + * @var string + */ + var $search_base = 'search'; + + /** + * Permalink request 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 + * @access private + * @var string + */ + var $pagination_base = 'page'; + + /** + * Feed permalink base. + * + * @since 1.5.0 + * @access private + * @var string + */ + var $feed_base = 'feed'; + + /** + * Comments feed request structure permalink. + * + * @since 1.5.0 + * @access private + * @var string + */ + var $comments_feed_structure; + + /** + * Feed request structure permalink. + * + * @since 1.5.0 + * @access private + * @var string + */ + var $feed_structure; + + /** + * Front URL path. + * + * The difference between the root property is that WordPress might be + * located at example/WordPress/index.php, if permalinks are turned off. The + * WordPress/index.php will be the front portion. If permalinks are turned + * on, this will most likely be empty or not set. + * + * @since 1.5.0 + * @access private + * @var string + */ + var $front; + + /** + * Root URL path to WordPress (without domain). + * + * The difference between front property is that WordPress might be located + * at example.com/WordPress/. The root is the 'WordPress/' portion. + * + * @since 1.5.0 + * @access private + * @var string + */ + var $root = ''; + + /** + * Permalink to the home page. + * + * @since 1.5.0 + * @access public + * @var string + */ + var $index = 'index.php'; + + /** + * Request match string. + * + * @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 WP's index.php. + * + * These rules are written to the mod_rewrite portion of the .htaccess. + * + * @since 2.1.0 + * @access private + * @var array + */ + var $non_wp_rules = array(); // + + /** + * Extra permalink structures. + * + * @since 2.1.0 + * @access private + * @var array + */ + var $extra_permastructs = array(); + + /** + * Endpoints permalinks + * + * @since 2.1.0 + * @access private + * @var array + */ + var $endpoints; + + /** + * Whether to write every mod_rewrite rule for WordPress. + * + * 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 + */ + var $use_verbose_rules = false; + + /** + * Whether to write every mod_rewrite rule for WordPress pages. + * + * @since 2.5.0 + * @access public + * @var bool + */ + var $use_verbose_page_rules = true; + + /** + * Permalink structure search for preg_replace. + * + * @since 1.5.0 + * @access private + * @var array + */ + var $rewritecode = + array( + '%year%', + '%monthnum%', + '%day%', + '%hour%', + '%minute%', + '%second%', + '%postname%', + '%post_id%', + '%author%', + '%pagename%', + '%search%' + ); + + /** + * Preg_replace values for the search, see {@link 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]+)', + '([^/]+)', + '([^/]+?)', + '(.+)' + ); + + /** + * Search for the query to look for replacing. + * + * @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 + * @access private + * @var array + */ + var $feeds = array ( 'feed', 'rdf', 'rss', 'rss2', 'atom' ); + + /** + * 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. + */ + function using_permalinks() { + return ! empty($this->permalink_structure); + } + + /** + * 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 + */ + function using_index_permalinks() { + if ( empty($this->permalink_structure) ) + return false; + + // If the index is not in the permalink, we're using mod_rewrite. + if ( preg_match('#^/*' . $this->index . '#', $this->permalink_structure) ) + return true; + + return false; + } + + /** + * 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 + */ + function using_mod_rewrite_permalinks() { + if ( $this->using_permalinks() && ! $this->using_index_permalinks() ) + return true; + else + return false; + } + + /** + * Index 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 + */ + function preg_index($number) { + $match_prefix = '$'; + $match_suffix = ''; + + if ( ! empty($this->matches) ) { + $match_prefix = '$' . $this->matches . '['; + $match_suffix = ']'; + } + + return "$match_prefix$number$match_suffix"; + } + + /** + * Retrieve 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 + * + * @return array Array of page URIs as first element and attachment URIs as second element. + */ + function page_uri_index() { + global $wpdb; + + //get pages in order of hierarchy, i.e. children after parents + $posts = get_page_hierarchy( $wpdb->get_results("SELECT ID, post_name, post_parent FROM $wpdb->posts WHERE post_type = 'page' AND post_status != 'auto-draft'") ); + + // 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 ); + } + + /** + * Retrieve all of the rewrite rules for pages. + * + * If the 'use_verbose_page_rules' property is false, then there will only + * be a single rewrite rule for pages for those matching '%pagename%'. With + * the property set to true, the attachments and the pages will be added for + * each individual attachment URI and page URI, respectively. + * + * @since 1.5.0 + * @access public + * + * @return array + */ + function page_rewrite_rules() { + $rewrite_rules = array(); + $page_structure = $this->get_page_permastruct(); + + if ( ! $this->use_verbose_page_rules ) { + $this->add_rewrite_tag('%pagename%', "(.+?)", 'pagename='); + $rewrite_rules = array_merge($rewrite_rules, $this->generate_rewrite_rules($page_structure, EP_PAGES)); + return $rewrite_rules; + } + + $page_uris = $this->page_uri_index(); + $uris = $page_uris[0]; + $attachment_uris = $page_uris[1]; + + if ( is_array( $attachment_uris ) ) { + foreach ( $attachment_uris as $uri => $pagename ) { + $this->add_rewrite_tag('%pagename%', "($uri)", 'attachment='); + $rewrite_rules = array_merge($rewrite_rules, $this->generate_rewrite_rules($page_structure, EP_PAGES)); + } + } + if ( is_array( $uris ) ) { + foreach ( $uris as $uri => $pagename ) { + $this->add_rewrite_tag('%pagename%', "($uri)", 'pagename='); + $rewrite_rules = array_merge($rewrite_rules, $this->generate_rewrite_rules($page_structure, EP_PAGES)); + } + } + + return $rewrite_rules; + } + + /** + * Retrieve 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 bool|string False on no permalink structure. Date permalink structure. + */ + 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; + } + + /** + * Retrieve 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 bool|string False on failure. Year structure on success. + */ + function get_year_permastruct() { + $structure = $this->get_date_permastruct($this->permalink_structure); + + if ( empty($structure) ) + return false; + + $structure = str_replace('%monthnum%', '', $structure); + $structure = str_replace('%day%', '', $structure); + + $structure = preg_replace('#/+#', '/', $structure); + + return $structure; + } + + /** + * Retrieve 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 bool|string False on failure. Year/Month structure on success. + */ + function get_month_permastruct() { + $structure = $this->get_date_permastruct($this->permalink_structure); + + if ( empty($structure) ) + return false; + + $structure = str_replace('%day%', '', $structure); + + $structure = preg_replace('#/+#', '/', $structure); + + return $structure; + } + + /** + * Retrieve 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 bool|string False on failure. Year/Month/Day structure on success. + */ + function get_day_permastruct() { + return $this->get_date_permastruct($this->permalink_structure); + } + + /** + * Retrieve 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 bool|string False on failure. Category permalink structure. + */ + 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 bool|string False on failure. Tag permalink structure. + */ + function get_tag_permastruct() { + return $this->get_extra_permastruct('post_tag'); + } + + /** + * Retrieve extra permalink structure by name. + * + * @since 2.5.0 + * @access public + * + * @param string $name Permalink structure name. + * @return string|bool False if not found. Permalink structure string. + */ + function get_extra_permastruct($name) { + if ( empty($this->permalink_structure) ) + return false; + + if ( isset($this->extra_permastructs[$name]) ) + return $this->extra_permastructs[$name][0]; + + return false; + } + + /** + * Retrieve 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|bool False if not found. Permalink structure string. + */ + 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; + } + + /** + * Retrieve 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|bool False if not found. Permalink structure string. + */ + 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; + } + + /** + * Retrieve 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|bool False if not found. Permalink structure string. + */ + 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; + } + + /** + * Retrieve 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|bool False if not found. Permalink structure string. + */ + 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; + } + + /** + * Retrieve 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|bool False if not found. Permalink structure string. + */ + 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; + } + + /** + * Append or update tag, pattern, and query for replacement. + * + * If the tag already exists, replace the existing pattern and query for + * that tag, otherwise add the new tag, pattern, and query to the end of the + * arrays. + * + * @internal What is the purpose of this function again? Need to finish long + * description. + * + * @since 1.5.0 + * @access public + * + * @param string $tag Append tag to rewritecode property array. + * @param string $pattern Append pattern to rewritereplace property array. + * @param string $query Append query to queryreplace property array. + */ + function add_rewrite_tag($tag, $pattern, $query) { + $position = array_search($tag, $this->rewritecode); + if ( false !== $position && null !== $position ) { + $this->rewritereplace[$position] = $pattern; + $this->queryreplace[$position] = $query; + } else { + $this->rewritecode[] = $tag; + $this->rewritereplace[] = $pattern; + $this->queryreplace[] = $query; + } + } + + /** + * Generate the rules from 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, default is EP_NONE. Endpoint constant, see EP_* constants. + * @param bool $paged Optional, default is true. Whether permalink request is paged. + * @param bool $feed Optional, default is true. Whether for feed. + * @param bool $forcomments Optional, default is false. Whether for comments. + * @param bool $walk_dirs Optional, default is true. Whether to create list of directories to walk over. + * @param bool $endpoints Optional, default is true. Whether endpoints are enabled. + * @return array Rewrite rule list. + */ + 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 /feed/atom + //and /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 = 'comment-page-([0-9]{1,})/?$'; + + //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[1] . '='; + $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; + //build a list from the rewritecode and queryreplace arrays, that will look something like + //tagname=$matches[i] where i is the current $i + 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%/%month%/%postname% would create + //rewrite rules for /%year%/, /%year%/%month%/ and /%year%/%month%/%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 = ( isset($queries) && is_array($queries) ) ? $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); + + //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(); + if ( $feed ) //...adding on /feed/ regexes => queries + $rewrite = array($feedmatch => $feedquery, $feedmatch2 => $feedquery2); + if ( $paged ) //...and /page/xx ones + $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)); + else if ( 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; + $page = is_post_type_hierarchical( $ptype ); // This is for page style attachment url's + break; + } + } + } + + //if we're 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'; + //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 /some-text + $sub1 = $submatchbase . '/([^/]+)/'; + $sub1tb = $sub1 . $trackbackregex; //add trackback regex /trackback/... + $sub1feed = $sub1 . $feedregex; //and /feed/(atom|...) + $sub1feed2 = $sub1 . $feedregex2; //and /(feed|atom...) + $sub1comment = $sub1 . $commentregex; //and /comment-page-xx + //add an ? as we don't have to match that last slash, and finally a $ so we + //match to the end of the URL + + //add another rule to match attachments in the explicit form: + ///attachment/some-text + $sub2 = $submatchbase . '/attachment/([^/]+)/'; + $sub2tb = $sub2 . $trackbackregex; //and add trackbacks /attachment/trackback + $sub2feed = $sub2 . $feedregex; //feeds, /attachment/feed/(atom|...) + $sub2feed2 = $sub2 . $feedregex2; //and feeds again on to this /attachment/(feed|atom...) + $sub2comment = $sub2 . $commentregex; //and /comment-page-xx + + //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); + + //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(2); + $rewrite[$sub2 . $regex] = $subquery . $ep[1] . $this->preg_index(2); + } + } + } + + //now we've finished with endpoints, finish off the $sub1 and $sub2 matches + $sub1 .= '?$'; + $sub2 .= '?$'; + + //allow URLs like /2 for /page/2 + $match = $match . '(/[0-9]+)?/?$'; + $query = $index . '?' . $query . '&page=' . $this->preg_index($num_toks + 1); + } else { //not matching a permalink so this is a lot simpler + //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 regexes/queries for attachments, attachment trackbacks and so on + if ( ! $page ) //require /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)); + $rewrite = array_merge(array($sub2 => $subquery, $sub2tb => $subtbquery, $sub2feed => $subfeedquery, $sub2feed2 => $subfeedquery, $sub2comment => $subcommentquery), $rewrite); + } + } //if($num_toks) + //add the rules for this dir to the accumulating $post_rewrite + $post_rewrite = array_merge($rewrite, $post_rewrite); + } //foreach ($dir) + return $post_rewrite; //the finished rules. phew! + } + + /** + * Generate Rewrite rules with permalink structure and walking directory only. + * + * Shorten version of {@link WP_Rewrite::generate_rewrite_rules()} that + * allows for shorter list of parameters. See the method for longer + * description of what generating rewrite rules does. + * + * @uses WP_Rewrite::generate_rewrite_rules() See for long description and rest of parameters. + * @since 1.5.0 + * @access public + * + * @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 + */ + function generate_rewrite_rule($permalink_structure, $walk_dirs = false) { + return $this->generate_rewrite_rules($permalink_structure, EP_NONE, false, false, false, $walk_dirs); + } + + /** + * Construct rewrite matches and queries from permalink structure. + * + * Runs the action '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 'rewrite_rules_array' + * filter on the full rewrite rule array. + * + * There are two ways to manipulate the rewrite rules, one by hooking into + * the '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. + */ + 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(); + + // Default Feed rules - These are require to allow for the direct access files to work with permalink structure starting with %category% + $default_feeds = array( '.*wp-atom.php$' => $this->index . '?feed=atom', + '.*wp-rdf.php$' => $this->index . '?feed=rdf', + '.*wp-rss.php$' => $this->index . '?feed=rss', + '.*wp-rss2.php$' => $this->index . '?feed=rss2', + '.*wp-feed.php$' => $this->index . '?feed=feed', + '.*wp-commentsrss2.php$' => $this->index . '?feed=rss2&withcomments=1'); + + // 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'; + } + + // Post + $post_rewrite = $this->generate_rewrite_rules($this->permalink_structure, EP_PERMALINK); + $post_rewrite = apply_filters('post_rewrite_rules', $post_rewrite); + + // Date + $date_rewrite = $this->generate_rewrite_rules($this->get_date_permastruct(), EP_DATE); + $date_rewrite = apply_filters('date_rewrite_rules', $date_rewrite); + + // Root + $root_rewrite = $this->generate_rewrite_rules($this->root . '/', EP_ROOT); + $root_rewrite = apply_filters('root_rewrite_rules', $root_rewrite); + + // Comments + $comments_rewrite = $this->generate_rewrite_rules($this->root . $this->comments_base, EP_COMMENTS, true, true, true, false); + $comments_rewrite = apply_filters('comments_rewrite_rules', $comments_rewrite); + + // Search + $search_structure = $this->get_search_permastruct(); + $search_rewrite = $this->generate_rewrite_rules($search_structure, EP_SEARCH); + $search_rewrite = apply_filters('search_rewrite_rules', $search_rewrite); + + // Authors + $author_rewrite = $this->generate_rewrite_rules($this->get_author_permastruct(), EP_AUTHORS); + $author_rewrite = apply_filters('author_rewrite_rules', $author_rewrite); + + // Pages + $page_rewrite = $this->page_rewrite_rules(); + $page_rewrite = apply_filters('page_rewrite_rules', $page_rewrite); + + // Extra permastructs + foreach ( $this->extra_permastructs as $permastructname => $permastruct ) { + if ( is_array($permastruct) ) + $rules = $this->generate_rewrite_rules($permastruct[0], $permastruct[1]); + else + $rules = $this->generate_rewrite_rules($permastruct, EP_NONE); + + $rules = apply_filters($permastructname . '_rewrite_rules', $rules); + if ( 'post_tag' == $permastructname ) + $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, $default_feeds, $registration_pages, $page_rewrite, $root_rewrite, $comments_rewrite, $search_rewrite, $author_rewrite, $date_rewrite, $post_rewrite, $this->extra_rules); + else + $this->rules = array_merge($this->extra_rules_top, $robots_rewrite, $default_feeds, $registration_pages, $root_rewrite, $comments_rewrite, $search_rewrite, $author_rewrite, $date_rewrite, $post_rewrite, $page_rewrite, $this->extra_rules); + + do_action_ref_array('generate_rewrite_rules', array(&$this)); + $this->rules = apply_filters('rewrite_rules_array', $this->rules); + + return $this->rules; + } + + /** + * Retrieve the rewrite rules. + * + * The difference between this method and {@link + * 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. + */ + function wp_rewrite_rules() { + $this->rules = get_option('rewrite_rules'); + if ( empty($this->rules) ) { + $this->matches = 'matches'; + $this->rewrite_rules(); + update_option('rewrite_rules', $this->rules); + } + + return $this->rules; + } + + /** + * Retrieve 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 + */ + function mod_rewrite_rules() { + if ( ! $this->using_permalinks() ) + return ''; + + $site_root = parse_url(get_option('siteurl')); + 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 = "\n"; + $rules .= "RewriteEngine On\n"; + $rules .= "RewriteBase $home_root\n"; + $rules .= "RewriteRule ^index\.php$ - [L]\n"; // Prevent -f checks on index.php. + + //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); + + // If the match is unanchored and greedy, prepend rewrite conditions + // to avoid infinite redirects and eclipsing of real files. + //if ($match == '(.+)/?$' || $match == '([^/]+)/?$' ) { + //nada. + //} + + $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 the match is unanchored and greedy, prepend rewrite conditions + // to avoid infinite redirects and eclipsing of real files. + //if ($match == '(.+)/?$' || $match == '([^/]+)/?$' ) { + //nada. + //} + + 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 .= "\n"; + + $rules = apply_filters('mod_rewrite_rules', $rules); + $rules = apply_filters('rewrite_rules', $rules); // Deprecated + + return $rules; + } + + /** + * Retrieve 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 + * + * @return string + */ + function iis7_url_rewrite_rules( $add_parent_tags = false ) { + + if ( ! $this->using_permalinks() ) + return ''; + $rules = ''; + if ( $add_parent_tags ) { + $rules .= ' + + + '; + } + if ( !is_multisite() ) { + $rules .= ' + + + + + + + + '; + } else { + if (is_subdomain_install()) { + $rules .= ' + + + + + + + + + + + + + + + + + + + + '; + } else { + $rules .= ' + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + '; + } + } + if ( $add_parent_tags ) { + $rules .= ' + + + +'; + } + + $rules = apply_filters('iis7_url_rewrite_rules', $rules); + + return $rules; + } + + /** + * Add a straight rewrite rule. + * + * Any value in the $after parameter that isn't 'bottom' will be placed at + * the top of the rules. + * + * @since 2.1.0 + * @access public + * + * @param string $regex Regular expression to match against request. + * @param string $redirect URL regex redirects to when regex matches request. + * @param string $after Optional, default is bottom. Location to place rule. + */ + function add_rule($regex, $redirect, $after = 'bottom') { + //get everything up to the first ? + $index = (strpos($redirect, '?') == false ? strlen($redirect) : strpos($redirect, '?')); + $front = substr($redirect, 0, $index); + if ( $front != $this->index ) { //it doesn't redirect to WP's index.php + $this->add_external_rule($regex, $redirect); + } else { + if ( 'bottom' == $after) + $this->extra_rules = array_merge($this->extra_rules, array($regex => $redirect)); + else + $this->extra_rules_top = array_merge($this->extra_rules_top, array($regex => $redirect)); + //$this->extra_rules[$regex] = $redirect; + } + } + + /** + * Add a rule that doesn't redirect to index.php. + * + * Can redirect to any place. + * + * @since 2.1.0 + * @access public + * + * @param string $regex Regular expression to match against request. + * @param string $redirect URL regex redirects to when regex matches request. + */ + function add_external_rule($regex, $redirect) { + $this->non_wp_rules[$regex] = $redirect; + } + + /** + * Add an endpoint, like /trackback/. + * + * To be inserted after certain URL types (specified in $places). + * + * @since 2.1.0 + * @access public + * + * @param string $name Name of endpoint. + * @param array $places URL types that endpoint can be used. + */ + function add_endpoint($name, $places) { + global $wp; + $this->endpoints[] = array ( $places, $name ); + $wp->add_query_var($name); + } + + /** + * Add permalink structure. + * + * These are added along with the extra rewrite rules that are merged to the + * top. + * + * @since 2.5.0 + * @access public + * + * @param string $name Name for permalink structure. + * @param string $struct Permalink structure. + * @param bool $with_front Prepend front base to permalink structure. + */ + function add_permastruct($name, $struct, $with_front = true, $ep_mask = EP_NONE) { + if ( $with_front ) + $struct = $this->front . $struct; + else + $struct = $this->root . $struct; + $this->extra_permastructs[$name] = array($struct, $ep_mask); + } + + /** + * Remove rewrite rules and then recreate rewrite rules. + * + * Calls {@link 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 + * @param bool $hard Whether to update .htaccess (hard flush) or just update rewrite_rules option (soft flush). Default is true (hard). + */ + function flush_rules($hard = true) { + delete_option('rewrite_rules'); + $this->wp_rewrite_rules(); + if ( $hard && function_exists('save_mod_rewrite_rules') ) + save_mod_rewrite_rules(); + if ( $hard && 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 + */ + 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; + } + + /** + * Set the main permalink structure for the blog. + * + * Will update the 'permalink_structure' option, if there is a difference + * between the current permalink structure and the parameter value. Calls + * {@link WP_Rewrite::init()} after the option is updated. + * + * Fires the '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. + */ + function set_permalink_structure($permalink_structure) { + if ( $permalink_structure != $this->permalink_structure ) { + update_option('permalink_structure', $permalink_structure); + $this->init(); + do_action('permalink_structure_changed', $this->permalink_structure, $permalink_structure); + } + } + + /** + * Set 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 + * {@link WP_Rewrite::init()} after the option is updated. + * + * @since 1.5.0 + * @access public + * + * @param string $category_base Category permalink structure base. + */ + function set_category_base($category_base) { + if ( $category_base != get_option('category_base') ) { + update_option('category_base', $category_base); + $this->init(); + } + } + + /** + * Set 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 + * {@link WP_Rewrite::init()} after the option is updated. + * + * @since 2.3.0 + * @access public + * + * @param string $tag_base Tag permalink structure base. + */ + 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 + * + * @return WP_Rewrite + */ + function __construct() { + $this->init(); + } +} + +?> diff --git a/src/wp-includes/rss-functions.php b/src/wp-includes/rss-functions.php new file mode 100644 index 0000000..ea32692 --- /dev/null +++ b/src/wp-includes/rss-functions.php @@ -0,0 +1,10 @@ + diff --git a/src/wp-includes/rss.php b/src/wp-includes/rss.php new file mode 100644 index 0000000..88bfa62 --- /dev/null +++ b/src/wp-includes/rss.php @@ -0,0 +1,939 @@ + + * @version 0.51 + * @license GPL + * + * @package External + * @subpackage MagpieRSS + */ + +/** + * Deprecated. Use SimplePie (class-simplepie.php) instead. + */ +_deprecated_file( basename( __FILE__ ), '3.0', WPINC . '/class-simplepie.php' ); + +/* + * Hook to use another RSS object instead of MagpieRSS + */ +do_action('load_feed_engine'); + +/** RSS feed constant. */ +define('RSS', 'RSS'); +define('ATOM', 'Atom'); +define('MAGPIE_USER_AGENT', 'WordPress/' . $GLOBALS['wp_version']); + +class MagpieRSS { + var $parser; + var $current_item = array(); // item currently being parsed + var $items = array(); // collection of parsed items + var $channel = array(); // hash of channel fields + var $textinput = array(); + var $image = array(); + var $feed_type; + var $feed_version; + + // parser variables + var $stack = array(); // parser stack + var $inchannel = false; + var $initem = false; + var $incontent = false; // if in Atom field + var $intextinput = false; + var $inimage = false; + var $current_field = ''; + var $current_namespace = false; + + //var $ERROR = ""; + + var $_CONTENT_CONSTRUCTS = array('content', 'summary', 'info', 'title', 'tagline', 'copyright'); + + function MagpieRSS ($source) { + + # if PHP xml isn't compiled in, die + # + if ( !function_exists('xml_parser_create') ) + trigger_error( "Failed to load PHP's XML Extension. http://www.php.net/manual/en/ref.xml.php" ); + + $parser = @xml_parser_create(); + + if ( !is_resource($parser) ) + trigger_error( "Failed to create an instance of PHP's XML parser. http://www.php.net/manual/en/ref.xml.php"); + + + $this->parser = $parser; + + # pass in parser, and a reference to this object + # set up handlers + # + xml_set_object( $this->parser, $this ); + xml_set_element_handler($this->parser, + 'feed_start_element', 'feed_end_element' ); + + xml_set_character_data_handler( $this->parser, 'feed_cdata' ); + + $status = xml_parse( $this->parser, $source ); + + if (! $status ) { + $errorcode = xml_get_error_code( $this->parser ); + if ( $errorcode != XML_ERROR_NONE ) { + $xml_error = xml_error_string( $errorcode ); + $error_line = xml_get_current_line_number($this->parser); + $error_col = xml_get_current_column_number($this->parser); + $errormsg = "$xml_error at line $error_line, column $error_col"; + + $this->error( $errormsg ); + } + } + + xml_parser_free( $this->parser ); + + $this->normalize(); + } + + function feed_start_element($p, $element, &$attrs) { + $el = $element = strtolower($element); + $attrs = array_change_key_case($attrs, CASE_LOWER); + + // check for a namespace, and split if found + $ns = false; + if ( strpos( $element, ':' ) ) { + list($ns, $el) = split( ':', $element, 2); + } + if ( $ns and $ns != 'rdf' ) { + $this->current_namespace = $ns; + } + + # if feed type isn't set, then this is first element of feed + # identify feed from root element + # + if (!isset($this->feed_type) ) { + if ( $el == 'rdf' ) { + $this->feed_type = RSS; + $this->feed_version = '1.0'; + } + elseif ( $el == 'rss' ) { + $this->feed_type = RSS; + $this->feed_version = $attrs['version']; + } + elseif ( $el == 'feed' ) { + $this->feed_type = ATOM; + $this->feed_version = $attrs['version']; + $this->inchannel = true; + } + return; + } + + if ( $el == 'channel' ) + { + $this->inchannel = true; + } + elseif ($el == 'item' or $el == 'entry' ) + { + $this->initem = true; + if ( isset($attrs['rdf:about']) ) { + $this->current_item['about'] = $attrs['rdf:about']; + } + } + + // if we're in the default namespace of an RSS feed, + // record textinput or image fields + elseif ( + $this->feed_type == RSS and + $this->current_namespace == '' and + $el == 'textinput' ) + { + $this->intextinput = true; + } + + elseif ( + $this->feed_type == RSS and + $this->current_namespace == '' and + $el == 'image' ) + { + $this->inimage = true; + } + + # handle atom content constructs + elseif ( $this->feed_type == ATOM and in_array($el, $this->_CONTENT_CONSTRUCTS) ) + { + // avoid clashing w/ RSS mod_content + if ($el == 'content' ) { + $el = 'atom_content'; + } + + $this->incontent = $el; + + + } + + // if inside an Atom content construct (e.g. content or summary) field treat tags as text + elseif ($this->feed_type == ATOM and $this->incontent ) + { + // if tags are inlined, then flatten + $attrs_str = join(' ', + array_map(array('MagpieRSS', 'map_attrs'), + array_keys($attrs), + array_values($attrs) ) ); + + $this->append_content( "<$element $attrs_str>" ); + + array_unshift( $this->stack, $el ); + } + + // Atom support many links per containging element. + // Magpie treats link elements of type rel='alternate' + // as being equivalent to RSS's simple link element. + // + elseif ($this->feed_type == ATOM and $el == 'link' ) + { + if ( isset($attrs['rel']) and $attrs['rel'] == 'alternate' ) + { + $link_el = 'link'; + } + else { + $link_el = 'link_' . $attrs['rel']; + } + + $this->append($link_el, $attrs['href']); + } + // set stack[0] to current element + else { + array_unshift($this->stack, $el); + } + } + + + + function feed_cdata ($p, $text) { + + if ($this->feed_type == ATOM and $this->incontent) + { + $this->append_content( $text ); + } + else { + $current_el = join('_', array_reverse($this->stack)); + $this->append($current_el, $text); + } + } + + function feed_end_element ($p, $el) { + $el = strtolower($el); + + if ( $el == 'item' or $el == 'entry' ) + { + $this->items[] = $this->current_item; + $this->current_item = array(); + $this->initem = false; + } + elseif ($this->feed_type == RSS and $this->current_namespace == '' and $el == 'textinput' ) + { + $this->intextinput = false; + } + elseif ($this->feed_type == RSS and $this->current_namespace == '' and $el == 'image' ) + { + $this->inimage = false; + } + elseif ($this->feed_type == ATOM and in_array($el, $this->_CONTENT_CONSTRUCTS) ) + { + $this->incontent = false; + } + elseif ($el == 'channel' or $el == 'feed' ) + { + $this->inchannel = false; + } + elseif ($this->feed_type == ATOM and $this->incontent ) { + // balance tags properly + // note: i don't think this is actually neccessary + if ( $this->stack[0] == $el ) + { + $this->append_content(""); + } + else { + $this->append_content("<$el />"); + } + + array_shift( $this->stack ); + } + else { + array_shift( $this->stack ); + } + + $this->current_namespace = false; + } + + function concat (&$str1, $str2="") { + if (!isset($str1) ) { + $str1=""; + } + $str1 .= $str2; + } + + function append_content($text) { + if ( $this->initem ) { + $this->concat( $this->current_item[ $this->incontent ], $text ); + } + elseif ( $this->inchannel ) { + $this->concat( $this->channel[ $this->incontent ], $text ); + } + } + + // smart append - field and namespace aware + function append($el, $text) { + if (!$el) { + return; + } + if ( $this->current_namespace ) + { + if ( $this->initem ) { + $this->concat( + $this->current_item[ $this->current_namespace ][ $el ], $text); + } + elseif ($this->inchannel) { + $this->concat( + $this->channel[ $this->current_namespace][ $el ], $text ); + } + elseif ($this->intextinput) { + $this->concat( + $this->textinput[ $this->current_namespace][ $el ], $text ); + } + elseif ($this->inimage) { + $this->concat( + $this->image[ $this->current_namespace ][ $el ], $text ); + } + } + else { + if ( $this->initem ) { + $this->concat( + $this->current_item[ $el ], $text); + } + elseif ($this->intextinput) { + $this->concat( + $this->textinput[ $el ], $text ); + } + elseif ($this->inimage) { + $this->concat( + $this->image[ $el ], $text ); + } + elseif ($this->inchannel) { + $this->concat( + $this->channel[ $el ], $text ); + } + + } + } + + function normalize () { + // if atom populate rss fields + if ( $this->is_atom() ) { + $this->channel['descripton'] = $this->channel['tagline']; + for ( $i = 0; $i < count($this->items); $i++) { + $item = $this->items[$i]; + if ( isset($item['summary']) ) + $item['description'] = $item['summary']; + if ( isset($item['atom_content'])) + $item['content']['encoded'] = $item['atom_content']; + + $this->items[$i] = $item; + } + } + elseif ( $this->is_rss() ) { + $this->channel['tagline'] = $this->channel['description']; + for ( $i = 0; $i < count($this->items); $i++) { + $item = $this->items[$i]; + if ( isset($item['description'])) + $item['summary'] = $item['description']; + if ( isset($item['content']['encoded'] ) ) + $item['atom_content'] = $item['content']['encoded']; + + $this->items[$i] = $item; + } + } + } + + function is_rss () { + if ( $this->feed_type == RSS ) { + return $this->feed_version; + } + else { + return false; + } + } + + function is_atom() { + if ( $this->feed_type == ATOM ) { + return $this->feed_version; + } + else { + return false; + } + } + + function map_attrs($k, $v) { + return "$k=\"$v\""; + } + + function error( $errormsg, $lvl = E_USER_WARNING ) { + // append PHP's error message if track_errors enabled + if ( isset($php_errormsg) ) { + $errormsg .= " ($php_errormsg)"; + } + if ( MAGPIE_DEBUG ) { + trigger_error( $errormsg, $lvl); + } else { + error_log( $errormsg, 0); + } + } + +} + +if ( !function_exists('fetch_rss') ) : +/** + * Build Magpie object based on RSS from URL. + * + * @since 1.5.0 + * @package External + * @subpackage MagpieRSS + * + * @param string $url URL to retrieve feed + * @return bool|MagpieRSS false on failure or MagpieRSS object on success. + */ +function fetch_rss ($url) { + // initialize constants + init(); + + if ( !isset($url) ) { + // error("fetch_rss called without a url"); + return false; + } + + // if cache is disabled + if ( !MAGPIE_CACHE_ON ) { + // fetch file, and parse it + $resp = _fetch_remote_file( $url ); + if ( is_success( $resp->status ) ) { + return _response_to_rss( $resp ); + } + else { + // error("Failed to fetch $url and cache is off"); + return false; + } + } + // else cache is ON + else { + // Flow + // 1. check cache + // 2. if there is a hit, make sure its fresh + // 3. if cached obj fails freshness check, fetch remote + // 4. if remote fails, return stale object, or error + + $cache = new RSSCache( MAGPIE_CACHE_DIR, MAGPIE_CACHE_AGE ); + + if (MAGPIE_DEBUG and $cache->ERROR) { + debug($cache->ERROR, E_USER_WARNING); + } + + + $cache_status = 0; // response of check_cache + $request_headers = array(); // HTTP headers to send with fetch + $rss = 0; // parsed RSS object + $errormsg = 0; // errors, if any + + if (!$cache->ERROR) { + // return cache HIT, MISS, or STALE + $cache_status = $cache->check_cache( $url ); + } + + // if object cached, and cache is fresh, return cached obj + if ( $cache_status == 'HIT' ) { + $rss = $cache->get( $url ); + if ( isset($rss) and $rss ) { + $rss->from_cache = 1; + if ( MAGPIE_DEBUG > 1) { + debug("MagpieRSS: Cache HIT", E_USER_NOTICE); + } + return $rss; + } + } + + // else attempt a conditional get + + // set up headers + if ( $cache_status == 'STALE' ) { + $rss = $cache->get( $url ); + if ( isset($rss->etag) and $rss->last_modified ) { + $request_headers['If-None-Match'] = $rss->etag; + $request_headers['If-Last-Modified'] = $rss->last_modified; + } + } + + $resp = _fetch_remote_file( $url, $request_headers ); + + if (isset($resp) and $resp) { + if ($resp->status == '304' ) { + // we have the most current copy + if ( MAGPIE_DEBUG > 1) { + debug("Got 304 for $url"); + } + // reset cache on 304 (at minutillo insistent prodding) + $cache->set($url, $rss); + return $rss; + } + elseif ( is_success( $resp->status ) ) { + $rss = _response_to_rss( $resp ); + if ( $rss ) { + if (MAGPIE_DEBUG > 1) { + debug("Fetch successful"); + } + // add object to cache + $cache->set( $url, $rss ); + return $rss; + } + } + else { + $errormsg = "Failed to fetch $url. "; + if ( $resp->error ) { + # compensate for Snoopy's annoying habbit to tacking + # on '\n' + $http_error = substr($resp->error, 0, -2); + $errormsg .= "(HTTP Error: $http_error)"; + } + else { + $errormsg .= "(HTTP Response: " . $resp->response_code .')'; + } + } + } + else { + $errormsg = "Unable to retrieve RSS file for unknown reasons."; + } + + // else fetch failed + + // attempt to return cached object + if ($rss) { + if ( MAGPIE_DEBUG ) { + debug("Returning STALE object for $url"); + } + return $rss; + } + + // else we totally failed + // error( $errormsg ); + + return false; + + } // end if ( !MAGPIE_CACHE_ON ) { +} // end fetch_rss() +endif; + +/** + * Retrieve URL headers and content using WP HTTP Request API. + * + * @since 1.5.0 + * @package External + * @subpackage MagpieRSS + * + * @param string $url URL to retrieve + * @param array $headers Optional. Headers to send to the URL. + * @return Snoopy style response + */ +function _fetch_remote_file($url, $headers = "" ) { + $resp = wp_remote_request($url, array('headers' => $headers, 'timeout' => MAGPIE_FETCH_TIME_OUT)); + if ( is_wp_error($resp) ) { + $error = array_shift($resp->errors); + + $resp = new stdClass; + $resp->status = 500; + $resp->response_code = 500; + $resp->error = $error[0] . "\n"; //\n = Snoopy compatibility + return $resp; + } + + // Snoopy returns headers unprocessed. + // Also note, WP_HTTP lowercases all keys, Snoopy did not. + $return_headers = array(); + foreach ( wp_remote_retrieve_headers( $resp ) as $key => $value ) { + if ( !is_array($value) ) { + $return_headers[] = "$key: $value"; + } else { + foreach ( $value as $v ) + $return_headers[] = "$key: $v"; + } + } + + $response = new stdClass; + $response->status = wp_remote_retrieve_response_code( $resp ); + $response->response_code = wp_remote_retrieve_response_code( $resp ); + $response->headers = $return_headers; + $response->results = wp_remote_retrieve_body( $resp ); + + return $response; +} + +/** + * Retrieve + * + * @since 1.5.0 + * @package External + * @subpackage MagpieRSS + * + * @param unknown_type $resp + * @return unknown + */ +function _response_to_rss ($resp) { + $rss = new MagpieRSS( $resp->results ); + + // if RSS parsed successfully + if ( $rss && (!isset($rss->ERROR) || !$rss->ERROR) ) { + + // find Etag, and Last-Modified + foreach( (array) $resp->headers as $h) { + // 2003-03-02 - Nicola Asuni (www.tecnick.com) - fixed bug "Undefined offset: 1" + if (strpos($h, ": ")) { + list($field, $val) = explode(": ", $h, 2); + } + else { + $field = $h; + $val = ""; + } + + if ( $field == 'etag' ) { + $rss->etag = $val; + } + + if ( $field == 'last-modified' ) { + $rss->last_modified = $val; + } + } + + return $rss; + } // else construct error message + else { + $errormsg = "Failed to parse RSS file."; + + if ($rss) { + $errormsg .= " (" . $rss->ERROR . ")"; + } + // error($errormsg); + + return false; + } // end if ($rss and !$rss->error) +} + +/** + * Set up constants with default values, unless user overrides. + * + * @since 1.5.0 + * @package External + * @subpackage MagpieRSS + */ +function init () { + if ( defined('MAGPIE_INITALIZED') ) { + return; + } + else { + define('MAGPIE_INITALIZED', 1); + } + + if ( !defined('MAGPIE_CACHE_ON') ) { + define('MAGPIE_CACHE_ON', 1); + } + + if ( !defined('MAGPIE_CACHE_DIR') ) { + define('MAGPIE_CACHE_DIR', './cache'); + } + + if ( !defined('MAGPIE_CACHE_AGE') ) { + define('MAGPIE_CACHE_AGE', 60*60); // one hour + } + + if ( !defined('MAGPIE_CACHE_FRESH_ONLY') ) { + define('MAGPIE_CACHE_FRESH_ONLY', 0); + } + + if ( !defined('MAGPIE_DEBUG') ) { + define('MAGPIE_DEBUG', 0); + } + + if ( !defined('MAGPIE_USER_AGENT') ) { + $ua = 'WordPress/' . $GLOBALS['wp_version']; + + if ( MAGPIE_CACHE_ON ) { + $ua = $ua . ')'; + } + else { + $ua = $ua . '; No cache)'; + } + + define('MAGPIE_USER_AGENT', $ua); + } + + if ( !defined('MAGPIE_FETCH_TIME_OUT') ) { + define('MAGPIE_FETCH_TIME_OUT', 2); // 2 second timeout + } + + // use gzip encoding to fetch rss files if supported? + if ( !defined('MAGPIE_USE_GZIP') ) { + define('MAGPIE_USE_GZIP', true); + } +} + +function is_info ($sc) { + return $sc >= 100 && $sc < 200; +} + +function is_success ($sc) { + return $sc >= 200 && $sc < 300; +} + +function is_redirect ($sc) { + return $sc >= 300 && $sc < 400; +} + +function is_error ($sc) { + return $sc >= 400 && $sc < 600; +} + +function is_client_error ($sc) { + return $sc >= 400 && $sc < 500; +} + +function is_server_error ($sc) { + return $sc >= 500 && $sc < 600; +} + +class RSSCache { + var $BASE_CACHE; // where the cache files are stored + var $MAX_AGE = 43200; // when are files stale, default twelve hours + var $ERROR = ''; // accumulate error messages + + function RSSCache ($base='', $age='') { + $this->BASE_CACHE = WP_CONTENT_DIR . '/cache'; + if ( $base ) { + $this->BASE_CACHE = $base; + } + if ( $age ) { + $this->MAX_AGE = $age; + } + + } + +/*=======================================================================*\ + Function: set + Purpose: add an item to the cache, keyed on url + Input: url from wich the rss file was fetched + Output: true on sucess +\*=======================================================================*/ + function set ($url, $rss) { + $cache_option = 'rss_' . $this->file_name( $url ); + + set_transient($cache_option, $rss, $this->MAX_AGE); + + return $cache_option; + } + +/*=======================================================================*\ + Function: get + Purpose: fetch an item from the cache + Input: url from wich the rss file was fetched + Output: cached object on HIT, false on MISS +\*=======================================================================*/ + function get ($url) { + $this->ERROR = ""; + $cache_option = 'rss_' . $this->file_name( $url ); + + if ( ! $rss = get_transient( $cache_option ) ) { + $this->debug( + "Cache doesn't contain: $url (cache option: $cache_option)" + ); + return 0; + } + + return $rss; + } + +/*=======================================================================*\ + Function: check_cache + Purpose: check a url for membership in the cache + and whether the object is older then MAX_AGE (ie. STALE) + Input: url from wich the rss file was fetched + Output: cached object on HIT, false on MISS +\*=======================================================================*/ + function check_cache ( $url ) { + $this->ERROR = ""; + $cache_option = 'rss_' . $this->file_name( $url ); + + if ( get_transient($cache_option) ) { + // object exists and is current + return 'HIT'; + } else { + // object does not exist + return 'MISS'; + } + } + +/*=======================================================================*\ + Function: serialize +\*=======================================================================*/ + function serialize ( $rss ) { + return serialize( $rss ); + } + +/*=======================================================================*\ + Function: unserialize +\*=======================================================================*/ + function unserialize ( $data ) { + return unserialize( $data ); + } + +/*=======================================================================*\ + Function: file_name + Purpose: map url to location in cache + Input: url from wich the rss file was fetched + Output: a file name +\*=======================================================================*/ + function file_name ($url) { + return md5( $url ); + } + +/*=======================================================================*\ + Function: error + Purpose: register error +\*=======================================================================*/ + function error ($errormsg, $lvl=E_USER_WARNING) { + // append PHP's error message if track_errors enabled + if ( isset($php_errormsg) ) { + $errormsg .= " ($php_errormsg)"; + } + $this->ERROR = $errormsg; + if ( MAGPIE_DEBUG ) { + trigger_error( $errormsg, $lvl); + } + else { + error_log( $errormsg, 0); + } + } + function debug ($debugmsg, $lvl=E_USER_NOTICE) { + if ( MAGPIE_DEBUG ) { + $this->error("MagpieRSS [debug] $debugmsg", $lvl); + } + } +} + +if ( !function_exists('parse_w3cdtf') ) : +function parse_w3cdtf ( $date_str ) { + + # regex to match wc3dtf + $pat = "/(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2})(:(\d{2}))?(?:([-+])(\d{2}):?(\d{2})|(Z))?/"; + + if ( preg_match( $pat, $date_str, $match ) ) { + list( $year, $month, $day, $hours, $minutes, $seconds) = + array( $match[1], $match[2], $match[3], $match[4], $match[5], $match[7]); + + # calc epoch for current date assuming GMT + $epoch = gmmktime( $hours, $minutes, $seconds, $month, $day, $year); + + $offset = 0; + if ( $match[11] == 'Z' ) { + # zulu time, aka GMT + } + else { + list( $tz_mod, $tz_hour, $tz_min ) = + array( $match[8], $match[9], $match[10]); + + # zero out the variables + if ( ! $tz_hour ) { $tz_hour = 0; } + if ( ! $tz_min ) { $tz_min = 0; } + + $offset_secs = (($tz_hour*60)+$tz_min)*60; + + # is timezone ahead of GMT? then subtract offset + # + if ( $tz_mod == '+' ) { + $offset_secs = $offset_secs * -1; + } + + $offset = $offset_secs; + } + $epoch = $epoch + $offset; + return $epoch; + } + else { + return -1; + } +} +endif; + +if ( !function_exists('wp_rss') ) : +/** + * Display all RSS items in a HTML ordered list. + * + * @since 1.5.0 + * @package External + * @subpackage MagpieRSS + * + * @param string $url URL of feed to display. Will not auto sense feed URL. + * @param int $num_items Optional. Number of items to display, default is all. + */ +function wp_rss( $url, $num_items = -1 ) { + if ( $rss = fetch_rss( $url ) ) { + echo '
      '; + + if ( $num_items !== -1 ) { + $rss->items = array_slice( $rss->items, 0, $num_items ); + } + + foreach ( (array) $rss->items as $item ) { + printf( + '
    • %3$s
    • ', + esc_url( $item['link'] ), + esc_attr( strip_tags( $item['description'] ) ), + esc_html( $item['title'] ) + ); + } + + echo '
    '; + } else { + _e( 'An error has occurred, which probably means the feed is down. Try again later.' ); + } +} +endif; + +if ( !function_exists('get_rss') ) : +/** + * Display RSS items in HTML list items. + * + * You have to specify which HTML list you want, either ordered or unordered + * before using the function. You also have to specify how many items you wish + * to display. You can't display all of them like you can with wp_rss() + * function. + * + * @since 1.5.0 + * @package External + * @subpackage MagpieRSS + * + * @param string $url URL of feed to display. Will not auto sense feed URL. + * @param int $num_items Optional. Number of items to display, default is all. + * @return bool False on failure. + */ +function get_rss ($url, $num_items = 5) { // Like get posts, but for RSS + $rss = fetch_rss($url); + if ( $rss ) { + $rss->items = array_slice($rss->items, 0, $num_items); + foreach ( (array) $rss->items as $item ) { + echo "
  • \n"; + echo ""; + echo esc_html($item['title']); + echo "
    \n"; + echo "
  • \n"; + } + } else { + return false; + } +} +endif; + +?> diff --git a/src/wp-includes/script-loader.php b/src/wp-includes/script-loader.php new file mode 100644 index 0000000..1111237 --- /dev/null +++ b/src/wp-includes/script-loader.php @@ -0,0 +1,801 @@ +add_data( 'script-handle', 'group', 1 ); queues the script for the footer + * + * @since 2.6.0 + * + * @param object $scripts WP_Scripts object. + */ +function wp_default_scripts( &$scripts ) { + + if ( !$guessurl = site_url() ) + $guessurl = wp_guess_url(); + + $scripts->base_url = $guessurl; + $scripts->content_url = defined('WP_CONTENT_URL')? WP_CONTENT_URL : ''; + $scripts->default_version = get_bloginfo( 'version' ); + $scripts->default_dirs = array('/wp-admin/js/', '/wp-includes/js/'); + + $suffix = defined('SCRIPT_DEBUG') && SCRIPT_DEBUG ? '.dev' : ''; + + // Always ensure that we have the convertEntities function + $scripts->add( 'l10n', "/wp-includes/js/l10n$suffix.js", false, '20101110' ); + $scripts->enqueue( 'l10n' ); + + $scripts->add( 'utils', "/wp-admin/js/utils$suffix.js", false, '20101110' ); + + $scripts->add( 'common', "/wp-admin/js/common$suffix.js", array('jquery', 'hoverIntent', 'utils'), '20110610' ); + $scripts->add_data( 'common', 'group', 1 ); + $scripts->localize( 'common', 'commonL10n', array( + 'warnDelete' => __("You are about to permanently delete the selected items.\n 'Cancel' to stop, 'OK' to delete."), + 'l10n_print_after' => 'try{convertEntities(commonL10n);}catch(e){};' + ) ); + + $scripts->add( 'sack', "/wp-includes/js/tw-sack$suffix.js", false, '1.6.1' ); + $scripts->add_data( 'sack', 'group', 1 ); + + $scripts->add( 'quicktags', "/wp-includes/js/quicktags$suffix.js", false, '20110502' ); + $scripts->add_data( 'quicktags', 'group', 1 ); + $scripts->localize( 'quicktags', 'quicktagsL10n', array( + 'quickLinks' => __('(Quick Links)'), + 'wordLookup' => __('Enter a word to look up:'), + 'dictionaryLookup' => esc_attr(__('Dictionary lookup')), + 'lookup' => esc_attr(__('lookup')), + 'closeAllOpenTags' => esc_attr(__('Close all open tags')), + 'closeTags' => esc_attr(__('close tags')), + 'enterURL' => __('Enter the URL'), + 'enterImageURL' => __('Enter the URL of the image'), + 'enterImageDescription' => __('Enter a description of the image'), + 'fullscreen' => __('fullscreen'), + 'toggleFullscreen' => esc_attr( __('Toggle fullscreen mode') ), + 'l10n_print_after' => 'try{convertEntities(quicktagsL10n);}catch(e){};' + ) ); + + $scripts->add( 'colorpicker', "/wp-includes/js/colorpicker$suffix.js", array('prototype'), '3517m' ); + + $scripts->add( 'editor', "/wp-admin/js/editor$suffix.js", array('utils','jquery'), '20110411' ); + $scripts->add_data( 'editor', 'group', 1 ); + + $scripts->add( 'wp-fullscreen', "/wp-admin/js/wp-fullscreen$suffix.js", array('jquery'), '20110704' ); + $scripts->add_data( 'wp-fullscreen', 'group', 1 ); + + $scripts->add( 'prototype', '/wp-includes/js/prototype.js', false, '1.6.1'); + + $scripts->add( 'wp-ajax-response', "/wp-includes/js/wp-ajax-response$suffix.js", array('jquery'), '20091119' ); + $scripts->add_data( 'wp-ajax-response', 'group', 1 ); + $scripts->localize( 'wp-ajax-response', 'wpAjax', array( + 'noPerm' => __('You do not have permission to do that.'), + 'broken' => __('An unidentified error has occurred.'), + 'l10n_print_after' => 'try{convertEntities(wpAjax);}catch(e){};' + ) ); + + $scripts->add( 'autosave', "/wp-includes/js/autosave$suffix.js", array('schedule', 'wp-ajax-response'), '20110524' ); + $scripts->add_data( 'autosave', 'group', 1 ); + + $scripts->add( 'wp-lists', "/wp-includes/js/wp-lists$suffix.js", array('wp-ajax-response'), '20110521' ); + $scripts->add_data( 'wp-lists', 'group', 1 ); + + $scripts->add( 'scriptaculous-root', '/wp-includes/js/scriptaculous/wp-scriptaculous.js', array('prototype'), '1.8.3'); + $scripts->add( 'scriptaculous-builder', '/wp-includes/js/scriptaculous/builder.js', array('scriptaculous-root'), '1.8.3'); + $scripts->add( 'scriptaculous-dragdrop', '/wp-includes/js/scriptaculous/dragdrop.js', array('scriptaculous-builder', 'scriptaculous-effects'), '1.8.3'); + $scripts->add( 'scriptaculous-effects', '/wp-includes/js/scriptaculous/effects.js', array('scriptaculous-root'), '1.8.3'); + $scripts->add( 'scriptaculous-slider', '/wp-includes/js/scriptaculous/slider.js', array('scriptaculous-effects'), '1.8.3'); + $scripts->add( 'scriptaculous-sound', '/wp-includes/js/scriptaculous/sound.js', array( 'scriptaculous-root' ), '1.8.3' ); + $scripts->add( 'scriptaculous-controls', '/wp-includes/js/scriptaculous/controls.js', array('scriptaculous-root'), '1.8.3'); + $scripts->add( 'scriptaculous', '', array('scriptaculous-dragdrop', 'scriptaculous-slider', 'scriptaculous-controls'), '1.8.3'); + + // not used in core, replaced by Jcrop.js + $scripts->add( 'cropper', '/wp-includes/js/crop/cropper.js', array('scriptaculous-dragdrop'), '20070118'); + + $scripts->add( 'jquery', '/wp-includes/js/jquery/jquery.js', false, '1.6.1'); + + $scripts->add( 'jquery-ui-core', '/wp-includes/js/jquery/ui.core.js', array('jquery'), '1.8.12' ); + $scripts->add_data( 'jquery-ui-core', 'group', 1 ); + + $scripts->add( 'jquery-ui-position', '/wp-includes/js/jquery/ui.position.js', array('jquery-ui-core'), '1.8.12' ); + $scripts->add_data( 'jquery-ui-position', 'group', 1 ); + + $scripts->add( 'jquery-ui-widget', '/wp-includes/js/jquery/ui.widget.js', array('jquery-ui-core'), '1.8.12' ); + $scripts->add_data( 'jquery-ui-widget', 'group', 1 ); + + $scripts->add( 'jquery-ui-mouse', '/wp-includes/js/jquery/ui.mouse.js', array('jquery-ui-widget'), '1.8.12' ); + $scripts->add_data( 'jquery-ui-mouse', 'group', 1 ); + + $scripts->add( 'jquery-ui-button', '/wp-includes/js/jquery/ui.button.js', array('jquery-ui-core', 'jquery-ui-widget'), '1.8.12' ); + $scripts->add_data( 'jquery-ui-button', 'group', 1 ); + + $scripts->add( 'jquery-ui-tabs', '/wp-includes/js/jquery/ui.tabs.js', array('jquery-ui-core', 'jquery-ui-widget'), '1.8.12' ); + $scripts->add_data( 'jquery-ui-tabs', 'group', 1 ); + + $scripts->add( 'jquery-ui-sortable', '/wp-includes/js/jquery/ui.sortable.js', array('jquery-ui-core', 'jquery-ui-mouse'), '1.8.12' ); + $scripts->add_data( 'jquery-ui-sortable', 'group', 1 ); + + $scripts->add( 'jquery-ui-draggable', '/wp-includes/js/jquery/ui.draggable.js', array('jquery-ui-core', 'jquery-ui-mouse'), '1.8.12' ); + $scripts->add_data( 'jquery-ui-draggable', 'group', 1 ); + + $scripts->add( 'jquery-ui-droppable', '/wp-includes/js/jquery/ui.droppable.js', array('jquery-ui-core', 'jquery-ui-mouse', 'jquery-ui-draggable'), '1.8.12' ); + $scripts->add_data( 'jquery-ui-droppable', 'group', 1 ); + + $scripts->add( 'jquery-ui-selectable', '/wp-includes/js/jquery/ui.selectable.js', array('jquery-ui-core', 'jquery-ui-mouse'), '1.8.12' ); + $scripts->add_data( 'jquery-ui-selectable', 'group', 1 ); + + $scripts->add( 'jquery-ui-resizable', '/wp-includes/js/jquery/ui.resizable.js', array('jquery-ui-core', 'jquery-ui-mouse'), '1.8.12' ); + $scripts->add_data( 'jquery-ui-resizable', 'group', 1 ); + + $scripts->add( 'jquery-ui-dialog', '/wp-includes/js/jquery/ui.dialog.js', array('jquery-ui-resizable', 'jquery-ui-draggable', 'jquery-ui-button', 'jquery-ui-position'), '1.8.12' ); + $scripts->add_data( 'jquery-ui-dialog', 'group', 1 ); + + // deprecated, not used in core, most functionality is included in jQuery 1.3 + $scripts->add( 'jquery-form', "/wp-includes/js/jquery/jquery.form$suffix.js", array('jquery'), '2.73'); + $scripts->add_data( 'jquery-form', 'group', 1 ); + + $scripts->add( 'jquery-color', "/wp-includes/js/jquery/jquery.color$suffix.js", array('jquery'), '2.0-4561m'); + $scripts->add_data( 'jquery-color', 'group', 1 ); + + $scripts->add( 'suggest', "/wp-includes/js/jquery/suggest$suffix.js", array('jquery'), '1.1-20110113'); + $scripts->add_data( 'suggest', 'group', 1 ); + + $scripts->add( 'schedule', '/wp-includes/js/jquery/jquery.schedule.js', array('jquery'), '20m'); + $scripts->add_data( 'schedule', 'group', 1 ); + + $scripts->add( 'jquery-query', "/wp-includes/js/jquery/jquery.query.js", array('jquery'), '2.1.7' ); + $scripts->add_data( 'jquery-query', 'group', 1 ); + + $scripts->add( 'jquery-serialize-object', "/wp-includes/js/jquery/jquery.serialize-object.js", array('jquery'), '0.2' ); + $scripts->add_data( 'jquery-serialize-object', 'group', 1 ); + + $scripts->add( 'jquery-hotkeys', "/wp-includes/js/jquery/jquery.hotkeys$suffix.js", array('jquery'), '0.0.2m' ); + $scripts->add_data( 'jquery-hotkeys', 'group', 1 ); + + $scripts->add( 'jquery-table-hotkeys', "/wp-includes/js/jquery/jquery.table-hotkeys$suffix.js", array('jquery', 'jquery-hotkeys'), '20090102' ); + $scripts->add_data( 'jquery-table-hotkeys', 'group', 1 ); + + $scripts->add( 'thickbox', "/wp-includes/js/thickbox/thickbox.js", array('jquery'), '3.1-20110528'); + $scripts->add_data( 'thickbox', 'group', 1 ); + $scripts->localize( 'thickbox', 'thickboxL10n', array( + 'next' => __('Next >'), + 'prev' => __('< Prev'), + 'image' => __('Image'), + 'of' => __('of'), + 'close' => __('Close'), + 'noiframes' => __('This feature requires inline frames. You have iframes disabled or your browser does not support them.'), + 'loadingAnimation' => includes_url('js/thickbox/loadingAnimation.gif'), + 'closeImage' => includes_url('js/thickbox/tb-close.png'), + 'l10n_print_after' => 'try{convertEntities(thickboxL10n);}catch(e){};' + ) ); + + $scripts->add( 'jcrop', "/wp-includes/js/jcrop/jquery.Jcrop$suffix.js", array('jquery'), '0.9.8-20110113'); + + $scripts->add( 'swfobject', "/wp-includes/js/swfobject.js", false, '2.2'); + + $scripts->add( 'swfupload', '/wp-includes/js/swfupload/swfupload.js', false, '2201-20110113'); + $scripts->add( 'swfupload-swfobject', '/wp-includes/js/swfupload/plugins/swfupload.swfobject.js', array('swfupload', 'swfobject'), '2201a'); + $scripts->add( 'swfupload-queue', '/wp-includes/js/swfupload/plugins/swfupload.queue.js', array('swfupload'), '2201'); + $scripts->add( 'swfupload-speed', '/wp-includes/js/swfupload/plugins/swfupload.speed.js', array('swfupload'), '2201'); + + if ( defined('SCRIPT_DEBUG') && SCRIPT_DEBUG ) { + // queue all SWFUpload scripts that are used by default + $scripts->add( 'swfupload-all', false, array('swfupload', 'swfupload-swfobject', 'swfupload-queue'), '2201'); + } else { + $scripts->add( 'swfupload-all', '/wp-includes/js/swfupload/swfupload-all.js', array(), '2201a'); + } + + $scripts->add( 'swfupload-handlers', "/wp-includes/js/swfupload/handlers$suffix.js", array('swfupload-all', 'jquery'), '2201-20110524'); + $max_upload_size = ( (int) ( $max_up = @ini_get('upload_max_filesize') ) < (int) ( $max_post = @ini_get('post_max_size') ) ) ? $max_up : $max_post; + if ( empty($max_upload_size) ) + $max_upload_size = __('not configured'); + // these error messages came from the sample swfupload js, they might need changing. + $scripts->localize( 'swfupload-handlers', 'swfuploadL10n', array( + 'queue_limit_exceeded' => __('You have attempted to queue too many files.'), + 'file_exceeds_size_limit' => __('This file exceeds the maximum upload size for this site.'), + 'zero_byte_file' => __('This file is empty. Please try another.'), + 'invalid_filetype' => __('This file type is not allowed. Please try another.'), + 'default_error' => __('An error occurred in the upload. Please try again later.'), + 'missing_upload_url' => __('There was a configuration error. Please contact the server administrator.'), + 'upload_limit_exceeded' => __('You may only upload 1 file.'), + 'http_error' => __('HTTP error.'), + 'upload_failed' => __('Upload failed.'), + 'io_error' => __('IO error.'), + 'security_error' => __('Security error.'), + 'file_cancelled' => __('File canceled.'), + 'upload_stopped' => __('Upload stopped.'), + 'dismiss' => __('Dismiss'), + 'crunching' => __('Crunching…'), + 'deleted' => __('moved to the trash.'), + 'error_uploading' => __('“%s” has failed to upload due to an error'), + 'l10n_print_after' => 'try{convertEntities(swfuploadL10n);}catch(e){};', + ) ); + + $scripts->add( 'comment-reply', "/wp-includes/js/comment-reply$suffix.js", false, '20090102'); + + $scripts->add( 'json2', "/wp-includes/js/json2$suffix.js", false, '2011-02-23'); + + $scripts->add( 'imgareaselect', "/wp-includes/js/imgareaselect/jquery.imgareaselect$suffix.js", array('jquery'), '0.9.6-20110515' ); + $scripts->add_data( 'imgareaselect', 'group', 1 ); + + $scripts->add( 'password-strength-meter', "/wp-admin/js/password-strength-meter$suffix.js", array('jquery'), '20101027' ); + $scripts->add_data( 'password-strength-meter', 'group', 1 ); + $scripts->localize( 'password-strength-meter', 'pwsL10n', array( + 'empty' => __('Strength indicator'), + 'short' => __('Very weak'), + 'bad' => __('Weak'), + /* translators: password strength */ + 'good' => _x('Medium', 'password strength'), + 'strong' => __('Strong'), + 'mismatch' => __('Mismatch'), + 'l10n_print_after' => 'try{convertEntities(pwsL10n);}catch(e){};' + ) ); + + $scripts->add( 'user-profile', "/wp-admin/js/user-profile$suffix.js", array( 'jquery', 'password-strength-meter' ), '20110628' ); + $scripts->add_data( 'user-profile', 'group', 1 ); + + $scripts->add( 'admin-bar', "/wp-includes/js/admin-bar$suffix.js", false, '20110131' ); + $scripts->add_data( 'admin-bar', 'group', 1 ); + + $scripts->add( 'wplink', "/wp-includes/js/tinymce/plugins/wplink/js/wplink$suffix.js", array( 'jquery', 'wpdialogs' ), '20110528' ); + $scripts->add_data( 'wplink', 'group', 1 ); + $scripts->localize( 'wplink', 'wpLinkL10n', array( + 'title' => __('Insert/edit link'), + 'update' => __('Update'), + 'save' => __('Add Link'), + 'noTitle' => __('(no title)'), + 'noMatchesFound' => __('No matches found.'), + 'l10n_print_after' => 'try{convertEntities(wpLinkL10n);}catch(e){};', + ) ); + + $scripts->add( 'wpdialogs', "/wp-includes/js/tinymce/plugins/wpdialogs/js/wpdialog$suffix.js", array( 'jquery-ui-dialog' ), '20110528' ); + $scripts->add_data( 'wpdialogs', 'group', 1 ); + + $scripts->add( 'wpdialogs-popup', "/wp-includes/js/tinymce/plugins/wpdialogs/js/popup$suffix.js", array( 'wpdialogs' ), '20110421' ); + $scripts->add_data( 'wpdialogs-popup', 'group', 1 ); + + if ( is_admin() ) { + $scripts->add( 'ajaxcat', "/wp-admin/js/cat$suffix.js", array( 'wp-lists' ), '20090102' ); + $scripts->add_data( 'ajaxcat', 'group', 1 ); + $scripts->localize( 'ajaxcat', 'catL10n', array( + 'add' => esc_attr(__('Add')), + 'how' => __('Separate multiple categories with commas.'), + 'l10n_print_after' => 'try{convertEntities(catL10n);}catch(e){};' + ) ); + + $scripts->add( 'admin-categories', "/wp-admin/js/categories$suffix.js", array('wp-lists'), '20091201' ); + $scripts->add_data( 'admin-categories', 'group', 1 ); + + $scripts->add( 'admin-tags', "/wp-admin/js/tags$suffix.js", array('jquery', 'wp-ajax-response'), '20110429' ); + $scripts->add_data( 'admin-tags', 'group', 1 ); + $scripts->localize( 'admin-tags', 'tagsl10n', array( + 'noPerm' => __('You do not have permission to do that.'), + 'broken' => __('An unidentified error has occurred.'), + 'l10n_print_after' => 'try{convertEntities(tagsl10n);}catch(e){};' + )); + + $scripts->add( 'admin-custom-fields', "/wp-admin/js/custom-fields$suffix.js", array('wp-lists'), '20110429' ); + $scripts->add_data( 'admin-custom-fields', 'group', 1 ); + + $scripts->add( 'admin-comments', "/wp-admin/js/edit-comments$suffix.js", array('wp-lists', 'jquery-ui-resizable', 'quicktags', 'jquery-query'), '20110602' ); + $scripts->add_data( 'admin-comments', 'group', 1 ); + $scripts->localize( 'admin-comments', 'adminCommentsL10n', array( + 'hotkeys_highlight_first' => isset($_GET['hotkeys_highlight_first']), + 'hotkeys_highlight_last' => isset($_GET['hotkeys_highlight_last']), + 'replyApprove' => __( 'Approve and Reply' ), + 'reply' => __( 'Reply' ) + ) ); + + $scripts->add( 'xfn', "/wp-admin/js/xfn$suffix.js", array('jquery'), '20110524' ); + $scripts->add_data( 'xfn', 'group', 1 ); + + $scripts->add( 'postbox', "/wp-admin/js/postbox$suffix.js", array('jquery-ui-sortable'), '20110612' ); + $scripts->add_data( 'postbox', 'group', 1 ); + + $scripts->add( 'post', "/wp-admin/js/post$suffix.js", array('suggest', 'wp-lists', 'postbox'), '20110524' ); + $scripts->add_data( 'post', 'group', 1 ); + $scripts->localize( 'post', 'postL10n', array( + 'tagsUsed' => __('Tags used on this post:'), + 'add' => esc_attr(__('Add')), + 'addTag' => esc_attr(__('Add new Tag')), + 'separate' => __('Separate tags with commas'), + 'ok' => __('OK'), + 'cancel' => __('Cancel'), + 'edit' => __('Edit'), + 'publishOn' => __('Publish on:'), + 'publishOnFuture' => __('Schedule for:'), + 'publishOnPast' => __('Published on:'), + 'showcomm' => __('Show more comments'), + 'endcomm' => __('No more comments found.'), + 'publish' => __('Publish'), + 'schedule' => __('Schedule'), + 'update' => __('Update'), + 'savePending' => __('Save as Pending'), + 'saveDraft' => __('Save Draft'), + 'private' => __('Private'), + 'public' => __('Public'), + 'publicSticky' => __('Public, Sticky'), + 'password' => __('Password Protected'), + 'privatelyPublished' => __('Privately Published'), + 'published' => __('Published'), + 'l10n_print_after' => 'try{convertEntities(postL10n);}catch(e){};' + ) ); + + $scripts->add( 'link', "/wp-admin/js/link$suffix.js", array('wp-lists', 'postbox'), '20110524' ); + $scripts->add_data( 'link', 'group', 1 ); + + $scripts->add( 'comment', "/wp-admin/js/comment$suffix.js", array('jquery'), '20110429' ); + $scripts->add_data( 'comment', 'group', 1 ); + $scripts->localize( 'comment', 'commentL10n', array( + 'cancel' => __('Cancel'), + 'edit' => __('Edit'), + 'submittedOn' => __('Submitted on:'), + 'l10n_print_after' => 'try{convertEntities(commentL10n);}catch(e){};' + ) ); + + $scripts->add( 'admin-gallery', "/wp-admin/js/gallery$suffix.js", array( 'jquery-ui-sortable' ), '20110414' ); + + $scripts->add( 'media-upload', "/wp-admin/js/media-upload$suffix.js", array( 'thickbox' ), '20110425' ); + $scripts->add_data( 'media-upload', 'group', 1 ); + + $scripts->add( 'admin-widgets', "/wp-admin/js/widgets$suffix.js", array( 'jquery-ui-sortable', 'jquery-ui-draggable', 'jquery-ui-droppable' ), '20110601' ); + $scripts->add_data( 'admin-widgets', 'group', 1 ); + + $scripts->add( 'word-count', "/wp-admin/js/word-count$suffix.js", array( 'jquery' ), '20110515' ); + $scripts->add_data( 'word-count', 'group', 1 ); + + $scripts->add( 'theme', "/wp-admin/js/theme$suffix.js", array( 'thickbox' ), '20110118' ); + $scripts->add_data( 'theme', 'group', 1 ); + + $scripts->add( 'theme-preview', "/wp-admin/js/theme-preview$suffix.js", array( 'thickbox', 'jquery' ), '20100407' ); + $scripts->add_data( 'theme-preview', 'group', 1 ); + + $scripts->add( 'inline-edit-post', "/wp-admin/js/inline-edit-post$suffix.js", array( 'jquery', 'suggest' ), '20110609' ); + $scripts->add_data( 'inline-edit-post', 'group', 1 ); + $scripts->localize( 'inline-edit-post', 'inlineEditL10n', array( + 'error' => __('Error while saving the changes.'), + 'ntdeltitle' => __('Remove From Bulk Edit'), + 'notitle' => __('(no title)'), + 'l10n_print_after' => 'try{convertEntities(inlineEditL10n);}catch(e){};' + ) ); + + $scripts->add( 'inline-edit-tax', "/wp-admin/js/inline-edit-tax$suffix.js", array( 'jquery' ), '20110609' ); + $scripts->add_data( 'inline-edit-tax', 'group', 1 ); + $scripts->localize( 'inline-edit-tax', 'inlineEditL10n', array( + 'error' => __('Error while saving the changes.'), + 'l10n_print_after' => 'try{convertEntities(inlineEditL10n);}catch(e){};' + ) ); + + $scripts->add( 'plugin-install', "/wp-admin/js/plugin-install$suffix.js", array( 'jquery', 'thickbox' ), '20110113' ); + $scripts->add_data( 'plugin-install', 'group', 1 ); + $scripts->localize( 'plugin-install', 'plugininstallL10n', array( + 'plugin_information' => __('Plugin Information:'), + 'ays' => __('Are you sure you want to install this plugin?'), + 'l10n_print_after' => 'try{convertEntities(plugininstallL10n);}catch(e){};' + ) ); + + $scripts->add( 'farbtastic', '/wp-admin/js/farbtastic.js', array('jquery'), '1.2' ); + + $scripts->add( 'dashboard', "/wp-admin/js/dashboard$suffix.js", array( 'jquery', 'admin-comments', 'postbox' ), '20110524' ); + $scripts->add_data( 'dashboard', 'group', 1 ); + + $scripts->add( 'hoverIntent', "/wp-includes/js/hoverIntent$suffix.js", array('jquery'), '20090102' ); + $scripts->add_data( 'hoverIntent', 'group', 1 ); + + $scripts->add( 'list-revisions', "/wp-includes/js/wp-list-revisions$suffix.js", null, '20091223' ); + + $scripts->add( 'media', "/wp-admin/js/media$suffix.js", array( 'jquery-ui-draggable' ), '20101022' ); + $scripts->add_data( 'media', 'group', 1 ); + + $scripts->add( 'image-edit', "/wp-admin/js/image-edit$suffix.js", array('jquery', 'json2', 'imgareaselect'), '20110524' ); + $scripts->add_data( 'image-edit', 'group', 1 ); + + $scripts->add( 'set-post-thumbnail', "/wp-admin/js/set-post-thumbnail$suffix.js", array( 'jquery' ), '20100518' ); + $scripts->add_data( 'set-post-thumbnail', 'group', 1 ); + $scripts->localize( 'set-post-thumbnail', 'setPostThumbnailL10n', array( + 'setThumbnail' => __( 'Use as featured image' ), + 'saving' => __( 'Saving...' ), + 'error' => __( 'Could not set that as the thumbnail image. Try a different attachment.' ), + 'done' => __( 'Done' ), + 'l10n_print_after' => 'try{convertEntities(setPostThumbnailL10n);}catch(e){};' + ) ); + + // Navigation Menus + $scripts->add( 'nav-menu', "/wp-admin/js/nav-menu$suffix.js", array('jquery-ui-sortable'), '20110524' ); + $scripts->localize( 'nav-menu', 'navMenuL10n', array( + 'noResultsFound' => _x('No results found.', 'search results'), + 'warnDeleteMenu' => __( "You are about to permanently delete this menu. \n 'Cancel' to stop, 'OK' to delete." ), + 'saveAlert' => __('The changes you made will be lost if you navigate away from this page.'), + 'l10n_print_after' => 'try{convertEntities(navMenuL10n);}catch(e){};' + ) ); + + $scripts->add( 'custom-background', "/wp-admin/js/custom-background$suffix.js", array('farbtastic'), '20110511' ); + $scripts->add_data( 'custom-background', 'group', 1 ); + } +} + +/** + * Assign default styles to $styles object. + * + * Nothing is returned, because the $styles parameter is passed by reference. + * Meaning that whatever object is passed will be updated without having to + * reassign the variable that was passed back to the same value. This saves + * memory. + * + * Adding default styles is not the only task, it also assigns the base_url + * property, the default version, and text direction for the object. + * + * @since 2.6.0 + * + * @param object $styles + */ +function wp_default_styles( &$styles ) { + // This checks to see if site_url() returns something and if it does not + // then it assigns $guess_url to wp_guess_url(). Strange format, but it works. + if ( ! $guessurl = site_url() ) + $guessurl = wp_guess_url(); + + $styles->base_url = $guessurl; + $styles->content_url = defined('WP_CONTENT_URL')? WP_CONTENT_URL : ''; + $styles->default_version = get_bloginfo( 'version' ); + $styles->text_direction = function_exists( 'is_rtl' ) && is_rtl() ? 'rtl' : 'ltr'; + $styles->default_dirs = array('/wp-admin/'); + + $suffix = defined('SCRIPT_DEBUG') && SCRIPT_DEBUG ? '.dev' : ''; + + $rtl_styles = array( 'wp-admin', 'global', 'colors', 'colors-fresh', 'colors-classic', 'dashboard', 'ie', 'install', 'login', 'media', 'theme-editor', 'upload', 'widgets', 'press-this', 'plugin-install', 'nav-menu', 'farbtastic', 'admin-bar', 'wplink', 'theme-install' ); + // Any rtl stylesheets that don't have a .dev version for ltr + $no_suffix = array( 'farbtastic' ); + + $styles->add( 'wp-admin', "/wp-admin/css/wp-admin$suffix.css", array(), '20110711' ); + + $styles->add( 'ie', "/wp-admin/css/ie$suffix.css", array(), '20110711' ); + $styles->add_data( 'ie', 'conditional', 'lte IE 7' ); + + // all colors stylesheets need to have the same query strings (cache manifest compat) + $colors_version = '20110703'; + + // Register "meta" stylesheet for admin colors. All colors-* style sheets should have the same version string. + $styles->add( 'colors', true, array(), $colors_version ); + + // do not refer to these directly, the right one is queued by the above "meta" colors handle + $styles->add( 'colors-fresh', "/wp-admin/css/colors-fresh$suffix.css", array(), $colors_version ); + $styles->add( 'colors-classic', "/wp-admin/css/colors-classic$suffix.css", array(), $colors_version ); + + $styles->add( 'ms', "/wp-admin/css/ms$suffix.css", array(), '20110623' ); + $styles->add( 'global', "/wp-admin/css/global$suffix.css", array(), '20110711b' ); + $styles->add( 'media', "/wp-admin/css/media$suffix.css", array(), '20110707' ); + $styles->add( 'widgets', "/wp-admin/css/widgets$suffix.css", array(), '20110606' ); + $styles->add( 'dashboard', "/wp-admin/css/dashboard$suffix.css", array(), '20110711' ); + $styles->add( 'install', "/wp-admin/css/install$suffix.css", array(), '20110707' ); // Readme as well + $styles->add( 'theme-editor', "/wp-admin/css/theme-editor$suffix.css", array(), '20110602' ); + $styles->add( 'press-this', "/wp-admin/css/press-this$suffix.css", array(), '20110707' ); + $styles->add( 'thickbox', '/wp-includes/js/thickbox/thickbox.css', array(), '20090514' ); + $styles->add( 'login', "/wp-admin/css/login$suffix.css", array(), '20110610' ); + $styles->add( 'plugin-install', "/wp-admin/css/plugin-install$suffix.css", array(), '20110628' ); + $styles->add( 'theme-install', "/wp-admin/css/theme-install$suffix.css", array(), '20110506' ); + $styles->add( 'farbtastic', '/wp-admin/css/farbtastic.css', array(), '1.3u' ); + $styles->add( 'jcrop', '/wp-includes/js/jcrop/jquery.Jcrop.css', array(), '0.9.8' ); + $styles->add( 'imgareaselect', '/wp-includes/js/imgareaselect/imgareaselect.css', array(), '0.9.1' ); + $styles->add( 'nav-menu', "/wp-admin/css/nav-menu$suffix.css", array(), '20110611' ); + $styles->add( 'admin-bar', "/wp-includes/css/admin-bar$suffix.css", array(), '20110622' ); + $styles->add( 'wp-jquery-ui-dialog', "/wp-includes/css/jquery-ui-dialog$suffix.css", array(), '20101224' ); + $styles->add( 'wplink', "/wp-includes/js/tinymce/plugins/wplink/css/wplink$suffix.css", array(), '20101224' ); + + foreach ( $rtl_styles as $rtl_style ) { + $styles->add_data( $rtl_style, 'rtl', true ); + if ( $suffix && ! in_array( $rtl_style, $no_suffix ) ) + $styles->add_data( $rtl_style, 'suffix', $suffix ); + } +} + +/** + * Reorder JavaScript scripts array to place prototype before jQuery. + * + * @since 2.3.1 + * + * @param array $js_array JavaScript scripst array + * @return array Reordered array, if needed. + */ +function wp_prototype_before_jquery( $js_array ) { + if ( false === $jquery = array_search( 'jquery', $js_array, true ) ) + return $js_array; + + if ( false === $prototype = array_search( 'prototype', $js_array, true ) ) + return $js_array; + + if ( $prototype < $jquery ) + return $js_array; + + unset($js_array[$prototype]); + + array_splice( $js_array, $jquery, 0, 'prototype' ); + + return $js_array; +} + +/** + * Load localized data on print rather than initialization. + * + * These localizations require information that may not be loaded even by init. + * + * @since 2.5.0 + */ +function wp_just_in_time_script_localization() { + + wp_localize_script( 'autosave', 'autosaveL10n', array( + 'autosaveInterval' => AUTOSAVE_INTERVAL, + 'savingText' => __('Saving Draft…'), + 'saveAlert' => __('The changes you made will be lost if you navigate away from this page.'), + 'l10n_print_after' => 'try{convertEntities(autosaveL10n);}catch(e){};' + ) ); + +} + +/** + * Administration Screen CSS for changing the styles. + * + * If installing the 'wp-admin/' directory will be replaced with './'. + * + * The $_wp_admin_css_colors global manages the Administration Screens CSS + * stylesheet that is loaded. The option that is set is 'admin_color' and is the + * color and key for the array. The value for the color key is an object with + * a 'url' parameter that has the URL path to the CSS file. + * + * The query from $src parameter will be appended to the URL that is given from + * the $_wp_admin_css_colors array value URL. + * + * @since 2.6.0 + * @uses $_wp_admin_css_colors + * + * @param string $src Source URL. + * @param string $handle Either 'colors' or 'colors-rtl'. + * @return string URL path to CSS stylesheet for Administration Screens. + */ +function wp_style_loader_src( $src, $handle ) { + if ( defined('WP_INSTALLING') ) + return preg_replace( '#^wp-admin/#', './', $src ); + + if ( 'colors' == $handle || 'colors-rtl' == $handle ) { + global $_wp_admin_css_colors; + $color = get_user_option('admin_color'); + + if ( empty($color) || !isset($_wp_admin_css_colors[$color]) ) + $color = 'fresh'; + + $color = $_wp_admin_css_colors[$color]; + $parsed = parse_url( $src ); + $url = $color->url; + + if ( defined('SCRIPT_DEBUG') && SCRIPT_DEBUG ) + $url = preg_replace('/.css$|.css(?=\?)/', '.dev.css', $url); + + if ( isset($parsed['query']) && $parsed['query'] ) { + wp_parse_str( $parsed['query'], $qv ); + $url = add_query_arg( $qv, $url ); + } + + return $url; + } + + return $src; +} + +/** + * Prints the script queue in the HTML head on admin pages. + * + * Postpones the scripts that were queued for the footer. + * print_footer_scripts() is called in the footer to print these scripts. + * + * @since 2.8 + * @see wp_print_scripts() + */ +function print_head_scripts() { + global $wp_scripts, $concatenate_scripts; + + if ( ! did_action('wp_print_scripts') ) + do_action('wp_print_scripts'); + + if ( !is_a($wp_scripts, 'WP_Scripts') ) + $wp_scripts = new WP_Scripts(); + + script_concat_settings(); + $wp_scripts->do_items( 'l10n' ); + $wp_scripts->do_concat = $concatenate_scripts; + $wp_scripts->do_head_items(); + + if ( apply_filters('print_head_scripts', true) ) + _print_scripts(); + + $wp_scripts->reset(); + return $wp_scripts->done; +} + +/** + * Prints the scripts that were queued for the footer on admin pages. + * + * @since 2.8 + */ +function print_footer_scripts() { + global $wp_scripts, $concatenate_scripts; + + if ( ! did_action('wp_print_footer_scripts') ) + do_action('wp_print_footer_scripts'); + + if ( !is_a($wp_scripts, 'WP_Scripts') ) + return array(); // No need to run if not instantiated. + + script_concat_settings(); + $wp_scripts->do_concat = $concatenate_scripts; + $wp_scripts->do_footer_items(); + + if ( apply_filters('print_footer_scripts', true) ) + _print_scripts(); + + $wp_scripts->reset(); + return $wp_scripts->done; +} + +function _print_scripts() { + global $wp_scripts, $compress_scripts; + + $zip = $compress_scripts ? 1 : 0; + if ( $zip && defined('ENFORCE_GZIP') && ENFORCE_GZIP ) + $zip = 'gzip'; + + if ( !empty($wp_scripts->concat) ) { + + if ( !empty($wp_scripts->print_code) ) { + echo "\n"; + } + + $ver = md5("$wp_scripts->concat_version"); + $src = $wp_scripts->base_url . "/wp-admin/load-scripts.php?c={$zip}&load=" . trim($wp_scripts->concat, ', ') . "&ver=$ver"; + echo "\n"; + } + + if ( !empty($wp_scripts->print_html) ) + echo $wp_scripts->print_html; +} + +/** + * Prints the script queue in the HTML head on the front end. + * + * Postpones the scripts that were queued for the footer. + * wp_print_footer_scripts() is called in the footer to print these scripts. + * + * @since 2.8 + */ +function wp_print_head_scripts() { + if ( ! did_action('wp_print_scripts') ) + do_action('wp_print_scripts'); + + global $wp_scripts; + + if ( !is_a($wp_scripts, 'WP_Scripts') ) + return array(); // no need to run if nothing is queued + + return print_head_scripts(); +} + +/** + * Prints the scripts that were queued for the footer on the front end. + * + * @since 2.8 + */ +function wp_print_footer_scripts() { + return print_footer_scripts(); +} + +/** + * Wrapper for do_action('wp_enqueue_scripts') + * + * Allows plugins to queue scripts for the front end using wp_enqueue_script(). + * Runs first in wp_head() where all is_home(), is_page(), etc. functions are available. + * + * @since 2.8 + */ +function wp_enqueue_scripts() { + do_action('wp_enqueue_scripts'); +} + +function print_admin_styles() { + global $wp_styles, $concatenate_scripts, $compress_css; + + if ( !is_a($wp_styles, 'WP_Styles') ) + $wp_styles = new WP_Styles(); + + script_concat_settings(); + $wp_styles->do_concat = $concatenate_scripts; + $zip = $compress_css ? 1 : 0; + if ( $zip && defined('ENFORCE_GZIP') && ENFORCE_GZIP ) + $zip = 'gzip'; + + $wp_styles->do_items(false); + + if ( apply_filters('print_admin_styles', true) ) { + if ( !empty($wp_styles->concat) ) { + $dir = $wp_styles->text_direction; + $ver = md5("$wp_styles->concat_version{$dir}"); + $href = $wp_styles->base_url . "/wp-admin/load-styles.php?c={$zip}&dir={$dir}&load=" . trim($wp_styles->concat, ', ') . "&ver=$ver"; + echo "\n"; + } + + if ( !empty($wp_styles->print_html) ) + echo $wp_styles->print_html; + } + + $wp_styles->do_concat = false; + $wp_styles->concat = $wp_styles->concat_version = $wp_styles->print_html = ''; + return $wp_styles->done; +} + +function script_concat_settings() { + global $concatenate_scripts, $compress_scripts, $compress_css; + + $compressed_output = ( ini_get('zlib.output_compression') || 'ob_gzhandler' == ini_get('output_handler') ); + + if ( ! isset($concatenate_scripts) ) { + $concatenate_scripts = defined('CONCATENATE_SCRIPTS') ? CONCATENATE_SCRIPTS : true; + if ( ! is_admin() || ( defined('SCRIPT_DEBUG') && SCRIPT_DEBUG ) ) + $concatenate_scripts = false; + } + + if ( ! isset($compress_scripts) ) { + $compress_scripts = defined('COMPRESS_SCRIPTS') ? COMPRESS_SCRIPTS : true; + if ( $compress_scripts && ( ! get_site_option('can_compress_scripts') || $compressed_output ) ) + $compress_scripts = false; + } + + if ( ! isset($compress_css) ) { + $compress_css = defined('COMPRESS_CSS') ? COMPRESS_CSS : true; + if ( $compress_css && ( ! get_site_option('can_compress_scripts') || $compressed_output ) ) + $compress_css = false; + } +} + +add_action( 'wp_default_scripts', 'wp_default_scripts' ); +add_filter( 'wp_print_scripts', 'wp_just_in_time_script_localization' ); +add_filter( 'print_scripts_array', 'wp_prototype_before_jquery' ); + +add_action( 'wp_default_styles', 'wp_default_styles' ); +add_filter( 'style_loader_src', 'wp_style_loader_src', 10, 2 ); diff --git a/src/wp-includes/shortcodes.php b/src/wp-includes/shortcodes.php new file mode 100644 index 0000000..f2048bd --- /dev/null +++ b/src/wp-includes/shortcodes.php @@ -0,0 +1,298 @@ + + * $out = do_shortcode($content); + * + * + * @link http://codex.wordpress.org/Shortcode_API + * + * @package WordPress + * @subpackage Shortcodes + * @since 2.5 + */ + +/** + * Container for storing shortcode tags and their hook to call for the shortcode + * + * @since 2.5 + * @name $shortcode_tags + * @var array + * @global array $shortcode_tags + */ +$shortcode_tags = array(); + +/** + * Add hook for shortcode tag. + * + * There can only be one hook for each shortcode. Which means that if another + * plugin has a similar shortcode, it will override yours or yours will override + * theirs depending on which order the plugins are included and/or ran. + * + * Simplest example of a shortcode tag using the API: + * + * + * // [footag foo="bar"] + * function footag_func($atts) { + * return "foo = {$atts[foo]}"; + * } + * add_shortcode('footag', 'footag_func'); + * + * + * Example with nice attribute defaults: + * + * + * // [bartag foo="bar"] + * function bartag_func($atts) { + * extract(shortcode_atts(array( + * 'foo' => 'no foo', + * 'baz' => 'default baz', + * ), $atts)); + * + * return "foo = {$foo}"; + * } + * add_shortcode('bartag', 'bartag_func'); + * + * + * Example with enclosed content: + * + * + * // [baztag]content[/baztag] + * function baztag_func($atts, $content='') { + * return "content = $content"; + * } + * add_shortcode('baztag', 'baztag_func'); + * + * + * @since 2.5 + * @uses $shortcode_tags + * + * @param string $tag Shortcode tag to be searched in post content. + * @param callable $func Hook to run when shortcode is found. + */ +function add_shortcode($tag, $func) { + global $shortcode_tags; + + if ( is_callable($func) ) + $shortcode_tags[$tag] = $func; +} + +/** + * Removes hook for shortcode. + * + * @since 2.5 + * @uses $shortcode_tags + * + * @param string $tag shortcode tag to remove hook for. + */ +function remove_shortcode($tag) { + global $shortcode_tags; + + unset($shortcode_tags[$tag]); +} + +/** + * Clear all shortcodes. + * + * This function is simple, it clears all of the shortcode tags by replacing the + * shortcodes global by a empty array. This is actually a very efficient method + * for removing all shortcodes. + * + * @since 2.5 + * @uses $shortcode_tags + */ +function remove_all_shortcodes() { + global $shortcode_tags; + + $shortcode_tags = array(); +} + +/** + * Search content for shortcodes and filter shortcodes through their hooks. + * + * If there are no shortcode tags defined, then the content will be returned + * without any filtering. This might cause issues when plugins are disabled but + * the shortcode will still show up in the post or content. + * + * @since 2.5 + * @uses $shortcode_tags + * @uses get_shortcode_regex() Gets the search pattern for searching shortcodes. + * + * @param string $content Content to search for shortcodes + * @return string Content with shortcodes filtered out. + */ +function do_shortcode($content) { + global $shortcode_tags; + + if (empty($shortcode_tags) || !is_array($shortcode_tags)) + return $content; + + $pattern = get_shortcode_regex(); + return preg_replace_callback('/'.$pattern.'/s', 'do_shortcode_tag', $content); +} + +/** + * Retrieve the shortcode regular expression for searching. + * + * The regular expression combines the shortcode tags in the regular expression + * in a regex class. + * + * The regular expresion contains 6 different sub matches to help with parsing. + * + * 1/6 - An extra [ or ] 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. + * + * @since 2.5 + * @uses $shortcode_tags + * + * @return string The shortcode search regular expression + */ +function get_shortcode_regex() { + global $shortcode_tags; + $tagnames = array_keys($shortcode_tags); + $tagregexp = join( '|', array_map('preg_quote', $tagnames) ); + + // WARNING! Do not change this regex without changing do_shortcode_tag() and strip_shortcodes() + return '(.?)\[('.$tagregexp.')\b(.*?)(?:(\/))?\](?:(.+?)\[\/\2\])?(.?)'; +} + +/** + * Regular Expression callable for do_shortcode() for calling shortcode hook. + * @see get_shortcode_regex for details of the match array contents. + * + * @since 2.5 + * @access private + * @uses $shortcode_tags + * + * @param array $m Regular expression match array + * @return mixed False on failure. + */ +function do_shortcode_tag( $m ) { + global $shortcode_tags; + + // allow [[foo]] syntax for escaping a tag + if ( $m[1] == '[' && $m[6] == ']' ) { + return substr($m[0], 1, -1); + } + + $tag = $m[2]; + $attr = shortcode_parse_atts( $m[3] ); + + if ( isset( $m[5] ) ) { + // enclosing tag - extra parameter + return $m[1] . call_user_func( $shortcode_tags[$tag], $attr, $m[5], $tag ) . $m[6]; + } else { + // self-closing tag + return $m[1] . call_user_func( $shortcode_tags[$tag], $attr, NULL, $tag ) . $m[6]; + } +} + +/** + * Retrieve all attributes from the shortcodes tag. + * + * The attributes list has the attribute name as the key and the value of the + * attribute as the value in the key/value pair. This allows for easier + * retrieval of the attributes, since all attributes have to be known. + * + * @since 2.5 + * + * @param string $text + * @return array List of attributes and their value. + */ +function shortcode_parse_atts($text) { + $atts = array(); + $pattern = '/(\w+)\s*=\s*"([^"]*)"(?:\s|$)|(\w+)\s*=\s*\'([^\']*)\'(?:\s|$)|(\w+)\s*=\s*([^\s\'"]+)(?:\s|$)|"([^"]*)"(?:\s|$)|(\S+)(?:\s|$)/'; + $text = preg_replace("/[\x{00a0}\x{200b}]+/u", " ", $text); + if ( preg_match_all($pattern, $text, $match, PREG_SET_ORDER) ) { + foreach ($match as $m) { + if (!empty($m[1])) + $atts[strtolower($m[1])] = stripcslashes($m[2]); + elseif (!empty($m[3])) + $atts[strtolower($m[3])] = stripcslashes($m[4]); + elseif (!empty($m[5])) + $atts[strtolower($m[5])] = stripcslashes($m[6]); + elseif (isset($m[7]) and strlen($m[7])) + $atts[] = stripcslashes($m[7]); + elseif (isset($m[8])) + $atts[] = stripcslashes($m[8]); + } + } else { + $atts = ltrim($text); + } + return $atts; +} + +/** + * Combine user attributes with known attributes and fill in defaults when needed. + * + * The pairs should be considered to be all of the attributes which are + * supported by the caller and given as a list. The returned attributes will + * only contain the attributes in the $pairs list. + * + * If the $atts list has unsupported attributes, then they will be ignored and + * removed from the final returned list. + * + * @since 2.5 + * + * @param array $pairs Entire list of supported attributes and their defaults. + * @param array $atts User defined attributes in shortcode tag. + * @return array Combined and filtered attribute list. + */ +function shortcode_atts($pairs, $atts) { + $atts = (array)$atts; + $out = array(); + foreach($pairs as $name => $default) { + if ( array_key_exists($name, $atts) ) + $out[$name] = $atts[$name]; + else + $out[$name] = $default; + } + return $out; +} + +/** + * Remove all shortcode tags from the given content. + * + * @since 2.5 + * @uses $shortcode_tags + * + * @param string $content Content to remove shortcode tags. + * @return string Content without shortcode tags. + */ +function strip_shortcodes( $content ) { + global $shortcode_tags; + + if (empty($shortcode_tags) || !is_array($shortcode_tags)) + return $content; + + $pattern = get_shortcode_regex(); + + return preg_replace('/'.$pattern.'/s', '$1$6', $content); +} + +add_filter('the_content', 'do_shortcode', 11); // AFTER wpautop() + +?> \ No newline at end of file diff --git a/src/wp-includes/taxonomy.php b/src/wp-includes/taxonomy.php new file mode 100644 index 0000000..dee7af8 --- /dev/null +++ b/src/wp-includes/taxonomy.php @@ -0,0 +1,3190 @@ + true, + 'update_count_callback' => '_update_post_term_count', + 'query_var' => 'category_name', + 'rewrite' => did_action( 'init' ) ? array( + 'hierarchical' => true, + 'slug' => get_option('category_base') ? get_option('category_base') : 'category', + 'with_front' => ( get_option('category_base') && ! $wp_rewrite->using_index_permalinks() ) ? false : true ) : false, + 'public' => true, + 'show_ui' => true, + '_builtin' => true, + ) ); + + register_taxonomy( 'post_tag', 'post', array( + 'hierarchical' => false, + 'update_count_callback' => '_update_post_term_count', + 'query_var' => 'tag', + 'rewrite' => did_action( 'init' ) ? array( + 'slug' => get_option('tag_base') ? get_option('tag_base') : 'tag', + 'with_front' => ( get_option('tag_base') && ! $wp_rewrite->using_index_permalinks() ) ? false : true ) : false, + 'public' => true, + 'show_ui' => true, + '_builtin' => true, + ) ); + + register_taxonomy( 'nav_menu', 'nav_menu_item', array( + 'public' => false, + 'hierarchical' => false, + 'labels' => array( + 'name' => __( 'Navigation Menus' ), + 'singular_name' => __( 'Navigation Menu' ), + ), + 'query_var' => false, + 'rewrite' => false, + 'show_ui' => false, + '_builtin' => true, + 'show_in_nav_menus' => false, + ) ); + + register_taxonomy( 'link_category', 'link', array( + 'hierarchical' => false, + 'labels' => array( + 'name' => __( 'Link Categories' ), + 'singular_name' => __( 'Link Category' ), + 'search_items' => __( 'Search Link Categories' ), + 'popular_items' => null, + 'all_items' => __( 'All Link Categories' ), + 'edit_item' => __( 'Edit Link Category' ), + 'update_item' => __( 'Update Link Category' ), + 'add_new_item' => __( 'Add New Link Category' ), + 'new_item_name' => __( 'New Link Category Name' ), + 'separate_items_with_commas' => null, + 'add_or_remove_items' => null, + 'choose_from_most_used' => null, + ), + 'query_var' => false, + 'rewrite' => false, + 'public' => false, + 'show_ui' => false, + '_builtin' => true, + ) ); + + $rewrite = false; + if ( did_action( 'init' ) ) { + $rewrite = apply_filters( 'post_format_rewrite_base', 'type' ); + $rewrite = $rewrite ? array( 'slug' => $rewrite ) : false; + } + + register_taxonomy( 'post_format', 'post', array( + 'public' => true, + 'hierarchical' => false, + 'labels' => array( + 'name' => _x( 'Format', 'post format' ), + 'singular_name' => _x( 'Format', 'post format' ), + ), + 'query_var' => true, + 'rewrite' => $rewrite, + 'show_ui' => false, + '_builtin' => true, + 'show_in_nav_menus' => false, + ) ); +} +add_action( 'init', 'create_initial_taxonomies', 0 ); // highest priority + +/** + * Get a list of registered taxonomy objects. + * + * @package WordPress + * @subpackage Taxonomy + * @since 3.0.0 + * @uses $wp_taxonomies + * @see register_taxonomy + * + * @param array $args An array of key => value arguments to match against the taxonomy objects. + * @param string $output The type of output to return, either taxonomy 'names' or 'objects'. 'names' is the default. + * @param string $operator The logical operation to perform. 'or' means only one element + * from the array needs to match; 'and' means all elements must match. The default is 'and'. + * @return array A list of taxonomy names or objects + */ +function get_taxonomies( $args = array(), $output = 'names', $operator = 'and' ) { + global $wp_taxonomies; + + $field = ('names' == $output) ? 'name' : false; + + return wp_filter_object_list($wp_taxonomies, $args, $operator, $field); +} + + +/** + * Return all of the taxonomy names that are of $object_type. + * + * It appears that this function can be used to find all of the names inside of + * $wp_taxonomies global variable. + * + * Should + * result in Array('category', 'post_tag') + * + * @package WordPress + * @subpackage Taxonomy + * @since 2.3.0 + * + * @uses $wp_taxonomies + * + * @param array|string|object $object Name of the type of taxonomy object, or an object (row from posts) + * @param string $output The type of output to return, either taxonomy 'names' or 'objects'. 'names' is the default. + * @return array The names of all taxonomy of $object_type. + */ +function get_object_taxonomies($object, $output = 'names') { + global $wp_taxonomies; + + if ( is_object($object) ) { + if ( $object->post_type == 'attachment' ) + return get_attachment_taxonomies($object); + $object = $object->post_type; + } + + $object = (array) $object; + + $taxonomies = array(); + foreach ( (array) $wp_taxonomies as $tax_name => $tax_obj ) { + if ( array_intersect($object, (array) $tax_obj->object_type) ) { + if ( 'names' == $output ) + $taxonomies[] = $tax_name; + else + $taxonomies[ $tax_name ] = $tax_obj; + } + } + + return $taxonomies; +} + +/** + * Retrieves the taxonomy object of $taxonomy. + * + * The get_taxonomy function will first check that the parameter string given + * is a taxonomy object and if it is, it will return it. + * + * @package WordPress + * @subpackage Taxonomy + * @since 2.3.0 + * + * @uses $wp_taxonomies + * @uses taxonomy_exists() Checks whether taxonomy exists + * + * @param string $taxonomy Name of taxonomy object to return + * @return object|bool The Taxonomy Object or false if $taxonomy doesn't exist + */ +function get_taxonomy( $taxonomy ) { + global $wp_taxonomies; + + if ( ! taxonomy_exists( $taxonomy ) ) + return false; + + return $wp_taxonomies[$taxonomy]; +} + +/** + * Checks that the taxonomy name exists. + * + * Formerly is_taxonomy(), introduced in 2.3.0. + * + * @package WordPress + * @subpackage Taxonomy + * @since 3.0.0 + * + * @uses $wp_taxonomies + * + * @param string $taxonomy Name of taxonomy object + * @return bool Whether the taxonomy exists. + */ +function taxonomy_exists( $taxonomy ) { + global $wp_taxonomies; + + return isset( $wp_taxonomies[$taxonomy] ); +} + +/** + * Whether the taxonomy object is hierarchical. + * + * Checks to make sure that the taxonomy is an object first. Then Gets the + * object, and finally returns the hierarchical value in the object. + * + * A false return value might also mean that the taxonomy does not exist. + * + * @package WordPress + * @subpackage Taxonomy + * @since 2.3.0 + * + * @uses taxonomy_exists() Checks whether taxonomy exists + * @uses get_taxonomy() Used to get the taxonomy object + * + * @param string $taxonomy Name of taxonomy object + * @return bool Whether the taxonomy is hierarchical + */ +function is_taxonomy_hierarchical($taxonomy) { + if ( ! taxonomy_exists($taxonomy) ) + return false; + + $taxonomy = get_taxonomy($taxonomy); + return $taxonomy->hierarchical; +} + +/** + * Create or modify a taxonomy object. Do not use before init. + * + * A simple function for creating or modifying a taxonomy object based on the + * parameters given. The function will accept an array (third optional + * parameter), along with strings for the taxonomy name and another string for + * the object type. + * + * Nothing is returned, so expect error maybe or use taxonomy_exists() to check + * whether taxonomy exists. + * + * Optional $args contents: + * + * label - Name of the taxonomy shown in the menu. Usually plural. If not set, labels['name'] will be used. + * + * hierarchical - has some defined purpose at other parts of the API and is a + * boolean value. + * + * update_count_callback - works much like a hook, in that it will be called + * when the count is updated. + * + * rewrite - false to prevent rewrite, or array('slug'=>$slug) to customize + * permastruct; default will use $taxonomy as slug. + * + * query_var - false to prevent queries, or string to customize query var + * (?$query_var=$term); default will use $taxonomy as query var. + * + * public - If the taxonomy should be publically queryable; //@TODO not implemented. + * defaults to true. + * + * show_ui - If the WordPress UI admin tags UI should apply to this taxonomy; + * defaults to public. + * + * show_in_nav_menus - true makes this taxonomy available for selection in navigation menus. + * Defaults to public. + * + * show_tagcloud - false to prevent the taxonomy being listed in the Tag Cloud Widget; + * defaults to show_ui which defalts to public. + * + * labels - An array of labels for this taxonomy. You can see accepted values in {@link get_taxonomy_labels()}. By default tag labels are used for non-hierarchical types and category labels for hierarchical ones. + * + * @package WordPress + * @subpackage Taxonomy + * @since 2.3.0 + * @uses $wp_taxonomies Inserts new taxonomy object into the list + * @uses $wp_rewrite Adds rewrite tags and permastructs + * @uses $wp Adds query vars + * + * @param string $taxonomy Name of taxonomy object + * @param array|string $object_type Name of the object type for the taxonomy object. + * @param array|string $args See above description for the two keys values. + */ +function register_taxonomy( $taxonomy, $object_type, $args = array() ) { + global $wp_taxonomies, $wp_rewrite, $wp; + + if ( ! is_array($wp_taxonomies) ) + $wp_taxonomies = array(); + + $defaults = array( 'hierarchical' => false, + 'update_count_callback' => '', + 'rewrite' => true, + 'query_var' => $taxonomy, + 'public' => true, + 'show_ui' => null, + 'show_tagcloud' => null, + '_builtin' => false, + 'labels' => array(), + 'capabilities' => array(), + 'show_in_nav_menus' => null, + ); + $args = wp_parse_args($args, $defaults); + + if ( false !== $args['query_var'] && !empty($wp) ) { + if ( true === $args['query_var'] ) + $args['query_var'] = $taxonomy; + $args['query_var'] = sanitize_title_with_dashes($args['query_var']); + $wp->add_query_var($args['query_var']); + } + + if ( false !== $args['rewrite'] && '' != get_option('permalink_structure') ) { + $args['rewrite'] = wp_parse_args($args['rewrite'], array( + 'slug' => sanitize_title_with_dashes($taxonomy), + 'with_front' => true, + 'hierarchical' => false + )); + + if ( $args['hierarchical'] && $args['rewrite']['hierarchical'] ) + $tag = '(.+?)'; + else + $tag = '([^/]+)'; + + $wp_rewrite->add_rewrite_tag("%$taxonomy%", $tag, $args['query_var'] ? "{$args['query_var']}=" : "taxonomy=$taxonomy&term="); + $wp_rewrite->add_permastruct($taxonomy, "{$args['rewrite']['slug']}/%$taxonomy%", $args['rewrite']['with_front']); + } + + if ( is_null($args['show_ui']) ) + $args['show_ui'] = $args['public']; + + // Whether to show this type in nav-menus.php. Defaults to the setting for public. + if ( null === $args['show_in_nav_menus'] ) + $args['show_in_nav_menus'] = $args['public']; + + if ( is_null($args['show_tagcloud']) ) + $args['show_tagcloud'] = $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['name'] = $taxonomy; + $args['object_type'] = array_unique( (array)$object_type ); + + $args['labels'] = get_taxonomy_labels( (object) $args ); + $args['label'] = $args['labels']->name; + + $wp_taxonomies[$taxonomy] = (object) $args; + + // register callback handling for metabox + add_filter('wp_ajax_add-' . $taxonomy, '_wp_ajax_add_hierarchical_term'); +} + +/** + * Builds an object with all taxonomy labels out of a taxonomy object + * + * Accepted keys of the label array in the taxonomy object: + * - name - general name for the taxonomy, usually plural. The same as and overriden by $tax->label. Default is Post Tags/Categories + * - singular_name - name for one object of this taxonomy. Default is Post Tag/Category + * - search_items - Default is Search Tags/Search Categories + * - popular_items - This string isn't used on hierarchical taxonomies. Default is Popular Tags + * - all_items - Default is All Tags/All Categories + * - parent_item - This string isn't used on non-hierarchical taxonomies. In hierarchical ones the default is Parent Category + * - parent_item_colon - The same as parent_item, but with colon : in the end + * - edit_item - Default is Edit Tag/Edit Category + * - update_item - Default is Update Tag/Update Category + * - add_new_item - Default is Add New Tag/Add New Category + * - new_item_name - Default is New Tag Name/New Category Name + * - separate_items_with_commas - This string isn't used on hierarchical taxonomies. Default is "Separate tags with commas," used in the meta box. + * - add_or_remove_items - This string isn't used on hierarchical taxonomies. Default is "Add or remove tags," used in the meta box when JavaScript is disabled. + * - choose_from_most_used - This string isn't used on hierarchical taxonomies. Default is "Choose from the most used tags," used in the meta box. + * + * Above, the first default value is for non-hierarchical taxonomies (like tags) and the second one is for hierarchical taxonomies (like categories.) + * + * @since 3.0.0 + * @param object $tax Taxonomy object + * @return object object with all the labels as member variables + */ + +function get_taxonomy_labels( $tax ) { + if ( isset( $tax->helps ) && empty( $tax->labels['separate_items_with_commas'] ) ) + $tax->labels['separate_items_with_commas'] = $tax->helps; + + $nohier_vs_hier_defaults = array( + 'name' => array( _x( 'Post Tags', 'taxonomy general name' ), _x( 'Categories', 'taxonomy general name' ) ), + 'singular_name' => array( _x( 'Post Tag', 'taxonomy singular name' ), _x( 'Category', 'taxonomy singular name' ) ), + 'search_items' => array( __( 'Search Tags' ), __( 'Search Categories' ) ), + 'popular_items' => array( __( 'Popular Tags' ), null ), + 'all_items' => array( __( 'All Tags' ), __( 'All Categories' ) ), + 'parent_item' => array( null, __( 'Parent Category' ) ), + 'parent_item_colon' => array( null, __( 'Parent Category:' ) ), + 'edit_item' => array( __( 'Edit Tag' ), __( 'Edit Category' ) ), + 'view_item' => array( __( 'View Tag' ), __( 'View Category' ) ), + 'update_item' => array( __( 'Update Tag' ), __( 'Update Category' ) ), + 'add_new_item' => array( __( 'Add New Tag' ), __( 'Add New Category' ) ), + 'new_item_name' => array( __( 'New Tag Name' ), __( 'New Category Name' ) ), + 'separate_items_with_commas' => array( __( 'Separate tags with commas' ), null ), + 'add_or_remove_items' => array( __( 'Add or remove tags' ), null ), + 'choose_from_most_used' => array( __( 'Choose from the most used tags' ), null ), + ); + $nohier_vs_hier_defaults['menu_name'] = $nohier_vs_hier_defaults['name']; + + return _get_custom_object_labels( $tax, $nohier_vs_hier_defaults ); +} + +/** + * Add an already registered taxonomy to an object type. + * + * @package WordPress + * @subpackage Taxonomy + * @since 3.0.0 + * @uses $wp_taxonomies Modifies taxonomy object + * + * @param string $taxonomy Name of taxonomy object + * @param array|string $object_type Name of the object type + * @return bool True if successful, false if not + */ +function register_taxonomy_for_object_type( $taxonomy, $object_type) { + global $wp_taxonomies; + + if ( !isset($wp_taxonomies[$taxonomy]) ) + return false; + + if ( ! get_post_type_object($object_type) ) + return false; + + if ( ! in_array( $object_type, $wp_taxonomies[$taxonomy]->object_type ) ) + $wp_taxonomies[$taxonomy]->object_type[] = $object_type; + + return true; +} + +// +// Term API +// + +/** + * Retrieve object_ids of valid taxonomy and term. + * + * The strings of $taxonomies must exist before this function will continue. On + * failure of finding a valid taxonomy, it will return an WP_Error class, kind + * of like Exceptions in PHP 5, except you can't catch them. Even so, you can + * still test for the WP_Error class and get the error message. + * + * The $terms aren't checked the same as $taxonomies, but still need to exist + * for $object_ids to be returned. + * + * It is possible to change the order that object_ids is returned by either + * using PHP sort family functions or using the database by using $args with + * either ASC or DESC array. The value should be in the key named 'order'. + * + * @package WordPress + * @subpackage Taxonomy + * @since 2.3.0 + * + * @uses $wpdb + * @uses wp_parse_args() Creates an array from string $args. + * + * @param int|array $term_ids Term id or array of term ids of terms that will be used + * @param string|array $taxonomies String of taxonomy name or Array of string values of taxonomy names + * @param array|string $args Change the order of the object_ids, either ASC or DESC + * @return WP_Error|array If the taxonomy does not exist, then WP_Error will be returned. On success + * the array can be empty meaning that there are no $object_ids found or it will return the $object_ids found. + */ +function get_objects_in_term( $term_ids, $taxonomies, $args = array() ) { + global $wpdb; + + if ( ! is_array( $term_ids ) ) + $term_ids = array( $term_ids ); + + if ( ! is_array( $taxonomies ) ) + $taxonomies = array( $taxonomies ); + + foreach ( (array) $taxonomies as $taxonomy ) { + if ( ! taxonomy_exists( $taxonomy ) ) + return new WP_Error( 'invalid_taxonomy', __( 'Invalid Taxonomy' ) ); + } + + $defaults = array( 'order' => 'ASC' ); + $args = wp_parse_args( $args, $defaults ); + extract( $args, EXTR_SKIP ); + + $order = ( 'desc' == strtolower( $order ) ) ? 'DESC' : 'ASC'; + + $term_ids = array_map('intval', $term_ids ); + + $taxonomies = "'" . implode( "', '", $taxonomies ) . "'"; + $term_ids = "'" . implode( "', '", $term_ids ) . "'"; + + $object_ids = $wpdb->get_col("SELECT tr.object_id FROM $wpdb->term_relationships AS tr INNER JOIN $wpdb->term_taxonomy AS tt ON tr.term_taxonomy_id = tt.term_taxonomy_id WHERE tt.taxonomy IN ($taxonomies) AND tt.term_id IN ($term_ids) ORDER BY tr.object_id $order"); + + if ( ! $object_ids ) + return array(); + + return $object_ids; +} + +/** + * Given a taxonomy query, generates SQL to be appended to a main query. + * + * @since 3.1.0 + * + * @see WP_Tax_Query + * + * @param array $tax_query A compact tax query + * @param string $primary_table + * @param string $primary_id_column + * @return array + */ +function get_tax_sql( $tax_query, $primary_table, $primary_id_column ) { + $tax_query_obj = new WP_Tax_Query( $tax_query ); + return $tax_query_obj->get_sql( $primary_table, $primary_id_column ); +} + +/** + * Container class for a multiple taxonomy query. + * + * @since 3.1.0 + */ +class WP_Tax_Query { + + /** + * List of taxonomy queries. A single taxonomy query is an associative array: + * - 'taxonomy' string The taxonomy being queried + * - 'terms' string|array The list of terms + * - 'field' string (optional) Which term field is being used. + * Possible values: 'term_id', 'slug' or 'name' + * Default: 'term_id' + * - 'operator' string (optional) + * Possible values: 'AND', 'IN' or 'NOT IN'. + * Default: 'IN' + * - 'include_children' bool (optional) Whether to include child terms. + * Default: true + * + * @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 + * @access private + * @var string + */ + private static $no_results = array( 'join' => '', 'where' => ' AND 0 = 1' ); + + /** + * Constructor. + * + * Parses a compact tax query and sets defaults. + * + * @since 3.1.0 + * @access public + * + * @param array $tax_query A compact tax query: + * array( + * 'relation' => 'OR', + * array( + * 'taxonomy' => 'tax1', + * 'terms' => array( 'term1', 'term2' ), + * 'field' => 'slug', + * ), + * array( + * 'taxonomy' => 'tax2', + * 'terms' => array( 'term-a', 'term-b' ), + * 'field' => 'slug', + * ), + * ) + */ + public function __construct( $tax_query ) { + if ( isset( $tax_query['relation'] ) && strtoupper( $tax_query['relation'] ) == 'OR' ) { + $this->relation = 'OR'; + } else { + $this->relation = 'AND'; + } + + $defaults = array( + 'taxonomy' => '', + 'terms' => array(), + 'include_children' => true, + 'field' => 'term_id', + 'operator' => 'IN', + ); + + foreach ( $tax_query as $query ) { + if ( ! is_array( $query ) ) + continue; + + $query = array_merge( $defaults, $query ); + + $query['terms'] = (array) $query['terms']; + + $this->queries[] = $query; + } + } + + /** + * Generates SQL clauses to be appended to a main query. + * + * @since 3.1.0 + * @access public + * + * @param string $primary_table + * @param string $primary_id_column + * @return array + */ + public function get_sql( $primary_table, $primary_id_column ) { + global $wpdb; + + $join = ''; + $where = array(); + $i = 0; + + foreach ( $this->queries as $query ) { + $this->clean_query( $query ); + + if ( is_wp_error( $query ) ) { + return self::$no_results; + } + + extract( $query ); + + if ( 'IN' == $operator ) { + + if ( empty( $terms ) ) { + if ( 'OR' == $this->relation ) + continue; + else + return self::$no_results; + } + + $terms = implode( ',', $terms ); + + $alias = $i ? 'tt' . $i : $wpdb->term_relationships; + + $join .= " INNER JOIN $wpdb->term_relationships"; + $join .= $i ? " AS $alias" : ''; + $join .= " ON ($primary_table.$primary_id_column = $alias.object_id)"; + + $where[] = "$alias.term_taxonomy_id $operator ($terms)"; + } elseif ( 'NOT IN' == $operator ) { + + if ( empty( $terms ) ) + continue; + + $terms = implode( ',', $terms ); + + $where[] = "$primary_table.$primary_id_column NOT IN ( + SELECT object_id + FROM $wpdb->term_relationships + WHERE term_taxonomy_id IN ($terms) + )"; + } elseif ( 'AND' == $operator ) { + + if ( empty( $terms ) ) + continue; + + $num_terms = count( $terms ); + + $terms = implode( ',', $terms ); + + $where[] = "( + SELECT COUNT(1) + FROM $wpdb->term_relationships + WHERE term_taxonomy_id IN ($terms) + AND object_id = $primary_table.$primary_id_column + ) = $num_terms"; + } + + $i++; + } + + if ( !empty( $where ) ) + $where = ' AND ( ' . implode( " $this->relation ", $where ) . ' )'; + else + $where = ''; + + return compact( 'join', 'where' ); + } + + /** + * Validates a single query. + * + * @since 3.2.0 + * @access private + * + * @param array &$query The single query + */ + private function clean_query( &$query ) { + if ( ! taxonomy_exists( $query['taxonomy'] ) ) { + $query = new WP_Error( '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 + * @access private + * + * @param array &$query The single query + * @param string $resulting_field The resulting field + */ + private function transform_query( &$query, $resulting_field ) { + global $wpdb; + + if ( empty( $query['terms'] ) ) + return; + + if ( $query['field'] == $resulting_field ) + return; + + $resulting_field = esc_sql( $resulting_field ); + + switch ( $query['field'] ) { + case 'slug': + case 'name': + $terms = "'" . implode( "','", array_map( 'sanitize_title_for_query', $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; + + 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' ); + return; + } + + $query['terms'] = $terms; + $query['field'] = $resulting_field; + } +} + +/** + * Get all Term data from database by Term ID. + * + * The usage of the get_term function is to apply filters to a term object. It + * is possible to get a term object from the database before applying the + * filters. + * + * $term ID must be part of $taxonomy, to get from the database. Failure, might + * be able to be captured by the hooks. Failure would be the same value as $wpdb + * returns for the get_row method. + * + * There are two hooks, one is specifically for each term, named 'get_term', and + * the second is for the taxonomy name, 'term_$taxonomy'. Both hooks gets the + * term object, and the taxonomy name as parameters. Both hooks are expected to + * return a Term object. + * + * 'get_term' hook - Takes two parameters the term Object and the taxonomy name. + * Must return term object. Used in get_term() as a catch-all filter for every + * $term. + * + * 'get_$taxonomy' hook - Takes two parameters the term Object and the taxonomy + * name. Must return term object. $taxonomy will be the taxonomy name, so for + * example, if 'category', it would be 'get_category' as the filter name. Useful + * for custom taxonomies or plugging into default taxonomies. + * + * @package WordPress + * @subpackage Taxonomy + * @since 2.3.0 + * + * @uses $wpdb + * @uses sanitize_term() Cleanses the term based on $filter context before returning. + * @see sanitize_term_field() The $context param lists the available values for get_term_by() $filter param. + * + * @param int|object $term If integer, will get from database. If object will apply filters and return $term. + * @param string $taxonomy Taxonomy name that $term is part of. + * @param string $output Constant OBJECT, ARRAY_A, or ARRAY_N + * @param string $filter Optional, default is raw or no WordPress defined filter will applied. + * @return mixed|null|WP_Error Term Row from database. Will return null if $term is empty. If taxonomy does not + * exist then WP_Error will be returned. + */ +function &get_term($term, $taxonomy, $output = OBJECT, $filter = 'raw') { + global $wpdb; + $null = null; + + if ( empty($term) ) { + $error = new WP_Error('invalid_term', __('Empty Term')); + return $error; + } + + if ( ! taxonomy_exists($taxonomy) ) { + $error = new WP_Error('invalid_taxonomy', __('Invalid Taxonomy')); + return $error; + } + + if ( is_object($term) && empty($term->filter) ) { + wp_cache_add($term->term_id, $term, $taxonomy); + $_term = $term; + } else { + if ( is_object($term) ) + $term = $term->term_id; + $term = (int) $term; + if ( ! $_term = wp_cache_get($term, $taxonomy) ) { + $_term = $wpdb->get_row( $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 tt.taxonomy = %s AND t.term_id = %s LIMIT 1", $taxonomy, $term) ); + if ( ! $_term ) + return $null; + wp_cache_add($term, $_term, $taxonomy); + } + } + + $_term = apply_filters('get_term', $_term, $taxonomy); + $_term = apply_filters("get_$taxonomy", $_term, $taxonomy); + $_term = sanitize_term($_term, $taxonomy, $filter); + + if ( $output == OBJECT ) { + return $_term; + } elseif ( $output == ARRAY_A ) { + $__term = get_object_vars($_term); + return $__term; + } elseif ( $output == ARRAY_N ) { + $__term = array_values(get_object_vars($_term)); + return $__term; + } else { + return $_term; + } +} + +/** + * Get all Term data from database by Term field and data. + * + * Warning: $value is not escaped for 'name' $field. You must do it yourself, if + * required. + * + * The default $field is 'id', therefore it is possible to also use null for + * field, but not recommended that you do so. + * + * If $value does not exist, the return value will be false. If $taxonomy exists + * and $field and $value combinations exist, the Term will be returned. + * + * @package WordPress + * @subpackage Taxonomy + * @since 2.3.0 + * + * @uses $wpdb + * @uses sanitize_term() Cleanses the term based on $filter context before returning. + * @see sanitize_term_field() The $context param lists the available values for get_term_by() $filter param. + * + * @param string $field Either 'slug', 'name', or 'id' + * @param string|int $value Search for this term value + * @param string $taxonomy Taxonomy Name + * @param string $output Constant OBJECT, ARRAY_A, or ARRAY_N + * @param string $filter Optional, default is raw or no WordPress defined filter will applied. + * @return mixed Term Row from database. Will return false if $taxonomy does not exist or $term was not found. + */ +function get_term_by($field, $value, $taxonomy, $output = OBJECT, $filter = 'raw') { + global $wpdb; + + if ( ! taxonomy_exists($taxonomy) ) + return false; + + if ( 'slug' == $field ) { + $field = 't.slug'; + $value = sanitize_title($value); + if ( empty($value) ) + return false; + } else if ( 'name' == $field ) { + // Assume already escaped + $value = stripslashes($value); + $field = 't.name'; + } else { + $term = get_term( (int) $value, $taxonomy, $output, $filter); + if ( is_wp_error( $term ) ) + $term = false; + return $term; + } + + $term = $wpdb->get_row( $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 tt.taxonomy = %s AND $field = %s LIMIT 1", $taxonomy, $value) ); + if ( !$term ) + return false; + + wp_cache_add($term->term_id, $term, $taxonomy); + + $term = apply_filters('get_term', $term, $taxonomy); + $term = apply_filters("get_$taxonomy", $term, $taxonomy); + $term = sanitize_term($term, $taxonomy, $filter); + + if ( $output == OBJECT ) { + return $term; + } elseif ( $output == ARRAY_A ) { + return get_object_vars($term); + } elseif ( $output == ARRAY_N ) { + return array_values(get_object_vars($term)); + } else { + return $term; + } +} + +/** + * Merge all term children into a single array of their IDs. + * + * This recursive function will merge all of the children of $term into the same + * array of term IDs. Only useful for taxonomies which are hierarchical. + * + * Will return an empty array if $term does not exist in $taxonomy. + * + * @package WordPress + * @subpackage Taxonomy + * @since 2.3.0 + * + * @uses $wpdb + * @uses _get_term_hierarchy() + * @uses get_term_children() Used to get the children of both $taxonomy and the parent $term + * + * @param string $term_id ID of Term to get children + * @param string $taxonomy Taxonomy Name + * @return array|WP_Error List of Term Objects. WP_Error returned if $taxonomy does not exist + */ +function get_term_children( $term_id, $taxonomy ) { + if ( ! taxonomy_exists($taxonomy) ) + return new WP_Error('invalid_taxonomy', __('Invalid Taxonomy')); + + $term_id = intval( $term_id ); + + $terms = _get_term_hierarchy($taxonomy); + + if ( ! isset($terms[$term_id]) ) + return array(); + + $children = $terms[$term_id]; + + foreach ( (array) $terms[$term_id] as $child ) { + if ( isset($terms[$child]) ) + $children = array_merge($children, get_term_children($child, $taxonomy)); + } + + return $children; +} + +/** + * Get sanitized Term field. + * + * Does checks for $term, based on the $taxonomy. The function is for contextual + * reasons and for simplicity of usage. See sanitize_term_field() for more + * information. + * + * @package WordPress + * @subpackage Taxonomy + * @since 2.3.0 + * + * @uses sanitize_term_field() Passes the return value in sanitize_term_field on success. + * + * @param string $field Term field to fetch + * @param int $term Term ID + * @param string $taxonomy Taxonomy Name + * @param string $context Optional, default is display. Look at sanitize_term_field() for available options. + * @return mixed Will return an empty string if $term is not an object or if $field is not set in $term. + */ +function get_term_field( $field, $term, $taxonomy, $context = 'display' ) { + $term = (int) $term; + $term = get_term( $term, $taxonomy ); + if ( is_wp_error($term) ) + return $term; + + if ( !is_object($term) ) + return ''; + + if ( !isset($term->$field) ) + return ''; + + return sanitize_term_field($field, $term->$field, $term->term_id, $taxonomy, $context); +} + +/** + * Sanitizes Term for editing. + * + * Return value is sanitize_term() and usage is for sanitizing the term for + * editing. Function is for contextual and simplicity. + * + * @package WordPress + * @subpackage Taxonomy + * @since 2.3.0 + * + * @uses sanitize_term() Passes the return value on success + * + * @param int|object $id Term ID or Object + * @param string $taxonomy Taxonomy Name + * @return mixed|null|WP_Error Will return empty string if $term is not an object. + */ +function get_term_to_edit( $id, $taxonomy ) { + $term = get_term( $id, $taxonomy ); + + if ( is_wp_error($term) ) + return $term; + + if ( !is_object($term) ) + return ''; + + return sanitize_term($term, $taxonomy, 'edit'); +} + +/** + * Retrieve the terms in a given taxonomy or list of taxonomies. + * + * You can fully inject any customizations to the query before it is sent, as + * well as control the output with a filter. + * + * The 'get_terms' filter will be called when the cache has the term and will + * pass the found term along with the array of $taxonomies and array of $args. + * This filter is also called before the array of terms is passed and will pass + * the array of terms, along with the $taxonomies and $args. + * + * The 'list_terms_exclusions' filter passes the compiled exclusions along with + * the $args. + * + * The 'get_terms_orderby' filter passes the ORDER BY clause for the query + * along with the $args array. + * + * The 'get_terms_fields' filter passes the fields for the SELECT query + * along with the $args array. + * + * The list of arguments that $args can contain, which will overwrite the defaults: + * + * orderby - Default is 'name'. Can be name, count, term_group, slug or nothing + * (will use term_id), Passing a custom value other than these will cause it to + * order based on the custom value. + * + * order - Default is ASC. Can use DESC. + * + * hide_empty - Default is true. Will not return empty terms, which means + * terms whose count is 0 according to the given taxonomy. + * + * exclude - Default is an empty array. An array, comma- or space-delimited string + * of term ids to exclude from the return array. If 'include' is non-empty, + * 'exclude' is ignored. + * + * exclude_tree - Default is an empty array. An array, comma- or space-delimited + * string of term ids to exclude from the return array, along with all of their + * descendant terms according to the primary taxonomy. If 'include' is non-empty, + * 'exclude_tree' is ignored. + * + * include - Default is an empty array. An array, comma- or space-delimited string + * of term ids to include in the return array. + * + * number - The maximum number of terms to return. Default is to return them all. + * + * offset - The number by which to offset the terms query. + * + * fields - Default is 'all', which returns an array of term objects. + * If 'fields' is 'ids' or 'names', returns an array of + * integers or strings, respectively. + * + * slug - Returns terms whose "slug" matches this value. Default is empty string. + * + * hierarchical - Whether to include terms that have non-empty descendants + * (even if 'hide_empty' is set to true). + * + * search - Returned terms' names will contain the value of 'search', + * case-insensitive. Default is an empty string. + * + * name__like - Returned terms' names will begin with the value of 'name__like', + * case-insensitive. Default is empty string. + * + * The argument 'pad_counts', if set to true will include the quantity of a term's + * children in the quantity of each term's "count" object variable. + * + * The 'get' argument, if set to 'all' instead of its default empty string, + * returns terms regardless of ancestry or whether the terms are empty. + * + * The 'child_of' argument, when used, should be set to the integer of a term ID. Its default + * is 0. If set to a non-zero value, all returned terms will be descendants + * of that term according to the given taxonomy. Hence 'child_of' is set to 0 + * if more than one taxonomy is passed in $taxonomies, because multiple taxonomies + * make term ancestry ambiguous. + * + * The 'parent' argument, when used, should be set to the integer of a term ID. Its default is + * the empty string '', which has a different meaning from the integer 0. + * If set to an integer value, all returned terms will have as an immediate + * ancestor the term whose ID is specified by that integer according to the given taxonomy. + * The 'parent' argument is different from 'child_of' in that a term X is considered a 'parent' + * of term Y only if term X is the father of term Y, not its grandfather or great-grandfather, etc. + * + * The 'cache_domain' argument enables a unique cache key to be produced when this query is stored + * in object cache. For instance, if you are using one of this function's filters to modify the + * query (such as 'terms_clauses'), setting 'cache_domain' to a unique value will not overwrite + * the cache for similar queries. Default value is 'core'. + * + * @package WordPress + * @subpackage Taxonomy + * @since 2.3.0 + * + * @uses $wpdb + * @uses wp_parse_args() Merges the defaults with those defined by $args and allows for strings. + * + * @param string|array $taxonomies Taxonomy name or list of Taxonomy names + * @param string|array $args The values of what to search for when returning terms + * @return array|WP_Error List of Term Objects and their children. Will return WP_Error, if any of $taxonomies do not exist. + */ +function &get_terms($taxonomies, $args = '') { + global $wpdb; + $empty_array = array(); + + $single_taxonomy = false; + if ( !is_array($taxonomies) ) { + $single_taxonomy = true; + $taxonomies = array($taxonomies); + } + + foreach ( $taxonomies as $taxonomy ) { + if ( ! taxonomy_exists($taxonomy) ) { + $error = & new WP_Error('invalid_taxonomy', __('Invalid Taxonomy')); + return $error; + } + } + + $defaults = array('orderby' => 'name', 'order' => 'ASC', + 'hide_empty' => true, 'exclude' => array(), 'exclude_tree' => array(), 'include' => array(), + 'number' => '', 'fields' => 'all', 'slug' => '', 'parent' => '', + 'hierarchical' => true, 'child_of' => 0, 'get' => '', 'name__like' => '', + 'pad_counts' => false, 'offset' => '', 'search' => '', 'cache_domain' => 'core' ); + $args = wp_parse_args( $args, $defaults ); + $args['number'] = absint( $args['number'] ); + $args['offset'] = absint( $args['offset'] ); + if ( !$single_taxonomy || !is_taxonomy_hierarchical($taxonomies[0]) || + '' !== $args['parent'] ) { + $args['child_of'] = 0; + $args['hierarchical'] = false; + $args['pad_counts'] = false; + } + + if ( 'all' == $args['get'] ) { + $args['child_of'] = 0; + $args['hide_empty'] = 0; + $args['hierarchical'] = false; + $args['pad_counts'] = false; + } + + $args = apply_filters( 'get_terms_args', $args, $taxonomies ); + + extract($args, EXTR_SKIP); + + if ( $child_of ) { + $hierarchy = _get_term_hierarchy($taxonomies[0]); + if ( !isset($hierarchy[$child_of]) ) + return $empty_array; + } + + if ( $parent ) { + $hierarchy = _get_term_hierarchy($taxonomies[0]); + if ( !isset($hierarchy[$parent]) ) + return $empty_array; + } + + // $args can be whatever, only use the args defined in defaults to compute the key + $filter_key = ( has_filter('list_terms_exclusions') ) ? serialize($GLOBALS['wp_filter']['list_terms_exclusions']) : ''; + $key = md5( serialize( compact(array_keys($defaults)) ) . serialize( $taxonomies ) . $filter_key ); + $last_changed = wp_cache_get('last_changed', 'terms'); + if ( !$last_changed ) { + $last_changed = time(); + wp_cache_set('last_changed', $last_changed, 'terms'); + } + $cache_key = "get_terms:$key:$last_changed"; + $cache = wp_cache_get( $cache_key, 'terms' ); + if ( false !== $cache ) { + $cache = apply_filters('get_terms', $cache, $taxonomies, $args); + return $cache; + } + + $_orderby = strtolower($orderby); + if ( 'count' == $_orderby ) + $orderby = 'tt.count'; + else if ( 'name' == $_orderby ) + $orderby = 't.name'; + else if ( 'slug' == $_orderby ) + $orderby = 't.slug'; + else if ( 'term_group' == $_orderby ) + $orderby = 't.term_group'; + else if ( 'none' == $_orderby ) + $orderby = ''; + elseif ( empty($_orderby) || 'id' == $_orderby ) + $orderby = 't.term_id'; + else + $orderby = 't.name'; + + $orderby = apply_filters( 'get_terms_orderby', $orderby, $args ); + + if ( !empty($orderby) ) + $orderby = "ORDER BY $orderby"; + else + $order = ''; + + $order = strtoupper( $order ); + if ( '' !== $order && !in_array( $order, array( 'ASC', 'DESC' ) ) ) + $order = 'ASC'; + + $where = "tt.taxonomy IN ('" . implode("', '", $taxonomies) . "')"; + $inclusions = ''; + if ( !empty($include) ) { + $exclude = ''; + $exclude_tree = ''; + $interms = wp_parse_id_list($include); + foreach ( $interms as $interm ) { + if ( empty($inclusions) ) + $inclusions = ' AND ( t.term_id = ' . intval($interm) . ' '; + else + $inclusions .= ' OR t.term_id = ' . intval($interm) . ' '; + } + } + + if ( !empty($inclusions) ) + $inclusions .= ')'; + $where .= $inclusions; + + $exclusions = ''; + if ( !empty( $exclude_tree ) ) { + $excluded_trunks = wp_parse_id_list($exclude_tree); + foreach ( $excluded_trunks as $extrunk ) { + $excluded_children = (array) get_terms($taxonomies[0], array('child_of' => intval($extrunk), 'fields' => 'ids', 'hide_empty' => 0)); + $excluded_children[] = $extrunk; + foreach( $excluded_children as $exterm ) { + if ( empty($exclusions) ) + $exclusions = ' AND ( t.term_id <> ' . intval($exterm) . ' '; + else + $exclusions .= ' AND t.term_id <> ' . intval($exterm) . ' '; + } + } + } + + if ( !empty($exclude) ) { + $exterms = wp_parse_id_list($exclude); + foreach ( $exterms as $exterm ) { + if ( empty($exclusions) ) + $exclusions = ' AND ( t.term_id <> ' . intval($exterm) . ' '; + else + $exclusions .= ' AND t.term_id <> ' . intval($exterm) . ' '; + } + } + + if ( !empty($exclusions) ) + $exclusions .= ')'; + $exclusions = apply_filters('list_terms_exclusions', $exclusions, $args ); + $where .= $exclusions; + + if ( !empty($slug) ) { + $slug = sanitize_title($slug); + $where .= " AND t.slug = '$slug'"; + } + + if ( !empty($name__like) ) { + $name__like = like_escape( $name__like ); + $where .= $wpdb->prepare( " AND t.name LIKE %s", $name__like . '%' ); + } + + if ( '' !== $parent ) { + $parent = (int) $parent; + $where .= " AND tt.parent = '$parent'"; + } + + if ( $hide_empty && !$hierarchical ) + $where .= ' AND tt.count > 0'; + + // don't limit the query results when we have to descend the family tree + if ( ! empty($number) && ! $hierarchical && empty( $child_of ) && '' === $parent ) { + if ( $offset ) + $limits = 'LIMIT ' . $offset . ',' . $number; + else + $limits = 'LIMIT ' . $number; + } else { + $limits = ''; + } + + if ( !empty($search) ) { + $search = like_escape($search); + $where .= $wpdb->prepare( " AND (t.name LIKE %s)", '%' . $search . '%'); + } + + $selects = array(); + switch ( $fields ) { + case 'all': + $selects = array('t.*', 'tt.*'); + break; + case 'ids': + case 'id=>parent': + $selects = array('t.term_id', 'tt.parent', 'tt.count'); + break; + case 'names': + $selects = array('t.term_id', 'tt.parent', 'tt.count', 't.name'); + break; + case 'count': + $orderby = ''; + $order = ''; + $selects = array('COUNT(*)'); + } + + $_fields = $fields; + + $fields = implode(', ', apply_filters( 'get_terms_fields', $selects, $args )); + + $join = "INNER JOIN $wpdb->term_taxonomy AS tt ON t.term_id = tt.term_id"; + + $pieces = array( 'fields', 'join', 'where', 'orderby', 'order', 'limits' ); + $clauses = apply_filters( 'terms_clauses', compact( $pieces ), $taxonomies, $args ); + foreach ( $pieces as $piece ) + $$piece = isset( $clauses[ $piece ] ) ? $clauses[ $piece ] : ''; + + $query = "SELECT $fields FROM $wpdb->terms AS t $join WHERE $where $orderby $order $limits"; + + $fields = $_fields; + + if ( 'count' == $fields ) { + $term_count = $wpdb->get_var($query); + return $term_count; + } + + $terms = $wpdb->get_results($query); + if ( 'all' == $fields ) { + update_term_cache($terms); + } + + if ( empty($terms) ) { + wp_cache_add( $cache_key, array(), 'terms', 86400 ); // one day + $terms = apply_filters('get_terms', array(), $taxonomies, $args); + return $terms; + } + + if ( $child_of ) { + $children = _get_term_hierarchy($taxonomies[0]); + if ( ! empty($children) ) + $terms = & _get_term_children($child_of, $terms, $taxonomies[0]); + } + + // Update term counts to include children. + if ( $pad_counts && 'all' == $fields ) + _pad_term_counts($terms, $taxonomies[0]); + + // Make sure we show empty categories that have children. + if ( $hierarchical && $hide_empty && is_array($terms) ) { + foreach ( $terms as $k => $term ) { + if ( ! $term->count ) { + $children = _get_term_children($term->term_id, $terms, $taxonomies[0]); + if ( is_array($children) ) + foreach ( $children as $child ) + if ( $child->count ) + continue 2; + + // It really is empty + unset($terms[$k]); + } + } + } + reset ( $terms ); + + $_terms = array(); + if ( 'id=>parent' == $fields ) { + while ( $term = array_shift($terms) ) + $_terms[$term->term_id] = $term->parent; + $terms = $_terms; + } elseif ( 'ids' == $fields ) { + while ( $term = array_shift($terms) ) + $_terms[] = $term->term_id; + $terms = $_terms; + } elseif ( 'names' == $fields ) { + while ( $term = array_shift($terms) ) + $_terms[] = $term->name; + $terms = $_terms; + } + + if ( 0 < $number && intval(@count($terms)) > $number ) { + $terms = array_slice($terms, $offset, $number); + } + + wp_cache_add( $cache_key, $terms, 'terms', 86400 ); // one day + + $terms = apply_filters('get_terms', $terms, $taxonomies, $args); + return $terms; +} + +/** + * Check if Term exists. + * + * Returns the index of a defined term, or 0 (false) if the term doesn't exist. + * + * Formerly is_term(), introduced in 2.3.0. + * + * @package WordPress + * @subpackage Taxonomy + * @since 3.0.0 + * + * @uses $wpdb + * + * @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 term_exists($term, $taxonomy = '', $parent = 0) { + global $wpdb; + + $select = "SELECT term_id FROM $wpdb->terms as t WHERE "; + $tax_select = "SELECT tt.term_id, tt.term_taxonomy_id FROM $wpdb->terms AS t INNER JOIN $wpdb->term_taxonomy as tt ON tt.term_id = t.term_id WHERE "; + + if ( is_int($term) ) { + if ( 0 == $term ) + return 0; + $where = 't.term_id = %d'; + if ( !empty($taxonomy) ) + return $wpdb->get_row( $wpdb->prepare( $tax_select . $where . " AND tt.taxonomy = %s", $term, $taxonomy ), ARRAY_A ); + else + return $wpdb->get_var( $wpdb->prepare( $select . $where, $term ) ); + } + + $term = trim( stripslashes( $term ) ); + + if ( '' === $slug = sanitize_title($term) ) + return 0; + + $where = 't.slug = %s'; + $else_where = 't.name = %s'; + $where_fields = array($slug); + $else_where_fields = array($term); + if ( !empty($taxonomy) ) { + $parent = (int) $parent; + if ( $parent > 0 ) { + $where_fields[] = $parent; + $else_where_fields[] = $parent; + $where .= ' AND tt.parent = %d'; + $else_where .= ' AND tt.parent = %d'; + } + + $where_fields[] = $taxonomy; + $else_where_fields[] = $taxonomy; + + if ( $result = $wpdb->get_row( $wpdb->prepare("SELECT tt.term_id, tt.term_taxonomy_id FROM $wpdb->terms AS t INNER JOIN $wpdb->term_taxonomy as tt ON tt.term_id = t.term_id WHERE $where AND tt.taxonomy = %s", $where_fields), ARRAY_A) ) + return $result; + + return $wpdb->get_row( $wpdb->prepare("SELECT tt.term_id, tt.term_taxonomy_id FROM $wpdb->terms AS t INNER JOIN $wpdb->term_taxonomy as tt ON tt.term_id = t.term_id WHERE $else_where AND tt.taxonomy = %s", $else_where_fields), ARRAY_A); + } + + if ( $result = $wpdb->get_var( $wpdb->prepare("SELECT term_id FROM $wpdb->terms as t WHERE $where", $where_fields) ) ) + return $result; + + return $wpdb->get_var( $wpdb->prepare("SELECT term_id FROM $wpdb->terms as t WHERE $else_where", $else_where_fields) ); +} + +/** + * Sanitize Term all fields. + * + * Relys on sanitize_term_field() to sanitize the term. The difference is that + * this function will sanitize all fields. The context is based + * on sanitize_term_field(). + * + * The $term is expected to be either an array or an object. + * + * @package WordPress + * @subpackage Taxonomy + * @since 2.3.0 + * + * @uses sanitize_term_field Used to sanitize all fields in a term + * + * @param array|object $term The term to check + * @param string $taxonomy The taxonomy name to use + * @param string $context Default is 'display'. + * @return array|object Term with all fields sanitized + */ +function sanitize_term($term, $taxonomy, $context = 'display') { + + if ( 'raw' == $context ) + return $term; + + $fields = array('term_id', 'name', 'description', 'slug', 'count', 'parent', 'term_group'); + + $do_object = false; + if ( is_object($term) ) + $do_object = true; + + $term_id = $do_object ? $term->term_id : (isset($term['term_id']) ? $term['term_id'] : 0); + + foreach ( (array) $fields as $field ) { + if ( $do_object ) { + if ( isset($term->$field) ) + $term->$field = sanitize_term_field($field, $term->$field, $term_id, $taxonomy, $context); + } else { + if ( isset($term[$field]) ) + $term[$field] = sanitize_term_field($field, $term[$field], $term_id, $taxonomy, $context); + } + } + + if ( $do_object ) + $term->filter = $context; + else + $term['filter'] = $context; + + return $term; +} + +/** + * Cleanse the field value in the term based on the context. + * + * Passing a term field value through the function should be assumed to have + * cleansed the value for whatever context the term field is going to be used. + * + * If no context or an unsupported context is given, then default filters will + * be applied. + * + * There are enough filters for each context to support a custom filtering + * without creating your own filter function. Simply create a function that + * hooks into the filter you need. + * + * @package WordPress + * @subpackage Taxonomy + * @since 2.3.0 + * + * @uses $wpdb + * + * @param string $field Term field to sanitize + * @param string $value Search for this term value + * @param int $term_id Term ID + * @param string $taxonomy Taxonomy Name + * @param string $context Either edit, db, display, attribute, or js. + * @return mixed sanitized field + */ +function sanitize_term_field($field, $value, $term_id, $taxonomy, $context) { + if ( 'parent' == $field || 'term_id' == $field || 'count' == $field || 'term_group' == $field ) { + $value = (int) $value; + if ( $value < 0 ) + $value = 0; + } + + if ( 'raw' == $context ) + return $value; + + if ( 'edit' == $context ) { + $value = apply_filters("edit_term_{$field}", $value, $term_id, $taxonomy); + $value = apply_filters("edit_{$taxonomy}_{$field}", $value, $term_id); + if ( 'description' == $field ) + $value = esc_html($value); // textarea_escaped + else + $value = esc_attr($value); + } else if ( 'db' == $context ) { + $value = apply_filters("pre_term_{$field}", $value, $taxonomy); + $value = apply_filters("pre_{$taxonomy}_{$field}", $value); + // Back compat filters + if ( 'slug' == $field ) + $value = apply_filters('pre_category_nicename', $value); + + } else if ( 'rss' == $context ) { + $value = apply_filters("term_{$field}_rss", $value, $taxonomy); + $value = apply_filters("{$taxonomy}_{$field}_rss", $value); + } else { + // Use display filters by default. + $value = apply_filters("term_{$field}", $value, $term_id, $taxonomy, $context); + $value = apply_filters("{$taxonomy}_{$field}", $value, $term_id, $context); + } + + if ( 'attribute' == $context ) + $value = esc_attr($value); + else if ( 'js' == $context ) + $value = esc_js($value); + + return $value; +} + +/** + * Count how many terms are in Taxonomy. + * + * Default $args is 'hide_empty' which can be 'hide_empty=true' or array('hide_empty' => true). + * + * @package WordPress + * @subpackage Taxonomy + * @since 2.3.0 + * + * @uses get_terms() + * @uses wp_parse_args() Turns strings into arrays and merges defaults into an array. + * + * @param string $taxonomy Taxonomy name + * @param array|string $args Overwrite defaults. See get_terms() + * @return int How many terms are in $taxonomy + */ +function wp_count_terms( $taxonomy, $args = array() ) { + $defaults = array('hide_empty' => false); + $args = wp_parse_args($args, $defaults); + + // backwards compatibility + if ( isset($args['ignore_empty']) ) { + $args['hide_empty'] = $args['ignore_empty']; + unset($args['ignore_empty']); + } + + $args['fields'] = 'count'; + + return get_terms($taxonomy, $args); +} + +/** + * Will unlink the object from the taxonomy or taxonomies. + * + * Will remove all relationships between the object and any terms in + * a particular taxonomy or taxonomies. Does not remove the term or + * taxonomy itself. + * + * @package WordPress + * @subpackage Taxonomy + * @since 2.3.0 + * @uses $wpdb + * + * @param int $object_id The term Object Id that refers to the term + * @param string|array $taxonomies List of Taxonomy Names or single Taxonomy name. + */ +function wp_delete_object_term_relationships( $object_id, $taxonomies ) { + global $wpdb; + + $object_id = (int) $object_id; + + if ( !is_array($taxonomies) ) + $taxonomies = array($taxonomies); + + foreach ( (array) $taxonomies as $taxonomy ) { + $tt_ids = wp_get_object_terms($object_id, $taxonomy, array('fields' => 'tt_ids')); + $in_tt_ids = "'" . implode("', '", $tt_ids) . "'"; + do_action( 'delete_term_relationships', $object_id, $tt_ids ); + $wpdb->query( $wpdb->prepare("DELETE FROM $wpdb->term_relationships WHERE object_id = %d AND term_taxonomy_id IN ($in_tt_ids)", $object_id) ); + do_action( 'deleted_term_relationships', $object_id, $tt_ids ); + wp_update_term_count($tt_ids, $taxonomy); + } +} + +/** + * Removes a term from the database. + * + * If the term is a parent of other terms, then the children will be updated to + * that term's parent. + * + * The $args 'default' will only override the terms found, if there is only one + * term found. Any other and the found terms are used. + * + * The $args 'force_default' will force the term supplied as default to be + * assigned even if the object was not going to be termless + * @package WordPress + * @subpackage Taxonomy + * @since 2.3.0 + * + * @uses $wpdb + * @uses do_action() Calls both 'delete_term' and 'delete_$taxonomy' action + * hooks, passing term object, term id. 'delete_term' gets an additional + * parameter with the $taxonomy parameter. + * + * @param int $term Term ID + * @param string $taxonomy Taxonomy Name + * @param array|string $args Optional. Change 'default' term id and override found term ids. + * @return bool|WP_Error Returns false if not term; true if completes delete action. + */ +function wp_delete_term( $term, $taxonomy, $args = array() ) { + global $wpdb; + + $term = (int) $term; + + if ( ! $ids = term_exists($term, $taxonomy) ) + return false; + if ( is_wp_error( $ids ) ) + return $ids; + + $tt_id = $ids['term_taxonomy_id']; + + $defaults = array(); + + if ( 'category' == $taxonomy ) { + $defaults['default'] = get_option( 'default_category' ); + if ( $defaults['default'] == $term ) + return 0; // Don't delete the default category + } + + $args = wp_parse_args($args, $defaults); + extract($args, EXTR_SKIP); + + if ( isset( $default ) ) { + $default = (int) $default; + if ( ! term_exists($default, $taxonomy) ) + unset($default); + } + + // Update children to point to new parent + if ( is_taxonomy_hierarchical($taxonomy) ) { + $term_obj = get_term($term, $taxonomy); + if ( is_wp_error( $term_obj ) ) + return $term_obj; + $parent = $term_obj->parent; + + $edit_tt_ids = $wpdb->get_col( "SELECT `term_taxonomy_id` FROM $wpdb->term_taxonomy WHERE `parent` = " . (int)$term_obj->term_id ); + do_action( 'edit_term_taxonomies', $edit_tt_ids ); + $wpdb->update( $wpdb->term_taxonomy, compact( 'parent' ), array( 'parent' => $term_obj->term_id) + compact( 'taxonomy' ) ); + do_action( 'edited_term_taxonomies', $edit_tt_ids ); + } + + $objects = $wpdb->get_col( $wpdb->prepare( "SELECT object_id FROM $wpdb->term_relationships WHERE term_taxonomy_id = %d", $tt_id ) ); + + foreach ( (array) $objects as $object ) { + $terms = wp_get_object_terms($object, $taxonomy, array('fields' => 'ids', 'orderby' => 'none')); + if ( 1 == count($terms) && isset($default) ) { + $terms = array($default); + } else { + $terms = array_diff($terms, array($term)); + if (isset($default) && isset($force_default) && $force_default) + $terms = array_merge($terms, array($default)); + } + $terms = array_map('intval', $terms); + wp_set_object_terms($object, $terms, $taxonomy); + } + + // Clean the relationship caches for all object types using this term + $tax_object = get_taxonomy( $taxonomy ); + foreach ( $tax_object->object_type as $object_type ) + clean_object_term_cache( $objects, $object_type ); + + do_action( 'delete_term_taxonomy', $tt_id ); + $wpdb->query( $wpdb->prepare( "DELETE FROM $wpdb->term_taxonomy WHERE term_taxonomy_id = %d", $tt_id ) ); + do_action( 'deleted_term_taxonomy', $tt_id ); + + // Delete the term if no taxonomies use it. + if ( !$wpdb->get_var( $wpdb->prepare( "SELECT COUNT(*) FROM $wpdb->term_taxonomy WHERE term_id = %d", $term) ) ) + $wpdb->query( $wpdb->prepare( "DELETE FROM $wpdb->terms WHERE term_id = %d", $term) ); + + clean_term_cache($term, $taxonomy); + + do_action('delete_term', $term, $tt_id, $taxonomy); + do_action("delete_$taxonomy", $term, $tt_id); + + return true; +} + +/** + * Deletes one existing category. + * + * @since 2.0.0 + * @uses wp_delete_term() + * + * @param int $cat_ID + * @return mixed Returns true if completes delete action; false if term doesnt exist; + * Zero on attempted deletion of default Category; WP_Error object is also a possibility. + */ +function wp_delete_category( $cat_ID ) { + return wp_delete_term( $cat_ID, 'category' ); +} + +/** + * Retrieves the terms associated with the given object(s), in the supplied taxonomies. + * + * The following information has to do the $args parameter and for what can be + * contained in the string or array of that parameter, if it exists. + * + * The first argument is called, 'orderby' and has the default value of 'name'. + * The other value that is supported is 'count'. + * + * The second argument is called, 'order' and has the default value of 'ASC'. + * The only other value that will be acceptable is 'DESC'. + * + * The final argument supported is called, 'fields' and has the default value of + * 'all'. There are multiple other options that can be used instead. Supported + * values are as follows: 'all', 'ids', 'names', and finally + * 'all_with_object_id'. + * + * The fields argument also decides what will be returned. If 'all' or + * 'all_with_object_id' is choosen or the default kept intact, then all matching + * terms objects will be returned. If either 'ids' or 'names' is used, then an + * array of all matching term ids or term names will be returned respectively. + * + * @package WordPress + * @subpackage Taxonomy + * @since 2.3.0 + * @uses $wpdb + * + * @param int|array $object_ids The ID(s) of the object(s) to retrieve. + * @param string|array $taxonomies The taxonomies to retrieve terms from. + * @param array|string $args Change what is returned + * @return array|WP_Error The requested term data or empty array if no terms found. WP_Error if $taxonomy does not exist. + */ +function wp_get_object_terms($object_ids, $taxonomies, $args = array()) { + global $wpdb; + + if ( !is_array($taxonomies) ) + $taxonomies = array($taxonomies); + + foreach ( (array) $taxonomies as $taxonomy ) { + if ( ! taxonomy_exists($taxonomy) ) + return new WP_Error('invalid_taxonomy', __('Invalid Taxonomy')); + } + + if ( !is_array($object_ids) ) + $object_ids = array($object_ids); + $object_ids = array_map('intval', $object_ids); + + $defaults = array('orderby' => 'name', 'order' => 'ASC', 'fields' => 'all'); + $args = wp_parse_args( $args, $defaults ); + + $terms = array(); + if ( count($taxonomies) > 1 ) { + foreach ( $taxonomies as $index => $taxonomy ) { + $t = get_taxonomy($taxonomy); + if ( isset($t->args) && is_array($t->args) && $args != array_merge($args, $t->args) ) { + unset($taxonomies[$index]); + $terms = array_merge($terms, wp_get_object_terms($object_ids, $taxonomy, array_merge($args, $t->args))); + } + } + } else { + $t = get_taxonomy($taxonomies[0]); + if ( isset($t->args) && is_array($t->args) ) + $args = array_merge($args, $t->args); + } + + extract($args, EXTR_SKIP); + + if ( 'count' == $orderby ) + $orderby = 'tt.count'; + else if ( 'name' == $orderby ) + $orderby = 't.name'; + else if ( 'slug' == $orderby ) + $orderby = 't.slug'; + else if ( 'term_group' == $orderby ) + $orderby = 't.term_group'; + else if ( 'term_order' == $orderby ) + $orderby = 'tr.term_order'; + else if ( 'none' == $orderby ) { + $orderby = ''; + $order = ''; + } else { + $orderby = 't.term_id'; + } + + // tt_ids queries can only be none or tr.term_taxonomy_id + if ( ('tt_ids' == $fields) && !empty($orderby) ) + $orderby = 'tr.term_taxonomy_id'; + + if ( !empty($orderby) ) + $orderby = "ORDER BY $orderby"; + + $taxonomies = "'" . implode("', '", $taxonomies) . "'"; + $object_ids = implode(', ', $object_ids); + + $select_this = ''; + if ( 'all' == $fields ) + $select_this = 't.*, tt.*'; + else if ( 'ids' == $fields ) + $select_this = 't.term_id'; + else if ( 'names' == $fields ) + $select_this = 't.name'; + else if ( 'all_with_object_id' == $fields ) + $select_this = 't.*, tt.*, tr.object_id'; + + $query = "SELECT $select_this FROM $wpdb->terms AS t INNER JOIN $wpdb->term_taxonomy AS tt ON tt.term_id = t.term_id INNER JOIN $wpdb->term_relationships AS tr ON tr.term_taxonomy_id = tt.term_taxonomy_id WHERE tt.taxonomy IN ($taxonomies) AND tr.object_id IN ($object_ids) $orderby $order"; + + if ( 'all' == $fields || 'all_with_object_id' == $fields ) { + $terms = array_merge($terms, $wpdb->get_results($query)); + update_term_cache($terms); + } else if ( 'ids' == $fields || 'names' == $fields ) { + $terms = array_merge($terms, $wpdb->get_col($query)); + } else if ( 'tt_ids' == $fields ) { + $terms = $wpdb->get_col("SELECT tr.term_taxonomy_id FROM $wpdb->term_relationships AS tr INNER JOIN $wpdb->term_taxonomy AS tt ON tr.term_taxonomy_id = tt.term_taxonomy_id WHERE tr.object_id IN ($object_ids) AND tt.taxonomy IN ($taxonomies) $orderby $order"); + } + + if ( ! $terms ) + $terms = array(); + + return apply_filters('wp_get_object_terms', $terms, $object_ids, $taxonomies, $args); +} + +/** + * Adds a new term to the database. Optionally marks it as an alias of an existing term. + * + * Error handling is assigned for the nonexistance of the $taxonomy and $term + * parameters before inserting. If both the term id and taxonomy exist + * previously, then an array will be returned that contains the term id and the + * contents of what is returned. The keys of the array are 'term_id' and + * 'term_taxonomy_id' containing numeric values. + * + * It is assumed that the term does not yet exist or the above will apply. The + * term will be first added to the term table and then related to the taxonomy + * if everything is well. If everything is correct, then several actions will be + * run prior to a filter and then several actions will be run after the filter + * is run. + * + * The arguments decide how the term is handled based on the $args parameter. + * The following is a list of the available overrides and the defaults. + * + * 'alias_of'. There is no default, but if added, expected is the slug that the + * term will be an alias of. Expected to be a string. + * + * 'description'. There is no default. If exists, will be added to the database + * along with the term. Expected to be a string. + * + * 'parent'. Expected to be numeric and default is 0 (zero). Will assign value + * of 'parent' to the term. + * + * 'slug'. Expected to be a string. There is no default. + * + * If 'slug' argument exists then the slug will be checked to see if it is not + * a valid term. If that check succeeds (it is not a valid term), then it is + * added and the term id is given. If it fails, then a check is made to whether + * the taxonomy is hierarchical and the parent argument is not empty. If the + * second check succeeds, the term will be inserted and the term id will be + * given. + * + * @package WordPress + * @subpackage Taxonomy + * @since 2.3.0 + * @uses $wpdb + * + * @uses apply_filters() Calls 'pre_insert_term' hook with term and taxonomy as parameters. + * @uses do_action() Calls 'create_term' hook with the term id and taxonomy id as parameters. + * @uses do_action() Calls 'create_$taxonomy' hook with term id and taxonomy id as parameters. + * @uses apply_filters() Calls 'term_id_filter' hook with term id and taxonomy id as parameters. + * @uses do_action() Calls 'created_term' hook with the term id and taxonomy id as parameters. + * @uses do_action() Calls 'created_$taxonomy' hook with term id and taxonomy id as parameters. + * + * @param string $term The term to add or update. + * @param string $taxonomy The taxonomy to which to add the term + * @param array|string $args Change the values of the inserted term + * @return array|WP_Error The Term ID and Term Taxonomy ID + */ +function wp_insert_term( $term, $taxonomy, $args = array() ) { + global $wpdb; + + if ( ! taxonomy_exists($taxonomy) ) + return new WP_Error('invalid_taxonomy', __('Invalid taxonomy')); + + $term = apply_filters( 'pre_insert_term', $term, $taxonomy ); + if ( is_wp_error( $term ) ) + return $term; + + if ( is_int($term) && 0 == $term ) + return new WP_Error('invalid_term_id', __('Invalid term ID')); + + if ( '' == trim($term) ) + return new WP_Error('empty_term_name', __('A name is required for this term')); + + $defaults = array( 'alias_of' => '', 'description' => '', 'parent' => 0, 'slug' => ''); + $args = wp_parse_args($args, $defaults); + $args['name'] = $term; + $args['taxonomy'] = $taxonomy; + $args = sanitize_term($args, $taxonomy, 'db'); + extract($args, EXTR_SKIP); + + // expected_slashed ($name) + $name = stripslashes($name); + $description = stripslashes($description); + + if ( empty($slug) ) + $slug = sanitize_title($name); + + $term_group = 0; + if ( $alias_of ) { + $alias = $wpdb->get_row( $wpdb->prepare( "SELECT term_id, term_group FROM $wpdb->terms WHERE slug = %s", $alias_of) ); + if ( $alias->term_group ) { + // The alias we want is already in a group, so let's use that one. + $term_group = $alias->term_group; + } else { + // The alias isn't in a group, so let's create a new one and firstly add the alias term to it. + $term_group = $wpdb->get_var("SELECT MAX(term_group) FROM $wpdb->terms") + 1; + do_action( 'edit_terms', $alias->term_id ); + $wpdb->update($wpdb->terms, compact('term_group'), array('term_id' => $alias->term_id) ); + do_action( 'edited_terms', $alias->term_id ); + } + } + + if ( $term_id = term_exists($slug) ) { + $existing_term = $wpdb->get_row( $wpdb->prepare( "SELECT name FROM $wpdb->terms WHERE term_id = %d", $term_id), ARRAY_A ); + // We've got an existing term in the same taxonomy, which matches the name of the new term: + if ( is_taxonomy_hierarchical($taxonomy) && $existing_term['name'] == $name && $exists = term_exists( (int) $term_id, $taxonomy ) ) { + // Hierarchical, and it matches an existing term, Do not allow same "name" in the same level. + $siblings = get_terms($taxonomy, array('fields' => 'names', 'get' => 'all', 'parent' => (int)$parent) ); + if ( in_array($name, $siblings) ) { + return new WP_Error('term_exists', __('A term with the name provided already exists with this parent.'), $exists['term_id']); + } else { + $slug = wp_unique_term_slug($slug, (object) $args); + if ( false === $wpdb->insert( $wpdb->terms, compact( 'name', 'slug', 'term_group' ) ) ) + return new WP_Error('db_insert_error', __('Could not insert term into the database'), $wpdb->last_error); + $term_id = (int) $wpdb->insert_id; + } + } elseif ( $existing_term['name'] != $name ) { + // We've got an existing term, with a different name, Create the new term. + $slug = wp_unique_term_slug($slug, (object) $args); + if ( false === $wpdb->insert( $wpdb->terms, compact( 'name', 'slug', 'term_group' ) ) ) + return new WP_Error('db_insert_error', __('Could not insert term into the database'), $wpdb->last_error); + $term_id = (int) $wpdb->insert_id; + } elseif ( $exists = term_exists( (int) $term_id, $taxonomy ) ) { + // Same name, same slug. + return new WP_Error('term_exists', __('A term with the name provided already exists.'), $exists['term_id']); + } + } else { + // This term does not exist at all in the database, Create it. + $slug = wp_unique_term_slug($slug, (object) $args); + if ( false === $wpdb->insert( $wpdb->terms, compact( 'name', 'slug', 'term_group' ) ) ) + return new WP_Error('db_insert_error', __('Could not insert term into the database'), $wpdb->last_error); + $term_id = (int) $wpdb->insert_id; + } + + // Seems unreachable, However, Is used in the case that a term name is provided, which sanitizes to an empty string. + if ( empty($slug) ) { + $slug = sanitize_title($slug, $term_id); + do_action( 'edit_terms', $term_id ); + $wpdb->update( $wpdb->terms, compact( 'slug' ), compact( 'term_id' ) ); + do_action( 'edited_terms', $term_id ); + } + + $tt_id = $wpdb->get_var( $wpdb->prepare( "SELECT tt.term_taxonomy_id FROM $wpdb->term_taxonomy AS tt INNER JOIN $wpdb->terms AS t ON tt.term_id = t.term_id WHERE tt.taxonomy = %s AND t.term_id = %d", $taxonomy, $term_id ) ); + + if ( !empty($tt_id) ) + return array('term_id' => $term_id, 'term_taxonomy_id' => $tt_id); + + $wpdb->insert( $wpdb->term_taxonomy, compact( 'term_id', 'taxonomy', 'description', 'parent') + array( 'count' => 0 ) ); + $tt_id = (int) $wpdb->insert_id; + + do_action("create_term", $term_id, $tt_id, $taxonomy); + do_action("create_$taxonomy", $term_id, $tt_id); + + $term_id = apply_filters('term_id_filter', $term_id, $tt_id); + + clean_term_cache($term_id, $taxonomy); + + do_action("created_term", $term_id, $tt_id, $taxonomy); + do_action("created_$taxonomy", $term_id, $tt_id); + + return array('term_id' => $term_id, 'term_taxonomy_id' => $tt_id); +} + +/** + * Create Term and Taxonomy Relationships. + * + * Relates an object (post, link etc) to a term and taxonomy type. Creates the + * term and taxonomy relationship if it doesn't already exist. Creates a term if + * it doesn't exist (using the slug). + * + * A relationship means that the term is grouped in or belongs to the taxonomy. + * A term has no meaning until it is given context by defining which taxonomy it + * exists under. + * + * @package WordPress + * @subpackage Taxonomy + * @since 2.3.0 + * @uses $wpdb + * + * @param int $object_id The object to relate to. + * @param array|int|string $terms The slug or id of the term, will replace all existing + * related terms in this taxonomy. + * @param array|string $taxonomy The context in which to relate the term to the object. + * @param bool $append If false will delete difference of terms. + * @return array|WP_Error Affected Term IDs + */ +function wp_set_object_terms($object_id, $terms, $taxonomy, $append = false) { + global $wpdb; + + $object_id = (int) $object_id; + + if ( ! taxonomy_exists($taxonomy) ) + return new WP_Error('invalid_taxonomy', __('Invalid Taxonomy')); + + if ( !is_array($terms) ) + $terms = array($terms); + + if ( ! $append ) + $old_tt_ids = wp_get_object_terms($object_id, $taxonomy, array('fields' => 'tt_ids', 'orderby' => 'none')); + else + $old_tt_ids = array(); + + $tt_ids = array(); + $term_ids = array(); + + foreach ( (array) $terms as $term) { + if ( !strlen(trim($term)) ) + continue; + + if ( !$term_info = term_exists($term, $taxonomy) ) { + // Skip if a non-existent term ID is passed. + if ( is_int($term) ) + continue; + $term_info = wp_insert_term($term, $taxonomy); + } + if ( is_wp_error($term_info) ) + return $term_info; + $term_ids[] = $term_info['term_id']; + $tt_id = $term_info['term_taxonomy_id']; + $tt_ids[] = $tt_id; + + if ( $wpdb->get_var( $wpdb->prepare( "SELECT term_taxonomy_id FROM $wpdb->term_relationships WHERE object_id = %d AND term_taxonomy_id = %d", $object_id, $tt_id ) ) ) + continue; + do_action( 'add_term_relationship', $object_id, $tt_id ); + $wpdb->insert( $wpdb->term_relationships, array( 'object_id' => $object_id, 'term_taxonomy_id' => $tt_id ) ); + do_action( 'added_term_relationship', $object_id, $tt_id ); + } + + wp_update_term_count($tt_ids, $taxonomy); + + if ( ! $append ) { + $delete_terms = array_diff($old_tt_ids, $tt_ids); + if ( $delete_terms ) { + $in_delete_terms = "'" . implode("', '", $delete_terms) . "'"; + do_action( 'delete_term_relationships', $object_id, $delete_terms ); + $wpdb->query( $wpdb->prepare("DELETE FROM $wpdb->term_relationships WHERE object_id = %d AND term_taxonomy_id IN ($in_delete_terms)", $object_id) ); + do_action( 'deleted_term_relationships', $object_id, $delete_terms ); + wp_update_term_count($delete_terms, $taxonomy); + } + } + + $t = get_taxonomy($taxonomy); + if ( ! $append && isset($t->sort) && $t->sort ) { + $values = array(); + $term_order = 0; + $final_tt_ids = wp_get_object_terms($object_id, $taxonomy, array('fields' => 'tt_ids')); + foreach ( $tt_ids as $tt_id ) + if ( in_array($tt_id, $final_tt_ids) ) + $values[] = $wpdb->prepare( "(%d, %d, %d)", $object_id, $tt_id, ++$term_order); + if ( $values ) + $wpdb->query("INSERT INTO $wpdb->term_relationships (object_id, term_taxonomy_id, term_order) VALUES " . join(',', $values) . " ON DUPLICATE KEY UPDATE term_order = VALUES(term_order)"); + } + + do_action('set_object_terms', $object_id, $terms, $tt_ids, $taxonomy, $append, $old_tt_ids); + return $tt_ids; +} + +/** + * Will make slug unique, if it isn't already. + * + * The $slug has to be unique global to every taxonomy, meaning that one + * taxonomy term can't have a matching slug with another taxonomy term. Each + * slug has to be globally unique for every taxonomy. + * + * The way this works is that if the taxonomy that the term belongs to is + * hierarchical and has a parent, it will append that parent to the $slug. + * + * If that still doesn't return an unique slug, then it try to append a number + * until it finds a number that is truely unique. + * + * The only purpose for $term is for appending a parent, if one exists. + * + * @package WordPress + * @subpackage Taxonomy + * @since 2.3.0 + * @uses $wpdb + * + * @param string $slug The string that will be tried for a unique slug + * @param object $term The term object that the $slug will belong too + * @return string Will return a true unique slug. + */ +function wp_unique_term_slug($slug, $term) { + global $wpdb; + + if ( ! term_exists( $slug ) ) + return $slug; + + // If the taxonomy supports hierarchy and the term has a parent, make the slug unique + // by incorporating parent slugs. + if ( is_taxonomy_hierarchical($term->taxonomy) && !empty($term->parent) ) { + $the_parent = $term->parent; + while ( ! empty($the_parent) ) { + $parent_term = get_term($the_parent, $term->taxonomy); + if ( is_wp_error($parent_term) || empty($parent_term) ) + break; + $slug .= '-' . $parent_term->slug; + if ( ! term_exists( $slug ) ) + return $slug; + + if ( empty($parent_term->parent) ) + break; + $the_parent = $parent_term->parent; + } + } + + // If we didn't get a unique slug, try appending a number to make it unique. + if ( !empty($args['term_id']) ) + $query = $wpdb->prepare( "SELECT slug FROM $wpdb->terms WHERE slug = %s AND term_id != %d", $slug, $args['term_id'] ); + else + $query = $wpdb->prepare( "SELECT slug FROM $wpdb->terms WHERE slug = %s", $slug ); + + if ( $wpdb->get_var( $query ) ) { + $num = 2; + do { + $alt_slug = $slug . "-$num"; + $num++; + $slug_check = $wpdb->get_var( $wpdb->prepare( "SELECT slug FROM $wpdb->terms WHERE slug = %s", $alt_slug ) ); + } while ( $slug_check ); + $slug = $alt_slug; + } + + return $slug; +} + +/** + * Update term based on arguments provided. + * + * The $args will indiscriminately override all values with the same field name. + * Care must be taken to not override important information need to update or + * update will fail (or perhaps create a new term, neither would be acceptable). + * + * Defaults will set 'alias_of', 'description', 'parent', and 'slug' if not + * defined in $args already. + * + * 'alias_of' will create a term group, if it doesn't already exist, and update + * it for the $term. + * + * If the 'slug' argument in $args is missing, then the 'name' in $args will be + * used. It should also be noted that if you set 'slug' and it isn't unique then + * a WP_Error will be passed back. If you don't pass any slug, then a unique one + * will be created for you. + * + * For what can be overrode in $args, check the term scheme can contain and stay + * away from the term keys. + * + * @package WordPress + * @subpackage Taxonomy + * @since 2.3.0 + * + * @uses $wpdb + * @uses do_action() Will call both 'edit_term' and 'edit_$taxonomy' twice. + * @uses apply_filters() Will call the 'term_id_filter' filter and pass the term + * id and taxonomy id. + * + * @param int $term_id The ID of the term + * @param string $taxonomy The context in which to relate the term to the object. + * @param array|string $args Overwrite term field values + * @return array|WP_Error Returns Term ID and Taxonomy Term ID + */ +function wp_update_term( $term_id, $taxonomy, $args = array() ) { + global $wpdb; + + if ( ! taxonomy_exists($taxonomy) ) + return new WP_Error('invalid_taxonomy', __('Invalid taxonomy')); + + $term_id = (int) $term_id; + + // First, get all of the original args + $term = get_term ($term_id, $taxonomy, ARRAY_A); + + if ( is_wp_error( $term ) ) + return $term; + + // Escape data pulled from DB. + $term = add_magic_quotes($term); + + // Merge old and new args with new args overwriting old ones. + $args = array_merge($term, $args); + + $defaults = array( 'alias_of' => '', 'description' => '', 'parent' => 0, 'slug' => ''); + $args = wp_parse_args($args, $defaults); + $args = sanitize_term($args, $taxonomy, 'db'); + extract($args, EXTR_SKIP); + + // expected_slashed ($name) + $name = stripslashes($name); + $description = stripslashes($description); + + if ( '' == trim($name) ) + return new WP_Error('empty_term_name', __('A name is required for this term')); + + $empty_slug = false; + if ( empty($slug) ) { + $empty_slug = true; + $slug = sanitize_title($name); + } + + if ( $alias_of ) { + $alias = $wpdb->get_row( $wpdb->prepare( "SELECT term_id, term_group FROM $wpdb->terms WHERE slug = %s", $alias_of) ); + if ( $alias->term_group ) { + // The alias we want is already in a group, so let's use that one. + $term_group = $alias->term_group; + } else { + // The alias isn't in a group, so let's create a new one and firstly add the alias term to it. + $term_group = $wpdb->get_var("SELECT MAX(term_group) FROM $wpdb->terms") + 1; + do_action( 'edit_terms', $alias->term_id ); + $wpdb->update( $wpdb->terms, compact('term_group'), array( 'term_id' => $alias->term_id ) ); + do_action( 'edited_terms', $alias->term_id ); + } + } + + // Check $parent to see if it will cause a hierarchy loop + $parent = apply_filters( 'wp_update_term_parent', $parent, $term_id, $taxonomy, compact( array_keys( $args ) ), $args ); + + // Check for duplicate slug + $id = $wpdb->get_var( $wpdb->prepare( "SELECT term_id FROM $wpdb->terms WHERE slug = %s", $slug ) ); + if ( $id && ($id != $term_id) ) { + // If an empty slug was passed or the parent changed, reset the slug to something unique. + // Otherwise, bail. + if ( $empty_slug || ( $parent != $term['parent']) ) + $slug = wp_unique_term_slug($slug, (object) $args); + else + return new WP_Error('duplicate_term_slug', sprintf(__('The slug “%s” is already in use by another term'), $slug)); + } + do_action( 'edit_terms', $term_id ); + $wpdb->update($wpdb->terms, compact( 'name', 'slug', 'term_group' ), compact( 'term_id' ) ); + if ( empty($slug) ) { + $slug = sanitize_title($name, $term_id); + $wpdb->update( $wpdb->terms, compact( 'slug' ), compact( 'term_id' ) ); + } + do_action( 'edited_terms', $term_id ); + + $tt_id = $wpdb->get_var( $wpdb->prepare( "SELECT tt.term_taxonomy_id FROM $wpdb->term_taxonomy AS tt INNER JOIN $wpdb->terms AS t ON tt.term_id = t.term_id WHERE tt.taxonomy = %s AND t.term_id = %d", $taxonomy, $term_id) ); + do_action( 'edit_term_taxonomy', $tt_id, $taxonomy ); + $wpdb->update( $wpdb->term_taxonomy, compact( 'term_id', 'taxonomy', 'description', 'parent' ), array( 'term_taxonomy_id' => $tt_id ) ); + do_action( 'edited_term_taxonomy', $tt_id, $taxonomy ); + + do_action("edit_term", $term_id, $tt_id, $taxonomy); + do_action("edit_$taxonomy", $term_id, $tt_id); + + $term_id = apply_filters('term_id_filter', $term_id, $tt_id); + + clean_term_cache($term_id, $taxonomy); + + do_action("edited_term", $term_id, $tt_id, $taxonomy); + do_action("edited_$taxonomy", $term_id, $tt_id); + + return array('term_id' => $term_id, 'term_taxonomy_id' => $tt_id); +} + +/** + * Enable or disable term counting. + * + * @since 2.5.0 + * + * @param bool $defer Optional. Enable if true, disable if false. + * @return bool Whether term counting is enabled or disabled. + */ +function wp_defer_term_counting($defer=null) { + static $_defer = false; + + if ( is_bool($defer) ) { + $_defer = $defer; + // flush any deferred counts + if ( !$defer ) + wp_update_term_count( null, null, true ); + } + + return $_defer; +} + +/** + * Updates the amount of terms in taxonomy. + * + * If there is a taxonomy callback applyed, then it will be called for updating + * the count. + * + * The default action is to count what the amount of terms have the relationship + * of term ID. Once that is done, then update the database. + * + * @package WordPress + * @subpackage Taxonomy + * @since 2.3.0 + * @uses $wpdb + * + * @param int|array $terms The term_taxonomy_id of the terms + * @param string $taxonomy The context of the term. + * @return bool If no terms will return false, and if successful will return true. + */ +function wp_update_term_count( $terms, $taxonomy, $do_deferred=false ) { + static $_deferred = array(); + + if ( $do_deferred ) { + foreach ( (array) array_keys($_deferred) as $tax ) { + wp_update_term_count_now( $_deferred[$tax], $tax ); + unset( $_deferred[$tax] ); + } + } + + if ( empty($terms) ) + return false; + + if ( !is_array($terms) ) + $terms = array($terms); + + if ( wp_defer_term_counting() ) { + if ( !isset($_deferred[$taxonomy]) ) + $_deferred[$taxonomy] = array(); + $_deferred[$taxonomy] = array_unique( array_merge($_deferred[$taxonomy], $terms) ); + return true; + } + + return wp_update_term_count_now( $terms, $taxonomy ); +} + +/** + * Perform term count update immediately. + * + * @since 2.5.0 + * + * @param array $terms The term_taxonomy_id of terms to update. + * @param string $taxonomy The context of the term. + * @return bool Always true when complete. + */ +function wp_update_term_count_now( $terms, $taxonomy ) { + global $wpdb; + + $terms = array_map('intval', $terms); + + $taxonomy = get_taxonomy($taxonomy); + if ( !empty($taxonomy->update_count_callback) ) { + call_user_func($taxonomy->update_count_callback, $terms, $taxonomy); + } else { + // Default count updater + foreach ( (array) $terms as $term) { + $count = $wpdb->get_var( $wpdb->prepare( "SELECT COUNT(*) FROM $wpdb->term_relationships WHERE term_taxonomy_id = %d", $term) ); + do_action( 'edit_term_taxonomy', $term, $taxonomy ); + $wpdb->update( $wpdb->term_taxonomy, compact( 'count' ), array( 'term_taxonomy_id' => $term ) ); + do_action( 'edited_term_taxonomy', $term, $taxonomy ); + } + + } + + clean_term_cache($terms, '', false); + + return true; +} + +// +// Cache +// + + +/** + * Removes the taxonomy relationship to terms from the cache. + * + * Will remove the entire taxonomy relationship containing term $object_id. The + * term IDs have to exist within the taxonomy $object_type for the deletion to + * take place. + * + * @package WordPress + * @subpackage Taxonomy + * @since 2.3.0 + * + * @see get_object_taxonomies() for more on $object_type + * @uses do_action() Will call action hook named, 'clean_object_term_cache' after completion. + * Passes, function params in same order. + * + * @param int|array $object_ids Single or list of term object ID(s) + * @param array|string $object_type The taxonomy object type + */ +function clean_object_term_cache($object_ids, $object_type) { + if ( !is_array($object_ids) ) + $object_ids = array($object_ids); + + foreach ( $object_ids as $id ) + foreach ( get_object_taxonomies($object_type) as $taxonomy ) + wp_cache_delete($id, "{$taxonomy}_relationships"); + + do_action('clean_object_term_cache', $object_ids, $object_type); +} + + +/** + * Will remove all of the term ids from the cache. + * + * @package WordPress + * @subpackage Taxonomy + * @since 2.3.0 + * @uses $wpdb + * + * @param int|array $ids Single or list of Term IDs + * @param string $taxonomy Can be empty and will assume tt_ids, else will use for context. + * @param bool $clean_taxonomy Whether to clean taxonomy wide caches (true), or just individual term object caches (false). Default is true. + */ +function clean_term_cache($ids, $taxonomy = '', $clean_taxonomy = true) { + global $wpdb; + static $cleaned = array(); + + if ( !is_array($ids) ) + $ids = array($ids); + + $taxonomies = array(); + // If no taxonomy, assume tt_ids. + if ( empty($taxonomy) ) { + $tt_ids = array_map('intval', $ids); + $tt_ids = implode(', ', $tt_ids); + $terms = $wpdb->get_results("SELECT term_id, taxonomy FROM $wpdb->term_taxonomy WHERE term_taxonomy_id IN ($tt_ids)"); + $ids = array(); + foreach ( (array) $terms as $term ) { + $taxonomies[] = $term->taxonomy; + $ids[] = $term->term_id; + wp_cache_delete($term->term_id, $term->taxonomy); + } + $taxonomies = array_unique($taxonomies); + } else { + $taxonomies = array($taxonomy); + foreach ( $taxonomies as $taxonomy ) { + foreach ( $ids as $id ) { + wp_cache_delete($id, $taxonomy); + } + } + } + + foreach ( $taxonomies as $taxonomy ) { + if ( isset($cleaned[$taxonomy]) ) + continue; + $cleaned[$taxonomy] = true; + + if ( $clean_taxonomy ) { + wp_cache_delete('all_ids', $taxonomy); + wp_cache_delete('get', $taxonomy); + delete_option("{$taxonomy}_children"); + // Regenerate {$taxonomy}_children + _get_term_hierarchy($taxonomy); + } + + do_action('clean_term_cache', $ids, $taxonomy); + } + + wp_cache_set('last_changed', time(), 'terms'); +} + + +/** + * Retrieves the taxonomy relationship to the term object id. + * + * @package WordPress + * @subpackage Taxonomy + * @since 2.3.0 + * + * @uses wp_cache_get() Retrieves taxonomy relationship from cache + * + * @param int|array $id Term object ID + * @param string $taxonomy Taxonomy Name + * @return bool|array Empty array if $terms found, but not $taxonomy. False if nothing is in cache for $taxonomy and $id. + */ +function &get_object_term_cache($id, $taxonomy) { + $cache = wp_cache_get($id, "{$taxonomy}_relationships"); + return $cache; +} + + +/** + * Updates the cache for Term ID(s). + * + * Will only update the cache for terms not already cached. + * + * The $object_ids expects that the ids be separated by commas, if it is a + * string. + * + * It should be noted that update_object_term_cache() is very time extensive. It + * is advised that the function is not called very often or at least not for a + * lot of terms that exist in a lot of taxonomies. The amount of time increases + * for each term and it also increases for each taxonomy the term belongs to. + * + * @package WordPress + * @subpackage Taxonomy + * @since 2.3.0 + * @uses wp_get_object_terms() Used to get terms from the database to update + * + * @param string|array $object_ids Single or list of term object ID(s) + * @param array|string $object_type The taxonomy object type + * @return null|bool Null value is given with empty $object_ids. False if + */ +function update_object_term_cache($object_ids, $object_type) { + if ( empty($object_ids) ) + return; + + if ( !is_array($object_ids) ) + $object_ids = explode(',', $object_ids); + + $object_ids = array_map('intval', $object_ids); + + $taxonomies = get_object_taxonomies($object_type); + + $ids = array(); + foreach ( (array) $object_ids as $id ) { + foreach ( $taxonomies as $taxonomy ) { + if ( false === wp_cache_get($id, "{$taxonomy}_relationships") ) { + $ids[] = $id; + break; + } + } + } + + if ( empty( $ids ) ) + return false; + + $terms = wp_get_object_terms($ids, $taxonomies, array('fields' => 'all_with_object_id')); + + $object_terms = array(); + foreach ( (array) $terms as $term ) + $object_terms[$term->object_id][$term->taxonomy][$term->term_id] = $term; + + foreach ( $ids as $id ) { + foreach ( $taxonomies as $taxonomy ) { + if ( ! isset($object_terms[$id][$taxonomy]) ) { + if ( !isset($object_terms[$id]) ) + $object_terms[$id] = array(); + $object_terms[$id][$taxonomy] = array(); + } + } + } + + foreach ( $object_terms as $id => $value ) { + foreach ( $value as $taxonomy => $terms ) { + wp_cache_set($id, $terms, "{$taxonomy}_relationships"); + } + } +} + + +/** + * Updates Terms to Taxonomy in cache. + * + * @package WordPress + * @subpackage Taxonomy + * @since 2.3.0 + * + * @param array $terms List of Term objects to change + * @param string $taxonomy Optional. Update Term to this taxonomy in cache + */ +function update_term_cache($terms, $taxonomy = '') { + foreach ( (array) $terms as $term ) { + $term_taxonomy = $taxonomy; + if ( empty($term_taxonomy) ) + $term_taxonomy = $term->taxonomy; + + wp_cache_add($term->term_id, $term, $term_taxonomy); + } +} + +// +// Private +// + + +/** + * Retrieves children of taxonomy as Term IDs. + * + * @package WordPress + * @subpackage Taxonomy + * @access private + * @since 2.3.0 + * + * @uses update_option() Stores all of the children in "$taxonomy_children" + * option. That is the name of the taxonomy, immediately followed by '_children'. + * + * @param string $taxonomy Taxonomy Name + * @return array Empty if $taxonomy isn't hierarchical or returns children as Term IDs. + */ +function _get_term_hierarchy($taxonomy) { + if ( !is_taxonomy_hierarchical($taxonomy) ) + return array(); + $children = get_option("{$taxonomy}_children"); + + if ( is_array($children) ) + return $children; + $children = array(); + $terms = get_terms($taxonomy, array('get' => 'all', 'orderby' => 'id', 'fields' => 'id=>parent')); + foreach ( $terms as $term_id => $parent ) { + if ( $parent > 0 ) + $children[$parent][] = $term_id; + } + update_option("{$taxonomy}_children", $children); + + return $children; +} + + +/** + * Get the subset of $terms that are descendants of $term_id. + * + * If $terms is an array of objects, then _get_term_children returns an array of objects. + * If $terms is an array of IDs, then _get_term_children returns an array of IDs. + * + * @package WordPress + * @subpackage Taxonomy + * @access private + * @since 2.3.0 + * + * @param int $term_id The ancestor term: all returned terms should be descendants of $term_id. + * @param array $terms The set of terms---either an array of term objects or term IDs---from which those that are descendants of $term_id will be chosen. + * @param string $taxonomy The taxonomy which determines the hierarchy of the terms. + * @return array The subset of $terms that are descendants of $term_id. + */ +function &_get_term_children($term_id, $terms, $taxonomy) { + $empty_array = array(); + if ( empty($terms) ) + return $empty_array; + + $term_list = array(); + $has_children = _get_term_hierarchy($taxonomy); + + if ( ( 0 != $term_id ) && ! isset($has_children[$term_id]) ) + return $empty_array; + + foreach ( (array) $terms as $term ) { + $use_id = false; + if ( !is_object($term) ) { + $term = get_term($term, $taxonomy); + if ( is_wp_error( $term ) ) + return $term; + $use_id = true; + } + + if ( $term->term_id == $term_id ) + continue; + + if ( $term->parent == $term_id ) { + if ( $use_id ) + $term_list[] = $term->term_id; + else + $term_list[] = $term; + + if ( !isset($has_children[$term->term_id]) ) + continue; + + if ( $children = _get_term_children($term->term_id, $terms, $taxonomy) ) + $term_list = array_merge($term_list, $children); + } + } + + return $term_list; +} + + +/** + * Add count of children to parent count. + * + * Recalculates term counts by including items from child terms. Assumes all + * relevant children are already in the $terms argument. + * + * @package WordPress + * @subpackage Taxonomy + * @access private + * @since 2.3.0 + * @uses $wpdb + * + * @param array $terms List of Term IDs + * @param string $taxonomy Term Context + * @return null Will break from function if conditions are not met. + */ +function _pad_term_counts(&$terms, $taxonomy) { + global $wpdb; + + // This function only works for hierarchical taxonomies like post categories. + if ( !is_taxonomy_hierarchical( $taxonomy ) ) + return; + + $term_hier = _get_term_hierarchy($taxonomy); + + if ( empty($term_hier) ) + return; + + $term_items = array(); + + foreach ( (array) $terms as $key => $term ) { + $terms_by_id[$term->term_id] = & $terms[$key]; + $term_ids[$term->term_taxonomy_id] = $term->term_id; + } + + // Get the object and term ids and stick them in a lookup table + $tax_obj = get_taxonomy($taxonomy); + $object_types = esc_sql($tax_obj->object_type); + $results = $wpdb->get_results("SELECT object_id, term_taxonomy_id FROM $wpdb->term_relationships INNER JOIN $wpdb->posts ON object_id = ID WHERE term_taxonomy_id IN (" . implode(',', array_keys($term_ids)) . ") AND post_type IN ('" . implode("', '", $object_types) . "') AND post_status = 'publish'"); + foreach ( $results as $row ) { + $id = $term_ids[$row->term_taxonomy_id]; + $term_items[$id][$row->object_id] = isset($term_items[$id][$row->object_id]) ? ++$term_items[$id][$row->object_id] : 1; + } + + // Touch every ancestor's lookup row for each post in each term + foreach ( $term_ids as $term_id ) { + $child = $term_id; + while ( $parent = $terms_by_id[$child]->parent ) { + if ( !empty($term_items[$term_id]) ) + foreach ( $term_items[$term_id] as $item_id => $touches ) { + $term_items[$parent][$item_id] = isset($term_items[$parent][$item_id]) ? ++$term_items[$parent][$item_id]: 1; + } + $child = $parent; + } + } + + // Transfer the touched cells + foreach ( (array) $term_items as $id => $items ) + if ( isset($terms_by_id[$id]) ) + $terms_by_id[$id]->count = count($items); +} + +// +// Default callbacks +// + +/** + * Will update term count based on object types of the current taxonomy. + * + * Private function for the default callback for post_tag and category + * taxonomies. + * + * @package WordPress + * @subpackage Taxonomy + * @access private + * @since 2.3.0 + * @uses $wpdb + * + * @param array $terms List of Term taxonomy IDs + * @param object $taxonomy Current taxonomy object of terms + */ +function _update_post_term_count( $terms, $taxonomy ) { + global $wpdb; + + $object_types = is_array($taxonomy->object_type) ? $taxonomy->object_type : array($taxonomy->object_type); + $object_types = esc_sql($object_types); + + foreach ( (array) $terms as $term ) { + $count = $wpdb->get_var( $wpdb->prepare( "SELECT COUNT(*) FROM $wpdb->term_relationships, $wpdb->posts WHERE $wpdb->posts.ID = $wpdb->term_relationships.object_id AND post_status = 'publish' AND post_type IN ('" . implode("', '", $object_types) . "') AND term_taxonomy_id = %d", $term ) ); + do_action( 'edit_term_taxonomy', $term, $taxonomy ); + $wpdb->update( $wpdb->term_taxonomy, compact( 'count' ), array( 'term_taxonomy_id' => $term ) ); + do_action( 'edited_term_taxonomy', $term, $taxonomy ); + } +} + + +/** + * Generates a permalink for a taxonomy term archive. + * + * @since 2.5.0 + * + * @uses apply_filters() Calls 'term_link' with term link and term object, and taxonomy parameters. + * @uses apply_filters() For the post_tag Taxonomy, Calls 'tag_link' with tag link and tag ID as parameters. + * @uses apply_filters() For the category Taxonomy, Calls 'category_link' filter on category link and category ID. + * + * @param object|int|string $term + * @param string $taxonomy (optional if $term is object) + * @return string|WP_Error HTML link to taxonomy term archive on success, WP_Error if term does not exist. + */ +function get_term_link( $term, $taxonomy = '') { + global $wp_rewrite; + + if ( !is_object($term) ) { + if ( is_int($term) ) { + $term = &get_term($term, $taxonomy); + } else { + $term = &get_term_by('slug', $term, $taxonomy); + } + } + + if ( !is_object($term) ) + $term = new WP_Error('invalid_term', __('Empty Term')); + + if ( is_wp_error( $term ) ) + return $term; + + $taxonomy = $term->taxonomy; + + $termlink = $wp_rewrite->get_extra_permastruct($taxonomy); + + $slug = $term->slug; + $t = get_taxonomy($taxonomy); + + if ( empty($termlink) ) { + if ( 'category' == $taxonomy ) + $termlink = '?cat=' . $term->term_id; + elseif ( $t->query_var ) + $termlink = "?$t->query_var=$slug"; + else + $termlink = "?taxonomy=$taxonomy&term=$slug"; + $termlink = home_url($termlink); + } else { + if ( $t->rewrite['hierarchical'] ) { + $hierarchical_slugs = array(); + $ancestors = get_ancestors($term->term_id, $taxonomy); + foreach ( (array)$ancestors as $ancestor ) { + $ancestor_term = get_term($ancestor, $taxonomy); + $hierarchical_slugs[] = $ancestor_term->slug; + } + $hierarchical_slugs = array_reverse($hierarchical_slugs); + $hierarchical_slugs[] = $slug; + $termlink = str_replace("%$taxonomy%", implode('/', $hierarchical_slugs), $termlink); + } else { + $termlink = str_replace("%$taxonomy%", $slug, $termlink); + } + $termlink = home_url( user_trailingslashit($termlink, 'category') ); + } + // Back Compat filters. + if ( 'post_tag' == $taxonomy ) + $termlink = apply_filters( 'tag_link', $termlink, $term->term_id ); + elseif ( 'category' == $taxonomy ) + $termlink = apply_filters( 'category_link', $termlink, $term->term_id ); + + return apply_filters('term_link', $termlink, $term, $taxonomy); +} + +/** + * Display the taxonomies of a post with available options. + * + * This function can be used within the loop to display the taxonomies for a + * post without specifying the Post ID. You can also use it outside the Loop to + * display the taxonomies for a specific post. + * + * The available defaults are: + * 'post' : default is 0. The post ID to get taxonomies of. + * 'before' : default is empty string. Display before taxonomies list. + * 'sep' : default is empty string. Separate every taxonomy with value in this. + * 'after' : default is empty string. Display this after the taxonomies list. + * 'template' : The template to use for displaying the taxonomy terms. + * + * @since 2.5.0 + * @uses get_the_taxonomies() + * + * @param array $args Override the defaults. + */ +function the_taxonomies($args = array()) { + $defaults = array( + 'post' => 0, + 'before' => '', + 'sep' => ' ', + 'after' => '', + 'template' => '%s: %l.' + ); + + $r = wp_parse_args( $args, $defaults ); + extract( $r, EXTR_SKIP ); + + echo $before . join($sep, get_the_taxonomies($post, $r)) . $after; +} + +/** + * Retrieve all taxonomies associated with a post. + * + * This function can be used within the loop. It will also return an array of + * the taxonomies with links to the taxonomy and name. + * + * @since 2.5.0 + * + * @param int $post Optional. Post ID or will use Global Post ID (in loop). + * @param array $args Override the defaults. + * @return array + */ +function get_the_taxonomies($post = 0, $args = array() ) { + if ( is_int($post) ) + $post =& get_post($post); + elseif ( !is_object($post) ) + $post =& $GLOBALS['post']; + + $args = wp_parse_args( $args, array( + 'template' => '%s: %l.', + ) ); + extract( $args, EXTR_SKIP ); + + $taxonomies = array(); + + if ( !$post ) + return $taxonomies; + + foreach ( get_object_taxonomies($post) as $taxonomy ) { + $t = (array) get_taxonomy($taxonomy); + if ( empty($t['label']) ) + $t['label'] = $taxonomy; + if ( empty($t['args']) ) + $t['args'] = array(); + if ( empty($t['template']) ) + $t['template'] = $template; + + $terms = get_object_term_cache($post->ID, $taxonomy); + if ( empty($terms) ) + $terms = wp_get_object_terms($post->ID, $taxonomy, $t['args']); + + $links = array(); + + foreach ( $terms as $term ) + $links[] = "$term->name"; + + if ( $links ) + $taxonomies[$taxonomy] = wp_sprintf($t['template'], $t['label'], $links, $terms); + } + return $taxonomies; +} + +/** + * Retrieve all taxonomies of a post with just the names. + * + * @since 2.5.0 + * @uses get_object_taxonomies() + * + * @param int $post Optional. Post ID + * @return array + */ +function get_post_taxonomies($post = 0) { + $post =& get_post($post); + + return get_object_taxonomies($post); +} + +/** + * Determine if the given object is associated with any of the given terms. + * + * The given terms are checked against the object's terms' term_ids, names and slugs. + * Terms given as integers will only be checked against the object's terms' term_ids. + * If no terms are given, determines if object is associated with any terms in the given taxonomy. + * + * @since 2.7.0 + * @uses get_object_term_cache() + * @uses wp_get_object_terms() + * + * @param int $object_id ID of the object (post ID, link ID, ...) + * @param string $taxonomy Single taxonomy name + * @param int|string|array $terms Optional. Term term_id, name, slug or array of said + * @return bool|WP_Error. WP_Error on input error. + */ +function is_object_in_term( $object_id, $taxonomy, $terms = null ) { + if ( !$object_id = (int) $object_id ) + return new WP_Error( 'invalid_object', __( 'Invalid object ID' ) ); + + $object_terms = get_object_term_cache( $object_id, $taxonomy ); + if ( empty( $object_terms ) ) + $object_terms = wp_get_object_terms( $object_id, $taxonomy ); + + if ( is_wp_error( $object_terms ) ) + return $object_terms; + if ( empty( $object_terms ) ) + return false; + if ( empty( $terms ) ) + return ( !empty( $object_terms ) ); + + $terms = (array) $terms; + + if ( $ints = array_filter( $terms, 'is_int' ) ) + $strs = array_diff( $terms, $ints ); + else + $strs =& $terms; + + foreach ( $object_terms as $object_term ) { + if ( $ints && in_array( $object_term->term_id, $ints ) ) return true; // If int, check against term_id + if ( $strs ) { + if ( in_array( $object_term->term_id, $strs ) ) return true; + if ( in_array( $object_term->name, $strs ) ) return true; + if ( in_array( $object_term->slug, $strs ) ) return true; + } + } + + return false; +} + +/** + * Determine if the given object type is associated with the given taxonomy. + * + * @since 3.0.0 + * @uses get_object_taxonomies() + * + * @param string $object_type Object type string + * @param string $taxonomy Single taxonomy name + * @return bool True if object is associated with the taxonomy, otherwise false. + */ +function is_object_in_taxonomy($object_type, $taxonomy) { + $taxonomies = get_object_taxonomies($object_type); + + if ( empty($taxonomies) ) + return false; + + if ( in_array($taxonomy, $taxonomies) ) + return true; + + return false; +} + +/** + * Get an array of ancestor IDs for a given object. + * + * @param int $object_id The ID of the object + * @param string $object_type The type of object for which we'll be retrieving ancestors. + * @return array of ancestors from lowest to highest in the hierarchy. + */ +function get_ancestors($object_id = 0, $object_type = '') { + $object_id = (int) $object_id; + + $ancestors = array(); + + if ( empty( $object_id ) ) { + return apply_filters('get_ancestors', $ancestors, $object_id, $object_type); + } + + if ( is_taxonomy_hierarchical( $object_type ) ) { + $term = get_term($object_id, $object_type); + while ( ! is_wp_error($term) && ! empty( $term->parent ) && ! in_array( $term->parent, $ancestors ) ) { + $ancestors[] = (int) $term->parent; + $term = get_term($term->parent, $object_type); + } + } elseif ( null !== get_post_type_object( $object_type ) ) { + $object = get_post($object_id); + if ( ! is_wp_error( $object ) && isset( $object->ancestors ) && is_array( $object->ancestors ) ) + $ancestors = $object->ancestors; + else { + while ( ! is_wp_error($object) && ! empty( $object->post_parent ) && ! in_array( $object->post_parent, $ancestors ) ) { + $ancestors[] = (int) $object->post_parent; + $object = get_post($object->post_parent); + } + } + } + + return apply_filters('get_ancestors', $ancestors, $object_id, $object_type); +} + +/** + * Returns the term's parent's term_ID + * + * @since 3.1.0 + * + * @param int $term_id + * @param string $taxonomy + * + * @return int|bool false on error + */ +function wp_get_term_taxonomy_parent_id( $term_id, $taxonomy ) { + $term = get_term( $term_id, $taxonomy ); + if ( !$term || is_wp_error( $term ) ) + return false; + return (int) $term->parent; +} + +/** + * Checks the given subset of the term hierarchy for hierarchy loops. + * Prevents loops from forming and breaks those that it finds. + * + * Attached to the wp_update_term_parent filter. + * + * @since 3.1.0 + * @uses wp_find_hierarchy_loop() + * + * @param int $parent term_id of the parent for the term we're checking. + * @param int $term_id The term we're checking. + * @param string $taxonomy The taxonomy of the term we're checking. + * + * @return int The new parent for the term. + */ +function wp_check_term_hierarchy_for_loops( $parent, $term_id, $taxonomy ) { + // Nothing fancy here - bail + if ( !$parent ) + return 0; + + // Can't be its own parent + if ( $parent == $term_id ) + return 0; + + // Now look for larger loops + + if ( !$loop = wp_find_hierarchy_loop( 'wp_get_term_taxonomy_parent_id', $term_id, $parent, array( $taxonomy ) ) ) + return $parent; // No loop + + // Setting $parent to the given value causes a loop + if ( isset( $loop[$term_id] ) ) + return 0; + + // There's a loop, but it doesn't contain $term_id. Break the loop. + foreach ( array_keys( $loop ) as $loop_member ) + wp_update_term( $loop_member, $taxonomy, array( 'parent' => 0 ) ); + + return $parent; +} diff --git a/src/wp-includes/template-loader.php b/src/wp-includes/template-loader.php new file mode 100644 index 0000000..7c72a05 --- /dev/null +++ b/src/wp-includes/template-loader.php @@ -0,0 +1,47 @@ + diff --git a/src/wp-includes/theme-compat/comments-popup.php b/src/wp-includes/theme-compat/comments-popup.php new file mode 100644 index 0000000..12ad736 --- /dev/null +++ b/src/wp-includes/theme-compat/comments-popup.php @@ -0,0 +1,129 @@ + + + + <?php printf(__('%1$s - Comments on %2$s'), get_option('blogname'), the_title('','',false)); ?> + + + + + + + +

    + + +

    + +

    RSS feed for comments on this post.'); ?>

    + + +

    URL to TrackBack this entry is: %s'), get_trackback_url()); ?>

    + + + + + +
      + +
    1. + +

      %4$s'), get_comment_author_link(), get_comment_date(), get_comment_ID(), get_comment_time()); ?>

      +
    2. + + +
    + +

    + + + +

    +

    HTML allowed: %s'), allowed_tags()); ?>

    + +
    + +

    %2$s. Log out »'), get_option('siteurl') . '/wp-admin/profile.php', $user_identity, wp_logout_url(get_permalink())); ?>

    + +

    + + +

    + +

    + + +

    + +

    + + +

    + + +

    + +
    + +

    + +

    + + " /> + +

    + ID); ?> +
    + +

    + + +
    + + +

    + + + +

    WordPress'), 'http://wordpress.org/'); ?>

    + + + + diff --git a/src/wp-includes/theme-compat/comments.php b/src/wp-includes/theme-compat/comments.php new file mode 100644 index 0000000..c6fbb7f --- /dev/null +++ b/src/wp-includes/theme-compat/comments.php @@ -0,0 +1,102 @@ + +

    + + + + + +

    + + + +
      + +
    + + + + + + + + + +

    + + + + + + + +
    + +

    + +
    + +
    + + +

    logged in to post a comment.'), wp_login_url( get_permalink() )); ?>

    + + +
    + + + +

    %2$s.'), get_option('siteurl') . '/wp-admin/profile.php', $user_identity); ?>

    + + + +

    /> +

    + +

    /> +

    + +

    +

    + + + + + +

    + +

    + +

    +ID); ?> + +
    + + +
    + + diff --git a/src/wp-includes/theme-compat/footer.php b/src/wp-includes/theme-compat/footer.php new file mode 100644 index 0000000..0e987ed --- /dev/null +++ b/src/wp-includes/theme-compat/footer.php @@ -0,0 +1,30 @@ + + +
    + +

    + diff --git a/src/wp-includes/theme.php b/src/wp-includes/theme.php new file mode 100644 index 0000000..78d9739 --- /dev/null +++ b/src/wp-includes/theme.php @@ -0,0 +1,1985 @@ +text_direction) && file_exists("$dir/{$wp_locale->text_direction}.css") ) + $stylesheet_uri = "$stylesheet_dir_uri/{$wp_locale->text_direction}.css"; + else + $stylesheet_uri = ''; + return apply_filters('locale_stylesheet_uri', $stylesheet_uri, $stylesheet_dir_uri); +} + +/** + * Retrieve name of the current theme. + * + * @since 1.5.0 + * @uses apply_filters() Calls 'template' filter on template option. + * + * @return string Template name. + */ +function get_template() { + return apply_filters('template', get_option('template')); +} + +/** + * Retrieve current theme directory. + * + * @since 1.5.0 + * @uses apply_filters() Calls 'template_directory' filter on template directory path and template name. + * + * @return string Template directory path. + */ +function get_template_directory() { + $template = get_template(); + $theme_root = get_theme_root( $template ); + $template_dir = "$theme_root/$template"; + + return apply_filters( 'template_directory', $template_dir, $template, $theme_root ); +} + +/** + * Retrieve theme directory URI. + * + * @since 1.5.0 + * @uses apply_filters() Calls 'template_directory_uri' filter on template directory URI path and template name. + * + * @return string Template directory URI. + */ +function get_template_directory_uri() { + $template = get_template(); + $theme_root_uri = get_theme_root_uri( $template ); + $template_dir_uri = "$theme_root_uri/$template"; + + return apply_filters( 'template_directory_uri', $template_dir_uri, $template, $theme_root_uri ); +} + +/** + * Retrieve theme data from parsed theme file. + * + * The description will have the tags filtered with the following HTML elements + * whitelisted. The 'a' element with the href and title + * attributes. The abbr element with the title attribute. The + * acronym element with the title attribute allowed. The + * code, em, and strong elements also allowed. + * + * The style.css file must contain theme name, theme URI, and description. The + * data can also contain author URI, author, template (parent template), + * version, status, and finally tags. Some of these are not used by WordPress + * administration panels, but are used by theme directory web sites which list + * the theme. + * + * @since 1.5.0 + * + * @param string $theme_file Theme file path. + * @return array Theme data. + */ +function get_theme_data( $theme_file ) { + $default_headers = array( + 'Name' => 'Theme Name', + 'URI' => 'Theme URI', + 'Description' => 'Description', + 'Author' => 'Author', + 'AuthorURI' => 'Author URI', + 'Version' => 'Version', + 'Template' => 'Template', + 'Status' => 'Status', + 'Tags' => 'Tags' + ); + + $themes_allowed_tags = array( + 'a' => array( + 'href' => array(),'title' => array() + ), + 'abbr' => array( + 'title' => array() + ), + 'acronym' => array( + 'title' => array() + ), + 'code' => array(), + 'em' => array(), + 'strong' => array() + ); + + $theme_data = get_file_data( $theme_file, $default_headers, 'theme' ); + + $theme_data['Name'] = $theme_data['Title'] = wp_kses( $theme_data['Name'], $themes_allowed_tags ); + + $theme_data['URI'] = esc_url( $theme_data['URI'] ); + + $theme_data['Description'] = wptexturize( wp_kses( $theme_data['Description'], $themes_allowed_tags ) ); + + $theme_data['AuthorURI'] = esc_url( $theme_data['AuthorURI'] ); + + $theme_data['Template'] = wp_kses( $theme_data['Template'], $themes_allowed_tags ); + + $theme_data['Version'] = wp_kses( $theme_data['Version'], $themes_allowed_tags ); + + if ( $theme_data['Status'] == '' ) + $theme_data['Status'] = 'publish'; + else + $theme_data['Status'] = wp_kses( $theme_data['Status'], $themes_allowed_tags ); + + if ( $theme_data['Tags'] == '' ) + $theme_data['Tags'] = array(); + else + $theme_data['Tags'] = array_map( 'trim', explode( ',', wp_kses( $theme_data['Tags'], array() ) ) ); + + if ( $theme_data['Author'] == '' ) { + $theme_data['Author'] = $theme_data['AuthorName'] = __('Anonymous'); + } else { + $theme_data['AuthorName'] = wp_kses( $theme_data['Author'], $themes_allowed_tags ); + if ( empty( $theme_data['AuthorURI'] ) ) { + $theme_data['Author'] = $theme_data['AuthorName']; + } else { + $theme_data['Author'] = sprintf( '%3$s', $theme_data['AuthorURI'], esc_attr__( 'Visit author homepage' ), $theme_data['AuthorName'] ); + } + } + + return $theme_data; +} + +/** + * 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. The broken theme + * list is saved in the {@link $wp_broken_themes} global, which is displayed on + * the theme list in the administration panels. + * + * @since 1.5.0 + * @global array $wp_broken_themes Stores the broken themes. + * @global array $wp_themes Stores the working themes. + * + * @return array Theme list with theme data. + */ +function get_themes() { + global $wp_themes, $wp_broken_themes; + + if ( isset($wp_themes) ) + return $wp_themes; + + if ( !$theme_files = search_theme_directories() ) + return false; + + asort( $theme_files ); + + $wp_themes = array(); + + foreach ( (array) $theme_files as $theme_file ) { + $theme_root = $theme_file['theme_root']; + $theme_file = $theme_file['theme_file']; + + if ( !is_readable("$theme_root/$theme_file") ) { + $wp_broken_themes[$theme_file] = array('Name' => $theme_file, 'Title' => $theme_file, 'Description' => __('File not readable.')); + continue; + } + + $theme_data = get_theme_data("$theme_root/$theme_file"); + + $name = $theme_data['Name']; + $title = $theme_data['Title']; + $description = wptexturize($theme_data['Description']); + $version = $theme_data['Version']; + $author = $theme_data['Author']; + $template = $theme_data['Template']; + $stylesheet = dirname($theme_file); + + $screenshot = false; + foreach ( array('png', 'gif', 'jpg', 'jpeg') as $ext ) { + if (file_exists("$theme_root/$stylesheet/screenshot.$ext")) { + $screenshot = "screenshot.$ext"; + break; + } + } + + if ( empty($name) ) { + $name = dirname($theme_file); + $title = $name; + } + + $parent_template = $template; + + if ( empty($template) ) { + if ( file_exists("$theme_root/$stylesheet/index.php") ) + $template = $stylesheet; + else + continue; + } + + $template = trim( $template ); + + if ( !file_exists("$theme_root/$template/index.php") ) { + $parent_dir = dirname(dirname($theme_file)); + if ( file_exists("$theme_root/$parent_dir/$template/index.php") ) { + $template = "$parent_dir/$template"; + $template_directory = "$theme_root/$template"; + } else { + /** + * The parent theme doesn't exist in the current theme's folder or sub folder + * so lets use the theme root for the parent template. + */ + if ( isset($theme_files[$template]) && file_exists( $theme_files[$template]['theme_root'] . "/$template/index.php" ) ) { + $template_directory = $theme_files[$template]['theme_root'] . "/$template"; + } else { + if ( empty( $parent_template) ) + $wp_broken_themes[$name] = array('Name' => $name, 'Title' => $title, 'Description' => __('Template is missing.'), 'error' => 'no_template'); + else + $wp_broken_themes[$name] = array('Name' => $name, 'Title' => $title, 'Description' => sprintf( __('The parent theme is missing. Please install the "%s" parent theme.'), $parent_template ), 'error' => 'no_parent', 'parent' => $parent_template ); + continue; + } + + } + } else { + $template_directory = trim( $theme_root . '/' . $template ); + } + + $stylesheet_files = array(); + $template_files = array(); + + $stylesheet_dir = @ dir("$theme_root/$stylesheet"); + if ( $stylesheet_dir ) { + while ( ($file = $stylesheet_dir->read()) !== false ) { + if ( !preg_match('|^\.+$|', $file) ) { + if ( preg_match('|\.css$|', $file) ) + $stylesheet_files[] = "$theme_root/$stylesheet/$file"; + elseif ( preg_match('|\.php$|', $file) ) + $template_files[] = "$theme_root/$stylesheet/$file"; + } + } + @ $stylesheet_dir->close(); + } + + $template_dir = @ dir("$template_directory"); + if ( $template_dir ) { + while ( ($file = $template_dir->read()) !== false ) { + if ( preg_match('|^\.+$|', $file) ) + continue; + if ( preg_match('|\.php$|', $file) ) { + $template_files[] = "$template_directory/$file"; + } elseif ( is_dir("$template_directory/$file") ) { + $template_subdir = @ dir("$template_directory/$file"); + if ( !$template_subdir ) + continue; + while ( ($subfile = $template_subdir->read()) !== false ) { + if ( preg_match('|^\.+$|', $subfile) ) + continue; + if ( preg_match('|\.php$|', $subfile) ) + $template_files[] = "$template_directory/$file/$subfile"; + } + @ $template_subdir->close(); + } + } + @ $template_dir->close(); + } + + //Make unique and remove duplicates when stylesheet and template are the same i.e. most themes + $template_files = array_unique($template_files); + $stylesheet_files = array_unique($stylesheet_files); + + $template_dir = $template_directory; + $stylesheet_dir = $theme_root . '/' . $stylesheet; + + if ( empty($template_dir) ) + $template_dir = '/'; + if ( empty($stylesheet_dir) ) + $stylesheet_dir = '/'; + + // Check for theme name collision. This occurs if a theme is copied to + // a new theme directory and the theme header is not updated. Whichever + // theme is first keeps the name. Subsequent themes get a suffix applied. + // The Twenty Eleven, Twenty Ten, Default and Classic themes always trump + // their pretenders. + if ( isset($wp_themes[$name]) ) { + $trump_cards = array( + 'classic' => 'WordPress Classic', + 'default' => 'WordPress Default', + 'twentyten' => 'Twenty Ten', + 'twentyeleven' => 'Twenty Eleven', + ); + if ( isset( $trump_cards[ $stylesheet ] ) && $name == $trump_cards[ $stylesheet ] ) { + // If another theme has claimed to be one of our default themes, move + // them aside. + $suffix = $wp_themes[$name]['Stylesheet']; + $new_name = "$name/$suffix"; + $wp_themes[$new_name] = $wp_themes[$name]; + $wp_themes[$new_name]['Name'] = $new_name; + } else { + $name = "$name/$stylesheet"; + } + } + + $theme_roots[$stylesheet] = str_replace( WP_CONTENT_DIR, '', $theme_root ); + $wp_themes[$name] = array( + 'Name' => $name, + 'Title' => $title, + 'Description' => $description, + 'Author' => $author, + 'Author Name' => $theme_data['AuthorName'], + 'Author URI' => $theme_data['AuthorURI'], + 'Version' => $version, + 'Template' => $template, + 'Stylesheet' => $stylesheet, + 'Template Files' => $template_files, + 'Stylesheet Files' => $stylesheet_files, + 'Template Dir' => $template_dir, + 'Stylesheet Dir' => $stylesheet_dir, + 'Status' => $theme_data['Status'], + 'Screenshot' => $screenshot, + 'Tags' => $theme_data['Tags'], + 'Theme Root' => $theme_root, + 'Theme Root URI' => str_replace( WP_CONTENT_DIR, content_url(), $theme_root ), + ); + } + + unset($theme_files); + + /* Store theme roots in the DB */ + if ( get_site_transient( 'theme_roots' ) != $theme_roots ) + set_site_transient( 'theme_roots', $theme_roots, 7200 ); // cache for two hours + unset($theme_roots); + + /* Resolve theme dependencies. */ + $theme_names = array_keys( $wp_themes ); + foreach ( (array) $theme_names as $theme_name ) { + $wp_themes[$theme_name]['Parent Theme'] = ''; + if ( $wp_themes[$theme_name]['Stylesheet'] != $wp_themes[$theme_name]['Template'] ) { + foreach ( (array) $theme_names as $parent_theme_name ) { + if ( ($wp_themes[$parent_theme_name]['Stylesheet'] == $wp_themes[$parent_theme_name]['Template']) && ($wp_themes[$parent_theme_name]['Template'] == $wp_themes[$theme_name]['Template']) ) { + $wp_themes[$theme_name]['Parent Theme'] = $wp_themes[$parent_theme_name]['Name']; + break; + } + } + } + } + + return $wp_themes; +} + +/** + * Retrieve theme roots. + * + * @since 2.9.0 + * + * @return array|string An arry of theme roots keyed by template/stylesheet or a single theme root if all themes have the same root. + */ +function get_theme_roots() { + global $wp_theme_directories; + + if ( count($wp_theme_directories) <= 1 ) + return '/themes'; + + $theme_roots = get_site_transient( 'theme_roots' ); + if ( false === $theme_roots ) { + get_themes(); + $theme_roots = get_site_transient( 'theme_roots' ); // this is set in get_theme() + } + return $theme_roots; +} + +/** + * Retrieve theme data. + * + * @since 1.5.0 + * + * @param string $theme Theme name. + * @return array|null Null, if theme name does not exist. Theme data, if exists. + */ +function get_theme($theme) { + $themes = get_themes(); + + if ( array_key_exists($theme, $themes) ) + return $themes[$theme]; + + return null; +} + +/** + * Retrieve current theme display name. + * + * If the 'current_theme' option has already been set, then it will be returned + * instead. If it is not set, then each theme will be iterated over until both + * the current stylesheet and current template name. + * + * @since 1.5.0 + * + * @return string + */ +function get_current_theme() { + if ( $theme = get_option('current_theme') ) + return $theme; + + $themes = get_themes(); + $theme_names = array_keys($themes); + $current_template = get_option('template'); + $current_stylesheet = get_option('stylesheet'); + $current_theme = 'Twenty Ten'; + + if ( $themes ) { + foreach ( (array) $theme_names as $theme_name ) { + if ( $themes[$theme_name]['Stylesheet'] == $current_stylesheet && + $themes[$theme_name]['Template'] == $current_template ) { + $current_theme = $themes[$theme_name]['Name']; + break; + } + } + } + + update_option('current_theme', $current_theme); + + return $current_theme; +} + +/** + * Register a directory that contains themes. + * + * @since 2.9.0 + * + * @param string $directory Either the full filesystem path to a theme folder or a folder within WP_CONTENT_DIR + * @return bool + */ +function register_theme_directory( $directory) { + global $wp_theme_directories; + + /* If this folder does not exist, return and do not register */ + if ( !file_exists( $directory ) ) + /* Try prepending as the theme directory could be relative to the content directory */ + $registered_directory = WP_CONTENT_DIR . '/' . $directory; + else + $registered_directory = $directory; + + /* If this folder does not exist, return and do not register */ + if ( !file_exists( $registered_directory ) ) + return false; + + $wp_theme_directories[] = $registered_directory; + + return true; +} + +/** + * Search all registered theme directories for complete and valid themes. + * + * @since 2.9.0 + * + * @return array Valid themes found + */ +function search_theme_directories() { + global $wp_theme_directories, $wp_broken_themes; + if ( empty( $wp_theme_directories ) ) + return false; + + $theme_files = array(); + $wp_broken_themes = array(); + + /* Loop the registered theme directories and extract all themes */ + foreach ( (array) $wp_theme_directories as $theme_root ) { + $theme_loc = $theme_root; + + /* We don't want to replace all forward slashes, see Trac #4541 */ + if ( '/' != WP_CONTENT_DIR ) + $theme_loc = str_replace(WP_CONTENT_DIR, '', $theme_root); + + /* Files in the root of the current theme directory and one subdir down */ + $themes_dir = @ opendir($theme_root); + + if ( !$themes_dir ) + return false; + + while ( ($theme_dir = readdir($themes_dir)) !== false ) { + if ( is_dir($theme_root . '/' . $theme_dir) && is_readable($theme_root . '/' . $theme_dir) ) { + if ( $theme_dir[0] == '.' || $theme_dir == 'CVS' ) + continue; + + $stylish_dir = @opendir($theme_root . '/' . $theme_dir); + $found_stylesheet = false; + + while ( ($theme_file = readdir($stylish_dir)) !== false ) { + if ( $theme_file == 'style.css' ) { + $theme_files[$theme_dir] = array( 'theme_file' => $theme_dir . '/' . $theme_file, 'theme_root' => $theme_root ); + $found_stylesheet = true; + break; + } + } + @closedir($stylish_dir); + + if ( !$found_stylesheet ) { // look for themes in that dir + $subdir = "$theme_root/$theme_dir"; + $subdir_name = $theme_dir; + $theme_subdirs = @opendir( $subdir ); + + $found_subdir_themes = false; + while ( ($theme_subdir = readdir($theme_subdirs)) !== false ) { + if ( is_dir( $subdir . '/' . $theme_subdir) && is_readable($subdir . '/' . $theme_subdir) ) { + if ( $theme_subdir[0] == '.' || $theme_subdir == 'CVS' ) + continue; + + $stylish_dir = @opendir($subdir . '/' . $theme_subdir); + $found_stylesheet = false; + + while ( ($theme_file = readdir($stylish_dir)) !== false ) { + if ( $theme_file == 'style.css' ) { + $theme_files["$theme_dir/$theme_subdir"] = array( 'theme_file' => $subdir_name . '/' . $theme_subdir . '/' . $theme_file, 'theme_root' => $theme_root ); + $found_stylesheet = true; + $found_subdir_themes = true; + break; + } + } + @closedir($stylish_dir); + } + } + @closedir($theme_subdirs); + if ( !$found_subdir_themes ) + $wp_broken_themes[$theme_dir] = array('Name' => $theme_dir, 'Title' => $theme_dir, 'Description' => __('Stylesheet is missing.')); + } + } + } + @closedir( $themes_dir ); + } + return $theme_files; +} + +/** + * Retrieve path to themes directory. + * + * Does not have trailing slash. + * + * @since 1.5.0 + * @uses apply_filters() Calls 'theme_root' filter on path. + * + * @param string $stylesheet_or_template The stylesheet or template name of the theme + * @return string Theme path. + */ +function get_theme_root( $stylesheet_or_template = false ) { + if ( $stylesheet_or_template ) { + if ( $theme_root = get_raw_theme_root($stylesheet_or_template) ) + $theme_root = WP_CONTENT_DIR . $theme_root; + else + $theme_root = WP_CONTENT_DIR . '/themes'; + } else { + $theme_root = WP_CONTENT_DIR . '/themes'; + } + + return apply_filters( 'theme_root', $theme_root ); +} + +/** + * Retrieve URI for themes directory. + * + * Does not have trailing slash. + * + * @since 1.5.0 + * + * @param string $stylesheet_or_template The stylesheet or template name of the theme + * @return string Themes URI. + */ +function get_theme_root_uri( $stylesheet_or_template = false ) { + if ( $stylesheet_or_template ) { + if ( $theme_root = get_raw_theme_root($stylesheet_or_template) ) + $theme_root_uri = content_url( $theme_root ); + else + $theme_root_uri = content_url( 'themes' ); + } else { + $theme_root_uri = content_url( 'themes' ); + } + + return apply_filters( 'theme_root_uri', $theme_root_uri, get_option('siteurl'), $stylesheet_or_template ); +} + +/** + * Get the raw theme root relative to the content directory with no filters applied. + * + * @since 3.1.0 + * + * @param string $stylesheet_or_template The stylesheet or template name of the theme + * @return string Theme root + */ +function get_raw_theme_root( $stylesheet_or_template, $no_cache = false ) { + global $wp_theme_directories; + + if ( count($wp_theme_directories) <= 1 ) + return '/themes'; + + $theme_root = false; + + // If requesting the root for the current theme, consult options to avoid calling get_theme_roots() + if ( !$no_cache ) { + if ( get_option('stylesheet') == $stylesheet_or_template ) + $theme_root = get_option('stylesheet_root'); + elseif ( get_option('template') == $stylesheet_or_template ) + $theme_root = get_option('template_root'); + } + + if ( empty($theme_root) ) { + $theme_roots = get_theme_roots(); + if ( !empty($theme_roots[$stylesheet_or_template]) ) + $theme_root = $theme_roots[$stylesheet_or_template]; + } + + return $theme_root; +} + +/** + * Retrieve path to a template + * + * Used to quickly retrieve the path of a template without including the file + * extension. It will also check the parent theme, if the file exists, with + * the use of {@link locate_template()}. Allows for more generic template location + * without the use of the other get_*_template() functions. + * + * @since 1.5.0 + * + * @param string $type Filename without extension. + * @param array $templates An optional list of template candidates + * @return string Full path to file. + */ +function get_query_template( $type, $templates = array() ) { + $type = preg_replace( '|[^a-z0-9-]+|', '', $type ); + + if ( empty( $templates ) ) + $templates = array("{$type}.php"); + + return apply_filters( "{$type}_template", locate_template( $templates ) ); +} + +/** + * Retrieve path of index template in current or parent template. + * + * @since 3.0.0 + * + * @return string + */ +function get_index_template() { + return get_query_template('index'); +} + +/** + * Retrieve path of 404 template in current or parent template. + * + * @since 1.5.0 + * + * @return string + */ +function get_404_template() { + return get_query_template('404'); +} + +/** + * Retrieve path of archive template in current or parent template. + * + * @since 1.5.0 + * + * @return string + */ +function get_archive_template() { + $post_type = get_query_var( 'post_type' ); + + $templates = array(); + + if ( $post_type ) + $templates[] = "archive-{$post_type}.php"; + $templates[] = 'archive.php'; + + return get_query_template( 'archive', $templates ); +} + +/** + * Retrieve path of author template in current or parent template. + * + * @since 1.5.0 + * + * @return string + */ +function get_author_template() { + $author = get_queried_object(); + + $templates = array(); + + $templates[] = "author-{$author->user_nicename}.php"; + $templates[] = "author-{$author->ID}.php"; + $templates[] = 'author.php'; + + return get_query_template( 'author', $templates ); +} + +/** + * Retrieve path of category template in current or parent template. + * + * Works by first retrieving the current slug for example 'category-default.php' and then + * trying category ID, for example 'category-1.php' and will finally fallback to category.php + * template, if those files don't exist. + * + * @since 1.5.0 + * @uses apply_filters() Calls 'category_template' on file path of category template. + * + * @return string + */ +function get_category_template() { + $category = get_queried_object(); + + $templates = array(); + + $templates[] = "category-{$category->slug}.php"; + $templates[] = "category-{$category->term_id}.php"; + $templates[] = 'category.php'; + + return get_query_template( 'category', $templates ); +} + +/** + * Retrieve path of tag template in current or parent template. + * + * Works by first retrieving the current tag name, for example 'tag-wordpress.php' and then + * trying tag ID, for example 'tag-1.php' and will finally fallback to tag.php + * template, if those files don't exist. + * + * @since 2.3.0 + * @uses apply_filters() Calls 'tag_template' on file path of tag template. + * + * @return string + */ +function get_tag_template() { + $tag = get_queried_object(); + + $templates = array(); + + $templates[] = "tag-{$tag->slug}.php"; + $templates[] = "tag-{$tag->term_id}.php"; + $templates[] = 'tag.php'; + + return get_query_template( 'tag', $templates ); +} + +/** + * Retrieve path of taxonomy template in current or parent template. + * + * Retrieves the taxonomy and term, if term is available. The template is + * prepended with 'taxonomy-' and followed by both the taxonomy string and + * the taxonomy string followed by a dash and then followed by the term. + * + * The taxonomy and term template is checked and used first, if it exists. + * Second, just the taxonomy template is checked, and then finally, taxonomy.php + * template is used. If none of the files exist, then it will fall back on to + * index.php. + * + * @since 2.5.0 + * @uses apply_filters() Calls 'taxonomy_template' filter on found path. + * + * @return string + */ +function get_taxonomy_template() { + $term = get_queried_object(); + $taxonomy = $term->taxonomy; + + $templates = array(); + + $templates[] = "taxonomy-$taxonomy-{$term->slug}.php"; + $templates[] = "taxonomy-$taxonomy.php"; + $templates[] = 'taxonomy.php'; + + return get_query_template( 'taxonomy', $templates ); +} + +/** + * Retrieve path of date template in current or parent template. + * + * @since 1.5.0 + * + * @return string + */ +function get_date_template() { + return get_query_template('date'); +} + +/** + * Retrieve path of home template in current or parent template. + * + * This is the template used for the page containing the blog posts + * + * Attempts to locate 'home.php' first before falling back to 'index.php'. + * + * @since 1.5.0 + * @uses apply_filters() Calls 'home_template' on file path of home template. + * + * @return string + */ +function get_home_template() { + $templates = array( 'home.php', 'index.php' ); + + return get_query_template( 'home', $templates ); +} + +/** + * Retrieve path of front-page template in current or parent template. + * + * Looks for 'front-page.php'. + * + * @since 3.0.0 + * @uses apply_filters() Calls 'front_page_template' on file path of template. + * + * @return string + */ +function get_front_page_template() { + $templates = array('front-page.php'); + + return get_query_template( 'front_page', $templates ); +} + +/** + * Retrieve path of page template in current or parent template. + * + * Will first look for the specifically assigned page template + * The will search for 'page-{slug}.php' followed by 'page-id.php' + * and finally 'page.php' + * + * @since 1.5.0 + * + * @return string + */ +function get_page_template() { + $id = get_queried_object_id(); + $template = get_post_meta($id, '_wp_page_template', true); + $pagename = get_query_var('pagename'); + + if ( !$pagename && $id > 0 ) { + // If a static page is set as the front page, $pagename will not be set. Retrieve it from the queried object + $post = get_queried_object(); + $pagename = $post->post_name; + } + + if ( 'default' == $template ) + $template = ''; + + $templates = array(); + if ( !empty($template) && !validate_file($template) ) + $templates[] = $template; + if ( $pagename ) + $templates[] = "page-$pagename.php"; + if ( $id ) + $templates[] = "page-$id.php"; + $templates[] = 'page.php'; + + return get_query_template( 'page', $templates ); +} + +/** + * Retrieve path of paged template in current or parent template. + * + * @since 1.5.0 + * + * @return string + */ +function get_paged_template() { + return get_query_template('paged'); +} + +/** + * Retrieve path of search template in current or parent template. + * + * @since 1.5.0 + * + * @return string + */ +function get_search_template() { + return get_query_template('search'); +} + +/** + * Retrieve path of single template in current or parent template. + * + * @since 1.5.0 + * + * @return string + */ +function get_single_template() { + $object = get_queried_object(); + + $templates = array(); + + $templates[] = "single-{$object->post_type}.php"; + $templates[] = "single.php"; + + return get_query_template( 'single', $templates ); +} + +/** + * Retrieve path of attachment template in current or parent template. + * + * The attachment path first checks if the first part of the mime type exists. + * The second check is for the second part of the mime type. The last check is + * for both types separated by an underscore. If neither are found then the file + * 'attachment.php' is checked and returned. + * + * Some examples for the 'text/plain' mime type are 'text.php', 'plain.php', and + * finally 'text_plain.php'. + * + * @since 2.0.0 + * + * @return string + */ +function get_attachment_template() { + global $posts; + $type = explode('/', $posts[0]->post_mime_type); + if ( $template = get_query_template($type[0]) ) + return $template; + elseif ( $template = get_query_template($type[1]) ) + return $template; + elseif ( $template = get_query_template("$type[0]_$type[1]") ) + return $template; + else + return get_query_template('attachment'); +} + +/** + * Retrieve path of comment popup template in current or parent template. + * + * Checks for comment popup template in current template, if it exists or in the + * parent template. + * + * @since 1.5.0 + * @uses apply_filters() Calls 'comments_popup_template' filter on path. + * + * @return string + */ +function get_comments_popup_template() { + $template = get_query_template( 'comments_popup', array( 'comments-popup.php' ) ); + + // Backward compat code will be removed in a future release + if ('' == $template) + $template = ABSPATH . WPINC . '/theme-compat/comments-popup.php'; + + return $template; +} + +/** + * Retrieve the name of the highest priority template file that exists. + * + * Searches in the STYLESHEETPATH before TEMPLATEPATH so that themes which + * inherit from a parent theme can just overload one file. + * + * @since 2.7.0 + * + * @param string|array $template_names Template file(s) to search for, in order. + * @param bool $load If true the template file will be loaded if it is found. + * @param bool $require_once Whether to require_once or require. Default true. Has no effect if $load is false. + * @return string The template filename if one is located. + */ +function locate_template($template_names, $load = false, $require_once = true ) { + $located = ''; + foreach ( (array) $template_names as $template_name ) { + if ( !$template_name ) + continue; + if ( file_exists(STYLESHEETPATH . '/' . $template_name)) { + $located = STYLESHEETPATH . '/' . $template_name; + break; + } else if ( file_exists(TEMPLATEPATH . '/' . $template_name) ) { + $located = TEMPLATEPATH . '/' . $template_name; + break; + } + } + + if ( $load && '' != $located ) + load_template( $located, $require_once ); + + return $located; +} + +/** + * Require the template file with WordPress environment. + * + * The globals are set up for the template file to ensure that the WordPress + * environment is available from within the function. The query variables are + * also available. + * + * @since 1.5.0 + * + * @param string $_template_file Path to template file. + * @param bool $require_once Whether to require_once or require. Default true. + */ +function load_template( $_template_file, $require_once = true ) { + global $posts, $post, $wp_did_header, $wp_did_template_redirect, $wp_query, $wp_rewrite, $wpdb, $wp_version, $wp, $id, $comment, $user_ID; + + if ( is_array( $wp_query->query_vars ) ) + extract( $wp_query->query_vars, EXTR_SKIP ); + + if ( $require_once ) + require_once( $_template_file ); + else + require( $_template_file ); +} + +/** + * Display localized stylesheet link element. + * + * @since 2.1.0 + */ +function locale_stylesheet() { + $stylesheet = get_locale_stylesheet_uri(); + if ( empty($stylesheet) ) + return; + echo ''; +} + +/** + * Start preview theme output buffer. + * + * Will only preform task if the user has permissions and template and preview + * query variables exist. + * + * @since 2.6.0 + */ +function preview_theme() { + if ( ! (isset($_GET['template']) && isset($_GET['preview'])) ) + return; + + if ( !current_user_can( 'switch_themes' ) ) + return; + + // Admin Thickbox requests + if ( isset( $_GET['preview_iframe'] ) ) + show_admin_bar( false ); + + $_GET['template'] = preg_replace('|[^a-z0-9_./-]|i', '', $_GET['template']); + + if ( validate_file($_GET['template']) ) + return; + + add_filter( 'template', '_preview_theme_template_filter' ); + + if ( isset($_GET['stylesheet']) ) { + $_GET['stylesheet'] = preg_replace('|[^a-z0-9_./-]|i', '', $_GET['stylesheet']); + if ( validate_file($_GET['stylesheet']) ) + return; + add_filter( 'stylesheet', '_preview_theme_stylesheet_filter' ); + } + + // Prevent theme mods to current theme being used on theme being previewed + add_filter( 'pre_option_mods_' . get_current_theme(), '__return_empty_array' ); + + ob_start( 'preview_theme_ob_filter' ); +} +add_action('setup_theme', 'preview_theme'); + +/** + * Private function to modify the current template when previewing a theme + * + * @since 2.9.0 + * @access private + * + * @return string + */ +function _preview_theme_template_filter() { + return isset($_GET['template']) ? $_GET['template'] : ''; +} + +/** + * Private function to modify the current stylesheet when previewing a theme + * + * @since 2.9.0 + * @access private + * + * @return string + */ +function _preview_theme_stylesheet_filter() { + return isset($_GET['stylesheet']) ? $_GET['stylesheet'] : ''; +} + +/** + * Callback function for ob_start() to capture all links in the theme. + * + * @since 2.6.0 + * @access private + * + * @param string $content + * @return string + */ +function preview_theme_ob_filter( $content ) { + return preg_replace_callback( "|()|", 'preview_theme_ob_filter_callback', $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 + * @access private + * + * @param array $matches + * @return string + */ +function preview_theme_ob_filter_callback( $matches ) { + if ( strpos($matches[4], 'onclick') !== false ) + $matches[4] = preg_replace('#onclick=([\'"]).*?(?. (? 1, 'template' => $_GET['template'], 'stylesheet' => @$_GET['stylesheet'] ), $matches[3] ); + if ( 0 === strpos($link, 'preview=1') ) + $link = "?$link"; + return $matches[1] . esc_attr( $link ) . $matches[4]; +} + +/** + * Switches current theme to new template and stylesheet names. + * + * @since 2.5.0 + * @uses do_action() Calls 'switch_theme' action on updated theme display name. + * + * @param string $template Template name + * @param string $stylesheet Stylesheet name. + */ +function switch_theme($template, $stylesheet) { + global $wp_theme_directories; + + update_option('template', $template); + update_option('stylesheet', $stylesheet); + if ( count($wp_theme_directories) > 1 ) { + update_option('template_root', get_raw_theme_root($template, true)); + update_option('stylesheet_root', get_raw_theme_root($stylesheet, true)); + } + delete_option('current_theme'); + $theme = get_current_theme(); + if ( is_admin() && false === get_option( "theme_mods_$stylesheet" ) ) { + $default_theme_mods = (array) get_option( "mods_$theme" ); + add_option( "theme_mods_$stylesheet", $default_theme_mods ); + } + do_action('switch_theme', $theme); +} + +/** + * Checks that current theme files 'index.php' and 'style.css' exists. + * + * Does not check the default theme, which is the fallback and should always exist. + * Will switch theme to the fallback theme if current theme does not validate. + * You can use the 'validate_current_theme' filter to return FALSE to + * disable this functionality. + * + * @since 1.5.0 + * @see WP_DEFAULT_THEME + * + * @return bool + */ +function validate_current_theme() { + // Don't validate during an install/upgrade. + if ( defined('WP_INSTALLING') || !apply_filters( 'validate_current_theme', true ) ) + return true; + + if ( get_template() != WP_DEFAULT_THEME && !file_exists(get_template_directory() . '/index.php') ) { + switch_theme( WP_DEFAULT_THEME, WP_DEFAULT_THEME ); + return false; + } + + if ( get_stylesheet() != WP_DEFAULT_THEME && !file_exists(get_template_directory() . '/style.css') ) { + switch_theme( WP_DEFAULT_THEME, WP_DEFAULT_THEME ); + return false; + } + + if ( is_child_theme() && ! file_exists( get_stylesheet_directory() . '/style.css' ) ) { + switch_theme( WP_DEFAULT_THEME, WP_DEFAULT_THEME ); + return false; + } + + return true; +} + +/** + * Retrieve all theme modifications. + * + * @since 3.1.0 + * + * @return array Theme modifications. + */ +function get_theme_mods() { + $theme_slug = get_option( 'stylesheet' ); + if ( false === ( $mods = get_option( "theme_mods_$theme_slug" ) ) ) { + $theme_name = get_current_theme(); + $mods = get_option( "mods_$theme_name" ); // Deprecated location. + if ( is_admin() && false !== $mods ) { + update_option( "theme_mods_$theme_slug", $mods ); + delete_option( "mods_$theme_name" ); + } + } + return $mods; +} + +/** + * Retrieve theme modification value for the current theme. + * + * If the modification name does not exist, then the $default will be passed + * through {@link http://php.net/sprintf sprintf()} PHP function with the first + * string the template directory URI and the second string the stylesheet + * directory URI. + * + * @since 2.1.0 + * @uses apply_filters() Calls 'theme_mod_$name' filter on the value. + * + * @param string $name Theme modification name. + * @param bool|string $default + * @return string + */ +function get_theme_mod( $name, $default = false ) { + $mods = get_theme_mods(); + + if ( isset( $mods[ $name ] ) ) + return apply_filters( "theme_mod_$name", $mods[ $name ] ); + + return apply_filters( "theme_mod_$name", sprintf( $default, get_template_directory_uri(), get_stylesheet_directory_uri() ) ); +} + +/** + * Update theme modification value for the current theme. + * + * @since 2.1.0 + * + * @param string $name Theme modification name. + * @param string $value theme modification value. + */ +function set_theme_mod( $name, $value ) { + $mods = get_theme_mods(); + + $mods[ $name ] = $value; + + $theme = get_option( 'stylesheet' ); + update_option( "theme_mods_$theme", $mods ); +} + +/** + * Remove theme modification name from current theme list. + * + * If removing the name also removes all elements, then the entire option will + * be removed. + * + * @since 2.1.0 + * + * @param string $name Theme modification name. + * @return null + */ +function remove_theme_mod( $name ) { + $mods = get_theme_mods(); + + if ( ! isset( $mods[ $name ] ) ) + return; + + unset( $mods[ $name ] ); + + if ( empty( $mods ) ) + return remove_theme_mods(); + + $theme = get_option( 'stylesheet' ); + update_option( "theme_mods_$theme", $mods ); +} + +/** + * Remove theme modifications option for current theme. + * + * @since 2.1.0 + */ +function remove_theme_mods() { + delete_option( 'theme_mods_' . get_option( 'stylesheet' ) ); + delete_option( 'mods_' . get_current_theme() ); +} + +/** + * Retrieve text color for custom header. + * + * @since 2.1.0 + * @uses HEADER_TEXTCOLOR + * + * @return string + */ +function get_header_textcolor() { + $default = defined('HEADER_TEXTCOLOR') ? HEADER_TEXTCOLOR : ''; + + return get_theme_mod('header_textcolor', $default); +} + +/** + * Display text color for custom header. + * + * @since 2.1.0 + */ +function header_textcolor() { + echo get_header_textcolor(); +} + +/** + * Retrieve header image for custom header. + * + * @since 2.1.0 + * @uses HEADER_IMAGE + * + * @return string + */ +function get_header_image() { + $default = defined( 'HEADER_IMAGE' ) ? HEADER_IMAGE : ''; + $url = get_theme_mod( 'header_image', $default ); + + if ( 'remove-header' == $url ) + return false; + + if ( is_random_header_image() ) + $url = get_random_header_image(); + + if ( is_ssl() ) + $url = str_replace( 'http://', 'https://', $url ); + else + $url = str_replace( 'https://', 'http://', $url ); + + return esc_url_raw( $url ); +} + +/** + * Get random header image from registered images in theme. + * + * @since 3.2.0 + * + * @return string Path to header image + */ +function get_random_header_image() { + global $_wp_default_headers; + + $header_image_mod = get_theme_mod( 'header_image', '' ); + $headers = array(); + + if ( 'random-uploaded-image' == $header_image_mod ) + $headers = get_uploaded_header_images(); + elseif ( ! empty( $_wp_default_headers ) ) { + if ( 'random-default-image' == $header_image_mod ) { + $headers = $_wp_default_headers; + } else { + $is_random = get_theme_support( 'custom-header' ); + if ( isset( $is_random[ 0 ] ) && !empty( $is_random[ 0 ][ 'random-default' ] ) ) + $headers = $_wp_default_headers; + } + } + + if ( empty( $headers ) ) + return ''; + + $random_image = array_rand( $headers ); + $header_url = sprintf( $headers[$random_image]['url'], get_template_directory_uri(), get_stylesheet_directory_uri() ); + + return $header_url; +} + +/** + * Check if random header image is in use. + * + * Always true if user expressly chooses the option in Appearance > Header. + * Also true if theme has multiple header images registered, no specific header image + * is chosen, and theme turns on random headers with add_theme_support(). + * + * @since 3.2.0 + * @uses HEADER_IMAGE + * + * @param string $type The random pool to use. any|default|uploaded + * @return boolean + */ +function is_random_header_image( $type = 'any' ) { + $default = defined( 'HEADER_IMAGE' ) ? HEADER_IMAGE : ''; + $header_image_mod = get_theme_mod( 'header_image', $default ); + + if ( 'any' == $type ) { + if ( 'random-default-image' == $header_image_mod || 'random-uploaded-image' == $header_image_mod || ( '' != get_random_header_image() && empty( $header_image_mod ) ) ) + return true; + } else { + if ( "random-$type-image" == $header_image_mod ) + return true; + elseif ( 'default' == $type && empty( $header_image_mod ) && '' != get_random_header_image() ) + return true; + } + + return false; +} + +/** + * Display header image path. + * + * @since 2.1.0 + */ +function header_image() { + echo get_header_image(); +} + +/** + * Get the header images uploaded for the current theme. + * + * @since 3.2.0 + * + * @return array + */ +function get_uploaded_header_images() { + $header_images = array(); + + // @todo caching + $headers = get_posts( array( 'post_type' => 'attachment', 'meta_key' => '_wp_attachment_is_custom_header', 'meta_value' => get_option('stylesheet'), 'orderby' => 'none', 'nopaging' => true ) ); + + if ( empty( $headers ) ) + return array(); + + foreach ( (array) $headers as $header ) { + $url = esc_url_raw( $header->guid ); + $header = basename($url); + $header_images[$header] = array(); + $header_images[$header]['url'] = $url; + $header_images[$header]['thumbnail_url'] = $url; + $header_images[$header]['uploaded'] = true; + } + + return $header_images; +} + +/** + * Add callbacks for image header display. + * + * The parameter $header_callback callback will be required to display the + * content for the 'wp_head' action. The parameter $admin_header_callback + * callback will be added to Custom_Image_Header class and that will be added + * to the 'admin_menu' action. + * + * @since 2.1.0 + * @uses Custom_Image_Header Sets up for $admin_header_callback for administration panel display. + * + * @param callback $header_callback Call on 'wp_head' action. + * @param callback $admin_header_callback Call on custom header administration screen. + * @param callback $admin_image_div_callback Output a custom header image div on the custom header administration screen. Optional. + */ +function add_custom_image_header( $header_callback, $admin_header_callback, $admin_image_div_callback = '' ) { + if ( ! empty( $header_callback ) ) + add_action('wp_head', $header_callback); + + $support = array( 'callback' => $header_callback ); + $theme_support = get_theme_support( 'custom-header' ); + if ( ! empty( $theme_support ) && is_array( $theme_support[ 0 ] ) ) + $support = array_merge( $theme_support[ 0 ], $support ); + add_theme_support( 'custom-header', $support ); + add_theme_support( 'custom-header-uploads' ); + + if ( ! is_admin() ) + return; + + global $custom_image_header; + + require_once( ABSPATH . 'wp-admin/custom-header.php' ); + $custom_image_header = new Custom_Image_Header( $admin_header_callback, $admin_image_div_callback ); + add_action( 'admin_menu', array( &$custom_image_header, 'init' ) ); +} + +/** + * Remove image header support. + * + * @since 3.1.0 + * @see add_custom_image_header() + * + * @return bool Whether support was removed. + */ +function remove_custom_image_header() { + if ( ! current_theme_supports( 'custom-header' ) ) + return false; + + $callback = get_theme_support( 'custom-header' ); + remove_action( 'wp_head', $callback[0]['callback'] ); + _remove_theme_support( 'custom-header' ); + remove_theme_support( 'custom-header-uploads' ); + + if ( is_admin() ) { + remove_action( 'admin_menu', array( &$GLOBALS['custom_image_header'], 'init' ) ); + unset( $GLOBALS['custom_image_header'] ); + } + + return true; +} + +/** + * Register a selection of default headers to be displayed by the custom header admin UI. + * + * @since 3.0.0 + * + * @param array $headers Array of headers keyed by a string id. The ids point to arrays containing 'url', 'thumbnail_url', and 'description' keys. + */ +function register_default_headers( $headers ) { + global $_wp_default_headers; + + $_wp_default_headers = array_merge( (array) $_wp_default_headers, (array) $headers ); +} + +/** + * Unregister default headers. + * + * This function must be called after register_default_headers() has already added the + * header you want to remove. + * + * @see register_default_headers() + * @since 3.0.0 + * + * @param string|array $header The header string id (key of array) to remove, or an array thereof. + * @return True on success, false on failure. + */ +function unregister_default_headers( $header ) { + global $_wp_default_headers; + if ( is_array( $header ) ) { + array_map( 'unregister_default_headers', $header ); + } elseif ( isset( $_wp_default_headers[ $header ] ) ) { + unset( $_wp_default_headers[ $header ] ); + return true; + } else { + return false; + } +} + +/** + * Retrieve background image for custom background. + * + * @since 3.0.0 + * + * @return string + */ +function get_background_image() { + $default = defined('BACKGROUND_IMAGE') ? BACKGROUND_IMAGE : ''; + + return get_theme_mod('background_image', $default); +} + +/** + * Display background image path. + * + * @since 3.0.0 + */ +function background_image() { + echo get_background_image(); +} + +/** + * Retrieve value for custom background color. + * + * @since 3.0.0 + * @uses BACKGROUND_COLOR + * + * @return string + */ +function get_background_color() { + $default = defined('BACKGROUND_COLOR') ? BACKGROUND_COLOR : ''; + + return get_theme_mod('background_color', $default); +} + +/** + * Display background color value. + * + * @since 3.0.0 + */ +function background_color() { + echo get_background_color(); +} + +/** + * Add callbacks for background image display. + * + * The parameter $header_callback callback will be required to display the + * content for the 'wp_head' action. The parameter $admin_header_callback + * callback will be added to Custom_Background class and that will be added + * to the 'admin_menu' action. + * + * @since 3.0.0 + * @uses Custom_Background Sets up for $admin_header_callback for administration panel display. + * + * @param callback $header_callback Call on 'wp_head' action. + * @param callback $admin_header_callback Call on custom background administration screen. + * @param callback $admin_image_div_callback Output a custom background image div on the custom background administration screen. Optional. + */ +function add_custom_background( $header_callback = '', $admin_header_callback = '', $admin_image_div_callback = '' ) { + if ( isset( $GLOBALS['custom_background'] ) ) + return; + + if ( empty( $header_callback ) ) + $header_callback = '_custom_background_cb'; + + add_action( 'wp_head', $header_callback ); + + add_theme_support( 'custom-background', array( 'callback' => $header_callback ) ); + + if ( ! is_admin() ) + return; + require_once( ABSPATH . 'wp-admin/custom-background.php' ); + $GLOBALS['custom_background'] =& new Custom_Background( $admin_header_callback, $admin_image_div_callback ); + add_action( 'admin_menu', array( &$GLOBALS['custom_background'], 'init' ) ); +} + +/** + * Remove custom background support. + * + * @since 3.1.0 + * @see add_custom_background() + * + * @return bool Whether support was removed. + */ +function remove_custom_background() { + if ( ! current_theme_supports( 'custom-background' ) ) + return false; + + $callback = get_theme_support( 'custom-background' ); + remove_action( 'wp_head', $callback[0]['callback'] ); + _remove_theme_support( 'custom-background' ); + + if ( is_admin() ) { + remove_action( 'admin_menu', array( &$GLOBALS['custom_background'], 'init' ) ); + unset( $GLOBALS['custom_background'] ); + } + + return true; +} + +/** + * Default custom background callback. + * + * @since 3.0.0 + * @see add_custom_background() + * @access protected + */ +function _custom_background_cb() { + $background = get_background_image(); + $color = get_background_color(); + if ( ! $background && ! $color ) + return; + + $style = $color ? "background-color: #$color;" : ''; + + if ( $background ) { + $image = " background-image: url('$background');"; + + $repeat = get_theme_mod( 'background_repeat', 'repeat' ); + if ( ! in_array( $repeat, array( 'no-repeat', 'repeat-x', 'repeat-y', 'repeat' ) ) ) + $repeat = 'repeat'; + $repeat = " background-repeat: $repeat;"; + + $position = get_theme_mod( 'background_position_x', 'left' ); + if ( ! in_array( $position, array( 'center', 'right', 'left' ) ) ) + $position = 'left'; + $position = " background-position: top $position;"; + + $attachment = get_theme_mod( 'background_attachment', 'scroll' ); + if ( ! in_array( $attachment, array( 'fixed', 'scroll' ) ) ) + $attachment = 'scroll'; + $attachment = " background-attachment: $attachment;"; + + $style .= $image . $repeat . $position . $attachment; + } +?> + + diff --git a/src/wp-includes/update.php b/src/wp-includes/update.php new file mode 100644 index 0000000..6cb2337 --- /dev/null +++ b/src/wp-includes/update.php @@ -0,0 +1,366 @@ +updates = array(); + $current->version_checked = $wp_version; + } + + $locale = apply_filters( 'core_version_check_locale', get_locale() ); + + // Update last_checked for current to prevent multiple blocking requests if request hangs + $current->last_checked = time(); + set_site_transient( 'update_core', $current ); + + if ( method_exists( $wpdb, 'db_version' ) ) + $mysql_version = preg_replace('/[^0-9.].*/', '', $wpdb->db_version()); + else + $mysql_version = 'N/A'; + + if ( is_multisite( ) ) { + $user_count = get_user_count( ); + $num_blogs = get_blog_count( ); + $wp_install = network_site_url( ); + $multisite_enabled = 1; + } else { + $user_count = count_users( ); + $multisite_enabled = 0; + $num_blogs = 1; + $wp_install = home_url( '/' ); + } + + $local_package = isset( $wp_local_package )? $wp_local_package : ''; + $url = "http://api.wordpress.org/core/version-check/1.6/?version=$wp_version&php=$php_version&locale=$locale&mysql=$mysql_version&local_package=$local_package&blogs=$num_blogs&users={$user_count['total_users']}&multisite_enabled=$multisite_enabled"; + + $options = array( + 'timeout' => ( ( defined('DOING_CRON') && DOING_CRON ) ? 30 : 3 ), + 'user-agent' => 'WordPress/' . $wp_version . '; ' . home_url( '/' ), + 'headers' => array( + 'wp_install' => $wp_install, + 'wp_blog' => home_url( '/' ) + ) + ); + + $response = wp_remote_get($url, $options); + + if ( is_wp_error( $response ) || 200 != wp_remote_retrieve_response_code( $response ) ) + return false; + + $body = trim( wp_remote_retrieve_body( $response ) ); + if ( ! $body = maybe_unserialize( $body ) ) + return false; + if ( ! isset( $body['offers'] ) ) + return false; + $offers = $body['offers']; + + foreach ( $offers as &$offer ) { + foreach ( $offer as $offer_key => $value ) { + if ( 'packages' == $offer_key ) + $offer['packages'] = (object) array_intersect_key( array_map( 'esc_url', $offer['packages'] ), + array_fill_keys( array( 'full', 'no_content', 'new_bundled', 'partial' ), '' ) ); + elseif ( 'download' == $offer_key ) + $offer['download'] = esc_url( $value ); + else + $offer[ $offer_key ] = esc_html( $value ); + } + $offer = (object) array_intersect_key( $offer, array_fill_keys( array( 'response', 'download', 'locale', + 'packages', 'current', 'php_version', 'mysql_version', 'new_bundled', 'partial_version' ), '' ) ); + } + + $updates = new stdClass(); + $updates->updates = $offers; + $updates->last_checked = time(); + $updates->version_checked = $wp_version; + set_site_transient( 'update_core', $updates); +} + +/** + * Check plugin versions against the latest versions hosted on WordPress.org. + * + * The WordPress version, PHP version, and Locale is sent along with a list of + * all plugins installed. Checks against the WordPress server at + * api.wordpress.org. Will only check if WordPress isn't installing. + * + * @package WordPress + * @since 2.3.0 + * @uses $wp_version Used to notify the WordPress version. + * + * @return mixed Returns null if update is unsupported. Returns false if check is too soon. + */ +function wp_update_plugins() { + include ABSPATH . WPINC . '/version.php'; // include an unmodified $wp_version + + if ( defined('WP_INSTALLING') ) + return false; + + // If running blog-side, bail unless we've not checked in the last 12 hours + if ( !function_exists( 'get_plugins' ) ) + require_once( ABSPATH . 'wp-admin/includes/plugin.php' ); + + $plugins = get_plugins(); + $active = get_option( 'active_plugins', array() ); + $current = get_site_transient( 'update_plugins' ); + if ( ! is_object($current) ) + $current = new stdClass; + + $new_option = new stdClass; + $new_option->last_checked = time(); + $timeout = 'load-plugins.php' == current_filter() ? 3600 : 43200; //Check for updated every 60 minutes if hitting the themes page, Else, check every 12 hours + $time_not_changed = isset( $current->last_checked ) && $timeout > ( time() - $current->last_checked ); + + $plugin_changed = false; + foreach ( $plugins as $file => $p ) { + $new_option->checked[ $file ] = $p['Version']; + + if ( !isset( $current->checked[ $file ] ) || strval($current->checked[ $file ]) !== strval($p['Version']) ) + $plugin_changed = true; + } + + if ( isset ( $current->response ) && is_array( $current->response ) ) { + foreach ( $current->response as $plugin_file => $update_details ) { + if ( ! isset($plugins[ $plugin_file ]) ) { + $plugin_changed = true; + break; + } + } + } + + // Bail if we've checked in the last 12 hours and if nothing has changed + if ( $time_not_changed && !$plugin_changed ) + return false; + + // Update last_checked for current to prevent multiple blocking requests if request hangs + $current->last_checked = time(); + set_site_transient( 'update_plugins', $current ); + + $to_send = (object) compact('plugins', 'active'); + + $options = array( + 'timeout' => ( ( defined('DOING_CRON') && DOING_CRON ) ? 30 : 3), + 'body' => array( 'plugins' => serialize( $to_send ) ), + 'user-agent' => 'WordPress/' . $wp_version . '; ' . get_bloginfo( 'url' ) + ); + + $raw_response = wp_remote_post('http://api.wordpress.org/plugins/update-check/1.0/', $options); + + if ( is_wp_error( $raw_response ) || 200 != wp_remote_retrieve_response_code( $raw_response ) ) + return false; + + $response = unserialize( wp_remote_retrieve_body( $raw_response ) ); + + if ( false !== $response ) + $new_option->response = $response; + else + $new_option->response = array(); + + set_site_transient( 'update_plugins', $new_option ); +} + +/** + * Check theme versions against the latest versions hosted on WordPress.org. + * + * A list of all themes installed in sent to WP. Checks against the + * WordPress server at api.wordpress.org. Will only check if WordPress isn't + * installing. + * + * @package WordPress + * @since 2.7.0 + * @uses $wp_version Used to notify the WordPress version. + * + * @return mixed Returns null if update is unsupported. Returns false if check is too soon. + */ +function wp_update_themes() { + include ABSPATH . WPINC . '/version.php'; // include an unmodified $wp_version + + if ( defined( 'WP_INSTALLING' ) ) + return false; + + if ( !function_exists( 'get_themes' ) ) + require_once( ABSPATH . 'wp-includes/theme.php' ); + + $installed_themes = get_themes( ); + $last_update = get_site_transient( 'update_themes' ); + if ( ! is_object($last_update) ) + $last_update = new stdClass; + + $timeout = 'load-themes.php' == current_filter() ? 3600 : 43200; //Check for updated every 60 minutes if hitting the themes page, Else, check every 12 hours + $time_not_changed = isset( $last_update->last_checked ) && $timeout > ( time( ) - $last_update->last_checked ); + + $themes = array(); + $checked = array(); + $exclude_fields = array('Template Files', 'Stylesheet Files', 'Status', 'Theme Root', 'Theme Root URI', 'Template Dir', 'Stylesheet Dir', 'Description', 'Tags', 'Screenshot'); + + // Put slug of current theme into request. + $themes['current_theme'] = get_option( 'stylesheet' ); + + foreach ( (array) $installed_themes as $theme_title => $theme ) { + $themes[$theme['Stylesheet']] = array(); + $checked[$theme['Stylesheet']] = $theme['Version']; + + $themes[$theme['Stylesheet']]['Name'] = $theme['Name']; + $themes[$theme['Stylesheet']]['Version'] = $theme['Version']; + + foreach ( (array) $theme as $key => $value ) { + if ( !in_array($key, $exclude_fields) ) + $themes[$theme['Stylesheet']][$key] = $value; + } + } + + $theme_changed = false; + foreach ( $checked as $slug => $v ) { + $update_request->checked[ $slug ] = $v; + + if ( !isset( $last_update->checked[ $slug ] ) || strval($last_update->checked[ $slug ]) !== strval($v) ) + $theme_changed = true; + } + + if ( isset ( $last_update->response ) && is_array( $last_update->response ) ) { + foreach ( $last_update->response as $slug => $update_details ) { + if ( ! isset($checked[ $slug ]) ) { + $theme_changed = true; + break; + } + } + } + + if ( $time_not_changed && !$theme_changed ) + return false; + + // Update last_checked for current to prevent multiple blocking requests if request hangs + $last_update->last_checked = time(); + set_site_transient( 'update_themes', $last_update ); + + $options = array( + 'timeout' => ( ( defined('DOING_CRON') && DOING_CRON ) ? 30 : 3), + 'body' => array( 'themes' => serialize( $themes ) ), + 'user-agent' => 'WordPress/' . $wp_version . '; ' . get_bloginfo( 'url' ) + ); + + $raw_response = wp_remote_post( 'http://api.wordpress.org/themes/update-check/1.0/', $options ); + + if ( is_wp_error( $raw_response ) || 200 != wp_remote_retrieve_response_code( $raw_response ) ) + return false; + + $new_update = new stdClass; + $new_update->last_checked = time( ); + $new_update->checked = $checked; + + $response = unserialize( wp_remote_retrieve_body( $raw_response ) ); + if ( false !== $response ) + $new_update->response = $response; + + set_site_transient( 'update_themes', $new_update ); +} + +function _maybe_update_core() { + include ABSPATH . WPINC . '/version.php'; // include an unmodified $wp_version + + $current = get_site_transient( 'update_core' ); + + if ( isset( $current->last_checked ) && + 43200 > ( time() - $current->last_checked ) && + isset( $current->version_checked ) && + $current->version_checked == $wp_version ) + return; + + wp_version_check(); +} +/** + * Check the last time plugins were run before checking plugin versions. + * + * This might have been backported to WordPress 2.6.1 for performance reasons. + * This is used for the wp-admin to check only so often instead of every page + * load. + * + * @since 2.7.0 + * @access private + */ +function _maybe_update_plugins() { + $current = get_site_transient( 'update_plugins' ); + if ( isset( $current->last_checked ) && 43200 > ( time() - $current->last_checked ) ) + return; + wp_update_plugins(); +} + +/** + * Check themes versions only after a duration of time. + * + * This is for performance reasons to make sure that on the theme version + * checker is not run on every page load. + * + * @since 2.7.0 + * @access private + */ +function _maybe_update_themes( ) { + $current = get_site_transient( 'update_themes' ); + if ( isset( $current->last_checked ) && 43200 > ( time( ) - $current->last_checked ) ) + return; + + wp_update_themes(); +} + +/** + * Schedule core, theme, and plugin update checks. + * + * @since 3.1.0 + */ +function wp_schedule_update_checks() { + if ( !wp_next_scheduled('wp_version_check') && !defined('WP_INSTALLING') ) + wp_schedule_event(time(), 'twicedaily', 'wp_version_check'); + + if ( !wp_next_scheduled('wp_update_plugins') && !defined('WP_INSTALLING') ) + wp_schedule_event(time(), 'twicedaily', 'wp_update_plugins'); + + if ( !wp_next_scheduled('wp_update_themes') && !defined('WP_INSTALLING') ) + wp_schedule_event(time(), 'twicedaily', 'wp_update_themes'); +} + +if ( ! is_main_site() ) + return; + +add_action( 'admin_init', '_maybe_update_core' ); +add_action( 'wp_version_check', 'wp_version_check' ); + +add_action( 'load-plugins.php', 'wp_update_plugins' ); +add_action( 'load-update.php', 'wp_update_plugins' ); +add_action( 'load-update-core.php', 'wp_update_plugins' ); +add_action( 'admin_init', '_maybe_update_plugins' ); +add_action( 'wp_update_plugins', 'wp_update_plugins' ); + +add_action( 'load-themes.php', 'wp_update_themes' ); +add_action( 'load-update.php', 'wp_update_themes' ); +add_action( 'load-update-core.php', 'wp_update_themes' ); +add_action( 'admin_init', '_maybe_update_themes' ); +add_action( 'wp_update_themes', 'wp_update_themes' ); + +add_action('init', 'wp_schedule_update_checks'); + +?> diff --git a/src/wp-includes/user.php b/src/wp-includes/user.php new file mode 100644 index 0000000..af7f5de --- /dev/null +++ b/src/wp-includes/user.php @@ -0,0 +1,1621 @@ +get_error_codes() == array('empty_username', 'empty_password') ) { + $user = new WP_Error('', ''); + } + + return $user; + } + + wp_set_auth_cookie($user->ID, $credentials['remember'], $secure_cookie); + do_action('wp_login', $credentials['user_login']); + return $user; +} + + +/** + * Authenticate the user using the username and password. + */ +add_filter('authenticate', 'wp_authenticate_username_password', 20, 3); +function wp_authenticate_username_password($user, $username, $password) { + if ( is_a($user, 'WP_User') ) { return $user; } + + if ( empty($username) || empty($password) ) { + $error = new WP_Error(); + + if ( empty($username) ) + $error->add('empty_username', __('ERROR: The username field is empty.')); + + if ( empty($password) ) + $error->add('empty_password', __('ERROR: The password field is empty.')); + + return $error; + } + + $userdata = get_user_by('login', $username); + + if ( !$userdata ) + return new WP_Error('invalid_username', sprintf(__('ERROR: Invalid username. Lost your password?'), site_url('wp-login.php?action=lostpassword', 'login'))); + + if ( is_multisite() ) { + // Is user marked as spam? + if ( 1 == $userdata->spam) + return new WP_Error('invalid_username', __('ERROR: Your account has been marked as a spammer.')); + + // Is a user's blog marked as spam? + if ( !is_super_admin( $userdata->ID ) && isset($userdata->primary_blog) ) { + $details = get_blog_details( $userdata->primary_blog ); + if ( is_object( $details ) && $details->spam == 1 ) + return new WP_Error('blog_suspended', __('Site Suspended.')); + } + } + + $userdata = apply_filters('wp_authenticate_user', $userdata, $password); + if ( is_wp_error($userdata) ) + return $userdata; + + if ( !wp_check_password($password, $userdata->user_pass, $userdata->ID) ) + return new WP_Error( 'incorrect_password', sprintf( __( 'ERROR: The password you entered for the username %1$s is incorrect. Lost your password?' ), + $username, site_url( 'wp-login.php?action=lostpassword', 'login' ) ) ); + + $user = new WP_User($userdata->ID); + return $user; +} + +/** + * Authenticate the user using the WordPress auth cookie. + */ +function wp_authenticate_cookie($user, $username, $password) { + if ( is_a($user, 'WP_User') ) { return $user; } + + if ( empty($username) && empty($password) ) { + $user_id = wp_validate_auth_cookie(); + if ( $user_id ) + return new WP_User($user_id); + + global $auth_secure_cookie; + + if ( $auth_secure_cookie ) + $auth_cookie = SECURE_AUTH_COOKIE; + else + $auth_cookie = AUTH_COOKIE; + + if ( !empty($_COOKIE[$auth_cookie]) ) + return new WP_Error('expired_session', __('Please log in again.')); + + // If the cookie is not set, be silent. + } + + return $user; +} + +/** + * Number of posts user has written. + * + * @since 3.0.0 + * @uses $wpdb WordPress database object for queries. + * + * @param int $userid User ID. + * @return int Amount of posts user has written. + */ +function count_user_posts($userid) { + global $wpdb; + + $where = get_posts_by_author_sql('post', TRUE, $userid); + + $count = $wpdb->get_var( "SELECT COUNT(*) FROM $wpdb->posts $where" ); + + return apply_filters('get_usernumposts', $count, $userid); +} + +/** + * Number of posts written by a list of users. + * + * @since 3.0.0 + * @param array $user_ids Array of user IDs. + * @param string|array $post_type Optional. Post type to check. Defaults to post. + * @return array Amount of posts each user has written. + */ +function count_many_users_posts($users, $post_type = 'post' ) { + global $wpdb; + + $count = array(); + if ( empty( $users ) || ! is_array( $users ) ) + return $count; + + $userlist = implode( ',', array_map( 'absint', $users ) ); + $where = get_posts_by_author_sql( $post_type ); + + $result = $wpdb->get_results( "SELECT post_author, COUNT(*) FROM $wpdb->posts $where AND post_author IN ($userlist) GROUP BY post_author", ARRAY_N ); + foreach ( $result as $row ) { + $count[ $row[0] ] = $row[1]; + } + + foreach ( $users as $id ) { + if ( ! isset( $count[ $id ] ) ) + $count[ $id ] = 0; + } + + return $count; +} + +/** + * Check that the user login name and password is correct. + * + * @since 0.71 + * @todo xmlrpc only. Maybe move to xmlrpc.php. + * + * @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) { + $user = wp_authenticate($user_login, $user_pass); + if ( is_wp_error($user) ) + return false; + + return true; +} + +// +// User option functions +// + +/** + * Get the current user's ID + * + * @since MU + * + * @uses wp_get_current_user + * + * @return int The current user's ID + */ +function get_current_user_id() { + $user = wp_get_current_user(); + return ( isset( $user->ID ) ? (int) $user->ID : 0 ); +} + +/** + * Retrieve user option that can be either per Site or per Network. + * + * If the user ID is not given, then the current user will be used instead. If + * the user ID is given, then the user data will be retrieved. The filter for + * the result, will also pass the original option name and finally the user data + * object as the third parameter. + * + * The option will first check for the per site name and then the per Network name. + * + * @since 2.0.0 + * @uses $wpdb WordPress database object for queries. + * @uses apply_filters() Calls 'get_user_option_$option' hook with result, + * option parameter, and user data object. + * + * @param string $option User option name. + * @param int $user Optional. User ID. + * @param bool $deprecated Use get_option() to check for an option in the options table. + * @return mixed + */ +function get_user_option( $option, $user = 0, $deprecated = '' ) { + global $wpdb; + + if ( !empty( $deprecated ) ) + _deprecated_argument( __FUNCTION__, '3.0' ); + + if ( empty($user) ) { + $user = wp_get_current_user(); + $user = $user->ID; + } + + $user = get_userdata($user); + + // Keys used as object vars cannot have dashes. + $key = str_replace('-', '', $option); + + if ( isset( $user->{$wpdb->prefix . $key} ) ) // Blog specific + $result = $user->{$wpdb->prefix . $key}; + elseif ( isset( $user->{$key} ) ) // User specific and cross-blog + $result = $user->{$key}; + else + $result = false; + + return apply_filters("get_user_option_{$option}", $result, $option, $user); +} + +/** + * Update user option with global blog capability. + * + * User options are just like user metadata except that they have support for + * global blog options. If the 'global' parameter is false, which it is by default + * it will prepend the WordPress table prefix to the option name. + * + * Deletes the user option if $newvalue is empty. + * + * @since 2.0.0 + * @uses $wpdb WordPress database object for queries + * + * @param int $user_id User ID + * @param string $option_name User option name. + * @param mixed $newvalue User option value. + * @param bool $global Optional. Whether option name is global or blog specific. Default false (blog specific). + * @return unknown + */ +function update_user_option( $user_id, $option_name, $newvalue, $global = false ) { + global $wpdb; + + if ( !$global ) + $option_name = $wpdb->prefix . $option_name; + + // For backward compatibility. See differences between update_user_meta() and deprecated update_usermeta(). + // http://core.trac.wordpress.org/ticket/13088 + if ( is_null( $newvalue ) || is_scalar( $newvalue ) && empty( $newvalue ) ) + return delete_user_meta( $user_id, $option_name ); + + return update_user_meta( $user_id, $option_name, $newvalue ); +} + +/** + * Delete user option with global blog capability. + * + * User options are just like user metadata except that they have support for + * global blog options. If the 'global' parameter is false, which it is by default + * it will prepend the WordPress table prefix to the option name. + * + * @since 3.0.0 + * @uses $wpdb WordPress database object for queries + * + * @param int $user_id User ID + * @param string $option_name User option name. + * @param bool $global Optional. Whether option name is global or blog specific. Default false (blog specific). + * @return unknown + */ +function delete_user_option( $user_id, $option_name, $global = false ) { + global $wpdb; + + if ( !$global ) + $option_name = $wpdb->prefix . $option_name; + return delete_user_meta( $user_id, $option_name ); +} + +/** + * WordPress User Query class. + * + * @since 3.1.0 + */ +class WP_User_Query { + + /** + * List of found user ids + * + * @since 3.1.0 + * @access private + * @var array + */ + var $results; + + /** + * Total number of found users for the current query + * + * @since 3.1.0 + * @access private + * @var int + */ + var $total_users = 0; + + // SQL clauses + var $query_fields; + var $query_from; + var $query_where; + var $query_orderby; + var $query_limit; + + + /** + * PHP5 constructor + * + * @since 3.1.0 + * + * @param string|array $args The query variables + * @return WP_User_Query + */ + function __construct( $query = null ) { + if ( !empty( $query ) ) { + $this->query_vars = wp_parse_args( $query, array( + 'blog_id' => $GLOBALS['blog_id'], + 'role' => '', + 'meta_key' => '', + 'meta_value' => '', + 'meta_compare' => '', + 'include' => array(), + 'exclude' => array(), + 'search' => '', + 'orderby' => 'login', + 'order' => 'ASC', + 'offset' => '', + 'number' => '', + 'count_total' => true, + 'fields' => 'all', + 'who' => '' + ) ); + + $this->prepare_query(); + $this->query(); + } + } + + /** + * Prepare the query variables + * + * @since 3.1.0 + * @access private + */ + function prepare_query() { + global $wpdb; + + $qv = &$this->query_vars; + + if ( is_array( $qv['fields'] ) ) { + $qv['fields'] = array_unique( $qv['fields'] ); + + $this->query_fields = array(); + foreach ( $qv['fields'] as $field ) + $this->query_fields[] = $wpdb->users . '.' . esc_sql( $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 ( $this->query_vars['count_total'] ) + $this->query_fields = 'SQL_CALC_FOUND_ROWS ' . $this->query_fields; + + $this->query_from = "FROM $wpdb->users"; + $this->query_where = "WHERE 1=1"; + + // sorting + if ( in_array( $qv['orderby'], array('nicename', 'email', 'url', 'registered') ) ) { + $orderby = 'user_' . $qv['orderby']; + } elseif ( in_array( $qv['orderby'], array('user_nicename', 'user_email', 'user_url', 'user_registered') ) ) { + $orderby = $qv['orderby']; + } elseif ( 'name' == $qv['orderby'] || 'display_name' == $qv['orderby'] ) { + $orderby = 'display_name'; + } elseif ( 'post_count' == $qv['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' == $qv['orderby'] || 'id' == $qv['orderby'] ) { + $orderby = 'ID'; + } else { + $orderby = 'user_login'; + } + + $qv['order'] = strtoupper( $qv['order'] ); + if ( 'ASC' == $qv['order'] ) + $order = 'ASC'; + else + $order = 'DESC'; + $this->query_orderby = "ORDER BY $orderby $order"; + + // limit + if ( $qv['number'] ) { + if ( $qv['offset'] ) + $this->query_limit = $wpdb->prepare("LIMIT %d, %d", $qv['offset'], $qv['number']); + else + $this->query_limit = $wpdb->prepare("LIMIT %d", $qv['number']); + } + + $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, '*'); + + if ( false !== strpos( $search, '@') ) + $search_columns = array('user_email'); + elseif ( is_numeric($search) ) + $search_columns = array('user_login', 'ID'); + elseif ( preg_match('|^https?://|', $search) ) + $search_columns = array('user_url'); + else + $search_columns = array('user_login', 'user_nicename'); + + $this->query_where .= $this->get_search_sql( $search, $search_columns, $wild ); + } + + $blog_id = absint( $qv['blog_id'] ); + + if ( 'authors' == $qv['who'] && $blog_id ) { + $qv['meta_key'] = $wpdb->get_blog_prefix( $blog_id ) . 'user_level'; + $qv['meta_value'] = 0; + $qv['meta_compare'] = '!='; + $qv['blog_id'] = $blog_id = 0; // Prevent extra meta query + } + + $role = trim( $qv['role'] ); + + if ( $blog_id && ( $role || is_multisite() ) ) { + $cap_meta_query = array(); + $cap_meta_query['key'] = $wpdb->get_blog_prefix( $blog_id ) . 'capabilities'; + + if ( $role ) { + $cap_meta_query['value'] = '"' . $role . '"'; + $cap_meta_query['compare'] = 'like'; + } + + $qv['meta_query'][] = $cap_meta_query; + } + + $meta_query = new WP_Meta_Query(); + $meta_query->parse_query_vars( $qv ); + + if ( !empty( $meta_query->queries ) ) { + $clauses = $meta_query->get_sql( 'user', $wpdb->users, 'ID', $this ); + $this->query_from .= $clauses['join']; + $this->query_where .= $clauses['where']; + + if ( 'OR' == $meta_query->relation ) + $this->query_fields = 'DISTINCT ' . $this->query_fields; + } + + if ( !empty( $qv['include'] ) ) { + $ids = implode( ',', wp_parse_id_list( $qv['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)"; + } + + do_action_ref_array( 'pre_user_query', array( &$this ) ); + } + + /** + * Execute the query, with the current variables + * + * @since 3.1.0 + * @access private + */ + function query() { + global $wpdb; + + if ( is_array( $this->query_vars['fields'] ) || 'all' == $this->query_vars['fields'] ) { + $this->results = $wpdb->get_results("SELECT $this->query_fields $this->query_from $this->query_where $this->query_orderby $this->query_limit"); + } else { + $this->results = $wpdb->get_col("SELECT $this->query_fields $this->query_from $this->query_where $this->query_orderby $this->query_limit"); + } + + if ( $this->query_vars['count_total'] ) + $this->total_users = $wpdb->get_var( apply_filters( 'found_users_query', 'SELECT FOUND_ROWS()' ) ); + + if ( !$this->results ) + return; + + if ( 'all_with_meta' == $this->query_vars['fields'] ) { + cache_users( $this->results ); + + $r = array(); + foreach ( $this->results as $userid ) + $r[ $userid ] = new WP_User( $userid, '', $this->query_vars['blog_id'] ); + + $this->results = $r; + } + } + + /* + * Used internally to generate an SQL string for searching across multiple columns + * + * @access protected + * @since 3.1.0 + * + * @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 + */ + function get_search_sql( $string, $cols, $wild = false ) { + $string = esc_sql( $string ); + + $searches = array(); + $leading_wild = ( 'leading' == $wild || 'both' == $wild ) ? '%' : ''; + $trailing_wild = ( 'trailing' == $wild || 'both' == $wild ) ? '%' : ''; + foreach ( $cols as $col ) { + if ( 'ID' == $col ) + $searches[] = "$col = '$string'"; + else + $searches[] = "$col LIKE '$leading_wild" . like_escape($string) . "$trailing_wild'"; + } + + return ' AND (' . implode(' OR ', $searches) . ')'; + } + + /** + * Return the list of users + * + * @since 3.1.0 + * @access public + * + * @return array + */ + function get_results() { + return $this->results; + } + + /** + * Return the total number of users for the current query + * + * @since 3.1.0 + * @access public + * + * @return array + */ + function get_total() { + return $this->total_users; + } +} + +/** + * Retrieve list of users matching criteria. + * + * @since 3.1.0 + * @uses $wpdb + * @uses WP_User_Query See for default arguments and information. + * + * @param array $args Optional. + * @return array List of users. + */ +function get_users( $args = array() ) { + + $args = wp_parse_args( $args ); + $args['count_total'] = false; + + $user_search = new WP_User_Query($args); + + return (array) $user_search->get_results(); +} + +/** + * Get the blogs a user belongs to. + * + * @since 3.0.0 + * + * @param int $id User Id + * @param bool $all Whether to retrieve all blogs or only blogs that are not marked as deleted, archived, or spam. + * @return array A list of the user's blogs. False if the user was not found or an empty array if the user has no blogs. + */ +function get_blogs_of_user( $id, $all = false ) { + global $wpdb; + + if ( !is_multisite() ) { + $blog_id = get_current_blog_id(); + $blogs = array(); + $blogs[ $blog_id ]->userblog_id = $blog_id; + $blogs[ $blog_id ]->blogname = get_option('blogname'); + $blogs[ $blog_id ]->domain = ''; + $blogs[ $blog_id ]->path = ''; + $blogs[ $blog_id ]->site_id = 1; + $blogs[ $blog_id ]->siteurl = get_option('siteurl'); + return $blogs; + } + + $blogs = wp_cache_get( 'blogs_of_user-' . $id, 'users' ); + + // Try priming the new cache from the old cache + if ( false === $blogs ) { + $cache_suffix = $all ? '_all' : '_short'; + $blogs = wp_cache_get( 'blogs_of_user_' . $id . $cache_suffix, 'users' ); + if ( is_array( $blogs ) ) { + $blogs = array_keys( $blogs ); + if ( $all ) + wp_cache_set( 'blogs_of_user-' . $id, $blogs, 'users' ); + } + } + + if ( false === $blogs ) { + $user = get_userdata( (int) $id ); + if ( !$user ) + return false; + + $blogs = $match = array(); + $prefix_length = strlen($wpdb->base_prefix); + foreach ( (array) $user as $key => $value ) { + if ( $prefix_length && substr($key, 0, $prefix_length) != $wpdb->base_prefix ) + continue; + if ( substr($key, -12, 12) != 'capabilities' ) + continue; + if ( preg_match( '/^' . $wpdb->base_prefix . '((\d+)_)?capabilities$/', $key, $match ) ) { + if ( count( $match ) > 2 ) + $blogs[] = (int) $match[ 2 ]; + else + $blogs[] = 1; + } + } + wp_cache_set( 'blogs_of_user-' . $id, $blogs, 'users' ); + } + + $blog_deets = array(); + foreach ( (array) $blogs as $blog_id ) { + $blog = get_blog_details( $blog_id ); + if ( $blog && isset( $blog->domain ) && ( $all == true || $all == false && ( $blog->archived == 0 && $blog->spam == 0 && $blog->deleted == 0 ) ) ) { + $blog_deets[ $blog_id ]->userblog_id = $blog_id; + $blog_deets[ $blog_id ]->blogname = $blog->blogname; + $blog_deets[ $blog_id ]->domain = $blog->domain; + $blog_deets[ $blog_id ]->path = $blog->path; + $blog_deets[ $blog_id ]->site_id = $blog->site_id; + $blog_deets[ $blog_id ]->siteurl = $blog->siteurl; + } + } + + return apply_filters( 'get_blogs_of_user', $blog_deets, $id, $all ); +} + +/** + * Checks if the current user belong to a given blog. + * + * @since 3.0.0 + * + * @param int $blog_id Blog ID + * @return bool True if the current users belong to $blog_id, false if not. + */ +function is_blog_user( $blog_id = 0 ) { + global $wpdb; + + $current_user = wp_get_current_user(); + if ( !$blog_id ) + $blog_id = $wpdb->blogid; + + $cap_key = $wpdb->base_prefix . $blog_id . '_capabilities'; + + if ( is_array($current_user->$cap_key) && in_array(1, $current_user->$cap_key) ) + return true; + + return false; +} + +/** + * Add meta data field to a user. + * + * Post meta data is called "Custom Fields" on the Administration Screens. + * + * @since 3.0.0 + * @uses add_metadata() + * @link http://codex.wordpress.org/Function_Reference/add_user_meta + * + * @param int $user_id Post 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 bool False for failure. True for success. + */ +function add_user_meta($user_id, $meta_key, $meta_value, $unique = false) { + return add_metadata('user', $user_id, $meta_key, $meta_value, $unique); +} + +/** + * Remove metadata matching criteria from a user. + * + * 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 3.0.0 + * @uses delete_metadata() + * @link http://codex.wordpress.org/Function_Reference/delete_user_meta + * + * @param int $user_id user ID + * @param string $meta_key Metadata name. + * @param mixed $meta_value Optional. Metadata value. + * @return bool False for failure. True for success. + */ +function delete_user_meta($user_id, $meta_key, $meta_value = '') { + return delete_metadata('user', $user_id, $meta_key, $meta_value); +} + +/** + * Retrieve user meta field for a user. + * + * @since 3.0.0 + * @uses get_metadata() + * @link http://codex.wordpress.org/Function_Reference/get_user_meta + * + * @param int $user_id Post ID. + * @param string $key The meta key to retrieve. + * @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_user_meta($user_id, $key, $single = false) { + return get_metadata('user', $user_id, $key, $single); +} + +/** + * Update user meta field based on user ID. + * + * Use the $prev_value parameter to differentiate between meta fields with the + * same key and user ID. + * + * If the meta field for the user does not exist, it will be added. + * + * @since 3.0.0 + * @uses update_metadata + * @link http://codex.wordpress.org/Function_Reference/update_user_meta + * + * @param int $user_id Post 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 bool False on failure, true if success. + */ +function update_user_meta($user_id, $meta_key, $meta_value, $prev_value = '') { + return update_metadata('user', $user_id, $meta_key, $meta_value, $prev_value); +} + +/** + * Count number of users who have each of the user roles. + * + * Assumes there are neither duplicated nor orphaned capabilities meta_values. + * Assumes role names are unique phrases. Same assumption made by WP_User_Query::prepare_query() + * Using $strategy = 'time' this is CPU-intensive and should handle around 10^7 users. + * Using $strategy = 'memory' this is memory-intensive and should handle around 10^5 users, but see WP Bug #12257. + * + * @since 3.0.0 + * @param string $strategy 'time' or 'memory' + * @return array Includes a grand total and an array of counts indexed by role strings. + */ +function count_users($strategy = 'time') { + global $wpdb, $wp_roles; + + // Initialize + $id = get_current_blog_id(); + $blog_prefix = $wpdb->get_blog_prefix($id); + $result = array(); + + if ( 'time' == $strategy ) { + global $wp_roles; + + if ( ! isset( $wp_roles ) ) + $wp_roles = new WP_Roles(); + + $avail_roles = $wp_roles->get_names(); + + // Build a CPU-intensive query that will return concise information. + $select_count = array(); + foreach ( $avail_roles as $this_role => $name ) { + $select_count[] = "COUNT(NULLIF(`meta_value` LIKE '%" . like_escape($this_role) . "%', FALSE))"; + } + $select_count = implode(', ', $select_count); + + // Add the meta_value index to the selection list, then run the query. + $row = $wpdb->get_row( "SELECT $select_count, COUNT(*) FROM $wpdb->usermeta WHERE meta_key = '{$blog_prefix}capabilities'", ARRAY_N ); + + // Run the previous loop again to associate results with role names. + $col = 0; + $role_counts = array(); + foreach ( $avail_roles as $this_role => $name ) { + $count = (int) $row[$col++]; + if ($count > 0) { + $role_counts[$this_role] = $count; + } + } + + // Get the meta_value index from the end of the result set. + $total_users = (int) $row[$col]; + + $result['total_users'] = $total_users; + $result['avail_roles'] =& $role_counts; + } else { + $avail_roles = array(); + + $users_of_blog = $wpdb->get_col( "SELECT meta_value FROM $wpdb->usermeta WHERE meta_key = '{$blog_prefix}capabilities'" ); + + foreach ( $users_of_blog as $caps_meta ) { + $b_roles = unserialize($caps_meta); + if ( is_array($b_roles) ) { + foreach ( $b_roles as $b_role => $val ) { + if ( isset($avail_roles[$b_role]) ) { + $avail_roles[$b_role]++; + } else { + $avail_roles[$b_role] = 1; + } + } + } + } + + $result['total_users'] = count( $users_of_blog ); + $result['avail_roles'] =& $avail_roles; + } + + return $result; +} + +// +// Private helper functions +// + +/** + * Set up global user vars. + * + * Used by wp_set_current_user() for back compat. Might be deprecated in the future. + * + * @since 2.0.4 + * @global string $userdata User description. + * @global string $user_login The user username for logging in + * @global int $user_level The level of the user + * @global int $user_ID The ID of the user + * @global string $user_email The email address of the user + * @global string $user_url The url in the user's profile + * @global string $user_pass_md5 MD5 of the user's password + * @global string $user_identity The display name of the user + * + * @param int $for_user_id Optional. User ID to set up global data. + */ +function setup_userdata($for_user_id = '') { + global $user_login, $userdata, $user_level, $user_ID, $user_email, $user_url, $user_pass_md5, $user_identity; + + if ( '' == $for_user_id ) + $user = wp_get_current_user(); + else + $user = new WP_User($for_user_id); + + $userdata = $user->data; + $user_ID = (int) $user->ID; + $user_level = (int) isset($user->user_level) ? $user->user_level : 0; + + if ( 0 == $user->ID ) { + $user_login = $user_email = $user_url = $user_pass_md5 = $user_identity = ''; + return; + } + + $user_login = $user->user_login; + $user_email = $user->user_email; + $user_url = $user->user_url; + $user_pass_md5 = md5($user->user_pass); + $user_identity = $user->display_name; +} + +/** + * Create dropdown HTML content of users. + * + * The content can either be displayed, which it is by default or retrieved by + * setting the 'echo' argument. The 'include' and 'exclude' arguments do not + * need to be used; all users will be displayed in that case. Only one can be + * used, either 'include' or 'exclude', but not both. + * + * The available arguments are as follows: + *
      + *
    1. show_option_all - Text to show all and whether HTML option exists.
    2. + *
    3. show_option_none - Text for show none and whether HTML option exists.
    4. + *
    5. hide_if_only_one_author - Don't create the dropdown if there is only one user.
    6. + *
    7. orderby - SQL order by clause for what order the users appear. Default is 'display_name'.
    8. + *
    9. order - Default is 'ASC'. Can also be 'DESC'.
    10. + *
    11. include - User IDs to include.
    12. + *
    13. exclude - User IDs to exclude.
    14. + *
    15. multi - Default is 'false'. Whether to skip the ID attribute on the 'select' element. A 'true' value is overridden when id argument is set.
    16. + *
    17. show - Default is 'display_name'. User table column to display. If the selected item is empty then the user_login will be displayed in parentheses
    18. + *
    19. echo - Default is '1'. Whether to display or retrieve content.
    20. + *
    21. selected - Which User ID is selected.
    22. + *
    23. include_selected - Always include the selected user ID in the dropdown. Default is false.
    24. + *
    25. name - Default is 'user'. Name attribute of select element.
    26. + *
    27. id - Default is the value of the 'name' parameter. ID attribute of select element.
    28. + *
    29. class - Class attribute of select element.
    30. + *
    31. blog_id - ID of blog (Multisite only). Defaults to ID of current blog.
    32. + *
    33. who - Which users to query. Currently only 'authors' is supported. Default is all users.
    34. + *
    + * + * @since 2.3.0 + * @uses $wpdb WordPress database object for queries + * + * @param string|array $args Optional. Override defaults. + * @return string|null Null on display. String of HTML content on retrieve. + */ +function wp_dropdown_users( $args = '' ) { + $defaults = array( + 'show_option_all' => '', 'show_option_none' => '', 'hide_if_only_one_author' => '', + 'orderby' => 'display_name', 'order' => 'ASC', + 'include' => '', 'exclude' => '', 'multi' => 0, + 'show' => 'display_name', 'echo' => 1, + 'selected' => 0, 'name' => 'user', 'class' => '', 'id' => '', + 'blog_id' => $GLOBALS['blog_id'], 'who' => '', 'include_selected' => false + ); + + $defaults['selected'] = is_author() ? get_query_var( 'author' ) : 0; + + $r = wp_parse_args( $args, $defaults ); + extract( $r, EXTR_SKIP ); + + $query_args = wp_array_slice_assoc( $r, array( 'blog_id', 'include', 'exclude', 'orderby', 'order', 'who' ) ); + $query_args['fields'] = array( 'ID', $show ); + $users = get_users( $query_args ); + + $output = ''; + if ( !empty($users) && ( empty($hide_if_only_one_author) || count($users) > 1 ) ) { + $name = esc_attr( $name ); + if ( $multi && ! $id ) + $id = ''; + else + $id = $id ? " id='" . esc_attr( $id ) . "'" : " id='$name'"; + + $output = ""; + } + + $output = apply_filters('wp_dropdown_users', $output); + + if ( $echo ) + echo $output; + + return $output; +} + +/** + * Add user meta data as properties to given user object. + * + * The finished user data is cached, but the cache is not used to fill in the + * user data for the given object. Once the function has been used, the cache + * should be used to retrieve user data. The intention is if the current data + * had been cached already, there would be no need to call this function. + * + * @access private + * @since 2.5.0 + * @uses $wpdb WordPress database object for queries + * + * @param object $user The user data object. + */ +function _fill_user( &$user ) { + $metavalues = get_user_metavalues(array($user->ID)); + _fill_single_user($user, $metavalues[$user->ID]); +} + +/** + * Perform the query to get the $metavalues array(s) needed by _fill_user and _fill_many_users + * + * @since 3.0.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) { + $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; +} + +/** + * Unserialize user metadata, fill $user object, then cache everything. + * + * @since 3.0.0 + * @param object $user The User object. + * @param array $metavalues An array of objects provided by get_user_metavalues() + */ +function _fill_single_user( &$user, &$metavalues ) { + global $wpdb; + + foreach ( $metavalues as $meta ) { + $value = maybe_unserialize($meta->meta_value); + // Keys used as object vars cannot have dashes. + $key = str_replace('-', '', $meta->meta_key); + $user->{$key} = $value; + } + + $level = $wpdb->prefix . 'user_level'; + if ( isset( $user->{$level} ) ) + $user->user_level = $user->{$level}; + + // For backwards compat. + if ( isset($user->first_name) ) + $user->user_firstname = $user->first_name; + if ( isset($user->last_name) ) + $user->user_lastname = $user->last_name; + if ( isset($user->description) ) + $user->user_description = $user->description; + + update_user_caches($user); +} + +/** + * Take an array of user objects, fill them with metas, and cache them. + * + * @since 3.0.0 + * @param array $users User objects + */ +function _fill_many_users( &$users ) { + $ids = array(); + foreach( $users as $user_object ) { + $ids[] = $user_object->ID; + } + + $metas = get_user_metavalues($ids); + + foreach ( $users as $user_object ) { + if ( isset($metas[$user_object->ID]) ) { + _fill_single_user($user_object, $metas[$user_object->ID]); + } + } +} + +/** + * 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 + * @uses sanitize_user_field() Used to sanitize the fields. + * + * @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') { + if ( is_object($user) ) { + if ( !isset($user->ID) ) + $user->ID = 0; + if ( isset($user->data) ) + $vars = get_object_vars( $user->data ); + else + $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; +} + +/** + * Sanitize user field based on context. + * + * Possible context values are: 'raw', 'edit', 'db', 'display', 'attribute' and 'js'. The + * 'display' context is used by default. 'attribute' and 'js' contexts are treated like 'display' + * when calling filters. + * + * @since 2.3.0 + * @uses apply_filters() Calls 'edit_$field' and '{$field_no_prefix}_edit_pre' passing $value and + * $user_id if $context == 'edit' and field name prefix == 'user_'. + * + * @uses apply_filters() Calls 'edit_user_$field' passing $value and $user_id if $context == 'db'. + * @uses apply_filters() Calls 'pre_$field' passing $value if $context == 'db' and field name prefix == 'user_'. + * @uses apply_filters() Calls '{$field}_pre' passing $value if $context == 'db' and field name prefix != 'user_'. + * + * @uses apply_filters() Calls '$field' passing $value, $user_id and $context if $context == anything + * other than 'raw', 'edit' and 'db' and field name prefix == 'user_'. + * @uses apply_filters() Calls 'user_$field' passing $value if $context == anything other than 'raw', + * 'edit' and 'db' and field name prefix != 'user_'. + * + * @param string $field The user Object field name. + * @param mixed $value The user Object value. + * @param int $user_id user ID. + * @param string $context How to sanitize user fields. Looks for 'raw', 'edit', 'db', 'display', + * 'attribute' and 'js'. + * @return mixed Sanitized value. + */ +function sanitize_user_field($field, $value, $user_id, $context) { + $int_fields = array('ID'); + if ( in_array($field, $int_fields) ) + $value = (int) $value; + + if ( 'raw' == $context ) + return $value; + + if ( !is_string($value) && !is_numeric($value) ) + return $value; + + $prefixed = false; + if ( false !== strpos($field, 'user_') ) { + $prefixed = true; + $field_no_prefix = str_replace('user_', '', $field); + } + + if ( 'edit' == $context ) { + if ( $prefixed ) { + $value = apply_filters("edit_{$field}", $value, $user_id); + } else { + $value = apply_filters("edit_user_{$field}", $value, $user_id); + } + + if ( 'description' == $field ) + $value = esc_html( $value ); // textarea_escaped? + else + $value = esc_attr($value); + } else if ( 'db' == $context ) { + if ( $prefixed ) { + $value = apply_filters("pre_{$field}", $value); + } else { + $value = apply_filters("pre_user_{$field}", $value); + } + } else { + // Use display filters by default. + if ( $prefixed ) + $value = apply_filters($field, $value, $user_id, $context); + else + $value = apply_filters("user_{$field}", $value, $user_id, $context); + } + + if ( 'user_url' == $field ) + $value = esc_url($value); + + if ( 'attribute' == $context ) + $value = esc_attr($value); + else if ( 'js' == $context ) + $value = esc_js($value); + + return $value; +} + +/** + * Update all user caches + * + * @since 3.0.0 + * + * @param object $user User object to be cached + */ +function update_user_caches(&$user) { + wp_cache_add($user->ID, $user, 'users'); + wp_cache_add($user->user_login, $user->ID, 'userlogins'); + wp_cache_add($user->user_email, $user->ID, 'useremail'); + wp_cache_add($user->user_nicename, $user->ID, 'userslugs'); +} + +/** + * Clean all user caches + * + * @since 3.0.0 + * + * @param int $id User ID + */ +function clean_user_cache($id) { + $user = new WP_User($id); + + wp_cache_delete($id, 'users'); + wp_cache_delete($user->user_login, 'userlogins'); + wp_cache_delete($user->user_email, 'useremail'); + wp_cache_delete($user->user_nicename, 'userslugs'); + wp_cache_delete('blogs_of_user-' . $id, 'users'); +} + +/** + * Checks whether the given username exists. + * + * @since 2.0.0 + * + * @param string $username Username. + * @return null|int The user's ID on success, and null on failure. + */ +function username_exists( $username ) { + if ( $user = get_userdatabylogin( $username ) ) { + return $user->ID; + } else { + return null; + } +} + +/** + * Checks whether the given email exists. + * + * @since 2.1.0 + * @uses $wpdb + * + * @param string $email Email. + * @return bool|int The user's ID on success, and false on failure. + */ +function email_exists( $email ) { + if ( $user = get_user_by_email($email) ) + return $user->ID; + + return false; +} + +/** + * Checks whether an username is valid. + * + * @since 2.0.1 + * @uses apply_filters() Calls 'validate_username' hook on $valid check and $username as parameters + * + * @param string $username Username. + * @return bool Whether username given is valid + */ +function validate_username( $username ) { + $sanitized = sanitize_user( $username, true ); + $valid = ( $sanitized == $username ); + return apply_filters( 'validate_username', $valid, $username ); +} + +/** + * Insert an user into the database. + * + * Can update a current user or insert a new user based on whether the user's ID + * is present. + * + * Can be used to update the user's info (see below), set the user's role, and + * set the user's preference on whether they want the rich editor on. + * + * Most of the $userdata array fields have filters associated with the values. + * The exceptions are 'rich_editing', 'role', 'jabber', 'aim', 'yim', + * 'user_registered', and 'ID'. The filters have the prefix 'pre_user_' followed + * by the field name. An example using 'description' would have the filter + * called, 'pre_user_description' that can be hooked into. + * + * The $userdata array can contain the following fields: + * 'ID' - An integer that will be used for updating an existing user. + * 'user_pass' - A string that contains the plain text password for the user. + * 'user_login' - A string that contains the user's username for logging in. + * 'user_nicename' - A string that contains a nicer looking name for the user. + * The default is the user's username. + * 'user_url' - A string containing the user's URL for the user's web site. + * 'user_email' - A string containing the user's email address. + * 'display_name' - A string that will be shown on the site. Defaults to user's + * username. It is likely that you will want to change this, for appearance. + * 'nickname' - The user's nickname, defaults to the user's username. + * 'first_name' - The user's first name. + * 'last_name' - The user's last name. + * 'description' - A string containing content about the user. + * 'rich_editing' - A string for whether to enable the rich editor. False + * if not empty. + * 'user_registered' - The date the user registered. Format is 'Y-m-d H:i:s'. + * 'role' - A string used to set the user's role. + * 'jabber' - User's Jabber account. + * 'aim' - User's AOL IM account. + * 'yim' - User's Yahoo IM account. + * + * @since 2.0.0 + * @uses $wpdb WordPress database layer. + * @uses apply_filters() Calls filters for most of the $userdata fields with the prefix 'pre_user'. See note above. + * @uses do_action() Calls 'profile_update' hook when updating giving the user's ID + * @uses do_action() Calls 'user_register' hook when creating a new user giving the user's ID + * + * @param array $userdata An array of user data. + * @return int|WP_Error The newly created user's ID or a WP_Error object if the user could not be created. + */ +function wp_insert_user($userdata) { + global $wpdb; + + extract($userdata, EXTR_SKIP); + + // Are we updating or creating? + if ( !empty($ID) ) { + $ID = (int) $ID; + $update = true; + $old_user_data = get_userdata($ID); + } else { + $update = false; + // Hash the password + $user_pass = wp_hash_password($user_pass); + } + + $user_login = sanitize_user($user_login, true); + $user_login = apply_filters('pre_user_login', $user_login); + + //Remove any non-printable chars from the login string to see if we have ended up with an empty username + $user_login = trim($user_login); + + if ( empty($user_login) ) + return new WP_Error('empty_user_login', __('Cannot create a user with an empty login name.') ); + + if ( !$update && username_exists( $user_login ) ) + return new WP_Error('existing_user_login', __('This username is already registered.') ); + + if ( empty($user_nicename) ) + $user_nicename = sanitize_title( $user_login ); + $user_nicename = apply_filters('pre_user_nicename', $user_nicename); + + if ( empty($user_url) ) + $user_url = ''; + $user_url = apply_filters('pre_user_url', $user_url); + + if ( empty($user_email) ) + $user_email = ''; + $user_email = apply_filters('pre_user_email', $user_email); + + if ( !$update && ! defined( 'WP_IMPORTING' ) && email_exists($user_email) ) + return new WP_Error('existing_user_email', __('This email address is already registered.') ); + + if ( empty($display_name) ) + $display_name = $user_login; + $display_name = apply_filters('pre_user_display_name', $display_name); + + if ( empty($nickname) ) + $nickname = $user_login; + $nickname = apply_filters('pre_user_nickname', $nickname); + + if ( empty($first_name) ) + $first_name = ''; + $first_name = apply_filters('pre_user_first_name', $first_name); + + if ( empty($last_name) ) + $last_name = ''; + $last_name = apply_filters('pre_user_last_name', $last_name); + + if ( empty($description) ) + $description = ''; + $description = apply_filters('pre_user_description', $description); + + if ( empty($rich_editing) ) + $rich_editing = 'true'; + + if ( empty($comment_shortcuts) ) + $comment_shortcuts = 'false'; + + if ( empty($admin_color) ) + $admin_color = 'fresh'; + $admin_color = preg_replace('|[^a-z0-9 _.\-@]|i', '', $admin_color); + + if ( empty($use_ssl) ) + $use_ssl = 0; + + if ( empty($user_registered) ) + $user_registered = gmdate('Y-m-d H:i:s'); + + if ( empty($show_admin_bar_front) ) + $show_admin_bar_front = 'true'; + + if ( empty($show_admin_bar_admin) ) + $show_admin_bar_admin = is_multisite() ? 'true' : 'false'; + + $user_nicename_check = $wpdb->get_var( $wpdb->prepare("SELECT ID FROM $wpdb->users WHERE user_nicename = %s AND user_login != %s LIMIT 1" , $user_nicename, $user_login)); + + if ( $user_nicename_check ) { + $suffix = 2; + while ($user_nicename_check) { + $alt_user_nicename = $user_nicename . "-$suffix"; + $user_nicename_check = $wpdb->get_var( $wpdb->prepare("SELECT ID FROM $wpdb->users WHERE user_nicename = %s AND user_login != %s LIMIT 1" , $alt_user_nicename, $user_login)); + $suffix++; + } + $user_nicename = $alt_user_nicename; + } + + $data = compact( 'user_pass', 'user_email', 'user_url', 'user_nicename', 'display_name', 'user_registered' ); + $data = stripslashes_deep( $data ); + + if ( $update ) { + $wpdb->update( $wpdb->users, $data, compact( 'ID' ) ); + $user_id = (int) $ID; + } else { + $wpdb->insert( $wpdb->users, $data + compact( 'user_login' ) ); + $user_id = (int) $wpdb->insert_id; + } + + update_user_meta( $user_id, 'first_name', $first_name ); + update_user_meta( $user_id, 'last_name', $last_name ); + update_user_meta( $user_id, 'nickname', $nickname ); + update_user_meta( $user_id, 'description', $description ); + update_user_meta( $user_id, 'rich_editing', $rich_editing ); + update_user_meta( $user_id, 'comment_shortcuts', $comment_shortcuts ); + update_user_meta( $user_id, 'admin_color', $admin_color ); + update_user_meta( $user_id, 'use_ssl', $use_ssl ); + update_user_meta( $user_id, 'show_admin_bar_front', $show_admin_bar_front ); + update_user_meta( $user_id, 'show_admin_bar_admin', $show_admin_bar_admin ); + + $user = new WP_User($user_id); + + foreach ( _wp_get_user_contactmethods( $user ) as $method => $name ) { + if ( empty($$method) ) + $$method = ''; + + update_user_meta( $user_id, $method, $$method ); + } + + if ( isset($role) ) + $user->set_role($role); + elseif ( !$update ) + $user->set_role(get_option('default_role')); + + wp_cache_delete($user_id, 'users'); + wp_cache_delete($user_login, 'userlogins'); + + if ( $update ) + do_action('profile_update', $user_id, $old_user_data); + else + do_action('user_register', $user_id); + + return $user_id; +} + +/** + * Update an user in the database. + * + * It is possible to update a user's password by specifying the 'user_pass' + * value in the $userdata parameter array. + * + * If $userdata does not contain an 'ID' key, then a new user will be created + * and the new user's ID will be returned. + * + * If current user's password is being updated, then the cookies will be + * cleared. + * + * @since 2.0.0 + * @see wp_insert_user() For what fields can be set in $userdata + * @uses wp_insert_user() Used to update existing user or add new one if user doesn't exist already + * + * @param array $userdata An array of user data. + * @return int The updated user's ID. + */ +function wp_update_user($userdata) { + $ID = (int) $userdata['ID']; + + // First, get all of the original fields + $user = get_userdata($ID); + + // Escape data pulled from DB. + $user = add_magic_quotes(get_object_vars($user)); + + // If password is changing, hash it now. + if ( ! empty($userdata['user_pass']) ) { + $plaintext_pass = $userdata['user_pass']; + $userdata['user_pass'] = wp_hash_password($userdata['user_pass']); + } + + wp_cache_delete($user[ 'user_email' ], 'useremail'); + + // Merge old and new fields with new fields overwriting old ones. + $userdata = array_merge($user, $userdata); + $user_id = wp_insert_user($userdata); + + // Update the cookies if the password changed. + $current_user = wp_get_current_user(); + if ( $current_user->id == $ID ) { + if ( isset($plaintext_pass) ) { + wp_clear_auth_cookie(); + wp_set_auth_cookie($ID); + } + } + + return $user_id; +} + +/** + * A simpler way of inserting an user into the database. + * + * Creates a new user with just the username, password, and email. For a more + * detail creation of a user, use wp_insert_user() to specify more infomation. + * + * @since 2.0.0 + * @see wp_insert_user() More complete way to create a new user + * + * @param string $username The user's username. + * @param string $password The user's password. + * @param string $email The user's email (optional). + * @return int The new user's ID. + */ +function wp_create_user($username, $password, $email = '') { + $user_login = esc_sql( $username ); + $user_email = esc_sql( $email ); + $user_pass = $password; + + $userdata = compact('user_login', 'user_email', 'user_pass'); + return wp_insert_user($userdata); +} + + +/** + * Set up the default contact methods + * + * @access private + * @since + * + * @param object $user User data object (optional) + * @return array $user_contactmethods Array of contact methods and their labels. + */ +function _wp_get_user_contactmethods( $user = null ) { + $user_contactmethods = array( + 'aim' => __('AIM'), + 'yim' => __('Yahoo IM'), + 'jabber' => __('Jabber / Google Talk') + ); + return apply_filters( 'user_contactmethods', $user_contactmethods, $user ); +} + +?> diff --git a/src/wp-includes/vars.php b/src/wp-includes/vars.php new file mode 100644 index 0000000..aca78f1 --- /dev/null +++ b/src/wp-includes/vars.php @@ -0,0 +1,97 @@ + \ No newline at end of file diff --git a/src/wp-includes/version.php b/src/wp-includes/version.php new file mode 100644 index 0000000..d51fe89 --- /dev/null +++ b/src/wp-includes/version.php @@ -0,0 +1,44 @@ +' . __('There are no options for this widget.') . '

    '; + return 'noform'; + } + + // Functions you'll need to call. + + /** + * PHP4 constructor + */ + function WP_Widget( $id_base = false, $name, $widget_options = array(), $control_options = array() ) { + WP_Widget::__construct( $id_base, $name, $widget_options, $control_options ); + } + + /** + * PHP5 constructor + * + * @param string $id_base Optional Base ID for the widget, lower case, + * 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 Passed to wp_register_sidebar_widget() + * - description: shown on the configuration page + * - classname + * @param array $control_options Optional Passed to wp_register_widget_control() + * - width: required if more than 250px + * - height: currently not used but may be needed in the future + */ + function __construct( $id_base = false, $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) ); + $this->control_options = wp_parse_args( $control_options, array('id_base' => $this->id_base) ); + } + + /** + * 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() + * + * @param string $field_name Field name + * @return string Name attribute for $field_name + */ + function get_field_name($field_name) { + return 'widget-' . $this->id_base . '[' . $this->number . '][' . $field_name . ']'; + } + + /** + * Constructs id attributes for use in form() fields + * + * This function should be used in form() methods to create id attributes for fields to be saved by update() + * + * @param string $field_name Field name + * @return string ID attribute for $field_name + */ + function get_field_id($field_name) { + return 'widget-' . $this->id_base . '-' . $this->number . '-' . $field_name; + } + + // Private Functions. Don't worry about these. + + function _register() { + $settings = $this->get_settings(); + $empty = true; + + 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 existance with a + // generic template + $this->_set(1); + $this->_register_one(); + } + } + + function _set($number) { + $this->number = $number; + $this->id = $this->id_base . '-' . $number; + } + + function _get_display_callback() { + return array(&$this, 'display_callback'); + } + + function _get_update_callback() { + return array(&$this, 'update_callback'); + } + + function _get_form_callback() { + return array(&$this, 'form_callback'); + } + + /** Generate the actual widget content. + * Just finds the instance and calls widget(). + * Do NOT over-ride this function. */ + 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'] ); + $instance = $this->get_settings(); + + if ( array_key_exists( $this->number, $instance ) ) { + $instance = $instance[$this->number]; + // filters the widget's settings, return false to stop displaying the widget + $instance = apply_filters('widget_display_callback', $instance, $this, $args); + if ( false !== $instance ) + $this->widget($args, $instance); + } + } + + /** Deal with changed settings. + * Do NOT over-ride this function. */ + function update_callback( $widget_args = 1 ) { + global $wp_registered_widgets; + + 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(); + + // We need to update the data + if ( $this->updated ) + return; + + $sidebars_widgets = wp_get_sidebars_widgets(); + + 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(); + + $instance = $this->update($new_instance, $old_instance); + + // filters the widget's settings before saving, return false to cancel saving (keep the old settings if updating) + $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; + } + + /** Generate the control form. + * Do NOT over-ride this function. */ + 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 admin form before displaying, return false to stop displaying it + $instance = apply_filters('widget_form_callback', $instance, $this); + + $return = null; + if ( false !== $instance ) { + $return = $this->form($instance); + // add extra fields in the widget form - be sure to set $return to null if you add any + // if the widget has no form the text echoed from the default form method can be hidden using css + do_action_ref_array( 'in_widget_form', array(&$this, &$return, $instance) ); + } + return $return; + } + + /** Helper function: Registers a single instance. */ + 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 ) ); + } + + function save_settings($settings) { + $settings['_multiwidget'] = 1; + update_option( $this->option_name, $settings ); + } + + function get_settings() { + $settings = get_option($this->option_name); + + if ( false === $settings && isset($this->alt_option_name) ) + $settings = get_option($this->alt_option_name); + + if ( !is_array($settings) ) + $settings = array(); + + if ( !array_key_exists('_multiwidget', $settings) ) { + // old format, conver if single widget + $settings = wp_convert_widget_settings($this->id_base, $this->option_name, $settings); + } + + unset($settings['_multiwidget'], $settings['__i__']); + return $settings; + } +} + +/** + * Singleton that registers and instantiates WP_Widget classes. + * + * @package WordPress + * @subpackage Widgets + * @since 2.8 + */ +class WP_Widget_Factory { + var $widgets = array(); + + function WP_Widget_Factory() { + add_action( 'widgets_init', array( &$this, '_register_widgets' ), 100 ); + } + + function register($widget_class) { + $this->widgets[$widget_class] = & new $widget_class(); + } + + function unregister($widget_class) { + if ( isset($this->widgets[$widget_class]) ) + unset($this->widgets[$widget_class]); + } + + 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(); + } + } +} + +/* Global Variables */ + +/** @ignore */ +global $wp_registered_sidebars, $wp_registered_widgets, $wp_registered_widget_controls, $wp_registered_widget_updates; + +/** + * Stores the sidebars, since many themes can have more than one. + * + * @global array $wp_registered_sidebars + * @since 2.2.0 + */ +$wp_registered_sidebars = array(); + +/** + * Stores the registered widgets. + * + * @global array $wp_registered_widgets + * @since 2.2.0 + */ +$wp_registered_widgets = array(); + +/** + * Stores the registered widget control (options). + * + * @global array $wp_registered_widget_controls + * @since 2.2.0 + */ +$wp_registered_widget_controls = array(); +$wp_registered_widget_updates = array(); + +/** + * Private + */ +$_wp_sidebars_widgets = array(); + +/** + * Private + */ + $_wp_deprecated_widgets_callbacks = array( + 'wp_widget_pages', + 'wp_widget_pages_control', + 'wp_widget_calendar', + 'wp_widget_calendar_control', + 'wp_widget_archives', + 'wp_widget_archives_control', + 'wp_widget_links', + 'wp_widget_meta', + 'wp_widget_meta_control', + 'wp_widget_search', + 'wp_widget_recent_entries', + 'wp_widget_recent_entries_control', + 'wp_widget_tag_cloud', + 'wp_widget_tag_cloud_control', + 'wp_widget_categories', + 'wp_widget_categories_control', + 'wp_widget_text', + 'wp_widget_text_control', + 'wp_widget_rss', + 'wp_widget_rss_control', + 'wp_widget_recent_comments', + 'wp_widget_recent_comments_control' + ); + +/* Template tags & API functions */ + +/** + * Register a widget + * + * Registers a WP_Widget widget + * + * @since 2.8.0 + * + * @see WP_Widget + * @see WP_Widget_Factory + * @uses WP_Widget_Factory + * + * @param string $widget_class The name of a class that extends WP_Widget + */ +function register_widget($widget_class) { + global $wp_widget_factory; + + $wp_widget_factory->register($widget_class); +} + +/** + * Unregister a widget + * + * Unregisters a WP_Widget widget. Useful for unregistering default widgets. + * Run within a function hooked to the widgets_init action. + * + * @since 2.8.0 + * + * @see WP_Widget + * @see WP_Widget_Factory + * @uses WP_Widget_Factory + * + * @param string $widget_class The name of a class that extends WP_Widget + */ +function unregister_widget($widget_class) { + global $wp_widget_factory; + + $wp_widget_factory->unregister($widget_class); +} + +/** + * Creates multiple sidebars. + * + * If you wanted to quickly create multiple sidebars for a theme or internally. + * This function will allow you to do so. If you don't pass the 'name' and/or + * 'id' in $args, then they will be built for you. + * + * The default for the name is "Sidebar #", with '#' being replaced with the + * number the sidebar is currently when greater than one. If first sidebar, the + * name will be just "Sidebar". The default for id is "sidebar-" followed by the + * number the sidebar creation is currently at. If the id is provided, and mutliple + * sidebars are being defined, the id will have "-2" appended, and so on. + * + * @since 2.2.0 + * + * @see register_sidebar() The second parameter is documented by register_sidebar() and is the same here. + * @uses parse_str() Converts a string to an array to be used in the rest of the function. + * @uses register_sidebar() Sends single sidebar information [name, id] to this + * function to handle building the sidebar. + * + * @param int $number Number of sidebars to create. + * @param string|array $args Builds Sidebar based off of 'name' and 'id' values. + */ +function register_sidebars($number = 1, $args = array()) { + global $wp_registered_sidebars; + $number = (int) $number; + + if ( is_string($args) ) + parse_str($args, $args); + + for ( $i = 1; $i <= $number; $i++ ) { + $_args = $args; + + if ( $number > 1 ) + $_args['name'] = isset($args['name']) ? sprintf($args['name'], $i) : sprintf(__('Sidebar %d'), $i); + else + $_args['name'] = isset($args['name']) ? $args['name'] : __('Sidebar'); + + // Custom specified ID's are suffixed if they exist already. + // Automatically generated sidebar names need to be suffixed regardless starting at -0 + if ( isset($args['id']) ) { + $_args['id'] = $args['id']; + $n = 2; // Start at -2 for conflicting custom ID's + while ( isset($wp_registered_sidebars[$_args['id']]) ) + $_args['id'] = $args['id'] . '-' . $n++; + } else { + $n = count($wp_registered_sidebars); + do { + $_args['id'] = 'sidebar-' . ++$n; + } while ( isset($wp_registered_sidebars[$_args['id']]) ); + } + register_sidebar($_args); + } +} + +/** + * Builds the definition for a single sidebar and returns the ID. + * + * The $args parameter takes either a string or an array with 'name' and 'id' + * contained in either usage. It will be noted that the values will be applied + * to all sidebars, so if creating more than one, it will be advised to allow + * for WordPress to create the defaults for you. + * + * Example for string would be 'name=whatever;id=whatever1' and for + * the array it would be array( + * 'name' => 'whatever', + * 'id' => 'whatever1'). + * + * name - The name of the sidebar, which presumably the title which will be + * displayed. + * id - The unique identifier by which the sidebar will be called by. + * before_widget - The content that will prepended to the widgets when they are + * displayed. + * after_widget - The content that will be appended to the widgets when they are + * displayed. + * before_title - The content that will be prepended to the title when displayed. + * after_title - the content that will be appended to the title when displayed. + * + * Content is assumed to be HTML and should be formatted as such, but + * doesn't have to be. + * + * @since 2.2.0 + * @uses $wp_registered_sidebars Stores the new sidebar in this array by sidebar ID. + * + * @param string|array $args Builds Sidebar based off of 'name' and 'id' values + * @return string The sidebar id that was added. + */ +function register_sidebar($args = array()) { + global $wp_registered_sidebars; + + $i = count($wp_registered_sidebars) + 1; + + $defaults = array( + 'name' => sprintf(__('Sidebar %d'), $i ), + 'id' => "sidebar-$i", + 'description' => '', + 'before_widget' => '
  • ', + 'after_widget' => "
  • \n", + 'before_title' => '

    ', + 'after_title' => "

    \n", + ); + + $sidebar = wp_parse_args( $args, $defaults ); + + $wp_registered_sidebars[$sidebar['id']] = $sidebar; + + add_theme_support('widgets'); + + do_action( 'register_sidebar', $sidebar ); + + return $sidebar['id']; +} + +/** + * Removes a sidebar from the list. + * + * @since 2.2.0 + * + * @uses $wp_registered_sidebars Stores the new sidebar in this array by sidebar ID. + * + * @param string $name The ID of the sidebar when it was added. + */ +function unregister_sidebar( $name ) { + global $wp_registered_sidebars; + + if ( isset( $wp_registered_sidebars[$name] ) ) + unset( $wp_registered_sidebars[$name] ); +} + +/** + * Register widget for use in sidebars. + * + * The default widget option is 'classname' that can be override. + * + * The function can also be used to unregister widgets when $output_callback + * parameter is an empty string. + * + * @since 2.2.0 + * + * @uses $wp_registered_widgets Uses stored registered widgets. + * @uses $wp_register_widget_defaults Retrieves widget defaults. + * + * @param int|string $id Widget ID. + * @param string $name Widget display title. + * @param callback $output_callback Run when widget is called. + * @param array|string $options Optional. Widget Options. + * @param mixed $params,... Widget parameters to add to widget. + * @return null Will return if $output_callback is empty after removing widget. + */ +function wp_register_sidebar_widget($id, $name, $output_callback, $options = array()) { + global $wp_registered_widgets, $wp_registered_widget_controls, $wp_registered_widget_updates, $_wp_deprecated_widgets_callbacks; + + $id = strtolower($id); + + if ( empty($output_callback) ) { + unset($wp_registered_widgets[$id]); + return; + } + + $id_base = _get_widget_id_base($id); + if ( in_array($output_callback, $_wp_deprecated_widgets_callbacks, true) && !is_callable($output_callback) ) { + if ( isset($wp_registered_widget_controls[$id]) ) + unset($wp_registered_widget_controls[$id]); + + if ( isset($wp_registered_widget_updates[$id_base]) ) + unset($wp_registered_widget_updates[$id_base]); + + return; + } + + $defaults = array('classname' => $output_callback); + $options = wp_parse_args($options, $defaults); + $widget = array( + 'name' => $name, + 'id' => $id, + 'callback' => $output_callback, + 'params' => array_slice(func_get_args(), 4) + ); + $widget = array_merge($widget, $options); + + if ( is_callable($output_callback) && ( !isset($wp_registered_widgets[$id]) || did_action( 'widgets_init' ) ) ) { + do_action( 'wp_register_sidebar_widget', $widget ); + $wp_registered_widgets[$id] = $widget; + } +} + +/** + * Retrieve description for widget. + * + * When registering widgets, the options can also include 'description' that + * describes the widget for display on the widget administration panel or + * in the theme. + * + * @since 2.5.0 + * + * @param int|string $id Widget ID. + * @return string Widget description, if available. Null on failure to retrieve description. + */ +function wp_widget_description( $id ) { + if ( !is_scalar($id) ) + return; + + global $wp_registered_widgets; + + if ( isset($wp_registered_widgets[$id]['description']) ) + return esc_html( $wp_registered_widgets[$id]['description'] ); +} + +/** + * Retrieve description for a sidebar. + * + * When registering sidebars a 'description' parameter can be included that + * describes the sidebar for display on the widget administration panel. + * + * @since 2.9.0 + * + * @param int|string $id sidebar ID. + * @return string Sidebar description, if available. Null on failure to retrieve description. + */ +function wp_sidebar_description( $id ) { + if ( !is_scalar($id) ) + return; + + global $wp_registered_sidebars; + + if ( isset($wp_registered_sidebars[$id]['description']) ) + return esc_html( $wp_registered_sidebars[$id]['description'] ); +} + + +/** + * Remove widget from sidebar. + * + * @since 2.2.0 + * + * @param int|string $id Widget ID. + */ +function wp_unregister_sidebar_widget($id) { + do_action( 'wp_unregister_sidebar_widget', $id ); + + wp_register_sidebar_widget($id, '', ''); + wp_unregister_widget_control($id); +} + +/** + * Registers widget control callback for customizing options. + * + * The options contains the 'height', 'width', and 'id_base' keys. The 'height' + * option is never used. The 'width' option is the width of the fully expanded + * control form, but try hard to use the default width. The 'id_base' is for + * multi-widgets (widgets which allow multiple instances such as the text + * widget), an id_base must be provided. The widget id will end up looking like + * {$id_base}-{$unique_number}. + * + * @since 2.2.0 + * + * @param int|string $id Sidebar ID. + * @param string $name Sidebar display name. + * @param callback $control_callback Run when sidebar is displayed. + * @param array|string $options Optional. Widget options. See above long description. + * @param mixed $params,... Optional. Additional parameters to add to widget. + */ +function wp_register_widget_control($id, $name, $control_callback, $options = array()) { + global $wp_registered_widget_controls, $wp_registered_widget_updates, $wp_registered_widgets, $_wp_deprecated_widgets_callbacks; + + $id = strtolower($id); + $id_base = _get_widget_id_base($id); + + if ( empty($control_callback) ) { + unset($wp_registered_widget_controls[$id]); + unset($wp_registered_widget_updates[$id_base]); + return; + } + + if ( in_array($control_callback, $_wp_deprecated_widgets_callbacks, true) && !is_callable($control_callback) ) { + if ( isset($wp_registered_widgets[$id]) ) + unset($wp_registered_widgets[$id]); + + return; + } + + if ( isset($wp_registered_widget_controls[$id]) && !did_action( 'widgets_init' ) ) + return; + + $defaults = array('width' => 250, 'height' => 200 ); // height is never used + $options = wp_parse_args($options, $defaults); + $options['width'] = (int) $options['width']; + $options['height'] = (int) $options['height']; + + $widget = array( + 'name' => $name, + 'id' => $id, + 'callback' => $control_callback, + 'params' => array_slice(func_get_args(), 4) + ); + $widget = array_merge($widget, $options); + + $wp_registered_widget_controls[$id] = $widget; + + if ( isset($wp_registered_widget_updates[$id_base]) ) + return; + + if ( isset($widget['params'][0]['number']) ) + $widget['params'][0]['number'] = -1; + + unset($widget['width'], $widget['height'], $widget['name'], $widget['id']); + $wp_registered_widget_updates[$id_base] = $widget; +} + +function _register_widget_update_callback($id_base, $update_callback, $options = array()) { + global $wp_registered_widget_updates; + + if ( isset($wp_registered_widget_updates[$id_base]) ) { + if ( empty($update_callback) ) + unset($wp_registered_widget_updates[$id_base]); + return; + } + + $widget = array( + 'callback' => $update_callback, + 'params' => array_slice(func_get_args(), 3) + ); + + $widget = array_merge($widget, $options); + $wp_registered_widget_updates[$id_base] = $widget; +} + +function _register_widget_form_callback($id, $name, $form_callback, $options = array()) { + global $wp_registered_widget_controls; + + $id = strtolower($id); + + if ( empty($form_callback) ) { + unset($wp_registered_widget_controls[$id]); + return; + } + + if ( isset($wp_registered_widget_controls[$id]) && !did_action( 'widgets_init' ) ) + return; + + $defaults = array('width' => 250, 'height' => 200 ); + $options = wp_parse_args($options, $defaults); + $options['width'] = (int) $options['width']; + $options['height'] = (int) $options['height']; + + $widget = array( + 'name' => $name, + 'id' => $id, + 'callback' => $form_callback, + 'params' => array_slice(func_get_args(), 4) + ); + $widget = array_merge($widget, $options); + + $wp_registered_widget_controls[$id] = $widget; +} + +/** + * Remove control callback for widget. + * + * @since 2.2.0 + * @uses wp_register_widget_control() Unregisters by using empty callback. + * + * @param int|string $id Widget ID. + */ +function wp_unregister_widget_control($id) { + return wp_register_widget_control($id, '', ''); +} + +/** + * Display dynamic sidebar. + * + * By default it displays the default sidebar or 'sidebar-1'. The 'sidebar-1' is + * not named by the theme, the actual name is '1', but 'sidebar-' is added to + * the registered sidebars for the name. If you named your sidebar 'after-post', + * then the parameter $index will still be 'after-post', but the lookup will be + * for 'sidebar-after-post'. + * + * It is confusing for the $index parameter, but just know that it should just + * work. When you register the sidebar in the theme, you will use the same name + * for this function or "Pay no heed to the man behind the curtain." Just accept + * it as an oddity of WordPress sidebar register and display. + * + * @since 2.2.0 + * + * @param int|string $index Optional, default is 1. Name or ID of dynamic sidebar. + * @return bool True, if widget sidebar was found and called. False if not found or not called. + */ +function dynamic_sidebar($index = 1) { + 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( $sidebars_widgets ) ) + return false; + + 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']) ) ), + (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) ) { + call_user_func_array($callback, $params); + $did_one = true; + } + } + + return $did_one; +} + +/** + * Whether widget is displayed on the front-end. + * + * Either $callback or $id_base can be used + * $id_base is the first argument when extending WP_Widget class + * Without the optional $widget_id parameter, returns the ID of the first sidebar + * in which the first instance of the widget with the given callback or $id_base is found. + * With the $widget_id parameter, returns the ID of the sidebar where + * the widget with that callback/$id_base AND that ID is found. + * + * NOTE: $widget_id and $id_base are the same for single widgets. To be effective + * this function has to run after widgets have initialized, at action 'init' or later. + * + * @since 2.2.0 + * + * @param string $callback Optional, Widget callback to check. + * @param int $widget_id Optional, but needed for checking. Widget ID. + * @param string $id_base Optional, the base ID of a widget created by extending WP_Widget. + * @param bool $skip_inactive Optional, whether to check in 'wp_inactive_widgets'. + * @return mixed false if widget is not active or id of sidebar in which the widget is active. + */ +function is_active_widget($callback = false, $widget_id = false, $id_base = false, $skip_inactive = true) { + global $wp_registered_widgets; + + $sidebars_widgets = wp_get_sidebars_widgets(); + + if ( is_array($sidebars_widgets) ) { + foreach ( $sidebars_widgets as $sidebar => $widgets ) { + if ( $skip_inactive && 'wp_inactive_widgets' == $sidebar ) + continue; + + if ( is_array($widgets) ) { + foreach ( $widgets as $widget ) { + if ( ( $callback && isset($wp_registered_widgets[$widget]['callback']) && $wp_registered_widgets[$widget]['callback'] == $callback ) || ( $id_base && _get_widget_id_base($widget) == $id_base ) ) { + if ( !$widget_id || $widget_id == $wp_registered_widgets[$widget]['id'] ) + return $sidebar; + } + } + } + } + } + return false; +} + +/** + * Whether the dynamic sidebar is enabled and used by theme. + * + * @since 2.2.0 + * + * @return bool True, if using widgets. False, if not using widgets. + */ +function is_dynamic_sidebar() { + global $wp_registered_widgets, $wp_registered_sidebars; + $sidebars_widgets = get_option('sidebars_widgets'); + foreach ( (array) $wp_registered_sidebars as $index => $sidebar ) { + if ( count($sidebars_widgets[$index]) ) { + foreach ( (array) $sidebars_widgets[$index] as $widget ) + if ( array_key_exists($widget, $wp_registered_widgets) ) + return true; + } + } + return false; +} + +/** + * Whether a sidebar is in use. + * + * @since 2.8 + * + * @param mixed $index Sidebar name, id or number to check. + * @return bool true if the sidebar is in use, false otherwise. + */ +function is_active_sidebar( $index ) { + $index = ( is_int($index) ) ? "sidebar-$index" : sanitize_title($index); + $sidebars_widgets = wp_get_sidebars_widgets(); + if ( !empty($sidebars_widgets[$index]) ) + return true; + + return false; +} + +/* Internal Functions */ + +/** + * Retrieve full list of sidebars and their widgets. + * + * Will upgrade sidebar widget list, if needed. Will also save updated list, if + * needed. + * + * @since 2.2.0 + * @access private + * + * @param bool $deprecated Not used (deprecated). + * @return array Upgraded list of widgets to version 3 array format when called from the admin. + */ +function wp_get_sidebars_widgets($deprecated = true) { + if ( $deprecated !== true ) + _deprecated_argument( __FUNCTION__, '2.8.1' ); + + global $wp_registered_widgets, $wp_registered_sidebars, $_wp_sidebars_widgets; + + // If loading from front page, consult $_wp_sidebars_widgets rather than options + // to see if wp_convert_widget_settings() has made manipulations in memory. + if ( !is_admin() ) { + if ( empty($_wp_sidebars_widgets) ) + $_wp_sidebars_widgets = get_option('sidebars_widgets', array()); + + $sidebars_widgets = $_wp_sidebars_widgets; + } else { + $sidebars_widgets = get_option('sidebars_widgets', array()); + $_sidebars_widgets = array(); + + if ( isset($sidebars_widgets['wp_inactive_widgets']) || empty($sidebars_widgets) ) + $sidebars_widgets['array_version'] = 3; + elseif ( !isset($sidebars_widgets['array_version']) ) + $sidebars_widgets['array_version'] = 1; + + switch ( $sidebars_widgets['array_version'] ) { + case 1 : + foreach ( (array) $sidebars_widgets as $index => $sidebar ) + if ( is_array($sidebar) ) + foreach ( (array) $sidebar as $i => $name ) { + $id = strtolower($name); + if ( isset($wp_registered_widgets[$id]) ) { + $_sidebars_widgets[$index][$i] = $id; + continue; + } + $id = sanitize_title($name); + if ( isset($wp_registered_widgets[$id]) ) { + $_sidebars_widgets[$index][$i] = $id; + continue; + } + + $found = false; + + foreach ( $wp_registered_widgets as $widget_id => $widget ) { + if ( strtolower($widget['name']) == strtolower($name) ) { + $_sidebars_widgets[$index][$i] = $widget['id']; + $found = true; + break; + } elseif ( sanitize_title($widget['name']) == sanitize_title($name) ) { + $_sidebars_widgets[$index][$i] = $widget['id']; + $found = true; + break; + } + } + + if ( $found ) + continue; + + unset($_sidebars_widgets[$index][$i]); + } + $_sidebars_widgets['array_version'] = 2; + $sidebars_widgets = $_sidebars_widgets; + unset($_sidebars_widgets); + + case 2 : + $sidebars = array_keys( $wp_registered_sidebars ); + if ( !empty( $sidebars ) ) { + // Move the known-good ones first + foreach ( (array) $sidebars as $id ) { + if ( array_key_exists( $id, $sidebars_widgets ) ) { + $_sidebars_widgets[$id] = $sidebars_widgets[$id]; + unset($sidebars_widgets[$id], $sidebars[$id]); + } + } + + // move the rest to wp_inactive_widgets + if ( !isset($_sidebars_widgets['wp_inactive_widgets']) ) + $_sidebars_widgets['wp_inactive_widgets'] = array(); + + if ( !empty($sidebars_widgets) ) { + foreach ( $sidebars_widgets as $lost => $val ) { + if ( is_array($val) ) + $_sidebars_widgets['wp_inactive_widgets'] = array_merge( (array) $_sidebars_widgets['wp_inactive_widgets'], $val ); + } + } + + $sidebars_widgets = $_sidebars_widgets; + unset($_sidebars_widgets); + } + } + } + + if ( is_array( $sidebars_widgets ) && isset($sidebars_widgets['array_version']) ) + unset($sidebars_widgets['array_version']); + + $sidebars_widgets = apply_filters('sidebars_widgets', $sidebars_widgets); + return $sidebars_widgets; +} + +/** + * Set the sidebar widget option to update sidebars. + * + * @since 2.2.0 + * @access private + * + * @param array $sidebars_widgets Sidebar widgets and their settings. + */ +function wp_set_sidebars_widgets( $sidebars_widgets ) { + if ( !isset( $sidebars_widgets['array_version'] ) ) + $sidebars_widgets['array_version'] = 3; + update_option( 'sidebars_widgets', $sidebars_widgets ); +} + +/** + * Retrieve default registered sidebars list. + * + * @since 2.2.0 + * @access private + * + * @return array + */ +function wp_get_widget_defaults() { + global $wp_registered_sidebars; + + $defaults = array(); + + foreach ( (array) $wp_registered_sidebars as $index => $sidebar ) + $defaults[$index] = array(); + + return $defaults; +} + +/** + * Convert the widget settings from single to multi-widget format. + * + * @since 2.8.0 + * + * @return array + */ +function wp_convert_widget_settings($base_name, $option_name, $settings) { + // This test may need expanding. + $single = $changed = false; + if ( empty($settings) ) { + $single = true; + } else { + foreach ( array_keys($settings) as $number ) { + if ( 'number' == $number ) + continue; + if ( !is_numeric($number) ) { + $single = true; + break; + } + } + } + + if ( $single ) { + $settings = array( 2 => $settings ); + + // If loading from the front page, update sidebar in memory but don't save to options + if ( is_admin() ) { + $sidebars_widgets = get_option('sidebars_widgets'); + } else { + if ( empty($GLOBALS['_wp_sidebars_widgets']) ) + $GLOBALS['_wp_sidebars_widgets'] = get_option('sidebars_widgets', array()); + $sidebars_widgets = &$GLOBALS['_wp_sidebars_widgets']; + } + + foreach ( (array) $sidebars_widgets as $index => $sidebar ) { + if ( is_array($sidebar) ) { + foreach ( $sidebar as $i => $name ) { + if ( $base_name == $name ) { + $sidebars_widgets[$index][$i] = "$name-2"; + $changed = true; + break 2; + } + } + } + } + + if ( is_admin() && $changed ) + update_option('sidebars_widgets', $sidebars_widgets); + } + + $settings['_multiwidget'] = 1; + if ( is_admin() ) + update_option( $option_name, $settings ); + + return $settings; +} + +/** + * Output an arbitrary widget as a template tag + * + * @since 2.8 + * + * @param string $widget the widget's PHP class name (see default-widgets.php) + * @param array $instance the widget's instance settings + * @param array $args the widget's sidebar args + * @return void + **/ +function the_widget($widget, $instance = array(), $args = array()) { + global $wp_widget_factory; + + $widget_obj = $wp_widget_factory->widgets[$widget]; + if ( !is_a($widget_obj, 'WP_Widget') ) + return; + + $before_widget = sprintf('
    ', $widget_obj->widget_options['classname']); + $default_args = array('before_widget' => $before_widget, 'after_widget' => "
    ", 'before_title' => '

    ', 'after_title' => '

    '); + + $args = wp_parse_args($args, $default_args); + $instance = wp_parse_args($instance); + + do_action( 'the_widget', $widget, $instance, $args ); + + $widget_obj->_set(-1); + $widget_obj->widget($args, $instance); +} + +/** + * Private + */ +function _get_widget_id_base($id) { + return preg_replace( '/-[0-9]+$/', '', $id ); +} diff --git a/src/wp-includes/wlwmanifest.xml b/src/wp-includes/wlwmanifest.xml new file mode 100644 index 0000000..eb13147 --- /dev/null +++ b/src/wp-includes/wlwmanifest.xml @@ -0,0 +1,44 @@ + + + + + + WordPress + Yes + Yes + + + + WordPress + images/wlw/wp-icon.png + images/wlw/wp-watermark.png + View site + Dashboard + + + + + + + + + + + + + + + diff --git a/src/wp-includes/wp-db.php b/src/wp-includes/wp-db.php new file mode 100644 index 0000000..89ed397 --- /dev/null +++ b/src/wp-includes/wp-db.php @@ -0,0 +1,1554 @@ + '%d' + * + * @since 2.8.0 + * @see wpdb:prepare() + * @see wpdb:insert() + * @see wpdb:update() + * @see wp_set_wpdb_vars() + * @access public + * @var array + */ + var $field_types = array(); + + /** + * Database table columns charset + * + * @since 2.2.0 + * @access public + * @var string + */ + var $charset; + + /** + * Database table columns collate + * + * @since 2.2.0 + * @access public + * @var string + */ + var $collate; + + /** + * Whether to use mysql_real_escape_string + * + * @since 2.8.0 + * @access public + * @var bool + */ + var $real_escape = false; + + /** + * Database Username + * + * @since 2.9.0 + * @access private + * @var string + */ + var $dbuser; + + /** + * A textual description of the last query/get_row/get_var call + * + * @since 3.0.0 + * @access public + * @var string + */ + var $func_call; + + /** + * Connects to the database server and selects a database + * + * PHP5 style constructor for compatibility with PHP5. Does + * the actual setting up of the class properties and connection + * to the database. + * + * @link http://core.trac.wordpress.org/ticket/3354 + * @since 2.0.8 + * + * @param string $dbuser MySQL database user + * @param string $dbpassword MySQL database password + * @param string $dbname MySQL database name + * @param string $dbhost MySQL database host + */ + function __construct( $dbuser, $dbpassword, $dbname, $dbhost ) { + register_shutdown_function( array( &$this, '__destruct' ) ); + + if ( WP_DEBUG ) + $this->show_errors(); + + $this->init_charset(); + + $this->dbuser = $dbuser; + $this->dbpassword = $dbpassword; + $this->dbname = $dbname; + $this->dbhost = $dbhost; + + $this->db_connect(); + } + + /** + * PHP5 style destructor and will run when database object is destroyed. + * + * @see wpdb::__construct() + * @since 2.0.8 + * @return bool true + */ + function __destruct() { + return true; + } + + /** + * Set $this->charset and $this->collate + * + * @since 3.1.0 + */ + function init_charset() { + if ( function_exists('is_multisite') && is_multisite() ) { + $this->charset = 'utf8'; + if ( defined( 'DB_COLLATE' ) && DB_COLLATE ) + $this->collate = DB_COLLATE; + else + $this->collate = 'utf8_general_ci'; + } elseif ( defined( 'DB_COLLATE' ) ) { + $this->collate = DB_COLLATE; + } + + if ( defined( 'DB_CHARSET' ) ) + $this->charset = DB_CHARSET; + } + + /** + * Sets the connection's character set. + * + * @since 3.1.0 + * + * @param resource $dbh The resource given by mysql_connect + * @param string $charset The character set (optional) + * @param string $collate The collation (optional) + */ + function set_charset($dbh, $charset = null, $collate = null) { + if ( !isset($charset) ) + $charset = $this->charset; + if ( !isset($collate) ) + $collate = $this->collate; + if ( $this->has_cap( 'collation', $dbh ) && !empty( $charset ) ) { + if ( function_exists( 'mysql_set_charset' ) && $this->has_cap( 'set_charset', $dbh ) ) { + mysql_set_charset( $charset, $dbh ); + $this->real_escape = true; + } else { + $query = $this->prepare( 'SET NAMES %s', $charset ); + if ( ! empty( $collate ) ) + $query .= $this->prepare( ' COLLATE %s', $collate ); + mysql_query( $query, $dbh ); + } + } + } + + /** + * Sets the table prefix for the WordPress tables. + * + * @since 2.5.0 + * + * @param string $prefix Alphanumeric name for the new prefix. + * @return string|WP_Error Old prefix or WP_Error on error + */ + function set_prefix( $prefix, $set_table_names = true ) { + + if ( preg_match( '|[^a-z0-9_]|i', $prefix ) ) + return new WP_Error('invalid_db_prefix', /*WP_I18N_DB_BAD_PREFIX*/'Prefijo de la base de datos no válido'/*/WP_I18N_DB_BAD_PREFIX*/); + + $old_prefix = is_multisite() ? '' : $prefix; + + if ( isset( $this->base_prefix ) ) + $old_prefix = $this->base_prefix; + + $this->base_prefix = $prefix; + + if ( $set_table_names ) { + foreach ( $this->tables( 'global' ) as $table => $prefixed_table ) + $this->$table = $prefixed_table; + + if ( is_multisite() && empty( $this->blogid ) ) + return $old_prefix; + + $this->prefix = $this->get_blog_prefix(); + + foreach ( $this->tables( 'blog' ) as $table => $prefixed_table ) + $this->$table = $prefixed_table; + + foreach ( $this->tables( 'old' ) as $table => $prefixed_table ) + $this->$table = $prefixed_table; + } + return $old_prefix; + } + + /** + * Sets blog id. + * + * @since 3.0.0 + * @access public + * @param int $blog_id + * @param int $site_id Optional. + * @return string previous blog id + */ + function set_blog_id( $blog_id, $site_id = 0 ) { + if ( ! empty( $site_id ) ) + $this->siteid = $site_id; + + $old_blog_id = $this->blogid; + $this->blogid = $blog_id; + + $this->prefix = $this->get_blog_prefix(); + + foreach ( $this->tables( 'blog' ) as $table => $prefixed_table ) + $this->$table = $prefixed_table; + + foreach ( $this->tables( 'old' ) as $table => $prefixed_table ) + $this->$table = $prefixed_table; + + return $old_blog_id; + } + + /** + * Gets blog prefix. + * + * @uses is_multisite() + * @since 3.0.0 + * @param int $blog_id Optional. + * @return string Blog prefix. + */ + function get_blog_prefix( $blog_id = null ) { + if ( is_multisite() ) { + if ( null === $blog_id ) + $blog_id = $this->blogid; + $blog_id = (int) $blog_id; + if ( defined( 'MULTISITE' ) && ( 0 == $blog_id || 1 == $blog_id ) ) + return $this->base_prefix; + else + return $this->base_prefix . $blog_id . '_'; + } else { + return $this->base_prefix; + } + } + + /** + * Returns an array of WordPress tables. + * + * Also allows for the CUSTOM_USER_TABLE and CUSTOM_USER_META_TABLE to + * override the WordPress users and usersmeta tables that would otherwise + * be determined by the prefix. + * + * The scope argument can take one of the following: + * + * 'all' - returns 'all' and 'global' tables. No old tables are returned. + * 'blog' - returns the blog-level tables for the queried blog. + * 'global' - returns the global tables for the installation, returning multisite tables only if running multisite. + * 'ms_global' - returns the multisite global tables, regardless if current installation is multisite. + * 'old' - returns tables which are deprecated. + * + * @since 3.0.0 + * @uses wpdb::$tables + * @uses wpdb::$old_tables + * @uses wpdb::$global_tables + * @uses wpdb::$ms_global_tables + * @uses is_multisite() + * + * @param string $scope Optional. Can be all, global, ms_global, blog, or old tables. Defaults to all. + * @param bool $prefix Optional. Whether to include table prefixes. Default true. If blog + * prefix is requested, then the custom users and usermeta tables will be mapped. + * @param int $blog_id Optional. The blog_id to prefix. Defaults to wpdb::$blogid. Used only when prefix is requested. + * @return array Table names. When a prefix is requested, the key is the unprefixed table name. + */ + function tables( $scope = 'all', $prefix = true, $blog_id = 0 ) { + switch ( $scope ) { + case 'all' : + $tables = array_merge( $this->global_tables, $this->tables ); + if ( is_multisite() ) + $tables = array_merge( $tables, $this->ms_global_tables ); + break; + case 'blog' : + $tables = $this->tables; + break; + case 'global' : + $tables = $this->global_tables; + if ( is_multisite() ) + $tables = array_merge( $tables, $this->ms_global_tables ); + break; + case 'ms_global' : + $tables = $this->ms_global_tables; + break; + case 'old' : + $tables = $this->old_tables; + break; + default : + return array(); + break; + } + + if ( $prefix ) { + if ( ! $blog_id ) + $blog_id = $this->blogid; + $blog_prefix = $this->get_blog_prefix( $blog_id ); + $base_prefix = $this->base_prefix; + $global_tables = array_merge( $this->global_tables, $this->ms_global_tables ); + foreach ( $tables as $k => $table ) { + if ( in_array( $table, $global_tables ) ) + $tables[ $table ] = $base_prefix . $table; + else + $tables[ $table ] = $blog_prefix . $table; + unset( $tables[ $k ] ); + } + + if ( isset( $tables['users'] ) && defined( 'CUSTOM_USER_TABLE' ) ) + $tables['users'] = CUSTOM_USER_TABLE; + + if ( isset( $tables['usermeta'] ) && defined( 'CUSTOM_USER_META_TABLE' ) ) + $tables['usermeta'] = CUSTOM_USER_META_TABLE; + } + + return $tables; + } + + /** + * Selects a database using the current database connection. + * + * The database name will be changed based on the current database + * connection. On failure, the execution will bail and display an DB error. + * + * @since 0.71 + * + * @param string $db MySQL database name + * @param resource $dbh Optional link identifier. + * @return null Always null. + */ + function select( $db, $dbh = null) { + if ( is_null($dbh) ) + $dbh = $this->dbh; + + if ( !@mysql_select_db( $db, $dbh ) ) { + $this->ready = false; + $this->bail( sprintf( /*WP_I18N_DB_SELECT_DB*/'

    No se pudo elegir base de datos

    +

    Hemos podido conectar con el servidor de la bases de datos (lo que significa que tu nombre de usuario y la contraseña están correctos) pero no se pudo elegir la base de datos %1$s.

    +
      +
    • ¿Estás seguro que existe?
    • +
    • ¿El usuario %2$s tiene permiso para utilizar la base de datos %1$?
    • +
    • En algunos sistemas el nombre de la base de datos es el prefijo con el nombre de usuario, que sería como username_%1$s. ¿Podría ser ésto el problema?
    • +
    +

    Si no sabes cómo configurar una base de datos debes ponerte en contacto con el administrador de su hosting. Si todo lo demás falla puedes encontrar ayuda en los Foros de Soporte de WordPress.

    '/*/WP_I18N_DB_SELECT_DB*/, $db, $this->dbuser ), 'db_select_fail' ); + return; + } + } + + /** + * Weak escape, using addslashes() + * + * @see addslashes() + * @since 2.8.0 + * @access private + * + * @param string $string + * @return string + */ + function _weak_escape( $string ) { + return addslashes( $string ); + } + + /** + * Real escape, using mysql_real_escape_string() or addslashes() + * + * @see mysql_real_escape_string() + * @see addslashes() + * @since 2.8.0 + * @access private + * + * @param string $string to escape + * @return string escaped + */ + function _real_escape( $string ) { + if ( $this->dbh && $this->real_escape ) + return mysql_real_escape_string( $string, $this->dbh ); + else + return addslashes( $string ); + } + + /** + * Escape data. Works on arrays. + * + * @uses wpdb::_escape() + * @uses wpdb::_real_escape() + * @since 2.8.0 + * @access private + * + * @param string|array $data + * @return string|array escaped + */ + function _escape( $data ) { + if ( is_array( $data ) ) { + foreach ( (array) $data as $k => $v ) { + if ( is_array($v) ) + $data[$k] = $this->_escape( $v ); + else + $data[$k] = $this->_real_escape( $v ); + } + } else { + $data = $this->_real_escape( $data ); + } + + return $data; + } + + /** + * Escapes content for insertion into the database using addslashes(), for security. + * + * Works on arrays. + * + * @since 0.71 + * @param string|array $data to escape + * @return string|array escaped as query safe string + */ + function escape( $data ) { + if ( is_array( $data ) ) { + foreach ( (array) $data as $k => $v ) { + if ( is_array( $v ) ) + $data[$k] = $this->escape( $v ); + else + $data[$k] = $this->_weak_escape( $v ); + } + } else { + $data = $this->_weak_escape( $data ); + } + + return $data; + } + + /** + * Escapes content by reference for insertion into the database, for security + * + * @uses wpdb::_real_escape() + * @since 2.3.0 + * @param string $string to escape + * @return void + */ + function escape_by_ref( &$string ) { + $string = $this->_real_escape( $string ); + } + + /** + * Prepares a SQL query for safe execution. Uses sprintf()-like syntax. + * + * The following directives can be used in the query format string: + * %d (decimal number) + * %s (string) + * %% (literal percentage sign - no argument needed) + * + * Both %d and %s are to be left unquoted in the query string and they need an argument passed for them. + * Literals (%) as parts of the query must be properly written as %%. + * + * This function only supports a small subset of the sprintf syntax; it only supports %d (decimal number), %s (string). + * Does not support sign, padding, alignment, width or precision specifiers. + * Does not support argument numbering/swapping. + * + * May be called like {@link http://php.net/sprintf sprintf()} or like {@link http://php.net/vsprintf vsprintf()}. + * + * Both %d and %s should be left unquoted in the query string. + * + * + * wpdb::prepare( "SELECT * FROM `table` WHERE `column` = %s AND `field` = %d", 'foo', 1337 ) + * wpdb::prepare( "SELECT DATE_FORMAT(`field`, '%%c') FROM `table` WHERE `column` = %s", 'foo' ); + * + * + * @link http://php.net/sprintf Description of syntax. + * @since 2.3.0 + * + * @param string $query Query statement with sprintf()-like placeholders + * @param array|mixed $args The array of variables to substitute into the query's placeholders if being called like + * {@link http://php.net/vsprintf vsprintf()}, or the first variable to substitute into the query's placeholders if + * being called like {@link http://php.net/sprintf sprintf()}. + * @param mixed $args,... further variables to substitute into the query's placeholders if being called like + * {@link http://php.net/sprintf sprintf()}. + * @return null|false|string Sanitized query string, null if there is no query, false if there is an error and string + * if there was something to prepare + */ + function prepare( $query = null ) { // ( $query, *$args ) + if ( is_null( $query ) ) + return; + + $args = func_get_args(); + array_shift( $args ); + // If args were passed as an array (as in vsprintf), move them up + if ( isset( $args[0] ) && is_array($args[0]) ) + $args = $args[0]; + $query = str_replace( "'%s'", '%s', $query ); // in case someone mistakenly already singlequoted it + $query = str_replace( '"%s"', '%s', $query ); // doublequote unquoting + $query = preg_replace( '|(?dbh ); + $EZSQL_ERROR[] = array( 'query' => $this->last_query, 'error_str' => $str ); + + if ( $this->suppress_errors ) + return false; + + if ( $caller = $this->get_caller() ) + $error_str = sprintf( /*WP_I18N_DB_QUERY_ERROR_FULL*/'Error %1$s de la base de datos de WordPress para la consulta %2$s realizada por %3$s'/*/WP_I18N_DB_QUERY_ERROR_FULL*/, $str, $this->last_query, $caller ); + else + $error_str = sprintf( /*WP_I18N_DB_QUERY_ERROR*/'Error %1$s de la base de datos de WordPress para la consulta %2$s'/*/WP_I18N_DB_QUERY_ERROR*/, $str, $this->last_query ); + + if ( function_exists( 'error_log' ) + && ( $log_file = @ini_get( 'error_log' ) ) + && ( 'syslog' == $log_file || @is_writable( $log_file ) ) + ) + @error_log( $error_str ); + + // Are we showing errors? + if ( ! $this->show_errors ) + return false; + + // If there is an error then take note of it + if ( is_multisite() ) { + $msg = "WordPress database error: [$str]\n{$this->last_query}\n"; + if ( defined( 'ERRORLOGFILE' ) ) + error_log( $msg, 3, ERRORLOGFILE ); + if ( defined( 'DIEONDBERROR' ) ) + wp_die( $msg ); + } else { + $str = htmlspecialchars( $str, ENT_QUOTES ); + $query = htmlspecialchars( $this->last_query, ENT_QUOTES ); + + print "
    +

    WordPress database error: [$str]
    + $query

    +
    "; + } + } + + /** + * Enables showing of database errors. + * + * This function should be used only to enable showing of errors. + * wpdb::hide_errors() should be used instead for hiding of errors. However, + * this function can be used to enable and disable showing of database + * errors. + * + * @since 0.71 + * @see wpdb::hide_errors() + * + * @param bool $show Whether to show or hide errors + * @return bool Old value for showing errors. + */ + function show_errors( $show = true ) { + $errors = $this->show_errors; + $this->show_errors = $show; + return $errors; + } + + /** + * Disables showing of database errors. + * + * By default database errors are not shown. + * + * @since 0.71 + * @see wpdb::show_errors() + * + * @return bool Whether showing of errors was active + */ + function hide_errors() { + $show = $this->show_errors; + $this->show_errors = false; + return $show; + } + + /** + * Whether to suppress database errors. + * + * By default database errors are suppressed, with a simple + * call to this function they can be enabled. + * + * @since 2.5.0 + * @see wpdb::hide_errors() + * @param bool $suppress Optional. New value. Defaults to true. + * @return bool Old value + */ + function suppress_errors( $suppress = true ) { + $errors = $this->suppress_errors; + $this->suppress_errors = (bool) $suppress; + return $errors; + } + + /** + * Kill cached query results. + * + * @since 0.71 + * @return void + */ + function flush() { + $this->last_result = array(); + $this->col_info = null; + $this->last_query = null; + } + + /** + * Connect to and select database + * + * @since 3.0.0 + */ + function db_connect() { + if ( WP_DEBUG ) { + $this->dbh = mysql_connect( $this->dbhost, $this->dbuser, $this->dbpassword, true ); + } else { + $this->dbh = @mysql_connect( $this->dbhost, $this->dbuser, $this->dbpassword, true ); + } + + if ( !$this->dbh ) { + $this->bail( sprintf( /*WP_I18N_DB_CONN_ERROR*/' +

    Error de conexión con la base de datos

    +

    Esto puede deberse a que los datos de usuario y contraseña de tu wp-config.php son incorrectos o a que no es posible contactar con el servidor de base de datos en %s, lo que podría significar que el servidor de bases de datos de tu host está inactivo.

    +
      +
    • ¿Estás seguro de que el nombre de usuario y la contraseña son correctos?
    • +
    • ¿Estás seguro de que el nombre del host es correcto?
    • +
    • ¿Estás seguro de que el servidor de bases de datos está activo?
    • +
    +

    Si no tienes muy claro lo que significan los términos anteriores, ponte en contacto con tu proveedor de alojamiento. Si necesitas más ayuda, puedes visitar los Foros de ayuda de WordPress.

    +'/*/WP_I18N_DB_CONN_ERROR*/, $this->dbhost ), 'db_connect_fail' ); + + return; + } + + $this->set_charset( $this->dbh ); + + $this->ready = true; + + $this->select( $this->dbname, $this->dbh ); + } + + /** + * Perform a MySQL database query, using current database connection. + * + * More information can be found on the codex page. + * + * @since 0.71 + * + * @param string $query Database query + * @return int|false Number of rows affected/selected or false on error + */ + function query( $query ) { + if ( ! $this->ready ) + return false; + + // some queries are made before the plugins have been loaded, and thus cannot be filtered with this method + if ( function_exists( 'apply_filters' ) ) + $query = apply_filters( 'query', $query ); + + $return_val = 0; + $this->flush(); + + // Log how the function was called + $this->func_call = "\$db->query(\"$query\")"; + + // Keep track of the last query for debug.. + $this->last_query = $query; + + if ( defined( 'SAVEQUERIES' ) && SAVEQUERIES ) + $this->timer_start(); + + $this->result = @mysql_query( $query, $this->dbh ); + $this->num_queries++; + + if ( defined( 'SAVEQUERIES' ) && SAVEQUERIES ) + $this->queries[] = array( $query, $this->timer_stop(), $this->get_caller() ); + + // If there is an error then take note of it.. + if ( $this->last_error = mysql_error( $this->dbh ) ) { + $this->print_error(); + return false; + } + + if ( preg_match( '/^\s*(create|alter|truncate|drop) /i', $query ) ) { + $return_val = $this->result; + } elseif ( preg_match( '/^\s*(insert|delete|update|replace) /i', $query ) ) { + $this->rows_affected = mysql_affected_rows( $this->dbh ); + // Take note of the insert_id + if ( preg_match( '/^\s*(insert|replace) /i', $query ) ) { + $this->insert_id = mysql_insert_id($this->dbh); + } + // Return number of rows affected + $return_val = $this->rows_affected; + } else { + $i = 0; + while ( $i < @mysql_num_fields( $this->result ) ) { + $this->col_info[$i] = @mysql_fetch_field( $this->result ); + $i++; + } + $num_rows = 0; + while ( $row = @mysql_fetch_object( $this->result ) ) { + $this->last_result[$num_rows] = $row; + $num_rows++; + } + + @mysql_free_result( $this->result ); + + // Log number of rows the query returned + // and return number of rows selected + $this->num_rows = $num_rows; + $return_val = $num_rows; + } + + return $return_val; + } + + /** + * Insert a row into a table. + * + * + * wpdb::insert( 'table', array( 'column' => 'foo', 'field' => 'bar' ) ) + * wpdb::insert( 'table', array( 'column' => 'foo', 'field' => 1337 ), array( '%s', '%d' ) ) + * + * + * @since 2.5.0 + * @see wpdb::prepare() + * @see wpdb::$field_types + * @see wp_set_wpdb_vars() + * + * @param string $table table name + * @param array $data Data to insert (in column => value pairs). Both $data columns and $data values should be "raw" (neither should be SQL escaped). + * @param array|string $format Optional. An array of formats to be mapped to each of the value in $data. If string, that format will be used for all of the values in $data. + * A format is one of '%d', '%s' (decimal number, string). If omitted, all values in $data will be treated as strings unless otherwise specified in wpdb::$field_types. + * @return int|false The number of rows inserted, or false on error. + */ + function insert( $table, $data, $format = null ) { + return $this->_insert_replace_helper( $table, $data, $format, 'INSERT' ); + } + + /** + * Replace a row into a table. + * + * + * wpdb::replace( 'table', array( 'column' => 'foo', 'field' => 'bar' ) ) + * wpdb::replace( 'table', array( 'column' => 'foo', 'field' => 1337 ), array( '%s', '%d' ) ) + * + * + * @since 3.0.0 + * @see wpdb::prepare() + * @see wpdb::$field_types + * @see wp_set_wpdb_vars() + * + * @param string $table table name + * @param array $data Data to insert (in column => value pairs). Both $data columns and $data values should be "raw" (neither should be SQL escaped). + * @param array|string $format Optional. An array of formats to be mapped to each of the value in $data. If string, that format will be used for all of the values in $data. + * A format is one of '%d', '%s' (decimal number, string). If omitted, all values in $data will be treated as strings unless otherwise specified in wpdb::$field_types. + * @return int|false The number of rows affected, or false on error. + */ + function replace( $table, $data, $format = null ) { + return $this->_insert_replace_helper( $table, $data, $format, 'REPLACE' ); + } + + /** + * Helper function for insert and replace. + * + * Runs an insert or replace query based on $type argument. + * + * @access private + * @since 3.0.0 + * @see wpdb::prepare() + * @see wpdb::$field_types + * @see wp_set_wpdb_vars() + * + * @param string $table table name + * @param array $data Data to insert (in column => value pairs). Both $data columns and $data values should be "raw" (neither should be SQL escaped). + * @param array|string $format Optional. An array of formats to be mapped to each of the value in $data. If string, that format will be used for all of the values in $data. + * A format is one of '%d', '%s' (decimal number, string). If omitted, all values in $data will be treated as strings unless otherwise specified in wpdb::$field_types. + * @return int|false The number of rows affected, or false on error. + */ + function _insert_replace_helper( $table, $data, $format = null, $type = 'INSERT' ) { + if ( ! in_array( strtoupper( $type ), array( 'REPLACE', 'INSERT' ) ) ) + return false; + $formats = $format = (array) $format; + $fields = array_keys( $data ); + $formatted_fields = array(); + foreach ( $fields as $field ) { + if ( !empty( $format ) ) + $form = ( $form = array_shift( $formats ) ) ? $form : $format[0]; + elseif ( isset( $this->field_types[$field] ) ) + $form = $this->field_types[$field]; + else + $form = '%s'; + $formatted_fields[] = $form; + } + $sql = "{$type} INTO `$table` (`" . implode( '`,`', $fields ) . "`) VALUES ('" . implode( "','", $formatted_fields ) . "')"; + return $this->query( $this->prepare( $sql, $data ) ); + } + + /** + * Update a row in the table + * + * + * wpdb::update( 'table', array( 'column' => 'foo', 'field' => 'bar' ), array( 'ID' => 1 ) ) + * wpdb::update( 'table', array( 'column' => 'foo', 'field' => 1337 ), array( 'ID' => 1 ), array( '%s', '%d' ), array( '%d' ) ) + * + * + * @since 2.5.0 + * @see wpdb::prepare() + * @see wpdb::$field_types + * @see wp_set_wpdb_vars() + * + * @param string $table table name + * @param array $data Data to update (in column => value pairs). Both $data columns and $data values should be "raw" (neither should be SQL escaped). + * @param array $where A named array of WHERE clauses (in column => value pairs). Multiple clauses will be joined with ANDs. Both $where columns and $where values should be "raw". + * @param array|string $format Optional. An array of formats to be mapped to each of the values in $data. If string, that format will be used for all of the values in $data. + * A format is one of '%d', '%s' (decimal number, string). If omitted, all values in $data will be treated as strings unless otherwise specified in wpdb::$field_types. + * @param array|string $format_where Optional. An array of formats to be mapped to each of the values in $where. If string, that format will be used for all of the items in $where. A format is one of '%d', '%s' (decimal number, string). If omitted, all values in $where will be treated as strings. + * @return int|false The number of rows updated, or false on error. + */ + function update( $table, $data, $where, $format = null, $where_format = null ) { + if ( ! is_array( $data ) || ! is_array( $where ) ) + return false; + + $formats = $format = (array) $format; + $bits = $wheres = array(); + foreach ( (array) array_keys( $data ) as $field ) { + if ( !empty( $format ) ) + $form = ( $form = array_shift( $formats ) ) ? $form : $format[0]; + elseif ( isset($this->field_types[$field]) ) + $form = $this->field_types[$field]; + else + $form = '%s'; + $bits[] = "`$field` = {$form}"; + } + + $where_formats = $where_format = (array) $where_format; + foreach ( (array) array_keys( $where ) as $field ) { + if ( !empty( $where_format ) ) + $form = ( $form = array_shift( $where_formats ) ) ? $form : $where_format[0]; + elseif ( isset( $this->field_types[$field] ) ) + $form = $this->field_types[$field]; + else + $form = '%s'; + $wheres[] = "`$field` = {$form}"; + } + + $sql = "UPDATE `$table` SET " . implode( ', ', $bits ) . ' WHERE ' . implode( ' AND ', $wheres ); + return $this->query( $this->prepare( $sql, array_merge( array_values( $data ), array_values( $where ) ) ) ); + } + + /** + * Retrieve one variable from the database. + * + * Executes a SQL query and returns the value from the SQL result. + * If the SQL result contains more than one column and/or more than one row, this function returns the value in the column and row specified. + * If $query is null, this function returns the value in the specified column and row from the previous SQL result. + * + * @since 0.71 + * + * @param string|null $query Optional. SQL query. Defaults to null, use the result from the previous query. + * @param int $x Optional. Column of value to return. Indexed from 0. + * @param int $y Optional. Row of value to return. Indexed from 0. + * @return string|null Database query result (as string), or null on failure + */ + function get_var( $query = null, $x = 0, $y = 0 ) { + $this->func_call = "\$db->get_var(\"$query\", $x, $y)"; + if ( $query ) + $this->query( $query ); + + // Extract var out of cached results based x,y vals + if ( !empty( $this->last_result[$y] ) ) { + $values = array_values( get_object_vars( $this->last_result[$y] ) ); + } + + // If there is a value return it else return null + return ( isset( $values[$x] ) && $values[$x] !== '' ) ? $values[$x] : null; + } + + /** + * Retrieve one row from the database. + * + * Executes a SQL query and returns the row from the SQL result. + * + * @since 0.71 + * + * @param string|null $query SQL query. + * @param string $output Optional. one of ARRAY_A | ARRAY_N | OBJECT constants. Return an associative array (column => value, ...), + * a numerically indexed array (0 => value, ...) or an object ( ->column = value ), respectively. + * @param int $y Optional. Row to return. Indexed from 0. + * @return mixed Database query result in format specifed by $output or null on failure + */ + function get_row( $query = null, $output = OBJECT, $y = 0 ) { + $this->func_call = "\$db->get_row(\"$query\",$output,$y)"; + if ( $query ) + $this->query( $query ); + else + return null; + + if ( !isset( $this->last_result[$y] ) ) + return null; + + if ( $output == OBJECT ) { + return $this->last_result[$y] ? $this->last_result[$y] : null; + } elseif ( $output == ARRAY_A ) { + return $this->last_result[$y] ? get_object_vars( $this->last_result[$y] ) : null; + } elseif ( $output == ARRAY_N ) { + return $this->last_result[$y] ? array_values( get_object_vars( $this->last_result[$y] ) ) : null; + } else { + $this->print_error(/*WP_I18N_DB_GETROW_ERROR*/' $db->get_row(string query, output type, int offset) -- El tipo de salida (output) debe ser uno de estos: OBJECT, ARRAY_A, ARRAY_N'/*/WP_I18N_DB_GETROW_ERROR*/); + } + } + + /** + * Retrieve one column from the database. + * + * Executes a SQL query and returns the column from the SQL result. + * If the SQL result contains more than one column, this function returns the column specified. + * If $query is null, this function returns the specified column from the previous SQL result. + * + * @since 0.71 + * + * @param string|null $query Optional. SQL query. Defaults to previous query. + * @param int $x Optional. Column to return. Indexed from 0. + * @return array Database query result. Array indexed from 0 by SQL result row number. + */ + function get_col( $query = null , $x = 0 ) { + if ( $query ) + $this->query( $query ); + + $new_array = array(); + // Extract the column values + for ( $i = 0, $j = count( $this->last_result ); $i < $j; $i++ ) { + $new_array[$i] = $this->get_var( null, $x, $i ); + } + return $new_array; + } + + /** + * Retrieve an entire SQL result set from the database (i.e., many rows) + * + * Executes a SQL query and returns the entire SQL result. + * + * @since 0.71 + * + * @param string $query SQL query. + * @param string $output Optional. Any of ARRAY_A | ARRAY_N | OBJECT | OBJECT_K constants. With one of the first three, return an array of rows indexed from 0 by SQL result row number. + * Each row is an associative array (column => value, ...), a numerically indexed array (0 => value, ...), or an object. ( ->column = value ), respectively. + * With OBJECT_K, return an associative array of row objects keyed by the value of each row's first column's value. Duplicate keys are discarded. + * @return mixed Database query results + */ + function get_results( $query = null, $output = OBJECT ) { + $this->func_call = "\$db->get_results(\"$query\", $output)"; + + if ( $query ) + $this->query( $query ); + else + return null; + + $new_array = array(); + if ( $output == OBJECT ) { + // Return an integer-keyed array of row objects + return $this->last_result; + } elseif ( $output == OBJECT_K ) { + // Return an array of row objects with keys from column 1 + // (Duplicates are discarded) + foreach ( $this->last_result as $row ) { + $key = array_shift( get_object_vars( $row ) ); + if ( ! isset( $new_array[ $key ] ) ) + $new_array[ $key ] = $row; + } + return $new_array; + } elseif ( $output == ARRAY_A || $output == ARRAY_N ) { + // Return an integer-keyed array of... + if ( $this->last_result ) { + foreach( (array) $this->last_result as $row ) { + if ( $output == ARRAY_N ) { + // ...integer-keyed row arrays + $new_array[] = array_values( get_object_vars( $row ) ); + } else { + // ...column name-keyed row arrays + $new_array[] = get_object_vars( $row ); + } + } + } + return $new_array; + } + return null; + } + + /** + * Retrieve column metadata from the last query. + * + * @since 0.71 + * + * @param string $info_type Optional. Type one of name, table, def, max_length, not_null, primary_key, multiple_key, unique_key, numeric, blob, type, unsigned, zerofill + * @param int $col_offset Optional. 0: col name. 1: which table the col's in. 2: col's max length. 3: if the col is numeric. 4: col's type + * @return mixed Column Results + */ + function get_col_info( $info_type = 'name', $col_offset = -1 ) { + if ( $this->col_info ) { + if ( $col_offset == -1 ) { + $i = 0; + $new_array = array(); + foreach( (array) $this->col_info as $col ) { + $new_array[$i] = $col->{$info_type}; + $i++; + } + return $new_array; + } else { + return $this->col_info[$col_offset]->{$info_type}; + } + } + } + + /** + * Starts the timer, for debugging purposes. + * + * @since 1.5.0 + * + * @return true + */ + function timer_start() { + $mtime = explode( ' ', microtime() ); + $this->time_start = $mtime[1] + $mtime[0]; + return true; + } + + /** + * Stops the debugging timer. + * + * @since 1.5.0 + * + * @return int Total time spent on the query, in milliseconds + */ + function timer_stop() { + $mtime = explode( ' ', microtime() ); + $time_end = $mtime[1] + $mtime[0]; + $time_total = $time_end - $this->time_start; + return $time_total; + } + + /** + * Wraps errors in a nice header and footer and dies. + * + * Will not die if wpdb::$show_errors is true + * + * @since 1.5.0 + * + * @param string $message The Error message + * @param string $error_code Optional. A Computer readable string to identify the error. + * @return false|void + */ + function bail( $message, $error_code = '500' ) { + if ( !$this->show_errors ) { + if ( class_exists( 'WP_Error' ) ) + $this->error = new WP_Error($error_code, $message); + else + $this->error = $message; + return false; + } + wp_die($message); + } + + /** + * Whether MySQL database is at least the required minimum version. + * + * @since 2.5.0 + * @uses $wp_version + * @uses $required_mysql_version + * + * @return WP_Error + */ + function check_database_version() { + global $wp_version, $required_mysql_version; + // Make sure the server has the required MySQL version + if ( version_compare($this->db_version(), $required_mysql_version, '<') ) + return new WP_Error('database_version', sprintf( __( 'ERROR: WordPress %1$s requires MySQL %2$s or higher' ), $wp_version, $required_mysql_version )); + } + + /** + * Whether the database supports collation. + * + * Called when WordPress is generating the table scheme. + * + * @since 2.5.0 + * + * @return bool True if collation is supported, false if version does not + */ + function supports_collation() { + return $this->has_cap( 'collation' ); + } + + /** + * Determine if a database supports a particular feature + * + * @since 2.7.0 + * @see wpdb::db_version() + * + * @param string $db_cap the feature + * @return bool + */ + function has_cap( $db_cap ) { + $version = $this->db_version(); + + switch ( strtolower( $db_cap ) ) { + case 'collation' : // @since 2.5.0 + case 'group_concat' : // @since 2.7 + case 'subqueries' : // @since 2.7 + return version_compare( $version, '4.1', '>=' ); + case 'set_charset' : + return version_compare($version, '5.0.7', '>='); + }; + + return false; + } + + /** + * Retrieve the name of the function that called wpdb. + * + * Searches up the list of functions until it reaches + * the one that would most logically had called this method. + * + * @since 2.5.0 + * + * @return string The name of the calling function + */ + function get_caller() { + $trace = array_reverse( debug_backtrace() ); + $caller = array(); + + foreach ( $trace as $call ) { + if ( isset( $call['class'] ) && __CLASS__ == $call['class'] ) + continue; // Filter out wpdb calls. + $caller[] = isset( $call['class'] ) ? "{$call['class']}->{$call['function']}" : $call['function']; + } + + return join( ', ', $caller ); + } + + /** + * The database version number. + * + * @since 2.7.0 + * + * @return false|string false on failure, version number on success + */ + function db_version() { + return preg_replace( '/[^0-9.].*/', '', mysql_get_server_info( $this->dbh ) ); + } +} + +?> diff --git a/src/wp-includes/wp-diff.php b/src/wp-includes/wp-diff.php new file mode 100644 index 0000000..ed36ee9 --- /dev/null +++ b/src/wp-includes/wp-diff.php @@ -0,0 +1,477 @@ ++{$line}"; + } + + /** + * @ignore + * + * @param string $line HTML-escape the value. + * @return string + */ + function deletedLine( $line ) { + return "-{$line}"; + } + + /** + * @ignore + * + * @param string $line HTML-escape the value. + * @return string + */ + function contextLine( $line ) { + return " {$line}"; + } + + /** + * @ignore + * + * @return string + */ + function emptyLine() { + return ' '; + } + + /** + * @ignore + * @access private + * + * @param array $lines + * @param bool $encode + * @return string + */ + function _added( $lines, $encode = true ) { + $r = ''; + foreach ($lines as $line) { + if ( $encode ) + $line = htmlspecialchars( $line ); + $r .= '' . $this->emptyLine() . $this->addedLine( $line ) . "\n"; + } + return $r; + } + + /** + * @ignore + * @access private + * + * @param array $lines + * @param bool $encode + * @return string + */ + function _deleted( $lines, $encode = true ) { + $r = ''; + foreach ($lines as $line) { + if ( $encode ) + $line = htmlspecialchars( $line ); + $r .= '' . $this->deletedLine( $line ) . $this->emptyLine() . "\n"; + } + return $r; + } + + /** + * @ignore + * @access private + * + * @param array $lines + * @param bool $encode + * @return string + */ + function _context( $lines, $encode = true ) { + $r = ''; + foreach ($lines as $line) { + if ( $encode ) + $line = htmlspecialchars( $line ); + $r .= '' . + $this->contextLine( $line ) . $this->contextLine( $line ) . "\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 private + * @since 2.6.0 + * + * @param array $orig + * @param array $final + * @return string + */ + 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 or + if ( $diff_count = preg_match_all( '!(.*?|.*?)!', $diff, $diff_matches ) ) { + // length of all text between or + $stripped_matches = strlen(strip_tags( join(' ', $diff_matches[0]) )); + // since we count lengith of text between or (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( '|.*?|', '', $diff ); + $final_diffs[$f] = preg_replace( '|.*?|', '', $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. + $r .= '' . $this->deletedLine( $orig_line ) . $this->addedLine( $final_line ) . "\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 unknown_type $orig + * @param unknown_type $final + * @return unknown + */ + 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); + +/* + // Debug + echo "\n\n\n\n\n"; + + echo "-- DEBUG Matches: Orig -> Final --"; + + foreach ( $orig_matches as $o => $f ) { + echo "\n\n\n\n\n"; + echo "ORIG: $o, FINAL: $f\n"; + var_dump($orig[$o],$final[$f]); + } + echo "\n\n\n\n\n"; + + echo "-- DEBUG Matches: Final -> Orig --"; + + foreach ( $final_matches as $f => $o ) { + echo "\n\n\n\n\n"; + echo "FINAL: $f, ORIG: $o\n"; + var_dump($final[$f],$orig[$o]); + } + echo "\n\n\n\n\n"; + + echo "-- DEBUG Rows: Orig -- Final --"; + + echo "\n\n\n\n\n"; + foreach ( $orig_rows as $row => $o ) { + if ( $o < 0 ) + $o = 'X'; + $f = $final_rows[$row]; + if ( $f < 0 ) + $f = 'X'; + echo "$o -- $f\n"; + } + echo "\n\n\n\n\n"; + + echo "-- END DEBUG --"; + + echo "\n\n\n\n\n"; + + 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 + */ + 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 charcter (of string1) + return $difference / strlen($string1); + } + + /** + * @ignore + * @since 2.6.0 + * + * @param int $a + * @param int $b + * @return int + */ + function difference( $a, $b ) { + return abs( $a - $b ); + } + +} + +/** + * 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 + */ + 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/src/wp-links-opml.php b/src/wp-links-opml.php new file mode 100644 index 0000000..e30869b --- /dev/null +++ b/src/wp-links-opml.php @@ -0,0 +1,59 @@ +\n"; +?> + + + <?php printf( __('Links for %s'), esc_attr(get_bloginfo('name', 'display')) ); ?> + GMT + + + + 'link_category', 'hierarchical' => 0)); +else + $cats = get_categories(array('taxonomy' => 'link_category', 'hierarchical' => 0, 'include' => $link_cat)); + +foreach ( (array)$cats as $cat ) : + $catname = apply_filters('link_category', $cat->name); + +?> + + $cat->term_id)); + foreach ( (array)$bookmarks as $bookmark ) : + $title = apply_filters('link_title', $bookmark->link_name); +?> + + + + + + \ No newline at end of file diff --git a/src/wp-load.php b/src/wp-load.php new file mode 100644 index 0000000..c6d1ead --- /dev/null +++ b/src/wp-load.php @@ -0,0 +1,60 @@ +wp-config.php. Este archivo es necesario para empezar. ¿Necesitas ayuda? La encontrarás aquí (en inglés). Puedes crear un archivo wp-config.php a través de la web, pero esto no funciona en algunos servidores. Lo más seguro es crear el archivo manualmente.

    Crear un archivo de configuración'/*/WP_I18N_NO_CONFIG*/, $path), /*WP_I18N_ERROR_TITLE*/'WordPress › Error'/*/WP_I18N_ERROR_TITLE*/, array('text_direction' => $text_direction)); + +} + +?> \ No newline at end of file diff --git a/src/wp-login.php b/src/wp-login.php new file mode 100644 index 0000000..ffa00ab --- /dev/null +++ b/src/wp-login.php @@ -0,0 +1,698 @@ + element. + * @param string $message Optional. Message to display in header. + * @param WP_Error $wp_error Optional. WordPress Error Object + */ +function login_header($title = 'Log In', $message = '', $wp_error = '') { + global $error, $is_iphone, $interim_login, $current_site; + + // Don't index any of these forms + add_filter( 'pre_option_blog_public', '__return_zero' ); + add_action( 'login_head', 'noindex' ); + + if ( empty($wp_error) ) + $wp_error = new WP_Error(); + + // Shake it! + $shake_error_codes = array( 'empty_password', 'empty_email', 'invalid_email', 'invalidcombo', 'empty_username', 'invalid_username', 'incorrect_password' ); + $shake_error_codes = apply_filters( 'shake_error_codes', $shake_error_codes ); + + if ( $shake_error_codes && $wp_error->get_error_code() && in_array( $wp_error->get_error_code(), $shake_error_codes ) ) + add_action( 'login_head', 'wp_shake_js', 12 ); + + ?> + +> + + + <?php bloginfo('name'); ?> › <?php echo $title; ?> + + + + + + + + + +

    + +

    +add('error', $error); + unset($error); + } + + if ( $wp_error->get_error_code() ) { + $errors = ''; + $messages = ''; + foreach ( $wp_error->get_error_codes() as $code ) { + $severity = $wp_error->get_error_data($code); + foreach ( $wp_error->get_error_messages($code) as $error ) { + if ( 'message' == $severity ) + $messages .= ' ' . $error . "
    \n"; + else + $errors .= ' ' . $error . "
    \n"; + } + } + if ( !empty($errors) ) + echo '
    ' . apply_filters('login_errors', $errors) . "
    \n"; + if ( !empty($messages) ) + echo '

    ' . apply_filters('login_messages', $messages) . "

    \n"; + } +} // End of login_header() + +/** + * Outputs the footer for the login page. + * + * @param string $input_id Which input to auto-focus + */ +function login_footer($input_id = '') { + ?> +

    +
    + + + + + + + + + + +add('empty_username', __('ERROR: Enter a username or e-mail address.')); + + if ( strpos($_POST['user_login'], '@') ) { + $user_data = get_user_by_email(trim($_POST['user_login'])); + if ( empty($user_data) ) + $errors->add('invalid_email', __('ERROR: There is no user registered with that email address.')); + } else { + $login = trim($_POST['user_login']); + $user_data = get_userdatabylogin($login); + } + + do_action('lostpassword_post'); + + if ( $errors->get_error_code() ) + return $errors; + + if ( !$user_data ) { + $errors->add('invalidcombo', __('ERROR: Invalid username or e-mail.')); + return $errors; + } + + // redefining user_login ensures we return the right case in the email + $user_login = $user_data->user_login; + $user_email = $user_data->user_email; + + do_action('retreive_password', $user_login); // Misspelled and deprecated + do_action('retrieve_password', $user_login); + + $allow = apply_filters('allow_password_reset', true, $user_data->ID); + + if ( ! $allow ) + return new WP_Error('no_password_reset', __('Password reset is not allowed for this user')); + else if ( is_wp_error($allow) ) + return $allow; + + $key = $wpdb->get_var($wpdb->prepare("SELECT user_activation_key FROM $wpdb->users WHERE user_login = %s", $user_login)); + if ( empty($key) ) { + // Generate something random for a key... + $key = wp_generate_password(20, false); + do_action('retrieve_password_key', $user_login, $key); + // Now insert the new md5 key into the db + $wpdb->update($wpdb->users, array('user_activation_key' => $key), array('user_login' => $user_login)); + } + $message = __('Someone requested that the password be reset for the following account:') . "\r\n\r\n"; + $message .= network_site_url() . "\r\n\r\n"; + $message .= sprintf(__('Username: %s'), $user_login) . "\r\n\r\n"; + $message .= __('If this was a mistake, just ignore this email and nothing will happen.') . "\r\n\r\n"; + $message .= __('To reset your password, visit the following address:') . "\r\n\r\n"; + $message .= '<' . network_site_url("wp-login.php?action=rp&key=$key&login=" . rawurlencode($user_login), 'login') . ">\r\n"; + + if ( is_multisite() ) + $blogname = $GLOBALS['current_site']->site_name; + else + // The blogname option is escaped with esc_html on the way into the database in sanitize_option + // we want to reverse this for the plain text arena of emails. + $blogname = wp_specialchars_decode(get_option('blogname'), ENT_QUOTES); + + $title = sprintf( __('[%s] Password Reset'), $blogname ); + + $title = apply_filters('retrieve_password_title', $title); + $message = apply_filters('retrieve_password_message', $message, $key); + + if ( $message && !wp_mail($user_email, $title, $message) ) + wp_die( __('The e-mail could not be sent.') . "
    \n" . __('Possible reason: your host may have disabled the mail() function...') ); + + return true; +} + +/** + * Retrieves a user row based on password reset key and login + * + * @uses $wpdb WordPress Database object + * + * @param string $key Hash to validate sending user's password + * @param string $login The user login + * + * @return object|WP_Error + */ +function check_password_reset_key($key, $login) { + global $wpdb; + + $key = preg_replace('/[^a-z0-9]/i', '', $key); + + if ( empty( $key ) || !is_string( $key ) ) + return new WP_Error('invalid_key', __('Invalid key')); + + if ( empty($login) || !is_string($login) ) + return new WP_Error('invalid_key', __('Invalid key')); + + $user = $wpdb->get_row($wpdb->prepare("SELECT * FROM $wpdb->users WHERE user_activation_key = %s AND user_login = %s", $key, $login)); + + if ( empty( $user ) ) + return new WP_Error('invalid_key', __('Invalid key')); + + return $user; +} + +/** + * Handles resetting the user's password. + * + * @uses $wpdb WordPress Database object + * + * @param string $key Hash to validate sending user's password + */ +function reset_password($user, $new_pass) { + do_action('password_reset', $user, $new_pass); + + wp_set_password($new_pass, $user->ID); + + wp_password_change_notification($user); +} + +/** + * Handles registering a new user. + * + * @param string $user_login User's username for logging in + * @param string $user_email User's email address to send password and add + * @return int|WP_Error Either user's ID or error on failure. + */ +function register_new_user( $user_login, $user_email ) { + $errors = new WP_Error(); + + $sanitized_user_login = sanitize_user( $user_login ); + $user_email = apply_filters( 'user_registration_email', $user_email ); + + // Check the username + if ( $sanitized_user_login == '' ) { + $errors->add( 'empty_username', __( 'ERROR: Please enter a username.' ) ); + } elseif ( ! validate_username( $user_login ) ) { + $errors->add( 'invalid_username', __( 'ERROR: This username is invalid because it uses illegal characters. Please enter a valid username.' ) ); + $sanitized_user_login = ''; + } elseif ( username_exists( $sanitized_user_login ) ) { + $errors->add( 'username_exists', __( 'ERROR: This username is already registered, please choose another one.' ) ); + } + + // Check the e-mail address + if ( $user_email == '' ) { + $errors->add( 'empty_email', __( 'ERROR: Please type your e-mail address.' ) ); + } elseif ( ! is_email( $user_email ) ) { + $errors->add( 'invalid_email', __( 'ERROR: The email address isn’t correct.' ) ); + $user_email = ''; + } elseif ( email_exists( $user_email ) ) { + $errors->add( 'email_exists', __( 'ERROR: This email is already registered, please choose another one.' ) ); + } + + do_action( 'register_post', $sanitized_user_login, $user_email, $errors ); + + $errors = apply_filters( 'registration_errors', $errors, $sanitized_user_login, $user_email ); + + if ( $errors->get_error_code() ) + return $errors; + + $user_pass = wp_generate_password( 12, false); + $user_id = wp_create_user( $sanitized_user_login, $user_pass, $user_email ); + if ( ! $user_id ) { + $errors->add( 'registerfail', sprintf( __( 'ERROR: Couldn’t register you... please contact the webmaster !' ), get_option( 'admin_email' ) ) ); + return $errors; + } + + update_user_option( $user_id, 'default_password_nag', true, true ); //Set up the Password change nag. + + wp_new_user_notification( $user_id, $user_pass ); + + return $user_id; +} + +// +// Main +// + +$action = isset($_REQUEST['action']) ? $_REQUEST['action'] : 'login'; +$errors = new WP_Error(); + +if ( isset($_GET['key']) ) + $action = 'resetpass'; + +// validate action so as to default to the login screen +if ( !in_array($action, array('logout', 'lostpassword', 'retrievepassword', 'resetpass', 'rp', 'register', 'login'), true) && false === has_filter('login_form_' . $action) ) + $action = 'login'; + +nocache_headers(); + +header('Content-Type: '.get_bloginfo('html_type').'; charset='.get_bloginfo('charset')); + +if ( defined('RELOCATE') ) { // Move flag is set + if ( isset( $_SERVER['PATH_INFO'] ) && ($_SERVER['PATH_INFO'] != $_SERVER['PHP_SELF']) ) + $_SERVER['PHP_SELF'] = str_replace( $_SERVER['PATH_INFO'], '', $_SERVER['PHP_SELF'] ); + + $schema = is_ssl() ? 'https://' : 'http://'; + if ( dirname($schema . $_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF']) != get_option('siteurl') ) + update_option('siteurl', dirname($schema . $_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF']) ); +} + +//Set a cookie now to see if they are supported by the browser. +setcookie(TEST_COOKIE, 'WP Cookie check', 0, COOKIEPATH, COOKIE_DOMAIN); +if ( SITECOOKIEPATH != COOKIEPATH ) + setcookie(TEST_COOKIE, 'WP Cookie check', 0, SITECOOKIEPATH, COOKIE_DOMAIN); + +// allow plugins to override the default actions, and to add extra actions if they want +do_action( 'login_init' ); +do_action( 'login_form_' . $action ); + +$http_post = ('POST' == $_SERVER['REQUEST_METHOD']); +switch ($action) { + +case 'logout' : + check_admin_referer('log-out'); + wp_logout(); + + $redirect_to = !empty( $_REQUEST['redirect_to'] ) ? $_REQUEST['redirect_to'] : 'wp-login.php?loggedout=true'; + wp_safe_redirect( $redirect_to ); + exit(); + +break; + +case 'lostpassword' : +case 'retrievepassword' : + + if ( $http_post ) { + $errors = retrieve_password(); + if ( !is_wp_error($errors) ) { + $redirect_to = !empty( $_REQUEST['redirect_to'] ) ? $_REQUEST['redirect_to'] : 'wp-login.php?checkemail=confirm'; + wp_safe_redirect( $redirect_to ); + exit(); + } + } + + if ( isset($_GET['error']) && 'invalidkey' == $_GET['error'] ) $errors->add('invalidkey', __('Sorry, that key does not appear to be valid.')); + $redirect_to = apply_filters( 'lostpassword_redirect', !empty( $_REQUEST['redirect_to'] ) ? $_REQUEST['redirect_to'] : '' ); + + do_action('lost_password'); + login_header(__('Lost Password'), '

    ' . __('Please enter your username or email address. You will receive a link to create a new password via email.') . '

    ', $errors); + + $user_login = isset($_POST['user_login']) ? stripslashes($_POST['user_login']) : ''; + +?> + +
    +

    + +

    + + +

    +
    + + + +' . __('Your password has been reset.') . ' ' . __('Log in') . '

    '); + login_footer(); + exit; + } + + wp_enqueue_script('utils'); + wp_enqueue_script('user-profile'); + + login_header(__('Reset Password'), '

    ' . __('Enter your new password below.') . '

    ', $errors ); + +?> +
    + + +

    + +

    +

    + +

    + +
    +

    + +
    +

    +
    + + + +' . __('Register For This Site') . '

    ', $errors); +?> + +
    +

    + +

    +

    + +

    + +

    +
    + +

    +
    + + + +ID) ) { + $secure_cookie = true; + force_ssl_admin(true); + } + } + } + + if ( isset( $_REQUEST['redirect_to'] ) ) { + $redirect_to = $_REQUEST['redirect_to']; + // Redirect to https if user wants ssl + if ( $secure_cookie && false !== strpos($redirect_to, 'wp-admin') ) + $redirect_to = preg_replace('|^http://|', 'https://', $redirect_to); + } else { + $redirect_to = admin_url(); + } + + $reauth = empty($_REQUEST['reauth']) ? false : true; + + // If the user was redirected to a secure login form from a non-secure admin page, and secure login is required but secure admin is not, then don't use a secure + // cookie and redirect back to the referring non-secure admin page. This allows logins to always be POSTed over SSL while allowing the user to choose visiting + // the admin via http or https. + if ( !$secure_cookie && is_ssl() && force_ssl_login() && !force_ssl_admin() && ( 0 !== strpos($redirect_to, 'https') ) && ( 0 === strpos($redirect_to, 'http') ) ) + $secure_cookie = false; + + $user = wp_signon('', $secure_cookie); + + $redirect_to = apply_filters('login_redirect', $redirect_to, isset( $_REQUEST['redirect_to'] ) ? $_REQUEST['redirect_to'] : '', $user); + + if ( !is_wp_error($user) && !$reauth ) { + if ( $interim_login ) { + $message = '

    ' . __('You have logged in successfully.') . '

    '; + login_header( '', $message ); ?> + +

    +

    +
    +id) && !is_super_admin( $user->id ) ) + $redirect_to = user_admin_url(); + elseif ( is_multisite() && !$user->has_cap('read') ) + $redirect_to = get_dashboard_url( $user->id ); + elseif ( !$user->has_cap('edit_posts') ) + $redirect_to = admin_url('profile.php'); + } + wp_safe_redirect($redirect_to); + exit(); + } + + $errors = $user; + // Clear errors if loggedout is set. + if ( !empty($_GET['loggedout']) || $reauth ) + $errors = new WP_Error(); + + // If cookies are disabled we can't log in even with a valid user+pass + if ( isset($_POST['testcookie']) && empty($_COOKIE[TEST_COOKIE]) ) + $errors->add('test_cookie', __("ERROR: Cookies are blocked or not supported by your browser. You must enable cookies to use WordPress.")); + + // Some parts of this script use the main login form to display a message + if ( isset($_GET['loggedout']) && TRUE == $_GET['loggedout'] ) + $errors->add('loggedout', __('You are now logged out.'), 'message'); + elseif ( isset($_GET['registration']) && 'disabled' == $_GET['registration'] ) + $errors->add('registerdisabled', __('User registration is currently not allowed.')); + elseif ( isset($_GET['checkemail']) && 'confirm' == $_GET['checkemail'] ) + $errors->add('confirm', __('Check your e-mail for the confirmation link.'), 'message'); + elseif ( isset($_GET['checkemail']) && 'newpass' == $_GET['checkemail'] ) + $errors->add('newpass', __('Check your e-mail for your new password.'), 'message'); + elseif ( isset($_GET['checkemail']) && 'registered' == $_GET['checkemail'] ) + $errors->add('registered', __('Registration complete. Please check your e-mail.'), 'message'); + elseif ( $interim_login ) + $errors->add('expired', __('Your session has expired. Please log-in again.'), 'message'); + + // Clear any stale cookies. + if ( $reauth ) + wp_clear_auth_cookie(); + + login_header(__('Log In'), '', $errors); + + if ( isset($_POST['log']) ) + $user_login = ( 'incorrect_password' == $errors->get_error_code() || 'empty_password' == $errors->get_error_code() ) ? esc_attr(stripslashes($_POST['log'])) : ''; + $rememberme = ! empty( $_POST['rememberme'] ); +?> + +
    +

    + +

    +

    + +

    + +

    +

    + + + + + + + +

    +
    + + + + + + + + diff --git a/src/wp-mail.php b/src/wp-mail.php new file mode 100644 index 0000000..69b5415 --- /dev/null +++ b/src/wp-mail.php @@ -0,0 +1,236 @@ + Writing + * + * @package WordPress + */ + +/** Make sure that the WordPress bootstrap has run before continuing. */ +require(dirname(__FILE__) . '/wp-load.php'); + +if ( ! apply_filters( 'enable_post_by_email_configuration', true ) ) + wp_die( __( 'This action has been disabled by the administrator.' ) ); + +/** Allow a plugin to do a complete takeover of Post by Email **/ +do_action('wp-mail.php'); + +/** Get the POP3 class with which to access the mailbox. */ +require_once( ABSPATH . WPINC . '/class-pop3.php' ); + +/** Only check at this interval for new messages. */ +if ( !defined('WP_MAIL_INTERVAL') ) + define('WP_MAIL_INTERVAL', 300); // 5 minutes + +$last_checked = get_transient('mailserver_last_checked'); + +if ( $last_checked ) + wp_die(__('Slow down cowboy, no need to check for new mails so often!')); + +set_transient('mailserver_last_checked', true, WP_MAIL_INTERVAL); + +$time_difference = get_option('gmt_offset') * 3600; + +$phone_delim = '::'; + +$pop3 = new POP3(); + +if ( !$pop3->connect( get_option('mailserver_url'), get_option('mailserver_port') ) || !$pop3->user( get_option('mailserver_login') ) ) + wp_die( esc_html( $pop3->ERROR ) ); + +$count = $pop3->pass( get_option('mailserver_pass') ); + +if( false === $count ) + wp_die( esc_html( $pop3->ERROR ) ); + +if( 0 === $count ) { + $pop3->quit(); + wp_die( __('There doesn’t seem to be any new mail.') ); +} + +for ( $i = 1; $i <= $count; $i++ ) { + + $message = $pop3->get($i); + + $bodysignal = false; + $boundary = ''; + $charset = ''; + $content = ''; + $content_type = ''; + $content_transfer_encoding = ''; + $post_author = 1; + $author_found = false; + $dmonths = array('Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'); + foreach ($message as $line) { + // body signal + if ( strlen($line) < 3 ) + $bodysignal = true; + if ( $bodysignal ) { + $content .= $line; + } else { + if ( preg_match('/Content-Type: /i', $line) ) { + $content_type = trim($line); + $content_type = substr($content_type, 14, strlen($content_type) - 14); + $content_type = explode(';', $content_type); + if ( ! empty( $content_type[1] ) ) { + $charset = explode('=', $content_type[1]); + $charset = ( ! empty( $charset[1] ) ) ? trim($charset[1]) : ''; + } + $content_type = $content_type[0]; + } + if ( preg_match('/Content-Transfer-Encoding: /i', $line) ) { + $content_transfer_encoding = trim($line); + $content_transfer_encoding = substr($content_transfer_encoding, 27, strlen($content_transfer_encoding) - 27); + $content_transfer_encoding = explode(';', $content_transfer_encoding); + $content_transfer_encoding = $content_transfer_encoding[0]; + } + if ( ( $content_type == 'multipart/alternative' ) && ( false !== strpos($line, 'boundary="') ) && ( '' == $boundary ) ) { + $boundary = trim($line); + $boundary = explode('"', $boundary); + $boundary = $boundary[1]; + } + if (preg_match('/Subject: /i', $line)) { + $subject = trim($line); + $subject = substr($subject, 9, strlen($subject) - 9); + // Captures any text in the subject before $phone_delim as the subject + if ( function_exists('iconv_mime_decode') ) { + $subject = iconv_mime_decode($subject, 2, get_option('blog_charset')); + } else { + $subject = wp_iso_descrambler($subject); + } + $subject = explode($phone_delim, $subject); + $subject = $subject[0]; + } + + // Set the author using the email address (From or Reply-To, the last used) + // otherwise use the site admin + if ( preg_match('/(From|Reply-To): /', $line) ) { + if ( preg_match('|[a-z0-9_.-]+@[a-z0-9_.-]+(?!.*<)|i', $line, $matches) ) + $author = $matches[0]; + else + $author = trim($line); + $author = sanitize_email($author); + if ( is_email($author) ) { + echo '

    ' . sprintf(__('Author is %s'), $author) . '

    '; + $userdata = get_user_by_email($author); + if ( empty($userdata) ) { + $author_found = false; + } else { + $post_author = $userdata->ID; + $author_found = true; + } + } else { + $author_found = false; + } + } + + if (preg_match('/Date: /i', $line)) { // of the form '20 Mar 2002 20:32:37' + $ddate = trim($line); + $ddate = str_replace('Date: ', '', $ddate); + if (strpos($ddate, ',')) { + $ddate = trim(substr($ddate, strpos($ddate, ',') + 1, strlen($ddate))); + } + $date_arr = explode(' ', $ddate); + $date_time = explode(':', $date_arr[3]); + + $ddate_H = $date_time[0]; + $ddate_i = $date_time[1]; + $ddate_s = $date_time[2]; + + $ddate_m = $date_arr[1]; + $ddate_d = $date_arr[0]; + $ddate_Y = $date_arr[2]; + for ( $j = 0; $j < 12; $j++ ) { + if ( $ddate_m == $dmonths[$j] ) { + $ddate_m = $j+1; + } + } + + $time_zn = intval($date_arr[4]) * 36; + $ddate_U = gmmktime($ddate_H, $ddate_i, $ddate_s, $ddate_m, $ddate_d, $ddate_Y); + $ddate_U = $ddate_U - $time_zn; + $post_date = gmdate('Y-m-d H:i:s', $ddate_U + $time_difference); + $post_date_gmt = gmdate('Y-m-d H:i:s', $ddate_U); + } + } + } + + // Set $post_status based on $author_found and on author's publish_posts capability + if ( $author_found ) { + $user = new WP_User($post_author); + $post_status = ( $user->has_cap('publish_posts') ) ? 'publish' : 'pending'; + } else { + // Author not found in DB, set status to pending. Author already set to admin. + $post_status = 'pending'; + } + + $subject = trim($subject); + + if ( $content_type == 'multipart/alternative' ) { + $content = explode('--'.$boundary, $content); + $content = $content[2]; + // match case-insensitive content-transfer-encoding + if ( preg_match( '/Content-Transfer-Encoding: quoted-printable/i', $content, $delim) ) { + $content = explode($delim[0], $content); + $content = $content[1]; + } + $content = strip_tags($content, '


    '); + } + $content = trim($content); + + //Give Post-By-Email extending plugins full access to the content + //Either the raw content or the content of the last quoted-printable section + $content = apply_filters('wp_mail_original_content', $content); + + if ( false !== stripos($content_transfer_encoding, "quoted-printable") ) { + $content = quoted_printable_decode($content); + } + + if ( function_exists('iconv') && ! empty( $charset ) ) { + $content = iconv($charset, get_option('blog_charset'), $content); + } + + // Captures any text in the body after $phone_delim as the body + $content = explode($phone_delim, $content); + $content = empty( $content[1] ) ? $content[0] : $content[1]; + + $content = trim($content); + + $post_content = apply_filters('phone_content', $content); + + $post_title = xmlrpc_getposttitle($content); + + if ($post_title == '') $post_title = $subject; + + $post_category = array(get_option('default_email_category')); + + $post_data = compact('post_content','post_title','post_date','post_date_gmt','post_author','post_category', 'post_status'); + $post_data = add_magic_quotes($post_data); + + $post_ID = wp_insert_post($post_data); + if ( is_wp_error( $post_ID ) ) + echo "\n" . $post_ID->get_error_message(); + + // We couldn't post, for whatever reason. Better move forward to the next email. + if ( empty( $post_ID ) ) + continue; + + do_action('publish_phone', $post_ID); + + echo "\n

    " . sprintf(__('Author: %s'), esc_html($post_author)) . '

    '; + echo "\n

    " . sprintf(__('Posted title: %s'), esc_html($post_title)) . '

    '; + + if(!$pop3->delete($i)) { + echo '

    ' . sprintf(__('Oops: %s'), esc_html($pop3->ERROR)) . '

    '; + $pop3->reset(); + exit; + } else { + echo '

    ' . sprintf(__('Mission complete. Message %s deleted.'), $i) . '

    '; + } + +} + +$pop3->quit(); + +?> diff --git a/src/wp-pass.php b/src/wp-pass.php new file mode 100644 index 0000000..c0c0c42 --- /dev/null +++ b/src/wp-pass.php @@ -0,0 +1,20 @@ + diff --git a/src/wp-rdf.php b/src/wp-rdf.php new file mode 100644 index 0000000..cc94ad0 --- /dev/null +++ b/src/wp-rdf.php @@ -0,0 +1,12 @@ + diff --git a/src/wp-register.php b/src/wp-register.php new file mode 100644 index 0000000..0b1a769 --- /dev/null +++ b/src/wp-register.php @@ -0,0 +1,15 @@ + diff --git a/src/wp-rss.php b/src/wp-rss.php new file mode 100644 index 0000000..af2427a --- /dev/null +++ b/src/wp-rss.php @@ -0,0 +1,12 @@ + diff --git a/src/wp-rss2.php b/src/wp-rss2.php new file mode 100644 index 0000000..de75c23 --- /dev/null +++ b/src/wp-rss2.php @@ -0,0 +1,12 @@ + diff --git a/src/wp-settings.php b/src/wp-settings.php new file mode 100644 index 0000000..9b89b57 --- /dev/null +++ b/src/wp-settings.php @@ -0,0 +1,324 @@ +init(); + +/** + * Most of WP is loaded at this stage, and the user is authenticated. WP continues + * to load on the init hook that follows (e.g. widgets), and many plugins instantiate + * themselves on it for all sorts of reasons (e.g. they need a user, a taxonomy, etc.). + * + * If you wish to plug an action once WP is loaded, use the wp_loaded hook below. + */ +do_action( 'init' ); + +// Check site status +if ( is_multisite() ) { + if ( true !== ( $file = ms_site_check() ) ) { + require( $file ); + die(); + } + unset($file); +} + +/** + * This hook is fired once WP, all plugins, and the theme are fully loaded and instantiated. + * + * AJAX requests should use wp-admin/admin-ajax.php. admin-ajax.php can handle requests for + * users not logged in. + * + * @link http://codex.wordpress.org/AJAX_in_Plugins + * + * @since 3.0.0 + */ +do_action('wp_loaded'); +?> diff --git a/src/wp-signup.php b/src/wp-signup.php new file mode 100644 index 0000000..cce2083 --- /dev/null +++ b/src/wp-signup.php @@ -0,0 +1,455 @@ +\n"; +} + +if ( !is_multisite() ) { + wp_redirect( site_url('wp-login.php?action=register') ); + die(); +} + +if ( !is_main_site() ) { + wp_redirect( network_home_url( 'wp-signup.php' ) ); + die(); +} + +// Fix for page title +$wp_query->is_404 = false; + +function wpmu_signup_stylesheet() { + ?> + + +
    +
    +' . __('Site Name:') . ''; + else + echo ''; + + if ( $errmsg = $errors->get_error_message('blogname') ) { ?> +

    + ' . $current_site->domain . $current_site->path . '
    '; + else + echo '.' . ( $site_domain = preg_replace( '|^www\.|', '', $current_site->domain ) ) . '
    '; + + if ( !is_user_logged_in() ) { + if ( !is_subdomain_install() ) + $site = $current_site->domain . $current_site->path . __( 'sitename' ); + else + $site = __( 'domain' ) . '.' . $site_domain . $current_site->path; + echo '

    (' . sprintf( __('Your address will be %s.'), $site ) . ') ' . __( 'Must be at least 4 characters, letters and numbers only. It cannot be changed, so choose carefully!' ) . '

    '; + } + + // Blog Title + ?> + + get_error_message('blog_title') ) { ?> +

    + '; + ?> + +
    +

    + + +
    + + +

    +
    + + ' . __('Username:') . ''; + if ( $errmsg = $errors->get_error_message('user_name') ) { + echo '

    '.$errmsg.'

    '; + } + echo '
    '; + _e( '(Must be at least 4 characters, letters and numbers only.)' ); + ?> + + + get_error_message('user_email') ) { ?> +

    + +
    + get_error_message('generic') ) { + echo '

    ' . $errmsg . '

    '; + } + do_action( 'signup_extra_fields', $errors ); +} + +function validate_user_form() { + return wpmu_validate_user_signup($_POST['user_name'], $_POST['user_email']); +} + +function signup_another_blog($blogname = '', $blog_title = '', $errors = '') { + global $current_site; + $current_user = wp_get_current_user(); + + if ( ! is_wp_error($errors) ) { + $errors = new WP_Error(); + } + + // allow definition of default variables + $filtered_results = apply_filters('signup_another_blog_init', array('blogname' => $blogname, 'blog_title' => $blog_title, 'errors' => $errors )); + $blogname = $filtered_results['blogname']; + $blog_title = $filtered_results['blog_title']; + $errors = $filtered_results['errors']; + + echo '

    ' . sprintf( __( 'Get another %s site in seconds' ), $current_site->site_name ) . '

    '; + + if ( $errors->get_error_code() ) { + echo '

    ' . __( 'There was a problem, please correct the form below and try again.' ) . '

    '; + } + ?> +

    add another site to your account. There is no limit to the number of sites you can have, so create to your heart’s content, but write responsibly!' ), $current_user->display_name ) ?>

    + + ID); + if ( !empty($blogs) ) { ?> + +

    + + + +

    +
    + + + +

    +
    + get_error_code() ) { + signup_another_blog($blogname, $blog_title, $errors); + return false; + } + + $public = (int) $_POST['blog_public']; + $meta = apply_filters( 'signup_create_blog_meta', array( 'lang_id' => 1, 'public' => $public ) ); // deprecated + $meta = apply_filters( 'add_signup_meta', $meta ); + + wpmu_create_blog( $domain, $path, $blog_title, $current_user->id, $meta, $wpdb->siteid ); + confirm_another_blog_signup($domain, $path, $blog_title, $current_user->user_login, $current_user->user_email, $meta); + return true; +} + +function confirm_another_blog_signup($domain, $path, $blog_title, $user_name, $user_email = '', $meta = '') { + ?> +

    {$blog_title}" ) ?>

    +

    + http://%2$s is your new site. Log in as “%4$s” using your existing password.' ), $domain.$path, $domain.$path, "http://" . $domain.$path . "wp-login.php", $user_name ) ?> +

    + $user_name, 'user_email' => $user_email, 'errors' => $errors )); + $user_name = $filtered_results['user_name']; + $user_email = $filtered_results['user_email']; + $errors = $filtered_results['errors']; + + ?> + +

    site_name ) ?>

    +
    + + + + +

    + + + + + + /> + +
    + /> + + +

    + +

    +
    + get_error_code() ) { + signup_user($user_name, $user_email, $errors); + return false; + } + + if ( 'blog' == $_POST['signup_for'] ) { + signup_blog($user_name, $user_email); + return false; + } + + wpmu_signup_user($user_name, $user_email, apply_filters( 'add_signup_meta', array() ) ); + + confirm_user_signup($user_name, $user_email); + return true; +} + +function confirm_user_signup($user_name, $user_email) { + ?> +

    +

    you must activate it.' ) ?>

    +

    %1$s and click the link given.' ), $user_email) ?>

    +

    + $user_name, 'user_email' => $user_email, 'blogname' => $blogname, 'blog_title' => $blog_title, 'errors' => $errors )); + $user_name = $filtered_results['user_name']; + $user_email = $filtered_results['user_email']; + $blogname = $filtered_results['blogname']; + $blog_title = $filtered_results['blog_title']; + $errors = $filtered_results['errors']; + + if ( empty($blogname) ) + $blogname = $user_name; + ?> +
    + + + + + +

    +
    + get_error_code() ) { + signup_user($user_name, $user_email, $errors); + return false; + } + + $result = wpmu_validate_blog_signup($_POST['blogname'], $_POST['blog_title']); + extract($result); + + if ( $errors->get_error_code() ) { + signup_blog($user_name, $user_email, $blogname, $blog_title, $errors); + return false; + } + + $public = (int) $_POST['blog_public']; + $meta = array ('lang_id' => 1, 'public' => $public); + $meta = apply_filters( 'add_signup_meta', $meta ); + + wpmu_signup_blog($domain, $path, $blog_title, $user_name, $user_email, $meta); + confirm_blog_signup($domain, $path, $blog_title, $user_name, $user_email, $meta); + return true; +} + +function confirm_blog_signup($domain, $path, $blog_title, $user_name = '', $user_email = '', $meta) { + ?> +

    {$blog_title}" ) ?>

    + +

    you must activate it.' ) ?>

    +

    %s and click the link given.' ), $user_email) ?>

    +

    +

    +

    + +

      +
    • +
    • +
    • +
    +

    + ' . sprintf( __( 'Greetings Site Administrator! You are currently allowing “%s” registrations. To change or disable registration go to your Options page.' ), $i18n_signup[$active_signup], esc_url( network_admin_url( 'settings.php' ) ) ) . '
    '; + +$newblogname = isset($_GET['new']) ? strtolower(preg_replace('/^-|-$|[^-a-zA-Z0-9]/', '', $_GET['new'])) : null; + +$current_user = wp_get_current_user(); +if ( $active_signup == 'none' ) { + _e( 'Registration has been disabled.' ); +} elseif ( $active_signup == 'blog' && !is_user_logged_in() ) { + if ( is_ssl() ) + $proto = 'https://'; + else + $proto = 'http://'; + $login_url = site_url( 'wp-login.php?redirect_to=' . urlencode($proto . $_SERVER['HTTP_HOST'] . '/wp-signup.php' )); + echo sprintf( __( 'You must first log in, and then you can create a new site.' ), $login_url ); +} else { + $stage = isset( $_POST['stage'] ) ? $_POST['stage'] : 'default'; + switch ( $stage ) { + case 'validate-user-signup' : + if ( $active_signup == 'all' || $_POST[ 'signup_for' ] == 'blog' && $active_signup == 'blog' || $_POST[ 'signup_for' ] == 'user' && $active_signup == 'user' ) + validate_user_signup(); + else + _e( 'User registration has been disabled.' ); + break; + case 'validate-blog-signup': + if ( $active_signup == 'all' || $active_signup == 'blog' ) + validate_blog_signup(); + else + _e( 'Site registration has been disabled.' ); + break; + case 'gimmeanotherblog': + validate_another_blog_signup(); + break; + case 'default': + default : + $user_email = isset( $_POST[ 'user_email' ] ) ? $_POST[ 'user_email' ] : ''; + do_action( 'preprocess_signup_form' ); // populate the form from invites, elsewhere? + if ( is_user_logged_in() && ( $active_signup == 'all' || $active_signup == 'blog' ) ) + signup_another_blog($newblogname); + elseif ( is_user_logged_in() == false && ( $active_signup == 'all' || $active_signup == 'user' ) ) + signup_user( $newblogname, $user_email ); + elseif ( is_user_logged_in() == false && ( $active_signup == 'blog' ) ) + _e( 'Sorry, new registrations are not allowed at this time.' ); + else + _e( 'You are logged in already. No need to register again!' ); + + if ( $newblogname ) { + $newblog = get_blogaddress_by_name( $newblogname ); + + if ( $active_signup == 'blog' || $active_signup == 'all' ) + printf( __( '

    The site you were looking for, %s does not exist, but you can create it now!

    ' ), $newblog ); + else + printf( __( '

    The site you were looking for, %s, does not exist.

    ' ), $newblog ); + } + break; + } +} +?> +
    +
    + + + diff --git a/src/wp-trackback.php b/src/wp-trackback.php new file mode 100644 index 0000000..737fbce --- /dev/null +++ b/src/wp-trackback.php @@ -0,0 +1,111 @@ + '1' ) ); +} + +/** + * trackback_response() - Respond with error or success XML message + * + * @param int|bool $error Whether there was an error + * @param string $error_message Error message if an error occurred + */ +function trackback_response($error = 0, $error_message = '') { + header('Content-Type: text/xml; charset=' . get_option('blog_charset') ); + if ($error) { + echo '\n"; + echo "\n"; + echo "1\n"; + echo "$error_message\n"; + echo ""; + die(); + } else { + echo '\n"; + echo "\n"; + echo "0\n"; + echo ""; + } +} + +// trackback is done by a POST +$request_array = 'HTTP_POST_VARS'; + +if ( !isset($_GET['tb_id']) || !$_GET['tb_id'] ) { + $tb_id = explode('/', $_SERVER['REQUEST_URI']); + $tb_id = intval( $tb_id[ count($tb_id) - 1 ] ); +} + +$tb_url = isset($_POST['url']) ? $_POST['url'] : ''; +$charset = isset($_POST['charset']) ? $_POST['charset'] : ''; + +// These three are stripslashed here so that they can be properly escaped after mb_convert_encoding() +$title = isset($_POST['title']) ? stripslashes($_POST['title']) : ''; +$excerpt = isset($_POST['excerpt']) ? stripslashes($_POST['excerpt']) : ''; +$blog_name = isset($_POST['blog_name']) ? stripslashes($_POST['blog_name']) : ''; + +if ($charset) + $charset = str_replace( array(',', ' '), '', strtoupper( trim($charset) ) ); +else + $charset = 'ASCII, UTF-8, ISO-8859-1, JIS, EUC-JP, SJIS'; + +// No valid uses for UTF-7 +if ( false !== strpos($charset, 'UTF-7') ) + die; + +if ( function_exists('mb_convert_encoding') ) { // For international trackbacks + $title = mb_convert_encoding($title, get_option('blog_charset'), $charset); + $excerpt = mb_convert_encoding($excerpt, get_option('blog_charset'), $charset); + $blog_name = mb_convert_encoding($blog_name, get_option('blog_charset'), $charset); +} + +// Now that mb_convert_encoding() has been given a swing, we need to escape these three +$title = $wpdb->escape($title); +$excerpt = $wpdb->escape($excerpt); +$blog_name = $wpdb->escape($blog_name); + +if ( is_single() || is_page() ) + $tb_id = $posts[0]->ID; + +if ( !isset($tb_id) || !intval( $tb_id ) ) + trackback_response(1, 'I really need an ID for this to work.'); + +if (empty($title) && empty($tb_url) && empty($blog_name)) { + // If it doesn't look like a trackback at all... + wp_redirect(get_permalink($tb_id)); + exit; +} + +if ( !empty($tb_url) && !empty($title) ) { + header('Content-Type: text/xml; charset=' . get_option('blog_charset') ); + + if ( !pings_open($tb_id) ) + trackback_response(1, 'Sorry, trackbacks are closed for this item.'); + + $title = wp_html_excerpt( $title, 250 ).'...'; + $excerpt = wp_html_excerpt( $excerpt, 252 ).'...'; + + $comment_post_ID = (int) $tb_id; + $comment_author = $blog_name; + $comment_author_email = ''; + $comment_author_url = $tb_url; + $comment_content = "$title\n\n$excerpt"; + $comment_type = 'trackback'; + + $dupe = $wpdb->get_results( $wpdb->prepare("SELECT * FROM $wpdb->comments WHERE comment_post_ID = %d AND comment_author_url = %s", $comment_post_ID, $comment_author_url) ); + if ( $dupe ) + trackback_response(1, 'We already have a ping from that URL for this post.'); + + $commentdata = compact('comment_post_ID', 'comment_author', 'comment_author_email', 'comment_author_url', 'comment_content', 'comment_type'); + + wp_new_comment($commentdata); + + do_action('trackback_post', $wpdb->insert_id); + trackback_response(0); +} +?> \ No newline at end of file diff --git a/src/xmlrpc.php b/src/xmlrpc.php new file mode 100644 index 0000000..ff7bfcd --- /dev/null +++ b/src/xmlrpc.php @@ -0,0 +1,110 @@ + +'; ?> + + + WordPress + http://wordpress.org/ + + + + + + + + + + +serve_request(); +?> \ No newline at end of file

    uBNUt8W#=+X+f&C` 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